More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 281 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Unstake | 18943565 | 270 days ago | IN | 0 ETH | 0.003104 | ||||
Unstake | 18659577 | 310 days ago | IN | 0 ETH | 0.00601435 | ||||
Unstake | 18627332 | 314 days ago | IN | 0 ETH | 0.00636908 | ||||
Stake | 18626219 | 314 days ago | IN | 0 ETH | 0.00495741 | ||||
Unstake | 18601388 | 318 days ago | IN | 0 ETH | 0.00391085 | ||||
Unstake | 18589199 | 319 days ago | IN | 0 ETH | 0.00409636 | ||||
Stake | 18583577 | 320 days ago | IN | 0 ETH | 0.00657469 | ||||
Unstake | 18580657 | 321 days ago | IN | 0 ETH | 0.00811143 | ||||
Unstake | 18580494 | 321 days ago | IN | 0 ETH | 0.00638913 | ||||
Unstake | 18575888 | 321 days ago | IN | 0 ETH | 0.00696599 | ||||
Unstake | 18575755 | 321 days ago | IN | 0 ETH | 0.00550637 | ||||
Unstake | 18575637 | 321 days ago | IN | 0 ETH | 0.00610944 | ||||
Unstake | 18575490 | 321 days ago | IN | 0 ETH | 0.00552072 | ||||
Unstake | 18574520 | 321 days ago | IN | 0 ETH | 0.00673878 | ||||
Unstake | 18574259 | 321 days ago | IN | 0 ETH | 0.00724358 | ||||
Unstake | 18574057 | 321 days ago | IN | 0 ETH | 0.00829843 | ||||
Unstake | 18573693 | 322 days ago | IN | 0 ETH | 0.00783057 | ||||
Unstake | 18573577 | 322 days ago | IN | 0 ETH | 0.00833577 | ||||
Stake | 18572807 | 322 days ago | IN | 0 ETH | 0.00903287 | ||||
Unstake | 18571775 | 322 days ago | IN | 0 ETH | 0.00966666 | ||||
Unstake | 18571387 | 322 days ago | IN | 0 ETH | 0.01366164 | ||||
Stake | 18565316 | 323 days ago | IN | 0 ETH | 0.01611151 | ||||
Unstake | 18565292 | 323 days ago | IN | 0 ETH | 0.01771361 | ||||
Unstake | 18561641 | 323 days ago | IN | 0 ETH | 0.00707518 | ||||
Stake | 18561162 | 323 days ago | IN | 0 ETH | 0.00725528 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
18943565 | 270 days ago | 0.0808128 ETH | ||||
18943565 | 270 days ago | 0.0808128 ETH | ||||
18659577 | 310 days ago | 0.04237664 ETH | ||||
18659577 | 310 days ago | 0.04237664 ETH | ||||
18627332 | 314 days ago | 0.12128288 ETH | ||||
18627332 | 314 days ago | 0.12128288 ETH | ||||
18601388 | 318 days ago | 1.0875282 ETH | ||||
18601388 | 318 days ago | 1.0875282 ETH | ||||
18589199 | 319 days ago | 0.1216556 ETH | ||||
18589199 | 319 days ago | 0.1216556 ETH | ||||
18580657 | 321 days ago | 0.02261081 ETH | ||||
18580657 | 321 days ago | 0.02261081 ETH | ||||
18580494 | 321 days ago | 0.02384505 ETH | ||||
18580494 | 321 days ago | 0.02384505 ETH | ||||
18575888 | 321 days ago | 0.0225674 ETH | ||||
18575888 | 321 days ago | 0.0225674 ETH | ||||
18575755 | 321 days ago | 0.16373796 ETH | ||||
18575755 | 321 days ago | 0.16373796 ETH | ||||
18575637 | 321 days ago | 0.28904877 ETH | ||||
18575637 | 321 days ago | 0.28904877 ETH | ||||
18575490 | 321 days ago | 0.15740084 ETH | ||||
18575490 | 321 days ago | 0.15740084 ETH | ||||
18574520 | 321 days ago | 0.22970655 ETH | ||||
18574520 | 321 days ago | 0.22970655 ETH | ||||
18574259 | 321 days ago | 0.00928352 ETH |
Loading...
Loading
Contract Name:
SuperNova
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-10-31 */ // SPDX-License-Identifier: MIT pragma solidity ^0.6.12; contract ReentrancyGuard { uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor () internal { _status = _NOT_ENTERED; } modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } abstract contract Context { function _msgSender() internal view virtual returns (address payable) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); constructor () internal { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } function owner() public view returns (address) { return _owner; } modifier onlyOwner() { require(_owner == _msgSender(), "Ownable: caller is not the owner"); _; } function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } interface IERC20 { function totalSupply() external view returns (uint256); function balanceOf(address account) external view returns (uint256); function transfer(address recipient, uint256 amount) external returns (bool); function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 amount) external returns (bool); function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); function burn(uint256 value) external; event Transfer(address indexed from, address indexed to, uint256 value); event Approval(address indexed owner, address indexed spender, uint256 value); } interface IStaking { event Staked( address indexed user, uint256 amount, uint256 total, bytes data ); event Unstaked( address indexed user, uint256 amount, uint256 total, bytes data ); function stake(uint256 amount) external; function stakeFor( address user, uint256 amount ) external; function unstake(uint256 amount) external; function totalStakedFor(address addr) external view returns (uint256); function totalStaked() external view returns (uint256); function supportsHistory() external pure returns (bool); } library Address { function isContract(address account) internal view returns (bool) { // According to EIP-1052, 0x0 is the value returned for not-yet created accounts // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned // for accounts without code, i.e. `keccak256('')` bytes32 codehash; bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; // solhint-disable-next-line no-inline-assembly assembly { codehash := extcodehash(account) } return (codehash != accountHash && codehash != 0x0); } function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return _functionCallWithValue(target, data, 0, errorMessage); } function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); return _functionCallWithValue(target, data, value, errorMessage); } function _functionCallWithValue(address target, bytes memory data, uint256 weiValue, string memory errorMessage) private returns (bytes memory) { require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: weiValue }(data); if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } library SafeMath { function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } function mul(uint256 a, uint256 b) internal pure returns (uint256) { if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); uint256 c = a / b; return c; } function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } library MathUtils { function logbase2(int128 x) internal pure returns (int128) { require(x > 0); int256 msb = 0; int256 xc = x; if (xc >= 0x10000000000000000) { xc >>= 64; msb += 64; } if (xc >= 0x100000000) { xc >>= 32; msb += 32; } if (xc >= 0x10000) { xc >>= 16; msb += 16; } if (xc >= 0x100) { xc >>= 8; msb += 8; } if (xc >= 0x10) { xc >>= 4; msb += 4; } if (xc >= 0x4) { xc >>= 2; msb += 2; } if (xc >= 0x2) msb += 1; // No need to shift xc anymore int256 result = (msb - 64) << 64; uint256 ux = uint256(x) << (127 - msb); for (int256 bit = 0x8000000000000000; bit > 0; bit >>= 1) { ux *= ux; uint256 b = ux >> 255; ux >>= 127 + b; result += bit * int256(b); } return int128(result); } function ln(int128 x) internal pure returns (int128) { require(x > 0); return int128( (uint256(logbase2(x)) * 0xB17217F7D1CF79ABC9E3B39803F2F6AF) >> 128 ); } function logbase10(int128 x) internal pure returns (int128) { require(x > 0); return int128( (uint256(logbase2(x)) * 0x4d104d427de7fce20a6e420e02236748) >> 128 ); } // wrapper functions to allow testing function testlogbase2(int128 x) public pure returns (int128) { return logbase2(x); } function testlogbase10(int128 x) public pure returns (int128) { return logbase10(x); } } library SafeERC20 { using SafeMath for uint256; using Address for address; function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } function safeApprove(IERC20 token, address spender, uint256 value) internal { require((value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).add(value); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero"); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function _callOptionalReturn(IERC20 token, bytes memory data) private { bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } abstract contract ISuperNova is IStaking, Ownable { // events event RewardsDistributed(address indexed user, uint256 amount); event RewardsFunded( uint256 amount, uint256 duration, uint256 start, uint256 total ); event RewardsUnlocked(uint256 amount, uint256 total); event RewardsExpired(uint256 amount, uint256 duration, uint256 start); event CliqSpent(address indexed user, uint256 amount); event CliqWithdrawn(uint256 amount); // IStaking /** * @notice no support for history * @return false */ function supportsHistory() external override pure returns (bool) { return false; } // ISuperNova /** * @return staking token for this SuperNova */ function stakingToken() external virtual view returns (address); /** * @return reward token for this SuperNova */ function rewardToken() external virtual view returns (address); /** * @notice fund SuperNova by locking up reward tokens for distribution * @param duration period (seconds) over which funding will be unlocked */ function fund(uint256 duration) external payable virtual; /** * @notice fund SuperNova by locking up reward tokens for future distribution * @param duration period (seconds) over which funding will be unlocked * @param start time (seconds) at which funding begins to unlock */ function fund( uint256 duration, uint256 start ) external payable virtual; /** * @notice withdraw CLIQ tokens applied during unstaking * @param amount number of CLIQ to withdraw */ function withdraw(uint256 amount) external virtual; /** * @notice unstake while applying CLIQ token for boosted rewards * @param amount number of tokens to unstake * @param cliq number of CLIQ tokens to apply for boost */ function unstake( uint256 amount, uint256 cliq ) external virtual; /** * @notice update accounting, unlock tokens, etc. */ function update() external virtual; /** * @notice clean SuperNova, expire old fundings, etc. */ function clean() external virtual; } contract SuperNovaPool is Ownable { using SafeERC20 for IERC20; IERC20 public token; constructor(address token_) public { token = IERC20(token_); } function balance() public view returns (uint256) { return token.balanceOf(address(this)); } function transfer(address to, uint256 value) external onlyOwner { token.safeTransfer(to, value); } } interface IWETH { function deposit() external payable; function withdraw(uint wad) external; function transfer(address dst, uint wad) external returns (bool); } contract SuperNova is ISuperNova, ReentrancyGuard { using SafeMath for uint256; using SafeERC20 for IERC20; using MathUtils for int128; // single stake by user struct Stake { uint256 shares; uint256 timestamp; } // summary of total user stake/shares struct User { uint256 shares; uint256 shareSeconds; uint256 lastUpdated; } // single funding/reward schedule struct Funding { uint256 amount; uint256 shares; uint256 unlocked; uint256 lastUpdated; uint256 start; uint256 end; uint256 duration; } // constants uint256 public constant BONUS_DECIMALS = 18; uint256 public constant INITIAL_SHARES_PER_TOKEN = 10**6; uint256 public constant MAX_ACTIVE_FUNDINGS = 16; // token pool fields SuperNovaPool private immutable _stakingPool; SuperNovaPool private immutable _unlockedPool; SuperNovaPool private immutable _lockedPool; Funding[] public fundings; // user staking fields mapping(address => User) public userTotals; mapping(address => Stake[]) public userStakes; // time bonus fields uint256 public immutable bonusMin; uint256 public immutable bonusMax; uint256 public immutable bonusPeriod; // global state fields uint256 public totalLockedShares; uint256 public totalStakingShares; uint256 public totalRewards; uint256 public totalCliqRewards; uint256 public totalStakingShareSeconds; uint256 public lastUpdated; address public bondingContract; // cliq fields IERC20 private immutable _cliq; IWETH private _weth = IWETH(0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2); address private marketing = 0xcf57ff60410d32d52357772363cd4CD57e70D312; address private community = 0xa3297BD4CfB1AC966b6Cdc7e81FD239016Bd6Fc2; modifier onlyOperator() { require(msg.sender == owner() || msg.sender == bondingContract, "Ownable: caller is not the operator"); _; } /** * @param stakingToken_ the token that will be staked * @param rewardToken_ the token distributed to users as they unstake * @param bonusMin_ initial time bonus * @param bonusMax_ maximum time bonus * @param bonusPeriod_ period (in seconds) over which time bonus grows to max * @param cliq_ address for Cliq token */ constructor( address stakingToken_, address rewardToken_, uint256 bonusMin_, uint256 bonusMax_, uint256 bonusPeriod_, address cliq_ ) public { require(rewardToken_ == address(_weth), "SuperNova: reward tokens should be weth."); require( bonusMin_ <= bonusMax_, "SuperNova: initial time bonus greater than max" ); _stakingPool = new SuperNovaPool(stakingToken_); _unlockedPool = new SuperNovaPool(rewardToken_); _lockedPool = new SuperNovaPool(rewardToken_); bonusMin = bonusMin_; bonusMax = bonusMax_; bonusPeriod = bonusPeriod_; _cliq = IERC20(cliq_); lastUpdated = block.timestamp; } receive() external payable {} // IStaking /** * @inheritdoc IStaking */ function stake(uint256 amount) external override { _stake(msg.sender, msg.sender, amount); } /** * @inheritdoc IStaking */ function stakeFor( address user, uint256 amount ) external override { _stake(msg.sender, user, amount); } /** * @inheritdoc IStaking */ function unstake(uint256 amount) external override { _unstake(amount, 0); } /** * @inheritdoc IStaking */ function totalStakedFor(address addr) public override view returns (uint256) { if (totalStakingShares == 0) { return 0; } return totalStaked().mul(userTotals[addr].shares).div(totalStakingShares); } /** * @inheritdoc IStaking */ function totalStaked() public override view returns (uint256) { return _stakingPool.balance(); } // ISuperNova /** * @inheritdoc ISuperNova */ function stakingToken() public override view returns (address) { return address(_stakingPool.token()); } /** * @inheritdoc ISuperNova */ function rewardToken() public override view returns (address) { return address(_unlockedPool.token()); } /** * @inheritdoc ISuperNova */ function fund(uint256 duration) public payable override { fund(duration, block.timestamp); } /** * @inheritdoc ISuperNova */ function fund( uint256 duration, uint256 start ) public payable override onlyOperator { uint256 amount = msg.value; // validate require(amount > 0, "SuperNova: funding amount is zero"); require(start >= block.timestamp, "SuperNova: funding start is past"); require( fundings.length < MAX_ACTIVE_FUNDINGS, "SuperNova: exceeds max active funding schedules" ); _weth.deposit{value: amount}(); // update bookkeeping _update(msg.sender); // mint shares at current rate uint256 lockedTokens = totalLocked(); uint256 mintedLockedShares = (lockedTokens > 0) ? totalLockedShares.mul(amount).div(lockedTokens) : amount.mul(INITIAL_SHARES_PER_TOKEN); totalLockedShares = totalLockedShares.add(mintedLockedShares); if(msg.sender == bondingContract) { //update funding info fundings[fundings.length - 1].amount = fundings[fundings.length - 1].amount.add(amount); fundings[fundings.length - 1].shares = fundings[fundings.length - 1].shares.add(mintedLockedShares); } else { // create new funding fundings.push( Funding({ amount: amount, shares: mintedLockedShares, unlocked: 0, lastUpdated: start, start: start, end: start.add(duration), duration: duration }) ); } // do transfer of funding _lockedPool.token().safeTransferFrom( address(this), address(_lockedPool), amount ); emit RewardsFunded(amount, duration, start, totalLocked()); } /** * @inheritdoc ISuperNova */ function withdraw(uint256 amount) external override { require(amount > 0, "SuperNova: withdraw amount is zero"); require( amount <= _cliq.balanceOf(address(this)), "SuperNova: withdraw amount exceeds balance" ); // do transfer //Burn Half tokens and half transfer to owner address uint256 burnedToken = amount.div(2); _cliq.burn(burnedToken); _cliq.safeTransfer(marketing, burnedToken * 75 / 100); _cliq.safeTransfer(community, burnedToken * 25 / 100); emit CliqWithdrawn(amount); } /** * @inheritdoc ISuperNova */ function unstake( uint256 amount, uint256 cliq ) external override { _unstake(amount, cliq); } /** * @inheritdoc ISuperNova */ function update() external override nonReentrant { _update(msg.sender); } /** * @inheritdoc ISuperNova */ function clean() external override onlyOwner { // update bookkeeping _update(msg.sender); // check for stale funding schedules to expire uint256 removed = 0; uint256 originalSize = fundings.length; for (uint256 i = 0; i < originalSize; i++) { Funding storage funding = fundings[i.sub(removed)]; uint256 idx = i.sub(removed); if (_unlockable(idx, block.timestamp) == 0 && block.timestamp >= funding.end) { emit RewardsExpired( funding.amount, funding.duration, funding.start ); // remove at idx by copying last element here, then popping off last // (we don't care about order) fundings[idx] = fundings[fundings.length.sub(1)]; fundings.pop(); removed = removed.add(1); } } } // SuperNova /** * @dev internal implementation of staking methods * @param staker address to do deposit of staking tokens * @param beneficiary address to gain credit for this stake operation * @param amount number of staking tokens to deposit */ function _stake( address staker, address beneficiary, uint256 amount ) private nonReentrant { // validate require(amount > 0, "SuperNova: stake amount is zero"); require( beneficiary != address(0), "Supernova: beneficiary is zero address" ); // mint staking shares at current rate uint256 mintedStakingShares = (totalStakingShares > 0) ? totalStakingShares.mul(amount).div(totalStaked()) : amount.mul(INITIAL_SHARES_PER_TOKEN); require(mintedStakingShares > 0, "SuperNova: stake amount too small"); // update bookkeeping _update(beneficiary); // update user staking info User storage user = userTotals[beneficiary]; user.shares = user.shares.add(mintedStakingShares); user.lastUpdated = block.timestamp; userStakes[beneficiary].push( Stake(mintedStakingShares, block.timestamp) ); // add newly minted shares to global total totalStakingShares = totalStakingShares.add(mintedStakingShares); // transactions _stakingPool.token().safeTransferFrom( staker, address(_stakingPool), amount ); emit Staked(beneficiary, amount, totalStakedFor(beneficiary), ""); } /** * @dev internal implementation of unstaking methods * @param amount number of tokens to unstake * @param cliq number of CLIQ tokens applied to unstaking operation * @return number of reward tokens distributed */ function _unstake(uint256 amount, uint256 cliq) private nonReentrant returns (uint256) { // validate require(amount > 0, "SuperNova: unstake amount is zero"); require( totalStakedFor(msg.sender) >= amount, "Supernova: unstake amount exceeds balance" ); // update bookkeeping _update(msg.sender); // do unstaking, first-in last-out, respecting time bonus uint256 timeWeightedShareSeconds = _unstakeFirstInLastOut(amount); // compute and apply CLIQ token bonus uint256 cliqWeightedShareSeconds = cliqBonus(cliq) .mul(timeWeightedShareSeconds) .div(10**BONUS_DECIMALS); uint256 rewardAmount = totalUnlocked() .mul(cliqWeightedShareSeconds) .div(totalStakingShareSeconds.add(cliqWeightedShareSeconds)); // update global stats for distributions if (cliq > 0) { totalCliqRewards = totalCliqRewards.add(rewardAmount); } totalRewards = totalRewards.add(rewardAmount); // transactions _stakingPool.transfer(msg.sender, amount); emit Unstaked(msg.sender, amount, totalStakedFor(msg.sender), ""); if (rewardAmount > 0) { _unlockedPool.transfer(address(this), rewardAmount); _weth.withdraw(rewardAmount); msg.sender.transfer(rewardAmount); emit RewardsDistributed(msg.sender, rewardAmount); } if (cliq > 0) { _cliq.safeTransferFrom(msg.sender, address(this), cliq); emit CliqSpent(msg.sender, cliq); } return rewardAmount; } /** * @dev helper function to actually execute unstaking, first-in last-out, while computing and applying time bonus. This function also updates user and global totals for shares and share-seconds. * @param amount number of staking tokens to withdraw * @return time bonus weighted staking share seconds */ function _unstakeFirstInLastOut(uint256 amount) private returns (uint256) { uint256 stakingSharesToBurn = totalStakingShares.mul(amount).div( totalStaked() ); require(stakingSharesToBurn > 0, "Supernova: unstake amount too small"); // redeem from most recent stake and go backwards in time. uint256 shareSecondsToBurn = 0; uint256 sharesLeftToBurn = stakingSharesToBurn; uint256 bonusWeightedShareSeconds = 0; Stake[] storage stakes = userStakes[msg.sender]; while (sharesLeftToBurn > 0) { Stake storage lastStake = stakes[stakes.length - 1]; uint256 stakeTime = block.timestamp.sub(lastStake.timestamp); uint256 bonus = timeBonus(stakeTime); if (lastStake.shares <= sharesLeftToBurn) { // fully redeem a past stake bonusWeightedShareSeconds = bonusWeightedShareSeconds.add( lastStake.shares.mul(stakeTime).mul(bonus).div( 10**BONUS_DECIMALS ) ); shareSecondsToBurn = shareSecondsToBurn.add( lastStake.shares.mul(stakeTime) ); sharesLeftToBurn = sharesLeftToBurn.sub(lastStake.shares); stakes.pop(); } else { // partially redeem a past stake bonusWeightedShareSeconds = bonusWeightedShareSeconds.add( sharesLeftToBurn.mul(stakeTime).mul(bonus).div( 10**BONUS_DECIMALS ) ); shareSecondsToBurn = shareSecondsToBurn.add( sharesLeftToBurn.mul(stakeTime) ); lastStake.shares = lastStake.shares.sub(sharesLeftToBurn); sharesLeftToBurn = 0; } } // update user totals User storage user = userTotals[msg.sender]; user.shareSeconds = user.shareSeconds.sub(shareSecondsToBurn); user.shares = user.shares.sub(stakingSharesToBurn); user.lastUpdated = block.timestamp; // update global totals totalStakingShareSeconds = totalStakingShareSeconds.sub( shareSecondsToBurn ); totalStakingShares = totalStakingShares.sub(stakingSharesToBurn); return bonusWeightedShareSeconds; } /** * @dev internal implementation of update method * @param addr address for user accounting update */ function _update(address addr) private { _unlockTokens(); // global accounting uint256 deltaTotalShareSeconds = (block.timestamp.sub(lastUpdated)).mul( totalStakingShares ); totalStakingShareSeconds = totalStakingShareSeconds.add( deltaTotalShareSeconds ); lastUpdated = block.timestamp; // user accounting User storage user = userTotals[addr]; uint256 deltaUserShareSeconds = (block.timestamp.sub(user.lastUpdated)) .mul(user.shares); user.shareSeconds = user.shareSeconds.add(deltaUserShareSeconds); user.lastUpdated = block.timestamp; } /** * @dev unlocks reward tokens based on funding schedules */ function _unlockTokens() private { uint256 tokensToUnlock = 0; uint256 lockedTokens = totalLocked(); if (totalLockedShares == 0) { // handle any leftover tokensToUnlock = lockedTokens; } else { // normal case: unlock some shares from each funding schedule uint256 sharesToUnlock = 0; for (uint256 i = 0; i < fundings.length; i++) { uint256 shares = _unlockable(i, block.timestamp); Funding storage funding = fundings[i]; if (shares > 0) { funding.unlocked = funding.unlocked.add(shares); funding.lastUpdated = block.timestamp; sharesToUnlock = sharesToUnlock.add(shares); } } tokensToUnlock = sharesToUnlock.mul(lockedTokens).div( totalLockedShares ); totalLockedShares = totalLockedShares.sub(sharesToUnlock); } if (tokensToUnlock > 0) { _lockedPool.transfer(address(_unlockedPool), tokensToUnlock); emit RewardsUnlocked(tokensToUnlock, totalUnlocked()); } } /** * @dev helper function to compute updates to funding schedules * @param idx index of the funding * @param unlockTime timestamp to unlock * @return the number of unlockable shares */ function _unlockable(uint256 idx, uint256 unlockTime) private view returns (uint256) { Funding storage funding = fundings[idx]; // funding schedule is in future if (unlockTime < funding.start) { return 0; } // empty if (funding.unlocked >= funding.shares) { return 0; } // handle zero-duration period or leftover dust from integer division if (unlockTime >= funding.end) { return funding.shares.sub(funding.unlocked); } return (unlockTime.sub(funding.lastUpdated)).mul(funding.shares).div( funding.duration ); } /** * @notice compute time bonus earned as a function of staking time * @param time length of time for which the tokens have been staked * @return bonus multiplier for time */ function timeBonus(uint256 time) public view returns (uint256) { if (time >= bonusPeriod) { return uint256(10**BONUS_DECIMALS).add(bonusMax); } // linearly interpolate between bonus min and bonus max uint256 bonus = bonusMin.add( (bonusMax.sub(bonusMin)).mul(time).div(bonusPeriod) ); return uint256(10**BONUS_DECIMALS).add(bonus); } /** * @notice compute CLIQ bonus as a function of usage ratio and CLIQ spent * @param cliq number of CLIQ token applied to bonus * @return multiplier value */ function cliqBonus(uint256 cliq) public view returns (uint256) { if (cliq == 0) { return 10**BONUS_DECIMALS; } require( cliq >= 10**BONUS_DECIMALS, "SUPERNOVA: CLIQ amount is between 0 and 1" ); uint256 buffer = uint256(5 * 10**(BONUS_DECIMALS - 2)); // 0.05 uint256 r = ratio().add(buffer); uint256 x = cliq.add(buffer); return uint256(10**BONUS_DECIMALS).add( uint256(int128(x.mul(2**64).div(r)).logbase10()) .mul(10**BONUS_DECIMALS) .div(2**64) ); } /** * @return portion of rewards which have been boosted by CLIQ token */ function ratio() public view returns (uint256) { if (totalRewards == 0) { return 0; } return totalCliqRewards.mul(10**BONUS_DECIMALS).div(totalRewards); } // SuperNova -- informational functions /** * @return total number of locked reward tokens */ function totalLocked() public view returns (uint256) { return _lockedPool.balance(); } /** * @return total number of unlocked reward tokens */ function totalUnlocked() public view returns (uint256) { return _unlockedPool.balance(); } /** * @return number of active funding schedules */ function fundingCount() public view returns (uint256) { return fundings.length; } /** * @param addr address of interest * @return number of active stakes for user */ function stakeCount(address addr) public view returns (uint256) { return userStakes[addr].length; } /** * @notice preview estimated reward distribution for unstaking * @param addr address of interest for preview * @param amount number of tokens that would be unstaked * @param cliq number of CLIQ tokens that would be applied * @return estimated reward * @return estimated overall multiplier */ function preview( address addr, uint256 amount, uint256 cliq ) public view returns ( uint256, uint256 ) { // compute expected updates to global totals uint256 deltaUnlocked = 0; if (totalLockedShares != 0) { uint256 sharesToUnlock = 0; for (uint256 i = 0; i < fundings.length; i++) { sharesToUnlock = sharesToUnlock.add(_unlockable(i, block.timestamp)); } deltaUnlocked = sharesToUnlock.mul(totalLocked()).div( totalLockedShares ); } // no need for unstaking/rewards computation if (amount == 0) { return (0, 0); } // check unstake amount require( amount <= totalStakedFor(addr), "SuperNova: preview amount exceeds balance" ); // compute unstake amount in shares uint256 shares = totalStakingShares.mul(amount).div(totalStaked()); require(shares > 0, "SuperNova: preview amount too small"); uint256 rawShareSeconds = 0; uint256 timeBonusShareSeconds = 0; // compute first-in-last-out, time bonus weighted, share seconds uint256 i = userStakes[addr].length.sub(1); while (shares > 0) { Stake storage s = userStakes[addr][i]; uint256 time = block.timestamp.sub(s.timestamp); if (s.shares < shares) { rawShareSeconds = rawShareSeconds.add(s.shares.mul(time)); timeBonusShareSeconds = timeBonusShareSeconds.add( s.shares.mul(time).mul(timeBonus(time)).div( 10**BONUS_DECIMALS ) ); shares = shares.sub(s.shares); } else { rawShareSeconds = rawShareSeconds.add(shares.mul(time)); timeBonusShareSeconds = timeBonusShareSeconds.add( shares.mul(time).mul(timeBonus(time)).div( 10**BONUS_DECIMALS ) ); break; } // this will throw on underflow i = i.sub(1); } // apply cliq bonus uint256 cliqBonusShareSeconds = cliqBonus(cliq) .mul(timeBonusShareSeconds) .div(10**BONUS_DECIMALS); // compute rewards based on expected updates uint256 expectedTotalShareSeconds = totalStakingShareSeconds .add((block.timestamp.sub(lastUpdated)).mul(totalStakingShares)) .add(cliqBonusShareSeconds) .sub(rawShareSeconds); uint256 reward = (totalUnlocked().add(deltaUnlocked)) .mul(cliqBonusShareSeconds) .div(expectedTotalShareSeconds); // compute effective bonus uint256 bonus = uint256(10**BONUS_DECIMALS) .mul(cliqBonusShareSeconds) .div(rawShareSeconds); return ( reward, bonus ); } /** * @notice preview estimated reward distribution for unstaking for future * @param addr address of interest for preview * @param timestamp end time for reward * @return estimated reward * @return estimated overall multiplier */ function previewForFuture( address addr, uint256 timestamp ) public view returns ( uint256, uint256 ) { // compute expected updates to global totals uint256 deltaUnlocked = 0; if (totalLockedShares != 0) { uint256 sharesToUnlock = 0; for (uint256 i = 0; i < fundings.length; i++) { sharesToUnlock = sharesToUnlock.add(_unlockable(i, timestamp)); } deltaUnlocked = sharesToUnlock.mul(totalLocked()).div( totalLockedShares ); } // no need for unstaking/rewards computation if (totalStakedFor(addr) == 0) { return (0, 0); } // compute unstake amount in shares uint256 shares = totalStakingShares.mul(totalStakedFor(addr)).div(totalStaked()); require(shares > 0, "SuperNova: preview amount too small"); uint256 rawShareSeconds = 0; uint256 timeBonusShareSeconds = 0; // compute first-in-last-out, time bonus weighted, share seconds uint256 i = userStakes[addr].length.sub(1); while (shares > 0) { Stake storage s = userStakes[addr][i]; uint256 time = timestamp.sub(s.timestamp); if (s.shares < shares) { rawShareSeconds = rawShareSeconds.add(s.shares.mul(time)); timeBonusShareSeconds = timeBonusShareSeconds.add( s.shares.mul(time).mul(timeBonus(time)).div( 10**BONUS_DECIMALS ) ); shares = shares.sub(s.shares); } else { rawShareSeconds = rawShareSeconds.add(shares.mul(time)); timeBonusShareSeconds = timeBonusShareSeconds.add( shares.mul(time).mul(timeBonus(time)).div( 10**BONUS_DECIMALS ) ); break; } // this will throw on underflow i = i.sub(1); } // apply cliq bonus uint256 cliqBonusShareSeconds = cliqBonus(0) .mul(timeBonusShareSeconds) .div(10**BONUS_DECIMALS); // compute rewards based on expected updates uint256 expectedTotalShareSeconds = totalStakingShareSeconds .add((block.timestamp.sub(lastUpdated)).mul(totalStakingShares)) .add(cliqBonusShareSeconds) .sub(rawShareSeconds); uint256 reward = (totalUnlocked().add(deltaUnlocked)) .mul(cliqBonusShareSeconds) .div(expectedTotalShareSeconds); // compute effective bonus uint256 bonus = uint256(10**BONUS_DECIMALS) .mul(cliqBonusShareSeconds) .div(rawShareSeconds); return ( reward, bonus ); } function unlockFundInSec(uint256 timestamp) external view returns (uint256 unlockAmount) { unlockAmount = 0; uint256 fundingLen = fundings.length; for (uint8 i=0; i<fundingLen; i++) { Funding storage funding = fundings[i]; if (timestamp < funding.end) { unlockAmount = unlockAmount.add((funding.shares).div(funding.duration)); } } } function setBondingContract(address _bondingContract) external onlyOwner { bondingContract = _bondingContract; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"stakingToken_","type":"address"},{"internalType":"address","name":"rewardToken_","type":"address"},{"internalType":"uint256","name":"bonusMin_","type":"uint256"},{"internalType":"uint256","name":"bonusMax_","type":"uint256"},{"internalType":"uint256","name":"bonusPeriod_","type":"uint256"},{"internalType":"address","name":"cliq_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"CliqSpent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"CliqWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"RewardsDistributed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"duration","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"start","type":"uint256"}],"name":"RewardsExpired","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"duration","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"start","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"total","type":"uint256"}],"name":"RewardsFunded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"total","type":"uint256"}],"name":"RewardsUnlocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"total","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"}],"name":"Staked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"total","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"}],"name":"Unstaked","type":"event"},{"inputs":[],"name":"BONUS_DECIMALS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"INITIAL_SHARES_PER_TOKEN","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_ACTIVE_FUNDINGS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bondingContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bonusMax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bonusMin","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bonusPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"clean","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"cliq","type":"uint256"}],"name":"cliqBonus","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"duration","type":"uint256"},{"internalType":"uint256","name":"start","type":"uint256"}],"name":"fund","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"duration","type":"uint256"}],"name":"fund","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"fundingCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"fundings","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"shares","type":"uint256"},{"internalType":"uint256","name":"unlocked","type":"uint256"},{"internalType":"uint256","name":"lastUpdated","type":"uint256"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"end","type":"uint256"},{"internalType":"uint256","name":"duration","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastUpdated","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"cliq","type":"uint256"}],"name":"preview","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"previewForFuture","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ratio","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_bondingContract","type":"address"}],"name":"setBondingContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"stakeCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"stakeFor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakingToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"supportsHistory","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"time","type":"uint256"}],"name":"timeBonus","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalCliqRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalLocked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalLockedShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalStaked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"totalStakedFor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalStakingShareSeconds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalStakingShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalUnlocked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"unlockFundInSec","outputs":[{"internalType":"uint256","name":"unlockAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"unstake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"cliq","type":"uint256"}],"name":"unstake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"update","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"userStakes","outputs":[{"internalType":"uint256","name":"shares","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userTotals","outputs":[{"internalType":"uint256","name":"shares","type":"uint256"},{"internalType":"uint256","name":"shareSeconds","type":"uint256"},{"internalType":"uint256","name":"lastUpdated","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
61016060405273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073cf57ff60410d32d52357772363cd4cd57e70d312600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073a3297bd4cfb1ac966b6cdc7e81fd239016bd6fc2600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503480156200011157600080fd5b506040516200629c3803806200629c833981810160405260c08110156200013757600080fd5b8101908080519060200190929190805190602001909291908051906020019092919080519060200190929190805190602001909291908051906020019092919050505060006200018c6200052260201b60201c565b9050806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35060018081905550600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614620002d9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526028815260200180620062466028913960400191505060405180910390fd5b8284111562000334576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e8152602001806200626e602e913960400191505060405180910390fd5b8560405162000343906200052a565b808273ffffffffffffffffffffffffffffffffffffffff168152602001915050604051809103906000f08015801562000380573d6000803e3d6000fd5b5073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1660601b8152505084604051620003c6906200052a565b808273ffffffffffffffffffffffffffffffffffffffff168152602001915050604051809103906000f08015801562000403573d6000803e3d6000fd5b5073ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff1660601b815250508460405162000449906200052a565b808273ffffffffffffffffffffffffffffffffffffffff168152602001915050604051809103906000f08015801562000486573d6000803e3d6000fd5b5073ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff1660601b815250508360e081815250508261010081815250508161012081815250508073ffffffffffffffffffffffffffffffffffffffff166101408173ffffffffffffffffffffffffffffffffffffffff1660601b8152505042600a8190555050505050505062000538565b600033905090565b610d25806200552183390190565b60805160601c60a05160601c60c05160601c60e05161010051610120516101405160601c614f25620005fc60003980610dc95280610efb5280610fba5280611034528061368d52508061113a5280611bfc5280611c695250806119ab5280611c265280611cb2525080610d385280611c915280611cfd52508061168452806122dc52806122fe528061491b5250806124325280612e1a52806134b2528061495752508061190552806119d1528061338e5280613b755280613b975250614f256000f3fe60806040526004361061026b5760003560e01c806381c39bec11610144578063c20e8137116100b6578063dc16ceb91161007a578063dc16ceb914610bca578063e999720f14610bf5578063eecaab0614610c36578063f2fde38b14610c87578063f7c618c114610cd8578063fc4333cd14610d1957610272565b8063c20e813714610a29578063ca1d209d14610aa9578063d0b06f5d14610ad7578063d13cb1fb14610b02578063d4936d1914610b7b57610272565b8063a2e6204511610108578063a2e62045146108d3578063a5be655c146108ea578063a65e2cfd14610915578063a694fc3a1461094d578063a779d08014610988578063b5d5b5fa146109b357610272565b806381c39bec146107845780638da5cb5b146107af5780639c46d162146107f05780639e2c8a5b1461083f5780639e57e4911461088457610272565b80634b8456b8116101dd57806370c6a17e116101a157806370c6a17e14610680578063715018a6146106ab57806371ca337d146106c257806372f702f3146106ed5780637aba86d21461072e578063817b1cd21461075957610272565b80634b8456b8146105a75780634fb2f554146105d257806351905d39146105fd57806356891412146106285780637033e4a61461065357610272565b80632ee409081161022f5780632ee409081461036e57806333060d90146103c9578063385c9e7d1461042e5780634af4a127146104a15780634b341aed146104cc5780634b61a1251461053157610272565b80630e15561a146102775780631b87d58a146102a25780631dc27fde146102cd5780632e17de78146102f85780632e1a7d4d1461033357610272565b3661027257005b600080fd5b34801561028357600080fd5b5061028c610d30565b6040518082815260200191505060405180910390f35b3480156102ae57600080fd5b506102b7610d36565b6040518082815260200191505060405180910390f35b3480156102d957600080fd5b506102e2610d5a565b6040518082815260200191505060405180910390f35b34801561030457600080fd5b506103316004803603602081101561031b57600080fd5b8101908080359060200190929190505050610d5f565b005b34801561033f57600080fd5b5061036c6004803603602081101561035657600080fd5b8101908080359060200190929190505050610d6e565b005b34801561037a57600080fd5b506103c76004803603604081101561039157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506110b3565b005b3480156103d557600080fd5b50610418600480360360208110156103ec57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506110c2565b6040518082815260200191505060405180910390f35b34801561043a57600080fd5b5061047d6004803603602081101561045157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061110e565b60405180848152602001838152602001828152602001935050505060405180910390f35b3480156104ad57600080fd5b506104b6611138565b6040518082815260200191505060405180910390f35b3480156104d857600080fd5b5061051b600480360360208110156104ef57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061115c565b6040518082815260200191505060405180910390f35b34801561053d57600080fd5b5061058a6004803603604081101561055457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506111e9565b604051808381526020018281526020019250505060405180910390f35b3480156105b357600080fd5b506105bc611668565b6040518082815260200191505060405180910390f35b3480156105de57600080fd5b506105e761166d565b6040518082815260200191505060405180910390f35b34801561060957600080fd5b5061061261167a565b6040518082815260200191505060405180910390f35b34801561063457600080fd5b5061063d611680565b6040518082815260200191505060405180910390f35b34801561065f57600080fd5b50610668611728565b60405180821515815260200191505060405180910390f35b34801561068c57600080fd5b5061069561172d565b6040518082815260200191505060405180910390f35b3480156106b757600080fd5b506106c0611733565b005b3480156106ce57600080fd5b506106d76118b9565b6040518082815260200191505060405180910390f35b3480156106f957600080fd5b50610702611901565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561073a57600080fd5b506107436119a9565b6040518082815260200191505060405180910390f35b34801561076557600080fd5b5061076e6119cd565b6040518082815260200191505060405180910390f35b34801561079057600080fd5b50610799611a75565b6040518082815260200191505060405180910390f35b3480156107bb57600080fd5b506107c4611a7b565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156107fc57600080fd5b506108296004803603602081101561081357600080fd5b8101908080359060200190929190505050611aa4565b6040518082815260200191505060405180910390f35b34801561084b57600080fd5b506108826004803603604081101561086257600080fd5b810190808035906020019092919080359060200190929190505050611be9565b005b34801561089057600080fd5b506108bd600480360360208110156108a757600080fd5b8101908080359060200190929190505050611bf8565b6040518082815260200191505060405180910390f35b3480156108df57600080fd5b506108e8611d4c565b005b3480156108f657600080fd5b506108ff611ddf565b6040518082815260200191505060405180910390f35b61094b6004803603604081101561092b57600080fd5b810190808035906020019092919080359060200190929190505050611de5565b005b34801561095957600080fd5b506109866004803603602081101561097057600080fd5b8101908080359060200190929190505050612420565b005b34801561099457600080fd5b5061099d61242e565b6040518082815260200191505060405180910390f35b3480156109bf57600080fd5b50610a0c600480360360408110156109d657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506124d6565b604051808381526020018281526020019250505060405180910390f35b348015610a3557600080fd5b50610a8c60048036036060811015610a4c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190929190505050612514565b604051808381526020018281526020019250505060405180910390f35b610ad560048036036020811015610abf57600080fd5b81019080803590602001909291905050506129e4565b005b348015610ae357600080fd5b50610aec6129f1565b6040518082815260200191505060405180910390f35b348015610b0e57600080fd5b50610b3b60048036036020811015610b2557600080fd5b81019080803590602001909291905050506129f7565b6040518088815260200187815260200186815260200185815260200184815260200183815260200182815260200197505050505050505060405180910390f35b348015610b8757600080fd5b50610bb460048036036020811015610b9e57600080fd5b8101908080359060200190929190505050612a46565b6040518082815260200191505060405180910390f35b348015610bd657600080fd5b50610bdf612ad2565b6040518082815260200191505060405180910390f35b348015610c0157600080fd5b50610c0a612ad9565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610c4257600080fd5b50610c8560048036036020811015610c5957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612aff565b005b348015610c9357600080fd5b50610cd660048036036020811015610caa57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612c0b565b005b348015610ce457600080fd5b50610ced612e16565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610d2557600080fd5b50610d2e612ebe565b005b60075481565b7f000000000000000000000000000000000000000000000000000000000000000081565b601281565b610d6a816000613180565b5050565b60008111610dc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180614e0c6022913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015610e4e57600080fd5b505afa158015610e62573d6000803e3d6000fd5b505050506040513d6020811015610e7857600080fd5b8101908080519060200190929190505050811115610ee1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180614cde602a913960400191505060405180910390fd5b6000610ef760028361373490919063ffffffff16565b90507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166342966c68826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015610f6c57600080fd5b505af1158015610f80573d6000803e3d6000fd5b50505050610ffe600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166064604b840281610fb757fe5b047f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1661377e9092919063ffffffff16565b611078600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166064601984028161103157fe5b047f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1661377e9092919063ffffffff16565b7fc3b7b583f0f1ac26b0a69acf0099a8ba0bb74a3782d898c8f721edc05524aee3826040518082815260200191505060405180910390a15050565b6110be338383613820565b5050565b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490509050919050565b60036020528060005260406000206000915090508060000154908060010154908060020154905083565b7f000000000000000000000000000000000000000000000000000000000000000081565b600080600654141561117157600090506111e4565b6111e16006546111d3600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001546111c56119cd565b613cdc90919063ffffffff16565b61373490919063ffffffff16565b90505b919050565b60008060008060055414611266576000805b600280549050811015611233576112246112158288613d62565b83613e2c90919063ffffffff16565b915080806001019150506111fb565b50611262600554611254611245611680565b84613cdc90919063ffffffff16565b61373490919063ffffffff16565b9150505b60006112718661115c565b1415611284576000809250925050611661565b60006112bc6112916119cd565b6112ae61129d8961115c565b600654613cdc90919063ffffffff16565b61373490919063ffffffff16565b905060008111611317576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180614e806023913960400191505060405180910390fd5b60008060006113726001600460008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050613eb490919063ffffffff16565b90505b6000841115611547576000600460008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002082815481106113ca57fe5b9060005260206000209060020201905060006113f382600101548b613eb490919063ffffffff16565b905085826000015410156114a55761142a61141b828460000154613cdc90919063ffffffff16565b86613e2c90919063ffffffff16565b94506114856114766012600a0a61146861144385611bf8565b61145a868860000154613cdc90919063ffffffff16565b613cdc90919063ffffffff16565b61373490919063ffffffff16565b85613e2c90919063ffffffff16565b935061149e826000015487613eb490919063ffffffff16565b955061152a565b6114ca6114bb8288613cdc90919063ffffffff16565b86613e2c90919063ffffffff16565b94506115216115126012600a0a6115046114e385611bf8565b6114f6868c613cdc90919063ffffffff16565b613cdc90919063ffffffff16565b61373490919063ffffffff16565b85613e2c90919063ffffffff16565b93505050611547565b61153e600184613eb490919063ffffffff16565b92505050611375565b600061157b6012600a0a61156d8561155f6000611aa4565b613cdc90919063ffffffff16565b61373490919063ffffffff16565b905060006115e0856115d2846115c46115b36006546115a5600a5442613eb490919063ffffffff16565b613cdc90919063ffffffff16565b600954613e2c90919063ffffffff16565b613e2c90919063ffffffff16565b613eb490919063ffffffff16565b9050600061162282611614856116068c6115f861242e565b613e2c90919063ffffffff16565b613cdc90919063ffffffff16565b61373490919063ffffffff16565b9050600061164f87611641866012600a0a613cdc90919063ffffffff16565b61373490919063ffffffff16565b905081819a509a505050505050505050505b9250929050565b601081565b6000600280549050905090565b60085481565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663b69ef8a86040518163ffffffff1660e01b815260040160206040518083038186803b1580156116e857600080fd5b505afa1580156116fc573d6000803e3d6000fd5b505050506040513d602081101561171257600080fd5b8101908080519060200190929190505050905090565b600090565b60065481565b61173b613efe565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146117fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60008060075414156118ce57600090506118fe565b6118fb6007546118ed6012600a0a600854613cdc90919063ffffffff16565b61373490919063ffffffff16565b90505b90565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b15801561196957600080fd5b505afa15801561197d573d6000803e3d6000fd5b505050506040513d602081101561199357600080fd5b8101908080519060200190929190505050905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663b69ef8a86040518163ffffffff1660e01b815260040160206040518083038186803b158015611a3557600080fd5b505afa158015611a49573d6000803e3d6000fd5b505050506040513d6020811015611a5f57600080fd5b8101908080519060200190929190505050905090565b60055481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600080821415611aba576012600a0a9050611be4565b6012600a0a821015611b17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526029815260200180614d796029913960400191505060405180910390fd5b60006002601203600a0a60050290506000611b4282611b346118b9565b613e2c90919063ffffffff16565b90506000611b598386613e2c90919063ffffffff16565b9050611bde611bcb68010000000000000000611bbd6012600a0a611bac611ba488611b96680100000000000000008a613cdc90919063ffffffff16565b61373490919063ffffffff16565b600f0b613f06565b600f0b613cdc90919063ffffffff16565b61373490919063ffffffff16565b6012600a0a613e2c90919063ffffffff16565b93505050505b919050565b611bf38282613180565b505050565b60007f00000000000000000000000000000000000000000000000000000000000000008210611c5f57611c587f00000000000000000000000000000000000000000000000000000000000000006012600a0a613e2c90919063ffffffff16565b9050611d47565b6000611d2a611cfb7f0000000000000000000000000000000000000000000000000000000000000000611ced86611cdf7f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000613eb490919063ffffffff16565b613cdc90919063ffffffff16565b61373490919063ffffffff16565b7f0000000000000000000000000000000000000000000000000000000000000000613e2c90919063ffffffff16565b9050611d43816012600a0a613e2c90919063ffffffff16565b9150505b919050565b60026001541415611dc5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b6002600181905550611dd633613f40565b60018081905550565b60095481565b611ded611a7b565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611e735750600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611ec8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180614ecd6023913960400191505060405180910390fd5b600034905060008111611f26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180614deb6021913960400191505060405180910390fd5b42821015611f9c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f53757065724e6f76613a2066756e64696e67207374617274206973207061737481525060200191505060405180910390fd5b601060028054905010611ffa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180614d08602f913960400191505060405180910390fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b15801561206457600080fd5b505af1158015612078573d6000803e3d6000fd5b505050505061208633613f40565b6000612090611680565b905060008082116120b6576120b1620f424084613cdc90919063ffffffff16565b6120de565b6120dd826120cf85600554613cdc90919063ffffffff16565b61373490919063ffffffff16565b5b90506120f581600554613e2c90919063ffffffff16565b600581905550600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141561221c5761218a8360026001600280549050038154811061216a57fe5b906000526020600020906007020160000154613e2c90919063ffffffff16565b60026001600280549050038154811061219f57fe5b9060005260206000209060070201600001819055506121ed816002600160028054905003815481106121cd57fe5b906000526020600020906007020160010154613e2c90919063ffffffff16565b60026001600280549050038154811061220257fe5b9060005260206000209060070201600101819055506122d6565b60026040518060e001604052808581526020018381526020016000815260200186815260200186815260200161225b8888613e2c90919063ffffffff16565b8152602001878152509080600181540180825580915050600190039060005260206000209060070201600090919091909150600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015550505b6123c3307f0000000000000000000000000000000000000000000000000000000000000000857f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b15801561236257600080fd5b505afa158015612376573d6000803e3d6000fd5b505050506040513d602081101561238c57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff16614039909392919063ffffffff16565b7fd3599d59babb3b3382347fcd4e88030d12d499404076688f2fc4efab2d3c4a578386866123ef611680565b6040518085815260200184815260200183815260200182815260200194505050505060405180910390a15050505050565b61242b333383613820565b50565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663b69ef8a86040518163ffffffff1660e01b815260040160206040518083038186803b15801561249657600080fd5b505afa1580156124aa573d6000803e3d6000fd5b505050506040513d60208110156124c057600080fd5b8101908080519060200190929190505050905090565b600460205281600052604060002081815481106124ef57fe5b9060005260206000209060020201600091509150508060000154908060010154905082565b60008060008060055414612591576000805b60028054905081101561255e5761254f6125408242613d62565b83613e2c90919063ffffffff16565b91508080600101915050612526565b5061258d60055461257f612570611680565b84613cdc90919063ffffffff16565b61373490919063ffffffff16565b9150505b60008514156125a75760008092509250506129dc565b6125b08661115c565b851115612608576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526029815260200180614e2e6029913960400191505060405180910390fd5b60006126386126156119cd565b61262a88600654613cdc90919063ffffffff16565b61373490919063ffffffff16565b905060008111612693576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180614e806023913960400191505060405180910390fd5b60008060006126ee6001600460008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050613eb490919063ffffffff16565b90505b60008411156128c3576000600460008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020828154811061274657fe5b90600052602060002090600202019050600061276f826001015442613eb490919063ffffffff16565b90508582600001541015612821576127a6612797828460000154613cdc90919063ffffffff16565b86613e2c90919063ffffffff16565b94506128016127f26012600a0a6127e46127bf85611bf8565b6127d6868860000154613cdc90919063ffffffff16565b613cdc90919063ffffffff16565b61373490919063ffffffff16565b85613e2c90919063ffffffff16565b935061281a826000015487613eb490919063ffffffff16565b95506128a6565b6128466128378288613cdc90919063ffffffff16565b86613e2c90919063ffffffff16565b945061289d61288e6012600a0a61288061285f85611bf8565b612872868c613cdc90919063ffffffff16565b613cdc90919063ffffffff16565b61373490919063ffffffff16565b85613e2c90919063ffffffff16565b935050506128c3565b6128ba600184613eb490919063ffffffff16565b925050506126f1565b60006128f66012600a0a6128e8856128da8d611aa4565b613cdc90919063ffffffff16565b61373490919063ffffffff16565b9050600061295b8561294d8461293f61292e600654612920600a5442613eb490919063ffffffff16565b613cdc90919063ffffffff16565b600954613e2c90919063ffffffff16565b613e2c90919063ffffffff16565b613eb490919063ffffffff16565b9050600061299d8261298f856129818c61297361242e565b613e2c90919063ffffffff16565b613cdc90919063ffffffff16565b61373490919063ffffffff16565b905060006129ca876129bc866012600a0a613cdc90919063ffffffff16565b61373490919063ffffffff16565b905081819a509a505050505050505050505b935093915050565b6129ee8142611de5565b50565b600a5481565b60028181548110612a0457fe5b90600052602060002090600702016000915090508060000154908060010154908060020154908060030154908060040154908060050154908060060154905087565b600080600280549050905060005b818160ff161015612acb57600060028260ff1681548110612a7157fe5b906000526020600020906007020190508060050154851015612abd57612aba612aab8260060154836001015461373490919063ffffffff16565b85613e2c90919063ffffffff16565b93505b508080600101915050612a54565b5050919050565b620f424081565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b612b07613efe565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612bc7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b612c13613efe565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612cd3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612d59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180614c976026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b158015612e7e57600080fd5b505afa158015612e92573d6000803e3d6000fd5b505050506040513d6020811015612ea857600080fd5b8101908080519060200190929190505050905090565b612ec6613efe565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612f86576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b612f8f33613f40565b600080600280549050905060005b8181101561317b5760006002612fbc8584613eb490919063ffffffff16565b81548110612fc657fe5b906000526020600020906007020190506000612feb8584613eb490919063ffffffff16565b90506000612ff98242613d62565b14801561300a575081600501544210155b1561316c577f3bdea4ef9f7e20da64d7c2f1e5fca1178145d56d25bad0e0a23d7a209261fe7b82600001548360060154846004015460405180848152602001838152602001828152602001935050505060405180910390a1600261307d6001600280549050613eb490919063ffffffff16565b8154811061308757fe5b9060005260206000209060070201600282815481106130a257fe5b906000526020600020906007020160008201548160000155600182015481600101556002820154816002015560038201548160030155600482015481600401556005820154816005015560068201548160060155905050600280548061310457fe5b600190038181906000526020600020906007020160008082016000905560018201600090556002820160009055600382016000905560048201600090556005820160009055600682016000905550509055613169600186613e2c90919063ffffffff16565b94505b50508080600101915050612f9d565b505050565b6000600260015414156131fb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b60026001819055506000831161325c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180614d376021913960400191505060405180910390fd5b826132663361115c565b10156132bd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526029815260200180614e576029913960400191505060405180910390fd5b6132c633613f40565b60006132d1846140fa565b905060006133066012600a0a6132f8846132ea88611aa4565b613cdc90919063ffffffff16565b61373490919063ffffffff16565b9050600061334a61332283600954613e2c90919063ffffffff16565b61333c8461332e61242e565b613cdc90919063ffffffff16565b61373490919063ffffffff16565b905060008511156133715761336a81600854613e2c90919063ffffffff16565b6008819055505b61338681600754613e2c90919063ffffffff16565b6007819055507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33886040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b15801561341d57600080fd5b505af1158015613431573d6000803e3d6000fd5b505050503373ffffffffffffffffffffffffffffffffffffffff167faf01bfc8475df280aca00b578c4a948e6d95700f0db8c13365240f7f973c8754876134773361115c565b6040518083815260200182815260200180602001828103825260008152602001602001935050505060405180910390a2600081111561367c577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb30836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b15801561354157600080fd5b505af1158015613555573d6000803e3d6000fd5b50505050600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156135ce57600080fd5b505af11580156135e2573d6000803e3d6000fd5b505050503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015801561362c573d6000803e3d6000fd5b503373ffffffffffffffffffffffffffffffffffffffff167fdf29796aad820e4bb192f3a8d631b76519bcd2cbe77cc85af20e9df53cece086826040518082815260200191505060405180910390a25b6000851115613721576136d23330877f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16614039909392919063ffffffff16565b3373ffffffffffffffffffffffffffffffffffffffff167fffcfab34d8545cc586453a18a775d2fc7562aecf5df6fb947e9d7a478045c5fa866040518082815260200191505060405180910390a25b8093505050506001808190555092915050565b600061377683836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250614471565b905092915050565b61381b8363a9059cbb60e01b8484604051602401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050614537565b505050565b60026001541415613899576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b600260018190555060008111613917576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f53757065724e6f76613a207374616b6520616d6f756e74206973207a65726f0081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561399d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180614dc56026913960400191505060405180910390fd5b600080600654116139c3576139be620f424083613cdc90919063ffffffff16565b6139f2565b6139f16139ce6119cd565b6139e384600654613cdc90919063ffffffff16565b61373490919063ffffffff16565b5b905060008111613a4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180614cbd6021913960400191505060405180910390fd5b613a5683613f40565b6000600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050613ab0828260000154613e2c90919063ffffffff16565b8160000181905550428160020181905550600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020604051806040016040528084815260200142815250908060018154018082558091505060019003906000526020600020906002020160009091909190915060008201518160000155602082015181600101555050613b6982600654613e2c90919063ffffffff16565b600681905550613c5c857f0000000000000000000000000000000000000000000000000000000000000000857f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b158015613bfb57600080fd5b505afa158015613c0f573d6000803e3d6000fd5b505050506040513d6020811015613c2557600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff16614039909392919063ffffffff16565b8373ffffffffffffffffffffffffffffffffffffffff167fc65e53b88159e7d2c0fc12a0600072e28ae53ff73b4c1715369c30f16093514284613c9e8761115c565b6040518083815260200182815260200180602001828103825260008152602001602001935050505060405180910390a2505060018081905550505050565b600080831415613cef5760009050613d5c565b6000828402905082848281613d0057fe5b0414613d57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180614d586021913960400191505060405180910390fd5b809150505b92915050565b60008060028481548110613d7257fe5b906000526020600020906007020190508060040154831015613d98576000915050613e26565b8060010154816002015410613db1576000915050613e26565b80600501548310613ddf57613dd781600201548260010154613eb490919063ffffffff16565b915050613e26565b613e228160060154613e148360010154613e06856003015488613eb490919063ffffffff16565b613cdc90919063ffffffff16565b61373490919063ffffffff16565b9150505b92915050565b600080828401905083811015613eaa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b6000613ef683836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250614626565b905092915050565b600033905090565b60008082600f0b13613f1757600080fd5b60806f4d104d427de7fce20a6e420e02236748613f33846146e6565b600f0b02901c9050919050565b613f48614815565b6000613f73600654613f65600a5442613eb490919063ffffffff16565b613cdc90919063ffffffff16565b9050613f8a81600954613e2c90919063ffffffff16565b60098190555042600a819055506000600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060006140098260000154613ffb846002015442613eb490919063ffffffff16565b613cdc90919063ffffffff16565b9050614022818360010154613e2c90919063ffffffff16565b826001018190555042826002018190555050505050565b6140f4846323b872dd60e01b858585604051602401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050614537565b50505050565b60008061412b6141086119cd565b61411d85600654613cdc90919063ffffffff16565b61373490919063ffffffff16565b905060008111614186576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180614da26023913960400191505060405180910390fd5b600080829050600080600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090505b60008311156143a3576000816001838054905003815481106141ef57fe5b906000526020600020906002020190506000614218826001015442613eb490919063ffffffff16565b9050600061422582611bf8565b905085836000015411614301576142836142746012600a0a61426684614258878960000154613cdc90919063ffffffff16565b613cdc90919063ffffffff16565b61373490919063ffffffff16565b86613e2c90919063ffffffff16565b94506142ae61429f838560000154613cdc90919063ffffffff16565b88613e2c90919063ffffffff16565b96506142c7836000015487613eb490919063ffffffff16565b9550838054806142d357fe5b600190038181906000526020600020906002020160008082016000905560018201600090555050905561439b565b61434e61433f6012600a0a61433184614323878c613cdc90919063ffffffff16565b613cdc90919063ffffffff16565b61373490919063ffffffff16565b86613e2c90919063ffffffff16565b94506143756143668388613cdc90919063ffffffff16565b88613e2c90919063ffffffff16565b965061438e868460000154613eb490919063ffffffff16565b8360000181905550600095505b5050506141d1565b6000600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506143fd858260010154613eb490919063ffffffff16565b816001018190555061441c868260000154613eb490919063ffffffff16565b816000018190555042816002018190555061444285600954613eb490919063ffffffff16565b60098190555061445d86600654613eb490919063ffffffff16565b600681905550829650505050505050919050565b6000808311829061451d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156144e25780820151818401526020810190506144c7565b50505050905090810190601f16801561450f5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50600083858161452957fe5b049050809150509392505050565b6060614599826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16614a2d9092919063ffffffff16565b9050600081511115614621578080602001905160208110156145ba57600080fd5b8101908080519060200190929190505050614620576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180614ea3602a913960400191505060405180910390fd5b5b505050565b60008383111582906146d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561469857808201518184015260208101905061467d565b50505050905090810190601f1680156146c55780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b60008082600f0b136146f757600080fd5b60008083600f0b905068010000000000000000811261471e57604081901d90506040820191505b640100000000811261473857602081901d90506020820191505b62010000811261475057601081901d90506010820191505b610100811261476757600881901d90506008820191505b6010811261477d57600481901d90506004820191505b6004811261479357600281901d90506002820191505b600281126147a2576001820191505b60006040808403901b9050600083607f0386600f0b60008212156147c257fe5b901b9050600067800000000000000090505b6000811315614808578182029150600060ff83901c905080607f0183901c92508082028401935050600181901d90506147d4565b5081945050505050919050565b600080614820611680565b90506000600554141561483557809150614910565b6000805b6002805490508110156148c95760006148528242613d62565b905060006002838154811061486357fe5b9060005260206000209060070201905060008211156148ba57614893828260020154613e2c90919063ffffffff16565b81600201819055504281600301819055506148b78285613e2c90919063ffffffff16565b93505b50508080600101915050614839565b506148f16005546148e38484613cdc90919063ffffffff16565b61373490919063ffffffff16565b925061490881600554613eb490919063ffffffff16565b600581905550505b6000821115614a29577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb7f0000000000000000000000000000000000000000000000000000000000000000846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b1580156149ca57600080fd5b505af11580156149de573d6000803e3d6000fd5b505050507f05b6b33aa8c89542004be445284c4d44c5f3654d65638da167510824426020dd82614a0c61242e565b604051808381526020018281526020019250505060405180910390a15b5050565b6060614a3c8484600085614a45565b90509392505050565b6060614a5085614c4b565b614ac2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000081525060200191505060405180910390fd5b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b60208310614b125780518252602082019150602081019050602083039250614aef565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114614b74576040519150601f19603f3d011682016040523d82523d6000602084013e614b79565b606091505b50915091508115614b8e578092505050614c43565b600081511115614ba15780518082602001fd5b836040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015614c08578082015181840152602081019050614bed565b50505050905090810190601f168015614c355780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b949350505050565b60008060007fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050833f9150808214158015614c8d57506000801b8214155b9250505091905056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737353757065724e6f76613a207374616b6520616d6f756e7420746f6f20736d616c6c53757065724e6f76613a20776974686472617720616d6f756e7420657863656564732062616c616e636553757065724e6f76613a2065786365656473206d6178206163746976652066756e64696e67207363686564756c657353757065724e6f76613a20756e7374616b6520616d6f756e74206973207a65726f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7753555045524e4f56413a20434c495120616d6f756e74206973206265747765656e203020616e64203153757065726e6f76613a20756e7374616b6520616d6f756e7420746f6f20736d616c6c53757065726e6f76613a2062656e6566696369617279206973207a65726f206164647265737353757065724e6f76613a2066756e64696e6720616d6f756e74206973207a65726f53757065724e6f76613a20776974686472617720616d6f756e74206973207a65726f53757065724e6f76613a207072657669657720616d6f756e7420657863656564732062616c616e636553757065726e6f76613a20756e7374616b6520616d6f756e7420657863656564732062616c616e636553757065724e6f76613a207072657669657720616d6f756e7420746f6f20736d616c6c5361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565644f776e61626c653a2063616c6c6572206973206e6f7420746865206f70657261746f72a26469706673582212200d8323a2f1aed0e4b2b803fb9ebbf560343b659e84a30d1537c05b0940f2c59064736f6c634300060c0033608060405234801561001057600080fd5b50604051610d25380380610d258339818101604052602081101561003357600080fd5b8101908080519060200190929190505050600061005461013960201b60201c565b9050806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35080600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050610141565b600033905090565b610bd5806101506000396000f3fe608060405234801561001057600080fd5b50600436106100625760003560e01c8063715018a6146100675780638da5cb5b14610071578063a9059cbb146100a5578063b69ef8a8146100f3578063f2fde38b14610111578063fc0c546a14610155575b600080fd5b61006f610189565b005b61007961030f565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6100f1600480360360408110156100bb57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610338565b005b6100fb610451565b6040518082815260200191505060405180910390f35b6101536004803603602081101561012757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061051c565b005b61015d610727565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61019161074d565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610251576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61034061074d565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610400576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b61044d8282600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166107559092919063ffffffff16565b5050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156104dc57600080fd5b505afa1580156104f0573d6000803e3d6000fd5b505050506040513d602081101561050657600080fd5b8101908080519060200190929190505050905090565b61052461074d565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146105e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561066a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180610b506026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600033905090565b6107f28363a9059cbb60e01b8484604051602401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506107f7565b505050565b6060610859826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166108e69092919063ffffffff16565b90506000815111156108e15780806020019051602081101561087a57600080fd5b81019080805190602001909291905050506108e0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180610b76602a913960400191505060405180910390fd5b5b505050565b60606108f584846000856108fe565b90509392505050565b606061090985610b04565b61097b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000081525060200191505060405180910390fd5b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b602083106109cb57805182526020820191506020810190506020830392506109a8565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114610a2d576040519150601f19603f3d011682016040523d82523d6000602084013e610a32565b606091505b50915091508115610a47578092505050610afc565b600081511115610a5a5780518082602001fd5b836040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015610ac1578082015181840152602081019050610aa6565b50505050905090810190601f168015610aee5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b949350505050565b60008060007fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050833f9150808214158015610b4657506000801b8214155b9250505091905056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573735361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a26469706673582212200cb519e11367fbdc714c8611a8e25c0335d5476150874065ec982cdd113ae2d864736f6c634300060c003353757065724e6f76613a2072657761726420746f6b656e732073686f756c6420626520776574682e53757065724e6f76613a20696e697469616c2074696d6520626f6e75732067726561746572207468616e206d6178000000000000000000000000ab4dc161cc0017befb711bf42a1b81441db624e9000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000000000000000000000000000016345785d8a00000000000000000000000000000000000000000000000000003782dace9d9000000000000000000000000000000000000000000000000000000000000000278d00000000000000000000000000ab4dc161cc0017befb711bf42a1b81441db624e9
Deployed Bytecode
0x60806040526004361061026b5760003560e01c806381c39bec11610144578063c20e8137116100b6578063dc16ceb91161007a578063dc16ceb914610bca578063e999720f14610bf5578063eecaab0614610c36578063f2fde38b14610c87578063f7c618c114610cd8578063fc4333cd14610d1957610272565b8063c20e813714610a29578063ca1d209d14610aa9578063d0b06f5d14610ad7578063d13cb1fb14610b02578063d4936d1914610b7b57610272565b8063a2e6204511610108578063a2e62045146108d3578063a5be655c146108ea578063a65e2cfd14610915578063a694fc3a1461094d578063a779d08014610988578063b5d5b5fa146109b357610272565b806381c39bec146107845780638da5cb5b146107af5780639c46d162146107f05780639e2c8a5b1461083f5780639e57e4911461088457610272565b80634b8456b8116101dd57806370c6a17e116101a157806370c6a17e14610680578063715018a6146106ab57806371ca337d146106c257806372f702f3146106ed5780637aba86d21461072e578063817b1cd21461075957610272565b80634b8456b8146105a75780634fb2f554146105d257806351905d39146105fd57806356891412146106285780637033e4a61461065357610272565b80632ee409081161022f5780632ee409081461036e57806333060d90146103c9578063385c9e7d1461042e5780634af4a127146104a15780634b341aed146104cc5780634b61a1251461053157610272565b80630e15561a146102775780631b87d58a146102a25780631dc27fde146102cd5780632e17de78146102f85780632e1a7d4d1461033357610272565b3661027257005b600080fd5b34801561028357600080fd5b5061028c610d30565b6040518082815260200191505060405180910390f35b3480156102ae57600080fd5b506102b7610d36565b6040518082815260200191505060405180910390f35b3480156102d957600080fd5b506102e2610d5a565b6040518082815260200191505060405180910390f35b34801561030457600080fd5b506103316004803603602081101561031b57600080fd5b8101908080359060200190929190505050610d5f565b005b34801561033f57600080fd5b5061036c6004803603602081101561035657600080fd5b8101908080359060200190929190505050610d6e565b005b34801561037a57600080fd5b506103c76004803603604081101561039157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506110b3565b005b3480156103d557600080fd5b50610418600480360360208110156103ec57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506110c2565b6040518082815260200191505060405180910390f35b34801561043a57600080fd5b5061047d6004803603602081101561045157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061110e565b60405180848152602001838152602001828152602001935050505060405180910390f35b3480156104ad57600080fd5b506104b6611138565b6040518082815260200191505060405180910390f35b3480156104d857600080fd5b5061051b600480360360208110156104ef57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061115c565b6040518082815260200191505060405180910390f35b34801561053d57600080fd5b5061058a6004803603604081101561055457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506111e9565b604051808381526020018281526020019250505060405180910390f35b3480156105b357600080fd5b506105bc611668565b6040518082815260200191505060405180910390f35b3480156105de57600080fd5b506105e761166d565b6040518082815260200191505060405180910390f35b34801561060957600080fd5b5061061261167a565b6040518082815260200191505060405180910390f35b34801561063457600080fd5b5061063d611680565b6040518082815260200191505060405180910390f35b34801561065f57600080fd5b50610668611728565b60405180821515815260200191505060405180910390f35b34801561068c57600080fd5b5061069561172d565b6040518082815260200191505060405180910390f35b3480156106b757600080fd5b506106c0611733565b005b3480156106ce57600080fd5b506106d76118b9565b6040518082815260200191505060405180910390f35b3480156106f957600080fd5b50610702611901565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561073a57600080fd5b506107436119a9565b6040518082815260200191505060405180910390f35b34801561076557600080fd5b5061076e6119cd565b6040518082815260200191505060405180910390f35b34801561079057600080fd5b50610799611a75565b6040518082815260200191505060405180910390f35b3480156107bb57600080fd5b506107c4611a7b565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156107fc57600080fd5b506108296004803603602081101561081357600080fd5b8101908080359060200190929190505050611aa4565b6040518082815260200191505060405180910390f35b34801561084b57600080fd5b506108826004803603604081101561086257600080fd5b810190808035906020019092919080359060200190929190505050611be9565b005b34801561089057600080fd5b506108bd600480360360208110156108a757600080fd5b8101908080359060200190929190505050611bf8565b6040518082815260200191505060405180910390f35b3480156108df57600080fd5b506108e8611d4c565b005b3480156108f657600080fd5b506108ff611ddf565b6040518082815260200191505060405180910390f35b61094b6004803603604081101561092b57600080fd5b810190808035906020019092919080359060200190929190505050611de5565b005b34801561095957600080fd5b506109866004803603602081101561097057600080fd5b8101908080359060200190929190505050612420565b005b34801561099457600080fd5b5061099d61242e565b6040518082815260200191505060405180910390f35b3480156109bf57600080fd5b50610a0c600480360360408110156109d657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506124d6565b604051808381526020018281526020019250505060405180910390f35b348015610a3557600080fd5b50610a8c60048036036060811015610a4c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190929190505050612514565b604051808381526020018281526020019250505060405180910390f35b610ad560048036036020811015610abf57600080fd5b81019080803590602001909291905050506129e4565b005b348015610ae357600080fd5b50610aec6129f1565b6040518082815260200191505060405180910390f35b348015610b0e57600080fd5b50610b3b60048036036020811015610b2557600080fd5b81019080803590602001909291905050506129f7565b6040518088815260200187815260200186815260200185815260200184815260200183815260200182815260200197505050505050505060405180910390f35b348015610b8757600080fd5b50610bb460048036036020811015610b9e57600080fd5b8101908080359060200190929190505050612a46565b6040518082815260200191505060405180910390f35b348015610bd657600080fd5b50610bdf612ad2565b6040518082815260200191505060405180910390f35b348015610c0157600080fd5b50610c0a612ad9565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610c4257600080fd5b50610c8560048036036020811015610c5957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612aff565b005b348015610c9357600080fd5b50610cd660048036036020811015610caa57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612c0b565b005b348015610ce457600080fd5b50610ced612e16565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610d2557600080fd5b50610d2e612ebe565b005b60075481565b7f000000000000000000000000000000000000000000000000016345785d8a000081565b601281565b610d6a816000613180565b5050565b60008111610dc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180614e0c6022913960400191505060405180910390fd5b7f000000000000000000000000ab4dc161cc0017befb711bf42a1b81441db624e973ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015610e4e57600080fd5b505afa158015610e62573d6000803e3d6000fd5b505050506040513d6020811015610e7857600080fd5b8101908080519060200190929190505050811115610ee1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180614cde602a913960400191505060405180910390fd5b6000610ef760028361373490919063ffffffff16565b90507f000000000000000000000000ab4dc161cc0017befb711bf42a1b81441db624e973ffffffffffffffffffffffffffffffffffffffff166342966c68826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015610f6c57600080fd5b505af1158015610f80573d6000803e3d6000fd5b50505050610ffe600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166064604b840281610fb757fe5b047f000000000000000000000000ab4dc161cc0017befb711bf42a1b81441db624e973ffffffffffffffffffffffffffffffffffffffff1661377e9092919063ffffffff16565b611078600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166064601984028161103157fe5b047f000000000000000000000000ab4dc161cc0017befb711bf42a1b81441db624e973ffffffffffffffffffffffffffffffffffffffff1661377e9092919063ffffffff16565b7fc3b7b583f0f1ac26b0a69acf0099a8ba0bb74a3782d898c8f721edc05524aee3826040518082815260200191505060405180910390a15050565b6110be338383613820565b5050565b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490509050919050565b60036020528060005260406000206000915090508060000154908060010154908060020154905083565b7f0000000000000000000000000000000000000000000000000000000000278d0081565b600080600654141561117157600090506111e4565b6111e16006546111d3600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001546111c56119cd565b613cdc90919063ffffffff16565b61373490919063ffffffff16565b90505b919050565b60008060008060055414611266576000805b600280549050811015611233576112246112158288613d62565b83613e2c90919063ffffffff16565b915080806001019150506111fb565b50611262600554611254611245611680565b84613cdc90919063ffffffff16565b61373490919063ffffffff16565b9150505b60006112718661115c565b1415611284576000809250925050611661565b60006112bc6112916119cd565b6112ae61129d8961115c565b600654613cdc90919063ffffffff16565b61373490919063ffffffff16565b905060008111611317576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180614e806023913960400191505060405180910390fd5b60008060006113726001600460008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050613eb490919063ffffffff16565b90505b6000841115611547576000600460008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002082815481106113ca57fe5b9060005260206000209060020201905060006113f382600101548b613eb490919063ffffffff16565b905085826000015410156114a55761142a61141b828460000154613cdc90919063ffffffff16565b86613e2c90919063ffffffff16565b94506114856114766012600a0a61146861144385611bf8565b61145a868860000154613cdc90919063ffffffff16565b613cdc90919063ffffffff16565b61373490919063ffffffff16565b85613e2c90919063ffffffff16565b935061149e826000015487613eb490919063ffffffff16565b955061152a565b6114ca6114bb8288613cdc90919063ffffffff16565b86613e2c90919063ffffffff16565b94506115216115126012600a0a6115046114e385611bf8565b6114f6868c613cdc90919063ffffffff16565b613cdc90919063ffffffff16565b61373490919063ffffffff16565b85613e2c90919063ffffffff16565b93505050611547565b61153e600184613eb490919063ffffffff16565b92505050611375565b600061157b6012600a0a61156d8561155f6000611aa4565b613cdc90919063ffffffff16565b61373490919063ffffffff16565b905060006115e0856115d2846115c46115b36006546115a5600a5442613eb490919063ffffffff16565b613cdc90919063ffffffff16565b600954613e2c90919063ffffffff16565b613e2c90919063ffffffff16565b613eb490919063ffffffff16565b9050600061162282611614856116068c6115f861242e565b613e2c90919063ffffffff16565b613cdc90919063ffffffff16565b61373490919063ffffffff16565b9050600061164f87611641866012600a0a613cdc90919063ffffffff16565b61373490919063ffffffff16565b905081819a509a505050505050505050505b9250929050565b601081565b6000600280549050905090565b60085481565b60007f00000000000000000000000045a55ec68a1488ccf8fddbab3f09af1db917382f73ffffffffffffffffffffffffffffffffffffffff1663b69ef8a86040518163ffffffff1660e01b815260040160206040518083038186803b1580156116e857600080fd5b505afa1580156116fc573d6000803e3d6000fd5b505050506040513d602081101561171257600080fd5b8101908080519060200190929190505050905090565b600090565b60065481565b61173b613efe565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146117fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60008060075414156118ce57600090506118fe565b6118fb6007546118ed6012600a0a600854613cdc90919063ffffffff16565b61373490919063ffffffff16565b90505b90565b60007f0000000000000000000000007eb59fcb33ead008b0b81d1badc0e0d63b0393dc73ffffffffffffffffffffffffffffffffffffffff1663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b15801561196957600080fd5b505afa15801561197d573d6000803e3d6000fd5b505050506040513d602081101561199357600080fd5b8101908080519060200190929190505050905090565b7f0000000000000000000000000000000000000000000000003782dace9d90000081565b60007f0000000000000000000000007eb59fcb33ead008b0b81d1badc0e0d63b0393dc73ffffffffffffffffffffffffffffffffffffffff1663b69ef8a86040518163ffffffff1660e01b815260040160206040518083038186803b158015611a3557600080fd5b505afa158015611a49573d6000803e3d6000fd5b505050506040513d6020811015611a5f57600080fd5b8101908080519060200190929190505050905090565b60055481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600080821415611aba576012600a0a9050611be4565b6012600a0a821015611b17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526029815260200180614d796029913960400191505060405180910390fd5b60006002601203600a0a60050290506000611b4282611b346118b9565b613e2c90919063ffffffff16565b90506000611b598386613e2c90919063ffffffff16565b9050611bde611bcb68010000000000000000611bbd6012600a0a611bac611ba488611b96680100000000000000008a613cdc90919063ffffffff16565b61373490919063ffffffff16565b600f0b613f06565b600f0b613cdc90919063ffffffff16565b61373490919063ffffffff16565b6012600a0a613e2c90919063ffffffff16565b93505050505b919050565b611bf38282613180565b505050565b60007f0000000000000000000000000000000000000000000000000000000000278d008210611c5f57611c587f0000000000000000000000000000000000000000000000003782dace9d9000006012600a0a613e2c90919063ffffffff16565b9050611d47565b6000611d2a611cfb7f0000000000000000000000000000000000000000000000000000000000278d00611ced86611cdf7f000000000000000000000000000000000000000000000000016345785d8a00007f0000000000000000000000000000000000000000000000003782dace9d900000613eb490919063ffffffff16565b613cdc90919063ffffffff16565b61373490919063ffffffff16565b7f000000000000000000000000000000000000000000000000016345785d8a0000613e2c90919063ffffffff16565b9050611d43816012600a0a613e2c90919063ffffffff16565b9150505b919050565b60026001541415611dc5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b6002600181905550611dd633613f40565b60018081905550565b60095481565b611ded611a7b565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611e735750600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611ec8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180614ecd6023913960400191505060405180910390fd5b600034905060008111611f26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180614deb6021913960400191505060405180910390fd5b42821015611f9c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f53757065724e6f76613a2066756e64696e67207374617274206973207061737481525060200191505060405180910390fd5b601060028054905010611ffa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180614d08602f913960400191505060405180910390fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b15801561206457600080fd5b505af1158015612078573d6000803e3d6000fd5b505050505061208633613f40565b6000612090611680565b905060008082116120b6576120b1620f424084613cdc90919063ffffffff16565b6120de565b6120dd826120cf85600554613cdc90919063ffffffff16565b61373490919063ffffffff16565b5b90506120f581600554613e2c90919063ffffffff16565b600581905550600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141561221c5761218a8360026001600280549050038154811061216a57fe5b906000526020600020906007020160000154613e2c90919063ffffffff16565b60026001600280549050038154811061219f57fe5b9060005260206000209060070201600001819055506121ed816002600160028054905003815481106121cd57fe5b906000526020600020906007020160010154613e2c90919063ffffffff16565b60026001600280549050038154811061220257fe5b9060005260206000209060070201600101819055506122d6565b60026040518060e001604052808581526020018381526020016000815260200186815260200186815260200161225b8888613e2c90919063ffffffff16565b8152602001878152509080600181540180825580915050600190039060005260206000209060070201600090919091909150600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015550505b6123c3307f00000000000000000000000045a55ec68a1488ccf8fddbab3f09af1db917382f857f00000000000000000000000045a55ec68a1488ccf8fddbab3f09af1db917382f73ffffffffffffffffffffffffffffffffffffffff1663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b15801561236257600080fd5b505afa158015612376573d6000803e3d6000fd5b505050506040513d602081101561238c57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff16614039909392919063ffffffff16565b7fd3599d59babb3b3382347fcd4e88030d12d499404076688f2fc4efab2d3c4a578386866123ef611680565b6040518085815260200184815260200183815260200182815260200194505050505060405180910390a15050505050565b61242b333383613820565b50565b60007f0000000000000000000000007d464611b23817165f3debbc907569940fa473d273ffffffffffffffffffffffffffffffffffffffff1663b69ef8a86040518163ffffffff1660e01b815260040160206040518083038186803b15801561249657600080fd5b505afa1580156124aa573d6000803e3d6000fd5b505050506040513d60208110156124c057600080fd5b8101908080519060200190929190505050905090565b600460205281600052604060002081815481106124ef57fe5b9060005260206000209060020201600091509150508060000154908060010154905082565b60008060008060055414612591576000805b60028054905081101561255e5761254f6125408242613d62565b83613e2c90919063ffffffff16565b91508080600101915050612526565b5061258d60055461257f612570611680565b84613cdc90919063ffffffff16565b61373490919063ffffffff16565b9150505b60008514156125a75760008092509250506129dc565b6125b08661115c565b851115612608576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526029815260200180614e2e6029913960400191505060405180910390fd5b60006126386126156119cd565b61262a88600654613cdc90919063ffffffff16565b61373490919063ffffffff16565b905060008111612693576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180614e806023913960400191505060405180910390fd5b60008060006126ee6001600460008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050613eb490919063ffffffff16565b90505b60008411156128c3576000600460008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020828154811061274657fe5b90600052602060002090600202019050600061276f826001015442613eb490919063ffffffff16565b90508582600001541015612821576127a6612797828460000154613cdc90919063ffffffff16565b86613e2c90919063ffffffff16565b94506128016127f26012600a0a6127e46127bf85611bf8565b6127d6868860000154613cdc90919063ffffffff16565b613cdc90919063ffffffff16565b61373490919063ffffffff16565b85613e2c90919063ffffffff16565b935061281a826000015487613eb490919063ffffffff16565b95506128a6565b6128466128378288613cdc90919063ffffffff16565b86613e2c90919063ffffffff16565b945061289d61288e6012600a0a61288061285f85611bf8565b612872868c613cdc90919063ffffffff16565b613cdc90919063ffffffff16565b61373490919063ffffffff16565b85613e2c90919063ffffffff16565b935050506128c3565b6128ba600184613eb490919063ffffffff16565b925050506126f1565b60006128f66012600a0a6128e8856128da8d611aa4565b613cdc90919063ffffffff16565b61373490919063ffffffff16565b9050600061295b8561294d8461293f61292e600654612920600a5442613eb490919063ffffffff16565b613cdc90919063ffffffff16565b600954613e2c90919063ffffffff16565b613e2c90919063ffffffff16565b613eb490919063ffffffff16565b9050600061299d8261298f856129818c61297361242e565b613e2c90919063ffffffff16565b613cdc90919063ffffffff16565b61373490919063ffffffff16565b905060006129ca876129bc866012600a0a613cdc90919063ffffffff16565b61373490919063ffffffff16565b905081819a509a505050505050505050505b935093915050565b6129ee8142611de5565b50565b600a5481565b60028181548110612a0457fe5b90600052602060002090600702016000915090508060000154908060010154908060020154908060030154908060040154908060050154908060060154905087565b600080600280549050905060005b818160ff161015612acb57600060028260ff1681548110612a7157fe5b906000526020600020906007020190508060050154851015612abd57612aba612aab8260060154836001015461373490919063ffffffff16565b85613e2c90919063ffffffff16565b93505b508080600101915050612a54565b5050919050565b620f424081565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b612b07613efe565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612bc7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b612c13613efe565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612cd3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612d59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180614c976026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60007f0000000000000000000000007d464611b23817165f3debbc907569940fa473d273ffffffffffffffffffffffffffffffffffffffff1663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b158015612e7e57600080fd5b505afa158015612e92573d6000803e3d6000fd5b505050506040513d6020811015612ea857600080fd5b8101908080519060200190929190505050905090565b612ec6613efe565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612f86576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b612f8f33613f40565b600080600280549050905060005b8181101561317b5760006002612fbc8584613eb490919063ffffffff16565b81548110612fc657fe5b906000526020600020906007020190506000612feb8584613eb490919063ffffffff16565b90506000612ff98242613d62565b14801561300a575081600501544210155b1561316c577f3bdea4ef9f7e20da64d7c2f1e5fca1178145d56d25bad0e0a23d7a209261fe7b82600001548360060154846004015460405180848152602001838152602001828152602001935050505060405180910390a1600261307d6001600280549050613eb490919063ffffffff16565b8154811061308757fe5b9060005260206000209060070201600282815481106130a257fe5b906000526020600020906007020160008201548160000155600182015481600101556002820154816002015560038201548160030155600482015481600401556005820154816005015560068201548160060155905050600280548061310457fe5b600190038181906000526020600020906007020160008082016000905560018201600090556002820160009055600382016000905560048201600090556005820160009055600682016000905550509055613169600186613e2c90919063ffffffff16565b94505b50508080600101915050612f9d565b505050565b6000600260015414156131fb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b60026001819055506000831161325c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180614d376021913960400191505060405180910390fd5b826132663361115c565b10156132bd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526029815260200180614e576029913960400191505060405180910390fd5b6132c633613f40565b60006132d1846140fa565b905060006133066012600a0a6132f8846132ea88611aa4565b613cdc90919063ffffffff16565b61373490919063ffffffff16565b9050600061334a61332283600954613e2c90919063ffffffff16565b61333c8461332e61242e565b613cdc90919063ffffffff16565b61373490919063ffffffff16565b905060008511156133715761336a81600854613e2c90919063ffffffff16565b6008819055505b61338681600754613e2c90919063ffffffff16565b6007819055507f0000000000000000000000007eb59fcb33ead008b0b81d1badc0e0d63b0393dc73ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33886040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b15801561341d57600080fd5b505af1158015613431573d6000803e3d6000fd5b505050503373ffffffffffffffffffffffffffffffffffffffff167faf01bfc8475df280aca00b578c4a948e6d95700f0db8c13365240f7f973c8754876134773361115c565b6040518083815260200182815260200180602001828103825260008152602001602001935050505060405180910390a2600081111561367c577f0000000000000000000000007d464611b23817165f3debbc907569940fa473d273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb30836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b15801561354157600080fd5b505af1158015613555573d6000803e3d6000fd5b50505050600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156135ce57600080fd5b505af11580156135e2573d6000803e3d6000fd5b505050503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015801561362c573d6000803e3d6000fd5b503373ffffffffffffffffffffffffffffffffffffffff167fdf29796aad820e4bb192f3a8d631b76519bcd2cbe77cc85af20e9df53cece086826040518082815260200191505060405180910390a25b6000851115613721576136d23330877f000000000000000000000000ab4dc161cc0017befb711bf42a1b81441db624e973ffffffffffffffffffffffffffffffffffffffff16614039909392919063ffffffff16565b3373ffffffffffffffffffffffffffffffffffffffff167fffcfab34d8545cc586453a18a775d2fc7562aecf5df6fb947e9d7a478045c5fa866040518082815260200191505060405180910390a25b8093505050506001808190555092915050565b600061377683836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250614471565b905092915050565b61381b8363a9059cbb60e01b8484604051602401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050614537565b505050565b60026001541415613899576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b600260018190555060008111613917576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f53757065724e6f76613a207374616b6520616d6f756e74206973207a65726f0081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561399d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180614dc56026913960400191505060405180910390fd5b600080600654116139c3576139be620f424083613cdc90919063ffffffff16565b6139f2565b6139f16139ce6119cd565b6139e384600654613cdc90919063ffffffff16565b61373490919063ffffffff16565b5b905060008111613a4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180614cbd6021913960400191505060405180910390fd5b613a5683613f40565b6000600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050613ab0828260000154613e2c90919063ffffffff16565b8160000181905550428160020181905550600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020604051806040016040528084815260200142815250908060018154018082558091505060019003906000526020600020906002020160009091909190915060008201518160000155602082015181600101555050613b6982600654613e2c90919063ffffffff16565b600681905550613c5c857f0000000000000000000000007eb59fcb33ead008b0b81d1badc0e0d63b0393dc857f0000000000000000000000007eb59fcb33ead008b0b81d1badc0e0d63b0393dc73ffffffffffffffffffffffffffffffffffffffff1663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b158015613bfb57600080fd5b505afa158015613c0f573d6000803e3d6000fd5b505050506040513d6020811015613c2557600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff16614039909392919063ffffffff16565b8373ffffffffffffffffffffffffffffffffffffffff167fc65e53b88159e7d2c0fc12a0600072e28ae53ff73b4c1715369c30f16093514284613c9e8761115c565b6040518083815260200182815260200180602001828103825260008152602001602001935050505060405180910390a2505060018081905550505050565b600080831415613cef5760009050613d5c565b6000828402905082848281613d0057fe5b0414613d57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180614d586021913960400191505060405180910390fd5b809150505b92915050565b60008060028481548110613d7257fe5b906000526020600020906007020190508060040154831015613d98576000915050613e26565b8060010154816002015410613db1576000915050613e26565b80600501548310613ddf57613dd781600201548260010154613eb490919063ffffffff16565b915050613e26565b613e228160060154613e148360010154613e06856003015488613eb490919063ffffffff16565b613cdc90919063ffffffff16565b61373490919063ffffffff16565b9150505b92915050565b600080828401905083811015613eaa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b6000613ef683836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250614626565b905092915050565b600033905090565b60008082600f0b13613f1757600080fd5b60806f4d104d427de7fce20a6e420e02236748613f33846146e6565b600f0b02901c9050919050565b613f48614815565b6000613f73600654613f65600a5442613eb490919063ffffffff16565b613cdc90919063ffffffff16565b9050613f8a81600954613e2c90919063ffffffff16565b60098190555042600a819055506000600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060006140098260000154613ffb846002015442613eb490919063ffffffff16565b613cdc90919063ffffffff16565b9050614022818360010154613e2c90919063ffffffff16565b826001018190555042826002018190555050505050565b6140f4846323b872dd60e01b858585604051602401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050614537565b50505050565b60008061412b6141086119cd565b61411d85600654613cdc90919063ffffffff16565b61373490919063ffffffff16565b905060008111614186576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180614da26023913960400191505060405180910390fd5b600080829050600080600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090505b60008311156143a3576000816001838054905003815481106141ef57fe5b906000526020600020906002020190506000614218826001015442613eb490919063ffffffff16565b9050600061422582611bf8565b905085836000015411614301576142836142746012600a0a61426684614258878960000154613cdc90919063ffffffff16565b613cdc90919063ffffffff16565b61373490919063ffffffff16565b86613e2c90919063ffffffff16565b94506142ae61429f838560000154613cdc90919063ffffffff16565b88613e2c90919063ffffffff16565b96506142c7836000015487613eb490919063ffffffff16565b9550838054806142d357fe5b600190038181906000526020600020906002020160008082016000905560018201600090555050905561439b565b61434e61433f6012600a0a61433184614323878c613cdc90919063ffffffff16565b613cdc90919063ffffffff16565b61373490919063ffffffff16565b86613e2c90919063ffffffff16565b94506143756143668388613cdc90919063ffffffff16565b88613e2c90919063ffffffff16565b965061438e868460000154613eb490919063ffffffff16565b8360000181905550600095505b5050506141d1565b6000600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506143fd858260010154613eb490919063ffffffff16565b816001018190555061441c868260000154613eb490919063ffffffff16565b816000018190555042816002018190555061444285600954613eb490919063ffffffff16565b60098190555061445d86600654613eb490919063ffffffff16565b600681905550829650505050505050919050565b6000808311829061451d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156144e25780820151818401526020810190506144c7565b50505050905090810190601f16801561450f5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50600083858161452957fe5b049050809150509392505050565b6060614599826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16614a2d9092919063ffffffff16565b9050600081511115614621578080602001905160208110156145ba57600080fd5b8101908080519060200190929190505050614620576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180614ea3602a913960400191505060405180910390fd5b5b505050565b60008383111582906146d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561469857808201518184015260208101905061467d565b50505050905090810190601f1680156146c55780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b60008082600f0b136146f757600080fd5b60008083600f0b905068010000000000000000811261471e57604081901d90506040820191505b640100000000811261473857602081901d90506020820191505b62010000811261475057601081901d90506010820191505b610100811261476757600881901d90506008820191505b6010811261477d57600481901d90506004820191505b6004811261479357600281901d90506002820191505b600281126147a2576001820191505b60006040808403901b9050600083607f0386600f0b60008212156147c257fe5b901b9050600067800000000000000090505b6000811315614808578182029150600060ff83901c905080607f0183901c92508082028401935050600181901d90506147d4565b5081945050505050919050565b600080614820611680565b90506000600554141561483557809150614910565b6000805b6002805490508110156148c95760006148528242613d62565b905060006002838154811061486357fe5b9060005260206000209060070201905060008211156148ba57614893828260020154613e2c90919063ffffffff16565b81600201819055504281600301819055506148b78285613e2c90919063ffffffff16565b93505b50508080600101915050614839565b506148f16005546148e38484613cdc90919063ffffffff16565b61373490919063ffffffff16565b925061490881600554613eb490919063ffffffff16565b600581905550505b6000821115614a29577f00000000000000000000000045a55ec68a1488ccf8fddbab3f09af1db917382f73ffffffffffffffffffffffffffffffffffffffff1663a9059cbb7f0000000000000000000000007d464611b23817165f3debbc907569940fa473d2846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b1580156149ca57600080fd5b505af11580156149de573d6000803e3d6000fd5b505050507f05b6b33aa8c89542004be445284c4d44c5f3654d65638da167510824426020dd82614a0c61242e565b604051808381526020018281526020019250505060405180910390a15b5050565b6060614a3c8484600085614a45565b90509392505050565b6060614a5085614c4b565b614ac2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000081525060200191505060405180910390fd5b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b60208310614b125780518252602082019150602081019050602083039250614aef565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114614b74576040519150601f19603f3d011682016040523d82523d6000602084013e614b79565b606091505b50915091508115614b8e578092505050614c43565b600081511115614ba15780518082602001fd5b836040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015614c08578082015181840152602081019050614bed565b50505050905090810190601f168015614c355780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b949350505050565b60008060007fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050833f9150808214158015614c8d57506000801b8214155b9250505091905056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737353757065724e6f76613a207374616b6520616d6f756e7420746f6f20736d616c6c53757065724e6f76613a20776974686472617720616d6f756e7420657863656564732062616c616e636553757065724e6f76613a2065786365656473206d6178206163746976652066756e64696e67207363686564756c657353757065724e6f76613a20756e7374616b6520616d6f756e74206973207a65726f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7753555045524e4f56413a20434c495120616d6f756e74206973206265747765656e203020616e64203153757065726e6f76613a20756e7374616b6520616d6f756e7420746f6f20736d616c6c53757065726e6f76613a2062656e6566696369617279206973207a65726f206164647265737353757065724e6f76613a2066756e64696e6720616d6f756e74206973207a65726f53757065724e6f76613a20776974686472617720616d6f756e74206973207a65726f53757065724e6f76613a207072657669657720616d6f756e7420657863656564732062616c616e636553757065726e6f76613a20756e7374616b6520616d6f756e7420657863656564732062616c616e636553757065724e6f76613a207072657669657720616d6f756e7420746f6f20736d616c6c5361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565644f776e61626c653a2063616c6c6572206973206e6f7420746865206f70657261746f72a26469706673582212200d8323a2f1aed0e4b2b803fb9ebbf560343b659e84a30d1537c05b0940f2c59064736f6c634300060c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000ab4dc161cc0017befb711bf42a1b81441db624e9000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000000000000000000000000000016345785d8a00000000000000000000000000000000000000000000000000003782dace9d9000000000000000000000000000000000000000000000000000000000000000278d00000000000000000000000000ab4dc161cc0017befb711bf42a1b81441db624e9
-----Decoded View---------------
Arg [0] : stakingToken_ (address): 0xab4Dc161cc0017bEfb711Bf42a1B81441Db624E9
Arg [1] : rewardToken_ (address): 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2
Arg [2] : bonusMin_ (uint256): 100000000000000000
Arg [3] : bonusMax_ (uint256): 4000000000000000000
Arg [4] : bonusPeriod_ (uint256): 2592000
Arg [5] : cliq_ (address): 0xab4Dc161cc0017bEfb711Bf42a1B81441Db624E9
-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 000000000000000000000000ab4dc161cc0017befb711bf42a1b81441db624e9
Arg [1] : 000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
Arg [2] : 000000000000000000000000000000000000000000000000016345785d8a0000
Arg [3] : 0000000000000000000000000000000000000000000000003782dace9d900000
Arg [4] : 0000000000000000000000000000000000000000000000000000000000278d00
Arg [5] : 000000000000000000000000ab4dc161cc0017befb711bf42a1b81441db624e9
Deployed Bytecode Sourcemap
14659:28439:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16127:27;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;15895:33;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;15353:43;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;18399:89;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;21544:607;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;18202:142;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;35592:113;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;15766:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15975:36;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;18543:297;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;39512:3012;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;15466:48;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;35382:95;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;16161:31;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;35020:100;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;12353:96;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;16087:33;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;1690:148;;;;;;;;;;;;;:::i;:::-;;34695:199;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;19083:118;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;15935:33;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;18895:110;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;16048:32;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;1476:79;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;33940:656;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;22208:131;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;33324:420;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;22396:87;;;;;;;;;;;;;:::i;:::-;;16199:39;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;19596:1891;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;18041:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;35201:104;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;15815:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;36055:3177;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;19433:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;16245:26;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;15704:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42532:429;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;15403:56;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;16280:30;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;42969:126;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;1846:244;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;19258:118;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;22540:982;;;;;;;;;;;;;:::i;:::-;;16127:27;;;;:::o;15895:33::-;;;:::o;15353:43::-;15394:2;15353:43;:::o;18399:89::-;18461:19;18470:6;18478:1;18461:8;:19::i;:::-;;18399:89;:::o;21544:607::-;21624:1;21615:6;:10;21607:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21707:5;:15;;;21731:4;21707:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21697:6;:40;;21675:132;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21905:19;21927:13;21938:1;21927:6;:10;;:13;;;;:::i;:::-;21905:35;;21953:5;:10;;;21964:11;21953:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21987:53;22006:9;;;;;;;;;;;22036:3;22031:2;22017:11;:16;:22;;;;;;21987:5;:18;;;;:53;;;;;:::i;:::-;22051;22070:9;;;;;;;;;;;22100:3;22095:2;22081:11;:16;:22;;;;;;22051:5;:18;;;;:53;;;;;:::i;:::-;22122:21;22136:6;22122:21;;;;;;;;;;;;;;;;;;21544:607;;:::o;18202:142::-;18304:32;18311:10;18323:4;18329:6;18304;:32::i;:::-;18202:142;;:::o;35592:113::-;35647:7;35674:10;:16;35685:4;35674:16;;;;;;;;;;;;;;;:23;;;;35667:30;;35592:113;;;:::o;15766:42::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;15975:36::-;;;:::o;18543:297::-;18647:7;18698:1;18676:18;;:23;18672:64;;;18723:1;18716:8;;;;18672:64;18766:66;18813:18;;18766:42;18784:10;:16;18795:4;18784:16;;;;;;;;;;;;;;;:23;;;18766:13;:11;:13::i;:::-;:17;;:42;;;;:::i;:::-;:46;;:66;;;;:::i;:::-;18746:86;;18543:297;;;;:::o;39512:3012::-;39658:7;39680;39769:21;39830:1;39809:17;;:22;39805:357;;39848:22;39894:9;39889:143;39913:8;:15;;;;39909:1;:19;39889:143;;;39971:45;39990:25;40002:1;40005:9;39990:11;:25::i;:::-;39971:14;:18;;:45;;;;:::i;:::-;39954:62;;39930:3;;;;;;;39889:143;;;;40062:88;40118:17;;40062:33;40081:13;:11;:13::i;:::-;40062:14;:18;;:33;;;;:::i;:::-;:37;;:88;;;;:::i;:::-;40046:104;;39805:357;;40256:1;40232:20;40247:4;40232:14;:20::i;:::-;:25;40228:71;;;40282:1;40285;40274:13;;;;;;;40228:71;40356:14;40373:63;40422:13;:11;:13::i;:::-;40373:44;40396:20;40411:4;40396:14;:20::i;:::-;40373:18;;:22;;:44;;;;:::i;:::-;:48;;:63;;;;:::i;:::-;40356:80;;40464:1;40455:6;:10;40447:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40518:23;40556:29;40676:9;40688:30;40716:1;40688:10;:16;40699:4;40688:16;;;;;;;;;;;;;;;:23;;;;:27;;:30;;;;:::i;:::-;40676:42;;40729:950;40745:1;40736:6;:10;40729:950;;;40763:15;40781:10;:16;40792:4;40781:16;;;;;;;;;;;;;;;40798:1;40781:19;;;;;;;;;;;;;;;;;;40763:37;;40815:12;40830:26;40844:1;:11;;;40830:9;:13;;:26;;;;:::i;:::-;40815:41;;40888:6;40877:1;:8;;;:17;40873:723;;;40933:39;40953:18;40966:4;40953:1;:8;;;:12;;:18;;;;:::i;:::-;40933:15;:19;;:39;;;;:::i;:::-;40915:57;;41015:178;41063:111;15394:2;41133;:18;41063:39;41086:15;41096:4;41086:9;:15::i;:::-;41063:18;41076:4;41063:1;:8;;;:12;;:18;;;;:::i;:::-;:22;;:39;;;;:::i;:::-;:43;;:111;;;;:::i;:::-;41015:21;:25;;:178;;;;:::i;:::-;40991:202;;41221:20;41232:1;:8;;;41221:6;:10;;:20;;;;:::i;:::-;41212:29;;40873:723;;;41300:37;41320:16;41331:4;41320:6;:10;;:16;;;;:::i;:::-;41300:15;:19;;:37;;;;:::i;:::-;41282:55;;41380:176;41428:109;15394:2;41496;:18;41428:37;41449:15;41459:4;41449:9;:15::i;:::-;41428:16;41439:4;41428:6;:10;;:16;;;;:::i;:::-;:20;;:37;;;;:::i;:::-;:41;;:109;;;;:::i;:::-;41380:21;:25;;:176;;;;:::i;:::-;41356:200;;41575:5;;;;40873:723;41659:8;41665:1;41659;:5;;:8;;;;:::i;:::-;41655:12;;40729:950;;;;;41720:29;41752:91;15394:2;41824;:18;41752:53;41783:21;41752:12;41762:1;41752:9;:12::i;:::-;:30;;:53;;;;:::i;:::-;:71;;:91;;;;:::i;:::-;41720:123;;41910:33;41946:178;42108:15;41946:143;42067:21;41946:102;41989:58;42028:18;;41990:32;42010:11;;41990:15;:19;;:32;;;;:::i;:::-;41989:38;;:58;;;;:::i;:::-;41946:24;;:42;;:102;;;;:::i;:::-;:120;;:143;;;;:::i;:::-;:161;;:178;;;;:::i;:::-;41910:214;;42137:14;42154:122;42250:25;42154:77;42209:21;42155:34;42175:13;42155:15;:13;:15::i;:::-;:19;;:34;;;;:::i;:::-;42154:54;;:77;;;;:::i;:::-;:95;;:122;;;;:::i;:::-;42137:139;;42325:13;42341:103;42428:15;42341:68;42387:21;15394:2;42349;:18;42341:45;;:68;;;;:::i;:::-;:86;;:103;;;;:::i;:::-;42325:119;;42479:6;42500:5;42457:59;;;;;;;;;;;;;39512:3012;;;;;;:::o;15466:48::-;15512:2;15466:48;:::o;35382:95::-;35427:7;35454:8;:15;;;;35447:22;;35382:95;:::o;16161:31::-;;;;:::o;35020:100::-;35064:7;35091:11;:19;;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35084:28;;35020:100;:::o;12353:96::-;12412:4;12353:96;:::o;16087:33::-;;;;:::o;1690:148::-;1613:12;:10;:12::i;:::-;1603:22;;:6;;;;;;;;;;:22;;;1595:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1797:1:::1;1760:40;;1781:6;::::0;::::1;;;;;;;;1760:40;;;;;;;;;;;;1828:1;1811:6:::0;::::1;:19;;;;;;;;;;;;;;;;;;1690:148::o:0;34695:199::-;34733:7;34773:1;34757:12;;:17;34753:58;;;34798:1;34791:8;;;;34753:58;34828;34873:12;;34828:40;15394:2;34849;:18;34828:16;;:20;;:40;;;;:::i;:::-;:44;;:58;;;;:::i;:::-;34821:65;;34695:199;;:::o;19083:118::-;19137:7;19172:12;:18;;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19157:36;;19083:118;:::o;15935:33::-;;;:::o;18895:110::-;18948:7;18975:12;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18968:29;;18895:110;:::o;16048:32::-;;;;:::o;1476:79::-;1514:7;1541:6;;;;;;;;;;;1534:13;;1476:79;:::o;33940:656::-;33994:7;34026:1;34018:4;:9;34014:67;;;15394:2;34051;:18;34044:25;;;;34014:67;15394:2;34122;:18;34114:4;:26;;34092:117;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34220:14;34271:1;15394:2;34254:18;34249:2;:24;34245:1;:28;34220:54;;34293:9;34305:19;34317:6;34305:7;:5;:7::i;:::-;:11;;:19;;;;:::i;:::-;34293:31;;34335:9;34347:16;34356:6;34347:4;:8;;:16;;;;:::i;:::-;34335:28;;34396:192;34446:127;34567:5;34446:94;15394:2;34521;:18;34454:39;34461:19;34478:1;34461:12;34467:5;34461:1;:5;;:12;;;;:::i;:::-;:16;;:19;;;;:::i;:::-;34454:37;;;:39::i;:::-;34446:48;;:74;;:94;;;;:::i;:::-;:120;;:127;;;;:::i;:::-;15394:2;34404;:18;34396:31;;:192;;;;:::i;:::-;34376:212;;;;;33940:656;;;;:::o;22208:131::-;22309:22;22318:6;22326:4;22309:8;:22::i;:::-;;22208:131;;:::o;33324:420::-;33378:7;33410:11;33402:4;:19;33398:100;;33445:41;33477:8;15394:2;33453;:18;33445:31;;:41;;;;:::i;:::-;33438:48;;;;33398:100;33575:13;33591:89;33618:51;33657:11;33618:34;33647:4;33619:22;33632:8;33619;:12;;:22;;;;:::i;:::-;33618:28;;:34;;;;:::i;:::-;:38;;:51;;;;:::i;:::-;33591:8;:12;;:89;;;;:::i;:::-;33575:105;;33698:38;33730:5;15394:2;33706;:18;33698:31;;:38;;;;:::i;:::-;33691:45;;;33324:420;;;;:::o;22396:87::-;179:1;409:7;;:19;;401:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;179:1;542:7;:18;;;;22456:19:::1;22464:10;22456:7;:19::i;:::-;135:1:::0;721:7;:22;;;;22396:87::o;16199:39::-;;;;:::o;19596:1891::-;16673:7;:5;:7::i;:::-;16659:21;;:10;:21;;;:54;;;;16698:15;;;;;;;;;;;16684:29;;:10;:29;;;16659:54;16651:102;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19716:14:::1;19733:9;19716:26;;19791:1;19782:6;:10;19774:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19858:15;19849:5;:24;;19841:69;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;15512:2;19943:8;:15;;;;:37;19921:134;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20066:5;;;;;;;;;;;:13;;;20087:6;20066:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;20140:19;20148:10;20140:7;:19::i;:::-;20212:20;20235:13;:11;:13::i;:::-;20212:36;;20259:26;20304:1:::0;20289:12:::1;:16;20288:133;;20385:36;15454:5;20385:6;:10;;:36;;;;:::i;:::-;20288:133;;;20322:47;20356:12;20322:29;20344:6;20322:17;;:21;;:29;;;;:::i;:::-;:33;;:47;;;;:::i;:::-;20288:133;20259:162;;20454:41;20476:18;20454:17;;:21;;:41;;;;:::i;:::-;20434:17;:61;;;;20525:15;;;;;;;;;;;20511:29;;:10;:29;;;20508:724;;;20631:48;20672:6;20631:8;20658:1;20640:8;:15;;;;:19;20631:29;;;;;;;;;;;;;;;;;;:36;;;:40;;:48;;;;:::i;:::-;20592:8;20619:1;20601:8;:15;;;;:19;20592:29;;;;;;;;;;;;;;;;;;:36;;:87;;;;20733:60;20774:18;20733:8;20760:1;20742:8;:15;;;;:19;20733:29;;;;;;;;;;;;;;;;;;:36;;;:40;;:60;;;;:::i;:::-;20694:8;20721:1;20703:8;:15;;;;:19;20694:29;;;;;;;;;;;;;;;;;;:36;;:99;;;;20508:724;;;20861:8;20893:312;;;;;;;;20932:6;20893:312;;;;20969:18;20893:312;;;;21020:1;20893:312;;;;21057:5;20893:312;;;;21092:5;20893:312;;;;21125:19;21135:8;21125:5;:9;;:19;;;;:::i;:::-;20893:312;;;;21177:8;20893:312;;::::0;20861:359:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20508:724;21279:131;21338:4;21366:11;21393:6;21279:11;:17;;;:19;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;:36;;;;:131;;;;;;:::i;:::-;21426:53;21440:6;21448:8;21458:5;21465:13;:11;:13::i;:::-;21426:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16764:1;;;19596:1891:::0;;:::o;18041:106::-;18101:38;18108:10;18120;18132:6;18101;:38::i;:::-;18041:106;:::o;35201:104::-;35247:7;35274:13;:21;;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35267:30;;35201:104;:::o;15815:45::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;36055:3177::-;36212:7;36234;36323:21;36384:1;36363:17;;:22;36359:363;;36402:22;36448:9;36443:149;36467:8;:15;;;;36463:1;:19;36443:149;;;36525:51;36544:31;36556:1;36559:15;36544:11;:31::i;:::-;36525:14;:18;;:51;;;;:::i;:::-;36508:68;;36484:3;;;;;;;36443:149;;;;36622:88;36678:17;;36622:33;36641:13;:11;:13::i;:::-;36622:14;:18;;:33;;;;:::i;:::-;:37;;:88;;;;:::i;:::-;36606:104;;36359:363;;36802:1;36792:6;:11;36788:57;;;36828:1;36831;36820:13;;;;;;;36788:57;36922:20;36937:4;36922:14;:20::i;:::-;36912:6;:30;;36890:121;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37069:14;37086:49;37121:13;:11;:13::i;:::-;37086:30;37109:6;37086:18;;:22;;:30;;;;:::i;:::-;:34;;:49;;;;:::i;:::-;37069:66;;37163:1;37154:6;:10;37146:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37217:23;37255:29;37375:9;37387:30;37415:1;37387:10;:16;37398:4;37387:16;;;;;;;;;;;;;;;:23;;;;:27;;:30;;;;:::i;:::-;37375:42;;37428:956;37444:1;37435:6;:10;37428:956;;;37462:15;37480:10;:16;37491:4;37480:16;;;;;;;;;;;;;;;37497:1;37480:19;;;;;;;;;;;;;;;;;;37462:37;;37514:12;37529:32;37549:1;:11;;;37529:15;:19;;:32;;;;:::i;:::-;37514:47;;37593:6;37582:1;:8;;;:17;37578:723;;;37638:39;37658:18;37671:4;37658:1;:8;;;:12;;:18;;;;:::i;:::-;37638:15;:19;;:39;;;;:::i;:::-;37620:57;;37720:178;37768:111;15394:2;37838;:18;37768:39;37791:15;37801:4;37791:9;:15::i;:::-;37768:18;37781:4;37768:1;:8;;;:12;;:18;;;;:::i;:::-;:22;;:39;;;;:::i;:::-;:43;;:111;;;;:::i;:::-;37720:21;:25;;:178;;;;:::i;:::-;37696:202;;37926:20;37937:1;:8;;;37926:6;:10;;:20;;;;:::i;:::-;37917:29;;37578:723;;;38005:37;38025:16;38036:4;38025:6;:10;;:16;;;;:::i;:::-;38005:15;:19;;:37;;;;:::i;:::-;37987:55;;38085:176;38133:109;15394:2;38201;:18;38133:37;38154:15;38164:4;38154:9;:15::i;:::-;38133:16;38144:4;38133:6;:10;;:16;;;;:::i;:::-;:20;;:37;;;;:::i;:::-;:41;;:109;;;;:::i;:::-;38085:21;:25;;:176;;;;:::i;:::-;38061:200;;38280:5;;;;37578:723;38364:8;38370:1;38364;:5;;:8;;;;:::i;:::-;38360:12;;37428:956;;;;;38425:29;38457:94;15394:2;38532;:18;38457:56;38491:21;38457:15;38467:4;38457:9;:15::i;:::-;:33;;:56;;;;:::i;:::-;:74;;:94;;;;:::i;:::-;38425:126;;38618:33;38654:178;38816:15;38654:143;38775:21;38654:102;38697:58;38736:18;;38698:32;38718:11;;38698:15;:19;;:32;;;;:::i;:::-;38697:38;;:58;;;;:::i;:::-;38654:24;;:42;;:102;;;;:::i;:::-;:120;;:143;;;;:::i;:::-;:161;;:178;;;;:::i;:::-;38618:214;;38845:14;38862:122;38958:25;38862:77;38917:21;38863:34;38883:13;38863:15;:13;:15::i;:::-;:19;;:34;;;;:::i;:::-;38862:54;;:77;;;;:::i;:::-;:95;;:122;;;;:::i;:::-;38845:139;;39033:13;39049:103;39136:15;39049:68;39095:21;15394:2;39057;:18;39049:45;;:68;;;;:::i;:::-;:86;;:103;;;;:::i;:::-;39033:119;;39187:6;39208:5;39165:59;;;;;;;;;;;;;36055:3177;;;;;;;:::o;19433:106::-;19500:31;19505:8;19515:15;19500:4;:31::i;:::-;19433:106;:::o;16245:26::-;;;;:::o;15704:25::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;42532:429::-;42599:20;42659:18;42680:8;:15;;;;42659:36;;42711:7;42706:248;42724:10;42722:1;:12;;;42706:248;;;42756:23;42782:8;42791:1;42782:11;;;;;;;;;;;;;;;;;;;;42756:37;;42824:7;:11;;;42812:9;:23;42808:135;;;42871:56;42888:38;42909:7;:16;;;42889:7;:14;;;42888:20;;:38;;;;:::i;:::-;42871:12;:16;;:56;;;;:::i;:::-;42856:71;;42808:135;42706:248;42736:3;;;;;;;42706:248;;;;42532:429;;;;:::o;15403:56::-;15454:5;15403:56;:::o;16280:30::-;;;;;;;;;;;;;:::o;42969:126::-;1613:12;:10;:12::i;:::-;1603:22;;:6;;;;;;;;;;:22;;;1595:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43071:16:::1;43053:15;;:34;;;;;;;;;;;;;;;;;;42969:126:::0;:::o;1846:244::-;1613:12;:10;:12::i;:::-;1603:22;;:6;;;;;;;;;;:22;;;1595:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1955:1:::1;1935:22;;:8;:22;;;;1927:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2045:8;2016:38;;2037:6;::::0;::::1;;;;;;;;2016:38;;;;;;;;;;;;2074:8;2065:6;::::0;:17:::1;;;;;;;;;;;;;;;;;;1846:244:::0;:::o;19258:118::-;19311:7;19346:13;:19;;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19331:37;;19258:118;:::o;22540:982::-;1613:12;:10;:12::i;:::-;1603:22;;:6;;;;;;;;;;:22;;;1595:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22627:19:::1;22635:10;22627:7;:19::i;:::-;22715:15;22745:20:::0;22768:8:::1;:15;;;;22745:38;;22799:9;22794:721;22818:12;22814:1;:16;22794:721;;;22852:23;22878:8;22887:14;22893:7;22887:1;:5;;:14;;;;:::i;:::-;22878:24;;;;;;;;;;;;;;;;;;22852:50;;22917:11;22931:14;22937:7;22931:1;:5;;:14;;;;:::i;:::-;22917:28;;23003:1;22966:33;22978:3;22983:15;22966:11;:33::i;:::-;:38;:72;;;;;23027:7;:11;;;23008:15;:30;;22966:72;22962:542;;;23064:145;23101:7;:14;;;23138:7;:16;;;23177:7;:13;;;23064:145;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23380:8;23389:22;23409:1;23389:8;:15;;;;:19;;:22;;;;:::i;:::-;23380:32;;;;;;;;;;;;;;;;;;23364:8;23373:3;23364:13;;;;;;;;;;;;;;;;;;:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23431:8;:14;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23474;23486:1;23474:7;:11;;:14;;;;:::i;:::-;23464:24;;22962:542;22794:721;;22832:3;;;;;;;22794:721;;;;1673:1;;22540:982::o:0;25476:1737::-;25581:7;179:1;409:7;;:19;;401:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;179:1;542:7;:18;;;;25644:1:::1;25635:6;:10;25627:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25746:6;25716:26;25731:10;25716:14;:26::i;:::-;:36;;25694:127;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25865:19;25873:10;25865:7;:19::i;:::-;25964:32;25999:30;26022:6;25999:22;:30::i;:::-;25964:65;;26089:32;26124:97;15394:2;26202;:18;26124:59;26158:24;26124:15;26134:4;26124:9;:15::i;:::-;:33;;:59;;;;:::i;:::-;:77;;:97;;;;:::i;:::-;26089:132;;26234:20;26257:133;26335:54;26364:24;26335;;:28;;:54;;;;:::i;:::-;26257:59;26291:24;26257:15;:13;:15::i;:::-;:33;;:59;;;;:::i;:::-;:77;;:133;;;;:::i;:::-;26234:156;;26464:1;26457:4;:8;26453:94;;;26501:34;26522:12;26501:16;;:20;;:34;;;;:::i;:::-;26482:16;:53;;;;26453:94;26572:30;26589:12;26572;;:16;;:30;;;;:::i;:::-;26557:12;:45;;;;26640:12;:21;;;26662:10;26674:6;26640:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;26706:10;26697:60;;;26718:6;26726:26;26741:10;26726:14;:26::i;:::-;26697:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26787:1;26772:12;:16;26768:255;;;26805:13;:22;;;26836:4;26843:12;26805:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;26871:5;;;;;;;;;;;:14;;;26886:12;26871:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;26914:10;:19;;:33;26934:12;26914:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;26986:10;26967:44;;;26998:12;26967:44;;;;;;;;;;;;;;;;;;26768:255;27044:1;27037:4;:8;27033:143;;;27062:55;27085:10;27105:4;27112;27062:5;:22;;;;:55;;;;;;:::i;:::-;27147:10;27137:27;;;27159:4;27137:27;;;;;;;;;;;;;;;;;;27033:143;27193:12;27186:19;;;;;135:1:::0;721:7;:22;;;;25476:1737;;;;:::o;7295:132::-;7353:7;7380:39;7384:1;7387;7380:39;;;;;;;;;;;;;;;;;:3;:39::i;:::-;7373:46;;7295:132;;;;:::o;9932:177::-;10015:86;10035:5;10065:23;;;10090:2;10094:5;10042:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10015:19;:86::i;:::-;9932:177;;;:::o;23819:1398::-;179:1;409:7;;:19;;401:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;179:1;542:7;:18;;;;23992:1:::1;23983:6;:10;23975:54;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;24085:1;24062:25;;:11;:25;;;;24040:113;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24214:27;24266:1:::0;24245:18:::1;;:22;24244:141;;24349:36;15454:5;24349:6;:10;;:36;;;;:::i;:::-;24244:141;;;24284:49;24319:13;:11;:13::i;:::-;24284:30;24307:6;24284:18;;:22;;:30;;;;:::i;:::-;:34;;:49;;;;:::i;:::-;24244:141;24214:171;;24426:1;24404:19;:23;24396:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24509:20;24517:11;24509:7;:20::i;:::-;24579:17;24599:10;:23;24610:11;24599:23;;;;;;;;;;;;;;;24579:43;;24647:36;24663:19;24647:4;:11;;;:15;;:36;;;;:::i;:::-;24633:4;:11;;:50;;;;24713:15;24694:4;:16;;:34;;;;24741:10;:23;24752:11;24741:23;;;;;;;;;;;;;;;24784:43;;;;;;;;24790:19;24784:43;;;;24811:15;24784:43;;::::0;24741:97:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24924:43;24947:19;24924:18;;:22;;:43;;;;:::i;:::-;24903:18;:64;;;;25005:126;25057:6;25086:12;25114:6;25005:12;:18;;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;:37;;;;:126;;;;;;:::i;:::-;25156:11;25149:60;;;25169:6;25177:27;25192:11;25177:14;:27::i;:::-;25149:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;573:1;;135::::0;721:7;:22;;;;23819:1398;;;:::o;7037:250::-;7095:7;7124:1;7119;:6;7115:47;;;7149:1;7142:8;;;;7115:47;7174:9;7190:1;7186;:5;7174:17;;7219:1;7214;7210;:5;;;;;;:10;7202:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7278:1;7271:8;;;7037:250;;;;;:::o;32410:701::-;32486:7;32506:23;32532:8;32541:3;32532:13;;;;;;;;;;;;;;;;;;32506:39;;32617:7;:13;;;32604:10;:26;32600:67;;;32654:1;32647:8;;;;;32600:67;32719:7;:14;;;32699:7;:16;;;:34;32695:75;;32757:1;32750:8;;;;;32695:75;32877:7;:11;;;32863:10;:25;32859:101;;32912:36;32931:7;:16;;;32912:7;:14;;;:18;;:36;;;;:::i;:::-;32905:43;;;;;32859:101;32992:111;33072:7;:16;;;32992:57;33034:7;:14;;;32993:35;33008:7;:19;;;32993:10;:14;;:35;;;;:::i;:::-;32992:41;;:57;;;;:::i;:::-;:61;;:111;;;;:::i;:::-;32972:131;;;32410:701;;;;;:::o;6504:181::-;6562:7;6582:9;6598:1;6594;:5;6582:17;;6623:1;6618;:6;;6610:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6676:1;6669:8;;;6504:181;;;;:::o;6693:136::-;6751:7;6778:43;6782:1;6785;6778:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;6771:50;;6693:136;;;;:::o;793:106::-;846:15;881:10;874:17;;793:106;:::o;9323:253::-;9375:6;9406:1;9402;:5;;;9394:14;;;;;;9550:3;9490:34;9475:11;9484:1;9475:8;:11::i;:::-;9467:20;;:57;9466:87;;9421:147;;9323:253;;;:::o;30176:695::-;30226:15;:13;:15::i;:::-;30284:30;30317:82;30370:18;;30318:32;30338:11;;30318:15;:19;;:32;;;;:::i;:::-;30317:38;;:82;;;;:::i;:::-;30284:115;;30437:76;30480:22;30437:24;;:28;;:76;;;;:::i;:::-;30410:24;:103;;;;30538:15;30524:11;:29;;;;30594:17;30614:10;:16;30625:4;30614:16;;;;;;;;;;;;;;;30594:36;;30641:29;30673:70;30731:4;:11;;;30674:37;30694:4;:16;;;30674:15;:19;;:37;;;;:::i;:::-;30673:57;;:70;;;;:::i;:::-;30641:102;;30774:44;30796:21;30774:4;:17;;;:21;;:44;;;;:::i;:::-;30754:4;:17;;:64;;;;30848:15;30829:4;:16;;:34;;;;30176:695;;;;:::o;10117:205::-;10218:96;10238:5;10268:27;;;10297:4;10303:2;10307:5;10245:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10218:19;:96::i;:::-;10117:205;;;;:::o;27569:2472::-;27634:7;27654:27;27684:73;27733:13;:11;:13::i;:::-;27684:30;27707:6;27684:18;;:22;;:30;;;;:::i;:::-;:34;;:73;;;;:::i;:::-;27654:103;;27798:1;27776:19;:23;27768:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27920:26;27961:24;27988:19;27961:46;;28018:33;28066:22;28091:10;:22;28102:10;28091:22;;;;;;;;;;;;;;;28066:47;;28124:1383;28150:1;28131:16;:20;28124:1383;;;28168:23;28194:6;28217:1;28201:6;:13;;;;:17;28194:25;;;;;;;;;;;;;;;;;;28168:51;;28234:17;28254:40;28274:9;:19;;;28254:15;:19;;:40;;;;:::i;:::-;28234:60;;28311:13;28327:20;28337:9;28327;:20::i;:::-;28311:36;;28388:16;28368:9;:16;;;:36;28364:1132;;28499:185;28551:114;15394:2;28624;:18;28551:42;28587:5;28551:31;28572:9;28551;:16;;;:20;;:31;;;;:::i;:::-;:35;;:42;;;;:::i;:::-;:46;;:114;;;;:::i;:::-;28499:25;:29;;:185;;;;:::i;:::-;28471:213;;28724:95;28769:31;28790:9;28769;:16;;;:20;;:31;;;;:::i;:::-;28724:18;:22;;:95;;;;:::i;:::-;28703:116;;28857:38;28878:9;:16;;;28857;:20;;:38;;;;:::i;:::-;28838:57;;28914:6;:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28364:1132;;;29045:185;29097:114;15394:2;29170;:18;29097:42;29133:5;29097:31;29118:9;29097:16;:20;;:31;;;;:::i;:::-;:35;;:42;;;;:::i;:::-;:46;;:114;;;;:::i;:::-;29045:25;:29;;:185;;;;:::i;:::-;29017:213;;29270:95;29315:31;29336:9;29315:16;:20;;:31;;;;:::i;:::-;29270:18;:22;;:95;;;;:::i;:::-;29249:116;;29403:38;29424:16;29403:9;:16;;;:20;;:38;;;;:::i;:::-;29384:9;:16;;:57;;;;29479:1;29460:20;;28364:1132;28124:1383;;;;;;29548:17;29568:10;:22;29579:10;29568:22;;;;;;;;;;;;;;;29548:42;;29621:41;29643:18;29621:4;:17;;;:21;;:41;;;;:::i;:::-;29601:4;:17;;:61;;;;29687:36;29703:19;29687:4;:11;;;:15;;:36;;;;:::i;:::-;29673:4;:11;;:50;;;;29753:15;29734:4;:16;;:34;;;;29841:72;29884:18;29841:24;;:28;;:72;;;;:::i;:::-;29814:24;:99;;;;29945:43;29968:19;29945:18;;:22;;:43;;;;:::i;:::-;29924:18;:64;;;;30008:25;30001:32;;;;;;;;27569:2472;;;:::o;7439:191::-;7525:7;7557:1;7553;:5;7560:12;7545:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7584:9;7600:1;7596;:5;;;;;;7584:17;;7621:1;7614:8;;;7439:191;;;;;:::o;11319:418::-;11400:23;11426:69;11454:4;11426:69;;;;;;;;;;;;;;;;;11434:5;11426:27;;;;:69;;;;;:::i;:::-;11400:95;;11530:1;11510:10;:17;:21;11506:224;;;11652:10;11641:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11633:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11506:224;11319:418;;;:::o;6837:192::-;6923:7;6956:1;6951;:6;;6959:12;6943:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6983:9;6999:1;6995;:5;6983:17;;7020:1;7013:8;;;6837:192;;;;;:::o;7978:1079::-;8029:6;8060:1;8056;:5;;;8048:14;;;;;;8075:10;8100:9;8112:1;8100:13;;;;8134:19;8128:2;:25;8124:91;;8177:2;8170:9;;;;;8201:2;8194:9;;;;8124:91;8235:11;8229:2;:17;8225:83;;8270:2;8263:9;;;;;8294:2;8287:9;;;;8225:83;8328:7;8322:2;:13;8318:79;;8359:2;8352:9;;;;;8383:2;8376:9;;;;8318:79;8417:5;8411:2;:11;8407:75;;8446:1;8439:8;;;;;8469:1;8462:8;;;;8407:75;8502:4;8496:2;:10;8492:74;;8530:1;8523:8;;;;;8553:1;8546:8;;;;8492:74;8586:3;8580:2;:9;8576:73;;8613:1;8606:8;;;;;8636:1;8629:8;;;;8576:73;8669:3;8663:2;:9;8659:23;;8681:1;8674:8;;;;8659:23;8726:13;8756:2;8749;8743:3;:8;8742:16;;8726:32;;8769:10;8803:3;8797;:9;8790:1;8782:10;;:25;;;;;;;;;;8769:38;;8823:10;8836:18;8823:31;;8818:198;8862:1;8856:3;:7;8818:198;;;8897:2;8891:8;;;;8914:9;8932:3;8926:2;:9;;8914:21;;8963:1;8957:3;:7;8950:14;;;;;9002:1;8989:3;:15;8979:25;;;;8818:198;8873:1;8865:9;;;;;8818:198;;;;9042:6;9028:21;;;;;;7978:1079;;;:::o;30959:1222::-;31003:22;31040:20;31063:13;:11;:13::i;:::-;31040:36;;31114:1;31093:17;;:22;31089:894;;;31185:12;31168:29;;31089:894;;;31305:22;31351:9;31346:435;31370:8;:15;;;;31366:1;:19;31346:435;;;31411:14;31428:31;31440:1;31443:15;31428:11;:31::i;:::-;31411:48;;31478:23;31504:8;31513:1;31504:11;;;;;;;;;;;;;;;;;;31478:37;;31547:1;31538:6;:10;31534:232;;;31592:28;31613:6;31592:7;:16;;;:20;;:28;;;;:::i;:::-;31573:7;:16;;:47;;;;31665:15;31643:7;:19;;:37;;;;31720:26;31739:6;31720:14;:18;;:26;;;;:::i;:::-;31703:43;;31534:232;31346:435;;31387:3;;;;;;;31346:435;;;;31812:87;31867:17;;31812:32;31831:12;31812:14;:18;;:32;;;;:::i;:::-;:36;;:87;;;;:::i;:::-;31795:104;;31934:37;31956:14;31934:17;;:21;;:37;;;;:::i;:::-;31914:17;:57;;;;31089:894;;32016:1;31999:14;:18;31995:179;;;32034:11;:20;;;32063:13;32079:14;32034:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32114:48;32130:14;32146:15;:13;:15::i;:::-;32114:48;;;;;;;;;;;;;;;;;;;;;;;;31995:179;30959:1222;;:::o;4732:196::-;4835:12;4867:53;4890:6;4898:4;4904:1;4907:12;4867:22;:53::i;:::-;4860:60;;4732:196;;;;;:::o;5494:979::-;5624:12;5657:18;5668:6;5657:10;:18::i;:::-;5649:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5783:12;5797:23;5824:6;:11;;5844:8;5855:4;5824:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5782:78;;;;5875:7;5871:595;;;5906:10;5899:17;;;;;;5871:595;6040:1;6020:10;:17;:21;6016:439;;;6283:10;6277:17;6344:15;6331:10;6327:2;6323:19;6316:44;6231:148;6426:12;6419:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5494:979;;;;;;;:::o;3519:619::-;3579:4;3841:16;3868:19;3890:66;3868:88;;;;4059:7;4047:20;4035:32;;4099:11;4087:8;:23;;:42;;;;;4126:3;4114:15;;:8;:15;;4087:42;4079:51;;;;3519:619;;;:::o
Swarm Source
ipfs://0cb519e11367fbdc714c8611a8e25c0335d5476150874065ec982cdd113ae2d8
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 27 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.