ETH Price: $2,408.15 (-9.15%)

Token

Infinite Money Glitch (IMG)
 

Overview

Max Total Supply

69,420,420,420,420 IMG

Holders

96

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
163,474,682,756.869711707348966909 IMG

Value
$0.00
0x6d154c951b8617acc9a9a7b26247657a41cdcd49
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
IMG

Compiler Version
v0.8.20+commit.a1b79de6

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
File 1 of 9 : IMG.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.8.20;

import "@openzeppelin/contracts/utils/math/SafeMath.sol";

import "@openzeppelin/contracts/utils/Context.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol";

import "@uniswap/v2-core/contracts/interfaces/IUniswapV2Factory.sol";
import "@uniswap/v2-periphery/contracts/interfaces/IUniswapV2Router01.sol";
import "@uniswap/v2-periphery/contracts/interfaces/IUniswapV2Router02.sol";

library SafeMathInt {
    int256 private constant MIN_INT256 = int256(1) << 255;
    int256 private constant MAX_INT256 = ~(int256(1) << 255);

    function mul(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a * b;

        // Detect overflow when multiplying MIN_INT256 with -1
        require(c != MIN_INT256 || (a & MIN_INT256) != (b & MIN_INT256));
        require((b == 0) || (c / b == a));
        return c;
    }

    function div(int256 a, int256 b) internal pure returns (int256) {
        // Prevent overflow when dividing MIN_INT256 by -1
        require(b != - 1 || a != MIN_INT256);

        // Solidity already throws when dividing by 0.
        return a / b;
    }

    function sub(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a - b;
        require((b >= 0 && c <= a) || (b < 0 && c > a));
        return c;
    }

    function add(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a + b;
        require((b >= 0 && c >= a) || (b < 0 && c < a));
        return c;
    }

    function abs(int256 a) internal pure returns (int256) {
        require(a != MIN_INT256);
        return a < 0 ? - a : a;
    }

    function toUint256Safe(int256 a) internal pure returns (uint256) {
        require(a >= 0);
        return uint256(a);
    }
}

library SafeMathUint {
    function toInt256Safe(uint256 a) internal pure returns (int256) {
        int256 b = int256(a);
        require(b >= 0);
        return b;
    }
}

interface IWETH is IERC20 {
    function deposit() external payable;
    function withdraw(uint) external;
}

interface DividendPayingTokenOptionalInterface {
    function withdrawableDividendOf(address _owner, address _rewardToken) external view returns (uint256);
    function withdrawnDividendOf(address _owner, address _rewardToken) external view returns (uint256);
    function accumulativeDividendOf(address _owner, address _rewardToken) external view returns (uint256);
}

interface DividendPayingTokenInterface {
    function dividendOf(address _owner, address _rewardToken) external view returns (uint256);
    function distributeDividends() external payable;
    function withdrawDividend(address _rewardToken) external;

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

contract DividendPayingToken is DividendPayingTokenInterface, DividendPayingTokenOptionalInterface, Ownable(msg.sender) {
    using SafeMath for uint256;
    using SafeMathUint for uint256;
    using SafeMathInt for int256;

    IUniswapV2Router02 public immutable uniswapV2Router;

    uint256 public totalBalance;
    uint256 public rewardTokenCounter;
    uint256 internal constant magnitude = 2 ** 128;

    address public nextRewardToken;
    address[] public rewardTokens;

    mapping(address => bool) public customDistributions;

    mapping(address => uint256) public holderBalance;
    mapping(address => uint256) public standardDistributions;
    mapping(address => uint256) public totalDividendsDistributed;
    mapping(address => uint256) internal magnifiedDividendPerShare;
    mapping(address => mapping(address => uint256)) internal userDistributions;
    mapping(address => mapping(address => uint256)) internal withdrawnDividends;
    mapping(address => mapping(address => int256)) internal magnifiedDividendCorrections;

    constructor() {
        uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);

        standardDistributions[address(0x6982508145454Ce325dDbE47a25d4ec3d2311933)] = 15;  // PEPE
        rewardTokens.push(address(0x6982508145454Ce325dDbE47a25d4ec3d2311933));

        standardDistributions[address(0x812Ba41e071C7b7fA4EBcFB62dF5F45f6fA853Ee)] = 15;  // NEIRO
        rewardTokens.push(address(0x812Ba41e071C7b7fA4EBcFB62dF5F45f6fA853Ee));

        standardDistributions[address(0xE0f63A424a4439cBE457D80E4f4b51aD25b2c56C)] = 15;  // SPX
        rewardTokens.push(address(0xE0f63A424a4439cBE457D80E4f4b51aD25b2c56C));

        standardDistributions[address(0xaaeE1A9723aaDB7afA2810263653A34bA2C21C7a)] = 15;  // MOG
        rewardTokens.push(address(0xaaeE1A9723aaDB7afA2810263653A34bA2C21C7a));

        standardDistributions[address(0xB90B2A35C65dBC466b04240097Ca756ad2005295)] = 15;  // BOBO
        rewardTokens.push(address(0xB90B2A35C65dBC466b04240097Ca756ad2005295));

        standardDistributions[address(0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2)] = 15;  // ETH
        rewardTokens.push(address(0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2));

        standardDistributions[address(0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48)] = 10;  // USDC
        rewardTokens.push(address(0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48));

        nextRewardToken = rewardTokens[0];
    }

    function dividendOf(address _owner, address _rewardToken) external view override returns (uint256) {
        return withdrawableDividendOf(_owner, _rewardToken);
    }

    function withdrawableDividendOf(address _owner, address _rewardToken) public view override returns (uint256) {
        return accumulativeDividendOf(_owner, _rewardToken).sub(withdrawnDividends[_owner][_rewardToken]);
    }

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

    function accumulativeDividendOf(address _owner, address _rewardToken) public view override returns (uint256) {
        return magnifiedDividendPerShare[_rewardToken].mul(holderBalance[_owner]).toInt256Safe()
        .add(magnifiedDividendCorrections[_rewardToken][_owner]).toUint256Safe() / magnitude;
    }

    function distributionsOf(address _owner) external view returns (uint256[] memory) {
        uint256[] memory currentDistributions = new uint256[](rewardTokens.length);
        if (customDistributions[_owner])
            for (uint256 i = 0; i < rewardTokens.length; i++)
                currentDistributions[i] = userDistributions[_owner][rewardTokens[i]];
        else
            for (uint256 i = 0; i < rewardTokens.length; i++)
                currentDistributions[i] = standardDistributions[rewardTokens[i]];
        return currentDistributions;
    }

    function _setBalance(address account, uint256 newBalance) internal {
        uint256 currentBalance = holderBalance[account];
        holderBalance[account] = newBalance;

        if (newBalance > currentBalance) {
            uint256 increaseAmount = newBalance.sub(currentBalance);
            _increase(account, increaseAmount);
            totalBalance += increaseAmount;
        }
        else if (newBalance < currentBalance) {
            uint256 reduceAmount = currentBalance.sub(newBalance);
            _reduce(account, reduceAmount);
            totalBalance -= reduceAmount;
        }
    }

    function setDistributionPercentages(uint256[] calldata percentages) external {
        require(percentages.length == rewardTokens.length, "ARRAY MISMATCH: Percentages total must match rewards tokens total!");
        uint256 totalPercentage = 0;
        for (uint256 i = 0; i < percentages.length; i++) {
            require(percentages[i] <= 100, "PERCENTAGE EXCEEDED: Percentage must not exceed 100%!");
            userDistributions[msg.sender][rewardTokens[i]] = percentages[i];
            totalPercentage += percentages[i];
        }
        require(totalPercentage == 100, " TOTAL PERCENTAGE EXCEEDED: Total percentage must equal 100%!");
        customDistributions[msg.sender] = true;
    }

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

        uint256 initialBalance = IERC20(nextRewardToken).balanceOf(address(this));
        buyTokens(msg.value, nextRewardToken);
        uint256 newBalance = IERC20(nextRewardToken).balanceOf(address(this)).sub(initialBalance);

        if (newBalance > 0) {
            magnifiedDividendPerShare[nextRewardToken] = magnifiedDividendPerShare[nextRewardToken].add((newBalance).mul(magnitude) / totalBalance);

            emit DividendsDistributed(msg.sender, newBalance);
            totalDividendsDistributed[nextRewardToken] = totalDividendsDistributed[nextRewardToken].add(newBalance);
        }

        rewardTokenCounter = (rewardTokenCounter + 1) % (rewardTokens.length - 1);
        nextRewardToken = rewardTokens[rewardTokenCounter];
    }

    function buyTokens(uint256 ethAmount, address rewardToken) internal {
        if (rewardToken != uniswapV2Router.WETH()) {
            address[] memory path = new address[](2);
            path[0] = uniswapV2Router.WETH();
            path[1] = rewardToken;

            uniswapV2Router.swapExactETHForTokensSupportingFeeOnTransferTokens{value: ethAmount}(
                0,
                path,
                address(this),
                block.timestamp
            );
        }
        else
            IWETH(uniswapV2Router.WETH()).deposit{value: ethAmount}();
    }

    function withdrawDividend(address _rewardToken) external virtual override {
        _withdrawDividendOfUser(payable(msg.sender), _rewardToken);
    }

    function _withdrawDividendOfUser(address payable user, address _rewardToken) internal returns (uint256) {
        uint256 _withdrawableDividend = withdrawableDividendOf(user, _rewardToken);
        uint256 _dividendSupplyAvailable = IERC20(_rewardToken).balanceOf(address(this));
        _withdrawableDividend = _withdrawableDividend < _dividendSupplyAvailable ? _withdrawableDividend : _dividendSupplyAvailable;

        if (_withdrawableDividend > 0) {
            withdrawnDividends[user][_rewardToken] = withdrawnDividends[user][_rewardToken].add(_withdrawableDividend);

            uint256 distribution = customDistributions[user] ? userDistributions[user][_rewardToken] : standardDistributions[_rewardToken];
            uint256 withdrawal = _withdrawableDividend.mul(distribution).div(100);
            IERC20(_rewardToken).transfer(user, withdrawal);

            emit DividendWithdrawn(user, withdrawal);
            return _withdrawableDividend;
        }

        return 0;
    }

    function _increase(address account, uint256 value) internal {
        for (uint256 i; i < rewardTokens.length; i++)
            magnifiedDividendCorrections[rewardTokens[i]][account] = magnifiedDividendCorrections[rewardTokens[i]][account]
                .sub((magnifiedDividendPerShare[rewardTokens[i]].mul(value)).toInt256Safe());
    }

    function _reduce(address account, uint256 value) internal {
        for (uint256 i; i < rewardTokens.length; i++)
            magnifiedDividendCorrections[rewardTokens[i]][account] = magnifiedDividendCorrections[rewardTokens[i]][account]
                .add((magnifiedDividendPerShare[rewardTokens[i]].mul(value)).toInt256Safe());
    }

    receive() external payable {
        distributeDividends();
    }
}

contract DividendTracker is DividendPayingToken {
    using SafeMath for uint256;
    using SafeMathInt for int256;

    struct Map {
        address[] keys;
        mapping(address => uint256) values;
        mapping(address => uint256) indexOf;
        mapping(address => bool) inserted;
    }

    Map private tokenHoldersMap;
    uint256 public lastProcessedIndex;

    uint256 public claimWait;
    uint256 public immutable minimumTokenBalanceForDividends;

    mapping(address => bool) public excludedFromDividends;
    mapping(address => uint256) public lastClaimTimes;

    event ExcludeFromDividends(address indexed account);
    event IncludeInDividends(address indexed account);
    event ClaimWaitUpdated(uint256 indexed newValue, uint256 indexed oldValue);
    event Claim(address indexed account, uint256 amount, bool indexed automatic);

    constructor() {
        claimWait = 86400;
        minimumTokenBalanceForDividends = 347102102 * (10 ** 18); //0.0005%
    }

    function get(address key) private view returns (uint) {
        return tokenHoldersMap.values[key];
    }

    function getIndexOfKey(address key) private view returns (int) {
        if (!tokenHoldersMap.inserted[key])
            return - 1;
        return int(tokenHoldersMap.indexOf[key]);
    }

    function getKeyAtIndex(uint index) private view returns (address) {
        return tokenHoldersMap.keys[index];
    }

    function size() private view returns (uint) {
        return tokenHoldersMap.keys.length;
    }

    function set(address key, uint val) private {
        if (tokenHoldersMap.inserted[key])
            tokenHoldersMap.values[key] = val;
        else {
            tokenHoldersMap.inserted[key] = true;
            tokenHoldersMap.values[key] = val;
            tokenHoldersMap.indexOf[key] = tokenHoldersMap.keys.length;
            tokenHoldersMap.keys.push(key);
        }
    }

    function remove(address key) private {
        if (!tokenHoldersMap.inserted[key])
            return;

        delete tokenHoldersMap.inserted[key];
        delete tokenHoldersMap.values[key];

        uint index = tokenHoldersMap.indexOf[key];
        uint lastIndex = tokenHoldersMap.keys.length - 1;
        address lastKey = tokenHoldersMap.keys[lastIndex];

        tokenHoldersMap.indexOf[lastKey] = index;
        delete tokenHoldersMap.indexOf[key];

        tokenHoldersMap.keys[index] = lastKey;
        tokenHoldersMap.keys.pop();
    }

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

        _setBalance(account, 0);
        remove(account);
        emit ExcludeFromDividends(account);
    }

    function includeInDividends(address account) external onlyOwner() {
        require(excludedFromDividends[account]);

        excludedFromDividends[account] = false;
        emit IncludeInDividends(account);
    }

    function updateClaimWait(uint256 newClaimWait) external onlyOwner() {
        require(newClaimWait >= 0 && newClaimWait <= 86400, "Dividend_Tracker: claimWait must be updated to between 1 and 24 hours");
        require(newClaimWait != claimWait, "Dividend_Tracker: Cannot update claimWait to same value");

        claimWait = newClaimWait;
        emit ClaimWaitUpdated(newClaimWait, claimWait);
    }

    function getLastProcessedIndex() external view returns (uint256) {
        return lastProcessedIndex;
    }

    function getNumberOfTokenHolders() external view returns (uint256) {
        return tokenHoldersMap.keys.length;
    }

    function getAccount(address _account, address _rewardToken) public view returns (address account, int256 index, int256 iterationsUntilProcessed, uint256 withdrawableDividends, uint256 totalDividends, uint256 lastClaimTime, uint256 nextClaimTime, uint256 secondsUntilAutoClaimAvailable) {
        account = _account;
        index = getIndexOfKey(account);
        iterationsUntilProcessed = - 1;

        if (index >= 0) {
            if (uint256(index) > lastProcessedIndex)
                iterationsUntilProcessed = index.sub(int256(lastProcessedIndex));
            else {
                uint256 processesUntilEndOfArray = tokenHoldersMap.keys.length >
                lastProcessedIndex ? tokenHoldersMap.keys.length.sub(lastProcessedIndex) : 0;

                iterationsUntilProcessed = index.add(int256(processesUntilEndOfArray));
            }
        }

        withdrawableDividends = withdrawableDividendOf(account, _rewardToken);
        totalDividends = accumulativeDividendOf(account, _rewardToken);

        lastClaimTime = lastClaimTimes[account];
        nextClaimTime = lastClaimTime > 0 ? lastClaimTime.add(claimWait) : 0;
        secondsUntilAutoClaimAvailable = nextClaimTime > block.timestamp ? nextClaimTime.sub(block.timestamp) : 0;
    }

    function getAccountAtIndex(uint256 index, address _rewardToken) external view returns (address, int256, int256, uint256, uint256, uint256, uint256, uint256) {
        if (index >= size())
            return (0x0000000000000000000000000000000000000000, - 1, - 1, 0, 0, 0, 0, 0);
        address account = getKeyAtIndex(index);
        return getAccount(account, _rewardToken);
    }

    function canAutoClaim(uint256 lastClaimTime) private view returns (bool) {
        if (lastClaimTime > block.timestamp)
            return false;
        return block.timestamp.sub(lastClaimTime) >= claimWait;
    }

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

        if (newBalance >= minimumTokenBalanceForDividends) {
            _setBalance(account, newBalance);
            set(account, newBalance);
        }
        else {
            _setBalance(account, 0);
            remove(account);
        }

        processAccount(account, true);
    }

    function process(uint256 gas) external returns (uint256, uint256, uint256) {
        uint256 numberOfTokenHolders = tokenHoldersMap.keys.length;

        if (numberOfTokenHolders == 0)
            return (0, 0, lastProcessedIndex);

        uint256 _lastProcessedIndex = lastProcessedIndex;

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

        uint256 iterations = 0;
        uint256 claims = 0;

        while (gasUsed < gas && iterations < numberOfTokenHolders) {
            _lastProcessedIndex++;
            if (_lastProcessedIndex >= tokenHoldersMap.keys.length)
                _lastProcessedIndex = 0;

            address account = tokenHoldersMap.keys[_lastProcessedIndex];
            if (canAutoClaim(lastClaimTimes[account]))
                if (processAccount(payable(account), true))
                    claims++;

            iterations++;

            uint256 newGasLeft = gasleft();
            if (gasLeft > newGasLeft)
                gasUsed = gasUsed.add(gasLeft.sub(newGasLeft));

            gasLeft = newGasLeft;
        }

        lastProcessedIndex = _lastProcessedIndex;
        return (iterations, claims, lastProcessedIndex);
    }

    function processAccount(address payable account, bool automatic) public onlyOwner() returns (bool) {
        uint256 amount;
        bool paid;

        for (uint256 i; i < rewardTokens.length; i++) {
            amount = _withdrawDividendOfUser(account, rewardTokens[i]);

            if (amount > 0) {
                lastClaimTimes[account] = block.timestamp;
                emit Claim(account, amount, automatic);
                paid = true;
            }
        }

        return paid;
    }
}

