false
false

Contract Address Details

0x3b143382d267Bd0652d67c9f43D48C73476A28f8

Token
kcc.guru/GRAIN/3301 (GRAIN#3301)
Creator
0x167d87–2ee584 at 0xa6d45b–9ff3a0
Balance
0 KCS
Tokens
Fetching tokens...
Transactions
29 Transactions
Transfers
185 Transfers
Gas Used
11,240,173
Last Balance Update
44800243
Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
Contract name:
Granary




Optimization enabled
false
Compiler version
v0.7.6+commit.7338295f




EVM Version
default




Verified at
2022-01-30T13:00:19.148117Z

Constructor Arguments

000000000000000000000000f9cf281649ca69546ff6e48359c6ce62a89c4dd0000000000000000000000000c9c64aa3a0dcd2272100a0e81226d0272ee435e7000000000000000000000000e1c110e1b1b4a1ded0caf3e42bfbdbb7b5d7ce1c0000000000000000000000005ddac4c73b15353dc4a00daeafb38631a7cbd38900000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000140000000000000000000000000426a4a4b73d4cd173c9ab78d18c0d79d1717eaa90000000000000000000000000000000000000000000000000000000000000002000000000000000000000000e1c110e1b1b4a1ded0caf3e42bfbdbb7b5d7ce1c0000000000000000000000004446fc4eb47f2f6586f9faab68b3498f86c0752100000000000000000000000000000000000000000000000000000000000000043333303100000000000000000000000000000000000000000000000000000000
              

Contract source code

/*

KK   KK   CCCCC   CCCCC       GGGGG  U    U  RRRRR     U    U
KK KKK   CC      CC          G       U    U  RR   R    U    U
KKKK     CC      CC         G  GGG   U    U  RRRRR     U    U
KK KK    CC      CC      O  G    G   U    U  RR R      U    U
KK  KKK  CCCCCC  CCCCCC      GGGGG    UUUU   RR  RRR    UUUU


FFFFF  TTTTTTT  M   M         GGGGG  U    U  RRRRR     U    U
FF       TTT   M M M M       G       U    U  RR   R    U    U
FFFFF    TTT   M  M  M      G  GGG   U    U  RRRRR     U    U
FF       TTT   M     M   O  G    G   U    U  RR R      U    U
FF       TTT   M     M       GGGGG    UUUU   RR  RRR    UUUU




					*************************
					**                     **
					**  GRANARY & WORKERS  **
					**    ftm.guru/GRAIN   **
					**  kcc.guru/kompound  **
					**                     **
					*************************


Create a farm & vault for your own projects for free with ftm.guru

            			Contact us at:
			https://discord.com/invite/QpyfMarNrV
        			https://t.me/FTM1337

*/
/*
	- KOMPOUND PROTOCOL -
    https://kcc.guru/kompound
    - GRANARY & WORKERS -
    https://ftm.guru/GRAIN

    Yield Compounding Service
    Created by Guru Network

    Community Mediums:
        https://discord.com/invite/QpyfMarNrV
        https://medium.com/@ftm1337
        https://twitter.com/ftm1337
        https://twitter.com/kucino
        https://t.me/ftm1337
        https://t.me/kccguru
    Other Products:
        KUCINO CASINO - The First and Most used Casino of KCC
        fmc.guru - FantomMarketCap : On-Chain Data Aggregator
        ELITE - ftm.guru is an indie growth-hacker for Fantom
*/
/*

		FREQUENTLY ASKED QUESTIONS


	Q.1	WHY USE THIS VAULT?
	Ans	Most of the popular vaults' owners can switch "strategy" and steal (a.k.a. hard-rug) your valuable assets.
		Granaries or Kompound Protocol cannot change its own behaviour or strategy once its deployed on-chain.
		Our code uses unchangeable constants for tokens and external contracts. All fees & incentives are capped.
			Unlike the other (you-know-who) famous vaults.


	Q.2 WHAT IS ELITENESS?
	Ans	Simply holding ELITE (ftm.guru) or KUCINO (Kucino Casino) token in your wallet ascribes you Eliteness.
		It is required to earn worker incentives from this Granary.
		Deposits incur nil fee if the user posseses adequate eliteness.
		 	ELITE has a fixed supply of 250, KUCINO is deflationary at 4 Billion and burning.


*/
//SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.7.6;
pragma abicoder v2;

//ftm.guru's Universal On-chain TVL Calculator
//Source: https://ftm.guru/rawdata/tvl
interface ITVL {
	//Using Version = 6
	function p_lpt_coin_usd(address lp) external view returns(uint256);
	//function p_lpt_usd(address,address) external view returns(uint256);
}

interface IMasterchef {
	//Reapers
	function getReward() external;
	function getCoverage() external;
	function getBoosterReward() external;

	//Staked
	function balanceOf(address) external view returns(uint256);

	//Pending
	function earned(address) external view returns(uint256);
	function coverageOf(address) external view returns(uint256);

	//Fund
	function exit() external;
	function stake(uint256) external;
	function withdraw(uint256) external;
	function emergencyWithdraw(uint256) external;
}
interface IERC20 {
	/**
	 * @dev Returns the amount of tokens in existence.
	 */

	function totalSupply() external view returns (uint256);
	/**
	 * @dev Returns the amount of tokens owned by `account`.
	 */

	function balanceOf(address account) external view returns (uint256);
	/**
	 * @dev Moves `amount` tokens from the caller's account to `recipient`.
	 *
	 * Returns a boolean value indicating whether the operation succeeded.
	 *
	 * Emits a {Transfer} event.
	 */

	function transfer(address recipient, uint256 amount) external returns (bool);
	/**
	 * @dev Returns the remaining number of tokens that `spender` will be
	 * allowed to spend on behalf of `owner` through {transferFrom}. This is
	 * zero by default.
	 *
	 * This value changes when {approve} or {transferFrom} are called.
	 */

	function allowance(address owner, address spender) external view returns (uint256);
	/**
	 * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
	 *
	 * Returns a boolean value indicating whether the operation succeeded.
	 *
	 * IMPORTANT: Beware that changing an allowance with this method brings the risk
	 * that someone may use both the old and the new allowance by unfortunate
	 * transaction ordering. One possible solution to mitigate this race
	 * condition is to first reduce the spender's allowance to 0 and set the
	 * desired value afterwards:
	 * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
	 *
	 * Emits an {Approval} event.
	 */

	function approve(address spender, uint256 amount) external returns (bool);
	/**
	 * @dev Moves `amount` tokens from `sender` to `recipient` using the
	 * allowance mechanism. `amount` is then deducted from the caller's
	 * allowance.
	 *
	 * Returns a boolean value indicating whether the operation succeeded.
	 *
	 * Emits a {Transfer} event.
	 */

	function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
	/**
	 * @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);
	//Uniswap-style Pair (LPT)

	function getReserves() external view returns (uint112, uint112, uint32);
}
interface IRouter {

	function swapExactTokensForTokensSupportingFeeOnTransferTokens(
		uint amountIn,
		uint amountOutMin,
		address[] calldata path,
		address to,
		uint deadline
	) external;

	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);
}
library SafeMath {
	/**
	 * @dev Returns the addition of two unsigned integers, reverting on
	 * overflow.
	 *
	 * Counterpart to Solidity's `+` operator.
	 *
	 * Requirements:
	 * - Addition cannot overflow.
	 */

	function add(uint256 a, uint256 b) internal pure returns (uint256) {
		uint256 c = a + b;
		require(c >= a, "SafeMath: addition overflow");
		return c;
	}
	/**
	 * @dev Returns the subtraction of two unsigned integers, reverting on
	 * overflow (when the result is negative).
	 *
	 * Counterpart to Solidity's `-` operator.
	 *
	 * Requirements:
	 * - Subtraction cannot overflow.
	 */

	function sub(uint256 a, uint256 b) internal pure returns (uint256) {
		return sub(a, b, "SafeMath: subtraction overflow");
	}
	/**
	 * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
	 * overflow (when the result is negative).
	 *
	 * Counterpart to Solidity's `-` operator.
	 *
	 * Requirements:
	 * - Subtraction cannot overflow.
	 */

	function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
		require(b <= a, errorMessage);
		uint256 c = a - b;
		return c;
	}
	/**
	 * @dev Returns the multiplication of two unsigned integers, reverting on
	 * overflow.
	 *
	 * Counterpart to Solidity's `*` operator.
	 *
	 * Requirements:
	 * - Multiplication cannot overflow.
	 */

	function mul(uint256 a, uint256 b) internal pure returns (uint256) {
		// Gas optimization: this is cheaper than requiring 'a' not being zero, but the
		// benefit is lost if 'b' is also tested.
		// See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
		if (a == 0) {
			return 0;
		}
		uint256 c = a * b;
		require(c / a == b, "SafeMath: multiplication overflow");
		return c;
	}
	/**
	 * @dev Returns the integer division of two unsigned integers. Reverts on
	 * division by zero. The result is rounded towards zero.
	 *
	 * Counterpart to Solidity's `/` operator. Note: this function uses a
	 * `revert` opcode (which leaves remaining gas untouched) while Solidity
	 * uses an invalid opcode to revert (consuming all remaining gas).
	 *
	 * Requirements:
	 * - The divisor cannot be zero.
	 */

	function div(uint256 a, uint256 b) internal pure returns (uint256) {
		return div(a, b, "SafeMath: division by zero");
	}
	/**
	 * @dev Returns the integer division of two unsigned integers. Reverts with custom message on
	 * division by zero. The result is rounded towards zero.
	 *
	 * Counterpart to Solidity's `/` operator. Note: this function uses a
	 * `revert` opcode (which leaves remaining gas untouched) while Solidity
	 * uses an invalid opcode to revert (consuming all remaining gas).
	 *
	 * Requirements:
	 * - The divisor cannot be zero.
	 */

	function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
		// Solidity only automatically asserts when dividing by 0
		require(b > 0, errorMessage);
		uint256 c = a / b;
		// assert(a == b * c + a % b); // There is no case in which this doesn't hold
		return c;
	}
	/**
	 * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
	 * Reverts when dividing by zero.
	 *
	 * Counterpart to Solidity's `%` operator. This function uses a `revert`
	 * opcode (which leaves remaining gas untouched) while Solidity uses an
	 * invalid opcode to revert (consuming all remaining gas).
	 *
	 * Requirements:
	 * - The divisor cannot be zero.
	 */

	function mod(uint256 a, uint256 b) internal pure returns (uint256) {
		return mod(a, b, "SafeMath: modulo by zero");
	}
	/**
	 * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
	 * Reverts with custom message when dividing by zero.
	 *
	 * Counterpart to Solidity's `%` operator. This function uses a `revert`
	 * opcode (which leaves remaining gas untouched) while Solidity uses an
	 * invalid opcode to revert (consuming all remaining gas).
	 *
	 * Requirements:
	 * - The divisor cannot be zero.
	 */

	function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
		require(b != 0, errorMessage);
		return a % b;
	}
}




