false
true
0

Contract Address Details

0x456548A9B56eFBbD89Ca0309edd17a9E20b04018

Token
UFO (UFO)
Creator
0x00c578–0ed253 at 0x8b6664–6962da
Balance
0 PLS ( )
Tokens
Fetching tokens...
Transactions
23,653 Transactions
Transfers
0 Transfers
Gas Used
0
Last Balance Update
25871475
Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
Contract name:
UFO




Optimization enabled
true
Compiler version
v0.8.2+commit.661d1103




Optimization runs
200
EVM Version
default




Verified at
2024-05-02T05:48:42.024393Z

Constructor Arguments

0x00000000000000000000000080591d1205c483c98af422dc250d4a1a2577c1c1

Arg [0] (address) : 0x80591d1205c483c98af422dc250d4a1a2577c1c1

              

UFO.sol

pragma solidity 0.8.2;

// SPDX-License-Identifier: Unlicensed

import "./Ownable.sol";
import "./ERC20.sol";
import "./SafeMath.sol";
import "./IPulseX.sol";

interface IStaking {
   function updatePool(uint256 amount) external;
   function stake(address LPPool, uint256 amount, address staker) external;
   function process(uint256 gas) external;
}

contract UFO is Ownable, ERC20 {
	using SafeMath for uint256;
	
    uint256 private constant MAX = ~uint256(0);
    uint256 private constant _tTotal = 999999999051 * (10**18);
	
    uint256 private _rTotal = (MAX - (MAX % _tTotal));
    uint256 private _tFeeTotal;
	
	uint256 public reflectionFee;
	uint256 public buyBurnFee;
	uint256 public pTGCBuyBurnFee;
	uint256 public LPProviderFee;
	
	uint256 private _reflectionFee;
	uint256 private _buyBurnFee;
	uint256 private _pTGCBuyBurnFee;
	uint256 private _LPProviderFee;
	
	uint256 public swapThreshold;
	uint256 public processGas;
	
	IPulseXRouter public pulseXRouter;
	IStaking public LPStaking;
	
	address private burnWallet = address(0x0000000000000000000000000000000000000369);
	address private pTGC = address(0x94534EeEe131840b1c0F61847c572228bdfDDE93);
	
	address[] public pairs;
	
	bool private swapping;
	address[] private _excluded;
	
	mapping(address => uint256) public rOwned;
    mapping(address => uint256) public tOwned;
	mapping(address => uint256) public totalSend;
    mapping(address => uint256) public totalReceived;
    mapping(address => bool) public isExcludedFromFee;
    mapping(address => bool) public isExcludedFromReflection;
	mapping(address => bool) public isExcludedFromReward;
	mapping(address => bool) public isliquidityPair;
	
	event SwapThresholdUpdated(uint256 amount);
	event AccountExcludeFromFee(address account, bool status);
    event AccountIncludeInReflection(address account);
    event AccountExcludeFromReflection(address account);
	event LPStakingAddressAdded(address newAddress);
	event ProcessGasUpdated(uint256 newGas);
	
	constructor(address owner) ERC20("UFO", "UFO") {
	    require(address(owner) != address(0), "Zero address");
		
		rOwned[address(owner)] = _rTotal;
		pulseXRouter = IPulseXRouter(0x165C3410fC91EF562C50559f7d2289fEbed552d9);
		
		pairs.push(IPulseXFactory(pulseXRouter.factory()).createPair(address(this), address(0xA1077a294dDE1B09bB078844df40758a5D0f9a27))); //WPLS
		pairs.push(IPulseXFactory(pulseXRouter.factory()).createPair(address(this), address(0x94534EeEe131840b1c0F61847c572228bdfDDE93))); //pTGC
		pairs.push(IPulseXFactory(pulseXRouter.factory()).createPair(address(this), address(0x2fa878Ab3F87CC1C9737Fc071108F904c0B0C95d))); //INC
		pairs.push(IPulseXFactory(pulseXRouter.factory()).createPair(address(this), address(0x95B303987A60C71504D99Aa1b13B4DA07b0790ab))); //PLSX
		pairs.push(IPulseXFactory(pulseXRouter.factory()).createPair(address(this), address(0x2b591e99afE9f32eAA6214f7B7629768c40Eeb39))); //HEX
		pairs.push(IPulseXFactory(pulseXRouter.factory()).createPair(address(this), address(0x57fde0a71132198BBeC939B98976993d8D89D225))); //HEXETH
		pairs.push(IPulseXFactory(pulseXRouter.factory()).createPair(address(this), address(0x6B175474E89094C44Da98b954EedeAC495271d0F))); //DAI
		
		_excludeFromReflection(address(burnWallet));
		_excludeFromReflection(address(this));
		_excludeFromReflection(address(owner));
		
		_setLiquidityPair(pairs[0]);
		_setLiquidityPair(pairs[1]);
		_setLiquidityPair(pairs[2]);
		_setLiquidityPair(pairs[3]);
		_setLiquidityPair(pairs[4]);
		_setLiquidityPair(pairs[5]);
		_setLiquidityPair(pairs[6]);
		
		_excludeFromFee(address(owner), true);
		_excludeFromFee(address(this), true);
		
		_excludeFromReward(address(owner), true);
		_excludeFromReward(address(burnWallet), true);
		
		swapThreshold = 99999999 * (10**18);
		
		reflectionFee = 100;
	    buyBurnFee = 100;
	    pTGCBuyBurnFee = 100;
		LPProviderFee = 300;
		
		processGas = 250000;
		
		totalReceived[address(owner)] +=_tTotal;
		emit Transfer(address(0), address(owner), _tTotal);
    }
	
	receive() external payable {}

    function totalSupply() public override pure returns (uint256) {
        return _tTotal;
    }
	
    function balanceOf(address account) public override view returns (uint256) {
        if (isExcludedFromReflection[account]) return tOwned[account];
        return tokenFromReflection(rOwned[account]);
    }
	
    function tokenFromReflection(uint256 rAmount) public view returns(uint256) {
        require(rAmount <= _rTotal, "Amount must be less than total reflections");
        uint256 currentRate =  _getRate();
        return rAmount.div(currentRate);
    }
	
	function _excludeFromReflection(address account) internal {
        if(rOwned[account] > 0) {
            tOwned[account] = tokenFromReflection(rOwned[account]);
        }
        isExcludedFromReflection[account] = true;
        _excluded.push(account);
    }
	
	function _excludeFromReward(address account, bool value) internal {
        isExcludedFromReward[account] = value;
    }
	
    function _setLiquidityPair(address pair) internal {
        isliquidityPair[address(pair)] = true;
		_excludeFromReflection(address(pair));
    }
	
	function _excludeFromFee(address account, bool value) internal {
        isExcludedFromFee[account] = value;
    }
	
    function _reflectFee(uint256 rFee, uint256 tFee) internal {
        _rTotal = _rTotal.sub(rFee);
        _tFeeTotal = _tFeeTotal.add(tFee);
    }
	
	function _contractFee(uint256 tContract) internal {
        uint256 currentRate =  _getRate();
        uint256 rContract = tContract.mul(currentRate);
        rOwned[address(this)] = rOwned[address(this)].add(rContract);
        if(isExcludedFromReflection[address(this)])
            tOwned[address(this)] = tOwned[address(this)].add(tContract);
    }
	
    function _getValues(uint256 tAmount) internal view returns (uint256, uint256, uint256, uint256, uint256, uint256) {
        (uint256 tTransferAmount, uint256 tFee, uint256 tContract) = _getTValues(tAmount);
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee) = _getRValues(tAmount, tFee, tContract, _getRate());
        return (rAmount, rTransferAmount, rFee, tTransferAmount, tFee, tContract);
    }
	
    function _getTValues(uint256 tAmount) internal view returns (uint256, uint256, uint256) {
		uint256 tFee = calculateReflectionFee(tAmount);
        uint256 tContract = calculateContractFee(tAmount);
		
		uint256 tTransferAmount = tAmount.sub(tFee).sub(tContract);
        return (tTransferAmount, tFee, tContract);
    }
	
    function _getRValues(uint256 tAmount, uint256 tFee, uint256 tContract, uint256 currentRate) internal pure returns (uint256, uint256, uint256) {
        uint256 rAmount = tAmount.mul(currentRate);
        uint256 rFee = tFee.mul(currentRate);
        uint256 rContract = tContract.mul(currentRate);
		
		uint256 rTransferAmount = rAmount.sub(rFee).sub(rContract);
        return (rAmount, rTransferAmount, rFee);
    }

    function _getRate() internal view returns(uint256) {
        (uint256 rSupply, uint256 tSupply) = _getCurrentSupply();
        return rSupply.div(tSupply);
    }
	
    function _getCurrentSupply() internal view returns(uint256, uint256) {
        uint256 rSupply = _rTotal;
        uint256 tSupply = _tTotal;      
        for (uint256 i = 0; i < _excluded.length; i++) {
            if (rOwned[_excluded[i]] > rSupply || tOwned[_excluded[i]] > tSupply) return (_rTotal, _tTotal);
            rSupply = rSupply.sub(rOwned[_excluded[i]]);
            tSupply = tSupply.sub(tOwned[_excluded[i]]);
        }
        if (rSupply < _rTotal.div(_tTotal)) return (_rTotal, _tTotal);
        return (rSupply, tSupply);
    }
    
    function calculateReflectionFee(uint256 _amount) internal view returns (uint256) {
        return _amount.mul(_reflectionFee).div(10000);
    }
	
    function calculateContractFee(uint256 _amount) internal view returns (uint256) {
        return _amount.mul((_buyBurnFee + _pTGCBuyBurnFee + _LPProviderFee)).div(10000);
    }
	
    function removeAllFee() internal {
	   _reflectionFee = 0;
	   _buyBurnFee = 0;
	   _pTGCBuyBurnFee = 0;
	   _LPProviderFee = 0;
    }
	
    function restoreAllFee() internal {
	   _reflectionFee = reflectionFee;
	   _buyBurnFee = buyBurnFee;
	   _pTGCBuyBurnFee = pTGCBuyBurnFee;
	   _LPProviderFee = LPProviderFee;
    }
	
    function _transfer(address from, address to, uint256 amount) internal override {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");
		require(balanceOf(from) >= amount, "transfer amount exceeds balance");
		
        uint256 contractTokenBalance = balanceOf(address(this));
		bool canSwap = contractTokenBalance >= swapThreshold;
		
        if(canSwap && !swapping && isliquidityPair[to] && from != address(this)) 
		{
			swapping = true;
			swapTokensForPLS(swapThreshold);
			uint256 PLSBalance = address(this).balance;
			uint256 allFee = buyBurnFee.add(pTGCBuyBurnFee).add(LPProviderFee);
			
			uint256 buyBurnPart = PLSBalance.mul(buyBurnFee).div(allFee);
			uint256 pTGCBuyBurnPart = PLSBalance.mul(pTGCBuyBurnFee).div(allFee);
			uint256 LPProviderPart = PLSBalance.sub(buyBurnPart).sub(pTGCBuyBurnPart);
			
			if(buyBurnPart > 0)
			{
			    buybackBurnUFO(buyBurnPart);
			}
			if(pTGCBuyBurnPart > 0) 
			{
			    buybackBurnpTGC(buyBurnPart);
			}
			if(LPProviderPart > 0) 
			{
			   (bool success, ) = address(LPStaking).call{value: LPProviderPart}("");
			   require(success, "Failed to send PLS on staking address");
			   LPStaking.updatePool(LPProviderPart);
			}
			swapping = false;
        }
		
        bool takeFee = true;
        if(isExcludedFromFee[from] || isExcludedFromFee[to]) 
		{
           takeFee = false;
        }
        _tokenTransfer(from, to, amount, takeFee);
		try LPStaking.process(processGas) {} catch {}
    }
	
    function _tokenTransfer(address sender, address recipient, uint256 amount, bool takeFee) internal {
	    totalSend[sender] += amount;
		if(!takeFee)
		{
		   removeAllFee();
		}
		
		uint256 _totalFee = _reflectionFee + _buyBurnFee + _pTGCBuyBurnFee + _LPProviderFee;
		if(_totalFee > 0)
		{
		    uint256 _feeAmount = amount.mul(_totalFee).div(10000);
		    totalReceived[recipient] += amount.sub(_feeAmount);
		}
		else
		{
		    totalReceived[recipient] += amount;
		}
        if (isExcludedFromReflection[sender] && !isExcludedFromReflection[recipient]) 
		{
            _transferFromExcluded(sender, recipient, amount);
        } 
		else if (!isExcludedFromReflection[sender] && isExcludedFromReflection[recipient]) 
		{
            _transferToExcluded(sender, recipient, amount);
        } 
		else if (!isExcludedFromReflection[sender] && !isExcludedFromReflection[recipient]) 
		{
            _transferStandard(sender, recipient, amount);
        } 
		else if (isExcludedFromReflection[sender] && isExcludedFromReflection[recipient]) 
		{
            _transferBothExcluded(sender, recipient, amount);
        } 
		else 
		{
            _transferStandard(sender, recipient, amount);
        }
		if(!takeFee) 
		{
		   restoreAllFee();
		}
    }
	
    function _transferStandard(address sender, address recipient, uint256 tAmount) internal {
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee, uint256 tContract) = _getValues(tAmount);
        
		rOwned[sender] = rOwned[sender].sub(rAmount);
        rOwned[recipient] = rOwned[recipient].add(rTransferAmount);
		
        _contractFee(tContract);
        _reflectFee(rFee, tFee);
		
		if(tContract > 0)
		{
		   emit Transfer(sender, address(this), tContract);
		}
        emit Transfer(sender, recipient, tTransferAmount);
    }
	
    function _transferToExcluded(address sender, address recipient, uint256 tAmount) internal {
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee, uint256 tContract) = _getValues(tAmount);
        
		rOwned[sender] = rOwned[sender].sub(rAmount);
        tOwned[recipient] = tOwned[recipient].add(tTransferAmount);
        rOwned[recipient] = rOwned[recipient].add(rTransferAmount);  
		
        _contractFee(tContract);
        _reflectFee(rFee, tFee);
		
		if(tContract > 0)
		{
		   emit Transfer(sender, address(this), tContract);
		}
        emit Transfer(sender, recipient, tTransferAmount);
    }

    function _transferFromExcluded(address sender, address recipient, uint256 tAmount) internal {
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee, uint256 tContract) = _getValues(tAmount);
        
		tOwned[sender] = tOwned[sender].sub(tAmount);
        rOwned[sender] = rOwned[sender].sub(rAmount);
        rOwned[recipient] = rOwned[recipient].add(rTransferAmount); 
		
        _contractFee(tContract);
        _reflectFee(rFee, tFee);
		
		if(tContract > 0)
		{
		   emit Transfer(sender, address(this), tContract);
		}
        emit Transfer(sender, recipient, tTransferAmount);
    }
	
	function _transferBothExcluded(address sender, address recipient, uint256 tAmount) internal {
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee, uint256 tContract) = _getValues(tAmount);
		
		tOwned[sender] = tOwned[sender].sub(tAmount);
        rOwned[sender] = rOwned[sender].sub(rAmount);
        tOwned[recipient] = tOwned[recipient].add(tTransferAmount);
        rOwned[recipient] = rOwned[recipient].add(rTransferAmount);   
		
        _contractFee(tContract);
        _reflectFee(rFee, tFee);
		
		if(tContract > 0)
		{
		   emit Transfer(sender, address(this), tContract);
		}
        emit Transfer(sender, recipient, tTransferAmount);
    }
	
	function swapTokensForPLS(uint256 tokenAmount) internal {
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = pulseXRouter.WPLS();
		
        _approve(address(this), address(pulseXRouter), tokenAmount);
        pulseXRouter.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0,
            path,
            address(this),
            block.timestamp
        );
    }
	
	function buybackBurnUFO(uint256 PLSAmount) internal {
        address[] memory path = new address[](2);
        path[0] = pulseXRouter.WPLS();
        path[1] = address(this);
		
        pulseXRouter.swapExactETHForTokensSupportingFeeOnTransferTokens{value: PLSAmount}(
            0,
            path,
            address(burnWallet),
            block.timestamp
        );
    }
	
	function buybackBurnpTGC(uint256 PLSAmount) internal {
        address[] memory path = new address[](2);
        path[0] = pulseXRouter.WPLS();
        path[1] = address(pTGC);
		
        pulseXRouter.swapExactETHForTokensSupportingFeeOnTransferTokens{value: PLSAmount}(
            0,
            path,
            address(burnWallet),
            block.timestamp
        );
    }
	
	function addLiquidityETH(uint256 UFOToken) external payable {
	
	    _transfer(address(msg.sender), address(this), UFOToken);
        _approve(address(this), address(pulseXRouter), UFOToken);
		
        (, , uint256 liquidity) = pulseXRouter.addLiquidityETH{value: msg.value}(address(this), UFOToken, 0,  0, address(msg.sender), block.timestamp);
		LPStaking.stake(address(pairs[0]), liquidity, address(msg.sender));
    }
	
	function addLiquidity(address pair, uint256 token0Amount, uint256 token1Amount) external {
	    require(isliquidityPair[pair], "Liquidity pair is not correct");
		
		address token0 = address(PulseXPair(pair).token0());
		address token1 = address(PulseXPair(pair).token1());
		
		uint256 token0Balance = IERC20(token0).balanceOf(address(this));
		uint256 token1Balance = IERC20(token1).balanceOf(address(this));
		
		IERC20(token0).transferFrom(address(msg.sender), address(this), token0Amount);
		IERC20(token1).transferFrom(address(msg.sender), address(this), token1Amount);
		
		uint256 token0NewBalance = (IERC20(token0).balanceOf(address(this))) - token0Balance;
		uint256 token1NewBalance = (IERC20(token1).balanceOf(address(this))) - token1Balance;
		
		IERC20(token0).approve(address(pulseXRouter), token0NewBalance);
		IERC20(token1).approve(address(pulseXRouter), token1NewBalance);
		
		(, , uint256 liquidity) = pulseXRouter.addLiquidity(address(token0), address(token1), token0NewBalance, token1NewBalance, 0, 0, address(msg.sender), block.timestamp);
	    
		LPStaking.stake(address(pair), liquidity, address(msg.sender));
    }
	
	function removeLiquidity(address pair, uint256 liquidity) external {
	    require(isliquidityPair[pair], "Liquidity pair is not correct");
		
		if(isExcludedFromFee[address(msg.sender)])
		{
		   address token0 = address(PulseXPair(pair).token0());
		   address token1 = address(PulseXPair(pair).token1());
		   
		   IERC20(pair).transferFrom(address(msg.sender), address(this), liquidity);
		   IERC20(pair).approve(address(pulseXRouter), liquidity);
		   
		   pulseXRouter.removeLiquidity(
				address(token0),
				address(token1),
				liquidity,
				0,
				0,
				address(msg.sender),
				block.timestamp
		   );
		}
		else
		{
		    address token0 = address(PulseXPair(pair).token0());
			address token1 = address(PulseXPair(pair).token1());
			
			IERC20(pair).transferFrom(address(msg.sender), address(this), liquidity);
			IERC20(pair).approve(address(pulseXRouter), liquidity);
			
			isExcludedFromFee[address(msg.sender)] = true;
			
			pulseXRouter.removeLiquidity(
				address(token0),
				address(token1),
				liquidity,
				0,
				0,
				address(msg.sender),
				block.timestamp
		   );
		   
		   isExcludedFromFee[address(msg.sender)] = false;
		}
    }
	
	function removeLiquidityETH(address pair, uint256 liquidity) external {
	    require(isliquidityPair[pair], "Liquidity pair is not correct");
		
		if(isExcludedFromFee[address(msg.sender)])
		{
		    IERC20(pair).transferFrom(address(msg.sender), address(this), liquidity);
		    IERC20(pair).approve(address(pulseXRouter), liquidity);
		   
		    pulseXRouter.removeLiquidityETHSupportingFeeOnTransferTokens(
				address(this),
				liquidity,
				0,
				0,
				address(msg.sender),
				block.timestamp
		    );
		}
		else
		{
		    isExcludedFromFee[address(msg.sender)] = true;
			
		    IERC20(pair).transferFrom(address(msg.sender), address(this), liquidity);
			IERC20(pair).approve(address(pulseXRouter), liquidity);
			
			pulseXRouter.removeLiquidityETHSupportingFeeOnTransferTokens(
				address(this),
				liquidity,
				0,
				0,
				address(msg.sender),
				block.timestamp
		   );
		   
		   isExcludedFromFee[address(msg.sender)] = false;
		}
    }
	
	function updateDistributorGas(uint256 gas) external onlyOwner {
       require(gas < 750000, "Gas is greater than limit");
	   
       processGas = gas;
	   emit ProcessGasUpdated(gas);
    }
	
	function updatedSwapThreshold(uint256 amount) external onlyOwner {
  	    require(amount <= totalSupply(), "Amount cannot be over the total supply.");
		require(amount >= 1000 * (10 ** 18), "Minimum `1000` token per swap required");
		
		swapThreshold = amount;
		emit SwapThresholdUpdated(amount);
  	}
	
	function excludeFromReflection(address account) public onlyOwner() {
       require(!isExcludedFromReflection[account], "Account is already excluded");
	   
	   _excludeFromReflection(account);
	   emit AccountExcludeFromReflection(account);
    }
	
    function includeInReflection(address account) external onlyOwner() {
        require(isExcludedFromReflection[account], "Account is already included");
        for (uint256 i = 0; i < _excluded.length; i++) {
            if (_excluded[i] == account) {
                _excluded[i] = _excluded[_excluded.length - 1];
                tOwned[account] = 0;
                isExcludedFromReflection[account] = false;
                _excluded.pop();
                break;
            }
        }
		emit AccountIncludeInReflection(account);
    }
	
	function excludeFromFee(address account, bool status) external onlyOwner {
        require(account != address(0), "Wallet address is not correct");
		
		_excludeFromFee(account, status);
		emit AccountExcludeFromFee(account, status);
    }
	
	function setLPStakingAddress(IStaking newAddress) external onlyOwner {
		require(address(LPStaking) == address(0), "Staking contract already set");
		
	    LPStaking = IStaking(newAddress);
	    emit LPStakingAddressAdded(address(newAddress));
    }
}
        

