More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 487 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Deposit | 17913107 | 528 days ago | IN | 0 ETH | 0.00619053 | ||||
Withdraw | 17242770 | 622 days ago | IN | 0 ETH | 0.01220869 | ||||
Withdraw | 17160302 | 634 days ago | IN | 0 ETH | 0.0072307 | ||||
Withdraw | 17115590 | 640 days ago | IN | 0 ETH | 0.008257 | ||||
Withdraw | 17049996 | 649 days ago | IN | 0 ETH | 0.00493765 | ||||
Withdraw | 16867025 | 675 days ago | IN | 0 ETH | 0.00277058 | ||||
Withdraw | 16715593 | 697 days ago | IN | 0 ETH | 0.00607505 | ||||
Withdraw | 16587657 | 714 days ago | IN | 0 ETH | 0.00555162 | ||||
Withdraw | 16552229 | 719 days ago | IN | 0 ETH | 0.00571216 | ||||
Withdraw | 16481910 | 729 days ago | IN | 0 ETH | 0.00383792 | ||||
Withdraw | 16455505 | 733 days ago | IN | 0 ETH | 0.00223253 | ||||
Deposit | 16455489 | 733 days ago | IN | 0 ETH | 0.00274897 | ||||
Withdraw | 16438672 | 735 days ago | IN | 0 ETH | 0.00379 | ||||
Withdraw | 16400039 | 741 days ago | IN | 0 ETH | 0.00561741 | ||||
Withdraw | 16360636 | 746 days ago | IN | 0 ETH | 0.00331676 | ||||
Withdraw | 16302823 | 754 days ago | IN | 0 ETH | 0.00390306 | ||||
Withdraw | 16299166 | 755 days ago | IN | 0 ETH | 0.004973 | ||||
Withdraw | 16270073 | 759 days ago | IN | 0 ETH | 0.00283552 | ||||
Withdraw | 16228038 | 765 days ago | IN | 0 ETH | 0.00520225 | ||||
Withdraw | 16219170 | 766 days ago | IN | 0 ETH | 0.00337699 | ||||
Withdraw | 16212501 | 767 days ago | IN | 0 ETH | 0.00367326 | ||||
Withdraw | 16211229 | 767 days ago | IN | 0 ETH | 0.00282868 | ||||
Withdraw | 16210497 | 767 days ago | IN | 0 ETH | 0.00310714 | ||||
Withdraw | 16209765 | 767 days ago | IN | 0 ETH | 0.0030099 | ||||
Withdraw | 16209330 | 767 days ago | IN | 0 ETH | 0.00313212 |
Latest 1 internal transaction
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
15415978 | 881 days ago | Contract Creation | 0 ETH |
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
SmartChef
Compiler Version
v0.8.15+commit.e14f2714
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.4; import '@openzeppelin/contracts/access/Ownable.sol'; import '@openzeppelin/contracts/security/ReentrancyGuard.sol'; import '@openzeppelin/contracts/utils/math/SafeMath.sol'; import './interfaces/IPYESlice.sol'; import './interfaces/IERC20.sol'; import './libs/SafeERC20.sol'; contract SmartChef is Ownable, ReentrancyGuard { using SafeMath for uint256; using SafeERC20 for IERC20; // The address of the smart chef factory address public SMART_CHEF_FACTORY; // PyeSliceToken for stakers address public pyeSlice; IPYESlice PYESliceInterface; // 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 REWARD mining ends. uint256 public bonusEndBlock; // The block number when REWARD mining starts. uint256 public startBlock; // The block number of the last pool update uint256 public lastRewardBlock; // The pool limit (0 if none) uint256 public poolLimitPerUser; // Reward tokens created per block. uint256 public rewardPerBlock; // The time for lock funds. uint256 public lockTime; // The precision factor uint256 public PRECISION_FACTOR; // The reward token IERC20 public rewardToken; // The staked token IERC20 public stakedToken; // 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 uint256 depositTime; // The last time when the user deposit funds } 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 NewPoolLimit(uint256 poolLimitPerUser); event RewardsStop(uint256 blockNumber); event Withdraw(address indexed user, uint256 amount); event NewLockTime(uint256 lockTime); event setLockTime(address indexed user, uint256 lockTime); event StakedAndMinted(address indexed _address, uint256 _blockTimestamp); event UnstakedAndBurned(address indexed _address, uint256 _blockTimestamp); modifier notContract() { require(!_isContract(msg.sender), "Contract not allowed"); require(msg.sender == tx.origin, "Proxy contract not allowed"); _; } function _isContract(address _addr) internal view returns (bool) { uint256 size; assembly { size := extcodesize(_addr) } return size > 0; } constructor() { SMART_CHEF_FACTORY = msg.sender; } /* * @notice Initialize the contract * @param _stakedToken: staked token address * @param _rewardToken: reward token address * @param _rewardPerBlock: reward per block (in rewardToken) * @param _startBlock: start block * @param _bonusEndBlock: end block * @param _poolLimitPerUser: pool limit per user in stakedToken (if any, else 0) * @param _admin: admin address with ownership */ function initialize( IERC20 _stakedToken, IERC20 _rewardToken, uint256 _rewardPerBlock, uint256 _startBlock, uint256 _bonusEndBlock, uint256 _poolLimitPerUser, uint256 _lockTime, address _admin, address _pyeSlice ) external { require(!isInitialized, "Already initialized"); require(msg.sender == SMART_CHEF_FACTORY, "Not factory"); // Make this contract initialized isInitialized = true; stakedToken = _stakedToken; rewardToken = _rewardToken; rewardPerBlock = _rewardPerBlock; startBlock = _startBlock; bonusEndBlock = _bonusEndBlock; lockTime = _lockTime; pyeSlice = _pyeSlice; PYESliceInterface = IPYESlice(_pyeSlice); if (_poolLimitPerUser > 0) { hasUserLimit = true; poolLimitPerUser = _poolLimitPerUser; } uint256 decimalsRewardToken = uint256(rewardToken.decimals()); require(decimalsRewardToken < 30, "Must be inferior to 30"); PRECISION_FACTOR = uint256(10**(uint256(30).sub(decimalsRewardToken))); // Set the lastRewardBlock as the startBlock lastRewardBlock = startBlock; // Transfer ownership to the admin address who becomes owner of the contract transferOwnership(_admin); } /* * @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]; if (hasUserLimit) { require(_amount.add(user.amount) <= poolLimitPerUser, "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.safeTransfer(address(msg.sender), pending); } } if (_amount > 0) { // begin slice logic uint256 currentStakedBalance = user.amount; // current staked balance uint256 currentPYESliceBalance = IERC20(pyeSlice).balanceOf(msg.sender); if (currentStakedBalance == 0 && currentPYESliceBalance == 0) { stakedToken.safeTransferFrom(address(msg.sender), address(this), _amount); user.amount = user.amount.add(_amount); PYESliceInterface.mintPYESlice(msg.sender, 1); user.depositTime = block.timestamp; emit StakedAndMinted(msg.sender, block.timestamp); } else { user.amount = user.amount.add(_amount); stakedToken.safeTransferFrom(address(msg.sender), address(this), _amount); user.depositTime = block.timestamp; } } 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"); require(user.depositTime + lockTime < block.timestamp, "Can not withdraw in lock period"); _updatePool(); uint256 pending = user.amount.mul(accTokenPerShare).div(PRECISION_FACTOR).sub(user.rewardDebt); if (_amount > 0) { // begin slice logic uint256 currentStakedBalance = user.amount; // current staked balance uint256 currentPYESliceBalance = IERC20(pyeSlice).balanceOf(msg.sender); if (currentStakedBalance.sub(_amount) == 0 && currentPYESliceBalance > 0) { stakedToken.safeTransfer(address(msg.sender), _amount); PYESliceInterface.burnPYESlice(msg.sender, currentPYESliceBalance); user.amount = user.amount.sub(_amount); emit UnstakedAndBurned(msg.sender, block.timestamp); } else { user.amount = user.amount.sub(_amount); stakedToken.safeTransfer(address(msg.sender), _amount); } } if (pending > 0) { rewardToken.safeTransfer(address(msg.sender), 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; uint256 currentPYESliceBalance = IERC20(pyeSlice).balanceOf(msg.sender); user.amount = 0; user.rewardDebt = 0; if (amountToTransfer > 0) { stakedToken.safeTransfer(address(msg.sender), amountToTransfer); PYESliceInterface.burnPYESlice(msg.sender, currentPYESliceBalance); emit UnstakedAndBurned(msg.sender, block.timestamp); } 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.safeTransfer(address(msg.sender), _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. */ function recoverWrongTokens(address _tokenAddress, uint256 _tokenAmount) external onlyOwner { require(_tokenAddress != address(stakedToken), "Cannot be staked token"); require(_tokenAddress != address(rewardToken), "Cannot be reward token"); IERC20(_tokenAddress).safeTransfer(address(msg.sender), _tokenAmount); emit AdminTokenRecovery(_tokenAddress, _tokenAmount); } // Rescue eth that is sent here by mistake function rescueETH(uint256 amount, address to) external onlyOwner { payable(to).transfer(amount); } /* * @notice Stop rewards * @dev Only callable by owner */ function stopReward() external onlyOwner { bonusEndBlock = block.number; } /* * @notice Update pool limit per user * @dev Only callable by owner. * @param _hasUserLimit: whether the limit remains forced * @param _poolLimitPerUser: new pool limit per user */ function updatePoolLimitPerUser(bool _hasUserLimit, uint256 _poolLimitPerUser) external onlyOwner { require(hasUserLimit, "Must be set"); if (_hasUserLimit) { require(_poolLimitPerUser > poolLimitPerUser, "New limit must be higher"); poolLimitPerUser = _poolLimitPerUser; } else { hasUserLimit = _hasUserLimit; poolLimitPerUser = 0; } emit NewPoolLimit(poolLimitPerUser); } /* * @notice Update lock time * @dev Only callable by owner. * @param _lockTime: the time in seconds that staked tokens are locked */ function updateLockTime(uint256 _lockTime) external onlyOwner { lockTime = _lockTime; emit NewLockTime(_lockTime); } /* * @notice Update reward per block * @dev Only callable by owner. * @param _rewardPerBlock: the reward per block */ function updateRewardPerBlock(uint256 _rewardPerBlock) external onlyOwner { 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(_startBlock < _bonusEndBlock, "New startBlock must be lower than new endBlock"); require(block.number < _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 = stakedToken.balanceOf(address(this)); if (block.number > lastRewardBlock && stakedTokenSupply != 0) { uint256 multiplier = _getMultiplier(lastRewardBlock, block.number); uint256 appleReward = multiplier.mul(rewardPerBlock); uint256 adjustedTokenPerShare = accTokenPerShare.add(appleReward.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); } } /* * @notice Update reward variables of the given pool to be up-to-date. */ function _updatePool() internal { if (block.number <= lastRewardBlock) { return; } uint256 stakedTokenSupply = stakedToken.balanceOf(address(this)); if (stakedTokenSupply == 0) { lastRewardBlock = block.number; return; } uint256 multiplier = _getMultiplier(lastRewardBlock, block.number); uint256 appleReward = multiplier.mul(rewardPerBlock); accTokenPerShare = accTokenPerShare.add(appleReward.mul(PRECISION_FACTOR).div(stakedTokenSupply)); lastRewardBlock = block.number; } /* * @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); } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import '@openzeppelin/contracts/utils/math/SafeMath.sol'; import '@openzeppelin/contracts/utils/Address.sol'; import '../interfaces/IERC20.sol'; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using SafeMath for uint256; using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' // solhint-disable-next-line max-line-length require( (value == 0) || (token.allowance(address(this), spender) == 0), 'SafeERC20: approve from non-zero to non-zero allowance' ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender).add(value); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender).sub( value, 'SafeERC20: decreased allowance below zero' ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, 'SafeERC20: low-level call failed'); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), 'SafeERC20: ERC20 operation did not succeed'); } } }
// SPDX-License-Identifier: MIT pragma solidity >=0.5.0; interface IERC20 { event Approval(address indexed owner, address indexed spender, uint value); event Transfer(address indexed from, address indexed to, uint value); function name() external view returns (string memory); function symbol() external view returns (string memory); function decimals() external view returns (uint8); function totalSupply() external view returns (uint); function balanceOf(address owner) external view returns (uint); function allowance(address owner, address spender) external view returns (uint); function approve(address spender, uint value) external returns (bool); function transfer(address to, uint value) external returns (bool); function transferFrom(address from, address to, uint value) external returns (bool); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.4; interface IPYESlice { function burnPYESlice(address _staker, uint256 _amount) external; function mintPYESlice(address _depositor, uint256 amount) external; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/math/SafeMath.sol) pragma solidity ^0.8.0; // 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 substraction 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; } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (security/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 making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @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 * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (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; } }
{ "optimizer": { "enabled": true, "runs": 99999 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"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":"lockTime","type":"uint256"}],"name":"NewLockTime","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"poolLimitPerUser","type":"uint256"}],"name":"NewPoolLimit","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":"_address","type":"address"},{"indexed":false,"internalType":"uint256","name":"_blockTimestamp","type":"uint256"}],"name":"StakedAndMinted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_address","type":"address"},{"indexed":false,"internalType":"uint256","name":"_blockTimestamp","type":"uint256"}],"name":"UnstakedAndBurned","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"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"lockTime","type":"uint256"}],"name":"setLockTime","type":"event"},{"inputs":[],"name":"PRECISION_FACTOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":[],"name":"bonusEndBlock","outputs":[{"internalType":"uint256","name":"","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":[{"internalType":"contract IERC20","name":"_stakedToken","type":"address"},{"internalType":"contract IERC20","name":"_rewardToken","type":"address"},{"internalType":"uint256","name":"_rewardPerBlock","type":"uint256"},{"internalType":"uint256","name":"_startBlock","type":"uint256"},{"internalType":"uint256","name":"_bonusEndBlock","type":"uint256"},{"internalType":"uint256","name":"_poolLimitPerUser","type":"uint256"},{"internalType":"uint256","name":"_lockTime","type":"uint256"},{"internalType":"address","name":"_admin","type":"address"},{"internalType":"address","name":"_pyeSlice","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isInitialized","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":"lockTime","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":[],"name":"poolLimitPerUser","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pyeSlice","outputs":[{"internalType":"address","name":"","type":"address"}],"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":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"rescueETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardPerBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakedToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stopReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_lockTime","type":"uint256"}],"name":"updateLockTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_hasUserLimit","type":"bool"},{"internalType":"uint256","name":"_poolLimitPerUser","type":"uint256"}],"name":"updatePoolLimitPerUser","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"},{"internalType":"uint256","name":"depositTime","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b5061001a33610035565b60018055600280546001600160a01b03191633179055610085565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b612953806100946000396000f3fe608060405234801561001057600080fd5b50600436106101e55760003560e01c80638f6629151161010f578063cc7a262e116100a2578063f2fde38b11610071578063f2fde38b1461044e578063f40f0f5214610461578063f7c618c114610474578063fbfa4e111461049457600080fd5b8063cc7a262e146103fd578063ccd34cd51461041d578063db2e21bc14610426578063f01de2101461042e57600080fd5b8063a0b40905116100de578063a0b40905146103ae578063a9f8d181146103c1578063b6b55f25146103ca578063bd617191146103dd57600080fd5b80638f6629151461035a57806392e8990e146103635780639513997f14610388578063a0558c3f1461039b57600080fd5b80633f138d4b11610187578063715018a611610156578063715018a61461030257806380dc06721461030a5780638ae39cac146103125780638da5cb5b1461031b57600080fd5b80633f138d4b146102ca57806348cd4cb1146102dd5780635f34992a146102e657806366fe9f8a146102f957600080fd5b80631aed6553116101c35780631aed6553146102655780632e1a7d4d1461026e5780633279beab14610281578063392e53cd1461029457600080fd5b806301f8a976146101ea5780630d668087146101ff5780631959a0021461021b575b600080fd5b6101fd6101f8366004612498565b6104a7565b005b610208600b5481565b6040519081526020015b60405180910390f35b61024a6102293660046124d3565b600f6020526000908152604090208054600182015460029092015490919083565b60408051938452602084019290925290820152606001610212565b61020860065481565b6101fd61027c366004612498565b610569565b6101fd61028f366004612498565b610978565b6004546102ba907501000000000000000000000000000000000000000000900460ff1681565b6040519015158152602001610212565b6101fd6102d83660046124f0565b610a20565b61020860075481565b6101fd6102f436600461251c565b610c20565b61020860095481565b6101fd610f60565b6101fd610fed565b610208600a5481565b60005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610212565b61020860055481565b6004546102ba9074010000000000000000000000000000000000000000900460ff1681565b6101fd6103963660046125ab565b611074565b6101fd6103a93660046125cd565b611258565b6101fd6103bc36600461260b565b611321565b61020860085481565b6101fd6103d8366004612498565b61151d565b6002546103359073ffffffffffffffffffffffffffffffffffffffff1681565b600e546103359073ffffffffffffffffffffffffffffffffffffffff1681565b610208600c5481565b6101fd6118e2565b6003546103359073ffffffffffffffffffffffffffffffffffffffff1681565b6101fd61045c3660046124d3565b611b26565b61020861046f3660046124d3565b611c53565b600d546103359073ffffffffffffffffffffffffffffffffffffffff1681565b6101fd6104a2366004612498565b611dc4565b60005473ffffffffffffffffffffffffffffffffffffffff16331461052d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b600a8190556040518181527f0c4d677eef92893ac7ec52faf8140fc6c851ab4736302b4f3a89dfb20696a0df906020015b60405180910390a150565b6002600154036105d5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610524565b6002600155336000908152600f602052604090208054821115610654576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f416d6f756e7420746f20776974686472617720746f6f206869676800000000006044820152606401610524565b42600b5482600201546106679190612658565b106106ce576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f43616e206e6f7420776974686472617720696e206c6f636b20706572696f64006044820152606401610524565b6106d6611e7a565b600061070b8260010154610705600c546106ff6005548760000154611f7a90919063ffffffff16565b90611f8f565b90611f9b565b905082156108f35781546003546040517f70a0823100000000000000000000000000000000000000000000000000000000815233600482015260009173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015610784573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107a89190612670565b90506107b48286611f9b565b1580156107c15750600081115b156108be57600e546107ea9073ffffffffffffffffffffffffffffffffffffffff163387611fa7565b600480546040517f4e3a940800000000000000000000000000000000000000000000000000000000815233928101929092526024820183905273ffffffffffffffffffffffffffffffffffffffff1690634e3a940890604401600060405180830381600087803b15801561085d57600080fd5b505af1158015610871573d6000803e3d6000fd5b505085546108829250905086611f9b565b845560405142815233907f3202817a2ef05971b4761ffac357b4adf93f505dd192e037d23287d396f7baf79060200160405180910390a26108f0565b83546108ca9086611f9b565b8455600e546108f09073ffffffffffffffffffffffffffffffffffffffff163387611fa7565b50505b801561091d57600d5461091d9073ffffffffffffffffffffffffffffffffffffffff163383611fa7565b600c54600554835461093492916106ff9190611f7a565b600183015560405183815233907f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a9424364906020015b60405180910390a250506001805550565b60005473ffffffffffffffffffffffffffffffffffffffff1633146109f9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610524565b600d54610a1d9073ffffffffffffffffffffffffffffffffffffffff163383611fa7565b50565b60005473ffffffffffffffffffffffffffffffffffffffff163314610aa1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610524565b600e5473ffffffffffffffffffffffffffffffffffffffff90811690831603610b26576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f43616e6e6f74206265207374616b656420746f6b656e000000000000000000006044820152606401610524565b600d5473ffffffffffffffffffffffffffffffffffffffff90811690831603610bab576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f43616e6e6f742062652072657761726420746f6b656e000000000000000000006044820152606401610524565b610bcc73ffffffffffffffffffffffffffffffffffffffff83163383611fa7565b6040805173ffffffffffffffffffffffffffffffffffffffff84168152602081018390527f74545154aac348a3eac92596bd1971957ca94795f4e954ec5f613b55fab7812991015b60405180910390a15050565b6004547501000000000000000000000000000000000000000000900460ff1615610ca6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f416c726561647920696e697469616c697a6564000000000000000000000000006044820152606401610524565b60025473ffffffffffffffffffffffffffffffffffffffff163314610d27576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f4e6f7420666163746f72790000000000000000000000000000000000000000006044820152606401610524565b60048054600e805473ffffffffffffffffffffffffffffffffffffffff808e167fffffffffffffffffffffffff000000000000000000000000000000000000000092831617909255600d80548d8416908316179055600a8b905560078a90556006899055600b8790556003805492861692909116821790557fffffffffffffffffffff00ff00000000000000000000000000000000000000009091161775010000000000000000000000000000000000000000001790558315610e2957600480547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000017905560098490555b600d54604080517f313ce567000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff169163313ce5679160048083019260209291908290030181865afa158015610e99573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ebd9190612689565b60ff169050601e8110610f2c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d75737420626520696e666572696f7220746f203330000000000000000000006044820152606401610524565b610f37601e82611f9b565b610f4290600a6127cc565b600c55600754600855610f5483611b26565b50505050505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610fe1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610524565b610feb600061207b565b565b60005473ffffffffffffffffffffffffffffffffffffffff16331461106e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610524565b43600655565b60005473ffffffffffffffffffffffffffffffffffffffff1633146110f5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610524565b808210611184576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f4e6577207374617274426c6f636b206d757374206265206c6f7765722074686160448201527f6e206e657720656e64426c6f636b0000000000000000000000000000000000006064820152608401610524565b814310611213576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4e6577207374617274426c6f636b206d7573742062652068696768657220746860448201527f616e2063757272656e7420626c6f636b000000000000000000000000000000006064820152608401610524565b60078290556006819055600882905560408051838152602081018390527f7cd0ab87d19036f3dfadadb232c78aa4879dda3f0c994a9d637532410ee2ce069101610c14565b60005473ffffffffffffffffffffffffffffffffffffffff1633146112d9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610524565b60405173ffffffffffffffffffffffffffffffffffffffff82169083156108fc029084906000818181858888f1935050505015801561131c573d6000803e3d6000fd5b505050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146113a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610524565b60045474010000000000000000000000000000000000000000900460ff16611426576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f4d757374206265207365740000000000000000000000000000000000000000006044820152606401610524565b81156114a1576009548111611497576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f4e6577206c696d6974206d7573742062652068696768657200000000000000006044820152606401610524565b60098190556114ea565b600480547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000008415150217905560006009555b7f241f67ee5f41b7a5cabf911367329be7215900f602ebfc47f89dce2a6bcd847c600954604051610c1491815260200190565b600260015403611589576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610524565b6002600155336000908152600f6020526040902060045474010000000000000000000000000000000000000000900460ff16156116385760095481546115d09084906120f0565b1115611638576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f5573657220616d6f756e742061626f7665206c696d69740000000000000000006044820152606401610524565b611640611e7a565b80541561169e5760006116708260010154610705600c546106ff6005548760000154611f7a90919063ffffffff16565b9050801561169c57600d5461169c9073ffffffffffffffffffffffffffffffffffffffff163383611fa7565b505b81156118895780546003546040517f70a0823100000000000000000000000000000000000000000000000000000000815233600482015260009173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015611715573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117399190612670565b905081158015611747575080155b1561184c57600e546117719073ffffffffffffffffffffffffffffffffffffffff163330876120fc565b825461177d90856120f0565b8355600480546040517fd22bec8700000000000000000000000000000000000000000000000000000000815233928101929092526001602483015273ffffffffffffffffffffffffffffffffffffffff169063d22bec8790604401600060405180830381600087803b1580156117f257600080fd5b505af1158015611806573d6000803e3d6000fd5b505042600286018190556040519081523392507f8b6e1e627f0131449becb931da187f10323cbba18e1762209a5c42ea6760a175915060200160405180910390a2611886565b825461185890856120f0565b8355600e5461187f9073ffffffffffffffffffffffffffffffffffffffff163330876120fc565b4260028401555b50505b600c5460055482546118a092916106ff9190611f7a565b600182015560405182815233907fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c9060200160405180910390a2505060018055565b60026001540361194e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610524565b6002600155336000818152600f6020526040808220805460035492517f70a082310000000000000000000000000000000000000000000000000000000081526004810195909552909390929173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa1580156119d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119fb9190612670565b6000808555600185015590508115611af257600e54611a319073ffffffffffffffffffffffffffffffffffffffff163384611fa7565b600480546040517f4e3a940800000000000000000000000000000000000000000000000000000000815233928101929092526024820183905273ffffffffffffffffffffffffffffffffffffffff1690634e3a940890604401600060405180830381600087803b158015611aa457600080fd5b505af1158015611ab8573d6000803e3d6000fd5b50506040514281523392507f3202817a2ef05971b4761ffac357b4adf93f505dd192e037d23287d396f7baf7915060200160405180910390a25b825460405190815233907f5fafa99d0643513820be26656b45130b01e1c03062e1266bf36f88cbd3bd969590602001610967565b60005473ffffffffffffffffffffffffffffffffffffffff163314611ba7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610524565b73ffffffffffffffffffffffffffffffffffffffff8116611c4a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610524565b610a1d8161207b565b73ffffffffffffffffffffffffffffffffffffffff8181166000908152600f6020526040808220600e5491517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152929390928492909116906370a0823190602401602060405180830381865afa158015611cd8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cfc9190612670565b905060085443118015611d0e57508015155b15611d95576000611d2160085443612160565b90506000611d3a600a5483611f7a90919063ffffffff16565b90506000611d63611d5a856106ff600c5486611f7a90919063ffffffff16565b600554906120f0565b9050611d8a8560010154610705600c546106ff858a60000154611f7a90919063ffffffff16565b979650505050505050565b611dbc8260010154610705600c546106ff6005548760000154611f7a90919063ffffffff16565b949350505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611e45576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610524565b600b8190556040518181527f057ac4f41f09e298debf7d5d392e5792e4a23af7c9e36df13d934f17d7fa40199060200161055e565b6008544311611e8557565b600e546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015611ef4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f189190612670565b905080600003611f29575043600855565b6000611f3760085443612160565b90506000611f50600a5483611f7a90919063ffffffff16565b9050611f6e611d5a846106ff600c5485611f7a90919063ffffffff16565b60055550504360085550565b6000611f8682846127d8565b90505b92915050565b6000611f868284612815565b6000611f868284612850565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905261131c9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915261219a565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000611f868284612658565b60405173ffffffffffffffffffffffffffffffffffffffff8085166024830152831660448201526064810182905261215a9085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401611ff9565b50505050565b6000600654821161217c576121758284611f9b565b9050611f89565b600654831061218d57506000611f89565b6006546121759084611f9b565b60006121fc826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166122a69092919063ffffffff16565b80519091501561131c578080602001905181019061221a9190612867565b61131c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610524565b60606122b584846000856122bf565b90505b9392505050565b606082471015612351576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610524565b73ffffffffffffffffffffffffffffffffffffffff85163b6123cf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610524565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516123f891906128b0565b60006040518083038185875af1925050503d8060008114612435576040519150601f19603f3d011682016040523d82523d6000602084013e61243a565b606091505b5091509150611d8a828286606083156124545750816122b8565b8251156124645782518084602001fd5b816040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161052491906128cc565b6000602082840312156124aa57600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff81168114610a1d57600080fd5b6000602082840312156124e557600080fd5b81356122b8816124b1565b6000806040838503121561250357600080fd5b823561250e816124b1565b946020939093013593505050565b60008060008060008060008060006101208a8c03121561253b57600080fd5b8935612546816124b1565b985060208a0135612556816124b1565b975060408a0135965060608a0135955060808a0135945060a08a0135935060c08a0135925060e08a0135612589816124b1565b91506101008a013561259a816124b1565b809150509295985092959850929598565b600080604083850312156125be57600080fd5b50508035926020909101359150565b600080604083850312156125e057600080fd5b8235915060208301356125f2816124b1565b809150509250929050565b8015158114610a1d57600080fd5b6000806040838503121561261e57600080fd5b823561250e816125fd565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000821982111561266b5761266b612629565b500190565b60006020828403121561268257600080fd5b5051919050565b60006020828403121561269b57600080fd5b815160ff811681146122b857600080fd5b600181815b8085111561270557817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156126eb576126eb612629565b808516156126f857918102915b93841c93908002906126b1565b509250929050565b60008261271c57506001611f89565b8161272957506000611f89565b816001811461273f576002811461274957612765565b6001915050611f89565b60ff84111561275a5761275a612629565b50506001821b611f89565b5060208310610133831016604e8410600b8410161715612788575081810a611f89565b61279283836126ac565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156127c4576127c4612629565b029392505050565b6000611f86838361270d565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561281057612810612629565b500290565b60008261284b577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60008282101561286257612862612629565b500390565b60006020828403121561287957600080fd5b81516122b8816125fd565b60005b8381101561289f578181015183820152602001612887565b8381111561215a5750506000910152565b600082516128c2818460208701612884565b9190910192915050565b60208152600082518060208401526128eb816040850160208701612884565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fea26469706673582212203885f5b7d184f5a150a11e6d7fd4b88150e276f7ecbd89db9fc7909b3b42de0c64736f6c634300080f0033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101e55760003560e01c80638f6629151161010f578063cc7a262e116100a2578063f2fde38b11610071578063f2fde38b1461044e578063f40f0f5214610461578063f7c618c114610474578063fbfa4e111461049457600080fd5b8063cc7a262e146103fd578063ccd34cd51461041d578063db2e21bc14610426578063f01de2101461042e57600080fd5b8063a0b40905116100de578063a0b40905146103ae578063a9f8d181146103c1578063b6b55f25146103ca578063bd617191146103dd57600080fd5b80638f6629151461035a57806392e8990e146103635780639513997f14610388578063a0558c3f1461039b57600080fd5b80633f138d4b11610187578063715018a611610156578063715018a61461030257806380dc06721461030a5780638ae39cac146103125780638da5cb5b1461031b57600080fd5b80633f138d4b146102ca57806348cd4cb1146102dd5780635f34992a146102e657806366fe9f8a146102f957600080fd5b80631aed6553116101c35780631aed6553146102655780632e1a7d4d1461026e5780633279beab14610281578063392e53cd1461029457600080fd5b806301f8a976146101ea5780630d668087146101ff5780631959a0021461021b575b600080fd5b6101fd6101f8366004612498565b6104a7565b005b610208600b5481565b6040519081526020015b60405180910390f35b61024a6102293660046124d3565b600f6020526000908152604090208054600182015460029092015490919083565b60408051938452602084019290925290820152606001610212565b61020860065481565b6101fd61027c366004612498565b610569565b6101fd61028f366004612498565b610978565b6004546102ba907501000000000000000000000000000000000000000000900460ff1681565b6040519015158152602001610212565b6101fd6102d83660046124f0565b610a20565b61020860075481565b6101fd6102f436600461251c565b610c20565b61020860095481565b6101fd610f60565b6101fd610fed565b610208600a5481565b60005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610212565b61020860055481565b6004546102ba9074010000000000000000000000000000000000000000900460ff1681565b6101fd6103963660046125ab565b611074565b6101fd6103a93660046125cd565b611258565b6101fd6103bc36600461260b565b611321565b61020860085481565b6101fd6103d8366004612498565b61151d565b6002546103359073ffffffffffffffffffffffffffffffffffffffff1681565b600e546103359073ffffffffffffffffffffffffffffffffffffffff1681565b610208600c5481565b6101fd6118e2565b6003546103359073ffffffffffffffffffffffffffffffffffffffff1681565b6101fd61045c3660046124d3565b611b26565b61020861046f3660046124d3565b611c53565b600d546103359073ffffffffffffffffffffffffffffffffffffffff1681565b6101fd6104a2366004612498565b611dc4565b60005473ffffffffffffffffffffffffffffffffffffffff16331461052d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b600a8190556040518181527f0c4d677eef92893ac7ec52faf8140fc6c851ab4736302b4f3a89dfb20696a0df906020015b60405180910390a150565b6002600154036105d5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610524565b6002600155336000908152600f602052604090208054821115610654576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f416d6f756e7420746f20776974686472617720746f6f206869676800000000006044820152606401610524565b42600b5482600201546106679190612658565b106106ce576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f43616e206e6f7420776974686472617720696e206c6f636b20706572696f64006044820152606401610524565b6106d6611e7a565b600061070b8260010154610705600c546106ff6005548760000154611f7a90919063ffffffff16565b90611f8f565b90611f9b565b905082156108f35781546003546040517f70a0823100000000000000000000000000000000000000000000000000000000815233600482015260009173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015610784573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107a89190612670565b90506107b48286611f9b565b1580156107c15750600081115b156108be57600e546107ea9073ffffffffffffffffffffffffffffffffffffffff163387611fa7565b600480546040517f4e3a940800000000000000000000000000000000000000000000000000000000815233928101929092526024820183905273ffffffffffffffffffffffffffffffffffffffff1690634e3a940890604401600060405180830381600087803b15801561085d57600080fd5b505af1158015610871573d6000803e3d6000fd5b505085546108829250905086611f9b565b845560405142815233907f3202817a2ef05971b4761ffac357b4adf93f505dd192e037d23287d396f7baf79060200160405180910390a26108f0565b83546108ca9086611f9b565b8455600e546108f09073ffffffffffffffffffffffffffffffffffffffff163387611fa7565b50505b801561091d57600d5461091d9073ffffffffffffffffffffffffffffffffffffffff163383611fa7565b600c54600554835461093492916106ff9190611f7a565b600183015560405183815233907f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a9424364906020015b60405180910390a250506001805550565b60005473ffffffffffffffffffffffffffffffffffffffff1633146109f9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610524565b600d54610a1d9073ffffffffffffffffffffffffffffffffffffffff163383611fa7565b50565b60005473ffffffffffffffffffffffffffffffffffffffff163314610aa1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610524565b600e5473ffffffffffffffffffffffffffffffffffffffff90811690831603610b26576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f43616e6e6f74206265207374616b656420746f6b656e000000000000000000006044820152606401610524565b600d5473ffffffffffffffffffffffffffffffffffffffff90811690831603610bab576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f43616e6e6f742062652072657761726420746f6b656e000000000000000000006044820152606401610524565b610bcc73ffffffffffffffffffffffffffffffffffffffff83163383611fa7565b6040805173ffffffffffffffffffffffffffffffffffffffff84168152602081018390527f74545154aac348a3eac92596bd1971957ca94795f4e954ec5f613b55fab7812991015b60405180910390a15050565b6004547501000000000000000000000000000000000000000000900460ff1615610ca6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f416c726561647920696e697469616c697a6564000000000000000000000000006044820152606401610524565b60025473ffffffffffffffffffffffffffffffffffffffff163314610d27576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f4e6f7420666163746f72790000000000000000000000000000000000000000006044820152606401610524565b60048054600e805473ffffffffffffffffffffffffffffffffffffffff808e167fffffffffffffffffffffffff000000000000000000000000000000000000000092831617909255600d80548d8416908316179055600a8b905560078a90556006899055600b8790556003805492861692909116821790557fffffffffffffffffffff00ff00000000000000000000000000000000000000009091161775010000000000000000000000000000000000000000001790558315610e2957600480547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000017905560098490555b600d54604080517f313ce567000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff169163313ce5679160048083019260209291908290030181865afa158015610e99573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ebd9190612689565b60ff169050601e8110610f2c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d75737420626520696e666572696f7220746f203330000000000000000000006044820152606401610524565b610f37601e82611f9b565b610f4290600a6127cc565b600c55600754600855610f5483611b26565b50505050505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610fe1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610524565b610feb600061207b565b565b60005473ffffffffffffffffffffffffffffffffffffffff16331461106e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610524565b43600655565b60005473ffffffffffffffffffffffffffffffffffffffff1633146110f5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610524565b808210611184576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f4e6577207374617274426c6f636b206d757374206265206c6f7765722074686160448201527f6e206e657720656e64426c6f636b0000000000000000000000000000000000006064820152608401610524565b814310611213576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4e6577207374617274426c6f636b206d7573742062652068696768657220746860448201527f616e2063757272656e7420626c6f636b000000000000000000000000000000006064820152608401610524565b60078290556006819055600882905560408051838152602081018390527f7cd0ab87d19036f3dfadadb232c78aa4879dda3f0c994a9d637532410ee2ce069101610c14565b60005473ffffffffffffffffffffffffffffffffffffffff1633146112d9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610524565b60405173ffffffffffffffffffffffffffffffffffffffff82169083156108fc029084906000818181858888f1935050505015801561131c573d6000803e3d6000fd5b505050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146113a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610524565b60045474010000000000000000000000000000000000000000900460ff16611426576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f4d757374206265207365740000000000000000000000000000000000000000006044820152606401610524565b81156114a1576009548111611497576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f4e6577206c696d6974206d7573742062652068696768657200000000000000006044820152606401610524565b60098190556114ea565b600480547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000008415150217905560006009555b7f241f67ee5f41b7a5cabf911367329be7215900f602ebfc47f89dce2a6bcd847c600954604051610c1491815260200190565b600260015403611589576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610524565b6002600155336000908152600f6020526040902060045474010000000000000000000000000000000000000000900460ff16156116385760095481546115d09084906120f0565b1115611638576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f5573657220616d6f756e742061626f7665206c696d69740000000000000000006044820152606401610524565b611640611e7a565b80541561169e5760006116708260010154610705600c546106ff6005548760000154611f7a90919063ffffffff16565b9050801561169c57600d5461169c9073ffffffffffffffffffffffffffffffffffffffff163383611fa7565b505b81156118895780546003546040517f70a0823100000000000000000000000000000000000000000000000000000000815233600482015260009173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015611715573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117399190612670565b905081158015611747575080155b1561184c57600e546117719073ffffffffffffffffffffffffffffffffffffffff163330876120fc565b825461177d90856120f0565b8355600480546040517fd22bec8700000000000000000000000000000000000000000000000000000000815233928101929092526001602483015273ffffffffffffffffffffffffffffffffffffffff169063d22bec8790604401600060405180830381600087803b1580156117f257600080fd5b505af1158015611806573d6000803e3d6000fd5b505042600286018190556040519081523392507f8b6e1e627f0131449becb931da187f10323cbba18e1762209a5c42ea6760a175915060200160405180910390a2611886565b825461185890856120f0565b8355600e5461187f9073ffffffffffffffffffffffffffffffffffffffff163330876120fc565b4260028401555b50505b600c5460055482546118a092916106ff9190611f7a565b600182015560405182815233907fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c9060200160405180910390a2505060018055565b60026001540361194e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610524565b6002600155336000818152600f6020526040808220805460035492517f70a082310000000000000000000000000000000000000000000000000000000081526004810195909552909390929173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa1580156119d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119fb9190612670565b6000808555600185015590508115611af257600e54611a319073ffffffffffffffffffffffffffffffffffffffff163384611fa7565b600480546040517f4e3a940800000000000000000000000000000000000000000000000000000000815233928101929092526024820183905273ffffffffffffffffffffffffffffffffffffffff1690634e3a940890604401600060405180830381600087803b158015611aa457600080fd5b505af1158015611ab8573d6000803e3d6000fd5b50506040514281523392507f3202817a2ef05971b4761ffac357b4adf93f505dd192e037d23287d396f7baf7915060200160405180910390a25b825460405190815233907f5fafa99d0643513820be26656b45130b01e1c03062e1266bf36f88cbd3bd969590602001610967565b60005473ffffffffffffffffffffffffffffffffffffffff163314611ba7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610524565b73ffffffffffffffffffffffffffffffffffffffff8116611c4a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610524565b610a1d8161207b565b73ffffffffffffffffffffffffffffffffffffffff8181166000908152600f6020526040808220600e5491517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152929390928492909116906370a0823190602401602060405180830381865afa158015611cd8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cfc9190612670565b905060085443118015611d0e57508015155b15611d95576000611d2160085443612160565b90506000611d3a600a5483611f7a90919063ffffffff16565b90506000611d63611d5a856106ff600c5486611f7a90919063ffffffff16565b600554906120f0565b9050611d8a8560010154610705600c546106ff858a60000154611f7a90919063ffffffff16565b979650505050505050565b611dbc8260010154610705600c546106ff6005548760000154611f7a90919063ffffffff16565b949350505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611e45576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610524565b600b8190556040518181527f057ac4f41f09e298debf7d5d392e5792e4a23af7c9e36df13d934f17d7fa40199060200161055e565b6008544311611e8557565b600e546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015611ef4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f189190612670565b905080600003611f29575043600855565b6000611f3760085443612160565b90506000611f50600a5483611f7a90919063ffffffff16565b9050611f6e611d5a846106ff600c5485611f7a90919063ffffffff16565b60055550504360085550565b6000611f8682846127d8565b90505b92915050565b6000611f868284612815565b6000611f868284612850565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905261131c9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915261219a565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000611f868284612658565b60405173ffffffffffffffffffffffffffffffffffffffff8085166024830152831660448201526064810182905261215a9085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401611ff9565b50505050565b6000600654821161217c576121758284611f9b565b9050611f89565b600654831061218d57506000611f89565b6006546121759084611f9b565b60006121fc826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166122a69092919063ffffffff16565b80519091501561131c578080602001905181019061221a9190612867565b61131c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610524565b60606122b584846000856122bf565b90505b9392505050565b606082471015612351576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610524565b73ffffffffffffffffffffffffffffffffffffffff85163b6123cf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610524565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516123f891906128b0565b60006040518083038185875af1925050503d8060008114612435576040519150601f19603f3d011682016040523d82523d6000602084013e61243a565b606091505b5091509150611d8a828286606083156124545750816122b8565b8251156124645782518084602001fd5b816040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161052491906128cc565b6000602082840312156124aa57600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff81168114610a1d57600080fd5b6000602082840312156124e557600080fd5b81356122b8816124b1565b6000806040838503121561250357600080fd5b823561250e816124b1565b946020939093013593505050565b60008060008060008060008060006101208a8c03121561253b57600080fd5b8935612546816124b1565b985060208a0135612556816124b1565b975060408a0135965060608a0135955060808a0135945060a08a0135935060c08a0135925060e08a0135612589816124b1565b91506101008a013561259a816124b1565b809150509295985092959850929598565b600080604083850312156125be57600080fd5b50508035926020909101359150565b600080604083850312156125e057600080fd5b8235915060208301356125f2816124b1565b809150509250929050565b8015158114610a1d57600080fd5b6000806040838503121561261e57600080fd5b823561250e816125fd565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000821982111561266b5761266b612629565b500190565b60006020828403121561268257600080fd5b5051919050565b60006020828403121561269b57600080fd5b815160ff811681146122b857600080fd5b600181815b8085111561270557817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156126eb576126eb612629565b808516156126f857918102915b93841c93908002906126b1565b509250929050565b60008261271c57506001611f89565b8161272957506000611f89565b816001811461273f576002811461274957612765565b6001915050611f89565b60ff84111561275a5761275a612629565b50506001821b611f89565b5060208310610133831016604e8410600b8410161715612788575081810a611f89565b61279283836126ac565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156127c4576127c4612629565b029392505050565b6000611f86838361270d565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561281057612810612629565b500290565b60008261284b577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60008282101561286257612862612629565b500390565b60006020828403121561287957600080fd5b81516122b8816125fd565b60005b8381101561289f578181015183820152602001612887565b8381111561215a5750506000910152565b600082516128c2818460208701612884565b9190910192915050565b60208152600082518060208401526128eb816040850160208701612884565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fea26469706673582212203885f5b7d184f5a150a11e6d7fd4b88150e276f7ecbd89db9fc7909b3b42de0c64736f6c634300080f0033
Deployed Bytecode Sourcemap
336:13931:5:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11227:172;;;;;;:::i;:::-;;:::i;:::-;;1276:23;;;;;;;;;345:25:9;;;333:2;318:18;1276:23:5;;;;;;;;1542:44;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;994:25:9;;;1050:2;1035:18;;1028:34;;;;1078:18;;;1071:34;982:2;967:18;1542:44:5;792:319:9;893:28:5;;;;;;6639:1426;;;;;;:::i;:::-;;:::i;8934:140::-;;;;;;:::i;:::-;;:::i;743:25::-;;;;;;;;;;;;;;;1281:14:9;;1274:22;1256:41;;1244:2;1229:18;743:25:5;1116:187:9;9356:406:5;;;;;;:::i;:::-;;:::i;979:25::-;;;;;;3425:1368;;;;;;:::i;:::-;;:::i;1130:31::-;;;;;;1668:101:0;;;:::i;10010:86:5:-;;;:::i;1208:29::-;;;;;;1036:85:0;1082:7;1108:6;;;1036:85;;;2855:42:9;2843:55;;;2825:74;;2813:2;2798:18;1036:85:0;2679:226:9;806:31:5;;;;;;679:24;;;;;;;;;;;;11635:530;;;;;;:::i;:::-;;:::i;9815:111::-;;;;;;:::i;:::-;;:::i;10314:465::-;;;;;;:::i;:::-;;:::i;1059:30::-;;;;;;4945:1550;;;;;;:::i;:::-;;:::i;499:33::-;;;;;;;;;1452:25;;;;;;;;;1334:31;;;;;;8200:622;;;:::i;576:23::-;;;;;;;;;1918:198:0;;;;;;:::i;:::-;;:::i;12331:780:5:-;;;;;;:::i;:::-;;:::i;1396:25::-;;;;;;;;;10943:136;;;;;;:::i;:::-;;:::i;11227:172::-;1082:7:0;1108:6;1248:23;1108:6;719:10:3;1248:23:0;1240:68;;;;;;;4368:2:9;1240:68:0;;;4350:21:9;;;4387:18;;;4380:30;4446:34;4426:18;;;4419:62;4498:18;;1240:68:0;;;;;;;;;11311:14:5::1;:32:::0;;;11358:34:::1;::::0;345:25:9;;;11358:34:5::1;::::0;333:2:9;318:18;11358:34:5::1;;;;;;;;11227:172:::0;:::o;6639:1426::-;1744:1:1;2325:7;;:19;2317:63;;;;;;;4729:2:9;2317:63:1;;;4711:21:9;4768:2;4748:18;;;4741:30;4807:33;4787:18;;;4780:61;4858:18;;2317:63:1;4527:355:9;2317:63:1;1744:1;2455:7;:18;6739:10:5::1;6706:21;6730:20:::0;;;:8:::1;:20;::::0;;;;6768:11;;:22;-1:-1:-1;6768:22:5::1;6760:62;;;::::0;::::1;::::0;;5089:2:9;6760:62:5::1;::::0;::::1;5071:21:9::0;5128:2;5108:18;;;5101:30;5167:29;5147:18;;;5140:57;5214:18;;6760:62:5::1;4887:351:9::0;6760:62:5::1;6870:15;6859:8;;6840:4;:16;;;:27;;;;:::i;:::-;:45;6832:89;;;::::0;::::1;::::0;;5767:2:9;6832:89:5::1;::::0;::::1;5749:21:9::0;5806:2;5786:18;;;5779:30;5845:33;5825:18;;;5818:61;5896:18;;6832:89:5::1;5565:355:9::0;6832:89:5::1;6932:13;:11;:13::i;:::-;6956:15;6974:76;7034:4;:15;;;6974:55;7012:16;;6974:33;6990:16;;6974:4;:11;;;:15;;:33;;;;:::i;:::-;:37:::0;::::1;:55::i;:::-;:59:::0;::::1;:76::i;:::-;6956:94:::0;-1:-1:-1;7065:11:5;;7061:763:::1;;7157:11:::0;;7248:8:::1;::::0;7241:38:::1;::::0;;;;7268:10:::1;7241:38;::::0;::::1;2825:74:9::0;7126:28:5::1;::::0;7248:8:::1;;::::0;7241:26:::1;::::0;2798:18:9;;7241:38:5::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7208:71:::0;-1:-1:-1;7298:33:5::1;:20:::0;7323:7;7298:24:::1;:33::i;:::-;:38:::0;:68;::::1;;;;7365:1;7340:22;:26;7298:68;7294:520;;;7386:11;::::0;:54:::1;::::0;:11:::1;;7419:10;7432:7:::0;7386:24:::1;:54::i;:::-;7458:17;::::0;;:66:::1;::::0;;;;7489:10:::1;7458:66:::0;;::::1;6288:74:9::0;;;;6378:18;;;6371:34;;;7458:17:5::1;;::::0;:30:::1;::::0;6261:18:9;;7458:66:5::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;7556:11:5;;:24:::1;::::0;-1:-1:-1;7556:11:5;-1:-1:-1;7572:7:5;7556:15:::1;:24::i;:::-;7542:38:::0;;7603:46:::1;::::0;7633:15:::1;345:25:9::0;;7621:10:5::1;::::0;7603:46:::1;::::0;333:2:9;318:18;7603:46:5::1;;;;;;;7294:520;;;7703:11:::0;;:24:::1;::::0;7719:7;7703:15:::1;:24::i;:::-;7689:38:::0;;7745:11:::1;::::0;:54:::1;::::0;:11:::1;;7778:10;7791:7:::0;7745:24:::1;:54::i;:::-;7078:746;;7061:763;7838:11:::0;;7834:96:::1;;7865:11;::::0;:54:::1;::::0;:11:::1;;7898:10;7911:7:::0;7865:24:::1;:54::i;:::-;7996:16;::::0;7974::::1;::::0;7958:11;;:55:::1;::::0;7996:16;7958:33:::1;::::0;:11;:15:::1;:33::i;:55::-;7940:15;::::0;::::1;:73:::0;8029:29:::1;::::0;345:25:9;;;8038:10:5::1;::::0;8029:29:::1;::::0;333:2:9;318:18;8029:29:5::1;;;;;;;;-1:-1:-1::0;;1701:1:1;2628:22;;-1:-1:-1;6639:1426:5:o;8934:140::-;1082:7:0;1108:6;1248:23;1108:6;719:10:3;1248:23:0;1240:68;;;;;;;4368:2:9;1240:68:0;;;4350:21:9;;;4387:18;;;4380:30;4446:34;4426:18;;;4419:62;4498:18;;1240:68:0;4166:356:9;1240:68:0;9013:11:5::1;::::0;:54:::1;::::0;:11:::1;;9046:10;9059:7:::0;9013:24:::1;:54::i;:::-;8934:140:::0;:::o;9356:406::-;1082:7:0;1108:6;1248:23;1108:6;719:10:3;1248:23:0;1240:68;;;;;;;4368:2:9;1240:68:0;;;4350:21:9;;;4387:18;;;4380:30;4446:34;4426:18;;;4419:62;4498:18;;1240:68:0;4166:356:9;1240:68:0;9491:11:5::1;::::0;::::1;::::0;;::::1;9466:37:::0;;::::1;::::0;9458:72:::1;;;::::0;::::1;::::0;;6618:2:9;9458:72:5::1;::::0;::::1;6600:21:9::0;6657:2;6637:18;;;6630:30;6696:24;6676:18;;;6669:52;6738:18;;9458:72:5::1;6416:346:9::0;9458:72:5::1;9573:11;::::0;::::1;::::0;;::::1;9548:37:::0;;::::1;::::0;9540:72:::1;;;::::0;::::1;::::0;;6969:2:9;9540:72:5::1;::::0;::::1;6951:21:9::0;7008:2;6988:18;;;6981:30;7047:24;7027:18;;;7020:52;7089:18;;9540:72:5::1;6767:346:9::0;9540:72:5::1;9623:69;:34;::::0;::::1;9666:10;9679:12:::0;9623:34:::1;:69::i;:::-;9708:47;::::0;;6318:42:9;6306:55;;6288:74;;6393:2;6378:18;;6371:34;;;9708:47:5::1;::::0;6261:18:9;9708:47:5::1;;;;;;;;9356:406:::0;;:::o;3425:1368::-;3744:13;;;;;;;3743:14;3735:46;;;;;;;7320:2:9;3735:46:5;;;7302:21:9;7359:2;7339:18;;;7332:30;7398:21;7378:18;;;7371:49;7437:18;;3735:46:5;7118:343:9;3735:46:5;3813:18;;;;3799:10;:32;3791:56;;;;;;;7668:2:9;3791:56:5;;;7650:21:9;7707:2;7687:18;;;7680:30;7746:13;7726:18;;;7719:41;7777:18;;3791:56:5;7466:335:9;3791:56:5;3900:13;:20;;3931:11;:26;;;;;;;;;;;;;;3967:11;:26;;;;;;;;;;;4003:14;:32;;;4045:10;:24;;;-1:-1:-1;4079:30:5;;;4119:8;:20;;;-1:-1:-1;4149:20:5;;;;;;;;;;;;;4180:40;;;;;3900:20;4180:40;;;4235:21;;4231:121;;4272:12;:19;;;;;;;;4305:16;:36;;;4231:121;4400:11;;:22;;;;;;;;4362:27;;4400:11;;;:20;;:22;;;;;;;;;;;;;;:11;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4392:31;;4362:61;;4463:2;4441:19;:24;4433:59;;;;;;;8286:2:9;4433:59:5;;;8268:21:9;8325:2;8305:18;;;8298:30;8364:24;8344:18;;;8337:52;8406:18;;4433:59:5;8084:346:9;4433:59:5;4535:36;4543:2;4551:19;4535:15;:36::i;:::-;4530:42;;:2;:42;:::i;:::-;4503:16;:70;4655:10;;4637:15;:28;4761:25;4779:6;4761:17;:25::i;:::-;3725:1068;3425:1368;;;;;;;;;:::o;1668:101:0:-;1082:7;1108:6;1248:23;1108:6;719:10:3;1248:23:0;1240:68;;;;;;;4368:2:9;1240:68:0;;;4350:21:9;;;4387:18;;;4380:30;4446:34;4426:18;;;4419:62;4498:18;;1240:68:0;4166:356:9;1240:68:0;1732:30:::1;1759:1;1732:18;:30::i;:::-;1668:101::o:0;10010:86:5:-;1082:7:0;1108:6;1248:23;1108:6;719:10:3;1248:23:0;1240:68;;;;;;;4368:2:9;1240:68:0;;;4350:21:9;;;4387:18;;;4380:30;4446:34;4426:18;;;4419:62;4498:18;;1240:68:0;4166:356:9;1240:68:0;10077:12:5::1;10061:13;:28:::0;10010:86::o;11635:530::-;1082:7:0;1108:6;1248:23;1108:6;719:10:3;1248:23:0;1240:68;;;;;;;4368:2:9;1240:68:0;;;4350:21:9;;;4387:18;;;4380:30;4446:34;4426:18;;;4419:62;4498:18;;1240:68:0;4166:356:9;1240:68:0;11764:14:5::1;11750:11;:28;11742:87;;;::::0;::::1;::::0;;10131:2:9;11742:87:5::1;::::0;::::1;10113:21:9::0;10170:2;10150:18;;;10143:30;10209:34;10189:18;;;10182:62;10280:16;10260:18;;;10253:44;10314:19;;11742:87:5::1;9929:410:9::0;11742:87:5::1;11862:11;11847:12;:26;11839:87;;;::::0;::::1;::::0;;10546:2:9;11839:87:5::1;::::0;::::1;10528:21:9::0;10585:2;10565:18;;;10558:30;10624:34;10604:18;;;10597:62;10695:18;10675;;;10668:46;10731:19;;11839:87:5::1;10344:412:9::0;11839:87:5::1;11937:10;:24:::0;;;11971:13:::1;:30:::0;;;12065:15:::1;:28:::0;;;12109:49:::1;::::0;;10935:25:9;;;10991:2;10976:18;;10969:34;;;12109:49:5::1;::::0;10908:18:9;12109:49:5::1;10761:248:9::0;9815:111:5;1082:7:0;1108:6;1248:23;1108:6;719:10:3;1248:23:0;1240:68;;;;;;;4368:2:9;1240:68:0;;;4350:21:9;;;4387:18;;;4380:30;4446:34;4426:18;;;4419:62;4498:18;;1240:68:0;4166:356:9;1240:68:0;9891:28:5::1;::::0;:20:::1;::::0;::::1;::::0;:28;::::1;;;::::0;9912:6;;9891:28:::1;::::0;;;9912:6;9891:20;:28;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;9815:111:::0;;:::o;10314:465::-;1082:7:0;1108:6;1248:23;1108:6;719:10:3;1248:23:0;1240:68;;;;;;;4368:2:9;1240:68:0;;;4350:21:9;;;4387:18;;;4380:30;4446:34;4426:18;;;4419:62;4498:18;;1240:68:0;4166:356:9;1240:68:0;10430:12:5::1;::::0;;;::::1;;;10422:36;;;::::0;::::1;::::0;;11216:2:9;10422:36:5::1;::::0;::::1;11198:21:9::0;11255:2;11235:18;;;11228:30;11294:13;11274:18;;;11267:41;11325:18;;10422:36:5::1;11014:335:9::0;10422:36:5::1;10472:13;10468:260;;;10529:16;;10509:17;:36;10501:73;;;::::0;::::1;::::0;;11556:2:9;10501:73:5::1;::::0;::::1;11538:21:9::0;11595:2;11575:18;;;11568:30;11634:26;11614:18;;;11607:54;11678:18;;10501:73:5::1;11354:348:9::0;10501:73:5::1;10588:16;:36:::0;;;10468:260:::1;;;10655:12;:28:::0;;;::::1;::::0;;::::1;;;;::::0;;-1:-1:-1;10697:16:5::1;:20:::0;10468:260:::1;10742:30;10755:16;;10742:30;;;;345:25:9::0;;333:2;318:18;;199:177;4945:1550:5;1744:1:1;2325:7;;:19;2317:63;;;;;;;4729:2:9;2317:63:1;;;4711:21:9;4768:2;4748:18;;;4741:30;4807:33;4787:18;;;4780:61;4858:18;;2317:63:1;4527:355:9;2317:63:1;1744:1;2455:7;:18;5044:10:5::1;5011:21;5035:20:::0;;;:8:::1;:20;::::0;;;;5070:12:::1;::::0;;;::::1;;;5066:123;;;5134:16;::::0;5118:11;;5106:24:::1;::::0;:7;;:11:::1;:24::i;:::-;:44;;5098:80;;;::::0;::::1;::::0;;11909:2:9;5098:80:5::1;::::0;::::1;11891:21:9::0;11948:2;11928:18;;;11921:30;11987:25;11967:18;;;11960:53;12030:18;;5098:80:5::1;11707:347:9::0;5098:80:5::1;5199:13;:11;:13::i;:::-;5227:11:::0;;:15;5223:257:::1;;5258:15;5276:76;5336:4;:15;;;5276:55;5314:16;;5276:33;5292:16;;5276:4;:11;;;:15;;:33;;;;:::i;:76::-;5258:94:::0;-1:-1:-1;5370:11:5;;5366:104:::1;;5401:11;::::0;:54:::1;::::0;:11:::1;;5434:10;5447:7:::0;5401:24:::1;:54::i;:::-;5244:236;5223:257;5494:11:::0;;5490:871:::1;;5586:11:::0;;5677:8:::1;::::0;5670:38:::1;::::0;;;;5697:10:::1;5670:38;::::0;::::1;2825:74:9::0;5555:28:5::1;::::0;5677:8:::1;;::::0;5670:26:::1;::::0;2798:18:9;;5670:38:5::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5637:71:::0;-1:-1:-1;5727:25:5;;:56;::::1;;;-1:-1:-1::0;5756:27:5;;5727:56:::1;5723:628;;;5803:11;::::0;:73:::1;::::0;:11:::1;;5840:10;5861:4;5868:7:::0;5803:28:::1;:73::i;:::-;5908:11:::0;;:24:::1;::::0;5924:7;5908:15:::1;:24::i;:::-;5894:38:::0;;5950:17:::1;::::0;;:45:::1;::::0;;;;5981:10:::1;5950:45:::0;;::::1;6288:74:9::0;;;;5950:17:5;6378:18:9;;;6371:34;5950:17:5::1;;::::0;:30:::1;::::0;6261:18:9;;5950:45:5::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;6032:15:5::1;6013:16;::::0;::::1;:34:::0;;;6070:44:::1;::::0;345:25:9;;;6086:10:5::1;::::0;-1:-1:-1;6070:44:5::1;::::0;-1:-1:-1;333:2:9;318:18;6070:44:5::1;;;;;;;5723:628;;;6168:11:::0;;:24:::1;::::0;6184:7;6168:15:::1;:24::i;:::-;6154:38:::0;;6210:11:::1;::::0;:73:::1;::::0;:11:::1;;6247:10;6268:4;6275:7:::0;6210:28:::1;:73::i;:::-;6320:15;6301:16;::::0;::::1;:34:::0;5723:628:::1;5507:854;;5490:871;6427:16;::::0;6405::::1;::::0;6389:11;;:55:::1;::::0;6427:16;6389:33:::1;::::0;:11;:15:::1;:33::i;:55::-;6371:15;::::0;::::1;:73:::0;6460:28:::1;::::0;345:25:9;;;6468:10:5::1;::::0;6460:28:::1;::::0;333:2:9;318:18;6460:28:5::1;;;;;;;-1:-1:-1::0;;1701:1:1;2628:22;;4945:1550:5:o;8200:622::-;1744:1:1;2325:7;;:19;2317:63;;;;;;;4729:2:9;2317:63:1;;;4711:21:9;4768:2;4748:18;;;4741:30;4807:33;4787:18;;;4780:61;4858:18;;2317:63:1;4527:355:9;2317:63:1;1744:1;2455:7;:18;8294:10:5::1;8261:21;8285:20:::0;;;:8:::1;:20;::::0;;;;;8342:11;;8403:8:::1;::::0;8396:38;;;;;::::1;::::0;::::1;2825:74:9::0;;;;8285:20:5;;8342:11;;8261:21;8285:20:::1;8403:8;::::0;8396:26:::1;::::0;2798:18:9;;8396:38:5::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;8458:1;8444:15:::0;;;8469::::1;::::0;::::1;:19:::0;8363:71;-1:-1:-1;8503:20:5;;8499:259:::1;;8539:11;::::0;:63:::1;::::0;:11:::1;;8572:10;8585:16:::0;8539:24:::1;:63::i;:::-;8616:17;::::0;;:66:::1;::::0;;;;8647:10:::1;8616:66:::0;;::::1;6288:74:9::0;;;;6378:18;;;6371:34;;;8616:17:5::1;;::::0;:30:::1;::::0;6261:18:9;;8616:66:5::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;8701:46:5::1;::::0;8731:15:::1;345:25:9::0;;8719:10:5::1;::::0;-1:-1:-1;8701:46:5::1;::::0;-1:-1:-1;333:2:9;318:18;8701:46:5::1;;;;;;;8499:259;8803:11:::0;;8773:42:::1;::::0;345:25:9;;;8791:10:5::1;::::0;8773:42:::1;::::0;333:2:9;318:18;8773:42:5::1;199:177:9::0;1918:198:0;1082:7;1108:6;1248:23;1108:6;719:10:3;1248:23:0;1240:68;;;;;;;4368:2:9;1240:68:0;;;4350:21:9;;;4387:18;;;4380:30;4446:34;4426:18;;;4419:62;4498:18;;1240:68:0;4166:356:9;1240:68:0;2006:22:::1;::::0;::::1;1998:73;;;::::0;::::1;::::0;;12571:2:9;1998:73:0::1;::::0;::::1;12553:21:9::0;12610:2;12590:18;;;12583:30;12649:34;12629:18;;;12622:62;12720:8;12700:18;;;12693:36;12746:19;;1998:73:0::1;12369:402:9::0;1998:73:0::1;2081:28;2100:8;2081:18;:28::i;12331:780:5:-:0;12435:15;;;;12392:7;12435:15;;;:8;:15;;;;;;12488:11;;:36;;;;;12518:4;12488:36;;;2825:74:9;12392:7:5;;12435:15;;12392:7;;12488:11;;;;:21;;2798:18:9;;12488:36:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;12460:64;;12553:15;;12538:12;:30;:56;;;;-1:-1:-1;12572:22:5;;;12538:56;12534:571;;;12610:18;12631:45;12646:15;;12663:12;12631:14;:45::i;:::-;12610:66;;12690:19;12712:30;12727:14;;12712:10;:14;;:30;;;;:::i;:::-;12690:52;;12756:29;12800:78;12821:56;12859:17;12821:33;12837:16;;12821:11;:15;;:33;;;;:::i;:56::-;12800:16;;;:20;:78::i;:::-;12756:122;;12899:81;12964:4;:15;;;12899:60;12942:16;;12899:38;12915:21;12899:4;:11;;;:15;;:38;;;;:::i;:81::-;12892:88;12331:780;-1:-1:-1;;;;;;;12331:780:5:o;12534:571::-;13018:76;13078:4;:15;;;13018:55;13056:16;;13018:33;13034:16;;13018:4;:11;;;:15;;:33;;;;:::i;:76::-;13011:83;12331:780;-1:-1:-1;;;;12331:780:5:o;10943:136::-;1082:7:0;1108:6;1248:23;1108:6;719:10:3;1248:23:0;1240:68;;;;;;;4368:2:9;1240:68:0;;;4350:21:9;;;4387:18;;;4380:30;4446:34;4426:18;;;4419:62;4498:18;;1240:68:0;4166:356:9;1240:68:0;11015:8:5::1;:20:::0;;;11050:22:::1;::::0;345:25:9;;;11050:22:5::1;::::0;333:2:9;318:18;11050:22:5::1;199:177:9::0;13207:590:5;13269:15;;13253:12;:31;13249:68;;13207:590::o;13249:68::-;13355:11;;:36;;;;;13385:4;13355:36;;;2825:74:9;13327:25:5;;13355:11;;;:21;;2798:18:9;;13355:36:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;13327:64;;13406:17;13427:1;13406:22;13402:103;;-1:-1:-1;13462:12:5;13444:15;:30;13207:590::o;13402:103::-;13515:18;13536:45;13551:15;;13568:12;13536:14;:45::i;:::-;13515:66;;13591:19;13613:30;13628:14;;13613:10;:14;;:30;;;;:::i;:::-;13591:52;;13672:78;13693:56;13731:17;13693:33;13709:16;;13693:11;:15;;:33;;;;:::i;13672:78::-;13653:16;:97;-1:-1:-1;;13778:12:5;13760:15;:30;-1:-1:-1;13207:590:5:o;3451:96:4:-;3509:7;3535:5;3539:1;3535;:5;:::i;:::-;3528:12;;3451:96;;;;;:::o;3836:::-;3894:7;3920:5;3924:1;3920;:5;:::i;3108:96::-;3166:7;3192:5;3196:1;3192;:5;:::i;751:205:8:-;890:58;;6318:42:9;6306:55;;890:58:8;;;6288:74:9;6378:18;;;6371:34;;;863:86:8;;883:5;;913:23;;6261:18:9;;890:58:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;863:19;:86::i;2270:187:0:-;2343:16;2362:6;;;2378:17;;;;;;;;;;2410:40;;2362:6;;;;;;;2410:40;;2343:16;2410:40;2333:124;2270:187;:::o;2741:96:4:-;2799:7;2825:5;2829:1;2825;:5;:::i;962:241:8:-;1127:68;;13630:42:9;13699:15;;;1127:68:8;;;13681:34:9;13751:15;;13731:18;;;13724:43;13783:18;;;13776:34;;;1100:96:8;;1120:5;;1150:27;;13593:18:9;;1127:68:8;13418:398:9;1100:96:8;962:241;;;;:::o;13964:301:5:-;14039:7;14069:13;;14062:3;:20;14058:201;;14105:14;:3;14113:5;14105:7;:14::i;:::-;14098:21;;;;14058:201;14149:13;;14140:5;:22;14136:123;;-1:-1:-1;14185:1:5;14178:8;;14136:123;14224:13;;:24;;14242:5;14224:17;:24::i;3219:763:8:-;3638:23;3664:69;3692:4;3664:69;;;;;;;;;;;;;;;;;3672:5;3664:27;;;;:69;;;;;:::i;:::-;3747:17;;3638:95;;-1:-1:-1;3747:21:8;3743:233;;3899:10;3888:30;;;;;;;;;;;;:::i;:::-;3880:85;;;;;;;14273:2:9;3880:85:8;;;14255:21:9;14312:2;14292:18;;;14285:30;14351:34;14331:18;;;14324:62;14422:12;14402:18;;;14395:40;14452:19;;3880:85:8;14071:406:9;3861:223:2;3994:12;4025:52;4047:6;4055:4;4061:1;4064:12;4025:21;:52::i;:::-;4018:59;;3861:223;;;;;;:::o;4948:499::-;5113:12;5170:5;5145:21;:30;;5137:81;;;;;;;14684:2:9;5137:81:2;;;14666:21:9;14723:2;14703:18;;;14696:30;14762:34;14742:18;;;14735:62;14833:8;14813:18;;;14806:36;14859:19;;5137:81:2;14482:402:9;5137:81:2;1465:19;;;;5228:60;;;;;;;15091:2:9;5228:60:2;;;15073:21:9;15130:2;15110:18;;;15103:30;15169:31;15149:18;;;15142:59;15218:18;;5228:60:2;14889:353:9;5228:60:2;5300:12;5314:23;5341:6;:11;;5360:5;5367:4;5341:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5299:73;;;;5389:51;5406:7;5415:10;5427:12;7707;7735:7;7731:516;;;-1:-1:-1;7765:10:2;7758:17;;7731:516;7876:17;;:21;7872:365;;8070:10;8064:17;8130:15;8117:10;8113:2;8109:19;8102:44;7872:365;8209:12;8202:20;;;;;;;;;;;:::i;14:180:9:-;73:6;126:2;114:9;105:7;101:23;97:32;94:52;;;142:1;139;132:12;94:52;-1:-1:-1;165:23:9;;14:180;-1:-1:-1;14:180:9:o;381:154::-;467:42;460:5;456:54;449:5;446:65;436:93;;525:1;522;515:12;540:247;599:6;652:2;640:9;631:7;627:23;623:32;620:52;;;668:1;665;658:12;620:52;707:9;694:23;726:31;751:5;726:31;:::i;1308:315::-;1376:6;1384;1437:2;1425:9;1416:7;1412:23;1408:32;1405:52;;;1453:1;1450;1443:12;1405:52;1492:9;1479:23;1511:31;1536:5;1511:31;:::i;:::-;1561:5;1613:2;1598:18;;;;1585:32;;-1:-1:-1;;;1308:315:9:o;1628:1046::-;1789:6;1797;1805;1813;1821;1829;1837;1845;1853;1906:3;1894:9;1885:7;1881:23;1877:33;1874:53;;;1923:1;1920;1913:12;1874:53;1962:9;1949:23;1981:31;2006:5;1981:31;:::i;:::-;2031:5;-1:-1:-1;2088:2:9;2073:18;;2060:32;2101:33;2060:32;2101:33;:::i;:::-;2153:7;-1:-1:-1;2207:2:9;2192:18;;2179:32;;-1:-1:-1;2258:2:9;2243:18;;2230:32;;-1:-1:-1;2309:3:9;2294:19;;2281:33;;-1:-1:-1;2361:3:9;2346:19;;2333:33;;-1:-1:-1;2413:3:9;2398:19;;2385:33;;-1:-1:-1;2470:3:9;2455:19;;2442:33;2484;2442;2484;:::i;:::-;2536:7;-1:-1:-1;2595:3:9;2580:19;;2567:33;2609;2567;2609;:::i;:::-;2661:7;2651:17;;;1628:1046;;;;;;;;;;;:::o;2910:248::-;2978:6;2986;3039:2;3027:9;3018:7;3014:23;3010:32;3007:52;;;3055:1;3052;3045:12;3007:52;-1:-1:-1;;3078:23:9;;;3148:2;3133:18;;;3120:32;;-1:-1:-1;2910:248:9:o;3163:315::-;3231:6;3239;3292:2;3280:9;3271:7;3267:23;3263:32;3260:52;;;3308:1;3305;3298:12;3260:52;3344:9;3331:23;3321:33;;3404:2;3393:9;3389:18;3376:32;3417:31;3442:5;3417:31;:::i;:::-;3467:5;3457:15;;;3163:315;;;;;:::o;3483:118::-;3569:5;3562:13;3555:21;3548:5;3545:32;3535:60;;3591:1;3588;3581:12;3606:309;3671:6;3679;3732:2;3720:9;3711:7;3707:23;3703:32;3700:52;;;3748:1;3745;3738:12;3700:52;3787:9;3774:23;3806:28;3828:5;3806:28;:::i;5243:184::-;5295:77;5292:1;5285:88;5392:4;5389:1;5382:15;5416:4;5413:1;5406:15;5432:128;5472:3;5503:1;5499:6;5496:1;5493:13;5490:39;;;5509:18;;:::i;:::-;-1:-1:-1;5545:9:9;;5432:128::o;5925:184::-;5995:6;6048:2;6036:9;6027:7;6023:23;6019:32;6016:52;;;6064:1;6061;6054:12;6016:52;-1:-1:-1;6087:16:9;;5925:184;-1:-1:-1;5925:184:9:o;7806:273::-;7874:6;7927:2;7915:9;7906:7;7902:23;7898:32;7895:52;;;7943:1;7940;7933:12;7895:52;7975:9;7969:16;8025:4;8018:5;8014:16;8007:5;8004:27;7994:55;;8045:1;8042;8035:12;8435:482;8524:1;8567:5;8524:1;8581:330;8602:7;8592:8;8589:21;8581:330;;;8721:4;8653:66;8649:77;8643:4;8640:87;8637:113;;;8730:18;;:::i;:::-;8780:7;8770:8;8766:22;8763:55;;;8800:16;;;;8763:55;8879:22;;;;8839:15;;;;8581:330;;;8585:3;8435:482;;;;;:::o;8922:866::-;8971:5;9001:8;8991:80;;-1:-1:-1;9042:1:9;9056:5;;8991:80;9090:4;9080:76;;-1:-1:-1;9127:1:9;9141:5;;9080:76;9172:4;9190:1;9185:59;;;;9258:1;9253:130;;;;9165:218;;9185:59;9215:1;9206:10;;9229:5;;;9253:130;9290:3;9280:8;9277:17;9274:43;;;9297:18;;:::i;:::-;-1:-1:-1;;9353:1:9;9339:16;;9368:5;;9165:218;;9467:2;9457:8;9454:16;9448:3;9442:4;9439:13;9435:36;9429:2;9419:8;9416:16;9411:2;9405:4;9402:12;9398:35;9395:77;9392:159;;;-1:-1:-1;9504:19:9;;;9536:5;;9392:159;9583:34;9608:8;9602:4;9583:34;:::i;:::-;9713:6;9645:66;9641:79;9632:7;9629:92;9626:118;;;9724:18;;:::i;:::-;9762:20;;8922:866;-1:-1:-1;;;8922:866:9:o;9793:131::-;9853:5;9882:36;9909:8;9903:4;9882:36;:::i;12776:228::-;12816:7;12942:1;12874:66;12870:74;12867:1;12864:81;12859:1;12852:9;12845:17;12841:105;12838:131;;;12949:18;;:::i;:::-;-1:-1:-1;12989:9:9;;12776:228::o;13009:274::-;13049:1;13075;13065:189;;13110:77;13107:1;13100:88;13211:4;13208:1;13201:15;13239:4;13236:1;13229:15;13065:189;-1:-1:-1;13268:9:9;;13009:274::o;13288:125::-;13328:4;13356:1;13353;13350:8;13347:34;;;13361:18;;:::i;:::-;-1:-1:-1;13398:9:9;;13288:125::o;13821:245::-;13888:6;13941:2;13929:9;13920:7;13916:23;13912:32;13909:52;;;13957:1;13954;13947:12;13909:52;13989:9;13983:16;14008:28;14030:5;14008:28;:::i;15247:258::-;15319:1;15329:113;15343:6;15340:1;15337:13;15329:113;;;15419:11;;;15413:18;15400:11;;;15393:39;15365:2;15358:10;15329:113;;;15460:6;15457:1;15454:13;15451:48;;;-1:-1:-1;;15495:1:9;15477:16;;15470:27;15247:258::o;15510:274::-;15639:3;15677:6;15671:13;15693:53;15739:6;15734:3;15727:4;15719:6;15715:17;15693:53;:::i;:::-;15762:16;;;;;15510:274;-1:-1:-1;;15510:274:9:o;15789:442::-;15938:2;15927:9;15920:21;15901:4;15970:6;15964:13;16013:6;16008:2;15997:9;15993:18;15986:34;16029:66;16088:6;16083:2;16072:9;16068:18;16063:2;16055:6;16051:15;16029:66;:::i;:::-;16147:2;16135:15;16152:66;16131:88;16116:104;;;;16222:2;16112:113;;15789:442;-1:-1:-1;;15789:442:9:o
Swarm Source
ipfs://3885f5b7d184f5a150a11e6d7fd4b88150e276f7ecbd89db9fc7909b3b42de0c
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.