false
true
0

Contract Address Details

0x1B7B541BeA3aF39292FCe08649e4C4e1BEE408a1

Token
ALIEN (ALIEN)
Creator
0x071aee–dac5f3 at 0xe2ba78–9e643f
Balance
0.000000000000000002 PLS ( )
Tokens
Fetching tokens...
Transactions
6,647 Transactions
Transfers
0 Transfers
Gas Used
0
Last Balance Update
25873463
Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
Contract name:
ALIEN




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




Optimization runs
200
EVM Version
default




Verified at
2023-11-17T19:13:32.363139Z

ALIEN.sol

// SPDX-License-Identifier: MIT

pragma solidity 0.8.2;

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

contract ALIEN is ERC20, Ownable {

	uint256[] public liquidityFee;
	uint256[] public buyBurnFee;
	uint256[] public reflectionBurnFee;
	
	uint256 public swapTokensAtAmount;
	uint256 public distributorGas;
	
	uint256 private liquidityFeeTotal;
	uint256 private buyBurnFeeTotal;
	uint256 private reflectionBurnFeeTotal;
	
	IPulseXRouter public pulseXRouter;
	
    address public pulseXPair;
	address public burnAddress;
	address public tokenpTGC;
	address public tokenLiquid;
	address public tokenBurn;
	address public token808;
	
	Distributor public distributorpTGC;
	Distributor public distributorBurn;
	Distributor public distributor808;
	Distributor public distributorLiquid;
	
	bool private swapping;
	bool public distributionEnabled;
	
	mapping (address => bool) isDividendExempt;
	mapping (address => bool) public isExcludedFromFee;
	mapping (address => bool) public isAutomatedMarketMakerPairs;
	
	event AccountExcludeFromFee(address account, bool status);
	event SwapTokensAmountUpdated(uint256 amount);
	event AutomatedMarketMakerPairUpdated(address pair, bool value);
	
	constructor() ERC20("ALIEN", "ALIEN") 
	{
	    tokenpTGC = address(0x94534EeEe131840b1c0F61847c572228bdfDDE93);
		tokenBurn = address(0x64a24A61330dB88AF5BCdF13e8da4D55FF8d96C0);
		token808 = address(0x50F1ca62e6Fb8Adf438ca1F50067AB83670094A6);
		tokenLiquid = address(0x21ee884C6c2e83e6837c77f7FF617Ba947F0AfE7);
		
	    burnAddress = address(0x0000000000000000000000000000000000000369);
	    pulseXRouter = IPulseXRouter(0x98bf93ebf5c380C0e6Ae8e192A7e2AE08edAcc02);
        pulseXPair = IPulseXFactory(pulseXRouter.factory()).createPair(address(this), pulseXRouter.WPLS());
		
	    distributorpTGC = new Distributor(address(tokenpTGC));
		distributorBurn = new Distributor(address(tokenBurn));
		distributor808 = new Distributor(address(token808));
		distributorLiquid = new Distributor(address(tokenLiquid));
		
	    liquidityFee.push(100);
	    liquidityFee.push(100);
	    liquidityFee.push(100);
		
		buyBurnFee.push(100);
	    buyBurnFee.push(100);
	    buyBurnFee.push(100);
	   
	    reflectionBurnFee.push(400);
	    reflectionBurnFee.push(400);
	    reflectionBurnFee.push(400);
		
	    isExcludedFromFee[address(msg.sender)] = true;
        isExcludedFromFee[address(this)] = true;
		
	    isDividendExempt[address(pulseXPair)] = true;
        isDividendExempt[address(this)] = true;
	    isDividendExempt[address(burnAddress)] = true;
		
	    isAutomatedMarketMakerPairs[address(pulseXPair)] = true;   
	    swapTokensAtAmount = 110000000 * (10 ** 18);
	    distributorGas = 250000;
		
	    distributionEnabled = true;
	    _mint(address(msg.sender), 1100000000000 * (10 ** 18));
    }
	
	receive() external payable {}
	
	function excludeFromFee(address account, bool status) external onlyOwner {
	   require(isExcludedFromFee[account] != status, "Account is already the value of 'status'");
	   
	   isExcludedFromFee[account] = status;
	   emit AccountExcludeFromFee(account, status);
	}
	
	function setSwapTokensAtAmount(uint256 amount) external onlyOwner {
  	    require(amount <= totalSupply(), "Amount cannot be over the total supply.");
		require(amount >= 500 * (10 ** 18), "Minimum `500` token per swap required");
		
		swapTokensAtAmount = amount;
		emit SwapTokensAmountUpdated(amount);
  	}
	
	function setAutomatedMarketMakerPair(address pair, bool value) external onlyOwner {
        require(pair != address(0), "Zero address");
		
		isAutomatedMarketMakerPairs[address(pair)] = value;
		emit AutomatedMarketMakerPairUpdated(pair, value);
    }
	
	function _transfer(address sender, address recipient, uint256 amount) internal override(ERC20){      
	
		uint256 contractTokenBalance = balanceOf(address(this));
		bool canSwap = contractTokenBalance >= swapTokensAtAmount;
		
		if (canSwap && !swapping && isAutomatedMarketMakerPairs[recipient]) 
		{
		    uint256 tokenToLiqudity = liquidityFeeTotal / 2;
			uint256 tokenToBuyBurn = buyBurnFeeTotal;
			uint256 tokenToReflectionBurn = reflectionBurnFeeTotal;
			uint256 tokenToSwap = tokenToLiqudity + tokenToBuyBurn + tokenToReflectionBurn;
			
			if(tokenToSwap >= swapTokensAtAmount) 
			{
			    swapping = true;
				swapTokensForPLS(swapTokensAtAmount);
				uint256 PLSBalance = address(this).balance;
				
				uint256 liqudityPart = ((PLSBalance * tokenToLiqudity) / tokenToSwap);
				uint256 buyBurnPart = ((PLSBalance * tokenToBuyBurn) / tokenToSwap);
				uint256 reflectionBurnPart = PLSBalance - liqudityPart - buyBurnPart;
				
				if(reflectionBurnPart > 0)
				{
				    uint256 share = reflectionBurnPart/4;
					if(share > 0)
					{
					    // For pTGC
					    uint256 oldpTGC = IERC20(tokenpTGC).balanceOf(address(distributorpTGC));
					    swapPLSForpTGC(share);
						uint256 NewpTGC = IERC20(tokenpTGC).balanceOf(address(distributorpTGC)) - oldpTGC;
						distributorpTGC.deposit(NewpTGC/2);
						distributorpTGC.burn(NewpTGC/2);
						
						// For Burn
						uint256 oldBurn = IERC20(tokenBurn).balanceOf(address(distributorBurn));
					    swapPLSForBurn(share);
						uint256 NewBurn = IERC20(tokenBurn).balanceOf(address(distributorBurn)) - oldBurn;
						distributorBurn.deposit(NewBurn/2);
						distributorBurn.burn(NewBurn/2);
						
						// For 808
						uint256 old808 = IERC20(token808).balanceOf(address(distributor808));
					    swapPLSFor808(share);
						uint256 New808 = IERC20(token808).balanceOf(address(distributor808)) - old808;
						distributor808.deposit(New808/2);
						distributor808.burn(New808/2);
						
						// For Liquid
						uint256 oldLiquid = IERC20(tokenLiquid).balanceOf(address(distributorLiquid));
					    swapPLSForLiquid(share);
						uint256 NewLiquid= IERC20(tokenLiquid).balanceOf(address(distributorLiquid)) - oldLiquid;
						distributorLiquid.deposit(NewLiquid/2);
						distributorLiquid.burn(NewLiquid/2);
					}
				    reflectionBurnFeeTotal = reflectionBurnFeeTotal - ((swapTokensAtAmount * tokenToReflectionBurn) / (tokenToSwap));
				}
				if(buyBurnPart > 0)
				{
				    swapPLSToBurn(buyBurnPart);
				    buyBurnFeeTotal = buyBurnFeeTotal - ((swapTokensAtAmount * tokenToBuyBurn) / (tokenToSwap));
				}
				if(liqudityPart > 0)
				{
				    uint256 liqudityToken = (swapTokensAtAmount * tokenToLiqudity) / (tokenToSwap);
				    addLiquidity(liqudityToken, liqudityPart);
				    liquidityFeeTotal = liquidityFeeTotal - liqudityToken - liqudityToken;
				}
				swapping = false;
			}
        }
		
		if(isExcludedFromFee[sender] || isExcludedFromFee[recipient]) 
		{
            super._transfer(sender, recipient, amount);
        }
		else 
		{
		    uint256 allFee = collectFee(amount, isAutomatedMarketMakerPairs[recipient], !isAutomatedMarketMakerPairs[sender] && !isAutomatedMarketMakerPairs[recipient]);
			if(allFee > 0) 
			{
			   super._transfer(sender, address(this), allFee);
			}
			super._transfer(sender, recipient, amount - allFee);
        }
		
		if(!isDividendExempt[sender])
		{ 
		   try distributorpTGC.setShare(sender, balanceOf(sender)) {} catch {} 
		   try distributorBurn.setShare(sender, balanceOf(sender)) {} catch {} 
		   try distributor808.setShare(sender, balanceOf(sender)) {} catch {}
		   try distributorLiquid.setShare(sender, balanceOf(sender)) {} catch {}
		}
        if(!isDividendExempt[recipient])
		{ 
		   try distributorpTGC.setShare(recipient, balanceOf(recipient)) {} catch {} 
		   try distributorBurn.setShare(recipient, balanceOf(recipient)) {} catch {} 
		   try distributor808.setShare(recipient, balanceOf(recipient)) {} catch {} 
		   try distributorLiquid.setShare(recipient, balanceOf(recipient)) {} catch {} 
		}
		if(distributionEnabled) 
		{
		    try distributorpTGC.process(distributorGas) {} catch {}
			try distributorBurn.process(distributorGas) {} catch {}
			try distributor808.process(distributorGas) {} catch {}
			try distributorLiquid.process(distributorGas) {} catch {}
		}
    }
	
	function collectFee(uint256 amount, bool sell, bool p2p) private returns (uint256) {
        uint256 newLiquidityFee = amount * (p2p ? liquidityFee[2] : sell ? liquidityFee[1] : liquidityFee[0]) / 10000;
		uint256 newBuyBurnFee = amount * (p2p ? buyBurnFee[2] : sell ? buyBurnFee[1] : buyBurnFee[0]) / 10000;
		uint256 newReflectionBurnFee = amount * (p2p ? reflectionBurnFee[2] : sell ? reflectionBurnFee[1] : reflectionBurnFee[0]) / 10000;
		
		liquidityFeeTotal += newLiquidityFee;
		buyBurnFeeTotal += newBuyBurnFee;
	    reflectionBurnFeeTotal += newReflectionBurnFee;
        return (newLiquidityFee + newBuyBurnFee + newReflectionBurnFee);
    }
	
	function swapTokensForPLS(uint256 tokenAmount) private {
        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 swapPLSForpTGC(uint256 PLSAmount) private {
        address[] memory path = new address[](2);
        path[0] = pulseXRouter.WPLS();
        path[1] = address(tokenpTGC);
		
        pulseXRouter.swapExactETHForTokensSupportingFeeOnTransferTokens{value: PLSAmount}(
            0,
            path,
            address(distributorpTGC),
            block.timestamp
        );
    }
	
	function swapPLSForBurn(uint256 PLSAmount) private {
        address[] memory path = new address[](2);
        path[0] = pulseXRouter.WPLS();
        path[1] = address(tokenBurn);
		
        pulseXRouter.swapExactETHForTokensSupportingFeeOnTransferTokens{value: PLSAmount}(
            0,
            path,
            address(distributorBurn),
            block.timestamp
        );
    }
	
	function swapPLSFor808(uint256 PLSAmount) private {
        address[] memory path = new address[](2);
        path[0] = pulseXRouter.WPLS();
        path[1] = address(token808);
		
        pulseXRouter.swapExactETHForTokensSupportingFeeOnTransferTokens{value: PLSAmount}(
            0,
            path,
            address(distributor808),
            block.timestamp
        );
    }
	
	function swapPLSForLiquid(uint256 PLSAmount) private {
        address[] memory path = new address[](2);
        path[0] = pulseXRouter.WPLS();
        path[1] = address(tokenLiquid);
		
        pulseXRouter.swapExactETHForTokensSupportingFeeOnTransferTokens{value: PLSAmount}(
            0,
            path,
            address(distributorLiquid),
            block.timestamp
        );
    }
	
	function swapPLSToBurn(uint256 PLSAmount) private {
        address[] memory path = new address[](2);
        path[0] = pulseXRouter.WPLS();
        path[1] = address(this);
		
        pulseXRouter.swapExactETHForTokensSupportingFeeOnTransferTokens{value: PLSAmount}(
            0,
            path,
            address(burnAddress),
            block.timestamp
        );
    }
	
	function addLiquidity(uint256 tokenAmount, uint256 PLSAmount) private {
        _approve(address(this), address(pulseXRouter), tokenAmount);
        pulseXRouter.addLiquidityETH{value: PLSAmount}(
            address(this),
            tokenAmount,
            0, 
            0,
            address(burnAddress),
            block.timestamp
        );
    }
	
	function setIsDividendExempt(address holder, bool status) external onlyOwner {
       isDividendExempt[holder] = status;
       if(status)
	   {
            distributorpTGC.setShare(holder, 0);
			distributor808.setShare(holder, 0);
			distributorBurn.setShare(holder, 0);
			distributorLiquid.setShare(holder, 0);
       }
	   else
	   {
            distributorpTGC.setShare(holder, balanceOf(holder));
			distributor808.setShare(holder, balanceOf(holder));
			distributorBurn.setShare(holder, balanceOf(holder));
			distributorLiquid.setShare(holder, balanceOf(holder));
       }
    }
	
	function setDistributionStatus(bool status) external onlyOwner {
        distributionEnabled = status;
    }
	
	function setDistributionCriteria(uint256 minPeriod, uint256 minDistribution) external onlyOwner {
        distributorpTGC.setDistributionCriteria(minPeriod, minDistribution);
		distributor808.setDistributionCriteria(minPeriod, minDistribution);
		distributorBurn.setDistributionCriteria(minPeriod, minDistribution);
		distributorLiquid.setDistributionCriteria(minPeriod, minDistribution);
    }
	
	function setDistributorGas(uint256 gas) external onlyOwner {
       require(gas < 750000, "Gas is greater than limit");
       distributorGas = gas;
    }
}
        

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;
    }
}
          