contract Granary
{
	using SafeMath for uint256;

	constructor (address _w, address _m, address _e, address _R, address[] memory _r, string memory _id, address _v)
	{
		want=IERC20(_w);
		mc=IMasterchef(_m);
		earn=IERC20(_e);
		router = _R;
		route = _r;
		id=_id;//GRAIN#ID
		utvl=_v;
		//Approvals
		//mc to take what it may want
		IERC20(address(want)).approve(address(mc),uint256(-1));
		//router to sell what we earn
		IERC20(address(earn)).approve(address(router),uint256(-1));
        //router to add route[route.length-1]
		IERC20(_r[_r.length-1]).approve(address(router),uint256(-1));
		dao = 0x167D87A906dA361A10061fe42bbe89451c2EE584;
		treasury = dao;
	}
	modifier DAO {require(msg.sender==dao,"Only E.L.I.T.E. D.A.O. Treasury can rescue treasures!");_;}
	struct Elites {
		address ELITE;
		uint256 ELITES;
	}
	Elites[] public Eliteness;

	function pushElite(address elite, uint256 elites) public DAO {
        Eliteness.push(Elites({ELITE:elite,ELITES:elites}));
    }

	function pullElite(uint256 n) public DAO {
        Eliteness[n]=Eliteness[Eliteness.length-1];Eliteness.pop();
    }
	//@xref takeFee=eliteness(msg.sender)?false:true;

	function eliteness(address u) public view returns(bool)
	{
		if(Eliteness.length==0){return(true);}//When nobody is an Elite, everyone is an Elite.
		for(uint i;i<Eliteness.length;i++){
			if(IERC20(Eliteness[i].ELITE).balanceOf(u)>=Eliteness[i].ELITES)
			{
				return(true);
			}
		}
		return(false);
	}

	function config(//address _w,
		uint256 _mw, uint256 _wi, uint256 _pf, address _t, uint256 _df) public DAO
	{
		allnums[4] = _mw;
		treasury = _t;
		//Max 10%, 1e6 = 100%
		require(_wi<1e5,"!wi: high");allnums[3] = _wi;
		require(_pf<1e5,"!pf: high");allnums[2] = _pf;
		require(_df<1e5,"!df: high");allnums[1] = _df;
	}
	uint8 RG = 0;
	modifier rg {
		require(RG == 0,"!RG");
		RG = 1;
		_;
		RG = 0;
	}

	function isContract(address account) internal view returns (bool)
	{
		bytes32 codehash;
		bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
		assembly { codehash := extcodehash(account) }
		return (codehash != accountHash && codehash != 0x0);
	}
	//Using getter functions to circumvent "Stack too deep!" errors
	string public id;
	/*
	string public name;
	string public symbol;
	uint8  public decimals = 18;
	*/
	function name() public view returns(string memory){return(string(abi.encodePacked("kcc.guru/GRAIN/", id)));}
	function symbol() public view returns(string memory){return(string(abi.encodePacked("GRAIN#", id)));}
	function decimals() public pure returns(uint256){return(18);}

	uint256 public totalSupply;
	IERC20 public want;
	IERC20 public earn;
	address public router;
	address[] public route;
	IMasterchef public mc;
	bool public emergency = false;
	address public dao;
	address public treasury;
	address public utvl;
	/*
	uint8 public pid;
	uint256 public df = 1e3;//deposit fee = 0.1%, 1e6=100%
	uint256 public pf = 1e4;//performance fee to treasury, paid from profits = 1%, 1e6=100%
	uint256 public wi = 1e4;//worker incentive, paid from profits = 1%, 1e6=100%
	uint256 public mw;//Minimum earnings to reinvest
	uint64[2] ct;//Timestamp of first & latest Kompound
	*/
	//Using array to avoid "Stack too deep!" errors
	uint256[7] public allnums = [
		0,	//pid		0       constant
		1e3,//df		1       config, <= 10% (1e5), default 0.1%
		1e4,//pf		2       config, <= 10% (1e5), default 1%
		1e4,//wi		3       config, <= 10% (1e5), default 1%
		1e4,//mw		4       config, default 1e4 (near zero)
		0,	//ct[0]		5       nonce, then constant
		0	//ct[1]		6       up only
	];
	event  Approval(address indexed src, address indexed guy, uint wad);
	event  Transfer(address indexed src, address indexed dst, uint wad);
	mapping (address => uint) public  balanceOf;
	mapping (address => mapping (address => uint)) public  allowance;

	function approve(address guy) public returns (bool) {
		return approve(guy, uint(-1));
	}

	function approve(address guy, uint wad) public returns (bool) {
		allowance[msg.sender][guy] = wad;
		emit Approval(msg.sender, guy, wad);
		return true;
	}

	function transfer(address dst, uint wad) public returns (bool) {
		return transferFrom(msg.sender, dst, wad);
	}

	function transferFrom(address src, address dst, uint wad) public returns (bool)
	{
		require(balanceOf[src] >= wad,"Insufficient Balance");
		if (src != msg.sender && allowance[src][msg.sender] != uint(-1)) {
			require(allowance[src][msg.sender] >= wad);
			allowance[src][msg.sender] -= wad;
		}
		balanceOf[src] -= wad;
		balanceOf[dst] += wad;
		emit Transfer(src, dst, wad);
		return true;
	}
    event Staked(address indexed user, uint256 amount);
    event Withdrawn(address indexed user, uint256 amount);
    event Compounded(address indexed user, uint256 amount);

	function deposit(uint256 _amt) public rg
	{
		require(!emergency,"Its an emergency. Please don't deposit.");
		//Some fancy math to take care of Fee-on-Transfer tokens
		uint256 vbb = want.balanceOf(address(this));
		uint256 mcbb = mc.balanceOf(address(this));
		require(want.transferFrom(msg.sender,address(this),_amt), "Unable to onboard");
		uint256 vba = want.balanceOf(address(this));
		uint256 D = vba.sub(vbb,"Dirty deposit");
		mc.stake(D);
		//Some more fancy math to take care of Deposit Fee
		uint256 mcba = mc.balanceOf(address(this));
		uint256 M = mcba.sub(mcbb,"Dirty stake");
		//require(M>mindep,"Deposit Too Low");
		uint256 _mint = 0;
		(totalSupply > 0)
			// k: SharePerDeposit should be constant before & after
			// Mint = SharesPerDeposit * IncreaseInDeposit
			// bal += (totalSupply / oldDeposits) * thisDeposit
			?	_mint = ( M.mul(totalSupply) ).div(mcbb)
			:	_mint = M;
		totalSupply += _mint;
		uint256 _fee;
		//allnums[1]===df, deposit fee
		if(allnums[1]>0){_fee = eliteness(msg.sender)? 0 : (_mint.mul(allnums[1])).div(1e6);}//gas savings
		if(_fee>0)//gas savings
		{
			balanceOf[treasury] += _fee;
			emit Transfer(address(0), treasury, _fee);
		}
		balanceOf[msg.sender] += _mint.sub(_fee);
		emit Transfer(address(0), msg.sender, _mint.sub(_fee));
		//hardWork()
		mc.getReward();	//Not salvage(), to help boost ILP as much as we can.
		//allnums[4]===mw, min work : smallest harvest
		if(earn.balanceOf(address(this)) > allnums[4]) {work(address(this));}
	}

	function withdraw(uint256 _amt) public rg
	{
		require(!emergency,"Its an emergency. Use emergencyWithdraw() please.");
		require(balanceOf[msg.sender] >= _amt,"Insufficient Balance");
		//Burn _amt of Vault Tokens
		balanceOf[msg.sender] -= _amt;
		uint256 ts = totalSupply;
		totalSupply -= _amt;
		emit Transfer(msg.sender, address(0), _amt);
		uint256 vbb = want.balanceOf(address(this));
		uint256 mcbb = mc.balanceOf(address(this));
		// W  = DepositsPerShare * SharesBurnt
		uint256 W = ( _amt.mul(mcbb) ).div(ts);
		mc.withdraw(W);
		uint256 vba = want.balanceOf(address(this));
		uint256 D = vba.sub(vbb,"Dirty withdrawal");
	   	require(want.transfer(msg.sender,D), "Unable to deboard");
	   	//hardWork()
	   	salvage();	//Since ILP resets to 0 on partial withdrawals, best to claim it.
		if(earn.balanceOf(address(this)) > allnums[4]) {work(address(this));}
	}

	function doHardWork() public rg
	{
		require(eliteness(msg.sender),"Elites only!");
		mc.getReward();	//Not salvage(), to help boost ILP as much as we can.
		require(earn.balanceOf(address(this)) > allnums[4], "Not much work to do!");
		work(msg.sender);
	}

	function salvage() public
	{
		//harvest()
		//we salvage all possible rewards during withdrawals, since there's no point in saving further
		mc.getReward();
		if(mc.coverageOf(address(this))>0){mc.getCoverage();}
	}

	function work(address ben) internal
	{
		require(!emergency,"Its an emergency. Use emergencyWithdraw() please.");
		//has inputs from salvage() if this work is done via doHardWork()
		IRouter R = IRouter(router);
		IERC20 A = IERC20(route[route.length-1]);
		uint256 vbb = (earn.balanceOf(address(this))).div(2);
		R.swapExactTokensForTokensSupportingFeeOnTransferTokens(vbb,1,route,address(this),block.timestamp);
		R.addLiquidity(
			address(A),
			address(earn),
			A.balanceOf(address(this)),
			earn.balanceOf(address(this)),
			1,
			1,
			address(this),
			block.timestamp
		);
		uint256 D = want.balanceOf(address(this));
		uint256 mcbb = mc.balanceOf(address(this));
		mc.stake(D);
		uint256 mcba = mc.balanceOf(address(this));
		uint256 M = mcba.sub(mcbb,"Dirty stake");
		//Performance Fee Mint, conserves TVL
		uint256 _mint = 0;
		//allnums[5] & allnums[6] are First & Latest Compound's timestamps. Used in info() for APY of AUM.
		if(allnums[5]==0){allnums[5]=uint64(block.timestamp);}//only on the first run
		allnums[6]=uint64(block.timestamp);
		(totalSupply > 0)
			// k: SharePerDeposit should be constant before & after
			// Mint = SharesPerDeposit * IncreaseInDeposit
			// bal += (totalSupply / oldDeposits) * thisDeposit
			?	_mint = ( M.mul(totalSupply) ).div(mcbb)
			:	_mint = M;
		//allnums[2] === pf, Performance Fee
		balanceOf[treasury] += (_mint.mul(allnums[2])).div(1e6);
		//Worker Incentive Mint, conserves TVL
		address worker = ben == address(this) ? treasury : ben;
		//allnums[3] === wi, Worker Incentive
		balanceOf[worker] += (_mint.mul(allnums[3])).div(1e6);
		totalSupply += ((_mint.mul(allnums[2])).div(1e6)).add( (_mint.mul(allnums[3])).div(1e6) );
		emit Transfer(address(0), treasury, (_mint.mul(allnums[2])).div(1e6));
		emit Transfer(address(0), worker, (_mint.mul(allnums[3])).div(1e6));
	}




	function declareEmergency() public DAO
	{
		require(!emergency,"Emergency already declared.");
		mc.emergencyWithdraw(mc.balanceOf(address(this)));
		emergency=true;
	}

	function revokeEmergency() public DAO
	{
		require(emergency,"Emergency not declared.");
		uint256 D = want.balanceOf(address(this));
		mc.stake(D);
		emergency=false;
	}

	function emergencyWithdraw(uint256 _amt) public rg
	{
		require(emergency,"Its not an emergency. Use withdraw() instead.");
		require(balanceOf[msg.sender] >= _amt,"Insufficient Balance");
		uint256 ts = totalSupply;
		//Burn _amt of Vault Tokens
		balanceOf[msg.sender] -= _amt;
		totalSupply -= _amt;
		emit Transfer(msg.sender, address(0), _amt);
		uint256 vbb = want.balanceOf(address(this));
		uint256 W = ( _amt.mul(vbb) ).div(ts);
	   	require(want.transfer(msg.sender,W), "Unable to deboard");
	}




	function rescue(address tokenAddress, uint256 tokens) public DAO returns (bool success)
	{
		//Generally, there are not supposed to be any tokens in this contract itself:
		//Upon Deposits, the assets go from User to the MasterChef of Strategy,
		//Upon Withdrawals, the assets go from MasterChef of Strategy to the User, and
		//Upon HardWork, the harvest is reconverted to want and sent to MasterChef of Strategy.
		//Never allow draining main "want" token from the Granary:
		//Main token can only be withdrawn using the EmergencyWithdraw
		require(tokenAddress != address(want), "Funds are Safu in emergency!");
		if(tokenAddress==address(0)) {(success, ) = dao.call{value:tokens}("");return success;}
		else if(tokenAddress!=address(0)) {return IERC20(tokenAddress).transfer(dao, tokens);}
		else return false;
	}
	function rescueBooster() public DAO
	{
		//In case of Dual farming or promotional rewards are endowed.
		mc.getBoosterReward();
	}


	//Read-Only Functions
	//Useful for performance analysis
	function info() public view returns (uint256, uint256, uint256, uint256, uint256, uint256)
	{
		uint256 aum = mc.balanceOf(address(this)) + IERC20(want).balanceOf(address(this));
		uint256 roi = aum*1e18/totalSupply;//ROI: 1e18 === 1x
		uint256 apy = ((roi-1e18)*(365*86400)*100)/(allnums[6]-allnums[5]);//APY: 1e18 === 1%
		return(
			aum,
			roi,
			apy,
			mc.balanceOf(address(this)),
			tvl(),
			mc.earned(address(this)) + mc.coverageOf(address(this))
		);
	}

	//TVL in USD, 1e18===$1.
	//Source code Derived from ftm.guru's Universal On-chain TVL Calculator: https://ftm.guru/rawdata/tvl
	function tvl() public view returns(uint256)
	{
		ITVL tc = ITVL(utvl);
		uint256 aum = mc.balanceOf(address(this)) + IERC20(want).balanceOf(address(this));
		return ((tc.p_lpt_coin_usd(address(want))).mul(aum)).div(1e18);
		//return ((tc.p_lpt_usd(route[route.length-1],address(want))).mul(aum)).div(1e18);
	}

}
        

