false
true
0

Contract Address Details

0x488C81D85501769CF4Ca79ED657aF0633607ab1e

Contract Name
FarmHTTHEX
Creator
0xc6eda6–db69f1 at 0x36ce3d–438897
Balance
0 PLS ( )
Tokens
Fetching tokens...
Transactions
300 Transactions
Transfers
0 Transfers
Gas Used
0
Last Balance Update
26040305
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-04T08:30:58.974021Z

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 HTT5000 = 0xE2D03779147A32064511dd2b9D37F66f3EeFAd7C;
    address public immutable ACTR = 0x85DF7cE20A4CE0cF859804b45cB540FFE42074Da;

    address public immutable farmingContract = 0x4469A40D4243aC1c6cF350d99B6d69b49b5005F1;

    uint256 public immutable poolId = 1;


    IFarm stakingContract = IFarm(0x4469A40D4243aC1c6cF350d99B6d69b49b5005F1);

    uint256 public haltProposalStartingId = 18000000; //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 = 0x290e43f97a071f7513f55B534b2C196b9eFa364C; 

    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(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 = getEstimatedPLSXForHex(_swapAmount);
        _minOut = _minOutT[_minOutT.length-1];
        uniswapRouter.swapTokensForExactTokens(_minOut, _swapAmount, getTokenPath3(), address(this), deadline);

        IERC20(PLSX).transfer(treasury(), IERC20(PLSX).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 getEstimatedPLSXForHex(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] = PLSX;
        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":"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":"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":"","internalType":"uint256[]"}],"name":"getEstimatedPLSXForHex","inputs":[{"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

Verify & Publish
0x61018060405273faac6a85c3e123ab2cf7669b1024f146cfef0b3873ffffffffffffffffffffffffffffffffffffffff1660809073ffffffffffffffffffffffffffffffffffffffff1681525073cf14dbcffa6e99a444539abbc9ae273a7bb5d75a73ffffffffffffffffffffffffffffffffffffffff1660a09073ffffffffffffffffffffffffffffffffffffffff168152507395b303987a60c71504d99aa1b13b4da07b0790ab73ffffffffffffffffffffffffffffffffffffffff1660c09073ffffffffffffffffffffffffffffffffffffffff16815250732b591e99afe9f32eaa6214f7b7629768c40eeb3973ffffffffffffffffffffffffffffffffffffffff1660e09073ffffffffffffffffffffffffffffffffffffffff1681525073e2d03779147a32064511dd2b9d37f66f3eefad7c73ffffffffffffffffffffffffffffffffffffffff166101009073ffffffffffffffffffffffffffffffffffffffff168152507385df7ce20a4ce0cf859804b45cb540ffe42074da73ffffffffffffffffffffffffffffffffffffffff166101209073ffffffffffffffffffffffffffffffffffffffff16815250734469a40d4243ac1c6cf350d99b6d69b49b5005f173ffffffffffffffffffffffffffffffffffffffff166101409073ffffffffffffffffffffffffffffffffffffffff16815250600161016090815250734469a40d4243ac1c6cf350d99b6d69b49b5005f15f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550630112a8806001555f60025f6101000a81548160ff0219169083151502179055505f6003555f60045f6101000a81548160ff0219169083151502179055505f600555348015620002a3575f80fd5b5073165c3410fc91ef562c50559f7d2289febed552d960065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060c05173ffffffffffffffffffffffffffffffffffffffff1663095ea7b373165c3410fc91ef562c50559f7d2289febed552d97fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b81526004016200036b92919062000702565b6020604051808303815f875af115801562000388573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620003ae91906200076b565b5060e05173ffffffffffffffffffffffffffffffffffffffff1663095ea7b373165c3410fc91ef562c50559f7d2289febed552d97fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b81526004016200042292919062000702565b6020604051808303815f875af11580156200043f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200046591906200076b565b506101005173ffffffffffffffffffffffffffffffffffffffff1663095ea7b373165c3410fc91ef562c50559f7d2289febed552d97fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b8152600401620004da92919062000702565b6020604051808303815f875af1158015620004f7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200051d91906200076b565b506101205173ffffffffffffffffffffffffffffffffffffffff1663095ea7b373165c3410fc91ef562c50559f7d2289febed552d97fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b81526004016200059292919062000702565b6020604051808303815f875af1158015620005af573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620005d591906200076b565b5073290e43f97a071f7513f55b534b2c196b9efa364c73ffffffffffffffffffffffffffffffffffffffff1663095ea7b3734469a40d4243ac1c6cf350d99b6d69b49b5005f17fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b81526004016200065b92919062000702565b6020604051808303815f875af115801562000678573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200069e91906200076b565b506200079b565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f620006d082620006a5565b9050919050565b620006e281620006c4565b82525050565b5f819050919050565b620006fc81620006e8565b82525050565b5f604082019050620007175f830185620006d7565b620007266020830184620006f1565b9392505050565b5f80fd5b5f8115159050919050565b620007478162000731565b811462000752575f80fd5b50565b5f8151905062000765816200073c565b92915050565b5f602082840312156200078357620007826200072d565b5b5f620007928482850162000755565b91505092915050565b60805160a05160c05160e05161010051610120516101405161016051613a40620008d75f395f81816108ee01528181610ac201528181610b7d01528181610fcd0152818161107b0152818161195e0152611a1901525f6109ec01525f8181610be901528181610c2d015281816110f8015281816111960152818161122c0152818161189d01528181611a850152611ac901525f81816115f4015281816125e401528181612701015281816127ee0152612aa901525f818161072301528181610fa9015281816112b801528181612549015281816126e0015281816127cd0152818161297401528181612a3b0152612b6e01525f818161143401528181611478015281816116180152612bdc01525f8181611727015281816120980152818161220401526122c401525f8181610e6901526120060152613a405ff3fe608060405234801561000f575f80fd5b50600436106101e2575f3560e01c8063735de9f71161010d578063c73c103c116100a0578063e95164f51161006f578063e95164f514610503578063eb521a4c1461051f578063ee52df4e1461053b578063fa6f098d14610559576101e2565b8063c73c103c1461047a578063d52bb6f4146104aa578063dacec9fa146104db578063db2e21bc146104f9576101e2565b8063a972892a116100dc578063a972892a14610418578063b51459fe14610436578063be20eb4d14610454578063c690908a1461045e576101e2565b8063735de9f7146103a257806379b36943146103c05780637dbf9a7a146103de57806389476069146103fc576101e2565b80633e0dc34e1161018557806361d027b31161015457806361d027b3146103185780636285e95c1461033657806363dd9d74146103545780636aed6e5314610372576101e2565b80633e0dc34e146102b457806345ce2a0b146102d25780634641257d146102f05780635c422ff1146102fa576101e2565b806306179f52116101c157806306179f521461022a5780630c340a241461024857806314bd62dc146102665780631d55896614610296576101e2565b8062618161146101e657806302eec568146102025780630550b26614610220575b5f80fd5b61020060048036038101906101fb9190612cbb565b610577565b005b61020a6109ea565b6040516102179190612cf5565b60405180910390f35b610228610a0e565b005b610232610e54565b60405161023f9190612d28565b60405180910390f35b610250610e66565b60405161025d9190612cf5565b60405180910390f35b610280600480360381019061027b9190612d74565b610ef9565b60405161028d9190612e56565b60405180910390f35b61029e610fa7565b6040516102ab9190612cf5565b60405180910390f35b6102bc610fcb565b6040516102c99190612e85565b60405180910390f35b6102da610fef565b6040516102e79190612cf5565b60405180910390f35b6102f8611007565b005b610302611572565b60405161030f9190612e85565b60405180910390f35b610320611578565b60405161032d9190612cf5565b60405180910390f35b61033e6115f2565b60405161034b9190612cf5565b60405180910390f35b61035c611616565b6040516103699190612cf5565b60405180910390f35b61038c60048036038101906103879190612d74565b61163a565b6040516103999190612e56565b60405180910390f35b6103aa6116e8565b6040516103b79190612ef9565b60405180910390f35b6103c861170d565b6040516103d59190612cf5565b60405180910390f35b6103e6611725565b6040516103f39190612cf5565b60405180910390f35b61041660048036038101906104119190612cbb565b611749565b005b61042061189b565b60405161042d9190612cf5565b60405180910390f35b61043e6118bf565b60405161044b9190612d28565b60405180910390f35b61045c6118d1565b005b61047860048036038101906104739190612cbb565b611cf0565b005b610494600480360381019061048f9190612f12565b611da3565b6040516104a19190612e56565b60405180910390f35b6104c460048036038101906104bf9190612f50565b611e53565b6040516104d2929190612f8e565b60405180910390f35b6104e3612004565b6040516104f09190612cf5565b60405180910390f35b610501612028565b005b61051d60048036038101906105189190612cbb565b6123cd565b005b61053960048036038101906105349190612d74565b612546565b005b6105436128c9565b6040516105509190612e85565b60405180910390f35b6105616128cf565b60405161056e9190612e85565b60405180910390f35b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146105ae575f80fd5b5f600f426105bc9190612fe2565b90505f8273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016105f89190612cf5565b602060405180830381865afa158015610613573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106379190613029565b90505f6106448483611da3565b90505f81600183516106569190613054565b8151811061066757610666613087565b5b6020026020010151905060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638803dbee82856106b9896128d5565b30896040518663ffffffff1660e01b81526004016106db95949392919061316b565b5f604051808303815f875af11580156106f6573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f8201168201806040525081019061071e9190613313565b5060027f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161077a9190612cf5565b602060405180830381865afa158015610795573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107b99190613029565b6107c39190613387565b92506107ce8361163a565b915081600183516107df9190613054565b815181106107f0576107ef613087565b5b6020026020010151905060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638803dbee82856108416129ea565b30896040518663ffffffff1660e01b815260040161086395949392919061316b565b5f604051808303815f875af115801561087e573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906108a69190613313565b506108b16001612546565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e2bbb1587f000000000000000000000000000000000000000000000000000000000000000073290e43f97a071f7513f55b534b2c196b9efa364c73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161095a9190612cf5565b602060405180830381865afa158015610975573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109999190613029565b6040518363ffffffff1660e01b81526004016109b6929190612f8e565b5f604051808303815f87803b1580156109cd575f80fd5b505af11580156109df573d5f803e3d5ffd5b505050505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b610a16610e66565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610a83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a7a90613437565b60405180910390fd5b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166393f1a40b7f0000000000000000000000000000000000000000000000000000000000000000306040518363ffffffff1660e01b8152600401610aff929190613455565b6040805180830381865afa158015610b19573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b3d919061347c565b5090505f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663441a3e707f0000000000000000000000000000000000000000000000000000000000000000836040518363ffffffff1660e01b8152600401610bba929190612f8e565b5f604051808303815f87803b158015610bd1575f80fd5b505af1158015610be3573d5f803e3d5ffd5b505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb610c2b611578565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610c849190612cf5565b602060405180830381865afa158015610c9f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610cc39190613029565b6040518363ffffffff1660e01b8152600401610ce09291906134ba565b6020604051808303815f875af1158015610cfc573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d20919061350b565b610d28575f80fd5b73290e43f97a071f7513f55b534b2c196b9efa364c73ffffffffffffffffffffffffffffffffffffffff1663a9059cbb610d60611578565b73290e43f97a071f7513f55b534b2c196b9efa364c73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610dad9190612cf5565b602060405180830381865afa158015610dc8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610dec9190613029565b6040518363ffffffff1660e01b8152600401610e099291906134ba565b6020604051808303815f875af1158015610e25573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e49919061350b565b610e51575f80fd5b50565b60025f9054906101000a900460ff1681565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16630c340a246040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ed0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ef4919061354a565b905090565b606060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d06ca61f83610f41612b1d565b6040518363ffffffff1660e01b8152600401610f5e929190613575565b5f60405180830381865afa158015610f78573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190610fa09190613313565b9050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b73290e43f97a071f7513f55b534b2c196b9efa364c81565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461103e575f80fd5b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663441a3e707f00000000000000000000000000000000000000000000000000000000000000005f6040518363ffffffff1660e01b81526004016110b89291906135dc565b5f604051808303815f87803b1580156110cf575f80fd5b505af11580156110e1573d5f803e3d5ffd5b505050505f600f426110f39190612fe2565b90505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161114f9190612cf5565b602060405180830381865afa15801561116a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061118e9190613029565b90505f6111bb7f000000000000000000000000000000000000000000000000000000000000000083611da3565b90505f81600183516111cd9190613054565b815181106111de576111dd613087565b5b6020026020010151905060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638803dbee82856112507f00000000000000000000000000000000000000000000000000000000000000006128d5565b30896040518663ffffffff1660e01b815260040161127295949392919061316b565b5f604051808303815f875af115801561128d573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906112b59190613313565b507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161130f9190612cf5565b602060405180830381865afa15801561132a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061134e9190613029565b925061135983610ef9565b9150816001835161136a9190613054565b8151811061137b5761137a613087565b5b6020026020010151905060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638803dbee82856113cc612b1d565b30896040518663ffffffff1660e01b81526004016113ee95949392919061316b565b5f604051808303815f875af1158015611409573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906114319190613313565b507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb611476611578565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016114cf9190612cf5565b602060405180830381865afa1580156114ea573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061150e9190613029565b6040518363ffffffff1660e01b815260040161152b9291906134ba565b6020604051808303815f875af1158015611547573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061156b919061350b565b5050505050565b60055481565b5f611581610e66565b73ffffffffffffffffffffffffffffffffffffffff16634626402b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156115c9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115ed919061354a565b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b606060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d06ca61f836116826129ea565b6040518363ffffffff1660e01b815260040161169f929190613575565b5f60405180830381865afa1580156116b9573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906116e19190613313565b9050919050565b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b73165c3410fc91ef562c50559f7d2289febed552d981565b7f000000000000000000000000000000000000000000000000000000000000000081565b60045f9054906101000a900460ff16611797576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178e9061364d565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6117bb611578565b8373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016117f49190612cf5565b602060405180830381865afa15801561180f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118339190613029565b6040518363ffffffff1660e01b81526004016118509291906134ba565b6020604051808303815f875af115801561186c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611890919061350b565b611898575f80fd5b50565b7f000000000000000000000000000000000000000000000000000000000000000081565b60045f9054906101000a900460ff1681565b60045f9054906101000a900460ff1661191f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119169061364d565b60405180910390fd5b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166393f1a40b7f0000000000000000000000000000000000000000000000000000000000000000306040518363ffffffff1660e01b815260040161199b929190613455565b6040805180830381865afa1580156119b5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119d9919061347c565b5090505f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663441a3e707f0000000000000000000000000000000000000000000000000000000000000000836040518363ffffffff1660e01b8152600401611a56929190612f8e565b5f604051808303815f87803b158015611a6d575f80fd5b505af1158015611a7f573d5f803e3d5ffd5b505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb611ac7611578565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611b209190612cf5565b602060405180830381865afa158015611b3b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b5f9190613029565b6040518363ffffffff1660e01b8152600401611b7c9291906134ba565b6020604051808303815f875af1158015611b98573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bbc919061350b565b611bc4575f80fd5b73290e43f97a071f7513f55b534b2c196b9efa364c73ffffffffffffffffffffffffffffffffffffffff1663a9059cbb611bfc611578565b73290e43f97a071f7513f55b534b2c196b9efa364c73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611c499190612cf5565b602060405180830381865afa158015611c64573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c889190613029565b6040518363ffffffff1660e01b8152600401611ca59291906134ba565b6020604051808303815f875af1158015611cc1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ce5919061350b565b611ced575f80fd5b50565b8073ffffffffffffffffffffffffffffffffffffffff1663095ea7b373165c3410fc91ef562c50559f7d2289febed552d97fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b8152600401611d5f9291906134ba565b6020604051808303815f875af1158015611d7b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d9f919061350b565b5050565b606060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d06ca61f83611dec866128d5565b6040518363ffffffff1660e01b8152600401611e09929190613575565b5f60405180830381865afa158015611e23573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190611e4b9190613313565b905092915050565b5f805f73290e43f97a071f7513f55b534b2c196b9efa364c90505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611eac575f809250925050611ffd565b5f808273ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015611ef7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f1b91906136e7565b506dffffffffffffffffffffffffffff1691506dffffffffffffffffffffffffffff1691505f8373ffffffffffffffffffffffffffffffffffffffff16630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa158015611f8a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611fae919061354a565b90508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611ff25782829550955050505050611ffd565b818395509550505050505b9250929050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60045f9054906101000a900460ff1615612077576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206e90613781565b60405180910390fd5b60025f9054906101000a900460ff166121b0576a027b46536c66c8e30000007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663b03013f06005546103e86001546120e59190612fe2565b6120ef9190612fe2565b6040518263ffffffff1660e01b815260040161210b9190612e85565b602060405180830381865afa158015612126573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061214a9190613029565b1161218a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121819061380f565b60405180910390fd5b600160025f6101000a81548160ff021916908315150217905550426003819055506123cb565b620119406003546121c19190612fe2565b4211612202576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121f990613877565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663b03013f060016005546103e86001546122539190612fe2565b61225d9190612fe2565b6122679190612fe2565b6040518263ffffffff1660e01b81526004016122839190612e85565b602060405180830381865afa15801561229e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122c29190613029565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663b03013f06005546103e86001546123119190612fe2565b61231b9190612fe2565b6040518263ffffffff1660e01b81526004016123379190612e85565b602060405180830381865afa158015612352573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123769190613029565b111561239b57600160045f6101000a81548160ff0219169083151502179055506123ca565b5f60025f6101000a81548160ff02191690831515021790555060026005546123c39190612fe2565b6005819055505b5b565b6123d5610e66565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612442576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161243990613437565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb612466611578565b8373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161249f9190612cf5565b602060405180830381865afa1580156124ba573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124de9190613029565b6040518363ffffffff1660e01b81526004016124fb9291906134ba565b6020604051808303815f875af1158015612517573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061253b919061350b565b612543575f80fd5b50565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016125a09190612cf5565b602060405180830381865afa1580156125bb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125df9190613029565b90505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161263b9190612cf5565b602060405180830381865afa158015612656573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061267a9190613029565b90505f8211801561268a57505f81115b6126c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126c0906138df565b60405180910390fd5b5f600f426126d79190612fe2565b90505f806127257f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000611e53565b915091505f8590505f8590505f8411801561273f57505f83115b1561278e575f84848961275291906138fd565b61275c9190613387565b905086811161276d5780915061278c565b5f84868961277b91906138fd565b6127859190613387565b9050809350505b505b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e8e337007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000858560648e606461281e9190613054565b8961282991906138fd565b6128339190613387565b60648f60646128429190613054565b8961284d91906138fd565b6128579190613387565b308d6040518963ffffffff1660e01b815260040161287c98979695949392919061393e565b6060604051808303815f875af1158015612898573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128bc91906139ba565b5050505050505050505050565b60015481565b60035481565b60605f600267ffffffffffffffff8111156128f3576128f26131d7565b5b6040519080825280602002602001820160405280156129215781602001602082028036833780820191505090505b50905082815f8151811061293857612937613087565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f0000000000000000000000000000000000000000000000000000000000000000816001815181106129a7576129a6613087565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505080915050919050565b60605f600267ffffffffffffffff811115612a0857612a076131d7565b5b604051908082528060200260200182016040528015612a365781602001602082028036833780820191505090505b5090507f0000000000000000000000000000000000000000000000000000000000000000815f81518110612a6d57612a6c613087565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110612adc57612adb613087565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508091505090565b60605f600267ffffffffffffffff811115612b3b57612b3a6131d7565b5b604051908082528060200260200182016040528015612b695781602001602082028036833780820191505090505b5090507f0000000000000000000000000000000000000000000000000000000000000000815f81518110612ba057612b9f613087565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110612c0f57612c0e613087565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508091505090565b5f604051905090565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f612c8a82612c61565b9050919050565b612c9a81612c80565b8114612ca4575f80fd5b50565b5f81359050612cb581612c91565b92915050565b5f60208284031215612cd057612ccf612c59565b5b5f612cdd84828501612ca7565b91505092915050565b612cef81612c80565b82525050565b5f602082019050612d085f830184612ce6565b92915050565b5f8115159050919050565b612d2281612d0e565b82525050565b5f602082019050612d3b5f830184612d19565b92915050565b5f819050919050565b612d5381612d41565b8114612d5d575f80fd5b50565b5f81359050612d6e81612d4a565b92915050565b5f60208284031215612d8957612d88612c59565b5b5f612d9684828501612d60565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b612dd181612d41565b82525050565b5f612de28383612dc8565b60208301905092915050565b5f602082019050919050565b5f612e0482612d9f565b612e0e8185612da9565b9350612e1983612db9565b805f5b83811015612e49578151612e308882612dd7565b9750612e3b83612dee565b925050600181019050612e1c565b5085935050505092915050565b5f6020820190508181035f830152612e6e8184612dfa565b905092915050565b612e7f81612d41565b82525050565b5f602082019050612e985f830184612e76565b92915050565b5f819050919050565b5f612ec1612ebc612eb784612c61565b612e9e565b612c61565b9050919050565b5f612ed282612ea7565b9050919050565b5f612ee382612ec8565b9050919050565b612ef381612ed9565b82525050565b5f602082019050612f0c5f830184612eea565b92915050565b5f8060408385031215612f2857612f27612c59565b5b5f612f3585828601612ca7565b9250506020612f4685828601612d60565b9150509250929050565b5f8060408385031215612f6657612f65612c59565b5b5f612f7385828601612ca7565b9250506020612f8485828601612ca7565b9150509250929050565b5f604082019050612fa15f830185612e76565b612fae6020830184612e76565b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f612fec82612d41565b9150612ff783612d41565b925082820190508082111561300f5761300e612fb5565b5b92915050565b5f8151905061302381612d4a565b92915050565b5f6020828403121561303e5761303d612c59565b5b5f61304b84828501613015565b91505092915050565b5f61305e82612d41565b915061306983612d41565b925082820390508181111561308157613080612fb5565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b6130e681612c80565b82525050565b5f6130f783836130dd565b60208301905092915050565b5f602082019050919050565b5f613119826130b4565b61312381856130be565b935061312e836130ce565b805f5b8381101561315e57815161314588826130ec565b975061315083613103565b925050600181019050613131565b5085935050505092915050565b5f60a08201905061317e5f830188612e76565b61318b6020830187612e76565b818103604083015261319d818661310f565b90506131ac6060830185612ce6565b6131b96080830184612e76565b9695505050505050565b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61320d826131c7565b810181811067ffffffffffffffff8211171561322c5761322b6131d7565b5b80604052505050565b5f61323e612c50565b905061324a8282613204565b919050565b5f67ffffffffffffffff821115613269576132686131d7565b5b602082029050602081019050919050565b5f80fd5b5f61329061328b8461324f565b613235565b905080838252602082019050602084028301858111156132b3576132b261327a565b5b835b818110156132dc57806132c88882613015565b8452602084019350506020810190506132b5565b5050509392505050565b5f82601f8301126132fa576132f96131c3565b5b815161330a84826020860161327e565b91505092915050565b5f6020828403121561332857613327612c59565b5b5f82015167ffffffffffffffff81111561334557613344612c5d565b5b613351848285016132e6565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f61339182612d41565b915061339c83612d41565b9250826133ac576133ab61335a565b5b828204905092915050565b5f82825260208201905092915050565b7f6f6e6c79207468727520646563656e7472616c697a656420476f7665726e616e5f8201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b5f6134216022836133b7565b915061342c826133c7565b604082019050919050565b5f6020820190508181035f83015261344e81613415565b9050919050565b5f6040820190506134685f830185612e76565b6134756020830184612ce6565b9392505050565b5f806040838503121561349257613491612c59565b5b5f61349f85828601613015565b92505060206134b085828601613015565b9150509250929050565b5f6040820190506134cd5f830185612ce6565b6134da6020830184612e76565b9392505050565b6134ea81612d0e565b81146134f4575f80fd5b50565b5f81519050613505816134e1565b92915050565b5f602082840312156135205761351f612c59565b5b5f61352d848285016134f7565b91505092915050565b5f8151905061354481612c91565b92915050565b5f6020828403121561355f5761355e612c59565b5b5f61356c84828501613536565b91505092915050565b5f6040820190506135885f830185612e76565b818103602083015261359a818461310f565b90509392505050565b5f819050919050565b5f6135c66135c16135bc846135a3565b612e9e565b612d41565b9050919050565b6135d6816135ac565b82525050565b5f6040820190506135ef5f830185612e76565b6135fc60208301846135cd565b9392505050565b7f5769746864726177616c206e6f7420616c6c6f776564000000000000000000005f82015250565b5f6136376016836133b7565b915061364282613603565b602082019050919050565b5f6020820190508181035f8301526136648161362b565b9050919050565b5f6dffffffffffffffffffffffffffff82169050919050565b61368d8161366b565b8114613697575f80fd5b50565b5f815190506136a881613684565b92915050565b5f63ffffffff82169050919050565b6136c6816136ae565b81146136d0575f80fd5b50565b5f815190506136e1816136bd565b92915050565b5f805f606084860312156136fe576136fd612c59565b5b5f61370b8682870161369a565b935050602061371c8682870161369a565b925050604061372d868287016136d3565b9150509250925092565b7f7769746864726177616c20616c726561647920656e61626c65640000000000005f82015250565b5f61376b601a836133b7565b915061377682613737565b602082019050919050565b5f6020820190508181035f8301526137988161375f565b9050919050565b7f696e73756666696369656e74206275726e656420766f74696e672063726564695f8201527f7400000000000000000000000000000000000000000000000000000000000000602082015250565b5f6137f96021836133b7565b91506138048261379f565b604082019050919050565b5f6020820190508181035f830152613826816137ed565b9050919050565b7f6d7573742077616974203230686f7572730000000000000000000000000000005f82015250565b5f6138616011836133b7565b915061386c8261382d565b602082019050919050565b5f6020820190508181035f83015261388e81613855565b9050919050565b7f4e6f20746f6b656e7320746f2070726f76696465206c697175696469747900005f82015250565b5f6138c9601e836133b7565b91506138d482613895565b602082019050919050565b5f6020820190508181035f8301526138f6816138bd565b9050919050565b5f61390782612d41565b915061391283612d41565b925082820261392081612d41565b9150828204841483151761393757613936612fb5565b5b5092915050565b5f610100820190506139525f83018b612ce6565b61395f602083018a612ce6565b61396c6040830189612e76565b6139796060830188612e76565b6139866080830187612e76565b61399360a0830186612e76565b6139a060c0830185612ce6565b6139ad60e0830184612e76565b9998505050505050505050565b5f805f606084860312156139d1576139d0612c59565b5b5f6139de86828701613015565b93505060206139ef86828701613015565b9250506040613a0086828701613015565b915050925092509256fea264697066735822122008d20350cf4b87794c964503763d3f9f58c346ae96dd36eec1a73db1dea7ef8e64736f6c63430008140033

Deployed ByteCode

0x608060405234801561000f575f80fd5b50600436106101e2575f3560e01c8063735de9f71161010d578063c73c103c116100a0578063e95164f51161006f578063e95164f514610503578063eb521a4c1461051f578063ee52df4e1461053b578063fa6f098d14610559576101e2565b8063c73c103c1461047a578063d52bb6f4146104aa578063dacec9fa146104db578063db2e21bc146104f9576101e2565b8063a972892a116100dc578063a972892a14610418578063b51459fe14610436578063be20eb4d14610454578063c690908a1461045e576101e2565b8063735de9f7146103a257806379b36943146103c05780637dbf9a7a146103de57806389476069146103fc576101e2565b80633e0dc34e1161018557806361d027b31161015457806361d027b3146103185780636285e95c1461033657806363dd9d74146103545780636aed6e5314610372576101e2565b80633e0dc34e146102b457806345ce2a0b146102d25780634641257d146102f05780635c422ff1146102fa576101e2565b806306179f52116101c157806306179f521461022a5780630c340a241461024857806314bd62dc146102665780631d55896614610296576101e2565b8062618161146101e657806302eec568146102025780630550b26614610220575b5f80fd5b61020060048036038101906101fb9190612cbb565b610577565b005b61020a6109ea565b6040516102179190612cf5565b60405180910390f35b610228610a0e565b005b610232610e54565b60405161023f9190612d28565b60405180910390f35b610250610e66565b60405161025d9190612cf5565b60405180910390f35b610280600480360381019061027b9190612d74565b610ef9565b60405161028d9190612e56565b60405180910390f35b61029e610fa7565b6040516102ab9190612cf5565b60405180910390f35b6102bc610fcb565b6040516102c99190612e85565b60405180910390f35b6102da610fef565b6040516102e79190612cf5565b60405180910390f35b6102f8611007565b005b610302611572565b60405161030f9190612e85565b60405180910390f35b610320611578565b60405161032d9190612cf5565b60405180910390f35b61033e6115f2565b60405161034b9190612cf5565b60405180910390f35b61035c611616565b6040516103699190612cf5565b60405180910390f35b61038c60048036038101906103879190612d74565b61163a565b6040516103999190612e56565b60405180910390f35b6103aa6116e8565b6040516103b79190612ef9565b60405180910390f35b6103c861170d565b6040516103d59190612cf5565b60405180910390f35b6103e6611725565b6040516103f39190612cf5565b60405180910390f35b61041660048036038101906104119190612cbb565b611749565b005b61042061189b565b60405161042d9190612cf5565b60405180910390f35b61043e6118bf565b60405161044b9190612d28565b60405180910390f35b61045c6118d1565b005b61047860048036038101906104739190612cbb565b611cf0565b005b610494600480360381019061048f9190612f12565b611da3565b6040516104a19190612e56565b60405180910390f35b6104c460048036038101906104bf9190612f50565b611e53565b6040516104d2929190612f8e565b60405180910390f35b6104e3612004565b6040516104f09190612cf5565b60405180910390f35b610501612028565b005b61051d60048036038101906105189190612cbb565b6123cd565b005b61053960048036038101906105349190612d74565b612546565b005b6105436128c9565b6040516105509190612e85565b60405180910390f35b6105616128cf565b60405161056e9190612e85565b60405180910390f35b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146105ae575f80fd5b5f600f426105bc9190612fe2565b90505f8273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016105f89190612cf5565b602060405180830381865afa158015610613573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106379190613029565b90505f6106448483611da3565b90505f81600183516106569190613054565b8151811061066757610666613087565b5b6020026020010151905060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638803dbee82856106b9896128d5565b30896040518663ffffffff1660e01b81526004016106db95949392919061316b565b5f604051808303815f875af11580156106f6573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f8201168201806040525081019061071e9190613313565b5060027f0000000000000000000000002b591e99afe9f32eaa6214f7b7629768c40eeb3973ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161077a9190612cf5565b602060405180830381865afa158015610795573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107b99190613029565b6107c39190613387565b92506107ce8361163a565b915081600183516107df9190613054565b815181106107f0576107ef613087565b5b6020026020010151905060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638803dbee82856108416129ea565b30896040518663ffffffff1660e01b815260040161086395949392919061316b565b5f604051808303815f875af115801561087e573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906108a69190613313565b506108b16001612546565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e2bbb1587f000000000000000000000000000000000000000000000000000000000000000173290e43f97a071f7513f55b534b2c196b9efa364c73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161095a9190612cf5565b602060405180830381865afa158015610975573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109999190613029565b6040518363ffffffff1660e01b81526004016109b6929190612f8e565b5f604051808303815f87803b1580156109cd575f80fd5b505af11580156109df573d5f803e3d5ffd5b505050505050505050565b7f0000000000000000000000004469a40d4243ac1c6cf350d99b6d69b49b5005f181565b610a16610e66565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610a83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a7a90613437565b60405180910390fd5b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166393f1a40b7f0000000000000000000000000000000000000000000000000000000000000001306040518363ffffffff1660e01b8152600401610aff929190613455565b6040805180830381865afa158015610b19573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b3d919061347c565b5090505f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663441a3e707f0000000000000000000000000000000000000000000000000000000000000001836040518363ffffffff1660e01b8152600401610bba929190612f8e565b5f604051808303815f87803b158015610bd1575f80fd5b505af1158015610be3573d5f803e3d5ffd5b505050507f00000000000000000000000085df7ce20a4ce0cf859804b45cb540ffe42074da73ffffffffffffffffffffffffffffffffffffffff1663a9059cbb610c2b611578565b7f00000000000000000000000085df7ce20a4ce0cf859804b45cb540ffe42074da73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610c849190612cf5565b602060405180830381865afa158015610c9f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610cc39190613029565b6040518363ffffffff1660e01b8152600401610ce09291906134ba565b6020604051808303815f875af1158015610cfc573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d20919061350b565b610d28575f80fd5b73290e43f97a071f7513f55b534b2c196b9efa364c73ffffffffffffffffffffffffffffffffffffffff1663a9059cbb610d60611578565b73290e43f97a071f7513f55b534b2c196b9efa364c73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610dad9190612cf5565b602060405180830381865afa158015610dc8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610dec9190613029565b6040518363ffffffff1660e01b8152600401610e099291906134ba565b6020604051808303815f875af1158015610e25573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e49919061350b565b610e51575f80fd5b50565b60025f9054906101000a900460ff1681565b5f7f000000000000000000000000faac6a85c3e123ab2cf7669b1024f146cfef0b3873ffffffffffffffffffffffffffffffffffffffff16630c340a246040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ed0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ef4919061354a565b905090565b606060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d06ca61f83610f41612b1d565b6040518363ffffffff1660e01b8152600401610f5e929190613575565b5f60405180830381865afa158015610f78573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190610fa09190613313565b9050919050565b7f0000000000000000000000002b591e99afe9f32eaa6214f7b7629768c40eeb3981565b7f000000000000000000000000000000000000000000000000000000000000000181565b73290e43f97a071f7513f55b534b2c196b9efa364c81565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461103e575f80fd5b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663441a3e707f00000000000000000000000000000000000000000000000000000000000000015f6040518363ffffffff1660e01b81526004016110b89291906135dc565b5f604051808303815f87803b1580156110cf575f80fd5b505af11580156110e1573d5f803e3d5ffd5b505050505f600f426110f39190612fe2565b90505f7f00000000000000000000000085df7ce20a4ce0cf859804b45cb540ffe42074da73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161114f9190612cf5565b602060405180830381865afa15801561116a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061118e9190613029565b90505f6111bb7f00000000000000000000000085df7ce20a4ce0cf859804b45cb540ffe42074da83611da3565b90505f81600183516111cd9190613054565b815181106111de576111dd613087565b5b6020026020010151905060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638803dbee82856112507f00000000000000000000000085df7ce20a4ce0cf859804b45cb540ffe42074da6128d5565b30896040518663ffffffff1660e01b815260040161127295949392919061316b565b5f604051808303815f875af115801561128d573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906112b59190613313565b507f0000000000000000000000002b591e99afe9f32eaa6214f7b7629768c40eeb3973ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161130f9190612cf5565b602060405180830381865afa15801561132a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061134e9190613029565b925061135983610ef9565b9150816001835161136a9190613054565b8151811061137b5761137a613087565b5b6020026020010151905060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638803dbee82856113cc612b1d565b30896040518663ffffffff1660e01b81526004016113ee95949392919061316b565b5f604051808303815f875af1158015611409573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906114319190613313565b507f00000000000000000000000095b303987a60c71504d99aa1b13b4da07b0790ab73ffffffffffffffffffffffffffffffffffffffff1663a9059cbb611476611578565b7f00000000000000000000000095b303987a60c71504d99aa1b13b4da07b0790ab73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016114cf9190612cf5565b602060405180830381865afa1580156114ea573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061150e9190613029565b6040518363ffffffff1660e01b815260040161152b9291906134ba565b6020604051808303815f875af1158015611547573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061156b919061350b565b5050505050565b60055481565b5f611581610e66565b73ffffffffffffffffffffffffffffffffffffffff16634626402b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156115c9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115ed919061354a565b905090565b7f000000000000000000000000e2d03779147a32064511dd2b9d37f66f3eefad7c81565b7f00000000000000000000000095b303987a60c71504d99aa1b13b4da07b0790ab81565b606060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d06ca61f836116826129ea565b6040518363ffffffff1660e01b815260040161169f929190613575565b5f60405180830381865afa1580156116b9573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906116e19190613313565b9050919050565b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b73165c3410fc91ef562c50559f7d2289febed552d981565b7f000000000000000000000000cf14dbcffa6e99a444539abbc9ae273a7bb5d75a81565b60045f9054906101000a900460ff16611797576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178e9061364d565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6117bb611578565b8373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016117f49190612cf5565b602060405180830381865afa15801561180f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118339190613029565b6040518363ffffffff1660e01b81526004016118509291906134ba565b6020604051808303815f875af115801561186c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611890919061350b565b611898575f80fd5b50565b7f00000000000000000000000085df7ce20a4ce0cf859804b45cb540ffe42074da81565b60045f9054906101000a900460ff1681565b60045f9054906101000a900460ff1661191f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119169061364d565b60405180910390fd5b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166393f1a40b7f0000000000000000000000000000000000000000000000000000000000000001306040518363ffffffff1660e01b815260040161199b929190613455565b6040805180830381865afa1580156119b5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119d9919061347c565b5090505f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663441a3e707f0000000000000000000000000000000000000000000000000000000000000001836040518363ffffffff1660e01b8152600401611a56929190612f8e565b5f604051808303815f87803b158015611a6d575f80fd5b505af1158015611a7f573d5f803e3d5ffd5b505050507f00000000000000000000000085df7ce20a4ce0cf859804b45cb540ffe42074da73ffffffffffffffffffffffffffffffffffffffff1663a9059cbb611ac7611578565b7f00000000000000000000000085df7ce20a4ce0cf859804b45cb540ffe42074da73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611b209190612cf5565b602060405180830381865afa158015611b3b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b5f9190613029565b6040518363ffffffff1660e01b8152600401611b7c9291906134ba565b6020604051808303815f875af1158015611b98573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bbc919061350b565b611bc4575f80fd5b73290e43f97a071f7513f55b534b2c196b9efa364c73ffffffffffffffffffffffffffffffffffffffff1663a9059cbb611bfc611578565b73290e43f97a071f7513f55b534b2c196b9efa364c73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611c499190612cf5565b602060405180830381865afa158015611c64573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c889190613029565b6040518363ffffffff1660e01b8152600401611ca59291906134ba565b6020604051808303815f875af1158015611cc1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ce5919061350b565b611ced575f80fd5b50565b8073ffffffffffffffffffffffffffffffffffffffff1663095ea7b373165c3410fc91ef562c50559f7d2289febed552d97fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b8152600401611d5f9291906134ba565b6020604051808303815f875af1158015611d7b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d9f919061350b565b5050565b606060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d06ca61f83611dec866128d5565b6040518363ffffffff1660e01b8152600401611e09929190613575565b5f60405180830381865afa158015611e23573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190611e4b9190613313565b905092915050565b5f805f73290e43f97a071f7513f55b534b2c196b9efa364c90505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611eac575f809250925050611ffd565b5f808273ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015611ef7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f1b91906136e7565b506dffffffffffffffffffffffffffff1691506dffffffffffffffffffffffffffff1691505f8373ffffffffffffffffffffffffffffffffffffffff16630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa158015611f8a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611fae919061354a565b90508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611ff25782829550955050505050611ffd565b818395509550505050505b9250929050565b7f000000000000000000000000faac6a85c3e123ab2cf7669b1024f146cfef0b3881565b60045f9054906101000a900460ff1615612077576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206e90613781565b60405180910390fd5b60025f9054906101000a900460ff166121b0576a027b46536c66c8e30000007f000000000000000000000000cf14dbcffa6e99a444539abbc9ae273a7bb5d75a73ffffffffffffffffffffffffffffffffffffffff1663b03013f06005546103e86001546120e59190612fe2565b6120ef9190612fe2565b6040518263ffffffff1660e01b815260040161210b9190612e85565b602060405180830381865afa158015612126573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061214a9190613029565b1161218a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121819061380f565b60405180910390fd5b600160025f6101000a81548160ff021916908315150217905550426003819055506123cb565b620119406003546121c19190612fe2565b4211612202576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121f990613877565b60405180910390fd5b7f000000000000000000000000cf14dbcffa6e99a444539abbc9ae273a7bb5d75a73ffffffffffffffffffffffffffffffffffffffff1663b03013f060016005546103e86001546122539190612fe2565b61225d9190612fe2565b6122679190612fe2565b6040518263ffffffff1660e01b81526004016122839190612e85565b602060405180830381865afa15801561229e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122c29190613029565b7f000000000000000000000000cf14dbcffa6e99a444539abbc9ae273a7bb5d75a73ffffffffffffffffffffffffffffffffffffffff1663b03013f06005546103e86001546123119190612fe2565b61231b9190612fe2565b6040518263ffffffff1660e01b81526004016123379190612e85565b602060405180830381865afa158015612352573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123769190613029565b111561239b57600160045f6101000a81548160ff0219169083151502179055506123ca565b5f60025f6101000a81548160ff02191690831515021790555060026005546123c39190612fe2565b6005819055505b5b565b6123d5610e66565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612442576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161243990613437565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb612466611578565b8373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161249f9190612cf5565b602060405180830381865afa1580156124ba573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124de9190613029565b6040518363ffffffff1660e01b81526004016124fb9291906134ba565b6020604051808303815f875af1158015612517573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061253b919061350b565b612543575f80fd5b50565b5f7f0000000000000000000000002b591e99afe9f32eaa6214f7b7629768c40eeb3973ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016125a09190612cf5565b602060405180830381865afa1580156125bb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125df9190613029565b90505f7f000000000000000000000000e2d03779147a32064511dd2b9d37f66f3eefad7c73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161263b9190612cf5565b602060405180830381865afa158015612656573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061267a9190613029565b90505f8211801561268a57505f81115b6126c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126c0906138df565b60405180910390fd5b5f600f426126d79190612fe2565b90505f806127257f0000000000000000000000002b591e99afe9f32eaa6214f7b7629768c40eeb397f000000000000000000000000e2d03779147a32064511dd2b9d37f66f3eefad7c611e53565b915091505f8590505f8590505f8411801561273f57505f83115b1561278e575f84848961275291906138fd565b61275c9190613387565b905086811161276d5780915061278c565b5f84868961277b91906138fd565b6127859190613387565b9050809350505b505b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e8e337007f0000000000000000000000002b591e99afe9f32eaa6214f7b7629768c40eeb397f000000000000000000000000e2d03779147a32064511dd2b9d37f66f3eefad7c858560648e606461281e9190613054565b8961282991906138fd565b6128339190613387565b60648f60646128429190613054565b8961284d91906138fd565b6128579190613387565b308d6040518963ffffffff1660e01b815260040161287c98979695949392919061393e565b6060604051808303815f875af1158015612898573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128bc91906139ba565b5050505050505050505050565b60015481565b60035481565b60605f600267ffffffffffffffff8111156128f3576128f26131d7565b5b6040519080825280602002602001820160405280156129215781602001602082028036833780820191505090505b50905082815f8151811061293857612937613087565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f0000000000000000000000002b591e99afe9f32eaa6214f7b7629768c40eeb39816001815181106129a7576129a6613087565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505080915050919050565b60605f600267ffffffffffffffff811115612a0857612a076131d7565b5b604051908082528060200260200182016040528015612a365781602001602082028036833780820191505090505b5090507f0000000000000000000000002b591e99afe9f32eaa6214f7b7629768c40eeb39815f81518110612a6d57612a6c613087565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f000000000000000000000000e2d03779147a32064511dd2b9d37f66f3eefad7c81600181518110612adc57612adb613087565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508091505090565b60605f600267ffffffffffffffff811115612b3b57612b3a6131d7565b5b604051908082528060200260200182016040528015612b695781602001602082028036833780820191505090505b5090507f0000000000000000000000002b591e99afe9f32eaa6214f7b7629768c40eeb39815f81518110612ba057612b9f613087565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f00000000000000000000000095b303987a60c71504d99aa1b13b4da07b0790ab81600181518110612c0f57612c0e613087565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508091505090565b5f604051905090565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f612c8a82612c61565b9050919050565b612c9a81612c80565b8114612ca4575f80fd5b50565b5f81359050612cb581612c91565b92915050565b5f60208284031215612cd057612ccf612c59565b5b5f612cdd84828501612ca7565b91505092915050565b612cef81612c80565b82525050565b5f602082019050612d085f830184612ce6565b92915050565b5f8115159050919050565b612d2281612d0e565b82525050565b5f602082019050612d3b5f830184612d19565b92915050565b5f819050919050565b612d5381612d41565b8114612d5d575f80fd5b50565b5f81359050612d6e81612d4a565b92915050565b5f60208284031215612d8957612d88612c59565b5b5f612d9684828501612d60565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b612dd181612d41565b82525050565b5f612de28383612dc8565b60208301905092915050565b5f602082019050919050565b5f612e0482612d9f565b612e0e8185612da9565b9350612e1983612db9565b805f5b83811015612e49578151612e308882612dd7565b9750612e3b83612dee565b925050600181019050612e1c565b5085935050505092915050565b5f6020820190508181035f830152612e6e8184612dfa565b905092915050565b612e7f81612d41565b82525050565b5f602082019050612e985f830184612e76565b92915050565b5f819050919050565b5f612ec1612ebc612eb784612c61565b612e9e565b612c61565b9050919050565b5f612ed282612ea7565b9050919050565b5f612ee382612ec8565b9050919050565b612ef381612ed9565b82525050565b5f602082019050612f0c5f830184612eea565b92915050565b5f8060408385031215612f2857612f27612c59565b5b5f612f3585828601612ca7565b9250506020612f4685828601612d60565b9150509250929050565b5f8060408385031215612f6657612f65612c59565b5b5f612f7385828601612ca7565b9250506020612f8485828601612ca7565b9150509250929050565b5f604082019050612fa15f830185612e76565b612fae6020830184612e76565b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f612fec82612d41565b9150612ff783612d41565b925082820190508082111561300f5761300e612fb5565b5b92915050565b5f8151905061302381612d4a565b92915050565b5f6020828403121561303e5761303d612c59565b5b5f61304b84828501613015565b91505092915050565b5f61305e82612d41565b915061306983612d41565b925082820390508181111561308157613080612fb5565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b6130e681612c80565b82525050565b5f6130f783836130dd565b60208301905092915050565b5f602082019050919050565b5f613119826130b4565b61312381856130be565b935061312e836130ce565b805f5b8381101561315e57815161314588826130ec565b975061315083613103565b925050600181019050613131565b5085935050505092915050565b5f60a08201905061317e5f830188612e76565b61318b6020830187612e76565b818103604083015261319d818661310f565b90506131ac6060830185612ce6565b6131b96080830184612e76565b9695505050505050565b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61320d826131c7565b810181811067ffffffffffffffff8211171561322c5761322b6131d7565b5b80604052505050565b5f61323e612c50565b905061324a8282613204565b919050565b5f67ffffffffffffffff821115613269576132686131d7565b5b602082029050602081019050919050565b5f80fd5b5f61329061328b8461324f565b613235565b905080838252602082019050602084028301858111156132b3576132b261327a565b5b835b818110156132dc57806132c88882613015565b8452602084019350506020810190506132b5565b5050509392505050565b5f82601f8301126132fa576132f96131c3565b5b815161330a84826020860161327e565b91505092915050565b5f6020828403121561332857613327612c59565b5b5f82015167ffffffffffffffff81111561334557613344612c5d565b5b613351848285016132e6565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f61339182612d41565b915061339c83612d41565b9250826133ac576133ab61335a565b5b828204905092915050565b5f82825260208201905092915050565b7f6f6e6c79207468727520646563656e7472616c697a656420476f7665726e616e5f8201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b5f6134216022836133b7565b915061342c826133c7565b604082019050919050565b5f6020820190508181035f83015261344e81613415565b9050919050565b5f6040820190506134685f830185612e76565b6134756020830184612ce6565b9392505050565b5f806040838503121561349257613491612c59565b5b5f61349f85828601613015565b92505060206134b085828601613015565b9150509250929050565b5f6040820190506134cd5f830185612ce6565b6134da6020830184612e76565b9392505050565b6134ea81612d0e565b81146134f4575f80fd5b50565b5f81519050613505816134e1565b92915050565b5f602082840312156135205761351f612c59565b5b5f61352d848285016134f7565b91505092915050565b5f8151905061354481612c91565b92915050565b5f6020828403121561355f5761355e612c59565b5b5f61356c84828501613536565b91505092915050565b5f6040820190506135885f830185612e76565b818103602083015261359a818461310f565b90509392505050565b5f819050919050565b5f6135c66135c16135bc846135a3565b612e9e565b612d41565b9050919050565b6135d6816135ac565b82525050565b5f6040820190506135ef5f830185612e76565b6135fc60208301846135cd565b9392505050565b7f5769746864726177616c206e6f7420616c6c6f776564000000000000000000005f82015250565b5f6136376016836133b7565b915061364282613603565b602082019050919050565b5f6020820190508181035f8301526136648161362b565b9050919050565b5f6dffffffffffffffffffffffffffff82169050919050565b61368d8161366b565b8114613697575f80fd5b50565b5f815190506136a881613684565b92915050565b5f63ffffffff82169050919050565b6136c6816136ae565b81146136d0575f80fd5b50565b5f815190506136e1816136bd565b92915050565b5f805f606084860312156136fe576136fd612c59565b5b5f61370b8682870161369a565b935050602061371c8682870161369a565b925050604061372d868287016136d3565b9150509250925092565b7f7769746864726177616c20616c726561647920656e61626c65640000000000005f82015250565b5f61376b601a836133b7565b915061377682613737565b602082019050919050565b5f6020820190508181035f8301526137988161375f565b9050919050565b7f696e73756666696369656e74206275726e656420766f74696e672063726564695f8201527f7400000000000000000000000000000000000000000000000000000000000000602082015250565b5f6137f96021836133b7565b91506138048261379f565b604082019050919050565b5f6020820190508181035f830152613826816137ed565b9050919050565b7f6d7573742077616974203230686f7572730000000000000000000000000000005f82015250565b5f6138616011836133b7565b915061386c8261382d565b602082019050919050565b5f6020820190508181035f83015261388e81613855565b9050919050565b7f4e6f20746f6b656e7320746f2070726f76696465206c697175696469747900005f82015250565b5f6138c9601e836133b7565b91506138d482613895565b602082019050919050565b5f6020820190508181035f8301526138f6816138bd565b9050919050565b5f61390782612d41565b915061391283612d41565b925082820261392081612d41565b9150828204841483151761393757613936612fb5565b5b5092915050565b5f610100820190506139525f83018b612ce6565b61395f602083018a612ce6565b61396c6040830189612e76565b6139796060830188612e76565b6139866080830187612e76565b61399360a0830186612e76565b6139a060c0830185612ce6565b6139ad60e0830184612e76565b9998505050505050505050565b5f805f606084860312156139d1576139d0612c59565b5b5f6139de86828701613015565b93505060206139ef86828701613015565b9250506040613a0086828701613015565b915050925092509256fea264697066735822122008d20350cf4b87794c964503763d3f9f58c346ae96dd36eec1a73db1dea7ef8e64736f6c63430008140033