More Info
Private Name Tags
ContractCreator
Latest 7 from a total of 7 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Deposit | 20565155 | 233 days ago | IN | 0 ETH | 0.00036095 | ||||
Deposit | 20565127 | 233 days ago | IN | 0 ETH | 0.0005199 | ||||
Deposit | 20466531 | 247 days ago | IN | 0 ETH | 0.00084257 | ||||
Withdraw | 20466372 | 247 days ago | IN | 0 ETH | 0.00117117 | ||||
Deposit | 19650916 | 361 days ago | IN | 0 ETH | 0.00366619 | ||||
Deposit | 19640490 | 362 days ago | IN | 0 ETH | 0.00450091 | ||||
Start Reward | 19640470 | 362 days ago | IN | 0 ETH | 0.00081686 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
CScaleRevShareTwo
Compiler Version
v0.8.11+commit.d7f03943
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2024-04-12 */ /** *Submitted for verification at Etherscan.io on 2023-04-25 */ //SPDX-License-Identifier: UNLICENSED pragma solidity 0.8.11; //import "@nomiclabs/buidler/console.sol"; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with GSN meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ contract Context { // Empty internal constructor, to prevent people from mistakenly deploying // an instance of this contract, which should be used via inheritance. constructor() {} function _msgSender() internal view returns (address payable) { return payable(msg.sender); } function _msgData() internal view returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } /** * @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. */ 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() { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(_owner == _msgSender(), 'Ownable: caller is not the owner'); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public onlyOwner { _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). */ function _transferOwnership(address newOwner) internal { require(newOwner != address(0), 'Ownable: new owner is the zero address'); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @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) { uint256 c = a + b; require(c >= a, 'SafeMath: addition overflow'); return c; } /** * @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 sub(a, b, 'SafeMath: subtraction overflow'); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @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) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, 'SafeMath: multiplication overflow'); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, 'SafeMath: division by zero'); } /** * @dev Returns the integer division of two unsigned integers. Reverts 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) { require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts 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 mod(a, b, 'SafeMath: modulo by zero'); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message 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, string memory errorMessage ) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } function min(uint256 x, uint256 y) internal pure returns (uint256 z) { z = x < y ? x : y; } // babylonian method (https://en.wikipedia.org/wiki/Methods_of_computing_square_roots#Babylonian_method) function sqrt(uint256 y) internal pure returns (uint256 z) { if (y > 3) { z = y; uint256 x = y / 2 + 1; while (x < z) { z = x; x = (y / x + x) / 2; } } else if (y != 0) { z = 1; } } } interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the token decimals. */ function decimals() external view returns (uint8); /** * @dev Returns the token symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the token name. */ function name() external view returns (string memory); /** * @dev Returns the bep token owner. */ function getOwner() external view returns (address); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address _owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } /** * @title SafeBEP20 * @dev Wrappers around BEP20 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 SafeBEP20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeBEP20 { 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), 'SafeBEP20: 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, 'SafeBEP20: 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, 'SafeBEP20: low-level call failed'); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), 'SafeBEP20: BEP20 operation did not succeed'); } } } /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // According to EIP-1052, 0x0 is the value returned for not-yet created accounts // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned // for accounts without code, i.e. `keccak256('')` bytes32 codehash; bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; // solhint-disable-next-line no-inline-assembly assembly { codehash := extcodehash(account) } return (codehash != accountHash && codehash != 0x0); } /** * @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'); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{value: amount}(''); require(success, 'Address: unable to send value, recipient may have reverted'); } /** * @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'); return _functionCallWithValue(target, data, value, errorMessage); } function _functionCallWithValue( address target, bytes memory data, uint256 weiValue, string memory errorMessage ) private returns (bytes memory) { require(isContract(target), 'Address: call to non-contract'); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{value: weiValue}(data); if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } 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; } } contract CScaleRevShareTwo is Ownable, ReentrancyGuard { using SafeMath for uint256; using SafeBEP20 for IERC20; // Info of each user. struct UserInfo { uint256 amount; // How many LP tokens the user has provided. uint256 rewardDebt; // Reward debt. See explanation below. } // Info of each pool. struct PoolInfo { IERC20 lpToken; // Address of LP token contract. uint256 allocPoint; // How many allocation points assigned to this pool. Tokens to distribute per block. uint256 lastRewardTimestamp; // Last block number that Tokens distribution occurs. uint256 accTokensPerShare; // Accumulated Tokens per share, times 1e12. See below. } IERC20 public immutable stakingToken; IERC20 public immutable rewardToken; mapping (address => uint256) public holderUnlockTime; uint256 public totalStaked; uint256 public apy; uint256 public lockDuration; uint256 public exitPenaltyPerc; // Info of each pool. PoolInfo[] public poolInfo; // Info of each user that stakes LP tokens.d mapping (address => UserInfo) public userInfo; // Total allocation poitns. Must be the sum of all allocation points in all pools. uint256 private totalAllocPoint = 0; event Deposit(address indexed user, uint256 amount); event Withdraw(address indexed user, uint256 amount); event EmergencyWithdraw(address indexed user, uint256 amount); constructor( ) { stakingToken = IERC20(0x6e3B7aaC14CD7832166706D5a9f2497BCE114e2b); rewardToken = IERC20(0x6e3B7aaC14CD7832166706D5a9f2497BCE114e2b); apy = 200; lockDuration = 4 weeks; exitPenaltyPerc = 10; // staking pool poolInfo.push(PoolInfo({ lpToken: stakingToken, allocPoint: 1000, lastRewardTimestamp: 21616747, accTokensPerShare: 0 })); totalAllocPoint = 1000; } function stopReward() external onlyOwner { updatePool(0); apy = 0; } function startReward() external onlyOwner { require(poolInfo[0].lastRewardTimestamp == 21616747, "Can only start rewards once"); poolInfo[0].lastRewardTimestamp = block.timestamp; } // View function to see pending Reward on frontend. function pendingReward(address _user) external view returns (uint256) { PoolInfo storage pool = poolInfo[0]; UserInfo storage user = userInfo[_user]; if(pool.lastRewardTimestamp == 21616747){ return 0; } uint256 accTokensPerShare = pool.accTokensPerShare; uint256 lpSupply = totalStaked; if (block.timestamp > pool.lastRewardTimestamp && lpSupply != 0) { uint256 tokenReward = calculateNewRewards().mul(pool.allocPoint).div(totalAllocPoint); accTokensPerShare = accTokensPerShare.add(tokenReward.mul(1e12).div(lpSupply)); } return user.amount.mul(accTokensPerShare).div(1e12).sub(user.rewardDebt); } // Update reward variables of the given pool to be up-to-date. function updatePool(uint256 _pid) internal { PoolInfo storage pool = poolInfo[_pid]; if (block.timestamp <= pool.lastRewardTimestamp) { return; } uint256 lpSupply = totalStaked; if (lpSupply == 0) { pool.lastRewardTimestamp = block.timestamp; return; } uint256 tokenReward = calculateNewRewards().mul(pool.allocPoint).div(totalAllocPoint); pool.accTokensPerShare = pool.accTokensPerShare.add(tokenReward.mul(1e12).div(lpSupply)); pool.lastRewardTimestamp = block.timestamp; } // Update reward variables for all pools. Be careful of gas spending! function massUpdatePools() public onlyOwner { uint256 length = poolInfo.length; for (uint256 pid = 0; pid < length; ++pid) { updatePool(pid); } } // Stake primary tokens function deposit(uint256 _amount) public nonReentrant { if(holderUnlockTime[msg.sender] == 0){ holderUnlockTime[msg.sender] = block.timestamp + lockDuration; } PoolInfo storage pool = poolInfo[0]; UserInfo storage user = userInfo[msg.sender]; updatePool(0); if (user.amount > 0) { uint256 pending = user.amount.mul(pool.accTokensPerShare).div(1e12).sub(user.rewardDebt); if(pending > 0) { require(pending <= rewardsRemaining(), "Cannot withdraw other people's staked tokens. Contact an admin."); rewardToken.safeTransfer(address(msg.sender), pending); } } uint256 amountTransferred = 0; if(_amount > 0) { uint256 initialBalance = pool.lpToken.balanceOf(address(this)); pool.lpToken.safeTransferFrom(address(msg.sender), address(this), _amount); amountTransferred = pool.lpToken.balanceOf(address(this)) - initialBalance; user.amount = user.amount.add(amountTransferred); totalStaked += amountTransferred; } user.rewardDebt = user.amount.mul(pool.accTokensPerShare).div(1e12); emit Deposit(msg.sender, _amount); } // Withdraw primary tokens from STAKING. function withdraw() public nonReentrant { require(holderUnlockTime[msg.sender] <= block.timestamp, "May not do normal withdraw early"); PoolInfo storage pool = poolInfo[0]; UserInfo storage user = userInfo[msg.sender]; uint256 _amount = user.amount; updatePool(0); uint256 pending = user.amount.mul(pool.accTokensPerShare).div(1e12).sub(user.rewardDebt); if(pending > 0) { require(pending <= rewardsRemaining(), "Cannot withdraw other people's staked tokens. Contact an admin."); rewardToken.safeTransfer(address(msg.sender), pending); } if(_amount > 0) { user.amount = 0; totalStaked -= _amount; pool.lpToken.safeTransfer(address(msg.sender), _amount); } user.rewardDebt = user.amount.mul(pool.accTokensPerShare).div(1e12); if(user.amount > 0){ holderUnlockTime[msg.sender] = block.timestamp + lockDuration; } else { holderUnlockTime[msg.sender] = 0; } emit Withdraw(msg.sender, _amount); } // Withdraw without caring about rewards. EMERGENCY ONLY. function emergencyWithdraw() external nonReentrant { PoolInfo storage pool = poolInfo[0]; UserInfo storage user = userInfo[msg.sender]; uint256 _amount = user.amount; totalStaked -= _amount; // exit penalty for early unstakers, penalty held on contract as rewards. if(holderUnlockTime[msg.sender] >= block.timestamp){ _amount -= _amount * exitPenaltyPerc / 100; } holderUnlockTime[msg.sender] = 0; pool.lpToken.safeTransfer(address(msg.sender), _amount); user.amount = 0; user.rewardDebt = 0; emit EmergencyWithdraw(msg.sender, _amount); } // Withdraw reward. EMERGENCY ONLY. This allows the owner to migrate rewards to a new staking pool since we are not minting new tokens. function emergencyRewardWithdraw(uint256 _amount) external onlyOwner { require(_amount <= rewardToken.balanceOf(address(this)) - totalStaked, 'not enough tokens to take out'); rewardToken.safeTransfer(address(msg.sender), _amount); } function calculateNewRewards() public view returns (uint256) { PoolInfo storage pool = poolInfo[0]; if(pool.lastRewardTimestamp > block.timestamp){ return 0; } return (((block.timestamp - pool.lastRewardTimestamp) * totalStaked) * apy / 100 / 365 days); } function rewardsRemaining() public view returns (uint256){ return rewardToken.balanceOf(address(this)) - totalStaked; } function updateApy(uint256 newApy) external onlyOwner { require(newApy <= 10000, "APY must be below 10000%"); updatePool(0); apy = newApy; } function updateExitPenalty(uint256 newPenaltyPerc) external onlyOwner { require(newPenaltyPerc <= 30, "May not set higher than 30%"); exitPenaltyPerc = newPenaltyPerc; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"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":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"apy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"calculateNewRewards","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":"exitPenaltyPerc","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"holderUnlockTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"massUpdatePools","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"pendingReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolInfo","outputs":[{"internalType":"contract IERC20","name":"lpToken","type":"address"},{"internalType":"uint256","name":"allocPoint","type":"uint256"},{"internalType":"uint256","name":"lastRewardTimestamp","type":"uint256"},{"internalType":"uint256","name":"accTokensPerShare","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardsRemaining","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakingToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stopReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalStaked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newApy","type":"uint256"}],"name":"updateApy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPenaltyPerc","type":"uint256"}],"name":"updateExitPenalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userInfo","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"rewardDebt","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60c0604052600060095534801561001557600080fd5b50600061002661025560201b60201c565b9050806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35060018081905550736e3b7aac14cd7832166706d5a9f2497bce114e2b73ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1681525050736e3b7aac14cd7832166706d5a9f2497bce114e2b73ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff168152505060c86004819055506224ea00600581905550600a6006819055506007604051806080016040528060805173ffffffffffffffffffffffffffffffffffffffff1681526020016103e88152602001630149d86b81526020016000815250908060018154018082558091505060019003906000526020600020906004020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010155604082015181600201556060820151816003015550506103e860098190555061025d565b600033905090565b60805160a051612f2f620002a66000396000818161051b015281816106060152818161084601528181610db9015281816112d201526119f201526000610c620152612f2f6000f3fe608060405234801561001057600080fd5b50600436106101585760003560e01c806380dc0672116100c3578063b6b55f251161007c578063b6b55f251461034b578063db2e21bc14610367578063f2fde38b14610371578063f40f0f521461038d578063f7c618c1146103bd578063ff16ef39146103db57610158565b806380dc06721461029b578063817b1cd2146102a55780638da5cb5b146102c35780638e0b0198146102e1578063999e2f75146102fd578063a913a5f71461031b57610158565b8063630b5ba111610115578063630b5ba114610223578063715018a61461022d57806372f702f314610237578063746c8ae11461025557806378c196f31461025f5780637b280def1461027d57610158565b8063045544431461015d5780631526fe271461017b5780631959a002146101ae5780633279beab146101df5780633bcfc4b8146101fb5780633ccfd60b14610219575b600080fd5b6101656103f7565b60405161017291906122c4565b60405180910390f35b61019560048036038101906101909190612310565b6103fd565b6040516101a594939291906123bc565b60405180910390f35b6101c860048036038101906101c3919061243f565b61045d565b6040516101d692919061246c565b60405180910390f35b6101f960048036038101906101f49190612310565b610481565b005b61020361064d565b60405161021091906122c4565b60405180910390f35b610221610653565b005b61022b610a45565b005b610235610b0d565b005b61023f610c60565b60405161024c9190612495565b60405180910390f35b61025d610c84565b005b610267610db2565b60405161027491906122c4565b60405180910390f35b610285610e60565b60405161029291906122c4565b60405180910390f35b6102a3610e66565b005b6102ad610f0f565b6040516102ba91906122c4565b60405180910390f35b6102cb610f15565b6040516102d891906124bf565b60405180910390f35b6102fb60048036038101906102f69190612310565b610f3e565b005b610305611021565b60405161031291906122c4565b60405180910390f35b6103356004803603810190610330919061243f565b6110ab565b60405161034291906122c4565b60405180910390f35b61036560048036038101906103609190612310565b6110c3565b005b61036f611590565b005b61038b6004803603810190610386919061243f565b6117da565b005b6103a760048036038101906103a2919061243f565b61187b565b6040516103b491906122c4565b60405180910390f35b6103c56119f0565b6040516103d29190612495565b60405180910390f35b6103f560048036038101906103f09190612310565b611a14565b005b60055481565b6007818154811061040d57600080fd5b90600052602060002090600402016000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020154908060030154905084565b60086020528060005260406000206000915090508060000154908060010154905082565b610489611b02565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610516576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161050d90612537565b60405180910390fd5b6003547f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161057291906124bf565b602060405180830381865afa15801561058f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b3919061256c565b6105bd91906125c8565b8111156105ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105f690612648565b60405180910390fd5b61064a33827f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16611b0a9092919063ffffffff16565b50565b60045481565b60026001541415610699576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610690906126b4565b60405180910390fd5b600260018190555042600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115610723576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161071a90612720565b60405180910390fd5b6000600760008154811061073a57610739612740565b5b906000526020600020906004020190506000600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000816000015490506107a06000611b90565b60006107ea83600101546107dc64e8d4a510006107ce88600301548860000154611c7590919063ffffffff16565b611cf090919063ffffffff16565b611d3a90919063ffffffff16565b9050600081111561088b576107fd610db2565b81111561083f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610836906127e1565b60405180910390fd5b61088a33827f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16611b0a9092919063ffffffff16565b5b6000821115610907576000836000018190555081600360008282546108b091906125c8565b9250508190555061090633838660000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611b0a9092919063ffffffff16565b5b61093964e8d4a5100061092b86600301548660000154611c7590919063ffffffff16565b611cf090919063ffffffff16565b83600101819055506000836000015411156109a4576005544261095c9190612801565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506109ea565b6000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b3373ffffffffffffffffffffffffffffffffffffffff167f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a942436483604051610a3091906122c4565b60405180910390a25050505060018081905550565b610a4d611b02565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610ada576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ad190612537565b60405180910390fd5b6000600780549050905060005b81811015610b0957610af881611b90565b80610b0290612857565b9050610ae7565b5050565b610b15611b02565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610ba2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9990612537565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b7f000000000000000000000000000000000000000000000000000000000000000081565b610c8c611b02565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610d19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1090612537565b60405180910390fd5b630149d86b6007600081548110610d3357610d32612740565b5b90600052602060002090600402016002015414610d85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7c906128ec565b60405180910390fd5b426007600081548110610d9b57610d9a612740565b5b906000526020600020906004020160020181905550565b60006003547f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610e1091906124bf565b602060405180830381865afa158015610e2d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e51919061256c565b610e5b91906125c8565b905090565b60065481565b610e6e611b02565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610efb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef290612537565b60405180910390fd5b610f056000611b90565b6000600481905550565b60035481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610f46611b02565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610fd3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fca90612537565b60405180910390fd5b601e811115611017576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100e90612958565b60405180910390fd5b8060068190555050565b600080600760008154811061103957611038612740565b5b90600052602060002090600402019050428160020154111561105f5760009150506110a8565b6301e13380606460045460035484600201544261107c91906125c8565b6110869190612978565b6110909190612978565b61109a9190612a01565b6110a49190612a01565b9150505b90565b60026020528060005260406000206000915090505481565b60026001541415611109576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611100906126b4565b60405180910390fd5b60026001819055506000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414156111ab57600554426111679190612801565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b600060076000815481106111c2576111c1612740565b5b906000526020600020906004020190506000600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905061121f6000611b90565b600081600001541115611319576000611276826001015461126864e8d4a5100061125a87600301548760000154611c7590919063ffffffff16565b611cf090919063ffffffff16565b611d3a90919063ffffffff16565b9050600081111561131757611289610db2565b8111156112cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c2906127e1565b60405180910390fd5b61131633827f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16611b0a9092919063ffffffff16565b5b505b6000808411156114fb5760008360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161138291906124bf565b602060405180830381865afa15801561139f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113c3919061256c565b90506114163330878760000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611d84909392919063ffffffff16565b808460000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161147491906124bf565b602060405180830381865afa158015611491573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114b5919061256c565b6114bf91906125c8565b91506114d8828460000154611e0d90919063ffffffff16565b836000018190555081600360008282546114f29190612801565b92505081905550505b61152d64e8d4a5100061151f85600301548560000154611c7590919063ffffffff16565b611cf090919063ffffffff16565b82600101819055503373ffffffffffffffffffffffffffffffffffffffff167fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c8560405161157b91906122c4565b60405180910390a25050506001808190555050565b600260015414156115d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115cd906126b4565b60405180910390fd5b6002600181905550600060076000815481106115f5576115f4612740565b5b906000526020600020906004020190506000600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600081600001549050806003600082825461166391906125c8565b9250508190555042600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054106116d8576064600654826116c09190612978565b6116ca9190612a01565b816116d591906125c8565b90505b6000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061176c33828560000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611b0a9092919063ffffffff16565b60008260000181905550600082600101819055503373ffffffffffffffffffffffffffffffffffffffff167f5fafa99d0643513820be26656b45130b01e1c03062e1266bf36f88cbd3bd9695826040516117c691906122c4565b60405180910390a250505060018081905550565b6117e2611b02565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461186f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161186690612537565b60405180910390fd5b61187881611e6b565b50565b600080600760008154811061189357611892612740565b5b906000526020600020906004020190506000600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050630149d86b82600201541415611901576000925050506119eb565b60008260030154905060006003549050836002015442118015611925575060008114155b156119a057600061195e6009546119508760010154611942611021565b611c7590919063ffffffff16565b611cf090919063ffffffff16565b905061199c61198d8361197f64e8d4a5100085611c7590919063ffffffff16565b611cf090919063ffffffff16565b84611e0d90919063ffffffff16565b9250505b6119e483600101546119d664e8d4a510006119c8868860000154611c7590919063ffffffff16565b611cf090919063ffffffff16565b611d3a90919063ffffffff16565b9450505050505b919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b611a1c611b02565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611aa9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aa090612537565b60405180910390fd5b612710811115611aee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ae590612a7e565b60405180910390fd5b611af86000611b90565b8060048190555050565b600033905090565b611b8b8363a9059cbb60e01b8484604051602401611b29929190612a9e565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611f98565b505050565b600060078281548110611ba657611ba5612740565b5b9060005260206000209060040201905080600201544211611bc75750611c72565b600060035490506000811415611be7574282600201819055505050611c72565b6000611c1b600954611c0d8560010154611bff611021565b611c7590919063ffffffff16565b611cf090919063ffffffff16565b9050611c5d611c4a83611c3c64e8d4a5100085611c7590919063ffffffff16565b611cf090919063ffffffff16565b8460030154611e0d90919063ffffffff16565b83600301819055504283600201819055505050505b50565b600080831415611c885760009050611cea565b60008284611c969190612978565b9050828482611ca59190612a01565b14611ce5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cdc90612b39565b60405180910390fd5b809150505b92915050565b6000611d3283836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061205f565b905092915050565b6000611d7c83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506120c2565b905092915050565b611e07846323b872dd60e01b858585604051602401611da593929190612b59565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611f98565b50505050565b6000808284611e1c9190612801565b905083811015611e61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5890612bdc565b60405180910390fd5b8091505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611edb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ed290612c6e565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000611ffa826040518060400160405280602081526020017f5361666542455032303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166121269092919063ffffffff16565b905060008151111561205a578080602001905181019061201a9190612cc6565b612059576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161205090612d65565b60405180910390fd5b5b505050565b600080831182906120a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209d9190612e0d565b60405180910390fd5b50600083856120b59190612a01565b9050809150509392505050565b600083831115829061210a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121019190612e0d565b60405180910390fd5b506000838561211991906125c8565b9050809150509392505050565b6060612135848460008561213e565b90509392505050565b606061214985612260565b612188576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161217f90612e7b565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516121b19190612ee2565b60006040518083038185875af1925050503d80600081146121ee576040519150601f19603f3d011682016040523d82523d6000602084013e6121f3565b606091505b50915091508115612208578092505050612258565b60008151111561221b5780518082602001fd5b836040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161224f9190612e0d565b60405180910390fd5b949350505050565b60008060007fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050833f91508082141580156122a257506000801b8214155b92505050919050565b6000819050919050565b6122be816122ab565b82525050565b60006020820190506122d960008301846122b5565b92915050565b600080fd5b6122ed816122ab565b81146122f857600080fd5b50565b60008135905061230a816122e4565b92915050565b600060208284031215612326576123256122df565b5b6000612334848285016122fb565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600061238261237d6123788461233d565b61235d565b61233d565b9050919050565b600061239482612367565b9050919050565b60006123a682612389565b9050919050565b6123b68161239b565b82525050565b60006080820190506123d160008301876123ad565b6123de60208301866122b5565b6123eb60408301856122b5565b6123f860608301846122b5565b95945050505050565b600061240c8261233d565b9050919050565b61241c81612401565b811461242757600080fd5b50565b60008135905061243981612413565b92915050565b600060208284031215612455576124546122df565b5b60006124638482850161242a565b91505092915050565b600060408201905061248160008301856122b5565b61248e60208301846122b5565b9392505050565b60006020820190506124aa60008301846123ad565b92915050565b6124b981612401565b82525050565b60006020820190506124d460008301846124b0565b92915050565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006125216020836124da565b915061252c826124eb565b602082019050919050565b6000602082019050818103600083015261255081612514565b9050919050565b600081519050612566816122e4565b92915050565b600060208284031215612582576125816122df565b5b600061259084828501612557565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006125d3826122ab565b91506125de836122ab565b9250828210156125f1576125f0612599565b5b828203905092915050565b7f6e6f7420656e6f75676820746f6b656e7320746f2074616b65206f7574000000600082015250565b6000612632601d836124da565b915061263d826125fc565b602082019050919050565b6000602082019050818103600083015261266181612625565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b600061269e601f836124da565b91506126a982612668565b602082019050919050565b600060208201905081810360008301526126cd81612691565b9050919050565b7f4d6179206e6f7420646f206e6f726d616c207769746864726177206561726c79600082015250565b600061270a6020836124da565b9150612715826126d4565b602082019050919050565b60006020820190508181036000830152612739816126fd565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f43616e6e6f74207769746864726177206f746865722070656f706c652773207360008201527f74616b656420746f6b656e732e2020436f6e7461637420616e2061646d696e2e602082015250565b60006127cb6040836124da565b91506127d68261276f565b604082019050919050565b600060208201905081810360008301526127fa816127be565b9050919050565b600061280c826122ab565b9150612817836122ab565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561284c5761284b612599565b5b828201905092915050565b6000612862826122ab565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561289557612894612599565b5b600182019050919050565b7f43616e206f6e6c792073746172742072657761726473206f6e63650000000000600082015250565b60006128d6601b836124da565b91506128e1826128a0565b602082019050919050565b60006020820190508181036000830152612905816128c9565b9050919050565b7f4d6179206e6f742073657420686967686572207468616e203330250000000000600082015250565b6000612942601b836124da565b915061294d8261290c565b602082019050919050565b6000602082019050818103600083015261297181612935565b9050919050565b6000612983826122ab565b915061298e836122ab565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156129c7576129c6612599565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612a0c826122ab565b9150612a17836122ab565b925082612a2757612a266129d2565b5b828204905092915050565b7f415059206d7573742062652062656c6f77203130303030250000000000000000600082015250565b6000612a686018836124da565b9150612a7382612a32565b602082019050919050565b60006020820190508181036000830152612a9781612a5b565b9050919050565b6000604082019050612ab360008301856124b0565b612ac060208301846122b5565b9392505050565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008201527f7700000000000000000000000000000000000000000000000000000000000000602082015250565b6000612b236021836124da565b9150612b2e82612ac7565b604082019050919050565b60006020820190508181036000830152612b5281612b16565b9050919050565b6000606082019050612b6e60008301866124b0565b612b7b60208301856124b0565b612b8860408301846122b5565b949350505050565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000600082015250565b6000612bc6601b836124da565b9150612bd182612b90565b602082019050919050565b60006020820190508181036000830152612bf581612bb9565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000612c586026836124da565b9150612c6382612bfc565b604082019050919050565b60006020820190508181036000830152612c8781612c4b565b9050919050565b60008115159050919050565b612ca381612c8e565b8114612cae57600080fd5b50565b600081519050612cc081612c9a565b92915050565b600060208284031215612cdc57612cdb6122df565b5b6000612cea84828501612cb1565b91505092915050565b7f5361666542455032303a204245503230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b6000612d4f602a836124da565b9150612d5a82612cf3565b604082019050919050565b60006020820190508181036000830152612d7e81612d42565b9050919050565b600081519050919050565b60005b83811015612dae578082015181840152602081019050612d93565b83811115612dbd576000848401525b50505050565b6000601f19601f8301169050919050565b6000612ddf82612d85565b612de981856124da565b9350612df9818560208601612d90565b612e0281612dc3565b840191505092915050565b60006020820190508181036000830152612e278184612dd4565b905092915050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b6000612e65601d836124da565b9150612e7082612e2f565b602082019050919050565b60006020820190508181036000830152612e9481612e58565b9050919050565b600081519050919050565b600081905092915050565b6000612ebc82612e9b565b612ec68185612ea6565b9350612ed6818560208601612d90565b80840191505092915050565b6000612eee8284612eb1565b91508190509291505056fea26469706673582212208c755a455647fa06d4d03a5a817e50c4ee202eed58d5535cb52740fc71a856c964736f6c634300080b0033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101585760003560e01c806380dc0672116100c3578063b6b55f251161007c578063b6b55f251461034b578063db2e21bc14610367578063f2fde38b14610371578063f40f0f521461038d578063f7c618c1146103bd578063ff16ef39146103db57610158565b806380dc06721461029b578063817b1cd2146102a55780638da5cb5b146102c35780638e0b0198146102e1578063999e2f75146102fd578063a913a5f71461031b57610158565b8063630b5ba111610115578063630b5ba114610223578063715018a61461022d57806372f702f314610237578063746c8ae11461025557806378c196f31461025f5780637b280def1461027d57610158565b8063045544431461015d5780631526fe271461017b5780631959a002146101ae5780633279beab146101df5780633bcfc4b8146101fb5780633ccfd60b14610219575b600080fd5b6101656103f7565b60405161017291906122c4565b60405180910390f35b61019560048036038101906101909190612310565b6103fd565b6040516101a594939291906123bc565b60405180910390f35b6101c860048036038101906101c3919061243f565b61045d565b6040516101d692919061246c565b60405180910390f35b6101f960048036038101906101f49190612310565b610481565b005b61020361064d565b60405161021091906122c4565b60405180910390f35b610221610653565b005b61022b610a45565b005b610235610b0d565b005b61023f610c60565b60405161024c9190612495565b60405180910390f35b61025d610c84565b005b610267610db2565b60405161027491906122c4565b60405180910390f35b610285610e60565b60405161029291906122c4565b60405180910390f35b6102a3610e66565b005b6102ad610f0f565b6040516102ba91906122c4565b60405180910390f35b6102cb610f15565b6040516102d891906124bf565b60405180910390f35b6102fb60048036038101906102f69190612310565b610f3e565b005b610305611021565b60405161031291906122c4565b60405180910390f35b6103356004803603810190610330919061243f565b6110ab565b60405161034291906122c4565b60405180910390f35b61036560048036038101906103609190612310565b6110c3565b005b61036f611590565b005b61038b6004803603810190610386919061243f565b6117da565b005b6103a760048036038101906103a2919061243f565b61187b565b6040516103b491906122c4565b60405180910390f35b6103c56119f0565b6040516103d29190612495565b60405180910390f35b6103f560048036038101906103f09190612310565b611a14565b005b60055481565b6007818154811061040d57600080fd5b90600052602060002090600402016000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020154908060030154905084565b60086020528060005260406000206000915090508060000154908060010154905082565b610489611b02565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610516576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161050d90612537565b60405180910390fd5b6003547f0000000000000000000000006e3b7aac14cd7832166706d5a9f2497bce114e2b73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161057291906124bf565b602060405180830381865afa15801561058f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b3919061256c565b6105bd91906125c8565b8111156105ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105f690612648565b60405180910390fd5b61064a33827f0000000000000000000000006e3b7aac14cd7832166706d5a9f2497bce114e2b73ffffffffffffffffffffffffffffffffffffffff16611b0a9092919063ffffffff16565b50565b60045481565b60026001541415610699576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610690906126b4565b60405180910390fd5b600260018190555042600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115610723576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161071a90612720565b60405180910390fd5b6000600760008154811061073a57610739612740565b5b906000526020600020906004020190506000600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000816000015490506107a06000611b90565b60006107ea83600101546107dc64e8d4a510006107ce88600301548860000154611c7590919063ffffffff16565b611cf090919063ffffffff16565b611d3a90919063ffffffff16565b9050600081111561088b576107fd610db2565b81111561083f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610836906127e1565b60405180910390fd5b61088a33827f0000000000000000000000006e3b7aac14cd7832166706d5a9f2497bce114e2b73ffffffffffffffffffffffffffffffffffffffff16611b0a9092919063ffffffff16565b5b6000821115610907576000836000018190555081600360008282546108b091906125c8565b9250508190555061090633838660000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611b0a9092919063ffffffff16565b5b61093964e8d4a5100061092b86600301548660000154611c7590919063ffffffff16565b611cf090919063ffffffff16565b83600101819055506000836000015411156109a4576005544261095c9190612801565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506109ea565b6000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b3373ffffffffffffffffffffffffffffffffffffffff167f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a942436483604051610a3091906122c4565b60405180910390a25050505060018081905550565b610a4d611b02565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610ada576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ad190612537565b60405180910390fd5b6000600780549050905060005b81811015610b0957610af881611b90565b80610b0290612857565b9050610ae7565b5050565b610b15611b02565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610ba2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9990612537565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b7f0000000000000000000000006e3b7aac14cd7832166706d5a9f2497bce114e2b81565b610c8c611b02565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610d19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1090612537565b60405180910390fd5b630149d86b6007600081548110610d3357610d32612740565b5b90600052602060002090600402016002015414610d85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7c906128ec565b60405180910390fd5b426007600081548110610d9b57610d9a612740565b5b906000526020600020906004020160020181905550565b60006003547f0000000000000000000000006e3b7aac14cd7832166706d5a9f2497bce114e2b73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610e1091906124bf565b602060405180830381865afa158015610e2d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e51919061256c565b610e5b91906125c8565b905090565b60065481565b610e6e611b02565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610efb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef290612537565b60405180910390fd5b610f056000611b90565b6000600481905550565b60035481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610f46611b02565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610fd3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fca90612537565b60405180910390fd5b601e811115611017576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100e90612958565b60405180910390fd5b8060068190555050565b600080600760008154811061103957611038612740565b5b90600052602060002090600402019050428160020154111561105f5760009150506110a8565b6301e13380606460045460035484600201544261107c91906125c8565b6110869190612978565b6110909190612978565b61109a9190612a01565b6110a49190612a01565b9150505b90565b60026020528060005260406000206000915090505481565b60026001541415611109576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611100906126b4565b60405180910390fd5b60026001819055506000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414156111ab57600554426111679190612801565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b600060076000815481106111c2576111c1612740565b5b906000526020600020906004020190506000600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905061121f6000611b90565b600081600001541115611319576000611276826001015461126864e8d4a5100061125a87600301548760000154611c7590919063ffffffff16565b611cf090919063ffffffff16565b611d3a90919063ffffffff16565b9050600081111561131757611289610db2565b8111156112cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c2906127e1565b60405180910390fd5b61131633827f0000000000000000000000006e3b7aac14cd7832166706d5a9f2497bce114e2b73ffffffffffffffffffffffffffffffffffffffff16611b0a9092919063ffffffff16565b5b505b6000808411156114fb5760008360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161138291906124bf565b602060405180830381865afa15801561139f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113c3919061256c565b90506114163330878760000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611d84909392919063ffffffff16565b808460000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161147491906124bf565b602060405180830381865afa158015611491573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114b5919061256c565b6114bf91906125c8565b91506114d8828460000154611e0d90919063ffffffff16565b836000018190555081600360008282546114f29190612801565b92505081905550505b61152d64e8d4a5100061151f85600301548560000154611c7590919063ffffffff16565b611cf090919063ffffffff16565b82600101819055503373ffffffffffffffffffffffffffffffffffffffff167fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c8560405161157b91906122c4565b60405180910390a25050506001808190555050565b600260015414156115d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115cd906126b4565b60405180910390fd5b6002600181905550600060076000815481106115f5576115f4612740565b5b906000526020600020906004020190506000600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600081600001549050806003600082825461166391906125c8565b9250508190555042600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054106116d8576064600654826116c09190612978565b6116ca9190612a01565b816116d591906125c8565b90505b6000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061176c33828560000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611b0a9092919063ffffffff16565b60008260000181905550600082600101819055503373ffffffffffffffffffffffffffffffffffffffff167f5fafa99d0643513820be26656b45130b01e1c03062e1266bf36f88cbd3bd9695826040516117c691906122c4565b60405180910390a250505060018081905550565b6117e2611b02565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461186f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161186690612537565b60405180910390fd5b61187881611e6b565b50565b600080600760008154811061189357611892612740565b5b906000526020600020906004020190506000600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050630149d86b82600201541415611901576000925050506119eb565b60008260030154905060006003549050836002015442118015611925575060008114155b156119a057600061195e6009546119508760010154611942611021565b611c7590919063ffffffff16565b611cf090919063ffffffff16565b905061199c61198d8361197f64e8d4a5100085611c7590919063ffffffff16565b611cf090919063ffffffff16565b84611e0d90919063ffffffff16565b9250505b6119e483600101546119d664e8d4a510006119c8868860000154611c7590919063ffffffff16565b611cf090919063ffffffff16565b611d3a90919063ffffffff16565b9450505050505b919050565b7f0000000000000000000000006e3b7aac14cd7832166706d5a9f2497bce114e2b81565b611a1c611b02565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611aa9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aa090612537565b60405180910390fd5b612710811115611aee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ae590612a7e565b60405180910390fd5b611af86000611b90565b8060048190555050565b600033905090565b611b8b8363a9059cbb60e01b8484604051602401611b29929190612a9e565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611f98565b505050565b600060078281548110611ba657611ba5612740565b5b9060005260206000209060040201905080600201544211611bc75750611c72565b600060035490506000811415611be7574282600201819055505050611c72565b6000611c1b600954611c0d8560010154611bff611021565b611c7590919063ffffffff16565b611cf090919063ffffffff16565b9050611c5d611c4a83611c3c64e8d4a5100085611c7590919063ffffffff16565b611cf090919063ffffffff16565b8460030154611e0d90919063ffffffff16565b83600301819055504283600201819055505050505b50565b600080831415611c885760009050611cea565b60008284611c969190612978565b9050828482611ca59190612a01565b14611ce5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cdc90612b39565b60405180910390fd5b809150505b92915050565b6000611d3283836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061205f565b905092915050565b6000611d7c83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506120c2565b905092915050565b611e07846323b872dd60e01b858585604051602401611da593929190612b59565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611f98565b50505050565b6000808284611e1c9190612801565b905083811015611e61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5890612bdc565b60405180910390fd5b8091505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611edb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ed290612c6e565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000611ffa826040518060400160405280602081526020017f5361666542455032303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166121269092919063ffffffff16565b905060008151111561205a578080602001905181019061201a9190612cc6565b612059576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161205090612d65565b60405180910390fd5b5b505050565b600080831182906120a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209d9190612e0d565b60405180910390fd5b50600083856120b59190612a01565b9050809150509392505050565b600083831115829061210a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121019190612e0d565b60405180910390fd5b506000838561211991906125c8565b9050809150509392505050565b6060612135848460008561213e565b90509392505050565b606061214985612260565b612188576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161217f90612e7b565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516121b19190612ee2565b60006040518083038185875af1925050503d80600081146121ee576040519150601f19603f3d011682016040523d82523d6000602084013e6121f3565b606091505b50915091508115612208578092505050612258565b60008151111561221b5780518082602001fd5b836040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161224f9190612e0d565b60405180910390fd5b949350505050565b60008060007fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050833f91508082141580156122a257506000801b8214155b92505050919050565b6000819050919050565b6122be816122ab565b82525050565b60006020820190506122d960008301846122b5565b92915050565b600080fd5b6122ed816122ab565b81146122f857600080fd5b50565b60008135905061230a816122e4565b92915050565b600060208284031215612326576123256122df565b5b6000612334848285016122fb565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600061238261237d6123788461233d565b61235d565b61233d565b9050919050565b600061239482612367565b9050919050565b60006123a682612389565b9050919050565b6123b68161239b565b82525050565b60006080820190506123d160008301876123ad565b6123de60208301866122b5565b6123eb60408301856122b5565b6123f860608301846122b5565b95945050505050565b600061240c8261233d565b9050919050565b61241c81612401565b811461242757600080fd5b50565b60008135905061243981612413565b92915050565b600060208284031215612455576124546122df565b5b60006124638482850161242a565b91505092915050565b600060408201905061248160008301856122b5565b61248e60208301846122b5565b9392505050565b60006020820190506124aa60008301846123ad565b92915050565b6124b981612401565b82525050565b60006020820190506124d460008301846124b0565b92915050565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006125216020836124da565b915061252c826124eb565b602082019050919050565b6000602082019050818103600083015261255081612514565b9050919050565b600081519050612566816122e4565b92915050565b600060208284031215612582576125816122df565b5b600061259084828501612557565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006125d3826122ab565b91506125de836122ab565b9250828210156125f1576125f0612599565b5b828203905092915050565b7f6e6f7420656e6f75676820746f6b656e7320746f2074616b65206f7574000000600082015250565b6000612632601d836124da565b915061263d826125fc565b602082019050919050565b6000602082019050818103600083015261266181612625565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b600061269e601f836124da565b91506126a982612668565b602082019050919050565b600060208201905081810360008301526126cd81612691565b9050919050565b7f4d6179206e6f7420646f206e6f726d616c207769746864726177206561726c79600082015250565b600061270a6020836124da565b9150612715826126d4565b602082019050919050565b60006020820190508181036000830152612739816126fd565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f43616e6e6f74207769746864726177206f746865722070656f706c652773207360008201527f74616b656420746f6b656e732e2020436f6e7461637420616e2061646d696e2e602082015250565b60006127cb6040836124da565b91506127d68261276f565b604082019050919050565b600060208201905081810360008301526127fa816127be565b9050919050565b600061280c826122ab565b9150612817836122ab565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561284c5761284b612599565b5b828201905092915050565b6000612862826122ab565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561289557612894612599565b5b600182019050919050565b7f43616e206f6e6c792073746172742072657761726473206f6e63650000000000600082015250565b60006128d6601b836124da565b91506128e1826128a0565b602082019050919050565b60006020820190508181036000830152612905816128c9565b9050919050565b7f4d6179206e6f742073657420686967686572207468616e203330250000000000600082015250565b6000612942601b836124da565b915061294d8261290c565b602082019050919050565b6000602082019050818103600083015261297181612935565b9050919050565b6000612983826122ab565b915061298e836122ab565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156129c7576129c6612599565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612a0c826122ab565b9150612a17836122ab565b925082612a2757612a266129d2565b5b828204905092915050565b7f415059206d7573742062652062656c6f77203130303030250000000000000000600082015250565b6000612a686018836124da565b9150612a7382612a32565b602082019050919050565b60006020820190508181036000830152612a9781612a5b565b9050919050565b6000604082019050612ab360008301856124b0565b612ac060208301846122b5565b9392505050565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008201527f7700000000000000000000000000000000000000000000000000000000000000602082015250565b6000612b236021836124da565b9150612b2e82612ac7565b604082019050919050565b60006020820190508181036000830152612b5281612b16565b9050919050565b6000606082019050612b6e60008301866124b0565b612b7b60208301856124b0565b612b8860408301846122b5565b949350505050565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000600082015250565b6000612bc6601b836124da565b9150612bd182612b90565b602082019050919050565b60006020820190508181036000830152612bf581612bb9565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000612c586026836124da565b9150612c6382612bfc565b604082019050919050565b60006020820190508181036000830152612c8781612c4b565b9050919050565b60008115159050919050565b612ca381612c8e565b8114612cae57600080fd5b50565b600081519050612cc081612c9a565b92915050565b600060208284031215612cdc57612cdb6122df565b5b6000612cea84828501612cb1565b91505092915050565b7f5361666542455032303a204245503230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b6000612d4f602a836124da565b9150612d5a82612cf3565b604082019050919050565b60006020820190508181036000830152612d7e81612d42565b9050919050565b600081519050919050565b60005b83811015612dae578082015181840152602081019050612d93565b83811115612dbd576000848401525b50505050565b6000601f19601f8301169050919050565b6000612ddf82612d85565b612de981856124da565b9350612df9818560208601612d90565b612e0281612dc3565b840191505092915050565b60006020820190508181036000830152612e278184612dd4565b905092915050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b6000612e65601d836124da565b9150612e7082612e2f565b602082019050919050565b60006020820190508181036000830152612e9481612e58565b9050919050565b600081519050919050565b600081905092915050565b6000612ebc82612e9b565b612ec68185612ea6565b9350612ed6818560208601612d90565b80840191505092915050565b6000612eee8284612eb1565b91508190509291505056fea26469706673582212208c755a455647fa06d4d03a5a817e50c4ee202eed58d5535cb52740fc71a856c964736f6c634300080b0033
Deployed Bytecode Sourcemap
24765:8599:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25732:27;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25832:26;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;25915:45;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;32267:256;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25707:18;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30231:1151;;;:::i;:::-;;28667:190;;;:::i;:::-;;2886:140;;;:::i;:::-;;25528:36;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26915:204;;;:::i;:::-;;32848:133;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25766:30;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26816:91;;;:::i;:::-;;25674:26;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2244:79;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33169:192;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32531:309;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25613:52;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28894:1281;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31453:665;;;:::i;:::-;;3181:109;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27184:724;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25571:35;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32989:172;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25732:27;;;;:::o;25832:26::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;25915:45::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;32267:256::-;2466:12;:10;:12::i;:::-;2456:22;;:6;;;;;;;;;;:22;;;2448:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;32405:11:::1;;32366;:21;;;32396:4;32366:36;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:50;;;;:::i;:::-;32355:7;:61;;32347:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;32461:54;32494:10;32507:7;32461:11;:24;;;;:54;;;;;:::i;:::-;32267:256:::0;:::o;25707:18::-;;;;:::o;30231:1151::-;23818:1;24416:7;;:19;;24408:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;23818:1;24549:7;:18;;;;30322:15:::1;30290:16;:28;30307:10;30290:28;;;;;;;;;;;;;;;;:47;;30282:92;;;;;;;;;;;;:::i;:::-;;;;;;;;;30395:21;30419:8;30428:1;30419:11;;;;;;;;:::i;:::-;;;;;;;;;;;;30395:35;;30441:21;30465:8;:20;30474:10;30465:20;;;;;;;;;;;;;;;30441:44;;30498:15;30516:4;:11;;;30498:29;;30538:13;30549:1;30538:10;:13::i;:::-;30562:15;30580:70;30634:4;:15;;;30580:49;30624:4;30580:39;30596:4;:22;;;30580:4;:11;;;:15;;:39;;;;:::i;:::-;:43;;:49;;;;:::i;:::-;:53;;:70;;;;:::i;:::-;30562:88;;30674:1;30664:7;:11;30661:218;;;30711:18;:16;:18::i;:::-;30700:7;:29;;30692:106;;;;;;;;;;;;:::i;:::-;;;;;;;;;30813:54;30846:10;30859:7;30813:11;:24;;;;:54;;;;;:::i;:::-;30661:218;30904:1;30894:7;:11;30891:165;;;30936:1;30922:4;:11;;:15;;;;30967:7;30952:11;;:22;;;;;;;:::i;:::-;;;;;;;;30989:55;31023:10;31036:7;30989:4;:12;;;;;;;;;;;;:25;;;;:55;;;;;:::i;:::-;30891:165;31086:49;31130:4;31086:39;31102:4;:22;;;31086:4;:11;;;:15;;:39;;;;:::i;:::-;:43;;:49;;;;:::i;:::-;31068:4;:15;;:67;;;;31173:1;31159:4;:11;;;:15;31156:172;;;31239:12;;31221:15;:30;;;;:::i;:::-;31190:16;:28;31207:10;31190:28;;;;;;;;;;;;;;;:61;;;;31156:172;;;31315:1;31284:16;:28;31301:10;31284:28;;;;;;;;;;;;;;;:32;;;;31156:172;31354:10;31345:29;;;31366:7;31345:29;;;;;;:::i;:::-;;;;;;;;30271:1111;;;;23774:1:::0;24728:7;:22;;;;30231:1151::o;28667:190::-;2466:12;:10;:12::i;:::-;2456:22;;:6;;;;;;;;;;:22;;;2448:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;28722:14:::1;28739:8;:15;;;;28722:32;;28770:11;28765:85;28793:6;28787:3;:12;28765:85;;;28823:15;28834:3;28823:10;:15::i;:::-;28801:5;;;;:::i;:::-;;;28765:85;;;;28711:146;28667:190::o:0;2886:140::-;2466:12;:10;:12::i;:::-;2456:22;;:6;;;;;;;;;;:22;;;2448:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;2985:1:::1;2948:40;;2969:6;::::0;::::1;;;;;;;;2948:40;;;;;;;;;;;;3016:1;2999:6:::0;::::1;:19;;;;;;;;;;;;;;;;;;2886:140::o:0;25528:36::-;;;:::o;26915:204::-;2466:12;:10;:12::i;:::-;2456:22;;:6;;;;;;;;;;:22;;;2448:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;27011:8:::1;26976;26985:1;26976:11;;;;;;;;:::i;:::-;;;;;;;;;;;;:31;;;:43;26968:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;27096:15;27062:8;27071:1;27062:11;;;;;;;;:::i;:::-;;;;;;;;;;;;:31;;:49;;;;26915:204::o:0;32848:133::-;32897:7;32962:11;;32923;:21;;;32953:4;32923:36;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:50;;;;:::i;:::-;32916:57;;32848:133;:::o;25766:30::-;;;;:::o;26816:91::-;2466:12;:10;:12::i;:::-;2456:22;;:6;;;;;;;;;;:22;;;2448:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;26868:13:::1;26879:1;26868:10;:13::i;:::-;26898:1;26892:3;:7;;;;26816:91::o:0;25674:26::-;;;;:::o;2244:79::-;2282:7;2309:6;;;;;;;;;;;2302:13;;2244:79;:::o;33169:192::-;2466:12;:10;:12::i;:::-;2456:22;;:6;;;;;;;;;;:22;;;2448:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;33276:2:::1;33258:14;:20;;33250:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;33339:14;33321:15;:32;;;;33169:192:::0;:::o;32531:309::-;32583:7;32603:21;32627:8;32636:1;32627:11;;;;;;;;:::i;:::-;;;;;;;;;;;;32603:35;;32679:15;32652:4;:24;;;:42;32649:81;;;32717:1;32710:8;;;;;32649:81;32823:8;32817:3;32811;;32796:11;;32768:4;:24;;;32750:15;:42;;;;:::i;:::-;32749:58;;;;:::i;:::-;32748:66;;;;:::i;:::-;:72;;;;:::i;:::-;:83;;;;:::i;:::-;32740:92;;;32531:309;;:::o;25613:52::-;;;;;;;;;;;;;;;;;:::o;28894:1281::-;23818:1;24416:7;;:19;;24408:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;23818:1;24549:7;:18;;;;28994:1:::1;28962:16;:28;28979:10;28962:28;;;;;;;;;;;;;;;;:33;28959:125;;;29060:12;;29042:15;:30;;;;:::i;:::-;29011:16;:28;29028:10;29011:28;;;;;;;;;;;;;;;:61;;;;28959:125;29094:21;29118:8;29127:1;29118:11;;;;;;;;:::i;:::-;;;;;;;;;;;;29094:35;;29140:21;29164:8;:20;29173:10;29164:20;;;;;;;;;;;;;;;29140:44;;29197:13;29208:1;29197:10;:13::i;:::-;29239:1;29225:4;:11;;;:15;29221:380;;;29257:15;29275:70;29329:4;:15;;;29275:49;29319:4;29275:39;29291:4;:22;;;29275:4;:11;;;:15;;:39;;;;:::i;:::-;:43;;:49;;;;:::i;:::-;:53;;:70;;;;:::i;:::-;29257:88;;29373:1;29363:7;:11;29360:230;;;29414:18;:16;:18::i;:::-;29403:7;:29;;29395:106;;;;;;;;;;;;:::i;:::-;;;;;;;;;29520:54;29553:10;29566:7;29520:11;:24;;;;:54;;;;;:::i;:::-;29360:230;29242:359;29221:380;29611:25;29664:1:::0;29654:7:::1;:11;29651:393;;;29682:22;29707:4;:12;;;;;;;;;;;;:22;;;29738:4;29707:37;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29682:62;;29759:74;29797:10;29818:4;29825:7;29759:4;:12;;;;;;;;;;;;:29;;;;:74;;;;;;:::i;:::-;29908:14;29868:4;:12;;;;;;;;;;;;:22;;;29899:4;29868:37;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:54;;;;:::i;:::-;29848:74;;29951:34;29967:17;29951:4;:11;;;:15;;:34;;;;:::i;:::-;29937:4;:11;;:48;;;;30015:17;30000:11;;:32;;;;;;;:::i;:::-;;;;;;;;29667:377;29651:393;30072:49;30116:4;30072:39;30088:4;:22;;;30072:4;:11;;;:15;;:39;;;;:::i;:::-;:43;;:49;;;;:::i;:::-;30054:4;:15;;:67;;;;30147:10;30139:28;;;30159:7;30139:28;;;;;;:::i;:::-;;;;;;;;28948:1227;;;23774:1:::0;24728:7;:22;;;;28894:1281;:::o;31453:665::-;23818:1;24416:7;;:19;;24408:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;23818:1;24549:7;:18;;;;31515:21:::1;31539:8;31548:1;31539:11;;;;;;;;:::i;:::-;;;;;;;;;;;;31515:35;;31561:21;31585:8;:20;31594:10;31585:20;;;;;;;;;;;;;;;31561:44;;31616:15;31634:4;:11;;;31616:29;;31671:7;31656:11;;:22;;;;;;;:::i;:::-;;;;;;;;31807:15;31775:16;:28;31792:10;31775:28;;;;;;;;;;;;;;;;:47;31772:120;;31877:3;31859:15;;31849:7;:25;;;;:::i;:::-;:31;;;;:::i;:::-;31838:42;;;;;:::i;:::-;;;31772:120;31933:1;31902:16;:28;31919:10;31902:28;;;;;;;;;;;;;;;:32;;;;31945:55;31979:10;31992:7;31945:4;:12;;;;;;;;;;;;:25;;;;:55;;;;;:::i;:::-;32025:1;32011:4;:11;;:15;;;;32055:1;32037:4;:15;;:19;;;;32090:10;32072:38;;;32102:7;32072:38;;;;;;:::i;:::-;;;;;;;;31504:614;;;23774:1:::0;24728:7;:22;;;;31453:665::o;3181:109::-;2466:12;:10;:12::i;:::-;2456:22;;:6;;;;;;;;;;:22;;;2448:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;3254:28:::1;3273:8;3254:18;:28::i;:::-;3181:109:::0;:::o;27184:724::-;27245:7;27265:21;27289:8;27298:1;27289:11;;;;;;;;:::i;:::-;;;;;;;;;;;;27265:35;;27311:21;27335:8;:15;27344:5;27335:15;;;;;;;;;;;;;;;27311:39;;27392:8;27364:4;:24;;;:36;27361:75;;;27423:1;27416:8;;;;;;27361:75;27446:25;27474:4;:22;;;27446:50;;27507:16;27526:11;;27507:30;;27570:4;:24;;;27552:15;:42;:59;;;;;27610:1;27598:8;:13;;27552:59;27548:270;;;27628:19;27650:63;27697:15;;27650:42;27676:4;:15;;;27650:21;:19;:21::i;:::-;:25;;:42;;;;:::i;:::-;:46;;:63;;;;:::i;:::-;27628:85;;27748:58;27770:35;27796:8;27770:21;27786:4;27770:11;:15;;:21;;;;:::i;:::-;:25;;:35;;;;:::i;:::-;27748:17;:21;;:58;;;;:::i;:::-;27728:78;;27613:205;27548:270;27835:65;27884:4;:15;;;27835:44;27874:4;27835:34;27851:17;27835:4;:11;;;:15;;:34;;;;:::i;:::-;:38;;:44;;;;:::i;:::-;:48;;:65;;;;:::i;:::-;27828:72;;;;;;27184:724;;;;:::o;25571:35::-;;;:::o;32989:172::-;2466:12;:10;:12::i;:::-;2456:22;;:6;;;;;;;;;;:22;;;2448:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;33072:5:::1;33062:6;:15;;33054:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;33117:13;33128:1;33117:10;:13::i;:::-;33147:6;33141:3;:12;;;;32989:172:::0;:::o;899:107::-;944:15;987:10;972:26;;899:107;:::o;13285:211::-;13402:86;13422:5;13452:23;;;13477:2;13481:5;13429:58;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13402:19;:86::i;:::-;13285:211;;;:::o;27984:600::-;28038:21;28062:8;28071:4;28062:14;;;;;;;;:::i;:::-;;;;;;;;;;;;28038:38;;28110:4;:24;;;28091:15;:43;28087:82;;28151:7;;;28087:82;28179:16;28198:11;;28179:30;;28236:1;28224:8;:13;28220:109;;;28281:15;28254:4;:24;;:42;;;;28311:7;;;;28220:109;28339:19;28361:63;28408:15;;28361:42;28387:4;:15;;;28361:21;:19;:21::i;:::-;:25;;:42;;;;:::i;:::-;:46;;:63;;;;:::i;:::-;28339:85;;28460:63;28487:35;28513:8;28487:21;28503:4;28487:11;:15;;:21;;;;:::i;:::-;:25;;:35;;;;:::i;:::-;28460:4;:22;;;:26;;:63;;;;:::i;:::-;28435:4;:22;;:88;;;;28561:15;28534:4;:24;;:42;;;;28027:557;;;27984:600;;:::o;5860:471::-;5918:7;6168:1;6163;:6;6159:47;;;6193:1;6186:8;;;;6159:47;6218:9;6234:1;6230;:5;;;;:::i;:::-;6218:17;;6263:1;6258;6254;:5;;;;:::i;:::-;:10;6246:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;6322:1;6315:8;;;5860:471;;;;;:::o;6807:132::-;6865:7;6892:39;6896:1;6899;6892:39;;;;;;;;;;;;;;;;;:3;:39::i;:::-;6885:46;;6807:132;;;;:::o;4936:136::-;4994:7;5021:43;5025:1;5028;5021:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;5014:50;;4936:136;;;;:::o;13504:248::-;13648:96;13668:5;13698:27;;;13727:4;13733:2;13737:5;13675:68;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13648:19;:96::i;:::-;13504:248;;;;:::o;4472:181::-;4530:7;4550:9;4566:1;4562;:5;;;;:::i;:::-;4550:17;;4591:1;4586;:6;;4578:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;4644:1;4637:8;;;4472:181;;;;:::o;3396:229::-;3490:1;3470:22;;:8;:22;;;;3462:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;3580:8;3551:38;;3572:6;;;;;;;;;;3551:38;;;;;;;;;;;;3609:8;3600:6;;:17;;;;;;;;;;;;;;;;;;3396:229;:::o;15820:774::-;16244:23;16270:69;16298:4;16270:69;;;;;;;;;;;;;;;;;16278:5;16270:27;;;;:69;;;;;:::i;:::-;16244:95;;16374:1;16354:10;:17;:21;16350:237;;;16509:10;16498:30;;;;;;;;;;;;:::i;:::-;16490:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;16350:237;15890:704;15820:774;;:::o;7435:312::-;7555:7;7587:1;7583;:5;7590:12;7575:28;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;7614:9;7630:1;7626;:5;;;;:::i;:::-;7614:17;;7738:1;7731:8;;;7435:312;;;;;:::o;5375:226::-;5495:7;5528:1;5523;:6;;5531:12;5515:29;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;5555:9;5571:1;5567;:5;;;;:::i;:::-;5555:17;;5592:1;5585:8;;;5375:226;;;;;:::o;20419:230::-;20556:12;20588:53;20611:6;20619:4;20625:1;20628:12;20588:22;:53::i;:::-;20581:60;;20419:230;;;;;:::o;21907:1020::-;22080:12;22113:18;22124:6;22113:10;:18::i;:::-;22105:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;22239:12;22253:23;22280:6;:11;;22299:8;22309:4;22280:34;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22238:76;;;;22329:7;22325:595;;;22360:10;22353:17;;;;;;22325:595;22494:1;22474:10;:17;:21;22470:439;;;22737:10;22731:17;22798:15;22785:10;22781:2;22777:19;22770:44;22470:439;22880:12;22873:20;;;;;;;;;;;:::i;:::-;;;;;;;;21907:1020;;;;;;;:::o;17282:641::-;17342:4;17604:16;17631:19;17653:66;17631:88;;;;17835:7;17823:20;17811:32;;17884:11;17872:8;:23;;:42;;;;;17911:3;17899:15;;:8;:15;;17872:42;17864:51;;;;17282:641;;;:::o;7:77:1:-;44:7;73:5;62:16;;7:77;;;:::o;90:118::-;177:24;195:5;177:24;:::i;:::-;172:3;165:37;90:118;;:::o;214:222::-;307:4;345:2;334:9;330:18;322:26;;358:71;426:1;415:9;411:17;402:6;358:71;:::i;:::-;214:222;;;;:::o;523:117::-;632:1;629;622:12;769:122;842:24;860:5;842:24;:::i;:::-;835:5;832:35;822:63;;881:1;878;871:12;822:63;769:122;:::o;897:139::-;943:5;981:6;968:20;959:29;;997:33;1024:5;997:33;:::i;:::-;897:139;;;;:::o;1042:329::-;1101:6;1150:2;1138:9;1129:7;1125:23;1121:32;1118:119;;;1156:79;;:::i;:::-;1118:119;1276:1;1301:53;1346:7;1337:6;1326:9;1322:22;1301:53;:::i;:::-;1291:63;;1247:117;1042:329;;;;:::o;1377:126::-;1414:7;1454:42;1447:5;1443:54;1432:65;;1377:126;;;:::o;1509:60::-;1537:3;1558:5;1551:12;;1509:60;;;:::o;1575:142::-;1625:9;1658:53;1676:34;1685:24;1703:5;1685:24;:::i;:::-;1676:34;:::i;:::-;1658:53;:::i;:::-;1645:66;;1575:142;;;:::o;1723:126::-;1773:9;1806:37;1837:5;1806:37;:::i;:::-;1793:50;;1723:126;;;:::o;1855:140::-;1919:9;1952:37;1983:5;1952:37;:::i;:::-;1939:50;;1855:140;;;:::o;2001:159::-;2102:51;2147:5;2102:51;:::i;:::-;2097:3;2090:64;2001:159;;:::o;2166:581::-;2357:4;2395:3;2384:9;2380:19;2372:27;;2409:85;2491:1;2480:9;2476:17;2467:6;2409:85;:::i;:::-;2504:72;2572:2;2561:9;2557:18;2548:6;2504:72;:::i;:::-;2586;2654:2;2643:9;2639:18;2630:6;2586:72;:::i;:::-;2668;2736:2;2725:9;2721:18;2712:6;2668:72;:::i;:::-;2166:581;;;;;;;:::o;2753:96::-;2790:7;2819:24;2837:5;2819:24;:::i;:::-;2808:35;;2753:96;;;:::o;2855:122::-;2928:24;2946:5;2928:24;:::i;:::-;2921:5;2918:35;2908:63;;2967:1;2964;2957:12;2908:63;2855:122;:::o;2983:139::-;3029:5;3067:6;3054:20;3045:29;;3083:33;3110:5;3083:33;:::i;:::-;2983:139;;;;:::o;3128:329::-;3187:6;3236:2;3224:9;3215:7;3211:23;3207:32;3204:119;;;3242:79;;:::i;:::-;3204:119;3362:1;3387:53;3432:7;3423:6;3412:9;3408:22;3387:53;:::i;:::-;3377:63;;3333:117;3128:329;;;;:::o;3463:332::-;3584:4;3622:2;3611:9;3607:18;3599:26;;3635:71;3703:1;3692:9;3688:17;3679:6;3635:71;:::i;:::-;3716:72;3784:2;3773:9;3769:18;3760:6;3716:72;:::i;:::-;3463:332;;;;;:::o;3801:250::-;3908:4;3946:2;3935:9;3931:18;3923:26;;3959:85;4041:1;4030:9;4026:17;4017:6;3959:85;:::i;:::-;3801:250;;;;:::o;4057:118::-;4144:24;4162:5;4144:24;:::i;:::-;4139:3;4132:37;4057:118;;:::o;4181:222::-;4274:4;4312:2;4301:9;4297:18;4289:26;;4325:71;4393:1;4382:9;4378:17;4369:6;4325:71;:::i;:::-;4181:222;;;;:::o;4409:169::-;4493:11;4527:6;4522:3;4515:19;4567:4;4562:3;4558:14;4543:29;;4409:169;;;;:::o;4584:182::-;4724:34;4720:1;4712:6;4708:14;4701:58;4584:182;:::o;4772:366::-;4914:3;4935:67;4999:2;4994:3;4935:67;:::i;:::-;4928:74;;5011:93;5100:3;5011:93;:::i;:::-;5129:2;5124:3;5120:12;5113:19;;4772:366;;;:::o;5144:419::-;5310:4;5348:2;5337:9;5333:18;5325:26;;5397:9;5391:4;5387:20;5383:1;5372:9;5368:17;5361:47;5425:131;5551:4;5425:131;:::i;:::-;5417:139;;5144:419;;;:::o;5569:143::-;5626:5;5657:6;5651:13;5642:22;;5673:33;5700:5;5673:33;:::i;:::-;5569:143;;;;:::o;5718:351::-;5788:6;5837:2;5825:9;5816:7;5812:23;5808:32;5805:119;;;5843:79;;:::i;:::-;5805:119;5963:1;5988:64;6044:7;6035:6;6024:9;6020:22;5988:64;:::i;:::-;5978:74;;5934:128;5718:351;;;;:::o;6075:180::-;6123:77;6120:1;6113:88;6220:4;6217:1;6210:15;6244:4;6241:1;6234:15;6261:191;6301:4;6321:20;6339:1;6321:20;:::i;:::-;6316:25;;6355:20;6373:1;6355:20;:::i;:::-;6350:25;;6394:1;6391;6388:8;6385:34;;;6399:18;;:::i;:::-;6385:34;6444:1;6441;6437:9;6429:17;;6261:191;;;;:::o;6458:179::-;6598:31;6594:1;6586:6;6582:14;6575:55;6458:179;:::o;6643:366::-;6785:3;6806:67;6870:2;6865:3;6806:67;:::i;:::-;6799:74;;6882:93;6971:3;6882:93;:::i;:::-;7000:2;6995:3;6991:12;6984:19;;6643:366;;;:::o;7015:419::-;7181:4;7219:2;7208:9;7204:18;7196:26;;7268:9;7262:4;7258:20;7254:1;7243:9;7239:17;7232:47;7296:131;7422:4;7296:131;:::i;:::-;7288:139;;7015:419;;;:::o;7440:181::-;7580:33;7576:1;7568:6;7564:14;7557:57;7440:181;:::o;7627:366::-;7769:3;7790:67;7854:2;7849:3;7790:67;:::i;:::-;7783:74;;7866:93;7955:3;7866:93;:::i;:::-;7984:2;7979:3;7975:12;7968:19;;7627:366;;;:::o;7999:419::-;8165:4;8203:2;8192:9;8188:18;8180:26;;8252:9;8246:4;8242:20;8238:1;8227:9;8223:17;8216:47;8280:131;8406:4;8280:131;:::i;:::-;8272:139;;7999:419;;;:::o;8424:182::-;8564:34;8560:1;8552:6;8548:14;8541:58;8424:182;:::o;8612:366::-;8754:3;8775:67;8839:2;8834:3;8775:67;:::i;:::-;8768:74;;8851:93;8940:3;8851:93;:::i;:::-;8969:2;8964:3;8960:12;8953:19;;8612:366;;;:::o;8984:419::-;9150:4;9188:2;9177:9;9173:18;9165:26;;9237:9;9231:4;9227:20;9223:1;9212:9;9208:17;9201:47;9265:131;9391:4;9265:131;:::i;:::-;9257:139;;8984:419;;;:::o;9409:180::-;9457:77;9454:1;9447:88;9554:4;9551:1;9544:15;9578:4;9575:1;9568:15;9595:251;9735:34;9731:1;9723:6;9719:14;9712:58;9804:34;9799:2;9791:6;9787:15;9780:59;9595:251;:::o;9852:366::-;9994:3;10015:67;10079:2;10074:3;10015:67;:::i;:::-;10008:74;;10091:93;10180:3;10091:93;:::i;:::-;10209:2;10204:3;10200:12;10193:19;;9852:366;;;:::o;10224:419::-;10390:4;10428:2;10417:9;10413:18;10405:26;;10477:9;10471:4;10467:20;10463:1;10452:9;10448:17;10441:47;10505:131;10631:4;10505:131;:::i;:::-;10497:139;;10224:419;;;:::o;10649:305::-;10689:3;10708:20;10726:1;10708:20;:::i;:::-;10703:25;;10742:20;10760:1;10742:20;:::i;:::-;10737:25;;10896:1;10828:66;10824:74;10821:1;10818:81;10815:107;;;10902:18;;:::i;:::-;10815:107;10946:1;10943;10939:9;10932:16;;10649:305;;;;:::o;10960:233::-;10999:3;11022:24;11040:5;11022:24;:::i;:::-;11013:33;;11068:66;11061:5;11058:77;11055:103;;;11138:18;;:::i;:::-;11055:103;11185:1;11178:5;11174:13;11167:20;;10960:233;;;:::o;11199:177::-;11339:29;11335:1;11327:6;11323:14;11316:53;11199:177;:::o;11382:366::-;11524:3;11545:67;11609:2;11604:3;11545:67;:::i;:::-;11538:74;;11621:93;11710:3;11621:93;:::i;:::-;11739:2;11734:3;11730:12;11723:19;;11382:366;;;:::o;11754:419::-;11920:4;11958:2;11947:9;11943:18;11935:26;;12007:9;12001:4;11997:20;11993:1;11982:9;11978:17;11971:47;12035:131;12161:4;12035:131;:::i;:::-;12027:139;;11754:419;;;:::o;12179:177::-;12319:29;12315:1;12307:6;12303:14;12296:53;12179:177;:::o;12362:366::-;12504:3;12525:67;12589:2;12584:3;12525:67;:::i;:::-;12518:74;;12601:93;12690:3;12601:93;:::i;:::-;12719:2;12714:3;12710:12;12703:19;;12362:366;;;:::o;12734:419::-;12900:4;12938:2;12927:9;12923:18;12915:26;;12987:9;12981:4;12977:20;12973:1;12962:9;12958:17;12951:47;13015:131;13141:4;13015:131;:::i;:::-;13007:139;;12734:419;;;:::o;13159:348::-;13199:7;13222:20;13240:1;13222:20;:::i;:::-;13217:25;;13256:20;13274:1;13256:20;:::i;:::-;13251:25;;13444:1;13376:66;13372:74;13369:1;13366:81;13361:1;13354:9;13347:17;13343:105;13340:131;;;13451:18;;:::i;:::-;13340:131;13499:1;13496;13492:9;13481:20;;13159:348;;;;:::o;13513:180::-;13561:77;13558:1;13551:88;13658:4;13655:1;13648:15;13682:4;13679:1;13672:15;13699:185;13739:1;13756:20;13774:1;13756:20;:::i;:::-;13751:25;;13790:20;13808:1;13790:20;:::i;:::-;13785:25;;13829:1;13819:35;;13834:18;;:::i;:::-;13819:35;13876:1;13873;13869:9;13864:14;;13699:185;;;;:::o;13890:174::-;14030:26;14026:1;14018:6;14014:14;14007:50;13890:174;:::o;14070:366::-;14212:3;14233:67;14297:2;14292:3;14233:67;:::i;:::-;14226:74;;14309:93;14398:3;14309:93;:::i;:::-;14427:2;14422:3;14418:12;14411:19;;14070:366;;;:::o;14442:419::-;14608:4;14646:2;14635:9;14631:18;14623:26;;14695:9;14689:4;14685:20;14681:1;14670:9;14666:17;14659:47;14723:131;14849:4;14723:131;:::i;:::-;14715:139;;14442:419;;;:::o;14867:332::-;14988:4;15026:2;15015:9;15011:18;15003:26;;15039:71;15107:1;15096:9;15092:17;15083:6;15039:71;:::i;:::-;15120:72;15188:2;15177:9;15173:18;15164:6;15120:72;:::i;:::-;14867:332;;;;;:::o;15205:220::-;15345:34;15341:1;15333:6;15329:14;15322:58;15414:3;15409:2;15401:6;15397:15;15390:28;15205:220;:::o;15431:366::-;15573:3;15594:67;15658:2;15653:3;15594:67;:::i;:::-;15587:74;;15670:93;15759:3;15670:93;:::i;:::-;15788:2;15783:3;15779:12;15772:19;;15431:366;;;:::o;15803:419::-;15969:4;16007:2;15996:9;15992:18;15984:26;;16056:9;16050:4;16046:20;16042:1;16031:9;16027:17;16020:47;16084:131;16210:4;16084:131;:::i;:::-;16076:139;;15803:419;;;:::o;16228:442::-;16377:4;16415:2;16404:9;16400:18;16392:26;;16428:71;16496:1;16485:9;16481:17;16472:6;16428:71;:::i;:::-;16509:72;16577:2;16566:9;16562:18;16553:6;16509:72;:::i;:::-;16591;16659:2;16648:9;16644:18;16635:6;16591:72;:::i;:::-;16228:442;;;;;;:::o;16676:177::-;16816:29;16812:1;16804:6;16800:14;16793:53;16676:177;:::o;16859:366::-;17001:3;17022:67;17086:2;17081:3;17022:67;:::i;:::-;17015:74;;17098:93;17187:3;17098:93;:::i;:::-;17216:2;17211:3;17207:12;17200:19;;16859:366;;;:::o;17231:419::-;17397:4;17435:2;17424:9;17420:18;17412:26;;17484:9;17478:4;17474:20;17470:1;17459:9;17455:17;17448:47;17512:131;17638:4;17512:131;:::i;:::-;17504:139;;17231:419;;;:::o;17656:225::-;17796:34;17792:1;17784:6;17780:14;17773:58;17865:8;17860:2;17852:6;17848:15;17841:33;17656:225;:::o;17887:366::-;18029:3;18050:67;18114:2;18109:3;18050:67;:::i;:::-;18043:74;;18126:93;18215:3;18126:93;:::i;:::-;18244:2;18239:3;18235:12;18228:19;;17887:366;;;:::o;18259:419::-;18425:4;18463:2;18452:9;18448:18;18440:26;;18512:9;18506:4;18502:20;18498:1;18487:9;18483:17;18476:47;18540:131;18666:4;18540:131;:::i;:::-;18532:139;;18259:419;;;:::o;18684:90::-;18718:7;18761:5;18754:13;18747:21;18736:32;;18684:90;;;:::o;18780:116::-;18850:21;18865:5;18850:21;:::i;:::-;18843:5;18840:32;18830:60;;18886:1;18883;18876:12;18830:60;18780:116;:::o;18902:137::-;18956:5;18987:6;18981:13;18972:22;;19003:30;19027:5;19003:30;:::i;:::-;18902:137;;;;:::o;19045:345::-;19112:6;19161:2;19149:9;19140:7;19136:23;19132:32;19129:119;;;19167:79;;:::i;:::-;19129:119;19287:1;19312:61;19365:7;19356:6;19345:9;19341:22;19312:61;:::i;:::-;19302:71;;19258:125;19045:345;;;;:::o;19396:229::-;19536:34;19532:1;19524:6;19520:14;19513:58;19605:12;19600:2;19592:6;19588:15;19581:37;19396:229;:::o;19631:366::-;19773:3;19794:67;19858:2;19853:3;19794:67;:::i;:::-;19787:74;;19870:93;19959:3;19870:93;:::i;:::-;19988:2;19983:3;19979:12;19972:19;;19631:366;;;:::o;20003:419::-;20169:4;20207:2;20196:9;20192:18;20184:26;;20256:9;20250:4;20246:20;20242:1;20231:9;20227:17;20220:47;20284:131;20410:4;20284:131;:::i;:::-;20276:139;;20003:419;;;:::o;20428:99::-;20480:6;20514:5;20508:12;20498:22;;20428:99;;;:::o;20533:307::-;20601:1;20611:113;20625:6;20622:1;20619:13;20611:113;;;20710:1;20705:3;20701:11;20695:18;20691:1;20686:3;20682:11;20675:39;20647:2;20644:1;20640:10;20635:15;;20611:113;;;20742:6;20739:1;20736:13;20733:101;;;20822:1;20813:6;20808:3;20804:16;20797:27;20733:101;20582:258;20533:307;;;:::o;20846:102::-;20887:6;20938:2;20934:7;20929:2;20922:5;20918:14;20914:28;20904:38;;20846:102;;;:::o;20954:364::-;21042:3;21070:39;21103:5;21070:39;:::i;:::-;21125:71;21189:6;21184:3;21125:71;:::i;:::-;21118:78;;21205:52;21250:6;21245:3;21238:4;21231:5;21227:16;21205:52;:::i;:::-;21282:29;21304:6;21282:29;:::i;:::-;21277:3;21273:39;21266:46;;21046:272;20954:364;;;;:::o;21324:313::-;21437:4;21475:2;21464:9;21460:18;21452:26;;21524:9;21518:4;21514:20;21510:1;21499:9;21495:17;21488:47;21552:78;21625:4;21616:6;21552:78;:::i;:::-;21544:86;;21324:313;;;;:::o;21643:179::-;21783:31;21779:1;21771:6;21767:14;21760:55;21643:179;:::o;21828:366::-;21970:3;21991:67;22055:2;22050:3;21991:67;:::i;:::-;21984:74;;22067:93;22156:3;22067:93;:::i;:::-;22185:2;22180:3;22176:12;22169:19;;21828:366;;;:::o;22200:419::-;22366:4;22404:2;22393:9;22389:18;22381:26;;22453:9;22447:4;22443:20;22439:1;22428:9;22424:17;22417:47;22481:131;22607:4;22481:131;:::i;:::-;22473:139;;22200:419;;;:::o;22625:98::-;22676:6;22710:5;22704:12;22694:22;;22625:98;;;:::o;22729:147::-;22830:11;22867:3;22852:18;;22729:147;;;;:::o;22882:373::-;22986:3;23014:38;23046:5;23014:38;:::i;:::-;23068:88;23149:6;23144:3;23068:88;:::i;:::-;23061:95;;23165:52;23210:6;23205:3;23198:4;23191:5;23187:16;23165:52;:::i;:::-;23242:6;23237:3;23233:16;23226:23;;22990:265;22882:373;;;;:::o;23261:271::-;23391:3;23413:93;23502:3;23493:6;23413:93;:::i;:::-;23406:100;;23523:3;23516:10;;23261:271;;;;:::o
Swarm Source
ipfs://8c755a455647fa06d4d03a5a817e50c4ee202eed58d5535cb52740fc71a856c9
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 34 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.