/*
 * 
 *
 * ██╗███╗░░██╗███████╗██╗███╗░░██╗██╗████████╗███████╗  ███╗░░░███╗░█████╗░███╗░░██╗███████╗██╗░░░██╗
 * ██║████╗░██║██╔════╝██║████╗░██║██║╚══██╔══╝██╔════╝  ████╗░████║██╔══██╗████╗░██║██╔════╝╚██╗░██╔╝
 * ██║██╔██╗██║█████╗░░██║██╔██╗██║██║░░░██║░░░█████╗░░  ██╔████╔██║██║░░██║██╔██╗██║█████╗░░░╚████╔╝░
 * ██║██║╚████║██╔══╝░░██║██║╚████║██║░░░██║░░░██╔══╝░░  ██║╚██╔╝██║██║░░██║██║╚████║██╔══╝░░░░╚██╔╝░░
 * ██║██║░╚███║██║░░░░░██║██║░╚███║██║░░░██║░░░███████╗  ██║░╚═╝░██║╚█████╔╝██║░╚███║███████╗░░░██║░░░
 * ╚═╝╚═╝░░╚══╝╚═╝░░░░░╚═╝╚═╝░░╚══╝╚═╝░░░╚═╝░░░╚══════╝  ╚═╝░░░░░╚═╝░╚════╝░╚═╝░░╚══╝╚══════╝░░░╚═╝░░░
 * ░██████╗░██╗░░░░░██╗████████╗░█████╗░██╗░░██╗
 * ██╔════╝░██║░░░░░██║╚══██╔══╝██╔══██╗██║░░██║
 * ██║░░██╗░██║░░░░░██║░░░██║░░░██║░░╚═╝███████║
 * ██║░░╚██╗██║░░░░░██║░░░██║░░░██║░░██╗██╔══██║
 * ╚██████╔╝███████╗██║░░░██║░░░╚█████╔╝██║░░██║
 * ░╚═════╝░╚══════╝╚═╝░░░╚═╝░░░░╚════╝░╚═╝░░╚═╝
 * Description: The Infinite Meme-conomy Awaits. The Protocol doesn’t just distribute tokens — it distributes culture.
 *
 * Telegram: https://t.me/TheInfiniteMoneyGlitch
 * Twitter: https://x.com/MoneyGlitchERC
 * Website: https://www.theglitch.money
 */
contract IMG is Context, IERC20, Ownable(msg.sender) {
    string public constant name = "Infinite Money Glitch";
    string public constant symbol = "IMG";

    uint public constant decimals = 18;
    uint public constant totalSupply = 69420420420420 * 10 ** decimals;

    uint public maxTokenBalance;
    uint public maxTokenTransfer;

    address public constant DEAD = 0x000000000000000000000000000000000000dEaD;
    address public constant ZERO = 0x0000000000000000000000000000000000000000;

    address public immutable dexPair;
    IUniswapV2Router02 public immutable dexRouter;

    mapping (address => uint) private balances;
    mapping (address => mapping (address => uint)) private allowances;

    mapping(address => bool) public isFeeExempt;
    mapping(address => bool) public isMarketPair;
    mapping(address => bool) public isBalanceLimitExempt;
    mapping(address => bool) public isTransferLimitExempt;

    address private operationsWallet;
    DividendTracker public dividendTracker;

    struct InFees
    {
        uint rewards;
        uint operations;
        uint burn;
    }

    struct OutFees
    {
        uint rewards;
        uint operations;
        uint burn;
    }

    InFees public inFees;
    OutFees public outFees;

    bool public trading;
    bool public feesStatus;
    bool private inSwap;
    bool private swapAndLiquify;
    bool private swapByLimitEnabled;

    uint private immutable feeDivisor = 10000;
    uint private gasForProcessing = 300000;
    uint private swapLowerThreshold;
    uint private swapUpperThreshold;

    event FeeStatusChanged(address indexed account, bool indexed newStatus);
    event BulkFeeStatusChanged(address[] accounts, bool indexed newStatus);
    event MaxBalanceStatusChanged(address indexed account, bool indexed newStatus);
    event MaxTransferStatusChanged(address indexed account, bool indexed newStatus);
    event SetAutomatedMarketMakerPair(address indexed pair, bool indexed newStatus);
    event FeesForBuysChanged(uint newOperations, uint newRewards, uint newBurn);
    event FeesForSellsChanged(uint newOperations, uint newRewards, uint newBurn);
    event FeesCollectionStatusChanged(bool newStatus);
    event TokenBalanceAndTransferLimitsChanged(uint newBalance, uint newTransfer);
    event SwapAndLiquifyStatusChanged(bool newStatus);
    event SwapAndLiquifyByLimitStatusChanged(bool newStatus);
    event SwapAndLiquifyThresholdsChanged(uint newLower, uint newUpper);
    event GasForProcessingChanged(uint newGas);
    event ProcessedDividendTracker(uint iterations, uint claims, uint lastProcessedIndex, bool indexed automatic, uint gas, address indexed processor);

    modifier lockSwap {
        inSwap = true;
        _;
        inSwap = false;
    }

    constructor() {
        dexRouter = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
        dexPair = IUniswapV2Factory(dexRouter.factory()).createPair(dexRouter.WETH(), address(this));

        allowances[address(this)][address(dexRouter)] = type(uint).max;

        dividendTracker = new DividendTracker();
        operationsWallet = address(0x07E5c17e8385a378D2B80F656E1e3E809F86A19F);

        _setMarketPair(dexPair, true);

        maxTokenBalance = (totalSupply * 200) / 10000;
        maxTokenTransfer = (totalSupply * 200) / 10000;
        swapLowerThreshold = (totalSupply * 1) / 10000;
        swapUpperThreshold = (totalSupply * 100) / 10000;

        inFees.rewards = 0;
        inFees.operations = 2000;
        inFees.burn = 0;
        outFees.rewards = 0;
        outFees.operations = 2000;
        outFees.burn = 0;
        feesStatus = true;

        isFeeExempt[DEAD] = true;
        isFeeExempt[owner()] = true;
        isFeeExempt[address(this)] = true;

        isBalanceLimitExempt[DEAD] = true;
        isBalanceLimitExempt[owner()] = true;
        isBalanceLimitExempt[address(this)] = true;
        isBalanceLimitExempt[address(dexPair)] = true;
        isBalanceLimitExempt[address(dividendTracker)] = true;

        isTransferLimitExempt[DEAD] = true;
        isTransferLimitExempt[owner()] = true;
        isTransferLimitExempt[address(this)] = true;
        isTransferLimitExempt[address(dividendTracker)] = true;

        dividendTracker.excludeFromDividends(DEAD);
        dividendTracker.excludeFromDividends(owner());
        dividendTracker.excludeFromDividends(address(this));
        dividendTracker.excludeFromDividends(address(dexRouter));
        dividendTracker.excludeFromDividends(address(dividendTracker));

        balances[owner()] = totalSupply;
        emit Transfer(address(0), owner(), totalSupply);
    }

    function balanceOf(address account) public view override returns (uint) {
        return balances[account];
    }

    function allowance(address holder, address spender) external view override returns (uint) {
        return allowances[holder][spender];
    }

    function getCirculatingSupply() public view returns (uint) {
        return totalSupply - balanceOf(DEAD) - balanceOf(ZERO);
    }

    function setDividendsExemption(address account) external onlyOwner() {
        dividendTracker.excludeFromDividends(account);
    }

    function setDividendsInclusion(address account) external onlyOwner() {
        dividendTracker.includeInDividends(account);
    }

    function setMarketPair(address pair, bool value) external onlyOwner() {
        require(pair != dexPair, "ERROR: Cannot mutate core dex pair!");
        _setMarketPair(pair, value);
    }

    function _setMarketPair(address pair, bool value) private {
        isMarketPair[pair] = value;
        isBalanceLimitExempt[pair] = value;
        if (value)
            dividendTracker.excludeFromDividends(pair);
        emit SetAutomatedMarketMakerPair(pair, value);
    }

    function setFeeExempt(address account, bool status) public onlyOwner() {
        isFeeExempt[account] = status;
        emit FeeStatusChanged(account, status);
    }

    function setBalanceLimitExempt(address account, bool status) public onlyOwner() {
        isBalanceLimitExempt[account] = status;
        emit MaxBalanceStatusChanged(account, status);
    }

    function setTransferLimitExempt(address account, bool status) public onlyOwner() {
        isTransferLimitExempt[account] = status;
        emit MaxTransferStatusChanged(account, status);
    }

    function setBulkFeeExemption(address[] calldata accounts, bool status) external onlyOwner() {
        for (uint i = 0; i < accounts.length; i++)
            isFeeExempt[accounts[i]] = status;
        emit BulkFeeStatusChanged(accounts, status);
    }

    function updateBuyFees(uint newOperations, uint newRewards, uint newBurn) external onlyOwner() {
        require(!feesStatus || (newOperations + newRewards + newBurn > 0 && newOperations + newRewards + newBurn <= 4000), "ERROR: Total fees must be >0% and <= 40%!");

        inFees.operations = newOperations;
        inFees.rewards = newRewards;
        inFees.burn = newBurn;
        emit FeesForBuysChanged(newOperations, newRewards, newBurn);
    }

    function updateSellFees(uint newOperations, uint newRewards, uint newBurn) external onlyOwner() {
        require(!feesStatus || (newOperations + newRewards + newBurn > 0 && newOperations + newRewards + newBurn <= 4000), "ERROR: Total fees must be >0% and <= 40%!");

        outFees.operations = newOperations;
        outFees.rewards = newRewards;
        outFees.burn = newBurn;
        emit FeesForSellsChanged(newOperations, newRewards, newBurn);
    }

    function updateFeesStatus(bool status) external onlyOwner() {
        require(status != feesStatus, "ERROR: New status matches existing status!");
        if (status) {
            require(outFees.operations + outFees.rewards + outFees.burn > 0, "ERROR: Total out fees must be >0%");
            require(inFees.operations + inFees.rewards + inFees.burn > 0, "ERROR: Total in fees must be >0%");
        }

        feesStatus = status;
        emit FeesCollectionStatusChanged(status);
    }

    function updateTokenLimits(uint newBalance, uint newTransfer) external onlyOwner() {
        require(newBalance >= totalSupply / 500, "ERROR: New balance threshold must be >=0.2% total supply!");
        require(newTransfer >= totalSupply / 500, "ERROR: New transfer threshold must be >=0.2% total supply!");

        maxTokenBalance = newBalance * (10 ** decimals);
        maxTokenTransfer = newTransfer * (10 ** decimals);
        emit TokenBalanceAndTransferLimitsChanged(maxTokenBalance, maxTokenTransfer);
    }

    function updateSwapStatus(bool status) external onlyOwner() {
        require(status != swapAndLiquify, "ERROR: New status matches existing status!");

        swapAndLiquify = status;
        emit SwapAndLiquifyStatusChanged(swapAndLiquify);
    }

    function updateSwapByLimitStatus(bool status) external onlyOwner() {
        require(status != swapByLimitEnabled, "ERROR: New status matches existing status!");

        swapByLimitEnabled = status;
        emit SwapAndLiquifyByLimitStatusChanged(swapAndLiquify);
    }

    function updateSwapThresholds(uint lowerThreshold, uint upperThreshold, uint divisor) external onlyOwner() {
        require(lowerThreshold > 0, "ERROR: Lower threshold must be greater than zero!");
        require(upperThreshold > 0, "ERROR: Upper threshold must be greater than zero!");

        swapLowerThreshold = (totalSupply * lowerThreshold) / (divisor);
        swapUpperThreshold = (totalSupply * upperThreshold) / (divisor);
        emit SwapAndLiquifyThresholdsChanged(swapLowerThreshold, swapUpperThreshold);
    }

    function updateGasForProcessing(uint newValue) external onlyOwner() {
        require(newValue >= 200000 && newValue <= 500000, "ERROR: Gas must be between 200,000 and 500,000 WEI!");
        require(newValue != gasForProcessing, "ERROR: New gas value matches existing value!");

        gasForProcessing = newValue;
        emit GasForProcessingChanged(gasForProcessing);
    }

    function updateClaimWait(uint claimWait) external onlyOwner() {
        dividendTracker.updateClaimWait(claimWait);
    }

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

    function openLaunch() external payable onlyOwner() {
        require(!trading, "ERROR: Cannot open trading more than once!");
        isFeeExempt[owner()] = false;

        address[] memory path = new address[](2);
        path[0] = dexRouter.WETH();
        path[1] = address(this);

        dexRouter.swapExactETHForTokensSupportingFeeOnTransferTokens{value: msg.value}(
            0,
            path,
            owner(),
            block.timestamp
        );

        trading = true;
        swapAndLiquify = true;
        swapByLimitEnabled = true;
        isFeeExempt[owner()] = true;
    }

    function increaseAllowance(address spender, uint addedValue) public virtual returns (bool) {
        _approve(msg.sender, spender, allowances[_msgSender()][spender] + addedValue);
        return true;
    }

    function decreaseAllowance(address spender, uint subtractedValue) public virtual returns (bool) {
        _approve(msg.sender, spender, allowances[_msgSender()][spender] - subtractedValue);
        return true;
    }

    function approve(address spender, uint amount) public override returns (bool) {
        _approve(msg.sender, spender, amount);
        return true;
    }

    function _approve(address owner, address spender, uint amount) private {
        require(owner != address(0), "ERROR: Approve from the zero address!");
        require(spender != address(0), "ERROR: Approve to the zero address!");

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

    function transfer(address to, uint amount) public override returns (bool) {
        _transferFrom(msg.sender, to, amount);
        return true;
    }

    function transferFrom(address from, address to, uint amount) public override returns (bool) {
        _transferFrom(from, to, amount);
        _approve(from, msg.sender, allowances[from][msg.sender] - amount);
        return true;
    }

    function _transferFrom(address from, address to, uint amount) internal {
        if (inSwap) {
            balances[from] -= amount;
            balances[to] += amount;
            emit Transfer(from, to, amount);
        }
        else {
            if (from != owner() && to != owner()) {
                if (!isFeeExempt[from] && !isFeeExempt[to])
                    require(trading, "ERROR: Trading is closed!");
                if (!isTransferLimitExempt[from] && !isTransferLimitExempt[to])
                    require(amount <= maxTokenTransfer, "ERROR: Transfer amount exceeds maximum limit!");
            }

            uint contractTokenBalance = balanceOf(address(this));
            if (contractTokenBalance >= swapLowerThreshold && !inSwap && !isMarketPair[from] && isMarketPair[to] && swapAndLiquify) {
                if (swapByLimitEnabled)
                    contractTokenBalance = contractTokenBalance > swapUpperThreshold ? swapUpperThreshold : contractTokenBalance;
                swapBack(contractTokenBalance);
            }

            balances[from] -= amount;

            uint finalAmount = (isFeeExempt[from] || isFeeExempt[to]) ? amount : takeFee(from, to, amount);
            if (!isBalanceLimitExempt[to])
                require(balances[to] + finalAmount <= maxTokenBalance, "ERROR: New balance exceeds maximum limit!");

            balances[to] += finalAmount;
            emit Transfer(from, to, finalAmount);

            dividendTracker.setBalance(payable(from), balanceOf(from));
            dividendTracker.setBalance(payable(to), balanceOf(to));

            if (gasForProcessing > 0)
                try dividendTracker.process(gasForProcessing) returns (uint iterations, uint claims, uint lastProcessedIndex) {
                    emit ProcessedDividendTracker(iterations, claims, lastProcessedIndex, true, gasForProcessing, tx.origin);
                } catch {}
        }
    }

    function takeFee(address from, address to, uint amount) internal returns (uint) {
        uint feeTotal = 0;

        if (feesStatus) {
            if (isMarketPair[from])
                feeTotal = amount * (inFees.rewards + inFees.operations + inFees.burn) / feeDivisor;
            else if (isMarketPair[to])
                feeTotal = amount * (outFees.rewards + outFees.operations + outFees.burn) / feeDivisor;
            if (feeTotal > 0) {
                balances[address(this)] += feeTotal;
                emit Transfer(from, address(this), feeTotal);
            }
        }

        return amount - feeTotal;
    }

    function swapBack(uint amount) private lockSwap() {
        uint totalFees = inFees.rewards + inFees.operations + inFees.burn + outFees.rewards + outFees.operations + outFees.burn;
        uint totalEthFees = totalFees - inFees.burn - outFees.burn;

        uint burnTokens = amount * (inFees.burn + outFees.burn) / totalFees;
        uint amountToSwapForETH = amount - burnTokens;

        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = dexRouter.WETH();

        try dexRouter.swapExactTokensForETHSupportingFeeOnTransferTokens(
            amountToSwapForETH,
            0,
            path,
            address(this),
            block.timestamp
        ){
            payable(address(dividendTracker)).call{ value: address(this).balance * (inFees.rewards + outFees.rewards) / totalEthFees }("");
            payable(operationsWallet).call{ value: address(this).balance * (inFees.operations + outFees.operations) / totalEthFees }("");
        } catch {}

        _transferFrom(address(this), DEAD, burnTokens);
    }

    function withdrawStuckEth() external onlyOwner() {
        payable(msg.sender).call{ value: address(this).balance }("");
    }

    receive() external payable {}
}

File 2 of 9 : IUniswapV2Router02.sol
pragma solidity >=0.6.2;

import './IUniswapV2Router01.sol';

interface IUniswapV2Router02 is IUniswapV2Router01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountETH);
    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountETH);

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