Distributor.sol

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "./ERC20.sol";

interface IDistributor {
   function setDistributionCriteria(uint256 minPeriod, uint256 minDistribution) external;
   function setShare(address shareholder, uint256 amount) external;
   function deposit(uint256 amount) external;
   function burn(uint256 amount) external;
   function process(uint256 gas) external;
}

contract Distributor is IDistributor {
    address owner;
	
    struct Share {
	  uint256 amount;
	  uint256 totalExcluded;
	  uint256 totalRealised;
    }
	
	address public rewardToken;
	
    address[] shareholders;
    mapping (address => uint256) public shareholderIndexes;
    mapping (address => uint256) public shareholderClaims;
    mapping (address => Share) public shares;
	
	event DistributionCriteriaUpdate(uint256 minPeriod, uint256 minDistribution);
	event NewFundDeposit(uint256 amount);

    uint256 public totalShares;
    uint256 public totalDividends;
    uint256 public totalDistributed;
    uint256 public dividendsPerShare;
    uint256 public constant dividendsPerShareAccuracyFactor = 10 ** 36;
	
    uint256 public minPeriod = 3600;
    uint256 public minDistribution = 1 * (10 ** 18);
	
    uint256 currentIndex;
	
    modifier onlyOwner() {
        require(msg.sender == owner, "!Token"); _;
    }
	
    constructor(address token) {
	   rewardToken = address(token);
       owner = msg.sender;
    }
	
	receive() external payable {}
	
    function setDistributionCriteria(uint256 _minPeriod, uint256 _minDistribution) external override onlyOwner {
        minPeriod = _minPeriod;
        minDistribution = _minDistribution;
		emit DistributionCriteriaUpdate(minPeriod, minDistribution);
    }
	
    function setShare(address shareholder, uint256 amount) external override onlyOwner {
        if(shares[shareholder].amount > 0)
		{
            distributeDividend(shareholder);
        }
		if(amount > 0 && shares[shareholder].amount == 0)
		{
           addShareholder(shareholder);
        }
		else if(amount == 0 && shares[shareholder].amount > 0)
		{
           removeShareholder(shareholder);
        }
        totalShares = totalShares - shares[shareholder].amount + amount;
        shares[shareholder].amount = amount;
        shares[shareholder].totalExcluded = getCumulativeDividends(shares[shareholder].amount);
    }

    function deposit(uint256 amount) external override onlyOwner {
        totalDividends = totalDividends + amount;
        dividendsPerShare = dividendsPerShare + dividendsPerShareAccuracyFactor * amount / totalShares;
		emit NewFundDeposit(amount);
    }
	
	function burn(uint256 amount) external override onlyOwner {
	   IERC20(rewardToken).transfer(address(0x0000000000000000000000000000000000000369), amount);
    }
	
    function process(uint256 gas) external override onlyOwner {
        uint256 shareholderCount = shareholders.length;

        if(shareholderCount == 0) { return; }

        uint256 gasUsed = 0;
        uint256 gasLeft = gasleft();

        uint256 iterations = 0;

        while(gasUsed < gas && iterations < shareholderCount) {
            if(currentIndex >= shareholderCount)
			{
                currentIndex = 0;
            }
            if(shouldDistribute(shareholders[currentIndex]))
			{
                distributeDividend(shareholders[currentIndex]);
            }
            gasUsed = gasUsed + gasLeft - gasleft();
            gasLeft = gasleft();
            currentIndex++;
            iterations++;
        }
    }

    function shouldDistribute(address shareholder) internal view returns (bool) {
        return (shareholderClaims[shareholder] + minPeriod) < block.timestamp && getUnpaidEarnings(shareholder) > minDistribution;
    }
	
    function distributeDividend(address shareholder) internal {
        if(shares[shareholder].amount == 0){ return; }
		
        uint256 amount = getUnpaidEarnings(shareholder);
        if(amount > 0) 
		{
		    IERC20(rewardToken).transfer(shareholder, amount);
		    totalDistributed = totalDistributed + amount;
		    shareholderClaims[shareholder] = block.timestamp;
		    shares[shareholder].totalRealised = shares[shareholder].totalRealised + amount;
		    shares[shareholder].totalExcluded = getCumulativeDividends(shares[shareholder].amount);
        }
    }
	
    function claimReflection() external {
		if(shouldDistribute(msg.sender)) 
		{
		   distributeDividend(msg.sender);
		}
    }
	
    function getUnpaidEarnings(address shareholder) public view returns (uint256) {
        if(shares[shareholder].amount == 0){ return 0; }

        uint256 shareholderTotalDividends = getCumulativeDividends(shares[shareholder].amount);
        uint256 shareholderTotalExcluded = shares[shareholder].totalExcluded;

        if(shareholderTotalDividends <= shareholderTotalExcluded){ return 0; }
        return shareholderTotalDividends - shareholderTotalExcluded;
    }

    function getCumulativeDividends(uint256 share) internal view returns (uint256) {
        return share * dividendsPerShare / dividendsPerShareAccuracyFactor;
    }

    function addShareholder(address shareholder) internal {
        shareholderIndexes[shareholder] = shareholders.length;
        shareholders.push(shareholder);
    }
	
    function removeShareholder(address shareholder) internal {
        shareholders[shareholderIndexes[shareholder]] = shareholders[shareholders.length-1];
        shareholderIndexes[shareholders[shareholders.length-1]] = shareholderIndexes[shareholder];
        shareholders.pop();
    }
}
          

ERC20.sol

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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;
	
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }
	
    function name() public view virtual override returns (string memory) {
        return _name;
    }
	
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }
	
    function decimals() public view virtual override returns (uint8) {
        return 18;
    }
	
    function totalSupply() public view virtual override returns (uint256) {
        return _totalSupply;
    }
	
    function balanceOf(address account) public view virtual override returns (uint256) {
        return _balances[account];
    }
	
    function transfer(address to, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _transfer(owner, to, amount);
        return true;
    }
	
    function allowance(address owner, address spender) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }
	
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, amount);
        return true;
    }
	
    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;
    }
	
    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, allowance(owner, spender) + addedValue);
        return true;
    }
	
    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;
    }
	
    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);
    }
	
    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);
    }
	
    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);
    }
	
    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);
    }
	
    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);
            }
        }
    }
	
    function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual {}
    function _afterTokenTransfer(address from, address to, uint256 amount) internal virtual {}
}
          

IERC20.sol

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

interface IERC20 {
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);
	
    function totalSupply() external view returns (uint256);
    function balanceOf(address account) external view returns (uint256);
    function transfer(address to, uint256 amount) external returns (bool);
    function allowance(address owner, address spender) external view returns (uint256);
    function approve(address spender, uint256 amount) external returns (bool);
    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";

interface IERC20Metadata is IERC20 {
    function name() external view returns (string memory);
    function symbol() external view returns (string memory);
    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 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;
   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);
}
          

Ownable.sol

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;
import "./Context.sol";

abstract contract Ownable is Context {
    address private _owner;

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

    constructor() {
        _transferOwnership(_msgSender());
    }

    modifier onlyOwner() {
        _checkOwner();
        _;
    }
	
    function owner() public view virtual returns (address) {
        return _owner;
    }
	
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }
	
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }
	
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }
	
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}
          

