false
true
0

Contract Address Details

0x6a44bE19d96f087494Bafa66EE5DF1bf7AAF220f

Token
Blastar (BLAST)
Creator
0xe2be6e–e10f48 at 0x009a40–a6942b
Balance
3,198.29085843 PLS ( )
Tokens
Fetching tokens...
Transactions
42,604 Transactions
Transfers
0 Transfers
Gas Used
0
Last Balance Update
26075291
Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
Contract name:
Blastar




Optimization enabled
true
Compiler version
v0.8.18+commit.87f61d96




Optimization runs
200
EVM Version
default




Verified at
2024-01-11T17:59:08.798284Z

Constructor Arguments

0x0000000000000000000000008bda04d2c7b67ce96116eb21cf9cfea41db7ce8100000000000000000000000047bb3c2349f2050d5bac06494b54c6c3e896b4bc

Arg [0] (address) : 0x8bda04d2c7b67ce96116eb21cf9cfea41db7ce81
Arg [1] (address) : 0x47bb3c2349f2050d5bac06494b54c6c3e896b4bc

              

Contract source code

// SPDX-License-Identifier: MIT
pragma solidity 0.8.18;

interface IERC20 {
    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);

    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 value
    );
}

interface IERC20Metadata is IERC20 {
    function name() external view returns (string memory);

    function symbol() external view returns (string memory);