File 3 of 9 : IUniswapV2Router01.sol
pragma solidity >=0.6.2;

interface IUniswapV2Router01 {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountToken, uint amountETH);
    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETHWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountToken, uint amountETH);
    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);
    function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);

    function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
    function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
    function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
    function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}

File 4 of 9 : IUniswapV2Factory.sol
pragma solidity >=0.5.0;

interface IUniswapV2Factory {
    event PairCreated(address indexed token0, address indexed token1, address pair, uint);

    function feeTo() external view returns (address);
    function feeToSetter() external view returns (address);

    function getPair(address tokenA, address tokenB) external view returns (address pair);
    function allPairs(uint) external view returns (address pair);
    function allPairsLength() external view returns (uint);

    function createPair(address tokenA, address tokenB) external returns (address pair);

    function setFeeTo(address) external;
    function setFeeToSetter(address) external;
}

File 5 of 9 : IERC20Metadata.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.20;

import {IERC20} from "../IERC20.sol";

/**
 * @dev Interface for the optional metadata functions from the ERC-20 standard.
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

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

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

File 6 of 9 : IERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.20;

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

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

    /**
     * @dev Returns the value of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

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

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

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

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

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

File 7 of 9 : Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)

pragma solidity ^0.8.20;

import {Context} from "../utils/Context.sol";

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

    /**
     * @dev The caller account is not authorized to perform an operation.
     */
    error OwnableUnauthorizedAccount(address account);

    /**
     * @dev The owner is not a valid owner account. (eg. `address(0)`)
     */
    error OwnableInvalidOwner(address owner);

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

    /**
     * @dev Initializes the contract setting the address provided by the deployer as the initial owner.
     */
    constructor(address initialOwner) {
        if (initialOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _transferOwnership(initialOwner);
    }

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

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        if (owner() != _msgSender()) {
            revert OwnableUnauthorizedAccount(_msgSender());
        }
    }

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

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        if (newOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _transferOwnership(newOwner);
    }

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

File 8 of 9 : Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)

pragma solidity ^0.8.20;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

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

    function _contextSuffixLength() internal view virtual returns (uint256) {
        return 0;
    }
}

