More Info
Private Name Tags
ContractCreator:
Latest 25 from a total of 10,040 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
Value | ||||
---|---|---|---|---|---|---|---|---|---|
Withdraw | 74258721 | 73 days ago | IN | 0 FTM | 0.00296918 | ||||
Harvest Many | 74258557 | 73 days ago | IN | 0 FTM | 0.00393899 | ||||
Emergency Withdr... | 63204944 | 305 days ago | IN | 0 FTM | 0.00532854 | ||||
Deposit | 63156652 | 306 days ago | IN | 0 FTM | 0.01028566 | ||||
Deposit | 63156337 | 306 days ago | IN | 0 FTM | 0.01228639 | ||||
Withdraw | 63156035 | 306 days ago | IN | 0 FTM | 0.01272307 | ||||
Deposit | 63155931 | 306 days ago | IN | 0 FTM | 0.01726621 | ||||
Withdraw | 55409000 | 413 days ago | IN | 0 FTM | 0.00937986 | ||||
Deposit | 52778976 | 460 days ago | IN | 0 FTM | 0.00645114 | ||||
Deposit | 52778959 | 460 days ago | IN | 0 FTM | 0.00651324 | ||||
Withdraw | 52575927 | 464 days ago | IN | 0 FTM | 0.00899814 | ||||
Deposit | 52575857 | 464 days ago | IN | 0 FTM | 0.00779281 | ||||
Withdraw | 52543432 | 465 days ago | IN | 0 FTM | 0.00781046 | ||||
Deposit | 52529668 | 465 days ago | IN | 0 FTM | 0.01730016 | ||||
Withdraw | 52521707 | 465 days ago | IN | 0 FTM | 0.00993666 | ||||
Withdraw | 52521666 | 465 days ago | IN | 0 FTM | 0.00481736 | ||||
Withdraw | 52456423 | 467 days ago | IN | 0 FTM | 0.00848692 | ||||
Withdraw | 52456417 | 467 days ago | IN | 0 FTM | 0.00848824 | ||||
Deposit | 52456400 | 467 days ago | IN | 0 FTM | 0.00732331 | ||||
Withdraw | 52456338 | 467 days ago | IN | 0 FTM | 0.01181946 | ||||
Harvest Many | 52456328 | 467 days ago | IN | 0 FTM | 0.02662692 | ||||
Withdraw | 52430917 | 468 days ago | IN | 0 FTM | 0.0013055 | ||||
Withdraw | 52430199 | 468 days ago | IN | 0 FTM | 0.00125665 | ||||
Withdraw | 52430175 | 468 days ago | IN | 0 FTM | 0.00236199 | ||||
Harvest Many | 52430159 | 468 days ago | IN | 0 FTM | 0.00344944 |
Latest 1 internal transaction
Parent Txn Hash | Block | From | To | Value | ||
---|---|---|---|---|---|---|
34880921 | 728 days ago | Contract Creation | 0 FTM |
Loading...
Loading
Contract Name:
AssentMasterchef
Compiler Version
v0.8.11+commit.d7f03943
Contract Source Code (Solidity Multiple files format)
// SPDX-License-Identifier: MIT // ___ __ // / | _____________ ____ / /_ // / /| | / ___/ ___/ _ \/ __ \/ __/ // / ___ |(__ |__ ) __/ / / / /_ // /_/ |_/____/____/\___/_/ /_/\__/ // // 2022 - Assent Protocol pragma solidity 0.8.11; import "./Ownable.sol"; import "./ReentrancyGuard.sol"; import "./IMultipleRewards.sol"; import "./IReferral.sol"; import "./SafeERC20.sol"; import "./ASNTToken.sol"; import "./IAssentVIP.sol"; contract AssentMasterchef is Ownable, ReentrancyGuard { using SafeERC20 for IERC20; // Info of each user. struct UserInfo { uint256 amount; // How many LP tokens the user has provided. uint256 rewardDebt; // Reward debt. See explanation below. uint256 rewardLockedUp; // Reward locked up. uint256 nextHarvestUntil; // When can the user harvest again. uint256 noHarvestFeeAfter; //No harvest fee after this duration } // Info of each pool. struct PoolInfo { IERC20 lpToken; // Address of LP token contract. uint256 allocPoint; // How many allocation points assigned to this pool. ASNT to distribute per block. uint256 lastRewardTimestamp; // Last block number that ASNT distribution occurs. uint256 accASNTPerShare; // Accumulated ASNT per share, times 1e18. See below. uint256 depositFeeRate; // Deposit fee uint256 harvestInterval; // Harvest interval in seconds uint256 harvestFeeInterval; // Harvest fee minimum interval in seconds uint256 harvestFeeRate; // Harvest fee ONLY on rewards in basis points when the harvest occurs before the minimum interval uint256 totalLp; // Total token in Pool IMultipleRewards[] rewarders; // Array of rewarder contract for pools with incentives } // ASNT token ASNTToken immutable public ASNT; // ASNT tokens created per second uint256 public ASNTPerSec; // Maximum emission rate : ASNTPerBlock can't be more than 50 per sec uint256 public constant MAX_EMISSION_RATE = 50 ether; // Max harvest interval: 3 days uint256 public constant MAXIMUM_HARVEST_INTERVAL = 5 days; // Max harvest fee interval: 10 days. uint256 public constant MAXIMUM_HARVESTFEE_INTERVAL = 5 days; // Max harvest fee : 10% / Harvest fee applied ONLY on rewards, never on deposited assets uint256 public constant MAXIMUM_HARVEST_FEE_RATE = 0.1 ether; // 10% // Maximum deposit fee rate: 10% uint256 public constant MAXIMUM_DEPOSIT_FEE_RATE = 0.05 ether; // 5% // Maximum percentage of pool rewards that goto the share address: 10% uint16 public constant MAXIMUM_SHARE_RATE = 100; // Maximum number of rewarders per pool uint16 public constant MAXIMUM_REWARDERS = 10; // Burn address address public constant BURN_ADDRESS = 0x000000000000000000000000000000000000dEaD; uint public constant MULTIPLIER = 10**18; uint public constant MAXFEEREDUCTION = 0.8 ether; // 80% // Info of each pool PoolInfo[] public poolInfo; // Info of each user that stakes LP tokens. mapping(uint256 => mapping(address => UserInfo)) public userInfo; // Total allocation points. Must be the sum of all allocation points in all pools. uint256 public totalAllocPoint; // The timestamp when ASNT mining starts. uint256 public startTimestamp; // Total locked up rewards uint256 public totalLockedUpRewards; // ASNT referral contract address. IReferral public ASNTReferral; // Referral commission rate in basis points. uint16 public referralCommissionRate = 100; // Total ASNT in ASNT Pools (can be multiple pools) uint256 public totalASNTInPools; // ASNTshare address. address public ASNTShareAddress; // deposit fee address if needed address public feeAddress; // Percentage of pool rewards that goto the share address uint256 public ASNTSharePercent; // The precision factor uint256 private constant ACC_TOKEN_PRECISION = 1e18; // Assent VIP fee reduction contract IAssentVIP public vip; modifier validatePoolByPid(uint256 _pid) { require(_pid < poolInfo.length, "Pool does not exist"); _; } event Add(uint256 indexed pid, uint256 allocPoint, IERC20 indexed lpToken, uint256 depositFeeRate, uint256 harvestInterval, uint256 harvestFeeInterval, uint256 harvestFeeBP, IMultipleRewards[] indexed rewarders); event Set(uint256 indexed pid, uint256 allocPoint, uint256 depositFeeRate, uint256 harvestInterval, uint256 harvestFeeInterval, uint256 harvestFeeBP, IMultipleRewards[] indexed rewarders); event UpdatePool(uint256 indexed pid, uint256 lastRewardTimestamp, uint256 lpSupply, uint256 accASNTPerShare); event Deposit(address indexed user, uint256 indexed pid, uint256 amount); event Withdraw(address indexed user, uint256 indexed pid, uint256 amount); event EmergencyWithdraw(address indexed user, uint256 indexed pid, uint256 amount); event EmissionRateUpdated(address indexed caller, uint256 previousValue, uint256 newValue); event RewardLockedUp(address indexed user, uint256 indexed pid, uint256 amountLockedUp); event AllocPointsUpdated(address indexed caller, uint256 previousAmount, uint256 newAmount); event SetASNTShareAddress(address indexed oldAddress, address indexed newAddress); event SetFeeAddress(address indexed oldAddress, address indexed newAddress); event SetASNTSharePercent(uint256 oldPercent, uint256 newPercent); event ReferralCommissionPaid(address indexed user, address indexed referrer, uint256 newAmount); event ReferralRateUpdated(address indexed user, uint256 previousAmount, uint256 newAmount); event ASNTReferralUpdated(address indexed user, IReferral newAddress); event RewardsMinted( address indexed caller, address indexed recipient, uint amount ); event ASNTMaxSupplyReached( address indexed recipient, uint amount ); event VIPUpdated(IAssentVIP indexed previousAddress, IAssentVIP indexed newAddress); constructor( ASNTToken _ASNT, uint256 _ASNTPerSec ) { startTimestamp = block.timestamp + (60 * 60 * 24 * 365); ASNT = _ASNT; require(_ASNTPerSec <= MAX_EMISSION_RATE, "Emission > max emission rate"); ASNTPerSec = _ASNTPerSec; ASNTSharePercent = 0; ASNTShareAddress = msg.sender; feeAddress = msg.sender; } // // VIEW // // Get pool lenght function poolLength() external view returns (uint256) { return poolInfo.length; } // View function to see pending rewards on frontend. function pendingTokens(uint256 _pid, address _user) external view validatePoolByPid(_pid) returns ( address[] memory addresses, string[] memory symbols, uint256[] memory decimals, uint256[] memory amounts ) { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][_user]; uint256 accASNTPerShare = pool.accASNTPerShare; uint256 lpSupply = pool.totalLp; if (block.timestamp > pool.lastRewardTimestamp && lpSupply != 0) { uint256 multiplier = block.timestamp - pool.lastRewardTimestamp; uint256 total = 1000; uint256 lpPercent = total - ASNTSharePercent; uint256 ASNTReward = (multiplier * ASNTPerSec * pool.allocPoint * lpPercent) / totalAllocPoint / total; accASNTPerShare += (ASNTReward * ACC_TOKEN_PRECISION) / lpSupply; } uint256 pendingASNT = (((user.amount * accASNTPerShare) / ACC_TOKEN_PRECISION) - user.rewardDebt) + user.rewardLockedUp; addresses = new address[](pool.rewarders.length + 1); symbols = new string[](pool.rewarders.length + 1); amounts = new uint256[](pool.rewarders.length + 1); decimals = new uint256[](pool.rewarders.length + 1); addresses[0] = address(ASNT); symbols[0] = IERC20(ASNT).symbol(); decimals[0] = IERC20(ASNT).decimals(); amounts[0] = pendingASNT; for (uint256 rewarderId = 0; rewarderId < pool.rewarders.length; ++rewarderId) { addresses[rewarderId + 1] = address(pool.rewarders[rewarderId].rewardToken()); symbols[rewarderId + 1] = IERC20(pool.rewarders[rewarderId].rewardToken()).symbol(); decimals[rewarderId + 1] = IERC20(pool.rewarders[rewarderId].rewardToken()).decimals(); amounts[rewarderId + 1] = pool.rewarders[rewarderId].pendingTokens(_pid, _user); } } // View function to see pool rewards datas function poolRewardsDatas(uint256 _pid) external view validatePoolByPid(_pid) returns ( address[] memory addresses, string[] memory symbols, uint256[] memory decimals, uint256[] memory rewardsPerSec, uint256[] memory rewardStartTime, uint256[] memory rewardEndTime, IMultipleRewards.RewarderType[] memory rewarderType ) { PoolInfo storage pool = poolInfo[_pid]; addresses = new address[](pool.rewarders.length + 1); symbols = new string[](pool.rewarders.length + 1); decimals = new uint256[](pool.rewarders.length + 1); rewardsPerSec = new uint256[](pool.rewarders.length + 1); rewardStartTime = new uint256[](pool.rewarders.length + 1); rewardEndTime = new uint256[](pool.rewarders.length + 1); rewarderType = new IMultipleRewards.RewarderType[](pool.rewarders.length + 1); addresses[0] = address(ASNT); symbols[0] = IERC20(ASNT).symbol(); decimals[0] = IERC20(ASNT).decimals(); uint256 total = 1000; uint256 lpPercent = total - ASNTSharePercent; rewardsPerSec[0] = (pool.allocPoint * ASNTPerSec * lpPercent) / totalAllocPoint / total; for (uint256 rewarderId = 0; rewarderId < pool.rewarders.length; ++rewarderId) { addresses[rewarderId + 1] = address(pool.rewarders[rewarderId].rewardToken()); symbols[rewarderId + 1] = IERC20(pool.rewarders[rewarderId].rewardToken()).symbol(); decimals[rewarderId + 1] = IERC20(pool.rewarders[rewarderId].rewardToken()).decimals(); rewardsPerSec[rewarderId + 1] = pool.rewarders[rewarderId].poolRewardsPerSec(_pid); (,,,rewardStartTime[rewarderId + 1],rewardEndTime[rewarderId + 1],rewarderType[rewarderId + 1]) = pool.rewarders[rewarderId].getPoolInfo(_pid); } } // View function to see rewarders contract address for a pool function poolRewarders(uint256 _pid) external view validatePoolByPid(_pid) returns (address[] memory rewarders) { PoolInfo storage pool = poolInfo[_pid]; rewarders = new address[](pool.rewarders.length); for (uint256 rewarderId = 0; rewarderId < pool.rewarders.length; ++rewarderId) { rewarders[rewarderId] = address(pool.rewarders[rewarderId]); } } // View function to see if user can harvest ASNT. function canHarvest(uint256 _pid, address _user) public view validatePoolByPid(_pid) returns (bool) { UserInfo storage user = userInfo[_pid][_user]; return block.timestamp >= startTimestamp && block.timestamp >= user.nextHarvestUntil; } // View function to see if user harvest fees apply to the harvest function noHarvestFee(uint256 _pid, address _user) public view returns (bool) { UserInfo storage user = userInfo[_pid][_user]; return block.timestamp >= user.noHarvestFeeAfter; } // Get pool total deposit function poolTotalLp(uint256 pid) external view returns (uint256) { return poolInfo[pid].totalLp; } // Get the deposit fee reduction for user including the user fee reduction from VIP system function getUserDepositFee(address user, uint256 _depositfeeRate) public view returns (uint256 newDepositFeeRate) { uint userFeeReduction = getFarmsDepFeeReduction(user); require (userFeeReduction <= MAXFEEREDUCTION, "Fee reduction too high"); return _depositfeeRate*(MULTIPLIER-userFeeReduction)/MULTIPLIER; } // Get fee reduction from vip contract function getFarmsDepFeeReduction(address _user) public view returns(uint _farmDepFeeReduction) { if (address(vip) != address(0)) { return vip.getFarmsDepFeeReduction(_user); } else { return 0; } } // // ACTION // // Update reward vairables for all pools. Be careful of gas spending! function massUpdatePools() external nonReentrant { _massUpdatePools(); } // Internal method for massUpdatePools function _massUpdatePools() internal { for (uint256 pid = 0; pid < poolInfo.length; ++pid) { _updatePool(pid); } } // Check if a mint is possible function _checkBeforeMintRewards(address _recipient, uint _amount ) internal returns ( bool ) { // Mint only if max supply not reached uint256 _totalSupply = ASNT.totalSupply(); uint256 _maxCapSupply = ASNT.maxSupply(); if ((_totalSupply + _amount) <= _maxCapSupply) { ASNT.mint(_recipient, _amount); emit RewardsMinted(msg.sender, _recipient, _amount); return true; } else { emit ASNTMaxSupplyReached(_recipient, _amount); return false; } } // Update reward variables of the given pool to be up-to-date. function updatePool(uint256 _pid) external nonReentrant { _updatePool(_pid); } // Internal method for _updatePool function _updatePool(uint256 _pid) internal validatePoolByPid(_pid) { PoolInfo storage pool = poolInfo[_pid]; if (block.timestamp <= pool.lastRewardTimestamp) { return; } uint256 lpSupply = pool.totalLp; if (lpSupply == 0 || pool.allocPoint == 0) { pool.lastRewardTimestamp = block.timestamp; return; } uint256 multiplier = block.timestamp - pool.lastRewardTimestamp; uint256 ASNTReward = ((multiplier * ASNTPerSec) * pool.allocPoint) / totalAllocPoint; uint256 total = 1000; uint256 lpPercent = total - ASNTSharePercent; _checkBeforeMintRewards(ASNTShareAddress, (ASNTReward * ASNTSharePercent) / total ); //Only update pool if the mint is successful if (_checkBeforeMintRewards(address(this), (ASNTReward * lpPercent) / total )) { pool.accASNTPerShare += (ASNTReward * ACC_TOKEN_PRECISION * lpPercent) / pool.totalLp / total; pool.lastRewardTimestamp = block.timestamp; } emit UpdatePool(_pid, pool.lastRewardTimestamp, lpSupply, pool.accASNTPerShare); } // Deposit tokens for ASNT allocation. function deposit(uint256 _pid, uint256 _amount, address _referrer) external nonReentrant { _deposit(_pid, _amount, _referrer); } // Deposit tokens for ASNT allocation. function _deposit(uint256 _pid, uint256 _amount, address _referrer) internal validatePoolByPid(_pid) { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][msg.sender]; _updatePool(_pid); if (_amount > 0 && address(ASNTReferral) != address(0) && _referrer != BURN_ADDRESS && _referrer != address(0) && _referrer != msg.sender) { ASNTReferral.recordReferral(msg.sender, _referrer); } payOrLockupPendingASNT(_pid); if (_amount > 0) { uint256 beforeDeposit = pool.lpToken.balanceOf(address(this)); pool.lpToken.safeTransferFrom(msg.sender, address(this), _amount); uint256 afterDeposit = pool.lpToken.balanceOf(address(this)); _amount = afterDeposit - beforeDeposit; if (pool.depositFeeRate > 0) { uint userDepositFeeRate = getUserDepositFee(msg.sender, pool.depositFeeRate); uint256 depositFee = (_amount * userDepositFeeRate) / MULTIPLIER; _amount = _amount - depositFee; pool.lpToken.safeTransfer(feeAddress, depositFee); } user.amount += _amount; if (address(pool.lpToken) == address(ASNT)) { totalASNTInPools += _amount; } } user.rewardDebt = (user.amount * pool.accASNTPerShare) / ACC_TOKEN_PRECISION; for (uint256 rewarderId = 0; rewarderId < pool.rewarders.length; ++rewarderId) { pool.rewarders[rewarderId].onASNTReward(_pid, msg.sender, user.amount); } if (_amount > 0) { pool.totalLp += _amount; } emit Deposit(msg.sender, _pid, _amount); } //withdraw tokens function withdraw(uint256 _pid, uint256 _amount) external nonReentrant validatePoolByPid(_pid) { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][msg.sender]; //this will make sure that user can only withdraw from his pool require(user.amount >= _amount, "withdraw: user amount not enough"); //cannot withdraw more than pool's balance require(pool.totalLp >= _amount, "withdraw: pool total not enough"); _updatePool(_pid); payOrLockupPendingASNT(_pid); if (_amount > 0) { user.amount -= _amount; if (address(pool.lpToken) == address(ASNT)) { totalASNTInPools -= _amount; } pool.lpToken.safeTransfer(msg.sender, _amount); } user.rewardDebt = (user.amount * pool.accASNTPerShare) / ACC_TOKEN_PRECISION; for (uint256 rewarderId = 0; rewarderId < pool.rewarders.length; ++rewarderId) { pool.rewarders[rewarderId].onASNTReward(_pid, msg.sender, user.amount); } if (_amount > 0) { pool.totalLp -= _amount; } emit Withdraw(msg.sender, _pid, _amount); } // Withdraw without caring about rewards. EMERGENCY ONLY. function emergencyWithdraw(uint256 _pid) external nonReentrant { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][msg.sender]; uint256 amount = user.amount; //cannot withdraw more than pool's balance require(pool.totalLp >= amount, "emergency withdraw: pool total not enough"); user.amount = 0; user.rewardDebt = 0; user.rewardLockedUp = 0; user.nextHarvestUntil = 0; user.noHarvestFeeAfter = 0; if (address(pool.lpToken) == address(ASNT)) { totalASNTInPools -= amount; } pool.lpToken.safeTransfer(msg.sender, amount); for (uint256 rewarderId = 0; rewarderId < pool.rewarders.length; ++rewarderId) { pool.rewarders[rewarderId].onASNTReward(_pid, msg.sender, 0); } pool.totalLp -= amount; emit EmergencyWithdraw(msg.sender, _pid, amount); } // Pay or lockup pending ASNT. function payOrLockupPendingASNT(uint256 _pid) internal { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][msg.sender]; if (user.nextHarvestUntil == 0 && block.timestamp >= startTimestamp) { user.nextHarvestUntil = block.timestamp + pool.harvestInterval; } if (user.noHarvestFeeAfter == 0) { user.noHarvestFeeAfter = block.timestamp + pool.harvestFeeInterval; } uint256 pending = ((user.amount * pool.accASNTPerShare) / ACC_TOKEN_PRECISION) - user.rewardDebt; if (canHarvest(_pid, msg.sender)) { // if user harvest before the interval, user pay fee on pending reward if (noHarvestFee(_pid, msg.sender)==false && pending > 0) { uint256 pendingIncludeRewardLockedUp = pending + user.rewardLockedUp; uint256 harvestfeeamount = (pendingIncludeRewardLockedUp * pool.harvestFeeRate) / MULTIPLIER; pending = pending - harvestfeeamount; // tax on harvest is send to the share address safeASNTTransfer(ASNTShareAddress, harvestfeeamount); } // reset timer at each harvest user.noHarvestFeeAfter = block.timestamp + pool.harvestFeeInterval; if (pending > 0 || user.rewardLockedUp > 0) { uint256 pendingRewards = pending + user.rewardLockedUp; // reset lockup totalLockedUpRewards -= user.rewardLockedUp; user.rewardLockedUp = 0; user.nextHarvestUntil = block.timestamp + pool.harvestInterval; // send rewards safeASNTTransfer(msg.sender, pendingRewards); payReferralCommission(msg.sender, pendingRewards); // extra mint for referral } } else if (pending > 0) { totalLockedUpRewards += pending; user.rewardLockedUp += pending; emit RewardLockedUp(msg.sender, _pid, pending); } } // Safe ASNT transfer function, just in case if rounding error causes pool do not have enough ASNT. function safeASNTTransfer(address _to, uint256 _amount) internal { if (ASNT.balanceOf(address(this)) > totalASNTInPools) { //ASNTBal = total ASNT in ASNTChef - total ASNT in ASNT pools, this will make sure that ASNTMasterchef never transfer rewards from deposited ASNT pools uint256 ASNTBal = ASNT.balanceOf(address(this)) - totalASNTInPools; if (_amount >= ASNTBal) { IERC20(ASNT).safeTransfer(_to, ASNTBal); } else if (_amount > 0) { IERC20(ASNT).safeTransfer(_to, _amount); } } } // Function to harvest many pools in a single transaction function harvestMany(uint256[] calldata _pids, address _referrer) external nonReentrant { require(_pids.length <= 30, "harvest many: too many pool ids"); for (uint256 index = 0; index < _pids.length; ++index) { _deposit(_pids[index], 0, _referrer); } } // Pay referral commission to the referrer who referred this user. function payReferralCommission(address _user, uint256 _pending) internal { if (address(ASNTReferral) != address(0) && referralCommissionRate > 0) { address referrer = ASNTReferral.getReferrer(_user); uint256 commissionAmount = (_pending * referralCommissionRate) / 10000; if (referrer != address(0) && referrer != BURN_ADDRESS && commissionAmount > 0) { ASNT.mint(referrer, commissionAmount); ASNTReferral.recordReferralCommission(referrer, commissionAmount); emit ReferralCommissionPaid(_user, referrer, commissionAmount); } } } // // ADMIN // // Add a new lp to the pool. Can only be called by the owner. // Can add multiple pool with same lp token without messing up rewards, because each pool's balance is tracked using its own totalLp function add(uint256 _allocPoint, IERC20 _lpToken, uint256 _depositFeeRate, uint256 _harvestInterval, uint256 _harvestFeeInterval, uint256 _harvestFeeRate, IMultipleRewards[] calldata _rewarders) external onlyOwner { require(_rewarders.length <= MAXIMUM_REWARDERS, "add: too many rewarders"); require(_harvestFeeRate <= MAXIMUM_HARVEST_FEE_RATE, "add: harvest fee too high"); require(_harvestFeeInterval <= MAXIMUM_HARVESTFEE_INTERVAL, "add: invalid harvest fee interval"); require(_depositFeeRate <= MAXIMUM_DEPOSIT_FEE_RATE, "add: deposit fee too high"); require(_harvestInterval <= MAXIMUM_HARVEST_INTERVAL, "add: invalid harvest interval"); for (uint256 rewarderId = 0; rewarderId < _rewarders.length; ++rewarderId) { require(Address.isContract(address(_rewarders[rewarderId])),"add: rewarder must be contract"); (,uint lastRewardTime,,,,) = _rewarders[rewarderId].getPoolInfo(poolInfo.length); require(lastRewardTime != 0, "Pool doesn't exist yet in rewarder"); } _massUpdatePools(); uint256 lastRewardTimestamp = block.timestamp > startTimestamp ? block.timestamp : startTimestamp; totalAllocPoint += _allocPoint; poolInfo.push( PoolInfo({ lpToken: _lpToken, allocPoint: _allocPoint, lastRewardTimestamp: lastRewardTimestamp, accASNTPerShare: 0, depositFeeRate: _depositFeeRate, harvestInterval: _harvestInterval, harvestFeeInterval: _harvestFeeInterval, harvestFeeRate: _harvestFeeRate, totalLp: 0, rewarders: _rewarders }) ); emit Add(poolInfo.length - 1,_allocPoint,_lpToken,_depositFeeRate,_harvestInterval,_harvestFeeInterval,_harvestFeeRate,_rewarders); } // Update the given pool's ASNT parameters. Can only be called by the owner. function set(uint256 _pid, uint256 _allocPoint, uint256 _depositFeeRate, uint256 _harvestInterval, uint256 _harvestFeeInterval, uint256 _harvestFeeRate, IMultipleRewards[] calldata _rewarders) external onlyOwner validatePoolByPid(_pid) { require(_rewarders.length <= MAXIMUM_REWARDERS, "set: too many rewarders"); require(_harvestFeeRate <= MAXIMUM_HARVEST_FEE_RATE, "set: harvest fee too high"); require(_harvestFeeInterval <= MAXIMUM_HARVESTFEE_INTERVAL, "set: invalid harvest fee interval"); require(_depositFeeRate <= MAXIMUM_DEPOSIT_FEE_RATE, "set: deposit fee too high"); require(_harvestInterval <= MAXIMUM_HARVEST_INTERVAL, "set: invalid harvest interval"); for (uint256 rewarderId = 0; rewarderId < _rewarders.length; ++rewarderId) { require(Address.isContract(address(_rewarders[rewarderId])),"set: rewarder must be contract" ); } _massUpdatePools(); totalAllocPoint = totalAllocPoint - poolInfo[_pid].allocPoint + _allocPoint; poolInfo[_pid].allocPoint = _allocPoint; poolInfo[_pid].depositFeeRate = _depositFeeRate; poolInfo[_pid].harvestInterval = _harvestInterval; poolInfo[_pid].rewarders = _rewarders; poolInfo[_pid].harvestFeeInterval = _harvestFeeInterval; poolInfo[_pid].harvestFeeRate = _harvestFeeRate; emit Set(_pid, _allocPoint, _depositFeeRate, _harvestInterval, _harvestFeeInterval, _harvestFeeRate, _rewarders); } // Update pool allocation point function updateAllocPoint(uint256 _pid, uint256 _allocPoint) external onlyOwner { _massUpdatePools(); emit AllocPointsUpdated(msg.sender,poolInfo[_pid].allocPoint,_allocPoint); totalAllocPoint = totalAllocPoint - poolInfo[_pid].allocPoint + _allocPoint; poolInfo[_pid].allocPoint = _allocPoint; } // Update emission rate function updateEmissionRate(uint256 _ASNTPerSec) external onlyOwner { require(_ASNTPerSec <= MAX_EMISSION_RATE, "Emission > max emission rate"); _massUpdatePools(); emit EmissionRateUpdated(msg.sender, ASNTPerSec, _ASNTPerSec); ASNTPerSec = _ASNTPerSec; } // Set farming start now, can call only if farming not started function startFarmingNow() external onlyOwner { require(block.timestamp < startTimestamp, "farm already started"); uint256 length = poolInfo.length; for (uint256 pid = 0; pid < length; ++pid) { PoolInfo storage pool = poolInfo[pid]; pool.lastRewardTimestamp = block.timestamp; } startTimestamp = block.timestamp; } // Set farming start at fixed time, can call only if farming not started function startFarmingAtTime(uint _startTimestamp) external onlyOwner { require(block.timestamp < startTimestamp, "farm already started"); uint256 length = poolInfo.length; for (uint256 pid = 0; pid < length; ++pid) { PoolInfo storage pool = poolInfo[pid]; pool.lastRewardTimestamp = _startTimestamp; } startTimestamp = _startTimestamp; } // Update the ASNT referral contract address by the owner function setASNTReferral(IReferral _ASNTReferral) external onlyOwner { ASNTReferral = _ASNTReferral; emit ASNTReferralUpdated(msg.sender, _ASNTReferral); } // Update referral commission rate by the owner function setReferralCommissionRate(uint16 _referralCommissionRate) external onlyOwner { // Max referral commission rate: 10%. require(_referralCommissionRate <= 1000, "setReferralCommissionRate: invalid referral commission rate basis points"); emit ReferralRateUpdated(msg.sender, referralCommissionRate, _referralCommissionRate); referralCommissionRate = _referralCommissionRate; } // Update ASNTShare address function setASNTShareAddress(address _ASNTShareAddress) external { require(msg.sender == ASNTShareAddress, "setASNTShareAddress: FORBIDDEN"); require(_ASNTShareAddress != address(0), "setASNTShareAddress: ZERO"); ASNTShareAddress = _ASNTShareAddress; emit SetASNTShareAddress(msg.sender, _ASNTShareAddress); } // Update ASNT Share percentage function setASNTSharePercent(uint256 _newASNTSharePercent) external onlyOwner { require(_newASNTSharePercent <= MAXIMUM_SHARE_RATE, "invalid percent value"); emit SetASNTSharePercent(ASNTSharePercent, _newASNTSharePercent); ASNTSharePercent = _newASNTSharePercent; } // Update fee address by the previous fee address function setFeeAddress(address _feeAddress) external { require(msg.sender == feeAddress, "setFeeAddress: FORBIDDEN"); require(_feeAddress != address(0), "setFeeAddress: ZERO"); feeAddress = _feeAddress; emit SetFeeAddress(msg.sender, _feeAddress); } // Update vip contract address function setVIP(IAssentVIP _vip) external onlyOwner { require (_vip.isVIP(), "Not a vip contract"); require (_vip.getFarmsDepFeeReduction(address(this)) == 0, "getFarmsDepFeeReduction wrong answer"); emit VIPUpdated(vip, _vip); vip = _vip; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IAccessControl.sol"; import "./ERC165.sol"; import "./Context.sol"; import "./Strings.sol"; /** * @dev Contract module that allows children to implement role-based access * control mechanisms. This is a lightweight version that doesn't allow enumerating role * members except through off-chain means by accessing the contract event logs. Some * applications may benefit from on-chain enumerability, for those cases see * {AccessControlEnumerable}. * * Roles are referred to by their `bytes32` identifier. These should be exposed * in the external API and be unique. The best way to achieve this is by * using `public constant` hash digests: * * ``` * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); * ``` * * Roles can be used to represent a set of permissions. To restrict access to a * function call, use {hasRole}: * * ``` * function foo() public { * require(hasRole(MY_ROLE, msg.sender)); * ... * } * ``` * * Roles can be granted and revoked dynamically via the {grantRole} and * {revokeRole} functions. Each role has an associated admin role, and only * accounts that have a role's admin role can call {grantRole} and {revokeRole}. * * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means * that only accounts with this role will be able to grant or revoke other * roles. More complex role relationships can be created by using * {_setRoleAdmin}. * * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to * grant and revoke this role. Extra precautions should be taken to secure * accounts that have been granted it. */ abstract contract AccessControl is Context, IAccessControl, ERC165 { struct RoleData { mapping(address => bool) members; bytes32 adminRole; } mapping(bytes32 => RoleData) private _roles; bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; /** * @dev Modifier that checks that an account has a specific role. Reverts * with a standardized message including the required role. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ * * _Available since v4.1._ */ modifier onlyRole(bytes32 role) { _checkRole(role, _msgSender()); _; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) public view override returns (bool) { return _roles[role].members[account]; } /** * @dev Revert with a standard message if `account` is missing `role`. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ */ function _checkRole(bytes32 role, address account) internal view { if (!hasRole(role, account)) { revert( string( abi.encodePacked( "AccessControl: account ", Strings.toHexString(uint160(account), 20), " is missing role ", Strings.toHexString(uint256(role), 32) ) ) ); } } /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) public view override returns (bytes32) { return _roles[role].adminRole; } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _grantRole(role, account); } /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _revokeRole(role, account); } /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been revoked `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) public virtual override { require(account == _msgSender(), "AccessControl: can only renounce roles for self"); _revokeRole(role, account); } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. Note that unlike {grantRole}, this function doesn't perform any * checks on the calling account. * * [WARNING] * ==== * This function should only be called from the constructor when setting * up the initial roles for the system. * * Using this function in any other way is effectively circumventing the admin * system imposed by {AccessControl}. * ==== * * NOTE: This function is deprecated in favor of {_grantRole}. */ function _setupRole(bytes32 role, address account) internal virtual { _grantRole(role, account); } /** * @dev Sets `adminRole` as ``role``'s admin role. * * Emits a {RoleAdminChanged} event. */ function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { bytes32 previousAdminRole = getRoleAdmin(role); _roles[role].adminRole = adminRole; emit RoleAdminChanged(role, previousAdminRole, adminRole); } /** * @dev Grants `role` to `account`. * * Internal function without access restriction. */ function _grantRole(bytes32 role, address account) internal virtual { if (!hasRole(role, account)) { _roles[role].members[account] = true; emit RoleGranted(role, account, _msgSender()); } } /** * @dev Revokes `role` from `account`. * * Internal function without access restriction. */ function _revokeRole(bytes32 role, address account) internal virtual { if (hasRole(role, account)) { _roles[role].members[account] = false; emit RoleRevoked(role, account, _msgSender()); } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ 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"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ 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"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { 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 assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT // ___ __ // / | _____________ ____ / /_ // / /| | / ___/ ___/ _ \/ __ \/ __/ // / ___ |(__ |__ ) __/ / / / /_ // /_/ |_/____/____/\___/_/ /_/\__/ // // 2022 - Assent Protocol pragma solidity 0.8.11; import "./ERC20Permit.sol"; import "./ERC20Burnable.sol"; import "./AccessControl.sol"; import "./Pausable.sol"; import "./SafeERC20.sol"; contract ASNTToken is ERC20Burnable, ERC20Permit, AccessControl, Pausable { using SafeERC20 for IERC20; bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE"); bytes32 public constant RESCUER_ROLE = keccak256("RESCUER_ROLE"); bytes32 public constant PAUSER_ROLE = keccak256("PAUSER_ROLE"); uint256 internal constant MAX_TOTAL_SUPPLY = 100000000 ether; constructor() ERC20("Assent Protocol Token", "ASNT") ERC20Permit("Assent Protocol") { _setupRole(DEFAULT_ADMIN_ROLE, msg.sender); _setupRole(PAUSER_ROLE, msg.sender); _setupRole(MINTER_ROLE, msg.sender); _setupRole(RESCUER_ROLE, msg.sender); } function mint(address to, uint256 amount) external onlyRole(MINTER_ROLE) { require( amount + totalSupply() <= MAX_TOTAL_SUPPLY, "Cant mint more than max supply" ); _mint(to, amount); } function maxSupply() external pure returns (uint256) { return MAX_TOTAL_SUPPLY; } function rescueTokens(IERC20 token, uint256 value) external onlyRole(RESCUER_ROLE) { token.transfer(msg.sender, value); } function pause() external onlyRole(PAUSER_ROLE) { _pause(); } function unpause() external onlyRole(PAUSER_ROLE) { _unpause(); } function _beforeTokenTransfer( address from, address to, uint256 amount ) internal override whenNotPaused { super._beforeTokenTransfer(from, to, amount); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./Strings.sol"; /** * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations. * * These functions can be used to verify that a message was signed by the holder * of the private keys of a given address. */ library ECDSA { enum RecoverError { NoError, InvalidSignature, InvalidSignatureLength, InvalidSignatureS, InvalidSignatureV } function _throwError(RecoverError error) private pure { if (error == RecoverError.NoError) { return; // no error: do nothing } else if (error == RecoverError.InvalidSignature) { revert("ECDSA: invalid signature"); } else if (error == RecoverError.InvalidSignatureLength) { revert("ECDSA: invalid signature length"); } else if (error == RecoverError.InvalidSignatureS) { revert("ECDSA: invalid signature 's' value"); } else if (error == RecoverError.InvalidSignatureV) { revert("ECDSA: invalid signature 'v' value"); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature` or error string. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. * * Documentation for signature generation: * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js] * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers] * * _Available since v4.3._ */ function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) { // Check the signature length // - case 65: r,s,v signature (standard) // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._ if (signature.length == 65) { bytes32 r; bytes32 s; uint8 v; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } return tryRecover(hash, v, r, s); } else if (signature.length == 64) { bytes32 r; bytes32 vs; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. assembly { r := mload(add(signature, 0x20)) vs := mload(add(signature, 0x40)) } return tryRecover(hash, r, vs); } else { return (address(0), RecoverError.InvalidSignatureLength); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature`. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, signature); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately. * * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures] * * _Available since v4.3._ */ function tryRecover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address, RecoverError) { bytes32 s; uint8 v; assembly { s := and(vs, 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) v := add(shr(255, vs), 27) } return tryRecover(hash, v, r, s); } /** * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately. * * _Available since v4.2._ */ function recover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, r, vs); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `v`, * `r` and `s` signature fields separately. * * _Available since v4.3._ */ function tryRecover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address, RecoverError) { // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines // the valid range for s in (301): 0 < s < secp256k1n ├╖ 2 + 1, and for v in (302): v Γêê {27, 28}. Most // signatures from current libraries generate a unique signature with an s-value in the lower half order. // // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept // these malleable signatures as well. if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) { return (address(0), RecoverError.InvalidSignatureS); } if (v != 27 && v != 28) { return (address(0), RecoverError.InvalidSignatureV); } // If the signature is valid (and not malleable), return the signer address address signer = ecrecover(hash, v, r, s); if (signer == address(0)) { return (address(0), RecoverError.InvalidSignature); } return (signer, RecoverError.NoError); } /** * @dev Overload of {ECDSA-recover} that receives the `v`, * `r` and `s` signature fields separately. */ function recover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, v, r, s); _throwError(error); return recovered; } /** * @dev Returns an Ethereum Signed Message, created from a `hash`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) { // 32 is the length in bytes of hash, // enforced by the type signature above return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)); } /** * @dev Returns an Ethereum Signed Message, created from `s`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s)); } /** * @dev Returns an Ethereum Signed Typed Data, created from a * `domainSeparator` and a `structHash`. This produces hash corresponding * to the one signed with the * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] * JSON-RPC method as part of EIP-712. * * See {recover}. */ function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash)); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./ECDSA.sol"; /** * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data. * * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible, * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding * they need in their contracts using a combination of `abi.encode` and `keccak256`. * * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA * ({_hashTypedDataV4}). * * The implementation of the domain separator was designed to be as efficient as possible while still properly updating * the chain id to protect against replay attacks on an eventual fork of the chain. * * NOTE: This contract implements the version of the encoding known as "v4", as implemented by the JSON RPC method * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask]. * * _Available since v3.4._ */ abstract contract EIP712 { /* solhint-disable var-name-mixedcase */ // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to // invalidate the cached domain separator if the chain id changes. bytes32 private immutable _CACHED_DOMAIN_SEPARATOR; uint256 private immutable _CACHED_CHAIN_ID; address private immutable _CACHED_THIS; bytes32 private immutable _HASHED_NAME; bytes32 private immutable _HASHED_VERSION; bytes32 private immutable _TYPE_HASH; /* solhint-enable var-name-mixedcase */ /** * @dev Initializes the domain separator and parameter caches. * * The meaning of `name` and `version` is specified in * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]: * * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol. * - `version`: the current major version of the signing domain. * * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart * contract upgrade]. */ constructor(string memory name, string memory version) { bytes32 hashedName = keccak256(bytes(name)); bytes32 hashedVersion = keccak256(bytes(version)); bytes32 typeHash = keccak256( "EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)" ); _HASHED_NAME = hashedName; _HASHED_VERSION = hashedVersion; _CACHED_CHAIN_ID = block.chainid; _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion); _CACHED_THIS = address(this); _TYPE_HASH = typeHash; } /** * @dev Returns the domain separator for the current chain. */ function _domainSeparatorV4() internal view returns (bytes32) { if (address(this) == _CACHED_THIS && block.chainid == _CACHED_CHAIN_ID) { return _CACHED_DOMAIN_SEPARATOR; } else { return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION); } } function _buildDomainSeparator( bytes32 typeHash, bytes32 nameHash, bytes32 versionHash ) private view returns (bytes32) { return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this))); } /** * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this * function returns the hash of the fully encoded EIP712 message for this domain. * * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example: * * ```solidity * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode( * keccak256("Mail(address to,string contents)"), * mailTo, * keccak256(bytes(mailContents)) * ))); * address signer = ECDSA.recover(digest, signature); * ``` */ function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) { return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } }
// SPDX-License-Identifier: MIT import "./IERC20.sol"; import "./IERC20Metadata.sol"; import "./Context.sol"; pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin Contracts guidelines: functions revert * instead returning `false` on failure. This behavior is nonetheless * conventional and does not conflict with the expectations of ERC20 * applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20, IERC20Metadata { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * The default value of {decimals} is 18. To select a different value for * {decimals} you should overload it. * * All two of these values are immutable: they can only be set once during * construction. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override(IERC20,IERC20Metadata) returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override(IERC20,IERC20Metadata) returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5.05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless this function is * overridden; * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual override(IERC20,IERC20Metadata) returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `recipient` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address recipient, uint256 amount) public virtual override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { _approve(_msgSender(), spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * Requirements: * * - `sender` and `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. * - the caller must have allowance for ``sender``'s tokens of at least * `amount`. */ function transferFrom( address sender, address recipient, uint256 amount ) public virtual override returns (bool) { _transfer(sender, recipient, amount); uint256 currentAllowance = _allowances[sender][_msgSender()]; require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance"); unchecked { _approve(sender, _msgSender(), currentAllowance - amount); } return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { uint256 currentAllowance = _allowances[_msgSender()][spender]; require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); unchecked { _approve(_msgSender(), spender, currentAllowance - subtractedValue); } return true; } /** * @dev Moves `amount` of tokens from `sender` to `recipient`. * * This internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `sender` cannot be the zero address. * - `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. */ function _transfer( address sender, address recipient, uint256 amount ) internal virtual { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(sender, recipient, amount); uint256 senderBalance = _balances[sender]; require(senderBalance >= amount, "ERC20: transfer amount exceeds balance"); unchecked { _balances[sender] = senderBalance - amount; } _balances[recipient] += amount; emit Transfer(sender, recipient, amount); _afterTokenTransfer(sender, recipient, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; _balances[account] += amount; emit Transfer(address(0), account, amount); _afterTokenTransfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); unchecked { _balances[account] = accountBalance - amount; } _totalSupply -= amount; emit Transfer(account, address(0), amount); _afterTokenTransfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve( address owner, address spender, uint256 amount ) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 amount ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * has been transferred to `to`. * - when `from` is zero, `amount` tokens have been minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens have been burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 amount ) internal virtual {} }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./ERC20.sol"; pragma solidity ^0.8.0; /** * @dev Extension of {ERC20} that allows token holders to destroy both their own * tokens and those that they have an allowance for, in a way that can be * recognized off-chain (via event analysis). */ abstract contract ERC20Burnable is Context, ERC20 { /** * @dev Destroys `amount` tokens from the caller. * * See {ERC20-_burn}. */ function burn(uint256 amount) public virtual { _burn(_msgSender(), amount); } /** * @dev Destroys `amount` tokens from `account`, deducting from the caller's * allowance. * * See {ERC20-_burn} and {ERC20-allowance}. * * Requirements: * * - the caller must have allowance for ``accounts``'s tokens of at least * `amount`. */ function burnFrom(address account, uint256 amount) public virtual { uint256 currentAllowance = allowance(account, _msgSender()); require(currentAllowance >= amount, "ERC20: burn amount exceeds allowance"); unchecked { _approve(account, _msgSender(), currentAllowance - amount); } _burn(account, amount); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IERC20Permit.sol"; import "./ERC20.sol"; import "./EIP712.sol"; import "./Counters.sol"; /** * @dev Implementation of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. * * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't * need to send a transaction, and thus is not required to hold Ether at all. * * _Available since v3.4._ */ abstract contract ERC20Permit is ERC20, IERC20Permit, EIP712 { using Counters for Counters.Counter; mapping(address => Counters.Counter) private _nonces; // solhint-disable-next-line var-name-mixedcase bytes32 private immutable _PERMIT_TYPEHASH = keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)"); /** * @dev Initializes the {EIP712} domain separator using the `name` parameter, and setting `version` to `"1"`. * * It's a good idea to use the same `name` that is defined as the ERC20 token name. */ constructor(string memory name) EIP712(name, "1") {} /** * @dev See {IERC20Permit-permit}. */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) public virtual override { require(block.timestamp <= deadline, "ERC20Permit: expired deadline"); bytes32 structHash = keccak256(abi.encode(_PERMIT_TYPEHASH, owner, spender, value, _useNonce(owner), deadline)); bytes32 hash = _hashTypedDataV4(structHash); address signer = ECDSA.recover(hash, v, r, s); require(signer == owner, "ERC20Permit: invalid signature"); _approve(owner, spender, value); } /** * @dev See {IERC20Permit-nonces}. */ function nonces(address owner) public view virtual override returns (uint256) { return _nonces[owner].current(); } /** * @dev See {IERC20Permit-DOMAIN_SEPARATOR}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view override returns (bytes32) { return _domainSeparatorV4(); } /** * @dev "Consume a nonce": return the current value and increment. * * _Available since v4.1._ */ function _useNonce(address owner) internal virtual returns (uint256 current) { Counters.Counter storage nonce = _nonces[owner]; current = nonce.current(); nonce.increment(); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev External interface of AccessControl declared to support ERC165 detection. */ interface IAccessControl { /** * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` * * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite * {RoleAdminChanged} not being emitted signaling this. * * _Available since v3.1._ */ event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); /** * @dev Emitted when `account` is granted `role`. * * `sender` is the account that originated the contract call, an admin role * bearer except when using {AccessControl-_setupRole}. */ event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Emitted when `account` is revoked `role`. * * `sender` is the account that originated the contract call: * - if using `revokeRole`, it is the admin role bearer * - if using `renounceRole`, it is the role bearer (i.e. `account`) */ event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) external view returns (bool); /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {AccessControl-_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) external view returns (bytes32); /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) external; /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) external; /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) external; }
// ___ __ // / | _____________ ____ / /_ // / /| | / ___/ ___/ _ \/ __ \/ __/ // / ___ |(__ |__ ) __/ / / / /_ // /_/ |_/____/____/\___/_/ /_/\__/ // // 2022 - Assent Protocol // SPDX-License-Identifier: MIT pragma solidity ^0.8.10; // Shorten version with only functions needed for the masterchef interface IAssentVIP { function isVIP() external view returns(bool result); function getFarmsDepFeeReduction(address _user) external view returns(uint reduction); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { function name() external view returns (string memory); function symbol() external view returns (string memory); function decimals() external view returns (uint8); 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); event Transfer(address indexed from, address indexed to, uint256 value); event Approval(address indexed owner, address indexed spender, uint256 value); }
// SPDX-License-Identifier: MIT import "./IERC20.sol"; pragma solidity ^0.8.0; /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.0 (token/ERC20/extensions/draft-IERC20Permit.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. * * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't * need to send a transaction, and thus is not required to hold Ether at all. */ interface IERC20Permit { /** * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens, * given ``owner``'s signed approval. * * IMPORTANT: The same issues {IERC20-approve} has related to transaction * ordering also apply here. * * Emits an {Approval} event. * * Requirements: * * - `spender` cannot be the zero address. * - `deadline` must be a timestamp in the future. * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` * over the EIP712-formatted function arguments. * - the signature must use ``owner``'s current nonce (see {nonces}). * * For more information on the signature format, see the * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP * section]. */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; /** * @dev Returns the current nonce for `owner`. This value must be * included whenever a signature is generated for {permit}. * * Every successful call to {permit} increases ``owner``'s nonce by one. This * prevents a signature from being used multiple times. */ function nonces(address owner) external view returns (uint256); /** * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view returns (bytes32); }
// SPDX-License-Identifier: MIT pragma solidity 0.8.11; import "./IERC20.sol"; interface IMultipleRewards { // rewarder type enum RewarderType {notdefined, sharedistribution, boost, partnership} // 0, 1, 2, 3 function onASNTReward( uint256 pid, address user, uint256 newLpAmount ) external; function pendingTokens(uint256 pid, address user) external view returns (uint256 pending); function rewardToken() external view returns (IERC20); function poolRewardsPerSec(uint256 _pid) external view returns (uint256); function getPoolInfo(uint256 _pid) external view returns (uint256 allocPoint, uint256 lastRewardTime, uint256 accTokenPerShare, uint256 rewardStartTime, uint256 rewardEndTime, RewarderType rewarderType); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; interface IReferral { /** * @dev Record referral. */ function recordReferral(address user, address referrer) external; /** * @dev Record referral commission. */ function recordReferralCommission(address referrer, uint256 commission) external; /** * @dev Get the referrer address that referred the user. */ function getReferrer(address user) external view returns (address); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.0 (access/Ownable.sol) pragma solidity ^0.8.0; import "./Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./Context.sol"; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { require(!paused(), "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { require(paused(), "Pausable: not paused"); _; } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ 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; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IERC20.sol"; import "./Address.sol"; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { 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)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' 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) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"contract ASNTToken","name":"_ASNT","type":"address"},{"internalType":"uint256","name":"_ASNTPerSec","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ASNTMaxSupplyReached","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"contract IReferral","name":"newAddress","type":"address"}],"name":"ASNTReferralUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"allocPoint","type":"uint256"},{"indexed":true,"internalType":"contract IERC20","name":"lpToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"depositFeeRate","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"harvestInterval","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"harvestFeeInterval","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"harvestFeeBP","type":"uint256"},{"indexed":true,"internalType":"contract IMultipleRewards[]","name":"rewarders","type":"address[]"}],"name":"Add","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":false,"internalType":"uint256","name":"previousAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"AllocPointsUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EmergencyWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":false,"internalType":"uint256","name":"previousValue","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"EmissionRateUpdated","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":true,"internalType":"address","name":"referrer","type":"address"},{"indexed":false,"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"ReferralCommissionPaid","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"previousAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"ReferralRateUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountLockedUp","type":"uint256"}],"name":"RewardLockedUp","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"RewardsMinted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"allocPoint","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"depositFeeRate","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"harvestInterval","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"harvestFeeInterval","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"harvestFeeBP","type":"uint256"},{"indexed":true,"internalType":"contract IMultipleRewards[]","name":"rewarders","type":"address[]"}],"name":"Set","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"},{"indexed":true,"internalType":"address","name":"newAddress","type":"address"}],"name":"SetASNTShareAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldPercent","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newPercent","type":"uint256"}],"name":"SetASNTSharePercent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"},{"indexed":true,"internalType":"address","name":"newAddress","type":"address"}],"name":"SetFeeAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lastRewardTimestamp","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lpSupply","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"accASNTPerShare","type":"uint256"}],"name":"UpdatePool","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"contract IAssentVIP","name":"previousAddress","type":"address"},{"indexed":true,"internalType":"contract IAssentVIP","name":"newAddress","type":"address"}],"name":"VIPUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"ASNT","outputs":[{"internalType":"contract ASNTToken","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ASNTPerSec","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ASNTReferral","outputs":[{"internalType":"contract IReferral","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ASNTShareAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ASNTSharePercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BURN_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAXFEEREDUCTION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAXIMUM_DEPOSIT_FEE_RATE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAXIMUM_HARVESTFEE_INTERVAL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAXIMUM_HARVEST_FEE_RATE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAXIMUM_HARVEST_INTERVAL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAXIMUM_REWARDERS","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAXIMUM_SHARE_RATE","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_EMISSION_RATE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MULTIPLIER","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_allocPoint","type":"uint256"},{"internalType":"contract IERC20","name":"_lpToken","type":"address"},{"internalType":"uint256","name":"_depositFeeRate","type":"uint256"},{"internalType":"uint256","name":"_harvestInterval","type":"uint256"},{"internalType":"uint256","name":"_harvestFeeInterval","type":"uint256"},{"internalType":"uint256","name":"_harvestFeeRate","type":"uint256"},{"internalType":"contract IMultipleRewards[]","name":"_rewarders","type":"address[]"}],"name":"add","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"canHarvest","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_referrer","type":"address"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feeAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"getFarmsDepFeeReduction","outputs":[{"internalType":"uint256","name":"_farmDepFeeReduction","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"_depositfeeRate","type":"uint256"}],"name":"getUserDepositFee","outputs":[{"internalType":"uint256","name":"newDepositFeeRate","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_pids","type":"uint256[]"},{"internalType":"address","name":"_referrer","type":"address"}],"name":"harvestMany","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"massUpdatePools","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"noHarvestFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"pendingTokens","outputs":[{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"string[]","name":"symbols","type":"string[]"},{"internalType":"uint256[]","name":"decimals","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolInfo","outputs":[{"internalType":"contract IERC20","name":"lpToken","type":"address"},{"internalType":"uint256","name":"allocPoint","type":"uint256"},{"internalType":"uint256","name":"lastRewardTimestamp","type":"uint256"},{"internalType":"uint256","name":"accASNTPerShare","type":"uint256"},{"internalType":"uint256","name":"depositFeeRate","type":"uint256"},{"internalType":"uint256","name":"harvestInterval","type":"uint256"},{"internalType":"uint256","name":"harvestFeeInterval","type":"uint256"},{"internalType":"uint256","name":"harvestFeeRate","type":"uint256"},{"internalType":"uint256","name":"totalLp","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"poolRewarders","outputs":[{"internalType":"address[]","name":"rewarders","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"poolRewardsDatas","outputs":[{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"string[]","name":"symbols","type":"string[]"},{"internalType":"uint256[]","name":"decimals","type":"uint256[]"},{"internalType":"uint256[]","name":"rewardsPerSec","type":"uint256[]"},{"internalType":"uint256[]","name":"rewardStartTime","type":"uint256[]"},{"internalType":"uint256[]","name":"rewardEndTime","type":"uint256[]"},{"internalType":"enum IMultipleRewards.RewarderType[]","name":"rewarderType","type":"uint8[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"pid","type":"uint256"}],"name":"poolTotalLp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"referralCommissionRate","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_allocPoint","type":"uint256"},{"internalType":"uint256","name":"_depositFeeRate","type":"uint256"},{"internalType":"uint256","name":"_harvestInterval","type":"uint256"},{"internalType":"uint256","name":"_harvestFeeInterval","type":"uint256"},{"internalType":"uint256","name":"_harvestFeeRate","type":"uint256"},{"internalType":"contract IMultipleRewards[]","name":"_rewarders","type":"address[]"}],"name":"set","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IReferral","name":"_ASNTReferral","type":"address"}],"name":"setASNTReferral","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_ASNTShareAddress","type":"address"}],"name":"setASNTShareAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newASNTSharePercent","type":"uint256"}],"name":"setASNTSharePercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_feeAddress","type":"address"}],"name":"setFeeAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_referralCommissionRate","type":"uint16"}],"name":"setReferralCommissionRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IAssentVIP","name":"_vip","type":"address"}],"name":"setVIP","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_startTimestamp","type":"uint256"}],"name":"startFarmingAtTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startFarmingNow","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalASNTInPools","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalAllocPoint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalLockedUpRewards","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":"_pid","type":"uint256"},{"internalType":"uint256","name":"_allocPoint","type":"uint256"}],"name":"updateAllocPoint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_ASNTPerSec","type":"uint256"}],"name":"updateEmissionRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"updatePool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"userInfo","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"rewardDebt","type":"uint256"},{"internalType":"uint256","name":"rewardLockedUp","type":"uint256"},{"internalType":"uint256","name":"nextHarvestUntil","type":"uint256"},{"internalType":"uint256","name":"noHarvestFeeAfter","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vip","outputs":[{"internalType":"contract IAssentVIP","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60a06040526008805461ffff60a01b1916601960a21b1790553480156200002557600080fd5b506040516200557a3803806200557a833981016040819052620000489162000156565b620000533362000106565b6001805562000067426301e1338062000192565b6006556001600160a01b0382166080526802b5e3af16b1880000811115620000d55760405162461bcd60e51b815260206004820152601c60248201527f456d697373696f6e203e206d617820656d697373696f6e207261746500000000604482015260640160405180910390fd5b600255506000600c55600a8054336001600160a01b03199182168117909255600b80549091169091179055620001b9565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600080604083850312156200016a57600080fd5b82516001600160a01b03811681146200018257600080fd5b6020939093015192949293505050565b60008219821115620001b457634e487b7160e01b600052601160045260246000fd5b500190565b60805161532e6200024c6000396000818161046c01528181610b4901528181610b9d01528181610c41015281816116c20152818161198701528181613277015281816132cb0152818161336f01528181613aca015281816141860152818161420c015281816142c4015281816143d10152818161446e015281816144f901528181614533015261467c015261532e6000f3fe608060405234801561001057600080fd5b50600436106103425760003560e01c8063853bab71116101b8578063d30ef61b11610104578063f2fde38b116100a2578063fccc28131161007c578063fccc281314610786578063fdc8e0fe1461078f578063fed13a2214610798578063ffcd4263146107ab57600080fd5b8063f2fde38b14610751578063f4c67a8414610764578063f500ce741461077357600080fd5b8063e6097810116100de578063e60978101461070d578063e6fd48bc14610715578063eddf96521461071e578063eff8976b1461073157600080fd5b8063d30ef61b146106ef578063de73149d146105ce578063e54807781461070457600080fd5b80638ed7b64a116101715780639fe3259d1161014b5780639fe3259d146106a3578063a6d5fe41146106b6578063b6431279146106c9578063c3508c25146106dc57600080fd5b80638ed7b64a1461060f57806393f1a40b146106225780639e1ea7df1461069057600080fd5b8063853bab71146105a85780638705fcd4146105bb5780638b4de71a146105ce5780638da5cb5b146105d85780638db0809d146105e95780638dbdbe6d146105fc57600080fd5b8063412753581161029257806355dbc82611610230578063654c9ece1161020a578063654c9ece1461056c578063715018a61461057f5780637a117d8114610587578063812c64f11461059a57600080fd5b806355dbc82614610548578063630b5ba11461055b57806363dc47a01461056357600080fd5b8063474fa6301161026c578063474fa6301461050a578063495a31b21461051357806351eb05a6146105225780635312ea8e1461053557600080fd5b806341275358146104d4578063436cc3d6146104e7578063441a3e70146104f757600080fd5b806317caf6f1116102ff5780632e6c998d116102d95780632e6c998d146104545780632f241a7b1461046757806339819b4d146104a6578063411d9201146104c157600080fd5b806317caf6f11461042057806327444b711461042957806329e1d2461461044c57600080fd5b806302650d8814610347578063059f8b161461035c578063081e3eda1461037e57806309281d3c146103865780630ba84cd2146103ac5780631526fe27146103bf575b600080fd5b61035a610355366004614afc565b6107ce565b005b61036b670de0b6b3a764000081565b6040519081526020015b60405180910390f35b60035461036b565b610399610394366004614b52565b610899565b6040516103759796959493929190614ca2565b61035a6103ba366004614b52565b611241565b6103d26103cd366004614b52565b61130f565b604080516001600160a01b03909a168a5260208a0198909852968801959095526060870193909352608086019190915260a085015260c084015260e083015261010082015261012001610375565b61036b60055481565b61043c610437366004614d7e565b611374565b6040519015158152602001610375565b61035a6113a3565b61043c610462366004614d7e565b61146b565b61048e7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610375565b6104ae600a81565b60405161ffff9091168152602001610375565b61036b6104cf366004614dae565b6114d2565b600b5461048e906001600160a01b031681565b61036b6802b5e3af16b188000081565b61035a610505366004614dda565b611560565b61036b60075481565b61036b670b1a2bc2ec50000081565b61035a610530366004614b52565b61185a565b61035a610543366004614b52565b611892565b61035a610556366004614dfc565b611ae9565b61035a611c0d565b61036b600c5481565b61036b61057a366004614b52565b611c43565b61035a611c71565b61035a610595366004614e20565b611ca7565b61036b66b1a2bc2ec5000081565b600d5461048e906001600160a01b031681565b61035a6105c9366004614e20565b611da3565b61036b6206978081565b6000546001600160a01b031661048e565b61035a6105f7366004614e3d565b611e95565b61035a61060a366004614ec2565b6123fc565b61035a61061d366004614e20565b612438565b610668610630366004614d7e565b600460208181526000938452604080852090915291835291208054600182015460028301546003840154939094015491939092909185565b604080519586526020860194909452928401919091526060830152608082015260a001610375565b61035a61069e366004614e20565b6124b8565b600a5461048e906001600160a01b031681565b61035a6106c4366004614ef0565b6126a2565b61035a6106d7366004614b52565b612adb565b60085461048e906001600160a01b031681565b6008546104ae90600160a01b900461ffff1681565b61036b60095481565b6104ae606481565b61036b60065481565b61035a61072c366004614dda565b612b8f565b61074461073f366004614b52565b612ca1565b6040516103759190614f4c565b61035a61075f366004614e20565b612dbb565b61036b67016345785d8a000081565b61036b610781366004614e20565b612e56565b61048e61dead81565b61036b60025481565b61035a6107a6366004614b52565b612ee0565b6107be6107b9366004614d7e565b612fa3565b6040516103759493929190614f5f565b600260015414156107fa5760405162461bcd60e51b81526004016107f190614fac565b60405180910390fd5b6002600155601e8211156108505760405162461bcd60e51b815260206004820152601f60248201527f68617276657374206d616e793a20746f6f206d616e7920706f6f6c206964730060448201526064016107f1565b60005b8281101561088f5761087f84848381811061087057610870614fe3565b90506020020135600084613806565b6108888161500f565b9050610853565b5050600180555050565b60608060608060608060608760038054905081106108c95760405162461bcd60e51b81526004016107f19061502a565b600060038a815481106108de576108de614fe3565b90600052602060002090600a02019050806009018054905060016109029190615057565b6001600160401b038111156109195761091961506f565b604051908082528060200260200182016040528015610942578160200160208202803683370190505b506009820154909950610956906001615057565b6001600160401b0381111561096d5761096d61506f565b6040519080825280602002602001820160405280156109a057816020015b606081526020019060019003908161098b5790505b5060098201549098506109b4906001615057565b6001600160401b038111156109cb576109cb61506f565b6040519080825280602002602001820160405280156109f4578160200160208202803683370190505b506009820154909750610a08906001615057565b6001600160401b03811115610a1f57610a1f61506f565b604051908082528060200260200182016040528015610a48578160200160208202803683370190505b506009820154909650610a5c906001615057565b6001600160401b03811115610a7357610a7361506f565b604051908082528060200260200182016040528015610a9c578160200160208202803683370190505b506009820154909550610ab0906001615057565b6001600160401b03811115610ac757610ac761506f565b604051908082528060200260200182016040528015610af0578160200160208202803683370190505b506009820154909450610b04906001615057565b6001600160401b03811115610b1b57610b1b61506f565b604051908082528060200260200182016040528015610b44578160200160208202803683370190505b5092507f000000000000000000000000000000000000000000000000000000000000000089600081518110610b7b57610b7b614fe3565b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa158015610bf9573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610c219190810190615085565b88600081518110610c3457610c34614fe3565b60200260200101819052507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c9d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cc19190615126565b60ff1687600081518110610cd757610cd7614fe3565b6020908102919091010152600c546103e890600090610cf69083615149565b905081600554826002548660010154610d0f9190615160565b610d199190615160565b610d23919061517f565b610d2d919061517f565b88600081518110610d4057610d40614fe3565b60200260200101818152505060005b600984015481101561123157836009018181548110610d7057610d70614fe3565b600091825260209182902001546040805163f7c618c160e01b815290516001600160a01b039092169263f7c618c1926004808401938290030181865afa158015610dbe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610de291906151a1565b8c610dee836001615057565b81518110610dfe57610dfe614fe3565b60200260200101906001600160a01b031690816001600160a01b031681525050836009018181548110610e3357610e33614fe3565b600091825260209182902001546040805163f7c618c160e01b815290516001600160a01b039092169263f7c618c1926004808401938290030181865afa158015610e81573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ea591906151a1565b6001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa158015610ee2573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610f0a9190810190615085565b8b610f16836001615057565b81518110610f2657610f26614fe3565b6020026020010181905250836009018181548110610f4657610f46614fe3565b600091825260209182902001546040805163f7c618c160e01b815290516001600160a01b039092169263f7c618c1926004808401938290030181865afa158015610f94573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fb891906151a1565b6001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ff5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110199190615126565b60ff168a611028836001615057565b8151811061103857611038614fe3565b60200260200101818152505083600901818154811061105957611059614fe3565b600091825260209091200154604051631197a07b60e21b8152600481018f90526001600160a01b039091169063465e81ec90602401602060405180830381865afa1580156110ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110cf91906151be565b896110db836001615057565b815181106110eb576110eb614fe3565b60200260200101818152505083600901818154811061110c5761110c614fe3565b600091825260209091200154604051632f380b3560e01b8152600481018f90526001600160a01b0390911690632f380b359060240160c060405180830381865afa15801561115e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061118291906151d7565b919450925090508a611195856001615057565b815181106111a5576111a5614fe3565b602002602001018a8560016111ba9190615057565b815181106111ca576111ca614fe3565b602002602001018a8660016111df9190615057565b815181106111ef576111ef614fe3565b6020026020010183600381111561120857611208614c8c565b600381111561121957611219614c8c565b905292909252505261122a8161500f565b9050610d4f565b5050505050919395979092949650565b6000546001600160a01b0316331461126b5760405162461bcd60e51b81526004016107f190615230565b6802b5e3af16b18800008111156112c45760405162461bcd60e51b815260206004820152601c60248201527f456d697373696f6e203e206d617820656d697373696f6e20726174650000000060448201526064016107f1565b6112cc613c4c565b600254604080519182526020820183905233917feedc6338c9c1ad8f3cd6c90dd09dbe98dbd57e610d3e59a17996d07acb0d9511910160405180910390a2600255565b6003818154811061131f57600080fd5b60009182526020909120600a90910201805460018201546002830154600384015460048501546005860154600687015460078801546008909801546001600160a01b0390971698509496939592949193909289565b60008281526004602081815260408084206001600160a01b038616855290915290912001544210155b92915050565b6000546001600160a01b031633146113cd5760405162461bcd60e51b81526004016107f190615230565b60065442106114155760405162461bcd60e51b815260206004820152601460248201527319985c9b48185b1c9958591e481cdd185c9d195960621b60448201526064016107f1565b60035460005b818110156114635760006003828154811061143857611438614fe3565b90600052602060002090600a02019050428160020181905550508061145c9061500f565b905061141b565b505042600655565b600354600090839081106114915760405162461bcd60e51b81526004016107f19061502a565b60008481526004602090815260408083206001600160a01b0387168452909152902060065442108015906114c9575080600301544210155b95945050505050565b6000806114de84612e56565b9050670b1a2bc2ec5000008111156115315760405162461bcd60e51b815260206004820152601660248201527508ccaca40e4cac8eac6e8d2dedc40e8dede40d0d2ced60531b60448201526064016107f1565b670de0b6b3a76400006115448282615149565b61154e9085615160565b611558919061517f565b949350505050565b600260015414156115835760405162461bcd60e51b81526004016107f190614fac565b6002600155600354829081106115ab5760405162461bcd60e51b81526004016107f19061502a565b6000600384815481106115c0576115c0614fe3565b6000918252602080832087845260048252604080852033865290925292208054600a90920290920192508411156116395760405162461bcd60e51b815260206004820181905260248201527f77697468647261773a207573657220616d6f756e74206e6f7420656e6f75676860448201526064016107f1565b838260080154101561168d5760405162461bcd60e51b815260206004820152601f60248201527f77697468647261773a20706f6f6c20746f74616c206e6f7420656e6f7567680060448201526064016107f1565b61169685613c72565b61169f85613e3b565b831561172257838160000160008282546116b99190615149565b909155505081547f00000000000000000000000000000000000000000000000000000000000000006001600160a01b039081169116141561170c5783600960008282546117069190615149565b90915550505b8154611722906001600160a01b03163386614091565b60038201548154670de0b6b3a76400009161173c91615160565b611746919061517f565b600182015560005b60098301548110156117f75782600901818154811061176f5761176f614fe3565b6000918252602090912001548254604051636b6c904f60e11b81526004810189905233602482015260448101919091526001600160a01b039091169063d6d9209e90606401600060405180830381600087803b1580156117ce57600080fd5b505af11580156117e2573d6000803e3d6000fd5b50505050806117f09061500f565b905061174e565b50831561181857838260080160008282546118129190615149565b90915550505b604051848152859033907ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b5689060200160405180910390a3505060018055505050565b6002600154141561187d5760405162461bcd60e51b81526004016107f190614fac565b600260015561188b81613c72565b5060018055565b600260015414156118b55760405162461bcd60e51b81526004016107f190614fac565b60026001819055506000600382815481106118d2576118d2614fe3565b6000918252602080832085845260048252604080852033865290925292208054600a9290920290920160088101549093508111156119645760405162461bcd60e51b815260206004820152602960248201527f656d657267656e63792077697468647261773a20706f6f6c20746f74616c206e6044820152680dee840cadcdeeaced60bb1b60648201526084016107f1565b6000808355600183018190556002830181905560038301819055600483015582547f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03908116911614156119d15780600960008282546119cb9190615149565b90915550505b82546119e7906001600160a01b03163383614091565b60005b6009840154811015611a8e57836009018181548110611a0b57611a0b614fe3565b6000918252602082200154604051636b6c904f60e11b81526004810188905233602482015260448101929092526001600160a01b03169063d6d9209e90606401600060405180830381600087803b158015611a6557600080fd5b505af1158015611a79573d6000803e3d6000fd5b5050505080611a879061500f565b90506119ea565b5080836008016000828254611aa39190615149565b9091555050604051818152849033907fbb757047c2b5f3974fe26b7c10f732e7bce710b0952a71082702781e62ae05959060200160405180910390a35050600180555050565b6000546001600160a01b03163314611b135760405162461bcd60e51b81526004016107f190615230565b6103e88161ffff161115611ba05760405162461bcd60e51b815260206004820152604860248201527f736574526566657272616c436f6d6d697373696f6e526174653a20696e76616c60448201527f696420726566657272616c20636f6d6d697373696f6e207261746520626173696064820152677320706f696e747360c01b608482015260a4016107f1565b60085460408051600160a01b90920461ffff90811683528316602083015233917fb5e94d2c884c9803a63d58f2591a3d5eb358fe8d2a580ebefa85ca1f6b5d8a21910160405180910390a26008805461ffff909216600160a01b0261ffff60a01b19909216919091179055565b60026001541415611c305760405162461bcd60e51b81526004016107f190614fac565b6002600155611c3d613c4c565b60018055565b600060038281548110611c5857611c58614fe3565b90600052602060002090600a0201600801549050919050565b6000546001600160a01b03163314611c9b5760405162461bcd60e51b81526004016107f190615230565b611ca560006140f9565b565b600a546001600160a01b03163314611d015760405162461bcd60e51b815260206004820152601e60248201527f73657441534e545368617265416464726573733a20464f5242494444454e000060448201526064016107f1565b6001600160a01b038116611d575760405162461bcd60e51b815260206004820152601960248201527f73657441534e545368617265416464726573733a205a45524f0000000000000060448201526064016107f1565b600a80546001600160a01b0319166001600160a01b03831690811790915560405133907fabe35ad89ab3a077347358c37e5e4e9c5283f4329afa084b943e56a4fba87a5d90600090a350565b600b546001600160a01b03163314611dfd5760405162461bcd60e51b815260206004820152601860248201527f736574466565416464726573733a20464f5242494444454e000000000000000060448201526064016107f1565b6001600160a01b038116611e495760405162461bcd60e51b8152602060048201526013602482015272736574466565416464726573733a205a45524f60681b60448201526064016107f1565b600b80546001600160a01b0319166001600160a01b03831690811790915560405133907fd44190acf9d04bdb5d3a1aafff7e6dee8b40b93dfb8c5d3f0eea4b9f4539c3f790600090a350565b6000546001600160a01b03163314611ebf5760405162461bcd60e51b81526004016107f190615230565b600a811115611f105760405162461bcd60e51b815260206004820152601760248201527f6164643a20746f6f206d616e792072657761726465727300000000000000000060448201526064016107f1565b67016345785d8a0000831115611f685760405162461bcd60e51b815260206004820152601960248201527f6164643a20686172766573742066656520746f6f20686967680000000000000060448201526064016107f1565b62069780841115611fc55760405162461bcd60e51b815260206004820152602160248201527f6164643a20696e76616c696420686172766573742066656520696e74657276616044820152601b60fa1b60648201526084016107f1565b66b1a2bc2ec5000086111561201c5760405162461bcd60e51b815260206004820152601960248201527f6164643a206465706f7369742066656520746f6f20686967680000000000000060448201526064016107f1565b6206978085111561206f5760405162461bcd60e51b815260206004820152601d60248201527f6164643a20696e76616c6964206861727665737420696e74657276616c00000060448201526064016107f1565b60005b81811015612207576120aa83838381811061208f5761208f614fe3565b90506020020160208101906120a49190614e20565b3b151590565b6120f65760405162461bcd60e51b815260206004820152601e60248201527f6164643a207265776172646572206d75737420626520636f6e7472616374000060448201526064016107f1565b600083838381811061210a5761210a614fe3565b905060200201602081019061211f9190614e20565b600354604051632f380b3560e01b81526001600160a01b039290921691632f380b35916121529160040190815260200190565b60c060405180830381865afa15801561216f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061219391906151d7565b5050505091505080600014156121f65760405162461bcd60e51b815260206004820152602260248201527f506f6f6c20646f65736e27742065786973742079657420696e2072657761726460448201526132b960f11b60648201526084016107f1565b506122008161500f565b9050612072565b50612210613c4c565b6000600654421161222357600654612225565b425b905088600560008282546122399190615057565b9250508190555060036040518061014001604052808a6001600160a01b031681526020018b8152602001838152602001600081526020018981526020018881526020018781526020018681526020016000815260200185858080602002602001604051908101604052809392919081815260200183836020028082843760009201829052509390945250508354600180820186559482526020918290208451600a9092020180546001600160a01b0319166001600160a01b03909216919091178155838201519481019490945560408301516002850155606083015160038501556080830151600485015560a0830151600585015560c0830151600685015560e083015160078501556101008301516008850155610120830151805193949361236c9350600985019291909101906149cf565b505050828260405161237f929190615265565b6040519081900390206003546001600160a01b038a16906123a290600190615149565b604080518d8152602081018c90529081018a905260608101899052608081018890527f79d6bbab8505f6163cf8a66cc1c57a2fc54232104ff48c1f77b6a212f95630739060a00160405180910390a4505050505050505050565b6002600154141561241f5760405162461bcd60e51b81526004016107f190614fac565b600260015561242f838383613806565b50506001805550565b6000546001600160a01b031633146124625760405162461bcd60e51b81526004016107f190615230565b600880546001600160a01b0319166001600160a01b03831690811790915560405190815233907fe9987fe60c8b88da0c9fb93c839cea3ab684f862db37f67254f8bd5905136cad9060200160405180910390a250565b6000546001600160a01b031633146124e25760405162461bcd60e51b81526004016107f190615230565b806001600160a01b03166361a475c86040518163ffffffff1660e01b8152600401602060405180830381865afa158015612520573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061254491906152a7565b6125855760405162461bcd60e51b8152602060048201526012602482015271139bdd0818481d9a5c0818dbdb9d1c9858dd60721b60448201526064016107f1565b604051633d40339d60e21b81523060048201526001600160a01b0382169063f500ce7490602401602060405180830381865afa1580156125c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125ed91906151be565b156126465760405162461bcd60e51b8152602060048201526024808201527f6765744661726d73446570466565526564756374696f6e2077726f6e6720616e60448201526339bbb2b960e11b60648201526084016107f1565b600d546040516001600160a01b038084169216907f8a7ac7a0c866ac5a3263a1594250b5bd136237d1f2b6b153a6da94838e8a028a90600090a3600d80546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146126cc5760405162461bcd60e51b81526004016107f190615230565b600354889081106126ef5760405162461bcd60e51b81526004016107f19061502a565b600a8211156127405760405162461bcd60e51b815260206004820152601760248201527f7365743a20746f6f206d616e792072657761726465727300000000000000000060448201526064016107f1565b67016345785d8a00008411156127985760405162461bcd60e51b815260206004820152601960248201527f7365743a20686172766573742066656520746f6f20686967680000000000000060448201526064016107f1565b620697808511156127f55760405162461bcd60e51b815260206004820152602160248201527f7365743a20696e76616c696420686172766573742066656520696e74657276616044820152601b60fa1b60648201526084016107f1565b66b1a2bc2ec5000087111561284c5760405162461bcd60e51b815260206004820152601960248201527f7365743a206465706f7369742066656520746f6f20686967680000000000000060448201526064016107f1565b6206978086111561289f5760405162461bcd60e51b815260206004820152601d60248201527f7365743a20696e76616c6964206861727665737420696e74657276616c00000060448201526064016107f1565b60005b8281101561291b576128bf84848381811061208f5761208f614fe3565b61290b5760405162461bcd60e51b815260206004820152601e60248201527f7365743a207265776172646572206d75737420626520636f6e7472616374000060448201526064016107f1565b6129148161500f565b90506128a2565b50612924613c4c565b8760038a8154811061293857612938614fe3565b90600052602060002090600a0201600101546005546129579190615149565b6129619190615057565b6005819055508760038a8154811061297b5761297b614fe3565b90600052602060002090600a0201600101819055508660038a815481106129a4576129a4614fe3565b90600052602060002090600a0201600401819055508560038a815481106129cd576129cd614fe3565b90600052602060002090600a020160050181905550828260038b815481106129f7576129f7614fe3565b90600052602060002090600a02016009019190612a15929190614a34565b508460038a81548110612a2a57612a2a614fe3565b90600052602060002090600a0201600601819055508360038a81548110612a5357612a53614fe3565b90600052602060002090600a0201600701819055508282604051612a78929190615265565b604080519182900382208a8352602083018a90529082018890526060820187905260808201869052908a907ffed2cc77dee8fe1b2013b777d01570b48d6cbd4da16e57081187be5e8250d4079060a00160405180910390a3505050505050505050565b6000546001600160a01b03163314612b055760405162461bcd60e51b81526004016107f190615230565b6064811115612b4e5760405162461bcd60e51b8152602060048201526015602482015274696e76616c69642070657263656e742076616c756560581b60448201526064016107f1565b600c5460408051918252602082018390527f4a4f678dddbe071b9725e5504e4d8b4e3aaf0793c7a43c7c2598a4942b6e38cf910160405180910390a1600c55565b6000546001600160a01b03163314612bb95760405162461bcd60e51b81526004016107f190615230565b612bc1613c4c565b336001600160a01b03167f802633c8d26237616d81bdac01bc40fcdf36e098832601582ec19d7e431c5ef360038481548110612bff57612bff614fe3565b90600052602060002090600a02016001015483604051612c29929190918252602082015260400190565b60405180910390a28060038381548110612c4557612c45614fe3565b90600052602060002090600a020160010154600554612c649190615149565b612c6e9190615057565b6005819055508060038381548110612c8857612c88614fe3565b90600052602060002090600a0201600101819055505050565b60035460609082908110612cc75760405162461bcd60e51b81526004016107f19061502a565b600060038481548110612cdc57612cdc614fe3565b90600052602060002090600a0201905080600901805490506001600160401b03811115612d0b57612d0b61506f565b604051908082528060200260200182016040528015612d34578160200160208202803683370190505b50925060005b6009820154811015612db357816009018181548110612d5b57612d5b614fe3565b9060005260206000200160009054906101000a90046001600160a01b0316848281518110612d8b57612d8b614fe3565b6001600160a01b0390921660209283029190910190910152612dac8161500f565b9050612d3a565b505050919050565b6000546001600160a01b03163314612de55760405162461bcd60e51b81526004016107f190615230565b6001600160a01b038116612e4a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016107f1565b612e53816140f9565b50565b600d546000906001600160a01b031615612ed857600d54604051633d40339d60e21b81526001600160a01b0384811660048301529091169063f500ce7490602401602060405180830381865afa158015612eb4573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061139d91906151be565b506000919050565b6000546001600160a01b03163314612f0a5760405162461bcd60e51b81526004016107f190615230565b6006544210612f525760405162461bcd60e51b815260206004820152601460248201527319985c9b48185b1c9958591e481cdd185c9d195960621b60448201526064016107f1565b60035460005b81811015612f9c57600060038281548110612f7557612f75614fe3565b600091825260209091206002600a909202010184905550612f958161500f565b9050612f58565b5050600655565b606080606080856003805490508110612fce5760405162461bcd60e51b81526004016107f19061502a565b600060038881548110612fe357612fe3614fe3565b600091825260208083208b84526004825260408085206001600160a01b038d16865290925292206003600a909202909201908101546008820154600283015492945090914211801561303457508015155b156130d657600084600201544261304b9190615149565b600c549091506103e8906000906130629083615149565b9050600082600554838a600101546002548861307e9190615160565b6130889190615160565b6130929190615160565b61309c919061517f565b6130a6919061517f565b9050846130bb670de0b6b3a764000083615160565b6130c5919061517f565b6130cf9087615057565b9550505050505b600083600201548460010154670de0b6b3a76400008587600001546130fb9190615160565b613105919061517f565b61310f9190615149565b6131199190615057565b600986015490915061312c906001615057565b6001600160401b038111156131435761314361506f565b60405190808252806020026020018201604052801561316c578160200160208202803683370190505b506009860154909a50613180906001615057565b6001600160401b038111156131975761319761506f565b6040519080825280602002602001820160405280156131ca57816020015b60608152602001906001900390816131b55790505b5060098601549099506131de906001615057565b6001600160401b038111156131f5576131f561506f565b60405190808252806020026020018201604052801561321e578160200160208202803683370190505b506009860154909750613232906001615057565b6001600160401b038111156132495761324961506f565b604051908082528060200260200182016040528015613272578160200160208202803683370190505b5097507f00000000000000000000000000000000000000000000000000000000000000008a6000815181106132a9576132a9614fe3565b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa158015613327573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261334f9190810190615085565b8960008151811061336257613362614fe3565b60200260200101819052507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156133cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133ef9190615126565b60ff168860008151811061340557613405614fe3565b602002602001018181525050808760008151811061342557613425614fe3565b60200260200101818152505060005b60098601548110156137f65785600901818154811061345557613455614fe3565b600091825260209182902001546040805163f7c618c160e01b815290516001600160a01b039092169263f7c618c1926004808401938290030181865afa1580156134a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134c791906151a1565b8b6134d3836001615057565b815181106134e3576134e3614fe3565b60200260200101906001600160a01b031690816001600160a01b03168152505085600901818154811061351857613518614fe3565b600091825260209182902001546040805163f7c618c160e01b815290516001600160a01b039092169263f7c618c1926004808401938290030181865afa158015613566573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061358a91906151a1565b6001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa1580156135c7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526135ef9190810190615085565b8a6135fb836001615057565b8151811061360b5761360b614fe3565b602002602001018190525085600901818154811061362b5761362b614fe3565b600091825260209182902001546040805163f7c618c160e01b815290516001600160a01b039092169263f7c618c1926004808401938290030181865afa158015613679573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061369d91906151a1565b6001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156136da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136fe9190615126565b60ff168961370d836001615057565b8151811061371d5761371d614fe3565b60200260200101818152505085600901818154811061373e5761373e614fe3565b60009182526020909120015460405160016232bd9d60e01b03198152600481018f90526001600160a01b038e811660248301529091169063ffcd426390604401602060405180830381865afa15801561379b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137bf91906151be565b886137cb836001615057565b815181106137db576137db614fe3565b60209081029190910101526137ef8161500f565b9050613434565b5050505050505092959194509250565b600354839081106138295760405162461bcd60e51b81526004016107f19061502a565b60006003858154811061383e5761383e614fe3565b600091825260208083208884526004825260408085203386529092529220600a909102909101915061386f86613c72565b60008511801561388957506008546001600160a01b031615155b80156138a057506001600160a01b03841661dead14155b80156138b457506001600160a01b03841615155b80156138c957506001600160a01b0384163314155b1561393457600854604051630c7f7b6b60e01b81523360048201526001600160a01b03868116602483015290911690630c7f7b6b90604401600060405180830381600087803b15801561391b57600080fd5b505af115801561392f573d6000803e3d6000fd5b505050505b61393d86613e3b565b8415613b175781546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa15801561398b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139af91906151be565b83549091506139c9906001600160a01b0316333089614149565b82546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015613a11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a3591906151be565b9050613a418282615149565b600485015490975015613aad576000613a5e3386600401546114d2565b90506000670de0b6b3a7640000613a75838b615160565b613a7f919061517f565b9050613a8b818a615149565b600b548754919a50613aaa916001600160a01b03908116911683614091565b50505b86836000016000828254613ac19190615057565b909155505083547f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0390811691161415613b14578660096000828254613b0e9190615057565b90915550505b50505b60038201548154670de0b6b3a764000091613b3191615160565b613b3b919061517f565b600182015560005b6009830154811015613bec57826009018181548110613b6457613b64614fe3565b6000918252602090912001548254604051636b6c904f60e11b8152600481018a905233602482015260448101919091526001600160a01b039091169063d6d9209e90606401600060405180830381600087803b158015613bc357600080fd5b505af1158015613bd7573d6000803e3d6000fd5b5050505080613be59061500f565b9050613b43565b508415613c0d5784826008016000828254613c079190615057565b90915550505b604051858152869033907f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a159060200160405180910390a3505050505050565b60005b600354811015612e5357613c6281613c72565b613c6b8161500f565b9050613c4f565b60035481908110613c955760405162461bcd60e51b81526004016107f19061502a565b600060038381548110613caa57613caa614fe3565b90600052602060002090600a0201905080600201544211613cca57505050565b6008810154801580613cde57506001820154155b15613cef5750426002909101555050565b6000826002015442613d019190615149565b90506000600554846001015460025484613d1b9190615160565b613d259190615160565b613d2f919061517f565b600c549091506103e890600090613d469083615149565b600a54600c54919250613d7a916001600160a01b03909116908490613d6b9087615160565b613d75919061517f565b614181565b50613d8a3083613d6b8487615160565b15613de6576008860154829082613da9670de0b6b3a764000087615160565b613db39190615160565b613dbd919061517f565b613dc7919061517f565b866003016000828254613dda9190615057565b90915550504260028701555b60028601546003870154604080519283526020830188905282015288907f3be3541fc42237d611b30329040bfa4569541d156560acdbbae57640d20b8f469060600160405180910390a25050505050505b5050565b600060038281548110613e5057613e50614fe3565b6000918252602080832085845260048252604080852033865290925292206003810154600a9092029092019250158015613e8c57506006544210155b15613ea6576005820154613ea09042615057565b60038201555b6004810154613ec4576006820154613ebe9042615057565b60048201555b60008160010154670de0b6b3a764000084600301548460000154613ee89190615160565b613ef2919061517f565b613efc9190615149565b9050613f08843361146b565b1561401a57613f178433611374565b158015613f245750600081115b15613f8a576000826002015482613f3b9190615057565b90506000670de0b6b3a7640000856007015483613f589190615160565b613f62919061517f565b9050613f6e8184615149565b600a54909350613f87906001600160a01b0316826143b9565b50505b6006830154613f999042615057565b600483015580151580613fb0575060008260020154115b15614015576000826002015482613fc79190615057565b9050826002015460076000828254613fdf9190615149565b9091555050600060028401556005840154613ffa9042615057565b600384015561400933826143b9565b614013338261455a565b505b61408b565b801561408b5780600760008282546140329190615057565b925050819055508082600201600082825461404d9190615057565b9091555050604051818152849033907fee470483107f579a55c754fa00613c45a9a3b617a418b39cb0be97e5381ba7c1906020015b60405180910390a35b50505050565b6040516001600160a01b0383166024820152604481018290526140f490849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152614783565b505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6040516001600160a01b038085166024830152831660448201526064810182905261408b9085906323b872dd60e01b906084016140bd565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156141e2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061420691906151be565b905060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d5abeb016040518163ffffffff1660e01b8152600401602060405180830381865afa158015614268573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061428c91906151be565b9050806142998584615057565b1161436b576040516340c10f1960e01b81526001600160a01b038681166004830152602482018690527f000000000000000000000000000000000000000000000000000000000000000016906340c10f1990604401600060405180830381600087803b15801561430857600080fd5b505af115801561431c573d6000803e3d6000fd5b50506040518681526001600160a01b03881692503391507ffa8ccab40e7da8146c2304cd0950334fd30a6ba093abe86261aa13911fed849c9060200160405180910390a360019250505061139d565b846001600160a01b03167f359d7ae3418251c723b9d8fda28f9075ea47dacaed96a8568aaed77cc6d1236e856040516143a691815260200190565b60405180910390a260009250505061139d565b6009546040516370a0823160e01b81523060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015614420573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061444491906151be565b1115613e37576009546040516370a0823160e01b8152306004820152600091906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa1580156144b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906144d991906151be565b6144e39190615149565b9050808210614520576140f46001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168483614091565b81156140f4576140f46001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168484614091565b6008546001600160a01b0316158015906145805750600854600160a01b900461ffff1615155b15613e3757600854604051634a9fefc760e01b81526001600160a01b0384811660048301526000921690634a9fefc790602401602060405180830381865afa1580156145d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906145f491906151a1565b6008549091506000906127109061461690600160a01b900461ffff1685615160565b614620919061517f565b90506001600160a01b0382161580159061464557506001600160a01b03821661dead14155b80156146515750600081115b1561408b576040516340c10f1960e01b81526001600160a01b038381166004830152602482018390527f000000000000000000000000000000000000000000000000000000000000000016906340c10f1990604401600060405180830381600087803b1580156146c057600080fd5b505af11580156146d4573d6000803e3d6000fd5b5050600854604051631b82d29760e31b81526001600160a01b03868116600483015260248201869052909116925063dc1694b89150604401600060405180830381600087803b15801561472657600080fd5b505af115801561473a573d6000803e3d6000fd5b50505050816001600160a01b0316846001600160a01b03167f86ddab457291316e0f5496737e5ca67c4037234c32c3be04c48ae96186893a7b8360405161408291815260200190565b60006147d8826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166148559092919063ffffffff16565b8051909150156140f457808060200190518101906147f691906152a7565b6140f45760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016107f1565b6060614864848460008561486e565b90505b9392505050565b6060824710156148cf5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016107f1565b843b61491d5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016107f1565b600080866001600160a01b0316858760405161493991906152c9565b60006040518083038185875af1925050503d8060008114614976576040519150601f19603f3d011682016040523d82523d6000602084013e61497b565b606091505b509150915061498b828286614996565b979650505050505050565b606083156149a5575081614867565b8251156149b55782518084602001fd5b8160405162461bcd60e51b81526004016107f191906152e5565b828054828255906000526020600020908101928215614a24579160200282015b82811115614a2457825182546001600160a01b0319166001600160a01b039091161782556020909201916001909101906149ef565b50614a30929150614a87565b5090565b828054828255906000526020600020908101928215614a24579160200282015b82811115614a245781546001600160a01b0319166001600160a01b03843516178255602090920191600190910190614a54565b5b80821115614a305760008155600101614a88565b60008083601f840112614aae57600080fd5b5081356001600160401b03811115614ac557600080fd5b6020830191508360208260051b8501011115614ae057600080fd5b9250929050565b6001600160a01b0381168114612e5357600080fd5b600080600060408486031215614b1157600080fd5b83356001600160401b03811115614b2757600080fd5b614b3386828701614a9c565b9094509250506020840135614b4781614ae7565b809150509250925092565b600060208284031215614b6457600080fd5b5035919050565b600081518084526020808501945080840160005b83811015614ba45781516001600160a01b031687529582019590820190600101614b7f565b509495945050505050565b60005b83811015614bca578181015183820152602001614bb2565b8381111561408b5750506000910152565b60008151808452614bf3816020860160208601614baf565b601f01601f19169290920160200192915050565b600081518084526020808501808196508360051b8101915082860160005b85811015614c4f578284038952614c3d848351614bdb565b98850198935090840190600101614c25565b5091979650505050505050565b600081518084526020808501945080840160005b83811015614ba457815187529582019590820190600101614c70565b634e487b7160e01b600052602160045260246000fd5b60e081526000614cb560e083018a614b6b565b602083820381850152614cc8828b614c07565b91508382036040850152614cdc828a614c5c565b91508382036060850152614cf08289614c5c565b91508382036080850152614d048288614c5c565b915083820360a0850152614d188287614c5c565b84810360c086015285518082528287019350908201906000805b82811015614d6b5785516004808210614d5857634e487b7160e01b845260218152602484fd5b5084529484019492840192600101614d32565b50919d9c50505050505050505050505050565b60008060408385031215614d9157600080fd5b823591506020830135614da381614ae7565b809150509250929050565b60008060408385031215614dc157600080fd5b8235614dcc81614ae7565b946020939093013593505050565b60008060408385031215614ded57600080fd5b50508035926020909101359150565b600060208284031215614e0e57600080fd5b813561ffff8116811461486757600080fd5b600060208284031215614e3257600080fd5b813561486781614ae7565b60008060008060008060008060e0898b031215614e5957600080fd5b883597506020890135614e6b81614ae7565b965060408901359550606089013594506080890135935060a0890135925060c08901356001600160401b03811115614ea257600080fd5b614eae8b828c01614a9c565b999c989b5096995094979396929594505050565b600080600060608486031215614ed757600080fd5b83359250602084013591506040840135614b4781614ae7565b60008060008060008060008060e0898b031215614f0c57600080fd5b883597506020890135965060408901359550606089013594506080890135935060a0890135925060c08901356001600160401b03811115614ea257600080fd5b6020815260006148676020830184614b6b565b608081526000614f726080830187614b6b565b8281036020840152614f848187614c07565b90508281036040840152614f988186614c5c565b9050828103606084015261498b8185614c5c565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060001982141561502357615023614ff9565b5060010190565b602080825260139082015272141bdbdb08191bd95cc81b9bdd08195e1a5cdd606a1b604082015260600190565b6000821982111561506a5761506a614ff9565b500190565b634e487b7160e01b600052604160045260246000fd5b60006020828403121561509757600080fd5b81516001600160401b03808211156150ae57600080fd5b818401915084601f8301126150c257600080fd5b8151818111156150d4576150d461506f565b604051601f8201601f19908116603f011681019083821181831017156150fc576150fc61506f565b8160405282815287602084870101111561511557600080fd5b61498b836020830160208801614baf565b60006020828403121561513857600080fd5b815160ff8116811461486757600080fd5b60008282101561515b5761515b614ff9565b500390565b600081600019048311821515161561517a5761517a614ff9565b500290565b60008261519c57634e487b7160e01b600052601260045260246000fd5b500490565b6000602082840312156151b357600080fd5b815161486781614ae7565b6000602082840312156151d057600080fd5b5051919050565b60008060008060008060c087890312156151f057600080fd5b865195506020870151945060408701519350606087015192506080870151915060a08701516004811061522257600080fd5b809150509295509295509295565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60008184825b8581101561529c57813561527e81614ae7565b6001600160a01b03168352602092830192919091019060010161526b565b509095945050505050565b6000602082840312156152b957600080fd5b8151801515811461486757600080fd5b600082516152db818460208701614baf565b9190910192915050565b6020815260006148676020830184614bdb56fea26469706673582212205496459a05060af62f4b57ed853f268b8cfdaafd64178c5148da74625bbd4f6364736f6c634300080b00330000000000000000000000005b3c1f260e09e653290f24f75abc5e466fd4231000000000000000000000000000000000000000000000000030927f74c9de0000
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106103425760003560e01c8063853bab71116101b8578063d30ef61b11610104578063f2fde38b116100a2578063fccc28131161007c578063fccc281314610786578063fdc8e0fe1461078f578063fed13a2214610798578063ffcd4263146107ab57600080fd5b8063f2fde38b14610751578063f4c67a8414610764578063f500ce741461077357600080fd5b8063e6097810116100de578063e60978101461070d578063e6fd48bc14610715578063eddf96521461071e578063eff8976b1461073157600080fd5b8063d30ef61b146106ef578063de73149d146105ce578063e54807781461070457600080fd5b80638ed7b64a116101715780639fe3259d1161014b5780639fe3259d146106a3578063a6d5fe41146106b6578063b6431279146106c9578063c3508c25146106dc57600080fd5b80638ed7b64a1461060f57806393f1a40b146106225780639e1ea7df1461069057600080fd5b8063853bab71146105a85780638705fcd4146105bb5780638b4de71a146105ce5780638da5cb5b146105d85780638db0809d146105e95780638dbdbe6d146105fc57600080fd5b8063412753581161029257806355dbc82611610230578063654c9ece1161020a578063654c9ece1461056c578063715018a61461057f5780637a117d8114610587578063812c64f11461059a57600080fd5b806355dbc82614610548578063630b5ba11461055b57806363dc47a01461056357600080fd5b8063474fa6301161026c578063474fa6301461050a578063495a31b21461051357806351eb05a6146105225780635312ea8e1461053557600080fd5b806341275358146104d4578063436cc3d6146104e7578063441a3e70146104f757600080fd5b806317caf6f1116102ff5780632e6c998d116102d95780632e6c998d146104545780632f241a7b1461046757806339819b4d146104a6578063411d9201146104c157600080fd5b806317caf6f11461042057806327444b711461042957806329e1d2461461044c57600080fd5b806302650d8814610347578063059f8b161461035c578063081e3eda1461037e57806309281d3c146103865780630ba84cd2146103ac5780631526fe27146103bf575b600080fd5b61035a610355366004614afc565b6107ce565b005b61036b670de0b6b3a764000081565b6040519081526020015b60405180910390f35b60035461036b565b610399610394366004614b52565b610899565b6040516103759796959493929190614ca2565b61035a6103ba366004614b52565b611241565b6103d26103cd366004614b52565b61130f565b604080516001600160a01b03909a168a5260208a0198909852968801959095526060870193909352608086019190915260a085015260c084015260e083015261010082015261012001610375565b61036b60055481565b61043c610437366004614d7e565b611374565b6040519015158152602001610375565b61035a6113a3565b61043c610462366004614d7e565b61146b565b61048e7f0000000000000000000000005b3c1f260e09e653290f24f75abc5e466fd4231081565b6040516001600160a01b039091168152602001610375565b6104ae600a81565b60405161ffff9091168152602001610375565b61036b6104cf366004614dae565b6114d2565b600b5461048e906001600160a01b031681565b61036b6802b5e3af16b188000081565b61035a610505366004614dda565b611560565b61036b60075481565b61036b670b1a2bc2ec50000081565b61035a610530366004614b52565b61185a565b61035a610543366004614b52565b611892565b61035a610556366004614dfc565b611ae9565b61035a611c0d565b61036b600c5481565b61036b61057a366004614b52565b611c43565b61035a611c71565b61035a610595366004614e20565b611ca7565b61036b66b1a2bc2ec5000081565b600d5461048e906001600160a01b031681565b61035a6105c9366004614e20565b611da3565b61036b6206978081565b6000546001600160a01b031661048e565b61035a6105f7366004614e3d565b611e95565b61035a61060a366004614ec2565b6123fc565b61035a61061d366004614e20565b612438565b610668610630366004614d7e565b600460208181526000938452604080852090915291835291208054600182015460028301546003840154939094015491939092909185565b604080519586526020860194909452928401919091526060830152608082015260a001610375565b61035a61069e366004614e20565b6124b8565b600a5461048e906001600160a01b031681565b61035a6106c4366004614ef0565b6126a2565b61035a6106d7366004614b52565b612adb565b60085461048e906001600160a01b031681565b6008546104ae90600160a01b900461ffff1681565b61036b60095481565b6104ae606481565b61036b60065481565b61035a61072c366004614dda565b612b8f565b61074461073f366004614b52565b612ca1565b6040516103759190614f4c565b61035a61075f366004614e20565b612dbb565b61036b67016345785d8a000081565b61036b610781366004614e20565b612e56565b61048e61dead81565b61036b60025481565b61035a6107a6366004614b52565b612ee0565b6107be6107b9366004614d7e565b612fa3565b6040516103759493929190614f5f565b600260015414156107fa5760405162461bcd60e51b81526004016107f190614fac565b60405180910390fd5b6002600155601e8211156108505760405162461bcd60e51b815260206004820152601f60248201527f68617276657374206d616e793a20746f6f206d616e7920706f6f6c206964730060448201526064016107f1565b60005b8281101561088f5761087f84848381811061087057610870614fe3565b90506020020135600084613806565b6108888161500f565b9050610853565b5050600180555050565b60608060608060608060608760038054905081106108c95760405162461bcd60e51b81526004016107f19061502a565b600060038a815481106108de576108de614fe3565b90600052602060002090600a02019050806009018054905060016109029190615057565b6001600160401b038111156109195761091961506f565b604051908082528060200260200182016040528015610942578160200160208202803683370190505b506009820154909950610956906001615057565b6001600160401b0381111561096d5761096d61506f565b6040519080825280602002602001820160405280156109a057816020015b606081526020019060019003908161098b5790505b5060098201549098506109b4906001615057565b6001600160401b038111156109cb576109cb61506f565b6040519080825280602002602001820160405280156109f4578160200160208202803683370190505b506009820154909750610a08906001615057565b6001600160401b03811115610a1f57610a1f61506f565b604051908082528060200260200182016040528015610a48578160200160208202803683370190505b506009820154909650610a5c906001615057565b6001600160401b03811115610a7357610a7361506f565b604051908082528060200260200182016040528015610a9c578160200160208202803683370190505b506009820154909550610ab0906001615057565b6001600160401b03811115610ac757610ac761506f565b604051908082528060200260200182016040528015610af0578160200160208202803683370190505b506009820154909450610b04906001615057565b6001600160401b03811115610b1b57610b1b61506f565b604051908082528060200260200182016040528015610b44578160200160208202803683370190505b5092507f0000000000000000000000005b3c1f260e09e653290f24f75abc5e466fd4231089600081518110610b7b57610b7b614fe3565b60200260200101906001600160a01b031690816001600160a01b0316815250507f0000000000000000000000005b3c1f260e09e653290f24f75abc5e466fd423106001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa158015610bf9573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610c219190810190615085565b88600081518110610c3457610c34614fe3565b60200260200101819052507f0000000000000000000000005b3c1f260e09e653290f24f75abc5e466fd423106001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c9d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cc19190615126565b60ff1687600081518110610cd757610cd7614fe3565b6020908102919091010152600c546103e890600090610cf69083615149565b905081600554826002548660010154610d0f9190615160565b610d199190615160565b610d23919061517f565b610d2d919061517f565b88600081518110610d4057610d40614fe3565b60200260200101818152505060005b600984015481101561123157836009018181548110610d7057610d70614fe3565b600091825260209182902001546040805163f7c618c160e01b815290516001600160a01b039092169263f7c618c1926004808401938290030181865afa158015610dbe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610de291906151a1565b8c610dee836001615057565b81518110610dfe57610dfe614fe3565b60200260200101906001600160a01b031690816001600160a01b031681525050836009018181548110610e3357610e33614fe3565b600091825260209182902001546040805163f7c618c160e01b815290516001600160a01b039092169263f7c618c1926004808401938290030181865afa158015610e81573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ea591906151a1565b6001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa158015610ee2573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610f0a9190810190615085565b8b610f16836001615057565b81518110610f2657610f26614fe3565b6020026020010181905250836009018181548110610f4657610f46614fe3565b600091825260209182902001546040805163f7c618c160e01b815290516001600160a01b039092169263f7c618c1926004808401938290030181865afa158015610f94573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fb891906151a1565b6001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ff5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110199190615126565b60ff168a611028836001615057565b8151811061103857611038614fe3565b60200260200101818152505083600901818154811061105957611059614fe3565b600091825260209091200154604051631197a07b60e21b8152600481018f90526001600160a01b039091169063465e81ec90602401602060405180830381865afa1580156110ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110cf91906151be565b896110db836001615057565b815181106110eb576110eb614fe3565b60200260200101818152505083600901818154811061110c5761110c614fe3565b600091825260209091200154604051632f380b3560e01b8152600481018f90526001600160a01b0390911690632f380b359060240160c060405180830381865afa15801561115e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061118291906151d7565b919450925090508a611195856001615057565b815181106111a5576111a5614fe3565b602002602001018a8560016111ba9190615057565b815181106111ca576111ca614fe3565b602002602001018a8660016111df9190615057565b815181106111ef576111ef614fe3565b6020026020010183600381111561120857611208614c8c565b600381111561121957611219614c8c565b905292909252505261122a8161500f565b9050610d4f565b5050505050919395979092949650565b6000546001600160a01b0316331461126b5760405162461bcd60e51b81526004016107f190615230565b6802b5e3af16b18800008111156112c45760405162461bcd60e51b815260206004820152601c60248201527f456d697373696f6e203e206d617820656d697373696f6e20726174650000000060448201526064016107f1565b6112cc613c4c565b600254604080519182526020820183905233917feedc6338c9c1ad8f3cd6c90dd09dbe98dbd57e610d3e59a17996d07acb0d9511910160405180910390a2600255565b6003818154811061131f57600080fd5b60009182526020909120600a90910201805460018201546002830154600384015460048501546005860154600687015460078801546008909801546001600160a01b0390971698509496939592949193909289565b60008281526004602081815260408084206001600160a01b038616855290915290912001544210155b92915050565b6000546001600160a01b031633146113cd5760405162461bcd60e51b81526004016107f190615230565b60065442106114155760405162461bcd60e51b815260206004820152601460248201527319985c9b48185b1c9958591e481cdd185c9d195960621b60448201526064016107f1565b60035460005b818110156114635760006003828154811061143857611438614fe3565b90600052602060002090600a02019050428160020181905550508061145c9061500f565b905061141b565b505042600655565b600354600090839081106114915760405162461bcd60e51b81526004016107f19061502a565b60008481526004602090815260408083206001600160a01b0387168452909152902060065442108015906114c9575080600301544210155b95945050505050565b6000806114de84612e56565b9050670b1a2bc2ec5000008111156115315760405162461bcd60e51b815260206004820152601660248201527508ccaca40e4cac8eac6e8d2dedc40e8dede40d0d2ced60531b60448201526064016107f1565b670de0b6b3a76400006115448282615149565b61154e9085615160565b611558919061517f565b949350505050565b600260015414156115835760405162461bcd60e51b81526004016107f190614fac565b6002600155600354829081106115ab5760405162461bcd60e51b81526004016107f19061502a565b6000600384815481106115c0576115c0614fe3565b6000918252602080832087845260048252604080852033865290925292208054600a90920290920192508411156116395760405162461bcd60e51b815260206004820181905260248201527f77697468647261773a207573657220616d6f756e74206e6f7420656e6f75676860448201526064016107f1565b838260080154101561168d5760405162461bcd60e51b815260206004820152601f60248201527f77697468647261773a20706f6f6c20746f74616c206e6f7420656e6f7567680060448201526064016107f1565b61169685613c72565b61169f85613e3b565b831561172257838160000160008282546116b99190615149565b909155505081547f0000000000000000000000005b3c1f260e09e653290f24f75abc5e466fd423106001600160a01b039081169116141561170c5783600960008282546117069190615149565b90915550505b8154611722906001600160a01b03163386614091565b60038201548154670de0b6b3a76400009161173c91615160565b611746919061517f565b600182015560005b60098301548110156117f75782600901818154811061176f5761176f614fe3565b6000918252602090912001548254604051636b6c904f60e11b81526004810189905233602482015260448101919091526001600160a01b039091169063d6d9209e90606401600060405180830381600087803b1580156117ce57600080fd5b505af11580156117e2573d6000803e3d6000fd5b50505050806117f09061500f565b905061174e565b50831561181857838260080160008282546118129190615149565b90915550505b604051848152859033907ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b5689060200160405180910390a3505060018055505050565b6002600154141561187d5760405162461bcd60e51b81526004016107f190614fac565b600260015561188b81613c72565b5060018055565b600260015414156118b55760405162461bcd60e51b81526004016107f190614fac565b60026001819055506000600382815481106118d2576118d2614fe3565b6000918252602080832085845260048252604080852033865290925292208054600a9290920290920160088101549093508111156119645760405162461bcd60e51b815260206004820152602960248201527f656d657267656e63792077697468647261773a20706f6f6c20746f74616c206e6044820152680dee840cadcdeeaced60bb1b60648201526084016107f1565b6000808355600183018190556002830181905560038301819055600483015582547f0000000000000000000000005b3c1f260e09e653290f24f75abc5e466fd423106001600160a01b03908116911614156119d15780600960008282546119cb9190615149565b90915550505b82546119e7906001600160a01b03163383614091565b60005b6009840154811015611a8e57836009018181548110611a0b57611a0b614fe3565b6000918252602082200154604051636b6c904f60e11b81526004810188905233602482015260448101929092526001600160a01b03169063d6d9209e90606401600060405180830381600087803b158015611a6557600080fd5b505af1158015611a79573d6000803e3d6000fd5b5050505080611a879061500f565b90506119ea565b5080836008016000828254611aa39190615149565b9091555050604051818152849033907fbb757047c2b5f3974fe26b7c10f732e7bce710b0952a71082702781e62ae05959060200160405180910390a35050600180555050565b6000546001600160a01b03163314611b135760405162461bcd60e51b81526004016107f190615230565b6103e88161ffff161115611ba05760405162461bcd60e51b815260206004820152604860248201527f736574526566657272616c436f6d6d697373696f6e526174653a20696e76616c60448201527f696420726566657272616c20636f6d6d697373696f6e207261746520626173696064820152677320706f696e747360c01b608482015260a4016107f1565b60085460408051600160a01b90920461ffff90811683528316602083015233917fb5e94d2c884c9803a63d58f2591a3d5eb358fe8d2a580ebefa85ca1f6b5d8a21910160405180910390a26008805461ffff909216600160a01b0261ffff60a01b19909216919091179055565b60026001541415611c305760405162461bcd60e51b81526004016107f190614fac565b6002600155611c3d613c4c565b60018055565b600060038281548110611c5857611c58614fe3565b90600052602060002090600a0201600801549050919050565b6000546001600160a01b03163314611c9b5760405162461bcd60e51b81526004016107f190615230565b611ca560006140f9565b565b600a546001600160a01b03163314611d015760405162461bcd60e51b815260206004820152601e60248201527f73657441534e545368617265416464726573733a20464f5242494444454e000060448201526064016107f1565b6001600160a01b038116611d575760405162461bcd60e51b815260206004820152601960248201527f73657441534e545368617265416464726573733a205a45524f0000000000000060448201526064016107f1565b600a80546001600160a01b0319166001600160a01b03831690811790915560405133907fabe35ad89ab3a077347358c37e5e4e9c5283f4329afa084b943e56a4fba87a5d90600090a350565b600b546001600160a01b03163314611dfd5760405162461bcd60e51b815260206004820152601860248201527f736574466565416464726573733a20464f5242494444454e000000000000000060448201526064016107f1565b6001600160a01b038116611e495760405162461bcd60e51b8152602060048201526013602482015272736574466565416464726573733a205a45524f60681b60448201526064016107f1565b600b80546001600160a01b0319166001600160a01b03831690811790915560405133907fd44190acf9d04bdb5d3a1aafff7e6dee8b40b93dfb8c5d3f0eea4b9f4539c3f790600090a350565b6000546001600160a01b03163314611ebf5760405162461bcd60e51b81526004016107f190615230565b600a811115611f105760405162461bcd60e51b815260206004820152601760248201527f6164643a20746f6f206d616e792072657761726465727300000000000000000060448201526064016107f1565b67016345785d8a0000831115611f685760405162461bcd60e51b815260206004820152601960248201527f6164643a20686172766573742066656520746f6f20686967680000000000000060448201526064016107f1565b62069780841115611fc55760405162461bcd60e51b815260206004820152602160248201527f6164643a20696e76616c696420686172766573742066656520696e74657276616044820152601b60fa1b60648201526084016107f1565b66b1a2bc2ec5000086111561201c5760405162461bcd60e51b815260206004820152601960248201527f6164643a206465706f7369742066656520746f6f20686967680000000000000060448201526064016107f1565b6206978085111561206f5760405162461bcd60e51b815260206004820152601d60248201527f6164643a20696e76616c6964206861727665737420696e74657276616c00000060448201526064016107f1565b60005b81811015612207576120aa83838381811061208f5761208f614fe3565b90506020020160208101906120a49190614e20565b3b151590565b6120f65760405162461bcd60e51b815260206004820152601e60248201527f6164643a207265776172646572206d75737420626520636f6e7472616374000060448201526064016107f1565b600083838381811061210a5761210a614fe3565b905060200201602081019061211f9190614e20565b600354604051632f380b3560e01b81526001600160a01b039290921691632f380b35916121529160040190815260200190565b60c060405180830381865afa15801561216f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061219391906151d7565b5050505091505080600014156121f65760405162461bcd60e51b815260206004820152602260248201527f506f6f6c20646f65736e27742065786973742079657420696e2072657761726460448201526132b960f11b60648201526084016107f1565b506122008161500f565b9050612072565b50612210613c4c565b6000600654421161222357600654612225565b425b905088600560008282546122399190615057565b9250508190555060036040518061014001604052808a6001600160a01b031681526020018b8152602001838152602001600081526020018981526020018881526020018781526020018681526020016000815260200185858080602002602001604051908101604052809392919081815260200183836020028082843760009201829052509390945250508354600180820186559482526020918290208451600a9092020180546001600160a01b0319166001600160a01b03909216919091178155838201519481019490945560408301516002850155606083015160038501556080830151600485015560a0830151600585015560c0830151600685015560e083015160078501556101008301516008850155610120830151805193949361236c9350600985019291909101906149cf565b505050828260405161237f929190615265565b6040519081900390206003546001600160a01b038a16906123a290600190615149565b604080518d8152602081018c90529081018a905260608101899052608081018890527f79d6bbab8505f6163cf8a66cc1c57a2fc54232104ff48c1f77b6a212f95630739060a00160405180910390a4505050505050505050565b6002600154141561241f5760405162461bcd60e51b81526004016107f190614fac565b600260015561242f838383613806565b50506001805550565b6000546001600160a01b031633146124625760405162461bcd60e51b81526004016107f190615230565b600880546001600160a01b0319166001600160a01b03831690811790915560405190815233907fe9987fe60c8b88da0c9fb93c839cea3ab684f862db37f67254f8bd5905136cad9060200160405180910390a250565b6000546001600160a01b031633146124e25760405162461bcd60e51b81526004016107f190615230565b806001600160a01b03166361a475c86040518163ffffffff1660e01b8152600401602060405180830381865afa158015612520573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061254491906152a7565b6125855760405162461bcd60e51b8152602060048201526012602482015271139bdd0818481d9a5c0818dbdb9d1c9858dd60721b60448201526064016107f1565b604051633d40339d60e21b81523060048201526001600160a01b0382169063f500ce7490602401602060405180830381865afa1580156125c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125ed91906151be565b156126465760405162461bcd60e51b8152602060048201526024808201527f6765744661726d73446570466565526564756374696f6e2077726f6e6720616e60448201526339bbb2b960e11b60648201526084016107f1565b600d546040516001600160a01b038084169216907f8a7ac7a0c866ac5a3263a1594250b5bd136237d1f2b6b153a6da94838e8a028a90600090a3600d80546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146126cc5760405162461bcd60e51b81526004016107f190615230565b600354889081106126ef5760405162461bcd60e51b81526004016107f19061502a565b600a8211156127405760405162461bcd60e51b815260206004820152601760248201527f7365743a20746f6f206d616e792072657761726465727300000000000000000060448201526064016107f1565b67016345785d8a00008411156127985760405162461bcd60e51b815260206004820152601960248201527f7365743a20686172766573742066656520746f6f20686967680000000000000060448201526064016107f1565b620697808511156127f55760405162461bcd60e51b815260206004820152602160248201527f7365743a20696e76616c696420686172766573742066656520696e74657276616044820152601b60fa1b60648201526084016107f1565b66b1a2bc2ec5000087111561284c5760405162461bcd60e51b815260206004820152601960248201527f7365743a206465706f7369742066656520746f6f20686967680000000000000060448201526064016107f1565b6206978086111561289f5760405162461bcd60e51b815260206004820152601d60248201527f7365743a20696e76616c6964206861727665737420696e74657276616c00000060448201526064016107f1565b60005b8281101561291b576128bf84848381811061208f5761208f614fe3565b61290b5760405162461bcd60e51b815260206004820152601e60248201527f7365743a207265776172646572206d75737420626520636f6e7472616374000060448201526064016107f1565b6129148161500f565b90506128a2565b50612924613c4c565b8760038a8154811061293857612938614fe3565b90600052602060002090600a0201600101546005546129579190615149565b6129619190615057565b6005819055508760038a8154811061297b5761297b614fe3565b90600052602060002090600a0201600101819055508660038a815481106129a4576129a4614fe3565b90600052602060002090600a0201600401819055508560038a815481106129cd576129cd614fe3565b90600052602060002090600a020160050181905550828260038b815481106129f7576129f7614fe3565b90600052602060002090600a02016009019190612a15929190614a34565b508460038a81548110612a2a57612a2a614fe3565b90600052602060002090600a0201600601819055508360038a81548110612a5357612a53614fe3565b90600052602060002090600a0201600701819055508282604051612a78929190615265565b604080519182900382208a8352602083018a90529082018890526060820187905260808201869052908a907ffed2cc77dee8fe1b2013b777d01570b48d6cbd4da16e57081187be5e8250d4079060a00160405180910390a3505050505050505050565b6000546001600160a01b03163314612b055760405162461bcd60e51b81526004016107f190615230565b6064811115612b4e5760405162461bcd60e51b8152602060048201526015602482015274696e76616c69642070657263656e742076616c756560581b60448201526064016107f1565b600c5460408051918252602082018390527f4a4f678dddbe071b9725e5504e4d8b4e3aaf0793c7a43c7c2598a4942b6e38cf910160405180910390a1600c55565b6000546001600160a01b03163314612bb95760405162461bcd60e51b81526004016107f190615230565b612bc1613c4c565b336001600160a01b03167f802633c8d26237616d81bdac01bc40fcdf36e098832601582ec19d7e431c5ef360038481548110612bff57612bff614fe3565b90600052602060002090600a02016001015483604051612c29929190918252602082015260400190565b60405180910390a28060038381548110612c4557612c45614fe3565b90600052602060002090600a020160010154600554612c649190615149565b612c6e9190615057565b6005819055508060038381548110612c8857612c88614fe3565b90600052602060002090600a0201600101819055505050565b60035460609082908110612cc75760405162461bcd60e51b81526004016107f19061502a565b600060038481548110612cdc57612cdc614fe3565b90600052602060002090600a0201905080600901805490506001600160401b03811115612d0b57612d0b61506f565b604051908082528060200260200182016040528015612d34578160200160208202803683370190505b50925060005b6009820154811015612db357816009018181548110612d5b57612d5b614fe3565b9060005260206000200160009054906101000a90046001600160a01b0316848281518110612d8b57612d8b614fe3565b6001600160a01b0390921660209283029190910190910152612dac8161500f565b9050612d3a565b505050919050565b6000546001600160a01b03163314612de55760405162461bcd60e51b81526004016107f190615230565b6001600160a01b038116612e4a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016107f1565b612e53816140f9565b50565b600d546000906001600160a01b031615612ed857600d54604051633d40339d60e21b81526001600160a01b0384811660048301529091169063f500ce7490602401602060405180830381865afa158015612eb4573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061139d91906151be565b506000919050565b6000546001600160a01b03163314612f0a5760405162461bcd60e51b81526004016107f190615230565b6006544210612f525760405162461bcd60e51b815260206004820152601460248201527319985c9b48185b1c9958591e481cdd185c9d195960621b60448201526064016107f1565b60035460005b81811015612f9c57600060038281548110612f7557612f75614fe3565b600091825260209091206002600a909202010184905550612f958161500f565b9050612f58565b5050600655565b606080606080856003805490508110612fce5760405162461bcd60e51b81526004016107f19061502a565b600060038881548110612fe357612fe3614fe3565b600091825260208083208b84526004825260408085206001600160a01b038d16865290925292206003600a909202909201908101546008820154600283015492945090914211801561303457508015155b156130d657600084600201544261304b9190615149565b600c549091506103e8906000906130629083615149565b9050600082600554838a600101546002548861307e9190615160565b6130889190615160565b6130929190615160565b61309c919061517f565b6130a6919061517f565b9050846130bb670de0b6b3a764000083615160565b6130c5919061517f565b6130cf9087615057565b9550505050505b600083600201548460010154670de0b6b3a76400008587600001546130fb9190615160565b613105919061517f565b61310f9190615149565b6131199190615057565b600986015490915061312c906001615057565b6001600160401b038111156131435761314361506f565b60405190808252806020026020018201604052801561316c578160200160208202803683370190505b506009860154909a50613180906001615057565b6001600160401b038111156131975761319761506f565b6040519080825280602002602001820160405280156131ca57816020015b60608152602001906001900390816131b55790505b5060098601549099506131de906001615057565b6001600160401b038111156131f5576131f561506f565b60405190808252806020026020018201604052801561321e578160200160208202803683370190505b506009860154909750613232906001615057565b6001600160401b038111156132495761324961506f565b604051908082528060200260200182016040528015613272578160200160208202803683370190505b5097507f0000000000000000000000005b3c1f260e09e653290f24f75abc5e466fd423108a6000815181106132a9576132a9614fe3565b60200260200101906001600160a01b031690816001600160a01b0316815250507f0000000000000000000000005b3c1f260e09e653290f24f75abc5e466fd423106001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa158015613327573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261334f9190810190615085565b8960008151811061336257613362614fe3565b60200260200101819052507f0000000000000000000000005b3c1f260e09e653290f24f75abc5e466fd423106001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156133cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133ef9190615126565b60ff168860008151811061340557613405614fe3565b602002602001018181525050808760008151811061342557613425614fe3565b60200260200101818152505060005b60098601548110156137f65785600901818154811061345557613455614fe3565b600091825260209182902001546040805163f7c618c160e01b815290516001600160a01b039092169263f7c618c1926004808401938290030181865afa1580156134a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134c791906151a1565b8b6134d3836001615057565b815181106134e3576134e3614fe3565b60200260200101906001600160a01b031690816001600160a01b03168152505085600901818154811061351857613518614fe3565b600091825260209182902001546040805163f7c618c160e01b815290516001600160a01b039092169263f7c618c1926004808401938290030181865afa158015613566573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061358a91906151a1565b6001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa1580156135c7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526135ef9190810190615085565b8a6135fb836001615057565b8151811061360b5761360b614fe3565b602002602001018190525085600901818154811061362b5761362b614fe3565b600091825260209182902001546040805163f7c618c160e01b815290516001600160a01b039092169263f7c618c1926004808401938290030181865afa158015613679573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061369d91906151a1565b6001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156136da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136fe9190615126565b60ff168961370d836001615057565b8151811061371d5761371d614fe3565b60200260200101818152505085600901818154811061373e5761373e614fe3565b60009182526020909120015460405160016232bd9d60e01b03198152600481018f90526001600160a01b038e811660248301529091169063ffcd426390604401602060405180830381865afa15801561379b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137bf91906151be565b886137cb836001615057565b815181106137db576137db614fe3565b60209081029190910101526137ef8161500f565b9050613434565b5050505050505092959194509250565b600354839081106138295760405162461bcd60e51b81526004016107f19061502a565b60006003858154811061383e5761383e614fe3565b600091825260208083208884526004825260408085203386529092529220600a909102909101915061386f86613c72565b60008511801561388957506008546001600160a01b031615155b80156138a057506001600160a01b03841661dead14155b80156138b457506001600160a01b03841615155b80156138c957506001600160a01b0384163314155b1561393457600854604051630c7f7b6b60e01b81523360048201526001600160a01b03868116602483015290911690630c7f7b6b90604401600060405180830381600087803b15801561391b57600080fd5b505af115801561392f573d6000803e3d6000fd5b505050505b61393d86613e3b565b8415613b175781546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa15801561398b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139af91906151be565b83549091506139c9906001600160a01b0316333089614149565b82546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015613a11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a3591906151be565b9050613a418282615149565b600485015490975015613aad576000613a5e3386600401546114d2565b90506000670de0b6b3a7640000613a75838b615160565b613a7f919061517f565b9050613a8b818a615149565b600b548754919a50613aaa916001600160a01b03908116911683614091565b50505b86836000016000828254613ac19190615057565b909155505083547f0000000000000000000000005b3c1f260e09e653290f24f75abc5e466fd423106001600160a01b0390811691161415613b14578660096000828254613b0e9190615057565b90915550505b50505b60038201548154670de0b6b3a764000091613b3191615160565b613b3b919061517f565b600182015560005b6009830154811015613bec57826009018181548110613b6457613b64614fe3565b6000918252602090912001548254604051636b6c904f60e11b8152600481018a905233602482015260448101919091526001600160a01b039091169063d6d9209e90606401600060405180830381600087803b158015613bc357600080fd5b505af1158015613bd7573d6000803e3d6000fd5b5050505080613be59061500f565b9050613b43565b508415613c0d5784826008016000828254613c079190615057565b90915550505b604051858152869033907f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a159060200160405180910390a3505050505050565b60005b600354811015612e5357613c6281613c72565b613c6b8161500f565b9050613c4f565b60035481908110613c955760405162461bcd60e51b81526004016107f19061502a565b600060038381548110613caa57613caa614fe3565b90600052602060002090600a0201905080600201544211613cca57505050565b6008810154801580613cde57506001820154155b15613cef5750426002909101555050565b6000826002015442613d019190615149565b90506000600554846001015460025484613d1b9190615160565b613d259190615160565b613d2f919061517f565b600c549091506103e890600090613d469083615149565b600a54600c54919250613d7a916001600160a01b03909116908490613d6b9087615160565b613d75919061517f565b614181565b50613d8a3083613d6b8487615160565b15613de6576008860154829082613da9670de0b6b3a764000087615160565b613db39190615160565b613dbd919061517f565b613dc7919061517f565b866003016000828254613dda9190615057565b90915550504260028701555b60028601546003870154604080519283526020830188905282015288907f3be3541fc42237d611b30329040bfa4569541d156560acdbbae57640d20b8f469060600160405180910390a25050505050505b5050565b600060038281548110613e5057613e50614fe3565b6000918252602080832085845260048252604080852033865290925292206003810154600a9092029092019250158015613e8c57506006544210155b15613ea6576005820154613ea09042615057565b60038201555b6004810154613ec4576006820154613ebe9042615057565b60048201555b60008160010154670de0b6b3a764000084600301548460000154613ee89190615160565b613ef2919061517f565b613efc9190615149565b9050613f08843361146b565b1561401a57613f178433611374565b158015613f245750600081115b15613f8a576000826002015482613f3b9190615057565b90506000670de0b6b3a7640000856007015483613f589190615160565b613f62919061517f565b9050613f6e8184615149565b600a54909350613f87906001600160a01b0316826143b9565b50505b6006830154613f999042615057565b600483015580151580613fb0575060008260020154115b15614015576000826002015482613fc79190615057565b9050826002015460076000828254613fdf9190615149565b9091555050600060028401556005840154613ffa9042615057565b600384015561400933826143b9565b614013338261455a565b505b61408b565b801561408b5780600760008282546140329190615057565b925050819055508082600201600082825461404d9190615057565b9091555050604051818152849033907fee470483107f579a55c754fa00613c45a9a3b617a418b39cb0be97e5381ba7c1906020015b60405180910390a35b50505050565b6040516001600160a01b0383166024820152604481018290526140f490849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152614783565b505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6040516001600160a01b038085166024830152831660448201526064810182905261408b9085906323b872dd60e01b906084016140bd565b6000807f0000000000000000000000005b3c1f260e09e653290f24f75abc5e466fd423106001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156141e2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061420691906151be565b905060007f0000000000000000000000005b3c1f260e09e653290f24f75abc5e466fd423106001600160a01b031663d5abeb016040518163ffffffff1660e01b8152600401602060405180830381865afa158015614268573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061428c91906151be565b9050806142998584615057565b1161436b576040516340c10f1960e01b81526001600160a01b038681166004830152602482018690527f0000000000000000000000005b3c1f260e09e653290f24f75abc5e466fd4231016906340c10f1990604401600060405180830381600087803b15801561430857600080fd5b505af115801561431c573d6000803e3d6000fd5b50506040518681526001600160a01b03881692503391507ffa8ccab40e7da8146c2304cd0950334fd30a6ba093abe86261aa13911fed849c9060200160405180910390a360019250505061139d565b846001600160a01b03167f359d7ae3418251c723b9d8fda28f9075ea47dacaed96a8568aaed77cc6d1236e856040516143a691815260200190565b60405180910390a260009250505061139d565b6009546040516370a0823160e01b81523060048201527f0000000000000000000000005b3c1f260e09e653290f24f75abc5e466fd423106001600160a01b0316906370a0823190602401602060405180830381865afa158015614420573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061444491906151be565b1115613e37576009546040516370a0823160e01b8152306004820152600091906001600160a01b037f0000000000000000000000005b3c1f260e09e653290f24f75abc5e466fd4231016906370a0823190602401602060405180830381865afa1580156144b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906144d991906151be565b6144e39190615149565b9050808210614520576140f46001600160a01b037f0000000000000000000000005b3c1f260e09e653290f24f75abc5e466fd42310168483614091565b81156140f4576140f46001600160a01b037f0000000000000000000000005b3c1f260e09e653290f24f75abc5e466fd42310168484614091565b6008546001600160a01b0316158015906145805750600854600160a01b900461ffff1615155b15613e3757600854604051634a9fefc760e01b81526001600160a01b0384811660048301526000921690634a9fefc790602401602060405180830381865afa1580156145d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906145f491906151a1565b6008549091506000906127109061461690600160a01b900461ffff1685615160565b614620919061517f565b90506001600160a01b0382161580159061464557506001600160a01b03821661dead14155b80156146515750600081115b1561408b576040516340c10f1960e01b81526001600160a01b038381166004830152602482018390527f0000000000000000000000005b3c1f260e09e653290f24f75abc5e466fd4231016906340c10f1990604401600060405180830381600087803b1580156146c057600080fd5b505af11580156146d4573d6000803e3d6000fd5b5050600854604051631b82d29760e31b81526001600160a01b03868116600483015260248201869052909116925063dc1694b89150604401600060405180830381600087803b15801561472657600080fd5b505af115801561473a573d6000803e3d6000fd5b50505050816001600160a01b0316846001600160a01b03167f86ddab457291316e0f5496737e5ca67c4037234c32c3be04c48ae96186893a7b8360405161408291815260200190565b60006147d8826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166148559092919063ffffffff16565b8051909150156140f457808060200190518101906147f691906152a7565b6140f45760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016107f1565b6060614864848460008561486e565b90505b9392505050565b6060824710156148cf5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016107f1565b843b61491d5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016107f1565b600080866001600160a01b0316858760405161493991906152c9565b60006040518083038185875af1925050503d8060008114614976576040519150601f19603f3d011682016040523d82523d6000602084013e61497b565b606091505b509150915061498b828286614996565b979650505050505050565b606083156149a5575081614867565b8251156149b55782518084602001fd5b8160405162461bcd60e51b81526004016107f191906152e5565b828054828255906000526020600020908101928215614a24579160200282015b82811115614a2457825182546001600160a01b0319166001600160a01b039091161782556020909201916001909101906149ef565b50614a30929150614a87565b5090565b828054828255906000526020600020908101928215614a24579160200282015b82811115614a245781546001600160a01b0319166001600160a01b03843516178255602090920191600190910190614a54565b5b80821115614a305760008155600101614a88565b60008083601f840112614aae57600080fd5b5081356001600160401b03811115614ac557600080fd5b6020830191508360208260051b8501011115614ae057600080fd5b9250929050565b6001600160a01b0381168114612e5357600080fd5b600080600060408486031215614b1157600080fd5b83356001600160401b03811115614b2757600080fd5b614b3386828701614a9c565b9094509250506020840135614b4781614ae7565b809150509250925092565b600060208284031215614b6457600080fd5b5035919050565b600081518084526020808501945080840160005b83811015614ba45781516001600160a01b031687529582019590820190600101614b7f565b509495945050505050565b60005b83811015614bca578181015183820152602001614bb2565b8381111561408b5750506000910152565b60008151808452614bf3816020860160208601614baf565b601f01601f19169290920160200192915050565b600081518084526020808501808196508360051b8101915082860160005b85811015614c4f578284038952614c3d848351614bdb565b98850198935090840190600101614c25565b5091979650505050505050565b600081518084526020808501945080840160005b83811015614ba457815187529582019590820190600101614c70565b634e487b7160e01b600052602160045260246000fd5b60e081526000614cb560e083018a614b6b565b602083820381850152614cc8828b614c07565b91508382036040850152614cdc828a614c5c565b91508382036060850152614cf08289614c5c565b91508382036080850152614d048288614c5c565b915083820360a0850152614d188287614c5c565b84810360c086015285518082528287019350908201906000805b82811015614d6b5785516004808210614d5857634e487b7160e01b845260218152602484fd5b5084529484019492840192600101614d32565b50919d9c50505050505050505050505050565b60008060408385031215614d9157600080fd5b823591506020830135614da381614ae7565b809150509250929050565b60008060408385031215614dc157600080fd5b8235614dcc81614ae7565b946020939093013593505050565b60008060408385031215614ded57600080fd5b50508035926020909101359150565b600060208284031215614e0e57600080fd5b813561ffff8116811461486757600080fd5b600060208284031215614e3257600080fd5b813561486781614ae7565b60008060008060008060008060e0898b031215614e5957600080fd5b883597506020890135614e6b81614ae7565b965060408901359550606089013594506080890135935060a0890135925060c08901356001600160401b03811115614ea257600080fd5b614eae8b828c01614a9c565b999c989b5096995094979396929594505050565b600080600060608486031215614ed757600080fd5b83359250602084013591506040840135614b4781614ae7565b60008060008060008060008060e0898b031215614f0c57600080fd5b883597506020890135965060408901359550606089013594506080890135935060a0890135925060c08901356001600160401b03811115614ea257600080fd5b6020815260006148676020830184614b6b565b608081526000614f726080830187614b6b565b8281036020840152614f848187614c07565b90508281036040840152614f988186614c5c565b9050828103606084015261498b8185614c5c565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060001982141561502357615023614ff9565b5060010190565b602080825260139082015272141bdbdb08191bd95cc81b9bdd08195e1a5cdd606a1b604082015260600190565b6000821982111561506a5761506a614ff9565b500190565b634e487b7160e01b600052604160045260246000fd5b60006020828403121561509757600080fd5b81516001600160401b03808211156150ae57600080fd5b818401915084601f8301126150c257600080fd5b8151818111156150d4576150d461506f565b604051601f8201601f19908116603f011681019083821181831017156150fc576150fc61506f565b8160405282815287602084870101111561511557600080fd5b61498b836020830160208801614baf565b60006020828403121561513857600080fd5b815160ff8116811461486757600080fd5b60008282101561515b5761515b614ff9565b500390565b600081600019048311821515161561517a5761517a614ff9565b500290565b60008261519c57634e487b7160e01b600052601260045260246000fd5b500490565b6000602082840312156151b357600080fd5b815161486781614ae7565b6000602082840312156151d057600080fd5b5051919050565b60008060008060008060c087890312156151f057600080fd5b865195506020870151945060408701519350606087015192506080870151915060a08701516004811061522257600080fd5b809150509295509295509295565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60008184825b8581101561529c57813561527e81614ae7565b6001600160a01b03168352602092830192919091019060010161526b565b509095945050505050565b6000602082840312156152b957600080fd5b8151801515811461486757600080fd5b600082516152db818460208701614baf565b9190910192915050565b6020815260006148676020830184614bdb56fea26469706673582212205496459a05060af62f4b57ed853f268b8cfdaafd64178c5148da74625bbd4f6364736f6c634300080b0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000005b3c1f260e09e653290f24f75abc5e466fd4231000000000000000000000000000000000000000000000000030927f74c9de0000
-----Decoded View---------------
Arg [0] : _ASNT (address): 0x5B3C1F260E09e653290f24F75abC5e466fD42310
Arg [1] : _ASNTPerSec (uint256): 3500000000000000000
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000005b3c1f260e09e653290f24f75abc5e466fd42310
Arg [1] : 00000000000000000000000000000000000000000000000030927f74c9de0000
Deployed Bytecode Sourcemap
499:30792:3:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22591:297;;;;;;:::i;:::-;;:::i;:::-;;2975:40;;3009:6;2975:40;;;;;1245:25:25;;;1233:2;1218:18;2975:40:3;;;;;;;;6678:95;6750:8;:15;6678:95;;8884:1947;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;:::i;27875:290::-;;;;;;:::i;:::-;;:::i;3116:26::-;;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;6174:32:25;;;6156:51;;6238:2;6223:18;;6216:34;;;;6266:18;;;6259:34;;;;6324:2;6309:18;;6302:34;;;;6367:3;6352:19;;6345:35;;;;6194:3;6396:19;;6389:35;6455:3;6440:19;;6433:35;6499:3;6484:19;;6477:35;6543:3;6528:19;;6521:35;6143:3;6128:19;3116:26:3;5770:792:25;3361:30:3;;;;;;11710:201;;;;;;:::i;:::-;;:::i;:::-;;;7052:14:25;;7045:22;7027:41;;7015:2;7000:18;11710:201:3;6887:187:25;28241:390:3;;;:::i;11372:259::-;;;;;;:::i;:::-;;:::i;1889:31::-;;;;;;;;-1:-1:-1;;;;;7260:32:25;;;7242:51;;7230:2;7215:18;1889:31:3;7079:220:25;2808:45:3;;2851:2;2808:45;;;;;7478:6:25;7466:19;;;7448:38;;7436:2;7421:18;2808:45:3;7304:188:25;12167:342:3;;;;;;:::i;:::-;;:::i;3944:25::-;;;;;-1:-1:-1;;;;;3944:25:3;;;2077:52;;2121:8;2077:52;;17333:1245;;;;;;:::i;:::-;;:::i;3517:35::-;;;;;;3022:48;;3061:9;3022:48;;13939:92;;;;;;:::i;:::-;;:::i;18649:998::-;;;;;;:::i;:::-;;:::i;29450:423::-;;;;;;:::i;:::-;;:::i;12948:86::-;;;:::i;4041:31::-;;;;;;11950:113;;;;;;:::i;:::-;;:::i;1714:103:20:-;;;:::i;29914:350:3:-;;;;;;:::i;:::-;;:::i;2559:61::-;;2610:10;2559:61;;4207:21;;;;;-1:-1:-1;;;;;4207:21:3;;;30670:290;;;;;;:::i;:::-;;:::i;2284:60::-;;2338:6;2284:60;;1063:87:20;1109:7;1136:6;-1:-1:-1;;;;;1136:6:20;1063:87;;23868:1960:3;;;;;;:::i;:::-;;:::i;15310:142::-;;;;;;:::i;:::-;;:::i;29211:178::-;;;;;;:::i;:::-;;:::i;3200:64::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10912:25:25;;;10968:2;10953:18;;10946:34;;;;10996:18;;;10989:34;;;;11054:2;11039:18;;11032:34;11097:3;11082:19;;11075:35;10899:3;10884:19;3200:64:3;10653:463:25;31004:282:3;;;;;;:::i;:::-;;:::i;3866:31::-;;;;;-1:-1:-1;;;;;3866:31:3;;;25918:1538;;;;;;:::i;:::-;;:::i;30309:298::-;;;;;;:::i;:::-;;:::i;3605:29::-;;;;;-1:-1:-1;;;;;3605:29:3;;;3691:42;;;;;-1:-1:-1;;;3691:42:3;;;;;;3799:31;;;;;;2709:47;;2753:3;2709:47;;3447:29;;;;;;27501:337;;;;;;:::i;:::-;;:::i;10906:403::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;1972:201:20:-;;;;;;:::i;:::-;;:::i;2447:60:3:-;;2498:9;2447:60;;12561:271;;;;;;:::i;:::-;;:::i;2887:81::-;;2926:42;2887:81;;1968:25;;;;;;28717:415;;;;;;:::i;:::-;;:::i;6839:1989::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;22591:297::-;1713:1:22;2311:7;;:19;;2303:63;;;;-1:-1:-1;;;2303:63:22;;;;;;;:::i;:::-;;;;;;;;;1713:1;2444:7;:18;22714:2:3::1;22698:18:::0;::::1;;22690:62;;;::::0;-1:-1:-1;;;22690:62:3;;14224:2:25;22690:62:3::1;::::0;::::1;14206:21:25::0;14263:2;14243:18;;;14236:30;14302:33;14282:18;;;14275:61;14353:18;;22690:62:3::1;14022:355:25::0;22690:62:3::1;22768:13;22763:118;22787:20:::0;;::::1;22763:118;;;22833:36;22842:5;;22848;22842:12;;;;;;;:::i;:::-;;;;;;;22856:1;22859:9;22833:8;:36::i;:::-;22809:7;::::0;::::1;:::i;:::-;;;22763:118;;;-1:-1:-1::0;;1669:1:22;2623:22;;-1:-1:-1;;22591:297:3:o;8884:1947::-;8994:26;9035:23;9073:25;9113:30;9158:32;9205:30;9250:51;8956:4;4304:8;:15;;;;4297:4;:22;4289:54;;;;-1:-1:-1;;;4289:54:3;;;;;;;:::i;:::-;9329:21:::1;9353:8;9362:4;9353:14;;;;;;;;:::i;:::-;;;;;;;;;;;9329:38;;9406:4;:14;;:21;;;;9430:1;9406:25;;;;:::i;:::-;-1:-1:-1::0;;;;;9392:40:3::1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;9392:40:3::1;-1:-1:-1::0;9466:14:3::1;::::0;::::1;:21:::0;9380:52;;-1:-1:-1;9466:25:3::1;::::0;9490:1:::1;9466:25;:::i;:::-;-1:-1:-1::0;;;;;9453:39:3::1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;9528:14:3::1;::::0;::::1;:21:::0;9443:49;;-1:-1:-1;9528:25:3::1;::::0;9552:1:::1;9528:25;:::i;:::-;-1:-1:-1::0;;;;;9514:40:3::1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;9514:40:3::1;-1:-1:-1::0;9595:14:3::1;::::0;::::1;:21:::0;9503:51;;-1:-1:-1;9595:25:3::1;::::0;9619:1:::1;9595:25;:::i;:::-;-1:-1:-1::0;;;;;9581:40:3::1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;9581:40:3::1;-1:-1:-1::0;9664:14:3::1;::::0;::::1;:21:::0;9565:56;;-1:-1:-1;9664:25:3::1;::::0;9688:1:::1;9664:25;:::i;:::-;-1:-1:-1::0;;;;;9650:40:3::1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;9650:40:3::1;-1:-1:-1::0;9731:14:3::1;::::0;::::1;:21:::0;9632:58;;-1:-1:-1;9731:25:3::1;::::0;9755:1:::1;9731:25;:::i;:::-;-1:-1:-1::0;;;;;9717:40:3::1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;9717:40:3::1;-1:-1:-1::0;9819:14:3::1;::::0;::::1;:21:::0;9701:56;;-1:-1:-1;9819:25:3::1;::::0;9843:1:::1;9819:25;:::i;:::-;-1:-1:-1::0;;;;;9783:62:3::1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;9783:62:3::1;;9768:77;;9881:4;9858:9;9868:1;9858:12;;;;;;;;:::i;:::-;;;;;;:28;-1:-1:-1::0;;;;;9858:28:3::1;;;-1:-1:-1::0;;;;;9858:28:3::1;;;::::0;::::1;9917:4;-1:-1:-1::0;;;;;9910:19:3::1;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;::::0;;::::1;-1:-1:-1::0;;9910:21:3::1;::::0;::::1;;::::0;::::1;::::0;;;::::1;::::0;::::1;:::i;:::-;9897:7;9905:1;9897:10;;;;;;;;:::i;:::-;;;;;;:34;;;;9963:4;-1:-1:-1::0;;;;;9956:21:3::1;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;9942:37;;:8;9951:1;9942:11;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;:37;10051:16:::1;::::0;10008:4:::1;::::0;9992:13:::1;::::0;10043:24:::1;::::0;10008:4;10043:24:::1;:::i;:::-;10023:44;;10162:5;10144:15;;10131:9;10118:10;;10100:4;:15;;;:28;;;;:::i;:::-;:40;;;;:::i;:::-;10099:60;;;;:::i;:::-;:68;;;;:::i;:::-;10080:13;10094:1;10080:16;;;;;;;;:::i;:::-;;;;;;:87;;;::::0;::::1;10185:18;10180:644;10222:14;::::0;::::1;:21:::0;10209:34;::::1;10180:644;;;10310:4;:14;;10325:10;10310:26;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;::::1;::::0;:40:::1;::::0;;-1:-1:-1;;;10310:40:3;;;;-1:-1:-1;;;;;10310:26:3;;::::1;::::0;:38:::1;::::0;:40:::1;::::0;;::::1;::::0;;;;;;:26;:40:::1;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;10274:9:::0;10284:14:::1;:10:::0;10297:1:::1;10284:14;:::i;:::-;10274:25;;;;;;;;:::i;:::-;;;;;;:77;-1:-1:-1::0;;;;;10274:77:3::1;;;-1:-1:-1::0;;;;;10274:77:3::1;;;::::0;::::1;10401:4;:14;;10416:10;10401:26;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;::::1;::::0;:40:::1;::::0;;-1:-1:-1;;;10401:40:3;;;;-1:-1:-1;;;;;10401:26:3;;::::1;::::0;:38:::1;::::0;:40:::1;::::0;;::::1;::::0;;;;;;:26;:40:::1;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;10394:55:3::1;;:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;::::0;;::::1;-1:-1:-1::0;;10394:57:3::1;::::0;::::1;;::::0;::::1;::::0;;;::::1;::::0;::::1;:::i;:::-;10368:7:::0;10376:14:::1;:10:::0;10389:1:::1;10376:14;:::i;:::-;10368:23;;;;;;;;:::i;:::-;;;;;;:83;;;;10502:4;:14;;10517:10;10502:26;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;::::1;::::0;:40:::1;::::0;;-1:-1:-1;;;10502:40:3;;;;-1:-1:-1;;;;;10502:26:3;;::::1;::::0;:38:::1;::::0;:40:::1;::::0;;::::1;::::0;;;;;;:26;:40:::1;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;10495:57:3::1;;:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;10468:86;;:8:::0;10477:14:::1;:10:::0;10490:1:::1;10477:14;:::i;:::-;10468:24;;;;;;;;:::i;:::-;;;;;;:86;;;::::0;::::1;10603:4;:14;;10618:10;10603:26;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;:50:::1;::::0;-1:-1:-1;;;10603:50:3;;::::1;::::0;::::1;1245:25:25::0;;;-1:-1:-1;;;;;10603:26:3;;::::1;::::0;:44:::1;::::0;1218:18:25;;10603:50:3::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;10571:13:::0;10585:14:::1;:10:::0;10598:1:::1;10585:14;:::i;:::-;10571:29;;;;;;;;:::i;:::-;;;;;;:82;;;::::0;::::1;10768:4;:14;;10783:10;10768:26;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;:44:::1;::::0;-1:-1:-1;;;10768:44:3;;::::1;::::0;::::1;1245:25:25::0;;;-1:-1:-1;;;;;10768:26:3;;::::1;::::0;:38:::1;::::0;1218:18:25;;10768:44:3::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;10670:142:::0;;-1:-1:-1;10670:142:3;-1:-1:-1;10670:142:3;-1:-1:-1;10674:15:3;10690:14:::1;:10:::0;10703:1:::1;10690:14;:::i;:::-;10674:31;;;;;;;;:::i;:::-;;;;;;10706:13;10720:10;10733:1;10720:14;;;;:::i;:::-;10706:29;;;;;;;;:::i;:::-;;;;;;10736:12;10749:10;10762:1;10749:14;;;;:::i;:::-;10736:28;;;;;;;;:::i;:::-;;;;;;10670:142;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;::::0;;;;;;-1:-1:-1;10670:142:3;10245:12:::1;::::0;::::1;:::i;:::-;;;10180:644;;;;9318:1513;;;8884:1947:::0;;;;;;;;;;:::o;27875:290::-;1109:7:20;1136:6;-1:-1:-1;;;;;1136:6:20;682:10:4;1283:23:20;1275:68;;;;-1:-1:-1;;;1275:68:20;;;;;;;:::i;:::-;2121:8:3::1;27956:11;:32;;27948:73;;;::::0;-1:-1:-1;;;27948:73:3;;18704:2:25;27948:73:3::1;::::0;::::1;18686:21:25::0;18743:2;18723:18;;;18716:30;18782;18762:18;;;18755:58;18830:18;;27948:73:3::1;18502:352:25::0;27948:73:3::1;28032:18;:16;:18::i;:::-;28098:10;::::0;28066:56:::1;::::0;;19033:25:25;;;19089:2;19074:18;;19067:34;;;28086:10:3::1;::::0;28066:56:::1;::::0;19006:18:25;28066:56:3::1;;;;;;;28133:10;:24:::0;27875:290::o;3116:26::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3116:26:3;;;;-1:-1:-1;3116:26:3;;;;;;;;;;;:::o;11710:201::-;11782:4;11823:14;;;:8;:14;;;;;;;;-1:-1:-1;;;;;11823:21:3;;;;;;;;;;11881:22;;11862:15;:41;;11710:201;;;;;:::o;28241:390::-;1109:7:20;1136:6;-1:-1:-1;;;;;1136:6:20;682:10:4;1283:23:20;1275:68;;;;-1:-1:-1;;;1275:68:20;;;;;;;:::i;:::-;28324:14:3::1;;28306:15;:32;28298:65;;;::::0;-1:-1:-1;;;28298:65:3;;19314:2:25;28298:65:3::1;::::0;::::1;19296:21:25::0;19353:2;19333:18;;;19326:30;-1:-1:-1;;;19372:18:25;;;19365:50;19432:18;;28298:65:3::1;19112:344:25::0;28298:65:3::1;28391:8;:15:::0;28374:14:::1;28417:164;28445:6;28439:3;:12;28417:164;;;28475:21;28499:8;28508:3;28499:13;;;;;;;;:::i;:::-;;;;;;;;;;;28475:37;;28554:15;28527:4;:24;;:42;;;;28460:121;28453:5;;;;:::i;:::-;;;28417:164;;;-1:-1:-1::0;;28608:15:3::1;28591:14;:32:::0;28241:390::o;11372:259::-;4304:8;:15;11466:4;;11451;;4297:22;;4289:54;;;;-1:-1:-1;;;4289:54:3;;;;;;;:::i;:::-;11483:21:::1;11507:14:::0;;;:8:::1;:14;::::0;;;;;;;-1:-1:-1;;;;;11507:21:3;::::1;::::0;;;;;;;11565:14:::1;::::0;11546:15:::1;:33;::::0;::::1;::::0;:77:::1;;;11602:4;:21;;;11583:15;:40;;11546:77;11539:84:::0;11372:259;-1:-1:-1;;;;;11372:259:3:o;12167:342::-;12254:25;12292:21;12316:29;12340:4;12316:23;:29::i;:::-;12292:53;;3061:9;12365:16;:35;;12356:71;;;;-1:-1:-1;;;12356:71:3;;19663:2:25;12356:71:3;;;19645:21:25;19702:2;19682:18;;;19675:30;-1:-1:-1;;;19721:18:25;;;19714:52;19783:18;;12356:71:3;19461:346:25;12356:71:3;3009:6;12462:27;12473:16;3009:6;12462:27;:::i;:::-;12445:45;;:15;:45;:::i;:::-;:56;;;;:::i;:::-;12438:63;12167:342;-1:-1:-1;;;;12167:342:3:o;17333:1245::-;1713:1:22;2311:7;;:19;;2303:63;;;;-1:-1:-1;;;2303:63:22;;;;;;;:::i;:::-;1713:1;2444:7;:18;4304:8:3::1;:15:::0;17422:4;;4297:22;::::1;4289:54;;;;-1:-1:-1::0;;;4289:54:3::1;;;;;;;:::i;:::-;17439:21:::2;17463:8;17472:4;17463:14;;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;;17512;;;:8:::2;:14:::0;;;;;;17527:10:::2;17512:26:::0;;;;;;;17632:11;;17463:14:::2;::::0;;::::2;::::0;;::::2;::::0;-1:-1:-1;17632:22:3;-1:-1:-1;17632:22:3::2;17624:67;;;::::0;-1:-1:-1;;;17624:67:3;;20014:2:25;17624:67:3::2;::::0;::::2;19996:21:25::0;;;20033:18;;;20026:30;20092:34;20072:18;;;20065:62;20144:18;;17624:67:3::2;19812:356:25::0;17624:67:3::2;17780:7;17764:4;:12;;;:23;;17756:67;;;::::0;-1:-1:-1;;;17756:67:3;;20375:2:25;17756:67:3::2;::::0;::::2;20357:21:25::0;20414:2;20394:18;;;20387:30;20453:33;20433:18;;;20426:61;20504:18;;17756:67:3::2;20173:355:25::0;17756:67:3::2;17836:17;17848:4;17836:11;:17::i;:::-;17866:28;17889:4;17866:22;:28::i;:::-;17911:11:::0;;17907:247:::2;;17954:7;17939:4;:11;;;:22;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;17988:12:3;;18013:4:::2;-1:-1:-1::0;;;;;17980:38:3;;::::2;17988:12:::0;::::2;17980:38;17976:106;;;18059:7;18039:16;;:27;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;17976:106:3::2;18096:12:::0;;:46:::2;::::0;-1:-1:-1;;;;;18096:12:3::2;18122:10;18134:7:::0;18096:25:::2;:46::i;:::-;18199:20;::::0;::::2;::::0;18185:11;;4157:4:::2;::::0;18185:34:::2;::::0;::::2;:::i;:::-;18184:58;;;;:::i;:::-;18166:15;::::0;::::2;:76:::0;18260:18:::2;18255:176;18297:14;::::0;::::2;:21:::0;18284:34;::::2;18255:176;;;18349:4;:14;;18364:10;18349:26;;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;;::::2;::::0;18407:11;;18349:70:::2;::::0;-1:-1:-1;;;18349:70:3;;::::2;::::0;::::2;20735:25:25::0;;;18395:10:3::2;20776:18:25::0;;;20769:60;20845:18;;;20838:34;;;;-1:-1:-1;;;;;18349:26:3;;::::2;::::0;:39:::2;::::0;20708:18:25;;18349:70:3::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;18320:12;;;;:::i;:::-;;;18255:176;;;-1:-1:-1::0;18447:11:3;;18443:67:::2;;18491:7;18475:4;:12;;;:23;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;18443:67:3::2;18535:35;::::0;1245:25:25;;;18556:4:3;;18544:10:::2;::::0;18535:35:::2;::::0;1233:2:25;1218:18;18535:35:3::2;;;;;;;-1:-1:-1::0;;1669:1:22;2623:22;;-1:-1:-1;;;17333:1245:3:o;13939:92::-;1713:1:22;2311:7;;:19;;2303:63;;;;-1:-1:-1;;;2303:63:22;;;;;;;:::i;:::-;1713:1;2444:7;:18;14006:17:3::1;14018:4:::0;14006:11:::1;:17::i;:::-;-1:-1:-1::0;1669:1:22;2623:22;;13939:92:3:o;18649:998::-;1713:1:22;2311:7;;:19;;2303:63;;;;-1:-1:-1;;;2303:63:22;;;;;;;:::i;:::-;1713:1;2444:7;:18;;;;18723:21:3::1;18747:8;18756:4;18747:14;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;18796;;;:8:::1;:14:::0;;;;;;18811:10:::1;18796:26:::0;;;;;;;18850:11;;18747:14:::1;::::0;;;::::1;::::0;;::::1;18934:12;::::0;::::1;::::0;18747:14;;-1:-1:-1;;;18934:22:3::1;18926:76;;;::::0;-1:-1:-1;;;18926:76:3;;21085:2:25;18926:76:3::1;::::0;::::1;21067:21:25::0;21124:2;21104:18;;;21097:30;21163:34;21143:18;;;21136:62;-1:-1:-1;;;21214:18:25;;;21207:39;21263:19;;18926:76:3::1;20883:405:25::0;18926:76:3::1;19029:1;19015:15:::0;;;19041::::1;::::0;::::1;:19:::0;;;19071::::1;::::0;::::1;:23:::0;;;19105:21:::1;::::0;::::1;:25:::0;;;19141:22:::1;::::0;::::1;:26:::0;19195:12;;19220:4:::1;-1:-1:-1::0;;;;;19187:38:3;;::::1;19195:12:::0;::::1;19187:38;19183:97;;;19262:6;19242:16;;:26;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;19183:97:3::1;19308:12:::0;;:45:::1;::::0;-1:-1:-1;;;;;19308:12:3::1;19334:10;19346:6:::0;19308:25:::1;:45::i;:::-;19371:18;19366:166;19408:14;::::0;::::1;:21:::0;19395:34;::::1;19366:166;;;19460:4;:14;;19475:10;19460:26;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;::::1;::::0;:60:::1;::::0;-1:-1:-1;;;19460:60:3;;::::1;::::0;::::1;20735:25:25::0;;;19506:10:3::1;20776:18:25::0;;;20769:60;20845:18;;;20838:34;;;;-1:-1:-1;;;;;19460:26:3::1;::::0;:39:::1;::::0;20708:18:25;;19460:60:3::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;19431:12;;;;:::i;:::-;;;19366:166;;;;19572:6;19556:4;:12;;;:22;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;19596:43:3::1;::::0;1245:25:25;;;19626:4:3;;19614:10:::1;::::0;19596:43:::1;::::0;1233:2:25;1218:18;19596:43:3::1;;;;;;;-1:-1:-1::0;;1669:1:22;2623:22;;-1:-1:-1;;18649:998:3:o;29450:423::-;1109:7:20;1136:6;-1:-1:-1;;;;;1136:6:20;682:10:4;1283:23:20;1275:68;;;;-1:-1:-1;;;1275:68:20;;;;;;;:::i;:::-;29629:4:3::1;29602:23;:31;;;;29594:116;;;::::0;-1:-1:-1;;;29594:116:3;;21853:2:25;29594:116:3::1;::::0;::::1;21835:21:25::0;21892:2;21872:18;;;21865:30;21931:34;21911:18;;;21904:62;22002:34;21982:18;;;21975:62;-1:-1:-1;;;22053:19:25;;;22046:39;22102:19;;29594:116:3::1;21651:476:25::0;29594:116:3::1;29758:22;::::0;29726:80:::1;::::0;;-1:-1:-1;;;29758:22:3;;::::1;;::::0;;::::1;22329:34:25::0;;22399:15;;22394:2;22379:18;;22372:43;29746:10:3::1;::::0;29726:80:::1;::::0;22277:18:25;29726:80:3::1;;;;;;;29817:22;:48:::0;;::::1;::::0;;::::1;-1:-1:-1::0;;;29817:48:3::1;-1:-1:-1::0;;;;29817:48:3;;::::1;::::0;;;::::1;::::0;;29450:423::o;12948:86::-;1713:1:22;2311:7;;:19;;2303:63;;;;-1:-1:-1;;;2303:63:22;;;;;;;:::i;:::-;1713:1;2444:7;:18;13008::3::1;:16;:18::i;:::-;1669:1:22::0;2623:22;;12948:86:3:o;11950:113::-;12007:7;12034:8;12043:3;12034:13;;;;;;;;:::i;:::-;;;;;;;;;;;:21;;;12027:28;;11950:113;;;:::o;1714:103:20:-;1109:7;1136:6;-1:-1:-1;;;;;1136:6:20;682:10:4;1283:23:20;1275:68;;;;-1:-1:-1;;;1275:68:20;;;;;;;:::i;:::-;1779:30:::1;1806:1;1779:18;:30::i;:::-;1714:103::o:0;29914:350:3:-;30012:16;;-1:-1:-1;;;;;30012:16:3;29998:10;:30;29990:73;;;;-1:-1:-1;;;29990:73:3;;22628:2:25;29990:73:3;;;22610:21:25;22667:2;22647:18;;;22640:30;22706:32;22686:18;;;22679:60;22756:18;;29990:73:3;22426:354:25;29990:73:3;-1:-1:-1;;;;;30082:31:3;;30074:69;;;;-1:-1:-1;;;30074:69:3;;22987:2:25;30074:69:3;;;22969:21:25;23026:2;23006:18;;;22999:30;23065:27;23045:18;;;23038:55;23110:18;;30074:69:3;22785:349:25;30074:69:3;30154:16;:36;;-1:-1:-1;;;;;;30154:36:3;-1:-1:-1;;;;;30154:36:3;;;;;;;;30206:50;;30226:10;;30206:50;;-1:-1:-1;;30206:50:3;29914:350;:::o;30670:290::-;30756:10;;-1:-1:-1;;;;;30756:10:3;30742;:24;30734:61;;;;-1:-1:-1;;;30734:61:3;;23341:2:25;30734:61:3;;;23323:21:25;23380:2;23360:18;;;23353:30;23419:26;23399:18;;;23392:54;23463:18;;30734:61:3;23139:348:25;30734:61:3;-1:-1:-1;;;;;30814:25:3;;30806:57;;;;-1:-1:-1;;;30806:57:3;;23694:2:25;30806:57:3;;;23676:21:25;23733:2;23713:18;;;23706:30;-1:-1:-1;;;23752:18:25;;;23745:49;23811:18;;30806:57:3;23492:343:25;30806:57:3;30874:10;:24;;-1:-1:-1;;;;;;30874:24:3;-1:-1:-1;;;;;30874:24:3;;;;;;;;30914:38;;30928:10;;30914:38;;-1:-1:-1;;30914:38:3;30670:290;:::o;23868:1960::-;1109:7:20;1136:6;-1:-1:-1;;;;;1136:6:20;682:10:4;1283:23:20;1275:68;;;;-1:-1:-1;;;1275:68:20;;;;;;;:::i;:::-;2851:2:3::1;24102:38:::0;::::1;;24094:74;;;::::0;-1:-1:-1;;;24094:74:3;;24042:2:25;24094:74:3::1;::::0;::::1;24024:21:25::0;24081:2;24061:18;;;24054:30;24120:25;24100:18;;;24093:53;24163:18;;24094:74:3::1;23840:347:25::0;24094:74:3::1;2498:9;24187:15;:43;;24179:81;;;::::0;-1:-1:-1;;;24179:81:3;;24394:2:25;24179:81:3::1;::::0;::::1;24376:21:25::0;24433:2;24413:18;;;24406:30;24472:27;24452:18;;;24445:55;24517:18;;24179:81:3::1;24192:349:25::0;24179:81:3::1;2338:6;24285:19;:50;;24277:96;;;::::0;-1:-1:-1;;;24277:96:3;;24748:2:25;24277:96:3::1;::::0;::::1;24730:21:25::0;24787:2;24767:18;;;24760:30;24826:34;24806:18;;;24799:62;-1:-1:-1;;;24877:18:25;;;24870:31;24918:19;;24277:96:3::1;24546:397:25::0;24277:96:3::1;2610:10;24392:15;:43;;24384:81;;;::::0;-1:-1:-1;;;24384:81:3;;25150:2:25;24384:81:3::1;::::0;::::1;25132:21:25::0;25189:2;25169:18;;;25162:30;25228:27;25208:18;;;25201:55;25273:18;;24384:81:3::1;24948:349:25::0;24384:81:3::1;2224:6;24484:16;:44;;24476:86;;;::::0;-1:-1:-1;;;24476:86:3;;25504:2:25;24476:86:3::1;::::0;::::1;25486:21:25::0;25543:2;25523:18;;;25516:30;25582:31;25562:18;;;25555:59;25631:18;;24476:86:3::1;25302:353:25::0;24476:86:3::1;24588:18;24583:371;24612:30:::0;;::::1;24583:371;;;24681:51;24708:10;;24719;24708:22;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;1066:20:2::0;1114:8;;;743:387;24681:51:3::1;24673:93;;;::::0;-1:-1:-1;;;24673:93:3;;26139:2:25;24673:93:3::1;::::0;::::1;26121:21:25::0;26178:2;26158:18;;;26151:30;26217:32;26197:18;;;26190:60;26267:18;;24673:93:3::1;25937:354:25::0;24673:93:3::1;24783:19;24810:10;;24821;24810:22;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;24845:8;:15:::0;24810:51:::1;::::0;-1:-1:-1;;;24810:51:3;;-1:-1:-1;;;;;24810:34:3;;;::::1;::::0;::::1;::::0;:51:::1;::::0;::::1;;1245:25:25::0;;;1233:2;1218:18;;1099:177;24810:51:3::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24781:80;;;;;;;24884:14;24902:1;24884:19;;24876:66;;;::::0;-1:-1:-1;;;24876:66:3;;26498:2:25;24876:66:3::1;::::0;::::1;26480:21:25::0;26537:2;26517:18;;;26510:30;26576:34;26556:18;;;26549:62;-1:-1:-1;;;26627:18:25;;;26620:32;26669:19;;24876:66:3::1;26296:398:25::0;24876:66:3::1;-1:-1:-1::0;24644:12:3::1;::::0;::::1;:::i;:::-;;;24583:371;;;;24966:18;:16;:18::i;:::-;24997:27;25045:14;;25027:15;:32;:67;;25080:14;;25027:67;;;25062:15;25027:67;24997:97;;25126:11;25107:15;;:30;;;;;;;:::i;:::-;;;;;;;;25150:8;25178:488;;;;;;;;25215:8;-1:-1:-1::0;;;;;25178:488:3::1;;;;;25254:11;25178:488;;;;25305:19;25178:488;;;;25360:1;25178:488;;;;25396:15;25178:488;;;;25447:16;25178:488;;;;25499:19;25178:488;;;;25550:15;25178:488;;;;25609:1;25178:488;;;;25640:10;;25178:488;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;-1:-1:-1;25178:488:3;;;;-1:-1:-1;;25150:527:3;;::::1;::::0;;::::1;::::0;;;;;::::1;::::0;;;;;;::::1;::::0;;::::1;;::::0;;-1:-1:-1;;;;;;25150:527:3::1;-1:-1:-1::0;;;;;25150:527:3;;::::1;::::0;;;::::1;::::0;;;;::::1;::::0;;;::::1;::::0;;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;;;;;::::1;::::0;-1:-1:-1;25150:527:3::1;::::0;::::1;::::0;;;;::::1;::::0;::::1;:::i;:::-;;;;25809:10;;25695:125;;;;;;;:::i;:::-;;::::0;;;;::::1;::::0;;25699:8:::1;:15:::0;-1:-1:-1;;;;;25695:125:3;::::1;::::0;25699:19:::1;::::0;25717:1:::1;::::0;25699:19:::1;:::i;:::-;25695:125;::::0;;10912:25:25;;;10968:2;10953:18;;10946:34;;;10996:18;;;10989:34;;;11054:2;11039:18;;11032:34;;;11097:3;11082:19;;11075:35;;;25695:125:3::1;::::0;10899:3:25;10884:19;25695:125:3::1;;;;;;;24083:1745;23868:1960:::0;;;;;;;;:::o;15310:142::-;1713:1:22;2311:7;;:19;;2303:63;;;;-1:-1:-1;;;2303:63:22;;;;;;;:::i;:::-;1713:1;2444:7;:18;15410:34:3::1;15419:4:::0;15425:7;15434:9;15410:8:::1;:34::i;:::-;-1:-1:-1::0;;1669:1:22;2623:22;;-1:-1:-1;15310:142:3:o;29211:178::-;1109:7:20;1136:6;-1:-1:-1;;;;;1136:6:20;682:10:4;1283:23:20;1275:68;;;;-1:-1:-1;;;1275:68:20;;;;;;;:::i;:::-;29291:12:3::1;:28:::0;;-1:-1:-1;;;;;;29291:28:3::1;-1:-1:-1::0;;;;;29291:28:3;::::1;::::0;;::::1;::::0;;;29335:46:::1;::::0;7242:51:25;;;29355:10:3::1;::::0;29335:46:::1;::::0;7230:2:25;7215:18;29335:46:3::1;;;;;;;29211:178:::0;:::o;31004:282::-;1109:7:20;1136:6;-1:-1:-1;;;;;1136:6:20;682:10:4;1283:23:20;1275:68;;;;-1:-1:-1;;;1275:68:20;;;;;;;:::i;:::-;31076:4:3::1;-1:-1:-1::0;;;;;31076:10:3::1;;:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31067:44;;;::::0;-1:-1:-1;;;31067:44:3;;27833:2:25;31067:44:3::1;::::0;::::1;27815:21:25::0;27872:2;27852:18;;;27845:30;-1:-1:-1;;;27891:18:25;;;27884:48;27949:18;;31067:44:3::1;27631:342:25::0;31067:44:3::1;31131:43;::::0;-1:-1:-1;;;31131:43:3;;31168:4:::1;31131:43;::::0;::::1;7242:51:25::0;-1:-1:-1;;;;;31131:28:3;::::1;::::0;::::1;::::0;7215:18:25;;31131:43:3::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:48:::0;31122:98:::1;;;::::0;-1:-1:-1;;;31122:98:3;;28180:2:25;31122:98:3::1;::::0;::::1;28162:21:25::0;28219:2;28199:18;;;28192:30;28258:34;28238:18;;;28231:62;-1:-1:-1;;;28309:18:25;;;28302:34;28353:19;;31122:98:3::1;27978:400:25::0;31122:98:3::1;31247:3;::::0;31236:21:::1;::::0;-1:-1:-1;;;;;31236:21:3;;::::1;::::0;31247:3:::1;::::0;31236:21:::1;::::0;31247:3:::1;::::0;31236:21:::1;31268:3;:10:::0;;-1:-1:-1;;;;;;31268:10:3::1;-1:-1:-1::0;;;;;31268:10:3;;;::::1;::::0;;;::::1;::::0;;31004:282::o;25918:1538::-;1109:7:20;1136:6;-1:-1:-1;;;;;1136:6:20;682:10:4;1283:23:20;1275:68;;;;-1:-1:-1;;;1275:68:20;;;;;;;:::i;:::-;4304:8:3::1;:15:::0;26148:4;;4297:22;::::1;4289:54;;;;-1:-1:-1::0;;;4289:54:3::1;;;;;;;:::i;:::-;2851:2:::2;26173:38:::0;::::2;;26165:74;;;::::0;-1:-1:-1;;;26165:74:3;;28585:2:25;26165:74:3::2;::::0;::::2;28567:21:25::0;28624:2;28604:18;;;28597:30;28663:25;28643:18;;;28636:53;28706:18;;26165:74:3::2;28383:347:25::0;26165:74:3::2;2498:9;26258:15;:43;;26250:81;;;::::0;-1:-1:-1;;;26250:81:3;;28937:2:25;26250:81:3::2;::::0;::::2;28919:21:25::0;28976:2;28956:18;;;28949:30;29015:27;28995:18;;;28988:55;29060:18;;26250:81:3::2;28735:349:25::0;26250:81:3::2;2338:6;26356:19;:50;;26348:96;;;::::0;-1:-1:-1;;;26348:96:3;;29291:2:25;26348:96:3::2;::::0;::::2;29273:21:25::0;29330:2;29310:18;;;29303:30;29369:34;29349:18;;;29342:62;-1:-1:-1;;;29420:18:25;;;29413:31;29461:19;;26348:96:3::2;29089:397:25::0;26348:96:3::2;2610:10;26463:15;:43;;26455:81;;;::::0;-1:-1:-1;;;26455:81:3;;29693:2:25;26455:81:3::2;::::0;::::2;29675:21:25::0;29732:2;29712:18;;;29705:30;29771:27;29751:18;;;29744:55;29816:18;;26455:81:3::2;29491:349:25::0;26455:81:3::2;2224:6;26555:16;:44;;26547:86;;;::::0;-1:-1:-1;;;26547:86:3;;30047:2:25;26547:86:3::2;::::0;::::2;30029:21:25::0;30086:2;30066:18;;;30059:30;30125:31;30105:18;;;30098:59;30174:18;;26547:86:3::2;29845:353:25::0;26547:86:3::2;26651:18;26646:209;26675:30:::0;;::::2;26646:209;;;26744:51;26771:10;;26782;26771:22;;;;;;;:::i;26744:51::-;26736:107;;;::::0;-1:-1:-1;;;26736:107:3;;30405:2:25;26736:107:3::2;::::0;::::2;30387:21:25::0;30444:2;30424:18;;;30417:30;30483:32;30463:18;;;30456:60;30533:18;;26736:107:3::2;30203:354:25::0;26736:107:3::2;26707:12;::::0;::::2;:::i;:::-;;;26646:209;;;;26867:18;:16;:18::i;:::-;26962:11;26934:8;26943:4;26934:14;;;;;;;;:::i;:::-;;;;;;;;;;;:25;;;26916:15;;:43;;;;:::i;:::-;:57;;;;:::i;:::-;26898:15;:75;;;;27014:11;26986:8;26995:4;26986:14;;;;;;;;:::i;:::-;;;;;;;;;;;:25;;:39;;;;27068:15;27036:8;27045:4;27036:14;;;;;;;;:::i;:::-;;;;;;;;;;;:29;;:47;;;;27127:16;27094:8;27103:4;27094:14;;;;;;;;:::i;:::-;;;;;;;;;;;:30;;:49;;;;27181:10;;27154:8;27163:4;27154:14;;;;;;;;:::i;:::-;;;;;;;;;;;:24;;:37;;;;;;;:::i;:::-;;27238:19;27202:8;27211:4;27202:14;;;;;;;;:::i;:::-;;;;;;;;;;;:33;;:55;;;;27300:15;27268:8;27277:4;27268:14;;;;;;;;:::i;:::-;;;;;;;;;;;:29;;:47;;;;27437:10;;27341:107;;;;;;;:::i;:::-;;::::0;;;;;::::2;::::0;;10912:25:25;;;10968:2;10953:18;;10946:34;;;10996:18;;;10989:34;;;11054:2;11039:18;;11032:34;;;11097:3;11082:19;;11075:35;;;27341:107:3;27345:4;;27341:107:::2;::::0;10899:3:25;10884:19;27341:107:3::2;;;;;;;1354:1:20::1;25918:1538:3::0;;;;;;;;:::o;30309:298::-;1109:7:20;1136:6;-1:-1:-1;;;;;1136:6:20;682:10:4;1283:23:20;1275:68;;;;-1:-1:-1;;;1275:68:20;;;;;;;:::i;:::-;2753:3:3::1;30406:42:::0;::::1;;30398:76;;;::::0;-1:-1:-1;;;30398:76:3;;30764:2:25;30398:76:3::1;::::0;::::1;30746:21:25::0;30803:2;30783:18;;;30776:30;-1:-1:-1;;;30822:18:25;;;30815:51;30883:18;;30398:76:3::1;30562:345:25::0;30398:76:3::1;30510:16;::::0;30490:59:::1;::::0;;19033:25:25;;;19089:2;19074:18;;19067:34;;;30490:59:3::1;::::0;19006:18:25;30490:59:3::1;;;;;;;30560:16;:39:::0;30309:298::o;27501:337::-;1109:7:20;1136:6;-1:-1:-1;;;;;1136:6:20;682:10:4;1283:23:20;1275:68;;;;-1:-1:-1;;;1275:68:20;;;;;;;:::i;:::-;27592:18:3::1;:16;:18::i;:::-;27645:10;-1:-1:-1::0;;;;;27626:68:3::1;;27656:8;27665:4;27656:14;;;;;;;;:::i;:::-;;;;;;;;;;;:25;;;27682:11;27626:68;;;;;;19033:25:25::0;;;19089:2;19074:18;;19067:34;19021:2;19006:18;;18859:248;27626:68:3::1;;;;;;;;27769:11;27741:8;27750:4;27741:14;;;;;;;;:::i;:::-;;;;;;;;;;;:25;;;27723:15;;:43;;;;:::i;:::-;:57;;;;:::i;:::-;27705:15;:75;;;;27819:11;27791:8;27800:4;27791:14;;;;;;;;:::i;:::-;;;;;;;;;;;:25;;:39;;;;27501:337:::0;;:::o;10906:403::-;4304:8;:15;10990:26;;10975:4;;4297:22;;4289:54;;;;-1:-1:-1;;;4289:54:3;;;;;;;:::i;:::-;11029:21:::1;11053:8;11062:4;11053:14;;;;;;;;:::i;:::-;;;;;;;;;;;11029:38;;11104:4;:14;;:21;;;;-1:-1:-1::0;;;;;11090:36:3::1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;11090:36:3::1;;11078:48;;11142:18;11137:165;11179:14;::::0;::::1;:21:::0;11166:34;::::1;11137:165;;;11263:4;:14;;11278:10;11263:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;11263:26:3::1;11231:9;11241:10;11231:21;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;11231:59:3;;::::1;:21;::::0;;::::1;::::0;;;;;;;:59;11202:12:::1;::::0;::::1;:::i;:::-;;;11137:165;;;;11018:291;10906:403:::0;;;;:::o;1972:201:20:-;1109:7;1136:6;-1:-1:-1;;;;;1136:6:20;682:10:4;1283:23:20;1275:68;;;;-1:-1:-1;;;1275:68:20;;;;;;;:::i;:::-;-1:-1:-1;;;;;2061:22:20;::::1;2053:73;;;::::0;-1:-1:-1;;;2053:73:20;;31114:2:25;2053:73:20::1;::::0;::::1;31096:21:25::0;31153:2;31133:18;;;31126:30;31192:34;31172:18;;;31165:62;-1:-1:-1;;;31243:18:25;;;31236:36;31289:19;;2053:73:20::1;30912:402:25::0;2053:73:20::1;2137:28;2156:8;2137:18;:28::i;:::-;1972:201:::0;:::o;12561:271:3:-;12679:3;;12629:25;;-1:-1:-1;;;;;12679:3:3;12671:26;12667:150;;12721:3;;:34;;-1:-1:-1;;;12721:34:3;;-1:-1:-1;;;;;7260:32:25;;;12721:34:3;;;7242:51:25;12721:3:3;;;;:27;;7215:18:25;;12721:34:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;12667:150::-;-1:-1:-1;12804:1:3;;12561:271;-1:-1:-1;12561:271:3:o;28717:415::-;1109:7:20;1136:6;-1:-1:-1;;;;;1136:6:20;682:10:4;1283:23:20;1275:68;;;;-1:-1:-1;;;1275:68:20;;;;;;;:::i;:::-;28823:14:3::1;;28805:15;:32;28797:65;;;::::0;-1:-1:-1;;;28797:65:3;;19314:2:25;28797:65:3::1;::::0;::::1;19296:21:25::0;19353:2;19333:18;;;19326:30;-1:-1:-1;;;19372:18:25;;;19365:50;19432:18;;28797:65:3::1;19112:344:25::0;28797:65:3::1;28892:8;:15:::0;28875:14:::1;28918:164;28946:6;28940:3;:12;28918:164;;;28976:21;29000:8;29009:3;29000:13;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;29028:24:::1;29000:13;::::0;;::::1;;29028:24;:42:::0;;;-1:-1:-1;28954:5:3::1;::::0;::::1;:::i;:::-;;;28918:164;;;-1:-1:-1::0;;29092:14:3::1;:32:::0;28717:415::o;6839:1989::-;6952:26;6993:23;7031:25;7071:24;6923:4;4304:8;:15;;;;4297:4;:22;4289:54;;;;-1:-1:-1;;;4289:54:3;;;;;;;:::i;:::-;7123:21:::1;7147:8;7156:4;7147:14;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;7196;;;:8:::1;:14:::0;;;;;;-1:-1:-1;;;;;7196:21:3;::::1;::::0;;;;;;;7254:20:::1;7147:14;::::0;;::::1;::::0;;::::1;7254:20:::0;;::::1;::::0;7304:12:::1;::::0;::::1;::::0;7351:24:::1;::::0;::::1;::::0;7147:14;;-1:-1:-1;7254:20:3;;7333:15:::1;:42;:59:::0;::::1;;;-1:-1:-1::0;7379:13:3;;::::1;7333:59;7329:449;;;7409:18;7448:4;:24;;;7430:15;:42;;;;:::i;:::-;7550:16;::::0;7409:63;;-1:-1:-1;7503:4:3::1;::::0;7487:13:::1;::::0;7542:24:::1;::::0;7503:4;7542:24:::1;:::i;:::-;7522:44;;7583:18;7680:5;7662:15;;7649:9;7631:4;:15;;;7618:10;;7605;:23;;;;:::i;:::-;:41;;;;:::i;:::-;:53;;;;:::i;:::-;7604:73;;;;:::i;:::-;:81;;;;:::i;:::-;7583:102:::0;-1:-1:-1;7758:8:3;7722:32:::1;4157:4;7583:102:::0;7722:32:::1;:::i;:::-;7721:45;;;;:::i;:::-;7702:64;::::0;;::::1;:::i;:::-;;;7394:384;;;;7329:449;7790:19;7890:4;:19;;;7871:4;:15;;;4157:4;7829:15;7815:4;:11;;;:29;;;;:::i;:::-;7814:53;;;;:::i;:::-;7813:73;;;;:::i;:::-;7812:97;;;;:::i;:::-;7948:14;::::0;::::1;:21:::0;7790:119;;-1:-1:-1;7948:25:3::1;::::0;7972:1:::1;7948:25;:::i;:::-;-1:-1:-1::0;;;;;7934:40:3::1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;7934:40:3::1;-1:-1:-1::0;8008:14:3::1;::::0;::::1;:21:::0;7922:52;;-1:-1:-1;8008:25:3::1;::::0;8032:1:::1;8008:25;:::i;:::-;-1:-1:-1::0;;;;;7995:39:3::1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;8069:14:3::1;::::0;::::1;:21:::0;7985:49;;-1:-1:-1;8069:25:3::1;::::0;8093:1:::1;8069:25;:::i;:::-;-1:-1:-1::0;;;;;8055:40:3::1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;8055:40:3::1;-1:-1:-1::0;8131:14:3::1;::::0;::::1;:21:::0;8045:50;;-1:-1:-1;8131:25:3::1;::::0;8155:1:::1;8131:25;:::i;:::-;-1:-1:-1::0;;;;;8117:40:3::1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;8117:40:3::1;;8106:51;;8193:4;8170:9;8180:1;8170:12;;;;;;;;:::i;:::-;;;;;;:28;-1:-1:-1::0;;;;;8170:28:3::1;;;-1:-1:-1::0;;;;;8170:28:3::1;;;::::0;::::1;8229:4;-1:-1:-1::0;;;;;8222:19:3::1;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;::::0;;::::1;-1:-1:-1::0;;8222:21:3::1;::::0;::::1;;::::0;::::1;::::0;;;::::1;::::0;::::1;:::i;:::-;8209:7;8217:1;8209:10;;;;;;;;:::i;:::-;;;;;;:34;;;;8275:4;-1:-1:-1::0;;;;;8268:21:3::1;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;8254:37;;:8;8263:1;8254:11;;;;;;;;:::i;:::-;;;;;;:37;;;::::0;::::1;8315:11;8302:7;8310:1;8302:10;;;;;;;;:::i;:::-;;;;;;:24;;;::::0;::::1;8344:18;8339:482;8381:14;::::0;::::1;:21:::0;8368:34;::::1;8339:482;;;8469:4;:14;;8484:10;8469:26;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;::::1;::::0;:40:::1;::::0;;-1:-1:-1;;;8469:40:3;;;;-1:-1:-1;;;;;8469:26:3;;::::1;::::0;:38:::1;::::0;:40:::1;::::0;;::::1;::::0;;;;;;:26;:40:::1;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;8433:9:::0;8443:14:::1;:10:::0;8456:1:::1;8443:14;:::i;:::-;8433:25;;;;;;;;:::i;:::-;;;;;;:77;-1:-1:-1::0;;;;;8433:77:3::1;;;-1:-1:-1::0;;;;;8433:77:3::1;;;::::0;::::1;8560:4;:14;;8575:10;8560:26;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;::::1;::::0;:40:::1;::::0;;-1:-1:-1;;;8560:40:3;;;;-1:-1:-1;;;;;8560:26:3;;::::1;::::0;:38:::1;::::0;:40:::1;::::0;;::::1;::::0;;;;;;:26;:40:::1;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;8553:55:3::1;;:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;::::0;;::::1;-1:-1:-1::0;;8553:57:3::1;::::0;::::1;;::::0;::::1;::::0;;;::::1;::::0;::::1;:::i;:::-;8527:7:::0;8535:14:::1;:10:::0;8548:1:::1;8535:14;:::i;:::-;8527:23;;;;;;;;:::i;:::-;;;;;;:83;;;;8661:4;:14;;8676:10;8661:26;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;::::1;::::0;:40:::1;::::0;;-1:-1:-1;;;8661:40:3;;;;-1:-1:-1;;;;;8661:26:3;;::::1;::::0;:38:::1;::::0;:40:::1;::::0;;::::1;::::0;;;;;;:26;:40:::1;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;8654:57:3::1;;:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;8627:86;;:8:::0;8636:14:::1;:10:::0;8649:1:::1;8636:14;:::i;:::-;8627:24;;;;;;;;:::i;:::-;;;;;;:86;;;::::0;::::1;8756:4;:14;;8771:10;8756:26;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;:53:::1;::::0;-1:-1:-1;;;;;;8756:53:3;;::::1;::::0;::::1;31493:25:25::0;;;-1:-1:-1;;;;;31554:32:25;;;31534:18;;;31527:60;8756:26:3;;::::1;::::0;:40:::1;::::0;31466:18:25;;8756:53:3::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;8730:7:::0;8738:14:::1;:10:::0;8751:1:::1;8738:14;:::i;:::-;8730:23;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;:79;8404:12:::1;::::0;::::1;:::i;:::-;;;8339:482;;;;7112:1716;;;;;6839:1989:::0;;;;;;;;:::o;15504:1798::-;4304:8;:15;15599:4;;4297:22;;4289:54;;;;-1:-1:-1;;;4289:54:3;;;;;;;:::i;:::-;15616:21:::1;15640:8;15649:4;15640:14;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;15689;;;:8:::1;:14:::0;;;;;;15704:10:::1;15689:26:::0;;;;;;;15640:14:::1;::::0;;::::1;::::0;;::::1;::::0;-1:-1:-1;15728:17:3::1;15698:4:::0;15728:11:::1;:17::i;:::-;15772:1;15762:7;:11;:50;;;;-1:-1:-1::0;15785:12:3::1;::::0;-1:-1:-1;;;;;15785:12:3::1;15777:35:::0;::::1;15762:50;:79;;;;-1:-1:-1::0;;;;;;15816:25:3;::::1;2926:42;15816:25;;15762:79;:106;;;;-1:-1:-1::0;;;;;;15845:23:3;::::1;::::0;::::1;15762:106;:133;;;;-1:-1:-1::0;;;;;;15872:23:3;::::1;15885:10;15872:23;;15762:133;15758:216;;;15912:12;::::0;:50:::1;::::0;-1:-1:-1;;;15912:50:3;;15940:10:::1;15912:50;::::0;::::1;31810:34:25::0;-1:-1:-1;;;;;31880:15:25;;;31860:18;;;31853:43;15912:12:3;;::::1;::::0;:27:::1;::::0;31745:18:25;;15912:50:3::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;15758:216;15986:28;16009:4;15986:22;:28::i;:::-;16031:11:::0;;16027:860:::1;;16083:12:::0;;:37:::1;::::0;-1:-1:-1;;;16083:37:3;;16114:4:::1;16083:37;::::0;::::1;7242:51:25::0;16059:21:3::1;::::0;-1:-1:-1;;;;;16083:12:3::1;::::0;:22:::1;::::0;7215:18:25;;16083:37:3::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;16135:12:::0;;16059:61;;-1:-1:-1;16135:65:3::1;::::0;-1:-1:-1;;;;;16135:12:3::1;16165:10;16185:4;16192:7:::0;16135:29:::1;:65::i;:::-;16238:12:::0;;:37:::1;::::0;-1:-1:-1;;;16238:37:3;;16269:4:::1;16238:37;::::0;::::1;7242:51:25::0;16215:20:3::1;::::0;-1:-1:-1;;;;;16238:12:3::1;::::0;:22:::1;::::0;7215:18:25;;16238:37:3::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;16215:60:::0;-1:-1:-1;16300:28:3::1;16315:13:::0;16215:60;16300:28:::1;:::i;:::-;16349:19;::::0;::::1;::::0;16290:38;;-1:-1:-1;16349:23:3;16345:356:::1;;16393:23;16419:50;16437:10;16449:4;:19;;;16419:17;:50::i;:::-;16393:76:::0;-1:-1:-1;16488:18:3::1;3009:6;16510:28;16393:76:::0;16510:7;:28:::1;:::i;:::-;16509:43;;;;:::i;:::-;16488:64:::0;-1:-1:-1;16581:20:3::1;16488:64:::0;16581:7;:20:::1;:::i;:::-;16646:10;::::0;16620:12;;16571:30;;-1:-1:-1;16620:49:3::1;::::0;-1:-1:-1;;;;;16620:12:3;;::::1;::::0;16646:10:::1;16658::::0;16620:25:::1;:49::i;:::-;16374:327;;16345:356;16732:7;16717:4;:11;;;:22;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;16768:12:3;;16793:4:::1;-1:-1:-1::0;;;;;16760:38:3;;::::1;16768:12:::0;::::1;16760:38;16756:106;;;16839:7;16819:16;;:27;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;16756:106:3::1;16044:843;;16027:860;16932:20;::::0;::::1;::::0;16918:11;;4157:4:::1;::::0;16918:34:::1;::::0;::::1;:::i;:::-;16917:58;;;;:::i;:::-;16899:15;::::0;::::1;:76:::0;16993:18:::1;16988:176;17030:14;::::0;::::1;:21:::0;17017:34;::::1;16988:176;;;17082:4;:14;;17097:10;17082:26;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;17140:11;;17082:70:::1;::::0;-1:-1:-1;;;17082:70:3;;::::1;::::0;::::1;20735:25:25::0;;;17128:10:3::1;20776:18:25::0;;;20769:60;20845:18;;;20838:34;;;;-1:-1:-1;;;;;17082:26:3;;::::1;::::0;:39:::1;::::0;20708:18:25;;17082:70:3::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;17053:12;;;;:::i;:::-;;;16988:176;;;-1:-1:-1::0;17180:11:3;;17176:67:::1;;17224:7;17208:4;:12;;;:23;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;17176:67:3::1;17260:34;::::0;1245:25:25;;;17280:4:3;;17268:10:::1;::::0;17260:34:::1;::::0;1233:2:25;1218:18;17260:34:3::1;;;;;;;15605:1697;;15504:1798:::0;;;;:::o;13086:150::-;13139:11;13134:95;13162:8;:15;13156:21;;13134:95;;;13201:16;13213:3;13201:11;:16::i;:::-;13179:5;;;:::i;:::-;;;13134:95;;14079:1179;4304:8;:15;14141:4;;4297:22;;4289:54;;;;-1:-1:-1;;;4289:54:3;;;;;;;:::i;:::-;14158:21:::1;14182:8;14191:4;14182:14;;;;;;;;:::i;:::-;;;;;;;;;;;14158:38;;14232:4;:24;;;14213:15;:43;14209:82;;14273:7;14079:1179:::0;;:::o;14209:82::-:1;14322:12;::::0;::::1;::::0;14351:13;;;:37:::1;;-1:-1:-1::0;14368:15:3::1;::::0;::::1;::::0;:20;14351:37:::1;14347:133;;;-1:-1:-1::0;14432:15:3::1;14405:24;::::0;;::::1;:42:::0;14079:1179;;:::o;14347:133::-:1;14492:18;14531:4;:24;;;14513:15;:42;;;;:::i;:::-;14492:63;;14568:18;14637:15;;14618:4;:15;;;14604:10;;14591;:23;;;;:::i;:::-;14590:43;;;;:::i;:::-;14589:63;;;;:::i;:::-;14724:16;::::0;14568:84;;-1:-1:-1;14681:4:3::1;::::0;14665:13:::1;::::0;14716:24:::1;::::0;14681:4;14716:24:::1;:::i;:::-;14777:16;::::0;14809::::1;::::0;14696:44;;-1:-1:-1;14753:83:3::1;::::0;-1:-1:-1;;;;;14777:16:3;;::::1;::::0;14829:5;;14796:29:::1;::::0;:10;:29:::1;:::i;:::-;14795:39;;;;:::i;:::-;14753:23;:83::i;:::-;-1:-1:-1::0;14907:73:3::1;14939:4;14973:5:::0;14947:22:::1;14960:9:::0;14947:10;:22:::1;:::i;14907:73::-;14903:256;;;15070:12;::::0;::::1;::::0;15085:5;;15057:9;15022:32:::1;4157:4;15022:10:::0;:32:::1;:::i;:::-;:44;;;;:::i;:::-;15021:61;;;;:::i;:::-;:69;;;;:::i;:::-;14997:4;:20;;;:93;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;15132:15:3::1;15105:24;::::0;::::1;:42:::0;14903:256:::1;15193:24;::::0;::::1;::::0;15229:20:::1;::::0;::::1;::::0;15176:74:::1;::::0;;32109:25:25;;;32165:2;32150:18;;32143:34;;;32193:18;;32186:34;15187:4:3;;15176:74:::1;::::0;32097:2:25;32082:18;15176:74:3::1;;;;;;;14147:1111;;;;;;4354:1;14079:1179:::0;;:::o;19691:2112::-;19757:21;19781:8;19790:4;19781:14;;;;;;;;:::i;:::-;;;;;;;;;19830;;;:8;:14;;;;;;19845:10;19830:26;;;;;;;19873:21;;;;19781:14;;;;;;;;-1:-1:-1;19873:26:3;:63;;;;;19922:14;;19903:15;:33;;19873:63;19869:158;;;19995:20;;;;19977:38;;:15;:38;:::i;:::-;19953:21;;;:62;19869:158;20041:22;;;;20037:126;;20128:23;;;;20110:41;;:15;:41;:::i;:::-;20085:22;;;:66;20037:126;20175:15;20256:4;:15;;;4157:4;20209;:20;;;20195:4;:11;;;:34;;;;:::i;:::-;20194:58;;;;:::i;:::-;20193:78;;;;:::i;:::-;20175:96;;20288:28;20299:4;20305:10;20288;:28::i;:::-;20284:1512;;;20436:30;20449:4;20455:10;20436:12;:30::i;:::-;:37;;;:52;;;20487:1;20477:7;:11;20436:52;20432:467;;;20509:36;20558:4;:19;;;20548:7;:29;;;;:::i;:::-;20509:68;;20596:24;3009:6;20655:4;:19;;;20624:28;:50;;;;:::i;:::-;20623:65;;;;:::i;:::-;20596:92;-1:-1:-1;20717:26:3;20596:92;20717:7;:26;:::i;:::-;20843:16;;20707:36;;-1:-1:-1;20826:52:3;;-1:-1:-1;;;;;20843:16:3;20861;20826;:52::i;:::-;20490:409;;20432:467;21000:23;;;;20982:41;;:15;:41;:::i;:::-;20957:22;;;:66;21060:11;;;;:38;;;21097:1;21075:4;:19;;;:23;21060:38;21056:542;;;21119:22;21154:4;:19;;;21144:7;:29;;;;:::i;:::-;21119:54;;21249:4;:19;;;21225:20;;:43;;;;;;;:::i;:::-;;;;-1:-1:-1;;21309:1:3;21287:19;;;:23;21371:20;;;;21353:38;;:15;:38;:::i;:::-;21329:21;;;:62;21443:44;21460:10;21472:14;21443:16;:44::i;:::-;21506:49;21528:10;21540:14;21506:21;:49::i;:::-;21100:498;21056:542;20284:1512;;;21619:11;;21615:181;;21671:7;21647:20;;:31;;;;;;;:::i;:::-;;;;;;;;21716:7;21693:4;:19;;;:30;;;;;;;:::i;:::-;;;;-1:-1:-1;;21743:41:3;;1245:25:25;;;21770:4:3;;21758:10;;21743:41;;1233:2:25;1218:18;21743:41:3;;;;;;;;21615:181;19746:2057;;;19691:2112;:::o;639:211:23:-;783:58;;-1:-1:-1;;;;;32423:32:25;;783:58:23;;;32405:51:25;32472:18;;;32465:34;;;756:86:23;;776:5;;-1:-1:-1;;;806:23:23;32378:18:25;;783:58:23;;;;-1:-1:-1;;783:58:23;;;;;;;;;;;;;;-1:-1:-1;;;;;783:58:23;-1:-1:-1;;;;;;783:58:23;;;;;;;;;;756:19;:86::i;:::-;639:211;;;:::o;2333:191:20:-;2407:16;2426:6;;-1:-1:-1;;;;;2443:17:20;;;-1:-1:-1;;;;;;2443:17:20;;;;;;2476:40;;2426:6;;;;;;;2476:40;;2407:16;2476:40;2396:128;2333:191;:::o;858:248:23:-;1029:68;;-1:-1:-1;;;;;32768:15:25;;;1029:68:23;;;32750:34:25;32820:15;;32800:18;;;32793:43;32852:18;;;32845:34;;;1002:96:23;;1022:5;;-1:-1:-1;;;1052:27:23;32685:18:25;;1029:68:23;32510:375:25;13280:583:3;13367:4;13433:20;13456:4;-1:-1:-1;;;;;13456:16:3;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;13433:41;;13485:21;13509:4;-1:-1:-1;;;;;13509:14:3;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;13485:40;-1:-1:-1;13485:40:3;13543:22;13558:7;13543:12;:22;:::i;:::-;13542:41;13538:318;;13600:30;;-1:-1:-1;;;13600:30:3;;-1:-1:-1;;;;;32423:32:25;;;13600:30:3;;;32405:51:25;32472:18;;;32465:34;;;13600:4:3;:9;;;;32378:18:25;;13600:30:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;13650:46:3;;1245:25:25;;;-1:-1:-1;;;;;13650:46:3;;;-1:-1:-1;13664:10:3;;-1:-1:-1;13650:46:3;;1233:2:25;1218:18;13650:46:3;;;;;;;13718:4;13711:11;;;;;;13538:318;13790:10;-1:-1:-1;;;;;13769:41:3;;13802:7;13769:41;;;;1245:25:25;;1233:2;1218:18;;1099:177;13769:41:3;;;;;;;;13839:5;13832:12;;;;;;21916:604;22028:16;;21996:29;;-1:-1:-1;;;21996:29:3;;22019:4;21996:29;;;7242:51:25;21996:4:3;-1:-1:-1;;;;;21996:14:3;;;;7215:18:25;;21996:29:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:48;21992:521;;;22276:16;;22244:29;;-1:-1:-1;;;22244:29:3;;22267:4;22244:29;;;7242:51:25;22226:15:3;;22276:16;-1:-1:-1;;;;;22244:4:3;:14;;;;7215:18:25;;22244:29:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:48;;;;:::i;:::-;22226:66;;22322:7;22311;:18;22307:195;;22350:39;-1:-1:-1;;;;;22357:4:3;22350:25;22376:3;22381:7;22350:25;:39::i;22307:195::-;22415:11;;22411:91;;22447:39;-1:-1:-1;;;;;22454:4:3;22447:25;22473:3;22478:7;22447:25;:39::i;22968:655::-;23064:12;;-1:-1:-1;;;;;23064:12:3;23056:35;;;;:65;;-1:-1:-1;23095:22:3;;-1:-1:-1;;;23095:22:3;;;;:26;;23056:65;23052:564;;;23157:12;;:31;;-1:-1:-1;;;23157:31:3;;-1:-1:-1;;;;;7260:32:25;;;23157:31:3;;;7242:51:25;23138:16:3;;23157:12;;:24;;7215:18:25;;23157:31:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;23242:22;;23138:50;;-1:-1:-1;23203:24:3;;23268:5;;23231:33;;-1:-1:-1;;;23242:22:3;;;;23231:8;:33;:::i;:::-;23230:43;;;;:::i;:::-;23203:70;-1:-1:-1;;;;;;23292:22:3;;;;;;:50;;-1:-1:-1;;;;;;23318:24:3;;2926:42;23318:24;;23292:50;:74;;;;;23365:1;23346:16;:20;23292:74;23288:317;;;23387:37;;-1:-1:-1;;;23387:37:3;;-1:-1:-1;;;;;32423:32:25;;;23387:37:3;;;32405:51:25;32472:18;;;32465:34;;;23387:4:3;:9;;;;32378:18:25;;23387:37:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;23443:12:3;;:65;;-1:-1:-1;;;23443:65:3;;-1:-1:-1;;;;;32423:32:25;;;23443:65:3;;;32405:51:25;32472:18;;;32465:34;;;23443:12:3;;;;-1:-1:-1;23443:37:3;;-1:-1:-1;32378:18:25;;23443:65:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23562:8;-1:-1:-1;;;;;23532:57:3;23555:5;-1:-1:-1;;;;;23532:57:3;;23572:16;23532:57;;;;1245:25:25;;1233:2;1218:18;;1099:177;3212:716:23;3636:23;3662:69;3690:4;3662:69;;;;;;;;;;;;;;;;;3670:5;-1:-1:-1;;;;;3662:27:23;;;:69;;;;;:::i;:::-;3746:17;;3636:95;;-1:-1:-1;3746:21:23;3742:179;;3843:10;3832:30;;;;;;;;;;;;:::i;:::-;3824:85;;;;-1:-1:-1;;;3824:85:23;;33348:2:25;3824:85:23;;;33330:21:25;33387:2;33367:18;;;33360:30;33426:34;33406:18;;;33399:62;-1:-1:-1;;;33477:18:25;;;33470:40;33527:19;;3824:85:23;33146:406:25;3549:229:2;3686:12;3718:52;3740:6;3748:4;3754:1;3757:12;3718:21;:52::i;:::-;3711:59;;3549:229;;;;;;:::o;4669:510::-;4839:12;4897:5;4872:21;:30;;4864:81;;;;-1:-1:-1;;;4864:81:2;;33759:2:25;4864:81:2;;;33741:21:25;33798:2;33778:18;;;33771:30;33837:34;33817:18;;;33810:62;-1:-1:-1;;;33888:18:25;;;33881:36;33934:19;;4864:81:2;33557:402:25;4864:81:2;1066:20;;4956:60;;;;-1:-1:-1;;;4956:60:2;;34166:2:25;4956:60:2;;;34148:21:25;34205:2;34185:18;;;34178:30;34244:31;34224:18;;;34217:59;34293:18;;4956:60:2;33964:353:25;4956:60:2;5030:12;5044:23;5071:6;-1:-1:-1;;;;;5071:11:2;5090:5;5097:4;5071:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5029:73;;;;5120:51;5137:7;5146:10;5158:12;5120:16;:51::i;:::-;5113:58;4669:510;-1:-1:-1;;;;;;;4669:510:2:o;7355:712::-;7505:12;7534:7;7530:530;;;-1:-1:-1;7565:10:2;7558:17;;7530:530;7679:17;;:21;7675:374;;7877:10;7871:17;7938:15;7925:10;7921:2;7917:19;7910:44;7675:374;8020:12;8013:20;;-1:-1:-1;;;8013:20:2;;;;;;;;:::i;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:367:25;77:8;87:6;141:3;134:4;126:6;122:17;118:27;108:55;;159:1;156;149:12;108:55;-1:-1:-1;182:20:25;;-1:-1:-1;;;;;214:30:25;;211:50;;;257:1;254;247:12;211:50;294:4;286:6;282:17;270:29;;354:3;347:4;337:6;334:1;330:14;322:6;318:27;314:38;311:47;308:67;;;371:1;368;361:12;308:67;14:367;;;;;:::o;386:131::-;-1:-1:-1;;;;;461:31:25;;451:42;;441:70;;507:1;504;497:12;522:572;617:6;625;633;686:2;674:9;665:7;661:23;657:32;654:52;;;702:1;699;692:12;654:52;742:9;729:23;-1:-1:-1;;;;;767:6:25;764:30;761:50;;;807:1;804;797:12;761:50;846:70;908:7;899:6;888:9;884:22;846:70;:::i;:::-;935:8;;-1:-1:-1;820:96:25;-1:-1:-1;;1020:2:25;1005:18;;992:32;1033:31;992:32;1033:31;:::i;:::-;1083:5;1073:15;;;522:572;;;;;:::o;1281:180::-;1340:6;1393:2;1381:9;1372:7;1368:23;1364:32;1361:52;;;1409:1;1406;1399:12;1361:52;-1:-1:-1;1432:23:25;;1281:180;-1:-1:-1;1281:180:25:o;1466:461::-;1519:3;1557:5;1551:12;1584:6;1579:3;1572:19;1610:4;1639:2;1634:3;1630:12;1623:19;;1676:2;1669:5;1665:14;1697:1;1707:195;1721:6;1718:1;1715:13;1707:195;;;1786:13;;-1:-1:-1;;;;;1782:39:25;1770:52;;1842:12;;;;1877:15;;;;1818:1;1736:9;1707:195;;;-1:-1:-1;1918:3:25;;1466:461;-1:-1:-1;;;;;1466:461:25:o;1932:258::-;2004:1;2014:113;2028:6;2025:1;2022:13;2014:113;;;2104:11;;;2098:18;2085:11;;;2078:39;2050:2;2043:10;2014:113;;;2145:6;2142:1;2139:13;2136:48;;;-1:-1:-1;;2180:1:25;2162:16;;2155:27;1932:258::o;2195:::-;2237:3;2275:5;2269:12;2302:6;2297:3;2290:19;2318:63;2374:6;2367:4;2362:3;2358:14;2351:4;2344:5;2340:16;2318:63;:::i;:::-;2435:2;2414:15;-1:-1:-1;;2410:29:25;2401:39;;;;2442:4;2397:50;;2195:258;-1:-1:-1;;2195:258:25:o;2458:616::-;2510:3;2548:5;2542:12;2575:6;2570:3;2563:19;2601:4;2642:2;2637:3;2633:12;2667:11;2694;2687:18;;2744:6;2741:1;2737:14;2730:5;2726:26;2714:38;;2786:2;2779:5;2775:14;2807:1;2817:231;2831:6;2828:1;2825:13;2817:231;;;2902:5;2896:4;2892:16;2887:3;2880:29;2930:38;2963:4;2954:6;2948:13;2930:38;:::i;:::-;3026:12;;;;2922:46;-1:-1:-1;2991:15:25;;;;2853:1;2846:9;2817:231;;;-1:-1:-1;3064:4:25;;2458:616;-1:-1:-1;;;;;;;2458:616:25:o;3079:435::-;3132:3;3170:5;3164:12;3197:6;3192:3;3185:19;3223:4;3252:2;3247:3;3243:12;3236:19;;3289:2;3282:5;3278:14;3310:1;3320:169;3334:6;3331:1;3328:13;3320:169;;;3395:13;;3383:26;;3429:12;;;;3464:15;;;;3356:1;3349:9;3320:169;;3519:127;3580:10;3575:3;3571:20;3568:1;3561:31;3611:4;3608:1;3601:15;3635:4;3632:1;3625:15;3651:2114;4333:3;4322:9;4315:22;4296:4;4360:57;4412:3;4401:9;4397:19;4389:6;4360:57;:::i;:::-;4436:2;4486:9;4478:6;4474:22;4469:2;4458:9;4454:18;4447:50;4520:43;4556:6;4548;4520:43;:::i;:::-;4506:57;;4611:9;4603:6;4599:22;4594:2;4583:9;4579:18;4572:50;4645:44;4682:6;4674;4645:44;:::i;:::-;4631:58;;4737:9;4729:6;4725:22;4720:2;4709:9;4705:18;4698:50;4771:44;4808:6;4800;4771:44;:::i;:::-;4757:58;;4864:9;4856:6;4852:22;4846:3;4835:9;4831:19;4824:51;4898:44;4935:6;4927;4898:44;:::i;:::-;4884:58;;4991:9;4983:6;4979:22;4973:3;4962:9;4958:19;4951:51;5025:44;5062:6;5054;5025:44;:::i;:::-;5106:22;;;5100:3;5085:19;;5078:51;5178:13;;5200:22;;;5276:15;;;;-1:-1:-1;5238:15:25;;;;5309:1;;5340:399;5356:6;5351:3;5348:15;5340:399;;;5425:6;5419:13;5455:1;5486:2;5482;5479:10;5469:162;;-1:-1:-1;;;5521:31:25;;5580:4;5569:16;;5612:4;5528:1;5602:15;5469:162;-1:-1:-1;5644:15:25;;5714;;;;5679:12;;;;5382:1;5373:11;5340:399;;;-1:-1:-1;5756:3:25;;3651:2114;-1:-1:-1;;;;;;;;;;;;;3651:2114:25:o;6567:315::-;6635:6;6643;6696:2;6684:9;6675:7;6671:23;6667:32;6664:52;;;6712:1;6709;6702:12;6664:52;6748:9;6735:23;6725:33;;6808:2;6797:9;6793:18;6780:32;6821:31;6846:5;6821:31;:::i;:::-;6871:5;6861:15;;;6567:315;;;;;:::o;7497:::-;7565:6;7573;7626:2;7614:9;7605:7;7601:23;7597:32;7594:52;;;7642:1;7639;7632:12;7594:52;7681:9;7668:23;7700:31;7725:5;7700:31;:::i;:::-;7750:5;7802:2;7787:18;;;;7774:32;;-1:-1:-1;;;7497:315:25:o;8025:248::-;8093:6;8101;8154:2;8142:9;8133:7;8129:23;8125:32;8122:52;;;8170:1;8167;8160:12;8122:52;-1:-1:-1;;8193:23:25;;;8263:2;8248:18;;;8235:32;;-1:-1:-1;8025:248:25:o;8278:272::-;8336:6;8389:2;8377:9;8368:7;8364:23;8360:32;8357:52;;;8405:1;8402;8395:12;8357:52;8444:9;8431:23;8494:6;8487:5;8483:18;8476:5;8473:29;8463:57;;8516:1;8513;8506:12;8555:247;8614:6;8667:2;8655:9;8646:7;8642:23;8638:32;8635:52;;;8683:1;8680;8673:12;8635:52;8722:9;8709:23;8741:31;8766:5;8741:31;:::i;9034:956::-;9214:6;9222;9230;9238;9246;9254;9262;9270;9323:3;9311:9;9302:7;9298:23;9294:33;9291:53;;;9340:1;9337;9330:12;9291:53;9376:9;9363:23;9353:33;;9436:2;9425:9;9421:18;9408:32;9449:31;9474:5;9449:31;:::i;:::-;9499:5;-1:-1:-1;9551:2:25;9536:18;;9523:32;;-1:-1:-1;9602:2:25;9587:18;;9574:32;;-1:-1:-1;9653:3:25;9638:19;;9625:33;;-1:-1:-1;9705:3:25;9690:19;;9677:33;;-1:-1:-1;9761:3:25;9746:19;;9733:33;-1:-1:-1;;;;;9778:30:25;;9775:50;;;9821:1;9818;9811:12;9775:50;9860:70;9922:7;9913:6;9902:9;9898:22;9860:70;:::i;:::-;9034:956;;;;-1:-1:-1;9034:956:25;;-1:-1:-1;9034:956:25;;;;;;9949:8;-1:-1:-1;;;9034:956:25:o;9995:383::-;10072:6;10080;10088;10141:2;10129:9;10120:7;10116:23;10112:32;10109:52;;;10157:1;10154;10147:12;10109:52;10193:9;10180:23;10170:33;;10250:2;10239:9;10235:18;10222:32;10212:42;;10304:2;10293:9;10289:18;10276:32;10317:31;10342:5;10317:31;:::i;11392:874::-;11557:6;11565;11573;11581;11589;11597;11605;11613;11666:3;11654:9;11645:7;11641:23;11637:33;11634:53;;;11683:1;11680;11673:12;11634:53;11719:9;11706:23;11696:33;;11776:2;11765:9;11761:18;11748:32;11738:42;;11827:2;11816:9;11812:18;11799:32;11789:42;;11878:2;11867:9;11863:18;11850:32;11840:42;;11929:3;11918:9;11914:19;11901:33;11891:43;;11981:3;11970:9;11966:19;11953:33;11943:43;;12037:3;12026:9;12022:19;12009:33;-1:-1:-1;;;;;12057:6:25;12054:30;12051:50;;;12097:1;12094;12087:12;12497:261;12676:2;12665:9;12658:21;12639:4;12696:56;12748:2;12737:9;12733:18;12725:6;12696:56;:::i;12763:894::-;13196:3;13185:9;13178:22;13159:4;13223:57;13275:3;13264:9;13260:19;13252:6;13223:57;:::i;:::-;13328:9;13320:6;13316:22;13311:2;13300:9;13296:18;13289:50;13362:43;13398:6;13390;13362:43;:::i;:::-;13348:57;;13453:9;13445:6;13441:22;13436:2;13425:9;13421:18;13414:50;13487:44;13524:6;13516;13487:44;:::i;:::-;13473:58;;13579:9;13571:6;13567:22;13562:2;13551:9;13547:18;13540:50;13607:44;13644:6;13636;13607:44;:::i;13662:355::-;13864:2;13846:21;;;13903:2;13883:18;;;13876:30;13942:33;13937:2;13922:18;;13915:61;14008:2;13993:18;;13662:355::o;14382:127::-;14443:10;14438:3;14434:20;14431:1;14424:31;14474:4;14471:1;14464:15;14498:4;14495:1;14488:15;14514:127;14575:10;14570:3;14566:20;14563:1;14556:31;14606:4;14603:1;14596:15;14630:4;14627:1;14620:15;14646:135;14685:3;-1:-1:-1;;14706:17:25;;14703:43;;;14726:18;;:::i;:::-;-1:-1:-1;14773:1:25;14762:13;;14646:135::o;14786:343::-;14988:2;14970:21;;;15027:2;15007:18;;;15000:30;-1:-1:-1;;;15061:2:25;15046:18;;15039:49;15120:2;15105:18;;14786:343::o;15134:128::-;15174:3;15205:1;15201:6;15198:1;15195:13;15192:39;;;15211:18;;:::i;:::-;-1:-1:-1;15247:9:25;;15134:128::o;15267:127::-;15328:10;15323:3;15319:20;15316:1;15309:31;15359:4;15356:1;15349:15;15383:4;15380:1;15373:15;15399:884;15479:6;15532:2;15520:9;15511:7;15507:23;15503:32;15500:52;;;15548:1;15545;15538:12;15500:52;15581:9;15575:16;-1:-1:-1;;;;;15651:2:25;15643:6;15640:14;15637:34;;;15667:1;15664;15657:12;15637:34;15705:6;15694:9;15690:22;15680:32;;15750:7;15743:4;15739:2;15735:13;15731:27;15721:55;;15772:1;15769;15762:12;15721:55;15801:2;15795:9;15823:2;15819;15816:10;15813:36;;;15829:18;;:::i;:::-;15904:2;15898:9;15872:2;15958:13;;-1:-1:-1;;15954:22:25;;;15978:2;15950:31;15946:40;15934:53;;;16002:18;;;16022:22;;;15999:46;15996:72;;;16048:18;;:::i;:::-;16088:10;16084:2;16077:22;16123:2;16115:6;16108:18;16163:7;16158:2;16153;16149;16145:11;16141:20;16138:33;16135:53;;;16184:1;16181;16174:12;16135:53;16197:55;16249:2;16244;16236:6;16232:15;16227:2;16223;16219:11;16197:55;:::i;16288:273::-;16356:6;16409:2;16397:9;16388:7;16384:23;16380:32;16377:52;;;16425:1;16422;16415:12;16377:52;16457:9;16451:16;16507:4;16500:5;16496:16;16489:5;16486:27;16476:55;;16527:1;16524;16517:12;16566:125;16606:4;16634:1;16631;16628:8;16625:34;;;16639:18;;:::i;:::-;-1:-1:-1;16676:9:25;;16566:125::o;16696:168::-;16736:7;16802:1;16798;16794:6;16790:14;16787:1;16784:21;16779:1;16772:9;16765:17;16761:45;16758:71;;;16809:18;;:::i;:::-;-1:-1:-1;16849:9:25;;16696:168::o;16869:217::-;16909:1;16935;16925:132;;16979:10;16974:3;16970:20;16967:1;16960:31;17014:4;17011:1;17004:15;17042:4;17039:1;17032:15;16925:132;-1:-1:-1;17071:9:25;;16869:217::o;17091:266::-;17176:6;17229:2;17217:9;17208:7;17204:23;17200:32;17197:52;;;17245:1;17242;17235:12;17197:52;17277:9;17271:16;17296:31;17321:5;17296:31;:::i;17362:184::-;17432:6;17485:2;17473:9;17464:7;17460:23;17456:32;17453:52;;;17501:1;17498;17491:12;17453:52;-1:-1:-1;17524:16:25;;17362:184;-1:-1:-1;17362:184:25:o;17551:585::-;17683:6;17691;17699;17707;17715;17723;17776:3;17764:9;17755:7;17751:23;17747:33;17744:53;;;17793:1;17790;17783:12;17744:53;17822:9;17816:16;17806:26;;17872:2;17861:9;17857:18;17851:25;17841:35;;17916:2;17905:9;17901:18;17895:25;17885:35;;17960:2;17949:9;17945:18;17939:25;17929:35;;18004:3;17993:9;17989:19;17983:26;17973:36;;18052:3;18041:9;18037:19;18031:26;18086:1;18079:5;18076:12;18066:40;;18102:1;18099;18092:12;18066:40;18125:5;18115:15;;;17551:585;;;;;;;;:::o;18141:356::-;18343:2;18325:21;;;18362:18;;;18355:30;18421:34;18416:2;18401:18;;18394:62;18488:2;18473:18;;18141:356::o;26699:645::-;26895:3;26926;26973:6;26895:3;27007:310;27021:6;27018:1;27015:13;27007:310;;;27096:6;27083:20;27116:31;27141:5;27116:31;:::i;:::-;-1:-1:-1;;;;;27174:31:25;27160:46;;27229:4;27255:14;;;;27292:15;;;;;27202:1;27036:9;27007:310;;;-1:-1:-1;27333:5:25;;26699:645;-1:-1:-1;;;;;26699:645:25:o;27349:277::-;27416:6;27469:2;27457:9;27448:7;27444:23;27440:32;27437:52;;;27485:1;27482;27475:12;27437:52;27517:9;27511:16;27570:5;27563:13;27556:21;27549:5;27546:32;27536:60;;27592:1;27589;27582:12;34322:274;34451:3;34489:6;34483:13;34505:53;34551:6;34546:3;34539:4;34531:6;34527:17;34505:53;:::i;:::-;34574:16;;;;;34322:274;-1:-1:-1;;34322:274:25:o;34601:220::-;34750:2;34739:9;34732:21;34713:4;34770:45;34811:2;34800:9;34796:18;34788:6;34770:45;:::i
Swarm Source
ipfs://5496459a05060af62f4b57ed853f268b8cfdaafd64178c5148da74625bbd4f63
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 24 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
FTM | 100.00% | $0.00015 | 37,720,950.5376 | $5,653.99 |
[ 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.