Context.sol

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }
	
    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}
          

ERC20.sol

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC20.sol";
import "./IERC20Metadata.sol";
import "./Context.sol";

/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * We have followed general OpenZeppelin Contracts guidelines: functions revert
 * instead returning `false` on failure. This behavior is nonetheless
 * conventional and does not conflict with the expectations of ERC20
 * applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;

    mapping(address => mapping(address => uint256)) private _allowances;

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * The default value of {decimals} is 18. To select a different value for
     * {decimals} you should overload it.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev Returns the name of the token.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5.05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the value {ERC20} uses, unless this function is
     * overridden;
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view virtual override returns (uint8) {
        return 18;
    }

    /**
     * @dev See {IERC20-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view virtual override returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address to, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _transfer(owner, to, amount);
        return true;
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on
     * `transferFrom`. This is semantically equivalent to an infinite approval.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * NOTE: Does not update the allowance if the current allowance
     * is the maximum `uint256`.
     *
     * Requirements:
     *
     * - `from` and `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public virtual override returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, amount);
        _transfer(from, to, amount);
        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, allowance(owner, spender) + addedValue);
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        address owner = _msgSender();
        uint256 currentAllowance = allowance(owner, spender);
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(owner, spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    /**
     * @dev Moves `amount` of tokens from `from` to `to`.
     *
     * This internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     */
    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(from, to, amount);

        uint256 fromBalance = _balances[from];
        require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[from] = fromBalance - amount;
        }
        _balances[to] += amount;

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _beforeTokenTransfer(address(0), account, amount);

        _totalSupply += amount;
        _balances[account] += amount;
        emit Transfer(address(0), account, amount);

        _afterTokenTransfer(address(0), account, amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

        _beforeTokenTransfer(account, address(0), amount);

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
        }
        _totalSupply -= amount;

        emit Transfer(account, address(0), amount);

        _afterTokenTransfer(account, address(0), amount);
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    /**
     * @dev Updates `owner` s allowance for `spender` based on spent `amount`.
     *
     * Does not update the allowance amount in case of infinite allowance.
     * Revert if not enough allowance is available.
     *
     * Might emit an {Approval} event.
     */
    function _spendAllowance(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance != type(uint256).max) {
            require(currentAllowance >= amount, "ERC20: insufficient allowance");
            unchecked {
                _approve(owner, spender, currentAllowance - amount);
            }
        }
    }

    /**
     * @dev Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be transferred to `to`.
     * - when `from` is zero, `amount` tokens will be minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * has been transferred to `to`.
     * - when `from` is zero, `amount` tokens have been minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens have been burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}
}
          

IERC20.sol

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);

    /**
     * @dev Returns the 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 `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, 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 `from` to `to` 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 from,
        address to,
        uint256 amount
    ) external returns (bool);
}
          

IERC20Metadata.sol

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC20.sol";

/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 *
 * _Available since v4.1._
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the symbol of the token.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}
          

IPulseX.sol

// SPDX-License-Identifier: MIT

pragma solidity 0.8.2;

interface IPulseXFactory {
   function createPair(address tokenA, address tokenB) external returns (address pair);
}

interface IPulseXRouter {
   function factory() external pure returns (address);
   function WPLS() external pure returns (address);
   function addLiquidityETH(address token, uint amountTokenDesired, uint amountTokenMin, uint amountETHMin, address to, uint deadline) external payable returns (uint amountToken, uint amountETH, uint liquidity);
   function addLiquidity(address tokenA, address tokenB, uint amountADesired, uint amountBDesired, uint amountAMin, uint amountBMin, address to, uint deadline) external returns (uint amountA, uint amountB, uint liquidity);
   function removeLiquidityETHSupportingFeeOnTransferTokens(address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to,uint deadline) external returns (uint amountETH);
   function removeLiquidity(address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline) external returns (uint amountA, uint amountB);
   function swapExactTokensForETHSupportingFeeOnTransferTokens(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external;
   function swapExactETHForTokensSupportingFeeOnTransferTokens(uint amountOutMin, address[] calldata path, address to, uint deadline) external payable;
}

interface PulseXPair {
   function token0() external pure returns (address);
   function token1() external pure returns (address);
}
          

Ownable.sol

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./Context.sol";

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}
          

SafeMath.sol

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @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 a - b;
    }

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

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

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

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * 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) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}
          

Contract ABI

[{"type":"constructor","stateMutability":"nonpayable","inputs":[{"type":"address","name":"owner","internalType":"address"}]},{"type":"event","name":"AccountExcludeFromFee","inputs":[{"type":"address","name":"account","internalType":"address","indexed":false},{"type":"bool","name":"status","internalType":"bool","indexed":false}],"anonymous":false},{"type":"event","name":"AccountExcludeFromReflection","inputs":[{"type":"address","name":"account","internalType":"address","indexed":false}],"anonymous":false},{"type":"event","name":"AccountIncludeInReflection","inputs":[{"type":"address","name":"account","internalType":"address","indexed":false}],"anonymous":false},{"type":"event","name":"Approval","inputs":[{"type":"address","name":"owner","internalType":"address","indexed":true},{"type":"address","name":"spender","internalType":"address","indexed":true},{"type":"uint256","name":"value","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"LPStakingAddressAdded","inputs":[{"type":"address","name":"newAddress","internalType":"address","indexed":false}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"type":"address","name":"previousOwner","internalType":"address","indexed":true},{"type":"address","name":"newOwner","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"ProcessGasUpdated","inputs":[{"type":"uint256","name":"newGas","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"SwapThresholdUpdated","inputs":[{"type":"uint256","name":"amount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"Transfer","inputs":[{"type":"address","name":"from","internalType":"address","indexed":true},{"type":"address","name":"to","internalType":"address","indexed":true},{"type":"uint256","name":"value","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"LPProviderFee","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IStaking"}],"name":"LPStaking","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"addLiquidity","inputs":[{"type":"address","name":"pair","internalType":"address"},{"type":"uint256","name":"token0Amount","internalType":"uint256"},{"type":"uint256","name":"token1Amount","internalType":"uint256"}]},{"type":"function","stateMutability":"payable","outputs":[],"name":"addLiquidityETH","inputs":[{"type":"uint256","name":"UFOToken","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"allowance","inputs":[{"type":"address","name":"owner","internalType":"address"},{"type":"address","name":"spender","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"approve","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"balanceOf","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"buyBurnFee","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint8","name":"","internalType":"uint8"}],"name":"decimals","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"decreaseAllowance","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"subtractedValue","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"excludeFromFee","inputs":[{"type":"address","name":"account","internalType":"address"},{"type":"bool","name":"status","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"excludeFromReflection","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"includeInReflection","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"increaseAllowance","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"addedValue","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isExcludedFromFee","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isExcludedFromReflection","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isExcludedFromReward","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isliquidityPair","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"name","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"pTGCBuyBurnFee","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"pairs","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"processGas","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IPulseXRouter"}],"name":"pulseXRouter","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"rOwned","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"reflectionFee","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"removeLiquidity","inputs":[{"type":"address","name":"pair","internalType":"address"},{"type":"uint256","name":"liquidity","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"removeLiquidityETH","inputs":[{"type":"address","name":"pair","internalType":"address"},{"type":"uint256","name":"liquidity","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"renounceOwnership","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setLPStakingAddress","inputs":[{"type":"address","name":"newAddress","internalType":"contract IStaking"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"swapThreshold","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":"tOwned","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"tokenFromReflection","inputs":[{"type":"uint256","name":"rAmount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalReceived","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalSend","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"pure","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":"to","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"transferFrom","inputs":[{"type":"address","name":"from","internalType":"address"},{"type":"address","name":"to","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferOwnership","inputs":[{"type":"address","name":"newOwner","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"updateDistributorGas","inputs":[{"type":"uint256","name":"gas","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"updatedSwapThreshold","inputs":[{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"receive","stateMutability":"payable"}]
              

Contract Creation Code

Verify & Publish
0x60806040526200001f6c0c9f2c9c9cd46fa5eeba4c000060001962001293565b6200002d906000196200121e565b600655601480546001600160a01b031990811661036917909155601580549091167394534eeee131840b1c0f61847c572228bdfdde931790553480156200007357600080fd5b5060405162004e5f38038062004e5f8339810160408190526200009691620011c3565b6040518060400160405280600381526020016255464f60e81b8152506040518060400160405280600381526020016255464f60e81b815250620000e8620000e262000cce60201b60201c565b62000cd2565b8151620000fd9060049060208501906200111d565b508051620001139060059060208401906200111d565b5050506001600160a01b038116620001615760405162461bcd60e51b815260206004820152600c60248201526b5a65726f206164647265737360a01b60448201526064015b60405180910390fd5b6006546001600160a01b0380831660009081526019602090815260409182902093909355601280546001600160a01b03191673165c3410fc91ef562c50559f7d2289febed552d91790819055815163c45a015560e01b81529151601694919093169263c45a0155926004808201939291829003018186803b158015620001e657600080fd5b505afa158015620001fb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002219190620011c3565b6040516364e329cb60e11b815230600482015273a1077a294dde1b09bb078844df40758a5d0f9a2760248201526001600160a01b03919091169063c9c6539690604401602060405180830381600087803b1580156200027f57600080fd5b505af115801562000294573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002ba9190620011c3565b815460018101835560009283526020928390200180546001600160a01b0319166001600160a01b039283161790556012546040805163c45a015560e01b81529051601694929093169263c45a015592600480840193919291829003018186803b1580156200032757600080fd5b505afa1580156200033c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003629190620011c3565b6040516364e329cb60e11b81523060048201527394534eeee131840b1c0f61847c572228bdfdde9360248201526001600160a01b03919091169063c9c6539690604401602060405180830381600087803b158015620003c057600080fd5b505af1158015620003d5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003fb9190620011c3565b815460018101835560009283526020928390200180546001600160a01b0319166001600160a01b039283161790556012546040805163c45a015560e01b81529051601694929093169263c45a015592600480840193919291829003018186803b1580156200046857600080fd5b505afa1580156200047d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620004a39190620011c3565b6040516364e329cb60e11b8152306004820152732fa878ab3f87cc1c9737fc071108f904c0b0c95d60248201526001600160a01b03919091169063c9c6539690604401602060405180830381600087803b1580156200050157600080fd5b505af115801562000516573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200053c9190620011c3565b815460018101835560009283526020928390200180546001600160a01b0319166001600160a01b039283161790556012546040805163c45a015560e01b81529051601694929093169263c45a015592600480840193919291829003018186803b158015620005a957600080fd5b505afa158015620005be573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620005e49190620011c3565b6040516364e329cb60e11b81523060048201527395b303987a60c71504d99aa1b13b4da07b0790ab60248201526001600160a01b03919091169063c9c6539690604401602060405180830381600087803b1580156200064257600080fd5b505af115801562000657573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200067d9190620011c3565b815460018101835560009283526020928390200180546001600160a01b0319166001600160a01b039283161790556012546040805163c45a015560e01b81529051601694929093169263c45a015592600480840193919291829003018186803b158015620006ea57600080fd5b505afa158015620006ff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620007259190620011c3565b6040516364e329cb60e11b8152306004820152732b591e99afe9f32eaa6214f7b7629768c40eeb3960248201526001600160a01b03919091169063c9c6539690604401602060405180830381600087803b1580156200078357600080fd5b505af115801562000798573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620007be9190620011c3565b815460018101835560009283526020928390200180546001600160a01b0319166001600160a01b039283161790556012546040805163c45a015560e01b81529051601694929093169263c45a015592600480840193919291829003018186803b1580156200082b57600080fd5b505afa15801562000840573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620008669190620011c3565b6040516364e329cb60e11b81523060048201527357fde0a71132198bbec939b98976993d8d89d22560248201526001600160a01b03919091169063c9c6539690604401602060405180830381600087803b158015620008c457600080fd5b505af1158015620008d9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620008ff9190620011c3565b815460018101835560009283526020928390200180546001600160a01b0319166001600160a01b039283161790556012546040805163c45a015560e01b81529051601694929093169263c45a015592600480840193919291829003018186803b1580156200096c57600080fd5b505afa15801562000981573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620009a79190620011c3565b6040516364e329cb60e11b8152306004820152736b175474e89094c44da98b954eedeac495271d0f60248201526001600160a01b03919091169063c9c6539690604401602060405180830381600087803b15801562000a0557600080fd5b505af115801562000a1a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000a409190620011c3565b81546001810183556000928352602090922090910180546001600160a01b0319166001600160a01b0392831617905560145462000a7e911662000d22565b62000a893062000d22565b62000a948162000d22565b62000ad6601660008154811062000abb57634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b031662000de5565b62000afd601660018154811062000abb57634e487b7160e01b600052603260045260246000fd5b62000b24601660028154811062000abb57634e487b7160e01b600052603260045260246000fd5b62000b4b601660038154811062000abb57634e487b7160e01b600052603260045260246000fd5b62000b72601660048154811062000abb57634e487b7160e01b600052603260045260246000fd5b62000b99601660058154811062000abb57634e487b7160e01b600052603260045260246000fd5b62000bc0601660068154811062000abb57634e487b7160e01b600052603260045260246000fd5b6001600160a01b038181166000818152601d602090815260408083208054600160ff1991821681179092553085528285208054821683179055858552601f8452828520805482168317905560145490961684528184208054909616179094556a52b7d2cee7561f3c9c0000601055606460088190556009819055600a5561012c600b556203d090601155918152601c90915290812080546c0c9f2c9c9cd46fa5eeba4c0000929062000c74908490620011ec565b90915550506040516c0c9f2c9c9cd46fa5eeba4c000081526001600160a01b038216906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a350620012d6565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b0381166000908152601960205260409020541562000d7f576001600160a01b03811660009081526019602052604090205462000d659062000e15565b6001600160a01b0382166000908152601a60205260409020555b6001600160a01b03166000818152601e60205260408120805460ff191660019081179091556018805491820181559091527fb13d2d76d1f4b7be834882e410b3e3a8afaf69f83600ae24db354391d2378d2e0180546001600160a01b0319169091179055565b6001600160a01b03811660009081526020805260409020805460ff1916600117905562000e128162000d22565b50565b600060065482111562000e7e5760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b606482015260840162000158565b600062000e8a62000ead565b905062000ea6818462000ee060201b6200223e1790919060201c565b9392505050565b6000808062000ebb62000eee565b9150915062000ed9818362000ee060201b6200223e1790919060201c565b9250505090565b600062000ea6828462001207565b60065460009081906c0c9f2c9c9cd46fa5eeba4c0000825b601854811015620010b65782601960006018848154811062000f3857634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b03168352820192909252604001902054118062000fb3575081601a60006018848154811062000f8c57634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b1562000fd7576006546c0c9f2c9c9cd46fa5eeba4c0000945094505050506200110b565b6200103a60196000601884815481106200100157634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b031683528281019390935260409091019020548591620022516200110f821b17901c565b92506200109f601a6000601884815481106200106657634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b031683528281019390935260409091019020548491620022516200110f821b17901c565b915080620010ad8162001275565b91505062000f06565b50620010e06c0c9f2c9c9cd46fa5eeba4c000060065462000ee060201b6200223e1790919060201c565b82101562001105576006546c0c9f2c9c9cd46fa5eeba4c00009350935050506200110b565b90925090505b9091565b600062000ea682846200121e565b8280546200112b9062001238565b90600052602060002090601f0160209004810192826200114f57600085556200119a565b82601f106200116a57805160ff19168380011785556200119a565b828001600101855582156200119a579182015b828111156200119a5782518255916020019190600101906200117d565b50620011a8929150620011ac565b5090565b5b80821115620011a85760008155600101620011ad565b600060208284031215620011d5578081fd5b81516001600160a01b038116811462000ea6578182fd5b60008219821115620012025762001202620012aa565b500190565b600082620012195762001219620012c0565b500490565b600082821015620012335762001233620012aa565b500390565b6002810460018216806200124d57607f821691505b602082108114156200126f57634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156200128c576200128c620012aa565b5060010190565b600082620012a557620012a5620012c0565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b613b7980620012e66000396000f3fe6080604052600436106102555760003560e01c806388a06f8b11610139578063b91ac788116100b6578063d4e2799a1161007a578063d4e2799a14610725578063dd62ed3e14610745578063df8408fe14610765578063e71dc3f514610785578063efa6c1af1461079b578063f2fde38b146107ca5761025c565b8063b91ac7881461068f578063bc8d63cb146106af578063c3f1710e146106c5578063c64a041b146106e5578063d06d04cc146107125761025c565b8063a201ccf6116100fd578063a201ccf6146105ef578063a457c2d71461060f578063a4731cdc1461062f578063a9059cbb1461064f578063aec9b6f41461066f5761025c565b806388a06f8b1461051e57806388f820201461054b5780638da5cb5b1461057b57806395d89b41146105ad578063a08dbe7b146105c25761025c565b8063313ce567116101d257806355776b771161019657806355776b771461046d57806370a082311461048d578063715018a6146104ad57806377e4fb6b146104c25780637d459db3146104d857806383ad7994146105085761025c565b8063313ce567146103b457806336d4d031146103d057806339509351146103f05780634df9cfb3146104105780635342acb41461043d5761025c565b806318160ddd1161021957806318160ddd1461031e57806323b872dd1461033e57806327334a081461035e57806327807bf91461037e5780632d838119146103945761025c565b80630445b6671461026157806305f82a451461028a57806306fdde03146102ac578063095ea7b3146102ce578063129bd67a146102fe5761025c565b3661025c57005b600080fd5b34801561026d57600080fd5b5061027760105481565b6040519081526020015b60405180910390f35b34801561029657600080fd5b506102aa6102a5366004613691565b6107ea565b005b3480156102b857600080fd5b506102c16109fa565b6040516102819190613980565b3480156102da57600080fd5b506102ee6102e936600461376e565b610a8c565b6040519015158152602001610281565b34801561030a57600080fd5b506102aa61031936600461376e565b610aa4565b34801561032a57600080fd5b506c0c9f2c9c9cd46fa5eeba4c0000610277565b34801561034a57600080fd5b506102ee610359366004613701565b610e5d565b34801561036a57600080fd5b506102aa610379366004613691565b610e81565b34801561038a57600080fd5b50610277600b5481565b3480156103a057600080fd5b506102776103af3660046137e9565b610f34565b3480156103c057600080fd5b5060405160128152602001610281565b3480156103dc57600080fd5b506102aa6103eb366004613691565b610fba565b3480156103fc57600080fd5b506102ee61040b36600461376e565b611069565b34801561041c57600080fd5b5061027761042b366004613691565b601c6020526000908152604090205481565b34801561044957600080fd5b506102ee610458366004613691565b601d6020526000908152604090205460ff1681565b34801561047957600080fd5b506102aa610488366004613799565b61108b565b34801561049957600080fd5b506102776104a8366004613691565b6116f8565b3480156104b957600080fd5b506102aa611760565b3480156104ce57600080fd5b5061027760115481565b3480156104e457600080fd5b506102ee6104f3366004613691565b601e6020526000908152604090205460ff1681565b34801561051457600080fd5b5061027760085481565b34801561052a57600080fd5b50610277610539366004613691565b60196020526000908152604090205481565b34801561055757600080fd5b506102ee610566366004613691565b601f6020526000908152604090205460ff1681565b34801561058757600080fd5b506000546001600160a01b03165b6040516001600160a01b039091168152602001610281565b3480156105b957600080fd5b506102c1611774565b3480156105ce57600080fd5b506102776105dd366004613691565b601a6020526000908152604090205481565b3480156105fb57600080fd5b506102aa61060a36600461376e565b611783565b34801561061b57600080fd5b506102ee61062a36600461376e565b611d18565b34801561063b57600080fd5b50601354610595906001600160a01b031681565b34801561065b57600080fd5b506102ee61066a36600461376e565b611d93565b34801561067b57600080fd5b50601254610595906001600160a01b031681565b34801561069b57600080fd5b506105956106aa3660046137e9565b611da1565b3480156106bb57600080fd5b50610277600a5481565b3480156106d157600080fd5b506102aa6106e03660046137e9565b611dcb565b3480156106f157600080fd5b50610277610700366004613691565b601b6020526000908152604090205481565b6102aa6107203660046137e9565b611edd565b34801561073157600080fd5b506102aa6107403660046137e9565b612042565b34801561075157600080fd5b506102776107603660046136c9565b6120d1565b34801561077157600080fd5b506102aa610780366004613741565b6120fc565b34801561079157600080fd5b5061027760095481565b3480156107a757600080fd5b506102ee6107b6366004613691565b602080526000908152604090205460ff1681565b3480156107d657600080fd5b506102aa6107e5366004613691565b6121c5565b6107f261225d565b6001600160a01b0381166000908152601e602052604090205460ff1661085f5760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c726561647920696e636c75646564000000000060448201526064015b60405180910390fd5b60005b6018548110156109b957816001600160a01b03166018828154811061089757634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b031614156109a757601880546108c290600190613a9d565b815481106108e057634e487b7160e01b600052603260045260246000fd5b600091825260209091200154601880546001600160a01b03909216918390811061091a57634e487b7160e01b600052603260045260246000fd5b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559184168152601a82526040808220829055601e90925220805460ff19169055601880548061098057634e487b7160e01b600052603160045260246000fd5b600082815260209020810160001990810180546001600160a01b03191690550190556109b9565b806109b181613aef565b915050610862565b506040516001600160a01b03821681527fefa3daad9a570f54e0304c9dc3e9dbea52c6f0ae2b7645c70098131a1ef20ed2906020015b60405180910390a150565b606060048054610a0990613ab4565b80601f0160208091040260200160405190810160405280929190818152602001828054610a3590613ab4565b8015610a825780601f10610a5757610100808354040283529160200191610a82565b820191906000526020600020905b815481529060010190602001808311610a6557829003601f168201915b5050505050905090565b600033610a9a8185856122b7565b5060019392505050565b6001600160a01b038216600090815260208052604090205460ff16610adb5760405162461bcd60e51b8152600401610856906139d3565b336000908152601d602052604090205460ff1615610c90576040516323b872dd60e01b81526001600160a01b038316906323b872dd90610b23903390309086906004016138ac565b602060405180830381600087803b158015610b3d57600080fd5b505af1158015610b51573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b7591906137cd565b5060125460405163095ea7b360e01b81526001600160a01b039182166004820152602481018390529083169063095ea7b390604401602060405180830381600087803b158015610bc457600080fd5b505af1158015610bd8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bfc91906137cd565b5060125460405163af2979eb60e01b81526001600160a01b039091169063af2979eb90610c389030908590600090819033904290600401613910565b602060405180830381600087803b158015610c5257600080fd5b505af1158015610c66573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c8a9190613801565b50610e59565b336000818152601d602052604090819020805460ff19166001179055516323b872dd60e01b81526001600160a01b038416916323b872dd91610cd99190309086906004016138ac565b602060405180830381600087803b158015610cf357600080fd5b505af1158015610d07573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d2b91906137cd565b5060125460405163095ea7b360e01b81526001600160a01b039182166004820152602481018390529083169063095ea7b390604401602060405180830381600087803b158015610d7a57600080fd5b505af1158015610d8e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610db291906137cd565b5060125460405163af2979eb60e01b81526001600160a01b039091169063af2979eb90610dee9030908590600090819033904290600401613910565b602060405180830381600087803b158015610e0857600080fd5b505af1158015610e1c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e409190613801565b50336000908152601d60205260409020805460ff191690555b5050565b600033610e6b8582856123db565b610e76858585612455565b506001949350505050565b610e8961225d565b6001600160a01b0381166000908152601e602052604090205460ff1615610ef25760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c7564656400000000006044820152606401610856565b610efb81612871565b6040516001600160a01b03821681527f31cf1095d6c1ea7eb1fa26ab1f742053836510fb0f0a5a30d613a3d88bbed876906020016109ef565b6000600654821115610f9b5760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b6064820152608401610856565b6000610fa5612931565b9050610fb1838261223e565b9150505b919050565b610fc261225d565b6013546001600160a01b03161561101b5760405162461bcd60e51b815260206004820152601c60248201527f5374616b696e6720636f6e747261637420616c726561647920736574000000006044820152606401610856565b601380546001600160a01b0319166001600160a01b0383169081179091556040519081527f749d41f0ee5297c1358d920a96cca563eb514cac372accb8d8e4cf8e642a0778906020016109ef565b600033610a9a81858561107c83836120d1565b6110869190613a46565b6122b7565b6001600160a01b038316600090815260208052604090205460ff166110c25760405162461bcd60e51b8152600401610856906139d3565b6000836001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b1580156110fd57600080fd5b505afa158015611111573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061113591906136ad565b90506000846001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b15801561117257600080fd5b505afa158015611186573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111aa91906136ad565b6040516370a0823160e01b81523060048201529091506000906001600160a01b038416906370a082319060240160206040518083038186803b1580156111ef57600080fd5b505afa158015611203573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112279190613801565b6040516370a0823160e01b81523060048201529091506000906001600160a01b038416906370a082319060240160206040518083038186803b15801561126c57600080fd5b505afa158015611280573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a49190613801565b6040516323b872dd60e01b81529091506001600160a01b038516906323b872dd906112d790339030908b906004016138ac565b602060405180830381600087803b1580156112f157600080fd5b505af1158015611305573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061132991906137cd565b506040516323b872dd60e01b81526001600160a01b038416906323b872dd9061135a90339030908a906004016138ac565b602060405180830381600087803b15801561137457600080fd5b505af1158015611388573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113ac91906137cd565b506040516370a0823160e01b815230600482015260009083906001600160a01b038716906370a082319060240160206040518083038186803b1580156113f157600080fd5b505afa158015611405573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114299190613801565b6114339190613a9d565b6040516370a0823160e01b815230600482015290915060009083906001600160a01b038716906370a082319060240160206040518083038186803b15801561147a57600080fd5b505afa15801561148e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114b29190613801565b6114bc9190613a9d565b60125460405163095ea7b360e01b81526001600160a01b0391821660048201526024810185905291925087169063095ea7b390604401602060405180830381600087803b15801561150c57600080fd5b505af1158015611520573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061154491906137cd565b5060125460405163095ea7b360e01b81526001600160a01b039182166004820152602481018390529086169063095ea7b390604401602060405180830381600087803b15801561159357600080fd5b505af11580156115a7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115cb91906137cd565b5060125460405162e8e33760e81b81526001600160a01b0388811660048301528781166024830152604482018590526064820184905260006084830181905260a483018190523360c48401524260e484015292169063e8e337009061010401606060405180830381600087803b15801561164457600080fd5b505af1158015611658573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061167c919061383c565b60135460405163294091cd60e01b81526001600160a01b038f81166004830152602482018490523360448301529295509116925063294091cd9150606401600060405180830381600087803b1580156116d457600080fd5b505af11580156116e8573d6000803e3d6000fd5b5050505050505050505050505050565b6001600160a01b0381166000908152601e602052604081205460ff161561173857506001600160a01b0381166000908152601a6020526040902054610fb5565b6001600160a01b03821660009081526019602052604090205461175a90610f34565b92915050565b61176861225d565b6117726000612954565b565b606060058054610a0990613ab4565b6001600160a01b038216600090815260208052604090205460ff166117ba5760405162461bcd60e51b8152600401610856906139d3565b336000908152601d602052604090205460ff1615611a5e576000826001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b15801561180d57600080fd5b505afa158015611821573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061184591906136ad565b90506000836001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b15801561188257600080fd5b505afa158015611896573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118ba91906136ad565b6040516323b872dd60e01b81529091506001600160a01b038516906323b872dd906118ed903390309088906004016138ac565b602060405180830381600087803b15801561190757600080fd5b505af115801561191b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061193f91906137cd565b5060125460405163095ea7b360e01b81526001600160a01b039182166004820152602481018590529085169063095ea7b390604401602060405180830381600087803b15801561198e57600080fd5b505af11580156119a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119c691906137cd565b50601254604051635d5155ef60e11b81526001600160a01b039091169063baa2abde90611a04908590859088906000908190339042906004016138d0565b6040805180830381600087803b158015611a1d57600080fd5b505af1158015611a31573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a559190613819565b50505050610e59565b6000826001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b158015611a9957600080fd5b505afa158015611aad573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ad191906136ad565b90506000836001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b158015611b0e57600080fd5b505afa158015611b22573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b4691906136ad565b6040516323b872dd60e01b81529091506001600160a01b038516906323b872dd90611b79903390309088906004016138ac565b602060405180830381600087803b158015611b9357600080fd5b505af1158015611ba7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bcb91906137cd565b5060125460405163095ea7b360e01b81526001600160a01b039182166004820152602481018590529085169063095ea7b390604401602060405180830381600087803b158015611c1a57600080fd5b505af1158015611c2e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c5291906137cd565b50336000818152601d6020526040808220805460ff191660011790556012549051635d5155ef60e11b81526001600160a01b03919091169263baa2abde92611ca892879287928a929091829142906004016138d0565b6040805180830381600087803b158015611cc157600080fd5b505af1158015611cd5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cf99190613819565b5050336000908152601d60205260409020805460ff1916905550505050565b60003381611d2682866120d1565b905083811015611d865760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610856565b610e7682868684036122b7565b600033610a9a818585612455565b60168181548110611db157600080fd5b6000918252602090912001546001600160a01b0316905081565b611dd361225d565b6c0c9f2c9c9cd46fa5eeba4c0000811115611e405760405162461bcd60e51b815260206004820152602760248201527f416d6f756e742063616e6e6f74206265206f7665722074686520746f74616c2060448201526639bab838363c9760c91b6064820152608401610856565b683635c9adc5dea00000811015611ea85760405162461bcd60e51b815260206004820152602660248201527f4d696e696d756d2060313030306020746f6b656e2070657220737761702072656044820152651c5d5a5c995960d21b6064820152608401610856565b60108190556040518181527f18ff2fc8464635e4f668567019152095047e34d7a2ab4b97661ba4dc7fd06476906020016109ef565b611ee8333083612455565b601254611f009030906001600160a01b0316836122b7565b60125460405163f305d71960e01b81526000916001600160a01b03169063f305d719903490611f3d90309087908790819033904290600401613910565b6060604051808303818588803b158015611f5657600080fd5b505af1158015611f6a573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611f8f919061383c565b601354601680549295506001600160a01b03909116935063294091cd925090600090611fcb57634e487b7160e01b600052603260045260246000fd5b60009182526020909120015460405160e083901b6001600160e01b03191681526001600160a01b039091166004820152602481018490523360448201526064015b600060405180830381600087803b15801561202657600080fd5b505af115801561203a573d6000803e3d6000fd5b505050505050565b61204a61225d565b620b71b0811061209c5760405162461bcd60e51b815260206004820152601960248201527f4761732069732067726561746572207468616e206c696d6974000000000000006044820152606401610856565b60118190556040518181527f98fdd0b3c9bfe51a45c9afea7b77ebe06c52550d2783a24ef9c7415bbfcd023d906020016109ef565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b61210461225d565b6001600160a01b03821661215a5760405162461bcd60e51b815260206004820152601d60248201527f57616c6c65742061646472657373206973206e6f7420636f72726563740000006044820152606401610856565b6001600160a01b0382166000908152601d60205260409020805460ff1916821515179055604080516001600160a01b038416815282151560208201527ff1bf6e8d74573725f529c5a07fb53656b9c97a10602a75631f57c1be07769e2b910160405180910390a15050565b6121cd61225d565b6001600160a01b0381166122325760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610856565b61223b81612954565b50565b600061224a8284613a5e565b9392505050565b600061224a8284613a9d565b6000546001600160a01b031633146117725760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610856565b6001600160a01b0383166123195760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610856565b6001600160a01b03821661237a5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610856565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60006123e784846120d1565b9050600019811461244f57818110156124425760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610856565b61244f84848484036122b7565b50505050565b6001600160a01b0383166124b95760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610856565b6001600160a01b03821661251b5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610856565b80612525846116f8565b10156125735760405162461bcd60e51b815260206004820152601f60248201527f7472616e7366657220616d6f756e7420657863656564732062616c616e6365006044820152606401610856565b600061257e306116f8565b60105490915081108015908190612598575060175460ff16155b80156125bb57506001600160a01b038416600090815260208052604090205460ff165b80156125d057506001600160a01b0385163014155b156127ae576017805460ff191660011790556010546125ee906129a4565b600b54600a54600954479260009261260f9261260991612af3565b90612af3565b905060006126328261262c60095486612aff90919063ffffffff16565b9061223e565b9050600061264f8361262c600a5487612aff90919063ffffffff16565b90506000612667826126618786612251565b90612251565b905082156126785761267883612b0b565b81156126875761268783612c8d565b801561279e576013546040516000916001600160a01b03169083908381818185875af1925050503d80600081146126da576040519150601f19603f3d011682016040523d82523d6000602084013e6126df565b606091505b505090508061273e5760405162461bcd60e51b815260206004820152602560248201527f4661696c656420746f2073656e6420504c53206f6e207374616b696e67206164604482015264647265737360d81b6064820152608401610856565b6013546040516328f582d360e11b8152600481018490526001600160a01b03909116906351eb05a690602401600060405180830381600087803b15801561278457600080fd5b505af1158015612798573d6000803e3d6000fd5b50505050505b50506017805460ff191690555050505b6001600160a01b0385166000908152601d602052604090205460019060ff16806127f057506001600160a01b0385166000908152601d602052604090205460ff165b156127f9575060005b61280586868684612d8a565b6013546011546040516001624d3b8760e01b031981526001600160a01b039092169163ffb2c4799161283d9160040190815260200190565b600060405180830381600087803b15801561285757600080fd5b505af1925050508015612868575060015b61203a5761203a565b6001600160a01b038116600090815260196020526040902054156128cb576001600160a01b0381166000908152601960205260409020546128b190610f34565b6001600160a01b0382166000908152601a60205260409020555b6001600160a01b03166000818152601e60205260408120805460ff191660019081179091556018805491820181559091527fb13d2d76d1f4b7be834882e410b3e3a8afaf69f83600ae24db354391d2378d2e0180546001600160a01b0319169091179055565b600080600061293e613007565b909250905061294d828261223e565b9250505090565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60408051600280825260608201835260009260208301908036833701905050905030816000815181106129e757634e487b7160e01b600052603260045260246000fd5b6001600160a01b039283166020918202929092018101919091526012546040805163ef8ef56f60e01b81529051919093169263ef8ef56f926004808301939192829003018186803b158015612a3b57600080fd5b505afa158015612a4f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a7391906136ad565b81600181518110612a9457634e487b7160e01b600052603260045260246000fd5b6001600160a01b039283166020918202929092010152601254612aba91309116846122b7565b60125460405163791ac94760e01b81526001600160a01b039091169063791ac9479061200c908590600090869030904290600401613a0a565b600061224a8284613a46565b600061224a8284613a7e565b60408051600280825260608201835260009260208301908036833750506012546040805163ef8ef56f60e01b815290519394506001600160a01b039091169263ef8ef56f92506004808301926020929190829003018186803b158015612b7057600080fd5b505afa158015612b84573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ba891906136ad565b81600081518110612bc957634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b0316815250503081600181518110612c0b57634e487b7160e01b600052603260045260246000fd5b6001600160a01b03928316602091820292909201015260125460145460405163b6f9de9560e01b81529183169263b6f9de95928692612c5792600092889290911690429060040161394b565b6000604051808303818588803b158015612c7057600080fd5b505af1158015612c84573d6000803e3d6000fd5b50505050505050565b60408051600280825260608201835260009260208301908036833750506012546040805163ef8ef56f60e01b815290519394506001600160a01b039091169263ef8ef56f92506004808301926020929190829003018186803b158015612cf257600080fd5b505afa158015612d06573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d2a91906136ad565b81600081518110612d4b57634e487b7160e01b600052603260045260246000fd5b6001600160a01b039283166020918202929092010152601554825191169082906001908110612c0b57634e487b7160e01b600052603260045260246000fd5b6001600160a01b0384166000908152601b602052604081208054849290612db2908490613a46565b90915550819050612dd657612dd66000600c819055600d819055600e819055600f55565b6000600f54600e54600d54600c54612dee9190613a46565b612df89190613a46565b612e029190613a46565b90508015612e5c576000612e1c61271061262c8685612aff565b9050612e288482612251565b6001600160a01b0386166000908152601c602052604081208054909190612e50908490613a46565b90915550612e8a915050565b6001600160a01b0384166000908152601c602052604081208054859290612e84908490613a46565b90915550505b6001600160a01b0385166000908152601e602052604090205460ff168015612ecb57506001600160a01b0384166000908152601e602052604090205460ff16155b15612ee057612edb8585856131f0565b612fde565b6001600160a01b0385166000908152601e602052604090205460ff16158015612f2157506001600160a01b0384166000908152601e602052604090205460ff165b15612f3157612edb85858561335d565b6001600160a01b0385166000908152601e602052604090205460ff16158015612f7357506001600160a01b0384166000908152601e602052604090205460ff16155b15612f8357612edb858585613406565b6001600160a01b0385166000908152601e602052604090205460ff168015612fc357506001600160a01b0384166000908152601e602052604090205460ff165b15612fd357612edb85858561344a565b612fde858585613406565b8161300057613000600854600c55600954600d55600a54600e55600b54600f55565b5050505050565b60065460009081906c0c9f2c9c9cd46fa5eeba4c0000825b6018548110156131a85782601960006018848154811061304f57634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b0316835282019290925260400190205411806130c8575081601a6000601884815481106130a157634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b156130ea576006546c0c9f2c9c9cd46fa5eeba4c0000945094505050506131ec565b61313e601960006018848154811061311257634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b031683528201929092526040019020548490612251565b9250613194601a60006018848154811061316857634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b031683528201929092526040019020548390612251565b9150806131a081613aef565b91505061301f565b506006546131c3906c0c9f2c9c9cd46fa5eeba4c000061223e565b8210156131e6576006546c0c9f2c9c9cd46fa5eeba4c00009350935050506131ec565b90925090505b9091565b600080600080600080613202876134bd565b6001600160a01b038f166000908152601a6020526040902054959b509399509197509550935091506132349088612251565b6001600160a01b038a166000908152601a60209081526040808320939093556019905220546132639087612251565b6001600160a01b03808b1660009081526019602052604080822093909355908a16815220546132929086612af3565b6001600160a01b0389166000908152601960205260409020556132b48161350c565b6132be8483613595565b80156133055760405181815230906001600160a01b038b16907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35b876001600160a01b0316896001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8560405161334a91815260200190565b60405180910390a3505050505050505050565b60008060008060008061336f876134bd565b6001600160a01b038f16600090815260196020526040902054959b509399509197509550935091506133a19087612251565b6001600160a01b03808b16600090815260196020908152604080832094909455918b168152601a90915220546133d79084612af3565b6001600160a01b0389166000908152601a60209081526040808320939093556019905220546132929086612af3565b600080600080600080613418876134bd565b6001600160a01b038f16600090815260196020526040902054959b509399509197509550935091506132639087612251565b60008060008060008061345c876134bd565b6001600160a01b038f166000908152601a6020526040902054959b5093995091975095509350915061348e9088612251565b6001600160a01b038a166000908152601a60209081526040808320939093556019905220546133a19087612251565b60008060008060008060008060006134d48a6135b9565b92509250925060008060006134f28d86866134ed612931565b6135f5565b919f909e50909c50959a5093985091965092945050505050565b6000613516612931565b905060006135248383612aff565b306000908152601960205260409020549091506135419082612af3565b30600090815260196020908152604080832093909355601e9052205460ff161561359057306000908152601a602052604090205461357f9084612af3565b306000908152601a60205260409020555b505050565b6006546135a29083612251565b6006556007546135b29082612af3565b6007555050565b6000806000806135c885613645565b905060006135d586613662565b905060006135e7826126618986612251565b979296509094509092505050565b60008080806136048886612aff565b905060006136128887612aff565b905060006136208888612aff565b90506000613632826126618686612251565b939b939a50919850919650505050505050565b600061175a61271061262c600c5485612aff90919063ffffffff16565b600061175a61271061262c600f54600e54600d546136809190613a46565b61368a9190613a46565b8590612aff565b6000602082840312156136a2578081fd5b813561224a81613b20565b6000602082840312156136be578081fd5b815161224a81613b20565b600080604083850312156136db578081fd5b82356136e681613b20565b915060208301356136f681613b20565b809150509250929050565b600080600060608486031215613715578081fd5b833561372081613b20565b9250602084013561373081613b20565b929592945050506040919091013590565b60008060408385031215613753578182fd5b823561375e81613b20565b915060208301356136f681613b35565b60008060408385031215613780578182fd5b823561378b81613b20565b946020939093013593505050565b6000806000606084860312156137ad578283fd5b83356137b881613b20565b95602085013595506040909401359392505050565b6000602082840312156137de578081fd5b815161224a81613b35565b6000602082840312156137fa578081fd5b5035919050565b600060208284031215613812578081fd5b5051919050565b6000806040838503121561382b578182fd5b505080516020909101519092909150565b600080600060608486031215613850578283fd5b8351925060208401519150604084015190509250925092565b6000815180845260208085019450808401835b838110156138a15781516001600160a01b03168752958201959082019060010161387c565b509495945050505050565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b039788168152958716602087015260408601949094526060850192909252608084015290921660a082015260c081019190915260e00190565b6001600160a01b039687168152602081019590955260408501939093526060840191909152909216608082015260a081019190915260c00190565b6000858252608060208301526139646080830186613869565b6001600160a01b03949094166040830152506060015292915050565b6000602080835283518082850152825b818110156139ac57858101830151858201604001528201613990565b818111156139bd5783604083870101525b50601f01601f1916929092016040019392505050565b6020808252601d908201527f4c69717569646974792070616972206973206e6f7420636f7272656374000000604082015260600190565b600086825285602083015260a06040830152613a2960a0830186613869565b6001600160a01b0394909416606083015250608001529392505050565b60008219821115613a5957613a59613b0a565b500190565b600082613a7957634e487b7160e01b81526012600452602481fd5b500490565b6000816000190483118215151615613a9857613a98613b0a565b500290565b600082821015613aaf57613aaf613b0a565b500390565b600281046001821680613ac857607f821691505b60208210811415613ae957634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415613b0357613b03613b0a565b5060010190565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b038116811461223b57600080fd5b801515811461223b57600080fdfea2646970667358221220885ce5a24795accc94ae5f1ce43f7bc0f09fa7a84725783ba8eeb53f2848da5264736f6c6343000802003300000000000000000000000080591d1205c483c98af422dc250d4a1a2577c1c1

Deployed ByteCode

0x6080604052600436106102555760003560e01c806388a06f8b11610139578063b91ac788116100b6578063d4e2799a1161007a578063d4e2799a14610725578063dd62ed3e14610745578063df8408fe14610765578063e71dc3f514610785578063efa6c1af1461079b578063f2fde38b146107ca5761025c565b8063b91ac7881461068f578063bc8d63cb146106af578063c3f1710e146106c5578063c64a041b146106e5578063d06d04cc146107125761025c565b8063a201ccf6116100fd578063a201ccf6146105ef578063a457c2d71461060f578063a4731cdc1461062f578063a9059cbb1461064f578063aec9b6f41461066f5761025c565b806388a06f8b1461051e57806388f820201461054b5780638da5cb5b1461057b57806395d89b41146105ad578063a08dbe7b146105c25761025c565b8063313ce567116101d257806355776b771161019657806355776b771461046d57806370a082311461048d578063715018a6146104ad57806377e4fb6b146104c25780637d459db3146104d857806383ad7994146105085761025c565b8063313ce567146103b457806336d4d031146103d057806339509351146103f05780634df9cfb3146104105780635342acb41461043d5761025c565b806318160ddd1161021957806318160ddd1461031e57806323b872dd1461033e57806327334a081461035e57806327807bf91461037e5780632d838119146103945761025c565b80630445b6671461026157806305f82a451461028a57806306fdde03146102ac578063095ea7b3146102ce578063129bd67a146102fe5761025c565b3661025c57005b600080fd5b34801561026d57600080fd5b5061027760105481565b6040519081526020015b60405180910390f35b34801561029657600080fd5b506102aa6102a5366004613691565b6107ea565b005b3480156102b857600080fd5b506102c16109fa565b6040516102819190613980565b3480156102da57600080fd5b506102ee6102e936600461376e565b610a8c565b6040519015158152602001610281565b34801561030a57600080fd5b506102aa61031936600461376e565b610aa4565b34801561032a57600080fd5b506c0c9f2c9c9cd46fa5eeba4c0000610277565b34801561034a57600080fd5b506102ee610359366004613701565b610e5d565b34801561036a57600080fd5b506102aa610379366004613691565b610e81565b34801561038a57600080fd5b50610277600b5481565b3480156103a057600080fd5b506102776103af3660046137e9565b610f34565b3480156103c057600080fd5b5060405160128152602001610281565b3480156103dc57600080fd5b506102aa6103eb366004613691565b610fba565b3480156103fc57600080fd5b506102ee61040b36600461376e565b611069565b34801561041c57600080fd5b5061027761042b366004613691565b601c6020526000908152604090205481565b34801561044957600080fd5b506102ee610458366004613691565b601d6020526000908152604090205460ff1681565b34801561047957600080fd5b506102aa610488366004613799565b61108b565b34801561049957600080fd5b506102776104a8366004613691565b6116f8565b3480156104b957600080fd5b506102aa611760565b3480156104ce57600080fd5b5061027760115481565b3480156104e457600080fd5b506102ee6104f3366004613691565b601e6020526000908152604090205460ff1681565b34801561051457600080fd5b5061027760085481565b34801561052a57600080fd5b50610277610539366004613691565b60196020526000908152604090205481565b34801561055757600080fd5b506102ee610566366004613691565b601f6020526000908152604090205460ff1681565b34801561058757600080fd5b506000546001600160a01b03165b6040516001600160a01b039091168152602001610281565b3480156105b957600080fd5b506102c1611774565b3480156105ce57600080fd5b506102776105dd366004613691565b601a6020526000908152604090205481565b3480156105fb57600080fd5b506102aa61060a36600461376e565b611783565b34801561061b57600080fd5b506102ee61062a36600461376e565b611d18565b34801561063b57600080fd5b50601354610595906001600160a01b031681565b34801561065b57600080fd5b506102ee61066a36600461376e565b611d93565b34801561067b57600080fd5b50601254610595906001600160a01b031681565b34801561069b57600080fd5b506105956106aa3660046137e9565b611da1565b3480156106bb57600080fd5b50610277600a5481565b3480156106d157600080fd5b506102aa6106e03660046137e9565b611dcb565b3480156106f157600080fd5b50610277610700366004613691565b601b6020526000908152604090205481565b6102aa6107203660046137e9565b611edd565b34801561073157600080fd5b506102aa6107403660046137e9565b612042565b34801561075157600080fd5b506102776107603660046136c9565b6120d1565b34801561077157600080fd5b506102aa610780366004613741565b6120fc565b34801561079157600080fd5b5061027760095481565b3480156107a757600080fd5b506102ee6107b6366004613691565b602080526000908152604090205460ff1681565b3480156107d657600080fd5b506102aa6107e5366004613691565b6121c5565b6107f261225d565b6001600160a01b0381166000908152601e602052604090205460ff1661085f5760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c726561647920696e636c75646564000000000060448201526064015b60405180910390fd5b60005b6018548110156109b957816001600160a01b03166018828154811061089757634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b031614156109a757601880546108c290600190613a9d565b815481106108e057634e487b7160e01b600052603260045260246000fd5b600091825260209091200154601880546001600160a01b03909216918390811061091a57634e487b7160e01b600052603260045260246000fd5b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559184168152601a82526040808220829055601e90925220805460ff19169055601880548061098057634e487b7160e01b600052603160045260246000fd5b600082815260209020810160001990810180546001600160a01b03191690550190556109b9565b806109b181613aef565b915050610862565b506040516001600160a01b03821681527fefa3daad9a570f54e0304c9dc3e9dbea52c6f0ae2b7645c70098131a1ef20ed2906020015b60405180910390a150565b606060048054610a0990613ab4565b80601f0160208091040260200160405190810160405280929190818152602001828054610a3590613ab4565b8015610a825780601f10610a5757610100808354040283529160200191610a82565b820191906000526020600020905b815481529060010190602001808311610a6557829003601f168201915b5050505050905090565b600033610a9a8185856122b7565b5060019392505050565b6001600160a01b038216600090815260208052604090205460ff16610adb5760405162461bcd60e51b8152600401610856906139d3565b336000908152601d602052604090205460ff1615610c90576040516323b872dd60e01b81526001600160a01b038316906323b872dd90610b23903390309086906004016138ac565b602060405180830381600087803b158015610b3d57600080fd5b505af1158015610b51573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b7591906137cd565b5060125460405163095ea7b360e01b81526001600160a01b039182166004820152602481018390529083169063095ea7b390604401602060405180830381600087803b158015610bc457600080fd5b505af1158015610bd8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bfc91906137cd565b5060125460405163af2979eb60e01b81526001600160a01b039091169063af2979eb90610c389030908590600090819033904290600401613910565b602060405180830381600087803b158015610c5257600080fd5b505af1158015610c66573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c8a9190613801565b50610e59565b336000818152601d602052604090819020805460ff19166001179055516323b872dd60e01b81526001600160a01b038416916323b872dd91610cd99190309086906004016138ac565b602060405180830381600087803b158015610cf357600080fd5b505af1158015610d07573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d2b91906137cd565b5060125460405163095ea7b360e01b81526001600160a01b039182166004820152602481018390529083169063095ea7b390604401602060405180830381600087803b158015610d7a57600080fd5b505af1158015610d8e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610db291906137cd565b5060125460405163af2979eb60e01b81526001600160a01b039091169063af2979eb90610dee9030908590600090819033904290600401613910565b602060405180830381600087803b158015610e0857600080fd5b505af1158015610e1c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e409190613801565b50336000908152601d60205260409020805460ff191690555b5050565b600033610e6b8582856123db565b610e76858585612455565b506001949350505050565b610e8961225d565b6001600160a01b0381166000908152601e602052604090205460ff1615610ef25760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c7564656400000000006044820152606401610856565b610efb81612871565b6040516001600160a01b03821681527f31cf1095d6c1ea7eb1fa26ab1f742053836510fb0f0a5a30d613a3d88bbed876906020016109ef565b6000600654821115610f9b5760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b6064820152608401610856565b6000610fa5612931565b9050610fb1838261223e565b9150505b919050565b610fc261225d565b6013546001600160a01b03161561101b5760405162461bcd60e51b815260206004820152601c60248201527f5374616b696e6720636f6e747261637420616c726561647920736574000000006044820152606401610856565b601380546001600160a01b0319166001600160a01b0383169081179091556040519081527f749d41f0ee5297c1358d920a96cca563eb514cac372accb8d8e4cf8e642a0778906020016109ef565b600033610a9a81858561107c83836120d1565b6110869190613a46565b6122b7565b6001600160a01b038316600090815260208052604090205460ff166110c25760405162461bcd60e51b8152600401610856906139d3565b6000836001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b1580156110fd57600080fd5b505afa158015611111573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061113591906136ad565b90506000846001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b15801561117257600080fd5b505afa158015611186573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111aa91906136ad565b6040516370a0823160e01b81523060048201529091506000906001600160a01b038416906370a082319060240160206040518083038186803b1580156111ef57600080fd5b505afa158015611203573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112279190613801565b6040516370a0823160e01b81523060048201529091506000906001600160a01b038416906370a082319060240160206040518083038186803b15801561126c57600080fd5b505afa158015611280573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a49190613801565b6040516323b872dd60e01b81529091506001600160a01b038516906323b872dd906112d790339030908b906004016138ac565b602060405180830381600087803b1580156112f157600080fd5b505af1158015611305573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061132991906137cd565b506040516323b872dd60e01b81526001600160a01b038416906323b872dd9061135a90339030908a906004016138ac565b602060405180830381600087803b15801561137457600080fd5b505af1158015611388573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113ac91906137cd565b506040516370a0823160e01b815230600482015260009083906001600160a01b038716906370a082319060240160206040518083038186803b1580156113f157600080fd5b505afa158015611405573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114299190613801565b6114339190613a9d565b6040516370a0823160e01b815230600482015290915060009083906001600160a01b038716906370a082319060240160206040518083038186803b15801561147a57600080fd5b505afa15801561148e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114b29190613801565b6114bc9190613a9d565b60125460405163095ea7b360e01b81526001600160a01b0391821660048201526024810185905291925087169063095ea7b390604401602060405180830381600087803b15801561150c57600080fd5b505af1158015611520573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061154491906137cd565b5060125460405163095ea7b360e01b81526001600160a01b039182166004820152602481018390529086169063095ea7b390604401602060405180830381600087803b15801561159357600080fd5b505af11580156115a7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115cb91906137cd565b5060125460405162e8e33760e81b81526001600160a01b0388811660048301528781166024830152604482018590526064820184905260006084830181905260a483018190523360c48401524260e484015292169063e8e337009061010401606060405180830381600087803b15801561164457600080fd5b505af1158015611658573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061167c919061383c565b60135460405163294091cd60e01b81526001600160a01b038f81166004830152602482018490523360448301529295509116925063294091cd9150606401600060405180830381600087803b1580156116d457600080fd5b505af11580156116e8573d6000803e3d6000fd5b5050505050505050505050505050565b6001600160a01b0381166000908152601e602052604081205460ff161561173857506001600160a01b0381166000908152601a6020526040902054610fb5565b6001600160a01b03821660009081526019602052604090205461175a90610f34565b92915050565b61176861225d565b6117726000612954565b565b606060058054610a0990613ab4565b6001600160a01b038216600090815260208052604090205460ff166117ba5760405162461bcd60e51b8152600401610856906139d3565b336000908152601d602052604090205460ff1615611a5e576000826001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b15801561180d57600080fd5b505afa158015611821573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061184591906136ad565b90506000836001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b15801561188257600080fd5b505afa158015611896573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118ba91906136ad565b6040516323b872dd60e01b81529091506001600160a01b038516906323b872dd906118ed903390309088906004016138ac565b602060405180830381600087803b15801561190757600080fd5b505af115801561191b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061193f91906137cd565b5060125460405163095ea7b360e01b81526001600160a01b039182166004820152602481018590529085169063095ea7b390604401602060405180830381600087803b15801561198e57600080fd5b505af11580156119a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119c691906137cd565b50601254604051635d5155ef60e11b81526001600160a01b039091169063baa2abde90611a04908590859088906000908190339042906004016138d0565b6040805180830381600087803b158015611a1d57600080fd5b505af1158015611a31573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a559190613819565b50505050610e59565b6000826001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b158015611a9957600080fd5b505afa158015611aad573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ad191906136ad565b90506000836001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b158015611b0e57600080fd5b505afa158015611b22573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b4691906136ad565b6040516323b872dd60e01b81529091506001600160a01b038516906323b872dd90611b79903390309088906004016138ac565b602060405180830381600087803b158015611b9357600080fd5b505af1158015611ba7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bcb91906137cd565b5060125460405163095ea7b360e01b81526001600160a01b039182166004820152602481018590529085169063095ea7b390604401602060405180830381600087803b158015611c1a57600080fd5b505af1158015611c2e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c5291906137cd565b50336000818152601d6020526040808220805460ff191660011790556012549051635d5155ef60e11b81526001600160a01b03919091169263baa2abde92611ca892879287928a929091829142906004016138d0565b6040805180830381600087803b158015611cc157600080fd5b505af1158015611cd5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cf99190613819565b5050336000908152601d60205260409020805460ff1916905550505050565b60003381611d2682866120d1565b905083811015611d865760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610856565b610e7682868684036122b7565b600033610a9a818585612455565b60168181548110611db157600080fd5b6000918252602090912001546001600160a01b0316905081565b611dd361225d565b6c0c9f2c9c9cd46fa5eeba4c0000811115611e405760405162461bcd60e51b815260206004820152602760248201527f416d6f756e742063616e6e6f74206265206f7665722074686520746f74616c2060448201526639bab838363c9760c91b6064820152608401610856565b683635c9adc5dea00000811015611ea85760405162461bcd60e51b815260206004820152602660248201527f4d696e696d756d2060313030306020746f6b656e2070657220737761702072656044820152651c5d5a5c995960d21b6064820152608401610856565b60108190556040518181527f18ff2fc8464635e4f668567019152095047e34d7a2ab4b97661ba4dc7fd06476906020016109ef565b611ee8333083612455565b601254611f009030906001600160a01b0316836122b7565b60125460405163f305d71960e01b81526000916001600160a01b03169063f305d719903490611f3d90309087908790819033904290600401613910565b6060604051808303818588803b158015611f5657600080fd5b505af1158015611f6a573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611f8f919061383c565b601354601680549295506001600160a01b03909116935063294091cd925090600090611fcb57634e487b7160e01b600052603260045260246000fd5b60009182526020909120015460405160e083901b6001600160e01b03191681526001600160a01b039091166004820152602481018490523360448201526064015b600060405180830381600087803b15801561202657600080fd5b505af115801561203a573d6000803e3d6000fd5b505050505050565b61204a61225d565b620b71b0811061209c5760405162461bcd60e51b815260206004820152601960248201527f4761732069732067726561746572207468616e206c696d6974000000000000006044820152606401610856565b60118190556040518181527f98fdd0b3c9bfe51a45c9afea7b77ebe06c52550d2783a24ef9c7415bbfcd023d906020016109ef565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b61210461225d565b6001600160a01b03821661215a5760405162461bcd60e51b815260206004820152601d60248201527f57616c6c65742061646472657373206973206e6f7420636f72726563740000006044820152606401610856565b6001600160a01b0382166000908152601d60205260409020805460ff1916821515179055604080516001600160a01b038416815282151560208201527ff1bf6e8d74573725f529c5a07fb53656b9c97a10602a75631f57c1be07769e2b910160405180910390a15050565b6121cd61225d565b6001600160a01b0381166122325760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610856565b61223b81612954565b50565b600061224a8284613a5e565b9392505050565b600061224a8284613a9d565b6000546001600160a01b031633146117725760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610856565b6001600160a01b0383166123195760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610856565b6001600160a01b03821661237a5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610856565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60006123e784846120d1565b9050600019811461244f57818110156124425760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610856565b61244f84848484036122b7565b50505050565b6001600160a01b0383166124b95760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610856565b6001600160a01b03821661251b5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610856565b80612525846116f8565b10156125735760405162461bcd60e51b815260206004820152601f60248201527f7472616e7366657220616d6f756e7420657863656564732062616c616e6365006044820152606401610856565b600061257e306116f8565b60105490915081108015908190612598575060175460ff16155b80156125bb57506001600160a01b038416600090815260208052604090205460ff165b80156125d057506001600160a01b0385163014155b156127ae576017805460ff191660011790556010546125ee906129a4565b600b54600a54600954479260009261260f9261260991612af3565b90612af3565b905060006126328261262c60095486612aff90919063ffffffff16565b9061223e565b9050600061264f8361262c600a5487612aff90919063ffffffff16565b90506000612667826126618786612251565b90612251565b905082156126785761267883612b0b565b81156126875761268783612c8d565b801561279e576013546040516000916001600160a01b03169083908381818185875af1925050503d80600081146126da576040519150601f19603f3d011682016040523d82523d6000602084013e6126df565b606091505b505090508061273e5760405162461bcd60e51b815260206004820152602560248201527f4661696c656420746f2073656e6420504c53206f6e207374616b696e67206164604482015264647265737360d81b6064820152608401610856565b6013546040516328f582d360e11b8152600481018490526001600160a01b03909116906351eb05a690602401600060405180830381600087803b15801561278457600080fd5b505af1158015612798573d6000803e3d6000fd5b50505050505b50506017805460ff191690555050505b6001600160a01b0385166000908152601d602052604090205460019060ff16806127f057506001600160a01b0385166000908152601d602052604090205460ff165b156127f9575060005b61280586868684612d8a565b6013546011546040516001624d3b8760e01b031981526001600160a01b039092169163ffb2c4799161283d9160040190815260200190565b600060405180830381600087803b15801561285757600080fd5b505af1925050508015612868575060015b61203a5761203a565b6001600160a01b038116600090815260196020526040902054156128cb576001600160a01b0381166000908152601960205260409020546128b190610f34565b6001600160a01b0382166000908152601a60205260409020555b6001600160a01b03166000818152601e60205260408120805460ff191660019081179091556018805491820181559091527fb13d2d76d1f4b7be834882e410b3e3a8afaf69f83600ae24db354391d2378d2e0180546001600160a01b0319169091179055565b600080600061293e613007565b909250905061294d828261223e565b9250505090565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60408051600280825260608201835260009260208301908036833701905050905030816000815181106129e757634e487b7160e01b600052603260045260246000fd5b6001600160a01b039283166020918202929092018101919091526012546040805163ef8ef56f60e01b81529051919093169263ef8ef56f926004808301939192829003018186803b158015612a3b57600080fd5b505afa158015612a4f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a7391906136ad565b81600181518110612a9457634e487b7160e01b600052603260045260246000fd5b6001600160a01b039283166020918202929092010152601254612aba91309116846122b7565b60125460405163791ac94760e01b81526001600160a01b039091169063791ac9479061200c908590600090869030904290600401613a0a565b600061224a8284613a46565b600061224a8284613a7e565b60408051600280825260608201835260009260208301908036833750506012546040805163ef8ef56f60e01b815290519394506001600160a01b039091169263ef8ef56f92506004808301926020929190829003018186803b158015612b7057600080fd5b505afa158015612b84573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ba891906136ad565b81600081518110612bc957634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b0316815250503081600181518110612c0b57634e487b7160e01b600052603260045260246000fd5b6001600160a01b03928316602091820292909201015260125460145460405163b6f9de9560e01b81529183169263b6f9de95928692612c5792600092889290911690429060040161394b565b6000604051808303818588803b158015612c7057600080fd5b505af1158015612c84573d6000803e3d6000fd5b50505050505050565b60408051600280825260608201835260009260208301908036833750506012546040805163ef8ef56f60e01b815290519394506001600160a01b039091169263ef8ef56f92506004808301926020929190829003018186803b158015612cf257600080fd5b505afa158015612d06573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d2a91906136ad565b81600081518110612d4b57634e487b7160e01b600052603260045260246000fd5b6001600160a01b039283166020918202929092010152601554825191169082906001908110612c0b57634e487b7160e01b600052603260045260246000fd5b6001600160a01b0384166000908152601b602052604081208054849290612db2908490613a46565b90915550819050612dd657612dd66000600c819055600d819055600e819055600f55565b6000600f54600e54600d54600c54612dee9190613a46565b612df89190613a46565b612e029190613a46565b90508015612e5c576000612e1c61271061262c8685612aff565b9050612e288482612251565b6001600160a01b0386166000908152601c602052604081208054909190612e50908490613a46565b90915550612e8a915050565b6001600160a01b0384166000908152601c602052604081208054859290612e84908490613a46565b90915550505b6001600160a01b0385166000908152601e602052604090205460ff168015612ecb57506001600160a01b0384166000908152601e602052604090205460ff16155b15612ee057612edb8585856131f0565b612fde565b6001600160a01b0385166000908152601e602052604090205460ff16158015612f2157506001600160a01b0384166000908152601e602052604090205460ff165b15612f3157612edb85858561335d565b6001600160a01b0385166000908152601e602052604090205460ff16158015612f7357506001600160a01b0384166000908152601e602052604090205460ff16155b15612f8357612edb858585613406565b6001600160a01b0385166000908152601e602052604090205460ff168015612fc357506001600160a01b0384166000908152601e602052604090205460ff165b15612fd357612edb85858561344a565b612fde858585613406565b8161300057613000600854600c55600954600d55600a54600e55600b54600f55565b5050505050565b60065460009081906c0c9f2c9c9cd46fa5eeba4c0000825b6018548110156131a85782601960006018848154811061304f57634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b0316835282019290925260400190205411806130c8575081601a6000601884815481106130a157634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b156130ea576006546c0c9f2c9c9cd46fa5eeba4c0000945094505050506131ec565b61313e601960006018848154811061311257634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b031683528201929092526040019020548490612251565b9250613194601a60006018848154811061316857634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b031683528201929092526040019020548390612251565b9150806131a081613aef565b91505061301f565b506006546131c3906c0c9f2c9c9cd46fa5eeba4c000061223e565b8210156131e6576006546c0c9f2c9c9cd46fa5eeba4c00009350935050506131ec565b90925090505b9091565b600080600080600080613202876134bd565b6001600160a01b038f166000908152601a6020526040902054959b509399509197509550935091506132349088612251565b6001600160a01b038a166000908152601a60209081526040808320939093556019905220546132639087612251565b6001600160a01b03808b1660009081526019602052604080822093909355908a16815220546132929086612af3565b6001600160a01b0389166000908152601960205260409020556132b48161350c565b6132be8483613595565b80156133055760405181815230906001600160a01b038b16907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35b876001600160a01b0316896001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8560405161334a91815260200190565b60405180910390a3505050505050505050565b60008060008060008061336f876134bd565b6001600160a01b038f16600090815260196020526040902054959b509399509197509550935091506133a19087612251565b6001600160a01b03808b16600090815260196020908152604080832094909455918b168152601a90915220546133d79084612af3565b6001600160a01b0389166000908152601a60209081526040808320939093556019905220546132929086612af3565b600080600080600080613418876134bd565b6001600160a01b038f16600090815260196020526040902054959b509399509197509550935091506132639087612251565b60008060008060008061345c876134bd565b6001600160a01b038f166000908152601a6020526040902054959b5093995091975095509350915061348e9088612251565b6001600160a01b038a166000908152601a60209081526040808320939093556019905220546133a19087612251565b60008060008060008060008060006134d48a6135b9565b92509250925060008060006134f28d86866134ed612931565b6135f5565b919f909e50909c50959a5093985091965092945050505050565b6000613516612931565b905060006135248383612aff565b306000908152601960205260409020549091506135419082612af3565b30600090815260196020908152604080832093909355601e9052205460ff161561359057306000908152601a602052604090205461357f9084612af3565b306000908152601a60205260409020555b505050565b6006546135a29083612251565b6006556007546135b29082612af3565b6007555050565b6000806000806135c885613645565b905060006135d586613662565b905060006135e7826126618986612251565b979296509094509092505050565b60008080806136048886612aff565b905060006136128887612aff565b905060006136208888612aff565b90506000613632826126618686612251565b939b939a50919850919650505050505050565b600061175a61271061262c600c5485612aff90919063ffffffff16565b600061175a61271061262c600f54600e54600d546136809190613a46565b61368a9190613a46565b8590612aff565b6000602082840312156136a2578081fd5b813561224a81613b20565b6000602082840312156136be578081fd5b815161224a81613b20565b600080604083850312156136db578081fd5b82356136e681613b20565b915060208301356136f681613b20565b809150509250929050565b600080600060608486031215613715578081fd5b833561372081613b20565b9250602084013561373081613b20565b929592945050506040919091013590565b60008060408385031215613753578182fd5b823561375e81613b20565b915060208301356136f681613b35565b60008060408385031215613780578182fd5b823561378b81613b20565b946020939093013593505050565b6000806000606084860312156137ad578283fd5b83356137b881613b20565b95602085013595506040909401359392505050565b6000602082840312156137de578081fd5b815161224a81613b35565b6000602082840312156137fa578081fd5b5035919050565b600060208284031215613812578081fd5b5051919050565b6000806040838503121561382b578182fd5b505080516020909101519092909150565b600080600060608486031215613850578283fd5b8351925060208401519150604084015190509250925092565b6000815180845260208085019450808401835b838110156138a15781516001600160a01b03168752958201959082019060010161387c565b509495945050505050565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b039788168152958716602087015260408601949094526060850192909252608084015290921660a082015260c081019190915260e00190565b6001600160a01b039687168152602081019590955260408501939093526060840191909152909216608082015260a081019190915260c00190565b6000858252608060208301526139646080830186613869565b6001600160a01b03949094166040830152506060015292915050565b6000602080835283518082850152825b818110156139ac57858101830151858201604001528201613990565b818111156139bd5783604083870101525b50601f01601f1916929092016040019392505050565b6020808252601d908201527f4c69717569646974792070616972206973206e6f7420636f7272656374000000604082015260600190565b600086825285602083015260a06040830152613a2960a0830186613869565b6001600160a01b0394909416606083015250608001529392505050565b60008219821115613a5957613a59613b0a565b500190565b600082613a7957634e487b7160e01b81526012600452602481fd5b500490565b6000816000190483118215151615613a9857613a98613b0a565b500290565b600082821015613aaf57613aaf613b0a565b500390565b600281046001821680613ac857607f821691505b60208210811415613ae957634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415613b0357613b03613b0a565b5060010190565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b038116811461223b57600080fd5b801515811461223b57600080fdfea2646970667358221220885ce5a24795accc94ae5f1ce43f7bc0f09fa7a84725783ba8eeb53f2848da5264736f6c63430008020033