Contract Overview
My Name Tag:
Not Available, login to update
[ Download CSV Export ]
Contract Name:
XVMCtimeDeposit
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/** *Submitted for verification at PolygonScan.com on 2022-06-05 */ // File: xvmc-contracts/libs/poolLibraries.sol pragma solidity 0.6.12; //openZeppelin contracts(also used by Pancakeswap). //modified IERC20 and SafeERC20(using transferXVMC instead of standard transferFrom) // File: @openzeppelin/contracts/utils/Context.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. */ abstract contract Context { function _msgSender() internal view virtual returns (address payable) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor () internal { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and make it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // File: @openzeppelin/contracts/math/SafeMath.sol /** * @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, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b > a) return (false, 0); return (true, a - b); } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b == 0) return (false, 0); return (true, a / b); } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b == 0) return (false, 0); return (true, a % b); } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { 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) { require(b <= a, "SafeMath: subtraction overflow"); return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { 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, reverting 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) { require(b > 0, "SafeMath: division by zero"); return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { require(b > 0, "SafeMath: modulo by zero"); return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { require(b <= a, errorMessage); return a - b; } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryDiv}. * * 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); return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { require(b > 0, errorMessage); return a % b; } } // File: @openzeppelin/contracts/token/ERC20/IERC20.sol /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @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); //transfers XVMC without allowance function transferXVMC(address _sender, address _recipient, uint256 _amount) external returns (bool); //returns owner address function owner() external view returns (address); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File: @openzeppelin/contracts/utils/Address.sol /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @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"); require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{value: value}(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) private pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC20/SafeERC20.sol /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using SafeMath for uint256; using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferXVMC.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' // solhint-disable-next-line max-line-length require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender).add(value); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero"); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // File: xvmc-contracts/pools/5year.sol pragma solidity 0.6.12; interface IMasterChef { function deposit(uint256 _pid, uint256 _amount) external; function withdraw(uint256 _pid, uint256 _amount) external; function pendingEgg(uint256 _pid, address _user) external view returns (uint256); function userInfo(uint256 _pid, address _user) external view returns (uint256, uint256); function emergencyWithdraw(uint256 _pid) external; function feeAddress() external view returns (address); function owner() external view returns (address); } interface IacPool { function hopDeposit(uint256 _amount, address _recipientAddress, uint256 previousLastDepositedTime, uint256 _mandatoryTime) external; function getUserShares(address wallet) external view returns (uint256); function getNrOfStakes(address _user) external view returns (uint256); function giftDeposit(uint256 _amount, address _toAddress, uint256 _minToServeInSecs) external; } interface IGovernance { function costToVote() external view returns (uint256); function rebalancePools() external; function getRollBonus(address _bonusForPool) external view returns (uint256); function stakeRolloverBonus(address _toAddress, address _depositToPool, uint256 _bonusToPay, uint256 _stakeID) external; function treasuryWallet() external view returns (address); } interface IVoting { function addCredit(uint256 amount, address _beneficiary) external; } /** * XVMC time-locked deposit * Auto-compounding pool * !!! Warning: !!! Licensed under Business Source License 1.1 (BSL 1.1) */ contract XVMCtimeDeposit is ReentrancyGuard { using SafeERC20 for IERC20; using SafeMath for uint256; struct UserInfo { uint256 shares; // number of shares for a user uint256 lastDepositedTime; // keeps track of deposited time for potential penalty uint256 xvmcAtLastUserAction; // keeps track of XVMC deposited at the last user action uint256 lastUserActionTime; // keeps track of the last user action time uint256 mandatoryTimeToServe; // optional: disables early withdraw } //allows stakes to be transferred, similar to token transfers struct StakeTransfer { uint256 shares; // ALLOWANCE of shares uint256 lastDepositedTime; uint256 mandatoryTimeToServe; } IERC20 public immutable token; // XVMC token IERC20 public immutable oldToken = IERC20(0x6d0c966c8A09e354Df9C48b446A474CE3343D912); IERC20 public immutable dummyToken; IMasterChef public masterchef; // the secret formula they don't want you to know // 5 years = 5 * 365 = 1825 + 1(leap year every 4 years) = 1826 // 1337 + 420 + 69 = 1826 ... 1826 days = exactly 5 years uint256 public immutable withdrawFeePeriod = 1826 days; uint256 public immutable gracePeriod = 21 days; mapping(address => UserInfo[]) public userInfo; mapping(address => uint256) public userVote; //the ID the user is voting for mapping(uint256 => uint256) public totalVotesForID; //total votes for a given ID mapping(address => address) public userDelegate; //user can delegate their voting to another wallet mapping(address => bool) public trustedSender; //Pools with shorter lockup duration(trustedSender(contracts) can transfer into this pool) mapping(address => bool) public trustedPool; //Pools with longer lockup duration(can transfer from this pool into trustedPool(contracts)) mapping(address => mapping(address => StakeTransfer[])) private _stakeAllowances; //similar to token allowances, difference being it's not for amount of tokens, but for a specific stake defined by shares, latdeposittime and mandatorytime uint256 public poolID; uint256 public totalShares; address public admin; //admin = governing contract! address public treasury; //penalties go to this address address public migrationPool; //if pools are to change address public votingCreditAddress; uint256 public minimumGift = 1000000 * 1e18; bool public updateMinGiftGovernor = true; //allows automatic update by anybody to costToVote from governing contract uint256 public callFee = 5; // call fee paid for rebalancing pools bool public allowStakeTransfer = true; //enable/disable transferring of stakes to another wallet bool public allowStakeTransferFrom = false; //allow third party transfers(disabled initially) bool public partialWithdrawals = true; //partial withdrawals from stakes bool public partialTransfers = true; //allows transferring a portion of a stake bool public allowOrigin = true; //(dis)allows tx.origin for voting //safe to use tx.origin IMO. Can be disabled and use msg.sender instead //it allows the voting and delegating in a single transaction for all pools through a proxy contract // Easier to verify (opposed to checking event logs) uint256 public trustedSenderCount; uint256 public trustedPoolCount; event Deposit(address indexed sender, uint256 amount, uint256 shares, uint256 lastDepositedTime); event GiftDeposit(address indexed sender, address indexed recipient, uint256 amount, uint256 shares, uint256 lastDepositedTime); event AddAndExtendStake(address indexed sender, address indexed recipient, uint256 amount, uint256 stakeID, uint256 shares, uint256 lastDepositedTime); event Withdraw(address indexed sender, uint256 amount, uint256 penalty, uint256 shares); event TransferStake(address indexed sender, address indexed recipient, uint256 shares, uint256 stakeID); event HopPool(address indexed sender, uint256 XVMCamount, uint256 shares, address indexed newPool); event MigrateStake(address indexed goodSamaritan, uint256 XVMCamount, uint256 shares, address indexed recipient); event HopDeposit(address indexed recipient, uint256 amount, uint256 shares, uint256 previousLastDepositedTime, uint256 mandatoryTime); event RemoveVotes(address indexed voter, uint256 proposalID, uint256 change); event AddVotes(address indexed voter, uint256 proposalID, uint256 change); event TrustedSender(address contractAddress, bool setting); event TrustedPool(address contractAddress, bool setting); event StakeApproval(address owner, address spender, uint256 allowanceID, uint256 shareAllowance, uint256 lastDeposit, uint256 mandatoryTime); event StakeAllowanceRevoke(address owner, address spender, uint256 allowanceID); event TransferStakeFrom(address _from, address _to, uint256 _stakeID, uint256 _allowanceID); event SetDelegate(address userDelegating, address delegatee); /** * @notice Constructor * @param _token: XVMC token contract * @param _dummyToken: Dummy token contract * @param _masterchef: MasterChef contract * @param _admin: address of the admin * @param _treasury: address of the treasury (collects fees) */ constructor( IERC20 _token, IERC20 _dummyToken, IMasterChef _masterchef, address _admin, address _treasury, uint256 _poolID ) public { token = _token; dummyToken = _dummyToken; masterchef = _masterchef; admin = _admin; treasury = _treasury; poolID = _poolID; IERC20(_dummyToken).safeApprove(address(_masterchef), uint256(-1)); } /** * @notice Checks if the msg.sender is the admin */ modifier adminOnly() { require(msg.sender == admin, "admin: wut?"); _; } /** * @notice Deposits funds into the XVMC time-locked vault * @param _amount: number of tokens to deposit (in XVMC) * * Creates a NEW stake */ function deposit(uint256 _amount) external nonReentrant { require(_amount > 0, "Nothing to deposit"); uint256 pool = balanceOf(); token.safeTransferFrom(msg.sender, address(this), _amount); uint256 currentShares = 0; if (totalShares != 0) { currentShares = (_amount.mul(totalShares)).div(pool); } else { currentShares = _amount; } totalShares = totalShares.add(currentShares); userInfo[msg.sender].push( UserInfo(currentShares, block.timestamp, _amount, block.timestamp, 0) ); uint256 votingFor = userVote[msg.sender]; if(votingFor != 0) { _updateVotingAddDiff(msg.sender, votingFor, currentShares); } emit Deposit(msg.sender, _amount, currentShares, block.timestamp); } /** * Equivalent to Deposit * Instead of crediting the msg.sender, it credits custom recipient * A mechanism to gift a time-locked stake to another wallet * Users can withdraw at any time(but will pay a penalty) * Optionally stake can be irreversibly locked for a minimum period of time(minToServe) */ function giftDeposit(uint256 _amount, address _toAddress, uint256 _minToServeInSecs) external nonReentrant { require(_amount >= minimumGift, "Below Minimum Gift"); uint256 pool = balanceOf(); token.safeTransferFrom(msg.sender, address(this), _amount); uint256 currentShares = 0; if (totalShares != 0) { currentShares = (_amount.mul(totalShares)).div(pool); } else { currentShares = _amount; } totalShares = totalShares.add(currentShares); userInfo[_toAddress].push( UserInfo(currentShares, block.timestamp, _amount, block.timestamp, _minToServeInSecs) ); uint256 votingFor = userVote[_toAddress]; if(votingFor != 0) { _updateVotingAddDiff(_toAddress, votingFor, currentShares); } emit GiftDeposit(msg.sender, _toAddress, _amount, currentShares, block.timestamp); } /** * @notice Deposits funds into the XVMC time-locked vault * @param _amount: number of tokens to deposit (in XVMC) * * Deposits into existing stake, effectively extending the stake * It's used for rolling over stakes by the governor(admin) as well * Mandatory Lock Up period can only be Increased * It can be Decreased if stake is being extended(after it matures) */ function addAndExtendStake(address _recipientAddr, uint256 _amount, uint256 _stakeID, uint256 _lockUpTokensInSeconds) external nonReentrant { require(_amount > 0, "Nothing to deposit"); require(userInfo[_recipientAddr].length > _stakeID, "wrong Stake ID"); if(msg.sender != admin) { require(_recipientAddr == msg.sender, "can only extend your own stake"); } uint256 pool = balanceOf(); token.safeTransferFrom(msg.sender, address(this), _amount); uint256 currentShares = 0; if (totalShares != 0) { currentShares = (_amount.mul(totalShares)).div(pool); } else { currentShares = _amount; } UserInfo storage user = userInfo[_recipientAddr][_stakeID]; user.shares = user.shares.add(currentShares); totalShares = totalShares.add(currentShares); if(_lockUpTokensInSeconds > user.mandatoryTimeToServe || block.timestamp > user.lastDepositedTime.add(withdrawFeePeriod)) { user.mandatoryTimeToServe = _lockUpTokensInSeconds; } user.xvmcAtLastUserAction = user.shares.mul(balanceOf()).div(totalShares); user.lastUserActionTime = block.timestamp; user.lastDepositedTime = block.timestamp; uint256 votingFor = userVote[_recipientAddr]; if(votingFor != 0) { _updateVotingAddDiff(_recipientAddr, votingFor, currentShares); } emit AddAndExtendStake(msg.sender, _recipientAddr, _amount, _stakeID, currentShares, block.timestamp); } function withdrawAll(uint256 _stakeID) external { withdraw(userInfo[msg.sender][_stakeID].shares, _stakeID); } /** * Harvest pending rewards from masterchef * Governor pays the rewards for harvesting and rebalancing */ function harvest() external { IMasterChef(masterchef).withdraw(poolID, 0); } /** * @notice Sets admin address and treasury * If new governor is set, anyone can pay the gas to update the addresses * Masterchef owns the token, the governor owns the Masterchef * Treasury is feeAddress from masterchef(which collects fees from deposits into masterchef) * Currently all penalties are going to fee address(currently governing contract) * Alternatively, fee address can be set as a separate contract, which would re-distribute * The tokens back into pool(so honest stakers would directly receive penalties from prematurely ended stakes) * Alternatively could also split: a portion to honest stakers, a portion into governing contract. * With initial setting, all penalties are going towards governing contract */ function setAdmin() external { admin = IMasterChef(masterchef).owner(); treasury = IMasterChef(masterchef).feeAddress(); } //updates minimum gift to costToVote from Governing contract function updateMinimumGift() external { require(updateMinGiftGovernor, "automatic update disabled"); minimumGift = IGovernance(admin).costToVote(); } /** * @notice Withdraws from funds from the XVMC time-locked vault * @param _shares: Number of shares to withdraw */ function withdraw(uint256 _shares, uint256 _stakeID) public { require(_stakeID < userInfo[msg.sender].length, "invalid stake ID"); UserInfo storage user = userInfo[msg.sender][_stakeID]; require(_shares > 0, "Nothing to withdraw"); require(_shares <= user.shares, "Withdraw amount exceeds balance"); require(block.timestamp > user.lastDepositedTime.add(user.mandatoryTimeToServe), "must serve mandatory time"); if(!partialWithdrawals) { require(_shares == user.shares, "must transfer full stake"); } uint256 currentAmount = (balanceOf().mul(_shares)).div(totalShares); user.shares = user.shares.sub(_shares); totalShares = totalShares.sub(_shares); uint256 currentWithdrawFee = 0; if (block.timestamp < user.lastDepositedTime.add(withdrawFeePeriod)) { uint256 withdrawFee = uint256(8200).sub(((block.timestamp - user.lastDepositedTime).div(86400)).mul(4269).div(1000)); currentWithdrawFee = currentAmount.mul(withdrawFee).div(10000); token.safeTransfer(treasury, currentWithdrawFee); currentAmount = currentAmount.sub(currentWithdrawFee); } else if(block.timestamp > user.lastDepositedTime.add(withdrawFeePeriod).add(gracePeriod)) { uint256 withdrawFee = block.timestamp.sub(user.lastDepositedTime.add(withdrawFeePeriod)).div(86400).mul(4269).div(1000); if(withdrawFee > 8200) { withdrawFee = 8200; } currentWithdrawFee = currentAmount.mul(withdrawFee).div(10000); token.safeTransfer(treasury, currentWithdrawFee); currentAmount = currentAmount.sub(currentWithdrawFee); } if (user.shares > 0) { user.xvmcAtLastUserAction = user.shares.mul(balanceOf().sub(currentAmount)).div(totalShares); user.lastUserActionTime = block.timestamp; } else { _removeStake(msg.sender, _stakeID); //delete the stake } uint256 votingFor = userVote[msg.sender]; if(votingFor != 0) { _updateVotingSubDiff(msg.sender, votingFor, _shares); } emit Withdraw(msg.sender, currentAmount, currentWithdrawFee, _shares); token.safeTransfer(msg.sender, currentAmount); } /** * Users can transfer their stake to another pool * Can only transfer to pool with longer lock-up period(trusted pools) * Equivalent to withdrawing, but it deposits the stake into another pool as hopDeposit * Users can transfer stake without penalty * Time served gets transferred * The pool is "registered" as a "trustedSender" to another pool */ function hopStakeToAnotherPool(uint256 _shares, uint256 _stakeID, address _poolAddress) public { require(_shares > 0, "Nothing to withdraw"); require(_stakeID < userInfo[msg.sender].length, "wrong stake ID"); UserInfo storage user = userInfo[msg.sender][_stakeID]; require(_shares <= user.shares, "Withdraw amount exceeds balance"); if(!partialWithdrawals) { require(_shares == user.shares, "must transfer full stake"); } uint256 _lastDepositedTime = user.lastDepositedTime; if(trustedPool[_poolAddress]) { if(block.timestamp > _lastDepositedTime.add(withdrawFeePeriod).add(gracePeriod)) { _lastDepositedTime = block.timestamp; //if after grace period, resets timer } } else { //can only hop into trusted Pools or into trusted sender(lower pool) after time has been served within grace period //only meant for stakeRollover. After hop, stake is extended and timer reset require(trustedSender[_poolAddress] && block.timestamp > _lastDepositedTime.add(withdrawFeePeriod) && block.timestamp < _lastDepositedTime.add(withdrawFeePeriod).add(gracePeriod), "can only hop into pre-set Pools"); } uint256 currentAmount = (balanceOf().mul(_shares)).div(totalShares); user.shares = user.shares.sub(_shares); totalShares = totalShares.sub(_shares); uint256 votingFor = userVote[msg.sender]; if(votingFor != 0) { _updateVotingSubDiff(msg.sender, votingFor, _shares); } IacPool(_poolAddress).hopDeposit(currentAmount, msg.sender, _lastDepositedTime, user.mandatoryTimeToServe); //_poolAddress can only be trusted pool(contract) if (user.shares > 0) { user.xvmcAtLastUserAction = user.shares.mul(balanceOf()).div(totalShares); user.lastUserActionTime = block.timestamp; } else { _removeStake(msg.sender, _stakeID); //delete the stake } emit HopPool(msg.sender, currentAmount, _shares, _poolAddress); } /** * hopDeposit is equivalent to gift deposit, exception being that the time served can be passed * The msg.sender can only be a trusted contract * The checks are already made in the hopStakeToAnotherPool function * msg sender can only be trusted senders */ function hopDeposit(uint256 _amount, address _recipientAddress, uint256 previousLastDepositedTime, uint256 _mandatoryTime) external { require(trustedSender[msg.sender] || trustedPool[msg.sender], "only trusted senders(other pools)"); //only trustedSenders allowed. TrustedPools are under condition that the stake has matured(hopStake checks condition) uint256 pool = balanceOf(); token.safeTransferFrom(msg.sender, address(this), _amount); uint256 currentShares = 0; if (totalShares != 0) { currentShares = (_amount.mul(totalShares)).div(pool); } else { currentShares = _amount; } totalShares = totalShares.add(currentShares); userInfo[_recipientAddress].push( UserInfo(currentShares, previousLastDepositedTime, _amount, block.timestamp, _mandatoryTime) ); uint256 votingFor = userVote[_recipientAddress]; if(votingFor != 0) { _updateVotingAddDiff(_recipientAddress, votingFor, currentShares); } emit HopDeposit(_recipientAddress, _amount, currentShares, previousLastDepositedTime, _mandatoryTime); } /** * Users are encouraged to keep staking * Governor pays bonuses to re-commit and roll over your stake * Higher bonuses available for hopping into pools with longer lockup period */ function stakeRollover(address _poolInto, uint256 _stakeID) external { require(userInfo[msg.sender].length > _stakeID, "invalid stake ID"); UserInfo storage user = userInfo[msg.sender][_stakeID]; require(block.timestamp > user.lastDepositedTime.add(withdrawFeePeriod), "stake not yet mature"); uint256 currentAmount = (balanceOf().mul(user.shares)).div(totalShares); uint256 toPay = currentAmount.mul(IGovernance(admin).getRollBonus(_poolInto)).div(10000); require(IERC20(token).balanceOf(admin) >= toPay, "governor reserves are currently insufficient"); if(_poolInto == address(this)) { IGovernance(admin).stakeRolloverBonus(msg.sender, _poolInto, toPay, _stakeID); //gov sends tokens to extend the stake } else { hopStakeToAnotherPool(user.shares, _stakeID, _poolInto); //will revert if pool is wrong IGovernance(admin).stakeRolloverBonus(msg.sender, _poolInto, toPay, IacPool(_poolInto).getNrOfStakes(msg.sender) - 1); //extends latest stake } } /** * Transfer stake to another account(another wallet address) */ function transferStakeToAnotherWallet(uint256 _shares, uint256 _stakeID, address _recipientAddress) external { require(allowStakeTransfer, "transfers disabled"); require(_recipientAddress != msg.sender, "can't transfer to self"); require(_stakeID < userInfo[msg.sender].length, "wrong stake ID"); UserInfo storage user = userInfo[msg.sender][_stakeID]; uint256 _tokensTransferred = _shares.mul(balanceOf()).div(totalShares); require(_tokensTransferred >= minimumGift, "Below minimum threshold"); require(_shares <= user.shares, "Withdraw amount exceeds balance"); if(!partialTransfers) { require(_shares == user.shares, "must transfer full stake"); } user.shares = user.shares.sub(_shares); uint256 votingFor = userVote[msg.sender]; if(votingFor != 0) { _updateVotingSubDiff(msg.sender, votingFor, _shares); } votingFor = userVote[_recipientAddress]; if(votingFor != 0) { _updateVotingAddDiff(_recipientAddress, votingFor, _shares); } userInfo[_recipientAddress].push( UserInfo(_shares, user.lastDepositedTime, _tokensTransferred, block.timestamp, user.mandatoryTimeToServe) ); if (user.shares > 0) { user.xvmcAtLastUserAction = user.shares.mul(balanceOf()).div(totalShares); user.lastUserActionTime = block.timestamp; } else { _removeStake(msg.sender, _stakeID); //delete the stake } emit TransferStake(msg.sender, _recipientAddress, _shares, _stakeID); } /** * user delegates their shares to cast a vote on a proposal * casting to proposal ID = 0 is basically neutral position (not voting) * Is origin is allowed, proxy contract can be used to vote in all pools in a single tx */ function voteForProposal(uint256 proposalID) external { address _wallet; allowOrigin ? _wallet = tx.origin : _wallet = msg.sender; uint256 votingFor = userVote[_wallet]; //the ID the user is voting for(before change) if(proposalID != votingFor) { // do nothing if false(already voting for that ID) uint256 userTotalShares = getUserTotalShares(_wallet); if(userTotalShares > 0) { //if false, no shares, thus just assign proposal ID to userVote if(proposalID != 0) { // Allocates vote to an ID if(votingFor == 0) { //starts voting, adds votes _updateVotingAddDiff(_wallet, proposalID, userTotalShares); } else { //removes from previous vote, adds to new _updateVotingSubDiff(_wallet, votingFor, userTotalShares); _updateVotingAddDiff(_wallet, proposalID, userTotalShares); } } else { //stops voting (previously voted, now going into neutral (=0) _updateVotingSubDiff(_wallet, votingFor, userTotalShares); } } userVote[_wallet] = proposalID; } } /* * delegatee can vote with shares of another user */ function delegateeVote(address[] calldata votingAddress, uint256 proposalID) external { for(uint256 i = 0; i < votingAddress.length; i++) { if(userDelegate[votingAddress[i]] == msg.sender) { uint256 votingFor = userVote[votingAddress[i]]; //the ID the user is voting for(before change) if(proposalID != votingFor){ uint256 userTotalShares = getUserTotalShares(votingAddress[i]); if(userTotalShares > 0) { if(proposalID != 0) { if(votingFor == 0) { _updateVotingAddDiff(votingAddress[i], proposalID, userTotalShares); } else { _updateVotingSubDiff(votingAddress[i], votingFor, userTotalShares); _updateVotingAddDiff(votingAddress[i], proposalID, userTotalShares); } } else { _updateVotingSubDiff(votingAddress[i], votingFor, userTotalShares); } } userVote[votingAddress[i]] = proposalID; } } } } /** * Users can delegate their shares */ function setDelegate(address _delegate) external { address _wallet; allowOrigin ? _wallet=tx.origin : _wallet=msg.sender; userDelegate[_wallet] = _delegate; emit SetDelegate(_wallet, _delegate); } //allows third party stake transfer(stake IDs can be changed, so instead of being identified through ID, it's identified by shares, lastdeposit and mandatory time function giveStakeAllowance(address spender, uint256 _stakeID) external { UserInfo storage user = userInfo[msg.sender][_stakeID]; require(user.shares.mul(balanceOf()).div(totalShares) >= minimumGift, "below minimum threshold"); uint256 _allowanceID = _stakeAllowances[msg.sender][spender].length; _stakeAllowances[msg.sender][spender].push( StakeTransfer(user.shares, user.lastDepositedTime, user.mandatoryTimeToServe) ); emit StakeApproval(msg.sender, spender, _allowanceID, user.shares, user.lastDepositedTime, user.mandatoryTimeToServe); } //Note: allowanceID (and not ID of the stake!) function revokeStakeAllowance(address spender, uint256 allowanceID) external { StakeTransfer[] storage allowances = _stakeAllowances[msg.sender][spender]; uint256 lastAllowanceID = allowances.length.sub(1); if(allowanceID != lastAllowanceID) { allowances[allowanceID] = allowances[lastAllowanceID]; } allowances.pop(); emit StakeAllowanceRevoke(msg.sender, spender, allowanceID); } function nrOfstakeAllowances(address owner, address spender) public view returns (uint256) { return _stakeAllowances[owner][spender].length; } function stakeAllowances(address owner, address spender, uint256 allowanceID) public view returns (uint256, uint256, uint256) { StakeTransfer storage stakeStore = _stakeAllowances[owner][spender][allowanceID]; return (stakeStore.shares, stakeStore.lastDepositedTime, stakeStore.mandatoryTimeToServe); } /** * A third party can transfer the stake(allowance required) * Allows smart contract inter-operability similar to how regular tokens work * Can only transfer full stake (You can split the stake through other methods) * Bad: makes illiquid stakes liquid * I think best is to have the option, but leave it unavailable unless desired */ function transferStakeFrom(address _from, uint256 _stakeID, uint256 allowanceID, address _to) external returns (bool) { require(allowStakeTransferFrom, "third party stake transfers disabled"); require(_from != _to, "can't transfer to self"); require(_stakeID < userInfo[_from].length, "wrong stake ID"); UserInfo storage user = userInfo[_from][_stakeID]; (uint256 _shares, uint256 _lastDeposit, uint256 _mandatoryTime) = stakeAllowances(_from, msg.sender, allowanceID); //since stake ID can change, the stake to transfer is identified through number of shares, last deposit and mandatory time //checks if stake allowance(for allowanceID) matches the actual stake of a user require(_shares == user.shares, "incorrect stake or allowance"); require(_lastDeposit == user.lastDepositedTime, "incorrect stake or allowance"); require(_mandatoryTime == user.mandatoryTimeToServe, "incorrect stake or allowance"); uint256 votingFor = userVote[_from]; if(votingFor != 0) { _updateVotingSubDiff(_from, votingFor, _shares); } votingFor = userVote[_to]; if(votingFor != 0) { _updateVotingAddDiff(_to, votingFor, _shares); } _removeStake(_from, _stakeID); //transfer from must transfer full stake _revokeStakeAllowance(_from, allowanceID); userInfo[_to].push( UserInfo(_shares, _lastDeposit, _shares.mul(balanceOf()).div(totalShares), block.timestamp, _mandatoryTime) ); emit TransferStakeFrom(_from, _to, _stakeID, allowanceID); return true; } /** * Ability to withdraw tokens from the stake, and add voting credit * At the time of launch there is no option(voting with credit), but can be added later on */ function votingCredit(uint256 _shares, uint256 _stakeID) public { require(votingCreditAddress != address(0), "disabled"); require(_stakeID < userInfo[msg.sender].length, "invalid stake ID"); UserInfo storage user = userInfo[msg.sender][_stakeID]; require(_shares > 0, "Nothing to withdraw"); require(_shares <= user.shares, "Withdraw amount exceeds balance"); uint256 currentAmount = (balanceOf().mul(_shares)).div(totalShares); user.shares = user.shares.sub(_shares); totalShares = totalShares.sub(_shares); if (user.shares > 0) { user.xvmcAtLastUserAction = user.shares.mul(balanceOf().sub(currentAmount)).div(totalShares); user.lastUserActionTime = block.timestamp; } else { _removeStake(msg.sender, _stakeID); //delete the stake } uint256 votingFor = userVote[msg.sender]; if(votingFor != 0) { _updateVotingSubDiff(msg.sender, votingFor, _shares); } emit Withdraw(votingCreditAddress, currentAmount, 0, _shares); token.safeTransfer(votingCreditAddress, currentAmount); IVoting(votingCreditAddress).addCredit(currentAmount, msg.sender); //in the votingCreditAddress regulate how much is credited, depending on where it's coming from (msg.sender) } /** * Allows the pools to be changed to new contracts * if migration Pool is set * anyone can be a "good Samaritan" * and transfer the stake of another user to the new pool */ function migrateStake(address _staker, uint256 _stakeID) public { require(migrationPool != address(0), "migration not activated"); require(_stakeID < userInfo[_staker].length, "invalid stake ID"); UserInfo storage user = userInfo[_staker][_stakeID]; require(user.shares > 0, "no balance"); uint256 currentAmount = (balanceOf().mul(user.shares)).div(totalShares); totalShares = totalShares.sub(user.shares); user.shares = 0; // equivalent to deleting the stake. Pools are no longer to be used, //setting user shares to 0 is sufficient IacPool(migrationPool).hopDeposit(currentAmount, _staker, user.lastDepositedTime, user.mandatoryTimeToServe); emit MigrateStake(msg.sender, currentAmount, user.shares, _staker); } /** * loop and migrate all user stakes * could run out of gas if too many stakes */ function migrateAllStakes(address _staker) external { UserInfo[] storage user = userInfo[_staker]; uint256 userStakes = user.length; for(uint256 i=0; i < userStakes; i++) { migrateStake(_staker, i); } } /** * Returns number of stakes for a user */ function getNrOfStakes(address _user) external view returns (uint256) { return userInfo[_user].length; } /** * Returns all shares for a user */ function getUserTotalShares(address _user) public view returns (uint256) { UserInfo[] storage _stake = userInfo[_user]; uint256 nrOfUserStakes = _stake.length; uint256 countShares = 0; for(uint256 i=0; i < nrOfUserStakes; i++) { countShares += _stake[i].shares; } return countShares; } /** * @notice Calculates the expected harvest reward from third party * @return Expected reward to collect in XVMC */ function calculateHarvestXVMCRewards() external view returns (uint256) { uint256 amount = IMasterChef(masterchef).pendingEgg(poolID, address(this)); uint256 currentCallFee = amount.mul(callFee).div(10000); return currentCallFee; } /** * @return Returns total pending xvmc rewards */ function calculateTotalPendingXVMCRewards() external view returns (uint256) { uint256 amount = IMasterChef(masterchef).pendingEgg(poolID, address(this)); return amount; } /** * @notice Calculates the price per share */ function getPricePerFullShare() external view returns (uint256) { return totalShares == 0 ? 1e18 : balanceOf().mul(1e18).div(totalShares); } /** * @notice returns number of shares for a certain stake of an user */ function getUserShares(address _wallet, uint256 _stakeID) public view returns (uint256) { return userInfo[_wallet][_stakeID].shares; } /** * @notice Calculates the total underlying tokens * @dev It includes tokens held by the contract and held in MasterChef */ function balanceOf() public view returns (uint256) { uint256 amount = IMasterChef(masterchef).pendingEgg(poolID, address(this)); return token.balanceOf(address(this)).add(amount); } //enables or disables ability to draw stake from another wallet(allowance required) function enableDisableStakeTransferFrom(bool _setting) external adminOnly { allowStakeTransferFrom = _setting; } /** * @notice Sets call fee * @dev Only callable by the contract admin. */ function setCallFee(uint256 _callFee) external adminOnly { callFee = _callFee; } /* * set trusted senders, other pools that we can receive from (that can hopDeposit) * guaranteed to be trusted (they rely lastDepositTime) */ function setTrustedSender(address _sender, bool _setting) external adminOnly { if(trustedSender[_sender] != _setting) { trustedSender[_sender] = _setting; _setting ? trustedSenderCount++ : trustedSenderCount--; emit TrustedSender(_sender, _setting); } } /** * set trusted pools, the smart contracts that we can send the tokens to without penalty * NOTICE: new pool must be set as trusted contract(to be able to draw balance without allowance) */ function setTrustedPool(address _pool, bool _setting) external adminOnly { if(trustedPool[_pool] != _setting) { trustedPool[_pool] = _setting; _setting ? trustedPoolCount++ : trustedPoolCount--; emit TrustedPool(_pool, _setting); } } /** * set address of new pool that we can migrate into * !!! NOTICE !!! * new pool must be set as trusted contract in the token contract by the governor(to be able to draw balance without allowance) */ function setMigrationPool(address _newPool) external adminOnly { migrationPool = _newPool; } /** * Enable or disable partial withdrawals from stakes */ function modifyPartialWithdrawals(bool _decision) external adminOnly { partialWithdrawals = _decision; } function modifyPartialTransfers(bool _decision) external adminOnly { partialTransfers = _decision; } function enableDisableStakeTransfer(bool _setting) external adminOnly { allowStakeTransfer = _setting; } /** * @notice Withdraws from MasterChef to Vault without caring about rewards. * @dev EMERGENCY ONLY. Only callable by the contract admin. */ function emergencyWithdraw() external adminOnly { IMasterChef(masterchef).emergencyWithdraw(poolID); token.safeTransfer(admin, token.balanceOf(address(this))); } /* * Unlikely, but Masterchef can be changed if needed to be used without changing pools * masterchef = IMasterChef(token.owner()); * Must stop earning first(withdraw tokens from old chef) */ function setMasterChefAddress(IMasterChef _masterchef, uint256 _newPoolID) external adminOnly { masterchef = _masterchef; poolID = _newPoolID; //in case pool ID changes uint256 _dummyAllowance = IERC20(dummyToken).allowance(address(this), address(masterchef)); if(_dummyAllowance == 0) { IERC20(dummyToken).safeApprove(address(_masterchef), type(uint256).max); } } /** * When contract is launched, dummyToken shall be deposited to start earning rewards */ function startEarning() external adminOnly { IMasterChef(masterchef).deposit(poolID, dummyToken.balanceOf(address(this))); } /** * Dummy token can be withdrawn if ever needed(allows for flexibility) */ function stopEarning(uint256 _withdrawAmount) external adminOnly { if(_withdrawAmount == 0) { IMasterChef(masterchef).withdraw(poolID, dummyToken.balanceOf(address(masterchef))); } else { IMasterChef(masterchef).withdraw(poolID, _withdrawAmount); } } /** * Withdraws dummyToken to owner(who can burn it if needed) */ function withdrawDummy(uint256 _amount) external adminOnly { if(_amount == 0) { dummyToken.safeTransfer(admin, dummyToken.balanceOf(address(this))); } else { dummyToken.safeTransfer(admin, _amount); } } function allowTxOrigin(bool _setting) external adminOnly { allowOrigin = _setting; } //sets minimum amount(for sending gift, transferring to another wallet,...) //if setting is enabled, minimumGift can be auto-updated to costToVote from governor by anybody function setMinimumGiftDeposit(uint256 _amount, bool _setting) external adminOnly { minimumGift = _amount; updateMinGiftGovernor = _setting; } function regulateVotingCredit(address _newAddress) external adminOnly { votingCreditAddress = _newAddress; } /** * option to withdraw wrongfully sent tokens(but requires change of the governing contract to do so) * If you send wrong tokens to the contract address, consider them lost. Though there is possibility of recovery */ function withdrawStuckTokens(address _tokenAddress) external adminOnly { require(_tokenAddress != address(token), "wrong token"); require(_tokenAddress != address(dummyToken), "wrong token"); IERC20(_tokenAddress).safeTransfer(IGovernance(admin).treasuryWallet(), IERC20(_tokenAddress).balanceOf(address(this))); } //Note: allowanceID (and not ID of the stake!) function _revokeStakeAllowance(address owner, uint256 allowanceID) private { StakeTransfer[] storage allowances = _stakeAllowances[owner][msg.sender]; uint256 lastAllowanceID = allowances.length.sub(1); if(allowanceID != lastAllowanceID) { allowances[allowanceID] = allowances[lastAllowanceID]; } allowances.pop(); emit StakeAllowanceRevoke(owner, msg.sender, allowanceID); } /** * updates votes(whenever there is transfer of funds) */ function _updateVotingAddDiff(address voter, uint256 proposalID, uint256 diff) private { totalVotesForID[proposalID] = totalVotesForID[proposalID].add(diff); emit AddVotes(voter, proposalID, diff); } function _updateVotingSubDiff(address voter, uint256 proposalID, uint256 diff) private { totalVotesForID[proposalID] = totalVotesForID[proposalID].sub(diff); emit RemoveVotes(voter, proposalID, diff); } /** * removes the stake */ function _removeStake(address _staker, uint256 _stakeID) private { UserInfo[] storage stakes = userInfo[_staker]; uint256 lastStakeID = stakes.length - 1; if(_stakeID != lastStakeID) { stakes[_stakeID] = stakes[lastStakeID]; } stakes.pop(); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"contract IERC20","name":"_token","type":"address"},{"internalType":"contract IERC20","name":"_dummyToken","type":"address"},{"internalType":"contract IMasterChef","name":"_masterchef","type":"address"},{"internalType":"address","name":"_admin","type":"address"},{"internalType":"address","name":"_treasury","type":"address"},{"internalType":"uint256","name":"_poolID","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"stakeID","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lastDepositedTime","type":"uint256"}],"name":"AddAndExtendStake","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"voter","type":"address"},{"indexed":false,"internalType":"uint256","name":"proposalID","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"change","type":"uint256"}],"name":"AddVotes","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lastDepositedTime","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lastDepositedTime","type":"uint256"}],"name":"GiftDeposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"previousLastDepositedTime","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"mandatoryTime","type":"uint256"}],"name":"HopDeposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"XVMCamount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"},{"indexed":true,"internalType":"address","name":"newPool","type":"address"}],"name":"HopPool","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"goodSamaritan","type":"address"},{"indexed":false,"internalType":"uint256","name":"XVMCamount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"}],"name":"MigrateStake","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"voter","type":"address"},{"indexed":false,"internalType":"uint256","name":"proposalID","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"change","type":"uint256"}],"name":"RemoveVotes","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"userDelegating","type":"address"},{"indexed":false,"internalType":"address","name":"delegatee","type":"address"}],"name":"SetDelegate","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"allowanceID","type":"uint256"}],"name":"StakeAllowanceRevoke","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"allowanceID","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"shareAllowance","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lastDeposit","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"mandatoryTime","type":"uint256"}],"name":"StakeApproval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"stakeID","type":"uint256"}],"name":"TransferStake","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_from","type":"address"},{"indexed":false,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_stakeID","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_allowanceID","type":"uint256"}],"name":"TransferStakeFrom","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"contractAddress","type":"address"},{"indexed":false,"internalType":"bool","name":"setting","type":"bool"}],"name":"TrustedPool","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"contractAddress","type":"address"},{"indexed":false,"internalType":"bool","name":"setting","type":"bool"}],"name":"TrustedSender","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"penalty","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[{"internalType":"address","name":"_recipientAddr","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_stakeID","type":"uint256"},{"internalType":"uint256","name":"_lockUpTokensInSeconds","type":"uint256"}],"name":"addAndExtendStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"allowOrigin","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"allowStakeTransfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"allowStakeTransferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_setting","type":"bool"}],"name":"allowTxOrigin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"calculateHarvestXVMCRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"calculateTotalPendingXVMCRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"callFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"votingAddress","type":"address[]"},{"internalType":"uint256","name":"proposalID","type":"uint256"}],"name":"delegateeVote","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"dummyToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_setting","type":"bool"}],"name":"enableDisableStakeTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_setting","type":"bool"}],"name":"enableDisableStakeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"getNrOfStakes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPricePerFullShare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_wallet","type":"address"},{"internalType":"uint256","name":"_stakeID","type":"uint256"}],"name":"getUserShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"getUserTotalShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_toAddress","type":"address"},{"internalType":"uint256","name":"_minToServeInSecs","type":"uint256"}],"name":"giftDeposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"_stakeID","type":"uint256"}],"name":"giveStakeAllowance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"gracePeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"harvest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_recipientAddress","type":"address"},{"internalType":"uint256","name":"previousLastDepositedTime","type":"uint256"},{"internalType":"uint256","name":"_mandatoryTime","type":"uint256"}],"name":"hopDeposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_shares","type":"uint256"},{"internalType":"uint256","name":"_stakeID","type":"uint256"},{"internalType":"address","name":"_poolAddress","type":"address"}],"name":"hopStakeToAnotherPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"masterchef","outputs":[{"internalType":"contract IMasterChef","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_staker","type":"address"}],"name":"migrateAllStakes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_staker","type":"address"},{"internalType":"uint256","name":"_stakeID","type":"uint256"}],"name":"migrateStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"migrationPool","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minimumGift","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_decision","type":"bool"}],"name":"modifyPartialTransfers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_decision","type":"bool"}],"name":"modifyPartialWithdrawals","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"nrOfstakeAllowances","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"oldToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"partialTransfers","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"partialWithdrawals","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_newAddress","type":"address"}],"name":"regulateVotingCredit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowanceID","type":"uint256"}],"name":"revokeStakeAllowance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_callFee","type":"uint256"}],"name":"setCallFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_delegate","type":"address"}],"name":"setDelegate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IMasterChef","name":"_masterchef","type":"address"},{"internalType":"uint256","name":"_newPoolID","type":"uint256"}],"name":"setMasterChefAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newPool","type":"address"}],"name":"setMigrationPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bool","name":"_setting","type":"bool"}],"name":"setMinimumGiftDeposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_pool","type":"address"},{"internalType":"bool","name":"_setting","type":"bool"}],"name":"setTrustedPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_sender","type":"address"},{"internalType":"bool","name":"_setting","type":"bool"}],"name":"setTrustedSender","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowanceID","type":"uint256"}],"name":"stakeAllowances","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_poolInto","type":"address"},{"internalType":"uint256","name":"_stakeID","type":"uint256"}],"name":"stakeRollover","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startEarning","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_withdrawAmount","type":"uint256"}],"name":"stopEarning","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"totalVotesForID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"uint256","name":"_stakeID","type":"uint256"},{"internalType":"uint256","name":"allowanceID","type":"uint256"},{"internalType":"address","name":"_to","type":"address"}],"name":"transferStakeFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_shares","type":"uint256"},{"internalType":"uint256","name":"_stakeID","type":"uint256"},{"internalType":"address","name":"_recipientAddress","type":"address"}],"name":"transferStakeToAnotherWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasury","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"trustedPool","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"trustedPoolCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"trustedSender","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"trustedSenderCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"updateMinGiftGovernor","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"updateMinimumGift","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userDelegate","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"userInfo","outputs":[{"internalType":"uint256","name":"shares","type":"uint256"},{"internalType":"uint256","name":"lastDepositedTime","type":"uint256"},{"internalType":"uint256","name":"xvmcAtLastUserAction","type":"uint256"},{"internalType":"uint256","name":"lastUserActionTime","type":"uint256"},{"internalType":"uint256","name":"mandatoryTimeToServe","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userVote","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalID","type":"uint256"}],"name":"voteForProposal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_shares","type":"uint256"},{"internalType":"uint256","name":"_stakeID","type":"uint256"}],"name":"votingCredit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"votingCreditAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_shares","type":"uint256"},{"internalType":"uint256","name":"_stakeID","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stakeID","type":"uint256"}],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawDummy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawFeePeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"}],"name":"withdrawStuckTokens","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6101206040527f6d0c966c8a09e354df9c48b446a474ce3343d91200000000000000000000000060a052630967530060e052621baf806101005269d3c21bcecceda1000000600f5560108054600160ff1991821681179092556005601155601280546401000000006301000000620100009290941690941762ffff0019161763ff00000019169190911760ff60201b1916919091179055348015620000a357600080fd5b5060405162005eb238038062005eb2833981810160405260c0811015620000c957600080fd5b508051602080830151604084015160608086015160808088015160a090980151600160008190556001600160601b031989861b81169093529386901b90911660c05282546001600160a01b038086166001600160a01b031992831617909455600b8054858516908316179055600c8054858b16921691909117905560098190559596939592949093929162000171919087169086906000199062004d7a6200017d821b17901c565b50505050505062000590565b80158062000207575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b158015620001d757600080fd5b505afa158015620001ec573d6000803e3d6000fd5b505050506040513d60208110156200020357600080fd5b5051155b620002445760405162461bcd60e51b815260040180806020018281038252603681526020018062005e7c6036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b179091526200029c918591620002a116565b505050565b6060620002fd826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166200035d60201b62004e8d179092919060201c565b8051909150156200029c578080602001905160208110156200031e57600080fd5b50516200029c5760405162461bcd60e51b815260040180806020018281038252602a81526020018062005e52602a913960400191505060405180910390fd5b60606200036e848460008562000378565b90505b9392505050565b606082471015620003bb5760405162461bcd60e51b815260040180806020018281038252602681526020018062005e2c6026913960400191505060405180910390fd5b620003c685620004e0565b62000418576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b60208310620004595780518252601f19909201916020918201910162000438565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114620004bd576040519150601f19603f3d011682016040523d82523d6000602084013e620004c2565b606091505b509092509050620004d5828286620004e6565b979650505050505050565b3b151590565b60608315620004f757508162000371565b825115620005085782518084602001fd5b8160405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015620005545781810151838201526020016200053a565b50505050905090810190601f168015620005825780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b60805160601c60a05160601c60c05160601c60e051610100516157b36200067960003980610f3e5280610ff85280611e585280612e9d525080610f635280610fc5528061101d5280611d915280611e7c5280611ed2528061363152806139ab5280614c2e52508061132452806113a352806113e052806124aa52806126b95280612a0c5280612a945280612f3d52806144a152508061339f525080611e185280611f40528061202c528061233c528061257b5280612b7f528061356552806137de5280613afa528061442c52806149235280614b375280614bb65280614d5852506157b36000f3fe608060405234801561001057600080fd5b50600436106104495760003560e01c806390321e1a11610241578063ca208adb1161013b578063ddd9d045116100c3578063e89bfdab11610087578063e89bfdab14610ca4578063f5ba1c8714610cac578063f851a44014610cd2578063fb1db27814610cda578063fc0c546a14610ce257610449565b8063ddd9d04514610c25578063ded6275e14610c51578063df10b4e614610c59578063e56d607d14610c61578063e5ea69ff14610c7e57610449565b8063d693f8341161010a578063d693f83414610b8f578063d6d3774b14610bb5578063d6fe340514610bd8578063d71a4bc214610bf7578063db2e21bc14610c1d57610449565b8063ca208adb14610af6578063ca5eb5e114610b24578063cb96372814610b4a578063cc7c7dec14610b7057610449565b8063b330fc53116101c9578063ba1797871161018d578063ba179787146109f6578063bbb224f014610a66578063bdcd9c8014610a6e578063be50baa914610a9a578063c721308f14610aee57610449565b8063b330fc5314610947578063b3f5f6551461096d578063b6b55f25146109a5578063b7cdbed3146109c2578063b949103b146109ee57610449565b8063a06db7dc11610210578063a06db7dc146108f5578063a36e40fc146108fd578063a56924bd14610905578063aaa9603a1461090d578063b31c710a1461093f57610449565b806390321e1a146108a9578063955afa6c146108b1578063958e2d31146108b95780639f6a9283146108d657610449565b80633b500bcb1161035257806364f5c072116102da578063800b2f341161029e578063800b2f34146107e95780638482b20214610815578063859f267f146108415780638d934485146108735780638ffdce691461087b57610449565b806364f5c072146107ac57806367479ec5146107b4578063722713f7146107bc57806377c7b8fc146107c45780637eb3f084146107cc57610449565b8063527cc2f111610321578063527cc2f1146106df57806352d816471461070b57806359a8fd981461072a57806361d027b314610750578063626718971461077457610449565b80633b500bcb146106545780633f6ba4151461068e578063441a3e70146106b45780634641257d146106d757610449565b806321ce919d116103d55780632cae2096116103a45780632cae2096146106065780632e8ba0391461060e578063341d609f14610616578063343d927e146106445780633a98ef391461064c57610449565b806321ce919d14610582578063221665e5146105d957806325c6ea1f146105e157806326465826146105e957610449565b8063159ad8cd1161041c578063159ad8cd146104e45780631718e21114610501578063174628d11461051b578063182c1da1146105555780631de8e5921461055d57610449565b8063045c6ce01461044e578063062d5ed41461046d5780630b799acf1461049f5780630cf57ace146104be575b600080fd5b61046b6004803603602081101561046457600080fd5b5035610cea565b005b61046b6004803603606081101561048357600080fd5b50803590602081013590604001356001600160a01b0316610da2565b61046b600480360360208110156104b557600080fd5b503515156111fd565b61046b600480360360208110156104d457600080fd5b50356001600160a01b031661126a565b61046b600480360360208110156104fa57600080fd5b50356112a7565b61050961140c565b60408051918252519081900360200190f35b6105416004803603602081101561053157600080fd5b50356001600160a01b0316611412565b604080519115158252519081900360200190f35b610541611427565b61046b6004803603604081101561057357600080fd5b50803590602001351515611430565b6105ae6004803603604081101561059857600080fd5b506001600160a01b038135169060200135611496565b6040805195865260208601949094528484019290925260608401526080830152519081900360a00190f35b61046b6114e1565b6105096115b7565b61046b600480360360208110156105ff57600080fd5b50356115bd565b61046b61160f565b61054161172f565b6105096004803603604081101561062c57600080fd5b506001600160a01b0381358116916020013516611738565b610509611765565b61050961176b565b6105416004803603608081101561066a57600080fd5b506001600160a01b0381358116916020810135916040820135916060013516611771565b610541600480360360208110156106a457600080fd5b50356001600160a01b0316611b63565b61046b600480360360408110156106ca57600080fd5b5080359060200135611b78565b61046b61205b565b61046b600480360360408110156106f557600080fd5b506001600160a01b0381351690602001356120c5565b61046b6004803603602081101561072157600080fd5b503515156121d2565b61046b6004803603602081101561074057600080fd5b50356001600160a01b031661223d565b6107586122ac565b604080516001600160a01b039092168252519081900360200190f35b61046b6004803603608081101561078a57600080fd5b508035906001600160a01b0360208201351690604081013590606001356122bb565b610541612497565b6107586124a8565b6105096124cc565b6105096125fa565b61046b600480360360208110156107e257600080fd5b5035612634565b61046b600480360360408110156107ff57600080fd5b506001600160a01b038135169060200135612802565b61046b6004803603604081101561082b57600080fd5b506001600160a01b038135169060200135612977565b61046b6004803603606081101561085757600080fd5b508035906001600160a01b036020820135169060400135612abd565b610509612cdb565b61046b6004803603604081101561089157600080fd5b506001600160a01b0381351690602001351515612ce1565b610509612de5565b610758612deb565b61046b600480360360208110156108cf57600080fd5b5035612dfa565b61046b600480360360208110156108ec57600080fd5b50351515612e32565b610509612e9b565b61046b612ebf565b610541612ff8565b61046b6004803603606081101561092357600080fd5b50803590602081013590604001356001600160a01b0316613006565b61075861339d565b6107586004803603602081101561095d57600080fd5b50356001600160a01b03166133c1565b61046b6004803603608081101561098357600080fd5b506001600160a01b0381351690602081013590604081013590606001356133dc565b61046b600480360360208110156109bb57600080fd5b5035613721565b61046b600480360360408110156109d857600080fd5b506001600160a01b038135169060200135613925565b610541613d69565b61046b60048036036040811015610a0c57600080fd5b810190602081018135640100000000811115610a2757600080fd5b820183602082011115610a3957600080fd5b80359060200191846020830284011164010000000083111715610a5b57600080fd5b919350915035613d78565b610509613f0f565b61046b60048036036040811015610a8457600080fd5b506001600160a01b038135169060200135613f9b565b610ad060048036036060811015610ab057600080fd5b506001600160a01b038135811691602081013590911690604001356141d5565b60408051938452602084019290925282820152519081900360600190f35b61054161423b565b61046b60048036036040811015610b0c57600080fd5b506001600160a01b038135169060200135151561424b565b61046b60048036036020811015610b3a57600080fd5b50356001600160a01b031661434e565b61046b60048036036020811015610b6057600080fd5b50356001600160a01b03166143dd565b61046b60048036036020811015610b8657600080fd5b50351515614609565b61046b60048036036020811015610ba557600080fd5b50356001600160a01b0316614670565b61046b60048036036040811015610bcb57600080fd5b50803590602001356146df565b61046b60048036036020811015610bee57600080fd5b5035151561499f565b61050960048036036020811015610c0d57600080fd5b50356001600160a01b03166149ff565b61046b614a57565b61050960048036036040811015610c3b57600080fd5b506001600160a01b038135169060200135614bdf565b610758614c1d565b610509614c2c565b61050960048036036020811015610c7757600080fd5b5035614c50565b61050960048036036020811015610c9457600080fd5b50356001600160a01b0316614c62565b610509614c7d565b61050960048036036020811015610cc257600080fd5b50356001600160a01b0316614d26565b610758614d38565b610758614d47565b610758614d56565b601254600090640100000000900460ff16610d0757503380610d0b565b5032805b506001600160a01b038116600090815260036020526040902054828114610d9d576000610d37836149ff565b90508015610d80578315610d755781610d5a57610d55838583614ea6565b610d70565b610d65838383614f1b565b610d70838583614ea6565b610d80565b610d80838383614f1b565b506001600160a01b03821660009081526003602052604090208390555b505050565b60008311610ded576040805162461bcd60e51b81526020600482015260136024820152724e6f7468696e6720746f20776974686472617760681b604482015290519081900360640190fd5b336000908152600260205260409020548210610e41576040805162461bcd60e51b815260206004820152600e60248201526d1ddc9bdb99c81cdd185ad948125160921b604482015290519081900360640190fd5b336000908152600260205260408120805484908110610e5c57fe5b906000526020600020906005020190508060000154841115610eb3576040805162461bcd60e51b815260206004820152601f6024820152600080516020615698833981519152604482015290519081900360640190fd5b60125462010000900460ff16610f135780548414610f13576040805162461bcd60e51b81526020600482015260186024820152776d757374207472616e736665722066756c6c207374616b6560401b604482015290519081900360640190fd5b60018101546001600160a01b03831660009081526007602052604090205460ff1615610f9c57610f8d7f0000000000000000000000000000000000000000000000000000000000000000610f87837f0000000000000000000000000000000000000000000000000000000000000000614f90565b90614f90565b421115610f975750425b611095565b6001600160a01b03831660009081526006602052604090205460ff168015610fec5750610fe9817f0000000000000000000000000000000000000000000000000000000000000000614f90565b42115b801561104457506110417f0000000000000000000000000000000000000000000000000000000000000000610f87837f0000000000000000000000000000000000000000000000000000000000000000614f90565b42105b611095576040805162461bcd60e51b815260206004820152601f60248201527f63616e206f6e6c7920686f7020696e746f207072652d73657420506f6f6c7300604482015290519081900360640190fd5b60006110b5600a546110af886110a96124cc565b90614fea565b90615043565b83549091506110c490876150aa565b8355600a546110d390876150aa565b600a553360009081526003602052604090205480156110f7576110f7338289614f1b565b60048085015460408051636267189760e01b8152928301859052336024840152604483018690526064830191909152516001600160a01b03871691636267189791608480830192600092919082900301818387803b15801561115857600080fd5b505af115801561116c573d6000803e3d6000fd5b505085541591506111a2905057611192600a546110af61118a6124cc565b875490614fea565b60028501554260038501556111ac565b6111ac3387615107565b604080518381526020810189905281516001600160a01b0388169233927f2391574aca0f6cc92f9588562ee00a7c2d33f83d17d01d8fa177ba4423740f44929081900390910190a350505050505050565b600b546001600160a01b0316331461124a576040805162461bcd60e51b815260206004820152600b60248201526a61646d696e3a207775743f60a81b604482015290519081900360640190fd5b601280549115156401000000000264ff0000000019909216919091179055565b6001600160a01b0381166000908152600260205260408120805490915b818110156112a1576112998482613f9b565b600101611287565b50505050565b600b546001600160a01b031633146112f4576040805162461bcd60e51b815260206004820152600b60248201526a61646d696e3a207775743f60a81b604482015290519081900360640190fd5b806113cf57600b54604080516370a0823160e01b815230600482015290516113ca926001600160a01b03908116927f0000000000000000000000000000000000000000000000000000000000000000909116916370a0823191602480820192602092909190829003018186803b15801561136d57600080fd5b505afa158015611381573d6000803e3d6000fd5b505050506040513d602081101561139757600080fd5b50516001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001691906151d9565b611409565b600b54611409906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169116836151d9565b50565b600f5481565b60076020526000908152604090205460ff1681565b60125460ff1681565b600b546001600160a01b0316331461147d576040805162461bcd60e51b815260206004820152600b60248201526a61646d696e3a207775743f60a81b604482015290519081900360640190fd5b600f919091556010805460ff1916911515919091179055565b600260205281600052604060002081815481106114af57fe5b600091825260209091206005909102018054600182015460028301546003840154600490940154929550909350919085565b60105460ff16611538576040805162461bcd60e51b815260206004820152601960248201527f6175746f6d61746963207570646174652064697361626c656400000000000000604482015290519081900360640190fd5b600b60009054906101000a90046001600160a01b03166001600160a01b03166351a41dec6040518163ffffffff1660e01b815260040160206040518083038186803b15801561158657600080fd5b505afa15801561159a573d6000803e3d6000fd5b505050506040513d60208110156115b057600080fd5b5051600f55565b60145481565b600b546001600160a01b0316331461160a576040805162461bcd60e51b815260206004820152600b60248201526a61646d696e3a207775743f60a81b604482015290519081900360640190fd5b601155565b600160009054906101000a90046001600160a01b03166001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561165d57600080fd5b505afa158015611671573d6000803e3d6000fd5b505050506040513d602081101561168757600080fd5b5051600b80546001600160a01b0319166001600160a01b0392831617905560015460408051630824ea6b60e31b8152905191909216916341275358916004808301926020929190829003018186803b1580156116e257600080fd5b505afa1580156116f6573d6000803e3d6000fd5b505050506040513d602081101561170c57600080fd5b5051600c80546001600160a01b0319166001600160a01b03909216919091179055565b60105460ff1681565b6001600160a01b038083166000908152600860209081526040808320938516835292905220545b92915050565b60135481565b600a5481565b601254600090610100900460ff166117ba5760405162461bcd60e51b815260040180806020018281038252602481526020018061575a6024913960400191505060405180910390fd5b816001600160a01b0316856001600160a01b0316141561181a576040805162461bcd60e51b815260206004820152601660248201527531b0b713ba103a3930b739b332b9103a379039b2b63360511b604482015290519081900360640190fd5b6001600160a01b0385166000908152600260205260409020548410611877576040805162461bcd60e51b815260206004820152600e60248201526d1ddc9bdb99c81cdd185ad948125160921b604482015290519081900360640190fd5b6001600160a01b038516600090815260026020526040812080548690811061189b57fe5b9060005260206000209060050201905060008060006118bb8933896141d5565b92509250925083600001548314611919576040805162461bcd60e51b815260206004820152601c60248201527f696e636f7272656374207374616b65206f7220616c6c6f77616e636500000000604482015290519081900360640190fd5b83600101548214611971576040805162461bcd60e51b815260206004820152601c60248201527f696e636f7272656374207374616b65206f7220616c6c6f77616e636500000000604482015290519081900360640190fd5b836004015481146119c9576040805162461bcd60e51b815260206004820152601c60248201527f696e636f7272656374207374616b65206f7220616c6c6f77616e636500000000604482015290519081900360640190fd5b6001600160a01b03891660009081526003602052604090205480156119f3576119f38a8286614f1b565b506001600160a01b0386166000908152600360205260409020548015611a1e57611a1e878286614ea6565b611a288a8a615107565b611a328a8961522b565b60026000886001600160a01b03166001600160a01b031681526020019081526020016000206040518060a00160405280868152602001858152602001611a86600a546110af611a7f6124cc565b8a90614fea565b8152602001428152602001848152509080600181540180825580915050600190039060005260206000209060050201600090919091909150600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015550507f017cb7d605aa3dcd304a9eb2a4df6075576ccc4a5dc2fe0b518c558e8f75338d8a888b8b60405180856001600160a01b03168152602001846001600160a01b0316815260200183815260200182815260200194505050505060405180910390a15060019998505050505050505050565b60066020526000908152604090205460ff1681565b336000908152600260205260409020548110611bce576040805162461bcd60e51b815260206004820152601060248201526f1a5b9d985b1a59081cdd185ad948125160821b604482015290519081900360640190fd5b336000908152600260205260408120805483908110611be957fe5b9060005260206000209060050201905060008311611c44576040805162461bcd60e51b81526020600482015260136024820152724e6f7468696e6720746f20776974686472617760681b604482015290519081900360640190fd5b8054831115611c88576040805162461bcd60e51b815260206004820152601f6024820152600080516020615698833981519152604482015290519081900360640190fd5b60048101546001820154611c9b91614f90565b4211611cee576040805162461bcd60e51b815260206004820152601960248201527f6d757374207365727665206d616e6461746f72792074696d6500000000000000604482015290519081900360640190fd5b60125462010000900460ff16611d4e5780548314611d4e576040805162461bcd60e51b81526020600482015260186024820152776d757374207472616e736665722066756c6c207374616b6560401b604482015290519081900360640190fd5b6000611d62600a546110af866110a96124cc565b8254909150611d7190856150aa565b8255600a54611d8090856150aa565b600a556001820154600090611db5907f0000000000000000000000000000000000000000000000000000000000000000614f90565b421015611e53576000611df2611de96103e86110af6110ad6110a9620151808a60010154420361504390919063ffffffff16565b612008906150aa565b9050611e046127106110af8584614fea565b600c54909250611e41906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169116846151d9565b611e4b83836150aa565b925050611f77565b611eae7f0000000000000000000000000000000000000000000000000000000000000000610f877f00000000000000000000000000000000000000000000000000000000000000008660010154614f9090919063ffffffff16565b421115611f77576000611f0b6103e86110af6110ad6110a9620151806110af611f047f00000000000000000000000000000000000000000000000000000000000000008c60010154614f9090919063ffffffff16565b42906150aa565b9050612008811115611f1c57506120085b611f2c6127106110af8584614fea565b600c54909250611f69906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169116846151d9565b611f7383836150aa565b9250505b825415611fb157611fa1600a546110af611f9985611f936124cc565b906150aa565b865490614fea565b6002840155426003840155611fbb565b611fbb3385615107565b336000908152600360205260409020548015611fdc57611fdc338288614f1b565b6040805184815260208101849052808201889052905133917f02f25270a4d87bea75db541cdfe559334a275b4a233520ed6c0a2429667cca94919081900360600190a26120536001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001633856151d9565b505050505050565b60015460095460408051630441a3e760e41b8152600481019290925260006024830181905290516001600160a01b039093169263441a3e7092604480820193929182900301818387803b1580156120b157600080fd5b505af11580156112a1573d6000803e3d6000fd5b3360009081526008602090815260408083206001600160a01b0386168452909152812080549091906120f89060016150aa565b90508083146121505781818154811061210d57fe5b906000526020600020906003020182848154811061212757fe5b600091825260209091208254600390920201908155600180830154908201556002918201549101555b8180548061215a57fe5b6000828152602080822060036000199094019384020182815560018101839055600201919091559155604080513381526001600160a01b03871692810192909252818101859052517f29fbfeb988fb99326ac41d70606334081c6be7e8518f6caa5b7b1bcbe7872a1e9181900360600190a150505050565b600b546001600160a01b0316331461221f576040805162461bcd60e51b815260206004820152600b60248201526a61646d696e3a207775743f60a81b604482015290519081900360640190fd5b6012805491151563010000000263ff00000019909216919091179055565b600b546001600160a01b0316331461228a576040805162461bcd60e51b815260206004820152600b60248201526a61646d696e3a207775743f60a81b604482015290519081900360640190fd5b600e80546001600160a01b0319166001600160a01b0392909216919091179055565b600c546001600160a01b031681565b3360009081526006602052604090205460ff16806122e857503360009081526007602052604090205460ff165b6123235760405162461bcd60e51b81526004018080602001828103825260218152602001806156b86021913960400191505060405180910390fd5b600061232d6124cc565b90506123646001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016333088615338565b6000600a5460001461239057612389826110af600a5489614fea90919063ffffffff16565b9050612393565b50845b600a546123a09082614f90565b600a556001600160a01b0385166000818152600260208181526040808420815160a0810183528781528084018b81528184018e81524260608401908152608084018d8152855460018181018855968b52888b2095516005909102909501948555925194840194909455519582019590955590516003808301919091559351600490910155938352522054801561243b5761243b868284614ea6565b60408051888152602081018490528082018790526060810186905290516001600160a01b038816917fb66a80ae2ebf4737952b9c2b57a9d34ef56806ab937f481b75197ae991d81afb919081900360800190a250505050505050565b601254640100000000900460ff1681565b7f000000000000000000000000000000000000000000000000000000000000000081565b6001546009546040805163f456426f60e01b815260048101929092523060248301525160009283926001600160a01b039091169163f456426f91604480820192602092909190829003018186803b15801561252657600080fd5b505afa15801561253a573d6000803e3d6000fd5b505050506040513d602081101561255057600080fd5b5051604080516370a0823160e01b815230600482015290519192506125f49183916001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016916370a0823191602480820192602092909190829003018186803b1580156125c257600080fd5b505afa1580156125d6573d6000803e3d6000fd5b505050506040513d60208110156125ec57600080fd5b505190614f90565b91505090565b6000600a5460001461262557612620600a546110af670de0b6b3a76400006110a96124cc565b61262f565b670de0b6b3a76400005b905090565b600b546001600160a01b03163314612681576040805162461bcd60e51b815260206004820152600b60248201526a61646d696e3a207775743f60a81b604482015290519081900360640190fd5b8061279057600154600954604080516370a0823160e01b81526001600160a01b03938416600482018190529151919363441a3e7093927f0000000000000000000000000000000000000000000000000000000000000000909116916370a08231916024808301926020929190829003018186803b15801561270157600080fd5b505afa158015612715573d6000803e3d6000fd5b505050506040513d602081101561272b57600080fd5b5051604080516001600160e01b031960e086901b1681526004810193909352602483019190915251604480830192600092919082900301818387803b15801561277357600080fd5b505af1158015612787573d6000803e3d6000fd5b50505050611409565b60015460095460408051630441a3e760e41b8152600481019290925260248201849052516001600160a01b039092169163441a3e709160448082019260009290919082900301818387803b1580156127e757600080fd5b505af11580156127fb573d6000803e3d6000fd5b5050505050565b33600090815260026020526040812080548390811061281d57fe5b90600052602060002090600502019050600f54612849600a546110af6128416124cc565b855490614fea565b101561289c576040805162461bcd60e51b815260206004820152601760248201527f62656c6f77206d696e696d756d207468726573686f6c64000000000000000000604482015290519081900360640190fd5b3360008181526008602090815260408083206001600160a01b0388168085528184528285208054928552835160608082018652895482526001808b018054848a0190815260048d018054868b01908152848a018855968c529a8a90209451600389029095019485555191840191909155925160029092019190915588549154965485519889529588019290925286840183905290860152608085019390935260a08401919091525190917f13356b03fc409456fbfbc8b432cb402b7841b3114d1d159625eb0f3d4e3a4681919081900360c00190a150505050565b600b546001600160a01b031633146129c4576040805162461bcd60e51b815260206004820152600b60248201526a61646d696e3a207775743f60a81b604482015290519081900360640190fd5b600180546001600160a01b0319166001600160a01b038481169190911791829055600983905560408051636eb1769f60e11b81523060048201529282166024840152516000927f00000000000000000000000000000000000000000000000000000000000000009092169163dd62ed3e916044808301926020929190829003018186803b158015612a5457600080fd5b505afa158015612a68573d6000803e3d6000fd5b505050506040513d6020811015612a7e57600080fd5b5051905080610d9d57610d9d6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001684600019614d7a565b60026000541415612b15576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6002600055600f54831015612b66576040805162461bcd60e51b815260206004820152601260248201527110995b1bddc8135a5b9a5b5d5b4811da599d60721b604482015290519081900360640190fd5b6000612b706124cc565b9050612ba76001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016333087615338565b6000600a54600014612bd357612bcc826110af600a5488614fea90919063ffffffff16565b9050612bd6565b50835b600a54612be39082614f90565b600a556001600160a01b0384166000818152600260208181526040808420815160a081018352878152428185018181528285018e815260608401928352608084018d8152855460018181018855968b52888b2095516005909102909501948555915194840194909455925195820195909555935160038086019190915590516004909401939093559383525220548015612c8257612c82858284614ea6565b6040805187815260208101849052428183015290516001600160a01b0387169133917f190f4e47df17911728b041870d3cd75008c166bb9d8cde694aaa68f73ad415829181900360600190a35050600160005550505050565b60095481565b600b546001600160a01b03163314612d2e576040805162461bcd60e51b815260206004820152600b60248201526a61646d696e3a207775743f60a81b604482015290519081900360640190fd5b6001600160a01b03821660009081526007602052604090205460ff16151581151514612de1576001600160a01b0382166000908152600760205260409020805460ff191682151517905580612d8e57601480546000198101909155612d9a565b60148054600181019091555b50604080516001600160a01b0384168152821515602082015281517f808293acec1c44217eccd857d5abb88ff31456d23bf3a000d2f5aee5f92f4c19929181900390910190a15b5050565b60115481565b600d546001600160a01b031681565b3360009081526002602052604090208054611409919083908110612e1a57fe5b90600052602060002090600502016000015482611b78565b600b546001600160a01b03163314612e7f576040805162461bcd60e51b815260206004820152600b60248201526a61646d696e3a207775743f60a81b604482015290519081900360640190fd5b60128054911515620100000262ff000019909216919091179055565b7f000000000000000000000000000000000000000000000000000000000000000081565b600b546001600160a01b03163314612f0c576040805162461bcd60e51b815260206004820152600b60248201526a61646d696e3a207775743f60a81b604482015290519081900360640190fd5b600154600954604080516370a0823160e01b815230600482015290516001600160a01b039384169363e2bbb15893927f0000000000000000000000000000000000000000000000000000000000000000909116916370a0823191602480820192602092909190829003018186803b158015612f8657600080fd5b505afa158015612f9a573d6000803e3d6000fd5b505050506040513d6020811015612fb057600080fd5b5051604080516001600160e01b031960e086901b1681526004810193909352602483019190915251604480830192600092919082900301818387803b1580156120b157600080fd5b601254610100900460ff1681565b60125460ff16613052576040805162461bcd60e51b81526020600482015260126024820152711d1c985b9cd9995c9cc8191a5cd8589b195960721b604482015290519081900360640190fd5b6001600160a01b0381163314156130a9576040805162461bcd60e51b815260206004820152601660248201527531b0b713ba103a3930b739b332b9103a379039b2b63360511b604482015290519081900360640190fd5b3360009081526002602052604090205482106130fd576040805162461bcd60e51b815260206004820152600e60248201526d1ddc9bdb99c81cdd185ad948125160921b604482015290519081900360640190fd5b33600090815260026020526040812080548490811061311857fe5b906000526020600020906005020190506000613142600a546110af61313b6124cc565b8890614fea565b9050600f5481101561319b576040805162461bcd60e51b815260206004820152601760248201527f42656c6f77206d696e696d756d207468726573686f6c64000000000000000000604482015290519081900360640190fd5b81548511156131df576040805162461bcd60e51b815260206004820152601f6024820152600080516020615698833981519152604482015290519081900360640190fd5b6012546301000000900460ff166132405781548514613240576040805162461bcd60e51b81526020600482015260186024820152776d757374207472616e736665722066756c6c207374616b6560401b604482015290519081900360640190fd5b815461324c90866150aa565b825533600090815260036020526040902054801561326f5761326f338288614f1b565b506001600160a01b038316600090815260036020526040902054801561329a5761329a848288614ea6565b6001600160a01b0384166000908152600260208181526040808420815160a0810183528b81526001808a015482860190815293820189815242606084019081526004808d01546080860190815286548086018855968b5297909920935160059095029093019384559351908301559151938101939093555160038301555191015582541561334357613333600a546110af611f996124cc565b600284015542600384015561334d565b61334d3386615107565b604080518781526020810187905281516001600160a01b0387169233927ff3f8af030ee2cfc3c3c4ea260e6bcdd578eb1558b6eb3d79f7d0617ddbdc5b78929081900390910190a3505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6005602052600090815260409020546001600160a01b031681565b60026000541415613434576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b600260005582613480576040805162461bcd60e51b8152602060048201526012602482015271139bdd1a1a5b99c81d1bc819195c1bdcda5d60721b604482015290519081900360640190fd5b6001600160a01b03841660009081526002602052604090205482106134dd576040805162461bcd60e51b815260206004820152600e60248201526d1ddc9bdb99c814dd185ad948125160921b604482015290519081900360640190fd5b600b546001600160a01b0316331461354c576001600160a01b038416331461354c576040805162461bcd60e51b815260206004820152601e60248201527f63616e206f6e6c7920657874656e6420796f7572206f776e207374616b650000604482015290519081900360640190fd5b60006135566124cc565b905061358d6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016333087615338565b6000600a546000146135b9576135b2826110af600a5488614fea90919063ffffffff16565b90506135bc565b50835b6001600160a01b03861660009081526002602052604081208054869081106135e057fe5b90600052602060002090600502019050613607828260000154614f9090919063ffffffff16565b8155600a546136169083614f90565b600a55600481015484118061365857506001810154613655907f0000000000000000000000000000000000000000000000000000000000000000614f90565b42115b1561366557600481018490555b61367e600a546110af6136766124cc565b845490614fea565b600282015542600380830182905560018301919091556001600160a01b0388166000908152602091909152604090205480156136bf576136bf888285614ea6565b604080518881526020810188905280820185905242606082015290516001600160a01b038a169133917f7f65dfb94bab62e0708845150044cf7ad9c77fbfe6ba9e3c8c1f210e15aa953d9181900360800190a350506001600055505050505050565b60026000541415613779576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6002600055806137c5576040805162461bcd60e51b8152602060048201526012602482015271139bdd1a1a5b99c81d1bc819195c1bdcda5d60721b604482015290519081900360640190fd5b60006137cf6124cc565b90506138066001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016333085615338565b6000600a546000146138325761382b826110af600a5486614fea90919063ffffffff16565b9050613835565b50815b600a546138429082614f90565b600a55336000818152600260208181526040808420815160a081018352878152428185018181528285018c81526060840192835260808401898152855460018181018855968b52888b20955160059091029095019485559151948401949094559251958201959095559351600380860191909155905160049094019390935593835252205480156138d8576138d8338284614ea6565b60408051858152602081018490524281830152905133917f36af321ec8d3c75236829c5317affd40ddb308863a1236d2d277a4025cccee1e919081900360600190a2505060016000555050565b33600090815260026020526040902054811061397b576040805162461bcd60e51b815260206004820152601060248201526f1a5b9d985b1a59081cdd185ad948125160821b604482015290519081900360640190fd5b33600090815260026020526040812080548390811061399657fe5b906000526020600020906005020190506139dd7f00000000000000000000000000000000000000000000000000000000000000008260010154614f9090919063ffffffff16565b4211613a27576040805162461bcd60e51b81526020600482015260146024820152737374616b65206e6f7420796574206d617475726560601b604482015290519081900360640190fd5b6000613a3f600a546110af84600001546110a96124cc565b600b546040805163ded6e1c960e01b81526001600160a01b0388811660048301529151939450600093613ad093612710936110af9391169163ded6e1c991602480820192602092909190829003018186803b158015613a9d57600080fd5b505afa158015613ab1573d6000803e3d6000fd5b505050506040513d6020811015613ac757600080fd5b50518590614fea565b600b54604080516370a0823160e01b81526001600160a01b039283166004820152905192935083927f0000000000000000000000000000000000000000000000000000000000000000909216916370a0823191602480820192602092909190829003018186803b158015613b4357600080fd5b505afa158015613b57573d6000803e3d6000fd5b505050506040513d6020811015613b6d57600080fd5b50511015613bac5760405162461bcd60e51b815260040180806020018281038252602c815260200180615646602c913960400191505060405180910390fd5b6001600160a01b038516301415613c3c57600b546040805163e5f59bc160e01b81523360048201526001600160a01b03888116602483015260448201859052606482018890529151919092169163e5f59bc191608480830192600092919082900301818387803b158015613c1f57600080fd5b505af1158015613c33573d6000803e3d6000fd5b505050506127fb565b8254613c49908587610da2565b600b60009054906101000a90046001600160a01b03166001600160a01b031663e5f59bc133878460018a6001600160a01b031663e5ea69ff336040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015613cbf57600080fd5b505afa158015613cd3573d6000803e3d6000fd5b505050506040513d6020811015613ce957600080fd5b5051604080516001600160e01b031960e089901b1681526001600160a01b0396871660048201529490951660248501526044840192909252900360648201529051608480830192600092919082900301818387803b158015613d4a57600080fd5b505af1158015613d5e573d6000803e3d6000fd5b505050505050505050565b60125462010000900460ff1681565b60005b828110156112a1573360056000868685818110613d9457fe5b6001600160a01b0360209182029390930135831684528301939093526040909101600020541691909114159050613f0757600060036000868685818110613dd757fe5b905060200201356001600160a01b03166001600160a01b03166001600160a01b03168152602001908152602001600020549050808314613f05576000613e37868685818110613e2257fe5b905060200201356001600160a01b03166149ff565b90508015613ebe578315613eaf5781613e7557613e70868685818110613e5957fe5b905060200201356001600160a01b03168583614ea6565b613eaa565b613e9b868685818110613e8457fe5b905060200201356001600160a01b03168383614f1b565b613eaa868685818110613e5957fe5b613ebe565b613ebe868685818110613e8457fe5b8360036000888887818110613ecf57fe5b905060200201356001600160a01b03166001600160a01b03166001600160a01b0316815260200190815260200160002081905550505b505b600101613d7b565b6001546009546040805163f456426f60e01b815260048101929092523060248301525160009283926001600160a01b039091169163f456426f91604480820192602092909190829003018186803b158015613f6957600080fd5b505afa158015613f7d573d6000803e3d6000fd5b505050506040513d6020811015613f9357600080fd5b505191505090565b600d546001600160a01b0316613ff8576040805162461bcd60e51b815260206004820152601760248201527f6d6967726174696f6e206e6f7420616374697661746564000000000000000000604482015290519081900360640190fd5b6001600160a01b0382166000908152600260205260409020548110614057576040805162461bcd60e51b815260206004820152601060248201526f1a5b9d985b1a59081cdd185ad948125160821b604482015290519081900360640190fd5b6001600160a01b038216600090815260026020526040812080548390811061407b57fe5b9060005260206000209060050201905060008160000154116140d1576040805162461bcd60e51b815260206004820152600a6024820152696e6f2062616c616e636560b01b604482015290519081900360640190fd5b60006140e9600a546110af84600001546110a96124cc565b8254600a549192506140fb91906150aa565b600a556000808355600d54600184015460048086015460408051636267189760e01b81529283018790526001600160a01b038a81166024850152604484019490945260648301919091525191909216926362671897926084808201939182900301818387803b15801561416d57600080fd5b505af1158015614181573d6000803e3d6000fd5b5050835460408051858152602081019290925280516001600160a01b03891694503393507fe28c7cce19d5f22ab16a04ca1bb768f7533bf719280b5e40718b41c2641ac3099281900390910190a350505050565b6001600160a01b03808416600090815260086020908152604080832093861683529290529081208054829182918291908690811061420f57fe5b600091825260209091206003909102018054600182015460029092015490999198509650945050505050565b6012546301000000900460ff1681565b600b546001600160a01b03163314614298576040805162461bcd60e51b815260206004820152600b60248201526a61646d696e3a207775743f60a81b604482015290519081900360640190fd5b6001600160a01b03821660009081526006602052604090205460ff16151581151514612de1576001600160a01b0382166000908152600660205260409020805460ff1916821515179055806142f857601380546000198101909155614304565b60138054600181019091555b50604080516001600160a01b0384168152821515602082015281517f68e0e16e4195f1bb5436073ae329e02686b513fd39cd623585b36d74785b21c1929181900390910190a15050565b601254600090640100000000900460ff1661436b5750338061436f565b5032805b506001600160a01b0381811660008181526005602090815260409182902080546001600160a01b0319169487169485179055815192835282019290925281517fbeebfeebc9d1af8057ca45af36b2171fea34cb5b251e394f0bc5fcabde119d7f929181900390910190a15050565b600b546001600160a01b0316331461442a576040805162461bcd60e51b815260206004820152600b60248201526a61646d696e3a207775743f60a81b604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b0316141561449f576040805162461bcd60e51b815260206004820152600b60248201526a3bb937b733903a37b5b2b760a91b604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b03161415614514576040805162461bcd60e51b815260206004820152600b60248201526a3bb937b733903a37b5b2b760a91b604482015290519081900360640190fd5b600b5460408051634626402b60e01b81529051611409926001600160a01b031691634626402b916004808301926020929190829003018186803b15801561455a57600080fd5b505afa15801561456e573d6000803e3d6000fd5b505050506040513d602081101561458457600080fd5b5051604080516370a0823160e01b815230600482015290516001600160a01b038516916370a08231916024808301926020929190829003018186803b1580156145cc57600080fd5b505afa1580156145e0573d6000803e3d6000fd5b505050506040513d60208110156145f657600080fd5b50516001600160a01b03841691906151d9565b600b546001600160a01b03163314614656576040805162461bcd60e51b815260206004820152600b60248201526a61646d696e3a207775743f60a81b604482015290519081900360640190fd5b601280549115156101000261ff0019909216919091179055565b600b546001600160a01b031633146146bd576040805162461bcd60e51b815260206004820152600b60248201526a61646d696e3a207775743f60a81b604482015290519081900360640190fd5b600d80546001600160a01b0319166001600160a01b0392909216919091179055565b600e546001600160a01b0316614727576040805162461bcd60e51b8152602060048201526008602482015267191a5cd8589b195960c21b604482015290519081900360640190fd5b33600090815260026020526040902054811061477d576040805162461bcd60e51b815260206004820152601060248201526f1a5b9d985b1a59081cdd185ad948125160821b604482015290519081900360640190fd5b33600090815260026020526040812080548390811061479857fe5b90600052602060002090600502019050600083116147f3576040805162461bcd60e51b81526020600482015260136024820152724e6f7468696e6720746f20776974686472617760681b604482015290519081900360640190fd5b8054831115614837576040805162461bcd60e51b815260206004820152601f6024820152600080516020615698833981519152604482015290519081900360640190fd5b600061484b600a546110af866110a96124cc565b825490915061485a90856150aa565b8255600a5461486990856150aa565b600a5581541561489857614888600a546110af61284184611f936124cc565b60028301554260038301556148a2565b6148a23384615107565b3360009081526003602052604090205480156148c3576148c3338287614f1b565b600e54604080518481526000602082015280820188905290516001600160a01b03909216917f02f25270a4d87bea75db541cdfe559334a275b4a233520ed6c0a2429667cca949181900360600190a2600e5461494c906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169116846151d9565b600e546040805163364c781560e01b81526004810185905233602482015290516001600160a01b039092169163364c78159160448082019260009290919082900301818387803b158015613d4a57600080fd5b600b546001600160a01b031633146149ec576040805162461bcd60e51b815260206004820152600b60248201526a61646d696e3a207775743f60a81b604482015290519081900360640190fd5b6012805460ff1916911515919091179055565b6001600160a01b0381166000908152600260205260408120805482805b82811015614a4e57838181548110614a3057fe5b60009182526020909120600590910201549190910190600101614a1c565b50949350505050565b600b546001600160a01b03163314614aa4576040805162461bcd60e51b815260206004820152600b60248201526a61646d696e3a207775743f60a81b604482015290519081900360640190fd5b60015460095460408051632989754760e11b81526004810192909252516001600160a01b0390921691635312ea8e9160248082019260009290919082900301818387803b158015614af457600080fd5b505af1158015614b08573d6000803e3d6000fd5b5050600b54604080516370a0823160e01b81523060048201529051614bdd94506001600160a01b0392831693507f0000000000000000000000000000000000000000000000000000000000000000909216916370a0823191602480820192602092909190829003018186803b158015614b8057600080fd5b505afa158015614b94573d6000803e3d6000fd5b505050506040513d6020811015614baa57600080fd5b50516001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001691906151d9565b565b6001600160a01b0382166000908152600260205260408120805483908110614c0357fe5b906000526020600020906005020160000154905092915050565b600e546001600160a01b031681565b7f000000000000000000000000000000000000000000000000000000000000000081565b60046020526000908152604090205481565b6001600160a01b031660009081526002602052604090205490565b6001546009546040805163f456426f60e01b815260048101929092523060248301525160009283926001600160a01b039091169163f456426f91604480820192602092909190829003018186803b158015614cd757600080fd5b505afa158015614ceb573d6000803e3d6000fd5b505050506040513d6020811015614d0157600080fd5b5051601154909150600090614d1f90612710906110af908590614fea565b9250505090565b60036020526000908152604090205481565b600b546001600160a01b031681565b6001546001600160a01b031681565b7f000000000000000000000000000000000000000000000000000000000000000081565b801580614e00575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b158015614dd257600080fd5b505afa158015614de6573d6000803e3d6000fd5b505050506040513d6020811015614dfc57600080fd5b5051155b614e3b5760405162461bcd60e51b81526004018080602001828103825260368152602001806157246036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b179052610d9d90849061538e565b6060614e9c848460008561543f565b90505b9392505050565b600082815260046020526040902054614ebf9082614f90565b60008381526004602090815260409182902092909255805184815291820183905280516001600160a01b038616927fdb8549181d0331885cbb0e0d1e36bdd89e38e53990069f6f07a4090a15f74e5d92908290030190a2505050565b600082815260046020526040902054614f3490826150aa565b60008381526004602090815260409182902092909255805184815291820183905280516001600160a01b038616927f65b0f2fb4228364e2ac61c432687ae942c732095fc217265116bec6cc441683492908290030190a2505050565b600082820183811015614e9f576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600082614ff95750600061175f565b8282028284828161500657fe5b0414614e9f5760405162461bcd60e51b81526004018080602001828103825260218152602001806156d96021913960400191505060405180910390fd5b6000808211615099576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b8183816150a257fe5b049392505050565b600082821115615101576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b6001600160a01b03821660009081526002602052604090208054600019018281146151965781818154811061513857fe5b906000526020600020906005020182848154811061515257fe5b906000526020600020906005020160008201548160000155600182015481600101556002820154816002015560038201548160030155600482015481600401559050505b818054806151a057fe5b60008281526020812060056000199093019283020181815560018101829055600281018290556003810182905560040155905550505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610d9d90849061538e565b6001600160a01b03821660009081526008602090815260408083203384529091528120805490919061525e9060016150aa565b90508083146152b65781818154811061527357fe5b906000526020600020906003020182848154811061528d57fe5b600091825260209091208254600390920201908155600180830154908201556002918201549101555b818054806152c057fe5b6000828152602080822060036000199094019384020182815560018101839055600201919091559155604080516001600160a01b03871681523392810192909252818101859052517f29fbfeb988fb99326ac41d70606334081c6be7e8518f6caa5b7b1bcbe7872a1e9181900360600190a150505050565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b0316630c3023b960e01b1790526112a19085905b60606153e3826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316614e8d9092919063ffffffff16565b805190915015610d9d5780806020019051602081101561540257600080fd5b5051610d9d5760405162461bcd60e51b815260040180806020018281038252602a8152602001806156fa602a913960400191505060405180910390fd5b6060824710156154805760405162461bcd60e51b81526004018080602001828103825260268152602001806156726026913960400191505060405180910390fd5b6154898561559b565b6154da576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b602083106155195780518252601f1990920191602091820191016154fa565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d806000811461557b576040519150601f19603f3d011682016040523d82523d6000602084013e615580565b606091505b50915091506155908282866155a1565b979650505050505050565b3b151590565b606083156155b0575081614e9f565b8251156155c05782518084602001fd5b8160405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561560a5781810151838201526020016155f2565b50505050905090810190601f1680156156375780820380516001836020036101000a031916815260200191505b509250505060405180910390fdfe676f7665726e6f72207265736572766573206172652063757272656e746c7920696e73756666696369656e74416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c576974686472617720616d6f756e7420657863656564732062616c616e6365006f6e6c7920747275737465642073656e64657273286f7468657220706f6f6c7329536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e63657468697264207061727479207374616b65207472616e73666572732064697361626c6564a26469706673582212208dc82fc06330c2b549f801eed0a708a5f48763f1310291a3bb8f4d17ad78c40264736f6c634300060c0033416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c5361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000000000970ccee657dd831e9c37511aa3eb5302c1eb5eee000000000000000000000000d6f7f781734da5a3bbfad73ba0244450ec6f4c1f0000000000000000000000006ff40a8a1fe16075bd6008a48befb768be08b4b0000000000000000000000000d5b7b040859e87bfbb7807599698786fc2367e2d000000000000000000000000d5b7b040859e87bfbb7807599698786fc2367e2d0000000000000000000000000000000000000000000000000000000000000007
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000970ccee657dd831e9c37511aa3eb5302c1eb5eee000000000000000000000000d6f7f781734da5a3bbfad73ba0244450ec6f4c1f0000000000000000000000006ff40a8a1fe16075bd6008a48befb768be08b4b0000000000000000000000000d5b7b040859e87bfbb7807599698786fc2367e2d000000000000000000000000d5b7b040859e87bfbb7807599698786fc2367e2d0000000000000000000000000000000000000000000000000000000000000007
-----Decoded View---------------
Arg [0] : _token (address): 0x970ccee657dd831e9c37511aa3eb5302c1eb5eee
Arg [1] : _dummyToken (address): 0xd6f7f781734da5a3bbfad73ba0244450ec6f4c1f
Arg [2] : _masterchef (address): 0x6ff40a8a1fe16075bd6008a48befb768be08b4b0
Arg [3] : _admin (address): 0xd5b7b040859e87bfbb7807599698786fc2367e2d
Arg [4] : _treasury (address): 0xd5b7b040859e87bfbb7807599698786fc2367e2d
Arg [5] : _poolID (uint256): 7
-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 000000000000000000000000970ccee657dd831e9c37511aa3eb5302c1eb5eee
Arg [1] : 000000000000000000000000d6f7f781734da5a3bbfad73ba0244450ec6f4c1f
Arg [2] : 0000000000000000000000006ff40a8a1fe16075bd6008a48befb768be08b4b0
Arg [3] : 000000000000000000000000d5b7b040859e87bfbb7807599698786fc2367e2d
Arg [4] : 000000000000000000000000d5b7b040859e87bfbb7807599698786fc2367e2d
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000007
Deployed ByteCode Sourcemap
28128:39753:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49970:1063;;;;;;;;;;;;;;;;-1:-1:-1;49970:1063:0;;:::i;:::-;;42962:2137;;;;;;;;;;;;;;;;-1:-1:-1;42962:2137:0;;;;;;;;;;;-1:-1:-1;;;;;42962:2137:0;;:::i;65304:89::-;;;;;;;;;;;;;;;;-1:-1:-1;65304:89:0;;;;:::i;58855:266::-;;;;;;;;;;;;;;;;-1:-1:-1;58855:266:0;-1:-1:-1;;;;;58855:266:0;;:::i;65066:232::-;;;;;;;;;;;;;;;;-1:-1:-1;65066:232:0;;:::i;30559:43::-;;;:::i;:::-;;;;;;;;;;;;;;;;29890;;;;;;;;;;;;;;;;-1:-1:-1;29890:43:0;-1:-1:-1;;;;;29890:43:0;;:::i;:::-;;;;;;;;;;;;;;;;;;30806:37;;;:::i;65575:150::-;;;;;;;;;;;;;;;;-1:-1:-1;65575:150:0;;;;;;;;;:::i;29427:46::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;29427:46:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39924:157;;;:::i;31506:31::-;;;:::i;61567:94::-;;;;;;;;;;;;;;;;-1:-1:-1;61567:94:0;;:::i;39710:145::-;;;:::i;30606:40::-;;;:::i;53639:156::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;53639:156:0;;;;;;;;;;:::i;31469:33::-;;;:::i;30307:26::-;;;:::i;54503:1664::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;54503:1664:0;;;;;;;;;;;;;;;;;;;;:::i;29750:45::-;;;;;;;;;;;;;;;;-1:-1:-1;29750:45:0;-1:-1:-1;;;;;29750:45:0;;:::i;40229:2321::-;;;;;;;;;;;;;;;;-1:-1:-1;40229:2321:0;;;;;;;:::i;38831:90::-;;;:::i;53168:462::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;53168:462:0;;;;;;;;:::i;63169:114::-;;;;;;;;;;;;;;;;-1:-1:-1;63169:114:0;;;;:::i;65734:122::-;;;;;;;;;;;;;;;;-1:-1:-1;65734:122:0;-1:-1:-1;;;;;65734:122:0;;:::i;30397:23::-;;;:::i;:::-;;;;-1:-1:-1;;;;;30397:23:0;;;;;;;;;;;;;;45414:1243;;;;;;;;;;;;;;;;-1:-1:-1;45414:1243:0;;;-1:-1:-1;;;;;45414:1243:0;;;;;;;;;;;;;;;:::i;31165:30::-;;;:::i;29038:34::-;;;:::i;61039:206::-;;;:::i;60477:154::-;;;:::i;64704:270::-;;;;;;;;;;;;;;;;-1:-1:-1;64704:270:0;;:::i;52531:579::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;52531:579:0;;;;;;;;:::i;63966:389::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;63966:389:0;;;;;;;;:::i;35560:984::-;;;;;;;;;;;;;;;;-1:-1:-1;35560:984:0;;;-1:-1:-1;;;;;35560:984:0;;;;;;;;;;:::i;30278:21::-;;;:::i;62350:269::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;62350:269:0;;;;;;;;;;:::i;30734:26::-;;;:::i;30458:28::-;;;:::i;38568:124::-;;;;;;;;;;;;;;;;-1:-1:-1;38568:124:0;;:::i;63048:118::-;;;;;;;;;;;;;;;;-1:-1:-1;63048:118:0;;;;:::i;29372:46::-;;;:::i;64472:132::-;;;:::i;30905:42::-;;;:::i;48073:1638::-;;;;;;;;;;;;;;;;-1:-1:-1;48073:1638:0;;;;;;;;;;;-1:-1:-1;;;;;48073:1638:0;;:::i;28940:85::-;;;:::i;29645:47::-;;;;;;;;;;;;;;;;-1:-1:-1;29645:47:0;-1:-1:-1;;;;;29645:47:0;;:::i;36976:1581::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;36976:1581:0;;;;;;;;;;;;;;;;;;:::i;34322:887::-;;;;;;;;;;;;;;;;-1:-1:-1;34322:887:0;;:::i;46879:1098::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;46879:1098:0;;;;;;;;:::i;31004:37::-;;;:::i;51103:951::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51103:951:0;-1:-1:-1;51103:951:0;;:::i;60209:195::-;;;:::i;57926:814::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;57926:814:0;;;;;;;;:::i;53804:325::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;53804:325:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;31079:35;;;:::i;61836:289::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;61836:289:0;;;;;;;;;;:::i;52122:235::-;;;;;;;;;;;;;;;;-1:-1:-1;52122:235:0;-1:-1:-1;;;;;52122:235:0;;:::i;66092:329::-;;;;;;;;;;;;;;;;-1:-1:-1;66092:329:0;-1:-1:-1;;;;;66092:329:0;;:::i;61343:117::-;;;;;;;;;;;;;;;;-1:-1:-1;61343:117:0;;;;:::i;62859:100::-;;;;;;;;;;;;;;;;-1:-1:-1;62859:100:0;-1:-1:-1;;;;;62859:100:0;;:::i;56356:1352::-;;;;;;;;;;;;;;;;-1:-1:-1;56356:1352:0;;;;;;;:::i;63289:109::-;;;;;;;;;;;;;;;;-1:-1:-1;63289:109:0;;;;:::i;59384:334::-;;;;;;;;;;;;;;;;-1:-1:-1;59384:334:0;-1:-1:-1;;;;;59384:334:0;;:::i;63571:184::-;;;:::i;60733:148::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;60733:148:0;;;;;;;;:::i;30518:34::-;;;:::i;29310:54::-;;;:::i;29562:50::-;;;;;;;;;;;;;;;;-1:-1:-1;29562:50:0;;:::i;59198:118::-;;;;;;;;;;;;;;;;-1:-1:-1;59198:118:0;-1:-1:-1;;;;;59198:118:0;;:::i;59868:264::-;;;:::i;29480:43::-;;;;;;;;;;;;;;;;-1:-1:-1;29480:43:0;-1:-1:-1;;;;;29480:43:0;;:::i;30340:20::-;;;:::i;29082:29::-;;;:::i;28890:::-;;;:::i;49970:1063::-;50055:11;;50035:15;;50055:11;;;;;:56;;-1:-1:-1;50101:10:0;;50055:56;;;-1:-1:-1;50079:9:0;;50055:56;-1:-1:-1;;;;;;50142:17:0;;50122;50142;;;:8;:17;;;;;;50224:23;;;50221:805;;50309:23;50335:27;50354:7;50335:18;:27::i;:::-;50309:53;-1:-1:-1;50371:19:0;;50368:617;;50466:15;;50463:516;;50521:14;50518:313;;50574:58;50595:7;50604:10;50616:15;50574:20;:58::i;:::-;50518:313;;;50698:57;50719:7;50728:9;50739:15;50698:20;:57::i;:::-;50764:58;50785:7;50794:10;50806:15;50764:20;:58::i;:::-;50463:516;;;50914:57;50935:7;50944:9;50955:15;50914:20;:57::i;:::-;-1:-1:-1;;;;;;50990:17:0;;;;;;:8;:17;;;;;:30;;;50221:805;49970:1063;;;:::o;42962:2137::-;43086:1;43076:7;:11;43068:43;;;;;-1:-1:-1;;;43068:43:0;;;;;;;;;;;;-1:-1:-1;;;43068:43:0;;;;;;;;;;;;;;;43144:10;43135:20;;;;:8;:20;;;;;:27;43124:38;;43116:65;;;;;-1:-1:-1;;;43116:65:0;;;;;;;;;;;;-1:-1:-1;;;43116:65:0;;;;;;;;;;;;;;;43229:10;43196:21;43220:20;;;:8;:20;;;;;:30;;43241:8;;43220:30;;;;;;;;;;;;;;;;43196:54;;43274:4;:11;;;43263:7;:22;;43255:66;;;;;-1:-1:-1;;;43255:66:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;43255:66:0;;;;;;;;;;;;;;;43336:18;;;;;;;43332:88;;43377:11;;43366:22;;43358:59;;;;;-1:-1:-1;;;43358:59:0;;;;;;;;;;;;-1:-1:-1;;;43358:59:0;;;;;;;;;;;;;;;43464:22;;;;-1:-1:-1;;;;;43500:25:0;;43435:26;43500:25;;;:11;:25;;;;;;;;43497:734;;;43555:58;43601:11;43555:41;:18;43578:17;43555:22;:41::i;:::-;:45;;:58::i;:::-;43537:15;:76;43534:169;;;-1:-1:-1;43643:15:0;43534:169;43497:734;;;-1:-1:-1;;;;;43945:27:0;;;;;;:13;:27;;;;;;;;:90;;;;-1:-1:-1;43994:41:0;:18;44017:17;43994:22;:41::i;:::-;43976:15;:59;43945:90;:203;;;;-1:-1:-1;44090:58:0;44136:11;44090:41;:18;44113:17;44090:22;:41::i;:58::-;44072:15;:76;43945:203;43937:288;;;;;-1:-1:-1;;;43937:288:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;44243:21;44267:43;44298:11;;44268:24;44284:7;44268:11;:9;:11::i;:::-;:15;;:24::i;:::-;44267:30;;:43::i;:::-;44335:11;;44243:67;;-1:-1:-1;44335:24:0;;44351:7;44335:15;:24::i;:::-;44321:38;;44384:11;;:24;;44400:7;44384:15;:24::i;:::-;44370:11;:38;44446:10;44417:17;44437:20;;;:8;:20;;;;;;44471:14;;44468:98;;44502:52;44523:10;44535:9;44546:7;44502:20;:52::i;:::-;44654:25;;;;;44574:106;;;-1:-1:-1;;;44574:106:0;;;;;;;;44622:10;44574:106;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;44574:32:0;;;;;:106;;;;;-1:-1:-1;;44574:106:0;;;;;;;-1:-1:-1;44574:32:0;:106;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;44750:11:0;;:15;;-1:-1:-1;44746:263:0;;-1:-1:-1;44746:263:0;44810:45;44843:11;;44810:28;44826:11;:9;:11::i;:::-;44810;;;:15;:28::i;:45::-;44782:25;;;:73;44896:15;44870:23;;;:41;44746:263;;;44944:34;44957:10;44969:8;44944:12;:34::i;:::-;45034:57;;;;;;;;;;;;;;-1:-1:-1;;;;;45034:57:0;;;45042:10;;45034:57;;;;;;;;;;;42962:2137;;;;;;;:::o;65304:89::-;34092:5;;-1:-1:-1;;;;;34092:5:0;34078:10;:19;34070:43;;;;;-1:-1:-1;;;34070:43:0;;;;;;;;;;;;-1:-1:-1;;;34070:43:0;;;;;;;;;;;;;;;65366:11:::1;:22:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;65366:22:0;;::::1;::::0;;;::::1;::::0;;65304:89::o;58855:266::-;-1:-1:-1;;;;;58944:17:0;;58918:23;58944:17;;;:8;:17;;;;;58993:11;;58944:17;;59025:89;59046:10;59042:1;:14;59025:89;;;59078:24;59091:7;59100:1;59078:12;:24::i;:::-;59058:3;;59025:89;;;;58855:266;;;:::o;65066:232::-;34092:5;;-1:-1:-1;;;;;34092:5:0;34078:10;:19;34070:43;;;;;-1:-1:-1;;;34070:43:0;;;;;;;;;;;;-1:-1:-1;;;34070:43:0;;;;;;;;;;;;;;;65140:12;65137:154:::1;;65185:5;::::0;65192:35:::1;::::0;;-1:-1:-1;;;65192:35:0;;65221:4:::1;65192:35;::::0;::::1;::::0;;;65161:67:::1;::::0;-1:-1:-1;;;;;65185:5:0;;::::1;::::0;65192:10:::1;:20:::0;;::::1;::::0;::::1;::::0;:35;;;;;::::1;::::0;;;;;;;;;:20;:35;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;65192:35:0;-1:-1:-1;;;;;65161:10:0::1;:23;::::0;:67;:23:::1;:67::i;:::-;65137:154;;;65270:5;::::0;65246:39:::1;::::0;-1:-1:-1;;;;;65246:10:0::1;:23:::0;::::1;::::0;65270:5:::1;65277:7:::0;65246:23:::1;:39::i;:::-;65066:232:::0;:::o;30559:43::-;;;;:::o;29890:::-;;;;;;;;;;;;;;;:::o;30806:37::-;;;;;;:::o;65575:150::-;34092:5;;-1:-1:-1;;;;;34092:5:0;34078:10;:19;34070:43;;;;;-1:-1:-1;;;34070:43:0;;;;;;;;;;;;-1:-1:-1;;;34070:43:0;;;;;;;;;;;;;;;65662:11:::1;:21:::0;;;;65688::::1;:32:::0;;-1:-1:-1;;65688:32:0::1;::::0;::::1;;::::0;;;::::1;::::0;;65575:150::o;29427:46::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29427:46:0;;-1:-1:-1;29427:46:0;;;:::o;39924:157::-;39975:21;;;;39967:59;;;;;-1:-1:-1;;;39967:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;40057:5;;;;;;;;;-1:-1:-1;;;;;40057:5:0;-1:-1:-1;;;;;40045:29:0;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40045:31:0;40031:11;:45;39924:157::o;31506:31::-;;;;:::o;61567:94::-;34092:5;;-1:-1:-1;;;;;34092:5:0;34078:10;:19;34070:43;;;;;-1:-1:-1;;;34070:43:0;;;;;;;;;;;;-1:-1:-1;;;34070:43:0;;;;;;;;;;;;;;;61635:7:::1;:18:::0;61567:94::o;39710:145::-;39770:10;;;;;;;;;-1:-1:-1;;;;;39770:10:0;-1:-1:-1;;;;;39758:29:0;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39758:31:0;39750:5;:39;;-1:-1:-1;;;;;;39750:39:0;-1:-1:-1;;;;;39750:39:0;;;;;;-1:-1:-1;39823:10:0;39811:36;;;-1:-1:-1;;;39811:36:0;;;;39823:10;;;;;39811:34;;:36;;;;;39758:31;;39811:36;;;;;;;39823:10;39811:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39811:36:0;39800:8;:47;;-1:-1:-1;;;;;;39800:47:0;-1:-1:-1;;;;;39800:47:0;;;;;;;;;39710:145::o;30606:40::-;;;;;;:::o;53639:156::-;-1:-1:-1;;;;;53748:23:0;;;53721:7;53748:23;;;:16;:23;;;;;;;;:32;;;;;;;;;:39;53639:156;;;;;:::o;31469:33::-;;;;:::o;30307:26::-;;;;:::o;54503:1664::-;54640:22;;54615:4;;54640:22;;;;;54632:71;;;;-1:-1:-1;;;54632:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54729:3;-1:-1:-1;;;;;54720:12:0;:5;-1:-1:-1;;;;;54720:12:0;;;54712:47;;;;;-1:-1:-1;;;54712:47:0;;;;;;;;;;;;-1:-1:-1;;;54712:47:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;54789:15:0;;;;;;:8;:15;;;;;:22;54778:33;;54770:60;;;;;-1:-1:-1;;;54770:60:0;;;;;;;;;;;;-1:-1:-1;;;54770:60:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;54865:15:0;;54841:21;54865:15;;;:8;:15;;;;;:25;;54881:8;;54865:25;;;;;;;;;;;;;;;;54841:49;;54900:15;54917:20;54939:22;54965:47;54981:5;54988:10;55000:11;54965:15;:47::i;:::-;54899:113;;;;;;55247:4;:11;;;55236:7;:22;55228:63;;;;;-1:-1:-1;;;55228:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;55320:4;:22;;;55304:12;:38;55296:79;;;;;-1:-1:-1;;;55296:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;55406:4;:25;;;55388:14;:43;55380:84;;;;;-1:-1:-1;;;55380:84:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;55496:15:0;;55476:17;55496:15;;;:8;:15;;;;;;55525:14;;55522:93;;55556:47;55577:5;55584:9;55595:7;55556:20;:47::i;:::-;-1:-1:-1;;;;;;55631:13:0;;;;;;:8;:13;;;;;;55658:14;;55655:91;;55689:45;55710:3;55715:9;55726:7;55689:20;:45::i;:::-;55758:29;55771:5;55778:8;55758:12;:29::i;:::-;55833:41;55855:5;55862:11;55833:21;:41::i;:::-;55889:8;:13;55898:3;-1:-1:-1;;;;;55889:13:0;-1:-1:-1;;;;;55889:13:0;;;;;;;;;;;;55926:128;;;;;;;;55935:7;55926:128;;;;55944:12;55926:128;;;;55958:41;55987:11;;55958:24;55970:11;:9;:11::i;:::-;55958:7;;:11;:24::i;:41::-;55926:128;;;;56022:15;55926:128;;;;56039:14;55926:128;;;55889:180;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56087:52;56105:5;56112:3;56117:8;56127:11;56087:52;;;;-1:-1:-1;;;;;56087:52:0;;;;;;-1:-1:-1;;;;;56087:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;56155:4:0;;54503:1664;-1:-1:-1;;;;;;;;;54503:1664:0:o;29750:45::-;;;;;;;;;;;;;;;:::o;40229:2321::-;40328:10;40319:20;;;;:8;:20;;;;;:27;40308:38;;40300:67;;;;;-1:-1:-1;;;40300:67:0;;;;;;;;;;;;-1:-1:-1;;;40300:67:0;;;;;;;;;;;;;;;40411:10;40378:21;40402:20;;;:8;:20;;;;;:30;;40423:8;;40402:30;;;;;;;;;;;;;;;;40378:54;;40461:1;40451:7;:11;40443:43;;;;;-1:-1:-1;;;40443:43:0;;;;;;;;;;;;-1:-1:-1;;;40443:43:0;;;;;;;;;;;;;;;40516:11;;40505:22;;;40497:66;;;;;-1:-1:-1;;;40497:66:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;40497:66:0;;;;;;;;;;;;;;;40627:25;;;;40600:22;;;;:53;;:26;:53::i;:::-;40582:15;:71;40574:109;;;;;-1:-1:-1;;;40574:109:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;40698:18;;;;;;;40694:88;;40739:11;;40728:22;;40720:59;;;;;-1:-1:-1;;;40720:59:0;;;;;;;;;;;;-1:-1:-1;;;40720:59:0;;;;;;;;;;;;;;;40794:21;40818:43;40849:11;;40819:24;40835:7;40819:11;:9;:11::i;40818:43::-;40886:11;;40794:67;;-1:-1:-1;40886:24:0;;40902:7;40886:15;:24::i;:::-;40872:38;;40935:11;;:24;;40951:7;40935:15;:24::i;:::-;40921:11;:38;41045:22;;;;40972:26;;41045:45;;41072:17;41045:26;:45::i;:::-;41027:15;:63;41023:927;;;41107:19;41129:94;41147:75;41217:4;41147:65;41207:4;41148:53;41195:5;41167:4;:22;;;41149:15;:40;41148:46;;:53;;;;:::i;41147:75::-;41137:4;;41129:17;:94::i;:::-;41107:116;-1:-1:-1;41259:41:0;41294:5;41259:30;:13;41107:116;41259:17;:30::i;:41::-;41334:8;;41238:62;;-1:-1:-1;41315:48:0;;-1:-1:-1;;;;;41315:5:0;:18;;;41334:8;41238:62;41315:18;:48::i;:::-;41395:37;:13;41413:18;41395:17;:37::i;:::-;41379:53;;41023:927;;;;41471:62;41521:11;41471:45;41498:17;41471:4;:22;;;:26;;:45;;;;:::i;:62::-;41453:15;:80;41450:500;;;41550:19;41572:97;41664:4;41572:87;41654:4;41572:77;41643:5;41572:66;41592:45;41619:17;41592:4;:22;;;:26;;:45;;;;:::i;:::-;41572:15;;:19;:66::i;:97::-;41550:119;;41701:4;41687:11;:18;41684:46;;;-1:-1:-1;41723:4:0;41684:46;41765:41;41800:5;41765:30;:13;41783:11;41765:17;:30::i;:41::-;41840:8;;41744:62;;-1:-1:-1;41821:48:0;;-1:-1:-1;;;;;41821:5:0;:18;;;41840:8;41744:62;41821:18;:48::i;:::-;41901:37;:13;41919:18;41901:17;:37::i;:::-;41885:53;;41450:500;;41966:11;;:15;41962:282;;42026:64;42078:11;;42026:47;42042:30;42058:13;42042:11;:9;:11::i;:::-;:15;;:30::i;:::-;42026:11;;;:15;:47::i;:64::-;41998:25;;;:92;42131:15;42105:23;;;:41;41962:282;;;42179:34;42192:10;42204:8;42179:12;:34::i;:::-;42287:10;42258:17;42278:20;;;:8;:20;;;;;;42312:14;;42309:98;;42343:52;42364:10;42376:9;42387:7;42343:20;:52::i;:::-;42418:64;;;;;;;;;;;;;;;;;;;;42427:10;;42418:64;;;;;;;;;;42497:45;-1:-1:-1;;;;;42497:5:0;:18;42516:10;42528:13;42497:18;:45::i;:::-;40229:2321;;;;;;:::o;38831:90::-;38882:10;;38903:6;;38870:43;;;-1:-1:-1;;;38870:43:0;;;;;;;;;38882:10;38870:43;;;;;;;;-1:-1:-1;;;;;38882:10:0;;;;38870:32;;:43;;;;;38882:10;38870:43;;;;;;38882:10;;38870:43;;;;;;;;;;;;;;;;;;;;;;;;;;53168:462;53304:10;53250:34;53287:28;;;:16;:28;;;;;;;;-1:-1:-1;;;;;53287:37:0;;;;;;;;;53361:17;;53287:37;;53250:34;53361:24;;53383:1;53361:21;:24::i;:::-;53335:50;;53424:15;53409:11;:30;53406:115;;53482:10;53493:15;53482:27;;;;;;;;;;;;;;;;;;53456:10;53467:11;53456:23;;;;;;;;;;;;;;;;:53;;:23;;;;;:53;;;;;;;;;;;;;;;;;;;;53406:115;53541:10;:16;;;;;;;;;;;;;;;;-1:-1:-1;;53541:16:0;;;;;;;;;;;;;;;;;;;;;;;;53571:54;;;53592:10;53571:54;;-1:-1:-1;;;;;53571:54:0;;;;;;;;;;;;;;;;;;;;;;;;;53168:462;;;;:::o;63169:114::-;34092:5;;-1:-1:-1;;;;;34092:5:0;34078:10;:19;34070:43;;;;;-1:-1:-1;;;34070:43:0;;;;;;;;;;;;-1:-1:-1;;;34070:43:0;;;;;;;;;;;;;;;63247:16:::1;:28:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;63247:28:0;;::::1;::::0;;;::::1;::::0;;63169:114::o;65734:122::-;34092:5;;-1:-1:-1;;;;;34092:5:0;34078:10;:19;34070:43;;;;;-1:-1:-1;;;34070:43:0;;;;;;;;;;;;-1:-1:-1;;;34070:43:0;;;;;;;;;;;;;;;65815:19:::1;:33:::0;;-1:-1:-1;;;;;;65815:33:0::1;-1:-1:-1::0;;;;;65815:33:0;;;::::1;::::0;;;::::1;::::0;;65734:122::o;30397:23::-;;;-1:-1:-1;;;;;30397:23:0;;:::o;45414:1243::-;45579:10;45565:25;;;;:13;:25;;;;;;;;;:52;;-1:-1:-1;45606:10:0;45594:23;;;;:11;:23;;;;;;;;45565:52;45557:98;;;;-1:-1:-1;;;45557:98:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45797:12;45812:11;:9;:11::i;:::-;45797:26;-1:-1:-1;45834:58:0;-1:-1:-1;;;;;45834:5:0;:22;45857:10;45877:4;45884:7;45834:22;:58::i;:::-;45903:21;45943:11;;45958:1;45943:16;45939:157;;45992:36;46023:4;45993:24;46005:11;;45993:7;:11;;:24;;;;:::i;45992:36::-;45976:52;;45939:157;;;-1:-1:-1;46077:7:0;45939:157;46130:11;;:30;;46146:13;46130:15;:30::i;:::-;46116:11;:44;-1:-1:-1;;;;;46181:27:0;;;;;;:8;:27;;;;;;;;46232:113;;;;;;;;;;;;;;;;;;;;;;46313:15;46232:113;;;;;;;;;;;;46181:179;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46387:27;;;;;;46428:14;;46425:111;;46459:65;46480:17;46499:9;46510:13;46459:20;:65::i;:::-;46553:96;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;46553:96:0;;;;;;;;;;;;;45414:1243;;;;;;;:::o;31165:30::-;;;;;;;;;:::o;29038:34::-;;;:::o;61039:206::-;61130:10;;61153:6;;61118:57;;;-1:-1:-1;;;61118:57:0;;;;;;;;;61169:4;61118:57;;;;;61081:7;;;;-1:-1:-1;;;;;61130:10:0;;;;61118:34;;:57;;;;;;;;;;;;;;;61130:10;61118:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;61118:57:0;61194:30;;;-1:-1:-1;;;61194:30:0;;61218:4;61194:30;;;;;;61118:57;;-1:-1:-1;61194:42:0;;61118:57;;-1:-1:-1;;;;;61194:5:0;:15;;;;:30;;;;;61118:57;;61194:30;;;;;;;;:15;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;61194:30:0;;:34;:42::i;:::-;61187:49;;;61039:206;:::o;60477:154::-;60532:7;60559:11;;60574:1;60559:16;:64;;60585:38;60611:11;;60585:21;60601:4;60585:11;:9;:11::i;:38::-;60559:64;;;60578:4;60559:64;60552:71;;60477:154;:::o;64704:270::-;34092:5;;-1:-1:-1;;;;;34092:5:0;34078:10;:19;34070:43;;;;;-1:-1:-1;;;34070:43:0;;;;;;;;;;;;-1:-1:-1;;;34070:43:0;;;;;;;;;;;;;;;64777:20;64774:196:::1;;64818:10;::::0;64839:6:::1;::::0;64847:41:::1;::::0;;-1:-1:-1;;;64847:41:0;;-1:-1:-1;;;;;64818:10:0;;::::1;64847:41;::::0;::::1;::::0;;;;;64818:10;;64806:32:::1;::::0;64839:6;64847:10:::1;:20:::0;;::::1;::::0;::::1;::::0;:41;;;;;::::1;::::0;;;;;;;;:20;:41;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;64847:41:0;64806:83:::1;::::0;;-1:-1:-1;;;;;;64806:83:0::1;::::0;;;;;;::::1;::::0;::::1;::::0;;;;;;;;;;;;;;;;;-1:-1:-1;;64806:83:0;;;;;;;-1:-1:-1;64806:83:0;;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;64774:196;;;64919:10;::::0;64940:6:::1;::::0;64907:57:::1;::::0;;-1:-1:-1;;;64907:57:0;;::::1;::::0;::::1;::::0;;;;;;;;;;;-1:-1:-1;;;;;64919:10:0;;::::1;::::0;64907:32:::1;::::0;:57;;;;;64919:10:::1;::::0;64907:57;;;;;;;;64919:10;;64907:57;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;64704:270:::0;:::o;52531:579::-;52641:10;52608:21;52632:20;;;:8;:20;;;;;:30;;52653:8;;52632:30;;;;;;;;;;;;;;;;52608:54;;52724:11;;52675:45;52708:11;;52675:28;52691:11;:9;:11::i;:::-;52675;;;:15;:28::i;:45::-;:60;;52667:96;;;;;-1:-1:-1;;;52667:96:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;52812:10;52772:20;52795:28;;;:16;:28;;;;;;;;-1:-1:-1;;;;;52795:37:0;;;;;;;;;;;:44;;52846:37;;;52894:77;;;;;;;;52908:11;;52894:77;;52921:22;;;;;;52894:77;;;;;;52945:25;;;;;52894:77;;;;;;52846:130;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53039:11;;53052:22;;53076:25;;52990:112;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52795:44;;52990:112;;;;;;;;;;52531:579;;;;:::o;63966:389::-;34092:5;;-1:-1:-1;;;;;34092:5:0;34078:10;:19;34070:43;;;;;-1:-1:-1;;;34070:43:0;;;;;;;;;;;;-1:-1:-1;;;34070:43:0;;;;;;;;;;;;;;;64065:10:::1;:24:::0;;-1:-1:-1;;;;;;64065:24:0::1;-1:-1:-1::0;;;;;64065:24:0;;::::1;::::0;;;::::1;::::0;;;;64094:6:::1;:19:::0;;;64174:64:::1;::::0;;-1:-1:-1;;;64174:64:0;;64211:4:::1;64174:64;::::0;::::1;::::0;64226:10;;::::1;64174:64:::0;;;;;-1:-1:-1;;64181:10:0::1;64174:28:::0;;::::1;::::0;::::1;::::0;:64;;;;;::::1;::::0;;;;;;;;:28;:64;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;64174:64:0;;-1:-1:-1;64246:20:0;64243:108:::1;;64274:71;-1:-1:-1::0;;;;;64281:10:0::1;64274:30;64313:11:::0;-1:-1:-1;;64274:30:0::1;:71::i;35560:984::-:0;2824:1;3430:7;;:19;;3422:63;;;;;-1:-1:-1;;;3422:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;2824:1;3563:7;:18;35697:11:::1;::::0;35686:22;::::1;;35678:53;;;::::0;;-1:-1:-1;;;35678:53:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;35678:53:0;;;;;;;;;;;;;::::1;;35744:12;35759:11;:9;:11::i;:::-;35744:26:::0;-1:-1:-1;35781:58:0::1;-1:-1:-1::0;;;;;35781:5:0::1;:22;35804:10;35824:4;35831:7:::0;35781:22:::1;:58::i;:::-;35850:21;35890:11;;35905:1;35890:16;35886:157;;35939:36;35970:4;35940:24;35952:11;;35940:7;:11;;:24;;;;:::i;35939:36::-;35923:52;;35886:157;;;-1:-1:-1::0;36024:7:0;35886:157:::1;36077:11;::::0;:30:::1;::::0;36093:13;36077:15:::1;:30::i;:::-;36063:11;:44:::0;-1:-1:-1;;;;;36128:20:0;::::1;;::::0;;;:8:::1;:20;::::0;;;;;;;36172:85;;::::1;::::0;::::1;::::0;;;;;36196:15:::1;36172:85:::0;;::::1;::::0;;;;;;;;;;;;;;;;;;;;;36128:144;;::::1;::::0;;::::1;::::0;;;;;;;;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;::::1;::::0;;;;;;;;::::1;::::0;;;;;;::::1;::::0;;::::1;::::0;;;;;;::::1;::::0;;::::1;::::0;;;;36308:20;;;;;;36342:14;;36339:104:::1;;36373:58;36394:10;36406:9;36417:13;36373:20;:58::i;:::-;36460:76;::::0;;;;;::::1;::::0;::::1;::::0;;;36520:15:::1;36460:76:::0;;;;;;-1:-1:-1;;;;;36460:76:0;::::1;::::0;36472:10:::1;::::0;36460:76:::1;::::0;;;;;;;::::1;-1:-1:-1::0;;2780:1:0;3742:7;:22;-1:-1:-1;;;;35560:984:0:o;30278:21::-;;;;:::o;62350:269::-;34092:5;;-1:-1:-1;;;;;34092:5:0;34078:10;:19;34070:43;;;;;-1:-1:-1;;;34070:43:0;;;;;;;;;;;;-1:-1:-1;;;34070:43:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;62437:18:0;::::1;;::::0;;;:11:::1;:18;::::0;;;;;::::1;;:30;;::::0;::::1;;;62434:178;;-1:-1:-1::0;;;;;62475:18:0;::::1;;::::0;;;:11:::1;:18;::::0;;;;:29;;-1:-1:-1;;62475:29:0::1;::::0;::::1;;;::::0;;;62515:50:::1;;62547:16;:18:::0;;-1:-1:-1;;62547:18:0;;;;;62515:50:::1;;;62526:16;:18:::0;;::::1;::::0;::::1;::::0;;;62515:50:::1;-1:-1:-1::0;62578:28:0::1;::::0;;-1:-1:-1;;;;;62578:28:0;::::1;::::0;;;::::1;;;::::0;::::1;::::0;;;::::1;::::0;;;;;;;;;::::1;62434:178;62350:269:::0;;:::o;30734:26::-;;;;:::o;30458:28::-;;;-1:-1:-1;;;;;30458:28:0;;:::o;38568:124::-;38645:10;38636:20;;;;:8;:20;;;;;:30;;38627:57;;38636:20;38657:8;;38636:30;;;;;;;;;;;;;;;;:37;;;38675:8;38627;:57::i;63048:118::-;34092:5;;-1:-1:-1;;;;;34092:5:0;34078:10;:19;34070:43;;;;;-1:-1:-1;;;34070:43:0;;;;;;;;;;;;-1:-1:-1;;;34070:43:0;;;;;;;;;;;;;;;63128:18:::1;:30:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;63128:30:0;;::::1;::::0;;;::::1;::::0;;63048:118::o;29372:46::-;;;:::o;64472:132::-;34092:5;;-1:-1:-1;;;;;34092:5:0;34078:10;:19;34070:43;;;;;-1:-1:-1;;;34070:43:0;;;;;;;;;;;;-1:-1:-1;;;34070:43:0;;;;;;;;;;;;;;;64532:10:::1;::::0;64552:6:::1;::::0;64560:35:::1;::::0;;-1:-1:-1;;;64560:35:0;;64589:4:::1;64560:35;::::0;::::1;::::0;;;-1:-1:-1;;;;;64532:10:0;;::::1;::::0;64520:31:::1;::::0;64552:6;64560:10:::1;:20:::0;;::::1;::::0;::::1;::::0;:35;;;;;::::1;::::0;;;;;;;;;:20;:35;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;64560:35:0;64520:76:::1;::::0;;-1:-1:-1;;;;;;64520:76:0::1;::::0;;;;;;::::1;::::0;::::1;::::0;;;;;;;;;;;;;;;;;-1:-1:-1;;64520:76:0;;;;;;;-1:-1:-1;64520:76:0;;::::1;;::::0;::::1;;;;::::0;::::1;30905:42:::0;;;;;;;;;:::o;48073:1638::-;48201:18;;;;48193:49;;;;;-1:-1:-1;;;48193:49:0;;;;;;;;;;;;-1:-1:-1;;;48193:49:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;48255:31:0;;48276:10;48255:31;;48247:66;;;;;-1:-1:-1;;;48247:66:0;;;;;;;;;;;;-1:-1:-1;;;48247:66:0;;;;;;;;;;;;;;;48352:10;48343:20;;;;:8;:20;;;;;:27;48332:38;;48324:65;;;;;-1:-1:-1;;;48324:65:0;;;;;;;;;;;;-1:-1:-1;;;48324:65:0;;;;;;;;;;;;;;;48433:10;48400:21;48424:20;;;:8;:20;;;;;:30;;48445:8;;48424:30;;;;;;;;;;;;;;;;48400:54;;48459:26;48488:41;48517:11;;48488:24;48500:11;:9;:11::i;:::-;48488:7;;:11;:24::i;:41::-;48459:70;;48570:11;;48548:18;:33;;48540:69;;;;;-1:-1:-1;;;48540:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;48639:11;;48628:22;;;48620:66;;;;;-1:-1:-1;;;48620:66:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;48620:66:0;;;;;;;;;;;;;;;48701:16;;;;;;;48697:86;;48740:11;;48729:22;;48721:59;;;;;-1:-1:-1;;;48721:59:0;;;;;;;;;;;;-1:-1:-1;;;48721:59:0;;;;;;;;;;;;;;;48817:11;;:24;;48833:7;48817:15;:24::i;:::-;48803:38;;48877:10;48803:11;48868:20;;;:8;:20;;;;;;48902:14;;48899:98;;48933:52;48954:10;48966:9;48977:7;48933:20;:52::i;:::-;-1:-1:-1;;;;;;49013:27:0;;;;;;:8;:27;;;;;;49054:14;;49051:105;;49085:59;49106:17;49125:9;49136:7;49085:20;:59::i;:::-;-1:-1:-1;;;;;49176:27:0;;;;;;:8;:27;;;;;;;;49227:105;;;;;;;;;;49245:22;;;;;49227:105;;;;;;;;;;;;49289:15;49227:105;;;;;;49306:25;;;;;49227:105;;;;;;49176:171;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49364:11;;:15;49360:263;;49424:45;49457:11;;49424:28;49440:11;:9;:11::i;49424:45::-;49396:25;;;:73;49510:15;49484:23;;;:41;49360:263;;;49558:34;49571:10;49583:8;49558:12;:34::i;:::-;49640:63;;;;;;;;;;;;;;-1:-1:-1;;;;;49640:63:0;;;49654:10;;49640:63;;;;;;;;;;;48073:1638;;;;;;:::o;28940:85::-;;;:::o;29645:47::-;;;;;;;;;;;;-1:-1:-1;;;;;29645:47:0;;:::o;36976:1581::-;2824:1;3430:7;;:19;;3422:63;;;;;-1:-1:-1;;;3422:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;2824:1;3563:7;:18;37135:11;37127:42:::1;;;::::0;;-1:-1:-1;;;37127:42:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;37127:42:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;37188:24:0;::::1;;::::0;;;:8:::1;:24;::::0;;;;:31;:42;-1:-1:-1;37180:69:0::1;;;::::0;;-1:-1:-1;;;37180:69:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;37180:69:0;;;;;;;;;;;;;::::1;;37287:5;::::0;-1:-1:-1;;;;;37287:5:0::1;37273:10;:19;37270:100;;-1:-1:-1::0;;;;;37304:28:0;::::1;37322:10;37304:28;37296:71;;;::::0;;-1:-1:-1;;;37296:71:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;37382:12;37397:11;:9;:11::i;:::-;37382:26:::0;-1:-1:-1;37419:58:0::1;-1:-1:-1::0;;;;;37419:5:0::1;:22;37442:10;37462:4;37469:7:::0;37419:22:::1;:58::i;:::-;37488:21;37528:11;;37543:1;37528:16;37524:157;;37577:36;37608:4;37578:24;37590:11;;37578:7;:11;;:24;;;;:::i;37577:36::-;37561:52;;37524:157;;;-1:-1:-1::0;37662:7:0;37524:157:::1;-1:-1:-1::0;;;;;37715:24:0;::::1;37691:21;37715:24:::0;;;:8:::1;:24;::::0;;;;:34;;37740:8;;37715:34;::::1;;;;;;;;;;;;;;;37691:58;;37776:30;37792:13;37776:4;:11;;;:15;;:30;;;;:::i;:::-;37762:44:::0;;37831:11:::1;::::0;:30:::1;::::0;37847:13;37831:15:::1;:30::i;:::-;37817:11;:44:::0;37910:25:::1;::::0;::::1;::::0;37885:50;::::1;::::0;:123:::1;;-1:-1:-1::0;37963:22:0::1;::::0;::::1;::::0;:45:::1;::::0;37990:17:::1;37963:26;:45::i;:::-;37945:15;:63;37885:123;37882:192;;;38017:25;::::0;::::1;:50:::0;;;37882:192:::1;38116:45;38149:11;;38116:28;38132:11;:9;:11::i;:::-;38116::::0;;;:15:::1;:28::i;:45::-;38088:25;::::0;::::1;:73:::0;38198:15:::1;38172:23;::::0;;::::1;:41:::0;;;38218:22:::1;::::0;::::1;:40:::0;;;;-1:-1:-1;;;;;38293:24:0;::::1;-1:-1:-1::0;38293:24:0;;;::::1;::::0;;;;;;;;38331:14;;38328:108:::1;;38362:62;38383:14;38399:9;38410:13;38362:20;:62::i;:::-;38453:96;::::0;;;;;::::1;::::0;::::1;::::0;;;;;;;;;38533:15:::1;38453:96:::0;;;;;;-1:-1:-1;;;;;38453:96:0;::::1;::::0;38471:10:::1;::::0;38453:96:::1;::::0;;;;;;;::::1;-1:-1:-1::0;;2780:1:0;3742:7;:22;-1:-1:-1;;;;;;36976:1581:0:o;34322:887::-;2824:1;3430:7;;:19;;3422:63;;;;;-1:-1:-1;;;3422:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;2824:1;3563:7;:18;34394:11;34386:42:::1;;;::::0;;-1:-1:-1;;;34386:42:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;34386:42:0;;;;;;;;;;;;;::::1;;34442:12;34457:11;:9;:11::i;:::-;34442:26:::0;-1:-1:-1;34479:58:0::1;-1:-1:-1::0;;;;;34479:5:0::1;:22;34502:10;34522:4;34529:7:::0;34479:22:::1;:58::i;:::-;34548:21;34588:11;;34603:1;34588:16;34584:157;;34637:36;34668:4;34638:24;34650:11;;34638:7;:11;;:24;;;;:::i;34637:36::-;34621:52;;34584:157;;;-1:-1:-1::0;34722:7:0;34584:157:::1;34775:11;::::0;:30:::1;::::0;34791:13;34775:15:::1;:30::i;:::-;34761:11;:44:::0;34835:10:::1;34826:20;::::0;;;:8:::1;:20;::::0;;;;;;;34870:69;;::::1;::::0;::::1;::::0;;;;;34894:15:::1;34870:69:::0;;::::1;::::0;;;;;;;;;;;;;;;;;;;;;34826:128;;::::1;::::0;;::::1;::::0;;;;;;;;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;::::1;::::0;;;;;;;;::::1;::::0;;;;;;::::1;::::0;;::::1;::::0;;;;;;::::1;::::0;;::::1;::::0;;;;34989:20;;;;;;35023:14;;35020:104:::1;;35054:58;35075:10;35087:9;35098:13;35054:20;:58::i;:::-;35141:60;::::0;;;;;::::1;::::0;::::1;::::0;;;35185:15:::1;35141:60:::0;;;;;;35149:10:::1;::::0;35141:60:::1;::::0;;;;;;;;::::1;-1:-1:-1::0;;2780:1:0;3742:7;:22;-1:-1:-1;;34322:887:0:o;46879:1098::-;46976:10;46967:20;;;;:8;:20;;;;;:27;:38;-1:-1:-1;46959:67:0;;;;;-1:-1:-1;;;46959:67:0;;;;;;;;;;;;-1:-1:-1;;;46959:67:0;;;;;;;;;;;;;;;47080:10;47047:21;47071:20;;;:8;:20;;;;;:30;;47092:8;;47071:30;;;;;;;;;;;;;;;;47047:54;;47148:45;47175:17;47148:4;:22;;;:26;;:45;;;;:::i;:::-;47130:15;:63;47122:96;;;;;-1:-1:-1;;;47122:96:0;;;;;;;;;;;;-1:-1:-1;;;47122:96:0;;;;;;;;;;;;;;;47239:21;47263:47;47298:11;;47264:28;47280:4;:11;;;47264;:9;:11::i;47263:47::-;47368:5;;47356:42;;;-1:-1:-1;;;47356:42:0;;-1:-1:-1;;;;;47356:42:0;;;;;;;;;47239:71;;-1:-1:-1;47322:13:0;;47338:72;;47404:5;;47338:61;;47368:5;;;47356:31;;:42;;;;;;;;;;;;;;;47368:5;47356:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47356:42:0;47338:13;;:17;:61::i;:72::-;47455:5;;47431:30;;;-1:-1:-1;;;47431:30:0;;-1:-1:-1;;;;;47455:5:0;;;47431:30;;;;;;47322:88;;-1:-1:-1;47322:88:0;;47438:5;47431:23;;;;;;:30;;;;;;;;;;;;;;;:23;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47431:30:0;:39;;47423:96;;;;-1:-1:-1;;;47423:96:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;47543:26:0;;47564:4;47543:26;47540:430;;;47598:5;;47586:77;;;-1:-1:-1;;;47586:77:0;;47624:10;47586:77;;;;-1:-1:-1;;;;;47586:77:0;;;;;;;;;;;;;;;;;;;;;47598:5;;;;;47586:37;;:77;;;;;47598:5;;47586:77;;;;;;;47598:5;;47586:77;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47540:430;;;47748:11;;47726:55;;47761:8;47771:9;47726:21;:55::i;:::-;47830:5;;;;;;;;;-1:-1:-1;;;;;47830:5:0;-1:-1:-1;;;;;47818:37:0;;47856:10;47868:9;47879:5;47933:1;47894:9;-1:-1:-1;;;;;47886:32:0;;47919:10;47886:44;;;;;;;;;;;;;-1:-1:-1;;;;;47886:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47886:44:0;47818:117;;;-1:-1:-1;;;;;;47818:117:0;;;;;;;-1:-1:-1;;;;;47818:117:0;;;;;;;;;;;;;;;;;;;;;;47886:48;;47818:117;;;;;;;;;;;-1:-1:-1;;47818:117:0;;;;;;;-1:-1:-1;47818:117:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46879:1098;;;;;:::o;31004:37::-;;;;;;;;;:::o;51103:951::-;51204:9;51200:847;51219:24;;;51200:847;;;51293:10;51259:12;:30;51272:13;;51286:1;51272:16;;;;;;;-1:-1:-1;;;;;51272:16:0;;;;;;;;;;;51259:30;;;;;;;;;;;;-1:-1:-1;51259:30:0;;;:44;;;;51256:786;;-1:-1:-1;51256:786:0;;51312:17;51332:8;:26;51341:13;;51355:1;51341:16;;;;;;;;;;;;;-1:-1:-1;;;;;51341:16:0;-1:-1:-1;;;;;51332:26:0;-1:-1:-1;;;;;51332:26:0;;;;;;;;;;;;;51312:46;;51435:9;51421:10;:23;51418:618;;51459:23;51485:36;51504:13;;51518:1;51504:16;;;;;;;;;;;;;-1:-1:-1;;;;;51504:16:0;51485:18;:36::i;:::-;51459:62;-1:-1:-1;51532:19:0;;51529:453;;51565:15;;51562:412;;51596:14;51593:280;;51623:67;51644:13;;51658:1;51644:16;;;;;;;;;;;;;-1:-1:-1;;;;;51644:16:0;51662:10;51674:15;51623:20;:67::i;:::-;51593:280;;;51718:66;51739:13;;51753:1;51739:16;;;;;;;;;;;;;-1:-1:-1;;;;;51739:16:0;51757:9;51768:15;51718:20;:66::i;:::-;51795:67;51816:13;;51830:1;51816:16;;;;;;51795:67;51562:412;;;51898:66;51919:13;;51933:1;51919:16;;;;;;51898:66;52018:10;51989:8;:26;51998:13;;52012:1;51998:16;;;;;;;;;;;;;-1:-1:-1;;;;;51998:16:0;-1:-1:-1;;;;;51989:26:0;-1:-1:-1;;;;;51989:26:0;;;;;;;;;;;;:39;;;;51418:618;;51256:786;;51245:3;;51200:847;;60209:195;60325:10;;60348:6;;60313:57;;;-1:-1:-1;;;60313:57:0;;;;;;;;;60364:4;60313:57;;;;;60276:7;;;;-1:-1:-1;;;;;60325:10:0;;;;60313:34;;:57;;;;;;;;;;;;;;;60325:10;60313:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;60313:57:0;;-1:-1:-1;;60209:195:0;:::o;57926:814::-;58009:13;;-1:-1:-1;;;;;58009:13:0;58001:63;;;;;-1:-1:-1;;;58001:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;58094:17:0;;;;;;:8;:17;;;;;:24;58083:35;;58075:64;;;;;-1:-1:-1;;;58075:64:0;;;;;;;;;;;;-1:-1:-1;;;58075:64:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;58174:17:0;;58150:21;58174:17;;;:8;:17;;;;;:27;;58192:8;;58174:27;;;;;;;;;;;;;;;;58150:51;;58228:1;58214:4;:11;;;:15;58206:38;;;;;-1:-1:-1;;;58206:38:0;;;;;;;;;;;;-1:-1:-1;;;58206:38:0;;;;;;;;;;;;;;;58265:21;58289:47;58324:11;;58290:28;58306:4;:11;;;58290;:9;:11::i;58289:47::-;58377:11;;58361;;58265:71;;-1:-1:-1;58361:28:0;;:11;:15;:28::i;:::-;58347:11;:42;58418:1;58404:15;;;58553:13;;;58603:22;;;58627:25;;;;;58545:108;;;-1:-1:-1;;;58545:108:0;;;;;;;;-1:-1:-1;;;;;58545:108:0;;;;;;;;;;;;;;;;;;;;;;58553:13;;;;;58545:33;;:108;;;;;;;;;;;58418:1;58553:13;58545:108;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;58711:11:0;;58671:61;;;;;;;;;;;;;;;-1:-1:-1;;;;;58671:61:0;;;-1:-1:-1;58684:10:0;;-1:-1:-1;58671:61:0;;;;;;;;;;57926:814;;;;:::o;53804:325::-;-1:-1:-1;;;;;53976:23:0;;;53903:7;53976:23;;;:16;:23;;;;;;;;:32;;;;;;;;;;;:45;;53903:7;;;;;;53976:32;54009:11;;53976:45;;;;;;;;;;;;;;;;;;;54040:17;;54059:28;;;;54089:31;;;;;54040:17;;54059:28;;-1:-1:-1;54089:31:0;-1:-1:-1;53804:325:0;-1:-1:-1;;;;;53804:325:0:o;31079:35::-;;;;;;;;;:::o;61836:289::-;34092:5;;-1:-1:-1;;;;;34092:5:0;34078:10;:19;34070:43;;;;;-1:-1:-1;;;34070:43:0;;;;;;;;;;;;-1:-1:-1;;;34070:43:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;61927:22:0;::::1;;::::0;;;:13:::1;:22;::::0;;;;;::::1;;:34;;::::0;::::1;;;61924:194;;-1:-1:-1::0;;;;;61969:22:0;::::1;;::::0;;;:13:::1;:22;::::0;;;;:33;;-1:-1:-1;;61969:33:0::1;::::0;::::1;;;::::0;;;62013:54:::1;;62047:18;:20:::0;;-1:-1:-1;;62047:20:0;;;;;62013:54:::1;;;62024:18;:20:::0;;::::1;::::0;::::1;::::0;;;62013:54:::1;-1:-1:-1::0;62080:32:0::1;::::0;;-1:-1:-1;;;;;62080:32:0;::::1;::::0;;;::::1;;;::::0;::::1;::::0;;;::::1;::::0;;;;;;;;;::::1;61836:289:::0;;:::o;52122:235::-;52202:11;;52182:15;;52202:11;;;;;:52;;-1:-1:-1;52244:10:0;;52202:52;;;-1:-1:-1;52224:9:0;;52202:52;-1:-1:-1;;;;;;52265:21:0;;;;;;;:12;:21;;;;;;;;;:33;;-1:-1:-1;;;;;;52265:33:0;;;;;;;;;52318:31;;;;;;;;;;;;;;;;;;;;;;;;52122:235;;:::o;66092:329::-;34092:5;;-1:-1:-1;;;;;34092:5:0;34078:10;:19;34070:43;;;;;-1:-1:-1;;;34070:43:0;;;;;;;;;;;;-1:-1:-1;;;34070:43:0;;;;;;;;;;;;;;;66201:5:::1;-1:-1:-1::0;;;;;66176:31:0::1;:13;-1:-1:-1::0;;;;;66176:31:0::1;;;66168:55;;;::::0;;-1:-1:-1;;;66168:55:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;66168:55:0;;;;;;;;;;;;;::::1;;66261:10;-1:-1:-1::0;;;;;66236:36:0::1;:13;-1:-1:-1::0;;;;;66236:36:0::1;;;66228:60;;;::::0;;-1:-1:-1;;;66228:60:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;66228:60:0;;;;;;;;;;;;;::::1;;66344:5;::::0;66332:35:::1;::::0;;-1:-1:-1;;;66332:35:0;;;;66297:119:::1;::::0;-1:-1:-1;;;;;66344:5:0::1;::::0;66332:33:::1;::::0;:35:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;66344:5;66332:35;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;66332:35:0;66369:46:::1;::::0;;-1:-1:-1;;;66369:46:0;;66409:4:::1;66369:46;::::0;::::1;::::0;;;-1:-1:-1;;;;;66369:31:0;::::1;::::0;::::1;::::0;:46;;;;;66332:35:::1;::::0;66369:46;;;;;;;:31;:46;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;66369:46:0;-1:-1:-1;;;;;66297:34:0;::::1;::::0;:119;:34:::1;:119::i;61343:117::-:0;34092:5;;-1:-1:-1;;;;;34092:5:0;34078:10;:19;34070:43;;;;;-1:-1:-1;;;34070:43:0;;;;;;;;;;;;-1:-1:-1;;;34070:43:0;;;;;;;;;;;;;;;61422:22:::1;:33:::0;;;::::1;;;;-1:-1:-1::0;;61422:33:0;;::::1;::::0;;;::::1;::::0;;61343:117::o;62859:100::-;34092:5;;-1:-1:-1;;;;;34092:5:0;34078:10;:19;34070:43;;;;;-1:-1:-1;;;34070:43:0;;;;;;;;;;;;-1:-1:-1;;;34070:43:0;;;;;;;;;;;;;;;62927:13:::1;:24:::0;;-1:-1:-1;;;;;;62927:24:0::1;-1:-1:-1::0;;;;;62927:24:0;;;::::1;::::0;;;::::1;::::0;;62859:100::o;56356:1352::-;56439:19;;-1:-1:-1;;;;;56439:19:0;56431:54;;;;;-1:-1:-1;;;56431:54:0;;;;;;;;;;;;-1:-1:-1;;;56431:54:0;;;;;;;;;;;;;;;56524:10;56515:20;;;;:8;:20;;;;;:27;56504:38;;56496:67;;;;;-1:-1:-1;;;56496:67:0;;;;;;;;;;;;-1:-1:-1;;;56496:67:0;;;;;;;;;;;;;;;56607:10;56574:21;56598:20;;;:8;:20;;;;;:30;;56619:8;;56598:30;;;;;;;;;;;;;;;;56574:54;;56657:1;56647:7;:11;56639:43;;;;;-1:-1:-1;;;56639:43:0;;;;;;;;;;;;-1:-1:-1;;;56639:43:0;;;;;;;;;;;;;;;56712:11;;56701:22;;;56693:66;;;;;-1:-1:-1;;;56693:66:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;56693:66:0;;;;;;;;;;;;;;;56772:21;56796:43;56827:11;;56797:24;56813:7;56797:11;:9;:11::i;56796:43::-;56864:11;;56772:67;;-1:-1:-1;56864:24:0;;56880:7;56864:15;:24::i;:::-;56850:38;;56913:11;;:24;;56929:7;56913:15;:24::i;:::-;56899:11;:38;56954:11;;:15;56950:282;;57014:64;57066:11;;57014:47;57030:30;57046:13;57030:11;:9;:11::i;57014:64::-;56986:25;;;:92;57119:15;57093:23;;;:41;56950:282;;;57167:34;57180:10;57192:8;57167:12;:34::i;:::-;57267:10;57238:17;57258:20;;;:8;:20;;;;;;57292:14;;57289:98;;57323:52;57344:10;57356:9;57367:7;57323:20;:52::i;:::-;57407:19;;57398:56;;;;;;57407:19;57398:56;;;;;;;;;;;;-1:-1:-1;;;;;57407:19:0;;;;57398:56;;;;;;;;;57486:19;;57467:54;;-1:-1:-1;;;;;57467:5:0;:18;;;57486:19;57507:13;57467:18;:54::i;:::-;57534:19;;57526:65;;;-1:-1:-1;;;57526:65:0;;;;;;;;57580:10;57526:65;;;;;;-1:-1:-1;;;;;57534:19:0;;;;57526:38;;:65;;;;;57534:19;;57526:65;;;;;;;;57534:19;;57526:65;;;;;;;;;;63289:109;34092:5;;-1:-1:-1;;;;;34092:5:0;34078:10;:19;34070:43;;;;;-1:-1:-1;;;34070:43:0;;;;;;;;;;;;-1:-1:-1;;;34070:43:0;;;;;;;;;;;;;;;63364:18:::1;:29:::0;;-1:-1:-1;;63364:29:0::1;::::0;::::1;;::::0;;;::::1;::::0;;63289:109::o;59384:334::-;-1:-1:-1;;;;;59496:15:0;;59448:7;59496:15;;;:8;:15;;;;;59547:13;;59448:7;;59599:85;59620:14;59616:1;:18;59599:85;;;59662:6;59669:1;59662:9;;;;;;;;;;;;;;;;;;;;;:16;59647:31;;;;;59636:3;;59599:85;;;-1:-1:-1;59699:11:0;59384:334;-1:-1:-1;;;;59384:334:0:o;63571:184::-;34092:5;;-1:-1:-1;;;;;34092:5:0;34078:10;:19;34070:43;;;;;-1:-1:-1;;;34070:43:0;;;;;;;;;;;;-1:-1:-1;;;34070:43:0;;;;;;;;;;;;;;;63642:10:::1;::::0;63672:6:::1;::::0;63630:49:::1;::::0;;-1:-1:-1;;;63630:49:0;;::::1;::::0;::::1;::::0;;;;;-1:-1:-1;;;;;63642:10:0;;::::1;::::0;63630:41:::1;::::0;:49;;;;;63642:10:::1;::::0;63630:49;;;;;;;;63642:10;;63630:49;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;63709:5:0::1;::::0;63716:30:::1;::::0;;-1:-1:-1;;;63716:30:0;;63740:4:::1;63716:30;::::0;::::1;::::0;;;63690:57:::1;::::0;-1:-1:-1;;;;;;63709:5:0;;::::1;::::0;-1:-1:-1;63716:5:0::1;:15:::0;;::::1;::::0;::::1;::::0;:30;;;;;::::1;::::0;;;;;;;;;:15;:30;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;63716:30:0;-1:-1:-1;;;;;63690:5:0::1;:18;::::0;:57;:18:::1;:57::i;:::-;63571:184::o:0;60733:148::-;-1:-1:-1;;;;;60839:17:0;;60812:7;60839:17;;;:8;:17;;;;;:27;;60857:8;;60839:27;;;;;;;;;;;;;;;;:34;;;60832:41;;60733:148;;;;:::o;30518:34::-;;;-1:-1:-1;;;;;30518:34:0;;:::o;29310:54::-;;;:::o;29562:50::-;;;;;;;;;;;;;:::o;59198:118::-;-1:-1:-1;;;;;59286:15:0;59259:7;59286:15;;;:8;:15;;;;;:22;;59198:118::o;59868:264::-;59979:10;;60002:6;;59967:57;;;-1:-1:-1;;;59967:57:0;;;;;;;;;60018:4;59967:57;;;;;59930:7;;;;-1:-1:-1;;;;;59979:10:0;;;;59967:34;;:57;;;;;;;;;;;;;;;59979:10;59967:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;59967:57:0;60071:7;;59967:57;;-1:-1:-1;60035:22:0;;60060:30;;60084:5;;60060:19;;59967:57;;60060:10;:19::i;:30::-;60035:55;-1:-1:-1;;;59868:264:0;:::o;29480:43::-;;;;;;;;;;;;;:::o;30340:20::-;;;-1:-1:-1;;;;;30340:20:0;;:::o;29082:29::-;;;-1:-1:-1;;;;;29082:29:0;;:::o;28890:::-;;;:::o;23935:670::-;24353:10;;;24352:62;;-1:-1:-1;24369:39:0;;;-1:-1:-1;;;24369:39:0;;24393:4;24369:39;;;;-1:-1:-1;;;;;24369:39:0;;;;;;;;;:15;;;;;;:39;;;;;;;;;;;;;;;:15;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24369:39:0;:44;24352:62;24330:166;;;;-1:-1:-1;;;24330:166:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24534:62;;;-1:-1:-1;;;;;24534:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;24534:62:0;-1:-1:-1;;;24534:62:0;;;24507:90;;24527:5;;24507:19;:90::i;18025:229::-;18162:12;18194:52;18216:6;18224:4;18230:1;18233:12;18194:21;:52::i;:::-;18187:59;;18025:229;;;;;;:::o;67024:232::-;67152:27;;;;:15;:27;;;;;;:37;;67184:4;67152:31;:37::i;:::-;67122:27;;;;:15;:27;;;;;;;;;:67;;;;67215:33;;;;;;;;;;;;;-1:-1:-1;;;;;67215:33:0;;;;;;;;;;;;67024:232;;;:::o;67262:235::-;67390:27;;;;:15;:27;;;;;;:37;;67422:4;67390:31;:37::i;:::-;67360:27;;;;:15;:27;;;;;;;;;:67;;;;67453:36;;;;;;;;;;;;;-1:-1:-1;;;;;67453:36:0;;;;;;;;;;;;67262:235;;;:::o;6539:179::-;6597:7;6629:5;;;6653:6;;;;6645:46;;;;;-1:-1:-1;;;6645:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;7418:220;7476:7;7500:6;7496:20;;-1:-1:-1;7515:1:0;7508:8;;7496:20;7539:5;;;7543:1;7539;:5;:1;7563:5;;;;;:10;7555:56;;;;-1:-1:-1;;;7555:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8116:153;8174:7;8206:1;8202;:5;8194:44;;;;;-1:-1:-1;;;8194:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;8260:1;8256;:5;;;;;;;8116:153;-1:-1:-1;;;8116:153:0:o;7001:158::-;7059:7;7092:1;7087;:6;;7079:49;;;;;-1:-1:-1;;;7079:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7146:5:0;;;7001:158::o;67553:325::-;-1:-1:-1;;;;;67657:17:0;;67629:25;67657:17;;;:8;:17;;;;;67707:13;;-1:-1:-1;;67707:17:0;67748:23;;;67745:93;;67807:6;67814:11;67807:19;;;;;;;;;;;;;;;;;;67788:6;67795:8;67788:16;;;;;;;;;;;;;;;;;;:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67745:93;67858:6;:12;;;;;;;;;;;;;;;-1:-1:-1;;67858:12:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;67553:325:0:o;23199:211::-;23343:58;;;-1:-1:-1;;;;;23343:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;23343:58:0;-1:-1:-1;;;23343:58:0;;;23316:86;;23336:5;;23316:19;:86::i;66482:456::-;-1:-1:-1;;;;;66599:23:0;;66562:34;66599:23;;;:16;:23;;;;;;;;66623:10;66599:35;;;;;;;66671:17;;66599:35;;66562:34;66671:24;;66693:1;66671:21;:24::i;:::-;66645:50;;66734:15;66719:11;:30;66716:115;;66792:10;66803:15;66792:27;;;;;;;;;;;;;;;;;;66766:10;66777:11;66766:23;;;;;;;;;;;;;;;;:53;;:23;;;;;:53;;;;;;;;;;;;;;;;;;;;66716:115;66851:10;:16;;;;;;;;;;;;;;;;-1:-1:-1;;66851:16:0;;;;;;;;;;;;;;;;;;;;;;;;66881:52;;;-1:-1:-1;;;;;66881:52:0;;;;66909:10;66881:52;;;;;;;;;;;;;;;;;;;;;;;66482:456;;;;:::o;23418:248::-;23589:68;;;-1:-1:-1;;;;;23589:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;23589:68:0;-1:-1:-1;;;23589:68:0;;;23562:96;;23582:5;;25710:774;26134:23;26160:69;26188:4;26160:69;;;;;;;;;;;;;;;;;26168:5;-1:-1:-1;;;;;26160:27:0;;;:69;;;;;:::i;:::-;26244:17;;26134:95;;-1:-1:-1;26244:21:0;26240:237;;26399:10;26388:30;;;;;;;;;;;;;;;-1:-1:-1;26388:30:0;26380:85;;;;-1:-1:-1;;;26380:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19145:571;19315:12;19373:5;19348:21;:30;;19340:81;;;;-1:-1:-1;;;19340:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19440:18;19451:6;19440:10;:18::i;:::-;19432:60;;;;;-1:-1:-1;;;19432:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;19566:12;19580:23;19607:6;-1:-1:-1;;;;;19607:11:0;19626:5;19633:4;19607:31;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;19607:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19565:73;;;;19656:52;19674:7;19683:10;19695:12;19656:17;:52::i;:::-;19649:59;19145:571;-1:-1:-1;;;;;;;19145:571:0:o;15085:444::-;15465:20;15513:8;;;15085:444::o;21794:777::-;21944:12;21973:7;21969:595;;;-1:-1:-1;22004:10:0;21997:17;;21969:595;22118:17;;:21;22114:439;;22381:10;22375:17;22442:15;22429:10;22425:2;22421:19;22414:44;22329:148;22524:12;22517:20;;-1:-1:-1;;;22517:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Swarm Source
ipfs://8dc82fc06330c2b549f801eed0a708a5f48763f1310291a3bb8f4d17ad78c402
Age | Block | Fee Address | BC Fee Address | Voting Power | Jailed | Incoming |
---|
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.