Contract ABI

[{"type":"constructor","stateMutability":"nonpayable","inputs":[{"type":"address","name":"_w","internalType":"address"},{"type":"address","name":"_m","internalType":"address"},{"type":"address","name":"_e","internalType":"address"},{"type":"address","name":"_R","internalType":"address"},{"type":"address[]","name":"_r","internalType":"address[]"},{"type":"string","name":"_id","internalType":"string"},{"type":"address","name":"_v","internalType":"address"}]},{"type":"event","name":"Approval","inputs":[{"type":"address","name":"src","internalType":"address","indexed":true},{"type":"address","name":"guy","internalType":"address","indexed":true},{"type":"uint256","name":"wad","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"Compounded","inputs":[{"type":"address","name":"user","internalType":"address","indexed":true},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"Staked","inputs":[{"type":"address","name":"user","internalType":"address","indexed":true},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"Transfer","inputs":[{"type":"address","name":"src","internalType":"address","indexed":true},{"type":"address","name":"dst","internalType":"address","indexed":true},{"type":"uint256","name":"wad","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"Withdrawn","inputs":[{"type":"address","name":"user","internalType":"address","indexed":true},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"ELITE","internalType":"address"},{"type":"uint256","name":"ELITES","internalType":"uint256"}],"name":"Eliteness","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"allnums","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"allowance","inputs":[{"type":"address","name":"","internalType":"address"},{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"approve","inputs":[{"type":"address","name":"guy","internalType":"address"},{"type":"uint256","name":"wad","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"approve","inputs":[{"type":"address","name":"guy","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"balanceOf","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"config","inputs":[{"type":"uint256","name":"_mw","internalType":"uint256"},{"type":"uint256","name":"_wi","internalType":"uint256"},{"type":"uint256","name":"_pf","internalType":"uint256"},{"type":"address","name":"_t","internalType":"address"},{"type":"uint256","name":"_df","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"dao","inputs":[]},{"type":"function","stateMutability":"pure","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"decimals","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"declareEmergency","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"deposit","inputs":[{"type":"uint256","name":"_amt","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"doHardWork","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IERC20"}],"name":"earn","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"eliteness","inputs":[{"type":"address","name":"u","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"emergency","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"emergencyWithdraw","inputs":[{"type":"uint256","name":"_amt","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"id","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"}],"name":"info","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IMasterchef"}],"name":"mc","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"name","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"pullElite","inputs":[{"type":"uint256","name":"n","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"pushElite","inputs":[{"type":"address","name":"elite","internalType":"address"},{"type":"uint256","name":"elites","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"success","internalType":"bool"}],"name":"rescue","inputs":[{"type":"address","name":"tokenAddress","internalType":"address"},{"type":"uint256","name":"tokens","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"rescueBooster","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"revokeEmergency","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"route","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"router","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"salvage","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"symbol","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalSupply","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"transfer","inputs":[{"type":"address","name":"dst","internalType":"address"},{"type":"uint256","name":"wad","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"transferFrom","inputs":[{"type":"address","name":"src","internalType":"address"},{"type":"address","name":"dst","internalType":"address"},{"type":"uint256","name":"wad","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"treasury","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"tvl","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"utvl","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IERC20"}],"name":"want","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"withdraw","inputs":[{"type":"uint256","name":"_amt","internalType":"uint256"}]}]
              

Contract Creation Code

0x60806040526000600160006101000a81548160ff021916908360ff1602179055506000600860146101000a81548160ff0219169083151502179055506040518060e00160405280600061ffff1681526020016103e861ffff16815260200161271061ffff16815260200161271061ffff16815260200161271061ffff168152602001600061ffff168152602001600061ffff16815250600c906007620000a7929190620005f5565b50348015620000b557600080fd5b50604051620065e8380380620065e88339818101604052810190620000db9190620008c7565b86600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555085600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555083600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508260079080519060200190620001f792919062000640565b50816002908051906020019062000210929190620006cf565b5080600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b8152600401620002f3929190620009f4565b602060405180830381600087803b1580156200030e57600080fd5b505af115801562000323573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003499190620009a6565b50600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b8152600401620003eb929190620009f4565b602060405180830381600087803b1580156200040657600080fd5b505af11580156200041b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620004419190620009a6565b50826001845103815181106200045357fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b8152600401620004d9929190620009f4565b602060405180830381600087803b158015620004f457600080fd5b505af115801562000509573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200052f9190620009a6565b5073167d87a906da361a10061fe42bbe89451c2ee584600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050505050505062000b6d565b82600781019282156200062d579160200282015b828111156200062c578251829061ffff1690559160200191906001019062000609565b5b5090506200063c919062000766565b5090565b828054828255906000526020600020908101928215620006bc579160200282015b82811115620006bb5782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509160200191906001019062000661565b5b509050620006cb919062000766565b5090565b828054600181600116156101000203166002900490600052602060002090601f01602090048101928262000707576000855562000753565b82601f106200072257805160ff191683800117855562000753565b8280016001018555821562000753579182015b828111156200075257825182559160200191906001019062000735565b5b50905062000762919062000766565b5090565b5b808211156200078157600081600090555060010162000767565b5090565b60006200079c620007968462000a55565b62000a21565b90508083825260208201905082856020860282011115620007bc57600080fd5b60005b85811015620007f05781620007d588826200083f565b845260208401935060208301925050600181019050620007bf565b5050509392505050565b6000620008116200080b8462000a84565b62000a21565b9050828152602081018484840111156200082a57600080fd5b6200083784828562000b01565b509392505050565b600081519050620008508162000b39565b92915050565b600082601f8301126200086857600080fd5b81516200087a84826020860162000785565b91505092915050565b600081519050620008948162000b53565b92915050565b600082601f830112620008ac57600080fd5b8151620008be848260208601620007fa565b91505092915050565b600080600080600080600060e0888a031215620008e357600080fd5b6000620008f38a828b016200083f565b9750506020620009068a828b016200083f565b9650506040620009198a828b016200083f565b95505060606200092c8a828b016200083f565b945050608088015167ffffffffffffffff8111156200094a57600080fd5b620009588a828b0162000856565b93505060a088015167ffffffffffffffff8111156200097657600080fd5b620009848a828b016200089a565b92505060c0620009978a828b016200083f565b91505092959891949750929550565b600060208284031215620009b957600080fd5b6000620009c98482850162000883565b91505092915050565b620009dd8162000ab7565b82525050565b620009ee8162000af7565b82525050565b600060408201905062000a0b6000830185620009d2565b62000a1a6020830184620009e3565b9392505050565b6000604051905081810181811067ffffffffffffffff8211171562000a4b5762000a4a62000b37565b5b8060405250919050565b600067ffffffffffffffff82111562000a735762000a7262000b37565b5b602082029050602081019050919050565b600067ffffffffffffffff82111562000aa25762000aa162000b37565b5b601f19601f8301169050602081019050919050565b600062000ac48262000ad7565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b8381101562000b2157808201518184015260208101905062000b04565b8381111562000b31576000848401525b50505050565bfe5b62000b448162000ab7565b811462000b5057600080fd5b50565b62000b5e8162000acb565b811462000b6a57600080fd5b50565b615a6b8062000b7d6000396000f3fe608060405234801561001057600080fd5b50600436106102275760003560e01c806361d027b311610130578063b6b55f25116100b8578063daea85c51161007c578063daea85c514610626578063dd62ed3e14610656578063e5328e0614610686578063ef1b8140146106a4578063f887ea40146106c057610227565b8063b6b55f2514610580578063b980c78f1461059c578063caa6fea4146105cc578063cb7956b0146105ea578063d389800f1461060857610227565b80637a4e4ecf116100ff5780637a4e4ecf146104b45780638ed5f373146104e457806395d89b4114610514578063a9059cbb14610532578063af640d0f1461056257610227565b806361d027b314610440578063685c8ca51461045e57806369a8bde71461047a57806370a082311461048457610227565b806327d9cf44116101b3578063370158ea11610182578063370158ea146103bd5780634162169f146103e05780634b292cae146103fe5780634fa5d8541461041a5780635312ea8e1461042457610227565b806327d9cf441461035b5780632e1a7d4d14610379578063313ce5671461039557806331e244e5146103b357610227565b80631e534906116101fa5780631e534906146102c95780631f1fcd51146102d357806323b872dd146102f157806323e1d0e81461032157806324aa95ec1461035157610227565b806306fdde031461022c578063095ea7b31461024a57806318160ddd1461027a5780631b5f9c4214610298575b600080fd5b6102346106de565b60405161024191906154bd565b60405180910390f35b610264600480360381019061025f91906149e0565b610706565b604051610271919061546c565b60405180910390f35b6102826107f8565b60405161028f919061571f565b60405180910390f35b6102b260048036038101906102ad9190614a45565b6107fe565b6040516102c0929190615443565b60405180910390f35b6102d1610852565b005b6102db610a0c565b6040516102e89190615487565b60405180910390f35b61030b60048036038101906103069190614991565b610a32565b604051610318919061546c565b60405180910390f35b61033b60048036038101906103369190614a45565b610db1565b604051610348919061571f565b60405180910390f35b610359610dcc565b005b610363611005565b604051610370919061534a565b60405180910390f35b610393600480360381019061038e9190614a45565b61102b565b005b61039d61172e565b6040516103aa919061571f565b60405180910390f35b6103bb611737565b005b6103c561196b565b6040516103d796959493929190615794565b60405180910390f35b6103e8611d4d565b6040516103f5919061534a565b60405180910390f35b61041860048036038101906104139190614ae6565b611d73565b005b610422611f6a565b005b61043e60048036038101906104399190614a45565b6121c6565b005b6104486125b9565b604051610455919061534a565b60405180910390f35b610478600480360381019061047391906149e0565b6125df565b005b61048261271c565b005b61049e6004803603810190610499919061492c565b612830565b6040516104ab919061571f565b60405180910390f35b6104ce60048036038101906104c991906149e0565b612848565b6040516104db919061546c565b60405180910390f35b6104fe60048036038101906104f9919061492c565b612b28565b60405161050b919061546c565b60405180910390f35b61051c612c5d565b60405161052991906154bd565b60405180910390f35b61054c600480360381019061054791906149e0565b612c85565b604051610559919061546c565b60405180910390f35b61056a612c9a565b60405161057791906154bd565b60405180910390f35b61059a60048036038101906105959190614a45565b612d38565b005b6105b660048036038101906105b19190614a45565b6136d1565b6040516105c3919061534a565b60405180910390f35b6105d4613710565b6040516105e1919061546c565b60405180910390f35b6105f2613723565b6040516105ff91906154a2565b60405180910390f35b610610613749565b60405161061d9190615487565b60405180910390f35b610640600480360381019061063b919061492c565b61376f565b60405161064d919061546c565b60405180910390f35b610670600480360381019061066b9190614955565b6137a2565b60405161067d919061571f565b60405180910390f35b61068e6137c7565b60405161069b919061571f565b60405180910390f35b6106be60048036038101906106b99190614a45565b613a28565b005b6106c8613bc0565b6040516106d5919061534a565b60405180910390f35b606060026040516020016106f291906152f1565b604051602081830303815290604052905090565b600081601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516107e6919061571f565b60405180910390a36001905092915050565b60035481565b6000818154811061080e57600080fd5b90600052602060002090600202016000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154905082565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633d18b9126040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156108bc57600080fd5b505af11580156108d0573d6000803e3d6000fd5b505050506000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166312045987306040518263ffffffff1660e01b8152600401610931919061534a565b60206040518083038186803b15801561094957600080fd5b505afa15801561095d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109819190614a6e565b1115610a0a57600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636de4ab876040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156109f157600080fd5b505af1158015610a05573d6000803e3d6000fd5b505050505b565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600081601360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015610ab6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aad9061567f565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614158015610b8e57507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff601460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414155b15610ca75781601460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015610c1c57600080fd5b81601460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055505b81601360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254039250508190555081601360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610d9e919061571f565b60405180910390a3600190509392505050565b600c8160078110610dc157600080fd5b016000915090505481565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610e5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e539061569f565b60405180910390fd5b600860149054906101000a900460ff16610eab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea29061563f565b60405180910390fd5b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610f08919061534a565b60206040518083038186803b158015610f2057600080fd5b505afa158015610f34573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f589190614a6e565b9050600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a694fc3a826040518263ffffffff1660e01b8152600401610fb5919061571f565b600060405180830381600087803b158015610fcf57600080fd5b505af1158015610fe3573d6000803e3d6000fd5b505050506000600860146101000a81548160ff02191690831515021790555050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600160009054906101000a900460ff1660ff1614611080576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611077906154ff565b60405180910390fd5b60018060006101000a81548160ff021916908360ff160217905550600860149054906101000a900460ff16156110eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e2906155df565b60405180910390fd5b80601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101561116d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111649061567f565b60405180910390fd5b80601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506000600354905081600360008282540392505081905550600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161122f919061571f565b60405180910390a36000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611294919061534a565b60206040518083038186803b1580156112ac57600080fd5b505afa1580156112c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112e49190614a6e565b90506000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611343919061534a565b60206040518083038186803b15801561135b57600080fd5b505afa15801561136f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113939190614a6e565b905060006113bc846113ae8488613be690919063ffffffff16565b613c5690919063ffffffff16565b9050600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d826040518263ffffffff1660e01b8152600401611419919061571f565b600060405180830381600087803b15801561143357600080fd5b505af1158015611447573d6000803e3d6000fd5b505050506000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016114a8919061534a565b60206040518083038186803b1580156114c057600080fd5b505afa1580156114d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114f89190614a6e565b90506000611546856040518060400160405280601081526020017f4469727479207769746864726177616c0000000000000000000000000000000081525084613ca09092919063ffffffff16565b9050600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b81526004016115a592919061539c565b602060405180830381600087803b1580156115bf57600080fd5b505af11580156115d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115f79190614a1c565b611636576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162d906156df565b60405180910390fd5b61163e610852565b600c60046007811061164c57fe5b0154600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016116a9919061534a565b60206040518083038186803b1580156116c157600080fd5b505afa1580156116d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116f99190614a6e565b11156117095761170830613cfb565b5b5050505050506000600160006101000a81548160ff021916908360ff16021790555050565b60006012905090565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146117c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117be9061569f565b60405180910390fd5b600860149054906101000a900460ff1615611817576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180e9061557f565b60405180910390fd5b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635312ea8e600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016118b0919061534a565b60206040518083038186803b1580156118c857600080fd5b505afa1580156118dc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119009190614a6e565b6040518263ffffffff1660e01b815260040161191c919061571f565b600060405180830381600087803b15801561193657600080fd5b505af115801561194a573d6000803e3d6000fd5b505050506001600860146101000a81548160ff021916908315150217905550565b6000806000806000806000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016119d1919061534a565b60206040518083038186803b1580156119e957600080fd5b505afa1580156119fd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a219190614a6e565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611a7c919061534a565b60206040518083038186803b158015611a9457600080fd5b505afa158015611aa8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611acc9190614a6e565b0190506000600354670de0b6b3a7640000830281611ae657fe5b0490506000600c600560078110611af957fe5b0154600c600660078110611b0957fe5b01540360646301e13380670de0b6b3a76400008503020281611b2757fe5b049050828282600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611b88919061534a565b60206040518083038186803b158015611ba057600080fd5b505afa158015611bb4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bd89190614a6e565b611be06137c7565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166312045987306040518263ffffffff1660e01b8152600401611c3b919061534a565b60206040518083038186803b158015611c5357600080fd5b505afa158015611c67573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c8b9190614a6e565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16628cc262306040518263ffffffff1660e01b8152600401611ce5919061534a565b60206040518083038186803b158015611cfd57600080fd5b505afa158015611d11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d359190614a6e565b01985098509850985098509850505050909192939495565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611e03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dfa9061569f565b60405180910390fd5b84600c600460078110611e1257fe5b018190555081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620186a08410611e9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e949061559f565b60405180910390fd5b83600c600360078110611eac57fe5b0181905550620186a08310611ef6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eed9061561f565b60405180910390fd5b82600c600260078110611f0557fe5b0181905550620186a08110611f4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f46906155bf565b60405180910390fd5b80600c600160078110611f5e57fe5b01819055505050505050565b6000600160009054906101000a900460ff1660ff1614611fbf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fb6906154ff565b60405180910390fd5b60018060006101000a81548160ff021916908360ff160217905550611fe333612b28565b612022576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612019906156ff565b60405180910390fd5b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633d18b9126040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561208c57600080fd5b505af11580156120a0573d6000803e3d6000fd5b50505050600c6004600781106120b257fe5b0154600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161210f919061534a565b60206040518083038186803b15801561212757600080fd5b505afa15801561213b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061215f9190614a6e565b1161219f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612196906154df565b60405180910390fd5b6121a833613cfb565b6000600160006101000a81548160ff021916908360ff160217905550565b6000600160009054906101000a900460ff1660ff161461221b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612212906154ff565b60405180910390fd5b60018060006101000a81548160ff021916908360ff160217905550600860149054906101000a900460ff16612285576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161227c9061565f565b60405180910390fd5b80601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015612307576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122fe9061567f565b60405180910390fd5b6000600354905081601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254039250508190555081600360008282540392505081905550600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516123c9919061571f565b60405180910390a36000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161242e919061534a565b60206040518083038186803b15801561244657600080fd5b505afa15801561245a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061247e9190614a6e565b905060006124a7836124998487613be690919063ffffffff16565b613c5690919063ffffffff16565b9050600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b815260040161250692919061539c565b602060405180830381600087803b15801561252057600080fd5b505af1158015612534573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125589190614a1c565b612597576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161258e906156df565b60405180910390fd5b5050506000600160006101000a81548160ff021916908360ff16021790555050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461266f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126669061569f565b60405180910390fd5b600060405180604001604052808473ffffffffffffffffffffffffffffffffffffffff16815260200183815250908060018154018082558091505060019003906000526020600020906002020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015550505050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146127ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127a39061569f565b60405180910390fd5b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632459a6996040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561281657600080fd5b505af115801561282a573d6000803e3d6000fd5b50505050565b60136020528060005260406000206000915090505481565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146128da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128d19061569f565b60405180910390fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561296b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612962906156bf565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612a3357600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16826040516129e690615335565b60006040518083038185875af1925050503d8060008114612a23576040519150601f19603f3d011682016040523d82523d6000602084013e612a28565b606091505b505080915050612b22565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612b1d578273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518363ffffffff1660e01b8152600401612ac4929190615443565b602060405180830381600087803b158015612ade57600080fd5b505af1158015612af2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b169190614a1c565b9050612b22565b600090505b92915050565b6000806000805490501415612b405760019050612c58565b60005b600080549050811015612c525760008181548110612b5d57fe5b90600052602060002090600202016001015460008281548110612b7c57fe5b906000526020600020906002020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231856040518263ffffffff1660e01b8152600401612be6919061534a565b60206040518083038186803b158015612bfe57600080fd5b505afa158015612c12573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c369190614a6e565b10612c45576001915050612c58565b8080600101915050612b43565b50600090505b919050565b60606002604051602001612c719190615313565b604051602081830303815290604052905090565b6000612c92338484610a32565b905092915050565b60028054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612d305780601f10612d0557610100808354040283529160200191612d30565b820191906000526020600020905b815481529060010190602001808311612d1357829003601f168201915b505050505081565b6000600160009054906101000a900460ff1660ff1614612d8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d84906154ff565b60405180910390fd5b60018060006101000a81548160ff021916908360ff160217905550600860149054906101000a900460ff1615612df8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612def9061553f565b60405180910390fd5b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401612e55919061534a565b60206040518083038186803b158015612e6d57600080fd5b505afa158015612e81573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ea59190614a6e565b90506000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401612f04919061534a565b60206040518083038186803b158015612f1c57600080fd5b505afa158015612f30573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f549190614a6e565b9050600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330866040518463ffffffff1660e01b8152600401612fb593929190615365565b602060405180830381600087803b158015612fcf57600080fd5b505af1158015612fe3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130079190614a1c565b613046576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161303d9061555f565b60405180910390fd5b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016130a3919061534a565b60206040518083038186803b1580156130bb57600080fd5b505afa1580156130cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130f39190614a6e565b90506000613141846040518060400160405280600d81526020017f4469727479206465706f7369740000000000000000000000000000000000000081525084613ca09092919063ffffffff16565b9050600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a694fc3a826040518263ffffffff1660e01b815260040161319e919061571f565b600060405180830381600087803b1580156131b857600080fd5b505af11580156131cc573d6000803e3d6000fd5b505050506000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161322d919061534a565b60206040518083038186803b15801561324557600080fd5b505afa158015613259573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061327d9190614a6e565b905060006132cb856040518060400160405280600b81526020017f4469727479207374616b6500000000000000000000000000000000000000000081525084613ca09092919063ffffffff16565b9050600080600354116132e1578190508061330c565b613308866132fa60035485613be690919063ffffffff16565b613c5690919063ffffffff16565b9050805b5080600360008282540192505081905550600080600c60016007811061332e57fe5b015411156133855761333f33612b28565b61337f5761337a620f424061336c600c60016007811061335b57fe5b015485613be690919063ffffffff16565b613c5690919063ffffffff16565b613382565b60005b90505b6000811115613486578060136000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161347d919061571f565b60405180910390a35b61349981836147d890919063ffffffff16565b601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055503373ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef61354884866147d890919063ffffffff16565b604051613555919061571f565b60405180910390a3600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633d18b9126040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156135c757600080fd5b505af11580156135db573d6000803e3d6000fd5b50505050600c6004600781106135ed57fe5b0154600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161364a919061534a565b60206040518083038186803b15801561366257600080fd5b505afa158015613676573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061369a9190614a6e565b11156136aa576136a930613cfb565b5b50505050505050506000600160006101000a81548160ff021916908360ff16021790555050565b600781815481106136e157600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600860149054906101000a900460ff1681565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600061379b827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610706565b9050919050565b6014602052816000526040600020602052806000526040600020600091509150505481565b600080600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161384c919061534a565b60206040518083038186803b15801561386457600080fd5b505afa158015613878573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061389c9190614a6e565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016138f7919061534a565b60206040518083038186803b15801561390f57600080fd5b505afa158015613923573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139479190614a6e565b019050613a21670de0b6b3a7640000613a13838573ffffffffffffffffffffffffffffffffffffffff166333281305600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b81526004016139b5919061534a565b60206040518083038186803b1580156139cd57600080fd5b505afa1580156139e1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a059190614a6e565b613be690919063ffffffff16565b613c5690919063ffffffff16565b9250505090565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614613ab8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613aaf9061569f565b60405180910390fd5b600060016000805490500381548110613acd57fe5b906000526020600020906002020160008281548110613ae857fe5b90600052602060002090600202016000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600182015481600101559050506000805480613b7557fe5b6001900381819060005260206000209060020201600080820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905560018201600090555050905550565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080831415613bf95760009050613c50565b6000828402905082848281613c0a57fe5b0414613c4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613c42906155ff565b60405180910390fd5b809150505b92915050565b6000613c9883836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250614822565b905092915050565b6000838311158290613ce8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613cdf91906154bd565b60405180910390fd5b5060008385039050809150509392505050565b600860149054906101000a900460ff1615613d4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613d42906155df565b60405180910390fd5b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000600760016007805490500381548110613d8957fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000613e766002600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401613e18919061534a565b60206040518083038186803b158015613e3057600080fd5b505afa158015613e44573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e689190614a6e565b613c5690919063ffffffff16565b90508273ffffffffffffffffffffffffffffffffffffffff16635c11d795826001600730426040518663ffffffff1660e01b8152600401613ebb95949392919061573a565b600060405180830381600087803b158015613ed557600080fd5b505af1158015613ee9573d6000803e3d6000fd5b505050508273ffffffffffffffffffffffffffffffffffffffff1663e8e3370083600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401613f66919061534a565b60206040518083038186803b158015613f7e57600080fd5b505afa158015613f92573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613fb69190614a6e565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401614011919061534a565b60206040518083038186803b15801561402957600080fd5b505afa15801561403d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906140619190614a6e565b60018030426040518963ffffffff1660e01b81526004016140899897969594939291906153c5565b606060405180830381600087803b1580156140a357600080fd5b505af11580156140b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906140db9190614a97565b5050506000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161413b919061534a565b60206040518083038186803b15801561415357600080fd5b505afa158015614167573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061418b9190614a6e565b90506000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016141ea919061534a565b60206040518083038186803b15801561420257600080fd5b505afa158015614216573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061423a9190614a6e565b9050600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a694fc3a836040518263ffffffff1660e01b8152600401614297919061571f565b600060405180830381600087803b1580156142b157600080fd5b505af11580156142c5573d6000803e3d6000fd5b505050506000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401614326919061534a565b60206040518083038186803b15801561433e57600080fd5b505afa158015614352573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906143769190614a6e565b905060006143c4836040518060400160405280600b81526020017f4469727479207374616b6500000000000000000000000000000000000000000081525084613ca09092919063ffffffff16565b9050600080600c6005600781106143d757fe5b015414156143fe574267ffffffffffffffff16600c6005600781106143f857fe5b01819055505b4267ffffffffffffffff16600c60066007811061441757fe5b018190555060006003541161442f578190508061445a565b6144568461444860035485613be690919063ffffffff16565b613c5690919063ffffffff16565b9050805b50614492620f4240614484600c60026007811061447357fe5b015484613be690919063ffffffff16565b613c5690919063ffffffff16565b60136000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060003073ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff161461453b578961455f565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff165b9050614598620f424061458a600c60036007811061457957fe5b015485613be690919063ffffffff16565b613c5690919063ffffffff16565b601360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555061466361461e620f4240614610600c6003600781106145ff57fe5b015486613be690919063ffffffff16565b613c5690919063ffffffff16565b614655620f4240614647600c60026007811061463657fe5b015487613be690919063ffffffff16565b613c5690919063ffffffff16565b61488390919063ffffffff16565b600360008282540192505081905550600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef61471b620f424061470d600c6002600781106146fc57fe5b015488613be690919063ffffffff16565b613c5690919063ffffffff16565b604051614728919061571f565b60405180910390a38073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6147b7620f42406147a9600c60036007811061479857fe5b015488613be690919063ffffffff16565b613c5690919063ffffffff16565b6040516147c4919061571f565b60405180910390a350505050505050505050565b600061481a83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613ca0565b905092915050565b60008083118290614869576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161486091906154bd565b60405180910390fd5b50600083858161487557fe5b049050809150509392505050565b6000808284019050838110156148ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016148c59061551f565b60405180910390fd5b8091505092915050565b6000813590506148e7816159f0565b92915050565b6000815190506148fc81615a07565b92915050565b60008135905061491181615a1e565b92915050565b60008151905061492681615a1e565b92915050565b60006020828403121561493e57600080fd5b600061494c848285016148d8565b91505092915050565b6000806040838503121561496857600080fd5b6000614976858286016148d8565b9250506020614987858286016148d8565b9150509250929050565b6000806000606084860312156149a657600080fd5b60006149b4868287016148d8565b93505060206149c5868287016148d8565b92505060406149d686828701614902565b9150509250925092565b600080604083850312156149f357600080fd5b6000614a01858286016148d8565b9250506020614a1285828601614902565b9150509250929050565b600060208284031215614a2e57600080fd5b6000614a3c848285016148ed565b91505092915050565b600060208284031215614a5757600080fd5b6000614a6584828501614902565b91505092915050565b600060208284031215614a8057600080fd5b6000614a8e84828501614917565b91505092915050565b600080600060608486031215614aac57600080fd5b6000614aba86828701614917565b9350506020614acb86828701614917565b9250506040614adc86828701614917565b9150509250925092565b600080600080600060a08688031215614afe57600080fd5b6000614b0c88828901614902565b9550506020614b1d88828901614902565b9450506040614b2e88828901614902565b9350506060614b3f888289016148d8565b9250506080614b5088828901614902565b9150509295509295909350565b6000614b698383614b84565b60208301905092915050565b614b7e816158e2565b82525050565b614b8d8161589a565b82525050565b614b9c8161589a565b82525050565b6000614bad8261581f565b614bb78185615842565b9350614bc2836157f5565b8060005b83811015614bfa57614bd7826159bf565b614be18882614b5d565b9750614bec83615835565b925050600181019050614bc6565b5085935050505092915050565b614c10816158ac565b82525050565b614c1f816158f4565b82525050565b614c2e81615918565b82525050565b614c3d8161593c565b82525050565b6000614c4e8261582a565b614c58818561585e565b9350614c68818560208601615972565b614c71816159d2565b840191505092915050565b600081546001811660008114614c995760018114614cbe57614d02565b607f6002830416614caa818761586f565b955060ff1983168652808601935050614d02565b60028204614ccc818761586f565b9550614cd78561580a565b60005b82811015614cf957815481890152600182019150602081019050614cda565b82880195505050505b505092915050565b6000614d17600f8361586f565b91507f6b63632e677572752f475241494e2f00000000000000000000000000000000006000830152600f82019050919050565b6000614d5760148361585e565b91507f4e6f74206d75636820776f726b20746f20646f210000000000000000000000006000830152602082019050919050565b6000614d9760038361585e565b91507f21524700000000000000000000000000000000000000000000000000000000006000830152602082019050919050565b6000614dd7601b8361585e565b91507f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006000830152602082019050919050565b6000614e1760068361586f565b91507f475241494e2300000000000000000000000000000000000000000000000000006000830152600682019050919050565b6000614e5760278361585e565b91507f49747320616e20656d657267656e63792e20506c6561736520646f6e2774206460008301527f65706f7369742e000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614ebd60118361585e565b91507f556e61626c6520746f206f6e626f6172640000000000000000000000000000006000830152602082019050919050565b6000614efd601b8361585e565b91507f456d657267656e637920616c7265616479206465636c617265642e00000000006000830152602082019050919050565b6000614f3d60098361585e565b91507f2177693a206869676800000000000000000000000000000000000000000000006000830152602082019050919050565b6000614f7d60098361585e565b91507f2164663a206869676800000000000000000000000000000000000000000000006000830152602082019050919050565b6000614fbd60318361585e565b91507f49747320616e20656d657267656e63792e2055736520656d657267656e63795760008301527f69746864726177282920706c656173652e0000000000000000000000000000006020830152604082019050919050565b600061502360218361585e565b91507f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008301527f77000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061508960098361585e565b91507f2170663a206869676800000000000000000000000000000000000000000000006000830152602082019050919050565b60006150c960178361585e565b91507f456d657267656e6379206e6f74206465636c617265642e0000000000000000006000830152602082019050919050565b6000615109602d8361585e565b91507f497473206e6f7420616e20656d657267656e63792e205573652077697468647260008301527f6177282920696e73746561642e000000000000000000000000000000000000006020830152604082019050919050565b600061516f60148361585e565b91507f496e73756666696369656e742042616c616e63650000000000000000000000006000830152602082019050919050565b60006151af60358361585e565b91507f4f6e6c7920452e4c2e492e542e452e20442e412e4f2e2054726561737572792060008301527f63616e20726573637565207472656173757265732100000000000000000000006020830152604082019050919050565b6000615215600083615853565b9150600082019050919050565b600061522f601c8361585e565b91507f46756e647320617265205361667520696e20656d657267656e637921000000006000830152602082019050919050565b600061526f60118361585e565b91507f556e61626c6520746f206465626f6172640000000000000000000000000000006000830152602082019050919050565b60006152af600c8361585e565b91507f456c69746573206f6e6c792100000000000000000000000000000000000000006000830152602082019050919050565b6152eb816158d8565b82525050565b60006152fc82614d0a565b91506153088284614c7c565b915081905092915050565b600061531e82614e0a565b915061532a8284614c7c565b915081905092915050565b600061534082615208565b9150819050919050565b600060208201905061535f6000830184614b93565b92915050565b600060608201905061537a6000830186614b75565b6153876020830185614b93565b61539460408301846152e2565b949350505050565b60006040820190506153b16000830185614b75565b6153be60208301846152e2565b9392505050565b6000610100820190506153db600083018b614b93565b6153e8602083018a614b93565b6153f560408301896152e2565b61540260608301886152e2565b61540f6080830187614c34565b61541c60a0830186614c34565b61542960c0830185614b93565b61543660e08301846152e2565b9998505050505050505050565b60006040820190506154586000830185614b93565b61546560208301846152e2565b9392505050565b60006020820190506154816000830184614c07565b92915050565b600060208201905061549c6000830184614c16565b92915050565b60006020820190506154b76000830184614c25565b92915050565b600060208201905081810360008301526154d78184614c43565b905092915050565b600060208201905081810360008301526154f881614d4a565b9050919050565b6000602082019050818103600083015261551881614d8a565b9050919050565b6000602082019050818103600083015261553881614dca565b9050919050565b6000602082019050818103600083015261555881614e4a565b9050919050565b6000602082019050818103600083015261557881614eb0565b9050919050565b6000602082019050818103600083015261559881614ef0565b9050919050565b600060208201905081810360008301526155b881614f30565b9050919050565b600060208201905081810360008301526155d881614f70565b9050919050565b600060208201905081810360008301526155f881614fb0565b9050919050565b6000602082019050818103600083015261561881615016565b9050919050565b600060208201905081810360008301526156388161507c565b9050919050565b60006020820190508181036000830152615658816150bc565b9050919050565b60006020820190508181036000830152615678816150fc565b9050919050565b6000602082019050818103600083015261569881615162565b9050919050565b600060208201905081810360008301526156b8816151a2565b9050919050565b600060208201905081810360008301526156d881615222565b9050919050565b600060208201905081810360008301526156f881615262565b9050919050565b60006020820190508181036000830152615718816152a2565b9050919050565b600060208201905061573460008301846152e2565b92915050565b600060a08201905061574f60008301886152e2565b61575c6020830187614c34565b818103604083015261576e8186614ba2565b905061577d6060830185614b93565b61578a60808301846152e2565b9695505050505050565b600060c0820190506157a960008301896152e2565b6157b660208301886152e2565b6157c360408301876152e2565b6157d060608301866152e2565b6157dd60808301856152e2565b6157ea60a08301846152e2565b979650505050505050565b60008190508160005260206000209050919050565b60008190508160005260206000209050919050565b600081549050919050565b600081519050919050565b6000600182019050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006158a5826158b8565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006158ed8261594e565b9050919050565b60006158ff82615906565b9050919050565b6000615911826158b8565b9050919050565b60006159238261592a565b9050919050565b6000615935826158b8565b9050919050565b6000615947826158d8565b9050919050565b600061595982615960565b9050919050565b600061596b826158b8565b9050919050565b60005b83811015615990578082015181840152602081019050615975565b8381111561599f576000848401525b50505050565b60006159b86159b3836159e3565b61587a565b9050919050565b60006159cb82546159a5565b9050919050565b6000601f19601f8301169050919050565b60008160001c9050919050565b6159f98161589a565b8114615a0457600080fd5b50565b615a10816158ac565b8114615a1b57600080fd5b50565b615a27816158d8565b8114615a3257600080fd5b5056fea2646970667358221220902df3671076a8d0d5e4308971753de61fa35dc56b3555d700a27eeb12f4127d64736f6c63430007060033000000000000000000000000f9cf281649ca69546ff6e48359c6ce62a89c4dd0000000000000000000000000c9c64aa3a0dcd2272100a0e81226d0272ee435e7000000000000000000000000e1c110e1b1b4a1ded0caf3e42bfbdbb7b5d7ce1c0000000000000000000000005ddac4c73b15353dc4a00daeafb38631a7cbd38900000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000140000000000000000000000000426a4a4b73d4cd173c9ab78d18c0d79d1717eaa90000000000000000000000000000000000000000000000000000000000000002000000000000000000000000e1c110e1b1b4a1ded0caf3e42bfbdbb7b5d7ce1c0000000000000000000000004446fc4eb47f2f6586f9faab68b3498f86c0752100000000000000000000000000000000000000000000000000000000000000043333303100000000000000000000000000000000000000000000000000000000

Deployed ByteCode

0x608060405234801561001057600080fd5b50600436106102275760003560e01c806361d027b311610130578063b6b55f25116100b8578063daea85c51161007c578063daea85c514610626578063dd62ed3e14610656578063e5328e0614610686578063ef1b8140146106a4578063f887ea40146106c057610227565b8063b6b55f2514610580578063b980c78f1461059c578063caa6fea4146105cc578063cb7956b0146105ea578063d389800f1461060857610227565b80637a4e4ecf116100ff5780637a4e4ecf146104b45780638ed5f373146104e457806395d89b4114610514578063a9059cbb14610532578063af640d0f1461056257610227565b806361d027b314610440578063685c8ca51461045e57806369a8bde71461047a57806370a082311461048457610227565b806327d9cf44116101b3578063370158ea11610182578063370158ea146103bd5780634162169f146103e05780634b292cae146103fe5780634fa5d8541461041a5780635312ea8e1461042457610227565b806327d9cf441461035b5780632e1a7d4d14610379578063313ce5671461039557806331e244e5146103b357610227565b80631e534906116101fa5780631e534906146102c95780631f1fcd51146102d357806323b872dd146102f157806323e1d0e81461032157806324aa95ec1461035157610227565b806306fdde031461022c578063095ea7b31461024a57806318160ddd1461027a5780631b5f9c4214610298575b600080fd5b6102346106de565b60405161024191906154bd565b60405180910390f35b610264600480360381019061025f91906149e0565b610706565b604051610271919061546c565b60405180910390f35b6102826107f8565b60405161028f919061571f565b60405180910390f35b6102b260048036038101906102ad9190614a45565b6107fe565b6040516102c0929190615443565b60405180910390f35b6102d1610852565b005b6102db610a0c565b6040516102e89190615487565b60405180910390f35b61030b60048036038101906103069190614991565b610a32565b604051610318919061546c565b60405180910390f35b61033b60048036038101906103369190614a45565b610db1565b604051610348919061571f565b60405180910390f35b610359610dcc565b005b610363611005565b604051610370919061534a565b60405180910390f35b610393600480360381019061038e9190614a45565b61102b565b005b61039d61172e565b6040516103aa919061571f565b60405180910390f35b6103bb611737565b005b6103c561196b565b6040516103d796959493929190615794565b60405180910390f35b6103e8611d4d565b6040516103f5919061534a565b60405180910390f35b61041860048036038101906104139190614ae6565b611d73565b005b610422611f6a565b005b61043e60048036038101906104399190614a45565b6121c6565b005b6104486125b9565b604051610455919061534a565b60405180910390f35b610478600480360381019061047391906149e0565b6125df565b005b61048261271c565b005b61049e6004803603810190610499919061492c565b612830565b6040516104ab919061571f565b60405180910390f35b6104ce60048036038101906104c991906149e0565b612848565b6040516104db919061546c565b60405180910390f35b6104fe60048036038101906104f9919061492c565b612b28565b60405161050b919061546c565b60405180910390f35b61051c612c5d565b60405161052991906154bd565b60405180910390f35b61054c600480360381019061054791906149e0565b612c85565b604051610559919061546c565b60405180910390f35b61056a612c9a565b60405161057791906154bd565b60405180910390f35b61059a60048036038101906105959190614a45565b612d38565b005b6105b660048036038101906105b19190614a45565b6136d1565b6040516105c3919061534a565b60405180910390f35b6105d4613710565b6040516105e1919061546c565b60405180910390f35b6105f2613723565b6040516105ff91906154a2565b60405180910390f35b610610613749565b60405161061d9190615487565b60405180910390f35b610640600480360381019061063b919061492c565b61376f565b60405161064d919061546c565b60405180910390f35b610670600480360381019061066b9190614955565b6137a2565b60405161067d919061571f565b60405180910390f35b61068e6137c7565b60405161069b919061571f565b60405180910390f35b6106be60048036038101906106b99190614a45565b613a28565b005b6106c8613bc0565b6040516106d5919061534a565b60405180910390f35b606060026040516020016106f291906152f1565b604051602081830303815290604052905090565b600081601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516107e6919061571f565b60405180910390a36001905092915050565b60035481565b6000818154811061080e57600080fd5b90600052602060002090600202016000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154905082565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633d18b9126040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156108bc57600080fd5b505af11580156108d0573d6000803e3d6000fd5b505050506000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166312045987306040518263ffffffff1660e01b8152600401610931919061534a565b60206040518083038186803b15801561094957600080fd5b505afa15801561095d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109819190614a6e565b1115610a0a57600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636de4ab876040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156109f157600080fd5b505af1158015610a05573d6000803e3d6000fd5b505050505b565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600081601360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015610ab6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aad9061567f565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614158015610b8e57507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff601460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414155b15610ca75781601460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015610c1c57600080fd5b81601460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055505b81601360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254039250508190555081601360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610d9e919061571f565b60405180910390a3600190509392505050565b600c8160078110610dc157600080fd5b016000915090505481565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610e5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e539061569f565b60405180910390fd5b600860149054906101000a900460ff16610eab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea29061563f565b60405180910390fd5b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610f08919061534a565b60206040518083038186803b158015610f2057600080fd5b505afa158015610f34573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f589190614a6e565b9050600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a694fc3a826040518263ffffffff1660e01b8152600401610fb5919061571f565b600060405180830381600087803b158015610fcf57600080fd5b505af1158015610fe3573d6000803e3d6000fd5b505050506000600860146101000a81548160ff02191690831515021790555050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600160009054906101000a900460ff1660ff1614611080576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611077906154ff565b60405180910390fd5b60018060006101000a81548160ff021916908360ff160217905550600860149054906101000a900460ff16156110eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e2906155df565b60405180910390fd5b80601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101561116d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111649061567f565b60405180910390fd5b80601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506000600354905081600360008282540392505081905550600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161122f919061571f565b60405180910390a36000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611294919061534a565b60206040518083038186803b1580156112ac57600080fd5b505afa1580156112c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112e49190614a6e565b90506000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611343919061534a565b60206040518083038186803b15801561135b57600080fd5b505afa15801561136f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113939190614a6e565b905060006113bc846113ae8488613be690919063ffffffff16565b613c5690919063ffffffff16565b9050600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d826040518263ffffffff1660e01b8152600401611419919061571f565b600060405180830381600087803b15801561143357600080fd5b505af1158015611447573d6000803e3d6000fd5b505050506000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016114a8919061534a565b60206040518083038186803b1580156114c057600080fd5b505afa1580156114d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114f89190614a6e565b90506000611546856040518060400160405280601081526020017f4469727479207769746864726177616c0000000000000000000000000000000081525084613ca09092919063ffffffff16565b9050600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b81526004016115a592919061539c565b602060405180830381600087803b1580156115bf57600080fd5b505af11580156115d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115f79190614a1c565b611636576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162d906156df565b60405180910390fd5b61163e610852565b600c60046007811061164c57fe5b0154600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016116a9919061534a565b60206040518083038186803b1580156116c157600080fd5b505afa1580156116d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116f99190614a6e565b11156117095761170830613cfb565b5b5050505050506000600160006101000a81548160ff021916908360ff16021790555050565b60006012905090565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146117c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117be9061569f565b60405180910390fd5b600860149054906101000a900460ff1615611817576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180e9061557f565b60405180910390fd5b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635312ea8e600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016118b0919061534a565b60206040518083038186803b1580156118c857600080fd5b505afa1580156118dc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119009190614a6e565b6040518263ffffffff1660e01b815260040161191c919061571f565b600060405180830381600087803b15801561193657600080fd5b505af115801561194a573d6000803e3d6000fd5b505050506001600860146101000a81548160ff021916908315150217905550565b6000806000806000806000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016119d1919061534a565b60206040518083038186803b1580156119e957600080fd5b505afa1580156119fd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a219190614a6e565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611a7c919061534a565b60206040518083038186803b158015611a9457600080fd5b505afa158015611aa8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611acc9190614a6e565b0190506000600354670de0b6b3a7640000830281611ae657fe5b0490506000600c600560078110611af957fe5b0154600c600660078110611b0957fe5b01540360646301e13380670de0b6b3a76400008503020281611b2757fe5b049050828282600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611b88919061534a565b60206040518083038186803b158015611ba057600080fd5b505afa158015611bb4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bd89190614a6e565b611be06137c7565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166312045987306040518263ffffffff1660e01b8152600401611c3b919061534a565b60206040518083038186803b158015611c5357600080fd5b505afa158015611c67573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c8b9190614a6e565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16628cc262306040518263ffffffff1660e01b8152600401611ce5919061534a565b60206040518083038186803b158015611cfd57600080fd5b505afa158015611d11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d359190614a6e565b01985098509850985098509850505050909192939495565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611e03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dfa9061569f565b60405180910390fd5b84600c600460078110611e1257fe5b018190555081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620186a08410611e9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e949061559f565b60405180910390fd5b83600c600360078110611eac57fe5b0181905550620186a08310611ef6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eed9061561f565b60405180910390fd5b82600c600260078110611f0557fe5b0181905550620186a08110611f4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f46906155bf565b60405180910390fd5b80600c600160078110611f5e57fe5b01819055505050505050565b6000600160009054906101000a900460ff1660ff1614611fbf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fb6906154ff565b60405180910390fd5b60018060006101000a81548160ff021916908360ff160217905550611fe333612b28565b612022576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612019906156ff565b60405180910390fd5b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633d18b9126040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561208c57600080fd5b505af11580156120a0573d6000803e3d6000fd5b50505050600c6004600781106120b257fe5b0154600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161210f919061534a565b60206040518083038186803b15801561212757600080fd5b505afa15801561213b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061215f9190614a6e565b1161219f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612196906154df565b60405180910390fd5b6121a833613cfb565b6000600160006101000a81548160ff021916908360ff160217905550565b6000600160009054906101000a900460ff1660ff161461221b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612212906154ff565b60405180910390fd5b60018060006101000a81548160ff021916908360ff160217905550600860149054906101000a900460ff16612285576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161227c9061565f565b60405180910390fd5b80601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015612307576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122fe9061567f565b60405180910390fd5b6000600354905081601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254039250508190555081600360008282540392505081905550600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516123c9919061571f565b60405180910390a36000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161242e919061534a565b60206040518083038186803b15801561244657600080fd5b505afa15801561245a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061247e9190614a6e565b905060006124a7836124998487613be690919063ffffffff16565b613c5690919063ffffffff16565b9050600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b815260040161250692919061539c565b602060405180830381600087803b15801561252057600080fd5b505af1158015612534573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125589190614a1c565b612597576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161258e906156df565b60405180910390fd5b5050506000600160006101000a81548160ff021916908360ff16021790555050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461266f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126669061569f565b60405180910390fd5b600060405180604001604052808473ffffffffffffffffffffffffffffffffffffffff16815260200183815250908060018154018082558091505060019003906000526020600020906002020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015550505050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146127ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127a39061569f565b60405180910390fd5b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632459a6996040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561281657600080fd5b505af115801561282a573d6000803e3d6000fd5b50505050565b60136020528060005260406000206000915090505481565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146128da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128d19061569f565b60405180910390fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561296b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612962906156bf565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612a3357600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16826040516129e690615335565b60006040518083038185875af1925050503d8060008114612a23576040519150601f19603f3d011682016040523d82523d6000602084013e612a28565b606091505b505080915050612b22565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612b1d578273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518363ffffffff1660e01b8152600401612ac4929190615443565b602060405180830381600087803b158015612ade57600080fd5b505af1158015612af2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b169190614a1c565b9050612b22565b600090505b92915050565b6000806000805490501415612b405760019050612c58565b60005b600080549050811015612c525760008181548110612b5d57fe5b90600052602060002090600202016001015460008281548110612b7c57fe5b906000526020600020906002020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231856040518263ffffffff1660e01b8152600401612be6919061534a565b60206040518083038186803b158015612bfe57600080fd5b505afa158015612c12573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c369190614a6e565b10612c45576001915050612c58565b8080600101915050612b43565b50600090505b919050565b60606002604051602001612c719190615313565b604051602081830303815290604052905090565b6000612c92338484610a32565b905092915050565b60028054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612d305780601f10612d0557610100808354040283529160200191612d30565b820191906000526020600020905b815481529060010190602001808311612d1357829003601f168201915b505050505081565b6000600160009054906101000a900460ff1660ff1614612d8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d84906154ff565b60405180910390fd5b60018060006101000a81548160ff021916908360ff160217905550600860149054906101000a900460ff1615612df8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612def9061553f565b60405180910390fd5b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401612e55919061534a565b60206040518083038186803b158015612e6d57600080fd5b505afa158015612e81573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ea59190614a6e565b90506000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401612f04919061534a565b60206040518083038186803b158015612f1c57600080fd5b505afa158015612f30573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f549190614a6e565b9050600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330866040518463ffffffff1660e01b8152600401612fb593929190615365565b602060405180830381600087803b158015612fcf57600080fd5b505af1158015612fe3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130079190614a1c565b613046576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161303d9061555f565b60405180910390fd5b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016130a3919061534a565b60206040518083038186803b1580156130bb57600080fd5b505afa1580156130cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130f39190614a6e565b90506000613141846040518060400160405280600d81526020017f4469727479206465706f7369740000000000000000000000000000000000000081525084613ca09092919063ffffffff16565b9050600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a694fc3a826040518263ffffffff1660e01b815260040161319e919061571f565b600060405180830381600087803b1580156131b857600080fd5b505af11580156131cc573d6000803e3d6000fd5b505050506000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161322d919061534a565b60206040518083038186803b15801561324557600080fd5b505afa158015613259573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061327d9190614a6e565b905060006132cb856040518060400160405280600b81526020017f4469727479207374616b6500000000000000000000000000000000000000000081525084613ca09092919063ffffffff16565b9050600080600354116132e1578190508061330c565b613308866132fa60035485613be690919063ffffffff16565b613c5690919063ffffffff16565b9050805b5080600360008282540192505081905550600080600c60016007811061332e57fe5b015411156133855761333f33612b28565b61337f5761337a620f424061336c600c60016007811061335b57fe5b015485613be690919063ffffffff16565b613c5690919063ffffffff16565b613382565b60005b90505b6000811115613486578060136000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161347d919061571f565b60405180910390a35b61349981836147d890919063ffffffff16565b601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055503373ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef61354884866147d890919063ffffffff16565b604051613555919061571f565b60405180910390a3600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633d18b9126040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156135c757600080fd5b505af11580156135db573d6000803e3d6000fd5b50505050600c6004600781106135ed57fe5b0154600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161364a919061534a565b60206040518083038186803b15801561366257600080fd5b505afa158015613676573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061369a9190614a6e565b11156136aa576136a930613cfb565b5b50505050505050506000600160006101000a81548160ff021916908360ff16021790555050565b600781815481106136e157600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600860149054906101000a900460ff1681565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600061379b827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610706565b9050919050565b6014602052816000526040600020602052806000526040600020600091509150505481565b600080600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161384c919061534a565b60206040518083038186803b15801561386457600080fd5b505afa158015613878573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061389c9190614a6e565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016138f7919061534a565b60206040518083038186803b15801561390f57600080fd5b505afa158015613923573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139479190614a6e565b019050613a21670de0b6b3a7640000613a13838573ffffffffffffffffffffffffffffffffffffffff166333281305600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b81526004016139b5919061534a565b60206040518083038186803b1580156139cd57600080fd5b505afa1580156139e1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a059190614a6e565b613be690919063ffffffff16565b613c5690919063ffffffff16565b9250505090565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614613ab8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613aaf9061569f565b60405180910390fd5b600060016000805490500381548110613acd57fe5b906000526020600020906002020160008281548110613ae857fe5b90600052602060002090600202016000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600182015481600101559050506000805480613b7557fe5b6001900381819060005260206000209060020201600080820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905560018201600090555050905550565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080831415613bf95760009050613c50565b6000828402905082848281613c0a57fe5b0414613c4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613c42906155ff565b60405180910390fd5b809150505b92915050565b6000613c9883836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250614822565b905092915050565b6000838311158290613ce8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613cdf91906154bd565b60405180910390fd5b5060008385039050809150509392505050565b600860149054906101000a900460ff1615613d4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613d42906155df565b60405180910390fd5b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000600760016007805490500381548110613d8957fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000613e766002600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401613e18919061534a565b60206040518083038186803b158015613e3057600080fd5b505afa158015613e44573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e689190614a6e565b613c5690919063ffffffff16565b90508273ffffffffffffffffffffffffffffffffffffffff16635c11d795826001600730426040518663ffffffff1660e01b8152600401613ebb95949392919061573a565b600060405180830381600087803b158015613ed557600080fd5b505af1158015613ee9573d6000803e3d6000fd5b505050508273ffffffffffffffffffffffffffffffffffffffff1663e8e3370083600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401613f66919061534a565b60206040518083038186803b158015613f7e57600080fd5b505afa158015613f92573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613fb69190614a6e565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401614011919061534a565b60206040518083038186803b15801561402957600080fd5b505afa15801561403d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906140619190614a6e565b60018030426040518963ffffffff1660e01b81526004016140899897969594939291906153c5565b606060405180830381600087803b1580156140a357600080fd5b505af11580156140b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906140db9190614a97565b5050506000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161413b919061534a565b60206040518083038186803b15801561415357600080fd5b505afa158015614167573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061418b9190614a6e565b90506000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016141ea919061534a565b60206040518083038186803b15801561420257600080fd5b505afa158015614216573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061423a9190614a6e565b9050600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a694fc3a836040518263ffffffff1660e01b8152600401614297919061571f565b600060405180830381600087803b1580156142b157600080fd5b505af11580156142c5573d6000803e3d6000fd5b505050506000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401614326919061534a565b60206040518083038186803b15801561433e57600080fd5b505afa158015614352573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906143769190614a6e565b905060006143c4836040518060400160405280600b81526020017f4469727479207374616b6500000000000000000000000000000000000000000081525084613ca09092919063ffffffff16565b9050600080600c6005600781106143d757fe5b015414156143fe574267ffffffffffffffff16600c6005600781106143f857fe5b01819055505b4267ffffffffffffffff16600c60066007811061441757fe5b018190555060006003541161442f578190508061445a565b6144568461444860035485613be690919063ffffffff16565b613c5690919063ffffffff16565b9050805b50614492620f4240614484600c60026007811061447357fe5b015484613be690919063ffffffff16565b613c5690919063ffffffff16565b60136000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060003073ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff161461453b578961455f565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff165b9050614598620f424061458a600c60036007811061457957fe5b015485613be690919063ffffffff16565b613c5690919063ffffffff16565b601360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555061466361461e620f4240614610600c6003600781106145ff57fe5b015486613be690919063ffffffff16565b613c5690919063ffffffff16565b614655620f4240614647600c60026007811061463657fe5b015487613be690919063ffffffff16565b613c5690919063ffffffff16565b61488390919063ffffffff16565b600360008282540192505081905550600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef61471b620f424061470d600c6002600781106146fc57fe5b015488613be690919063ffffffff16565b613c5690919063ffffffff16565b604051614728919061571f565b60405180910390a38073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6147b7620f42406147a9600c60036007811061479857fe5b015488613be690919063ffffffff16565b613c5690919063ffffffff16565b6040516147c4919061571f565b60405180910390a350505050505050505050565b600061481a83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613ca0565b905092915050565b60008083118290614869576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161486091906154bd565b60405180910390fd5b50600083858161487557fe5b049050809150509392505050565b6000808284019050838110156148ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016148c59061551f565b60405180910390fd5b8091505092915050565b6000813590506148e7816159f0565b92915050565b6000815190506148fc81615a07565b92915050565b60008135905061491181615a1e565b92915050565b60008151905061492681615a1e565b92915050565b60006020828403121561493e57600080fd5b600061494c848285016148d8565b91505092915050565b6000806040838503121561496857600080fd5b6000614976858286016148d8565b9250506020614987858286016148d8565b9150509250929050565b6000806000606084860312156149a657600080fd5b60006149b4868287016148d8565b93505060206149c5868287016148d8565b92505060406149d686828701614902565b9150509250925092565b600080604083850312156149f357600080fd5b6000614a01858286016148d8565b9250506020614a1285828601614902565b9150509250929050565b600060208284031215614a2e57600080fd5b6000614a3c848285016148ed565b91505092915050565b600060208284031215614a5757600080fd5b6000614a6584828501614902565b91505092915050565b600060208284031215614a8057600080fd5b6000614a8e84828501614917565b91505092915050565b600080600060608486031215614aac57600080fd5b6000614aba86828701614917565b9350506020614acb86828701614917565b9250506040614adc86828701614917565b9150509250925092565b600080600080600060a08688031215614afe57600080fd5b6000614b0c88828901614902565b9550506020614b1d88828901614902565b9450506040614b2e88828901614902565b9350506060614b3f888289016148d8565b9250506080614b5088828901614902565b9150509295509295909350565b6000614b698383614b84565b60208301905092915050565b614b7e816158e2565b82525050565b614b8d8161589a565b82525050565b614b9c8161589a565b82525050565b6000614bad8261581f565b614bb78185615842565b9350614bc2836157f5565b8060005b83811015614bfa57614bd7826159bf565b614be18882614b5d565b9750614bec83615835565b925050600181019050614bc6565b5085935050505092915050565b614c10816158ac565b82525050565b614c1f816158f4565b82525050565b614c2e81615918565b82525050565b614c3d8161593c565b82525050565b6000614c4e8261582a565b614c58818561585e565b9350614c68818560208601615972565b614c71816159d2565b840191505092915050565b600081546001811660008114614c995760018114614cbe57614d02565b607f6002830416614caa818761586f565b955060ff1983168652808601935050614d02565b60028204614ccc818761586f565b9550614cd78561580a565b60005b82811015614cf957815481890152600182019150602081019050614cda565b82880195505050505b505092915050565b6000614d17600f8361586f565b91507f6b63632e677572752f475241494e2f00000000000000000000000000000000006000830152600f82019050919050565b6000614d5760148361585e565b91507f4e6f74206d75636820776f726b20746f20646f210000000000000000000000006000830152602082019050919050565b6000614d9760038361585e565b91507f21524700000000000000000000000000000000000000000000000000000000006000830152602082019050919050565b6000614dd7601b8361585e565b91507f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006000830152602082019050919050565b6000614e1760068361586f565b91507f475241494e2300000000000000000000000000000000000000000000000000006000830152600682019050919050565b6000614e5760278361585e565b91507f49747320616e20656d657267656e63792e20506c6561736520646f6e2774206460008301527f65706f7369742e000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614ebd60118361585e565b91507f556e61626c6520746f206f6e626f6172640000000000000000000000000000006000830152602082019050919050565b6000614efd601b8361585e565b91507f456d657267656e637920616c7265616479206465636c617265642e00000000006000830152602082019050919050565b6000614f3d60098361585e565b91507f2177693a206869676800000000000000000000000000000000000000000000006000830152602082019050919050565b6000614f7d60098361585e565b91507f2164663a206869676800000000000000000000000000000000000000000000006000830152602082019050919050565b6000614fbd60318361585e565b91507f49747320616e20656d657267656e63792e2055736520656d657267656e63795760008301527f69746864726177282920706c656173652e0000000000000000000000000000006020830152604082019050919050565b600061502360218361585e565b91507f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008301527f77000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061508960098361585e565b91507f2170663a206869676800000000000000000000000000000000000000000000006000830152602082019050919050565b60006150c960178361585e565b91507f456d657267656e6379206e6f74206465636c617265642e0000000000000000006000830152602082019050919050565b6000615109602d8361585e565b91507f497473206e6f7420616e20656d657267656e63792e205573652077697468647260008301527f6177282920696e73746561642e000000000000000000000000000000000000006020830152604082019050919050565b600061516f60148361585e565b91507f496e73756666696369656e742042616c616e63650000000000000000000000006000830152602082019050919050565b60006151af60358361585e565b91507f4f6e6c7920452e4c2e492e542e452e20442e412e4f2e2054726561737572792060008301527f63616e20726573637565207472656173757265732100000000000000000000006020830152604082019050919050565b6000615215600083615853565b9150600082019050919050565b600061522f601c8361585e565b91507f46756e647320617265205361667520696e20656d657267656e637921000000006000830152602082019050919050565b600061526f60118361585e565b91507f556e61626c6520746f206465626f6172640000000000000000000000000000006000830152602082019050919050565b60006152af600c8361585e565b91507f456c69746573206f6e6c792100000000000000000000000000000000000000006000830152602082019050919050565b6152eb816158d8565b82525050565b60006152fc82614d0a565b91506153088284614c7c565b915081905092915050565b600061531e82614e0a565b915061532a8284614c7c565b915081905092915050565b600061534082615208565b9150819050919050565b600060208201905061535f6000830184614b93565b92915050565b600060608201905061537a6000830186614b75565b6153876020830185614b93565b61539460408301846152e2565b949350505050565b60006040820190506153b16000830185614b75565b6153be60208301846152e2565b9392505050565b6000610100820190506153db600083018b614b93565b6153e8602083018a614b93565b6153f560408301896152e2565b61540260608301886152e2565b61540f6080830187614c34565b61541c60a0830186614c34565b61542960c0830185614b93565b61543660e08301846152e2565b9998505050505050505050565b60006040820190506154586000830185614b93565b61546560208301846152e2565b9392505050565b60006020820190506154816000830184614c07565b92915050565b600060208201905061549c6000830184614c16565b92915050565b60006020820190506154b76000830184614c25565b92915050565b600060208201905081810360008301526154d78184614c43565b905092915050565b600060208201905081810360008301526154f881614d4a565b9050919050565b6000602082019050818103600083015261551881614d8a565b9050919050565b6000602082019050818103600083015261553881614dca565b9050919050565b6000602082019050818103600083015261555881614e4a565b9050919050565b6000602082019050818103600083015261557881614eb0565b9050919050565b6000602082019050818103600083015261559881614ef0565b9050919050565b600060208201905081810360008301526155b881614f30565b9050919050565b600060208201905081810360008301526155d881614f70565b9050919050565b600060208201905081810360008301526155f881614fb0565b9050919050565b6000602082019050818103600083015261561881615016565b9050919050565b600060208201905081810360008301526156388161507c565b9050919050565b60006020820190508181036000830152615658816150bc565b9050919050565b60006020820190508181036000830152615678816150fc565b9050919050565b6000602082019050818103600083015261569881615162565b9050919050565b600060208201905081810360008301526156b8816151a2565b9050919050565b600060208201905081810360008301526156d881615222565b9050919050565b600060208201905081810360008301526156f881615262565b9050919050565b60006020820190508181036000830152615718816152a2565b9050919050565b600060208201905061573460008301846152e2565b92915050565b600060a08201905061574f60008301886152e2565b61575c6020830187614c34565b818103604083015261576e8186614ba2565b905061577d6060830185614b93565b61578a60808301846152e2565b9695505050505050565b600060c0820190506157a960008301896152e2565b6157b660208301886152e2565b6157c360408301876152e2565b6157d060608301866152e2565b6157dd60808301856152e2565b6157ea60a08301846152e2565b979650505050505050565b60008190508160005260206000209050919050565b60008190508160005260206000209050919050565b600081549050919050565b600081519050919050565b6000600182019050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006158a5826158b8565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006158ed8261594e565b9050919050565b60006158ff82615906565b9050919050565b6000615911826158b8565b9050919050565b60006159238261592a565b9050919050565b6000615935826158b8565b9050919050565b6000615947826158d8565b9050919050565b600061595982615960565b9050919050565b600061596b826158b8565b9050919050565b60005b83811015615990578082015181840152602081019050615975565b8381111561599f576000848401525b50505050565b60006159b86159b3836159e3565b61587a565b9050919050565b60006159cb82546159a5565b9050919050565b6000601f19601f8301169050919050565b60008160001c9050919050565b6159f98161589a565b8114615a0457600080fd5b50565b615a10816158ac565b8114615a1b57600080fd5b50565b615a27816158d8565b8114615a3257600080fd5b5056fea2646970667358221220902df3671076a8d0d5e4308971753de61fa35dc56b3555d700a27eeb12f4127d64736f6c63430007060033