Feature Tip: Add private address tag to any address under My Name Tag !
More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 1,499 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
Value | ||||
---|---|---|---|---|---|---|---|---|---|
Deposit | 20250767 | 29 hrs ago | IN | 0 ETH | 0.00010842 | ||||
Deposit | 20223819 | 4 days ago | IN | 0 ETH | 0.00017194 | ||||
Deposit | 20173011 | 12 days ago | IN | 0 ETH | 0.00018315 | ||||
Withdraw | 20160272 | 13 days ago | IN | 0 ETH | 0.0005747 | ||||
Deposit | 20118295 | 19 days ago | IN | 0 ETH | 0.00085829 | ||||
Deposit | 20111555 | 20 days ago | IN | 0 ETH | 0.00043716 | ||||
Deposit | 20110698 | 20 days ago | IN | 0 ETH | 0.00057289 | ||||
Deposit | 20110680 | 20 days ago | IN | 0 ETH | 0.00056054 | ||||
Deposit | 20097748 | 22 days ago | IN | 0 ETH | 0.00082906 | ||||
Deposit | 20093929 | 23 days ago | IN | 0 ETH | 0.00025182 | ||||
Withdraw | 20090148 | 23 days ago | IN | 0 ETH | 0.00056299 | ||||
Deposit | 20090142 | 23 days ago | IN | 0 ETH | 0.00083456 | ||||
Withdraw | 20072655 | 26 days ago | IN | 0 ETH | 0.00062293 | ||||
Deposit | 20072373 | 26 days ago | IN | 0 ETH | 0.00083632 | ||||
Deposit | 20071694 | 26 days ago | IN | 0 ETH | 0.00127819 | ||||
Withdraw | 20071295 | 26 days ago | IN | 0 ETH | 0.0010486 | ||||
Withdraw | 20070771 | 26 days ago | IN | 0 ETH | 0.00113127 | ||||
Withdraw | 20070658 | 26 days ago | IN | 0 ETH | 0.00086023 | ||||
Deposit | 20070653 | 26 days ago | IN | 0 ETH | 0.00215299 | ||||
Withdawl BNB | 20070037 | 26 days ago | IN | 0 ETH | 0.00044388 | ||||
Withdraw | 20070020 | 26 days ago | IN | 0 ETH | 0.00176623 | ||||
Withdraw | 20070018 | 26 days ago | IN | 0 ETH | 0.00163002 | ||||
Deposit | 20070013 | 26 days ago | IN | 0 ETH | 0.00271961 | ||||
Emergency Withdr... | 20069990 | 26 days ago | IN | 0 ETH | 0.00078931 | ||||
Withdraw | 20069906 | 26 days ago | IN | 0 ETH | 0.00219803 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
SmartPoolRenewable
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-12-22 */ // SPDX-License-Identifier: MIT // File: smartPoolV2.sol // complier 7.5 // Farmageddon Renewable Pool Contract. // File: @openzeppelin/contracts/utils/Context.sol pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^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() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the subtraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // 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 (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. 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 mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message 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( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. 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 mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } } // File: @openzeppelin/contracts/utils/ReentrancyGuard.sol pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and make it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // File: bsc-library/contracts/IBEP20.sol pragma solidity ^0.8.0; interface IBEP20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the token decimals. */ function decimals() external view returns (uint8); /** * @dev Returns the token symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the token name. */ function name() external view returns (string memory); /** * @dev Returns the bep token owner. */ function getOwner() external view returns (address); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address _owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File: @openzeppelin/contracts/utils/Address.sol pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } } interface NFT { function balanceOf(address account) external view returns (uint256); function name() external view returns (string calldata name); } // File: contracts/SmartChefInitializable.sol pragma solidity ^0.8.0; contract SmartPoolRenewable is Ownable, ReentrancyGuard { using SafeMath for uint256; // The address of the smart chef factory address public SMART_CHEF_FACTORY; // Whether a limit is set for users bool public hasUserLimit; // Whether it is initialized bool public isInitialized; // Accrued token per share uint256 public accTokenPerShare; // The block number when CAKE mining ends. uint256 public bonusEndBlock; // The block number when CAKE mining starts. uint256 public startBlock; // The block number of the last pool update uint256 public lastRewardBlock; // CAKE tokens created per block. uint256 public rewardPerBlock; // The precision factor uint256 public PRECISION_FACTOR; // The reward token IBEP20 public rewardToken; // The staked token IBEP20 public stakedToken; // the Needed NFTs NFT[] public NFTsNeeded; mapping(address => bool) public isNFTCollection; uint256[] public stakeAmounts; // Total Staked tokens uint256 public totalStaked; // Previous and Current pool reward balance uint256 public prevAndCurrentRewardsBalance; // Info of each user that stakes tokens (stakedToken) mapping(address => UserInfo) public userInfo; struct UserInfo { uint256 amount; // How many staked tokens the user has provided uint256 rewardDebt; // Reward debt } event AdminTokenRecovery(address tokenRecovered, uint256 amount); event Deposit(address indexed user, uint256 amount); event EmergencyWithdraw(address indexed user, uint256 amount); event NewStartAndEndBlocks(uint256 startBlock, uint256 endBlock); event NewRewardPerBlock(uint256 rewardPerBlock); event RewardsStop(uint256 blockNumber); event Withdraw(address indexed user, uint256 amount); constructor(NFT[] memory _NFTs, uint256[] memory stakableAmounts) { SMART_CHEF_FACTORY = msg.sender; require(_NFTs.length == stakableAmounts.length,"NFTS, and amounts must be same quantity"); NFTsNeeded = _NFTs; stakeAmounts = stakableAmounts; for(uint i=0; i<_NFTs.length; i++) { isNFTCollection[address(_NFTs[i])] = true; } } /** * @notice this function is to extend or renew the pool ============================================================== */ function increaseAPR() external onlyOwner { _updatePool(); uint256 totalNewReward = checkTotalNewRewards(); require(bonusEndBlock > block.timestamp, "Pool has Ended, use startNewPool"); require(totalNewReward > 0, "no NewRewards availavble, send tokens First"); uint256 blocksLeft = bonusEndBlock - block.timestamp; uint256 addedRPB = totalNewReward / blocksLeft; rewardPerBlock += addedRPB; if (stakedToken == rewardToken) { prevAndCurrentRewardsBalance = rewardToken.balanceOf(address(this)) - totalStaked; } else { // check how much new rewards are available prevAndCurrentRewardsBalance = rewardToken.balanceOf(address(this)); } _updatePool(); } function ExtendPool() external onlyOwner { require(bonusEndBlock > block.timestamp, "Pool has Ended, use startNewPool"); _updatePool(); uint256 totalNewReward = checkTotalNewRewards(); require(totalNewReward > 0, "No funds to start new pool with"); if (stakedToken == rewardToken) { prevAndCurrentRewardsBalance = rewardToken.balanceOf(address(this)) - totalStaked; } else { // check how much new rewards are available prevAndCurrentRewardsBalance = rewardToken.balanceOf(address(this)); } // increase block count for pool uint256 timeExtended = totalNewReward / rewardPerBlock; bonusEndBlock = bonusEndBlock + (timeExtended); } function startNewPool( uint256 _startInDays, uint256 _poolLengthDays ) external onlyOwner { // make sure pool has ended require(bonusEndBlock < block.timestamp, "Pool has not ended, Try Extending"); _updatePool(); uint256 totalNewReward = checkTotalNewRewards(); require(totalNewReward > 0, "No funds to start new pool with"); // setup for calculations uint256 startInBlocks; uint256 totalBlocks; startInBlocks = _startInDays * 86400; totalBlocks = _poolLengthDays * 86400; if (stakedToken == rewardToken) { prevAndCurrentRewardsBalance = rewardToken.balanceOf(address(this)) - totalStaked; } else { // check how much new rewards are available prevAndCurrentRewardsBalance = rewardToken.balanceOf(address(this)); } // set last reward block to new start block startBlock = (block.timestamp + startInBlocks); lastRewardBlock = startBlock; // set end block of new pool bonusEndBlock = startBlock + totalBlocks; // set new rewards per block based off the new information rewardPerBlock = totalNewReward / totalBlocks; // Make this contract initialized isInitialized = true; } function setupTokens( IBEP20 _stakedToken, IBEP20 _rewardToken ) external onlyOwner { require(!isInitialized, "Already initialized"); stakedToken = _stakedToken; rewardToken = _rewardToken; hasUserLimit = true; uint256 decimalsRewardToken = uint256(rewardToken.decimals()); require(decimalsRewardToken < 30, "Must be inferior to 30"); PRECISION_FACTOR = uint256(10**(uint256(30).sub(decimalsRewardToken))); // set rewardscounter prevAndCurrentRewardsBalance = 0; totalStaked = 0; } function poolLimitPerUser(address user) public view returns (uint256 limit) { // check for NFTS then calculate max limit = 0; for(uint i=0; i<NFTsNeeded.length; i++) { uint256 bal = NFTsNeeded[i].balanceOf(user); limit += bal * stakeAmounts[i]; } } /* * @notice Deposit staked tokens and collect reward tokens (if any) * @param _amount: amount to withdraw (in rewardToken) */ function deposit(uint256 _amount) external nonReentrant { UserInfo storage user = userInfo[msg.sender]; uint256 preBalance; uint256 postBalance; require(_amount.add(user.amount) <= poolLimitPerUser(msg.sender), "User amount above limit"); _updatePool(); if (user.amount > 0) { uint256 pending = user.amount.mul(accTokenPerShare).div(PRECISION_FACTOR).sub(user.rewardDebt); if (pending > 0) { rewardToken.transfer(address(msg.sender), pending); prevAndCurrentRewardsBalance -= pending; } } if (_amount > 0) { preBalance = stakedToken.balanceOf(address(this)); stakedToken.transferFrom(address(msg.sender), address(this), _amount); postBalance = stakedToken.balanceOf(address(this)); user.amount = user.amount.add(postBalance - preBalance); totalStaked += (postBalance - preBalance); } user.rewardDebt = user.amount.mul(accTokenPerShare).div(PRECISION_FACTOR); emit Deposit(msg.sender, _amount); } /* * @notice Withdraw staked tokens and collect reward tokens * @param _amount: amount to withdraw (in rewardToken) */ function withdraw(uint256 _amount) external nonReentrant { UserInfo storage user = userInfo[msg.sender]; require(user.amount >= _amount, "Amount to withdraw too high"); _updatePool(); uint256 pending = user.amount.mul(accTokenPerShare).div(PRECISION_FACTOR).sub(user.rewardDebt); if (_amount > 0) { user.amount = user.amount.sub(_amount); stakedToken.transfer(address(msg.sender), _amount); totalStaked -= _amount; } if (pending > 0) { rewardToken.transfer(address(msg.sender), pending); prevAndCurrentRewardsBalance -= pending; } user.rewardDebt = user.amount.mul(accTokenPerShare).div(PRECISION_FACTOR); emit Withdraw(msg.sender, _amount); } /* * @notice Withdraw staked tokens without caring about rewards rewards * @dev Needs to be for emergency. */ function emergencyWithdraw() external nonReentrant { UserInfo storage user = userInfo[msg.sender]; uint256 amountToTransfer = user.amount; totalStaked -= user.amount; user.amount = 0; user.rewardDebt = 0; if (amountToTransfer > 0) { stakedToken.transfer(address(msg.sender), amountToTransfer); } emit EmergencyWithdraw(msg.sender, user.amount); } /* * @notice Stop rewards * @dev Only callable by owner. Needs to be for emergency. */ function emergencyRewardWithdraw(uint256 _amount) external onlyOwner { rewardToken.transfer(address(msg.sender), _amount); prevAndCurrentRewardsBalance -= _amount; } /** * @notice It allows the admin to recover wrong tokens sent to the contract * @param _tokenAddress: the address of the token to withdraw * @param _tokenAmount: the number of tokens to withdraw * @dev This function is only callable by admin. * @dev All tokens left in the contract for 3 months become OWNERLESS and can be claimed. */ function recoverWrongTokens(address _tokenAddress, uint256 _tokenAmount) external onlyOwner { if (block.timestamp < bonusEndBlock + 7776000) { require(_tokenAddress != address(stakedToken), "Cannot be staked token(for 3 months)"); require(_tokenAddress != address(rewardToken), "Cannot be reward token(for 3 months)"); IBEP20(_tokenAddress).transfer(address(msg.sender), _tokenAmount); } else { IBEP20(_tokenAddress).transfer(address(msg.sender), _tokenAmount); } emit AdminTokenRecovery(_tokenAddress, _tokenAmount); } /* * @notice Stop rewards * @dev Only callable by owner */ function stopReward() external onlyOwner { _updatePool(); uint256 totalNewReward = checkTotalNewRewards(); uint256 timeLeft = bonusEndBlock - block.timestamp; uint256 rewardsLeft = rewardPerBlock * timeLeft; if (stakedToken == rewardToken) { prevAndCurrentRewardsBalance = rewardToken.balanceOf(address(this)) - totalStaked; } else { // check how much new rewards are available prevAndCurrentRewardsBalance = rewardToken.balanceOf(address(this)); } prevAndCurrentRewardsBalance -= rewardsLeft; prevAndCurrentRewardsBalance -= totalNewReward; bonusEndBlock = block.timestamp; } /* * @notice Update reward per block * @dev Only callable by owner. * @param _rewardPerBlock: the reward per block */ function updateRewardPerBlock(uint256 _rewardPerBlock) external onlyOwner { require(block.timestamp < startBlock, "Pool has started"); rewardPerBlock = _rewardPerBlock; emit NewRewardPerBlock(_rewardPerBlock); } /** * @notice It allows the admin to update start and end blocks * @dev This function is only callable by owner. * @param _startBlock: the new start block * @param _bonusEndBlock: the new end block */ function updateStartAndEndBlocks(uint256 _startBlock, uint256 _bonusEndBlock) external onlyOwner { require(block.timestamp < startBlock, "Pool has started"); require(_startBlock < _bonusEndBlock, "New startBlock must be lower than new endBlock"); require(block.timestamp < _startBlock, "New startBlock must be higher than current block"); startBlock = _startBlock; bonusEndBlock = _bonusEndBlock; // Set the lastRewardBlock as the startBlock lastRewardBlock = startBlock; emit NewStartAndEndBlocks(_startBlock, _bonusEndBlock); } /* * @notice View function to see pending reward on frontend. * @param _user: user address * @return Pending reward for a given user */ function pendingReward(address _user) external view returns (uint256) { UserInfo storage user = userInfo[_user]; uint256 stakedTokenSupply = totalStaked; if (block.timestamp > lastRewardBlock && stakedTokenSupply != 0) { uint256 multiplier = _getMultiplier(lastRewardBlock, block.timestamp); uint256 cakeReward = multiplier.mul(rewardPerBlock); uint256 adjustedTokenPerShare = accTokenPerShare.add(cakeReward.mul(PRECISION_FACTOR).div(stakedTokenSupply)); return user.amount.mul(adjustedTokenPerShare).div(PRECISION_FACTOR).sub(user.rewardDebt); } else { return user.amount.mul(accTokenPerShare).div(PRECISION_FACTOR).sub(user.rewardDebt); } } function checkExtraStakedTokens() public view returns(uint256 extraTokens){ if (stakedToken == rewardToken) { extraTokens = (stakedToken.balanceOf(address(this)) - prevAndCurrentRewardsBalance - totalStaked); } else { extraTokens = (stakedToken.balanceOf(address(this)) - totalStaked); } } function checkTotalNewRewards() public view returns(uint256 totalNewReward){ if (stakedToken == rewardToken) { totalNewReward = (rewardToken.balanceOf(address(this)) - prevAndCurrentRewardsBalance - totalStaked); } else { totalNewReward = (rewardToken.balanceOf(address(this)) - prevAndCurrentRewardsBalance); } } /* * @notice Update reward variables of the given pool to be up-to-date. */ function _updatePool() internal { if (block.timestamp <= lastRewardBlock) { return; } uint256 stakedTokenSupply = totalStaked; if (stakedTokenSupply == 0) { lastRewardBlock = block.timestamp; return; } uint256 multiplier = _getMultiplier(lastRewardBlock, block.timestamp); uint256 cakeReward = multiplier.mul(rewardPerBlock); accTokenPerShare = accTokenPerShare.add(cakeReward.mul(PRECISION_FACTOR).div(stakedTokenSupply)); lastRewardBlock = block.timestamp; } /* * @notice Return reward multiplier over the given _from to _to block. * @param _from: block to start * @param _to: block to finish */ function _getMultiplier(uint256 _from, uint256 _to) internal view returns (uint256) { if (_to <= bonusEndBlock) { return _to.sub(_from); } else if (_from >= bonusEndBlock) { return 0; } else { return bonusEndBlock.sub(_from); } } function addNFTCollection(NFT _newCollection, uint256 amount) external onlyOwner { require(!isNFTCollection[address(_newCollection)], "Already Added"); NFTsNeeded.push(_newCollection); stakeAmounts.push(amount); isNFTCollection[address(_newCollection)] = true; } function removeNFTCollection(NFT _oldCollection) external onlyOwner { address collectionAddress = address(_oldCollection); require(isNFTCollection[collectionAddress], "not Added yet"); for (uint i = 0; i < NFTsNeeded.length; i++) { if (address(NFTsNeeded[i]) == collectionAddress) { NFTsNeeded[i] = NFTsNeeded[NFTsNeeded.length - 1]; stakeAmounts[i] = stakeAmounts[stakeAmounts.length -1]; NFTsNeeded.pop(); stakeAmounts.pop(); isNFTCollection[collectionAddress] = false; break; // Exit the loop after finding and removing the NFT collection } } } function changeStakingLimitForNFT(NFT _collection, uint256 _newAmount) external onlyOwner { for(uint i=0; i<NFTsNeeded.length; i++) { if(NFTsNeeded[i] == _collection) { stakeAmounts[i] = _newAmount; } } } function NFTCollectionInfo() external view returns (string[] memory names, uint256[] memory amounts) { uint256 cLength = NFTsNeeded.length; names = new string[](cLength); amounts = new uint256[](cLength); for(uint i=0; i<cLength; i++) { names[i] = NFTsNeeded[i].name(); amounts[i] = stakeAmounts[i]; } } // Token removal Functions function withdawlBNB() external onlyOwner { payable(msg.sender).transfer(address(this).balance); } function RemoveExtraStakingTokens() external onlyOwner { _updatePool(); uint256 extraTokens = checkExtraStakedTokens(); require(extraTokens > 0, "No extra Tokens to Withdrawl"); IBEP20(stakedToken).transfer(address(msg.sender), extraTokens); } function NEWRewardWithdraw() external onlyOwner { uint256 totalNewReward = checkTotalNewRewards(); require(totalNewReward > 0, "No New Reward Tokens to Withdrawl"); rewardToken.transfer(address(msg.sender), totalNewReward); } receive() external payable {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"contract NFT[]","name":"_NFTs","type":"address[]"},{"internalType":"uint256[]","name":"stakableAmounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"tokenRecovered","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"AdminTokenRecovery","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EmergencyWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"rewardPerBlock","type":"uint256"}],"name":"NewRewardPerBlock","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"startBlock","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"endBlock","type":"uint256"}],"name":"NewStartAndEndBlocks","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":false,"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"RewardsStop","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"ExtendPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"NEWRewardWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"NFTCollectionInfo","outputs":[{"internalType":"string[]","name":"names","type":"string[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"NFTsNeeded","outputs":[{"internalType":"contract NFT","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRECISION_FACTOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RemoveExtraStakingTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"SMART_CHEF_FACTORY","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"accTokenPerShare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract NFT","name":"_newCollection","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"addNFTCollection","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"bonusEndBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract NFT","name":"_collection","type":"address"},{"internalType":"uint256","name":"_newAmount","type":"uint256"}],"name":"changeStakingLimitForNFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"checkExtraStakedTokens","outputs":[{"internalType":"uint256","name":"extraTokens","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"checkTotalNewRewards","outputs":[{"internalType":"uint256","name":"totalNewReward","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"emergencyRewardWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"hasUserLimit","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"increaseAPR","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isInitialized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isNFTCollection","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastRewardBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"pendingReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"poolLimitPerUser","outputs":[{"internalType":"uint256","name":"limit","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"prevAndCurrentRewardsBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"},{"internalType":"uint256","name":"_tokenAmount","type":"uint256"}],"name":"recoverWrongTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract NFT","name":"_oldCollection","type":"address"}],"name":"removeNFTCollection","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardPerBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardToken","outputs":[{"internalType":"contract IBEP20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IBEP20","name":"_stakedToken","type":"address"},{"internalType":"contract IBEP20","name":"_rewardToken","type":"address"}],"name":"setupTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"stakeAmounts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakedToken","outputs":[{"internalType":"contract IBEP20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_startInDays","type":"uint256"},{"internalType":"uint256","name":"_poolLengthDays","type":"uint256"}],"name":"startNewPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stopReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalStaked","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":"_rewardPerBlock","type":"uint256"}],"name":"updateRewardPerBlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_startBlock","type":"uint256"},{"internalType":"uint256","name":"_bonusEndBlock","type":"uint256"}],"name":"updateStartAndEndBlocks","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userInfo","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"rewardDebt","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdawlBNB","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60806040523480156200001157600080fd5b50604051620035fb380380620035fb8339810160408190526200003491620002e8565b6200003f336200015f565b60018055600280546001600160a01b031916331790558051825114620000bb5760405162461bcd60e51b815260206004820152602760248201527f4e4654532c20616e6420616d6f756e7473206d7573742062652073616d65207160448201526675616e7469747960c81b606482015260840160405180910390fd5b8151620000d090600b906020850190620001af565b508051620000e690600d90602084019062000219565b5060005b825181101562000156576001600c60008584815181106200010f576200010f6200044f565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff1916911515919091179055806200014d8162000425565b915050620000ea565b5050506200047b565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b82805482825590600052602060002090810192821562000207579160200282015b828111156200020757825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190620001d0565b506200021592915062000257565b5090565b82805482825590600052602060002090810192821562000207579160200282015b82811115620002075782518255916020019190600101906200023a565b5b8082111562000215576000815560010162000258565b600082601f8301126200028057600080fd5b81516020620002996200029383620003ff565b620003cc565b80838252828201915082860187848660051b8901011115620002ba57600080fd5b60005b85811015620002db57815184529284019290840190600101620002bd565b5090979650505050505050565b60008060408385031215620002fc57600080fd5b82516001600160401b03808211156200031457600080fd5b818501915085601f8301126200032957600080fd5b815160206200033c6200029383620003ff565b8083825282820191508286018a848660051b89010111156200035d57600080fd5b600096505b84871015620003985780516001600160a01b03811681146200038357600080fd5b83526001969096019591830191830162000362565b5091880151919650909350505080821115620003b357600080fd5b50620003c2858286016200026e565b9150509250929050565b604051601f8201601f191681016001600160401b0381118282101715620003f757620003f762000465565b604052919050565b60006001600160401b038211156200041b576200041b62000465565b5060051b60200190565b60006000198214156200044857634e487b7160e01b600052601160045260246000fd5b5060010190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b613170806200048b6000396000f3fe6080604052600436106102605760003560e01c806383a0240011610144578063cc7a262e116100b6578063e43d4d281161007a578063e43d4d28146106d2578063e53eb7bc146106f2578063e799ffb114610712578063f2fde38b14610727578063f40f0f5214610747578063f7c618c11461076757600080fd5b8063cc7a262e14610652578063ccd34cd514610672578063cd5f0bf714610688578063d6fb38e01461069d578063db2e21bc146106bd57600080fd5b80639513997f116101085780639513997f146105a75780639ef6de20146105c7578063a9f8d181146105e7578063b238c3b6146105fd578063b6b55f2514610612578063bd6171911461063257600080fd5b806383a02400146105135780638ae39cac146105285780638da5cb5b1461053e5780638f6629151461057057806392e8990e1461058657600080fd5b806335b073f2116101dd57806348cd4cb1116101a157806348cd4cb11461047d5780636bdb865114610493578063715018a6146104b357806379334353146104c857806380dc0672146104e8578063817b1cd2146104fd57600080fd5b806335b073f2146103fc578063392e53cd146104115780633a19dbac146104325780633f138d4b14610448578063433671891461046857600080fd5b80631c1b4f3a116102245780631c1b4f3a1461034757806328d63a9d146103675780632e1a7d4d1461037c5780632edc6bee1461039c5780633279beab146103dc57600080fd5b8063011a11871461026c57806301f8a9761461029857806303c80111146102ba5780631959a002146102da5780631aed65531461032357600080fd5b3661026757005b600080fd5b34801561027857600080fd5b50610281610787565b60405161028f929190612e2d565b60405180910390f35b3480156102a457600080fd5b506102b86102b3366004612d62565b610934565b005b3480156102c657600080fd5b506102b86102d5366004612d94565b6109e6565b3480156102e657600080fd5b5061030e6102f5366004612c15565b6010602052600090815260409020805460019091015482565b6040805192835260208301919091520161028f565b34801561032f57600080fd5b5061033960045481565b60405190815260200161028f565b34801561035357600080fd5b50610339610362366004612d62565b610c62565b34801561037357600080fd5b506102b8610c83565b34801561038857600080fd5b506102b8610397366004612d62565b610d99565b3480156103a857600080fd5b506103cc6103b7366004612c15565b600c6020526000908152604090205460ff1681565b604051901515815260200161028f565b3480156103e857600080fd5b506102b86103f7366004612d62565b61100e565b34801561040857600080fd5b506102b86110d7565b34801561041d57600080fd5b506002546103cc90600160a81b900460ff1681565b34801561043e57600080fd5b50610339600f5481565b34801561045457600080fd5b506102b8610463366004612c39565b611305565b34801561047457600080fd5b506102b861155f565b34801561048957600080fd5b5061033960055481565b34801561049f57600080fd5b506102b86104ae366004612c87565b611621565b3480156104bf57600080fd5b506102b86117c3565b3480156104d457600080fd5b506103396104e3366004612c15565b6117f9565b3480156104f457600080fd5b506102b86118f3565b34801561050957600080fd5b50610339600e5481565b34801561051f57600080fd5b50610339611ab7565b34801561053457600080fd5b5061033960075481565b34801561054a57600080fd5b506000546001600160a01b03165b6040516001600160a01b03909116815260200161028f565b34801561057c57600080fd5b5061033960035481565b34801561059257600080fd5b506002546103cc90600160a01b900460ff1681565b3480156105b357600080fd5b506102b86105c2366004612d94565b611bed565b3480156105d357600080fd5b506102b86105e2366004612c15565b611d6e565b3480156105f357600080fd5b5061033960065481565b34801561060957600080fd5b50610339611f8d565b34801561061e57600080fd5b506102b861062d366004612d62565b612012565b34801561063e57600080fd5b50600254610558906001600160a01b031681565b34801561065e57600080fd5b50600a54610558906001600160a01b031681565b34801561067e57600080fd5b5061033960085481565b34801561069457600080fd5b506102b86123ac565b3480156106a957600080fd5b506102b86106b8366004612c39565b612606565b3480156106c957600080fd5b506102b8612720565b3480156106de57600080fd5b506105586106ed366004612d62565b612849565b3480156106fe57600080fd5b506102b861070d366004612c39565b612873565b34801561071e57600080fd5b506102b8612915565b34801561073357600080fd5b506102b8610742366004612c15565b61296e565b34801561075357600080fd5b50610339610762366004612c15565b612a06565b34801561077357600080fd5b50600954610558906001600160a01b031681565b600b5460609081908067ffffffffffffffff8111156107a8576107a861310f565b6040519080825280602002602001820160405280156107db57816020015b60608152602001906001900390816107c65790505b5092508067ffffffffffffffff8111156107f7576107f761310f565b604051908082528060200260200182016040528015610820578160200160208202803683370190505b50915060005b8181101561092e57600b8181548110610841576108416130f9565b6000918252602082200154604080516306fdde0360e01b815290516001600160a01b03909216926306fdde0392600480840193829003018186803b15801561088857600080fd5b505afa15801561089c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526108c49190810190612cc0565b8482815181106108d6576108d66130f9565b6020026020010181905250600d81815481106108f4576108f46130f9565b9060005260206000200154838281518110610911576109116130f9565b602090810291909101015280610926816130b2565b915050610826565b50509091565b6000546001600160a01b031633146109675760405162461bcd60e51b815260040161095e90612ebb565b60405180910390fd5b60055442106109ab5760405162461bcd60e51b815260206004820152601060248201526f141bdbdb081a185cc81cdd185c9d195960821b604482015260640161095e565b60078190556040518181527f0c4d677eef92893ac7ec52faf8140fc6c851ab4736302b4f3a89dfb20696a0df9060200160405180910390a150565b6000546001600160a01b03163314610a105760405162461bcd60e51b815260040161095e90612ebb565b4260045410610a6b5760405162461bcd60e51b815260206004820152602160248201527f506f6f6c20686173206e6f7420656e6465642c2054727920457874656e64696e6044820152606760f81b606482015260840161095e565b610a73612ae7565b6000610a7d611f8d565b905060008111610acf5760405162461bcd60e51b815260206004820152601f60248201527f4e6f2066756e647320746f207374617274206e657720706f6f6c207769746800604482015260640161095e565b600080610adf856201518061304c565b9150610aee846201518061304c565b600954600a549192506001600160a01b0391821691161415610b9a57600e546009546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b158015610b5057600080fd5b505afa158015610b64573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b889190612d7b565b610b92919061306b565b600f55610c19565b6009546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b158015610bdd57600080fd5b505afa158015610bf1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c159190612d7b565b600f555b610c238242612f27565b60058190556006819055610c38908290612f27565b600455610c458184612f3f565b60075550506002805460ff60a81b1916600160a81b179055505050565b600d8181548110610c7257600080fd5b600091825260209091200154905081565b6000546001600160a01b03163314610cad5760405162461bcd60e51b815260040161095e90612ebb565b610cb5612ae7565b6000610cbf611ab7565b905060008111610d115760405162461bcd60e51b815260206004820152601c60248201527f4e6f20657874726120546f6b656e7320746f2057697468647261776c00000000604482015260640161095e565b600a5460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb90610d439033908590600401612e14565b602060405180830381600087803b158015610d5d57600080fd5b505af1158015610d71573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d959190612c65565b5050565b60026001541415610dbc5760405162461bcd60e51b815260040161095e90612ef0565b60026001553360009081526010602052604090208054821115610e215760405162461bcd60e51b815260206004820152601b60248201527f416d6f756e7420746f20776974686472617720746f6f20686967680000000000604482015260640161095e565b610e29612ae7565b6000610e5e8260010154610e58600854610e526003548760000154612b5290919063ffffffff16565b90612b67565b90612b73565b90508215610f11578154610e729084612b73565b8255600a5460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb90610ea69033908790600401612e14565b602060405180830381600087803b158015610ec057600080fd5b505af1158015610ed4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ef89190612c65565b5082600e6000828254610f0b919061306b565b90915550505b8015610fb45760095460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb90610f499033908590600401612e14565b602060405180830381600087803b158015610f6357600080fd5b505af1158015610f77573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f9b9190612c65565b5080600f6000828254610fae919061306b565b90915550505b6008546003548354610fcb9291610e529190612b52565b600183015560405183815233907f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a94243649060200160405180910390a250506001805550565b6000546001600160a01b031633146110385760405162461bcd60e51b815260040161095e90612ebb565b60095460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb9061106a9033908590600401612e14565b602060405180830381600087803b15801561108457600080fd5b505af1158015611098573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110bc9190612c65565b5080600f60008282546110cf919061306b565b909155505050565b6000546001600160a01b031633146111015760405162461bcd60e51b815260040161095e90612ebb565b42600454116111525760405162461bcd60e51b815260206004820181905260248201527f506f6f6c2068617320456e6465642c207573652073746172744e6577506f6f6c604482015260640161095e565b61115a612ae7565b6000611164611f8d565b9050600081116111b65760405162461bcd60e51b815260206004820152601f60248201527f4e6f2066756e647320746f207374617274206e657720706f6f6c207769746800604482015260640161095e565b600954600a546001600160a01b039081169116141561125f57600e546009546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b15801561121557600080fd5b505afa158015611229573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061124d9190612d7b565b611257919061306b565b600f556112de565b6009546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b1580156112a257600080fd5b505afa1580156112b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112da9190612d7b565b600f555b6000600754826112ee9190612f3f565b9050806004546112fe9190612f27565b6004555050565b6000546001600160a01b0316331461132f5760405162461bcd60e51b815260040161095e90612ebb565b60045461133f906276a700612f27565b4210156114a057600a546001600160a01b03838116911614156113b05760405162461bcd60e51b8152602060048201526024808201527f43616e6e6f74206265207374616b656420746f6b656e28666f722033206d6f6e6044820152637468732960e01b606482015260840161095e565b6009546001600160a01b038381169116141561141a5760405162461bcd60e51b8152602060048201526024808201527f43616e6e6f742062652072657761726420746f6b656e28666f722033206d6f6e6044820152637468732960e01b606482015260840161095e565b60405163a9059cbb60e01b81526001600160a01b0383169063a9059cbb906114489033908590600401612e14565b602060405180830381600087803b15801561146257600080fd5b505af1158015611476573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061149a9190612c65565b50611522565b60405163a9059cbb60e01b81526001600160a01b0383169063a9059cbb906114ce9033908590600401612e14565b602060405180830381600087803b1580156114e857600080fd5b505af11580156114fc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115209190612c65565b505b7f74545154aac348a3eac92596bd1971957ca94795f4e954ec5f613b55fab781298282604051611553929190612e14565b60405180910390a15050565b6000546001600160a01b031633146115895760405162461bcd60e51b815260040161095e90612ebb565b6000611593611f8d565b9050600081116115ef5760405162461bcd60e51b815260206004820152602160248201527f4e6f204e65772052657761726420546f6b656e7320746f2057697468647261776044820152601b60fa1b606482015260840161095e565b60095460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb90610d439033908590600401612e14565b6000546001600160a01b0316331461164b5760405162461bcd60e51b815260040161095e90612ebb565b600254600160a81b900460ff161561169b5760405162461bcd60e51b8152602060048201526013602482015272105b1c9958591e481a5b9a5d1a585b1a5e9959606a1b604482015260640161095e565b600a80546001600160a01b038085166001600160a01b0319928316179092556009805492841692909116821790556002805460ff60a01b1916600160a01b1790556040805163313ce56760e01b815290516000929163313ce567916004808301926020929190829003018186803b15801561171557600080fd5b505afa158015611729573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061174d9190612db6565b60ff169050601e811061179b5760405162461bcd60e51b815260206004820152601660248201527504d75737420626520696e666572696f7220746f2033360541b604482015260640161095e565b6117a6601e82612b73565b6117b190600a612fa4565b60085550506000600f819055600e5550565b6000546001600160a01b031633146117ed5760405162461bcd60e51b815260040161095e90612ebb565b6117f76000612b7f565b565b6000805b600b548110156118ed576000600b828154811061181c5761181c6130f9565b6000918252602090912001546040516370a0823160e01b81526001600160a01b038681166004830152909116906370a082319060240160206040518083038186803b15801561186a57600080fd5b505afa15801561187e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118a29190612d7b565b9050600d82815481106118b7576118b76130f9565b9060005260206000200154816118cd919061304c565b6118d79084612f27565b92505080806118e5906130b2565b9150506117fd565b50919050565b6000546001600160a01b0316331461191d5760405162461bcd60e51b815260040161095e90612ebb565b611925612ae7565b600061192f611f8d565b9050600042600454611941919061306b565b9050600081600754611953919061304c565b600954600a549192506001600160a01b03918216911614156119ff57600e546009546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b1580156119b557600080fd5b505afa1580156119c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119ed9190612d7b565b6119f7919061306b565b600f55611a7e565b6009546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b158015611a4257600080fd5b505afa158015611a56573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a7a9190612d7b565b600f555b80600f6000828254611a90919061306b565b9250508190555082600f6000828254611aa9919061306b565b909155505042600455505050565b600954600a546000916001600160a01b0391821691161415611b6e57600e54600f54600a546040516370a0823160e01b81523060048201526001600160a01b03909116906370a08231906024015b60206040518083038186803b158015611b1d57600080fd5b505afa158015611b31573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b559190612d7b565b611b5f919061306b565b611b69919061306b565b905090565b600e54600a546040516370a0823160e01b81523060048201526001600160a01b03909116906370a08231906024015b60206040518083038186803b158015611bb557600080fd5b505afa158015611bc9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b5f9190612d7b565b6000546001600160a01b03163314611c175760405162461bcd60e51b815260040161095e90612ebb565b6005544210611c5b5760405162461bcd60e51b815260206004820152601060248201526f141bdbdb081a185cc81cdd185c9d195960821b604482015260640161095e565b808210611cc15760405162461bcd60e51b815260206004820152602e60248201527f4e6577207374617274426c6f636b206d757374206265206c6f7765722074686160448201526d6e206e657720656e64426c6f636b60901b606482015260840161095e565b814210611d295760405162461bcd60e51b815260206004820152603060248201527f4e6577207374617274426c6f636b206d7573742062652068696768657220746860448201526f616e2063757272656e7420626c6f636b60801b606482015260840161095e565b60058290556004819055600682905560408051838152602081018390527f7cd0ab87d19036f3dfadadb232c78aa4879dda3f0c994a9d637532410ee2ce069101611553565b6000546001600160a01b03163314611d985760405162461bcd60e51b815260040161095e90612ebb565b6001600160a01b0381166000908152600c6020526040902054819060ff16611df25760405162461bcd60e51b815260206004820152600d60248201526c1b9bdd081059191959081e595d609a1b604482015260640161095e565b60005b600b54811015611f8857816001600160a01b0316600b8281548110611e1c57611e1c6130f9565b6000918252602090912001546001600160a01b03161415611f7657600b8054611e479060019061306b565b81548110611e5757611e576130f9565b600091825260209091200154600b80546001600160a01b039092169183908110611e8357611e836130f9565b600091825260209091200180546001600160a01b0319166001600160a01b0392909216919091179055600d8054611ebc9060019061306b565b81548110611ecc57611ecc6130f9565b9060005260206000200154600d8281548110611eea57611eea6130f9565b600091825260209091200155600b805480611f0757611f076130e3565b600082815260209020810160001990810180546001600160a01b0319169055019055600d805480611f3a57611f3a6130e3565b6000828152602080822083016000199081018390559092019092556001600160a01b0384168252600c905260409020805460ff19169055505050565b80611f80816130b2565b915050611df5565b505050565b600954600a546000916001600160a01b0391821691161415611fdf57600e54600f546009546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401611b05565b600f546009546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401611b9d565b600260015414156120355760405162461bcd60e51b815260040161095e90612ef0565b6002600155336000818152601060205260408120918190612055906117f9565b8354612062908690612bcf565b11156120b05760405162461bcd60e51b815260206004820152601760248201527f5573657220616d6f756e742061626f7665206c696d6974000000000000000000604482015260640161095e565b6120b8612ae7565b82541561218f5760006120e88460010154610e58600854610e526003548960000154612b5290919063ffffffff16565b9050801561218d5760095460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb906121229033908590600401612e14565b602060405180830381600087803b15801561213c57600080fd5b505af1158015612150573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121749190612c65565b5080600f6000828254612187919061306b565b90915550505b505b831561235157600a546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b1580156121d857600080fd5b505afa1580156121ec573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122109190612d7b565b600a546040516323b872dd60e01b8152336004820152306024820152604481018790529193506001600160a01b0316906323b872dd90606401602060405180830381600087803b15801561226357600080fd5b505af1158015612277573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061229b9190612c65565b50600a546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b1580156122df57600080fd5b505afa1580156122f3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123179190612d7b565b905061232e612326838361306b565b845490612bcf565b835561233a828261306b565b600e600082825461234b9190612f27565b90915550505b60085460035484546123689291610e529190612b52565b600184015560405184815233907fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c9060200160405180910390a25050600180555050565b6000546001600160a01b031633146123d65760405162461bcd60e51b815260040161095e90612ebb565b6123de612ae7565b60006123e8611f8d565b9050426004541161243b5760405162461bcd60e51b815260206004820181905260248201527f506f6f6c2068617320456e6465642c207573652073746172744e6577506f6f6c604482015260640161095e565b6000811161249f5760405162461bcd60e51b815260206004820152602b60248201527f6e6f204e65775265776172647320617661696c6176626c652c2073656e64207460448201526a1bdad95b9cc8119a5c9cdd60aa1b606482015260840161095e565b6000426004546124af919061306b565b905060006124bd8284612f3f565b905080600760008282546124d19190612f27565b9091555050600954600a546001600160a01b039081169116141561257f57600e546009546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b15801561253557600080fd5b505afa158015612549573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061256d9190612d7b565b612577919061306b565b600f556125fe565b6009546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b1580156125c257600080fd5b505afa1580156125d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125fa9190612d7b565b600f555b611f88612ae7565b6000546001600160a01b031633146126305760405162461bcd60e51b815260040161095e90612ebb565b6001600160a01b0382166000908152600c602052604090205460ff16156126895760405162461bcd60e51b815260206004820152600d60248201526c105b1c9958591e481059191959609a1b604482015260640161095e565b600b805460018181019092557f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db90180546001600160a01b039094166001600160a01b031990941684179055600d80548083019091557fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb501919091556000918252600c6020526040909120805460ff19169091179055565b600260015414156127435760405162461bcd60e51b815260040161095e90612ef0565b60026001553360009081526010602052604081208054600e80549293919283929061276f90849061306b565b909155505060008083556001830155801561280a57600a5460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb906127b69033908590600401612e14565b602060405180830381600087803b1580156127d057600080fd5b505af11580156127e4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128089190612c65565b505b815460405190815233907f5fafa99d0643513820be26656b45130b01e1c03062e1266bf36f88cbd3bd96959060200160405180910390a2505060018055565b600b818154811061285957600080fd5b6000918252602090912001546001600160a01b0316905081565b6000546001600160a01b0316331461289d5760405162461bcd60e51b815260040161095e90612ebb565b60005b600b54811015611f8857826001600160a01b0316600b82815481106128c7576128c76130f9565b6000918252602090912001546001600160a01b031614156129035781600d82815481106128f6576128f66130f9565b6000918252602090912001555b8061290d816130b2565b9150506128a0565b6000546001600160a01b0316331461293f5760405162461bcd60e51b815260040161095e90612ebb565b60405133904780156108fc02916000818181858888f1935050505015801561296b573d6000803e3d6000fd5b50565b6000546001600160a01b031633146129985760405162461bcd60e51b815260040161095e90612ebb565b6001600160a01b0381166129fd5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161095e565b61296b81612b7f565b6001600160a01b0381166000908152601060205260408120600e5460065442118015612a3157508015155b15612ab8576000612a4460065442612bdb565b90506000612a5d60075483612b5290919063ffffffff16565b90506000612a86612a7d85610e5260085486612b5290919063ffffffff16565b60035490612bcf565b9050612aad8560010154610e58600854610e52858a60000154612b5290919063ffffffff16565b979650505050505050565b612adf8260010154610e58600854610e526003548760000154612b5290919063ffffffff16565b949350505050565b6006544211612af257565b600e5480612b01575042600655565b6000612b0f60065442612bdb565b90506000612b2860075483612b5290919063ffffffff16565b9050612b46612a7d84610e5260085485612b5290919063ffffffff16565b60035550504260065550565b6000612b5e828461304c565b90505b92915050565b6000612b5e8284612f3f565b6000612b5e828461306b565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000612b5e8284612f27565b60006004548211612bf757612bf08284612b73565b9050612b61565b6004548310612c0857506000612b61565b600454612bf09084612b73565b600060208284031215612c2757600080fd5b8135612c3281613125565b9392505050565b60008060408385031215612c4c57600080fd5b8235612c5781613125565b946020939093013593505050565b600060208284031215612c7757600080fd5b81518015158114612c3257600080fd5b60008060408385031215612c9a57600080fd5b8235612ca581613125565b91506020830135612cb581613125565b809150509250929050565b600060208284031215612cd257600080fd5b815167ffffffffffffffff80821115612cea57600080fd5b818401915084601f830112612cfe57600080fd5b815181811115612d1057612d1061310f565b604051601f8201601f19908116603f01168101908382118183101715612d3857612d3861310f565b81604052828152876020848701011115612d5157600080fd5b612aad836020830160208801613082565b600060208284031215612d7457600080fd5b5035919050565b600060208284031215612d8d57600080fd5b5051919050565b60008060408385031215612da757600080fd5b50508035926020909101359150565b600060208284031215612dc857600080fd5b815160ff81168114612c3257600080fd5b600081518084526020808501945080840160005b83811015612e0957815187529582019590820190600101612ded565b509495945050505050565b6001600160a01b03929092168252602082015260400190565b6000604082016040835280855180835260608501915060608160051b8601019250602080880160005b83811015612e9c57878603605f1901855281518051808852612e7d81868a01878501613082565b601f01601f191696909601830195509382019390820190600101612e56565b505085840381870152505050612eb28185612dd9565b95945050505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b60008219821115612f3a57612f3a6130cd565b500190565b600082612f5c57634e487b7160e01b600052601260045260246000fd5b500490565b600181815b80851115612f9c578160001904821115612f8257612f826130cd565b80851615612f8f57918102915b93841c9390800290612f66565b509250929050565b6000612b5e8383600082612fba57506001612b61565b81612fc757506000612b61565b8160018114612fdd5760028114612fe757613003565b6001915050612b61565b60ff841115612ff857612ff86130cd565b50506001821b612b61565b5060208310610133831016604e8410600b8410161715613026575081810a612b61565b6130308383612f61565b8060001904821115613044576130446130cd565b029392505050565b6000816000190483118215151615613066576130666130cd565b500290565b60008282101561307d5761307d6130cd565b500390565b60005b8381101561309d578181015183820152602001613085565b838111156130ac576000848401525b50505050565b60006000198214156130c6576130c66130cd565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461296b57600080fdfea26469706673582212206d872f00316818f6f913511ca46484118e5da352f38c8363a6665f7d879690be64736f6c63430008070033000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000030000000000000000000000005cd50d974ff5edfee9fe0623ebabd9b3c1ece88c000000000000000000000000adc47dd9017f3cdddf25658116285eb69c685be000000000000000000000000014881490d020d0bba94af6d902d026ed54a91793000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000052b7d2dcc80cd2e40000000000000000000000000000000000000000000000003e09de2596099e2b000000000000000000000000000000000000000000000000108b2a2c28029094000000
Deployed Bytecode
0x6080604052600436106102605760003560e01c806383a0240011610144578063cc7a262e116100b6578063e43d4d281161007a578063e43d4d28146106d2578063e53eb7bc146106f2578063e799ffb114610712578063f2fde38b14610727578063f40f0f5214610747578063f7c618c11461076757600080fd5b8063cc7a262e14610652578063ccd34cd514610672578063cd5f0bf714610688578063d6fb38e01461069d578063db2e21bc146106bd57600080fd5b80639513997f116101085780639513997f146105a75780639ef6de20146105c7578063a9f8d181146105e7578063b238c3b6146105fd578063b6b55f2514610612578063bd6171911461063257600080fd5b806383a02400146105135780638ae39cac146105285780638da5cb5b1461053e5780638f6629151461057057806392e8990e1461058657600080fd5b806335b073f2116101dd57806348cd4cb1116101a157806348cd4cb11461047d5780636bdb865114610493578063715018a6146104b357806379334353146104c857806380dc0672146104e8578063817b1cd2146104fd57600080fd5b806335b073f2146103fc578063392e53cd146104115780633a19dbac146104325780633f138d4b14610448578063433671891461046857600080fd5b80631c1b4f3a116102245780631c1b4f3a1461034757806328d63a9d146103675780632e1a7d4d1461037c5780632edc6bee1461039c5780633279beab146103dc57600080fd5b8063011a11871461026c57806301f8a9761461029857806303c80111146102ba5780631959a002146102da5780631aed65531461032357600080fd5b3661026757005b600080fd5b34801561027857600080fd5b50610281610787565b60405161028f929190612e2d565b60405180910390f35b3480156102a457600080fd5b506102b86102b3366004612d62565b610934565b005b3480156102c657600080fd5b506102b86102d5366004612d94565b6109e6565b3480156102e657600080fd5b5061030e6102f5366004612c15565b6010602052600090815260409020805460019091015482565b6040805192835260208301919091520161028f565b34801561032f57600080fd5b5061033960045481565b60405190815260200161028f565b34801561035357600080fd5b50610339610362366004612d62565b610c62565b34801561037357600080fd5b506102b8610c83565b34801561038857600080fd5b506102b8610397366004612d62565b610d99565b3480156103a857600080fd5b506103cc6103b7366004612c15565b600c6020526000908152604090205460ff1681565b604051901515815260200161028f565b3480156103e857600080fd5b506102b86103f7366004612d62565b61100e565b34801561040857600080fd5b506102b86110d7565b34801561041d57600080fd5b506002546103cc90600160a81b900460ff1681565b34801561043e57600080fd5b50610339600f5481565b34801561045457600080fd5b506102b8610463366004612c39565b611305565b34801561047457600080fd5b506102b861155f565b34801561048957600080fd5b5061033960055481565b34801561049f57600080fd5b506102b86104ae366004612c87565b611621565b3480156104bf57600080fd5b506102b86117c3565b3480156104d457600080fd5b506103396104e3366004612c15565b6117f9565b3480156104f457600080fd5b506102b86118f3565b34801561050957600080fd5b50610339600e5481565b34801561051f57600080fd5b50610339611ab7565b34801561053457600080fd5b5061033960075481565b34801561054a57600080fd5b506000546001600160a01b03165b6040516001600160a01b03909116815260200161028f565b34801561057c57600080fd5b5061033960035481565b34801561059257600080fd5b506002546103cc90600160a01b900460ff1681565b3480156105b357600080fd5b506102b86105c2366004612d94565b611bed565b3480156105d357600080fd5b506102b86105e2366004612c15565b611d6e565b3480156105f357600080fd5b5061033960065481565b34801561060957600080fd5b50610339611f8d565b34801561061e57600080fd5b506102b861062d366004612d62565b612012565b34801561063e57600080fd5b50600254610558906001600160a01b031681565b34801561065e57600080fd5b50600a54610558906001600160a01b031681565b34801561067e57600080fd5b5061033960085481565b34801561069457600080fd5b506102b86123ac565b3480156106a957600080fd5b506102b86106b8366004612c39565b612606565b3480156106c957600080fd5b506102b8612720565b3480156106de57600080fd5b506105586106ed366004612d62565b612849565b3480156106fe57600080fd5b506102b861070d366004612c39565b612873565b34801561071e57600080fd5b506102b8612915565b34801561073357600080fd5b506102b8610742366004612c15565b61296e565b34801561075357600080fd5b50610339610762366004612c15565b612a06565b34801561077357600080fd5b50600954610558906001600160a01b031681565b600b5460609081908067ffffffffffffffff8111156107a8576107a861310f565b6040519080825280602002602001820160405280156107db57816020015b60608152602001906001900390816107c65790505b5092508067ffffffffffffffff8111156107f7576107f761310f565b604051908082528060200260200182016040528015610820578160200160208202803683370190505b50915060005b8181101561092e57600b8181548110610841576108416130f9565b6000918252602082200154604080516306fdde0360e01b815290516001600160a01b03909216926306fdde0392600480840193829003018186803b15801561088857600080fd5b505afa15801561089c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526108c49190810190612cc0565b8482815181106108d6576108d66130f9565b6020026020010181905250600d81815481106108f4576108f46130f9565b9060005260206000200154838281518110610911576109116130f9565b602090810291909101015280610926816130b2565b915050610826565b50509091565b6000546001600160a01b031633146109675760405162461bcd60e51b815260040161095e90612ebb565b60405180910390fd5b60055442106109ab5760405162461bcd60e51b815260206004820152601060248201526f141bdbdb081a185cc81cdd185c9d195960821b604482015260640161095e565b60078190556040518181527f0c4d677eef92893ac7ec52faf8140fc6c851ab4736302b4f3a89dfb20696a0df9060200160405180910390a150565b6000546001600160a01b03163314610a105760405162461bcd60e51b815260040161095e90612ebb565b4260045410610a6b5760405162461bcd60e51b815260206004820152602160248201527f506f6f6c20686173206e6f7420656e6465642c2054727920457874656e64696e6044820152606760f81b606482015260840161095e565b610a73612ae7565b6000610a7d611f8d565b905060008111610acf5760405162461bcd60e51b815260206004820152601f60248201527f4e6f2066756e647320746f207374617274206e657720706f6f6c207769746800604482015260640161095e565b600080610adf856201518061304c565b9150610aee846201518061304c565b600954600a549192506001600160a01b0391821691161415610b9a57600e546009546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b158015610b5057600080fd5b505afa158015610b64573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b889190612d7b565b610b92919061306b565b600f55610c19565b6009546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b158015610bdd57600080fd5b505afa158015610bf1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c159190612d7b565b600f555b610c238242612f27565b60058190556006819055610c38908290612f27565b600455610c458184612f3f565b60075550506002805460ff60a81b1916600160a81b179055505050565b600d8181548110610c7257600080fd5b600091825260209091200154905081565b6000546001600160a01b03163314610cad5760405162461bcd60e51b815260040161095e90612ebb565b610cb5612ae7565b6000610cbf611ab7565b905060008111610d115760405162461bcd60e51b815260206004820152601c60248201527f4e6f20657874726120546f6b656e7320746f2057697468647261776c00000000604482015260640161095e565b600a5460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb90610d439033908590600401612e14565b602060405180830381600087803b158015610d5d57600080fd5b505af1158015610d71573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d959190612c65565b5050565b60026001541415610dbc5760405162461bcd60e51b815260040161095e90612ef0565b60026001553360009081526010602052604090208054821115610e215760405162461bcd60e51b815260206004820152601b60248201527f416d6f756e7420746f20776974686472617720746f6f20686967680000000000604482015260640161095e565b610e29612ae7565b6000610e5e8260010154610e58600854610e526003548760000154612b5290919063ffffffff16565b90612b67565b90612b73565b90508215610f11578154610e729084612b73565b8255600a5460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb90610ea69033908790600401612e14565b602060405180830381600087803b158015610ec057600080fd5b505af1158015610ed4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ef89190612c65565b5082600e6000828254610f0b919061306b565b90915550505b8015610fb45760095460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb90610f499033908590600401612e14565b602060405180830381600087803b158015610f6357600080fd5b505af1158015610f77573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f9b9190612c65565b5080600f6000828254610fae919061306b565b90915550505b6008546003548354610fcb9291610e529190612b52565b600183015560405183815233907f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a94243649060200160405180910390a250506001805550565b6000546001600160a01b031633146110385760405162461bcd60e51b815260040161095e90612ebb565b60095460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb9061106a9033908590600401612e14565b602060405180830381600087803b15801561108457600080fd5b505af1158015611098573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110bc9190612c65565b5080600f60008282546110cf919061306b565b909155505050565b6000546001600160a01b031633146111015760405162461bcd60e51b815260040161095e90612ebb565b42600454116111525760405162461bcd60e51b815260206004820181905260248201527f506f6f6c2068617320456e6465642c207573652073746172744e6577506f6f6c604482015260640161095e565b61115a612ae7565b6000611164611f8d565b9050600081116111b65760405162461bcd60e51b815260206004820152601f60248201527f4e6f2066756e647320746f207374617274206e657720706f6f6c207769746800604482015260640161095e565b600954600a546001600160a01b039081169116141561125f57600e546009546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b15801561121557600080fd5b505afa158015611229573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061124d9190612d7b565b611257919061306b565b600f556112de565b6009546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b1580156112a257600080fd5b505afa1580156112b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112da9190612d7b565b600f555b6000600754826112ee9190612f3f565b9050806004546112fe9190612f27565b6004555050565b6000546001600160a01b0316331461132f5760405162461bcd60e51b815260040161095e90612ebb565b60045461133f906276a700612f27565b4210156114a057600a546001600160a01b03838116911614156113b05760405162461bcd60e51b8152602060048201526024808201527f43616e6e6f74206265207374616b656420746f6b656e28666f722033206d6f6e6044820152637468732960e01b606482015260840161095e565b6009546001600160a01b038381169116141561141a5760405162461bcd60e51b8152602060048201526024808201527f43616e6e6f742062652072657761726420746f6b656e28666f722033206d6f6e6044820152637468732960e01b606482015260840161095e565b60405163a9059cbb60e01b81526001600160a01b0383169063a9059cbb906114489033908590600401612e14565b602060405180830381600087803b15801561146257600080fd5b505af1158015611476573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061149a9190612c65565b50611522565b60405163a9059cbb60e01b81526001600160a01b0383169063a9059cbb906114ce9033908590600401612e14565b602060405180830381600087803b1580156114e857600080fd5b505af11580156114fc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115209190612c65565b505b7f74545154aac348a3eac92596bd1971957ca94795f4e954ec5f613b55fab781298282604051611553929190612e14565b60405180910390a15050565b6000546001600160a01b031633146115895760405162461bcd60e51b815260040161095e90612ebb565b6000611593611f8d565b9050600081116115ef5760405162461bcd60e51b815260206004820152602160248201527f4e6f204e65772052657761726420546f6b656e7320746f2057697468647261776044820152601b60fa1b606482015260840161095e565b60095460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb90610d439033908590600401612e14565b6000546001600160a01b0316331461164b5760405162461bcd60e51b815260040161095e90612ebb565b600254600160a81b900460ff161561169b5760405162461bcd60e51b8152602060048201526013602482015272105b1c9958591e481a5b9a5d1a585b1a5e9959606a1b604482015260640161095e565b600a80546001600160a01b038085166001600160a01b0319928316179092556009805492841692909116821790556002805460ff60a01b1916600160a01b1790556040805163313ce56760e01b815290516000929163313ce567916004808301926020929190829003018186803b15801561171557600080fd5b505afa158015611729573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061174d9190612db6565b60ff169050601e811061179b5760405162461bcd60e51b815260206004820152601660248201527504d75737420626520696e666572696f7220746f2033360541b604482015260640161095e565b6117a6601e82612b73565b6117b190600a612fa4565b60085550506000600f819055600e5550565b6000546001600160a01b031633146117ed5760405162461bcd60e51b815260040161095e90612ebb565b6117f76000612b7f565b565b6000805b600b548110156118ed576000600b828154811061181c5761181c6130f9565b6000918252602090912001546040516370a0823160e01b81526001600160a01b038681166004830152909116906370a082319060240160206040518083038186803b15801561186a57600080fd5b505afa15801561187e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118a29190612d7b565b9050600d82815481106118b7576118b76130f9565b9060005260206000200154816118cd919061304c565b6118d79084612f27565b92505080806118e5906130b2565b9150506117fd565b50919050565b6000546001600160a01b0316331461191d5760405162461bcd60e51b815260040161095e90612ebb565b611925612ae7565b600061192f611f8d565b9050600042600454611941919061306b565b9050600081600754611953919061304c565b600954600a549192506001600160a01b03918216911614156119ff57600e546009546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b1580156119b557600080fd5b505afa1580156119c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119ed9190612d7b565b6119f7919061306b565b600f55611a7e565b6009546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b158015611a4257600080fd5b505afa158015611a56573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a7a9190612d7b565b600f555b80600f6000828254611a90919061306b565b9250508190555082600f6000828254611aa9919061306b565b909155505042600455505050565b600954600a546000916001600160a01b0391821691161415611b6e57600e54600f54600a546040516370a0823160e01b81523060048201526001600160a01b03909116906370a08231906024015b60206040518083038186803b158015611b1d57600080fd5b505afa158015611b31573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b559190612d7b565b611b5f919061306b565b611b69919061306b565b905090565b600e54600a546040516370a0823160e01b81523060048201526001600160a01b03909116906370a08231906024015b60206040518083038186803b158015611bb557600080fd5b505afa158015611bc9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b5f9190612d7b565b6000546001600160a01b03163314611c175760405162461bcd60e51b815260040161095e90612ebb565b6005544210611c5b5760405162461bcd60e51b815260206004820152601060248201526f141bdbdb081a185cc81cdd185c9d195960821b604482015260640161095e565b808210611cc15760405162461bcd60e51b815260206004820152602e60248201527f4e6577207374617274426c6f636b206d757374206265206c6f7765722074686160448201526d6e206e657720656e64426c6f636b60901b606482015260840161095e565b814210611d295760405162461bcd60e51b815260206004820152603060248201527f4e6577207374617274426c6f636b206d7573742062652068696768657220746860448201526f616e2063757272656e7420626c6f636b60801b606482015260840161095e565b60058290556004819055600682905560408051838152602081018390527f7cd0ab87d19036f3dfadadb232c78aa4879dda3f0c994a9d637532410ee2ce069101611553565b6000546001600160a01b03163314611d985760405162461bcd60e51b815260040161095e90612ebb565b6001600160a01b0381166000908152600c6020526040902054819060ff16611df25760405162461bcd60e51b815260206004820152600d60248201526c1b9bdd081059191959081e595d609a1b604482015260640161095e565b60005b600b54811015611f8857816001600160a01b0316600b8281548110611e1c57611e1c6130f9565b6000918252602090912001546001600160a01b03161415611f7657600b8054611e479060019061306b565b81548110611e5757611e576130f9565b600091825260209091200154600b80546001600160a01b039092169183908110611e8357611e836130f9565b600091825260209091200180546001600160a01b0319166001600160a01b0392909216919091179055600d8054611ebc9060019061306b565b81548110611ecc57611ecc6130f9565b9060005260206000200154600d8281548110611eea57611eea6130f9565b600091825260209091200155600b805480611f0757611f076130e3565b600082815260209020810160001990810180546001600160a01b0319169055019055600d805480611f3a57611f3a6130e3565b6000828152602080822083016000199081018390559092019092556001600160a01b0384168252600c905260409020805460ff19169055505050565b80611f80816130b2565b915050611df5565b505050565b600954600a546000916001600160a01b0391821691161415611fdf57600e54600f546009546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401611b05565b600f546009546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401611b9d565b600260015414156120355760405162461bcd60e51b815260040161095e90612ef0565b6002600155336000818152601060205260408120918190612055906117f9565b8354612062908690612bcf565b11156120b05760405162461bcd60e51b815260206004820152601760248201527f5573657220616d6f756e742061626f7665206c696d6974000000000000000000604482015260640161095e565b6120b8612ae7565b82541561218f5760006120e88460010154610e58600854610e526003548960000154612b5290919063ffffffff16565b9050801561218d5760095460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb906121229033908590600401612e14565b602060405180830381600087803b15801561213c57600080fd5b505af1158015612150573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121749190612c65565b5080600f6000828254612187919061306b565b90915550505b505b831561235157600a546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b1580156121d857600080fd5b505afa1580156121ec573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122109190612d7b565b600a546040516323b872dd60e01b8152336004820152306024820152604481018790529193506001600160a01b0316906323b872dd90606401602060405180830381600087803b15801561226357600080fd5b505af1158015612277573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061229b9190612c65565b50600a546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b1580156122df57600080fd5b505afa1580156122f3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123179190612d7b565b905061232e612326838361306b565b845490612bcf565b835561233a828261306b565b600e600082825461234b9190612f27565b90915550505b60085460035484546123689291610e529190612b52565b600184015560405184815233907fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c9060200160405180910390a25050600180555050565b6000546001600160a01b031633146123d65760405162461bcd60e51b815260040161095e90612ebb565b6123de612ae7565b60006123e8611f8d565b9050426004541161243b5760405162461bcd60e51b815260206004820181905260248201527f506f6f6c2068617320456e6465642c207573652073746172744e6577506f6f6c604482015260640161095e565b6000811161249f5760405162461bcd60e51b815260206004820152602b60248201527f6e6f204e65775265776172647320617661696c6176626c652c2073656e64207460448201526a1bdad95b9cc8119a5c9cdd60aa1b606482015260840161095e565b6000426004546124af919061306b565b905060006124bd8284612f3f565b905080600760008282546124d19190612f27565b9091555050600954600a546001600160a01b039081169116141561257f57600e546009546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b15801561253557600080fd5b505afa158015612549573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061256d9190612d7b565b612577919061306b565b600f556125fe565b6009546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b1580156125c257600080fd5b505afa1580156125d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125fa9190612d7b565b600f555b611f88612ae7565b6000546001600160a01b031633146126305760405162461bcd60e51b815260040161095e90612ebb565b6001600160a01b0382166000908152600c602052604090205460ff16156126895760405162461bcd60e51b815260206004820152600d60248201526c105b1c9958591e481059191959609a1b604482015260640161095e565b600b805460018181019092557f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db90180546001600160a01b039094166001600160a01b031990941684179055600d80548083019091557fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb501919091556000918252600c6020526040909120805460ff19169091179055565b600260015414156127435760405162461bcd60e51b815260040161095e90612ef0565b60026001553360009081526010602052604081208054600e80549293919283929061276f90849061306b565b909155505060008083556001830155801561280a57600a5460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb906127b69033908590600401612e14565b602060405180830381600087803b1580156127d057600080fd5b505af11580156127e4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128089190612c65565b505b815460405190815233907f5fafa99d0643513820be26656b45130b01e1c03062e1266bf36f88cbd3bd96959060200160405180910390a2505060018055565b600b818154811061285957600080fd5b6000918252602090912001546001600160a01b0316905081565b6000546001600160a01b0316331461289d5760405162461bcd60e51b815260040161095e90612ebb565b60005b600b54811015611f8857826001600160a01b0316600b82815481106128c7576128c76130f9565b6000918252602090912001546001600160a01b031614156129035781600d82815481106128f6576128f66130f9565b6000918252602090912001555b8061290d816130b2565b9150506128a0565b6000546001600160a01b0316331461293f5760405162461bcd60e51b815260040161095e90612ebb565b60405133904780156108fc02916000818181858888f1935050505015801561296b573d6000803e3d6000fd5b50565b6000546001600160a01b031633146129985760405162461bcd60e51b815260040161095e90612ebb565b6001600160a01b0381166129fd5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161095e565b61296b81612b7f565b6001600160a01b0381166000908152601060205260408120600e5460065442118015612a3157508015155b15612ab8576000612a4460065442612bdb565b90506000612a5d60075483612b5290919063ffffffff16565b90506000612a86612a7d85610e5260085486612b5290919063ffffffff16565b60035490612bcf565b9050612aad8560010154610e58600854610e52858a60000154612b5290919063ffffffff16565b979650505050505050565b612adf8260010154610e58600854610e526003548760000154612b5290919063ffffffff16565b949350505050565b6006544211612af257565b600e5480612b01575042600655565b6000612b0f60065442612bdb565b90506000612b2860075483612b5290919063ffffffff16565b9050612b46612a7d84610e5260085485612b5290919063ffffffff16565b60035550504260065550565b6000612b5e828461304c565b90505b92915050565b6000612b5e8284612f3f565b6000612b5e828461306b565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000612b5e8284612f27565b60006004548211612bf757612bf08284612b73565b9050612b61565b6004548310612c0857506000612b61565b600454612bf09084612b73565b600060208284031215612c2757600080fd5b8135612c3281613125565b9392505050565b60008060408385031215612c4c57600080fd5b8235612c5781613125565b946020939093013593505050565b600060208284031215612c7757600080fd5b81518015158114612c3257600080fd5b60008060408385031215612c9a57600080fd5b8235612ca581613125565b91506020830135612cb581613125565b809150509250929050565b600060208284031215612cd257600080fd5b815167ffffffffffffffff80821115612cea57600080fd5b818401915084601f830112612cfe57600080fd5b815181811115612d1057612d1061310f565b604051601f8201601f19908116603f01168101908382118183101715612d3857612d3861310f565b81604052828152876020848701011115612d5157600080fd5b612aad836020830160208801613082565b600060208284031215612d7457600080fd5b5035919050565b600060208284031215612d8d57600080fd5b5051919050565b60008060408385031215612da757600080fd5b50508035926020909101359150565b600060208284031215612dc857600080fd5b815160ff81168114612c3257600080fd5b600081518084526020808501945080840160005b83811015612e0957815187529582019590820190600101612ded565b509495945050505050565b6001600160a01b03929092168252602082015260400190565b6000604082016040835280855180835260608501915060608160051b8601019250602080880160005b83811015612e9c57878603605f1901855281518051808852612e7d81868a01878501613082565b601f01601f191696909601830195509382019390820190600101612e56565b505085840381870152505050612eb28185612dd9565b95945050505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b60008219821115612f3a57612f3a6130cd565b500190565b600082612f5c57634e487b7160e01b600052601260045260246000fd5b500490565b600181815b80851115612f9c578160001904821115612f8257612f826130cd565b80851615612f8f57918102915b93841c9390800290612f66565b509250929050565b6000612b5e8383600082612fba57506001612b61565b81612fc757506000612b61565b8160018114612fdd5760028114612fe757613003565b6001915050612b61565b60ff841115612ff857612ff86130cd565b50506001821b612b61565b5060208310610133831016604e8410600b8410161715613026575081810a612b61565b6130308383612f61565b8060001904821115613044576130446130cd565b029392505050565b6000816000190483118215151615613066576130666130cd565b500290565b60008282101561307d5761307d6130cd565b500390565b60005b8381101561309d578181015183820152602001613085565b838111156130ac576000848401525b50505050565b60006000198214156130c6576130c66130cd565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461296b57600080fdfea26469706673582212206d872f00316818f6f913511ca46484118e5da352f38c8363a6665f7d879690be64736f6c63430008070033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000030000000000000000000000005cd50d974ff5edfee9fe0623ebabd9b3c1ece88c000000000000000000000000adc47dd9017f3cdddf25658116285eb69c685be000000000000000000000000014881490d020d0bba94af6d902d026ed54a91793000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000052b7d2dcc80cd2e40000000000000000000000000000000000000000000000003e09de2596099e2b000000000000000000000000000000000000000000000000108b2a2c28029094000000
-----Decoded View---------------
Arg [0] : _NFTs (address[]): 0x5CD50D974FF5edfeE9fE0623ebABD9b3C1ecE88c,0xADC47Dd9017F3CDddf25658116285EB69C685be0,0x14881490D020D0BBA94aF6d902D026ED54a91793
Arg [1] : stakableAmounts (uint256[]): 100000000000000000000000000,75000000000000000000000000,20000000000000000000000000
-----Encoded View---------------
10 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [3] : 0000000000000000000000005cd50d974ff5edfee9fe0623ebabd9b3c1ece88c
Arg [4] : 000000000000000000000000adc47dd9017f3cdddf25658116285eb69c685be0
Arg [5] : 00000000000000000000000014881490d020d0bba94af6d902d026ed54a91793
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [7] : 00000000000000000000000000000000000000000052b7d2dcc80cd2e4000000
Arg [8] : 0000000000000000000000000000000000000000003e09de2596099e2b000000
Arg [9] : 000000000000000000000000000000000000000000108b2a2c28029094000000
Deployed Bytecode Sourcemap
17729:18053:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34651:368;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;29407:243;;;;;;;;;;-1:-1:-1;29407:243:0;;;;;:::i;:::-;;:::i;:::-;;21860:1406;;;;;;;;;;-1:-1:-1;21860:1406:0;;;;;:::i;:::-;;:::i;19027:44::-;;;;;;;;;;-1:-1:-1;19027:44:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;14656:25:1;;;14712:2;14697:18;;14690:34;;;;14629:18;19027:44:0;14482:248:1;18185:28:0;;;;;;;;;;;;;;;;;;;14446:25:1;;;14434:2;14419:18;18185:28:0;14300:177:1;18766:29:0;;;;;;;;;;-1:-1:-1;18766:29:0;;;;;:::i;:::-;;:::i;35189:284::-;;;;;;;;;;;;;:::i;25710:824::-;;;;;;;;;;-1:-1:-1;25710:824:0;;;;;:::i;:::-;;:::i;18712:47::-;;;;;;;;;;-1:-1:-1;18712:47:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;6332:14:1;;6325:22;6307:41;;6295:2;6280:18;18712:47:0;6167:187:1;27241:189:0;;;;;;;;;;-1:-1:-1;27241:189:0;;;;;:::i;:::-;;:::i;21029:823::-;;;;;;;;;;;;;:::i;18031:25::-;;;;;;;;;;-1:-1:-1;18031:25:0;;;;-1:-1:-1;;;18031:25:0;;;;;;18916:43;;;;;;;;;;;;;;;;27820:619;;;;;;;;;;-1:-1:-1;27820:619:0;;;;;:::i;:::-;;:::i;35485:257::-;;;;;;;;;;;;;:::i;18272:25::-;;;;;;;;;;;;;;;;23274:611;;;;;;;;;;-1:-1:-1;23274:611:0;;;;;:::i;:::-;;:::i;2673:103::-;;;;;;;;;;;;;:::i;23893:315::-;;;;;;;;;;-1:-1:-1;23893:315:0;;;;;:::i;:::-;;:::i;28529:723::-;;;;;;;;;;;;;:::i;18832:26::-;;;;;;;;;;;;;;;;31462:347;;;;;;;;;;;;;:::i;18433:29::-;;;;;;;;;;;;;;;;2022:87;;;;;;;;;;-1:-1:-1;2068:7:0;2095:6;-1:-1:-1;;;;;2095:6:0;2022:87;;;-1:-1:-1;;;;;4281:32:1;;;4263:51;;4251:2;4236:18;2022:87:0;4117:203:1;18097:31:0;;;;;;;;;;;;;;;;17964:24;;;;;;;;;;-1:-1:-1;17964:24:0;;;;-1:-1:-1;;;17964:24:0;;;;;;29894:612;;;;;;;;;;-1:-1:-1;29894:612:0;;;;;:::i;:::-;;:::i;33697:668::-;;;;;;;;;;-1:-1:-1;33697:668:0;;;;;:::i;:::-;;:::i;18355:30::-;;;;;;;;;;;;;;;;31817:383;;;;;;;;;;;;;:::i;24366:1194::-;;;;;;;;;;-1:-1:-1;24366:1194:0;;;;;:::i;:::-;;:::i;17877:33::-;;;;;;;;;;-1:-1:-1;17877:33:0;;;;-1:-1:-1;;;;;17877:33:0;;;18624:25;;;;;;;;;;-1:-1:-1;18624:25:0;;;;-1:-1:-1;;;;;18624:25:0;;;18500:31;;;;;;;;;;;;;;;;20210:811;;;;;;;;;;;;;:::i;33387:303::-;;;;;;;;;;-1:-1:-1;33387:303:0;;;;;:::i;:::-;;:::i;26675:448::-;;;;;;;;;;;;;:::i;18682:23::-;;;;;;;;;;-1:-1:-1;18682:23:0;;;;;:::i;:::-;;:::i;34375:270::-;;;;;;;;;;-1:-1:-1;34375:270:0;;;;;:::i;:::-;;:::i;35061:116::-;;;;;;;;;;;;;:::i;2931:201::-;;;;;;;;;;-1:-1:-1;2931:201:0;;;;;:::i;:::-;;:::i;30679:775::-;;;;;;;;;;-1:-1:-1;30679:775:0;;;;;:::i;:::-;;:::i;18565:25::-;;;;;;;;;;-1:-1:-1;18565:25:0;;;;-1:-1:-1;;;;;18565:25:0;;;34651:368;34780:10;:17;34703:21;;;;34780:17;34815:21;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34807:29;;34870:7;34856:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34856:22:0;;34846:32;;34894:6;34890:122;34906:7;34904:1;:9;34890:122;;;34942:10;34953:1;34942:13;;;;;;;;:::i;:::-;;;;;;;;;;:20;;;-1:-1:-1;;;34942:20:0;;;;-1:-1:-1;;;;;34942:13:0;;;;:18;;:20;;;;;;;;;;:13;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;34942:20:0;;;;;;;;;;;;:::i;:::-;34931:5;34937:1;34931:8;;;;;;;;:::i;:::-;;;;;;:31;;;;34986:12;34999:1;34986:15;;;;;;;;:::i;:::-;;;;;;;;;34973:7;34981:1;34973:10;;;;;;;;:::i;:::-;;;;;;;;;;:28;34915:3;;;;:::i;:::-;;;;34890:122;;;;34752:267;34651:368;;:::o;29407:243::-;2068:7;2095:6;-1:-1:-1;;;;;2095:6:0;826:10;2242:23;2234:68;;;;-1:-1:-1;;;2234:68:0;;;;;;;:::i;:::-;;;;;;;;;29518:10:::1;;29500:15;:28;29492:57;;;::::0;-1:-1:-1;;;29492:57:0;;7770:2:1;29492:57:0::1;::::0;::::1;7752:21:1::0;7809:2;7789:18;;;7782:30;-1:-1:-1;;;7828:18:1;;;7821:46;7884:18;;29492:57:0::1;7568:340:1::0;29492:57:0::1;29560:14;:32:::0;;;29608:34:::1;::::0;14446:25:1;;;29608:34:0::1;::::0;14434:2:1;14419:18;29608:34:0::1;;;;;;;29407:243:::0;:::o;21860:1406::-;2068:7;2095:6;-1:-1:-1;;;;;2095:6:0;826:10;2242:23;2234:68;;;;-1:-1:-1;;;2234:68:0;;;;;;;:::i;:::-;22022:15:::1;22006:13;;:31;21998:77;;;::::0;-1:-1:-1;;;21998:77:0;;8832:2:1;21998:77:0::1;::::0;::::1;8814:21:1::0;8871:2;8851:18;;;8844:30;8910:34;8890:18;;;8883:62;-1:-1:-1;;;8961:18:1;;;8954:31;9002:19;;21998:77:0::1;8630:397:1::0;21998:77:0::1;22097:13;:11;:13::i;:::-;22121:22;22146;:20;:22::i;:::-;22121:47;;22204:1;22187:14;:18;22179:62;;;::::0;-1:-1:-1;;;22179:62:0;;8472:2:1;22179:62:0::1;::::0;::::1;8454:21:1::0;8511:2;8491:18;;;8484:30;8550:33;8530:18;;;8523:61;8601:18;;22179:62:0::1;8270:355:1::0;22179:62:0::1;22297:21;::::0;22375:20:::1;:12:::0;22390:5:::1;22375:20;:::i;:::-;22359:36:::0;-1:-1:-1;22420:23:0::1;:15:::0;22438:5:::1;22420:23;:::i;:::-;22475:11;::::0;22460::::1;::::0;22406:37;;-1:-1:-1;;;;;;22460:11:0;;::::1;22475::::0;::::1;22460:26;22456:321;;;22585:11;::::0;22546::::1;::::0;:36:::1;::::0;-1:-1:-1;;;22546:36:0;;22576:4:::1;22546:36;::::0;::::1;4263:51:1::0;-1:-1:-1;;;;;22546:11:0;;::::1;::::0;:21:::1;::::0;4236:18:1;;22546:36:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:50;;;;:::i;:::-;22515:28;:81:::0;22456:321:::1;;;22729:11;::::0;:36:::1;::::0;-1:-1:-1;;;22729:36:0;;22759:4:::1;22729:36;::::0;::::1;4263:51:1::0;-1:-1:-1;;;;;22729:11:0;;::::1;::::0;:21:::1;::::0;4236:18:1;;22729:36:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22698:28;:67:::0;22456:321:::1;22864:31;22882:13:::0;22864:15:::1;:31;:::i;:::-;22850:10;:46:::0;;;22907:15:::1;:28:::0;;;23010:24:::1;::::0;23023:11;;23010:24:::1;:::i;:::-;22994:13;:40:::0;23140:28:::1;23157:11:::0;23140:14;:28:::1;:::i;:::-;23123:14;:45:::0;-1:-1:-1;;23238:13:0::1;:20:::0;;-1:-1:-1;;;;23238:20:0::1;-1:-1:-1::0;;;23238:20:0::1;::::0;;-1:-1:-1;;;21860:1406:0:o;18766:29::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18766:29:0;:::o;35189:284::-;2068:7;2095:6;-1:-1:-1;;;;;2095:6:0;826:10;2242:23;2234:68;;;;-1:-1:-1;;;2234:68:0;;;;;;;:::i;:::-;35255:13:::1;:11;:13::i;:::-;35279:19;35301:24;:22;:24::i;:::-;35279:46;;35358:1;35344:11;:15;35336:56;;;::::0;-1:-1:-1;;;35336:56:0;;8115:2:1;35336:56:0::1;::::0;::::1;8097:21:1::0;8154:2;8134:18;;;8127:30;8193;8173:18;;;8166:58;8241:18;;35336:56:0::1;7913:352:1::0;35336:56:0::1;35410:11;::::0;35403:62:::1;::::0;-1:-1:-1;;;35403:62:0;;-1:-1:-1;;;;;35410:11:0;;::::1;::::0;35403:28:::1;::::0;:62:::1;::::0;35440:10:::1;::::0;35453:11;;35403:62:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;35244:229;35189:284::o:0;25710:824::-;12105:1;12701:7;;:19;;12693:63;;;;-1:-1:-1;;;12693:63:0;;;;;;;:::i;:::-;12105:1;12834:7;:18;25811:10:::1;25778:21;25802:20:::0;;;:8:::1;:20;::::0;;;;25841:11;;:22;-1:-1:-1;25841:22:0::1;25833:62;;;::::0;-1:-1:-1;;;25833:62:0;;11998:2:1;25833:62:0::1;::::0;::::1;11980:21:1::0;12037:2;12017:18;;;12010:30;12076:29;12056:18;;;12049:57;12123:18;;25833:62:0::1;11796:351:1::0;25833:62:0::1;25908:13;:11;:13::i;:::-;25934:15;25952:76;26012:4;:15;;;25952:55;25990:16;;25952:33;25968:16;;25952:4;:11;;;:15;;:33;;;;:::i;:::-;:37:::0;::::1;:55::i;:::-;:59:::0;::::1;:76::i;:::-;25934:94:::0;-1:-1:-1;26045:11:0;;26041:184:::1;;26087:11:::0;;:24:::1;::::0;26103:7;26087:15:::1;:24::i;:::-;26073:38:::0;;26126:11:::1;::::0;:50:::1;::::0;-1:-1:-1;;;26126:50:0;;-1:-1:-1;;;;;26126:11:0;;::::1;::::0;:20:::1;::::0;:50:::1;::::0;26155:10:::1;::::0;26168:7;;26126:50:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;26206:7;26191:11;;:22;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;26041:184:0::1;26241:11:::0;;26237:149:::1;;26269:11;::::0;:50:::1;::::0;-1:-1:-1;;;26269:50:0;;-1:-1:-1;;;;;26269:11:0;;::::1;::::0;:20:::1;::::0;:50:::1;::::0;26298:10:::1;::::0;26311:7;;26269:50:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;26366:7;26334:28;;:39;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;26237:149:0::1;26454:16;::::0;26432::::1;::::0;26416:11;;:55:::1;::::0;26454:16;26416:33:::1;::::0;:11;:15:::1;:33::i;:55::-;26398:15;::::0;::::1;:73:::0;26497:29:::1;::::0;14446:25:1;;;26506:10:0::1;::::0;26497:29:::1;::::0;14434:2:1;14419:18;26497:29:0::1;;;;;;;-1:-1:-1::0;;12061:1:0;13013:22;;-1:-1:-1;25710:824:0:o;27241:189::-;2068:7;2095:6;-1:-1:-1;;;;;2095:6:0;826:10;2242:23;2234:68;;;;-1:-1:-1;;;2234:68:0;;;;;;;:::i;:::-;27321:11:::1;::::0;:50:::1;::::0;-1:-1:-1;;;27321:50:0;;-1:-1:-1;;;;;27321:11:0;;::::1;::::0;:20:::1;::::0;:50:::1;::::0;27350:10:::1;::::0;27363:7;;27321:50:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;27414:7;27382:28;;:39;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;;27241:189:0:o;21029:823::-;2068:7;2095:6;-1:-1:-1;;;;;2095:6:0;826:10;2242:23;2234:68;;;;-1:-1:-1;;;2234:68:0;;;;;;;:::i;:::-;21105:15:::1;21089:13;;:31;21081:76;;;::::0;-1:-1:-1;;;21081:76:0;;7002:2:1;21081:76:0::1;::::0;::::1;6984:21:1::0;;;7021:18;;;7014:30;7080:34;7060:18;;;7053:62;7132:18;;21081:76:0::1;6800:356:1::0;21081:76:0::1;21180:13;:11;:13::i;:::-;21204:22;21229;:20;:22::i;:::-;21204:47;;21287:1;21270:14;:18;21262:62;;;::::0;-1:-1:-1;;;21262:62:0;;8472:2:1;21262:62:0::1;::::0;::::1;8454:21:1::0;8511:2;8491:18;;;8484:30;8550:33;8530:18;;;8523:61;8601:18;;21262:62:0::1;8270:355:1::0;21262:62:0::1;21364:11;::::0;21349::::1;::::0;-1:-1:-1;;;;;21349:11:0;;::::1;21364::::0;::::1;21349:26;21345:308;;;21473:11;::::0;21434::::1;::::0;:36:::1;::::0;-1:-1:-1;;;21434:36:0;;21464:4:::1;21434:36;::::0;::::1;4263:51:1::0;-1:-1:-1;;;;;21434:11:0;;::::1;::::0;:21:::1;::::0;4236:18:1;;21434:36:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:50;;;;:::i;:::-;21403:28;:81:::0;21345:308:::1;;;21605:11;::::0;:36:::1;::::0;-1:-1:-1;;;21605:36:0;;21635:4:::1;21605:36;::::0;::::1;4263:51:1::0;-1:-1:-1;;;;;21605:11:0;;::::1;::::0;:21:::1;::::0;4236:18:1;;21605:36:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21574:28;:67:::0;21345:308:::1;21723:20;21763:14;;21746;:31;;;;:::i;:::-;21723:54;;21821:12;21804:13;;:30;;;;:::i;:::-;21788:13;:46:::0;-1:-1:-1;;21029:823:0:o;27820:619::-;2068:7;2095:6;-1:-1:-1;;;;;2095:6:0;826:10;2242:23;2234:68;;;;-1:-1:-1;;;2234:68:0;;;;;;;:::i;:::-;27945:13:::1;::::0;:23:::1;::::0;27961:7:::1;27945:23;:::i;:::-;27927:15;:41;27923:444;;;28018:11;::::0;-1:-1:-1;;;;;27993:37:0;;::::1;28018:11:::0;::::1;27993:37;;27985:86;;;::::0;-1:-1:-1;;;27985:86:0;;13386:2:1;27985:86:0::1;::::0;::::1;13368:21:1::0;13425:2;13405:18;;;13398:30;13464:34;13444:18;;;13437:62;-1:-1:-1;;;13515:18:1;;;13508:34;13559:19;;27985:86:0::1;13184:400:1::0;27985:86:0::1;28119:11;::::0;-1:-1:-1;;;;;28094:37:0;;::::1;28119:11:::0;::::1;28094:37;;28086:86;;;::::0;-1:-1:-1;;;28086:86:0;;11241:2:1;28086:86:0::1;::::0;::::1;11223:21:1::0;11280:2;11260:18;;;11253:30;11319:34;11299:18;;;11292:62;-1:-1:-1;;;11370:18:1;;;11363:34;11414:19;;28086:86:0::1;11039:400:1::0;28086:86:0::1;28189:65;::::0;-1:-1:-1;;;28189:65:0;;-1:-1:-1;;;;;28189:30:0;::::1;::::0;::::1;::::0;:65:::1;::::0;28228:10:::1;::::0;28241:12;;28189:65:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;27923:444;;;28290:65;::::0;-1:-1:-1;;;28290:65:0;;-1:-1:-1;;;;;28290:30:0;::::1;::::0;::::1;::::0;:65:::1;::::0;28329:10:::1;::::0;28342:12;;28290:65:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;27923:444;28384:47;28403:13;28418:12;28384:47;;;;;;;:::i;:::-;;;;;;;;27820:619:::0;;:::o;35485:257::-;2068:7;2095:6;-1:-1:-1;;;;;2095:6:0;826:10;2242:23;2234:68;;;;-1:-1:-1;;;2234:68:0;;;;;;;:::i;:::-;35544:22:::1;35569;:20;:22::i;:::-;35544:47;;35627:1;35610:14;:18;35602:64;;;::::0;-1:-1:-1;;;35602:64:0;;9234:2:1;35602:64:0::1;::::0;::::1;9216:21:1::0;9273:2;9253:18;;;9246:30;9312:34;9292:18;;;9285:62;-1:-1:-1;;;9363:18:1;;;9356:31;9404:19;;35602:64:0::1;9032:397:1::0;35602:64:0::1;35677:11;::::0;:57:::1;::::0;-1:-1:-1;;;35677:57:0;;-1:-1:-1;;;;;35677:11:0;;::::1;::::0;:20:::1;::::0;:57:::1;::::0;35706:10:::1;::::0;35719:14;;35677:57:::1;;;:::i;23274:611::-:0;2068:7;2095:6;-1:-1:-1;;;;;2095:6:0;826:10;2242:23;2234:68;;;;-1:-1:-1;;;2234:68:0;;;;;;;:::i;:::-;23401:13:::1;::::0;-1:-1:-1;;;23401:13:0;::::1;;;23400:14;23392:46;;;::::0;-1:-1:-1;;;23392:46:0;;13038:2:1;23392:46:0::1;::::0;::::1;13020:21:1::0;13077:2;13057:18;;;13050:30;-1:-1:-1;;;13096:18:1;;;13089:49;13155:18;;23392:46:0::1;12836:343:1::0;23392:46:0::1;23451:11;:26:::0;;-1:-1:-1;;;;;23451:26:0;;::::1;-1:-1:-1::0;;;;;;23451:26:0;;::::1;;::::0;;;23488:11:::1;:26:::0;;;;::::1;::::0;;;::::1;::::0;::::1;::::0;;23527:12:::1;:19:::0;;-1:-1:-1;;;;23527:19:0::1;-1:-1:-1::0;;;23527:19:0::1;::::0;;23599:22:::1;::::0;;-1:-1:-1;;;23599:22:0;;;;23451:11:::1;::::0;23488:26;23599:20:::1;::::0;:22:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;23488:26;23599:22;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;23591:31;;23561:61;;23663:2;23641:19;:24;23633:59;;;::::0;-1:-1:-1;;;23633:59:0;;14151:2:1;23633:59:0::1;::::0;::::1;14133:21:1::0;14190:2;14170:18;;;14163:30;-1:-1:-1;;;14209:18:1;;;14202:52;14271:18;;23633:59:0::1;13949:346:1::0;23633:59:0::1;23737:36;23745:2;23753:19:::0;23737:15:::1;:36::i;:::-;23732:42;::::0;:2:::1;:42;:::i;:::-;23705:16;:70:::0;-1:-1:-1;;23850:1:0::1;23819:28;:32:::0;;;23862:11:::1;:15:::0;-1:-1:-1;23274:611:0:o;2673:103::-;2068:7;2095:6;-1:-1:-1;;;;;2095:6:0;826:10;2242:23;2234:68;;;;-1:-1:-1;;;2234:68:0;;;;;;;:::i;:::-;2738:30:::1;2765:1;2738:18;:30::i;:::-;2673:103::o:0;23893:315::-;23954:13;24050:6;24046:155;24062:10;:17;24060:19;;24046:155;;;24101:11;24115:10;24126:1;24115:13;;;;;;;;:::i;:::-;;;;;;;;;;;:29;;-1:-1:-1;;;24115:29:0;;-1:-1:-1;;;;;4281:32:1;;;24115:29:0;;;4263:51:1;24115:13:0;;;;:23;;4236:18:1;;24115:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24101:43;;24174:12;24187:1;24174:15;;;;;;;;:::i;:::-;;;;;;;;;24168:3;:21;;;;:::i;:::-;24159:30;;;;:::i;:::-;;;24086:115;24081:3;;;;;:::i;:::-;;;;24046:155;;;;23893:315;;;:::o;28529:723::-;2068:7;2095:6;-1:-1:-1;;;;;2095:6:0;826:10;2242:23;2234:68;;;;-1:-1:-1;;;2234:68:0;;;;;;;:::i;:::-;28581:13:::1;:11;:13::i;:::-;28605:22;28630;:20;:22::i;:::-;28605:47;;28663:16;28698:15;28682:13;;:31;;;;:::i;:::-;28663:50;;28724:19;28763:8;28746:14;;:25;;;;:::i;:::-;28803:11;::::0;28788::::1;::::0;28724:47;;-1:-1:-1;;;;;;28788:11:0;;::::1;28803::::0;::::1;28788:26;28784:308;;;28912:11;::::0;28873::::1;::::0;:36:::1;::::0;-1:-1:-1;;;28873:36:0;;28903:4:::1;28873:36;::::0;::::1;4263:51:1::0;-1:-1:-1;;;;;28873:11:0;;::::1;::::0;:21:::1;::::0;4236:18:1;;28873:36:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:50;;;;:::i;:::-;28842:28;:81:::0;28784:308:::1;;;29044:11;::::0;:36:::1;::::0;-1:-1:-1;;;29044:36:0;;29074:4:::1;29044:36;::::0;::::1;4263:51:1::0;-1:-1:-1;;;;;29044:11:0;;::::1;::::0;:21:::1;::::0;4236:18:1;;29044:36:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29013:28;:67:::0;28784:308:::1;29134:11;29102:28;;:43;;;;;;;:::i;:::-;;;;;;;;29188:14;29156:28;;:46;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;29229:15:0::1;29213:13;:31:::0;-1:-1:-1;;;28529:723:0:o;31462:347::-;31566:11;;31551;;31516:19;;-1:-1:-1;;;;;31551:11:0;;;31566;;31551:26;31547:255;;;31679:11;;31648:28;;31609:11;;:36;;-1:-1:-1;;;31609:36:0;;31639:4;31609:36;;;4263:51:1;-1:-1:-1;;;;;31609:11:0;;;;:21;;4236:18:1;;31609:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:67;;;;:::i;:::-;:81;;;;:::i;:::-;31594:97;;31462:347;:::o;31547:255::-;31778:11;;31739;;:36;;-1:-1:-1;;;31739:36:0;;31769:4;31739:36;;;4263:51:1;-1:-1:-1;;;;;31739:11:0;;;;:21;;4236:18:1;;31739:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;29894:612::-;2068:7;2095:6;-1:-1:-1;;;;;2095:6:0;826:10;2242:23;2234:68;;;;-1:-1:-1;;;2234:68:0;;;;;;;:::i;:::-;30028:10:::1;;30010:15;:28;30002:57;;;::::0;-1:-1:-1;;;30002:57:0;;7770:2:1;30002:57:0::1;::::0;::::1;7752:21:1::0;7809:2;7789:18;;;7782:30;-1:-1:-1;;;7828:18:1;;;7821:46;7884:18;;30002:57:0::1;7568:340:1::0;30002:57:0::1;30092:14;30078:11;:28;30070:87;;;::::0;-1:-1:-1;;;30070:87:0;;9636:2:1;30070:87:0::1;::::0;::::1;9618:21:1::0;9675:2;9655:18;;;9648:30;9714:34;9694:18;;;9687:62;-1:-1:-1;;;9765:18:1;;;9758:44;9819:19;;30070:87:0::1;9434:410:1::0;30070:87:0::1;30194:11;30176:15;:29;30168:90;;;::::0;-1:-1:-1;;;30168:90:0;;10463:2:1;30168:90:0::1;::::0;::::1;10445:21:1::0;10502:2;10482:18;;;10475:30;10541:34;10521:18;;;10514:62;-1:-1:-1;;;10592:18:1;;;10585:46;10648:19;;30168:90:0::1;10261:412:1::0;30168:90:0::1;30271:10;:24:::0;;;30306:13:::1;:30:::0;;;30403:15:::1;:28:::0;;;30449:49:::1;::::0;;14656:25:1;;;14712:2;14697:18;;14690:34;;;30449:49:0::1;::::0;14629:18:1;30449:49:0::1;14482:248:1::0;33697:668:0;2068:7;2095:6;-1:-1:-1;;;;;2095:6:0;826:10;2242:23;2234:68;;;;-1:-1:-1;;;2234:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;33840:34:0;::::1;33772:25;33840:34:::0;;;:15:::1;:34;::::0;;;;;33808:14;;33840:34:::1;;33832:60;;;::::0;-1:-1:-1;;;33832:60:0;;12696:2:1;33832:60:0::1;::::0;::::1;12678:21:1::0;12735:2;12715:18;;;12708:30;-1:-1:-1;;;12754:18:1;;;12747:43;12807:18;;33832:60:0::1;12494:337:1::0;33832:60:0::1;33906:6;33901:461;33922:10;:17:::0;33918:21;::::1;33901:461;;;33987:17;-1:-1:-1::0;;;;;33961:43:0::1;33969:10;33980:1;33969:13;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;33969:13:0::1;33961:43;33957:398;;;34037:10;34048:17:::0;;:21:::1;::::0;34068:1:::1;::::0;34048:21:::1;:::i;:::-;34037:33;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;34021:10:::1;:13:::0;;-1:-1:-1;;;;;34037:33:0;;::::1;::::0;34032:1;;34021:13;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;:49:::0;;-1:-1:-1;;;;;;34021:49:0::1;-1:-1:-1::0;;;;;34021:49:0;;;::::1;::::0;;;::::1;::::0;;34103:12:::1;34116:19:::0;;:22:::1;::::0;-1:-1:-1;;34116:22:0::1;:::i;:::-;34103:36;;;;;;;;:::i;:::-;;;;;;;;;34085:12;34098:1;34085:15;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;:54:::0;34154:10:::1;:16:::0;;;::::1;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;-1:-1:-1;;34154:16:0;;;;;-1:-1:-1;;;;;;34154:16:0::1;::::0;;;;;34185:12:::1;:18:::0;;;::::1;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;-1:-1:-1;;34185:18:0;;;;;;;;;;;;-1:-1:-1;;;;;34218:34:0;::::1;::::0;;:15:::1;:34:::0;;;;;:42;;-1:-1:-1;;34218:42:0::1;::::0;;33901:461:::1;33765:600;33697:668:::0;:::o;33957:398::-:1;33941:3:::0;::::1;::::0;::::1;:::i;:::-;;;;33901:461;;;;33765:600;33697:668:::0;:::o;31817:383::-;31922:11;;31907;;31869:22;;-1:-1:-1;;;;;31907:11:0;;;31922;;31907:26;31903:290;;;32038:11;;32007:28;;31968:11;;:36;;-1:-1:-1;;;31968:36:0;;31998:4;31968:36;;;4263:51:1;-1:-1:-1;;;;;31968:11:0;;;;:21;;4236:18:1;;31968:36:0;4117:203:1;31903:290:0;32152:28;;32113:11;;:36;;-1:-1:-1;;;32113:36:0;;32143:4;32113:36;;;4263:51:1;-1:-1:-1;;;;;32113:11:0;;;;:21;;4236:18:1;;32113:36:0;4117:203:1;24366:1194:0;12105:1;12701:7;;:19;;12693:63;;;;-1:-1:-1;;;12693:63:0;;;;;;;:::i;:::-;12105:1;12834:7;:18;24466:10:::1;24433:21;24457:20:::0;;;:8:::1;:20;::::0;;;;;24433:21;;24585:28:::1;::::0;:16:::1;:28::i;:::-;24569:11:::0;;24557:24:::1;::::0;:7;;:11:::1;:24::i;:::-;:56;;24549:92;;;::::0;-1:-1:-1;;;24549:92:0;;11646:2:1;24549:92:0::1;::::0;::::1;11628:21:1::0;11685:2;11665:18;;;11658:30;11724:25;11704:18;;;11697:53;11767:18;;24549:92:0::1;11444:347:1::0;24549:92:0::1;24662:13;:11;:13::i;:::-;24692:11:::0;;:15;24688:317:::1;;24724:15;24742:76;24802:4;:15;;;24742:55;24780:16;;24742:33;24758:16;;24742:4;:11;;;:15;;:33;;;;:::i;:76::-;24724:94:::0;-1:-1:-1;24837:11:0;;24833:161:::1;;24869:11;::::0;:50:::1;::::0;-1:-1:-1;;;24869:50:0;;-1:-1:-1;;;;;24869:11:0;;::::1;::::0;:20:::1;::::0;:50:::1;::::0;24898:10:::1;::::0;24911:7;;24869:50:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;24970:7;24938:28;;:39;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;24833:161:0::1;24709:296;24688:317;25021:11:::0;;25017:396:::1;;25062:11;::::0;:36:::1;::::0;-1:-1:-1;;;25062:36:0;;25092:4:::1;25062:36;::::0;::::1;4263:51:1::0;-1:-1:-1;;;;;25062:11:0;;::::1;::::0;:21:::1;::::0;4236:18:1;;25062:36:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25113:11;::::0;:69:::1;::::0;-1:-1:-1;;;25113:69:0;;25146:10:::1;25113:69;::::0;::::1;4565:34:1::0;25167:4:0::1;4615:18:1::0;;;4608:43;4667:18;;;4660:34;;;25049:49:0;;-1:-1:-1;;;;;;25113:11:0::1;::::0;:24:::1;::::0;4500:18:1;;25113:69:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;25211:11:0::1;::::0;:36:::1;::::0;-1:-1:-1;;;25211:36:0;;25241:4:::1;25211:36;::::0;::::1;4263:51:1::0;-1:-1:-1;;;;;25211:11:0;;::::1;::::0;:21:::1;::::0;4236:18:1;;25211:36:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25197:50:::0;-1:-1:-1;25290:41:0::1;25306:24;25320:10:::0;25197:50;25306:24:::1;:::i;:::-;25290:11:::0;;;:15:::1;:41::i;:::-;25276:55:::0;;25376:24:::1;25390:10:::0;25376:11;:24:::1;:::i;:::-;25360:11;;:41;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;25017:396:0::1;25481:16;::::0;25459::::1;::::0;25443:11;;:55:::1;::::0;25481:16;25443:33:::1;::::0;:11;:15:::1;:33::i;:55::-;25425:15;::::0;::::1;:73:::0;25524:28:::1;::::0;14446:25:1;;;25532:10:0::1;::::0;25524:28:::1;::::0;14434:2:1;14419:18;25524:28:0::1;;;;;;;-1:-1:-1::0;;12061:1:0;13013:22;;-1:-1:-1;;24366:1194:0:o;20210:811::-;2068:7;2095:6;-1:-1:-1;;;;;2095:6:0;826:10;2242:23;2234:68;;;;-1:-1:-1;;;2234:68:0;;;;;;;:::i;:::-;20263:13:::1;:11;:13::i;:::-;20287:22;20312;:20;:22::i;:::-;20287:47;;20369:15;20353:13;;:31;20345:76;;;::::0;-1:-1:-1;;;20345:76:0;;7002:2:1;20345:76:0::1;::::0;::::1;6984:21:1::0;;;7021:18;;;7014:30;7080:34;7060:18;;;7053:62;7132:18;;20345:76:0::1;6800:356:1::0;20345:76:0::1;20457:1;20440:14;:18;20432:74;;;::::0;-1:-1:-1;;;20432:74:0;;10051:2:1;20432:74:0::1;::::0;::::1;10033:21:1::0;10090:2;10070:18;;;10063:30;10129:34;10109:18;;;10102:62;-1:-1:-1;;;10180:18:1;;;10173:41;10231:19;;20432:74:0::1;9849:407:1::0;20432:74:0::1;20519:18;20556:15;20540:13;;:31;;;;:::i;:::-;20519:52:::0;-1:-1:-1;20582:16:0::1;20601:27;20519:52:::0;20601:14;:27:::1;:::i;:::-;20582:46;;20657:8;20639:14;;:26;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;20697:11:0::1;::::0;20682::::1;::::0;-1:-1:-1;;;;;20682:11:0;;::::1;20697::::0;::::1;20682:26;20678:308;;;20806:11;::::0;20767::::1;::::0;:36:::1;::::0;-1:-1:-1;;;20767:36:0;;20797:4:::1;20767:36;::::0;::::1;4263:51:1::0;-1:-1:-1;;;;;20767:11:0;;::::1;::::0;:21:::1;::::0;4236:18:1;;20767:36:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:50;;;;:::i;:::-;20736:28;:81:::0;20678:308:::1;;;20938:11;::::0;:36:::1;::::0;-1:-1:-1;;;20938:36:0;;20968:4:::1;20938:36;::::0;::::1;4263:51:1::0;-1:-1:-1;;;;;20938:11:0;;::::1;::::0;:21:::1;::::0;4236:18:1;;20938:36:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20907:28;:67:::0;20678:308:::1;20998:13;:11;:13::i;33387:303::-:0;2068:7;2095:6;-1:-1:-1;;;;;2095:6:0;826:10;2242:23;2234:68;;;;-1:-1:-1;;;2234:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;33488:40:0;::::1;;::::0;;;:15:::1;:40;::::0;;;;;::::1;;33487:41;33479:67;;;::::0;-1:-1:-1;;;33479:67:0;;12354:2:1;33479:67:0::1;::::0;::::1;12336:21:1::0;12393:2;12373:18;;;12366:30;-1:-1:-1;;;12412:18:1;;;12405:43;12465:18;;33479:67:0::1;12152:337:1::0;33479:67:0::1;33557:10;:31:::0;;::::1;::::0;;::::1;::::0;;;;::::1;::::0;;-1:-1:-1;;;;;33557:31:0;;::::1;-1:-1:-1::0;;;;;;33557:31:0;;::::1;::::0;::::1;::::0;;33599:12:::1;:25:::0;;;;::::1;::::0;;;;::::1;::::0;;;;-1:-1:-1;33635:40:0;;;:15:::1;33557:31;33635:40:::0;;;;;:47;;-1:-1:-1;;33635:47:0::1;::::0;;::::1;::::0;;33387:303::o;26675:448::-;12105:1;12701:7;;:19;;12693:63;;;;-1:-1:-1;;;12693:63:0;;;;;;;:::i;:::-;12105:1;12834:7;:18;26770:10:::1;26737:21;26761:20:::0;;;:8:::1;:20;::::0;;;;26819:11;;26841::::1;:26:::0;;26761:20;;26819:11;;;;26737:21;26841:26:::1;::::0;26819:11;;26841:26:::1;:::i;:::-;::::0;;;-1:-1:-1;;26892:1:0::1;26878:15:::0;;;26904::::1;::::0;::::1;:19:::0;26940:20;;26936:112:::1;;26977:11;::::0;:59:::1;::::0;-1:-1:-1;;;26977:59:0;;-1:-1:-1;;;;;26977:11:0;;::::1;::::0;:20:::1;::::0;:59:::1;::::0;27006:10:::1;::::0;27019:16;;26977:59:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;26936:112;27103:11:::0;;27073:42:::1;::::0;14446:25:1;;;27091:10:0::1;::::0;27073:42:::1;::::0;14434:2:1;14419:18;27073:42:0::1;;;;;;;-1:-1:-1::0;;12061:1:0;13013:22;;26675:448::o;18682:23::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;18682:23:0;;-1:-1:-1;18682:23:0;:::o;34375:270::-;2068:7;2095:6;-1:-1:-1;;;;;2095:6:0;826:10;2242:23;2234:68;;;;-1:-1:-1;;;2234:68:0;;;;;;;:::i;:::-;34480:6:::1;34476:162;34492:10;:17:::0;34490:19;::::1;34476:162;;;34551:11;-1:-1:-1::0;;;;;34534:28:0::1;:10;34545:1;34534:13;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;34534:13:0::1;:28;34531:96;;;34601:10;34583:12;34596:1;34583:15;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;:28:::0;34531:96:::1;34511:3:::0;::::1;::::0;::::1;:::i;:::-;;;;34476:162;;35061:116:::0;2068:7;2095:6;-1:-1:-1;;;;;2095:6:0;826:10;2242:23;2234:68;;;;-1:-1:-1;;;2234:68:0;;;;;;;:::i;:::-;35118:51:::1;::::0;35126:10:::1;::::0;35147:21:::1;35118:51:::0;::::1;;;::::0;::::1;::::0;;;35147:21;35126:10;35118:51;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;35061:116::o:0;2931:201::-;2068:7;2095:6;-1:-1:-1;;;;;2095:6:0;826:10;2242:23;2234:68;;;;-1:-1:-1;;;2234:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;3020:22:0;::::1;3012:73;;;::::0;-1:-1:-1;;;3012:73:0;;7363:2:1;3012:73:0::1;::::0;::::1;7345:21:1::0;7402:2;7382:18;;;7375:30;7441:34;7421:18;;;7414:62;-1:-1:-1;;;7492:18:1;;;7485:36;7538:19;;3012:73:0::1;7161:402:1::0;3012:73:0::1;3096:28;3115:8;3096:18;:28::i;30679:775::-:0;-1:-1:-1;;;;;30784:15:0;;30740:7;30784:15;;;:8;:15;;;;;30838:11;;30882:15;;30864;:33;:59;;;;-1:-1:-1;30901:22:0;;;30864:59;30860:587;;;30940:18;30961:48;30976:15;;30993;30961:14;:48::i;:::-;30940:69;;31024:18;31045:30;31060:14;;31045:10;:14;;:30;;;;:::i;:::-;31024:51;;31090:29;31139:77;31160:55;31197:17;31160:32;31175:16;;31160:10;:14;;:32;;;;:::i;:55::-;31139:16;;;:20;:77::i;:::-;31090:126;;31238:81;31303:4;:15;;;31238:60;31281:16;;31238:38;31254:21;31238:4;:11;;;:15;;:38;;;;:::i;:81::-;31231:88;30679:775;-1:-1:-1;;;;;;;30679:775:0:o;30860:587::-;31359:76;31419:4;:15;;;31359:55;31397:16;;31359:33;31375:16;;31359:4;:11;;;:15;;:33;;;;:::i;:76::-;31352:83;30679:775;-1:-1:-1;;;;30679:775:0:o;32301:595::-;32367:15;;32348;:34;32344:73;;32301:595::o;32344:73::-;32457:11;;32489:22;32485:109;;-1:-1:-1;32546:15:0;32528;:33;32301:595::o;32485:109::-;32606:18;32627:48;32642:15;;32659;32627:14;:48::i;:::-;32606:69;;32686:18;32707:30;32722:14;;32707:10;:14;;:30;;;;:::i;:::-;32686:51;;32767:77;32788:55;32825:17;32788:32;32803:16;;32788:10;:14;;:32;;;;:::i;32767:77::-;32748:16;:96;-1:-1:-1;;32873:15:0;32855;:33;-1:-1:-1;32301:595:0:o;6938:98::-;6996:7;7023:5;7027:1;7023;:5;:::i;:::-;7016:12;;6938:98;;;;;:::o;7337:::-;7395:7;7422:5;7426:1;7422;:5;:::i;6581:98::-;6639:7;6666:5;6670:1;6666;:5;:::i;3292:191::-;3366:16;3385:6;;-1:-1:-1;;;;;3402:17:0;;;-1:-1:-1;;;;;;3402:17:0;;;;;;3435:40;;3385:6;;;;;;;3435:40;;3366:16;3435:40;3355:128;3292:191;:::o;6200:98::-;6258:7;6285:5;6289:1;6285;:5;:::i;33070:309::-;33145:7;33176:13;;33169:3;:20;33165:207;;33213:14;:3;33221:5;33213:7;:14::i;:::-;33206:21;;;;33165:207;33258:13;;33249:5;:22;33245:127;;-1:-1:-1;33295:1:0;33288:8;;33245:127;33336:13;;:24;;33354:5;33336:17;:24::i;14:247:1:-;73:6;126:2;114:9;105:7;101:23;97:32;94:52;;;142:1;139;132:12;94:52;181:9;168:23;200:31;225:5;200:31;:::i;:::-;250:5;14:247;-1:-1:-1;;;14:247:1:o;266:315::-;334:6;342;395:2;383:9;374:7;370:23;366:32;363:52;;;411:1;408;401:12;363:52;450:9;437:23;469:31;494:5;469:31;:::i;:::-;519:5;571:2;556:18;;;;543:32;;-1:-1:-1;;;266:315:1:o;586:277::-;653:6;706:2;694:9;685:7;681:23;677:32;674:52;;;722:1;719;712:12;674:52;754:9;748:16;807:5;800:13;793:21;786:5;783:32;773:60;;829:1;826;819:12;868:416;964:6;972;1025:2;1013:9;1004:7;1000:23;996:32;993:52;;;1041:1;1038;1031:12;993:52;1080:9;1067:23;1099:31;1124:5;1099:31;:::i;:::-;1149:5;-1:-1:-1;1206:2:1;1191:18;;1178:32;1219:33;1178:32;1219:33;:::i;:::-;1271:7;1261:17;;;868:416;;;;;:::o;1883:884::-;1963:6;2016:2;2004:9;1995:7;1991:23;1987:32;1984:52;;;2032:1;2029;2022:12;1984:52;2065:9;2059:16;2094:18;2135:2;2127:6;2124:14;2121:34;;;2151:1;2148;2141:12;2121:34;2189:6;2178:9;2174:22;2164:32;;2234:7;2227:4;2223:2;2219:13;2215:27;2205:55;;2256:1;2253;2246:12;2205:55;2285:2;2279:9;2307:2;2303;2300:10;2297:36;;;2313:18;;:::i;:::-;2388:2;2382:9;2356:2;2442:13;;-1:-1:-1;;2438:22:1;;;2462:2;2434:31;2430:40;2418:53;;;2486:18;;;2506:22;;;2483:46;2480:72;;;2532:18;;:::i;:::-;2572:10;2568:2;2561:22;2607:2;2599:6;2592:18;2647:7;2642:2;2637;2633;2629:11;2625:20;2622:33;2619:53;;;2668:1;2665;2658:12;2619:53;2681:55;2733:2;2728;2720:6;2716:15;2711:2;2707;2703:11;2681:55;:::i;2772:180::-;2831:6;2884:2;2872:9;2863:7;2859:23;2855:32;2852:52;;;2900:1;2897;2890:12;2852:52;-1:-1:-1;2923:23:1;;2772:180;-1:-1:-1;2772:180:1:o;2957:184::-;3027:6;3080:2;3068:9;3059:7;3055:23;3051:32;3048:52;;;3096:1;3093;3086:12;3048:52;-1:-1:-1;3119:16:1;;2957:184;-1:-1:-1;2957:184:1:o;3146:248::-;3214:6;3222;3275:2;3263:9;3254:7;3250:23;3246:32;3243:52;;;3291:1;3288;3281:12;3243:52;-1:-1:-1;;3314:23:1;;;3384:2;3369:18;;;3356:32;;-1:-1:-1;3146:248:1:o;3399:273::-;3467:6;3520:2;3508:9;3499:7;3495:23;3491:32;3488:52;;;3536:1;3533;3526:12;3488:52;3568:9;3562:16;3618:4;3611:5;3607:16;3600:5;3597:27;3587:55;;3638:1;3635;3628:12;3677:435;3730:3;3768:5;3762:12;3795:6;3790:3;3783:19;3821:4;3850:2;3845:3;3841:12;3834:19;;3887:2;3880:5;3876:14;3908:1;3918:169;3932:6;3929:1;3926:13;3918:169;;;3993:13;;3981:26;;4027:12;;;;4062:15;;;;3954:1;3947:9;3918:169;;;-1:-1:-1;4103:3:1;;3677:435;-1:-1:-1;;;;;3677:435:1:o;4705:274::-;-1:-1:-1;;;;;4897:32:1;;;;4879:51;;4961:2;4946:18;;4939:34;4867:2;4852:18;;4705:274::o;4984:1178::-;5224:4;5272:2;5261:9;5257:18;5302:2;5291:9;5284:21;5325:6;5360;5354:13;5391:6;5383;5376:22;5429:2;5418:9;5414:18;5407:25;;5491:2;5481:6;5478:1;5474:14;5463:9;5459:30;5455:39;5441:53;;5513:4;5552:2;5544:6;5540:15;5573:1;5583:453;5597:6;5594:1;5591:13;5583:453;;;5662:22;;;-1:-1:-1;;5658:36:1;5646:49;;5718:13;;5760:9;;5782:24;;;5819:61;5760:9;5854:15;;;5841:11;;;5819:61;:::i;:::-;5946:2;5923:17;-1:-1:-1;;5919:31:1;5907:44;;;;5903:53;;;-1:-1:-1;6014:12:1;;;;5979:15;;;;5619:1;5612:9;5583:453;;;5587:3;;6084:9;6076:6;6072:22;6067:2;6056:9;6052:18;6045:50;;;;6112:44;6149:6;6141;6112:44;:::i;:::-;6104:52;4984:1178;-1:-1:-1;;;;;4984:1178:1:o;10678:356::-;10880:2;10862:21;;;10899:18;;;10892:30;10958:34;10953:2;10938:18;;10931:62;11025:2;11010:18;;10678:356::o;13589:355::-;13791:2;13773:21;;;13830:2;13810:18;;;13803:30;13869:33;13864:2;13849:18;;13842:61;13935:2;13920:18;;13589:355::o;14735:128::-;14775:3;14806:1;14802:6;14799:1;14796:13;14793:39;;;14812:18;;:::i;:::-;-1:-1:-1;14848:9:1;;14735:128::o;14868:217::-;14908:1;14934;14924:132;;14978:10;14973:3;14969:20;14966:1;14959:31;15013:4;15010:1;15003:15;15041:4;15038:1;15031:15;14924:132;-1:-1:-1;15070:9:1;;14868:217::o;15090:422::-;15179:1;15222:5;15179:1;15236:270;15257:7;15247:8;15244:21;15236:270;;;15316:4;15312:1;15308:6;15304:17;15298:4;15295:27;15292:53;;;15325:18;;:::i;:::-;15375:7;15365:8;15361:22;15358:55;;;15395:16;;;;15358:55;15474:22;;;;15434:15;;;;15236:270;;;15240:3;15090:422;;;;;:::o;15517:131::-;15577:5;15606:36;15633:8;15627:4;15702:5;15732:8;15722:80;;-1:-1:-1;15773:1:1;15787:5;;15722:80;15821:4;15811:76;;-1:-1:-1;15858:1:1;15872:5;;15811:76;15903:4;15921:1;15916:59;;;;15989:1;15984:130;;;;15896:218;;15916:59;15946:1;15937:10;;15960:5;;;15984:130;16021:3;16011:8;16008:17;16005:43;;;16028:18;;:::i;:::-;-1:-1:-1;;16084:1:1;16070:16;;16099:5;;15896:218;;16198:2;16188:8;16185:16;16179:3;16173:4;16170:13;16166:36;16160:2;16150:8;16147:16;16142:2;16136:4;16133:12;16129:35;16126:77;16123:159;;;-1:-1:-1;16235:19:1;;;16267:5;;16123:159;16314:34;16339:8;16333:4;16314:34;:::i;:::-;16384:6;16380:1;16376:6;16372:19;16363:7;16360:32;16357:58;;;16395:18;;:::i;:::-;16433:20;;15653:806;-1:-1:-1;;;15653:806:1:o;16464:168::-;16504:7;16570:1;16566;16562:6;16558:14;16555:1;16552:21;16547:1;16540:9;16533:17;16529:45;16526:71;;;16577:18;;:::i;:::-;-1:-1:-1;16617:9:1;;16464:168::o;16637:125::-;16677:4;16705:1;16702;16699:8;16696:34;;;16710:18;;:::i;:::-;-1:-1:-1;16747:9:1;;16637:125::o;16767:258::-;16839:1;16849:113;16863:6;16860:1;16857:13;16849:113;;;16939:11;;;16933:18;16920:11;;;16913:39;16885:2;16878:10;16849:113;;;16980:6;16977:1;16974:13;16971:48;;;17015:1;17006:6;17001:3;16997:16;16990:27;16971:48;;16767:258;;;:::o;17030:135::-;17069:3;-1:-1:-1;;17090:17:1;;17087:43;;;17110:18;;:::i;:::-;-1:-1:-1;17157:1:1;17146:13;;17030:135::o;17170:127::-;17231:10;17226:3;17222:20;17219:1;17212:31;17262:4;17259:1;17252:15;17286:4;17283:1;17276:15;17302:127;17363:10;17358:3;17354:20;17351:1;17344:31;17394:4;17391:1;17384:15;17418:4;17415:1;17408:15;17434:127;17495:10;17490:3;17486:20;17483:1;17476:31;17526:4;17523:1;17516:15;17550:4;17547:1;17540:15;17566:127;17627:10;17622:3;17618:20;17615:1;17608:31;17658:4;17655:1;17648:15;17682:4;17679:1;17672:15;17698:131;-1:-1:-1;;;;;17773:31:1;;17763:42;;17753:70;;17819:1;17816;17809:12
Swarm Source
ipfs://6d872f00316818f6f913511ca46484118e5da352f38c8363a6665f7d879690be
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | 100.00% | $0.000774 | 65,213,258.1428 | $50,460.06 |
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.