Contract ABI

[{"type":"constructor","stateMutability":"nonpayable","inputs":[]},{"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":"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":"AutomatedMarketMakerPairUpdated","inputs":[{"type":"address","name":"pair","internalType":"address","indexed":false},{"type":"bool","name":"value","internalType":"bool","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":"SwapTokensAmountUpdated","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":"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":"address","name":"","internalType":"address"}],"name":"burnAddress","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"buyBurnFee","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"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":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"distributionEnabled","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract Distributor"}],"name":"distributor808","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract Distributor"}],"name":"distributorBurn","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"distributorGas","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract Distributor"}],"name":"distributorLiquid","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract Distributor"}],"name":"distributorpTGC","inputs":[]},{"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":[{"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":"isAutomatedMarketMakerPairs","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isExcludedFromFee","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"liquidityFee","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"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":"address","name":"","internalType":"address"}],"name":"pulseXPair","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":"reflectionBurnFee","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"renounceOwnership","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setAutomatedMarketMakerPair","inputs":[{"type":"address","name":"pair","internalType":"address"},{"type":"bool","name":"value","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setDistributionCriteria","inputs":[{"type":"uint256","name":"minPeriod","internalType":"uint256"},{"type":"uint256","name":"minDistribution","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setDistributionStatus","inputs":[{"type":"bool","name":"status","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setDistributorGas","inputs":[{"type":"uint256","name":"gas","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setIsDividendExempt","inputs":[{"type":"address","name":"holder","internalType":"address"},{"type":"bool","name":"status","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setSwapTokensAtAmount","inputs":[{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"swapTokensAtAmount","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"symbol","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"token808","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"tokenBurn","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"tokenLiquid","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"tokenpTGC","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalSupply","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"transfer","inputs":[{"type":"address","name":"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":"receive","stateMutability":"payable"}]
              

Contract Creation Code

Verify & Publish
0x60806040523480156200001157600080fd5b5060408051808201825260058082526420a624a2a760d91b60208084018281528551808701909652928552840152815191929162000052916003916200074a565b508051620000689060049060208401906200074a565b505050620000856200007f6200060c60201b60201c565b62000610565b601180546001600160a01b03199081167394534eeee131840b1c0f61847c572228bdfdde93179091556013805482167364a24a61330db88af5bcdf13e8da4d55ff8d96c01790556014805482167350f1ca62e6fb8adf438ca1f50067ab83670094a61790556012805482167321ee884c6c2e83e6837c77f7ff617ba947f0afe7179055601080548216610369179055600e80549091167398bf93ebf5c380c0e6ae8e192a7e2ae08edacc0217908190556040805163c45a015560e01b815290516001600160a01b03929092169163c45a015591600481810192602092909190829003018186803b1580156200017957600080fd5b505afa1580156200018e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001b49190620007fe565b6001600160a01b031663c9c6539630600e60009054906101000a90046001600160a01b03166001600160a01b031663ef8ef56f6040518163ffffffff1660e01b815260040160206040518083038186803b1580156200021257600080fd5b505afa15801562000227573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200024d9190620007fe565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381600087803b1580156200029657600080fd5b505af1158015620002ab573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002d19190620007fe565b600f80546001600160a01b0319166001600160a01b039283161790556011546040519116906200030190620007d9565b6001600160a01b039091168152602001604051809103906000f0801580156200032e573d6000803e3d6000fd5b50601580546001600160a01b0319166001600160a01b039283161790556013546040519116906200035f90620007d9565b6001600160a01b039091168152602001604051809103906000f0801580156200038c573d6000803e3d6000fd5b50601680546001600160a01b0319166001600160a01b03928316179055601454604051911690620003bd90620007d9565b6001600160a01b039091168152602001604051809103906000f080158015620003ea573d6000803e3d6000fd5b50601780546001600160a01b0319166001600160a01b039283161790556012546040519116906200041b90620007d9565b6001600160a01b039091168152602001604051809103906000f08015801562000448573d6000803e3d6000fd5b50601880546001600160a01b039283166001600160a01b0319909116178155600680546001818101835560647ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f9283018190558354808301855583018190558354808301909455929091018290556007805480830182557fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688908101849055815480840183558101849055815480840190925501919091556008805480830182556101907ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee39182018190558254808501845582018190558254808501909355910155336000818152601a60209081526040808320805460ff199081168717909155308085528285208054831688179055600f80548a1686526019855283862080548416891790559085528285208054831688179055601054891685528285208054831688179055549097168352601b909152902080549094169091179092556a5afd67f2dc0e1b2e0000006009556203d090600a55805460ff60a81b1916600160a81b17905562000606906c0de24aac7eb3e705b4e000000062000662565b62000890565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038216620006bd5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640160405180910390fd5b8060026000828254620006d191906200082e565b90915550506001600160a01b03821660009081526020819052604081208054839290620007009084906200082e565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b828054620007589062000853565b90600052602060002090601f0160209004810192826200077c5760008555620007c7565b82601f106200079757805160ff1916838001178555620007c7565b82800160010185558215620007c7579182015b82811115620007c7578251825591602001919060010190620007aa565b50620007d5929150620007e7565b5090565b610e128062003db583390190565b5b80821115620007d55760008155600101620007e8565b60006020828403121562000810578081fd5b81516001600160a01b038116811462000827578182fd5b9392505050565b600082198211156200084e57634e487b7160e01b81526011600452602481fd5b500190565b6002810460018216806200086857607f821691505b602082108114156200088a57634e487b7160e01b600052602260045260246000fd5b50919050565b61351580620008a06000396000f3fe60806040526004361061023f5760003560e01c80637c9e75c01161012e578063afa4f3b2116100ab578063f2fde38b1161006f578063f2fde38b146106d0578063f708a64f146106f0578063f998e65e14610710578063fe3f52f414610730578063fe6b54ce1461075057610246565b8063afa4f3b21461063a578063be8efa131461065a578063dd62ed3e1461067a578063df8408fe1461069a578063e2f45605146106ba57610246565b80639a7a23d6116100f25780639a7a23d61461059a578063a046bc78146105ba578063a457c2d7146105da578063a9059cbb146105fa578063aec9b6f41461061a57610246565b80637c9e75c01461050657806386608326146105265780638da5cb5b1461054757806395d89b411461056557806396ac81c51461057a57610246565b80632d48e896116101bc5780635bcf8418116101805780635bcf84181461047b57806360e719621461049b57806370a08231146104b157806370d5ae05146104d1578063715018a6146104f157610246565b80632d48e896146103cf578063313ce567146103ef578063395093511461040b578063400ce2301461042b5780635342acb41461044b57610246565b806323b872dd1161020357806323b872dd1461031f578063241da44a1461033f578063244ce7db1461035f578063255fe8471461037f5780632bf030df146103af57610246565b806306fdde031461024b578063095ea7b3146102765780630a2d140c146102a65780630bf633d5146102c857806318160ddd1461030057610246565b3661024657005b600080fd5b34801561025757600080fd5b50610260610770565b60405161026d919061337c565b60405180910390f35b34801561028257600080fd5b50610296610291366004613228565b610802565b604051901515815260200161026d565b3480156102b257600080fd5b506102c66102c1366004613253565b61081a565b005b3480156102d457600080fd5b506016546102e8906001600160a01b031681565b6040516001600160a01b03909116815260200161026d565b34801561030c57600080fd5b506002545b60405190815260200161026d565b34801561032b57600080fd5b5061029661033a3660046131b4565b610840565b34801561034b57600080fd5b506011546102e8906001600160a01b031681565b34801561036b57600080fd5b506102c661037a36600461326d565b610864565b34801561038b57600080fd5b5061029661039a36600461313d565b601b6020526000908152604090205460ff1681565b3480156103bb57600080fd5b506017546102e8906001600160a01b031681565b3480156103db57600080fd5b506102c66103ea36600461329d565b6108c8565b3480156103fb57600080fd5b506040516012815260200161026d565b34801561041757600080fd5b50610296610426366004613228565b610a69565b34801561043757600080fd5b5061031161044636600461326d565b610a8b565b34801561045757600080fd5b5061029661046636600461313d565b601a6020526000908152604090205460ff1681565b34801561048757600080fd5b5061031161049636600461326d565b610aac565b3480156104a757600080fd5b50610311600a5481565b3480156104bd57600080fd5b506103116104cc36600461313d565b610abc565b3480156104dd57600080fd5b506010546102e8906001600160a01b031681565b3480156104fd57600080fd5b506102c6610adb565b34801561051257600080fd5b506013546102e8906001600160a01b031681565b34801561053257600080fd5b5060185461029690600160a81b900460ff1681565b34801561055357600080fd5b506005546001600160a01b03166102e8565b34801561057157600080fd5b50610260610aef565b34801561058657600080fd5b506018546102e8906001600160a01b031681565b3480156105a657600080fd5b506102c66105b53660046131f4565b610afe565b3480156105c657600080fd5b506103116105d536600461326d565b610baf565b3480156105e657600080fd5b506102966105f5366004613228565b610bbf565b34801561060657600080fd5b50610296610615366004613228565b610c3a565b34801561062657600080fd5b50600e546102e8906001600160a01b031681565b34801561064657600080fd5b506102c661065536600461326d565b610c48565b34801561066657600080fd5b506014546102e8906001600160a01b031681565b34801561068657600080fd5b5061031161069536600461317c565b610d54565b3480156106a657600080fd5b506102c66106b53660046131f4565b610d7f565b3480156106c657600080fd5b5061031160095481565b3480156106dc57600080fd5b506102c66106eb36600461313d565b610e63565b3480156106fc57600080fd5b506102c661070b3660046131f4565b610edc565b34801561071c57600080fd5b506015546102e8906001600160a01b031681565b34801561073c57600080fd5b50600f546102e8906001600160a01b031681565b34801561075c57600080fd5b506012546102e8906001600160a01b031681565b60606003805461077f90613479565b80601f01602080910402602001604051908101604052809291908181526020018280546107ab90613479565b80156107f85780601f106107cd576101008083540402835291602001916107f8565b820191906000526020600020905b8154815290600101906020018083116107db57829003601f168201915b5050505050905090565b60003361081081858561122a565b5060019392505050565b61082261134e565b60188054911515600160a81b0260ff60a81b19909216919091179055565b60003361084e8582856113a8565b610859858585611422565b506001949350505050565b61086c61134e565b620b71b081106108c35760405162461bcd60e51b815260206004820152601960248201527f4761732069732067726561746572207468616e206c696d69740000000000000060448201526064015b60405180910390fd5b600a55565b6108d061134e565b6015546040516316a4744b60e11b815260048101849052602481018390526001600160a01b0390911690632d48e89690604401600060405180830381600087803b15801561091d57600080fd5b505af1158015610931573d6000803e3d6000fd5b50506017546040516316a4744b60e11b815260048101869052602481018590526001600160a01b039091169250632d48e8969150604401600060405180830381600087803b15801561098257600080fd5b505af1158015610996573d6000803e3d6000fd5b50506016546040516316a4744b60e11b815260048101869052602481018590526001600160a01b039091169250632d48e8969150604401600060405180830381600087803b1580156109e757600080fd5b505af11580156109fb573d6000803e3d6000fd5b50506018546040516316a4744b60e11b815260048101869052602481018590526001600160a01b039091169250632d48e89691506044015b600060405180830381600087803b158015610a4d57600080fd5b505af1158015610a61573d6000803e3d6000fd5b505050505050565b600033610810818585610a7c8383610d54565b610a86919061340b565b61122a565b60078181548110610a9b57600080fd5b600091825260209091200154905081565b60088181548110610a9b57600080fd5b6001600160a01b0381166000908152602081905260409020545b919050565b610ae361134e565b610aed60006123c9565b565b60606004805461077f90613479565b610b0661134e565b6001600160a01b038216610b4b5760405162461bcd60e51b815260206004820152600c60248201526b5a65726f206164647265737360a01b60448201526064016108ba565b6001600160a01b0382166000818152601b6020908152604091829020805460ff19168515159081179091558251938452908301527fef0b71f3a695ce5a89064cc2745d0c503cf766ed985e781607660be6010b8e9091015b60405180910390a15050565b60068181548110610a9b57600080fd5b60003381610bcd8286610d54565b905083811015610c2d5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016108ba565b610859828686840361122a565b600033610810818585611422565b610c5061134e565b600254811115610cb25760405162461bcd60e51b815260206004820152602760248201527f416d6f756e742063616e6e6f74206265206f7665722074686520746f74616c2060448201526639bab838363c9760c91b60648201526084016108ba565b681b1ae4d6e2ef500000811015610d195760405162461bcd60e51b815260206004820152602560248201527f4d696e696d756d20603530306020746f6b656e207065722073776170207265716044820152641d5a5c995960da1b60648201526084016108ba565b60098190556040518181527f28ea3a80049e637c2f1bf658d47a07f688bea6e931f3c1930cf4a4daf97b18609060200160405180910390a150565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b610d8761134e565b6001600160a01b0382166000908152601a602052604090205460ff1615158115151415610e075760405162461bcd60e51b815260206004820152602860248201527f4163636f756e7420697320616c7265616479207468652076616c7565206f6620604482015267277374617475732760c01b60648201526084016108ba565b6001600160a01b0382166000818152601a6020908152604091829020805460ff19168515159081179091558251938452908301527ff1bf6e8d74573725f529c5a07fb53656b9c97a10602a75631f57c1be07769e2b9101610ba3565b610e6b61134e565b6001600160a01b038116610ed05760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016108ba565b610ed9816123c9565b50565b610ee461134e565b6001600160a01b0382166000908152601960205260409020805460ff191682158015919091179091556110aa57601554604051630a5b654b60e11b81526001600160a01b03909116906314b6ca9690610f4490859060009060040161332e565b600060405180830381600087803b158015610f5e57600080fd5b505af1158015610f72573d6000803e3d6000fd5b5050601754604051630a5b654b60e11b81526001600160a01b0390911692506314b6ca969150610fa990859060009060040161332e565b600060405180830381600087803b158015610fc357600080fd5b505af1158015610fd7573d6000803e3d6000fd5b5050601654604051630a5b654b60e11b81526001600160a01b0390911692506314b6ca96915061100e90859060009060040161332e565b600060405180830381600087803b15801561102857600080fd5b505af115801561103c573d6000803e3d6000fd5b5050601854604051630a5b654b60e11b81526001600160a01b0390911692506314b6ca96915061107390859060009060040161332e565b600060405180830381600087803b15801561108d57600080fd5b505af11580156110a1573d6000803e3d6000fd5b50505050611226565b6015546001600160a01b03166314b6ca96836110c581610abc565b6040518363ffffffff1660e01b81526004016110e292919061332e565b600060405180830381600087803b1580156110fc57600080fd5b505af1158015611110573d6000803e3d6000fd5b50506017546001600160a01b031691506314b6ca9690508361113181610abc565b6040518363ffffffff1660e01b815260040161114e92919061332e565b600060405180830381600087803b15801561116857600080fd5b505af115801561117c573d6000803e3d6000fd5b50506016546001600160a01b031691506314b6ca9690508361119d81610abc565b6040518363ffffffff1660e01b81526004016111ba92919061332e565b600060405180830381600087803b1580156111d457600080fd5b505af11580156111e8573d6000803e3d6000fd5b50506018546001600160a01b031691506314b6ca9690508361120981610abc565b6040518363ffffffff1660e01b8152600401610a3392919061332e565b5050565b6001600160a01b03831661128c5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016108ba565b6001600160a01b0382166112ed5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016108ba565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6005546001600160a01b03163314610aed5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108ba565b60006113b48484610d54565b9050600019811461141c578181101561140f5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016108ba565b61141c848484840361122a565b50505050565b600061142d30610abc565b6009549091508110801590819061144e5750601854600160a01b900460ff16155b801561147257506001600160a01b0384166000908152601b602052604090205460ff165b15611de75760006002600b546114889190613423565b600c54600d549192509060008161149f848661340b565b6114a9919061340b565b90506009548110611de2576018805460ff60a01b1916600160a01b1790556009546114d39061241b565b476000826114e18784613443565b6114eb9190613423565b90506000836114fa8785613443565b6115049190613423565b90506000816115138486613462565b61151d9190613462565b90508015611d4c576000611532600483613423565b90508015611d21576011546015546040516370a0823160e01b81526001600160a01b03918216600482015260009291909116906370a082319060240160206040518083038186803b15801561158657600080fd5b505afa15801561159a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115be9190613285565b90506115c98261256a565b6011546015546040516370a0823160e01b81526001600160a01b039182166004820152600092849216906370a082319060240160206040518083038186803b15801561161457600080fd5b505afa158015611628573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061164c9190613285565b6116569190613462565b6015549091506001600160a01b031663b6b55f25611675600284613423565b6040518263ffffffff1660e01b815260040161169391815260200190565b600060405180830381600087803b1580156116ad57600080fd5b505af11580156116c1573d6000803e3d6000fd5b50506015546001600160a01b031691506342966c6890506116e3600284613423565b6040518263ffffffff1660e01b815260040161170191815260200190565b600060405180830381600087803b15801561171b57600080fd5b505af115801561172f573d6000803e3d6000fd5b50506013546016546040516370a0823160e01b81526001600160a01b03918216600482015260009450911691506370a082319060240160206040518083038186803b15801561177d57600080fd5b505afa158015611791573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117b59190613285565b90506117c0846126e9565b6013546016546040516370a0823160e01b81526001600160a01b039182166004820152600092849216906370a082319060240160206040518083038186803b15801561180b57600080fd5b505afa15801561181f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118439190613285565b61184d9190613462565b6016549091506001600160a01b031663b6b55f2561186c600284613423565b6040518263ffffffff1660e01b815260040161188a91815260200190565b600060405180830381600087803b1580156118a457600080fd5b505af11580156118b8573d6000803e3d6000fd5b50506016546001600160a01b031691506342966c6890506118da600284613423565b6040518263ffffffff1660e01b81526004016118f891815260200190565b600060405180830381600087803b15801561191257600080fd5b505af1158015611926573d6000803e3d6000fd5b50506014546017546040516370a0823160e01b81526001600160a01b03918216600482015260009450911691506370a082319060240160206040518083038186803b15801561197457600080fd5b505afa158015611988573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119ac9190613285565b90506119b786612832565b6014546017546040516370a0823160e01b81526001600160a01b039182166004820152600092849216906370a082319060240160206040518083038186803b158015611a0257600080fd5b505afa158015611a16573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a3a9190613285565b611a449190613462565b6017549091506001600160a01b031663b6b55f25611a63600284613423565b6040518263ffffffff1660e01b8152600401611a8191815260200190565b600060405180830381600087803b158015611a9b57600080fd5b505af1158015611aaf573d6000803e3d6000fd5b50506017546001600160a01b031691506342966c689050611ad1600284613423565b6040518263ffffffff1660e01b8152600401611aef91815260200190565b600060405180830381600087803b158015611b0957600080fd5b505af1158015611b1d573d6000803e3d6000fd5b50506012546018546040516370a0823160e01b81526001600160a01b03918216600482015260009450911691506370a082319060240160206040518083038186803b158015611b6b57600080fd5b505afa158015611b7f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ba39190613285565b9050611bae8861297b565b6012546018546040516370a0823160e01b81526001600160a01b039182166004820152600092849216906370a082319060240160206040518083038186803b158015611bf957600080fd5b505afa158015611c0d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c319190613285565b611c3b9190613462565b6018549091506001600160a01b031663b6b55f25611c5a600284613423565b6040518263ffffffff1660e01b8152600401611c7891815260200190565b600060405180830381600087803b158015611c9257600080fd5b505af1158015611ca6573d6000803e3d6000fd5b50506018546001600160a01b031691506342966c689050611cc8600284613423565b6040518263ffffffff1660e01b8152600401611ce691815260200190565b600060405180830381600087803b158015611d0057600080fd5b505af1158015611d14573d6000803e3d6000fd5b5050505050505050505050505b8587600954611d309190613443565b611d3a9190613423565b600d54611d479190613462565b600d55505b8115611d8557611d5b82612ac4565b8487600954611d6a9190613443565b611d749190613423565b600c54611d819190613462565b600c555b8215611dd05760008589600954611d9c9190613443565b611da69190613423565b9050611db28185612c10565b8081600b54611dc19190613462565b611dcb9190613462565b600b55505b50506018805460ff60a01b1916905550505b505050505b6001600160a01b0385166000908152601a602052604090205460ff1680611e2657506001600160a01b0384166000908152601a602052604090205460ff165b15611e3b57611e36858585612ccc565b611ec1565b6001600160a01b038085166000908152601b60205260408082205492881682528120549091611e9891869160ff9081169116158015611e9357506001600160a01b0388166000908152601b602052604090205460ff16155b612e9a565b90508015611eab57611eab863083612ccc565b611ebf8686611eba8488613462565b612ccc565b505b6001600160a01b03851660009081526019602052604090205460ff16612072576015546001600160a01b03166314b6ca9686611efc81610abc565b6040518363ffffffff1660e01b8152600401611f1992919061332e565b600060405180830381600087803b158015611f3357600080fd5b505af1925050508015611f44575060015b506016546001600160a01b03166314b6ca9686611f6081610abc565b6040518363ffffffff1660e01b8152600401611f7d92919061332e565b600060405180830381600087803b158015611f9757600080fd5b505af1925050508015611fa8575060015b506017546001600160a01b03166314b6ca9686611fc481610abc565b6040518363ffffffff1660e01b8152600401611fe192919061332e565b600060405180830381600087803b158015611ffb57600080fd5b505af192505050801561200c575060015b506018546001600160a01b03166314b6ca968661202881610abc565b6040518363ffffffff1660e01b815260040161204592919061332e565b600060405180830381600087803b15801561205f57600080fd5b505af1925050508015612070575060015b505b6001600160a01b03841660009081526019602052604090205460ff16612223576015546001600160a01b03166314b6ca96856120ad81610abc565b6040518363ffffffff1660e01b81526004016120ca92919061332e565b600060405180830381600087803b1580156120e457600080fd5b505af19250505080156120f5575060015b506016546001600160a01b03166314b6ca968561211181610abc565b6040518363ffffffff1660e01b815260040161212e92919061332e565b600060405180830381600087803b15801561214857600080fd5b505af1925050508015612159575060015b506017546001600160a01b03166314b6ca968561217581610abc565b6040518363ffffffff1660e01b815260040161219292919061332e565b600060405180830381600087803b1580156121ac57600080fd5b505af19250505080156121bd575060015b506018546001600160a01b03166314b6ca96856121d981610abc565b6040518363ffffffff1660e01b81526004016121f692919061332e565b600060405180830381600087803b15801561221057600080fd5b505af1925050508015612221575060015b505b601854600160a81b900460ff16156123c257601554600a546040516001624d3b8760e01b031981526001600160a01b039092169163ffb2c4799161226d9160040190815260200190565b600060405180830381600087803b15801561228757600080fd5b505af1925050508015612298575060015b50601654600a546040516001624d3b8760e01b031981526001600160a01b039092169163ffb2c479916122d19160040190815260200190565b600060405180830381600087803b1580156122eb57600080fd5b505af19250505080156122fc575060015b50601754600a546040516001624d3b8760e01b031981526001600160a01b039092169163ffb2c479916123359160040190815260200190565b600060405180830381600087803b15801561234f57600080fd5b505af1925050508015612360575060015b50601854600a546040516001624d3b8760e01b031981526001600160a01b039092169163ffb2c479916123999160040190815260200190565b600060405180830381600087803b1580156123b357600080fd5b505af1925050508015610a6157505b5050505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061245e57634e487b7160e01b600052603260045260246000fd5b6001600160a01b03928316602091820292909201810191909152600e546040805163ef8ef56f60e01b81529051919093169263ef8ef56f926004808301939192829003018186803b1580156124b257600080fd5b505afa1580156124c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124ea9190613160565b8160018151811061250b57634e487b7160e01b600052603260045260246000fd5b6001600160a01b039283166020918202929092010152600e54612531913091168461122a565b600e5460405163791ac94760e01b81526001600160a01b039091169063791ac94790610a339085906000908690309042906004016133cf565b6040805160028082526060820183526000926020830190803683375050600e546040805163ef8ef56f60e01b815290519394506001600160a01b039091169263ef8ef56f92506004808301926020929190829003018186803b1580156125cf57600080fd5b505afa1580156125e3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126079190613160565b8160008151811061262857634e487b7160e01b600052603260045260246000fd5b6001600160a01b03928316602091820292909201015260115482519116908290600190811061266757634e487b7160e01b600052603260045260246000fd5b6001600160a01b039283166020918202929092010152600e5460155460405163b6f9de9560e01b81529183169263b6f9de959286926126b3926000928892909116904290600401613347565b6000604051808303818588803b1580156126cc57600080fd5b505af11580156126e0573d6000803e3d6000fd5b50505050505050565b6040805160028082526060820183526000926020830190803683375050600e546040805163ef8ef56f60e01b815290519394506001600160a01b039091169263ef8ef56f92506004808301926020929190829003018186803b15801561274e57600080fd5b505afa158015612762573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127869190613160565b816000815181106127a757634e487b7160e01b600052603260045260246000fd5b6001600160a01b0392831660209182029290920101526013548251911690829060019081106127e657634e487b7160e01b600052603260045260246000fd5b6001600160a01b039283166020918202929092010152600e5460165460405163b6f9de9560e01b81529183169263b6f9de959286926126b3926000928892909116904290600401613347565b6040805160028082526060820183526000926020830190803683375050600e546040805163ef8ef56f60e01b815290519394506001600160a01b039091169263ef8ef56f92506004808301926020929190829003018186803b15801561289757600080fd5b505afa1580156128ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128cf9190613160565b816000815181106128f057634e487b7160e01b600052603260045260246000fd5b6001600160a01b03928316602091820292909201015260145482519116908290600190811061292f57634e487b7160e01b600052603260045260246000fd5b6001600160a01b039283166020918202929092010152600e5460175460405163b6f9de9560e01b81529183169263b6f9de959286926126b3926000928892909116904290600401613347565b6040805160028082526060820183526000926020830190803683375050600e546040805163ef8ef56f60e01b815290519394506001600160a01b039091169263ef8ef56f92506004808301926020929190829003018186803b1580156129e057600080fd5b505afa1580156129f4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a189190613160565b81600081518110612a3957634e487b7160e01b600052603260045260246000fd5b6001600160a01b039283166020918202929092010152601254825191169082906001908110612a7857634e487b7160e01b600052603260045260246000fd5b6001600160a01b039283166020918202929092010152600e5460185460405163b6f9de9560e01b81529183169263b6f9de959286926126b3926000928892909116904290600401613347565b6040805160028082526060820183526000926020830190803683375050600e546040805163ef8ef56f60e01b815290519394506001600160a01b039091169263ef8ef56f92506004808301926020929190829003018186803b158015612b2957600080fd5b505afa158015612b3d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b619190613160565b81600081518110612b8257634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b0316815250503081600181518110612bc457634e487b7160e01b600052603260045260246000fd5b6001600160a01b039283166020918202929092010152600e5460105460405163b6f9de9560e01b81529183169263b6f9de959286926126b3926000928892909116904290600401613347565b600e54612c289030906001600160a01b03168461122a565b600e5460105460405163f305d71960e01b81523060048201526024810185905260006044820181905260648201526001600160a01b0391821660848201524260a482015291169063f305d71990839060c4016060604051808303818588803b158015612c9357600080fd5b505af1158015612ca7573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906123c291906132be565b6001600160a01b038316612d305760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016108ba565b6001600160a01b038216612d925760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016108ba565b6001600160a01b03831660009081526020819052604090205481811015612e0a5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016108ba565b6001600160a01b03808516600090815260208190526040808220858503905591851681529081208054849290612e4190849061340b565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051612e8d91815260200190565b60405180910390a361141c565b60008061271083612f0f5784612edc576006600081548110612ecc57634e487b7160e01b600052603260045260246000fd5b9060005260206000200154612f0a565b6006600181548110612efe57634e487b7160e01b600052603260045260246000fd5b90600052602060002001545b612f3d565b6006600281548110612f3157634e487b7160e01b600052603260045260246000fd5b90600052602060002001545b612f479087613443565b612f519190613423565b9050600061271084612fc75785612f94576007600081548110612f8457634e487b7160e01b600052603260045260246000fd5b9060005260206000200154612fc2565b6007600181548110612fb657634e487b7160e01b600052603260045260246000fd5b90600052602060002001545b612ff5565b6007600281548110612fe957634e487b7160e01b600052603260045260246000fd5b90600052602060002001545b612fff9088613443565b6130099190613423565b905060006127108561307f578661304c57600860008154811061303c57634e487b7160e01b600052603260045260246000fd5b906000526020600020015461307a565b600860018154811061306e57634e487b7160e01b600052603260045260246000fd5b90600052602060002001545b6130ad565b60086002815481106130a157634e487b7160e01b600052603260045260246000fd5b90600052602060002001545b6130b79089613443565b6130c19190613423565b905082600b60008282546130d5919061340b565b9250508190555081600c60008282546130ee919061340b565b9250508190555080600d6000828254613107919061340b565b90915550819050613118838561340b565b613122919061340b565b979650505050505050565b80358015158114610ad657600080fd5b60006020828403121561314e578081fd5b8135613159816134ca565b9392505050565b600060208284031215613171578081fd5b8151613159816134ca565b6000806040838503121561318e578081fd5b8235613199816134ca565b915060208301356131a9816134ca565b809150509250929050565b6000806000606084860312156131c8578081fd5b83356131d3816134ca565b925060208401356131e3816134ca565b929592945050506040919091013590565b60008060408385031215613206578182fd5b8235613211816134ca565b915061321f6020840161312d565b90509250929050565b6000806040838503121561323a578182fd5b8235613245816134ca565b946020939093013593505050565b600060208284031215613264578081fd5b6131598261312d565b60006020828403121561327e578081fd5b5035919050565b600060208284031215613296578081fd5b5051919050565b600080604083850312156132af578182fd5b50508035926020909101359150565b6000806000606084860312156132d2578283fd5b8351925060208401519150604084015190509250925092565b6000815180845260208085019450808401835b838110156133235781516001600160a01b0316875295820195908201906001016132fe565b509495945050505050565b6001600160a01b03929092168252602082015260400190565b60008582526080602083015261336060808301866132eb565b6001600160a01b03949094166040830152506060015292915050565b6000602080835283518082850152825b818110156133a85785810183015185820160400152820161338c565b818111156133b95783604083870101525b50601f01601f1916929092016040019392505050565b600086825285602083015260a060408301526133ee60a08301866132eb565b6001600160a01b0394909416606083015250608001529392505050565b6000821982111561341e5761341e6134b4565b500190565b60008261343e57634e487b7160e01b81526012600452602481fd5b500490565b600081600019048311821515161561345d5761345d6134b4565b500290565b600082821015613474576134746134b4565b500390565b60028104600182168061348d57607f821691505b602082108114156134ae57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b0381168114610ed957600080fdfea26469706673582212202ec9bec23ff6450345bf498385af73e18e950c184ee550cfee12e8825147bdbf64736f6c634300080200336080604052610e10600a55670de0b6b3a7640000600b5534801561002257600080fd5b50604051610e12380380610e128339810160408190526100419161006f565b600180546001600160a01b039092166001600160a01b0319928316179055600080549091163317905561009d565b600060208284031215610080578081fd5b81516001600160a01b0381168114610096578182fd5b9392505050565b610d66806100ac6000396000f3fe60806040526004361061010d5760003560e01c8063997664d711610095578063e2d2e21911610064578063e2d2e219146102f9578063efca2eed1461030f578063f7c618c114610325578063ffb2c4791461035d578063ffd49c841461037d57610114565b8063997664d71461023f578063b6b55f2514610255578063ce7c2ac214610275578063d4fda1f2146102cc57610114565b806337563293116100dc57806337563293146101b15780633a98ef39146101c657806342966c68146101dc5780634fab0ae8146101fc57806366817df51461021257610114565b806311ce023d1461011957806314b6ca961461014f57806328fd3198146101715780632d48e8961461019157610114565b3661011457005b600080fd5b34801561012557600080fd5b5061013c6ec097ce7bc90715b34b9f100000000081565b6040519081526020015b60405180910390f35b34801561015b57600080fd5b5061016f61016a366004610bef565b610393565b005b34801561017d57600080fd5b5061013c61018c366004610bce565b610527565b34801561019d57600080fd5b5061016f6101ac366004610c50565b6105b3565b3480156101bd57600080fd5b5061016f610624565b3480156101d257600080fd5b5061013c60065481565b3480156101e857600080fd5b5061016f6101f7366004610c38565b61063d565b34801561020857600080fd5b5061013c600b5481565b34801561021e57600080fd5b5061013c61022d366004610bce565b60046020526000908152604090205481565b34801561024b57600080fd5b5061013c60075481565b34801561026157600080fd5b5061016f610270366004610c38565b6106f1565b34801561028157600080fd5b506102b1610290366004610bce565b60056020526000908152604090208054600182015460029092015490919083565b60408051938452602084019290925290820152606001610146565b3480156102d857600080fd5b5061013c6102e7366004610bce565b60036020526000908152604090205481565b34801561030557600080fd5b5061013c60095481565b34801561031b57600080fd5b5061013c60085481565b34801561033157600080fd5b50600154610345906001600160a01b031681565b6040516001600160a01b039091168152602001610146565b34801561036957600080fd5b5061016f610378366004610c38565b610798565b34801561038957600080fd5b5061013c600a5481565b6000546001600160a01b031633146103c65760405162461bcd60e51b81526004016103bd90610c71565b60405180910390fd5b6001600160a01b038216600090815260056020526040902054156103ed576103ed826108ca565b60008111801561041357506001600160a01b038216600090815260056020526040902054155b1561047957600280546001600160a01b0384166000818152600360205260408120839055600183018455929092527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace0180546001600160a01b03191690911790556104ac565b8015801561049e57506001600160a01b03821660009081526005602052604090205415155b156104ac576104ac826109f5565b6001600160a01b03821660009081526005602052604090205460065482916104d391610ce8565b6104dd9190610c91565b6006556001600160a01b038216600090815260056020526040902081905561050481610b42565b6001600160a01b0390921660009081526005602052604090206001019190915550565b6001600160a01b03811660009081526005602052604081205461054c575060006105ae565b6001600160a01b03821660009081526005602052604081205461056e90610b42565b6001600160a01b03841660009081526005602052604090206001015490915080821161059f576000925050506105ae565b6105a98183610ce8565b925050505b919050565b6000546001600160a01b031633146105dd5760405162461bcd60e51b81526004016103bd90610c71565b600a829055600b81905560408051838152602081018390527f7d38de579bb682aa05ace7e32d15f88df69a3a53f6f89fcd0236f93fcc7e6362910160405180910390a15050565b61062d33610b72565b1561063b5761063b336108ca565b565b6000546001600160a01b031633146106675760405162461bcd60e51b81526004016103bd90610c71565b60015460405163a9059cbb60e01b81526103696004820152602481018390526001600160a01b039091169063a9059cbb90604401602060405180830381600087803b1580156106b557600080fd5b505af11580156106c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106ed9190610c18565b5050565b6000546001600160a01b0316331461071b5760405162461bcd60e51b81526004016103bd90610c71565b806007546107299190610c91565b600755600654610748826ec097ce7bc90715b34b9f1000000000610cc9565b6107529190610ca9565b60095461075f9190610c91565b6009556040518181527f6a464fbfd2428ef7edab93930e64042148498d37c64c5122c4ab37843d6a3d119060200160405180910390a150565b6000546001600160a01b031633146107c25760405162461bcd60e51b81526004016103bd90610c71565b600254806107d057506108c7565b6000805a905060005b84831080156107e757508381105b156108c25783600c54106107fb576000600c555b61083b6002600c548154811061082157634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b0316610b72565b15610880576108806002600c548154811061086657634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b03166108ca565b5a61088b8385610c91565b6108959190610ce8565b92505a600c805491935060006108aa83610cff565b919050555080806108ba90610cff565b9150506107d9565b505050505b50565b6001600160a01b0381166000908152600560205260409020546108ec576108c7565b60006108f782610527565b905080156106ed5760015460405163a9059cbb60e01b81526001600160a01b038481166004830152602482018490529091169063a9059cbb90604401602060405180830381600087803b15801561094d57600080fd5b505af1158015610961573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109859190610c18565b50806008546109949190610c91565b6008556001600160a01b038216600090815260046020908152604080832042905560059091529020600201546109cb908290610c91565b6001600160a01b038316600090815260056020526040902060028101919091555461050490610b42565b60028054610a0590600190610ce8565b81548110610a2357634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b0384811684526003909252604090922054600280549290931692918110610a6f57634e487b7160e01b600052603260045260246000fd5b600091825260208083209190910180546001600160a01b0319166001600160a01b03948516179055918316815260039182905260408120546002805491939291610abb90600190610ce8565b81548110610ad957634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b031683528201929092526040019020556002805480610b1d57634e487b7160e01b600052603160045260246000fd5b600082815260209020810160001990810180546001600160a01b031916905501905550565b60006ec097ce7bc90715b34b9f100000000060095483610b629190610cc9565b610b6c9190610ca9565b92915050565b600a546001600160a01b03821660009081526004602052604081205490914291610b9c9190610c91565b108015610b6c5750600b54610bb083610527565b1192915050565b80356001600160a01b03811681146105ae57600080fd5b600060208284031215610bdf578081fd5b610be882610bb7565b9392505050565b60008060408385031215610c01578081fd5b610c0a83610bb7565b946020939093013593505050565b600060208284031215610c29578081fd5b81518015158114610be8578182fd5b600060208284031215610c49578081fd5b5035919050565b60008060408385031215610c62578182fd5b50508035926020909101359150565b60208082526006908201526510aa37b5b2b760d11b604082015260600190565b60008219821115610ca457610ca4610d1a565b500190565b600082610cc457634e487b7160e01b81526012600452602481fd5b500490565b6000816000190483118215151615610ce357610ce3610d1a565b500290565b600082821015610cfa57610cfa610d1a565b500390565b6000600019821415610d1357610d13610d1a565b5060010190565b634e487b7160e01b600052601160045260246000fdfea2646970667358221220eed47793cf4f74ae58e28774bb4e53792d9c019178be6a11254112d28a35e8b164736f6c63430008020033

Deployed ByteCode

0x60806040526004361061023f5760003560e01c80637c9e75c01161012e578063afa4f3b2116100ab578063f2fde38b1161006f578063f2fde38b146106d0578063f708a64f146106f0578063f998e65e14610710578063fe3f52f414610730578063fe6b54ce1461075057610246565b8063afa4f3b21461063a578063be8efa131461065a578063dd62ed3e1461067a578063df8408fe1461069a578063e2f45605146106ba57610246565b80639a7a23d6116100f25780639a7a23d61461059a578063a046bc78146105ba578063a457c2d7146105da578063a9059cbb146105fa578063aec9b6f41461061a57610246565b80637c9e75c01461050657806386608326146105265780638da5cb5b1461054757806395d89b411461056557806396ac81c51461057a57610246565b80632d48e896116101bc5780635bcf8418116101805780635bcf84181461047b57806360e719621461049b57806370a08231146104b157806370d5ae05146104d1578063715018a6146104f157610246565b80632d48e896146103cf578063313ce567146103ef578063395093511461040b578063400ce2301461042b5780635342acb41461044b57610246565b806323b872dd1161020357806323b872dd1461031f578063241da44a1461033f578063244ce7db1461035f578063255fe8471461037f5780632bf030df146103af57610246565b806306fdde031461024b578063095ea7b3146102765780630a2d140c146102a65780630bf633d5146102c857806318160ddd1461030057610246565b3661024657005b600080fd5b34801561025757600080fd5b50610260610770565b60405161026d919061337c565b60405180910390f35b34801561028257600080fd5b50610296610291366004613228565b610802565b604051901515815260200161026d565b3480156102b257600080fd5b506102c66102c1366004613253565b61081a565b005b3480156102d457600080fd5b506016546102e8906001600160a01b031681565b6040516001600160a01b03909116815260200161026d565b34801561030c57600080fd5b506002545b60405190815260200161026d565b34801561032b57600080fd5b5061029661033a3660046131b4565b610840565b34801561034b57600080fd5b506011546102e8906001600160a01b031681565b34801561036b57600080fd5b506102c661037a36600461326d565b610864565b34801561038b57600080fd5b5061029661039a36600461313d565b601b6020526000908152604090205460ff1681565b3480156103bb57600080fd5b506017546102e8906001600160a01b031681565b3480156103db57600080fd5b506102c66103ea36600461329d565b6108c8565b3480156103fb57600080fd5b506040516012815260200161026d565b34801561041757600080fd5b50610296610426366004613228565b610a69565b34801561043757600080fd5b5061031161044636600461326d565b610a8b565b34801561045757600080fd5b5061029661046636600461313d565b601a6020526000908152604090205460ff1681565b34801561048757600080fd5b5061031161049636600461326d565b610aac565b3480156104a757600080fd5b50610311600a5481565b3480156104bd57600080fd5b506103116104cc36600461313d565b610abc565b3480156104dd57600080fd5b506010546102e8906001600160a01b031681565b3480156104fd57600080fd5b506102c6610adb565b34801561051257600080fd5b506013546102e8906001600160a01b031681565b34801561053257600080fd5b5060185461029690600160a81b900460ff1681565b34801561055357600080fd5b506005546001600160a01b03166102e8565b34801561057157600080fd5b50610260610aef565b34801561058657600080fd5b506018546102e8906001600160a01b031681565b3480156105a657600080fd5b506102c66105b53660046131f4565b610afe565b3480156105c657600080fd5b506103116105d536600461326d565b610baf565b3480156105e657600080fd5b506102966105f5366004613228565b610bbf565b34801561060657600080fd5b50610296610615366004613228565b610c3a565b34801561062657600080fd5b50600e546102e8906001600160a01b031681565b34801561064657600080fd5b506102c661065536600461326d565b610c48565b34801561066657600080fd5b506014546102e8906001600160a01b031681565b34801561068657600080fd5b5061031161069536600461317c565b610d54565b3480156106a657600080fd5b506102c66106b53660046131f4565b610d7f565b3480156106c657600080fd5b5061031160095481565b3480156106dc57600080fd5b506102c66106eb36600461313d565b610e63565b3480156106fc57600080fd5b506102c661070b3660046131f4565b610edc565b34801561071c57600080fd5b506015546102e8906001600160a01b031681565b34801561073c57600080fd5b50600f546102e8906001600160a01b031681565b34801561075c57600080fd5b506012546102e8906001600160a01b031681565b60606003805461077f90613479565b80601f01602080910402602001604051908101604052809291908181526020018280546107ab90613479565b80156107f85780601f106107cd576101008083540402835291602001916107f8565b820191906000526020600020905b8154815290600101906020018083116107db57829003601f168201915b5050505050905090565b60003361081081858561122a565b5060019392505050565b61082261134e565b60188054911515600160a81b0260ff60a81b19909216919091179055565b60003361084e8582856113a8565b610859858585611422565b506001949350505050565b61086c61134e565b620b71b081106108c35760405162461bcd60e51b815260206004820152601960248201527f4761732069732067726561746572207468616e206c696d69740000000000000060448201526064015b60405180910390fd5b600a55565b6108d061134e565b6015546040516316a4744b60e11b815260048101849052602481018390526001600160a01b0390911690632d48e89690604401600060405180830381600087803b15801561091d57600080fd5b505af1158015610931573d6000803e3d6000fd5b50506017546040516316a4744b60e11b815260048101869052602481018590526001600160a01b039091169250632d48e8969150604401600060405180830381600087803b15801561098257600080fd5b505af1158015610996573d6000803e3d6000fd5b50506016546040516316a4744b60e11b815260048101869052602481018590526001600160a01b039091169250632d48e8969150604401600060405180830381600087803b1580156109e757600080fd5b505af11580156109fb573d6000803e3d6000fd5b50506018546040516316a4744b60e11b815260048101869052602481018590526001600160a01b039091169250632d48e89691506044015b600060405180830381600087803b158015610a4d57600080fd5b505af1158015610a61573d6000803e3d6000fd5b505050505050565b600033610810818585610a7c8383610d54565b610a86919061340b565b61122a565b60078181548110610a9b57600080fd5b600091825260209091200154905081565b60088181548110610a9b57600080fd5b6001600160a01b0381166000908152602081905260409020545b919050565b610ae361134e565b610aed60006123c9565b565b60606004805461077f90613479565b610b0661134e565b6001600160a01b038216610b4b5760405162461bcd60e51b815260206004820152600c60248201526b5a65726f206164647265737360a01b60448201526064016108ba565b6001600160a01b0382166000818152601b6020908152604091829020805460ff19168515159081179091558251938452908301527fef0b71f3a695ce5a89064cc2745d0c503cf766ed985e781607660be6010b8e9091015b60405180910390a15050565b60068181548110610a9b57600080fd5b60003381610bcd8286610d54565b905083811015610c2d5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016108ba565b610859828686840361122a565b600033610810818585611422565b610c5061134e565b600254811115610cb25760405162461bcd60e51b815260206004820152602760248201527f416d6f756e742063616e6e6f74206265206f7665722074686520746f74616c2060448201526639bab838363c9760c91b60648201526084016108ba565b681b1ae4d6e2ef500000811015610d195760405162461bcd60e51b815260206004820152602560248201527f4d696e696d756d20603530306020746f6b656e207065722073776170207265716044820152641d5a5c995960da1b60648201526084016108ba565b60098190556040518181527f28ea3a80049e637c2f1bf658d47a07f688bea6e931f3c1930cf4a4daf97b18609060200160405180910390a150565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b610d8761134e565b6001600160a01b0382166000908152601a602052604090205460ff1615158115151415610e075760405162461bcd60e51b815260206004820152602860248201527f4163636f756e7420697320616c7265616479207468652076616c7565206f6620604482015267277374617475732760c01b60648201526084016108ba565b6001600160a01b0382166000818152601a6020908152604091829020805460ff19168515159081179091558251938452908301527ff1bf6e8d74573725f529c5a07fb53656b9c97a10602a75631f57c1be07769e2b9101610ba3565b610e6b61134e565b6001600160a01b038116610ed05760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016108ba565b610ed9816123c9565b50565b610ee461134e565b6001600160a01b0382166000908152601960205260409020805460ff191682158015919091179091556110aa57601554604051630a5b654b60e11b81526001600160a01b03909116906314b6ca9690610f4490859060009060040161332e565b600060405180830381600087803b158015610f5e57600080fd5b505af1158015610f72573d6000803e3d6000fd5b5050601754604051630a5b654b60e11b81526001600160a01b0390911692506314b6ca969150610fa990859060009060040161332e565b600060405180830381600087803b158015610fc357600080fd5b505af1158015610fd7573d6000803e3d6000fd5b5050601654604051630a5b654b60e11b81526001600160a01b0390911692506314b6ca96915061100e90859060009060040161332e565b600060405180830381600087803b15801561102857600080fd5b505af115801561103c573d6000803e3d6000fd5b5050601854604051630a5b654b60e11b81526001600160a01b0390911692506314b6ca96915061107390859060009060040161332e565b600060405180830381600087803b15801561108d57600080fd5b505af11580156110a1573d6000803e3d6000fd5b50505050611226565b6015546001600160a01b03166314b6ca96836110c581610abc565b6040518363ffffffff1660e01b81526004016110e292919061332e565b600060405180830381600087803b1580156110fc57600080fd5b505af1158015611110573d6000803e3d6000fd5b50506017546001600160a01b031691506314b6ca9690508361113181610abc565b6040518363ffffffff1660e01b815260040161114e92919061332e565b600060405180830381600087803b15801561116857600080fd5b505af115801561117c573d6000803e3d6000fd5b50506016546001600160a01b031691506314b6ca9690508361119d81610abc565b6040518363ffffffff1660e01b81526004016111ba92919061332e565b600060405180830381600087803b1580156111d457600080fd5b505af11580156111e8573d6000803e3d6000fd5b50506018546001600160a01b031691506314b6ca9690508361120981610abc565b6040518363ffffffff1660e01b8152600401610a3392919061332e565b5050565b6001600160a01b03831661128c5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016108ba565b6001600160a01b0382166112ed5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016108ba565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6005546001600160a01b03163314610aed5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108ba565b60006113b48484610d54565b9050600019811461141c578181101561140f5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016108ba565b61141c848484840361122a565b50505050565b600061142d30610abc565b6009549091508110801590819061144e5750601854600160a01b900460ff16155b801561147257506001600160a01b0384166000908152601b602052604090205460ff165b15611de75760006002600b546114889190613423565b600c54600d549192509060008161149f848661340b565b6114a9919061340b565b90506009548110611de2576018805460ff60a01b1916600160a01b1790556009546114d39061241b565b476000826114e18784613443565b6114eb9190613423565b90506000836114fa8785613443565b6115049190613423565b90506000816115138486613462565b61151d9190613462565b90508015611d4c576000611532600483613423565b90508015611d21576011546015546040516370a0823160e01b81526001600160a01b03918216600482015260009291909116906370a082319060240160206040518083038186803b15801561158657600080fd5b505afa15801561159a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115be9190613285565b90506115c98261256a565b6011546015546040516370a0823160e01b81526001600160a01b039182166004820152600092849216906370a082319060240160206040518083038186803b15801561161457600080fd5b505afa158015611628573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061164c9190613285565b6116569190613462565b6015549091506001600160a01b031663b6b55f25611675600284613423565b6040518263ffffffff1660e01b815260040161169391815260200190565b600060405180830381600087803b1580156116ad57600080fd5b505af11580156116c1573d6000803e3d6000fd5b50506015546001600160a01b031691506342966c6890506116e3600284613423565b6040518263ffffffff1660e01b815260040161170191815260200190565b600060405180830381600087803b15801561171b57600080fd5b505af115801561172f573d6000803e3d6000fd5b50506013546016546040516370a0823160e01b81526001600160a01b03918216600482015260009450911691506370a082319060240160206040518083038186803b15801561177d57600080fd5b505afa158015611791573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117b59190613285565b90506117c0846126e9565b6013546016546040516370a0823160e01b81526001600160a01b039182166004820152600092849216906370a082319060240160206040518083038186803b15801561180b57600080fd5b505afa15801561181f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118439190613285565b61184d9190613462565b6016549091506001600160a01b031663b6b55f2561186c600284613423565b6040518263ffffffff1660e01b815260040161188a91815260200190565b600060405180830381600087803b1580156118a457600080fd5b505af11580156118b8573d6000803e3d6000fd5b50506016546001600160a01b031691506342966c6890506118da600284613423565b6040518263ffffffff1660e01b81526004016118f891815260200190565b600060405180830381600087803b15801561191257600080fd5b505af1158015611926573d6000803e3d6000fd5b50506014546017546040516370a0823160e01b81526001600160a01b03918216600482015260009450911691506370a082319060240160206040518083038186803b15801561197457600080fd5b505afa158015611988573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119ac9190613285565b90506119b786612832565b6014546017546040516370a0823160e01b81526001600160a01b039182166004820152600092849216906370a082319060240160206040518083038186803b158015611a0257600080fd5b505afa158015611a16573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a3a9190613285565b611a449190613462565b6017549091506001600160a01b031663b6b55f25611a63600284613423565b6040518263ffffffff1660e01b8152600401611a8191815260200190565b600060405180830381600087803b158015611a9b57600080fd5b505af1158015611aaf573d6000803e3d6000fd5b50506017546001600160a01b031691506342966c689050611ad1600284613423565b6040518263ffffffff1660e01b8152600401611aef91815260200190565b600060405180830381600087803b158015611b0957600080fd5b505af1158015611b1d573d6000803e3d6000fd5b50506012546018546040516370a0823160e01b81526001600160a01b03918216600482015260009450911691506370a082319060240160206040518083038186803b158015611b6b57600080fd5b505afa158015611b7f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ba39190613285565b9050611bae8861297b565b6012546018546040516370a0823160e01b81526001600160a01b039182166004820152600092849216906370a082319060240160206040518083038186803b158015611bf957600080fd5b505afa158015611c0d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c319190613285565b611c3b9190613462565b6018549091506001600160a01b031663b6b55f25611c5a600284613423565b6040518263ffffffff1660e01b8152600401611c7891815260200190565b600060405180830381600087803b158015611c9257600080fd5b505af1158015611ca6573d6000803e3d6000fd5b50506018546001600160a01b031691506342966c689050611cc8600284613423565b6040518263ffffffff1660e01b8152600401611ce691815260200190565b600060405180830381600087803b158015611d0057600080fd5b505af1158015611d14573d6000803e3d6000fd5b5050505050505050505050505b8587600954611d309190613443565b611d3a9190613423565b600d54611d479190613462565b600d55505b8115611d8557611d5b82612ac4565b8487600954611d6a9190613443565b611d749190613423565b600c54611d819190613462565b600c555b8215611dd05760008589600954611d9c9190613443565b611da69190613423565b9050611db28185612c10565b8081600b54611dc19190613462565b611dcb9190613462565b600b55505b50506018805460ff60a01b1916905550505b505050505b6001600160a01b0385166000908152601a602052604090205460ff1680611e2657506001600160a01b0384166000908152601a602052604090205460ff165b15611e3b57611e36858585612ccc565b611ec1565b6001600160a01b038085166000908152601b60205260408082205492881682528120549091611e9891869160ff9081169116158015611e9357506001600160a01b0388166000908152601b602052604090205460ff16155b612e9a565b90508015611eab57611eab863083612ccc565b611ebf8686611eba8488613462565b612ccc565b505b6001600160a01b03851660009081526019602052604090205460ff16612072576015546001600160a01b03166314b6ca9686611efc81610abc565b6040518363ffffffff1660e01b8152600401611f1992919061332e565b600060405180830381600087803b158015611f3357600080fd5b505af1925050508015611f44575060015b506016546001600160a01b03166314b6ca9686611f6081610abc565b6040518363ffffffff1660e01b8152600401611f7d92919061332e565b600060405180830381600087803b158015611f9757600080fd5b505af1925050508015611fa8575060015b506017546001600160a01b03166314b6ca9686611fc481610abc565b6040518363ffffffff1660e01b8152600401611fe192919061332e565b600060405180830381600087803b158015611ffb57600080fd5b505af192505050801561200c575060015b506018546001600160a01b03166314b6ca968661202881610abc565b6040518363ffffffff1660e01b815260040161204592919061332e565b600060405180830381600087803b15801561205f57600080fd5b505af1925050508015612070575060015b505b6001600160a01b03841660009081526019602052604090205460ff16612223576015546001600160a01b03166314b6ca96856120ad81610abc565b6040518363ffffffff1660e01b81526004016120ca92919061332e565b600060405180830381600087803b1580156120e457600080fd5b505af19250505080156120f5575060015b506016546001600160a01b03166314b6ca968561211181610abc565b6040518363ffffffff1660e01b815260040161212e92919061332e565b600060405180830381600087803b15801561214857600080fd5b505af1925050508015612159575060015b506017546001600160a01b03166314b6ca968561217581610abc565b6040518363ffffffff1660e01b815260040161219292919061332e565b600060405180830381600087803b1580156121ac57600080fd5b505af19250505080156121bd575060015b506018546001600160a01b03166314b6ca96856121d981610abc565b6040518363ffffffff1660e01b81526004016121f692919061332e565b600060405180830381600087803b15801561221057600080fd5b505af1925050508015612221575060015b505b601854600160a81b900460ff16156123c257601554600a546040516001624d3b8760e01b031981526001600160a01b039092169163ffb2c4799161226d9160040190815260200190565b600060405180830381600087803b15801561228757600080fd5b505af1925050508015612298575060015b50601654600a546040516001624d3b8760e01b031981526001600160a01b039092169163ffb2c479916122d19160040190815260200190565b600060405180830381600087803b1580156122eb57600080fd5b505af19250505080156122fc575060015b50601754600a546040516001624d3b8760e01b031981526001600160a01b039092169163ffb2c479916123359160040190815260200190565b600060405180830381600087803b15801561234f57600080fd5b505af1925050508015612360575060015b50601854600a546040516001624d3b8760e01b031981526001600160a01b039092169163ffb2c479916123999160040190815260200190565b600060405180830381600087803b1580156123b357600080fd5b505af1925050508015610a6157505b5050505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061245e57634e487b7160e01b600052603260045260246000fd5b6001600160a01b03928316602091820292909201810191909152600e546040805163ef8ef56f60e01b81529051919093169263ef8ef56f926004808301939192829003018186803b1580156124b257600080fd5b505afa1580156124c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124ea9190613160565b8160018151811061250b57634e487b7160e01b600052603260045260246000fd5b6001600160a01b039283166020918202929092010152600e54612531913091168461122a565b600e5460405163791ac94760e01b81526001600160a01b039091169063791ac94790610a339085906000908690309042906004016133cf565b6040805160028082526060820183526000926020830190803683375050600e546040805163ef8ef56f60e01b815290519394506001600160a01b039091169263ef8ef56f92506004808301926020929190829003018186803b1580156125cf57600080fd5b505afa1580156125e3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126079190613160565b8160008151811061262857634e487b7160e01b600052603260045260246000fd5b6001600160a01b03928316602091820292909201015260115482519116908290600190811061266757634e487b7160e01b600052603260045260246000fd5b6001600160a01b039283166020918202929092010152600e5460155460405163b6f9de9560e01b81529183169263b6f9de959286926126b3926000928892909116904290600401613347565b6000604051808303818588803b1580156126cc57600080fd5b505af11580156126e0573d6000803e3d6000fd5b50505050505050565b6040805160028082526060820183526000926020830190803683375050600e546040805163ef8ef56f60e01b815290519394506001600160a01b039091169263ef8ef56f92506004808301926020929190829003018186803b15801561274e57600080fd5b505afa158015612762573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127869190613160565b816000815181106127a757634e487b7160e01b600052603260045260246000fd5b6001600160a01b0392831660209182029290920101526013548251911690829060019081106127e657634e487b7160e01b600052603260045260246000fd5b6001600160a01b039283166020918202929092010152600e5460165460405163b6f9de9560e01b81529183169263b6f9de959286926126b3926000928892909116904290600401613347565b6040805160028082526060820183526000926020830190803683375050600e546040805163ef8ef56f60e01b815290519394506001600160a01b039091169263ef8ef56f92506004808301926020929190829003018186803b15801561289757600080fd5b505afa1580156128ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128cf9190613160565b816000815181106128f057634e487b7160e01b600052603260045260246000fd5b6001600160a01b03928316602091820292909201015260145482519116908290600190811061292f57634e487b7160e01b600052603260045260246000fd5b6001600160a01b039283166020918202929092010152600e5460175460405163b6f9de9560e01b81529183169263b6f9de959286926126b3926000928892909116904290600401613347565b6040805160028082526060820183526000926020830190803683375050600e546040805163ef8ef56f60e01b815290519394506001600160a01b039091169263ef8ef56f92506004808301926020929190829003018186803b1580156129e057600080fd5b505afa1580156129f4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a189190613160565b81600081518110612a3957634e487b7160e01b600052603260045260246000fd5b6001600160a01b039283166020918202929092010152601254825191169082906001908110612a7857634e487b7160e01b600052603260045260246000fd5b6001600160a01b039283166020918202929092010152600e5460185460405163b6f9de9560e01b81529183169263b6f9de959286926126b3926000928892909116904290600401613347565b6040805160028082526060820183526000926020830190803683375050600e546040805163ef8ef56f60e01b815290519394506001600160a01b039091169263ef8ef56f92506004808301926020929190829003018186803b158015612b2957600080fd5b505afa158015612b3d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b619190613160565b81600081518110612b8257634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b0316815250503081600181518110612bc457634e487b7160e01b600052603260045260246000fd5b6001600160a01b039283166020918202929092010152600e5460105460405163b6f9de9560e01b81529183169263b6f9de959286926126b3926000928892909116904290600401613347565b600e54612c289030906001600160a01b03168461122a565b600e5460105460405163f305d71960e01b81523060048201526024810185905260006044820181905260648201526001600160a01b0391821660848201524260a482015291169063f305d71990839060c4016060604051808303818588803b158015612c9357600080fd5b505af1158015612ca7573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906123c291906132be565b6001600160a01b038316612d305760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016108ba565b6001600160a01b038216612d925760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016108ba565b6001600160a01b03831660009081526020819052604090205481811015612e0a5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016108ba565b6001600160a01b03808516600090815260208190526040808220858503905591851681529081208054849290612e4190849061340b565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051612e8d91815260200190565b60405180910390a361141c565b60008061271083612f0f5784612edc576006600081548110612ecc57634e487b7160e01b600052603260045260246000fd5b9060005260206000200154612f0a565b6006600181548110612efe57634e487b7160e01b600052603260045260246000fd5b90600052602060002001545b612f3d565b6006600281548110612f3157634e487b7160e01b600052603260045260246000fd5b90600052602060002001545b612f479087613443565b612f519190613423565b9050600061271084612fc75785612f94576007600081548110612f8457634e487b7160e01b600052603260045260246000fd5b9060005260206000200154612fc2565b6007600181548110612fb657634e487b7160e01b600052603260045260246000fd5b90600052602060002001545b612ff5565b6007600281548110612fe957634e487b7160e01b600052603260045260246000fd5b90600052602060002001545b612fff9088613443565b6130099190613423565b905060006127108561307f578661304c57600860008154811061303c57634e487b7160e01b600052603260045260246000fd5b906000526020600020015461307a565b600860018154811061306e57634e487b7160e01b600052603260045260246000fd5b90600052602060002001545b6130ad565b60086002815481106130a157634e487b7160e01b600052603260045260246000fd5b90600052602060002001545b6130b79089613443565b6130c19190613423565b905082600b60008282546130d5919061340b565b9250508190555081600c60008282546130ee919061340b565b9250508190555080600d6000828254613107919061340b565b90915550819050613118838561340b565b613122919061340b565b979650505050505050565b80358015158114610ad657600080fd5b60006020828403121561314e578081fd5b8135613159816134ca565b9392505050565b600060208284031215613171578081fd5b8151613159816134ca565b6000806040838503121561318e578081fd5b8235613199816134ca565b915060208301356131a9816134ca565b809150509250929050565b6000806000606084860312156131c8578081fd5b83356131d3816134ca565b925060208401356131e3816134ca565b929592945050506040919091013590565b60008060408385031215613206578182fd5b8235613211816134ca565b915061321f6020840161312d565b90509250929050565b6000806040838503121561323a578182fd5b8235613245816134ca565b946020939093013593505050565b600060208284031215613264578081fd5b6131598261312d565b60006020828403121561327e578081fd5b5035919050565b600060208284031215613296578081fd5b5051919050565b600080604083850312156132af578182fd5b50508035926020909101359150565b6000806000606084860312156132d2578283fd5b8351925060208401519150604084015190509250925092565b6000815180845260208085019450808401835b838110156133235781516001600160a01b0316875295820195908201906001016132fe565b509495945050505050565b6001600160a01b03929092168252602082015260400190565b60008582526080602083015261336060808301866132eb565b6001600160a01b03949094166040830152506060015292915050565b6000602080835283518082850152825b818110156133a85785810183015185820160400152820161338c565b818111156133b95783604083870101525b50601f01601f1916929092016040019392505050565b600086825285602083015260a060408301526133ee60a08301866132eb565b6001600160a01b0394909416606083015250608001529392505050565b6000821982111561341e5761341e6134b4565b500190565b60008261343e57634e487b7160e01b81526012600452602481fd5b500490565b600081600019048311821515161561345d5761345d6134b4565b500290565b600082821015613474576134746134b4565b500390565b60028104600182168061348d57607f821691505b602082108114156134ae57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b0381168114610ed957600080fdfea26469706673582212202ec9bec23ff6450345bf498385af73e18e950c184ee550cfee12e8825147bdbf64736f6c63430008020033