Transactions
Token Transfers
Tokens
Internal Transactions
Coin Balance History
Code
Read Contract
Write Contract
Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
- Contract name:
- FarmHTTHEX
- Optimization enabled
- false
- Compiler version
- v0.8.20+commit.a1b79de6
- EVM Version
- default
- Verified at
- 2025-05-04T11:39:55.166281Z
Contract source code
// File: @openzeppelin/contracts/token/ERC20/IERC20.sol
// OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/IERC20.sol)
pragma solidity ^0.8.20;
/**
* @dev Interface of the ERC-20 standard as defined in the ERC.
*/
interface IERC20 {
/**
* @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);
/**
* @dev Returns the value of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the value of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves a `value` amount of tokens from the caller's account to `to`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address to, uint256 value) 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 a `value` amount of tokens 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 value) external returns (bool);
/**
* @dev Moves a `value` amount of tokens from `from` to `to` using the
* allowance mechanism. `value` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(address from, address to, uint256 value) external returns (bool);
}
// File: https://github.com/Uniswap/uniswap-v2-periphery/blob/master/contracts/interfaces/IUniswapV2Router01.sol
pragma solidity >=0.6.2;
interface IUniswapV2Router01 {
function factory() external pure returns (address);
function WETH() external pure returns (address);
function addLiquidity(
address tokenA,
address tokenB,
uint amountADesired,
uint amountBDesired,
uint amountAMin,
uint amountBMin,
address to,
uint deadline
) external returns (uint amountA, uint amountB, uint liquidity);
function addLiquidityETH(
address token,
uint amountTokenDesired,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) external payable returns (uint amountToken, uint amountETH, uint liquidity);
function removeLiquidity(
address tokenA,
address tokenB,
uint liquidity,
uint amountAMin,
uint amountBMin,
address to,
uint deadline
) external returns (uint amountA, uint amountB);
function removeLiquidityETH(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) external returns (uint amountToken, uint amountETH);
function removeLiquidityWithPermit(
address tokenA,
address tokenB,
uint liquidity,
uint amountAMin,
uint amountBMin,
address to,
uint deadline,
bool approveMax, uint8 v, bytes32 r, bytes32 s
) external returns (uint amountA, uint amountB);
function removeLiquidityETHWithPermit(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline,
bool approveMax, uint8 v, bytes32 r, bytes32 s
) external returns (uint amountToken, uint amountETH);
function swapExactTokensForTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external returns (uint[] memory amounts);
function swapTokensForExactTokens(
uint amountOut,
uint amountInMax,
address[] calldata path,
address to,
uint deadline
) external returns (uint[] memory amounts);
function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
external
payable
returns (uint[] memory amounts);
function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
external
returns (uint[] memory amounts);
function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
external
returns (uint[] memory amounts);
function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
external
payable
returns (uint[] memory amounts);
function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}
// File: https://github.com/Uniswap/uniswap-v2-periphery/blob/master/contracts/interfaces/IUniswapV2Router02.sol
pragma solidity >=0.6.2;
interface IUniswapV2Router02 is IUniswapV2Router01 {
function removeLiquidityETHSupportingFeeOnTransferTokens(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) external returns (uint amountETH);
function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline,
bool approveMax, uint8 v, bytes32 r, bytes32 s
) external returns (uint amountETH);
function swapExactTokensForTokensSupportingFeeOnTransferTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external;
function swapExactETHForTokensSupportingFeeOnTransferTokens(
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external payable;
function swapExactTokensForETHSupportingFeeOnTransferTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external;
}
// File: @uniswap/v2-core/contracts/interfaces/IUniswapV2Pair.sol
pragma solidity >=0.5.0;
interface IUniswapV2Pair {
event Approval(address indexed owner, address indexed spender, uint value);
event Transfer(address indexed from, address indexed to, uint value);
function name() external pure returns (string memory);
function symbol() external pure returns (string memory);
function decimals() external pure returns (uint8);
function totalSupply() external view returns (uint);
function balanceOf(address owner) external view returns (uint);
function allowance(address owner, address spender) external view returns (uint);
function approve(address spender, uint value) external returns (bool);
function transfer(address to, uint value) external returns (bool);
function transferFrom(address from, address to, uint value) external returns (bool);
function DOMAIN_SEPARATOR() external view returns (bytes32);
function PERMIT_TYPEHASH() external pure returns (bytes32);
function nonces(address owner) external view returns (uint);
function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;
event Mint(address indexed sender, uint amount0, uint amount1);
event Burn(address indexed sender, uint amount0, uint amount1, address indexed to);
event Swap(
address indexed sender,
uint amount0In,
uint amount1In,
uint amount0Out,
uint amount1Out,
address indexed to
);
event Sync(uint112 reserve0, uint112 reserve1);
function MINIMUM_LIQUIDITY() external pure returns (uint);
function factory() external view returns (address);
function token0() external view returns (address);
function token1() external view returns (address);
function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
function price0CumulativeLast() external view returns (uint);
function price1CumulativeLast() external view returns (uint);
function kLast() external view returns (uint);
function mint(address to) external returns (uint liquidity);
function burn(address to) external returns (uint amount0, uint amount1);
function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
function skim(address to) external;
function sync() external;
function initialize(address, address) external;
}
// File: @uniswap/v2-core/contracts/interfaces/IUniswapV2Factory.sol
pragma solidity >=0.5.0;
interface IUniswapV2Factory {
event PairCreated(address indexed token0, address indexed token1, address pair, uint);
function feeTo() external view returns (address);
function feeToSetter() external view returns (address);
function getPair(address tokenA, address tokenB) external view returns (address pair);
function allPairs(uint) external view returns (address pair);
function allPairsLength() external view returns (uint);
function createPair(address tokenA, address tokenB) external returns (address pair);
function setFeeTo(address) external;
function setFeeToSetter(address) external;
}
// File: PiggyBank-main/PiggyBank-main/contracts/interface/IGovernor.sol
// !! THIS FILE WAS AUTOGENERATED BY abi-to-sol v0.8.0. SEE SOURCE BELOW. !!
pragma solidity ^0.8.20;
interface IGovernor {
event EnforceGovernor(
address indexed _newGovernor,
address indexed enforcer
);
event GiveRolloverBonus(
address indexed recipient,
uint256 amount,
address indexed poolInto
);
event Harvest(address indexed sender, uint256 callFee);
event SetInflation(uint256 rewardPerBlock);
function acPool1() external view returns (address);
function acPool1ID() external view returns (uint256);
function acPool2() external view returns (address);
function acPool2ID() external view returns (uint256);
function acPool3() external view returns (address);
function acPool3ID() external view returns (uint256);
function acPool4() external view returns (address);
function acPool4ID() external view returns (uint256);
function acPool5() external view returns (address);
function acPool5ID() external view returns (uint256);
function acPool6() external view returns (address);
function acPool6ID() external view returns (uint256);
function addNewPool(address _pool) external;
function allocationPercentages(uint256) external view returns (uint256);
function basicContract() external view returns (address);
function beginMintingPhase() external;
function burnTokens(uint256 amount) external;
function changeGovernorActivated() external view returns (bool);
function changeGovernorForSecurityPriorMintingBegins(address _newGovernor)
external;
function consensusContract() external view returns (address);
function costToVote() external view returns (uint256);
function creditContract() external view returns (address);
function delayBeforeEnforce() external view returns (uint256);
function depositFee() external view returns (uint256);
function eligibleNewGovernor() external view returns (address);
function enforceGovernor() external;
function eventFibonacceningActive() external view returns (bool);
function farmContract() external view returns (address);
function fibonacceningContract() external view returns (address);
function fundingRate() external view returns (uint256);
function getRollBonus(address _bonusForPool)
external
view
returns (uint256);
function governorRejected() external;
function harvest() external;
function hexVault() external view returns (address);
function incVault() external view returns (address);
function lastHarvestedTime() external view returns (uint256);
function lastRegularReward() external view returns (uint256);
function lastTotalCredit() external view returns (uint256);
function masterchef() external view returns (address);
function maxDelay() external view returns (uint256);
function minDelay() external view returns (uint256);
function mintingPhase() external view returns (bool);
function mintingPhaseLaunchDate() external view returns (uint256);
function newGovernorBlockDelay() external view returns (uint256);
function newGovernorRequestBlock() external view returns (uint256);
function nftAllocationContract() external view returns (address);
function nftStakingContract() external view returns (address);
function nftStakingPoolID() external view returns (uint256);
function nftWallet() external view returns (address);
function pendingHarvestRewards() external view returns (uint256);
function plsVault() external view returns (address);
function plsxVault() external view returns (address);
function postGrandFibIncreaseCount() external;
function rebalancePools() external;
function referralBonus() external view returns (uint256);
function rememberReward() external;
function rewardContract() external view returns (address);
function senateContract() external view returns (address);
function setActivateFibonaccening(bool _arg) external;
function setCallFee(address _acPool, uint256 _newCallFee) external;
function setGovernorTax(uint256 _amount) external;
function setInflation(uint256 rewardPerBlock) external;
function setNewGovernor(address beneficiary) external;
function setPool(
uint256 _pid,
uint256 _allocPoint,
bool _withUpdate
) external;
function setThresholdFibonaccening(uint256 newThreshold) external;
function stakeRolloverBonus(
address _toAddress,
address _depositToPool,
uint256 _bonusToPay,
uint256 _stakeID
) external;
function thresholdFibonaccening() external view returns (uint256);
function token() external view returns (address);
function tokenDistributionContract() external view returns (address);
function tokenDistributionContractExtraPenalty()
external
view
returns (address);
function totalFibonacciEventsAfterGrand() external view returns (uint256);
function transferCollectedFees(address _tokenContract) external;
function transferRewardBoostThreshold() external;
function transferToReferralContract() external;
function transferToTreasury(uint256 amount) external;
function treasuryRequest(
address _tokenAddr,
address _recipient,
uint256 _amountToSend
) external;
function treasuryWallet() external view returns (address);
function tshareVault() external view returns (address);
function updateCostToVote(uint256 newCostToVote) external;
function updateDelayBeforeEnforce(uint256 newDelay) external;
function updateRolloverBonus(address _forPool, uint256 _bonus) external;
function updateVault(uint256 _type, uint256 _amount) external;
}
// THIS FILE WAS AUTOGENERATED FROM THE FOLLOWING ABI JSON:
/*
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_newGovernor","type":"address"},{"indexed":true,"internalType":"address","name":"enforcer","type":"address"}],"name":"EnforceGovernor","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"address","name":"poolInto","type":"address"}],"name":"GiveRolloverBonus","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"callFee","type":"uint256"}],"name":"Harvest","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"rewardPerBlock","type":"uint256"}],"name":"SetInflation","type":"event"},{"inputs":[],"name":"acPool1","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acPool1ID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acPool2","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acPool2ID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acPool3","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acPool3ID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acPool4","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acPool4ID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acPool5","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acPool5ID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acPool6","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acPool6ID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_pool","type":"address"}],"name":"addNewPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"allocationPercentages","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"basicContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"beginMintingPhase","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"changeGovernorActivated","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_newGovernor","type":"address"}],"name":"changeGovernorForSecurityPriorMintingBegins","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"consensusContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"costToVote","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"creditContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"delayBeforeEnforce","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"depositFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"eligibleNewGovernor","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enforceGovernor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"eventFibonacceningActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"farmContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fibonacceningContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fundingRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_bonusForPool","type":"address"}],"name":"getRollBonus","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"governorRejected","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"harvest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"hexVault","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"incVault","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastHarvestedTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastRegularReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastTotalCredit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"masterchef","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxDelay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minDelay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintingPhase","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintingPhaseLaunchDate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"newGovernorBlockDelay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"newGovernorRequestBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftAllocationContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftStakingContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftStakingPoolID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingHarvestRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"plsVault","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"plsxVault","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"postGrandFibIncreaseCount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rebalancePools","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"referralBonus","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rememberReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"senateContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_arg","type":"bool"}],"name":"setActivateFibonaccening","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_acPool","type":"address"},{"internalType":"uint256","name":"_newCallFee","type":"uint256"}],"name":"setCallFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setGovernorTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"rewardPerBlock","type":"uint256"}],"name":"setInflation","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"beneficiary","type":"address"}],"name":"setNewGovernor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_allocPoint","type":"uint256"},{"internalType":"bool","name":"_withUpdate","type":"bool"}],"name":"setPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newThreshold","type":"uint256"}],"name":"setThresholdFibonaccening","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_toAddress","type":"address"},{"internalType":"address","name":"_depositToPool","type":"address"},{"internalType":"uint256","name":"_bonusToPay","type":"uint256"},{"internalType":"uint256","name":"_stakeID","type":"uint256"}],"name":"stakeRolloverBonus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"thresholdFibonaccening","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenDistributionContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenDistributionContractExtraPenalty","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFibonacciEventsAfterGrand","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenContract","type":"address"}],"name":"transferCollectedFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"transferRewardBoostThreshold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"transferToReferralContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferToTreasury","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddr","type":"address"},{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"uint256","name":"_amountToSend","type":"uint256"}],"name":"treasuryRequest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasuryWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tshareVault","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"newCostToVote","type":"uint256"}],"name":"updateCostToVote","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newDelay","type":"uint256"}],"name":"updateDelayBeforeEnforce","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_forPool","type":"address"},{"internalType":"uint256","name":"_bonus","type":"uint256"}],"name":"updateRolloverBonus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_type","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"updateVault","outputs":[],"stateMutability":"nonpayable","type":"function"}]
*/
// File: PiggyBank-main/PiggyBank-main/contracts/interface/IDTX.sol
// !! THIS FILE WAS AUTOGENERATED BY abi-to-sol v0.8.0. SEE SOURCE BELOW. !!
pragma solidity ^0.8.20;
interface IDTX {
error ERC20InsufficientAllowance(
address spender,
uint256 allowance,
uint256 needed
);
error ERC20InsufficientBalance(
address sender,
uint256 balance,
uint256 needed
);
error ERC20InvalidApprover(address approver);
error ERC20InvalidReceiver(address receiver);
error ERC20InvalidSender(address sender);
error ERC20InvalidSpender(address spender);
error OwnableInvalidOwner(address owner);
error OwnableUnauthorizedAccount(address account);
event Approval(
address indexed owner,
address indexed spender,
uint256 value
);
event OwnershipTransferred(
address indexed previousOwner,
address indexed newOwner
);
event Transfer(address indexed from, address indexed to, uint256 value);
function MAX_SUPPLY() external view returns (uint256);
function allowance(address owner, address spender)
external
view
returns (uint256);
function approve(address spender, uint256 value) external returns (bool);
function balanceOf(address account) external view returns (uint256);
function burn(uint256 value) external;
function burnFrom(address account, uint256 value) external;
function burnToken(address account, uint256 amount) external returns (bool);
function decimals() external view returns (uint8);
function governor() external view returns (address);
function masterchefAddress() external view returns (address);
function mint(address to, uint256 amount) external;
function name() external view returns (string memory);
function owner() external view returns (address);
function rebrandName(string memory _newName) external;
function rebrandSymbol(string memory _newSymbol) external;
function renounceOwnership() external;
function symbol() external view returns (string memory);
function totalSupply() external view returns (uint256);
function transfer(address to, uint256 value) external returns (bool);
function transferFrom(
address from,
address to,
uint256 value
) external returns (bool);
function transferOwnership(address newOwner) external;
}
// THIS FILE WAS AUTOGENERATED FROM THE FOLLOWING ABI JSON:
/*
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"name":"ERC20InvalidApprover","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC20InvalidReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"ERC20InvalidSender","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"}],"name":"ERC20InvalidSpender","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"governor","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"masterchefAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_newName","type":"string"}],"name":"rebrandName","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newSymbol","type":"string"}],"name":"rebrandSymbol","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]
*/
// File: PiggyBank-main/PiggyBank-main/contracts/interface/IVoting.sol
// !! THIS FILE WAS AUTOGENERATED BY abi-to-sol v0.8.0. SEE SOURCE BELOW. !!
pragma solidity ^0.8.20;
interface IVoting {
event AddCredit(address indexed depositor, uint256 amount);
event BurnCredit(
address indexed burnFrom,
uint256 amount,
uint256 indexed forId
);
event DeductCredit(address indexed from, uint256 amount);
event SetCreditingContract(address indexed _contract, bool setting);
event SetDeductingContract(address indexed _contract, bool setting);
function addCredit(uint256 amount, address _beneficiary) external;
function airdropContract() external view returns (address);
function airdropContractLocked() external view returns (address);
function airdropVotingCredit(uint256 amount, address beneficiary) external;
function burnCredit(uint256 amount, uint256 _forId) external;
function burnedForId(uint256) external view returns (uint256);
function creditingContract(address) external view returns (bool);
function creditingContractCount() external view returns (uint256);
function deductCredit(address from, uint256 amount) external returns (bool);
function deductingContract(address) external view returns (bool);
function deductingContractCount() external view returns (uint256);
function depositCredit(uint256 amount) external;
function masterchef() external view returns (address);
function modifyCreditingContract(address _contract, bool setting) external;
function modifyDeductingContract(address _contract, bool setting) external;
function owner() external view returns (address);
function redeemGovernor() external;
function syncOwner() external;
function token() external view returns (address);
function updateChef() external;
function userCredit(address) external view returns (uint256);
}
// THIS FILE WAS AUTOGENERATED FROM THE FOLLOWING ABI JSON:
/*
[{"inputs":[{"internalType":"contract IDTX","name":"_token","type":"address"},{"internalType":"contract IMasterChef","name":"_masterchef","type":"address"},{"internalType":"address","name":"_airdropContract","type":"address"},{"internalType":"address","name":"_airdropContractLocked","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"depositor","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"AddCredit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"burnFrom","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"forId","type":"uint256"}],"name":"BurnCredit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"DeductCredit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_contract","type":"address"},{"indexed":false,"internalType":"bool","name":"setting","type":"bool"}],"name":"SetCreditingContract","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_contract","type":"address"},{"indexed":false,"internalType":"bool","name":"setting","type":"bool"}],"name":"SetDeductingContract","type":"event"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"_beneficiary","type":"address"}],"name":"addCredit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"airdropContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"airdropContractLocked","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"beneficiary","type":"address"}],"name":"airdropVotingCredit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"_forId","type":"uint256"}],"name":"burnCredit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"burnedForId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"creditingContract","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"creditingContractCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"deductCredit","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"deductingContract","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deductingContractCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"depositCredit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"masterchef","outputs":[{"internalType":"contract IMasterChef","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_contract","type":"address"},{"internalType":"bool","name":"setting","type":"bool"}],"name":"modifyCreditingContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_contract","type":"address"},{"internalType":"bool","name":"setting","type":"bool"}],"name":"modifyDeductingContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"redeemGovernor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"syncOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"contract IDTX","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"updateChef","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userCredit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]
*/
// File: PiggyBank-main/PiggyBank-main/contracts/helper/actuator.sol
pragma solidity 0.8.20;
//Iuniswapfactoryv2,IUniswapV2Pair,IUniswapV2Router02,IUniswapV2Router01
interface IFarm {
function userInfo(uint256, address)
external
view
returns (uint256 amount, uint256 rewardDebt);
function deposit(uint256 _pid, uint256 _amount) external;
function withdraw(uint256 _pid, uint256 _amount) external;
}
contract FarmHTTHEX {
address public constant UNISWAP_ROUTER_ADDRESS = 0x165C3410fC91EF562C50559f7d2289fEbed552d9;
address public immutable DTX = 0xFAaC6a85C3e123AB2CF7669B1024f146cFef0b38;
address public immutable votingCreditContract = 0xCF14DbcfFA6E99A444539aBbc9aE273a7bb5d75A;
address public immutable PLSX = 0x95B303987A60C71504D99Aa1b13B4DA07b0790ab;
address public immutable HEX = 0x2b591e99afE9f32eAA6214f7B7629768c40Eeb39;
address public immutable EHEX = 0x57fde0a71132198BBeC939B98976993d8D89D225;
address public immutable HTT5000 = 0x47810bb3ECDc6b080CeB2d39E769F21Ff14AB7E9; //NOTICE: IT'S HTT-7000!!!
address public immutable ACTR = 0x85DF7cE20A4CE0cF859804b45cB540FFE42074Da;
address public immutable farmingContract = 0x4469A40D4243aC1c6cF350d99B6d69b49b5005F1;
uint256 public immutable poolId = 2;
IFarm stakingContract = IFarm(0x4469A40D4243aC1c6cF350d99B6d69b49b5005F1);
uint256 public haltProposalStartingId = 19000000; //arbitrary starting proposal ID
bool public withdrawalStarted = false;
uint256 public withdrawalStartedTime = 0;
bool public canWithdraw = false;
uint256 public withdrawalStartedCount = 0;
IUniswapV2Router02 public uniswapRouter;
address public constant PAIR_ADDRESS = 0x0d37481cD2c2E1a309a159Fd08D9F6eFd0a1F224;
constructor() {
uniswapRouter = IUniswapV2Router02(UNISWAP_ROUTER_ADDRESS);
IERC20(PLSX).approve(UNISWAP_ROUTER_ADDRESS, type(uint256).max);
IERC20(HEX).approve(UNISWAP_ROUTER_ADDRESS, type(uint256).max);
IERC20(HTT5000).approve(UNISWAP_ROUTER_ADDRESS, type(uint256).max);
IERC20(ACTR).approve(UNISWAP_ROUTER_ADDRESS, type(uint256).max);
IERC20(EHEX).approve(UNISWAP_ROUTER_ADDRESS, type(uint256).max);
IERC20(PAIR_ADDRESS).approve(0x4469A40D4243aC1c6cF350d99B6d69b49b5005F1, type(uint256).max); //lp to staking contract
}
function harvest() external {
require(msg.sender == tx.origin);
stakingContract.withdraw(poolId, 0);
uint deadline = block.timestamp + 15;
uint256 _swapAmount = IERC20(ACTR).balanceOf(address(this));
uint[] memory _minOutT = getEstimatedHexForToken(ACTR, _swapAmount);
uint _minOut = _minOutT[_minOutT.length-1];
uniswapRouter.swapTokensForExactTokens(_minOut, _swapAmount, getTokenPath(ACTR), address(this), deadline);
_swapAmount = IERC20(HEX).balanceOf(address(this));
_minOutT = getEstimatedEHEXForHex(_swapAmount);
_minOut = _minOutT[_minOutT.length-1];
uniswapRouter.swapTokensForExactTokens(_minOut, _swapAmount, getTokenPath3(), address(this), deadline);
IERC20(EHEX).transfer(treasury(), IERC20(EHEX).balanceOf(address(this)));
}
function swapTokenForHTTandHEX(address _token) external {
require(msg.sender == tx.origin);
uint deadline = block.timestamp + 15;
uint256 _swapAmount = IERC20(_token).balanceOf(address(this));
uint[] memory _minOutT = getEstimatedHexForToken(_token, _swapAmount);
uint _minOut = _minOutT[_minOutT.length-1];
uniswapRouter.swapTokensForExactTokens(_minOut, _swapAmount, getTokenPath(_token), address(this), deadline);
_swapAmount = IERC20(HEX).balanceOf(address(this)) / 2;
_minOutT = getEstimatedHTTForToken(_swapAmount);
_minOut = _minOutT[_minOutT.length-1];
uniswapRouter.swapTokensForExactTokens(_minOut, _swapAmount, getTokenPath2(), address(this), deadline);
provideLiquidity(1);
stakingContract.deposit(poolId, IERC20(PAIR_ADDRESS).balanceOf(address(this)));
}
function enableToken(address _token) external {
IERC20(_token).approve(UNISWAP_ROUTER_ADDRESS, type(uint256).max);
}
function getEstimatedHexForToken(address _token, uint256 _amount) public view returns (uint[] memory) {
return uniswapRouter.getAmountsOut(_amount, getTokenPath(_token));
}
function getEstimatedHTTForToken(uint256 _amount) public view returns (uint[] memory) {
return uniswapRouter.getAmountsOut(_amount, getTokenPath2());
}
function getEstimatedEHEXForHex(uint256 _amount) public view returns (uint[] memory) {
return uniswapRouter.getAmountsOut(_amount, getTokenPath3());
}
function getTokenPath(address _token) private view returns (address[] memory) {
address[] memory path = new address[](2);
path[0] = _token;
path[1] = HEX;
return path;
}
function getTokenPath2() private view returns (address[] memory) {
address[] memory path = new address[](2);
path[0] = HEX;
path[1] = HTT5000;
return path;
}
function getTokenPath3() private view returns (address[] memory) {
address[] memory path = new address[](2);
path[0] = HEX;
path[1] = EHEX;
return path;
}
function provideLiquidity(uint256 _slippageTolerance) public {
uint256 incBalance = IERC20(HEX).balanceOf(address(this));
uint256 printBalance = IERC20(HTT5000).balanceOf(address(this));
require(incBalance > 0 && printBalance > 0, "No tokens to provide liquidity");
uint deadline = block.timestamp + 15;
// Get the current ratio in the pool
(uint256 reserveInc, uint256 reservePrint) = getReserves(HEX, HTT5000);
uint256 amountIncToUse = incBalance;
uint256 amountPrintToUse = printBalance;
// If pool exists, calculate optimal amounts
if (reserveInc > 0 && reservePrint > 0) {
uint256 optimalPrintForInc = (incBalance * reservePrint) / reserveInc;
if (optimalPrintForInc <= printBalance) {
// We have enough PRINT for the INC we have
amountPrintToUse = optimalPrintForInc;
} else {
// We have more INC than needed for the PRINT we have
uint256 optimalIncForPrint = (printBalance * reserveInc) / reservePrint;
amountIncToUse = optimalIncForPrint;
}
}
uniswapRouter.addLiquidity(
HEX,
HTT5000,
amountIncToUse,
amountPrintToUse,
amountIncToUse * (100 - _slippageTolerance) / 100,
amountPrintToUse * (100 - _slippageTolerance) / 100,
address(this),
deadline
);
}
function getReserves(address tokenA, address tokenB) public view returns (uint256 reserveA, uint256 reserveB) {
address pair = PAIR_ADDRESS;
if (pair == address(0)) {
return (0, 0);
}
(uint256 reserve0, uint256 reserve1, ) = IUniswapV2Pair(pair).getReserves();
// Check token order in the pair
address token0 = IUniswapV2Pair(pair).token0();
if (token0 == tokenA) {
return (reserve0, reserve1);
} else {
return (reserve1, reserve0);
}
}
function governor() public view returns (address) {
return IDTX(DTX).governor();
}
function treasury() public view returns (address) {
return IGovernor(governor()).treasuryWallet();
}
function stopStaking() external {
require(msg.sender == governor(), "only thru decentralized Governance");
(uint256 _amount, ) = stakingContract.userInfo(poolId, address(this));
stakingContract.withdraw(poolId, _amount);
require(IERC20(ACTR).transfer(treasury(), IERC20(ACTR).balanceOf(address(this))));
require(IERC20(PAIR_ADDRESS).transfer(treasury(), IERC20(PAIR_ADDRESS).balanceOf(address(this))));
}
function withdrawERC(address _a) external {
require(msg.sender == governor(), "only thru decentralized Governance");
require(IERC20(_a).transfer(treasury(), IERC20(_a).balanceOf(address(this))));
}
function emergencyWithdraw() external {
require(!canWithdraw, "withdrawal already enabled");
if(!withdrawalStarted) {
require(IVoting(votingCreditContract).burnedForId(haltProposalStartingId + 1000 + withdrawalStartedCount) > 3000000 * 1e18, "insufficient burned voting credit");
withdrawalStarted = true;
withdrawalStartedTime = block.timestamp;
} else {
require(block.timestamp > withdrawalStartedTime + 20 hours, "must wait 20hours");// after 20 hours
if(IVoting(votingCreditContract).burnedForId(haltProposalStartingId + 1000 + withdrawalStartedCount) >
IVoting(votingCreditContract).burnedForId(haltProposalStartingId + 1000 + withdrawalStartedCount + 1)) {
canWithdraw = true;
} else {
withdrawalStarted = false;
withdrawalStartedCount = withdrawalStartedCount + 2;
}
}
}
function stopStaking2() external {
require(canWithdraw, "Withdrawal not allowed");
(uint256 _amount, ) = stakingContract.userInfo(poolId, address(this));
stakingContract.withdraw(poolId, _amount);
require(IERC20(ACTR).transfer(treasury(), IERC20(ACTR).balanceOf(address(this))));
require(IERC20(PAIR_ADDRESS).transfer(treasury(), IERC20(PAIR_ADDRESS).balanceOf(address(this))));
}
function withdrawToken(address _token) external {
require(canWithdraw, "Withdrawal not allowed");
require(IERC20(_token).transfer(treasury(), IERC20(_token).balanceOf(address(this))));
}
}
Contract ABI
[{"type":"constructor","stateMutability":"nonpayable","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"ACTR","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"DTX","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"EHEX","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"HEX","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"HTT5000","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"PAIR_ADDRESS","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"PLSX","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"UNISWAP_ROUTER_ADDRESS","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"canWithdraw","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"emergencyWithdraw","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"enableToken","inputs":[{"type":"address","name":"_token","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"farmingContract","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256[]","name":"","internalType":"uint256[]"}],"name":"getEstimatedEHEXForHex","inputs":[{"type":"uint256","name":"_amount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256[]","name":"","internalType":"uint256[]"}],"name":"getEstimatedHTTForToken","inputs":[{"type":"uint256","name":"_amount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256[]","name":"","internalType":"uint256[]"}],"name":"getEstimatedHexForToken","inputs":[{"type":"address","name":"_token","internalType":"address"},{"type":"uint256","name":"_amount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"reserveA","internalType":"uint256"},{"type":"uint256","name":"reserveB","internalType":"uint256"}],"name":"getReserves","inputs":[{"type":"address","name":"tokenA","internalType":"address"},{"type":"address","name":"tokenB","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"governor","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"haltProposalStartingId","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"harvest","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"poolId","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"provideLiquidity","inputs":[{"type":"uint256","name":"_slippageTolerance","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"stopStaking","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"stopStaking2","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"swapTokenForHTTandHEX","inputs":[{"type":"address","name":"_token","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"treasury","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IUniswapV2Router02"}],"name":"uniswapRouter","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"votingCreditContract","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"withdrawERC","inputs":[{"type":"address","name":"_a","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"withdrawToken","inputs":[{"type":"address","name":"_token","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"withdrawalStarted","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"withdrawalStartedCount","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"withdrawalStartedTime","inputs":[]}]
Contract Creation Code
0x6101a060405273faac6a85c3e123ab2cf7669b1024f146cfef0b3873ffffffffffffffffffffffffffffffffffffffff1660809073ffffffffffffffffffffffffffffffffffffffff1681525073cf14dbcffa6e99a444539abbc9ae273a7bb5d75a73ffffffffffffffffffffffffffffffffffffffff1660a09073ffffffffffffffffffffffffffffffffffffffff168152507395b303987a60c71504d99aa1b13b4da07b0790ab73ffffffffffffffffffffffffffffffffffffffff1660c09073ffffffffffffffffffffffffffffffffffffffff16815250732b591e99afe9f32eaa6214f7b7629768c40eeb3973ffffffffffffffffffffffffffffffffffffffff1660e09073ffffffffffffffffffffffffffffffffffffffff168152507357fde0a71132198bbec939b98976993d8d89d22573ffffffffffffffffffffffffffffffffffffffff166101009073ffffffffffffffffffffffffffffffffffffffff168152507347810bb3ecdc6b080ceb2d39e769f21ff14ab7e973ffffffffffffffffffffffffffffffffffffffff166101209073ffffffffffffffffffffffffffffffffffffffff168152507385df7ce20a4ce0cf859804b45cb540ffe42074da73ffffffffffffffffffffffffffffffffffffffff166101409073ffffffffffffffffffffffffffffffffffffffff16815250734469a40d4243ac1c6cf350d99b6d69b49b5005f173ffffffffffffffffffffffffffffffffffffffff166101609073ffffffffffffffffffffffffffffffffffffffff16815250600261018090815250734469a40d4243ac1c6cf350d99b6d69b49b5005f15f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550630121eac06001555f60025f6101000a81548160ff0219169083151502179055505f6003555f60045f6101000a81548160ff0219169083151502179055505f600555348015620002eb575f80fd5b5073165c3410fc91ef562c50559f7d2289febed552d960065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060c05173ffffffffffffffffffffffffffffffffffffffff1663095ea7b373165c3410fc91ef562c50559f7d2289febed552d97fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b8152600401620003b392919062000802565b6020604051808303815f875af1158015620003d0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620003f691906200086b565b5060e05173ffffffffffffffffffffffffffffffffffffffff1663095ea7b373165c3410fc91ef562c50559f7d2289febed552d97fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b81526004016200046a92919062000802565b6020604051808303815f875af115801562000487573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620004ad91906200086b565b506101205173ffffffffffffffffffffffffffffffffffffffff1663095ea7b373165c3410fc91ef562c50559f7d2289febed552d97fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b81526004016200052292919062000802565b6020604051808303815f875af11580156200053f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200056591906200086b565b506101405173ffffffffffffffffffffffffffffffffffffffff1663095ea7b373165c3410fc91ef562c50559f7d2289febed552d97fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b8152600401620005da92919062000802565b6020604051808303815f875af1158015620005f7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200061d91906200086b565b506101005173ffffffffffffffffffffffffffffffffffffffff1663095ea7b373165c3410fc91ef562c50559f7d2289febed552d97fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b81526004016200069292919062000802565b6020604051808303815f875af1158015620006af573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620006d591906200086b565b50730d37481cd2c2e1a309a159fd08d9f6efd0a1f22473ffffffffffffffffffffffffffffffffffffffff1663095ea7b3734469a40d4243ac1c6cf350d99b6d69b49b5005f17fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b81526004016200075b92919062000802565b6020604051808303815f875af115801562000778573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200079e91906200086b565b506200089b565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f620007d082620007a5565b9050919050565b620007e281620007c4565b82525050565b5f819050919050565b620007fc81620007e8565b82525050565b5f604082019050620008175f830185620007d7565b620008266020830184620007f1565b9392505050565b5f80fd5b5f8115159050919050565b620008478162000831565b811462000852575f80fd5b50565b5f8151905062000865816200083c565b92915050565b5f602082840312156200088357620008826200082d565b5b5f620008928482850162000855565b91505092915050565b60805160a05160c05160e0516101005161012051610140516101605161018051613a8d620009e15f395f818161091701528181610aeb01528181610ba60152818161101a015281816110c8015281816119ab0152611a6601525f610a1501525f8181610c1201528181610c5601528181611145015281816111e301528181611279015281816118ea01528181611ad20152611b1601525f8181611641015281816126310152818161274e0152818161283b0152612af601525f8181610fd201528181611481015281816114c50152612c2901525f818161074c01528181610ff601528181611305015281816125960152818161272d0152818161281a015281816129c101528181612a880152612bbb01525f61166501525f8181611774015281816120e501528181612251015261231101525f8181610e9201526120530152613a8d5ff3fe608060405234801561000f575f80fd5b50600436106101ed575f3560e01c8063735de9f71161010d578063c73c103c116100a0578063e95164f51161006f578063e95164f51461052c578063eb521a4c14610548578063ee52df4e14610564578063fa6f098d14610582576101ed565b8063c73c103c146104a3578063d52bb6f4146104d3578063dacec9fa14610504578063db2e21bc14610522576101ed565b8063a972892a116100dc578063a972892a14610441578063b51459fe1461045f578063be20eb4d1461047d578063c690908a14610487576101ed565b8063735de9f7146103cb57806379b36943146103e95780637dbf9a7a146104075780638947606914610425576101ed565b80633e0dc34e1161018557806361d027b31161015457806361d027b3146103415780636285e95c1461035f57806363dd9d741461037d5780636aed6e531461039b576101ed565b80633e0dc34e146102dd57806345ce2a0b146102fb5780634641257d146103195780635c422ff114610323576101ed565b80630c340a24116101c15780630c340a24146102535780630f74c4ba146102715780631b9d0bc2146102a15780631d558966146102bf576101ed565b8062618161146101f157806302eec5681461020d5780630550b2661461022b57806306179f5214610235575b5f80fd5b61020b60048036038101906102069190612d08565b6105a0565b005b610215610a13565b6040516102229190612d42565b60405180910390f35b610233610a37565b005b61023d610e7d565b60405161024a9190612d75565b60405180910390f35b61025b610e8f565b6040516102689190612d42565b60405180910390f35b61028b60048036038101906102869190612dc1565b610f22565b6040516102989190612ea3565b60405180910390f35b6102a9610fd0565b6040516102b69190612d42565b60405180910390f35b6102c7610ff4565b6040516102d49190612d42565b60405180910390f35b6102e5611018565b6040516102f29190612ed2565b60405180910390f35b61030361103c565b6040516103109190612d42565b60405180910390f35b610321611054565b005b61032b6115bf565b6040516103389190612ed2565b60405180910390f35b6103496115c5565b6040516103569190612d42565b60405180910390f35b61036761163f565b6040516103749190612d42565b60405180910390f35b610385611663565b6040516103929190612d42565b60405180910390f35b6103b560048036038101906103b09190612dc1565b611687565b6040516103c29190612ea3565b60405180910390f35b6103d3611735565b6040516103e09190612f46565b60405180910390f35b6103f161175a565b6040516103fe9190612d42565b60405180910390f35b61040f611772565b60405161041c9190612d42565b60405180910390f35b61043f600480360381019061043a9190612d08565b611796565b005b6104496118e8565b6040516104569190612d42565b60405180910390f35b61046761190c565b6040516104749190612d75565b60405180910390f35b61048561191e565b005b6104a1600480360381019061049c9190612d08565b611d3d565b005b6104bd60048036038101906104b89190612f5f565b611df0565b6040516104ca9190612ea3565b60405180910390f35b6104ed60048036038101906104e89190612f9d565b611ea0565b6040516104fb929190612fdb565b60405180910390f35b61050c612051565b6040516105199190612d42565b60405180910390f35b61052a612075565b005b61054660048036038101906105419190612d08565b61241a565b005b610562600480360381019061055d9190612dc1565b612593565b005b61056c612916565b6040516105799190612ed2565b60405180910390f35b61058a61291c565b6040516105979190612ed2565b60405180910390f35b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146105d7575f80fd5b5f600f426105e5919061302f565b90505f8273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016106219190612d42565b602060405180830381865afa15801561063c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106609190613076565b90505f61066d8483611df0565b90505f816001835161067f91906130a1565b815181106106905761068f6130d4565b5b6020026020010151905060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638803dbee82856106e289612922565b30896040518663ffffffff1660e01b81526004016107049594939291906131b8565b5f604051808303815f875af115801561071f573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906107479190613360565b5060027f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016107a39190612d42565b602060405180830381865afa1580156107be573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107e29190613076565b6107ec91906133d4565b92506107f783611687565b9150816001835161080891906130a1565b81518110610819576108186130d4565b5b6020026020010151905060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638803dbee828561086a612a37565b30896040518663ffffffff1660e01b815260040161088c9594939291906131b8565b5f604051808303815f875af11580156108a7573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906108cf9190613360565b506108da6001612593565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e2bbb1587f0000000000000000000000000000000000000000000000000000000000000000730d37481cd2c2e1a309a159fd08d9f6efd0a1f22473ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016109839190612d42565b602060405180830381865afa15801561099e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109c29190613076565b6040518363ffffffff1660e01b81526004016109df929190612fdb565b5f604051808303815f87803b1580156109f6575f80fd5b505af1158015610a08573d5f803e3d5ffd5b505050505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b610a3f610e8f565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610aac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aa390613484565b60405180910390fd5b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166393f1a40b7f0000000000000000000000000000000000000000000000000000000000000000306040518363ffffffff1660e01b8152600401610b289291906134a2565b6040805180830381865afa158015610b42573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b6691906134c9565b5090505f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663441a3e707f0000000000000000000000000000000000000000000000000000000000000000836040518363ffffffff1660e01b8152600401610be3929190612fdb565b5f604051808303815f87803b158015610bfa575f80fd5b505af1158015610c0c573d5f803e3d5ffd5b505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb610c546115c5565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610cad9190612d42565b602060405180830381865afa158015610cc8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610cec9190613076565b6040518363ffffffff1660e01b8152600401610d09929190613507565b6020604051808303815f875af1158015610d25573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d499190613558565b610d51575f80fd5b730d37481cd2c2e1a309a159fd08d9f6efd0a1f22473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb610d896115c5565b730d37481cd2c2e1a309a159fd08d9f6efd0a1f22473ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610dd69190612d42565b602060405180830381865afa158015610df1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e159190613076565b6040518363ffffffff1660e01b8152600401610e32929190613507565b6020604051808303815f875af1158015610e4e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e729190613558565b610e7a575f80fd5b50565b60025f9054906101000a900460ff1681565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16630c340a246040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ef9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f1d9190613597565b905090565b606060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d06ca61f83610f6a612b6a565b6040518363ffffffff1660e01b8152600401610f879291906135c2565b5f60405180830381865afa158015610fa1573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190610fc99190613360565b9050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b730d37481cd2c2e1a309a159fd08d9f6efd0a1f22481565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461108b575f80fd5b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663441a3e707f00000000000000000000000000000000000000000000000000000000000000005f6040518363ffffffff1660e01b8152600401611105929190613629565b5f604051808303815f87803b15801561111c575f80fd5b505af115801561112e573d5f803e3d5ffd5b505050505f600f42611140919061302f565b90505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161119c9190612d42565b602060405180830381865afa1580156111b7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111db9190613076565b90505f6112087f000000000000000000000000000000000000000000000000000000000000000083611df0565b90505f816001835161121a91906130a1565b8151811061122b5761122a6130d4565b5b6020026020010151905060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638803dbee828561129d7f0000000000000000000000000000000000000000000000000000000000000000612922565b30896040518663ffffffff1660e01b81526004016112bf9594939291906131b8565b5f604051808303815f875af11580156112da573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906113029190613360565b507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161135c9190612d42565b602060405180830381865afa158015611377573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061139b9190613076565b92506113a683610f22565b915081600183516113b791906130a1565b815181106113c8576113c76130d4565b5b6020026020010151905060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638803dbee8285611419612b6a565b30896040518663ffffffff1660e01b815260040161143b9594939291906131b8565b5f604051808303815f875af1158015611456573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f8201168201806040525081019061147e9190613360565b507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6114c36115c5565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161151c9190612d42565b602060405180830381865afa158015611537573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061155b9190613076565b6040518363ffffffff1660e01b8152600401611578929190613507565b6020604051808303815f875af1158015611594573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115b89190613558565b5050505050565b60055481565b5f6115ce610e8f565b73ffffffffffffffffffffffffffffffffffffffff16634626402b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611616573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061163a9190613597565b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b606060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d06ca61f836116cf612a37565b6040518363ffffffff1660e01b81526004016116ec9291906135c2565b5f60405180830381865afa158015611706573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f8201168201806040525081019061172e9190613360565b9050919050565b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b73165c3410fc91ef562c50559f7d2289febed552d981565b7f000000000000000000000000000000000000000000000000000000000000000081565b60045f9054906101000a900460ff166117e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117db9061369a565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6118086115c5565b8373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016118419190612d42565b602060405180830381865afa15801561185c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118809190613076565b6040518363ffffffff1660e01b815260040161189d929190613507565b6020604051808303815f875af11580156118b9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118dd9190613558565b6118e5575f80fd5b50565b7f000000000000000000000000000000000000000000000000000000000000000081565b60045f9054906101000a900460ff1681565b60045f9054906101000a900460ff1661196c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119639061369a565b60405180910390fd5b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166393f1a40b7f0000000000000000000000000000000000000000000000000000000000000000306040518363ffffffff1660e01b81526004016119e89291906134a2565b6040805180830381865afa158015611a02573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a2691906134c9565b5090505f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663441a3e707f0000000000000000000000000000000000000000000000000000000000000000836040518363ffffffff1660e01b8152600401611aa3929190612fdb565b5f604051808303815f87803b158015611aba575f80fd5b505af1158015611acc573d5f803e3d5ffd5b505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb611b146115c5565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611b6d9190612d42565b602060405180830381865afa158015611b88573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bac9190613076565b6040518363ffffffff1660e01b8152600401611bc9929190613507565b6020604051808303815f875af1158015611be5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c099190613558565b611c11575f80fd5b730d37481cd2c2e1a309a159fd08d9f6efd0a1f22473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb611c496115c5565b730d37481cd2c2e1a309a159fd08d9f6efd0a1f22473ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611c969190612d42565b602060405180830381865afa158015611cb1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611cd59190613076565b6040518363ffffffff1660e01b8152600401611cf2929190613507565b6020604051808303815f875af1158015611d0e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d329190613558565b611d3a575f80fd5b50565b8073ffffffffffffffffffffffffffffffffffffffff1663095ea7b373165c3410fc91ef562c50559f7d2289febed552d97fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b8152600401611dac929190613507565b6020604051808303815f875af1158015611dc8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611dec9190613558565b5050565b606060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d06ca61f83611e3986612922565b6040518363ffffffff1660e01b8152600401611e569291906135c2565b5f60405180830381865afa158015611e70573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190611e989190613360565b905092915050565b5f805f730d37481cd2c2e1a309a159fd08d9f6efd0a1f22490505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611ef9575f80925092505061204a565b5f808273ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015611f44573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f689190613734565b506dffffffffffffffffffffffffffff1691506dffffffffffffffffffffffffffff1691505f8373ffffffffffffffffffffffffffffffffffffffff16630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa158015611fd7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ffb9190613597565b90508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361203f578282955095505050505061204a565b818395509550505050505b9250929050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60045f9054906101000a900460ff16156120c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120bb906137ce565b60405180910390fd5b60025f9054906101000a900460ff166121fd576a027b46536c66c8e30000007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663b03013f06005546103e8600154612132919061302f565b61213c919061302f565b6040518263ffffffff1660e01b81526004016121589190612ed2565b602060405180830381865afa158015612173573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121979190613076565b116121d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121ce9061385c565b60405180910390fd5b600160025f6101000a81548160ff02191690831515021790555042600381905550612418565b6201194060035461220e919061302f565b421161224f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612246906138c4565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663b03013f060016005546103e86001546122a0919061302f565b6122aa919061302f565b6122b4919061302f565b6040518263ffffffff1660e01b81526004016122d09190612ed2565b602060405180830381865afa1580156122eb573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061230f9190613076565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663b03013f06005546103e860015461235e919061302f565b612368919061302f565b6040518263ffffffff1660e01b81526004016123849190612ed2565b602060405180830381865afa15801561239f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123c39190613076565b11156123e857600160045f6101000a81548160ff021916908315150217905550612417565b5f60025f6101000a81548160ff0219169083151502179055506002600554612410919061302f565b6005819055505b5b565b612422610e8f565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461248f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161248690613484565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6124b36115c5565b8373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016124ec9190612d42565b602060405180830381865afa158015612507573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061252b9190613076565b6040518363ffffffff1660e01b8152600401612548929190613507565b6020604051808303815f875af1158015612564573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125889190613558565b612590575f80fd5b50565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016125ed9190612d42565b602060405180830381865afa158015612608573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061262c9190613076565b90505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016126889190612d42565b602060405180830381865afa1580156126a3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126c79190613076565b90505f821180156126d757505f81115b612716576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161270d9061392c565b60405180910390fd5b5f600f42612724919061302f565b90505f806127727f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000611ea0565b915091505f8590505f8590505f8411801561278c57505f83115b156127db575f84848961279f919061394a565b6127a991906133d4565b90508681116127ba578091506127d9565b5f8486896127c8919061394a565b6127d291906133d4565b9050809350505b505b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e8e337007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000858560648e606461286b91906130a1565b89612876919061394a565b61288091906133d4565b60648f606461288f91906130a1565b8961289a919061394a565b6128a491906133d4565b308d6040518963ffffffff1660e01b81526004016128c998979695949392919061398b565b6060604051808303815f875af11580156128e5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129099190613a07565b5050505050505050505050565b60015481565b60035481565b60605f600267ffffffffffffffff8111156129405761293f613224565b5b60405190808252806020026020018201604052801561296e5781602001602082028036833780820191505090505b50905082815f81518110612985576129846130d4565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f0000000000000000000000000000000000000000000000000000000000000000816001815181106129f4576129f36130d4565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505080915050919050565b60605f600267ffffffffffffffff811115612a5557612a54613224565b5b604051908082528060200260200182016040528015612a835781602001602082028036833780820191505090505b5090507f0000000000000000000000000000000000000000000000000000000000000000815f81518110612aba57612ab96130d4565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110612b2957612b286130d4565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508091505090565b60605f600267ffffffffffffffff811115612b8857612b87613224565b5b604051908082528060200260200182016040528015612bb65781602001602082028036833780820191505090505b5090507f0000000000000000000000000000000000000000000000000000000000000000815f81518110612bed57612bec6130d4565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110612c5c57612c5b6130d4565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508091505090565b5f604051905090565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f612cd782612cae565b9050919050565b612ce781612ccd565b8114612cf1575f80fd5b50565b5f81359050612d0281612cde565b92915050565b5f60208284031215612d1d57612d1c612ca6565b5b5f612d2a84828501612cf4565b91505092915050565b612d3c81612ccd565b82525050565b5f602082019050612d555f830184612d33565b92915050565b5f8115159050919050565b612d6f81612d5b565b82525050565b5f602082019050612d885f830184612d66565b92915050565b5f819050919050565b612da081612d8e565b8114612daa575f80fd5b50565b5f81359050612dbb81612d97565b92915050565b5f60208284031215612dd657612dd5612ca6565b5b5f612de384828501612dad565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b612e1e81612d8e565b82525050565b5f612e2f8383612e15565b60208301905092915050565b5f602082019050919050565b5f612e5182612dec565b612e5b8185612df6565b9350612e6683612e06565b805f5b83811015612e96578151612e7d8882612e24565b9750612e8883612e3b565b925050600181019050612e69565b5085935050505092915050565b5f6020820190508181035f830152612ebb8184612e47565b905092915050565b612ecc81612d8e565b82525050565b5f602082019050612ee55f830184612ec3565b92915050565b5f819050919050565b5f612f0e612f09612f0484612cae565b612eeb565b612cae565b9050919050565b5f612f1f82612ef4565b9050919050565b5f612f3082612f15565b9050919050565b612f4081612f26565b82525050565b5f602082019050612f595f830184612f37565b92915050565b5f8060408385031215612f7557612f74612ca6565b5b5f612f8285828601612cf4565b9250506020612f9385828601612dad565b9150509250929050565b5f8060408385031215612fb357612fb2612ca6565b5b5f612fc085828601612cf4565b9250506020612fd185828601612cf4565b9150509250929050565b5f604082019050612fee5f830185612ec3565b612ffb6020830184612ec3565b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61303982612d8e565b915061304483612d8e565b925082820190508082111561305c5761305b613002565b5b92915050565b5f8151905061307081612d97565b92915050565b5f6020828403121561308b5761308a612ca6565b5b5f61309884828501613062565b91505092915050565b5f6130ab82612d8e565b91506130b683612d8e565b92508282039050818111156130ce576130cd613002565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b61313381612ccd565b82525050565b5f613144838361312a565b60208301905092915050565b5f602082019050919050565b5f61316682613101565b613170818561310b565b935061317b8361311b565b805f5b838110156131ab5781516131928882613139565b975061319d83613150565b92505060018101905061317e565b5085935050505092915050565b5f60a0820190506131cb5f830188612ec3565b6131d86020830187612ec3565b81810360408301526131ea818661315c565b90506131f96060830185612d33565b6132066080830184612ec3565b9695505050505050565b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61325a82613214565b810181811067ffffffffffffffff8211171561327957613278613224565b5b80604052505050565b5f61328b612c9d565b90506132978282613251565b919050565b5f67ffffffffffffffff8211156132b6576132b5613224565b5b602082029050602081019050919050565b5f80fd5b5f6132dd6132d88461329c565b613282565b90508083825260208201905060208402830185811115613300576132ff6132c7565b5b835b8181101561332957806133158882613062565b845260208401935050602081019050613302565b5050509392505050565b5f82601f83011261334757613346613210565b5b81516133578482602086016132cb565b91505092915050565b5f6020828403121561337557613374612ca6565b5b5f82015167ffffffffffffffff81111561339257613391612caa565b5b61339e84828501613333565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f6133de82612d8e565b91506133e983612d8e565b9250826133f9576133f86133a7565b5b828204905092915050565b5f82825260208201905092915050565b7f6f6e6c79207468727520646563656e7472616c697a656420476f7665726e616e5f8201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b5f61346e602283613404565b915061347982613414565b604082019050919050565b5f6020820190508181035f83015261349b81613462565b9050919050565b5f6040820190506134b55f830185612ec3565b6134c26020830184612d33565b9392505050565b5f80604083850312156134df576134de612ca6565b5b5f6134ec85828601613062565b92505060206134fd85828601613062565b9150509250929050565b5f60408201905061351a5f830185612d33565b6135276020830184612ec3565b9392505050565b61353781612d5b565b8114613541575f80fd5b50565b5f815190506135528161352e565b92915050565b5f6020828403121561356d5761356c612ca6565b5b5f61357a84828501613544565b91505092915050565b5f8151905061359181612cde565b92915050565b5f602082840312156135ac576135ab612ca6565b5b5f6135b984828501613583565b91505092915050565b5f6040820190506135d55f830185612ec3565b81810360208301526135e7818461315c565b90509392505050565b5f819050919050565b5f61361361360e613609846135f0565b612eeb565b612d8e565b9050919050565b613623816135f9565b82525050565b5f60408201905061363c5f830185612ec3565b613649602083018461361a565b9392505050565b7f5769746864726177616c206e6f7420616c6c6f776564000000000000000000005f82015250565b5f613684601683613404565b915061368f82613650565b602082019050919050565b5f6020820190508181035f8301526136b181613678565b9050919050565b5f6dffffffffffffffffffffffffffff82169050919050565b6136da816136b8565b81146136e4575f80fd5b50565b5f815190506136f5816136d1565b92915050565b5f63ffffffff82169050919050565b613713816136fb565b811461371d575f80fd5b50565b5f8151905061372e8161370a565b92915050565b5f805f6060848603121561374b5761374a612ca6565b5b5f613758868287016136e7565b9350506020613769868287016136e7565b925050604061377a86828701613720565b9150509250925092565b7f7769746864726177616c20616c726561647920656e61626c65640000000000005f82015250565b5f6137b8601a83613404565b91506137c382613784565b602082019050919050565b5f6020820190508181035f8301526137e5816137ac565b9050919050565b7f696e73756666696369656e74206275726e656420766f74696e672063726564695f8201527f7400000000000000000000000000000000000000000000000000000000000000602082015250565b5f613846602183613404565b9150613851826137ec565b604082019050919050565b5f6020820190508181035f8301526138738161383a565b9050919050565b7f6d7573742077616974203230686f7572730000000000000000000000000000005f82015250565b5f6138ae601183613404565b91506138b98261387a565b602082019050919050565b5f6020820190508181035f8301526138db816138a2565b9050919050565b7f4e6f20746f6b656e7320746f2070726f76696465206c697175696469747900005f82015250565b5f613916601e83613404565b9150613921826138e2565b602082019050919050565b5f6020820190508181035f8301526139438161390a565b9050919050565b5f61395482612d8e565b915061395f83612d8e565b925082820261396d81612d8e565b9150828204841483151761398457613983613002565b5b5092915050565b5f6101008201905061399f5f83018b612d33565b6139ac602083018a612d33565b6139b96040830189612ec3565b6139c66060830188612ec3565b6139d36080830187612ec3565b6139e060a0830186612ec3565b6139ed60c0830185612d33565b6139fa60e0830184612ec3565b9998505050505050505050565b5f805f60608486031215613a1e57613a1d612ca6565b5b5f613a2b86828701613062565b9350506020613a3c86828701613062565b9250506040613a4d86828701613062565b915050925092509256fea2646970667358221220468a39e99f35b06685f672ab182af0a4bdb0802bbb9a3e7099e3452bf952086764736f6c63430008140033
Deployed ByteCode
0x608060405234801561000f575f80fd5b50600436106101ed575f3560e01c8063735de9f71161010d578063c73c103c116100a0578063e95164f51161006f578063e95164f51461052c578063eb521a4c14610548578063ee52df4e14610564578063fa6f098d14610582576101ed565b8063c73c103c146104a3578063d52bb6f4146104d3578063dacec9fa14610504578063db2e21bc14610522576101ed565b8063a972892a116100dc578063a972892a14610441578063b51459fe1461045f578063be20eb4d1461047d578063c690908a14610487576101ed565b8063735de9f7146103cb57806379b36943146103e95780637dbf9a7a146104075780638947606914610425576101ed565b80633e0dc34e1161018557806361d027b31161015457806361d027b3146103415780636285e95c1461035f57806363dd9d741461037d5780636aed6e531461039b576101ed565b80633e0dc34e146102dd57806345ce2a0b146102fb5780634641257d146103195780635c422ff114610323576101ed565b80630c340a24116101c15780630c340a24146102535780630f74c4ba146102715780631b9d0bc2146102a15780631d558966146102bf576101ed565b8062618161146101f157806302eec5681461020d5780630550b2661461022b57806306179f5214610235575b5f80fd5b61020b60048036038101906102069190612d08565b6105a0565b005b610215610a13565b6040516102229190612d42565b60405180910390f35b610233610a37565b005b61023d610e7d565b60405161024a9190612d75565b60405180910390f35b61025b610e8f565b6040516102689190612d42565b60405180910390f35b61028b60048036038101906102869190612dc1565b610f22565b6040516102989190612ea3565b60405180910390f35b6102a9610fd0565b6040516102b69190612d42565b60405180910390f35b6102c7610ff4565b6040516102d49190612d42565b60405180910390f35b6102e5611018565b6040516102f29190612ed2565b60405180910390f35b61030361103c565b6040516103109190612d42565b60405180910390f35b610321611054565b005b61032b6115bf565b6040516103389190612ed2565b60405180910390f35b6103496115c5565b6040516103569190612d42565b60405180910390f35b61036761163f565b6040516103749190612d42565b60405180910390f35b610385611663565b6040516103929190612d42565b60405180910390f35b6103b560048036038101906103b09190612dc1565b611687565b6040516103c29190612ea3565b60405180910390f35b6103d3611735565b6040516103e09190612f46565b60405180910390f35b6103f161175a565b6040516103fe9190612d42565b60405180910390f35b61040f611772565b60405161041c9190612d42565b60405180910390f35b61043f600480360381019061043a9190612d08565b611796565b005b6104496118e8565b6040516104569190612d42565b60405180910390f35b61046761190c565b6040516104749190612d75565b60405180910390f35b61048561191e565b005b6104a1600480360381019061049c9190612d08565b611d3d565b005b6104bd60048036038101906104b89190612f5f565b611df0565b6040516104ca9190612ea3565b60405180910390f35b6104ed60048036038101906104e89190612f9d565b611ea0565b6040516104fb929190612fdb565b60405180910390f35b61050c612051565b6040516105199190612d42565b60405180910390f35b61052a612075565b005b61054660048036038101906105419190612d08565b61241a565b005b610562600480360381019061055d9190612dc1565b612593565b005b61056c612916565b6040516105799190612ed2565b60405180910390f35b61058a61291c565b6040516105979190612ed2565b60405180910390f35b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146105d7575f80fd5b5f600f426105e5919061302f565b90505f8273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016106219190612d42565b602060405180830381865afa15801561063c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106609190613076565b90505f61066d8483611df0565b90505f816001835161067f91906130a1565b815181106106905761068f6130d4565b5b6020026020010151905060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638803dbee82856106e289612922565b30896040518663ffffffff1660e01b81526004016107049594939291906131b8565b5f604051808303815f875af115801561071f573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906107479190613360565b5060027f0000000000000000000000002b591e99afe9f32eaa6214f7b7629768c40eeb3973ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016107a39190612d42565b602060405180830381865afa1580156107be573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107e29190613076565b6107ec91906133d4565b92506107f783611687565b9150816001835161080891906130a1565b81518110610819576108186130d4565b5b6020026020010151905060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638803dbee828561086a612a37565b30896040518663ffffffff1660e01b815260040161088c9594939291906131b8565b5f604051808303815f875af11580156108a7573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906108cf9190613360565b506108da6001612593565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e2bbb1587f0000000000000000000000000000000000000000000000000000000000000002730d37481cd2c2e1a309a159fd08d9f6efd0a1f22473ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016109839190612d42565b602060405180830381865afa15801561099e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109c29190613076565b6040518363ffffffff1660e01b81526004016109df929190612fdb565b5f604051808303815f87803b1580156109f6575f80fd5b505af1158015610a08573d5f803e3d5ffd5b505050505050505050565b7f0000000000000000000000004469a40d4243ac1c6cf350d99b6d69b49b5005f181565b610a3f610e8f565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610aac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aa390613484565b60405180910390fd5b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166393f1a40b7f0000000000000000000000000000000000000000000000000000000000000002306040518363ffffffff1660e01b8152600401610b289291906134a2565b6040805180830381865afa158015610b42573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b6691906134c9565b5090505f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663441a3e707f0000000000000000000000000000000000000000000000000000000000000002836040518363ffffffff1660e01b8152600401610be3929190612fdb565b5f604051808303815f87803b158015610bfa575f80fd5b505af1158015610c0c573d5f803e3d5ffd5b505050507f00000000000000000000000085df7ce20a4ce0cf859804b45cb540ffe42074da73ffffffffffffffffffffffffffffffffffffffff1663a9059cbb610c546115c5565b7f00000000000000000000000085df7ce20a4ce0cf859804b45cb540ffe42074da73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610cad9190612d42565b602060405180830381865afa158015610cc8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610cec9190613076565b6040518363ffffffff1660e01b8152600401610d09929190613507565b6020604051808303815f875af1158015610d25573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d499190613558565b610d51575f80fd5b730d37481cd2c2e1a309a159fd08d9f6efd0a1f22473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb610d896115c5565b730d37481cd2c2e1a309a159fd08d9f6efd0a1f22473ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610dd69190612d42565b602060405180830381865afa158015610df1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e159190613076565b6040518363ffffffff1660e01b8152600401610e32929190613507565b6020604051808303815f875af1158015610e4e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e729190613558565b610e7a575f80fd5b50565b60025f9054906101000a900460ff1681565b5f7f000000000000000000000000faac6a85c3e123ab2cf7669b1024f146cfef0b3873ffffffffffffffffffffffffffffffffffffffff16630c340a246040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ef9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f1d9190613597565b905090565b606060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d06ca61f83610f6a612b6a565b6040518363ffffffff1660e01b8152600401610f879291906135c2565b5f60405180830381865afa158015610fa1573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190610fc99190613360565b9050919050565b7f00000000000000000000000057fde0a71132198bbec939b98976993d8d89d22581565b7f0000000000000000000000002b591e99afe9f32eaa6214f7b7629768c40eeb3981565b7f000000000000000000000000000000000000000000000000000000000000000281565b730d37481cd2c2e1a309a159fd08d9f6efd0a1f22481565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461108b575f80fd5b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663441a3e707f00000000000000000000000000000000000000000000000000000000000000025f6040518363ffffffff1660e01b8152600401611105929190613629565b5f604051808303815f87803b15801561111c575f80fd5b505af115801561112e573d5f803e3d5ffd5b505050505f600f42611140919061302f565b90505f7f00000000000000000000000085df7ce20a4ce0cf859804b45cb540ffe42074da73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161119c9190612d42565b602060405180830381865afa1580156111b7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111db9190613076565b90505f6112087f00000000000000000000000085df7ce20a4ce0cf859804b45cb540ffe42074da83611df0565b90505f816001835161121a91906130a1565b8151811061122b5761122a6130d4565b5b6020026020010151905060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638803dbee828561129d7f00000000000000000000000085df7ce20a4ce0cf859804b45cb540ffe42074da612922565b30896040518663ffffffff1660e01b81526004016112bf9594939291906131b8565b5f604051808303815f875af11580156112da573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906113029190613360565b507f0000000000000000000000002b591e99afe9f32eaa6214f7b7629768c40eeb3973ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161135c9190612d42565b602060405180830381865afa158015611377573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061139b9190613076565b92506113a683610f22565b915081600183516113b791906130a1565b815181106113c8576113c76130d4565b5b6020026020010151905060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638803dbee8285611419612b6a565b30896040518663ffffffff1660e01b815260040161143b9594939291906131b8565b5f604051808303815f875af1158015611456573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f8201168201806040525081019061147e9190613360565b507f00000000000000000000000057fde0a71132198bbec939b98976993d8d89d22573ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6114c36115c5565b7f00000000000000000000000057fde0a71132198bbec939b98976993d8d89d22573ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161151c9190612d42565b602060405180830381865afa158015611537573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061155b9190613076565b6040518363ffffffff1660e01b8152600401611578929190613507565b6020604051808303815f875af1158015611594573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115b89190613558565b5050505050565b60055481565b5f6115ce610e8f565b73ffffffffffffffffffffffffffffffffffffffff16634626402b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611616573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061163a9190613597565b905090565b7f00000000000000000000000047810bb3ecdc6b080ceb2d39e769f21ff14ab7e981565b7f00000000000000000000000095b303987a60c71504d99aa1b13b4da07b0790ab81565b606060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d06ca61f836116cf612a37565b6040518363ffffffff1660e01b81526004016116ec9291906135c2565b5f60405180830381865afa158015611706573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f8201168201806040525081019061172e9190613360565b9050919050565b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b73165c3410fc91ef562c50559f7d2289febed552d981565b7f000000000000000000000000cf14dbcffa6e99a444539abbc9ae273a7bb5d75a81565b60045f9054906101000a900460ff166117e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117db9061369a565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6118086115c5565b8373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016118419190612d42565b602060405180830381865afa15801561185c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118809190613076565b6040518363ffffffff1660e01b815260040161189d929190613507565b6020604051808303815f875af11580156118b9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118dd9190613558565b6118e5575f80fd5b50565b7f00000000000000000000000085df7ce20a4ce0cf859804b45cb540ffe42074da81565b60045f9054906101000a900460ff1681565b60045f9054906101000a900460ff1661196c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119639061369a565b60405180910390fd5b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166393f1a40b7f0000000000000000000000000000000000000000000000000000000000000002306040518363ffffffff1660e01b81526004016119e89291906134a2565b6040805180830381865afa158015611a02573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a2691906134c9565b5090505f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663441a3e707f0000000000000000000000000000000000000000000000000000000000000002836040518363ffffffff1660e01b8152600401611aa3929190612fdb565b5f604051808303815f87803b158015611aba575f80fd5b505af1158015611acc573d5f803e3d5ffd5b505050507f00000000000000000000000085df7ce20a4ce0cf859804b45cb540ffe42074da73ffffffffffffffffffffffffffffffffffffffff1663a9059cbb611b146115c5565b7f00000000000000000000000085df7ce20a4ce0cf859804b45cb540ffe42074da73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611b6d9190612d42565b602060405180830381865afa158015611b88573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bac9190613076565b6040518363ffffffff1660e01b8152600401611bc9929190613507565b6020604051808303815f875af1158015611be5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c099190613558565b611c11575f80fd5b730d37481cd2c2e1a309a159fd08d9f6efd0a1f22473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb611c496115c5565b730d37481cd2c2e1a309a159fd08d9f6efd0a1f22473ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611c969190612d42565b602060405180830381865afa158015611cb1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611cd59190613076565b6040518363ffffffff1660e01b8152600401611cf2929190613507565b6020604051808303815f875af1158015611d0e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d329190613558565b611d3a575f80fd5b50565b8073ffffffffffffffffffffffffffffffffffffffff1663095ea7b373165c3410fc91ef562c50559f7d2289febed552d97fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b8152600401611dac929190613507565b6020604051808303815f875af1158015611dc8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611dec9190613558565b5050565b606060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d06ca61f83611e3986612922565b6040518363ffffffff1660e01b8152600401611e569291906135c2565b5f60405180830381865afa158015611e70573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190611e989190613360565b905092915050565b5f805f730d37481cd2c2e1a309a159fd08d9f6efd0a1f22490505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611ef9575f80925092505061204a565b5f808273ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015611f44573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f689190613734565b506dffffffffffffffffffffffffffff1691506dffffffffffffffffffffffffffff1691505f8373ffffffffffffffffffffffffffffffffffffffff16630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa158015611fd7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ffb9190613597565b90508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361203f578282955095505050505061204a565b818395509550505050505b9250929050565b7f000000000000000000000000faac6a85c3e123ab2cf7669b1024f146cfef0b3881565b60045f9054906101000a900460ff16156120c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120bb906137ce565b60405180910390fd5b60025f9054906101000a900460ff166121fd576a027b46536c66c8e30000007f000000000000000000000000cf14dbcffa6e99a444539abbc9ae273a7bb5d75a73ffffffffffffffffffffffffffffffffffffffff1663b03013f06005546103e8600154612132919061302f565b61213c919061302f565b6040518263ffffffff1660e01b81526004016121589190612ed2565b602060405180830381865afa158015612173573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121979190613076565b116121d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121ce9061385c565b60405180910390fd5b600160025f6101000a81548160ff02191690831515021790555042600381905550612418565b6201194060035461220e919061302f565b421161224f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612246906138c4565b60405180910390fd5b7f000000000000000000000000cf14dbcffa6e99a444539abbc9ae273a7bb5d75a73ffffffffffffffffffffffffffffffffffffffff1663b03013f060016005546103e86001546122a0919061302f565b6122aa919061302f565b6122b4919061302f565b6040518263ffffffff1660e01b81526004016122d09190612ed2565b602060405180830381865afa1580156122eb573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061230f9190613076565b7f000000000000000000000000cf14dbcffa6e99a444539abbc9ae273a7bb5d75a73ffffffffffffffffffffffffffffffffffffffff1663b03013f06005546103e860015461235e919061302f565b612368919061302f565b6040518263ffffffff1660e01b81526004016123849190612ed2565b602060405180830381865afa15801561239f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123c39190613076565b11156123e857600160045f6101000a81548160ff021916908315150217905550612417565b5f60025f6101000a81548160ff0219169083151502179055506002600554612410919061302f565b6005819055505b5b565b612422610e8f565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461248f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161248690613484565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6124b36115c5565b8373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016124ec9190612d42565b602060405180830381865afa158015612507573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061252b9190613076565b6040518363ffffffff1660e01b8152600401612548929190613507565b6020604051808303815f875af1158015612564573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125889190613558565b612590575f80fd5b50565b5f7f0000000000000000000000002b591e99afe9f32eaa6214f7b7629768c40eeb3973ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016125ed9190612d42565b602060405180830381865afa158015612608573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061262c9190613076565b90505f7f00000000000000000000000047810bb3ecdc6b080ceb2d39e769f21ff14ab7e973ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016126889190612d42565b602060405180830381865afa1580156126a3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126c79190613076565b90505f821180156126d757505f81115b612716576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161270d9061392c565b60405180910390fd5b5f600f42612724919061302f565b90505f806127727f0000000000000000000000002b591e99afe9f32eaa6214f7b7629768c40eeb397f00000000000000000000000047810bb3ecdc6b080ceb2d39e769f21ff14ab7e9611ea0565b915091505f8590505f8590505f8411801561278c57505f83115b156127db575f84848961279f919061394a565b6127a991906133d4565b90508681116127ba578091506127d9565b5f8486896127c8919061394a565b6127d291906133d4565b9050809350505b505b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e8e337007f0000000000000000000000002b591e99afe9f32eaa6214f7b7629768c40eeb397f00000000000000000000000047810bb3ecdc6b080ceb2d39e769f21ff14ab7e9858560648e606461286b91906130a1565b89612876919061394a565b61288091906133d4565b60648f606461288f91906130a1565b8961289a919061394a565b6128a491906133d4565b308d6040518963ffffffff1660e01b81526004016128c998979695949392919061398b565b6060604051808303815f875af11580156128e5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129099190613a07565b5050505050505050505050565b60015481565b60035481565b60605f600267ffffffffffffffff8111156129405761293f613224565b5b60405190808252806020026020018201604052801561296e5781602001602082028036833780820191505090505b50905082815f81518110612985576129846130d4565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f0000000000000000000000002b591e99afe9f32eaa6214f7b7629768c40eeb39816001815181106129f4576129f36130d4565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505080915050919050565b60605f600267ffffffffffffffff811115612a5557612a54613224565b5b604051908082528060200260200182016040528015612a835781602001602082028036833780820191505090505b5090507f0000000000000000000000002b591e99afe9f32eaa6214f7b7629768c40eeb39815f81518110612aba57612ab96130d4565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f00000000000000000000000047810bb3ecdc6b080ceb2d39e769f21ff14ab7e981600181518110612b2957612b286130d4565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508091505090565b60605f600267ffffffffffffffff811115612b8857612b87613224565b5b604051908082528060200260200182016040528015612bb65781602001602082028036833780820191505090505b5090507f0000000000000000000000002b591e99afe9f32eaa6214f7b7629768c40eeb39815f81518110612bed57612bec6130d4565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f00000000000000000000000057fde0a71132198bbec939b98976993d8d89d22581600181518110612c5c57612c5b6130d4565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508091505090565b5f604051905090565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f612cd782612cae565b9050919050565b612ce781612ccd565b8114612cf1575f80fd5b50565b5f81359050612d0281612cde565b92915050565b5f60208284031215612d1d57612d1c612ca6565b5b5f612d2a84828501612cf4565b91505092915050565b612d3c81612ccd565b82525050565b5f602082019050612d555f830184612d33565b92915050565b5f8115159050919050565b612d6f81612d5b565b82525050565b5f602082019050612d885f830184612d66565b92915050565b5f819050919050565b612da081612d8e565b8114612daa575f80fd5b50565b5f81359050612dbb81612d97565b92915050565b5f60208284031215612dd657612dd5612ca6565b5b5f612de384828501612dad565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b612e1e81612d8e565b82525050565b5f612e2f8383612e15565b60208301905092915050565b5f602082019050919050565b5f612e5182612dec565b612e5b8185612df6565b9350612e6683612e06565b805f5b83811015612e96578151612e7d8882612e24565b9750612e8883612e3b565b925050600181019050612e69565b5085935050505092915050565b5f6020820190508181035f830152612ebb8184612e47565b905092915050565b612ecc81612d8e565b82525050565b5f602082019050612ee55f830184612ec3565b92915050565b5f819050919050565b5f612f0e612f09612f0484612cae565b612eeb565b612cae565b9050919050565b5f612f1f82612ef4565b9050919050565b5f612f3082612f15565b9050919050565b612f4081612f26565b82525050565b5f602082019050612f595f830184612f37565b92915050565b5f8060408385031215612f7557612f74612ca6565b5b5f612f8285828601612cf4565b9250506020612f9385828601612dad565b9150509250929050565b5f8060408385031215612fb357612fb2612ca6565b5b5f612fc085828601612cf4565b9250506020612fd185828601612cf4565b9150509250929050565b5f604082019050612fee5f830185612ec3565b612ffb6020830184612ec3565b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61303982612d8e565b915061304483612d8e565b925082820190508082111561305c5761305b613002565b5b92915050565b5f8151905061307081612d97565b92915050565b5f6020828403121561308b5761308a612ca6565b5b5f61309884828501613062565b91505092915050565b5f6130ab82612d8e565b91506130b683612d8e565b92508282039050818111156130ce576130cd613002565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b61313381612ccd565b82525050565b5f613144838361312a565b60208301905092915050565b5f602082019050919050565b5f61316682613101565b613170818561310b565b935061317b8361311b565b805f5b838110156131ab5781516131928882613139565b975061319d83613150565b92505060018101905061317e565b5085935050505092915050565b5f60a0820190506131cb5f830188612ec3565b6131d86020830187612ec3565b81810360408301526131ea818661315c565b90506131f96060830185612d33565b6132066080830184612ec3565b9695505050505050565b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61325a82613214565b810181811067ffffffffffffffff8211171561327957613278613224565b5b80604052505050565b5f61328b612c9d565b90506132978282613251565b919050565b5f67ffffffffffffffff8211156132b6576132b5613224565b5b602082029050602081019050919050565b5f80fd5b5f6132dd6132d88461329c565b613282565b90508083825260208201905060208402830185811115613300576132ff6132c7565b5b835b8181101561332957806133158882613062565b845260208401935050602081019050613302565b5050509392505050565b5f82601f83011261334757613346613210565b5b81516133578482602086016132cb565b91505092915050565b5f6020828403121561337557613374612ca6565b5b5f82015167ffffffffffffffff81111561339257613391612caa565b5b61339e84828501613333565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f6133de82612d8e565b91506133e983612d8e565b9250826133f9576133f86133a7565b5b828204905092915050565b5f82825260208201905092915050565b7f6f6e6c79207468727520646563656e7472616c697a656420476f7665726e616e5f8201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b5f61346e602283613404565b915061347982613414565b604082019050919050565b5f6020820190508181035f83015261349b81613462565b9050919050565b5f6040820190506134b55f830185612ec3565b6134c26020830184612d33565b9392505050565b5f80604083850312156134df576134de612ca6565b5b5f6134ec85828601613062565b92505060206134fd85828601613062565b9150509250929050565b5f60408201905061351a5f830185612d33565b6135276020830184612ec3565b9392505050565b61353781612d5b565b8114613541575f80fd5b50565b5f815190506135528161352e565b92915050565b5f6020828403121561356d5761356c612ca6565b5b5f61357a84828501613544565b91505092915050565b5f8151905061359181612cde565b92915050565b5f602082840312156135ac576135ab612ca6565b5b5f6135b984828501613583565b91505092915050565b5f6040820190506135d55f830185612ec3565b81810360208301526135e7818461315c565b90509392505050565b5f819050919050565b5f61361361360e613609846135f0565b612eeb565b612d8e565b9050919050565b613623816135f9565b82525050565b5f60408201905061363c5f830185612ec3565b613649602083018461361a565b9392505050565b7f5769746864726177616c206e6f7420616c6c6f776564000000000000000000005f82015250565b5f613684601683613404565b915061368f82613650565b602082019050919050565b5f6020820190508181035f8301526136b181613678565b9050919050565b5f6dffffffffffffffffffffffffffff82169050919050565b6136da816136b8565b81146136e4575f80fd5b50565b5f815190506136f5816136d1565b92915050565b5f63ffffffff82169050919050565b613713816136fb565b811461371d575f80fd5b50565b5f8151905061372e8161370a565b92915050565b5f805f6060848603121561374b5761374a612ca6565b5b5f613758868287016136e7565b9350506020613769868287016136e7565b925050604061377a86828701613720565b9150509250925092565b7f7769746864726177616c20616c726561647920656e61626c65640000000000005f82015250565b5f6137b8601a83613404565b91506137c382613784565b602082019050919050565b5f6020820190508181035f8301526137e5816137ac565b9050919050565b7f696e73756666696369656e74206275726e656420766f74696e672063726564695f8201527f7400000000000000000000000000000000000000000000000000000000000000602082015250565b5f613846602183613404565b9150613851826137ec565b604082019050919050565b5f6020820190508181035f8301526138738161383a565b9050919050565b7f6d7573742077616974203230686f7572730000000000000000000000000000005f82015250565b5f6138ae601183613404565b91506138b98261387a565b602082019050919050565b5f6020820190508181035f8301526138db816138a2565b9050919050565b7f4e6f20746f6b656e7320746f2070726f76696465206c697175696469747900005f82015250565b5f613916601e83613404565b9150613921826138e2565b602082019050919050565b5f6020820190508181035f8301526139438161390a565b9050919050565b5f61395482612d8e565b915061395f83612d8e565b925082820261396d81612d8e565b9150828204841483151761398457613983613002565b5b5092915050565b5f6101008201905061399f5f83018b612d33565b6139ac602083018a612d33565b6139b96040830189612ec3565b6139c66060830188612ec3565b6139d36080830187612ec3565b6139e060a0830186612ec3565b6139ed60c0830185612d33565b6139fa60e0830184612ec3565b9998505050505050505050565b5f805f60608486031215613a1e57613a1d612ca6565b5b5f613a2b86828701613062565b9350506020613a3c86828701613062565b9250506040613a4d86828701613062565b915050925092509256fea2646970667358221220468a39e99f35b06685f672ab182af0a4bdb0802bbb9a3e7099e3452bf952086764736f6c63430008140033