Contract
0x1f806f7C8dED893fd3caE279191ad7Aa3798E928
2
Contract Overview
My Name Tag:
Not Available, login to update
[ Download CSV Export ]
Contract Name:
MiniChefV2
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/** *Submitted for verification at snowtrace.io on 2021-11-15 */ // Sources flattened with hardhat v2.6.8 https://hardhat.org // File @boringcrypto/boring-solidity/contracts/libraries/[email protected] pragma solidity 0.6.12; // a library for performing overflow-safe math, updated with awesomeness from of DappHub (https://github.com/dapphub/ds-math) library BoringMath { function add(uint256 a, uint256 b) internal pure returns (uint256 c) {require((c = a + b) >= b, "BoringMath: Add Overflow");} function sub(uint256 a, uint256 b) internal pure returns (uint256 c) {require((c = a - b) <= a, "BoringMath: Underflow");} function mul(uint256 a, uint256 b) internal pure returns (uint256 c) {require(b == 0 || (c = a * b)/b == a, "BoringMath: Mul Overflow");} function to128(uint256 a) internal pure returns (uint128 c) { require(a <= uint128(-1), "BoringMath: uint128 Overflow"); c = uint128(a); } function to64(uint256 a) internal pure returns (uint64 c) { require(a <= uint64(-1), "BoringMath: uint64 Overflow"); c = uint64(a); } function to32(uint256 a) internal pure returns (uint32 c) { require(a <= uint32(-1), "BoringMath: uint32 Overflow"); c = uint32(a); } } library BoringMath128 { function add(uint128 a, uint128 b) internal pure returns (uint128 c) {require((c = a + b) >= b, "BoringMath: Add Overflow");} function sub(uint128 a, uint128 b) internal pure returns (uint128 c) {require((c = a - b) <= a, "BoringMath: Underflow");} } library BoringMath64 { function add(uint64 a, uint64 b) internal pure returns (uint64 c) {require((c = a + b) >= b, "BoringMath: Add Overflow");} function sub(uint64 a, uint64 b) internal pure returns (uint64 c) {require((c = a - b) <= a, "BoringMath: Underflow");} } library BoringMath32 { function add(uint32 a, uint32 b) internal pure returns (uint32 c) {require((c = a + b) >= b, "BoringMath: Add Overflow");} function sub(uint32 a, uint32 b) internal pure returns (uint32 c) {require((c = a - b) <= a, "BoringMath: Underflow");} } // File openzeppelin-contracts-legacy/GSN/[email protected] pragma solidity >=0.6.0 <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 GSN 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 payable) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } // File openzeppelin-contracts-legacy/access/[email protected] pragma solidity >=0.6.0 <0.8.0; /** * @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 () internal { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view 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 { emit OwnershipTransferred(_owner, address(0)); _owner = 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"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } // File contracts/libraries/SignedSafeMath.sol pragma solidity 0.6.12; library SignedSafeMath { int256 constant private _INT256_MIN = -2**255; /** * @dev Returns the multiplication of two signed integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(int256 a, int256 b) internal pure returns (int256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } require(!(a == -1 && b == _INT256_MIN), "SignedSafeMath: multiplication overflow"); int256 c = a * b; require(c / a == b, "SignedSafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two signed integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(int256 a, int256 b) internal pure returns (int256) { require(b != 0, "SignedSafeMath: division by zero"); require(!(b == -1 && a == _INT256_MIN), "SignedSafeMath: division overflow"); int256 c = a / b; return c; } /** * @dev Returns the subtraction of two signed integers, reverting on * overflow. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(int256 a, int256 b) internal pure returns (int256) { int256 c = a - b; require((b >= 0 && c <= a) || (b < 0 && c > a), "SignedSafeMath: subtraction overflow"); return c; } /** * @dev Returns the addition of two signed integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(int256 a, int256 b) internal pure returns (int256) { int256 c = a + b; require((b >= 0 && c >= a) || (b < 0 && c < a), "SignedSafeMath: addition overflow"); return c; } function toUInt256(int256 a) internal pure returns (uint256) { require(a >= 0, "Integer < 0"); return uint256(a); } } // File @boringcrypto/boring-solidity/contracts/interfaces/[email protected] pragma solidity 0.6.12; interface IERC20 { function totalSupply() external view returns (uint256); function balanceOf(address account) external view returns (uint256); function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, 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); // EIP 2612 function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external; } // File @boringcrypto/boring-solidity/contracts/libraries/[email protected] pragma solidity 0.6.12; library BoringERC20 { function safeSymbol(IERC20 token) internal view returns(string memory) { (bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(0x95d89b41)); return success && data.length > 0 ? abi.decode(data, (string)) : "???"; } function safeName(IERC20 token) internal view returns(string memory) { (bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(0x06fdde03)); return success && data.length > 0 ? abi.decode(data, (string)) : "???"; } function safeDecimals(IERC20 token) internal view returns (uint8) { (bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(0x313ce567)); return success && data.length == 32 ? abi.decode(data, (uint8)) : 18; } function safeTransfer(IERC20 token, address to, uint256 amount) internal { (bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(0xa9059cbb, to, amount)); require(success && (data.length == 0 || abi.decode(data, (bool))), "BoringERC20: Transfer failed"); } function safeTransferFrom(IERC20 token, address from, address to, uint256 amount) internal { (bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(0x23b872dd, from, to, amount)); require(success && (data.length == 0 || abi.decode(data, (bool))), "BoringERC20: TransferFrom failed"); } } // File contracts/interfaces/IRewarder.sol pragma solidity 0.6.12; interface IRewarder { using BoringERC20 for IERC20; function onReward(uint256 pid, address user, address recipient, uint256 rewardAmount, uint256 newLpAmount) external; function pendingTokens(uint256 pid, address user, uint256 rewardAmount) external view returns (IERC20[] memory, uint256[] memory); } // File contracts/MiniChefV2.sol // SPDX-License-Identifier: MIT pragma solidity 0.6.12; pragma experimental ABIEncoderV2; interface IMigratorChef { // Take the current LP token address and return the new LP token address. // Migrator should have full access to the caller's LP token. function migrate(IERC20 token) external returns (IERC20); } /// @notice The (older) MiniChefV2 contract gives out a reward tokens per block. // The reward tokens must be topped up regularly to ensure users do not accrue non-existent rewards // This implementation aims to avoid that issue by using a dynamic window of funding contract MiniChefV2 is Ownable { using BoringMath for uint256; using BoringMath128 for uint128; using BoringERC20 for IERC20; using SignedSafeMath for int256; /// @notice Info of each MCV2 user. /// `amount` LP token amount the user has provided. /// `rewardDebt` The amount of reward entitled to the user. struct UserInfo { uint256 amount; int256 rewardDebt; } /// @notice Info of each MCV2 pool. /// `allocPoint` The amount of allocation points assigned to the pool. /// Also known as the amount of reward to distribute per block. struct PoolInfo { uint128 accRewardPerShare; uint64 lastRewardTime; uint64 allocPoint; } /// @notice Address of reward (PNG) contract. IERC20 public immutable REWARD; // @notice The migrator contract. It has a lot of power. Can only be set through governance (owner). IMigratorChef public migrator; bool public migrationDisabled; /// @notice Info of each MCV2 pool. PoolInfo[] public poolInfo; /// @notice Address of the LP token for each MCV2 pool. IERC20[] public lpToken; /// @notice Address of each `IRewarder` contract in MCV2. IRewarder[] public rewarder; /// @notice Info of each user that stakes LP tokens. mapping (uint256 => mapping (address => UserInfo)) public userInfo; /// @dev Tokens added mapping (address => bool) public addedTokens; /// @dev Addresses allowed to change rewardsExpiration duration mapping (address => bool) private funder; /// @dev Total allocation points. Must be the sum of all allocation points in all pools. uint256 public totalAllocPoint; uint256 public rewardPerSecond; uint256 private constant ACC_REWARD_PRECISION = 1e12; /// @dev Block time when the rewards per second stops uint256 public rewardsExpiration; event Deposit(address indexed user, uint256 indexed pid, uint256 amount, address indexed to); event Withdraw(address indexed user, uint256 indexed pid, uint256 amount, address indexed to); event EmergencyWithdraw(address indexed user, uint256 indexed pid, uint256 amount, address indexed to); event Harvest(address indexed user, uint256 indexed pid, uint256 amount); event PoolAdded(uint256 indexed pid, uint256 allocPoint, IERC20 indexed lpToken, IRewarder indexed rewarder); event PoolSet(uint256 indexed pid, uint256 allocPoint, IRewarder indexed rewarder, bool overwrite); event PoolUpdate(uint256 indexed pid, uint64 lastRewardTime, uint256 lpSupply, uint256 accRewardPerShare); event MigratorSet(address migrator); event MigratorDisabled(); event Migrate(uint256 pid); event FunderAdded(address funder); event FunderRemoved(address funder); event LogRewardPerSecond(uint256 rewardPerSecond); event LogRewardsExpiration(uint256 rewardsExpiration); /// @param _rewardToken The reward token contract address. /// @param _firstOwner Initial owner of the contract. constructor(address _rewardToken, address _firstOwner) public { require( _rewardToken != address(0) && _firstOwner != address(0), "MiniChefV2::Cannot construct with zero address" ); REWARD = IERC20(_rewardToken); transferOwnership(_firstOwner); } /// @notice Returns the number of MCV2 pools. function poolLength() public view returns (uint256 pools) { pools = poolInfo.length; } /// @notice Returns list of all lpTokens for ease of interfacing function lpTokens() external view returns (IERC20[] memory) { return lpToken; } /// @notice Returns list of all pool infos for ease of interfacing function poolInfos() external view returns (PoolInfo[] memory) { return poolInfo; } /// @notice Returns the status of an address as a funder function isFunder(address _funder) external view returns (bool allowed) { allowed = funder[_funder]; } /// @notice Add a single reward pool after appropriately updating all pools function addPool(uint256 _allocPoint, IERC20 _lpToken, IRewarder _rewarder) external onlyOwner { massUpdateAllPools(); add(_allocPoint, _lpToken, _rewarder); } /// @notice Add multiple reward pools after appropriately updating all pools function addPools(uint256[] calldata _allocPoints, IERC20[] calldata _lpTokens, IRewarder[] calldata _rewarders) external onlyOwner { require( _allocPoints.length == _lpTokens.length && _lpTokens.length == _rewarders.length, "MiniChefV2: invalid parameter lengths" ); massUpdateAllPools(); uint256 len = _allocPoints.length; for (uint256 i = 0; i < len; ++i) { add(_allocPoints[i], _lpTokens[i], _rewarders[i]); } } /// @notice Add a new LP to the pool. Can only be called by the owner. /// DO NOT add the same LP token more than once. Rewards will be messed up if you do. /// @param allocPoint AP of the new pool. /// @param _lpToken Address of the LP ERC-20 token. /// @param _rewarder Address of the rewarder delegate. function add(uint256 allocPoint, IERC20 _lpToken, IRewarder _rewarder) internal { require(addedTokens[address(_lpToken)] == false, "Token already added"); totalAllocPoint = totalAllocPoint.add(allocPoint); lpToken.push(_lpToken); rewarder.push(_rewarder); poolInfo.push(PoolInfo({ allocPoint: allocPoint.to64(), lastRewardTime: block.timestamp.to64(), accRewardPerShare: 0 })); addedTokens[address(_lpToken)] = true; emit PoolAdded(lpToken.length.sub(1), allocPoint, _lpToken, _rewarder); } /// @notice Change information for one pool after appropriately updating all pools function setPool(uint256 _pid, uint256 _allocPoint, IRewarder _rewarder, bool overwrite) external onlyOwner { massUpdateAllPools(); set(_pid, _allocPoint, _rewarder, overwrite); } /// @notice Change information for multiple pools after appropriately updating all pools function setPools(uint256[] calldata pids, uint256[] calldata allocPoints, IRewarder[] calldata rewarders, bool[] calldata overwrites) external onlyOwner { require( pids.length == allocPoints.length && allocPoints.length == rewarders.length && rewarders.length == overwrites.length, "MiniChefV2: invalid parameter lengths" ); massUpdateAllPools(); uint256 len = pids.length; for (uint256 i = 0; i < len; ++i) { set(pids[i], allocPoints[i], rewarders[i], overwrites[i]); } } /// @notice Update the given pool's reward allocation point and `IRewarder` contract. Can only be called by the owner. /// @param _pid The index of the pool. See `poolInfo`. /// @param _allocPoint New AP of the pool. /// @param _rewarder Address of the rewarder delegate. /// @param overwrite True if _rewarder should be `set`. Otherwise `_rewarder` is ignored. function set(uint256 _pid, uint256 _allocPoint, IRewarder _rewarder, bool overwrite) internal { totalAllocPoint = totalAllocPoint.sub(poolInfo[_pid].allocPoint).add(_allocPoint); poolInfo[_pid].allocPoint = _allocPoint.to64(); if (overwrite) { rewarder[_pid] = _rewarder; } emit PoolSet(_pid, _allocPoint, overwrite ? _rewarder : rewarder[_pid], overwrite); } /// @notice Set the `migrator` contract. Can only be called by the owner. /// @param _migrator The contract address to set. function setMigrator(IMigratorChef _migrator) public onlyOwner { require(!migrationDisabled, "MiniChefV2: migration has been disabled"); migrator = _migrator; emit MigratorSet(address(_migrator)); } /// @notice Permanently disable the `migrator` functionality. /// This can only effectively be called once. function disableMigrator() public onlyOwner { migrationDisabled = true; emit MigratorDisabled(); } /// @notice Migrate LP token to another LP contract through the `migrator` contract. /// @param _pid The index of the pool. See `poolInfo`. function migrate(uint256 _pid) public onlyOwner { require(!migrationDisabled, "MiniChefV2: migration has been disabled"); require(address(migrator) != address(0), "MiniChefV2: no migrator set"); IERC20 _lpToken = lpToken[_pid]; uint256 bal = _lpToken.balanceOf(address(this)); _lpToken.approve(address(migrator), bal); IERC20 newLpToken = migrator.migrate(_lpToken); require(bal == newLpToken.balanceOf(address(this)), "MiniChefV2: migrated balance must match"); lpToken[_pid] = newLpToken; emit Migrate(_pid); } /// @notice View function to see pending reward on frontend. /// @param _pid The index of the pool. See `poolInfo`. /// @param _user Address of user. /// @return pending reward for a given user. function pendingReward(uint256 _pid, address _user) external view returns (uint256 pending) { PoolInfo memory pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][_user]; uint256 accRewardPerShare = pool.accRewardPerShare; uint256 lpSupply = lpToken[_pid].balanceOf(address(this)); if (block.timestamp > pool.lastRewardTime && lpSupply != 0) { uint256 time = block.timestamp <= rewardsExpiration ? block.timestamp.sub(pool.lastRewardTime) // Accrue rewards until now : rewardsExpiration > pool.lastRewardTime ? rewardsExpiration.sub(pool.lastRewardTime) // Accrue rewards until expiration : 0; // No rewards to accrue uint256 reward = time.mul(rewardPerSecond).mul(pool.allocPoint) / totalAllocPoint; accRewardPerShare = accRewardPerShare.add(reward.mul(ACC_REWARD_PRECISION) / lpSupply); } pending = int256(user.amount.mul(accRewardPerShare) / ACC_REWARD_PRECISION).sub(user.rewardDebt).toUInt256(); } /// @notice Update reward variables for all pools. Be careful of gas spending! /// @param pids Pool IDs of all to be updated. Make sure to update all active pools. function massUpdatePools(uint256[] calldata pids) external { uint256 len = pids.length; for (uint256 i = 0; i < len; ++i) { updatePool(pids[i]); } } /// @notice Update reward variables for all pools. Be careful of gas spending! function massUpdateAllPools() public { uint256 len = poolInfo.length; for (uint256 pid = 0; pid < len; ++pid) { updatePool(pid); } } /// @notice Update reward variables of the given pool. /// @param pid The index of the pool. See `poolInfo`. /// @return pool Returns the pool that was updated. function updatePool(uint256 pid) public returns (PoolInfo memory pool) { pool = poolInfo[pid]; if (block.timestamp > pool.lastRewardTime) { uint256 lpSupply = lpToken[pid].balanceOf(address(this)); if (lpSupply > 0) { uint256 time = block.timestamp <= rewardsExpiration ? block.timestamp.sub(pool.lastRewardTime) // Accrue rewards until now : rewardsExpiration > pool.lastRewardTime ? rewardsExpiration.sub(pool.lastRewardTime) // Accrue rewards until expiration : 0; // No rewards to accrue uint256 reward = time.mul(rewardPerSecond).mul(pool.allocPoint) / totalAllocPoint; pool.accRewardPerShare = pool.accRewardPerShare.add((reward.mul(ACC_REWARD_PRECISION) / lpSupply).to128()); } pool.lastRewardTime = block.timestamp.to64(); poolInfo[pid] = pool; emit PoolUpdate(pid, pool.lastRewardTime, lpSupply, pool.accRewardPerShare); } } /// @notice Deposit LP tokens to MCV2 for reward allocation. /// @param pid The index of the pool. See `poolInfo`. /// @param amount LP token amount to deposit. /// @param to The receiver of `amount` deposit benefit. function deposit(uint256 pid, uint256 amount, address to) public { PoolInfo memory pool = updatePool(pid); UserInfo storage user = userInfo[pid][to]; // Effects user.amount = user.amount.add(amount); user.rewardDebt = user.rewardDebt.add(int256(amount.mul(pool.accRewardPerShare) / ACC_REWARD_PRECISION)); // Interactions IRewarder _rewarder = rewarder[pid]; if (address(_rewarder) != address(0)) { _rewarder.onReward(pid, to, to, 0, user.amount); } lpToken[pid].safeTransferFrom(msg.sender, address(this), amount); emit Deposit(msg.sender, pid, amount, to); } function depositWithPermit(uint256 pid, uint256 amount, address to, uint deadline, uint8 v, bytes32 r, bytes32 s) external { // permit lpToken[pid].permit(msg.sender, address(this), amount, deadline, v, r, s); // deposit deposit(pid, amount, to); } /// @notice Withdraw LP tokens from MCV2. /// @param pid The index of the pool. See `poolInfo`. /// @param amount LP token amount to withdraw. /// @param to Receiver of the LP tokens. function withdraw(uint256 pid, uint256 amount, address to) public { PoolInfo memory pool = updatePool(pid); UserInfo storage user = userInfo[pid][msg.sender]; // Effects user.rewardDebt = user.rewardDebt.sub(int256(amount.mul(pool.accRewardPerShare) / ACC_REWARD_PRECISION)); user.amount = user.amount.sub(amount); // Interactions IRewarder _rewarder = rewarder[pid]; if (address(_rewarder) != address(0)) { _rewarder.onReward(pid, msg.sender, to, 0, user.amount); } lpToken[pid].safeTransfer(to, amount); emit Withdraw(msg.sender, pid, amount, to); } /// @notice Harvest proceeds for transaction sender to `to`. /// @param pid The index of the pool. See `poolInfo`. /// @param to Receiver of rewards. function harvest(uint256 pid, address to) public { PoolInfo memory pool = updatePool(pid); UserInfo storage user = userInfo[pid][msg.sender]; int256 accumulatedReward = int256(user.amount.mul(pool.accRewardPerShare) / ACC_REWARD_PRECISION); uint256 _pendingReward = accumulatedReward.sub(user.rewardDebt).toUInt256(); // Effects user.rewardDebt = accumulatedReward; // Interactions if (_pendingReward != 0) { REWARD.safeTransfer(to, _pendingReward); } IRewarder _rewarder = rewarder[pid]; if (address(_rewarder) != address(0)) { _rewarder.onReward( pid, msg.sender, to, _pendingReward, user.amount); } emit Harvest(msg.sender, pid, _pendingReward); } /// @notice Withdraw LP tokens from MCV2 and harvest proceeds for transaction sender to `to`. /// @param pid The index of the pool. See `poolInfo`. /// @param amount LP token amount to withdraw. /// @param to Receiver of the LP tokens and rewards. function withdrawAndHarvest(uint256 pid, uint256 amount, address to) public { PoolInfo memory pool = updatePool(pid); UserInfo storage user = userInfo[pid][msg.sender]; int256 accumulatedReward = int256(user.amount.mul(pool.accRewardPerShare) / ACC_REWARD_PRECISION); uint256 _pendingReward = accumulatedReward.sub(user.rewardDebt).toUInt256(); // Effects user.rewardDebt = accumulatedReward.sub(int256(amount.mul(pool.accRewardPerShare) / ACC_REWARD_PRECISION)); user.amount = user.amount.sub(amount); // Interactions REWARD.safeTransfer(to, _pendingReward); IRewarder _rewarder = rewarder[pid]; if (address(_rewarder) != address(0)) { _rewarder.onReward(pid, msg.sender, to, _pendingReward, user.amount); } lpToken[pid].safeTransfer(to, amount); emit Withdraw(msg.sender, pid, amount, to); emit Harvest(msg.sender, pid, _pendingReward); } /// @notice Withdraw without caring about rewards. EMERGENCY ONLY. /// @param pid The index of the pool. See `poolInfo`. /// @param to Receiver of the LP tokens. function emergencyWithdraw(uint256 pid, address to) public { UserInfo storage user = userInfo[pid][msg.sender]; uint256 amount = user.amount; user.amount = 0; user.rewardDebt = 0; // Note: transfer can fail or succeed if `amount` is zero. lpToken[pid].safeTransfer(to, amount); emit EmergencyWithdraw(msg.sender, pid, amount, to); } /// @notice Give permission for an address to change the rewards duration /// @param _funder The address to be added function addFunder(address _funder) external onlyOwner { funder[_funder] = true; emit FunderAdded(_funder); } /// @notice Remove permission for an address to change the rewards duration /// @param _funder The address to be removed function removeFunder(address _funder) external onlyOwner { funder[_funder] = false; emit FunderRemoved(_funder); } modifier onlyFunder() { require(msg.sender == owner() || funder[msg.sender] == true, "MiniChefV2: caller is not a funder"); _; } /// @notice Add funding and potentially extend duration of the rolling reward period /// @param funding Amount of reward token to add /// @param duration Total time (seconds) during which the additional funds are distributed function fundRewards(uint256 funding, uint256 duration) external onlyFunder { require(funding > 0, "MiniChefV2: funding cannot be zero"); REWARD.safeTransferFrom(msg.sender, address(this), funding); if (block.timestamp >= rewardsExpiration) { require(duration > 0, "MiniChefV2: reward duration cannot be zero"); massUpdateAllPools(); rewardsExpiration = block.timestamp.add(duration); rewardPerSecond = funding / duration; } else { uint256 remainingTime = rewardsExpiration.sub(block.timestamp); uint256 remainingRewards = remainingTime.mul(rewardPerSecond); uint256 newRewardsExpiration = rewardsExpiration.add(duration); uint256 newRewardPerSecond = remainingRewards.add(funding) / (newRewardsExpiration.sub(block.timestamp)); if (newRewardPerSecond != rewardPerSecond) { massUpdateAllPools(); } rewardsExpiration = newRewardsExpiration; rewardPerSecond = newRewardPerSecond; } emit LogRewardPerSecond(rewardPerSecond); emit LogRewardsExpiration(rewardsExpiration); } /// @notice Allocate the existing rewards during a newly defined period starting now /// @param duration Time (seconds) to fully distribute the currently present rewards function resetRewardsDuration(uint256 duration) external onlyOwner { require(duration > 0, "MiniChefV2: reward duration cannot be zero"); massUpdateAllPools(); uint256 remainingTime = rewardsExpiration.sub(block.timestamp); uint256 remainingRewards = remainingTime.mul(rewardPerSecond); rewardsExpiration = block.timestamp.add(duration); rewardPerSecond = remainingRewards / (rewardsExpiration.sub(block.timestamp)); emit LogRewardPerSecond(rewardPerSecond); emit LogRewardsExpiration(rewardsExpiration); } /// @notice Extends the rolling reward period by adding funds without changing the reward rate /// @param funding Amount of reward token to add /// @notice minExtension Minimum time (seconds) that the reward duration must be increased function extendRewardsViaFunding(uint256 funding, uint256 minExtension) external { require(funding > 0, "MiniChefV2: funding amount cannot be zero"); uint256 extensionDuration = funding / rewardPerSecond; require(extensionDuration >= minExtension, "MiniChefV2: insufficient extension limit"); rewardsExpiration = rewardsExpiration.add(extensionDuration); REWARD.safeTransferFrom(msg.sender, address(this), funding); emit LogRewardsExpiration(rewardsExpiration); } /// @notice Extends the rolling reward period by adding funds without changing the reward rate /// @param extension Time (seconds) to increase the rewards duration /// @param maxFunding Maximum amount of the reward token that can be used function extendRewardsViaDuration(uint256 extension, uint256 maxFunding) external { require(extension > 0, "MiniChefV2: extension duration cannot be zero"); uint256 fundingRequired = rewardPerSecond.mul(extension); require(fundingRequired <= maxFunding, "MiniChefV2: insufficient funding limit"); rewardsExpiration = rewardsExpiration.add(extension); REWARD.safeTransferFrom(msg.sender, address(this), fundingRequired); emit LogRewardsExpiration(rewardsExpiration); } }
[{"inputs":[{"internalType":"address","name":"_rewardToken","type":"address"},{"internalType":"address","name":"_firstOwner","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"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"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"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"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"EmergencyWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"funder","type":"address"}],"name":"FunderAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"funder","type":"address"}],"name":"FunderRemoved","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":"Harvest","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"rewardPerSecond","type":"uint256"}],"name":"LogRewardPerSecond","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"rewardsExpiration","type":"uint256"}],"name":"LogRewardsExpiration","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"pid","type":"uint256"}],"name":"Migrate","type":"event"},{"anonymous":false,"inputs":[],"name":"MigratorDisabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"migrator","type":"address"}],"name":"MigratorSet","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":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"allocPoint","type":"uint256"},{"indexed":true,"internalType":"contract IERC20","name":"lpToken","type":"address"},{"indexed":true,"internalType":"contract IRewarder","name":"rewarder","type":"address"}],"name":"PoolAdded","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 IRewarder","name":"rewarder","type":"address"},{"indexed":false,"internalType":"bool","name":"overwrite","type":"bool"}],"name":"PoolSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint64","name":"lastRewardTime","type":"uint64"},{"indexed":false,"internalType":"uint256","name":"lpSupply","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"accRewardPerShare","type":"uint256"}],"name":"PoolUpdate","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"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"REWARD","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_funder","type":"address"}],"name":"addFunder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_allocPoint","type":"uint256"},{"internalType":"contract IERC20","name":"_lpToken","type":"address"},{"internalType":"contract IRewarder","name":"_rewarder","type":"address"}],"name":"addPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_allocPoints","type":"uint256[]"},{"internalType":"contract IERC20[]","name":"_lpTokens","type":"address[]"},{"internalType":"contract IRewarder[]","name":"_rewarders","type":"address[]"}],"name":"addPools","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"addedTokens","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":"to","type":"address"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"pid","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"depositWithPermit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"disableMigrator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"pid","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"extension","type":"uint256"},{"internalType":"uint256","name":"maxFunding","type":"uint256"}],"name":"extendRewardsViaDuration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"funding","type":"uint256"},{"internalType":"uint256","name":"minExtension","type":"uint256"}],"name":"extendRewardsViaFunding","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"funding","type":"uint256"},{"internalType":"uint256","name":"duration","type":"uint256"}],"name":"fundRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"pid","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"harvest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_funder","type":"address"}],"name":"isFunder","outputs":[{"internalType":"bool","name":"allowed","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"lpToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpTokens","outputs":[{"internalType":"contract IERC20[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"massUpdateAllPools","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"pids","type":"uint256[]"}],"name":"massUpdatePools","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"migrate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"migrationDisabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"migrator","outputs":[{"internalType":"contract IMigratorChef","name":"","type":"address"}],"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":"pendingReward","outputs":[{"internalType":"uint256","name":"pending","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolInfo","outputs":[{"internalType":"uint128","name":"accRewardPerShare","type":"uint128"},{"internalType":"uint64","name":"lastRewardTime","type":"uint64"},{"internalType":"uint64","name":"allocPoint","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolInfos","outputs":[{"components":[{"internalType":"uint128","name":"accRewardPerShare","type":"uint128"},{"internalType":"uint64","name":"lastRewardTime","type":"uint64"},{"internalType":"uint64","name":"allocPoint","type":"uint64"}],"internalType":"struct MiniChefV2.PoolInfo[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolLength","outputs":[{"internalType":"uint256","name":"pools","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_funder","type":"address"}],"name":"removeFunder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"duration","type":"uint256"}],"name":"resetRewardsDuration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardPerSecond","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"rewarder","outputs":[{"internalType":"contract IRewarder","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardsExpiration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IMigratorChef","name":"_migrator","type":"address"}],"name":"setMigrator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_allocPoint","type":"uint256"},{"internalType":"contract IRewarder","name":"_rewarder","type":"address"},{"internalType":"bool","name":"overwrite","type":"bool"}],"name":"setPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"pids","type":"uint256[]"},{"internalType":"uint256[]","name":"allocPoints","type":"uint256[]"},{"internalType":"contract IRewarder[]","name":"rewarders","type":"address[]"},{"internalType":"bool[]","name":"overwrites","type":"bool[]"}],"name":"setPools","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalAllocPoint","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"}],"name":"updatePool","outputs":[{"components":[{"internalType":"uint128","name":"accRewardPerShare","type":"uint128"},{"internalType":"uint64","name":"lastRewardTime","type":"uint64"},{"internalType":"uint64","name":"allocPoint","type":"uint64"}],"internalType":"struct MiniChefV2.PoolInfo","name":"pool","type":"tuple"}],"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":"int256","name":"rewardDebt","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"pid","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"pid","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"withdrawAndHarvest","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60a06040523480156200001157600080fd5b5060405162003bf038038062003bf0833981016040819052620000349162000198565b600062000040620000e7565b600080546001600160a01b0319166001600160a01b03831690811782556040519293509160008051602062003bd0833981519152908290a3506001600160a01b038216158015906200009a57506001600160a01b03811615155b620000c25760405162461bcd60e51b8152600401620000b9906200021c565b60405180910390fd5b6001600160601b0319606083901b16608052620000df81620000eb565b5050620002b8565b3390565b620000f5620000e7565b6000546001600160a01b03908116911614620001255760405162461bcd60e51b8152600401620000b9906200026a565b6001600160a01b0381166200014e5760405162461bcd60e51b8152600401620000b990620001d6565b600080546040516001600160a01b038085169392169160008051602062003bd083398151915291a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b60008060408385031215620001ab578182fd5b8251620001b8816200029f565b6020840151909250620001cb816200029f565b809150509250929050565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252602e908201527f4d696e694368656656323a3a43616e6e6f7420636f6e7374727563742077697460408201526d68207a65726f206164647265737360901b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6001600160a01b0381168114620002b557600080fd5b50565b60805160601c6138e1620002ef6000398061084d52806109c95280610ccc5280611c425280611f4f528061203f52506138e16000f3fe608060405234801561001057600080fd5b50600436106102d35760003560e01c8063715018a61161018657806398969e82116100e3578063cab34c0811610097578063f2fde38b11610071578063f2fde38b1461059c578063f624d2c5146105af578063f6d676be146105c2576102d3565b8063cab34c081461056e578063d1abb90714610576578063dcd18dd414610589576102d3565b8063b76f4aeb116100c8578063b76f4aeb1461054b578063c1bcb49314610553578063c346253d1461055b576102d3565b806398969e8214610525578063b763e7c414610538576102d3565b80638da5cb5b1161013a5780638f10369a1161011f5780638f10369a146104e9578063933f084f146104f157806393f1a40b14610504576102d3565b80638da5cb5b146104ce5780638dbdbe6d146104d6576102d3565b80637973aa7b1161016b5780637973aa7b146104a057806379d12ffb146104b35780637cd07e47146104c6576102d3565b8063715018a61461047857806378ed5d1f14610480576102d3565b806323cf311811610234578063454b0608116101e857806351eb05a6116101cd57806351eb05a61461043057806357a5b58c1461045057806361f8e66f14610463576102d3565b8063454b06081461040a5780634b87e90f1461041d576102d3565b80632f940c70116102195780632f940c70146103cf57806334c0b46b146103e25780633ef6db91146103f7576102d3565b806323cf3118146103a957806328662551146103bc576102d3565b806318fccc761161028b5780631bbe9d8c116102705780631bbe9d8c146103705780631ea48870146103835780632273ee6e14610396576102d3565b806318fccc761461034a57806319610b2b1461035d576102d3565b80630c812af3116102bc5780630c812af31461030b5780631526fe271461032057806317caf6f114610342576102d3565b8063081e3eda146102d85780630ad58d2f146102f6575b600080fd5b6102e06105ca565b6040516102ed9190613804565b60405180910390f35b610309610304366004612e40565b6105d0565b005b610313610760565b6040516102ed91906130ae565b61033361032e366004612d7f565b610770565b6040516102ed939291906137d9565b6102e06107b3565b610309610358366004612daf565b6107b9565b61030961036b366004612e1f565b610953565b61030961037e366004612b7a565b610a2f565b610313610391366004612b7a565b610ac2565b6103096103a4366004612e6d565b610ae0565b6103096103b7366004612b7a565b610b91565b6103096103ca366004612e1f565b610c48565b6103096103dd366004612daf565b610e3b565b6103ea610ecd565b6040516102ed919061301f565b610309610405366004612c6c565b610f2f565b610309610418366004612d7f565b611031565b61030961042b366004612d7f565b6113a5565b61044361043e366004612d7f565b6114bb565b6040516102ed91906137cb565b61030961045e366004612b96565b6117b9565b61046b6117ef565b6040516102ed919061306c565b61030961187a565b61049361048e366004612d7f565b611906565b6040516102ed9190612f8d565b6103096104ae366004612bd6565b61192d565b6103136104c1366004612b7a565b611a0f565b610493611a24565b610493611a33565b6103096104e4366004612e40565b611a42565b6102e0611bcd565b6103096104ff366004612e1f565b611bd3565b610517610512366004612daf565b611c6a565b6040516102ed92919061384c565b6102e0610533366004612daf565b611c8e565b610309610546366004612ed9565b611ecd565b6102e0611f16565b610309611f1c565b610493610569366004612d7f565b611f40565b610493611f4d565b610309610584366004612e40565b611f71565b610309610597366004612b7a565b6121a4565b6103096105aa366004612b7a565b612229565b6103096105bd366004612dde565b6122ec565b610309612339565b60025490565b6105d8612b11565b6105e1846114bb565b600085815260056020908152604080832033845290915290208151919250906106339064e8d4a510009061061f9087906001600160801b03166123c7565b8161062657fe5b6001840154919004612404565b600182015580546106449085612451565b815560048054600091908790811061065857fe5b6000918252602090912001546001600160a01b0316905080156106de5781546040516344af0fa760e01b81526001600160a01b038316916344af0fa7916106ab918a9133918a916000919060040161380d565b600060405180830381600087803b1580156106c557600080fd5b505af11580156106d9573d6000803e3d6000fd5b505050505b61070c8486600389815481106106f057fe5b6000918252602090912001546001600160a01b03169190612474565b836001600160a01b031686336001600160a01b03167f8166bf25f8a2b7ed3c85049207da4358d16edbed977d23fa2ee6f0dde3ec2132886040516107509190613804565b60405180910390a4505050505050565b600154600160a01b900460ff1681565b6002818154811061077d57fe5b6000918252602090912001546001600160801b038116915067ffffffffffffffff600160801b8204811691600160c01b90041683565b60085481565b6107c1612b11565b6107ca836114bb565b6000848152600560209081526040808320338452909152812082518154939450909264e8d4a510009161080691906001600160801b03166123c7565b8161080d57fe5b049050600061083161082c84600101548461240490919063ffffffff16565b612577565b6001840183905590508015610874576108746001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168683612474565b60006004878154811061088357fe5b6000918252602090912001546001600160a01b0316905080156109085783546040516344af0fa760e01b81526001600160a01b038316916344af0fa7916108d5918b9133918c9189919060040161380d565b600060405180830381600087803b1580156108ef57600080fd5b505af1158015610903573d6000803e3d6000fd5b505050505b86336001600160a01b03167f71bab65ced2e5750775a0613be067df48ef06cf92a496ebf7663ae0660924954846040516109429190613804565b60405180910390a350505050505050565b6000821161097c5760405162461bcd60e51b815260040161097390613420565b60405180910390fd5b6000600954838161098957fe5b049050818110156109ac5760405162461bcd60e51b815260040161097390613184565b600a546109b9908261259d565b600a556109f16001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163330866125c0565b7f8f596a35f0cdefc7e1e1e80e73eced8bfdb8ca9e519ca4042ad0963f19bc239e600a54604051610a229190613804565b60405180910390a1505050565b610a376126c6565b6000546001600160a01b03908116911614610a645760405162461bcd60e51b8152600401610973906134eb565b6001600160a01b03811660009081526007602052604090819020805460ff19166001179055517f0c48d651d88968f843204baf13aa11cd1a590e611c6dcadc7ed4daab1f98462a90610ab7908390612f8d565b60405180910390a150565b6001600160a01b031660009081526007602052604090205460ff1690565b60038781548110610aed57fe5b6000918252602090912001546040517fd505accf0000000000000000000000000000000000000000000000000000000081526001600160a01b039091169063d505accf90610b4b90339030908b908a908a908a908a90600401612fa1565b600060405180830381600087803b158015610b6557600080fd5b505af1158015610b79573d6000803e3d6000fd5b50505050610b88878787611a42565b50505050505050565b610b996126c6565b6000546001600160a01b03908116911614610bc65760405162461bcd60e51b8152600401610973906134eb565b600154600160a01b900460ff1615610bf05760405162461bcd60e51b8152600401610973906135eb565b6001805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383161790556040517f3ba4758949febc607e14523620298f8b5995b1848492ad7aa083372ac886ae0790610ab7908390612f8d565b610c50611a33565b6001600160a01b0316336001600160a01b03161480610c8357503360009081526007602052604090205460ff1615156001145b610c9f5760405162461bcd60e51b8152600401610973906136da565b60008211610cbf5760405162461bcd60e51b815260040161097390613127565b610cf46001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163330856125c0565b600a544210610d445760008111610d1d5760405162461bcd60e51b81526004016109739061376e565b610d25611f1c565b610d2f428261259d565b600a55808281610d3b57fe5b04600955610dc5565b600a54600090610d549042612451565b90506000610d6d600954836123c790919063ffffffff16565b90506000610d8684600a5461259d90919063ffffffff16565b90506000610d948242612451565b610d9e848861259d565b81610da557fe5b0490506009548114610db957610db9611f1c565b600a9190915560095550505b7fde89cb17ac7f58f94792b3e91e086ed85403819c24ceea882491f960ccb1a278600954604051610df69190613804565b60405180910390a17f8f596a35f0cdefc7e1e1e80e73eced8bfdb8ca9e519ca4042ad0963f19bc239e600a54604051610e2f9190613804565b60405180910390a15050565b600082815260056020908152604080832033845290915281208054828255600182019290925560038054919291610e7b918591849190889081106106f057fe5b826001600160a01b031684336001600160a01b03167f2cac5e20e1541d836381527a43f651851e302817b71dc8e810284e69210c1c6b84604051610ebf9190613804565b60405180910390a450505050565b60606003805480602002602001604051908101604052809291908181526020018280548015610f2557602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610f07575b5050505050905090565b610f376126c6565b6000546001600160a01b03908116911614610f645760405162461bcd60e51b8152600401610973906134eb565b8685148015610f7257508483145b8015610f7d57508281145b610f995760405162461bcd60e51b815260040161097390613520565b610fa1611f1c565b8660005b818110156110255761101d8a8a83818110610fbc57fe5b90506020020135898984818110610fcf57fe5b90506020020135888885818110610fe257fe5b9050602002016020810190610ff79190612b7a565b87878681811061100357fe5b90506020020160208101906110189190612d2b565b6126ca565b600101610fa5565b50505050505050505050565b6110396126c6565b6000546001600160a01b039081169116146110665760405162461bcd60e51b8152600401610973906134eb565b600154600160a01b900460ff16156110905760405162461bcd60e51b8152600401610973906135eb565b6001546001600160a01b03166110b85760405162461bcd60e51b8152600401610973906133e9565b6000600382815481106110c757fe5b60009182526020822001546040516370a0823160e01b81526001600160a01b03909116925082906370a0823190611102903090600401612f8d565b60206040518083038186803b15801561111a57600080fd5b505afa15801561112e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111529190612d97565b6001546040517f095ea7b30000000000000000000000000000000000000000000000000000000081529192506001600160a01b038085169263095ea7b3926111a09216908590600401613006565b602060405180830381600087803b1580156111ba57600080fd5b505af11580156111ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111f29190612d47565b506001546040517fce5494bb0000000000000000000000000000000000000000000000000000000081526000916001600160a01b03169063ce5494bb9061123d908690600401612f8d565b602060405180830381600087803b15801561125757600080fd5b505af115801561126b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061128f9190612d63565b6040516370a0823160e01b81529091506001600160a01b038216906370a08231906112be903090600401612f8d565b60206040518083038186803b1580156112d657600080fd5b505afa1580156112ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061130e9190612d97565b821461132c5760405162461bcd60e51b8152600401610973906132d2565b806003858154811061133a57fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055507fd5837b673ffaac69230366d3f7eb7cb2ba2b9fd8f2d4e9d0f5e92d3756b1d546846040516113979190613804565b60405180910390a150505050565b6113ad6126c6565b6000546001600160a01b039081169116146113da5760405162461bcd60e51b8152600401610973906134eb565b600081116113fa5760405162461bcd60e51b81526004016109739061376e565b611402611f1c565b600a546000906114129042612451565b9050600061142b600954836123c790919063ffffffff16565b9050611437428461259d565b600a8190556114469042612451565b818161144e57fe5b0460098190556040517fde89cb17ac7f58f94792b3e91e086ed85403819c24ceea882491f960ccb1a2789161148291613804565b60405180910390a17f8f596a35f0cdefc7e1e1e80e73eced8bfdb8ca9e519ca4042ad0963f19bc239e600a54604051610a229190613804565b6114c3612b11565b600282815481106114d057fe5b60009182526020918290206040805160608101825292909101546001600160801b038116835267ffffffffffffffff600160801b82048116948401859052600160c01b909104169082015291504211156117b45760006003838154811061153357fe5b6000918252602090912001546040516370a0823160e01b81526001600160a01b03909116906370a082319061156c903090600401612f8d565b60206040518083038186803b15801561158457600080fd5b505afa158015611598573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115bc9190612d97565b905080156116a8576000600a5442111561160e57826020015167ffffffffffffffff16600a54116115ee576000611609565b6020830151600a546116099167ffffffffffffffff16612451565b611628565b602083015161162890429067ffffffffffffffff16612451565b9050600060085461165c856040015167ffffffffffffffff16611656600954866123c790919063ffffffff16565b906123c7565b8161166357fe5b04905061169a6116898461167c8464e8d4a510006123c7565b8161168357fe5b04612810565b85516001600160801b031690612839565b6001600160801b0316845250505b6116b142612868565b67ffffffffffffffff16602083015260028054839190859081106116d157fe5b6000918252602091829020835191018054848401516040958601516fffffffffffffffffffffffffffffffff199092166001600160801b03909416939093177fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff16600160801b67ffffffffffffffff948516021777ffffffffffffffffffffffffffffffffffffffffffffffff16600160c01b93909116929092029190911790558301518351915185927fb22162dac390356a083e49a03154a93d123f935f80aac3763ba0fa470c8fbe5e926117aa929091869161385a565b60405180910390a2505b919050565b8060005b818110156117e9576117e08484838181106117d457fe5b905060200201356114bb565b506001016117bd565b50505050565b60606002805480602002602001604051908101604052809291908181526020016000905b8282101561187157600084815260209081902060408051606081018252918501546001600160801b038116835267ffffffffffffffff600160801b8204811684860152600160c01b9091041690820152825260019092019101611813565b50505050905090565b6118826126c6565b6000546001600160a01b039081169116146118af5760405162461bcd60e51b8152600401610973906134eb565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a36000805473ffffffffffffffffffffffffffffffffffffffff19169055565b6003818154811061191357fe5b6000918252602090912001546001600160a01b0316905081565b6119356126c6565b6000546001600160a01b039081169116146119625760405162461bcd60e51b8152600401610973906134eb565b848314801561197057508281145b61198c5760405162461bcd60e51b815260040161097390613520565b611994611f1c565b8460005b81811015611a05576119fd8888838181106119af57fe5b905060200201358787848181106119c257fe5b90506020020160208101906119d79190612b7a565b8686858181106119e357fe5b90506020020160208101906119f89190612b7a565b612892565b600101611998565b5050505050505050565b60066020526000908152604090205460ff1681565b6001546001600160a01b031681565b6000546001600160a01b031690565b611a4a612b11565b611a53846114bb565b60008581526005602090815260408083206001600160a01b03871684529091529020805491925090611a85908561259d565b81558151611abc9064e8d4a5100090611aa89087906001600160801b03166123c7565b81611aaf57fe5b6001840154919004612acb565b8160010181905550600060048681548110611ad357fe5b6000918252602090912001546001600160a01b031690508015611b595781546040516344af0fa760e01b81526001600160a01b038316916344af0fa791611b26918a91899182916000919060040161380d565b600060405180830381600087803b158015611b4057600080fd5b505af1158015611b54573d6000803e3d6000fd5b505050505b611b8933308760038a81548110611b6c57fe5b6000918252602090912001546001600160a01b03169291906125c0565b836001600160a01b031686336001600160a01b03167f02d7e648dd130fc184d383e55bb126ac4c9c60e8f94bf05acdf557ba2d540b47886040516107509190613804565b60095481565b60008211611bf35760405162461bcd60e51b815260040161097390613218565b600954600090611c0390846123c7565b905081811115611c255760405162461bcd60e51b81526004016109739061332f565b600a54611c32908461259d565b600a556109f16001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163330846125c0565b60056020908152600092835260408084209091529082529020805460019091015482565b6000611c98612b11565b60028481548110611ca557fe5b600091825260208083206040805160608101825291909301546001600160801b03808216835267ffffffffffffffff600160801b8304811684860152600160c01b90920490911682850152888552600583528385206001600160a01b0389168652909252918320825160038054949650919492169288908110611d2457fe5b6000918252602090912001546040516370a0823160e01b81526001600160a01b03909116906370a0823190611d5d903090600401612f8d565b60206040518083038186803b158015611d7557600080fd5b505afa158015611d89573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dad9190612d97565b9050836020015167ffffffffffffffff1642118015611dcb57508015155b15611e94576000600a54421115611e1a57846020015167ffffffffffffffff16600a5411611dfa576000611e15565b6020850151600a54611e159167ffffffffffffffff16612451565b611e34565b6020850151611e3490429067ffffffffffffffff16612451565b90506000600854611e62876040015167ffffffffffffffff16611656600954866123c790919063ffffffff16565b81611e6957fe5b049050611e8f83611e7f8364e8d4a510006123c7565b81611e8657fe5b8691900461259d565b935050505b60018301548354611ec29161082c9164e8d4a5100090611eb490876123c7565b81611ebb57fe5b0490612404565b979650505050505050565b611ed56126c6565b6000546001600160a01b03908116911614611f025760405162461bcd60e51b8152600401610973906134eb565b611f0a611f1c565b6117e9848484846126ca565b600a5481565b60025460005b81811015611f3c57611f33816114bb565b50600101611f22565b5050565b6004818154811061191357fe5b7f000000000000000000000000000000000000000000000000000000000000000081565b611f79612b11565b611f82846114bb565b6000858152600560209081526040808320338452909152812082518154939450909264e8d4a5100091611fbe91906001600160801b03166123c7565b81611fc557fe5b0490506000611fe461082c84600101548461240490919063ffffffff16565b905061201f64e8d4a5100061200f86600001516001600160801b0316896123c790919063ffffffff16565b8161201657fe5b84919004612404565b600184015582546120309087612451565b83556120666001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168683612474565b60006004888154811061207557fe5b6000918252602090912001546001600160a01b0316905080156120fa5783546040516344af0fa760e01b81526001600160a01b038316916344af0fa7916120c7918c9133918c9189919060040161380d565b600060405180830381600087803b1580156120e157600080fd5b505af11580156120f5573d6000803e3d6000fd5b505050505b61210c868860038b815481106106f057fe5b856001600160a01b031688336001600160a01b03167f8166bf25f8a2b7ed3c85049207da4358d16edbed977d23fa2ee6f0dde3ec21328a6040516121509190613804565b60405180910390a487336001600160a01b03167f71bab65ced2e5750775a0613be067df48ef06cf92a496ebf7663ae0660924954846040516121929190613804565b60405180910390a35050505050505050565b6121ac6126c6565b6000546001600160a01b039081169116146121d95760405162461bcd60e51b8152600401610973906134eb565b6001600160a01b03811660009081526007602052604090819020805460ff19169055517f423b2da7eebe1997af6d3d8f0c00fd04de1d323a87cd69152dad613731eb232590610ab7908390612f8d565b6122316126c6565b6000546001600160a01b0390811691161461225e5760405162461bcd60e51b8152600401610973906134eb565b6001600160a01b0381166122845760405162461bcd60e51b815260040161097390613275565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a36000805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b6122f46126c6565b6000546001600160a01b039081169116146123215760405162461bcd60e51b8152600401610973906134eb565b612329611f1c565b612334838383612892565b505050565b6123416126c6565b6000546001600160a01b0390811691161461236e5760405162461bcd60e51b8152600401610973906134eb565b600180547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16600160a01b1790556040517ff460fd6afbbd82e0c22f24030b32f63befe14935b39a79bb3520220b21a0ed9490600090a1565b60008115806123e2575050808202828282816123df57fe5b04145b6123fe5760405162461bcd60e51b815260040161097390613737565b92915050565b60008183038183128015906124195750838113155b8061242e575060008312801561242e57508381135b61244a5760405162461bcd60e51b815260040161097390613648565b9392505050565b808203828111156123fe5760405162461bcd60e51b8152600401610973906130b9565b60006060846001600160a01b031663a9059cbb858560405160240161249a929190613006565b6040516020818303038152906040529060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516124e89190612f54565b6000604051808303816000865af19150503d8060008114612525576040519150601f19603f3d011682016040523d82523d6000602084013e61252a565b606091505b50915091508180156125545750805115806125545750808060200190518101906125549190612d47565b6125705760405162461bcd60e51b8152600401610973906131e1565b5050505050565b6000808212156125995760405162461bcd60e51b8152600401610973906130f0565b5090565b818101818110156123fe5760405162461bcd60e51b8152600401610973906134b4565b60006060856001600160a01b03166323b872dd8686866040516024016125e893929190612fe2565b6040516020818303038152906040529060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516126369190612f54565b6000604051808303816000865af19150503d8060008114612673576040519150601f19603f3d011682016040523d82523d6000602084013e612678565b606091505b50915091508180156126a25750805115806126a25750808060200190518101906126a29190612d47565b6126be5760405162461bcd60e51b8152600401610973906136a5565b505050505050565b3390565b61270a83612704600287815481106126de57fe5b60009182526020909120015460085490600160c01b900467ffffffffffffffff16612451565b9061259d565b60085561271683612868565b6002858154811061272357fe5b9060005260206000200160000160186101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550801561279957816004858154811061276a57fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055505b806127c557600484815481106127ab57fe5b6000918252602090912001546001600160a01b03166127c7565b815b6001600160a01b0316847f5766994790e89c27d9799092c4a6b179974a5b61a62663156d03d799cc8c01b8858460405161280292919061383c565b60405180910390a350505050565b60006001600160801b038211156125995760405162461bcd60e51b81526004016109739061347d565b8181016001600160801b0380831690821610156123fe5760405162461bcd60e51b8152600401610973906134b4565b600067ffffffffffffffff8211156125995760405162461bcd60e51b8152600401610973906135b4565b6001600160a01b03821660009081526006602052604090205460ff16156128cb5760405162461bcd60e51b81526004016109739061357d565b6008546128d8908461259d565b6008556003805460018181019092557fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b0180546001600160a01b0380861673ffffffffffffffffffffffffffffffffffffffff199283161790925560048054938401815560009081527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b90930180549285169290911691909117905560408051606081019091529081526002906020810161299242612868565b67ffffffffffffffff1681526020016129aa86612868565b67ffffffffffffffff90811690915282546001818101855560009485526020808620855193018054828701516040978801518716600160c01b0277ffffffffffffffffffffffffffffffffffffffffffffffff91909716600160801b027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff6001600160801b039097166fffffffffffffffffffffffffffffffff1990931692909217959095161793909316939093179091556001600160a01b03808716808652600690935292909320805460ff191684179055600354918416929091612a8f91612451565b7fe72dff05c5a9817b99753fffdec6b7800cc743c2f4b1fbc3eeb93983712a2a4686604051612abe9190613804565b60405180910390a4505050565b6000828201818312801590612ae05750838112155b80612af55750600083128015612af557508381125b61244a5760405162461bcd60e51b81526004016109739061338c565b604080516060810182526000808252602082018190529181019190915290565b60008083601f840112612b42578182fd5b50813567ffffffffffffffff811115612b59578182fd5b6020830191508360208083028501011115612b7357600080fd5b9250929050565b600060208284031215612b8b578081fd5b813561244a81613885565b60008060208385031215612ba8578081fd5b823567ffffffffffffffff811115612bbe578182fd5b612bca85828601612b31565b90969095509350505050565b60008060008060008060608789031215612bee578182fd5b863567ffffffffffffffff80821115612c05578384fd5b612c118a838b01612b31565b90985096506020890135915080821115612c29578384fd5b612c358a838b01612b31565b90965094506040890135915080821115612c4d578384fd5b50612c5a89828a01612b31565b979a9699509497509295939492505050565b6000806000806000806000806080898b031215612c87578182fd5b883567ffffffffffffffff80821115612c9e578384fd5b612caa8c838d01612b31565b909a50985060208b0135915080821115612cc2578384fd5b612cce8c838d01612b31565b909850965060408b0135915080821115612ce6578384fd5b612cf28c838d01612b31565b909650945060608b0135915080821115612d0a578384fd5b50612d178b828c01612b31565b999c989b5096995094979396929594505050565b600060208284031215612d3c578081fd5b813561244a8161389d565b600060208284031215612d58578081fd5b815161244a8161389d565b600060208284031215612d74578081fd5b815161244a81613885565b600060208284031215612d90578081fd5b5035919050565b600060208284031215612da8578081fd5b5051919050565b60008060408385031215612dc1578182fd5b823591506020830135612dd381613885565b809150509250929050565b600080600060608486031215612df2578081fd5b833592506020840135612e0481613885565b91506040840135612e1481613885565b809150509250925092565b60008060408385031215612e31578182fd5b50508035926020909101359150565b600080600060608486031215612e54578081fd5b83359250602084013591506040840135612e1481613885565b600080600080600080600060e0888a031215612e87578081fd5b87359650602088013595506040880135612ea081613885565b945060608801359350608088013560ff81168114612ebc578182fd5b9699959850939692959460a0840135945060c09093013592915050565b60008060008060808587031215612eee578182fd5b84359350602085013592506040850135612f0781613885565b91506060850135612f178161389d565b939692955090935050565b80516001600160801b0316825260208082015167ffffffffffffffff9081169184019190915260409182015116910152565b60008251815b81811015612f745760208186018101518583015201612f5a565b81811115612f825782828501525b509190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0397881681529590961660208601526040850193909352606084019190915260ff16608083015260a082015260c081019190915260e00190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b6020808252825182820181905260009190848201906040850190845b818110156130605783516001600160a01b03168352928401929184019160010161303b565b50909695505050505050565b6020808252825182820181905260009190848201906040850190845b818110156130605761309b838551612f22565b9284019260609290920191600101613088565b901515815260200190565b60208082526015908201527f426f72696e674d6174683a20556e646572666c6f770000000000000000000000604082015260600190565b6020808252600b908201527f496e7465676572203c2030000000000000000000000000000000000000000000604082015260600190565b60208082526022908201527f4d696e694368656656323a2066756e64696e672063616e6e6f74206265207a6560408201527f726f000000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526028908201527f4d696e694368656656323a20696e73756666696369656e7420657874656e736960408201527f6f6e206c696d6974000000000000000000000000000000000000000000000000606082015260800190565b6020808252601c908201527f426f72696e6745524332303a205472616e73666572206661696c656400000000604082015260600190565b6020808252602d908201527f4d696e694368656656323a20657874656e73696f6e206475726174696f6e206360408201527f616e6e6f74206265207a65726f00000000000000000000000000000000000000606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201527f6464726573730000000000000000000000000000000000000000000000000000606082015260800190565b60208082526027908201527f4d696e694368656656323a206d696772617465642062616c616e6365206d757360408201527f74206d6174636800000000000000000000000000000000000000000000000000606082015260800190565b60208082526026908201527f4d696e694368656656323a20696e73756666696369656e742066756e64696e6760408201527f206c696d69740000000000000000000000000000000000000000000000000000606082015260800190565b60208082526021908201527f5369676e6564536166654d6174683a206164646974696f6e206f766572666c6f60408201527f7700000000000000000000000000000000000000000000000000000000000000606082015260800190565b6020808252601b908201527f4d696e694368656656323a206e6f206d69677261746f72207365740000000000604082015260600190565b60208082526029908201527f4d696e694368656656323a2066756e64696e6720616d6f756e742063616e6e6f60408201527f74206265207a65726f0000000000000000000000000000000000000000000000606082015260800190565b6020808252601c908201527f426f72696e674d6174683a2075696e74313238204f766572666c6f7700000000604082015260600190565b60208082526018908201527f426f72696e674d6174683a20416464204f766572666c6f770000000000000000604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526025908201527f4d696e694368656656323a20696e76616c696420706172616d65746572206c6560408201527f6e67746873000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526013908201527f546f6b656e20616c726561647920616464656400000000000000000000000000604082015260600190565b6020808252601b908201527f426f72696e674d6174683a2075696e743634204f766572666c6f770000000000604082015260600190565b60208082526027908201527f4d696e694368656656323a206d6967726174696f6e20686173206265656e206460408201527f697361626c656400000000000000000000000000000000000000000000000000606082015260800190565b60208082526024908201527f5369676e6564536166654d6174683a207375627472616374696f6e206f76657260408201527f666c6f7700000000000000000000000000000000000000000000000000000000606082015260800190565b6020808252818101527f426f72696e6745524332303a205472616e7366657246726f6d206661696c6564604082015260600190565b60208082526022908201527f4d696e694368656656323a2063616c6c6572206973206e6f7420612066756e6460408201527f6572000000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526018908201527f426f72696e674d6174683a204d756c204f766572666c6f770000000000000000604082015260600190565b6020808252602a908201527f4d696e694368656656323a20726577617264206475726174696f6e2063616e6e60408201527f6f74206265207a65726f00000000000000000000000000000000000000000000606082015260800190565b606081016123fe8284612f22565b6001600160801b0393909316835267ffffffffffffffff918216602084015216604082015260600190565b90815260200190565b9485526001600160a01b0393841660208601529190921660408401526060830191909152608082015260a00190565b9182521515602082015260400190565b918252602082015260400190565b67ffffffffffffffff93909316835260208301919091526001600160801b0316604082015260600190565b6001600160a01b038116811461389a57600080fd5b50565b801515811461389a57600080fdfea26469706673582212208e06435957dcb1f336604f20702730439983356787ed675d1e2dc1d25a55698b64736f6c634300060c00338be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e000000000000000000000000060781c2586d68229fde47564546784ab3faca982000000000000000000000000fd7b8597cf8ee5317439b0b5c55a111f6eec449d
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000060781c2586d68229fde47564546784ab3faca982000000000000000000000000fd7b8597cf8ee5317439b0b5c55a111f6eec449d
-----Decoded View---------------
Arg [0] : _rewardToken (address): 0x60781c2586d68229fde47564546784ab3faca982
Arg [1] : _firstOwner (address): 0xfd7b8597cf8ee5317439b0b5c55a111f6eec449d
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 00000000000000000000000060781c2586d68229fde47564546784ab3faca982
Arg [1] : 000000000000000000000000fd7b8597cf8ee5317439b0b5c55a111f6eec449d
Deployed ByteCode Sourcemap
11585:21845:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15062:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25379:676;;;;;;:::i;:::-;;:::i;:::-;;12563:29;;;:::i;:::-;;;;;;;:::i;12642:26::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;13290:30::-;;;:::i;26228:806::-;;;;;;:::i;:::-;;:::i;32102:530::-;;;;;;:::i;:::-;;:::i;29035:132::-;;;;;;:::i;:::-;;:::i;15580:116::-;;;;;;:::i;:::-;;:::i;24876:291::-;;;;;;:::i;:::-;;:::i;19474:230::-;;;;;;:::i;:::-;;:::i;29851:1216::-;;;;;;:::i;:::-;;:::i;28498:402::-;;;;;;:::i;:::-;;:::i;15240:93::-;;;:::i;:::-;;;;;;;:::i;17936:601::-;;;;;;:::i;:::-;;:::i;20109:598::-;;;;;;:::i;:::-;;:::i;31255:589::-;;;;;;:::i;:::-;;:::i;22852:1086::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;22206:193::-;;;;;;:::i;:::-;;:::i;15413:97::-;;;:::i;:::-;;;;;;;:::i;4833:148::-;;;:::i;12736:23::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;16059:530::-;;;;;;:::i;:::-;;:::i;13025:44::-;;;;;;:::i;:::-;;:::i;12527:29::-;;;:::i;4191:79::-;;;:::i;24183:685::-;;;;;;:::i;:::-;;:::i;13329:30::-;;;:::i;32893:534::-;;;;;;:::i;:::-;;:::i;12923:66::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;20930:1094::-;;;;;;:::i;:::-;;:::i;17632:202::-;;;;;;:::i;:::-;;:::i;13486:32::-;;;:::i;22491:177::-;;;:::i;12829:27::-;;;;;;:::i;:::-;;:::i;12384:30::-;;;:::i;27310:1003::-;;;;;;:::i;:::-;;:::i;29306:138::-;;;;;;:::i;:::-;;:::i;5136:244::-;;;;;;:::i;:::-;;:::i;15785:182::-;;;;;;:::i;:::-;;:::i;19830:121::-;;;:::i;15062:100::-;15139:8;:15;;15062:100::o;25379:676::-;25456:20;;:::i;:::-;25479:15;25490:3;25479:10;:15::i;:::-;25505:21;25529:13;;;:8;:13;;;;;;;;25543:10;25529:25;;;;;;;25643:22;;25456:38;;-1:-1:-1;25529:25:0;25605:86;;13414:4;;25632:34;;:6;;-1:-1:-1;;;;;25632:34:0;:10;:34::i;:::-;:57;;;;;25605:15;;;;;25632:57;;25605:19;:86::i;:::-;25587:15;;;:104;25716:11;;:23;;25732:6;25716:15;:23::i;:::-;25702:37;;25799:8;:13;;25702:11;;25799:8;25808:3;;25799:13;;;;;;;;;;;;;;;;-1:-1:-1;;;;;25799:13:0;;-1:-1:-1;25827:32:0;;25823:120;;25919:11;;25876:55;;-1:-1:-1;;;25876:55:0;;-1:-1:-1;;;;;25876:18:0;;;;;:55;;25895:3;;25900:10;;25912:2;;25916:1;;25919:11;25876:55;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25823:120;25955:37;25981:2;25985:6;25955:7;25963:3;25955:12;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;25955:12:0;;:37;:25;:37::i;:::-;26044:2;-1:-1:-1;;;;;26010:37:0;26031:3;26019:10;-1:-1:-1;;;;;26010:37:0;;26036:6;26010:37;;;;;;:::i;:::-;;;;;;;;25379:676;;;;;;:::o;12563:29::-;;;-1:-1:-1;;;12563:29:0;;;;;:::o;12642:26::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;12642:26:0;;;-1:-1:-1;12642:26:0;-1:-1:-1;;;12642:26:0;;;;;-1:-1:-1;;;12642:26:0;;;;:::o;13290:30::-;;;;:::o;26228:806::-;26288:20;;:::i;:::-;26311:15;26322:3;26311:10;:15::i;:::-;26337:21;26361:13;;;:8;:13;;;;;;;;26375:10;26361:25;;;;;;;26447:22;;26431:11;;26288:38;;-1:-1:-1;26361:25:0;;13414:4;;26431:39;;:11;-1:-1:-1;;;;;26431:39:0;:15;:39::i;:::-;:62;;;;;;26397:97;;26505:22;26530:50;:38;26552:4;:15;;;26530:17;:21;;:38;;;;:::i;:::-;:48;:50::i;:::-;26613:15;;;:35;;;26505:75;-1:-1:-1;26690:19:0;;26686:91;;26726:39;-1:-1:-1;;;;;26726:6:0;:19;26746:2;26750:14;26726:19;:39::i;:::-;26789:19;26811:8;26820:3;26811:13;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;26811:13:0;;-1:-1:-1;26839:32:0;;26835:134;;26945:11;;26888:69;;-1:-1:-1;;;26888:69:0;;-1:-1:-1;;;;;26888:18:0;;;;;:69;;26908:3;;26913:10;;26925:2;;26929:14;;26945:11;26888:69;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26835:134;27006:3;26994:10;-1:-1:-1;;;;;26986:40:0;;27011:14;26986:40;;;;;;:::i;:::-;;;;;;;;26228:806;;;;;;;:::o;32102:530::-;32212:1;32202:7;:11;32194:65;;;;-1:-1:-1;;;32194:65:0;;;;;;;:::i;:::-;;;;;;;;;32272:25;32310:15;;32300:7;:25;;;;;;32272:53;;32365:12;32344:17;:33;;32336:86;;;;-1:-1:-1;;;32336:86:0;;;;;;;:::i;:::-;32455:17;;:40;;32477:17;32455:21;:40::i;:::-;32435:17;:60;32508:59;-1:-1:-1;;;;;32508:6:0;:23;32532:10;32552:4;32559:7;32508:23;:59::i;:::-;32585:39;32606:17;;32585:39;;;;;;:::i;:::-;;;;;;;;32102:530;;;:::o;29035:132::-;4413:12;:10;:12::i;:::-;4403:6;;-1:-1:-1;;;;;4403:6:0;;;:22;;;4395:67;;;;-1:-1:-1;;;4395:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;29101:15:0;::::1;;::::0;;;:6:::1;:15;::::0;;;;;;:22;;-1:-1:-1;;29101:22:0::1;29119:4;29101:22;::::0;;29139:20;::::1;::::0;::::1;::::0;29108:7;;29139:20:::1;:::i;:::-;;;;;;;;29035:132:::0;:::o;15580:116::-;-1:-1:-1;;;;;15673:15:0;15638:12;15673:15;;;:6;:15;;;;;;;;;15580:116::o;24876:291::-;25029:7;25037:3;25029:12;;;;;;;;;;;;;;;;;;:73;;;;;-1:-1:-1;;;;;25029:12:0;;;;:19;;:73;;25049:10;;25069:4;;25076:6;;25084:8;;25094:1;;25097;;25100;;25029:73;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25135:24;25143:3;25148:6;25156:2;25135:7;:24::i;:::-;24876:291;;;;;;;:::o;19474:230::-;4413:12;:10;:12::i;:::-;4403:6;;-1:-1:-1;;;;;4403:6:0;;;:22;;;4395:67;;;;-1:-1:-1;;;4395:67:0;;;;;;;:::i;:::-;19557:17:::1;::::0;-1:-1:-1;;;19557:17:0;::::1;;;19556:18;19548:70;;;;-1:-1:-1::0;;;19548:70:0::1;;;;;;;:::i;:::-;19629:8;:20:::0;;-1:-1:-1;;19629:20:0::1;-1:-1:-1::0;;;;;19629:20:0;::::1;;::::0;;19665:31:::1;::::0;::::1;::::0;::::1;::::0;19629:20;;19665:31:::1;:::i;29851:1216::-:0;29507:7;:5;:7::i;:::-;-1:-1:-1;;;;;29493:21:0;:10;-1:-1:-1;;;;;29493:21:0;;:51;;;-1:-1:-1;29525:10:0;29518:18;;;;:6;:18;;;;;;;;:26;;:18;:26;29493:51;29485:98;;;;-1:-1:-1;;;29485:98:0;;;;;;;:::i;:::-;29956:1:::1;29946:7;:11;29938:58;;;;-1:-1:-1::0;;;29938:58:0::1;;;;;;;:::i;:::-;30009:59;-1:-1:-1::0;;;;;30009:6:0::1;:23;30033:10;30053:4;30060:7:::0;30009:23:::1;:59::i;:::-;30104:17;;30085:15;:36;30081:871;;30157:1;30146:8;:12;30138:67;;;;-1:-1:-1::0;;;30138:67:0::1;;;;;;;:::i;:::-;30220:20;:18;:20::i;:::-;30275:29;:15;30295:8:::0;30275:19:::1;:29::i;:::-;30255:17;:49:::0;30347:8;30337:7;30347:8;30337:18:::1;;;;;30319:15;:36:::0;30081:871:::1;;;30412:17;::::0;30388:21:::1;::::0;30412:38:::1;::::0;30434:15:::1;30412:21;:38::i;:::-;30388:62;;30465:24;30492:34;30510:15;;30492:13;:17;;:34;;;;:::i;:::-;30465:61;;30541:28;30572:31;30594:8;30572:17;;:21;;:31;;;;:::i;:::-;30541:62:::0;-1:-1:-1;30618:26:0::1;30680:41;30541:62:::0;30705:15:::1;30680:24;:41::i;:::-;30647:29;:16:::0;30668:7;30647:20:::1;:29::i;:::-;:75;;;;;;30618:104;;30763:15;;30741:18;:37;30737:98;;30799:20;:18;:20::i;:::-;30849:17;:40:::0;;;;30904:15:::1;:36:::0;-1:-1:-1;;30081:871:0::1;30969:35;30988:15;;30969:35;;;;;;:::i;:::-;;;;;;;;31020:39;31041:17;;31020:39;;;;;;:::i;:::-;;;;;;;;29851:1216:::0;;:::o;28498:402::-;28568:21;28592:13;;;:8;:13;;;;;;;;28606:10;28592:25;;;;;;;28645:11;;28667:15;;;-1:-1:-1;28693:15:0;;:19;;;;28793:7;:12;;28592:25;;28645:11;28793:37;;28819:2;;28645:11;;28793:7;28601:3;;28793:12;;;;;:37;28889:2;-1:-1:-1;;;;;28846:46:0;28876:3;28864:10;-1:-1:-1;;;;;28846:46:0;;28881:6;28846:46;;;;;;:::i;:::-;;;;;;;;28498:402;;;;:::o;15240:93::-;15283:15;15318:7;15311:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;15311:14:0;;;;;;;;;;;;;;;;;;;;;;;15240:93;:::o;17936:601::-;4413:12;:10;:12::i;:::-;4403:6;;-1:-1:-1;;;;;4403:6:0;;;:22;;;4395:67;;;;-1:-1:-1;;;4395:67:0;;;;;;;:::i;:::-;18123:33;;::::1;:88:::0;::::1;;;-1:-1:-1::0;18173:38:0;;::::1;18123:88;:142;;;;-1:-1:-1::0;18228:37:0;;::::1;18123:142;18101:229;;;;-1:-1:-1::0;;;18101:229:0::1;;;;;;;:::i;:::-;18343:20;:18;:20::i;:::-;18390:4:::0;18376:11:::1;18412:118;18436:3;18432:1;:7;18412:118;;;18461:57;18465:4;;18470:1;18465:7;;;;;;;;;;;;;18474:11;;18486:1;18474:14;;;;;;;;;;;;;18490:9;;18500:1;18490:12;;;;;;;;;;;;;;;;;;;;:::i;:::-;18504:10;;18515:1;18504:13;;;;;;;;;;;;;;;;;;;;:::i;:::-;18461:3;:57::i;:::-;18441:3;;18412:118;;;;4473:1;17936:601:::0;;;;;;;;:::o;20109:598::-;4413:12;:10;:12::i;:::-;4403:6;;-1:-1:-1;;;;;4403:6:0;;;:22;;;4395:67;;;;-1:-1:-1;;;4395:67:0;;;;;;;:::i;:::-;20177:17:::1;::::0;-1:-1:-1;;;20177:17:0;::::1;;;20176:18;20168:70;;;;-1:-1:-1::0;;;20168:70:0::1;;;;;;;:::i;:::-;20265:8;::::0;-1:-1:-1;;;;;20265:8:0::1;20249:71;;;;-1:-1:-1::0;;;20249:71:0::1;;;;;;;:::i;:::-;20331:15;20349:7;20357:4;20349:13;;;;;;;;;::::0;;;::::1;::::0;;::::1;::::0;20387:33:::1;::::0;-1:-1:-1;;;20387:33:0;;-1:-1:-1;;;;;20349:13:0;;::::1;::::0;-1:-1:-1;20349:13:0;;20387:18:::1;::::0;:33:::1;::::0;20414:4:::1;::::0;20387:33:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20456:8;::::0;20431:40:::1;::::0;;;;20373:47;;-1:-1:-1;;;;;;20431:16:0;;::::1;::::0;::::1;::::0;:40:::1;::::0;20456:8:::1;::::0;20373:47;;20431:40:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;20502:8:0::1;::::0;:26:::1;::::0;;;;20482:17:::1;::::0;-1:-1:-1;;;;;20502:8:0::1;::::0;:16:::1;::::0;:26:::1;::::0;20519:8;;20502:26:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20554:35;::::0;-1:-1:-1;;;20554:35:0;;20482:46;;-1:-1:-1;;;;;;20554:20:0;::::1;::::0;::::1;::::0;:35:::1;::::0;20583:4:::1;::::0;20554:35:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20547:3;:42;20539:94;;;;-1:-1:-1::0;;;20539:94:0::1;;;;;;;:::i;:::-;20660:10;20644:7;20652:4;20644:13;;;;;;;;;;;;;;;;:26;;;;;-1:-1:-1::0;;;;;20644:26:0::1;;;;;-1:-1:-1::0;;;;;20644:26:0::1;;;;;;20686:13;20694:4;20686:13;;;;;;:::i;:::-;;;;;;;;4473:1;;;20109:598:::0;:::o;31255:589::-;4413:12;:10;:12::i;:::-;4403:6;;-1:-1:-1;;;;;4403:6:0;;;:22;;;4395:67;;;;-1:-1:-1;;;4395:67:0;;;;;;;:::i;:::-;31352:1:::1;31341:8;:12;31333:67;;;;-1:-1:-1::0;;;31333:67:0::1;;;;;;;:::i;:::-;31413:20;:18;:20::i;:::-;31470:17;::::0;31446:21:::1;::::0;31470:38:::1;::::0;31492:15:::1;31470:21;:38::i;:::-;31446:62;;31519:24;31546:34;31564:15;;31546:13;:17;;:34;;;;:::i;:::-;31519:61:::0;-1:-1:-1;31611:29:0::1;:15;31631:8:::0;31611:19:::1;:29::i;:::-;31591:17;:49:::0;;;31689:38:::1;::::0;31711:15:::1;31689:21;:38::i;:::-;31669:16;:59;;;;;;31651:15;:77:::0;;;31746:35:::1;::::0;::::1;::::0;::::1;::::0;::::1;:::i;:::-;;;;;;;;31797:39;31818:17;;31797:39;;;;;;:::i;22852:1086::-:0;22901:20;;:::i;:::-;22941:8;22950:3;22941:13;;;;;;;;;;;;;;;;;22934:20;;;;;;;;22941:13;;;;22934:20;-1:-1:-1;;;;;22934:20:0;;;;;-1:-1:-1;;;22934:20:0;;;;;;;;;;-1:-1:-1;;;22934:20:0;;;;;;;;;-1:-1:-1;22969:15:0;:37;22965:966;;;23023:16;23042:7;23050:3;23042:12;;;;;;;;;;;;;;;;;;:37;;-1:-1:-1;;;23042:37:0;;-1:-1:-1;;;;;23042:12:0;;;;:22;;:37;;23073:4;;23042:37;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;23023:56;-1:-1:-1;23098:12:0;;23094:642;;23131:12;23165:17;;23146:15;:36;;:325;;23318:4;:19;;;23298:39;;:17;;:39;:173;;23470:1;23298:173;;;23387:19;;;;23365:17;;:42;;;;:21;:42::i;:::-;23146:325;;;23226:19;;;;23206:40;;:15;;:40;;:19;:40::i;:::-;23131:340;;23514:14;23580:15;;23531:46;23561:4;:15;;;23531:46;;:25;23540:15;;23531:4;:8;;:25;;;;:::i;:::-;:29;;:46::i;:::-;:64;;;;;;;-1:-1:-1;23639:81:0;23666:53;23702:8;23667:32;23531:64;13414:4;23667:10;:32::i;:::-;:43;;;;;;23666:51;:53::i;:::-;23639:22;;-1:-1:-1;;;;;23639:26:0;;;:81::i;:::-;-1:-1:-1;;;;;23614:106:0;;;-1:-1:-1;;23094:642:0;23772:22;:15;:20;:22::i;:::-;23750:44;;:19;;;:44;23809:8;:13;;23750:4;;23809:8;23818:3;;23809:13;;;;;;;;;;;;;;;:20;;:13;;:20;;;;;;;;;;;-1:-1:-1;;23809:20:0;;;-1:-1:-1;;;;;23809:20:0;;;;;;;;;-1:-1:-1;;;23809:20:0;;;;;;;;-1:-1:-1;;;23809:20:0;;;;;;;;;;;;;;23865:19;;;23896:22;;23849:70;;23860:3;;23849:70;;;;23865:19;;23886:8;;23849:70;:::i;:::-;;;;;;;;22965:966;;22852:1086;;;:::o;22206:193::-;22290:4;22276:11;22312:80;22336:3;22332:1;:7;22312:80;;;22361:19;22372:4;;22377:1;22372:7;;;;;;;;;;;;;22361:10;:19::i;:::-;-1:-1:-1;22341:3:0;;22312:80;;;;22206:193;;;:::o;15413:97::-;15457:17;15494:8;15487:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;15487:15:0;;;;;-1:-1:-1;;;15487:15:0;;;;;;;;-1:-1:-1;;;15487:15:0;;;;;;;;;;;;;;;;;;;;;;;;;15413:97;:::o;4833:148::-;4413:12;:10;:12::i;:::-;4403:6;;-1:-1:-1;;;;;4403:6:0;;;:22;;;4395:67;;;;-1:-1:-1;;;4395:67:0;;;;;;;:::i;:::-;4940:1:::1;4924:6:::0;;4903:40:::1;::::0;-1:-1:-1;;;;;4924:6:0;;::::1;::::0;4903:40:::1;::::0;4940:1;;4903:40:::1;4971:1;4954:19:::0;;-1:-1:-1;;4954:19:0::1;::::0;;4833:148::o;12736:23::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;12736:23:0;;-1:-1:-1;12736:23:0;:::o;16059:530::-;4413:12;:10;:12::i;:::-;4403:6;;-1:-1:-1;;;;;4403:6:0;;;:22;;;4395:67;;;;-1:-1:-1;;;4395:67:0;;;;;;;:::i;:::-;16224:39;;::::1;:93:::0;::::1;;;-1:-1:-1::0;16280:37:0;;::::1;16224:93;16202:180;;;;-1:-1:-1::0;;;16202:180:0::1;;;;;;;:::i;:::-;16395:20;:18;:20::i;:::-;16442:12:::0;16428:11:::1;16472:110;16496:3;16492:1;:7;16472:110;;;16521:49;16525:12;;16538:1;16525:15;;;;;;;;;;;;;16542:9;;16552:1;16542:12;;;;;;;;;;;;;;;;;;;;:::i;:::-;16556:10;;16567:1;16556:13;;;;;;;;;;;;;;;;;;;;:::i;:::-;16521:3;:49::i;:::-;16501:3;;16472:110;;;;4473:1;16059:530:::0;;;;;;:::o;13025:44::-;;;;;;;;;;;;;;;:::o;12527:29::-;;;-1:-1:-1;;;;;12527:29:0;;:::o;4191:79::-;4229:7;4256:6;-1:-1:-1;;;;;4256:6:0;4191:79;:::o;24183:685::-;24259:20;;:::i;:::-;24282:15;24293:3;24282:10;:15::i;:::-;24308:21;24332:13;;;:8;:13;;;;;;;;-1:-1:-1;;;;;24332:17:0;;;;;;;;;24396:11;;24259:38;;-1:-1:-1;24332:17:0;24396:23;;24412:6;24396:15;:23::i;:::-;24382:37;;24486:22;;24448:86;;13414:4;;24475:34;;:6;;-1:-1:-1;;;;;24475:34:0;:10;:34::i;:::-;:57;;;;;24448:15;;;;;24475:57;;24448:19;:86::i;:::-;24430:4;:15;;:104;;;;24572:19;24594:8;24603:3;24594:13;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;24594:13:0;;-1:-1:-1;24622:32:0;;24618:112;;24706:11;;24671:47;;-1:-1:-1;;;24671:47:0;;-1:-1:-1;;;;;24671:18:0;;;;;:47;;24690:3;;24695:2;;;;24703:1;;24706:11;24671:47;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24618:112;24742:64;24772:10;24792:4;24799:6;24742:7;24750:3;24742:12;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;24742:12:0;;:64;;:29;:64::i;:::-;24857:2;-1:-1:-1;;;;;24824:36:0;24844:3;24832:10;-1:-1:-1;;;;;24824:36:0;;24849:6;24824:36;;;;;;:::i;13329:30::-;;;;:::o;32893:534::-;33006:1;32994:9;:13;32986:71;;;;-1:-1:-1;;;32986:71:0;;;;;;;:::i;:::-;33096:15;;33070:23;;33096:30;;33116:9;33096:19;:30::i;:::-;33070:56;;33164:10;33145:15;:29;;33137:80;;;;-1:-1:-1;;;33137:80:0;;;;;;;:::i;:::-;33250:17;;:32;;33272:9;33250:21;:32::i;:::-;33230:17;:52;33295:67;-1:-1:-1;;;;;33295:6:0;:23;33319:10;33339:4;33346:15;33295:23;:67::i;12923:66::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;20930:1094::-;21005:15;21033:20;;:::i;:::-;21056:8;21065:4;21056:14;;;;;;;;;;;;;;;;21033:37;;;;;;;;21056:14;;;;21033:37;-1:-1:-1;;;;;21033:37:0;;;;;;-1:-1:-1;;;21033:37:0;;;;;;;;-1:-1:-1;;;21033:37:0;;;;;;;;;;21105:14;;;:8;:14;;;;;-1:-1:-1;;;;;21105:21:0;;;;;;;;;;21165:22;;21217:7;:13;;21033:37;;-1:-1:-1;21105:21:0;;21137:50;;;21114:4;;21217:13;;;;;;;;;;;;;;;;:38;;-1:-1:-1;;;21217:38:0;;-1:-1:-1;;;;;21217:13:0;;;;:23;;:38;;21249:4;;21217:38;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21198:57;;21288:4;:19;;;21270:37;;:15;:37;:54;;;;-1:-1:-1;21311:13:0;;;21270:54;21266:632;;;21341:12;21375:17;;21356:15;:36;;:309;;21520:4;:19;;;21500:39;;:17;;:39;:165;;21664:1;21500:165;;;21585:19;;;;21563:17;;:42;;;;:21;:42::i;:::-;21356:309;;;21432:19;;;;21412:40;;:15;;:40;;:19;:40::i;:::-;21341:324;;21704:14;21770:15;;21721:46;21751:4;:15;;;21721:46;;:25;21730:15;;21721:4;:8;;:25;;;;:::i;:46::-;:64;;;;;;;-1:-1:-1;21820:66:0;21877:8;21842:32;21721:64;13414:4;21842:10;:32::i;:::-;:43;;;;;21820:17;;21842:43;;21820:21;:66::i;:::-;21800:86;;21266:632;;;21988:15;;;;21925:11;;21918:98;;:86;;13414:4;;21925:34;;21941:17;21925:15;:34::i;:::-;:57;;;;;;;21918:69;:86::i;:98::-;21908:108;20930:1094;-1:-1:-1;;;;;;;20930:1094:0:o;17632:202::-;4413:12;:10;:12::i;:::-;4403:6;;-1:-1:-1;;;;;4403:6:0;;;:22;;;4395:67;;;;-1:-1:-1;;;4395:67:0;;;;;;;:::i;:::-;17751:20:::1;:18;:20::i;:::-;17782:44;17786:4;17792:11;17805:9;17816;17782:3;:44::i;13486:32::-:0;;;;:::o;22491:177::-;22553:8;:15;22539:11;22579:82;22607:3;22601;:9;22579:82;;;22634:15;22645:3;22634:10;:15::i;:::-;-1:-1:-1;22612:5:0;;22579:82;;;;22491:177;:::o;12829:27::-;;;;;;;;;;12384:30;;;:::o;27310:1003::-;27397:20;;:::i;:::-;27420:15;27431:3;27420:10;:15::i;:::-;27446:21;27470:13;;;:8;:13;;;;;;;;27484:10;27470:25;;;;;;;27556:22;;27540:11;;27397:38;;-1:-1:-1;27470:25:0;;13414:4;;27540:39;;:11;-1:-1:-1;;;;;27540:39:0;:15;:39::i;:::-;:62;;;;;;27506:97;;27614:22;27639:50;:38;27661:4;:15;;;27639:17;:21;;:38;;;;:::i;:50::-;27614:75;;27740:88;13414:4;27769:34;27780:4;:22;;;-1:-1:-1;;;;;27769:34:0;:6;:10;;:34;;;;:::i;:::-;:57;;;;;27740:17;;27769:57;;27740:21;:88::i;:::-;27722:15;;;:106;27853:11;;:23;;27869:6;27853:15;:23::i;:::-;27839:37;;27914:39;-1:-1:-1;;;;;27914:6:0;:19;27934:2;27938:14;27914:19;:39::i;:::-;27966:19;27988:8;27997:3;27988:13;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;27988:13:0;;-1:-1:-1;28016:32:0;;28012:133;;28121:11;;28065:68;;-1:-1:-1;;;28065:68:0;;-1:-1:-1;;;;;28065:18:0;;;;;:68;;28084:3;;28089:10;;28101:2;;28105:14;;28121:11;28065:68;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28012:133;28157:37;28183:2;28187:6;28157:7;28165:3;28157:12;;;;;;;:37;28246:2;-1:-1:-1;;;;;28212:37:0;28233:3;28221:10;-1:-1:-1;;;;;28212:37:0;;28238:6;28212:37;;;;;;:::i;:::-;;;;;;;;28285:3;28273:10;-1:-1:-1;;;;;28265:40:0;;28290:14;28265:40;;;;;;:::i;:::-;;;;;;;;27310:1003;;;;;;;;:::o;29306:138::-;4413:12;:10;:12::i;:::-;4403:6;;-1:-1:-1;;;;;4403:6:0;;;:22;;;4395:67;;;;-1:-1:-1;;;4395:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;29375:15:0;::::1;29393:5;29375:15:::0;;;:6:::1;:15;::::0;;;;;;:23;;-1:-1:-1;;29375:23:0::1;::::0;;29414:22;::::1;::::0;::::1;::::0;29382:7;;29414:22:::1;:::i;5136:244::-:0;4413:12;:10;:12::i;:::-;4403:6;;-1:-1:-1;;;;;4403:6:0;;;:22;;;4395:67;;;;-1:-1:-1;;;4395:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;5225:22:0;::::1;5217:73;;;;-1:-1:-1::0;;;5217:73:0::1;;;;;;;:::i;:::-;5327:6;::::0;;5306:38:::1;::::0;-1:-1:-1;;;;;5306:38:0;;::::1;::::0;5327:6;::::1;::::0;5306:38:::1;::::0;::::1;5355:6;:17:::0;;-1:-1:-1;;5355:17:0::1;-1:-1:-1::0;;;;;5355:17:0;;;::::1;::::0;;;::::1;::::0;;5136:244::o;15785:182::-;4413:12;:10;:12::i;:::-;4403:6;;-1:-1:-1;;;;;4403:6:0;;;:22;;;4395:67;;;;-1:-1:-1;;;4395:67:0;;;;;;;:::i;:::-;15891:20:::1;:18;:20::i;:::-;15922:37;15926:11;15939:8;15949:9;15922:3;:37::i;:::-;15785:182:::0;;;:::o;19830:121::-;4413:12;:10;:12::i;:::-;4403:6;;-1:-1:-1;;;;;4403:6:0;;;:22;;;4395:67;;;;-1:-1:-1;;;4395:67:0;;;;;;;:::i;:::-;19905:4:::1;19885:24:::0;;;::::1;-1:-1:-1::0;;;19885:24:0::1;::::0;;19925:18:::1;::::0;::::1;::::0;19885:24;;19925:18:::1;19830:121::o:0;584:137::-;642:9;662:6;;;:28;;-1:-1:-1;;677:5:0;;;689:1;684;677:5;684:1;672:13;;;;;:18;662:28;654:65;;;;-1:-1:-1;;;654:65:0;;;;;;;:::i;:::-;584:137;;;;:::o;7363:218::-;7419:6;7449:5;;;7474:6;;;;;;:16;;;7489:1;7484;:6;;7474:16;7473:38;;;;7500:1;7496;:5;:14;;;;;7509:1;7505;:5;7496:14;7465:87;;;;-1:-1:-1;;;7465:87:0;;;;;;;:::i;:::-;7572:1;7363:218;-1:-1:-1;;;7363:218:0:o;456:122::-;539:5;;;534:16;;;;526:50;;;;-1:-1:-1;;;526:50:0;;;;;;;:::i;9897:304::-;9982:12;9996:17;10025:5;-1:-1:-1;;;;;10017:19:0;10060:10;10072:2;10076:6;10037:46;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10017:67;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9981:103;;;;10103:7;:57;;;;-1:-1:-1;10115:11:0;;:16;;:44;;;10146:4;10135:24;;;;;;;;;;;;:::i;:::-;10095:98;;;;-1:-1:-1;;;10095:98:0;;;;;;;:::i;:::-;9897:304;;;;;:::o;8049:138::-;8101:7;8134:1;8129;:6;;8121:30;;;;-1:-1:-1;;;8121:30:0;;;;;;;:::i;:::-;-1:-1:-1;8177:1:0;8049:138::o;325:125::-;408:5;;;403:16;;;;395:53;;;;-1:-1:-1;;;395:53:0;;;;;;;:::i;10209:332::-;10312:12;10326:17;10355:5;-1:-1:-1;;;;;10347:19:0;10390:10;10402:4;10408:2;10412:6;10367:52;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10347:73;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10311:109;;;;10439:7;:57;;;;-1:-1:-1;10451:11:0;;:16;;:44;;;10482:4;10471:24;;;;;;;;;;;;:::i;:::-;10431:102;;;;-1:-1:-1;;;10431:102:0;;;;;;;:::i;:::-;10209:332;;;;;;:::o;2716:106::-;2804:10;2716:106;:::o;18932:400::-;19055:63;19106:11;19055:46;19075:8;19084:4;19075:14;;;;;;;;;;;;;;;;;:25;19055:15;;;-1:-1:-1;;;19075:25:0;;;;19055:19;:46::i;:::-;:50;;:63::i;:::-;19037:15;:81;19157:18;:11;:16;:18::i;:::-;19129:8;19138:4;19129:14;;;;;;;;;;;;;;;:25;;;:46;;;;;;;;;;;;;;;;;;19190:9;19186:46;;;19220:9;19203:8;19212:4;19203:14;;;;;;;;;;;;;;;;:26;;;;;-1:-1:-1;;;;;19203:26:0;;;;;-1:-1:-1;;;;;19203:26:0;;;;;;19186:46;19274:9;:38;;19298:8;19307:4;19298:14;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;19298:14:0;19274:38;;;19286:9;19274:38;-1:-1:-1;;;;;19247:77:0;19255:4;19247:77;19261:11;19314:9;19247:77;;;;;;;:::i;:::-;;;;;;;;18932:400;;;;:::o;727:161::-;776:9;-1:-1:-1;;;;;806:16:0;;;798:57;;;;-1:-1:-1;;;798:57:0;;;;;;;:::i;1248:125::-;1331:5;;;-1:-1:-1;;;;;1326:16:0;;;;;;;;1318:53;;;;-1:-1:-1;;;1318:53:0;;;;;;;:::i;894:156::-;942:8;971:15;;;;963:55;;;;-1:-1:-1;;;963:55:0;;;;;;;:::i;16928:608::-;-1:-1:-1;;;;;17027:30:0;;;;;;:11;:30;;;;;;;;:39;17019:71;;;;-1:-1:-1;;;17019:71:0;;;;;;;:::i;:::-;17119:15;;:31;;17139:10;17119:19;:31::i;:::-;17101:15;:49;17161:7;:22;;;;;;;;;;;;;-1:-1:-1;;;;;17161:22:0;;;-1:-1:-1;;17161:22:0;;;;;;;17194:8;:24;;;;;;;-1:-1:-1;17194:24:0;;;;;;;;;;;;;;;;;;;;;;17245:153;;;;;;;;;;;;17231:8;;17161:22;17245:153;;17329:22;:15;:20;:22::i;:::-;17245:153;;;;;;17281:17;:10;:15;:17::i;:::-;17245:153;;;;;;;17231:168;;;;;;;;-1:-1:-1;17231:168:0;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;17231:168:0;;;;;;-1:-1:-1;;;17231:168:0;;-1:-1:-1;;;;;17231:168:0;;;-1:-1:-1;;17231:168:0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;17410:30:0;;;;;;:11;:30;;;;;;;:37;;-1:-1:-1;;17410:37:0;;;;;17473:7;:14;17463:65;;;;17410:30;;17473:21;;:18;:21::i;:::-;17463:65;17496:10;17463:65;;;;;;:::i;:::-;;;;;;;;16928:608;;;:::o;7826:215::-;7882:6;7912:5;;;7937:6;;;;;;:16;;;7952:1;7947;:6;;7937:16;7936:38;;;;7963:1;7959;:5;:14;;;;;7972:1;7968;:5;7959:14;7928:84;;;;-1:-1:-1;;;7928:84:0;;;;;;;:::i;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;157:349::-;;;284:3;277:4;269:6;265:17;261:27;251:2;;-1:-1;;292:12;251:2;-1:-1;322:20;;362:18;351:30;;348:2;;;-1:-1;;384:12;348:2;428:4;420:6;416:17;404:29;;479:3;428:4;;463:6;459:17;420:6;445:32;;442:41;439:2;;;496:1;;486:12;439:2;244:262;;;;;:::o;3196:241::-;;3300:2;3288:9;3279:7;3275:23;3271:32;3268:2;;;-1:-1;;3306:12;3268:2;85:6;72:20;97:33;124:5;97:33;:::i;3444:397::-;;;3583:2;3571:9;3562:7;3558:23;3554:32;3551:2;;;-1:-1;;3589:12;3551:2;3647:17;3634:31;3685:18;3677:6;3674:30;3671:2;;;-1:-1;;3707:12;3671:2;3745:80;3817:7;3808:6;3797:9;3793:22;3745:80;:::i;:::-;3727:98;;;;-1:-1;3545:296;-1:-1;;;;3545:296::o;3848:1021::-;;;;;;;4122:2;4110:9;4101:7;4097:23;4093:32;4090:2;;;-1:-1;;4128:12;4090:2;4186:17;4173:31;4224:18;;4216:6;4213:30;4210:2;;;-1:-1;;4246:12;4210:2;4284:80;4356:7;4347:6;4336:9;4332:22;4284:80;:::i;:::-;4266:98;;-1:-1;4266:98;-1:-1;4429:2;4414:18;;4401:32;;-1:-1;4442:30;;;4439:2;;;-1:-1;;4475:12;4439:2;4513:94;4599:7;4590:6;4579:9;4575:22;4513:94;:::i;:::-;4495:112;;-1:-1;4495:112;-1:-1;4672:2;4657:18;;4644:32;;-1:-1;4685:30;;;4682:2;;;-1:-1;;4718:12;4682:2;;4756:97;4845:7;4836:6;4825:9;4821:22;4756:97;:::i;:::-;4084:785;;;;-1:-1;4084:785;;-1:-1;4084:785;;4738:115;;4084:785;-1:-1;;;4084:785::o;4876:1269::-;;;;;;;;;5185:3;5173:9;5164:7;5160:23;5156:33;5153:2;;;-1:-1;;5192:12;5153:2;5250:17;5237:31;5288:18;;5280:6;5277:30;5274:2;;;-1:-1;;5310:12;5274:2;5348:80;5420:7;5411:6;5400:9;5396:22;5348:80;:::i;:::-;5330:98;;-1:-1;5330:98;-1:-1;5493:2;5478:18;;5465:32;;-1:-1;5506:30;;;5503:2;;;-1:-1;;5539:12;5503:2;5577:80;5649:7;5640:6;5629:9;5625:22;5577:80;:::i;:::-;5559:98;;-1:-1;5559:98;-1:-1;5722:2;5707:18;;5694:32;;-1:-1;5735:30;;;5732:2;;;-1:-1;;5768:12;5732:2;5806:97;5895:7;5886:6;5875:9;5871:22;5806:97;:::i;:::-;5788:115;;-1:-1;5788:115;-1:-1;5968:2;5953:18;;5940:32;;-1:-1;5981:30;;;5978:2;;;-1:-1;;6014:12;5978:2;;6052:77;6121:7;6112:6;6101:9;6097:22;6052:77;:::i;:::-;5147:998;;;;-1:-1;5147:998;;-1:-1;5147:998;;;;;;6034:95;-1:-1;;;5147:998::o;6152:235::-;;6253:2;6241:9;6232:7;6228:23;6224:32;6221:2;;;-1:-1;;6259:12;6221:2;1775:6;1762:20;1787:30;1811:5;1787:30;:::i;6394:257::-;;6506:2;6494:9;6485:7;6481:23;6477:32;6474:2;;;-1:-1;;6512:12;6474:2;1910:6;1904:13;1922:30;1946:5;1922:30;:::i;6934:291::-;;7063:2;7051:9;7042:7;7038:23;7034:32;7031:2;;;-1:-1;;7069:12;7031:2;2364:6;2358:13;2376:47;2417:5;2376:47;:::i;7804:241::-;;7908:2;7896:9;7887:7;7883:23;7879:32;7876:2;;;-1:-1;;7914:12;7876:2;-1:-1;2852:20;;7870:175;-1:-1;7870:175::o;8052:263::-;;8167:2;8155:9;8146:7;8142:23;8138:32;8135:2;;;-1:-1;;8173:12;8135:2;-1:-1;3000:13;;8129:186;-1:-1;8129:186::o;8322:366::-;;;8443:2;8431:9;8422:7;8418:23;8414:32;8411:2;;;-1:-1;;8449:12;8411:2;2865:6;2852:20;8501:63;;8601:2;8644:9;8640:22;72:20;97:33;124:5;97:33;:::i;:::-;8609:63;;;;8405:283;;;;;:::o;8695:553::-;;;;8864:2;8852:9;8843:7;8839:23;8835:32;8832:2;;;-1:-1;;8870:12;8832:2;2865:6;2852:20;8922:63;;9022:2;9079:9;9075:22;2182:20;2207:47;2248:5;2207:47;:::i;:::-;9030:77;-1:-1;9144:2;9200:22;;2698:20;2723:50;2698:20;2723:50;:::i;:::-;9152:80;;;;8826:422;;;;;:::o;9255:366::-;;;9376:2;9364:9;9355:7;9351:23;9347:32;9344:2;;;-1:-1;;9382:12;9344:2;-1:-1;;2852:20;;;9534:2;9573:22;;;2852:20;;-1:-1;9338:283::o;9628:491::-;;;;9766:2;9754:9;9745:7;9741:23;9737:32;9734:2;;;-1:-1;;9772:12;9734:2;2865:6;2852:20;9824:63;;9924:2;9967:9;9963:22;2852:20;9932:63;;10032:2;10075:9;10071:22;72:20;97:33;124:5;97:33;:::i;10126:991::-;;;;;;;;10330:3;10318:9;10309:7;10305:23;10301:33;10298:2;;;-1:-1;;10337:12;10298:2;2865:6;2852:20;10389:63;;10489:2;10532:9;10528:22;2852:20;10497:63;;10597:2;10640:9;10636:22;72:20;97:33;124:5;97:33;:::i;:::-;10605:63;-1:-1;10705:2;10744:22;;2852:20;;-1:-1;10813:3;10851:22;;3128:20;48197:4;48186:16;;51016:33;;51006:2;;-1:-1;;51053:12;51006:2;10292:825;;;;-1:-1;10292:825;;;;10822:61;10920:3;10960:22;;2031:20;;-1:-1;11029:3;11069:22;;;2031:20;;10292:825;-1:-1;;10292:825::o;11124:645::-;;;;;11293:3;11281:9;11272:7;11268:23;11264:33;11261:2;;;-1:-1;;11300:12;11261:2;2865:6;2852:20;11352:63;;11452:2;11495:9;11491:22;2852:20;11460:63;;11560:2;11620:9;11616:22;2698:20;2723:50;2767:5;2723:50;:::i;:::-;11568:80;-1:-1;11685:2;11721:22;;1762:20;1787:30;1762:20;1787:30;:::i;:::-;11255:514;;;;-1:-1;11255:514;;-1:-1;;11255:514::o;24554:645::-;24766:23;;-1:-1;;;;;47758:46;25992:37;;24947:4;24936:16;;;24930:23;48095:18;48084:30;;;25005:14;;;26473:36;;;;25105:4;25094:16;;;25088:23;48084:30;25163:14;;26473:36;24660:539::o;26752:271::-;;14702:5;45672:12;-1:-1;49789:101;49803:6;49800:1;49797:13;49789:101;;;14846:4;49870:11;;;;;49864:18;49851:11;;;49844:39;49818:10;49789:101;;;49905:6;49902:1;49899:13;49896:2;;;-1:-1;49961:6;49956:3;49952:16;49945:27;49896:2;-1:-1;14877:16;;;;;26886:137;-1:-1;;26886:137::o;27030:222::-;-1:-1;;;;;47878:54;;;;12488:37;;27157:2;27142:18;;27128:124::o;27259:900::-;-1:-1;;;;;47878:54;;;12347:58;;47878:54;;;;27731:2;27716:18;;12488:37;27814:2;27799:18;;14493:37;;;;27897:2;27882:18;;14493:37;;;;48197:4;48186:16;27976:3;27961:19;;26705:35;28060:3;28045:19;;14493:37;28144:3;28129:19;;14493:37;;;;27558:3;27543:19;;27529:630::o;28166:444::-;-1:-1;;;;;47878:54;;;12488:37;;47878:54;;;;28513:2;28498:18;;12488:37;28596:2;28581:18;;14493:37;;;;28349:2;28334:18;;28320:290::o;28617:333::-;-1:-1;;;;;47878:54;;;;12488:37;;28936:2;28921:18;;14493:37;28772:2;28757:18;;28743:207::o;28957:398::-;29148:2;29162:47;;;45672:12;;29133:18;;;46398:19;;;28957:398;;29148:2;45329:14;;;;46438;;;;28957:398;13026:288;13051:6;13048:1;13045:13;13026:288;;;13112:13;;-1:-1;;;;;47878:54;14980:64;;46113:14;;;;11958;;;;13073:1;13066:9;13026:288;;;-1:-1;29215:130;;29119:236;-1:-1;;;;;;29119:236::o;29362:470::-;29589:2;29603:47;;;45672:12;;29574:18;;;46398:19;;;29362:470;;29589:2;45329:14;;;;46438;;;;29362:470;13946:335;13971:6;13968:1;13965:13;13946:335;;;12124:96;12216:3;14038:6;14032:13;12124:96;:::i;:::-;46113:14;;;;12249:4;12240:14;;;;;13993:1;13986:9;13946:335;;29839:210;47167:13;;47160:21;14376:34;;29960:2;29945:18;;29931:118::o;30847:416::-;31047:2;31061:47;;;16050:2;31032:18;;;46398:19;16086:23;46438:14;;;16066:44;16129:12;;;31018:245::o;31270:416::-;31470:2;31484:47;;;16380:2;31455:18;;;46398:19;16416:13;46438:14;;;16396:34;16449:12;;;31441:245::o;31693:416::-;31893:2;31907:47;;;16700:2;31878:18;;;46398:19;16736:34;46438:14;;;16716:55;16805:4;16791:12;;;16784:26;16829:12;;;31864:245::o;32116:416::-;32316:2;32330:47;;;17080:2;32301:18;;;46398:19;17116:34;46438:14;;;17096:55;17185:10;17171:12;;;17164:32;17215:12;;;32287:245::o;32539:416::-;32739:2;32753:47;;;17466:2;32724:18;;;46398:19;17502:30;46438:14;;;17482:51;17552:12;;;32710:245::o;32962:416::-;33162:2;33176:47;;;17803:2;33147:18;;;46398:19;17839:34;46438:14;;;17819:55;17908:15;17894:12;;;17887:37;17943:12;;;33133:245::o;33385:416::-;33585:2;33599:47;;;18194:2;33570:18;;;46398:19;18230:34;46438:14;;;18210:55;18299:8;18285:12;;;18278:30;18327:12;;;33556:245::o;33808:416::-;34008:2;34022:47;;;18578:2;33993:18;;;46398:19;18614:34;46438:14;;;18594:55;18683:9;18669:12;;;18662:31;18712:12;;;33979:245::o;34231:416::-;34431:2;34445:47;;;18963:2;34416:18;;;46398:19;18999:34;46438:14;;;18979:55;19068:8;19054:12;;;19047:30;19096:12;;;34402:245::o;34654:416::-;34854:2;34868:47;;;19347:2;34839:18;;;46398:19;19383:34;46438:14;;;19363:55;19452:3;19438:12;;;19431:25;19475:12;;;34825:245::o;35077:416::-;35277:2;35291:47;;;19726:2;35262:18;;;46398:19;19762:29;46438:14;;;19742:50;19811:12;;;35248:245::o;35500:416::-;35700:2;35714:47;;;20062:2;35685:18;;;46398:19;20098:34;46438:14;;;20078:55;20167:11;20153:12;;;20146:33;20198:12;;;35671:245::o;35923:416::-;36123:2;36137:47;;;20449:2;36108:18;;;46398:19;20485:30;46438:14;;;20465:51;20535:12;;;36094:245::o;36346:416::-;36546:2;36560:47;;;20786:2;36531:18;;;46398:19;20822:26;46438:14;;;20802:47;20868:12;;;36517:245::o;36769:416::-;36969:2;36983:47;;;36954:18;;;46398:19;21155:34;46438:14;;;21135:55;21209:12;;;36940:245::o;37192:416::-;37392:2;37406:47;;;21460:2;37377:18;;;46398:19;21496:34;46438:14;;;21476:55;21565:7;21551:12;;;21544:29;21592:12;;;37363:245::o;37615:416::-;37815:2;37829:47;;;21843:2;37800:18;;;46398:19;21879:21;46438:14;;;21859:42;21920:12;;;37786:245::o;38038:416::-;38238:2;38252:47;;;22171:2;38223:18;;;46398:19;22207:29;46438:14;;;22187:50;22256:12;;;38209:245::o;38461:416::-;38661:2;38675:47;;;22507:2;38646:18;;;46398:19;22543:34;46438:14;;;22523:55;22612:9;22598:12;;;22591:31;22641:12;;;38632:245::o;38884:416::-;39084:2;39098:47;;;22892:2;39069:18;;;46398:19;22928:34;46438:14;;;22908:55;22997:6;22983:12;;;22976:28;23023:12;;;39055:245::o;39307:416::-;39507:2;39521:47;;;39492:18;;;46398:19;23310:34;46438:14;;;23290:55;23364:12;;;39478:245::o;39730:416::-;39930:2;39944:47;;;23615:2;39915:18;;;46398:19;23651:34;46438:14;;;23631:55;23720:4;23706:12;;;23699:26;23744:12;;;39901:245::o;40153:416::-;40353:2;40367:47;;;23995:2;40338:18;;;46398:19;24031:26;46438:14;;;24011:47;24077:12;;;40324:245::o;40576:416::-;40776:2;40790:47;;;24328:2;40761:18;;;46398:19;24364:34;46438:14;;;24344:55;24433:12;24419;;;24412:34;24465:12;;;40747:245::o;40999:322::-;41176:2;41161:18;;41190:121;41165:9;41284:6;41190:121;:::i;41328:436::-;-1:-1;;;;;47758:46;;;;25992:37;;48095:18;48084:30;;;41669:2;41654:18;;26473:36;48084:30;41750:2;41735:18;;26473:36;41507:2;41492:18;;41478:286::o;41771:222::-;14493:37;;;41898:2;41883:18;;41869:124::o;42000:700::-;14493:37;;;-1:-1;;;;;47878:54;;;42428:2;42413:18;;12347:58;47878:54;;;;42511:2;42496:18;;12488:37;42602:2;42587:18;;15755:58;;;;42685:3;42670:19;;14493:37;42255:3;42240:19;;42226:474::o;44089:321::-;14493:37;;;47167:13;47160:21;44396:2;44381:18;;14376:34;44238:2;44223:18;;44209:201::o;44417:329::-;14493:37;;;44732:2;44717:18;;14493:37;44570:2;44555:18;;44541:205::o;44753:440::-;48095:18;48084:30;;;;26473:36;;45096:2;45081:18;;14493:37;;;;-1:-1;;;;;47758:46;45179:2;45164:18;;26232:50;44934:2;44919:18;;44905:288::o;49993:117::-;-1:-1;;;;;50080:5;47878:54;50055:5;50052:35;50042:2;;50101:1;;50091:12;50042:2;50036:74;:::o;50117:111::-;50198:5;47167:13;47160:21;50176:5;50173:32;50163:2;;50219:1;;50209:12
Swarm Source
ipfs://8e06435957dcb1f336604f20702730439983356787ed675d1e2dc1d25a55698b
Age | Block | Fee Address | BC Fee Address | Voting Power | Jailed | Incoming |
---|
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.