File 9 of 9 : SafeMath.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (utils/math/SafeMath.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "remappings": []
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address[]","name":"accounts","type":"address[]"},{"indexed":true,"internalType":"bool","name":"newStatus","type":"bool"}],"name":"BulkFeeStatusChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"bool","name":"newStatus","type":"bool"}],"name":"FeeStatusChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"newStatus","type":"bool"}],"name":"FeesCollectionStatusChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newOperations","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newRewards","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newBurn","type":"uint256"}],"name":"FeesForBuysChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newOperations","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newRewards","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newBurn","type":"uint256"}],"name":"FeesForSellsChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newGas","type":"uint256"}],"name":"GasForProcessingChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"bool","name":"newStatus","type":"bool"}],"name":"MaxBalanceStatusChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"bool","name":"newStatus","type":"bool"}],"name":"MaxTransferStatusChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"iterations","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"claims","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lastProcessedIndex","type":"uint256"},{"indexed":true,"internalType":"bool","name":"automatic","type":"bool"},{"indexed":false,"internalType":"uint256","name":"gas","type":"uint256"},{"indexed":true,"internalType":"address","name":"processor","type":"address"}],"name":"ProcessedDividendTracker","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pair","type":"address"},{"indexed":true,"internalType":"bool","name":"newStatus","type":"bool"}],"name":"SetAutomatedMarketMakerPair","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"newStatus","type":"bool"}],"name":"SwapAndLiquifyByLimitStatusChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"newStatus","type":"bool"}],"name":"SwapAndLiquifyStatusChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newLower","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newUpper","type":"uint256"}],"name":"SwapAndLiquifyThresholdsChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newBalance","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newTransfer","type":"uint256"}],"name":"TokenBalanceAndTransferLimitsChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DEAD","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ZERO","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"dexPair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dexRouter","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dividendTracker","outputs":[{"internalType":"contract DividendTracker","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feesStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCirculatingSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"inFees","outputs":[{"internalType":"uint256","name":"rewards","type":"uint256"},{"internalType":"uint256","name":"operations","type":"uint256"},{"internalType":"uint256","name":"burn","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isBalanceLimitExempt","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isFeeExempt","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isMarketPair","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isTransferLimitExempt","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTokenBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTokenTransfer","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"openLaunch","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"outFees","outputs":[{"internalType":"uint256","name":"rewards","type":"uint256"},{"internalType":"uint256","name":"operations","type":"uint256"},{"internalType":"uint256","name":"burn","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"status","type":"bool"}],"name":"setBalanceLimitExempt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"bool","name":"status","type":"bool"}],"name":"setBulkFeeExemption","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"setDividendsExemption","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"setDividendsInclusion","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"status","type":"bool"}],"name":"setFeeExempt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setMarketPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"status","type":"bool"}],"name":"setTransferLimitExempt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"trading","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newOperations","type":"uint256"},{"internalType":"uint256","name":"newRewards","type":"uint256"},{"internalType":"uint256","name":"newBurn","type":"uint256"}],"name":"updateBuyFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"claimWait","type":"uint256"}],"name":"updateClaimWait","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"status","type":"bool"}],"name":"updateFeesStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"updateGasForProcessing","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newOperations","type":"uint256"},{"internalType":"uint256","name":"newRewards","type":"uint256"},{"internalType":"uint256","name":"newBurn","type":"uint256"}],"name":"updateSellFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"status","type":"bool"}],"name":"updateSwapByLimitStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"status","type":"bool"}],"name":"updateSwapStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"lowerThreshold","type":"uint256"},{"internalType":"uint256","name":"upperThreshold","type":"uint256"},{"internalType":"uint256","name":"divisor","type":"uint256"}],"name":"updateSwapThresholds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newBalance","type":"uint256"},{"internalType":"uint256","name":"newTransfer","type":"uint256"}],"name":"updateTokenLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawStuckEth","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60e060405261271060c052620493e06012553480156200001d575f80fd5b5033806200004457604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b6200004f8162000801565b50737a250d5630b4cf539739df2c5dacb4c659f2488d60a08190526040805163c45a015560e01b8152905163c45a0155916004808201926020929091908290030181865afa158015620000a4573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620000ca91906200093a565b6001600160a01b031663c9c6539660a0516001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000117573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200013d91906200093a565b6040516001600160e01b031960e084901b1681526001600160a01b0390911660048201523060248201526044016020604051808303815f875af115801562000187573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620001ad91906200093a565b6001600160a01b03908116608052305f90815260046020908152604080832060a05190941683529290528190205f19905551620001ea906200092c565b604051809103905ff08015801562000204573d5f803e3d5ffd5b50600a80546001600160a01b03929092166001600160a01b0319928316179055600980549091167307e5c17e8385a378d2b80f656e1e3e809f86a19f1790556080516200025390600162000850565b612710620002646012600a62000a78565b6200027690653f23337fd34462000a85565b620002839060c862000a85565b6200028f919062000a9f565b600155612710620002a36012600a62000a78565b620002b590653f23337fd34462000a85565b620002c29060c862000a85565b620002ce919062000a9f565b600255612710620002e26012600a62000a78565b620002f490653f23337fd34462000a85565b6200030190600162000a85565b6200030d919062000a9f565b601355612710620003216012600a62000a78565b6200033390653f23337fd34462000a85565b6200034090606462000a85565b6200034c919062000a9f565b6014555f600b8190556107d0600c819055600d829055600e829055600f5560108190556011805461ff00191661010017905561dead8152600560208190527f7d509c07f0d4edcc2dd1b53aae68677132eb562dcba78e36381b63ccaf66e6ba805460ff1916600190811790915591620003cc5f546001600160a01b031690565b6001600160a01b0316815260208082019290925260409081015f908120805494151560ff199586161790553081526005835290812080548416600190811790915561dead82526007928390527fb0c2646e02af70b79e3fe9277b98373379f54150e4e26b2b5650139f7a75a65d80549094168117909355620004555f546001600160a01b031690565b6001600160a01b03908116825260208083019390935260409182015f908120805495151560ff1996871617905530815260078452828120805486166001908117909155608051831682528382208054871682179055600a549092168152918220805485168217905561dead82526008928390527f046fee3d77c34a6c5e10c3be6dc4b132c30449dbf4f0bc07684896dd0933429980549094168117909355620005055f546001600160a01b031690565b6001600160a01b03908116825260208083019390935260409182015f908120805495151560ff199687161790553081526008909352818320805485166001908117909155600a805483168552938390208054909516179093559054905163031e79db60e41b815261dead60048201529116906331e79db0906024015f604051808303815f87803b15801562000598575f80fd5b505af1158015620005ab573d5f803e3d5ffd5b5050600a546001600160a01b031691506331e79db09050620005d45f546001600160a01b031690565b6040516001600160e01b031960e084901b1681526001600160a01b0390911660048201526024015f604051808303815f87803b15801562000613575f80fd5b505af115801562000626573d5f803e3d5ffd5b5050600a5460405163031e79db60e41b81523060048201526001600160a01b0390911692506331e79db091506024015f604051808303815f87803b1580156200066d575f80fd5b505af115801562000680573d5f803e3d5ffd5b5050600a5460a05160405163031e79db60e41b81526001600160a01b039182166004820152911692506331e79db091506024015f604051808303815f87803b158015620006cb575f80fd5b505af1158015620006de573d5f803e3d5ffd5b5050600a5460405163031e79db60e41b81526001600160a01b039091166004820181905292506331e79db091506024015f604051808303815f87803b15801562000726575f80fd5b505af115801562000739573d5f803e3d5ffd5b505050506012600a6200074d919062000a78565b6200075f90653f23337fd34462000a85565b60035f620007745f546001600160a01b031690565b6001600160a01b0316815260208101919091526040015f20556200079f5f546001600160a01b031690565b6001600160a01b03165f7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef620007d86012600a62000a78565b620007ea90653f23337fd34462000a85565b60405190815260200160405180910390a362000abf565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b0382165f90815260066020908152604080832080548515801560ff1992831681179093556007909452919093208054909116909217909155620008f157600a5460405163031e79db60e41b81526001600160a01b038481166004830152909116906331e79db0906024015f604051808303815f87803b158015620008d9575f80fd5b505af1158015620008ec573d5f803e3d5ffd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab905f90a35050565b6126fa80620038b983390190565b5f602082840312156200094b575f80fd5b81516001600160a01b038116811462000962575f80fd5b9392505050565b634e487b7160e01b5f52601160045260245ffd5b600181815b80851115620009bd57815f1904821115620009a157620009a162000969565b80851615620009af57918102915b93841c939080029062000982565b509250929050565b5f82620009d55750600162000a72565b81620009e357505f62000a72565b8160018114620009fc576002811462000a075762000a27565b600191505062000a72565b60ff84111562000a1b5762000a1b62000969565b50506001821b62000a72565b5060208310610133831016604e8410600b841016171562000a4c575081810a62000a72565b62000a5883836200097d565b805f190482111562000a6e5762000a6e62000969565b0290505b92915050565b5f620009628383620009c5565b808202811582820484141762000a725762000a7262000969565b5f8262000aba57634e487b7160e01b5f52601260045260245ffd5b500490565b60805160a05160c051612da562000b145f395f818161266101526126db01525f818161034301528181610cd401528181610db0015281816123f301526124a901525f81816108c701526116aa0152612da55ff3fe6080604052600436106102a8575f3560e01c8063871c128d1161016f578063c17b5b8c116100d8578063e98030c711610092578063f242ab411161006d578063f242ab41146108b6578063f2fde38b146108e9578063f8eba5c914610908578063fff4602f14610927575f80fd5b8063e98030c714610869578063ea0cdeff14610888578063ec44acf21461089d575f80fd5b8063c17b5b8c14610795578063cb20beaa146107b4578063d151d9cd146107d3578063dc2f5e48146107f1578063dd62ed3e14610810578063e8cedb2414610854575f80fd5b806395d89b411161012957806395d89b41146106cc57806398faa8ea146106fa5780639ae786af14610719578063a457c2d714610738578063a9059cbb14610757578063c16dd4a414610776575f80fd5b8063871c128d14610616578063879dd3c514610635578063880000341461065357806389824b93146106725780638da5cb5b146106915780638ebfc796146106ad575f80fd5b8063313ce567116102115780634e71d92d116101cb5780634e71d92d1461057457806358fa63ca1461058857806370a082311461059b578063715018a6146105cf5780637fa787ba146105e35780638095d564146105f7575f80fd5b8063313ce567146104be57806339509351146104d25780633ecad271146104f15780633f4218e01461051f57806340fb0b131461054d57806342ab9b2614610555575f80fd5b806318160ddd1161026257806318160ddd146103ee578063232bbdca1461041057806323b872dd1461043e5780632b112e491461045d5780632c1f5216146104715780632e1207aa14610490575f80fd5b806303fd2a45146102b357806306fdde03146102e55780630758d92414610332578063095ea7b3146103655780630f0ceb671461039457806312163785146103b5575f80fd5b366102af57005b5f80fd5b3480156102be575f80fd5b506102c861dead81565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156102f0575f80fd5b5061032560405180604001604052806015815260200174092dcccd2dcd2e8ca409adedccaf2408ed8d2e8c6d605b1b81525081565b6040516102dc91906127a3565b34801561033d575f80fd5b506102c87f000000000000000000000000000000000000000000000000000000000000000081565b348015610370575f80fd5b5061038461037f366004612802565b610946565b60405190151581526020016102dc565b34801561039f575f80fd5b506103b36103ae366004612839565b61095c565b005b3480156103c0575f80fd5b50600e54600f546010546103d392919083565b604080519384526020840192909252908201526060016102dc565b3480156103f9575f80fd5b50610402610ad6565b6040519081526020016102dc565b34801561041b575f80fd5b5061038461042a36600461285b565b60086020525f908152604090205460ff1681565b348015610449575f80fd5b50610384610458366004612876565b610af5565b348015610468575f80fd5b50610402610b45565b34801561047c575f80fd5b50600a546102c8906001600160a01b031681565b34801561049b575f80fd5b506103846104aa36600461285b565b60076020525f908152604090205460ff1681565b3480156104c9575f80fd5b50610402601281565b3480156104dd575f80fd5b506103846104ec366004612802565b610bcd565b3480156104fc575f80fd5b5061038461050b36600461285b565b60066020525f908152604090205460ff1681565b34801561052a575f80fd5b5061038461053936600461285b565b60056020525f908152604090205460ff1681565b6103b3610c03565b348015610560575f80fd5b506103b361056f3660046128b4565b610e71565b34801561057f575f80fd5b506103b3610ecc565b348015610593575f80fd5b506102c85f81565b3480156105a6575f80fd5b506104026105b536600461285b565b6001600160a01b03165f9081526003602052604090205490565b3480156105da575f80fd5b506103b3610f40565b3480156105ee575f80fd5b506103b3610f53565b348015610602575f80fd5b506103b36106113660046128eb565b610f9d565b348015610621575f80fd5b506103b3610630366004612914565b611062565b348015610640575f80fd5b5060115461038490610100900460ff1681565b34801561065e575f80fd5b506103b361066d3660046128eb565b611183565b34801561067d575f80fd5b506103b361068c36600461292b565b611302565b34801561069c575f80fd5b505f546001600160a01b03166102c8565b3480156106b8575f80fd5b506103b36106c73660046128b4565b6113ba565b3480156106d7575f80fd5b5061032560405180604001604052806003815260200162494d4760e81b81525081565b348015610705575f80fd5b506103b3610714366004612839565b611415565b348015610724575f80fd5b506103b36107333660046129aa565b6114a1565b348015610743575f80fd5b50610384610752366004612802565b61165e565b348015610762575f80fd5b50610384610771366004612802565b611694565b348015610781575f80fd5b506103b36107903660046128b4565b6116a0565b3480156107a0575f80fd5b506103b36107af3660046128eb565b611743565b3480156107bf575f80fd5b506103b36107ce36600461285b565b6117ff565b3480156107de575f80fd5b50600b54600c54600d546103d392919083565b3480156107fc575f80fd5b506103b361080b366004612839565b611865565b34801561081b575f80fd5b5061040261082a3660046129ca565b6001600160a01b039182165f90815260046020908152604080832093909416825291909152205490565b34801561085f575f80fd5b5061040260015481565b348015610874575f80fd5b506103b3610883366004612914565b6118f6565b348015610893575f80fd5b5061040260025481565b3480156108a8575f80fd5b506011546103849060ff1681565b3480156108c1575f80fd5b506102c87f000000000000000000000000000000000000000000000000000000000000000081565b3480156108f4575f80fd5b506103b361090336600461285b565b61192f565b348015610913575f80fd5b506103b361092236600461285b565b611969565b348015610932575f80fd5b506103b36109413660046128b4565b6119a3565b5f6109523384846119fe565b5060015b92915050565b610964611b25565b601154610100900460ff1615158115150361099a5760405162461bcd60e51b8152600401610991906129f6565b60405180910390fd5b8015610a8257601054600e54600f545f92916109b591612a54565b6109bf9190612a54565b11610a165760405162461bcd60e51b815260206004820152602160248201527f4552524f523a20546f74616c206f75742066656573206d757374206265203e306044820152602560f81b6064820152608401610991565b600d54600b54600c545f9291610a2b91612a54565b610a359190612a54565b11610a825760405162461bcd60e51b815260206004820181905260248201527f4552524f523a20546f74616c20696e2066656573206d757374206265203e30256044820152606401610991565b601180548215156101000261ff00199091161790556040517fcf5b8994e88702dcc077176517145092990b0e63dd35b64c412961aceb0139da90610acb90831515815260200190565b60405180910390a150565b610ae26012600a612b47565b610af290653f23337fd344612b52565b81565b5f610b01848484611b51565b6001600160a01b0384165f90815260046020908152604080832033808552925290912054610b3b918691610b36908690612b69565b6119fe565b5060019392505050565b60036020527f3617319a054d772f909f7c479a2cebe5066e836a939412e32403c99029b92eff5461dead5f9081527f262bb27bbdd95c1cdc8e16957e36e38579ea44f7f6413dd7a9c75939def06b2c54909190610ba46012600a612b47565b610bb490653f23337fd344612b52565b610bbe9190612b69565b610bc89190612b69565b905090565b335f8181526004602090815260408083206001600160a01b03871684529091528120549091610952918590610b36908690612a54565b610c0b611b25565b60115460ff1615610c715760405162461bcd60e51b815260206004820152602a60248201527f4552524f523a2043616e6e6f74206f70656e2074726164696e67206d6f7265206044820152697468616e206f6e63652160b01b6064820152608401610991565b5f60055f610c865f546001600160a01b031690565b6001600160a01b0316815260208082019290925260409081015f908120805460ff191694151594909417909355805160028082526060820183529092909190830190803683370190505090507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d2e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d529190612b7c565b815f81518110610d6457610d64612b97565b60200260200101906001600160a01b031690816001600160a01b0316815250503081600181518110610d9857610d98612b97565b6001600160a01b0392831660209182029290920101527f00000000000000000000000000000000000000000000000000000000000000001663b6f9de95345f84610de95f546001600160a01b031690565b426040518663ffffffff1660e01b8152600401610e099493929190612bed565b5f604051808303818588803b158015610e20575f80fd5b505af1158015610e32573d5f803e3d5ffd5b50506011805464ffff0000ff191664010100000117905550505f80546001600160a01b03168152600560205260409020805460ff191660011790555050565b610e79611b25565b6001600160a01b0382165f81815260086020526040808220805460ff191685151590811790915590519092917f1e66b5fde56c4d8ecb85d64d19db4a0cda78614ba8d21189ecfe2d5d739625da91a35050565b600a5460405163bc4c4b3760e01b81523360048201525f60248201526001600160a01b039091169063bc4c4b37906044016020604051808303815f875af1158015610f19573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f3d9190612c21565b50565b610f48611b25565b610f515f6121c1565b565b610f5b611b25565b604051339047905f81818185875af1925050503d805f8114610f98576040519150601f19603f3d011682016040523d82523d5f602084013e505050565b505050565b610fa5611b25565b601154610100900460ff161580610ff057505f81610fc38486612a54565b610fcd9190612a54565b118015610ff05750610fa081610fe38486612a54565b610fed9190612a54565b11155b61100c5760405162461bcd60e51b815260040161099190612c3c565b600c839055600b829055600d81905560408051848152602081018490529081018290527fd53c6456bc9b86bb998c3caf4c194591aa2be28760be154ae9d142ae25b326b6906060015b60405180910390a1505050565b61106a611b25565b62030d40811015801561108057506207a1208111155b6110e85760405162461bcd60e51b815260206004820152603360248201527f4552524f523a20476173206d757374206265206265747765656e203230302c30604482015272303020616e64203530302c303030205745492160681b6064820152608401610991565b601254810361114e5760405162461bcd60e51b815260206004820152602c60248201527f4552524f523a204e6577206761732076616c7565206d6174636865732065786960448201526b7374696e672076616c75652160a01b6064820152608401610991565b60128190556040518181527fbe808aedc0249fa7c80307e37e5465deced3eddb31d3b8df66884f9c0c074d6f90602001610acb565b61118b611b25565b5f83116111f45760405162461bcd60e51b815260206004820152603160248201527f4552524f523a204c6f776572207468726573686f6c64206d7573742062652067604482015270726561746572207468616e207a65726f2160781b6064820152608401610991565b5f821161125d5760405162461bcd60e51b815260206004820152603160248201527f4552524f523a205570706572207468726573686f6c64206d7573742062652067604482015270726561746572207468616e207a65726f2160781b6064820152608401610991565b808361126b6012600a612b47565b61127b90653f23337fd344612b52565b6112859190612b52565b61128f9190612c85565b60135580826112a06012600a612b47565b6112b090653f23337fd344612b52565b6112ba9190612b52565b6112c49190612c85565b60148190556013546040517fc366ae351d3d7d0b43cdc7dc176c4798fc8a8c0f228b557c26c0c823e37b0f8892611055928252602082015260400190565b61130a611b25565b5f5b82811015611378578160055f86868581811061132a5761132a612b97565b905060200201602081019061133f919061285b565b6001600160a01b0316815260208101919091526040015f20805460ff19169115159190911790558061137081612ca4565b91505061130c565b508015157f7c159dbef063be687bb45fa8314ade451f22a7d65c3c57475f7b80e414178fae84846040516113ad929190612cbc565b60405180910390a2505050565b6113c2611b25565b6001600160a01b0382165f81815260056020526040808220805460ff191685151590811790915590519092917f1341b4f10431dd805adb88f6edc74d4f6f67882e6878cf6aa540f3d97a91a2a391a35050565b61141d611b25565b6011546301000000900460ff1615158115150361144c5760405162461bcd60e51b8152600401610991906129f6565b6011805463ff000000191663010000008315158102919091179182905560405160ff9190920416151581527fec812adf80955811a54e735da9734f7a470923c96c5548fa90a21fb80011731f90602001610acb565b6114a9611b25565b6101f46114b86012600a612b47565b6114c890653f23337fd344612b52565b6114d29190612c85565b8210156115475760405162461bcd60e51b815260206004820152603960248201527f4552524f523a204e65772062616c616e6365207468726573686f6c64206d757360448201527f74206265203e3d302e322520746f74616c20737570706c7921000000000000006064820152608401610991565b6101f46115566012600a612b47565b61156690653f23337fd344612b52565b6115709190612c85565b8110156115e55760405162461bcd60e51b815260206004820152603a60248201527f4552524f523a204e6577207472616e73666572207468726573686f6c64206d7560448201527f7374206265203e3d302e322520746f74616c20737570706c79210000000000006064820152608401610991565b6115f16012600a612b47565b6115fb9083612b52565b60015561160a6012600a612b47565b6116149082612b52565b60028190556001546040517f5be9cf7a1cfe6f06f03895820a324a18e140745c3b9a3c6a9c568473df3f24be92611652928252602082015260400190565b60405180910390a15050565b335f8181526004602090815260408083206001600160a01b03871684529091528120549091610952918590610b36908690612b69565b5f610952338484611b51565b6116a8611b25565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316036117355760405162461bcd60e51b815260206004820152602360248201527f4552524f523a2043616e6e6f74206d757461746520636f72652064657820706160448201526269722160e81b6064820152608401610991565b61173f8282612210565b5050565b61174b611b25565b601154610100900460ff16158061179657505f816117698486612a54565b6117739190612a54565b1180156117965750610fa0816117898486612a54565b6117939190612a54565b11155b6117b25760405162461bcd60e51b815260040161099190612c3c565b600f839055600e829055601081905560408051848152602081018490529081018290527f5fe4a516756a6b0cbb71fbad74616e0fe2f7a204a4c74384f78641468a87518a90606001611055565b611807611b25565b600a5460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db0906024015b5f604051808303815f87803b15801561184c575f80fd5b505af115801561185e573d5f803e3d5ffd5b5050505050565b61186d611b25565b601154640100000000900460ff1615158115150361189d5760405162461bcd60e51b8152600401610991906129f6565b601180548215156401000000000264ff00000000199091161790819055604051630100000090910460ff16151581527febac0310d5b9ba7464c127bf2a1f9f862623c65ea1b2502ec2f56e6dd29ea32290602001610acb565b6118fe611b25565b600a5460405163e98030c760e01b8152600481018390526001600160a01b039091169063e98030c790602401611835565b611937611b25565b6001600160a01b03811661196057604051631e4fbdf760e01b81525f6004820152602401610991565b610f3d816121c1565b611971611b25565b600a5460405163c0f306ef60e01b81526001600160a01b0383811660048301529091169063c0f306ef90602401611835565b6119ab611b25565b6001600160a01b0382165f81815260076020526040808220805460ff191685151590811790915590519092917f703e2a1b267e9264efd6afd3df9c45af223ae3edbe88c223021b026ae719a42391a35050565b6001600160a01b038316611a625760405162461bcd60e51b815260206004820152602560248201527f4552524f523a20417070726f76652066726f6d20746865207a65726f20616464604482015264726573732160d81b6064820152608401610991565b6001600160a01b038216611ac45760405162461bcd60e51b815260206004820152602360248201527f4552524f523a20417070726f766520746f20746865207a65726f20616464726560448201526273732160e81b6064820152608401610991565b6001600160a01b038381165f8181526004602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b5f546001600160a01b03163314610f515760405163118cdaa760e01b8152336004820152602401610991565b60115462010000900460ff1615611c01576001600160a01b0383165f9081526003602052604081208054839290611b89908490612b69565b90915550506001600160a01b0382165f9081526003602052604081208054839290611bb5908490612a54565b92505081905550816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611b1891815260200190565b5f546001600160a01b03848116911614801590611c2b57505f546001600160a01b03838116911614155b15611d74576001600160a01b0383165f9081526005602052604090205460ff16158015611c7057506001600160a01b0382165f9081526005602052604090205460ff16155b15611cc75760115460ff16611cc75760405162461bcd60e51b815260206004820152601960248201527f4552524f523a2054726164696e6720697320636c6f73656421000000000000006044820152606401610991565b6001600160a01b0383165f9081526008602052604090205460ff16158015611d0757506001600160a01b0382165f9081526008602052604090205460ff16155b15611d7457600254811115611d745760405162461bcd60e51b815260206004820152602d60248201527f4552524f523a205472616e7366657220616d6f756e742065786365656473206d60448201526c6178696d756d206c696d69742160981b6064820152608401610991565b305f908152600360205260409020546013548110801590611d9e575060115462010000900460ff16155b8015611dc257506001600160a01b0384165f9081526006602052604090205460ff16155b8015611de557506001600160a01b0383165f9081526006602052604090205460ff165b8015611dfa57506011546301000000900460ff165b15611e3157601154640100000000900460ff1615611e28576014548111611e215780611e25565b6014545b90505b611e31816122e9565b6001600160a01b0384165f9081526003602052604081208054849290611e58908490612b69565b90915550506001600160a01b0384165f9081526005602052604081205460ff1680611e9a57506001600160a01b0384165f9081526005602052604090205460ff165b611eae57611ea9858585612622565b611eb0565b825b6001600160a01b0385165f9081526007602052604090205490915060ff16611f58576001546001600160a01b0385165f90815260036020526040902054611ef8908390612a54565b1115611f585760405162461bcd60e51b815260206004820152602960248201527f4552524f523a204e65772062616c616e63652065786365656473206d6178696d604482015268756d206c696d69742160b81b6064820152608401610991565b6001600160a01b0384165f9081526003602052604081208054839290611f7f908490612a54565b92505081905550836001600160a01b0316856001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611fcb91815260200190565b60405180910390a3600a546001600160a01b031663e30443bc86612003816001600160a01b03165f9081526003602052604090205490565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044015f604051808303815f87803b158015612046575f80fd5b505af1158015612058573d5f803e3d5ffd5b5050600a546001600160a01b0316915063e30443bc90508561208e816001600160a01b03165f9081526003602052604090205490565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044015f604051808303815f87803b1580156120d1575f80fd5b505af11580156120e3573d5f803e3d5ffd5b505050505f601254111561185e57600a546012546040516001624d3b8760e01b031981526001600160a01b039092169163ffb2c479916121299160040190815260200190565b6060604051808303815f875af1925050508015612163575060408051601f3d908101601f1916820190925261216091810190612d09565b60015b1561185e57601254604080518581526020810185905280820184905260608101929092525132916001917fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989181900360800190a35050505050505050565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b0382165f90815260066020908152604080832080548515801560ff19928316811790935560079094529190932080549091169092179091556122ae57600a5460405163031e79db60e41b81526001600160a01b038481166004830152909116906331e79db0906024015f604051808303815f87803b158015612297575f80fd5b505af11580156122a9573d5f803e3d5ffd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab905f90a35050565b6011805462ff0000191662010000179055601054600f54600e54600d54600c54600b545f959493929161231b91612a54565b6123259190612a54565b61232f9190612a54565b6123399190612a54565b6123439190612a54565b601054600d549192505f916123589084612b69565b6123629190612b69565b601054600d549192505f91849161237891612a54565b6123829086612b52565b61238c9190612c85565b90505f6123998286612b69565b6040805160028082526060820183529293505f92909160208301908036833701905050905030815f815181106123d1576123d1612b97565b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801561244d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124719190612b7c565b8160018151811061248457612484612b97565b6001600160a01b03928316602091820292909201015260405163791ac94760e01b81527f00000000000000000000000000000000000000000000000000000000000000009091169063791ac947906124e89085905f90869030904290600401612d34565b5f604051808303815f87803b1580156124ff575f80fd5b505af1925050508015612510575060015b1561260157600a54600e54600b546001600160a01b0390921691869161253591612a54565b61253f9047612b52565b6125499190612c85565b6040515f81818185875af1925050503d805f8114612582576040519150601f19603f3d011682016040523d82523d5f602084013e612587565b606091505b5050600954600f54600c546001600160a01b03909216925086916125ab9190612a54565b6125b59047612b52565b6125bf9190612c85565b6040515f81818185875af1925050503d805f81146125f8576040519150601f19603f3d011682016040523d82523d5f602084013e6125fd565b606091505b5050505b61260e3061dead85611b51565b50506011805462ff00001916905550505050565b6011545f908190610100900460ff1615612790576001600160a01b0385165f9081526006602052604090205460ff16156126b057600d54600c54600b547f0000000000000000000000000000000000000000000000000000000000000000929161268b91612a54565b6126959190612a54565b61269f9085612b52565b6126a99190612c85565b9050612726565b6001600160a01b0384165f9081526006602052604090205460ff161561272657601054600f54600e547f0000000000000000000000000000000000000000000000000000000000000000929161270591612a54565b61270f9190612a54565b6127199085612b52565b6127239190612c85565b90505b801561279057305f908152600360205260408120805483929061274a908490612a54565b909155505060405181815230906001600160a01b038716907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35b61279a8184612b69565b95945050505050565b5f6020808352835180828501525f5b818110156127ce578581018301518582016040015282016127b2565b505f604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114610f3d575f80fd5b5f8060408385031215612813575f80fd5b823561281e816127ee565b946020939093013593505050565b8015158114610f3d575f80fd5b5f60208284031215612849575f80fd5b81356128548161282c565b9392505050565b5f6020828403121561286b575f80fd5b8135612854816127ee565b5f805f60608486031215612888575f80fd5b8335612893816127ee565b925060208401356128a3816127ee565b929592945050506040919091013590565b5f80604083850312156128c5575f80fd5b82356128d0816127ee565b915060208301356128e08161282c565b809150509250929050565b5f805f606084860312156128fd575f80fd5b505081359360208301359350604090920135919050565b5f60208284031215612924575f80fd5b5035919050565b5f805f6040848603121561293d575f80fd5b833567ffffffffffffffff80821115612954575f80fd5b818601915086601f830112612967575f80fd5b813581811115612975575f80fd5b8760208260051b8501011115612989575f80fd5b6020928301955093505084013561299f8161282c565b809150509250925092565b5f80604083850312156129bb575f80fd5b50508035926020909101359150565b5f80604083850312156129db575f80fd5b82356129e6816127ee565b915060208301356128e0816127ee565b6020808252602a908201527f4552524f523a204e657720737461747573206d617463686573206578697374696040820152696e67207374617475732160b01b606082015260800190565b634e487b7160e01b5f52601160045260245ffd5b8082018082111561095657610956612a40565b600181815b80851115612aa157815f1904821115612a8757612a87612a40565b80851615612a9457918102915b93841c9390800290612a6c565b509250929050565b5f82612ab757506001610956565b81612ac357505f610956565b8160018114612ad95760028114612ae357612aff565b6001915050610956565b60ff841115612af457612af4612a40565b50506001821b610956565b5060208310610133831016604e8410600b8410161715612b22575081810a610956565b612b2c8383612a67565b805f1904821115612b3f57612b3f612a40565b029392505050565b5f6128548383612aa9565b808202811582820484141761095657610956612a40565b8181038181111561095657610956612a40565b5f60208284031215612b8c575f80fd5b8151612854816127ee565b634e487b7160e01b5f52603260045260245ffd5b5f8151808452602080850194508084015f5b83811015612be25781516001600160a01b031687529582019590820190600101612bbd565b509495945050505050565b848152608060208201525f612c056080830186612bab565b6001600160a01b03949094166040830152506060015292915050565b5f60208284031215612c31575f80fd5b81516128548161282c565b60208082526029908201527f4552524f523a20546f74616c2066656573206d757374206265203e302520616e60408201526864203c3d203430252160b81b606082015260800190565b5f82612c9f57634e487b7160e01b5f52601260045260245ffd5b500490565b5f60018201612cb557612cb5612a40565b5060010190565b60208082528181018390525f908460408401835b86811015612cfe578235612ce3816127ee565b6001600160a01b031682529183019190830190600101612cd0565b509695505050505050565b5f805f60608486031215612d1b575f80fd5b8351925060208401519150604084015190509250925092565b85815284602082015260a060408201525f612d5260a0830186612bab565b6001600160a01b039490941660608301525060800152939250505056fea2646970667358221220c6d150952e681ea6b06bb13beff3179a397374d042e3186ab4297c75f58ca4de64736f6c6343000814003360c060405234801562000010575f80fd5b5033806200003757604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b6200004281620002f4565b50737a250d5630b4cf539739df2c5dacb4c659f2488d6080526007602052600f7ffb17e715424f0d73f459cecca07fcd18aa5a7779685373d8f04ce9acf74066ef81905560048054600181810183557f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b91820180546001600160a01b0319908116736982508145454ce325ddbe47a25d4ec3d2311933179091557f6b5aa315c702061b8fcd6cc12c221cb8280c4abb8c3571584550b7ddf76bb66b8590558354808301855583018054821673812ba41e071c7b7fa4ebcfb62df5f45f6fa853ee1790557f0c044bd9ed09f43bcbe739742c6bf90f950ad19364df79b3427c565ed9afbb4a8590558354808301855583018054821673e0f63a424a4439cbe457d80e4f4b51ad25b2c56c1790557f3e8b1db2ade8955a561883f7b2250f0079ec867feb39be887c318f34fae2fd1e8590558354808301855583018054821673aaee1a9723aadb7afa2810263653a34ba2c21c7a1790557f37b3eb5ea1f605bc1ae441eec20d6293f4796ff67dd2705f586c7aea40007ba98590558354808301855583018054821673b90b2a35c65dbc466b04240097ca756ad20052951790557f84c5ca2f7f2e4ca0122d358aebf0036d19214a8ecd3345e57129dbae0618d018949094558254808201845582018054851673c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2179055600a7ff942f4688cdba65adc8aa59da583acae93fa87351143ebc775559218bfa5f83255825490810183555f8381529101805490931673a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48179092558054909190620002ad57620002ad62000343565b5f91825260209091200154600380546001600160a01b0319166001600160a01b03909216919091179055620151806012556b011f1dbaa733ce84a098000060a05262000357565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b634e487b7160e01b5f52603260045260245ffd5b60805160a05161235e6200039c5f395f818161057f015261109a01525f818161024e0152818161146b015281816115230152818161160c0152611680015261235e5ff3fe6080604052600436106101ff575f3560e01c80639c53c0ca11610113578063cc5489df1161009d578063e7f4d2c31161006d578063e7f4d2c314610675578063e98030c714610694578063f2fde38b146106b3578063fd590847146106d2578063ffb2c479146106f1575f80fd5b8063cc5489df146105df578063e30443bc146105fe578063e6f083f41461061d578063e7841ec014610661575f80fd5b8063b379dc41116100e3578063b379dc4114610523578063bc4c4b371461054f578063be10b6141461056e578063c0f306ef146105a1578063cb83bcd6146105c0575f80fd5b80639c53c0ca14610499578063a549c08b146104b8578063ab6ddfa8146104e3578063ad7a672f1461050e575f80fd5b80634e7b827f11610194578063793072851161016457806379307285146103b75780637bb7bed1146103e55780638c503bf5146104045780638da5cb5b1461046857806393fcfe6114610484575f80fd5b80634e7b827f1461033157806355bb47b41461036f5780636f2789ec1461038e578063715018a6146103a3575f80fd5b8063226cfa3d116101cf578063226cfa3d146102a75780633009a609146102d257806331e79db0146102e75780634d6e5e0214610306575f80fd5b806303c833021461021257806309bbedde1461021a5780631694505e1461023d578063204f11a814610288575f80fd5b3661020e5761020c61072b565b005b5f80fd5b61020c61072b565b348015610225575f80fd5b50600d545b6040519081526020015b60405180910390f35b348015610248575f80fd5b506102707f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610234565b348015610293575f80fd5b5061022a6102a2366004611fad565b61097a565b3480156102b2575f80fd5b5061022a6102c1366004611fe4565b60146020525f908152604090205481565b3480156102dd575f80fd5b5061022a60115481565b3480156102f2575f80fd5b5061020c610301366004611fe4565b6109b8565b348015610311575f80fd5b5061022a610320366004611fe4565b60086020525f908152604090205481565b34801561033c575f80fd5b5061035f61034b366004611fe4565b60136020525f908152604090205460ff1681565b6040519015158152602001610234565b34801561037a575f80fd5b5061020c610389366004611fff565b610a2c565b348015610399575f80fd5b5061022a60125481565b3480156103ae575f80fd5b5061020c610c86565b3480156103c2575f80fd5b5061035f6103d1366004611fe4565b60056020525f908152604090205460ff1681565b3480156103f0575f80fd5b506102706103ff36600461206e565b610c99565b34801561040f575f80fd5b5061042361041e366004612085565b610cc1565b604080516001600160a01b0390991689526020890197909752958701949094526060860192909252608085015260a084015260c083015260e082015261010001610234565b348015610473575f80fd5b505f546001600160a01b0316610270565b34801561048f575f80fd5b5061022a60025481565b3480156104a4575f80fd5b5061020c6104b3366004611fe4565b610d2a565b3480156104c3575f80fd5b5061022a6104d2366004611fe4565b60076020525f908152604090205481565b3480156104ee575f80fd5b5061022a6104fd366004611fe4565b60066020525f908152604090205481565b348015610519575f80fd5b5061022a60015481565b34801561052e575f80fd5b5061054261053d366004611fe4565b610d38565b60405161023491906120a8565b34801561055a575f80fd5b5061035f6105693660046120f8565b610eb8565b348015610579575f80fd5b5061022a7f000000000000000000000000000000000000000000000000000000000000000081565b3480156105ac575f80fd5b5061020c6105bb366004611fe4565b610f80565b3480156105cb575f80fd5b5061022a6105da366004611fad565b610ff3565b3480156105ea575f80fd5b5061022a6105f9366004611fad565b610ffe565b348015610609575f80fd5b5061020c610618366004612124565b611071565b348015610628575f80fd5b5061022a610637366004611fad565b6001600160a01b039182165f908152600b6020908152604080832093909416825291909152205490565b34801561066c575f80fd5b5060115461022a565b348015610680575f80fd5b50600354610270906001600160a01b031681565b34801561069f575f80fd5b5061020c6106ae36600461206e565b6110fb565b3480156106be575f80fd5b5061020c6106cd366004611fe4565b611235565b3480156106dd575f80fd5b506104236106ec366004611fad565b611272565b3480156106fc575f80fd5b5061071061070b36600461206e565b611355565b60408051938452602084019290925290820152606001610234565b5f60015411610738575f80fd5b6003546040516370a0823160e01b81523060048201525f916001600160a01b0316906370a0823190602401602060405180830381865afa15801561077e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107a2919061214e565b6003549091506107bc9034906001600160a01b0316611469565b6003546040516370a0823160e01b81523060048201525f916108329184916001600160a01b0316906370a0823190602401602060405180830381865afa158015610808573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061082c919061214e565b90611751565b9050801561090a576001546108799061084f83600160801b61175c565b610859919061218d565b6003546001600160a01b03165f9081526009602052604090205490611767565b6003546001600160a01b03165f90815260096020908152604091829020929092555182815233917fa493a9229478c3fcd73f66d2cdeb7f94fd0f341da924d1054236d78454116511910160405180910390a26003546001600160a01b03165f908152600860205260409020546108ef9082611767565b6003546001600160a01b03165f908152600860205260409020555b600454610919906001906121a0565b6002546109279060016121b3565b61093191906121c6565b60028190555060046002548154811061094c5761094c6121d9565b5f91825260209091200154600380546001600160a01b0319166001600160a01b039092169190911790555050565b6001600160a01b038083165f908152600b602090815260408083209385168352929052908120546109af9061082c8585610ffe565b90505b92915050565b6109c0611772565b6001600160a01b0381165f908152601360205260408120805460ff191660011790556109ed90829061179e565b6109f681611832565b6040516001600160a01b038216907fa878b31040b2e6d0a9a3d3361209db3908ba62014b0dca52adbaee451d128b25905f90a250565b6004548114610ab35760405162461bcd60e51b815260206004820152604260248201527f4152524159204d49534d415443483a2050657263656e746167657320746f746160448201527f6c206d757374206d61746368207265776172647320746f6b656e7320746f74616064820152616c2160f01b608482015260a4015b60405180910390fd5b5f805b82811015610bf1576064848483818110610ad257610ad26121d9565b905060200201351115610b455760405162461bcd60e51b815260206004820152603560248201527f50455243454e544147452045584345454445443a2050657263656e74616765206044820152746d757374206e6f742065786365656420313030252160581b6064820152608401610aaa565b838382818110610b5757610b576121d9565b90506020020135600a5f336001600160a01b03166001600160a01b031681526020019081526020015f205f60048481548110610b9557610b956121d9565b5f9182526020808320909101546001600160a01b03168352820192909252604001902055838382818110610bcb57610bcb6121d9565b9050602002013582610bdd91906121b3565b915080610be9816121ed565b915050610ab6565b5080606414610c685760405162461bcd60e51b815260206004820152603d60248201527f20544f54414c2050455243454e544147452045584345454445443a20546f746160448201527f6c2070657263656e74616765206d75737420657175616c2031303025210000006064820152608401610aaa565b5050335f908152600560205260409020805460ff1916600117905550565b610c8e611772565b610c975f61195d565b565b60048181548110610ca8575f80fd5b5f918252602090912001546001600160a01b0316905081565b5f805f805f805f80610cd2600d5490565b8a10610cf557505f96505f19955085945086935083925082915081905080610d1d565b5f610cff8b6119ac565b9050610d0b818b611272565b98509850985098509850985098509850505b9295985092959890939650565b610d3433826119dc565b5050565b6004546060905f9067ffffffffffffffff811115610d5857610d58612205565b604051908082528060200260200182016040528015610d81578160200160208202803683370190505b506001600160a01b0384165f9081526005602052604090205490915060ff1615610e3a575f5b600454811015610e34576001600160a01b0384165f908152600a602052604081206004805491929184908110610ddf57610ddf6121d9565b5f9182526020808320909101546001600160a01b031683528201929092526040019020548251839083908110610e1757610e176121d9565b602090810291909101015280610e2c816121ed565b915050610da7565b506109b2565b5f5b600454811015610eb15760075f60048381548110610e5c57610e5c6121d9565b5f9182526020808320909101546001600160a01b031683528201929092526040019020548251839083908110610e9457610e946121d9565b602090810291909101015280610ea9816121ed565b915050610e3c565b5092915050565b5f610ec1611772565b5f805f5b600454811015610f7757610eff8660048381548110610ee657610ee66121d9565b5f918252602090912001546001600160a01b03166119dc565b92508215610f65576001600160a01b0386165f81815260146020526040908190204290555186151591907fa2c38e2d2fb7e3e1912d937fd1ca11ed6d51864dee4cfa7a7bf02becd7acf09290610f589087815260200190565b60405180910390a3600191505b80610f6f816121ed565b915050610ec5565b50949350505050565b610f88611772565b6001600160a01b0381165f9081526013602052604090205460ff16610fab575f80fd5b6001600160a01b0381165f81815260136020526040808220805460ff19169055517f40a78dcf8526b72f2eaf598af1c7e49c8d5fc577f6c8f1bed887f3e4dfa289329190a250565b5f6109af838361097a565b6001600160a01b038082165f818152600c6020908152604080832094871683529381528382205460068252848320549383526009909152928120549092600160801b9261106792611062929161105c916110579161175c565b611c00565b90611c0e565b611c48565b6109af919061218d565b611079611772565b6001600160a01b0382165f9081526013602052604090205460ff16610d34577f000000000000000000000000000000000000000000000000000000000000000081106110d8576110c9828261179e565b6110d38282611c59565b6110eb565b6110e2825f61179e565b6110eb82611832565b6110f6826001610eb8565b505050565b611103611772565b6201518081111561118a5760405162461bcd60e51b815260206004820152604560248201527f4469766964656e645f547261636b65723a20636c61696d57616974206d75737460448201527f206265207570646174656420746f206265747765656e203120616e6420323420606482015264686f75727360d81b608482015260a401610aaa565b60125481036112015760405162461bcd60e51b815260206004820152603760248201527f4469766964656e645f547261636b65723a2043616e6e6f74207570646174652060448201527f636c61696d5761697420746f2073616d652076616c75650000000000000000006064820152608401610aaa565b6012819055604051819081907f474ea64804364a1e29a4487ddb63c3342a2dd826ccd8acf48825e680a0e6f20f905f90a350565b61123d611772565b6001600160a01b03811661126657604051631e4fbdf760e01b81525f6004820152602401610aaa565b61126f8161195d565b50565b815f80808080808061128388611d14565b96505f1995505f87126112e1576011548711156112af576011546112a8908890611d56565b95506112e1565b601154600d545f91106112c2575f6112d1565b601154600d546112d191611751565b90506112dd8882611c0e565b9650505b6112eb888a61097a565b94506112f7888a610ffe565b6001600160a01b0389165f9081526014602052604090205490945092508261131f575f61132d565b60125461132d908490611767565b915042821161133c575f611346565b6113468242611751565b90509295985092959890939650565b600d545f90819081908082036113755750506011545f9250829150611462565b6011545f805a90505f805b898410801561138e57508582105b15611451578461139d816121ed565b600d54909650861090506113af575f94505b5f600d5f0186815481106113c5576113c56121d9565b5f9182526020808320909101546001600160a01b031680835260149091526040909120549091506113f590611d8f565b1561141857611405816001610eb8565b156114185781611414816121ed565b9250505b82611422816121ed565b9350505f5a9050808511156114485761144561143e8683611751565b8790611767565b95505b93506113809050565b601185905590975095509193505050505b9193909250565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156114c5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114e99190612219565b6001600160a01b0316816001600160a01b03161461167e576040805160028082526060820183525f926020830190803683370190505090507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801561157d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115a19190612219565b815f815181106115b3576115b36121d9565b60200260200101906001600160a01b031690816001600160a01b03168152505081816001815181106115e7576115e76121d9565b6001600160a01b03928316602091820292909201015260405163b6f9de9560e01b81527f00000000000000000000000000000000000000000000000000000000000000009091169063b6f9de9590859061164b905f90869030904290600401612234565b5f604051808303818588803b158015611662575f80fd5b505af1158015611674573d5f803e3d5ffd5b5050505050505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156116da573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116fe9190612219565b6001600160a01b031663d0e30db0836040518263ffffffff1660e01b81526004015f604051808303818588803b158015611736575f80fd5b505af1158015611748573d5f803e3d5ffd5b50505050505050565b5f6109af82846121a0565b5f6109af828461229c565b5f6109af82846121b3565b5f546001600160a01b03163314610c975760405163118cdaa760e01b8152336004820152602401610aaa565b6001600160a01b0382165f908152600660205260409020805490829055808211156117f7575f6117ce8383611751565b90506117da8482611db4565b8060015f8282546117eb91906121b3565b909155506110f6915050565b808210156110f6575f61180a8284611751565b90506118168482611eb6565b8060015f82825461182791906121a0565b909155505050505050565b6001600160a01b0381165f9081526010602052604090205460ff166118545750565b6001600160a01b0381165f908152601060209081526040808320805460ff19169055600e8252808320839055600f909152812054600d5490919061189a906001906121a0565b90505f600d5f0182815481106118b2576118b26121d9565b5f9182526020808320909101546001600160a01b03908116808452600f90925260408084208790559087168352822091909155600d80549192508291859081106118fe576118fe6121d9565b5f91825260209091200180546001600160a01b0319166001600160a01b0392909216919091179055600d805480611937576119376122b3565b5f8281526020902081015f1990810180546001600160a01b031916905501905550505050565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f600d5f0182815481106119c2576119c26121d9565b5f918252602090912001546001600160a01b031692915050565b5f806119e8848461097a565b6040516370a0823160e01b81523060048201529091505f906001600160a01b038516906370a0823190602401602060405180830381865afa158015611a2f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a53919061214e565b9050808210611a625780611a64565b815b91508115611bf6576001600160a01b038086165f908152600b6020908152604080832093881683529290522054611a9b9083611767565b6001600160a01b038087165f818152600b60209081526040808320948a16835293815283822094909455908152600590925281205460ff16611af4576001600160a01b0385165f90815260076020526040902054611b1a565b6001600160a01b038087165f908152600a60209081526040808320938916835292905220545b90505f611b326064611b2c868561175c565b90611f8e565b60405163a9059cbb60e01b81526001600160a01b038981166004830152602482018390529192509087169063a9059cbb906044016020604051808303815f875af1158015611b82573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ba691906122c7565b50866001600160a01b03167fee503bee2bb6a87e57bc57db795f98137327401a0e7b7ce42e37926cc1a9ca4d82604051611be291815260200190565b60405180910390a2839450505050506109b2565b505f949350505050565b5f81818112156109b2575f80fd5b5f80611c1a83856122e2565b90505f8312158015611c2c5750838112155b80611c4057505f83128015611c4057508381125b6109af575f80fd5b5f80821215611c55575f80fd5b5090565b6001600160a01b0382165f9081526010602052604090205460ff1615611c95576001600160a01b03919091165f908152600e6020526040902055565b6001600160a01b0382165f818152601060209081526040808320805460ff19166001908117909155600e8352818420869055600d8054600f909452918420839055820181559091527fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb50180546001600160a01b03191690911790555050565b6001600160a01b0381165f9081526010602052604081205460ff16611d3b57505f19919050565b506001600160a01b03165f908152600f602052604090205490565b5f80611d628385612309565b90505f8312158015611d745750838113155b80611c4057505f83128015611c4057508381136109af575f80fd5b5f42821115611d9f57505f919050565b601254611dac4284611751565b101592915050565b5f5b6004548110156110f657611e5a611e0a6110578460095f60048781548110611de057611de06121d9565b5f9182526020808320909101546001600160a01b031683528201929092526040019020549061175c565b600c5f60048581548110611e2057611e206121d9565b5f9182526020808320909101546001600160a01b039081168452838201949094526040928301822093891682529290925290205490611d56565b600c5f60048481548110611e7057611e706121d9565b5f9182526020808320909101546001600160a01b039081168452838201949094526040928301822093881682529290925290205580611eae816121ed565b915050611db6565b5f5b6004548110156110f657611f32611ee26110578460095f60048781548110611de057611de06121d9565b600c5f60048581548110611ef857611ef86121d9565b5f9182526020808320909101546001600160a01b039081168452838201949094526040928301822093891682529290925290205490611c0e565b600c5f60048481548110611f4857611f486121d9565b5f9182526020808320909101546001600160a01b039081168452838201949094526040928301822093881682529290925290205580611f86816121ed565b915050611eb8565b5f6109af828461218d565b6001600160a01b038116811461126f575f80fd5b5f8060408385031215611fbe575f80fd5b8235611fc981611f99565b91506020830135611fd981611f99565b809150509250929050565b5f60208284031215611ff4575f80fd5b81356109af81611f99565b5f8060208385031215612010575f80fd5b823567ffffffffffffffff80821115612027575f80fd5b818501915085601f83011261203a575f80fd5b813581811115612048575f80fd5b8660208260051b850101111561205c575f80fd5b60209290920196919550909350505050565b5f6020828403121561207e575f80fd5b5035919050565b5f8060408385031215612096575f80fd5b823591506020830135611fd981611f99565b602080825282518282018190525f9190848201906040850190845b818110156120df578351835292840192918401916001016120c3565b50909695505050505050565b801515811461126f575f80fd5b5f8060408385031215612109575f80fd5b823561211481611f99565b91506020830135611fd9816120eb565b5f8060408385031215612135575f80fd5b823561214081611f99565b946020939093013593505050565b5f6020828403121561215e575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f8261219b5761219b612165565b500490565b818103818111156109b2576109b2612179565b808201808211156109b2576109b2612179565b5f826121d4576121d4612165565b500690565b634e487b7160e01b5f52603260045260245ffd5b5f600182016121fe576121fe612179565b5060010190565b634e487b7160e01b5f52604160045260245ffd5b5f60208284031215612229575f80fd5b81516109af81611f99565b5f60808201868352602060808185015281875180845260a08601915082890193505f5b8181101561227c5784516001600160a01b031683529383019391830191600101612257565b50506001600160a01b039690961660408501525050506060015292915050565b80820281158282048414176109b2576109b2612179565b634e487b7160e01b5f52603160045260245ffd5b5f602082840312156122d7575f80fd5b81516109af816120eb565b8082018281125f83128015821682158216171561230157612301612179565b505092915050565b8181035f831280158383131683831282161715610eb157610eb161217956fea2646970667358221220127dce52561aed9310bb86c3af0057fc3ab22ba29b435c89f6f448c7716a84a564736f6c63430008140033