    function decimals() external view returns (uint8);
}

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

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

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

    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, _allowances[owner][spender] + addedValue);
        return true;
    }

    function decreaseAllowance(
        address spender,
        uint256 subtractedValue
    ) public virtual returns (bool) {
        address owner = _msgSender();
        uint256 currentAllowance = _allowances[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 {}
}

library SafeMath {
    function tryAdd(
        uint256 a,
        uint256 b
    ) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    function trySub(
        uint256 a,
        uint256 b
    ) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    function tryMul(
        uint256 a,
        uint256 b
    ) internal pure returns (bool, uint256) {
        unchecked {
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    function tryDiv(
        uint256 a,
        uint256 b
    ) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    function tryMod(
        uint256 a,
        uint256 b
    ) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

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

library Counters {
    struct Counter {
        uint256 _value;
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}

contract Ownable {
    address private _owner;
    address private _previousOwner;
    event OwnershipTransferred(
        address indexed previousOwner,
        address indexed newOwner
    );

    constructor() {
        _owner = msg.sender;
        emit OwnershipTransferred(address(0), _owner);
    }

    function owner() public view returns (address) {
        return _owner;
    }

    modifier onlyOwner() {
        require(_owner == msg.sender, "Ownable: caller is not the owner");
        _;
    }

    function renounceOwnership() public virtual onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }
}

interface IUniswapV2Router02 {
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external;

    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable;

    function factory() external pure returns (address);

    function WPLS() external pure returns (address);

    function addLiquidityETH(
        address token,
        uint256 amountTokenDesired,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    )
        external
        payable
        returns (uint256 amountToken, uint256 amountETH, uint256 liquidity);
}

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

library SignedSafeMath {
    function mul(int256 a, int256 b) internal pure returns (int256) {
        return a * b;
    }

    function div(int256 a, int256 b) internal pure returns (int256) {
        return a / b;
    }

    function sub(int256 a, int256 b) internal pure returns (int256) {
        return a - b;
    }

    function add(int256 a, int256 b) internal pure returns (int256) {
        return a + b;
    }
}

library SafeCast {
    function toUint224(uint256 value) internal pure returns (uint224) {
        require(
            value <= type(uint224).max,
            "SafeCast: value doesn't fit in 224 bits"
        );
        return uint224(value);
    }

    function toUint128(uint256 value) internal pure returns (uint128) {
        require(
            value <= type(uint128).max,
            "SafeCast: value doesn't fit in 128 bits"
        );
        return uint128(value);
    }

    function toUint96(uint256 value) internal pure returns (uint96) {
        require(
            value <= type(uint96).max,
            "SafeCast: value doesn't fit in 96 bits"
        );
        return uint96(value);
    }

    function toUint64(uint256 value) internal pure returns (uint64) {
        require(
            value <= type(uint64).max,
            "SafeCast: value doesn't fit in 64 bits"
        );
        return uint64(value);
    }

    function toUint32(uint256 value) internal pure returns (uint32) {
        require(
            value <= type(uint32).max,
            "SafeCast: value doesn't fit in 32 bits"
        );
        return uint32(value);
    }

    function toUint16(uint256 value) internal pure returns (uint16) {
        require(
            value <= type(uint16).max,
            "SafeCast: value doesn't fit in 16 bits"
        );
        return uint16(value);
    }

    function toUint8(uint256 value) internal pure returns (uint8) {
        require(
            value <= type(uint8).max,
            "SafeCast: value doesn't fit in 8 bits"
        );
        return uint8(value);
    }

    function toUint256(int256 value) internal pure returns (uint256) {
        require(value >= 0, "SafeCast: value must be positive");
        return uint256(value);
    }

    function toInt128(int256 value) internal pure returns (int128) {
        require(
            value >= type(int128).min && value <= type(int128).max,
            "SafeCast: value doesn't fit in 128 bits"
        );
        return int128(value);
    }

    function toInt64(int256 value) internal pure returns (int64) {
        require(
            value >= type(int64).min && value <= type(int64).max,
            "SafeCast: value doesn't fit in 64 bits"
        );
        return int64(value);
    }

    function toInt32(int256 value) internal pure returns (int32) {
        require(
            value >= type(int32).min && value <= type(int32).max,
            "SafeCast: value doesn't fit in 32 bits"
        );
        return int32(value);
    }

    function toInt16(int256 value) internal pure returns (int16) {
        require(
            value >= type(int16).min && value <= type(int16).max,
            "SafeCast: value doesn't fit in 16 bits"
        );
        return int16(value);
    }

    function toInt8(int256 value) internal pure returns (int8) {
        require(
            value >= type(int8).min && value <= type(int8).max,
            "SafeCast: value doesn't fit in 8 bits"
        );
        return int8(value);
    }

    function toInt256(uint256 value) internal pure returns (int256) {
        require(
            value <= uint256(type(int256).max),
            "SafeCast: value doesn't fit in an int256"
        );
        return int256(value);
    }
}

interface DividendPayingTokenInterface {
    function dividendOf(address _owner) external view returns (uint256);

    function distributeDividends() external payable;

    function withdrawDividend() external;

    event DividendsDistributed(address indexed from, uint256 weiAmount);
    event DividendWithdrawn(
        address indexed to,
        uint256 weiAmount,
        address received
    );
}

interface DividendPayingTokenOptionalInterface {
    function withdrawableDividendOf(
        address _owner
    ) external view returns (uint256);

    function withdrawnDividendOf(
        address _owner
    ) external view returns (uint256);

    function accumulativeDividendOf(
        address _owner
    ) external view returns (uint256);
}

abstract contract DividendPayingToken is
    ERC20,
    DividendPayingTokenInterface,
    DividendPayingTokenOptionalInterface
{
    using SafeMath for uint256;
    using SignedSafeMath for int256;
    using SafeCast for uint256;
    using SafeCast for int256;
    uint256 internal constant magnitude = 2 ** 128;

    uint256 internal magnifiedDividendPerShare;

    mapping(address => int256) internal magnifiedDividendCorrections;
    mapping(address => uint256) internal withdrawnDividends;

    uint256 public totalDividendsDistributed;

    constructor(
        string memory _name,
        string memory _symbol
    ) ERC20(_name, _symbol) {}

    receive() external payable {
        distributeDividends();
    }

    function distributeDividends() public payable override {
        require(totalSupply() > 0);

        if (msg.value > 0) {
            magnifiedDividendPerShare = magnifiedDividendPerShare.add(
                (msg.value).mul(magnitude) / totalSupply()
            );
            emit DividendsDistributed(msg.sender, msg.value);

            totalDividendsDistributed = totalDividendsDistributed.add(
                msg.value
            );
        }
    }

    function withdrawDividend() public virtual override {
        _withdrawDividendOfUser(payable(msg.sender), payable(msg.sender));
    }

    function _withdrawDividendOfUser(
        address payable user,
        address payable to
    ) internal returns (uint256) {
        uint256 _withdrawableDividend = withdrawableDividendOf(user);
        if (_withdrawableDividend > 0) {
            withdrawnDividends[user] = withdrawnDividends[user].add(
                _withdrawableDividend
            );
            emit DividendWithdrawn(user, _withdrawableDividend, to);
            (bool success, ) = to.call{value: _withdrawableDividend}("");

            if (!success) {
                withdrawnDividends[user] = withdrawnDividends[user].sub(
                    _withdrawableDividend
                );
                return 0;
            }

            return _withdrawableDividend;
        }

        return 0;
    }

    function dividendOf(address _owner) public view override returns (uint256) {
        return withdrawableDividendOf(_owner);
    }

    function withdrawableDividendOf(
        address _owner
    ) public view override returns (uint256) {
        if (magnifiedDividendPerShare > 0) {
            return
                accumulativeDividendOf(_owner).sub(withdrawnDividends[_owner]);
        }
        return 0;
    }

    function withdrawnDividendOf(
        address _owner
    ) public view override returns (uint256) {
        return withdrawnDividends[_owner];
    }

    function accumulativeDividendOf(
        address _owner
    ) public view override returns (uint256) {
        return
            magnifiedDividendPerShare
                .mul(balanceOf(_owner))
                .toInt256()
                .add(magnifiedDividendCorrections[_owner])
                .toUint256() / magnitude;
    }

    function _mint(address account, uint256 value) internal override {
        super._mint(account, value);

        magnifiedDividendCorrections[account] = magnifiedDividendCorrections[
            account
        ].sub((magnifiedDividendPerShare.mul(value)).toInt256());
    }

    function _burn(address account, uint256 value) internal override {
        super._burn(account, value);
        magnifiedDividendCorrections[account] = magnifiedDividendCorrections[
            account
        ].add((magnifiedDividendPerShare.mul(value)).toInt256());
    }

    function _setBalance(address account, uint256 newBalance) internal {
        uint256 currentBalance = balanceOf(account);

        if (newBalance > currentBalance) {
            uint256 mintAmount = newBalance.sub(currentBalance);
            _mint(account, mintAmount);
        } else if (newBalance < currentBalance) {
            uint256 burnAmount = currentBalance.sub(newBalance);
            _burn(account, burnAmount);
        }
    }

    function getAccount(
        address _account
    )
        public
        view
        returns (uint256 _withdrawableDividends, uint256 _withdrawnDividends)
    {
        _withdrawableDividends = withdrawableDividendOf(_account);
        _withdrawnDividends = withdrawnDividends[_account];
    }
}

contract BlastDividendTracker is DividendPayingToken, Ownable {
    using SafeMath for uint256;
    using Counters for Counters.Counter;

    Counters.Counter private tokenHoldersCount;
    mapping(address => bool) private tokenHoldersMap;

    mapping(address => bool) public excludedFromDividends;

    uint256 public immutable minimumTokenBalanceForDividends;

    event ExcludeFromDividends(address indexed account);

    constructor()
        DividendPayingToken("Blast_Dividend_Tracker", "Blast_Dividend_Tracker")
    {
        minimumTokenBalanceForDividends = 10000 * 10 ** 9;
    }

    function decimals() public view virtual override returns (uint8) {
        return 9;
    }

    function _approve(address, address, uint256) internal pure override {
        require(false, "Blast_Dividend_Tracker: No approvals allowed");
    }

    function _transfer(address, address, uint256) internal pure override {
        require(false, "Blast_Dividend_Tracker: No transfers allowed");
    }

    function withdrawDividend() public pure override {
        require(
            false,
            "Blast_Dividend_Tracker: withdrawDividend disabled. Use the 'claim' function on the main Blast contract."
        );
    }

    function excludeFromDividends(address account) external onlyOwner {
        excludedFromDividends[account] = true;

        _setBalance(account, 0);

        if (tokenHoldersMap[account] == true) {
            tokenHoldersMap[account] = false;
            tokenHoldersCount.decrement();
        }

        emit ExcludeFromDividends(account);
    }

    function includeFromDividends(
        address account,
        uint256 balance
    ) external onlyOwner {
        excludedFromDividends[account] = false;

        if (balance >= minimumTokenBalanceForDividends) {
            _setBalance(account, balance);

            if (tokenHoldersMap[account] == false) {
                tokenHoldersMap[account] = true;
                tokenHoldersCount.increment();
            }
        }

        emit ExcludeFromDividends(account);
    }

    function isExcludeFromDividends(
        address account
    ) external view onlyOwner returns (bool) {
        return excludedFromDividends[account];
    }

    function getNumberOfTokenHolders() external view returns (uint256) {
        return tokenHoldersCount.current();
    }

    function setBalance(
        address payable account,
        uint256 newBalance
    ) external onlyOwner {
        if (excludedFromDividends[account]) {
            return;
        }

        if (newBalance >= minimumTokenBalanceForDividends) {
            _setBalance(account, newBalance);

            if (tokenHoldersMap[account] == false) {
                tokenHoldersMap[account] = true;
                tokenHoldersCount.increment();
            }
        } else {
            _setBalance(account, 0);

            if (tokenHoldersMap[account] == true) {
                tokenHoldersMap[account] = false;
                tokenHoldersCount.decrement();
            }
        }
    }

    function processAccount(
        address account,
        address toAccount
    ) public onlyOwner returns (uint256) {
        uint256 amount = _withdrawDividendOfUser(
            payable(account),
            payable(toAccount)
        );
        return amount;
    }

    function emergencyWithdraw(address _receiver) external onlyOwner {
        magnifiedDividendPerShare = 0;

        uint256 totalBalance = address(this).balance;
        require(totalBalance > 0, "no balance");
        (bool success, ) = _receiver.call{value: totalBalance}("");
        require(success);
    }
}

contract Blastar is ERC20, Ownable {
    using SafeMath for uint256;
    using Counters for Counters.Counter;

    string private constant _name = "Blastar";
    string private constant _symbol = "BLAST";
    uint8 private constant _decimals = 9;
    uint256 private constant _tTotal = 1e12 * 10 ** 9;

    IUniswapV2Router02 private uniswapV2Router =
        IUniswapV2Router02(0x98bf93ebf5c380C0e6Ae8e192A7e2AE08edAcc02);
    bool private tradingOpen = false;
    address private uniswapV2Pair;

    mapping(address => bool) private automatedMarketMakerPairs;
    mapping(address => bool) public isExcludeFromFee;
    mapping(address => bool) public isBot;

    uint256 private walletLimitPercentage = 100;
    mapping(address => bool) public isExludeFromWalletLimit;

    uint256 private baseBuyTax = 5;
    uint256 public baseSellTax = 5;

    uint256 private autoLP = 0;
    uint256 private devFee = 50;
    uint256 private marketingFee = 50;

    uint256 public minContractTokensToSwap = 2e9 * 10 ** 9;
    bool public swapAll = false;

    struct MinutesRangeTax {
        uint256 from;
        uint256 to;
        uint256 tax;
    }

    mapping(address => uint256) public initialBuyTimestamp;
    mapping(uint8 => MinutesRangeTax) public minutesRangeTaxes;
    uint8 public maxIndexMinutesRange;

    address private devWalletAddress;
    address private marketingWalletAddress;

    BlastDividendTracker public dividendTracker;
    uint256 minimumTokenBalanceForDividends = 10000 * 10 ** 9;
    mapping(address => uint256) public lastTransfer;

    uint256 public pendingTokensForReward;
    uint256 public minRewardTokensToSwap = 10000 * 10 ** 9;

    uint256 public pendingEthReward;

    struct ClaimedEth {
        uint256 ethAmount;
        uint256 tokenAmount;
        uint256 timestamp;
    }

    Counters.Counter private claimedHistoryIds;

    mapping(uint256 => ClaimedEth) private claimedEthMap;
    mapping(address => uint256[]) private userClaimedIds;

    event BuyFees(address from, address to, uint256 amountTokens);
    event SellFees(address from, address to, uint256 amountTokens);
    event AddLiquidity(uint256 amountTokens, uint256 amountEth);
    event SwapTokensForEth(uint256 sentTokens, uint256 receivedEth);
    event SwapEthForTokens(uint256 sentEth, uint256 receivedTokens);
    event DistributeFees(uint256 devEth, uint256 remarketingEth);
    event AddRewardPool(uint256 _ethAmount);

    event SendDividends(uint256 amount);

    event DividendClaimed(
        uint256 ethAmount,
        uint256 tokenAmount,
        address account
    );

    constructor(
        address _devWalletAddress,
        address _marketingWalletAddress
    ) ERC20(_name, _symbol) {
        devWalletAddress = _devWalletAddress;
        marketingWalletAddress = _marketingWalletAddress;

        isExcludeFromFee[owner()] = true;
        isExcludeFromFee[address(this)] = true;
        isExludeFromWalletLimit[owner()] = true;
        isExludeFromWalletLimit[address(this)] = true;
        isExludeFromWalletLimit[address(uniswapV2Router)] = true;

        dividendTracker = new BlastDividendTracker();
        dividendTracker.excludeFromDividends(address(dividendTracker));
        dividendTracker.excludeFromDividends(address(this));
        dividendTracker.excludeFromDividends(owner());
        dividendTracker.excludeFromDividends(address(uniswapV2Router));
        dividendTracker.excludeFromDividends(address(0x0000000000000000000000000000000000000369));
        minutesRangeTaxes[1].from = 0 minutes;
        minutesRangeTaxes[1].to = 7200 minutes;
        minutesRangeTaxes[1].tax = 30;
        minutesRangeTaxes[2].from = 7200 minutes;
        minutesRangeTaxes[2].to = 14400 minutes;
        minutesRangeTaxes[2].tax = 25;
        minutesRangeTaxes[3].from = 14400 minutes;
        minutesRangeTaxes[3].to = 21600 minutes;
        minutesRangeTaxes[3].tax = 20;
        minutesRangeTaxes[4].from = 21600 minutes;
        minutesRangeTaxes[4].to = 28800 minutes;
        minutesRangeTaxes[4].tax = 15;
		minutesRangeTaxes[5].from = 28800 minutes;
        minutesRangeTaxes[5].to = 36000 minutes;
        minutesRangeTaxes[5].tax = 10;

        maxIndexMinutesRange = 5;

        _mint(owner(), _tTotal);
    }

    function openTrading() external onlyOwner {
        require(!tradingOpen, "Blast: Trading is already open");
        uniswapV2Pair = IUniswapV2Factory(uniswapV2Router.factory()).createPair(
                address(this),
                uniswapV2Router.WPLS()
            );

        automatedMarketMakerPairs[uniswapV2Pair] = true;
        dividendTracker.excludeFromDividends(uniswapV2Pair);

        addLiquidity(balanceOf(address(this)), address(this).balance);
        IERC20(uniswapV2Pair).approve(
            address(uniswapV2Router),
            type(uint256).max
        );

        tradingOpen = true;
    }

    function manualSwap() external onlyOwner {
        uint256 totalTokens = balanceOf(address(this)).sub(
            pendingTokensForReward
        );

        swapTokensForEth(totalTokens);
    }

    function manualSend() external onlyOwner {
        uint256 totalEth = address(this).balance.sub(pendingEthReward);

        uint256 devFeesToSend = totalEth.mul(devFee).div(
            uint256(100).sub(autoLP)
        );
        uint256 marketingFeesToSend = totalEth.mul(marketingFee).div(
            uint256(100).sub(autoLP)
        );
        uint256 remainingEthForFees = totalEth.sub(devFeesToSend).sub(
            marketingFeesToSend
        );
        devFeesToSend = devFeesToSend.add(remainingEthForFees);

        sendEthToWallets(devFeesToSend, marketingFeesToSend);
    }

    function getTax(address _ad) public view returns (uint256) {
        uint256 tax = baseSellTax;

        for (uint8 x = 1; x <= maxIndexMinutesRange; x++) {
            if (
                (initialBuyTimestamp[_ad] + minutesRangeTaxes[x].from <=
                    block.timestamp &&
                    initialBuyTimestamp[_ad] + minutesRangeTaxes[x].to >=
                    block.timestamp)
            ) {
                tax = minutesRangeTaxes[x].tax;
                return tax;
            }
        }

        return tax;
    }

    function getTotalDividendsDistributed() external view returns (uint256) {
        return dividendTracker.totalDividendsDistributed();
    }

    function withdrawableDividendOf(
        address _account
    ) public view returns (uint256) {
        return dividendTracker.withdrawableDividendOf(_account);
    }

    function dividendTokenBalanceOf(
        address _account
    ) public view returns (uint256) {
        return dividendTracker.balanceOf(_account);
    }

    function claim() external {
        _claim(payable(msg.sender), false);
    }

    function reinvest() external {
        _claim(payable(msg.sender), true);
    }

    function _claim(address payable _account, bool _reinvest) private {
        uint256 withdrawableAmount = dividendTracker.withdrawableDividendOf(
            _account
        );
        require(
            withdrawableAmount > 0,
            "Blast: Claimer has no withdrawable dividend"
        );
        uint256 ethAmount;
        uint256 tokenAmount;

        if (!_reinvest) {
            ethAmount = dividendTracker.processAccount(_account, _account);
        } else {
            ethAmount = dividendTracker.processAccount(_account, address(this));
            if (ethAmount > 0) {
                tokenAmount = swapEthForTokens(ethAmount, _account);
            }
        }
        if (ethAmount > 0) {
            claimedHistoryIds.increment();
            uint256 hId = claimedHistoryIds.current();
            claimedEthMap[hId].ethAmount = ethAmount;
            claimedEthMap[hId].tokenAmount = tokenAmount;
            claimedEthMap[hId].timestamp = block.timestamp;

            userClaimedIds[_account].push(hId);

            emit DividendClaimed(ethAmount, tokenAmount, _account);
        }
    }

    function getNumberOfDividendTokenHolders() external view returns (uint256) {
        return dividendTracker.getNumberOfTokenHolders();
    }

    function getAccount(
        address _account
    )
        public
        view
        returns (
            uint256 withdrawableDividends,
            uint256 withdrawnDividends,
            uint256 balance
        )
    {
        (withdrawableDividends, withdrawnDividends) = dividendTracker
            .getAccount(_account);
        return (withdrawableDividends, withdrawnDividends, balanceOf(_account));
    }

    function decimals() public view virtual override returns (uint8) {
        return _decimals;
    }

    function _transfer(
        address _from,
        address _to,
        uint256 _amount
    ) internal virtual override {
        require(!isBot[_from] && !isBot[_to]);

        uint256 transferAmount = _amount;
        uint256 prevWalletLimit = walletLimitPercentage;
        if (
            tradingOpen &&
            (automatedMarketMakerPairs[_from] ||
                automatedMarketMakerPairs[_to]) &&
            !isExcludeFromFee[_from] &&
            !isExcludeFromFee[_to]
        ) {
            transferAmount = takeFees(_from, _to, _amount);
        }
        if (initialBuyTimestamp[_to] == 0) {
            initialBuyTimestamp[_to] = block.timestamp;
        }
        if (!automatedMarketMakerPairs[_to] && !isExludeFromWalletLimit[_to]) {
            uint256 addressBalance = balanceOf(_to).add(transferAmount);
            require(
                addressBalance <=
                    totalSupply().mul(walletLimitPercentage).div(10000),
                "Blast: Wallet balance limit reached"
            );
        }

        super._transfer(_from, _to, transferAmount);
        walletLimitPercentage = prevWalletLimit;
        if (!dividendTracker.isExcludeFromDividends(_from)) {
            try
                dividendTracker.setBalance(payable(_from), balanceOf(_from))
            {} catch {}
        }
        if (!dividendTracker.isExcludeFromDividends(_to)) {
            try
                dividendTracker.setBalance(payable(_to), balanceOf(_to))
            {} catch {}
        }
    }

    function _setAutomatedMarketMakerPair(address _pair, bool _value) private {
        require(
            automatedMarketMakerPairs[_pair] != _value,
            "Blast: Automated market maker pair is already set to that value"
        );
        automatedMarketMakerPairs[_pair] = _value;

        if (_value) {
            dividendTracker.excludeFromDividends(_pair);
        }
    }

    function setExcludeFromFee(
        address _address,
        bool _isExludeFromFee
    ) external onlyOwner {
        isExcludeFromFee[_address] = _isExludeFromFee;
    }

    function setExludeFromDividends(
        address _address,
        bool _isExludeFromDividends
    ) external onlyOwner {
        if (_isExludeFromDividends) {
            dividendTracker.excludeFromDividends(_address);
        } else {
            dividendTracker.includeFromDividends(_address, balanceOf(_address));
        }
    }

    function setExludeFromWalletLimit(
        address _address,
        bool _isExludeFromWalletLimit
    ) external onlyOwner {
        isExludeFromWalletLimit[_address] = _isExludeFromWalletLimit;
    }

    function setWalletLimitPercentage(uint256 _percentage) external onlyOwner {
        walletLimitPercentage = _percentage;
    }

    function setTaxes(
        uint256 _baseBuyTax,
        uint256 _baseSellTax,
        uint256 _autoLP,
        uint256 _devFee,
        uint256 _marketingFee
    ) external onlyOwner {
        require(_baseBuyTax <= 10 && baseSellTax <= 5);

        baseBuyTax = _baseBuyTax;
        baseSellTax = _baseSellTax;
        autoLP = _autoLP;
        devFee = _devFee;
        marketingFee = _marketingFee;
    }

    function setMinContractTokensToSwap(uint256 _numToken) public onlyOwner {
        minContractTokensToSwap = _numToken;
    }

    function setMinRewardTokensToSwap(uint256 _numToken) public onlyOwner {
        minRewardTokensToSwap = _numToken;
    }

    function setSwapAll(bool _isWapAll) public onlyOwner {
        swapAll = _isWapAll;
    }

    function setMinutesRangeTax(
        uint8 _index,
        uint256 _from,
        uint256 _to,
        uint256 _tax
    ) external onlyOwner {
        minutesRangeTaxes[_index].from = _from.mul(1 minutes);
        minutesRangeTaxes[_index].to = _to.mul(1 minutes);
        minutesRangeTaxes[_index].tax = _tax;
    }

    function setMaxIndexMinutesRange(uint8 _maxIndex) external onlyOwner {
        maxIndexMinutesRange = _maxIndex;
    }

    function setBots(address[] calldata _bots, bool value) public onlyOwner {
        for (uint256 i = 0; i < _bots.length; i++) {
            if (
                _bots[i] != uniswapV2Pair &&
                _bots[i] != address(uniswapV2Router)
            ) {
                isBot[_bots[i]] = value;
            }
        }
    }

    function setWalletAddress(
        address _devWallet,
        address _marketingWallet
    ) external onlyOwner {
        devWalletAddress = _devWallet;
        marketingWalletAddress = _marketingWallet;
    }

    function takeFees(
        address _from,
        address _to,
        uint256 _amount
    ) private returns (uint256) {
        uint256 fees;
        uint256 remainingAmount;
        require(
            automatedMarketMakerPairs[_from] || automatedMarketMakerPairs[_to],
            "Blast: No market makers found"
        );

        if (automatedMarketMakerPairs[_from]) {
            fees = _amount.mul(baseBuyTax).div(100);
            remainingAmount = _amount.sub(fees);

            super._transfer(_from, address(this), fees);

            emit BuyFees(_from, address(this), fees);
        } else {
            uint256 totalSellTax = getTax(_from);

            fees = _amount.mul(totalSellTax).div(100);
            uint256 rewardTokens = _amount
                .mul(totalSellTax.sub(baseSellTax))
                .div(100);
            pendingTokensForReward = pendingTokensForReward.add(rewardTokens);

            remainingAmount = _amount.sub(fees);

            super._transfer(_from, address(this), fees);
            uint256 tokensToSwap = balanceOf(address(this)).sub(
                pendingTokensForReward
            );

            if (tokensToSwap > minContractTokensToSwap) {
                if (!swapAll) {
                    tokensToSwap = minContractTokensToSwap;
                }

                distributeTokensEth(tokensToSwap);
            }
            if (pendingTokensForReward > minRewardTokensToSwap) {
                swapAndSendDividends(pendingTokensForReward);
            }

            emit SellFees(_from, address(this), fees);
        }

        return remainingAmount;
    }

    function distributeTokensEth(uint256 _tokenAmount) private {
        uint256 tokensForLiquidity = _tokenAmount.mul(autoLP).div(100);

        uint256 halfLiquidity = tokensForLiquidity.div(2);
        uint256 tokensForSwap = _tokenAmount.sub(halfLiquidity);

        uint256 totalEth = swapTokensForEth(tokensForSwap);

        uint256 ethForAddLP = totalEth.mul(autoLP).div(100);
        uint256 devFeesToSend = totalEth.mul(devFee).div(100);
        uint256 marketingFeesToSend = totalEth.mul(marketingFee).div(100);
        uint256 remainingEthForFees = totalEth
            .sub(ethForAddLP)
            .sub(devFeesToSend)
            .sub(marketingFeesToSend);
        devFeesToSend = devFeesToSend.add(remainingEthForFees);

        sendEthToWallets(devFeesToSend, marketingFeesToSend);

        if (halfLiquidity > 0 && ethForAddLP > 0) {
            addLiquidity(halfLiquidity, ethForAddLP);
        }
    }

    function sendEthToWallets(
        uint256 _devFees,
        uint256 _marketingFees
    ) private {
        if (_devFees > 0) {
            payable(devWalletAddress).transfer(_devFees);
        }
        if (_marketingFees > 0) {
            payable(marketingWalletAddress).transfer(_marketingFees);
        }
        emit DistributeFees(_devFees, _marketingFees);
    }

    function swapTokensForEth(uint256 _tokenAmount) private returns (uint256) {
        uint256 initialEthBalance = address(this).balance;
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WPLS();
        _approve(address(this), address(uniswapV2Router), _tokenAmount);
        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            _tokenAmount,
            0,
            path,
            address(this),
            block.timestamp
        );

        uint256 receivedEth = address(this).balance.sub(initialEthBalance);

        emit SwapTokensForEth(_tokenAmount, receivedEth);
        return receivedEth;
    }

    function swapEthForTokens(
        uint256 _ethAmount,
        address _to
    ) private returns (uint256) {
        uint256 initialTokenBalance = balanceOf(address(this));
        address[] memory path = new address[](2);
        path[0] = uniswapV2Router.WPLS();
        path[1] = address(this);

        uniswapV2Router.swapExactETHForTokensSupportingFeeOnTransferTokens{
            value: _ethAmount
        }(0, path, _to, block.timestamp);

        uint256 receivedTokens = balanceOf(address(this)).sub(
            initialTokenBalance
        );

        emit SwapEthForTokens(_ethAmount, receivedTokens);
        return receivedTokens;
    }

    function addLiquidity(uint256 _tokenAmount, uint256 _ethAmount) private {
        _approve(address(this), address(uniswapV2Router), _tokenAmount);
        uniswapV2Router.addLiquidityETH{value: _ethAmount}(
            address(this),
            _tokenAmount,
            0,
            0,
            owner(),
            block.timestamp
        );
        emit AddLiquidity(_tokenAmount, _ethAmount);
    }

    function swapAndSendDividends(uint256 _tokenAmount) private {
        uint256 dividends = swapTokensForEth(_tokenAmount);

        pendingTokensForReward = pendingTokensForReward.sub(_tokenAmount);
        uint256 totalEthToSend = dividends.add(pendingEthReward);

        (bool success, ) = address(dividendTracker).call{value: totalEthToSend}(
            ""
        );

        if (success) {
            emit SendDividends(dividends);
        } else {
            pendingEthReward = pendingEthReward.add(dividends);
        }
    }

    function availableContractTokenBalance() public view returns (uint256) {
        return balanceOf(address(this)).sub(pendingTokensForReward);
    }

    function getHistory(
        address _account,
        uint256 _limit,
        uint256 _pageNumber
    ) external view returns (ClaimedEth[] memory) {
        require(_limit > 0 && _pageNumber > 0, "Blast: Invalid arguments");
        uint256 userClaimedCount = userClaimedIds[_account].length;
        uint256 end = _pageNumber * _limit;
        uint256 start = end - _limit;
        require(start < userClaimedCount, "Blast: Out of range");
        uint256 limit = _limit;
        if (end > userClaimedCount) {
            end = userClaimedCount;
            limit = userClaimedCount % _limit;
        }

        ClaimedEth[] memory myClaimedEth = new ClaimedEth[](limit);
        uint256 currentIndex = 0;
        for (uint256 i = start; i < end; i++) {
            uint256 hId = userClaimedIds[_account][i];
            myClaimedEth[currentIndex] = claimedEthMap[hId];
            currentIndex += 1;
        }
        return myClaimedEth;
    }

    function getHistoryCount(address _account) external view returns (uint256) {
        return userClaimedIds[_account].length;
    }

    function emergencyWithdrawDivs() external onlyOwner {
        dividendTracker.emergencyWithdraw(owner());
    }

    receive() external payable {}
}
        

Contract ABI

[{"type":"constructor","stateMutability":"nonpayable","inputs":[{"type":"address","name":"_devWalletAddress","internalType":"address"},{"type":"address","name":"_marketingWalletAddress","internalType":"address"}]},{"type":"event","name":"AddLiquidity","inputs":[{"type":"uint256","name":"amountTokens","internalType":"uint256","indexed":false},{"type":"uint256","name":"amountEth","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"AddRewardPool","inputs":[{"type":"uint256","name":"_ethAmount","internalType":"uint256","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":"BuyFees","inputs":[{"type":"address","name":"from","internalType":"address","indexed":false},{"type":"address","name":"to","internalType":"address","indexed":false},{"type":"uint256","name":"amountTokens","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"DistributeFees","inputs":[{"type":"uint256","name":"devEth","internalType":"uint256","indexed":false},{"type":"uint256","name":"remarketingEth","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"DividendClaimed","inputs":[{"type":"uint256","name":"ethAmount","internalType":"uint256","indexed":false},{"type":"uint256","name":"tokenAmount","internalType":"uint256","indexed":false},{"type":"address","name":"account","internalType":"address","indexed":false}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"type":"address","name":"previousOwner","internalType":"address","indexed":true},{"type":"address","name":"newOwner","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"SellFees","inputs":[{"type":"address","name":"from","internalType":"address","indexed":false},{"type":"address","name":"to","internalType":"address","indexed":false},{"type":"uint256","name":"amountTokens","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"SendDividends","inputs":[{"type":"uint256","name":"amount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"SwapEthForTokens","inputs":[{"type":"uint256","name":"sentEth","internalType":"uint256","indexed":false},{"type":"uint256","name":"receivedTokens","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"SwapTokensForEth","inputs":[{"type":"uint256","name":"sentTokens","internalType":"uint256","indexed":false},{"type":"uint256","name":"receivedEth","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":"availableContractTokenBalance","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"balanceOf","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"baseSellTax","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"claim","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint8","name":"","internalType":"uint8"}],"name":"decimals","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"decreaseAllowance","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"subtractedValue","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"dividendTokenBalanceOf","inputs":[{"type":"address","name":"_account","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract BlastDividendTracker"}],"name":"dividendTracker","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"emergencyWithdrawDivs","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"withdrawableDividends","internalType":"uint256"},{"type":"uint256","name":"withdrawnDividends","internalType":"uint256"},{"type":"uint256","name":"balance","internalType":"uint256"}],"name":"getAccount","inputs":[{"type":"address","name":"_account","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"tuple[]","name":"","internalType":"struct Blastar.ClaimedEth[]","components":[{"type":"uint256","name":"ethAmount","internalType":"uint256"},{"type":"uint256","name":"tokenAmount","internalType":"uint256"},{"type":"uint256","name":"timestamp","internalType":"uint256"}]}],"name":"getHistory","inputs":[{"type":"address","name":"_account","internalType":"address"},{"type":"uint256","name":"_limit","internalType":"uint256"},{"type":"uint256","name":"_pageNumber","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getHistoryCount","inputs":[{"type":"address","name":"_account","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getNumberOfDividendTokenHolders","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getTax","inputs":[{"type":"address","name":"_ad","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getTotalDividendsDistributed","inputs":[]},{"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":"uint256","name":"","internalType":"uint256"}],"name":"initialBuyTimestamp","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isBot","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isExcludeFromFee","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isExludeFromWalletLimit","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"lastTransfer","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"manualSend","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"manualSwap","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint8","name":"","internalType":"uint8"}],"name":"maxIndexMinutesRange","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"minContractTokensToSwap","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"minRewardTokensToSwap","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"from","internalType":"uint256"},{"type":"uint256","name":"to","internalType":"uint256"},{"type":"uint256","name":"tax","internalType":"uint256"}],"name":"minutesRangeTaxes","inputs":[{"type":"uint8","name":"","internalType":"uint8"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"name","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"openTrading","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"pendingEthReward","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"pendingTokensForReward","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"reinvest","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"renounceOwnership","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setBots","inputs":[{"type":"address[]","name":"_bots","internalType":"address[]"},{"type":"bool","name":"value","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setExcludeFromFee","inputs":[{"type":"address","name":"_address","internalType":"address"},{"type":"bool","name":"_isExludeFromFee","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setExludeFromDividends","inputs":[{"type":"address","name":"_address","internalType":"address"},{"type":"bool","name":"_isExludeFromDividends","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setExludeFromWalletLimit","inputs":[{"type":"address","name":"_address","internalType":"address"},{"type":"bool","name":"_isExludeFromWalletLimit","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setMaxIndexMinutesRange","inputs":[{"type":"uint8","name":"_maxIndex","internalType":"uint8"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setMinContractTokensToSwap","inputs":[{"type":"uint256","name":"_numToken","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setMinRewardTokensToSwap","inputs":[{"type":"uint256","name":"_numToken","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setMinutesRangeTax","inputs":[{"type":"uint8","name":"_index","internalType":"uint8"},{"type":"uint256","name":"_from","internalType":"uint256"},{"type":"uint256","name":"_to","internalType":"uint256"},{"type":"uint256","name":"_tax","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setSwapAll","inputs":[{"type":"bool","name":"_isWapAll","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setTaxes","inputs":[{"type":"uint256","name":"_baseBuyTax","internalType":"uint256"},{"type":"uint256","name":"_baseSellTax","internalType":"uint256"},{"type":"uint256","name":"_autoLP","internalType":"uint256"},{"type":"uint256","name":"_devFee","internalType":"uint256"},{"type":"uint256","name":"_marketingFee","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setWalletAddress","inputs":[{"type":"address","name":"_devWallet","internalType":"address"},{"type":"address","name":"_marketingWallet","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setWalletLimitPercentage","inputs":[{"type":"uint256","name":"_percentage","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"swapAll","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"symbol","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalSupply","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"transfer","inputs":[{"type":"address","name":"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":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"withdrawableDividendOf","inputs":[{"type":"address","name":"_account","internalType":"address"}]},{"type":"receive","stateMutability":"payable"}]
              

Contract Creation Code

Verify & Publish
0x6080604052600780546001600160a81b0319167398bf93ebf5c380c0e6ae8e192a7e2ae08edacc021790556064600c556005600e819055600f55600060105560326011819055601255671bc16d674ec800006013556014805460ff191690556509184e72a000601a819055601d553480156200007a57600080fd5b50604051620059d5380380620059d58339810160408190526200009d91620007a8565b60405180604001604052806007815260200166213630b9ba30b960c91b8152506040518060400160405280600581526020016410931054d560da1b8152508160039081620000ec919062000884565b506004620000fb828262000884565b5050600580546001600160a01b031916339081179091556040519091506000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a360178054610100600160a81b0319166101006001600160a01b038581169190910291909117909155601880546001600160a01b0319168383161790556005805482166000908152600a60209081526040808320805460ff199081166001908117909255308086528386208054831684179055955487168552600d909352818420805484168217905593835280832080548316851790556007549094168252908390208054909116909117905551620001f8906200077d565b604051809103906000f08015801562000215573d6000803e3d6000fd5b50601980546001600160a01b0319166001600160a01b0392909216918217905560405163031e79db60e41b8152600481018290526331e79db090602401600060405180830381600087803b1580156200026d57600080fd5b505af115801562000282573d6000803e3d6000fd5b505060195460405163031e79db60e41b81523060048201526001600160a01b0390911692506331e79db09150602401600060405180830381600087803b158015620002cc57600080fd5b505af1158015620002e1573d6000803e3d6000fd5b50506019546001600160a01b031691506331e79db090506200030b6005546001600160a01b031690565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401600060405180830381600087803b1580156200034d57600080fd5b505af115801562000362573d6000803e3d6000fd5b505060195460075460405163031e79db60e41b81526001600160a01b039182166004820152911692506331e79db09150602401600060405180830381600087803b158015620003b057600080fd5b505af1158015620003c5573d6000803e3d6000fd5b505060195460405163031e79db60e41b815261036960048201526001600160a01b0390911692506331e79db09150602401600060405180830381600087803b1580156200041157600080fd5b505af115801562000426573d6000803e3d6000fd5b50506016602052505060007f4c4dc693d7db52f85fe052106f4b4b920e78e8ef37dee82878a60ab8585faf49819055620697807f4c4dc693d7db52f85fe052106f4b4b920e78e8ef37dee82878a60ab8585faf4a819055601e7f4c4dc693d7db52f85fe052106f4b4b920e78e8ef37dee82878a60ab8585faf4b557fcaff291fe014adc6b72a172705750b4cabe8f8667664d2924a166caab288564855620d2f007fcaff291fe014adc6b72a172705750b4cabe8f8667664d2924a166caab288564981905560197fcaff291fe014adc6b72a172705750b4cabe8f8667664d2924a166caab288564a557ff06d282f967055cb1eee17e04aa005b9682a620f4bbcfaee55ba78607a3d87ae556213c6807ff06d282f967055cb1eee17e04aa005b9682a620f4bbcfaee55ba78607a3d87af81905560147ff06d282f967055cb1eee17e04aa005b9682a620f4bbcfaee55ba78607a3d87b0557fec061709de2491458f4c981032059d7d19b0e55f45018bac6b3e660bdc959a5955621a5e007fec061709de2491458f4c981032059d7d19b0e55f45018bac6b3e660bdc959a5a819055600f7fec061709de2491458f4c981032059d7d19b0e55f45018bac6b3e660bdc959a5b556005918290527f5696377e725b42a372ecc45f0fbdab5e9555865aef54619ad9381892f667bbf0556220f5807f5696377e725b42a372ecc45f0fbdab5e9555865aef54619ad9381892f667bbf155600a7f5696377e725b42a372ecc45f0fbdab5e9555865aef54619ad9381892f667bbf2556017805460ff1916821790555462000688906001600160a01b0316683635c9adc5dea0000062000690565b505062000978565b6001600160a01b038216620006eb5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640160405180910390fd5b8060026000828254620006ff919062000950565b90915550506001600160a01b038216600090815260208190526040812080548392906200072e90849062000950565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b505050565b611aef8062003ee683390190565b80516001600160a01b0381168114620007a357600080fd5b919050565b60008060408385031215620007bc57600080fd5b620007c7836200078b565b9150620007d7602084016200078b565b90509250929050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200080b57607f821691505b6020821081036200082c57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200077857600081815260208120601f850160051c810160208610156200085b5750805b601f850160051c820191505b818110156200087c5782815560010162000867565b505050505050565b81516001600160401b03811115620008a057620008a0620007e0565b620008b881620008b18454620007f6565b8462000832565b602080601f831160018114620008f05760008415620008d75750858301515b600019600386901b1c1916600185901b1785556200087c565b600085815260208120601f198616915b82811015620009215788860151825594840194600190910190840162000900565b5085821015620009405787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b808201808211156200097257634e487b7160e01b600052601160045260246000fd5b92915050565b61355e80620009886000396000f3fe6080604052600436106103395760003560e01c80638aaa9389116101ab578063b485430b116100f7578063de30aad111610095578063ec29f4e91161006f578063ec29f4e9146109d5578063f429389014610a02578063fbcbc0f114610a17578063fdb5a03e14610a3757600080fd5b8063de30aad11461097f578063e3402c671461099f578063e5fc10ed146109b557600080fd5b8063c9567bf9116100d1578063c9567bf9146108ee578063d297105914610903578063d539be5f14610919578063dd62ed3e1461093957600080fd5b8063b485430b1461089f578063b652ef3b146108b9578063ba762ddd146108d957600080fd5b80639c0db5f311610164578063a8b9d2401161013e578063a8b9d24014610809578063a9059cbb14610829578063af9549e014610849578063b1fdb11b1461086957600080fd5b80639c0db5f3146107a9578063a2923a0f146107c9578063a457c2d7146107e957600080fd5b80638aaa9389146106a25780638da5cb5b146106c25780638e5916b2146106e0578063906778331461071057806395d89b411461073d578063963bafa01461075257600080fd5b80634297a7ca116102855780636843cd8411610223578063715018a6116101fd578063715018a6146106415780637c4b492e146106565780638954fb4a1461066c57806389a5c6911461068c57600080fd5b80636843cd84146105e15780636973cd091461060157806370a082311461062157600080fd5b80635b6612ad1161025f5780635b6612ad146105695780635b683e66146105965780635fcefa42146105ac57806364b0f653146105cc57600080fd5b80634297a7ca1461050f5780634e71d92d1461053f57806351bc3c851461055457600080fd5b806323b872dd116102f2578063313ce567116102cc578063313ce5671461048357806339509351146104a55780633bbac579146104c55780633e9ffbea146104f557600080fd5b806323b872dd146104165780632c1f52161461043657806330bb4cff1461046e57600080fd5b806306fdde0314610345578063095ea7b31461037057806312dfbd33146103a057806318160ddd146103c25780631930f66b146103e15780631c08bc5d146103f657600080fd5b3661034057005b600080fd5b34801561035157600080fd5b5061035a610a4c565b6040516103679190612f16565b60405180910390f35b34801561037c57600080fd5b5061039061038b366004612f7c565b610ade565b6040519015158152602001610367565b3480156103ac57600080fd5b506103c06103bb366004612fa8565b610af8565b005b3480156103ce57600080fd5b506002545b604051908152602001610367565b3480156103ed57600080fd5b506103c0610b30565b34801561040257600080fd5b506103c0610411366004612fa8565b610bd8565b34801561042257600080fd5b50610390610431366004612fc1565b610c07565b34801561044257600080fd5b50601954610456906001600160a01b031681565b6040516001600160a01b039091168152602001610367565b34801561047a57600080fd5b506103d3610c2b565b34801561048f57600080fd5b5060095b60405160ff9091168152602001610367565b3480156104b157600080fd5b506103906104c0366004612f7c565b610c9e565b3480156104d157600080fd5b506103906104e0366004613002565b600b6020526000908152604090205460ff1681565b34801561050157600080fd5b506014546103909060ff1681565b34801561051b57600080fd5b5061039061052a366004613002565b600d6020526000908152604090205460ff1681565b34801561054b57600080fd5b506103c0610cdd565b34801561056057600080fd5b506103c0610cea565b34801561057557600080fd5b506103d3610584366004613002565b601b6020526000908152604090205481565b3480156105a257600080fd5b506103d3600f5481565b3480156105b857600080fd5b506103c06105c736600461301f565b610d3a565b3480156105d857600080fd5b506103d3610d98565b3480156105ed57600080fd5b506103d36105fc366004613002565b610de2565b34801561060d57600080fd5b506103c061061c36600461305a565b610e52565b34801561062d57600080fd5b506103d361063c366004613002565b610eb4565b34801561064d57600080fd5b506103c0610ecf565b34801561066257600080fd5b506103d3601c5481565b34801561067857600080fd5b506103c06106873660046130a1565b610f43565b34801561069857600080fd5b506103d360135481565b3480156106ae57600080fd5b506103c06106bd366004612fa8565b611023565b3480156106ce57600080fd5b506005546001600160a01b0316610456565b3480156106ec57600080fd5b506103906106fb366004613002565b600a6020526000908152604090205460ff1681565b34801561071c57600080fd5b506103d361072b366004613002565b60156020526000908152604090205481565b34801561074957600080fd5b5061035a611052565b34801561075e57600080fd5b5061078e61076d3660046130e5565b60166020526000908152604090208054600182015460029092015490919083565b60408051938452602084019290925290820152606001610367565b3480156107b557600080fd5b506103c06107c4366004613100565b611061565b3480156107d557600080fd5b506103c06107e4366004613186565b611186565b3480156107f557600080fd5b50610390610804366004612f7c565b611201565b34801561081557600080fd5b506103d3610824366004613002565b611293565b34801561083557600080fd5b50610390610844366004612f7c565b6112c6565b34801561085557600080fd5b506103c06108643660046130a1565b6112d4565b34801561087557600080fd5b506103d3610884366004613002565b6001600160a01b031660009081526021602052604090205490565b3480156108ab57600080fd5b506017546104939060ff1681565b3480156108c557600080fd5b506103d36108d4366004613002565b611329565b3480156108e557600080fd5b506103d36113f7565b3480156108fa57600080fd5b506103c0611408565b34801561090f57600080fd5b506103d3601e5481565b34801561092557600080fd5b506103c06109343660046130e5565b61172c565b34801561094557600080fd5b506103d361095436600461305a565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b34801561098b57600080fd5b506103c061099a3660046131bf565b61176c565b3480156109ab57600080fd5b506103d3601d5481565b3480156109c157600080fd5b506103c06109d03660046130a1565b6117a9565b3480156109e157600080fd5b506109f56109f03660046131dc565b6117fe565b6040516103679190613211565b348015610a0e57600080fd5b506103c0611a2d565b348015610a2357600080fd5b5061078e610a32366004613002565b611af4565b348015610a4357600080fd5b506103c0611b85565b606060038054610a5b9061326a565b80601f0160208091040260200160405190810160405280929190818152602001828054610a879061326a565b8015610ad45780601f10610aa957610100808354040283529160200191610ad4565b820191906000526020600020905b815481529060010190602001808311610ab757829003601f168201915b5050505050905090565b600033610aec818585611b90565b60019150505b92915050565b6005546001600160a01b03163314610b2b5760405162461bcd60e51b8152600401610b22906132a4565b60405180910390fd5b601355565b6005546001600160a01b03163314610b5a5760405162461bcd60e51b8152600401610b22906132a4565b6019546001600160a01b0316636ff1c9bc610b7d6005546001600160a01b031690565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401600060405180830381600087803b158015610bbe57600080fd5b505af1158015610bd2573d6000803e3d6000fd5b50505050565b6005546001600160a01b03163314610c025760405162461bcd60e51b8152600401610b22906132a4565b601d55565b600033610c15858285611cb4565b610c20858585611d40565b506001949350505050565b601954604080516342d359d760e11b815290516000926001600160a01b0316916385a6b3ae9160048083019260209291908290030181865afa158015610c75573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c9991906132d9565b905090565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909190610aec9082908690610cd8908790613308565b611b90565b610ce8336000612131565b565b6005546001600160a01b03163314610d145760405162461bcd60e51b8152600401610b22906132a4565b6000610d2b601c54610d2530610eb4565b906123c8565b9050610d36816123db565b5050565b6005546001600160a01b03163314610d645760405162461bcd60e51b8152600401610b22906132a4565b600a8511158015610d7857506005600f5411155b610d8157600080fd5b600e94909455600f92909255601055601155601255565b601954604080516304ddf6ef60e11b815290516000926001600160a01b0316916309bbedde9160048083019260209291908290030181865afa158015610c75573d6000803e3d6000fd5b6019546040516370a0823160e01b81526001600160a01b03838116600483015260009216906370a08231906024015b602060405180830381865afa158015610e2e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610af291906132d9565b6005546001600160a01b03163314610e7c5760405162461bcd60e51b8152600401610b22906132a4565b60178054610100600160a81b0319166101006001600160a01b0394851602179055601880546001600160a01b03191691909216179055565b6001600160a01b031660009081526020819052604090205490565b6005546001600160a01b03163314610ef95760405162461bcd60e51b8152600401610b22906132a4565b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b6005546001600160a01b03163314610f6d5760405162461bcd60e51b8152600401610b22906132a4565b8015610fd75760195460405163031e79db60e41b81526001600160a01b038481166004830152909116906331e79db0906024015b600060405180830381600087803b158015610fbb57600080fd5b505af1158015610fcf573d6000803e3d6000fd5b505050505050565b6019546001600160a01b03166318c18adb83610ff281610eb4565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401610fa1565b6005546001600160a01b0316331461104d5760405162461bcd60e51b8152600401610b22906132a4565b600c55565b606060048054610a5b9061326a565b6005546001600160a01b0316331461108b5760405162461bcd60e51b8152600401610b22906132a4565b60005b82811015610bd2576008546001600160a01b03168484838181106110b4576110b461331b565b90506020020160208101906110c99190613002565b6001600160a01b03161415801561111a57506007546001600160a01b03168484838181106110f9576110f961331b565b905060200201602081019061110e9190613002565b6001600160a01b031614155b156111745781600b60008686858181106111365761113661331b565b905060200201602081019061114b9190613002565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790555b8061117e81613331565b91505061108e565b6005546001600160a01b031633146111b05760405162461bcd60e51b8152600401610b22906132a4565b6111bb83603c612590565b60ff85166000908152601660205260409020556111d982603c612590565b60ff909416600090815260166020526040902060018101949094556002909301929092555050565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909190838110156112865760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610b22565b610c208286868403611b90565b6019546040516302a2e74960e61b81526001600160a01b038381166004830152600092169063a8b9d24090602401610e11565b600033610aec818585611d40565b6005546001600160a01b031633146112fe5760405162461bcd60e51b8152600401610b22906132a4565b6001600160a01b03919091166000908152600a60205260409020805460ff1916911515919091179055565b600f5460009060015b60175460ff908116908216116113f05760ff81166000908152601660209081526040808320546001600160a01b0388168452601590925290912054429161137891613308565b111580156113bd575060ff81166000908152601660209081526040808320600101546001600160a01b038816845260159092529091205442916113ba91613308565b10155b156113de5760ff166000908152601660205260409020600201549392505050565b806113e88161334a565b915050611332565b5092915050565b6000610c99601c54610d2530610eb4565b6005546001600160a01b031633146114325760405162461bcd60e51b8152600401610b22906132a4565b600754600160a01b900460ff161561148c5760405162461bcd60e51b815260206004820152601e60248201527f426c6173743a2054726164696e6720697320616c7265616479206f70656e00006044820152606401610b22565b600760009054906101000a90046001600160a01b03166001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa1580156114df573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115039190613369565b6001600160a01b031663c9c6539630600760009054906101000a90046001600160a01b03166001600160a01b031663ef8ef56f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611565573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115899190613369565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af11580156115d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115fa9190613369565b600880546001600160a01b0319166001600160a01b03928316908117825560009081526009602052604090819020805460ff191660011790556019549154905163031e79db60e41b815290831660048201529116906331e79db090602401600060405180830381600087803b15801561167257600080fd5b505af1158015611686573d6000803e3d6000fd5b5050505061169c61169630610eb4565b4761259c565b60085460075460405163095ea7b360e01b81526001600160a01b039182166004820152600019602482015291169063095ea7b3906044016020604051808303816000875af11580156116f2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117169190613386565b506007805460ff60a01b1916600160a01b179055565b6005546001600160a01b031633146117565760405162461bcd60e51b8152600401610b22906132a4565b6017805460ff191660ff92909216919091179055565b6005546001600160a01b031633146117965760405162461bcd60e51b8152600401610b22906132a4565b6014805460ff1916911515919091179055565b6005546001600160a01b031633146117d35760405162461bcd60e51b8152600401610b22906132a4565b6001600160a01b03919091166000908152600d60205260409020805460ff1916911515919091179055565b60606000831180156118105750600082115b61185c5760405162461bcd60e51b815260206004820152601860248201527f426c6173743a20496e76616c696420617267756d656e747300000000000000006044820152606401610b22565b6001600160a01b0384166000908152602160205260408120549061188085856133a3565b9050600061188e86836133ba565b90508281106118d55760405162461bcd60e51b8152602060048201526013602482015272426c6173743a204f7574206f662072616e676560681b6044820152606401610b22565b85838311156118ee578392506118eb87846133e3565b90505b60008167ffffffffffffffff811115611909576119096133f7565b60405190808252806020026020018201604052801561195e57816020015b61194b60405180606001604052806000815260200160008152602001600081525090565b8152602001906001900390816119275790505b5090506000835b85811015611a1e576001600160a01b038b1660009081526021602052604081208054839081106119975761199761331b565b906000526020600020015490506020600082815260200190815260200160002060405180606001604052908160008201548152602001600182015481526020016002820154815250508484815181106119f2576119f261331b565b6020908102919091010152611a08600184613308565b9250508080611a1690613331565b915050611965565b50909998505050505050505050565b6005546001600160a01b03163314611a575760405162461bcd60e51b8152600401610b22906132a4565b6000611a6e601e54476123c890919063ffffffff16565b90506000611a9f611a8b60105460646123c890919063ffffffff16565b601154611a99908590612590565b906126ab565b90506000611aca611abc60105460646123c890919063ffffffff16565b601254611a99908690612590565b90506000611adc82610d2586866123c8565b9050611ae883826126b7565b9250610bd283836126c3565b60195460405163fbcbc0f160e01b81526001600160a01b038381166004830152600092839283929091169063fbcbc0f1906024016040805180830381865afa158015611b44573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b68919061340d565b90935091508282611b7886610eb4565b9250925092509193909250565b610ce8336001612131565b6001600160a01b038316611bf25760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610b22565b6001600160a01b038216611c535760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610b22565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b038381166000908152600160209081526040808320938616835292905220546000198114610bd25781811015611d335760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610b22565b610bd28484848403611b90565b6001600160a01b0383166000908152600b602052604090205460ff16158015611d8257506001600160a01b0382166000908152600b602052604090205460ff16155b611d8b57600080fd5b600c54600754829190600160a01b900460ff168015611de457506001600160a01b03851660009081526009602052604090205460ff1680611de457506001600160a01b03841660009081526009602052604090205460ff165b8015611e0957506001600160a01b0385166000908152600a602052604090205460ff16155b8015611e2e57506001600160a01b0384166000908152600a602052604090205460ff16155b15611e4157611e3e858585612781565b91505b6001600160a01b0384166000908152601560205260408120549003611e7c576001600160a01b03841660009081526015602052604090204290555b6001600160a01b03841660009081526009602052604090205460ff16158015611ebe57506001600160a01b0384166000908152600d602052604090205460ff16155b15611f52576000611ed883611ed287610eb4565b906126b7565b9050611ef5612710611a99600c54611eef60025490565b90612590565b811115611f505760405162461bcd60e51b815260206004820152602360248201527f426c6173743a2057616c6c65742062616c616e6365206c696d697420726561636044820152621a195960ea1b6064820152608401610b22565b505b611f5d8585846129c2565b600c819055601954604051631b4a89ab60e11b81526001600160a01b03878116600483015290911690633695135690602401602060405180830381865afa158015611fac573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fd09190613386565b612048576019546001600160a01b031663e30443bc86611fef81610eb4565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561203557600080fd5b505af1925050508015612046575060015b505b601954604051631b4a89ab60e11b81526001600160a01b03868116600483015290911690633695135690602401602060405180830381865afa158015612092573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120b69190613386565b61212a576019546001600160a01b031663e30443bc856120d581610eb4565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561211b57600080fd5b505af1925050508015610fcf57505b5050505050565b6019546040516302a2e74960e61b81526001600160a01b038481166004830152600092169063a8b9d24090602401602060405180830381865afa15801561217c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121a091906132d9565b9050600081116122065760405162461bcd60e51b815260206004820152602b60248201527f426c6173743a20436c61696d657220686173206e6f207769746864726177616260448201526a1b1948191a5d9a59195b9960aa1b6064820152608401610b22565b6000808361228c576019546040516352b5f81d60e01b81526001600160a01b03878116600483018190526024830152909116906352b5f81d906044016020604051808303816000875af1158015612261573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061228591906132d9565b9150612317565b6019546040516352b5f81d60e01b81526001600160a01b038781166004830152306024830152909116906352b5f81d906044016020604051808303816000875af11580156122de573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061230291906132d9565b91508115612317576123148286612b90565b90505b811561212a5761232b601f80546001019055565b6000612336601f5490565b6000818152602080805260408083208781556001808201889055426002909201919091556001600160a01b038b1680855260218452828520805492830181558552938390200184905580518781529182018690528101919091529091507f67dd3d116bf53e0ddda53bb148a5fdc129854e1c507c0eeda9190049a9bbc84f9060600160405180910390a1505050505050565b60006123d482846133ba565b9392505050565b60408051600280825260608201835260009247928492909160208301908036833701905050905030816000815181106124165761241661331b565b6001600160a01b039283166020918202929092018101919091526007546040805163ef8ef56f60e01b81529051919093169263ef8ef56f9260048083019391928290030181865afa15801561246f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124939190613369565b816001815181106124a6576124a661331b565b6001600160a01b0392831660209182029290920101526007546124cc9130911686611b90565b60075460405163791ac94760e01b81526001600160a01b039091169063791ac94790612505908790600090869030904290600401613475565b600060405180830381600087803b15801561251f57600080fd5b505af1158015612533573d6000803e3d6000fd5b50505050600061254c83476123c890919063ffffffff16565b60408051878152602081018390529192507f4a6c12eb4e479a4ea28c8acad8efde466ef9bf69cf473501dd76865234496273910160405180910390a1949350505050565b60006123d482846133a3565b6007546125b49030906001600160a01b031684611b90565b6007546001600160a01b031663f305d7198230856000806125dd6005546001600160a01b031690565b60405160e088901b6001600160e01b03191681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c40160606040518083038185885af1158015612645573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061266a91906134b1565b505060408051848152602081018490527fcb1652de9aeec38545fc281847b3dbfc89aab56dfa907b1ab68466f602c36fb49250015b60405180910390a15050565b60006123d482846134df565b60006123d48284613308565b8115612709576017546040516101009091046001600160a01b0316906108fc8415029084906000818181858888f19350505050158015612707573d6000803e3d6000fd5b505b801561274b576018546040516001600160a01b039091169082156108fc029083906000818181858888f19350505050158015612749573d6000803e3d6000fd5b505b60408051838152602081018390527f916ad8171ef8c567c7790377a142f0200f9565940680c06e30dd105cfd924968910161269f565b6001600160a01b0383166000908152600960205260408120548190819060ff16806127c457506001600160a01b03851660009081526009602052604090205460ff165b6128105760405162461bcd60e51b815260206004820152601d60248201527f426c6173743a204e6f206d61726b6574206d616b65727320666f756e640000006044820152606401610b22565b6001600160a01b03861660009081526009602052604090205460ff16156128b25761284b6064611a99600e548761259090919063ffffffff16565b915061285784836123c8565b90506128648630846129c2565b604080516001600160a01b03881681523060208201529081018390527f6b0b46d0273ce53f1de696d2100b35dd3a405dcecbcbeede66215d858d5c401d9060600160405180910390a16129b9565b60006128bd87611329565b90506128ce6064611a998784612590565b925060006128f66064611a996128ef600f54866123c890919063ffffffff16565b8990612590565b601c5490915061290690826126b7565b601c5561291386856123c8565b92506129208830866129c2565b6000612931601c54610d2530610eb4565b90506013548111156129555760145460ff1661294c57506013545b61295581612d42565b601d54601c54111561296c5761296c601c54612e38565b604080516001600160a01b038b1681523060208201529081018690527f4ab5e0df8ff1605133dbdd1b8e3f52edb9539abe64595f6f70b30d2fea7f204a9060600160405180910390a15050505b95945050505050565b6001600160a01b038316612a265760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610b22565b6001600160a01b038216612a885760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610b22565b6001600160a01b03831660009081526020819052604090205481811015612b005760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610b22565b6001600160a01b03808516600090815260208190526040808220858503905591851681529081208054849290612b37908490613308565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051612b8391815260200190565b60405180910390a3610bd2565b600080612b9c30610eb4565b604080516002808252606082018352929350600092909160208301908036833750506007546040805163ef8ef56f60e01b815290519394506001600160a01b039091169263ef8ef56f925060048083019260209291908290030181865afa158015612c0b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c2f9190613369565b81600081518110612c4257612c4261331b565b60200260200101906001600160a01b031690816001600160a01b0316815250503081600181518110612c7657612c7661331b565b6001600160a01b03928316602091820292909201015260075460405163b6f9de9560e01b815291169063b6f9de95908790612cbc9060009086908a9042906004016134f3565b6000604051808303818588803b158015612cd557600080fd5b505af1158015612ce9573d6000803e3d6000fd5b50505050506000612cfd83610d2530610eb4565b60408051888152602081018390529192507f2d5c8efb676a77fc04b6b50a19f6ccbf08ee66df0202de33576485f1f77b4b69910160405180910390a195945050505050565b6000612d5e6064611a996010548561259090919063ffffffff16565b90506000612d6d8260026126ab565b90506000612d7b84836123c8565b90506000612d88826123db565b90506000612da66064611a996010548561259090919063ffffffff16565b90506000612dc46064611a996011548661259090919063ffffffff16565b90506000612de26064611a996012548761259090919063ffffffff16565b90506000612df682610d25858189896123c8565b9050612e0283826126b7565b9250612e0e83836126c3565b600087118015612e1e5750600084115b15612e2d57612e2d878561259c565b505050505050505050565b6000612e43826123db565b601c54909150612e5390836123c8565b601c55601e54600090612e679083906126b7565b6019546040519192506000916001600160a01b039091169083908381818185875af1925050503d8060008114612eb9576040519150601f19603f3d011682016040523d82523d6000602084013e612ebe565b606091505b505090508015612f00576040518381527fb0cc2628d6d644cf6be9d8110e142297ac910d6d8026d795a99f272fd9ad60b19060200160405180910390a1610bd2565b601e54612f0d90846126b7565b601e5550505050565b600060208083528351808285015260005b81811015612f4357858101830151858201604001528201612f27565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114612f7957600080fd5b50565b60008060408385031215612f8f57600080fd5b8235612f9a81612f64565b946020939093013593505050565b600060208284031215612fba57600080fd5b5035919050565b600080600060608486031215612fd657600080fd5b8335612fe181612f64565b92506020840135612ff181612f64565b929592945050506040919091013590565b60006020828403121561301457600080fd5b81356123d481612f64565b600080600080600060a0868803121561303757600080fd5b505083359560208501359550604085013594606081013594506080013592509050565b6000806040838503121561306d57600080fd5b823561307881612f64565b9150602083013561308881612f64565b809150509250929050565b8015158114612f7957600080fd5b600080604083850312156130b457600080fd5b82356130bf81612f64565b9150602083013561308881613093565b803560ff811681146130e057600080fd5b919050565b6000602082840312156130f757600080fd5b6123d4826130cf565b60008060006040848603121561311557600080fd5b833567ffffffffffffffff8082111561312d57600080fd5b818601915086601f83011261314157600080fd5b81358181111561315057600080fd5b8760208260051b850101111561316557600080fd5b6020928301955093505084013561317b81613093565b809150509250925092565b6000806000806080858703121561319c57600080fd5b6131a5856130cf565b966020860135965060408601359560600135945092505050565b6000602082840312156131d157600080fd5b81356123d481613093565b6000806000606084860312156131f157600080fd5b83356131fc81612f64565b95602085013595506040909401359392505050565b602080825282518282018190526000919060409081850190868401855b8281101561325d578151805185528681015187860152850151858501526060909301929085019060010161322e565b5091979650505050505050565b600181811c9082168061327e57607f821691505b60208210810361329e57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6000602082840312156132eb57600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b80820180821115610af257610af26132f2565b634e487b7160e01b600052603260045260246000fd5b600060018201613343576133436132f2565b5060010190565b600060ff821660ff8103613360576133606132f2565b60010192915050565b60006020828403121561337b57600080fd5b81516123d481612f64565b60006020828403121561339857600080fd5b81516123d481613093565b8082028115828204841417610af257610af26132f2565b81810381811115610af257610af26132f2565b634e487b7160e01b600052601260045260246000fd5b6000826133f2576133f26133cd565b500690565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561342057600080fd5b505080516020909101519092909150565b600081518084526020808501945080840160005b8381101561346a5781516001600160a01b031687529582019590820190600101613445565b509495945050505050565b85815284602082015260a06040820152600061349460a0830186613431565b6001600160a01b0394909416606083015250608001529392505050565b6000806000606084860312156134c657600080fd5b8351925060208401519150604084015190509250925092565b6000826134ee576134ee6133cd565b500490565b84815260806020820152600061350c6080830186613431565b6001600160a01b0394909416604083015250606001529291505056fea26469706673582212207edfe6ad1d4a91987f19479846e3601e0b7e145cf801a32a69666f8ebe66be9a64736f6c6343000812003360a06040523480156200001157600080fd5b5060408051808201825260168082527f426c6173745f4469766964656e645f547261636b6572000000000000000000006020808401829052845180860190955291845290830152908181600362000069838262000174565b50600462000078828262000174565b5050600980546001600160a01b03191633908117909155604051909350600092507f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091508290a36509184e72a00060805262000240565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620000fa57607f821691505b6020821081036200011b57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200016f57600081815260208120601f850160051c810160208610156200014a5750805b601f850160051c820191505b818110156200016b5782815560010162000156565b5050505b505050565b81516001600160401b03811115620001905762000190620000cf565b620001a881620001a18454620000e5565b8462000121565b602080601f831160018114620001e05760008415620001c75750858301515b600019600386901b1c1916600185901b1785556200016b565b600085815260208120601f198616915b828110156200021157888601518255948401946001909101908401620001f0565b5085821015620002305787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6080516118856200026a60003960008181610547015281816107a80152610dba01526118856000f3fe6080604052600436106101d15760003560e01c80636ff1c9bc116100f7578063a457c2d711610095578063be10b61411610064578063be10b61414610535578063dd62ed3e14610569578063e30443bc146105af578063fbcbc0f1146105cf57600080fd5b8063a457c2d71461049f578063a8b9d240146104bf578063a9059cbb146104df578063aafd847a146104ff57600080fd5b806385a6b3ae116100d157806385a6b3ae1461042c5780638da5cb5b1461044257806391b89fba1461046a57806395d89b411461048a57600080fd5b80636ff1c9bc146103c157806370a08231146103e1578063715018a61461041757600080fd5b806327ce01471161016f578063395093511161013e578063395093511461033c5780634e7b827f1461035c57806352b5f81d1461038c5780636a474002146103ac57600080fd5b806327ce0147146102c0578063313ce567146102e057806331e79db0146102fc578063369513561461031c57600080fd5b806309bbedde116101ab57806309bbedde1461024857806318160ddd1461026b57806318c18adb1461028057806323b872dd146102a057600080fd5b806303c83302146101e557806306fdde03146101ed578063095ea7b31461021857600080fd5b366101e0576101de610604565b005b600080fd5b6101de610604565b3480156101f957600080fd5b50610202610697565b60405161020f91906115f3565b60405180910390f35b34801561022457600080fd5b50610238610233366004611659565b610729565b604051901515815260200161020f565b34801561025457600080fd5b5061025d610743565b60405190815260200161020f565b34801561027757600080fd5b5060025461025d565b34801561028c57600080fd5b506101de61029b366004611659565b610753565b3480156102ac57600080fd5b506102386102bb366004611685565b610864565b3480156102cc57600080fd5b5061025d6102db3660046116c6565b610888565b3480156102ec57600080fd5b506040516009815260200161020f565b34801561030857600080fd5b506101de6103173660046116c6565b6108e4565b34801561032857600080fd5b506102386103373660046116c6565b6109c2565b34801561034857600080fd5b50610238610357366004611659565b610a0e565b34801561036857600080fd5b506102386103773660046116c6565b600d6020526000908152604090205460ff1681565b34801561039857600080fd5b5061025d6103a73660046116e3565b610a4d565b3480156103b857600080fd5b506101de610a8e565b3480156103cd57600080fd5b506101de6103dc3660046116c6565b610b32565b3480156103ed57600080fd5b5061025d6103fc3660046116c6565b6001600160a01b031660009081526020819052604090205490565b34801561042357600080fd5b506101de610c01565b34801561043857600080fd5b5061025d60085481565b34801561044e57600080fd5b506009546040516001600160a01b03909116815260200161020f565b34801561047657600080fd5b5061025d6104853660046116c6565b610c75565b34801561049657600080fd5b50610202610c80565b3480156104ab57600080fd5b506102386104ba366004611659565b610c8f565b3480156104cb57600080fd5b5061025d6104da3660046116c6565b610d21565b3480156104eb57600080fd5b506102386104fa366004611659565b610d60565b34801561050b57600080fd5b5061025d61051a3660046116c6565b6001600160a01b031660009081526007602052604090205490565b34801561054157600080fd5b5061025d7f000000000000000000000000000000000000000000000000000000000000000081565b34801561057557600080fd5b5061025d6105843660046116e3565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b3480156105bb57600080fd5b506101de6105ca366004611659565b610d6e565b3480156105db57600080fd5b506105ef6105ea3660046116c6565b610e9c565b6040805192835260208301919091520161020f565b600061060f60025490565b1161061957600080fd5b34156106955761064c61062b60025490565b61063934600160801b610ec9565b6106439190611732565b60055490610edc565b60055560405134815233907fa493a9229478c3fcd73f66d2cdeb7f94fd0f341da924d1054236d784541165119060200160405180910390a26008546106919034610edc565b6008555b565b6060600380546106a690611754565b80601f01602080910402602001604051908101604052809291908181526020018280546106d290611754565b801561071f5780601f106106f45761010080835404028352916020019161071f565b820191906000526020600020905b81548152906001019060200180831161070257829003601f168201915b5050505050905090565b600033610737818585610ee8565b60019150505b92915050565b600061074e600b5490565b905090565b6009546001600160a01b031633146107865760405162461bcd60e51b815260040161077d9061178e565b60405180910390fd5b6001600160a01b0382166000908152600d60205260409020805460ff191690557f0000000000000000000000000000000000000000000000000000000000000000811061082c576107d78282610f45565b6001600160a01b0382166000908152600c602052604081205460ff161515900361082c576001600160a01b0382166000908152600c60205260409020805460ff1916600117905561082c600b80546001019055565b6040516001600160a01b038316907fa878b31040b2e6d0a9a3d3361209db3908ba62014b0dca52adbaee451d128b2590600090a25050565b600033610872858285610fa4565b61087d858585611030565b506001949350505050565b6001600160a01b03811660009081526006602090815260408083205491839052822054600554600160801b926108da926108d5926108cf916108ca9190610ec9565b61108d565b906110fb565b611107565b61073d9190611732565b6009546001600160a01b0316331461090e5760405162461bcd60e51b815260040161077d9061178e565b6001600160a01b0381166000908152600d60205260408120805460ff1916600117905561093c908290610f45565b6001600160a01b0381166000908152600c602052604090205460ff16151560010361098b576001600160a01b0381166000908152600c60205260409020805460ff1916905561098b600b611159565b6040516001600160a01b038216907fa878b31040b2e6d0a9a3d3361209db3908ba62014b0dca52adbaee451d128b2590600090a250565b6009546000906001600160a01b031633146109ef5760405162461bcd60e51b815260040161077d9061178e565b506001600160a01b03166000908152600d602052604090205460ff1690565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091906107379082908690610a489087906117c3565b610ee8565b6009546000906001600160a01b03163314610a7a5760405162461bcd60e51b815260040161077d9061178e565b6000610a8684846111b0565b949350505050565b60405162461bcd60e51b815260206004820152606760248201527f426c6173745f4469766964656e645f547261636b65723a20776974686472617760448201527f4469766964656e642064697361626c65642e20557365207468652027636c616960648201527f6d272066756e6374696f6e206f6e20746865206d61696e20426c61737420636f608482015266373a3930b1ba1760c91b60a482015260c40161077d565b6009546001600160a01b03163314610b5c5760405162461bcd60e51b815260040161077d9061178e565b60006005554780610b9c5760405162461bcd60e51b815260206004820152600a6024820152696e6f2062616c616e636560b01b604482015260640161077d565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114610be9576040519150601f19603f3d011682016040523d82523d6000602084013e610bee565b606091505b5050905080610bfc57600080fd5b505050565b6009546001600160a01b03163314610c2b5760405162461bcd60e51b815260040161077d9061178e565b6009546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600980546001600160a01b0319169055565b600061073d82610d21565b6060600480546106a690611754565b3360008181526001602090815260408083206001600160a01b038716845290915281205490919083811015610d145760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b606482015260840161077d565b61087d8286868403610ee8565b60055460009015610d58576001600160a01b03821660009081526007602052604090205461073d90610d5284610888565b90611306565b506000919050565b600033610737818585611030565b6009546001600160a01b03163314610d985760405162461bcd60e51b815260040161077d9061178e565b6001600160a01b0382166000908152600d602052604090205460ff16610e3e577f00000000000000000000000000000000000000000000000000000000000000008110610e4257610de98282610f45565b6001600160a01b0382166000908152600c602052604081205460ff1615159003610e3e576001600160a01b0382166000908152600c60205260409020805460ff19166001179055610e3e600b80546001019055565b5050565b610e4d826000610f45565b6001600160a01b0382166000908152600c602052604090205460ff161515600103610e3e576001600160a01b0382166000908152600c60205260409020805460ff19169055610e3e600b611159565b600080610ea883610d21565b6001600160a01b039093166000908152600760205260409020549293915050565b6000610ed582846117d6565b9392505050565b6000610ed582846117c3565b60405162461bcd60e51b815260206004820152602c60248201527f426c6173745f4469766964656e645f547261636b65723a204e6f20617070726f60448201526b1d985b1cc8185b1b1bddd95960a21b606482015260840161077d565b6001600160a01b03821660009081526020819052604090205480821115610f84576000610f728383611306565b9050610f7e8482611312565b50505050565b80821015610bfc576000610f988284611306565b9050610f7e8482611376565b6001600160a01b038381166000908152600160209081526040808320938616835292905220546000198114610f7e57818110156110235760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000604482015260640161077d565b610f7e8484848403610ee8565b60405162461bcd60e51b815260206004820152602c60248201527f426c6173745f4469766964656e645f547261636b65723a204e6f207472616e7360448201526b19995c9cc8185b1b1bddd95960a21b606482015260840161077d565b60006001600160ff1b038211156110f75760405162461bcd60e51b815260206004820152602860248201527f53616665436173743a2076616c756520646f65736e27742066697420696e2061604482015267371034b73a191a9b60c11b606482015260840161077d565b5090565b6000610ed582846117ed565b6000808212156110f75760405162461bcd60e51b815260206004820181905260248201527f53616665436173743a2076616c7565206d75737420626520706f736974697665604482015260640161077d565b8054806111a85760405162461bcd60e51b815260206004820152601b60248201527f436f756e7465723a2064656372656d656e74206f766572666c6f770000000000604482015260640161077d565b600019019055565b6000806111bc84610d21565b905080156112fc576001600160a01b0384166000908152600760205260409020546111e79082610edc565b6001600160a01b038516600081815260076020526040908190209290925590517feb063efb53b3790d2bc15284b59af7544466c8787c2883321ee27095647911b69061124890849087909182526001600160a01b0316602082015260400190565b60405180910390a26000836001600160a01b03168260405160006040518083038185875af1925050503d806000811461129d576040519150601f19603f3d011682016040523d82523d6000602084013e6112a2565b606091505b50509050806112f4576001600160a01b0385166000908152600760205260409020546112ce9083611306565b6001600160a01b038616600090815260076020526040812091909155925061073d915050565b50905061073d565b5060009392505050565b6000610ed58284611815565b61131c82826113ba565b6113566113376108ca83600554610ec990919063ffffffff16565b6001600160a01b03841660009081526006602052604090205490611499565b6001600160a01b0390921660009081526006602052604090209190915550565b61138082826114a5565b61135661139b6108ca83600554610ec990919063ffffffff16565b6001600160a01b038416600090815260066020526040902054906110fb565b6001600160a01b0382166114105760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640161077d565b806002600082825461142291906117c3565b90915550506001600160a01b0382166000908152602081905260408120805483929061144f9084906117c3565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6000610ed58284611828565b6001600160a01b0382166115055760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b606482015260840161077d565b6001600160a01b038216600090815260208190526040902054818110156115795760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b606482015260840161077d565b6001600160a01b03831660009081526020819052604081208383039055600280548492906115a8908490611815565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b600060208083528351808285015260005b8181101561162057858101830151858201604001528201611604565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b038116811461165657600080fd5b50565b6000806040838503121561166c57600080fd5b823561167781611641565b946020939093013593505050565b60008060006060848603121561169a57600080fd5b83356116a581611641565b925060208401356116b581611641565b929592945050506040919091013590565b6000602082840312156116d857600080fd5b8135610ed581611641565b600080604083850312156116f657600080fd5b823561170181611641565b9150602083013561171181611641565b809150509250929050565b634e487b7160e01b600052601160045260246000fd5b60008261174f57634e487b7160e01b600052601260045260246000fd5b500490565b600181811c9082168061176857607f821691505b60208210810361178857634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b8082018082111561073d5761073d61171c565b808202811582820484141761073d5761073d61171c565b808201828112600083128015821682158216171561180d5761180d61171c565b505092915050565b8181038181111561073d5761073d61171c565b81810360008312801583831316838312821617156118485761184861171c565b509291505056fea2646970667358221220ca573b3014c7215a856958f6dcf7183e1e2277afce31b9617206dc7db48919de64736f6c634300081200330000000000000000000000008bda04d2c7b67ce96116eb21cf9cfea41db7ce8100000000000000000000000047bb3c2349f2050d5bac06494b54c6c3e896b4bc

Deployed ByteCode

0x6080604052600436106103395760003560e01c80638aaa9389116101ab578063b485430b116100f7578063de30aad111610095578063ec29f4e91161006f578063ec29f4e9146109d5578063f429389014610a02578063fbcbc0f114610a17578063fdb5a03e14610a3757600080fd5b8063de30aad11461097f578063e3402c671461099f578063e5fc10ed146109b557600080fd5b8063c9567bf9116100d1578063c9567bf9146108ee578063d297105914610903578063d539be5f14610919578063dd62ed3e1461093957600080fd5b8063b485430b1461089f578063b652ef3b146108b9578063ba762ddd146108d957600080fd5b80639c0db5f311610164578063a8b9d2401161013e578063a8b9d24014610809578063a9059cbb14610829578063af9549e014610849578063b1fdb11b1461086957600080fd5b80639c0db5f3146107a9578063a2923a0f146107c9578063a457c2d7146107e957600080fd5b80638aaa9389146106a25780638da5cb5b146106c25780638e5916b2146106e0578063906778331461071057806395d89b411461073d578063963bafa01461075257600080fd5b80634297a7ca116102855780636843cd8411610223578063715018a6116101fd578063715018a6146106415780637c4b492e146106565780638954fb4a1461066c57806389a5c6911461068c57600080fd5b80636843cd84146105e15780636973cd091461060157806370a082311461062157600080fd5b80635b6612ad1161025f5780635b6612ad146105695780635b683e66146105965780635fcefa42146105ac57806364b0f653146105cc57600080fd5b80634297a7ca1461050f5780634e71d92d1461053f57806351bc3c851461055457600080fd5b806323b872dd116102f2578063313ce567116102cc578063313ce5671461048357806339509351146104a55780633bbac579146104c55780633e9ffbea146104f557600080fd5b806323b872dd146104165780632c1f52161461043657806330bb4cff1461046e57600080fd5b806306fdde0314610345578063095ea7b31461037057806312dfbd33146103a057806318160ddd146103c25780631930f66b146103e15780631c08bc5d146103f657600080fd5b3661034057005b600080fd5b34801561035157600080fd5b5061035a610a4c565b6040516103679190612f16565b60405180910390f35b34801561037c57600080fd5b5061039061038b366004612f7c565b610ade565b6040519015158152602001610367565b3480156103ac57600080fd5b506103c06103bb366004612fa8565b610af8565b005b3480156103ce57600080fd5b506002545b604051908152602001610367565b3480156103ed57600080fd5b506103c0610b30565b34801561040257600080fd5b506103c0610411366004612fa8565b610bd8565b34801561042257600080fd5b50610390610431366004612fc1565b610c07565b34801561044257600080fd5b50601954610456906001600160a01b031681565b6040516001600160a01b039091168152602001610367565b34801561047a57600080fd5b506103d3610c2b565b34801561048f57600080fd5b5060095b60405160ff9091168152602001610367565b3480156104b157600080fd5b506103906104c0366004612f7c565b610c9e565b3480156104d157600080fd5b506103906104e0366004613002565b600b6020526000908152604090205460ff1681565b34801561050157600080fd5b506014546103909060ff1681565b34801561051b57600080fd5b5061039061052a366004613002565b600d6020526000908152604090205460ff1681565b34801561054b57600080fd5b506103c0610cdd565b34801561056057600080fd5b506103c0610cea565b34801561057557600080fd5b506103d3610584366004613002565b601b6020526000908152604090205481565b3480156105a257600080fd5b506103d3600f5481565b3480156105b857600080fd5b506103c06105c736600461301f565b610d3a565b3480156105d857600080fd5b506103d3610d98565b3480156105ed57600080fd5b506103d36105fc366004613002565b610de2565b34801561060d57600080fd5b506103c061061c36600461305a565b610e52565b34801561062d57600080fd5b506103d361063c366004613002565b610eb4565b34801561064d57600080fd5b506103c0610ecf565b34801561066257600080fd5b506103d3601c5481565b34801561067857600080fd5b506103c06106873660046130a1565b610f43565b34801561069857600080fd5b506103d360135481565b3480156106ae57600080fd5b506103c06106bd366004612fa8565b611023565b3480156106ce57600080fd5b506005546001600160a01b0316610456565b3480156106ec57600080fd5b506103906106fb366004613002565b600a6020526000908152604090205460ff1681565b34801561071c57600080fd5b506103d361072b366004613002565b60156020526000908152604090205481565b34801561074957600080fd5b5061035a611052565b34801561075e57600080fd5b5061078e61076d3660046130e5565b60166020526000908152604090208054600182015460029092015490919083565b60408051938452602084019290925290820152606001610367565b3480156107b557600080fd5b506103c06107c4366004613100565b611061565b3480156107d557600080fd5b506103c06107e4366004613186565b611186565b3480156107f557600080fd5b50610390610804366004612f7c565b611201565b34801561081557600080fd5b506103d3610824366004613002565b611293565b34801561083557600080fd5b50610390610844366004612f7c565b6112c6565b34801561085557600080fd5b506103c06108643660046130a1565b6112d4565b34801561087557600080fd5b506103d3610884366004613002565b6001600160a01b031660009081526021602052604090205490565b3480156108ab57600080fd5b506017546104939060ff1681565b3480156108c557600080fd5b506103d36108d4366004613002565b611329565b3480156108e557600080fd5b506103d36113f7565b3480156108fa57600080fd5b506103c0611408565b34801561090f57600080fd5b506103d3601e5481565b34801561092557600080fd5b506103c06109343660046130e5565b61172c565b34801561094557600080fd5b506103d361095436600461305a565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b34801561098b57600080fd5b506103c061099a3660046131bf565b61176c565b3480156109ab57600080fd5b506103d3601d5481565b3480156109c157600080fd5b506103c06109d03660046130a1565b6117a9565b3480156109e157600080fd5b506109f56109f03660046131dc565b6117fe565b6040516103679190613211565b348015610a0e57600080fd5b506103c0611a2d565b348015610a2357600080fd5b5061078e610a32366004613002565b611af4565b348015610a4357600080fd5b506103c0611b85565b606060038054610a5b9061326a565b80601f0160208091040260200160405190810160405280929190818152602001828054610a879061326a565b8015610ad45780601f10610aa957610100808354040283529160200191610ad4565b820191906000526020600020905b815481529060010190602001808311610ab757829003601f168201915b5050505050905090565b600033610aec818585611b90565b60019150505b92915050565b6005546001600160a01b03163314610b2b5760405162461bcd60e51b8152600401610b22906132a4565b60405180910390fd5b601355565b6005546001600160a01b03163314610b5a5760405162461bcd60e51b8152600401610b22906132a4565b6019546001600160a01b0316636ff1c9bc610b7d6005546001600160a01b031690565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401600060405180830381600087803b158015610bbe57600080fd5b505af1158015610bd2573d6000803e3d6000fd5b50505050565b6005546001600160a01b03163314610c025760405162461bcd60e51b8152600401610b22906132a4565b601d55565b600033610c15858285611cb4565b610c20858585611d40565b506001949350505050565b601954604080516342d359d760e11b815290516000926001600160a01b0316916385a6b3ae9160048083019260209291908290030181865afa158015610c75573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c9991906132d9565b905090565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909190610aec9082908690610cd8908790613308565b611b90565b610ce8336000612131565b565b6005546001600160a01b03163314610d145760405162461bcd60e51b8152600401610b22906132a4565b6000610d2b601c54610d2530610eb4565b906123c8565b9050610d36816123db565b5050565b6005546001600160a01b03163314610d645760405162461bcd60e51b8152600401610b22906132a4565b600a8511158015610d7857506005600f5411155b610d8157600080fd5b600e94909455600f92909255601055601155601255565b601954604080516304ddf6ef60e11b815290516000926001600160a01b0316916309bbedde9160048083019260209291908290030181865afa158015610c75573d6000803e3d6000fd5b6019546040516370a0823160e01b81526001600160a01b03838116600483015260009216906370a08231906024015b602060405180830381865afa158015610e2e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610af291906132d9565b6005546001600160a01b03163314610e7c5760405162461bcd60e51b8152600401610b22906132a4565b60178054610100600160a81b0319166101006001600160a01b0394851602179055601880546001600160a01b03191691909216179055565b6001600160a01b031660009081526020819052604090205490565b6005546001600160a01b03163314610ef95760405162461bcd60e51b8152600401610b22906132a4565b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b6005546001600160a01b03163314610f6d5760405162461bcd60e51b8152600401610b22906132a4565b8015610fd75760195460405163031e79db60e41b81526001600160a01b038481166004830152909116906331e79db0906024015b600060405180830381600087803b158015610fbb57600080fd5b505af1158015610fcf573d6000803e3d6000fd5b505050505050565b6019546001600160a01b03166318c18adb83610ff281610eb4565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401610fa1565b6005546001600160a01b0316331461104d5760405162461bcd60e51b8152600401610b22906132a4565b600c55565b606060048054610a5b9061326a565b6005546001600160a01b0316331461108b5760405162461bcd60e51b8152600401610b22906132a4565b60005b82811015610bd2576008546001600160a01b03168484838181106110b4576110b461331b565b90506020020160208101906110c99190613002565b6001600160a01b03161415801561111a57506007546001600160a01b03168484838181106110f9576110f961331b565b905060200201602081019061110e9190613002565b6001600160a01b031614155b156111745781600b60008686858181106111365761113661331b565b905060200201602081019061114b9190613002565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790555b8061117e81613331565b91505061108e565b6005546001600160a01b031633146111b05760405162461bcd60e51b8152600401610b22906132a4565b6111bb83603c612590565b60ff85166000908152601660205260409020556111d982603c612590565b60ff909416600090815260166020526040902060018101949094556002909301929092555050565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909190838110156112865760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610b22565b610c208286868403611b90565b6019546040516302a2e74960e61b81526001600160a01b038381166004830152600092169063a8b9d24090602401610e11565b600033610aec818585611d40565b6005546001600160a01b031633146112fe5760405162461bcd60e51b8152600401610b22906132a4565b6001600160a01b03919091166000908152600a60205260409020805460ff1916911515919091179055565b600f5460009060015b60175460ff908116908216116113f05760ff81166000908152601660209081526040808320546001600160a01b0388168452601590925290912054429161137891613308565b111580156113bd575060ff81166000908152601660209081526040808320600101546001600160a01b038816845260159092529091205442916113ba91613308565b10155b156113de5760ff166000908152601660205260409020600201549392505050565b806113e88161334a565b915050611332565b5092915050565b6000610c99601c54610d2530610eb4565b6005546001600160a01b031633146114325760405162461bcd60e51b8152600401610b22906132a4565b600754600160a01b900460ff161561148c5760405162461bcd60e51b815260206004820152601e60248201527f426c6173743a2054726164696e6720697320616c7265616479206f70656e00006044820152606401610b22565b600760009054906101000a90046001600160a01b03166001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa1580156114df573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115039190613369565b6001600160a01b031663c9c6539630600760009054906101000a90046001600160a01b03166001600160a01b031663ef8ef56f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611565573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115899190613369565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af11580156115d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115fa9190613369565b600880546001600160a01b0319166001600160a01b03928316908117825560009081526009602052604090819020805460ff191660011790556019549154905163031e79db60e41b815290831660048201529116906331e79db090602401600060405180830381600087803b15801561167257600080fd5b505af1158015611686573d6000803e3d6000fd5b5050505061169c61169630610eb4565b4761259c565b60085460075460405163095ea7b360e01b81526001600160a01b039182166004820152600019602482015291169063095ea7b3906044016020604051808303816000875af11580156116f2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117169190613386565b506007805460ff60a01b1916600160a01b179055565b6005546001600160a01b031633146117565760405162461bcd60e51b8152600401610b22906132a4565b6017805460ff191660ff92909216919091179055565b6005546001600160a01b031633146117965760405162461bcd60e51b8152600401610b22906132a4565b6014805460ff1916911515919091179055565b6005546001600160a01b031633146117d35760405162461bcd60e51b8152600401610b22906132a4565b6001600160a01b03919091166000908152600d60205260409020805460ff1916911515919091179055565b60606000831180156118105750600082115b61185c5760405162461bcd60e51b815260206004820152601860248201527f426c6173743a20496e76616c696420617267756d656e747300000000000000006044820152606401610b22565b6001600160a01b0384166000908152602160205260408120549061188085856133a3565b9050600061188e86836133ba565b90508281106118d55760405162461bcd60e51b8152602060048201526013602482015272426c6173743a204f7574206f662072616e676560681b6044820152606401610b22565b85838311156118ee578392506118eb87846133e3565b90505b60008167ffffffffffffffff811115611909576119096133f7565b60405190808252806020026020018201604052801561195e57816020015b61194b60405180606001604052806000815260200160008152602001600081525090565b8152602001906001900390816119275790505b5090506000835b85811015611a1e576001600160a01b038b1660009081526021602052604081208054839081106119975761199761331b565b906000526020600020015490506020600082815260200190815260200160002060405180606001604052908160008201548152602001600182015481526020016002820154815250508484815181106119f2576119f261331b565b6020908102919091010152611a08600184613308565b9250508080611a1690613331565b915050611965565b50909998505050505050505050565b6005546001600160a01b03163314611a575760405162461bcd60e51b8152600401610b22906132a4565b6000611a6e601e54476123c890919063ffffffff16565b90506000611a9f611a8b60105460646123c890919063ffffffff16565b601154611a99908590612590565b906126ab565b90506000611aca611abc60105460646123c890919063ffffffff16565b601254611a99908690612590565b90506000611adc82610d2586866123c8565b9050611ae883826126b7565b9250610bd283836126c3565b60195460405163fbcbc0f160e01b81526001600160a01b038381166004830152600092839283929091169063fbcbc0f1906024016040805180830381865afa158015611b44573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b68919061340d565b90935091508282611b7886610eb4565b9250925092509193909250565b610ce8336001612131565b6001600160a01b038316611bf25760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610b22565b6001600160a01b038216611c535760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610b22565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b038381166000908152600160209081526040808320938616835292905220546000198114610bd25781811015611d335760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610b22565b610bd28484848403611b90565b6001600160a01b0383166000908152600b602052604090205460ff16158015611d8257506001600160a01b0382166000908152600b602052604090205460ff16155b611d8b57600080fd5b600c54600754829190600160a01b900460ff168015611de457506001600160a01b03851660009081526009602052604090205460ff1680611de457506001600160a01b03841660009081526009602052604090205460ff165b8015611e0957506001600160a01b0385166000908152600a602052604090205460ff16155b8015611e2e57506001600160a01b0384166000908152600a602052604090205460ff16155b15611e4157611e3e858585612781565b91505b6001600160a01b0384166000908152601560205260408120549003611e7c576001600160a01b03841660009081526015602052604090204290555b6001600160a01b03841660009081526009602052604090205460ff16158015611ebe57506001600160a01b0384166000908152600d602052604090205460ff16155b15611f52576000611ed883611ed287610eb4565b906126b7565b9050611ef5612710611a99600c54611eef60025490565b90612590565b811115611f505760405162461bcd60e51b815260206004820152602360248201527f426c6173743a2057616c6c65742062616c616e6365206c696d697420726561636044820152621a195960ea1b6064820152608401610b22565b505b611f5d8585846129c2565b600c819055601954604051631b4a89ab60e11b81526001600160a01b03878116600483015290911690633695135690602401602060405180830381865afa158015611fac573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fd09190613386565b612048576019546001600160a01b031663e30443bc86611fef81610eb4565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561203557600080fd5b505af1925050508015612046575060015b505b601954604051631b4a89ab60e11b81526001600160a01b03868116600483015290911690633695135690602401602060405180830381865afa158015612092573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120b69190613386565b61212a576019546001600160a01b031663e30443bc856120d581610eb4565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561211b57600080fd5b505af1925050508015610fcf57505b5050505050565b6019546040516302a2e74960e61b81526001600160a01b038481166004830152600092169063a8b9d24090602401602060405180830381865afa15801561217c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121a091906132d9565b9050600081116122065760405162461bcd60e51b815260206004820152602b60248201527f426c6173743a20436c61696d657220686173206e6f207769746864726177616260448201526a1b1948191a5d9a59195b9960aa1b6064820152608401610b22565b6000808361228c576019546040516352b5f81d60e01b81526001600160a01b03878116600483018190526024830152909116906352b5f81d906044016020604051808303816000875af1158015612261573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061228591906132d9565b9150612317565b6019546040516352b5f81d60e01b81526001600160a01b038781166004830152306024830152909116906352b5f81d906044016020604051808303816000875af11580156122de573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061230291906132d9565b91508115612317576123148286612b90565b90505b811561212a5761232b601f80546001019055565b6000612336601f5490565b6000818152602080805260408083208781556001808201889055426002909201919091556001600160a01b038b1680855260218452828520805492830181558552938390200184905580518781529182018690528101919091529091507f67dd3d116bf53e0ddda53bb148a5fdc129854e1c507c0eeda9190049a9bbc84f9060600160405180910390a1505050505050565b60006123d482846133ba565b9392505050565b60408051600280825260608201835260009247928492909160208301908036833701905050905030816000815181106124165761241661331b565b6001600160a01b039283166020918202929092018101919091526007546040805163ef8ef56f60e01b81529051919093169263ef8ef56f9260048083019391928290030181865afa15801561246f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124939190613369565b816001815181106124a6576124a661331b565b6001600160a01b0392831660209182029290920101526007546124cc9130911686611b90565b60075460405163791ac94760e01b81526001600160a01b039091169063791ac94790612505908790600090869030904290600401613475565b600060405180830381600087803b15801561251f57600080fd5b505af1158015612533573d6000803e3d6000fd5b50505050600061254c83476123c890919063ffffffff16565b60408051878152602081018390529192507f4a6c12eb4e479a4ea28c8acad8efde466ef9bf69cf473501dd76865234496273910160405180910390a1949350505050565b60006123d482846133a3565b6007546125b49030906001600160a01b031684611b90565b6007546001600160a01b031663f305d7198230856000806125dd6005546001600160a01b031690565b60405160e088901b6001600160e01b03191681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c40160606040518083038185885af1158015612645573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061266a91906134b1565b505060408051848152602081018490527fcb1652de9aeec38545fc281847b3dbfc89aab56dfa907b1ab68466f602c36fb49250015b60405180910390a15050565b60006123d482846134df565b60006123d48284613308565b8115612709576017546040516101009091046001600160a01b0316906108fc8415029084906000818181858888f19350505050158015612707573d6000803e3d6000fd5b505b801561274b576018546040516001600160a01b039091169082156108fc029083906000818181858888f19350505050158015612749573d6000803e3d6000fd5b505b60408051838152602081018390527f916ad8171ef8c567c7790377a142f0200f9565940680c06e30dd105cfd924968910161269f565b6001600160a01b0383166000908152600960205260408120548190819060ff16806127c457506001600160a01b03851660009081526009602052604090205460ff165b6128105760405162461bcd60e51b815260206004820152601d60248201527f426c6173743a204e6f206d61726b6574206d616b65727320666f756e640000006044820152606401610b22565b6001600160a01b03861660009081526009602052604090205460ff16156128b25761284b6064611a99600e548761259090919063ffffffff16565b915061285784836123c8565b90506128648630846129c2565b604080516001600160a01b03881681523060208201529081018390527f6b0b46d0273ce53f1de696d2100b35dd3a405dcecbcbeede66215d858d5c401d9060600160405180910390a16129b9565b60006128bd87611329565b90506128ce6064611a998784612590565b925060006128f66064611a996128ef600f54866123c890919063ffffffff16565b8990612590565b601c5490915061290690826126b7565b601c5561291386856123c8565b92506129208830866129c2565b6000612931601c54610d2530610eb4565b90506013548111156129555760145460ff1661294c57506013545b61295581612d42565b601d54601c54111561296c5761296c601c54612e38565b604080516001600160a01b038b1681523060208201529081018690527f4ab5e0df8ff1605133dbdd1b8e3f52edb9539abe64595f6f70b30d2fea7f204a9060600160405180910390a15050505b95945050505050565b6001600160a01b038316612a265760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610b22565b6001600160a01b038216612a885760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610b22565b6001600160a01b03831660009081526020819052604090205481811015612b005760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610b22565b6001600160a01b03808516600090815260208190526040808220858503905591851681529081208054849290612b37908490613308565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051612b8391815260200190565b60405180910390a3610bd2565b600080612b9c30610eb4565b604080516002808252606082018352929350600092909160208301908036833750506007546040805163ef8ef56f60e01b815290519394506001600160a01b039091169263ef8ef56f925060048083019260209291908290030181865afa158015612c0b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c2f9190613369565b81600081518110612c4257612c4261331b565b60200260200101906001600160a01b031690816001600160a01b0316815250503081600181518110612c7657612c7661331b565b6001600160a01b03928316602091820292909201015260075460405163b6f9de9560e01b815291169063b6f9de95908790612cbc9060009086908a9042906004016134f3565b6000604051808303818588803b158015612cd557600080fd5b505af1158015612ce9573d6000803e3d6000fd5b50505050506000612cfd83610d2530610eb4565b60408051888152602081018390529192507f2d5c8efb676a77fc04b6b50a19f6ccbf08ee66df0202de33576485f1f77b4b69910160405180910390a195945050505050565b6000612d5e6064611a996010548561259090919063ffffffff16565b90506000612d6d8260026126ab565b90506000612d7b84836123c8565b90506000612d88826123db565b90506000612da66064611a996010548561259090919063ffffffff16565b90506000612dc46064611a996011548661259090919063ffffffff16565b90506000612de26064611a996012548761259090919063ffffffff16565b90506000612df682610d25858189896123c8565b9050612e0283826126b7565b9250612e0e83836126c3565b600087118015612e1e5750600084115b15612e2d57612e2d878561259c565b505050505050505050565b6000612e43826123db565b601c54909150612e5390836123c8565b601c55601e54600090612e679083906126b7565b6019546040519192506000916001600160a01b039091169083908381818185875af1925050503d8060008114612eb9576040519150601f19603f3d011682016040523d82523d6000602084013e612ebe565b606091505b505090508015612f00576040518381527fb0cc2628d6d644cf6be9d8110e142297ac910d6d8026d795a99f272fd9ad60b19060200160405180910390a1610bd2565b601e54612f0d90846126b7565b601e5550505050565b600060208083528351808285015260005b81811015612f4357858101830151858201604001528201612f27565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114612f7957600080fd5b50565b60008060408385031215612f8f57600080fd5b8235612f9a81612f64565b946020939093013593505050565b600060208284031215612fba57600080fd5b5035919050565b600080600060608486031215612fd657600080fd5b8335612fe181612f64565b92506020840135612ff181612f64565b929592945050506040919091013590565b60006020828403121561301457600080fd5b81356123d481612f64565b600080600080600060a0868803121561303757600080fd5b505083359560208501359550604085013594606081013594506080013592509050565b6000806040838503121561306d57600080fd5b823561307881612f64565b9150602083013561308881612f64565b809150509250929050565b8015158114612f7957600080fd5b600080604083850312156130b457600080fd5b82356130bf81612f64565b9150602083013561308881613093565b803560ff811681146130e057600080fd5b919050565b6000602082840312156130f757600080fd5b6123d4826130cf565b60008060006040848603121561311557600080fd5b833567ffffffffffffffff8082111561312d57600080fd5b818601915086601f83011261314157600080fd5b81358181111561315057600080fd5b8760208260051b850101111561316557600080fd5b6020928301955093505084013561317b81613093565b809150509250925092565b6000806000806080858703121561319c57600080fd5b6131a5856130cf565b966020860135965060408601359560600135945092505050565b6000602082840312156131d157600080fd5b81356123d481613093565b6000806000606084860312156131f157600080fd5b83356131fc81612f64565b95602085013595506040909401359392505050565b602080825282518282018190526000919060409081850190868401855b8281101561325d578151805185528681015187860152850151858501526060909301929085019060010161322e565b5091979650505050505050565b600181811c9082168061327e57607f821691505b60208210810361329e57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6000602082840312156132eb57600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b80820180821115610af257610af26132f2565b634e487b7160e01b600052603260045260246000fd5b600060018201613343576133436132f2565b5060010190565b600060ff821660ff8103613360576133606132f2565b60010192915050565b60006020828403121561337b57600080fd5b81516123d481612f64565b60006020828403121561339857600080fd5b81516123d481613093565b8082028115828204841417610af257610af26132f2565b81810381811115610af257610af26132f2565b634e487b7160e01b600052601260045260246000fd5b6000826133f2576133f26133cd565b500690565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561342057600080fd5b505080516020909101519092909150565b600081518084526020808501945080840160005b8381101561346a5781516001600160a01b031687529582019590820190600101613445565b509495945050505050565b85815284602082015260a06040820152600061349460a0830186613431565b6001600160a01b0394909416606083015250608001529392505050565b6000806000606084860312156134c657600080fd5b8351925060208401519150604084015190509250925092565b6000826134ee576134ee6133cd565b500490565b84815260806020820152600061350c6080830186613431565b6001600160a01b0394909416604083015250606001529291505056fea26469706673582212207edfe6ad1d4a91987f19479846e3601e0b7e145cf801a32a69666f8ebe66be9a64736f6c63430008120033