Deployed Bytecode

0x6080604052600436106102a8575f3560e01c8063871c128d1161016f578063c17b5b8c116100d8578063e98030c711610092578063f242ab411161006d578063f242ab41146108b6578063f2fde38b146108e9578063f8eba5c914610908578063fff4602f14610927575f80fd5b8063e98030c714610869578063ea0cdeff14610888578063ec44acf21461089d575f80fd5b8063c17b5b8c14610795578063cb20beaa146107b4578063d151d9cd146107d3578063dc2f5e48146107f1578063dd62ed3e14610810578063e8cedb2414610854575f80fd5b806395d89b411161012957806395d89b41146106cc57806398faa8ea146106fa5780639ae786af14610719578063a457c2d714610738578063a9059cbb14610757578063c16dd4a414610776575f80fd5b8063871c128d14610616578063879dd3c514610635578063880000341461065357806389824b93146106725780638da5cb5b146106915780638ebfc796146106ad575f80fd5b8063313ce567116102115780634e71d92d116101cb5780634e71d92d1461057457806358fa63ca1461058857806370a082311461059b578063715018a6146105cf5780637fa787ba146105e35780638095d564146105f7575f80fd5b8063313ce567146104be57806339509351146104d25780633ecad271146104f15780633f4218e01461051f57806340fb0b131461054d57806342ab9b2614610555575f80fd5b806318160ddd1161026257806318160ddd146103ee578063232bbdca1461041057806323b872dd1461043e5780632b112e491461045d5780632c1f5216146104715780632e1207aa14610490575f80fd5b806303fd2a45146102b357806306fdde03146102e55780630758d92414610332578063095ea7b3146103655780630f0ceb671461039457806312163785146103b5575f80fd5b366102af57005b5f80fd5b3480156102be575f80fd5b506102c861dead81565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156102f0575f80fd5b5061032560405180604001604052806015815260200174092dcccd2dcd2e8ca409adedccaf2408ed8d2e8c6d605b1b81525081565b6040516102dc91906127a3565b34801561033d575f80fd5b506102c87f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b348015610370575f80fd5b5061038461037f366004612802565b610946565b60405190151581526020016102dc565b34801561039f575f80fd5b506103b36103ae366004612839565b61095c565b005b3480156103c0575f80fd5b50600e54600f546010546103d392919083565b604080519384526020840192909252908201526060016102dc565b3480156103f9575f80fd5b50610402610ad6565b6040519081526020016102dc565b34801561041b575f80fd5b5061038461042a36600461285b565b60086020525f908152604090205460ff1681565b348015610449575f80fd5b50610384610458366004612876565b610af5565b348015610468575f80fd5b50610402610b45565b34801561047c575f80fd5b50600a546102c8906001600160a01b031681565b34801561049b575f80fd5b506103846104aa36600461285b565b60076020525f908152604090205460ff1681565b3480156104c9575f80fd5b50610402601281565b3480156104dd575f80fd5b506103846104ec366004612802565b610bcd565b3480156104fc575f80fd5b5061038461050b36600461285b565b60066020525f908152604090205460ff1681565b34801561052a575f80fd5b5061038461053936600461285b565b60056020525f908152604090205460ff1681565b6103b3610c03565b348015610560575f80fd5b506103b361056f3660046128b4565b610e71565b34801561057f575f80fd5b506103b3610ecc565b348015610593575f80fd5b506102c85f81565b3480156105a6575f80fd5b506104026105b536600461285b565b6001600160a01b03165f9081526003602052604090205490565b3480156105da575f80fd5b506103b3610f40565b3480156105ee575f80fd5b506103b3610f53565b348015610602575f80fd5b506103b36106113660046128eb565b610f9d565b348015610621575f80fd5b506103b3610630366004612914565b611062565b348015610640575f80fd5b5060115461038490610100900460ff1681565b34801561065e575f80fd5b506103b361066d3660046128eb565b611183565b34801561067d575f80fd5b506103b361068c36600461292b565b611302565b34801561069c575f80fd5b505f546001600160a01b03166102c8565b3480156106b8575f80fd5b506103b36106c73660046128b4565b6113ba565b3480156106d7575f80fd5b5061032560405180604001604052806003815260200162494d4760e81b81525081565b348015610705575f80fd5b506103b3610714366004612839565b611415565b348015610724575f80fd5b506103b36107333660046129aa565b6114a1565b348015610743575f80fd5b50610384610752366004612802565b61165e565b348015610762575f80fd5b50610384610771366004612802565b611694565b348015610781575f80fd5b506103b36107903660046128b4565b6116a0565b3480156107a0575f80fd5b506103b36107af3660046128eb565b611743565b3480156107bf575f80fd5b506103b36107ce36600461285b565b6117ff565b3480156107de575f80fd5b50600b54600c54600d546103d392919083565b3480156107fc575f80fd5b506103b361080b366004612839565b611865565b34801561081b575f80fd5b5061040261082a3660046129ca565b6001600160a01b039182165f90815260046020908152604080832093909416825291909152205490565b34801561085f575f80fd5b5061040260015481565b348015610874575f80fd5b506103b3610883366004612914565b6118f6565b348015610893575f80fd5b5061040260025481565b3480156108a8575f80fd5b506011546103849060ff1681565b3480156108c1575f80fd5b506102c87f000000000000000000000000723d2fa64221b4e22706c931140e9c895430dcf281565b3480156108f4575f80fd5b506103b361090336600461285b565b61192f565b348015610913575f80fd5b506103b361092236600461285b565b611969565b348015610932575f80fd5b506103b36109413660046128b4565b6119a3565b5f6109523384846119fe565b5060015b92915050565b610964611b25565b601154610100900460ff1615158115150361099a5760405162461bcd60e51b8152600401610991906129f6565b60405180910390fd5b8015610a8257601054600e54600f545f92916109b591612a54565b6109bf9190612a54565b11610a165760405162461bcd60e51b815260206004820152602160248201527f4552524f523a20546f74616c206f75742066656573206d757374206265203e306044820152602560f81b6064820152608401610991565b600d54600b54600c545f9291610a2b91612a54565b610a359190612a54565b11610a825760405162461bcd60e51b815260206004820181905260248201527f4552524f523a20546f74616c20696e2066656573206d757374206265203e30256044820152606401610991565b601180548215156101000261ff00199091161790556040517fcf5b8994e88702dcc077176517145092990b0e63dd35b64c412961aceb0139da90610acb90831515815260200190565b60405180910390a150565b610ae26012600a612b47565b610af290653f23337fd344612b52565b81565b5f610b01848484611b51565b6001600160a01b0384165f90815260046020908152604080832033808552925290912054610b3b918691610b36908690612b69565b6119fe565b5060019392505050565b60036020527f3617319a054d772f909f7c479a2cebe5066e836a939412e32403c99029b92eff5461dead5f9081527f262bb27bbdd95c1cdc8e16957e36e38579ea44f7f6413dd7a9c75939def06b2c54909190610ba46012600a612b47565b610bb490653f23337fd344612b52565b610bbe9190612b69565b610bc89190612b69565b905090565b335f8181526004602090815260408083206001600160a01b03871684529091528120549091610952918590610b36908690612a54565b610c0b611b25565b60115460ff1615610c715760405162461bcd60e51b815260206004820152602a60248201527f4552524f523a2043616e6e6f74206f70656e2074726164696e67206d6f7265206044820152697468616e206f6e63652160b01b6064820152608401610991565b5f60055f610c865f546001600160a01b031690565b6001600160a01b0316815260208082019290925260409081015f908120805460ff191694151594909417909355805160028082526060820183529092909190830190803683370190505090507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d2e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d529190612b7c565b815f81518110610d6457610d64612b97565b60200260200101906001600160a01b031690816001600160a01b0316815250503081600181518110610d9857610d98612b97565b6001600160a01b0392831660209182029290920101527f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d1663b6f9de95345f84610de95f546001600160a01b031690565b426040518663ffffffff1660e01b8152600401610e099493929190612bed565b5f604051808303818588803b158015610e20575f80fd5b505af1158015610e32573d5f803e3d5ffd5b50506011805464ffff0000ff191664010100000117905550505f80546001600160a01b03168152600560205260409020805460ff191660011790555050565b610e79611b25565b6001600160a01b0382165f81815260086020526040808220805460ff191685151590811790915590519092917f1e66b5fde56c4d8ecb85d64d19db4a0cda78614ba8d21189ecfe2d5d739625da91a35050565b600a5460405163bc4c4b3760e01b81523360048201525f60248201526001600160a01b039091169063bc4c4b37906044016020604051808303815f875af1158015610f19573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f3d9190612c21565b50565b610f48611b25565b610f515f6121c1565b565b610f5b611b25565b604051339047905f81818185875af1925050503d805f8114610f98576040519150601f19603f3d011682016040523d82523d5f602084013e505050565b505050565b610fa5611b25565b601154610100900460ff161580610ff057505f81610fc38486612a54565b610fcd9190612a54565b118015610ff05750610fa081610fe38486612a54565b610fed9190612a54565b11155b61100c5760405162461bcd60e51b815260040161099190612c3c565b600c839055600b829055600d81905560408051848152602081018490529081018290527fd53c6456bc9b86bb998c3caf4c194591aa2be28760be154ae9d142ae25b326b6906060015b60405180910390a1505050565b61106a611b25565b62030d40811015801561108057506207a1208111155b6110e85760405162461bcd60e51b815260206004820152603360248201527f4552524f523a20476173206d757374206265206265747765656e203230302c30604482015272303020616e64203530302c303030205745492160681b6064820152608401610991565b601254810361114e5760405162461bcd60e51b815260206004820152602c60248201527f4552524f523a204e6577206761732076616c7565206d6174636865732065786960448201526b7374696e672076616c75652160a01b6064820152608401610991565b60128190556040518181527fbe808aedc0249fa7c80307e37e5465deced3eddb31d3b8df66884f9c0c074d6f90602001610acb565b61118b611b25565b5f83116111f45760405162461bcd60e51b815260206004820152603160248201527f4552524f523a204c6f776572207468726573686f6c64206d7573742062652067604482015270726561746572207468616e207a65726f2160781b6064820152608401610991565b5f821161125d5760405162461bcd60e51b815260206004820152603160248201527f4552524f523a205570706572207468726573686f6c64206d7573742062652067604482015270726561746572207468616e207a65726f2160781b6064820152608401610991565b808361126b6012600a612b47565b61127b90653f23337fd344612b52565b6112859190612b52565b61128f9190612c85565b60135580826112a06012600a612b47565b6112b090653f23337fd344612b52565b6112ba9190612b52565b6112c49190612c85565b60148190556013546040517fc366ae351d3d7d0b43cdc7dc176c4798fc8a8c0f228b557c26c0c823e37b0f8892611055928252602082015260400190565b61130a611b25565b5f5b82811015611378578160055f86868581811061132a5761132a612b97565b905060200201602081019061133f919061285b565b6001600160a01b0316815260208101919091526040015f20805460ff19169115159190911790558061137081612ca4565b91505061130c565b508015157f7c159dbef063be687bb45fa8314ade451f22a7d65c3c57475f7b80e414178fae84846040516113ad929190612cbc565b60405180910390a2505050565b6113c2611b25565b6001600160a01b0382165f81815260056020526040808220805460ff191685151590811790915590519092917f1341b4f10431dd805adb88f6edc74d4f6f67882e6878cf6aa540f3d97a91a2a391a35050565b61141d611b25565b6011546301000000900460ff1615158115150361144c5760405162461bcd60e51b8152600401610991906129f6565b6011805463ff000000191663010000008315158102919091179182905560405160ff9190920416151581527fec812adf80955811a54e735da9734f7a470923c96c5548fa90a21fb80011731f90602001610acb565b6114a9611b25565b6101f46114b86012600a612b47565b6114c890653f23337fd344612b52565b6114d29190612c85565b8210156115475760405162461bcd60e51b815260206004820152603960248201527f4552524f523a204e65772062616c616e6365207468726573686f6c64206d757360448201527f74206265203e3d302e322520746f74616c20737570706c7921000000000000006064820152608401610991565b6101f46115566012600a612b47565b61156690653f23337fd344612b52565b6115709190612c85565b8110156115e55760405162461bcd60e51b815260206004820152603a60248201527f4552524f523a204e6577207472616e73666572207468726573686f6c64206d7560448201527f7374206265203e3d302e322520746f74616c20737570706c79210000000000006064820152608401610991565b6115f16012600a612b47565b6115fb9083612b52565b60015561160a6012600a612b47565b6116149082612b52565b60028190556001546040517f5be9cf7a1cfe6f06f03895820a324a18e140745c3b9a3c6a9c568473df3f24be92611652928252602082015260400190565b60405180910390a15050565b335f8181526004602090815260408083206001600160a01b03871684529091528120549091610952918590610b36908690612b69565b5f610952338484611b51565b6116a8611b25565b7f000000000000000000000000723d2fa64221b4e22706c931140e9c895430dcf26001600160a01b0316826001600160a01b0316036117355760405162461bcd60e51b815260206004820152602360248201527f4552524f523a2043616e6e6f74206d757461746520636f72652064657820706160448201526269722160e81b6064820152608401610991565b61173f8282612210565b5050565b61174b611b25565b601154610100900460ff16158061179657505f816117698486612a54565b6117739190612a54565b1180156117965750610fa0816117898486612a54565b6117939190612a54565b11155b6117b25760405162461bcd60e51b815260040161099190612c3c565b600f839055600e829055601081905560408051848152602081018490529081018290527f5fe4a516756a6b0cbb71fbad74616e0fe2f7a204a4c74384f78641468a87518a90606001611055565b611807611b25565b600a5460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db0906024015b5f604051808303815f87803b15801561184c575f80fd5b505af115801561185e573d5f803e3d5ffd5b5050505050565b61186d611b25565b601154640100000000900460ff1615158115150361189d5760405162461bcd60e51b8152600401610991906129f6565b601180548215156401000000000264ff00000000199091161790819055604051630100000090910460ff16151581527febac0310d5b9ba7464c127bf2a1f9f862623c65ea1b2502ec2f56e6dd29ea32290602001610acb565b6118fe611b25565b600a5460405163e98030c760e01b8152600481018390526001600160a01b039091169063e98030c790602401611835565b611937611b25565b6001600160a01b03811661196057604051631e4fbdf760e01b81525f6004820152602401610991565b610f3d816121c1565b611971611b25565b600a5460405163c0f306ef60e01b81526001600160a01b0383811660048301529091169063c0f306ef90602401611835565b6119ab611b25565b6001600160a01b0382165f81815260076020526040808220805460ff191685151590811790915590519092917f703e2a1b267e9264efd6afd3df9c45af223ae3edbe88c223021b026ae719a42391a35050565b6001600160a01b038316611a625760405162461bcd60e51b815260206004820152602560248201527f4552524f523a20417070726f76652066726f6d20746865207a65726f20616464604482015264726573732160d81b6064820152608401610991565b6001600160a01b038216611ac45760405162461bcd60e51b815260206004820152602360248201527f4552524f523a20417070726f766520746f20746865207a65726f20616464726560448201526273732160e81b6064820152608401610991565b6001600160a01b038381165f8181526004602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b5f546001600160a01b03163314610f515760405163118cdaa760e01b8152336004820152602401610991565b60115462010000900460ff1615611c01576001600160a01b0383165f9081526003602052604081208054839290611b89908490612b69565b90915550506001600160a01b0382165f9081526003602052604081208054839290611bb5908490612a54565b92505081905550816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611b1891815260200190565b5f546001600160a01b03848116911614801590611c2b57505f546001600160a01b03838116911614155b15611d74576001600160a01b0383165f9081526005602052604090205460ff16158015611c7057506001600160a01b0382165f9081526005602052604090205460ff16155b15611cc75760115460ff16611cc75760405162461bcd60e51b815260206004820152601960248201527f4552524f523a2054726164696e6720697320636c6f73656421000000000000006044820152606401610991565b6001600160a01b0383165f9081526008602052604090205460ff16158015611d0757506001600160a01b0382165f9081526008602052604090205460ff16155b15611d7457600254811115611d745760405162461bcd60e51b815260206004820152602d60248201527f4552524f523a205472616e7366657220616d6f756e742065786365656473206d60448201526c6178696d756d206c696d69742160981b6064820152608401610991565b305f908152600360205260409020546013548110801590611d9e575060115462010000900460ff16155b8015611dc257506001600160a01b0384165f9081526006602052604090205460ff16155b8015611de557506001600160a01b0383165f9081526006602052604090205460ff165b8015611dfa57506011546301000000900460ff165b15611e3157601154640100000000900460ff1615611e28576014548111611e215780611e25565b6014545b90505b611e31816122e9565b6001600160a01b0384165f9081526003602052604081208054849290611e58908490612b69565b90915550506001600160a01b0384165f9081526005602052604081205460ff1680611e9a57506001600160a01b0384165f9081526005602052604090205460ff165b611eae57611ea9858585612622565b611eb0565b825b6001600160a01b0385165f9081526007602052604090205490915060ff16611f58576001546001600160a01b0385165f90815260036020526040902054611ef8908390612a54565b1115611f585760405162461bcd60e51b815260206004820152602960248201527f4552524f523a204e65772062616c616e63652065786365656473206d6178696d604482015268756d206c696d69742160b81b6064820152608401610991565b6001600160a01b0384165f9081526003602052604081208054839290611f7f908490612a54565b92505081905550836001600160a01b0316856001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611fcb91815260200190565b60405180910390a3600a546001600160a01b031663e30443bc86612003816001600160a01b03165f9081526003602052604090205490565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044015f604051808303815f87803b158015612046575f80fd5b505af1158015612058573d5f803e3d5ffd5b5050600a546001600160a01b0316915063e30443bc90508561208e816001600160a01b03165f9081526003602052604090205490565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044015f604051808303815f87803b1580156120d1575f80fd5b505af11580156120e3573d5f803e3d5ffd5b505050505f601254111561185e57600a546012546040516001624d3b8760e01b031981526001600160a01b039092169163ffb2c479916121299160040190815260200190565b6060604051808303815f875af1925050508015612163575060408051601f3d908101601f1916820190925261216091810190612d09565b60015b1561185e57601254604080518581526020810185905280820184905260608101929092525132916001917fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989181900360800190a35050505050505050565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b0382165f90815260066020908152604080832080548515801560ff19928316811790935560079094529190932080549091169092179091556122ae57600a5460405163031e79db60e41b81526001600160a01b038481166004830152909116906331e79db0906024015f604051808303815f87803b158015612297575f80fd5b505af11580156122a9573d5f803e3d5ffd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab905f90a35050565b6011805462ff0000191662010000179055601054600f54600e54600d54600c54600b545f959493929161231b91612a54565b6123259190612a54565b61232f9190612a54565b6123399190612a54565b6123439190612a54565b601054600d549192505f916123589084612b69565b6123629190612b69565b601054600d549192505f91849161237891612a54565b6123829086612b52565b61238c9190612c85565b90505f6123998286612b69565b6040805160028082526060820183529293505f92909160208301908036833701905050905030815f815181106123d1576123d1612b97565b60200260200101906001600160a01b031690816001600160a01b0316815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801561244d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124719190612b7c565b8160018151811061248457612484612b97565b6001600160a01b03928316602091820292909201015260405163791ac94760e01b81527f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d9091169063791ac947906124e89085905f90869030904290600401612d34565b5f604051808303815f87803b1580156124ff575f80fd5b505af1925050508015612510575060015b1561260157600a54600e54600b546001600160a01b0390921691869161253591612a54565b61253f9047612b52565b6125499190612c85565b6040515f81818185875af1925050503d805f8114612582576040519150601f19603f3d011682016040523d82523d5f602084013e612587565b606091505b5050600954600f54600c546001600160a01b03909216925086916125ab9190612a54565b6125b59047612b52565b6125bf9190612c85565b6040515f81818185875af1925050503d805f81146125f8576040519150601f19603f3d011682016040523d82523d5f602084013e6125fd565b606091505b5050505b61260e3061dead85611b51565b50506011805462ff00001916905550505050565b6011545f908190610100900460ff1615612790576001600160a01b0385165f9081526006602052604090205460ff16156126b057600d54600c54600b547f0000000000000000000000000000000000000000000000000000000000002710929161268b91612a54565b6126959190612a54565b61269f9085612b52565b6126a99190612c85565b9050612726565b6001600160a01b0384165f9081526006602052604090205460ff161561272657601054600f54600e547f0000000000000000000000000000000000000000000000000000000000002710929161270591612a54565b61270f9190612a54565b6127199085612b52565b6127239190612c85565b90505b801561279057305f908152600360205260408120805483929061274a908490612a54565b909155505060405181815230906001600160a01b038716907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35b61279a8184612b69565b95945050505050565b5f6020808352835180828501525f5b818110156127ce578581018301518582016040015282016127b2565b505f604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114610f3d575f80fd5b5f8060408385031215612813575f80fd5b823561281e816127ee565b946020939093013593505050565b8015158114610f3d575f80fd5b5f60208284031215612849575f80fd5b81356128548161282c565b9392505050565b5f6020828403121561286b575f80fd5b8135612854816127ee565b5f805f60608486031215612888575f80fd5b8335612893816127ee565b925060208401356128a3816127ee565b929592945050506040919091013590565b5f80604083850312156128c5575f80fd5b82356128d0816127ee565b915060208301356128e08161282c565b809150509250929050565b5f805f606084860312156128fd575f80fd5b505081359360208301359350604090920135919050565b5f60208284031215612924575f80fd5b5035919050565b5f805f6040848603121561293d575f80fd5b833567ffffffffffffffff80821115612954575f80fd5b818601915086601f830112612967575f80fd5b813581811115612975575f80fd5b8760208260051b8501011115612989575f80fd5b6020928301955093505084013561299f8161282c565b809150509250925092565b5f80604083850312156129bb575f80fd5b50508035926020909101359150565b5f80604083850312156129db575f80fd5b82356129e6816127ee565b915060208301356128e0816127ee565b6020808252602a908201527f4552524f523a204e657720737461747573206d617463686573206578697374696040820152696e67207374617475732160b01b606082015260800190565b634e487b7160e01b5f52601160045260245ffd5b8082018082111561095657610956612a40565b600181815b80851115612aa157815f1904821115612a8757612a87612a40565b80851615612a9457918102915b93841c9390800290612a6c565b509250929050565b5f82612ab757506001610956565b81612ac357505f610956565b8160018114612ad95760028114612ae357612aff565b6001915050610956565b60ff841115612af457612af4612a40565b50506001821b610956565b5060208310610133831016604e8410600b8410161715612b22575081810a610956565b612b2c8383612a67565b805f1904821115612b3f57612b3f612a40565b029392505050565b5f6128548383612aa9565b808202811582820484141761095657610956612a40565b8181038181111561095657610956612a40565b5f60208284031215612b8c575f80fd5b8151612854816127ee565b634e487b7160e01b5f52603260045260245ffd5b5f8151808452602080850194508084015f5b83811015612be25781516001600160a01b031687529582019590820190600101612bbd565b509495945050505050565b848152608060208201525f612c056080830186612bab565b6001600160a01b03949094166040830152506060015292915050565b5f60208284031215612c31575f80fd5b81516128548161282c565b60208082526029908201527f4552524f523a20546f74616c2066656573206d757374206265203e302520616e60408201526864203c3d203430252160b81b606082015260800190565b5f82612c9f57634e487b7160e01b5f52601260045260245ffd5b500490565b5f60018201612cb557612cb5612a40565b5060010190565b60208082528181018390525f908460408401835b86811015612cfe578235612ce3816127ee565b6001600160a01b031682529183019190830190600101612cd0565b509695505050505050565b5f805f60608486031215612d1b575f80fd5b8351925060208401519150604084015190509250925092565b85815284602082015260a060408201525f612d5260a0830186612bab565b6001600160a01b039490941660608301525060800152939250505056fea2646970667358221220c6d150952e681ea6b06bb13beff3179a397374d042e3186ab4297c75f58ca4de64736f6c63430008140033

Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.