ETH Price: $3,479.00 (+0.75%)

Token

BABYFLOKI (BFLOKI)
 

Overview

Max Total Supply

1,000,000,000 BFLOKI

Holders

30

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
0.026641173606001694 BFLOKI

Value
$0.00
0x466e9aAc309E98896244079a73a3868F92448a0F
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:
BABYFLOKI

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-01-03
*/

/**
BABYFLOKI SmartContract 
*/

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

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

    function _msgData() internal view virtual returns (bytes memory) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

interface IUniswapV2Pair {
    event Approval(address indexed owner, address indexed spender, uint256 value);
    event Transfer(address indexed from, address indexed to, uint256 value);

    function name() external pure returns (string memory);
    function symbol() external pure returns (string memory);
    function decimals() external pure returns (uint8);
    function totalSupply() external view returns (uint256);
    function balanceOf(address owner) external view returns (uint256);
    function allowance(address owner, address spender) external view returns (uint256);
    function approve(address spender, uint256 value) external returns (bool);
    function transfer(address to, uint256 value) external returns (bool);
    function transferFrom(address from, address to, uint256 value) external returns (bool);
    function DOMAIN_SEPARATOR() external view returns (bytes32);
    function PERMIT_TYPEHASH() external pure returns (bytes32);
    function nonces(address owner) external view returns (uint256);

    function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v,
                    bytes32 r, bytes32 s) external;

    event Mint(address indexed sender, uint256 amount0, uint256 amount1);
    event Burn(address indexed sender, uint256 amount0, uint256 amount1, address indexed to);
    event Swap(address indexed sender, uint256 amount0In, uint256 amount1In, uint256 amount0Out,
               uint256 amount1Out, address indexed to);
    event Sync(uint112 reserve0, uint112 reserve1);

    function MINIMUM_LIQUIDITY() external pure returns (uint256);
    function factory() external view returns (address);
    function token0() external view returns (address);
    function token1() external view returns (address);
    function getReserves() external view returns (uint112 reserve0, uint112 reserve1,
                                                  uint32 blockTimestampLast);

    function price0CumulativeLast() external view returns (uint256);
    function price1CumulativeLast() external view returns (uint256);
    function kLast() external view returns (uint256);
    function mint(address to) external returns (uint256 liquidity);
    function burn(address to) external returns (uint256 amount0, uint256 amount1);

    function swap(uint256 amount0Out, uint256 amount1Out, address to, bytes calldata data) external;
    function skim(address to) external;
    function sync() external;
    function initialize(address, address) external;
}

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

    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(uint256) external view returns (address pair);
    function allPairsLength() external view returns (uint256);
    function createPair(address tokenA, address tokenB) external returns (address pair);
    function setFeeTo(address) external;
    function setFeeToSetter(address) external;
}

interface IERC20 {
    function totalSupply() external view returns (uint256);
    function balanceOf(address account) external view returns (uint256);
    function transfer(address recipient, uint256 amount) external returns (bool);
    function allowance(address owner, address spender) external view returns (uint256);
    function approve(address spender, uint256 amount) external returns (bool);
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);

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

interface IERC20Metadata is IERC20 {
    function name() external view returns (string memory);
    function symbol() external view returns (string memory);
    function decimals() external view returns (uint8);
}

contract ERC20 is Context, IERC20, IERC20Metadata {
    using SafeMath for uint256;

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

    uint256 internal _totalSupply;

    string private _name;
    string private _symbol;

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    function name() public view virtual override returns (string memory) {
        return _name;
    }

    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

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

    function totalSupply() public view virtual override returns (uint256) {
        return _totalSupply;
    }

    function balanceOf(address account) public view virtual override returns (uint256) {
        return _balances[account];
    }

    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

    function allowance(address owner, address spender) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }

    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount,
                "ERC20: transfer amount exceeds allowance"));
        return true;
    }

    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));
        return true;
    }

    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue,
                "ERC20: decreased allowance below zero"));
        return true;
    }

    function _transfer(address sender, address recipient, uint256 amount) internal virtual {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(sender, recipient, amount);

        _balances[sender] = _balances[sender].sub(amount,"ERC20: transfer amount exceeds balance");
        _balances[recipient] = _balances[recipient].add(amount);
        emit Transfer(sender, recipient, amount);
    }

    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

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

        _totalSupply = _totalSupply.add(amount);
        _balances[account] = _balances[account].add(amount);
        emit Transfer(address(0), account, amount);
    }

    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

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

        _balances[account] = _balances[account].sub(amount,"ERC20: burn amount exceeds balance");
        _totalSupply = _totalSupply.sub(amount);
        emit Transfer(account, address(0), amount);
    }

    function _approve(address owner, address spender, uint256 amount) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

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

    function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual {}
}

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

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

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

library SafeMath {
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");
        return c;
    }

    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

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

    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");
        return c;
    }

    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold
        return c;
    }

    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

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

contract Ownable is Context {
    address private _owner;

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

    constructor() {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

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

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

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

    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0),"Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

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 IUniswapV2Router01 {
    function factory() external pure returns (address);

    function WETH() external pure returns (address);

    function addLiquidity(address tokenA, address tokenB, uint256 amountADesired, uint256 amountBDesired,
                          uint256 amountAMin, uint256 amountBMin, address to, 
                          uint256 deadline) external returns (uint256 amountA, uint256 amountB, uint256 liquidity);

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

    function removeLiquidity(address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin,
                             uint256 amountBMin, address to, uint256 deadline) external 
                             returns (uint256 amountA, uint256 amountB);

    function removeLiquidityETH(address token, uint256 liquidity, uint256 amountTokenMin,
                                uint256 amountETHMin, address to, uint256 deadline) external 
                                returns (uint256 amountToken, uint256 amountETH);

    function removeLiquidityWithPermit(address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin,
                                       uint256 amountBMin, address to, uint256 deadline, bool approveMax,
                                       uint8 v, bytes32 r, bytes32 s) external 
                                       returns (uint256 amountA, uint256 amountB);

    function removeLiquidityETHWithPermit(address token, uint256 liquidity, uint256 amountTokenMin,
                                          uint256 amountETHMin, address to, uint256 deadline, bool approveMax,
                                          uint8 v, bytes32 r, bytes32 s) external 
                                          returns (uint256 amountToken, uint256 amountETH);

    function swapExactTokensForTokens(uint256 amountIn, uint256 amountOutMin, address[] calldata path,
                                      address to, uint256 deadline) external 
                                      returns (uint256[] memory amounts);

    function swapTokensForExactTokens(uint256 amountOut, uint256 amountInMax, address[] calldata path,
                                      address to, uint256 deadline) external 
                                      returns (uint256[] memory amounts);

    function swapExactETHForTokens(uint256 amountOutMin, address[] calldata path, address to, 
                                   uint256 deadline) external payable returns (uint256[] memory amounts);

    function swapTokensForExactETH(uint256 amountOut, uint256 amountInMax, address[] calldata path,
                                   address to, uint256 deadline) external returns (uint256[] memory amounts);

    function swapExactTokensForETH(uint256 amountIn, uint256 amountOutMin, address[] calldata path,
                                   address to, uint256 deadline) external returns (uint256[] memory amounts);

    function swapETHForExactTokens(uint256 amountOut, address[] calldata path, address to,
                                   uint256 deadline) external payable returns (uint256[] memory amounts);

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

interface IUniswapV2Router02 is IUniswapV2Router01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(address token, uint256 liquidity, uint256 amountTokenMin,
                                                             uint256 amountETHMin, address to, uint256 deadline) 
                                                             external returns (uint256 amountETH);

    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(address token, uint256 liquidity, uint256 amountTokenMin,
                                                                       uint256 amountETHMin, address to, uint256 deadline,
                                                                       bool approveMax, uint8 v, bytes32 r, bytes32 s) 
                                                                       external returns (uint256 amountETH);

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

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

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

contract DividendPayingToken is ERC20, DividendPayingTokenInterface, DividendPayingTokenOptionalInterface
{
    using SafeMath for uint256;
    using SafeMathUint for uint256;
    using SafeMathInt for int256;

    uint256 internal constant magnitude = 2**128;

    uint256 internal magnifiedDividendPerShare;

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

    uint256 public totalDividendsDistributed;

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

    receive() external payable {
        distributeDividends();
    }

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

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

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

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

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

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

            return _withdrawableDividend;
        }

        return 0;
    }

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

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

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

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

    function _transfer(address from, address to, uint256 value) internal virtual override {
        require(false);

        int256 _magCorrection = magnifiedDividendPerShare.mul(value).toInt256Safe();
        magnifiedDividendCorrections[from] = magnifiedDividendCorrections[from].add(_magCorrection);
        magnifiedDividendCorrections[to] = magnifiedDividendCorrections[to].sub(_magCorrection);
    }

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

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

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

        magnifiedDividendCorrections[account] = magnifiedDividendCorrections[account]
        .add((magnifiedDividendPerShare.mul(value)).toInt256Safe());
    }

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

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

contract BABYFLOKI is ERC20, Ownable {
    using SafeMath for uint256;

    IUniswapV2Router02 public uniswapV2Router;

    address public uniswapV2Pair;
    address public DEAD = 0x000000000000000000000000000000000000dEaD;
    bool private swapping;
    bool public tradingEnabled = false;

    uint256 public sellAmount = 1;
    uint256 public buyAmount = 1;

    uint256 private totalSellFees;
    uint256 private totalBuyFees;

    BABYFLOKIDividendTracker public dividendTracker;

    address payable public marketingWallet;
    address payable public devWallet;

    // Max tx, dividend threshold and tax variables
    uint256 public maxWallet;
    uint256 public maxTX;
    uint256 public swapTokensAtAmount;
    uint256 public sellRewardsFee;
    uint256 public sellDeadFees;
    uint256 public sellMarketingFees;
    uint256 public sellLiquidityFee;
    uint256 public buyDeadFees;
    uint256 public buyMarketingFees;
    uint256 public buyLiquidityFee;
    uint256 public buyRewardsFee;
    uint256 public buyDevFee;
    uint256 public sellDevFee;
    uint256 public transferFee;

    bool public swapAndLiquifyEnabled = true;

    // gas for processing auto claim dividends 
    uint256 public gasForProcessing = 300000;

    // exlcude from fees and limits
    mapping(address => bool) private _isExcludedFromFees;

    mapping(address => bool) public automatedMarketMakerPairs;

    //for allowing specific address to trade while trading has not been enabled yet 
    mapping(address => bool) private canTransferBeforeTradingIsEnabled;

    // Limit variables for bot protection
    bool public limitsInEffect = true; //boolean used to turn limits on and off
    uint256 private gasPriceLimit; 
    mapping(address => uint256) private _holderLastTransferBlock; // for 1 tx per block
    mapping(address => uint256) private _holderLastTransferTimestamp; // for sell cooldown timer
    uint256 public launchblock;
    uint256 public launchtimestamp;
    uint256 public delay;
    uint256 public cooldowntimer = 60; //default cooldown 60s

    event EnableSwapAndLiquify(bool enabled);
    event SetPreSaleWallet(address wallet);
    event UpdateDividendTracker(address indexed newAddress, address indexed oldAddress);
    event UpdateUniswapV2Router(address indexed newAddress, address indexed oldAddress);
    event TradingEnabled();
    event UpdateFees(uint256 sellDeadFees, uint256 sellMarketingFees, uint256 sellLiquidityFee, uint256 sellRewardsFee,
                     uint256 buyDeadFees, uint256 buyMarketingFees, uint256 buyLiquidityFee, uint256 buyRewardsFee,
                     uint256 buyDevFee, uint256 sellDevFee);

    event UpdateTransferFee(uint256 transferFee);
    event Airdrop(address holder, uint256 amount);
    event ExcludeFromFees(address indexed account, bool isExcluded);
    event SetAutomatedMarketMakerPair(address indexed pair, bool indexed value);
    event GasForProcessingUpdated(uint256 indexed newValue, uint256 indexed oldValue);
    event SwapAndLiquify(uint256 tokensSwapped, uint256 ethReceived, uint256 tokensIntoLiqudity);
    event SendDividends(uint256 amount, uint256 opAmount, bool success);
    event ProcessedDividendTracker(uint256 iterations, uint256 claims, uint256 lastProcessedIndex,
                                   bool indexed automatic, uint256 gas, address indexed processor);

    event UpdatePayoutToken(address token);

    constructor() ERC20("BABYFLOKI", "BFLOKI") {
        marketingWallet = payable(0xBAE86799881d0d1960Fb4a5844E7dE75eFdfA030);
        devWallet = payable(0xFdEaEe219e2D3935e8266CbFF4A33d732Ce3AF1C);
        address router = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D;

        buyDeadFees = 0;
        sellDeadFees = 0;
        buyMarketingFees = 3;
        sellMarketingFees = 30;
        buyLiquidityFee = 1;
        sellLiquidityFee = 0;
        buyRewardsFee = 0;
        sellRewardsFee = 0;
        buyDevFee = 2;
        sellDevFee = 0;
        transferFee = 0;

        totalBuyFees = buyRewardsFee.add(buyLiquidityFee).add(buyMarketingFees).add(buyDevFee);
        totalSellFees = sellRewardsFee.add(sellLiquidityFee).add(sellMarketingFees).add(sellDevFee);

        dividendTracker = new BABYFLOKIDividendTracker(payable(this), router, 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48,
                                                   "BABYFLOKITRACKER", "BFLOKITRACKER");

        uniswapV2Router = IUniswapV2Router02(router);
        // Create a uniswap pair for this new token
        uniswapV2Pair = IUniswapV2Factory(uniswapV2Router.factory()).createPair(
                address(this),
                uniswapV2Router.WETH()
            );

        _setAutomatedMarketMakerPair(uniswapV2Pair, true);

        // exclude from receiving dividends
        dividendTracker.excludeFromDividends(address(dividendTracker));
        dividendTracker.excludeFromDividends(address(this));
        dividendTracker.excludeFromDividends(DEAD);
        dividendTracker.excludedFromDividends(address(0));
        dividendTracker.excludeFromDividends(router);
        dividendTracker.excludeFromDividends(marketingWallet);
        dividendTracker.excludeFromDividends(owner());

        // exclude from paying fees or having max transaction amount
        _isExcludedFromFees[address(this)] = true;
        _isExcludedFromFees[address(dividendTracker)] = true;
        _isExcludedFromFees[address(marketingWallet)] = true;
        _isExcludedFromFees[address(devWallet)] = true;
        _isExcludedFromFees[msg.sender] = true;

        uint256 totalTokenSupply = (1_000_000_000) * (10**18);
        _mint(owner(), totalTokenSupply); // only time internal mint function is ever called is to create supply
        swapTokensAtAmount = totalTokenSupply / 2000; // 0.05%;
        canTransferBeforeTradingIsEnabled[owner()] = true;
        canTransferBeforeTradingIsEnabled[address(this)] = true;
    }

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

    receive() external payable {}

    // writeable function to enable trading, can only enable, trading can never be disabled
    function enableTrading(uint256 initialMaxGwei, uint256 initialMaxWallet, uint256 initialMaxTX,
                           uint256 setDelay) external onlyOwner {
        initialMaxWallet = initialMaxWallet * (10**18);
        initialMaxTX = initialMaxTX * (10**18);
        require(!tradingEnabled);
        require(initialMaxWallet >= _totalSupply / 1000,"cannot set below 0.1%");
        require(initialMaxTX >= _totalSupply / 1000,"cannot set below 0.1%");
        maxWallet = initialMaxWallet;
        maxTX = initialMaxTX;
        gasPriceLimit = initialMaxGwei * 1 gwei;
        tradingEnabled = true;
        launchblock = block.number;
        launchtimestamp = block.timestamp;
        delay = setDelay;
        emit TradingEnabled();
    }
    // use for pre sale wallet, adds all exclusions to it
    function setPresaleWallet(address wallet) external onlyOwner {
        canTransferBeforeTradingIsEnabled[wallet] = true;
        _isExcludedFromFees[wallet] = true;
        dividendTracker.excludeFromDividends(wallet);
        emit SetPreSaleWallet(wallet);
    }
    
    // exclude a wallet from fees 
    function setExcludeFees(address account, bool excluded) public onlyOwner {
        _isExcludedFromFees[account] = excluded;
        emit ExcludeFromFees(account, excluded);
    }

    // exclude from dividends (rewards)
    function setExcludeDividends(address account) public onlyOwner {
        dividendTracker.excludeFromDividends(account);
    }

    // include in dividends 
    function setIncludeDividends(address account) public onlyOwner {
        dividendTracker.includeFromDividends(account);
        dividendTracker.setBalance(account, balanceOf(account));
    }

    //allow a wallet to trade before trading enabled
    function setCanTransferBefore(address wallet, bool enable) external onlyOwner {
        canTransferBeforeTradingIsEnabled[wallet] = enable;
    }

    // turn limits on and off
    function setLimitsInEffect(bool value) external onlyOwner {
        limitsInEffect = value;
    }

    // set max GWEI
    function setGasPriceLimit(uint256 GWEI) external onlyOwner {
        require(GWEI >= 50, "can never be set lower than 50");
        gasPriceLimit = GWEI * 1 gwei;
    }

    // set cooldown timer, can only be between 0 and 300 seconds (5 mins max)
    function setcooldowntimer(uint256 value) external onlyOwner {
        require(value <= 300, "cooldown timer cannot exceed 5 minutes");
        cooldowntimer = value;
    }

    // set max wallet, can not be lower than 0.1% of supply
    function setmaxWallet(uint256 value) external onlyOwner {
        value = value * (10**18);
        require(value >= _totalSupply / 1000, "max wallet cannot be set to less than 0.1%");
        maxWallet = value;
    }

    // set max tx, can not be lower than 0.1% of supply
    function setmaxTX(uint256 value) external onlyOwner {
        value = value * (10**18);
        require(value >= _totalSupply / 1000, "max tx cannot be set to less than 0.1%");
        maxTX = value;
    }

    // rewards threshold
    function setSwapTriggerAmount(uint256 amount) public onlyOwner {
        swapTokensAtAmount = amount * (10**18);
    }

    function enableSwapAndLiquify(bool enabled) public onlyOwner {
        require(swapAndLiquifyEnabled != enabled);
        swapAndLiquifyEnabled = enabled;
        emit EnableSwapAndLiquify(enabled);
    }

    function setAutomatedMarketMakerPair(address pair, bool value) public onlyOwner {
        _setAutomatedMarketMakerPair(pair, value);
    }

    function setAllowCustomTokens(bool allow) public onlyOwner {
        dividendTracker.setAllowCustomTokens(allow);
    }

    function setAllowAutoReinvest(bool allow) public onlyOwner {
        dividendTracker.setAllowAutoReinvest(allow);
    }

    function _setAutomatedMarketMakerPair(address pair, bool value) private {
        automatedMarketMakerPairs[pair] = value;

        if (value) {
            dividendTracker.excludeFromDividends(pair);
        }

        emit SetAutomatedMarketMakerPair(pair, value);
    }

    function updateGasForProcessing(uint256 newValue) public onlyOwner {
        require(newValue >= 200000 && newValue <= 2000000);
        emit GasForProcessingUpdated(newValue, gasForProcessing);
        gasForProcessing = newValue;
    }

    function transferAdmin(address newOwner) public onlyOwner {
        dividendTracker.excludeFromDividends(newOwner);
        _isExcludedFromFees[newOwner] = true;
        transferOwnership(newOwner);
    }

    function updateTransferFee(uint256 newTransferFee) public onlyOwner {
        require (newTransferFee <= 10, "transfer fee cannot exceed 10%");
        transferFee = newTransferFee;
        emit UpdateTransferFee(transferFee);
    }

    function updateFees(uint256 deadBuy, uint256 deadSell, uint256 marketingBuy, uint256 marketingSell,
                        uint256 liquidityBuy, uint256 liquiditySell, uint256 RewardsBuy, uint256 RewardsSell,
                        uint256 devBuy, uint256 devSell) public onlyOwner {
        
        buyDeadFees = deadBuy;
        buyMarketingFees = marketingBuy;
        buyLiquidityFee = liquidityBuy;
        buyRewardsFee = RewardsBuy;
        sellDeadFees = deadSell;
        sellMarketingFees = marketingSell;
        sellLiquidityFee = liquiditySell;
        sellRewardsFee = RewardsSell;
        buyDevFee = devBuy;
        sellDevFee = devSell;

        totalSellFees = sellRewardsFee.add(sellLiquidityFee).add(sellMarketingFees).add(sellDevFee);

        totalBuyFees = buyRewardsFee.add(buyLiquidityFee).add(buyMarketingFees).add(buyDevFee);

        require(totalSellFees <= 35 && totalBuyFees <= 17, "total fees cannot exceed 35% sell or 17% buy");

        emit UpdateFees(sellDeadFees, sellMarketingFees, sellLiquidityFee, sellRewardsFee, buyDeadFees,
                        buyMarketingFees, buyLiquidityFee, buyRewardsFee, buyDevFee, sellDevFee);
    }

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

    function isExcludedFromFees(address account) public view returns (bool) {
        return _isExcludedFromFees[account];
    }

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

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

    function getAccountDividendsInfo(address account) external view returns (address, int256, int256, uint256,
                                                                             uint256, uint256) {
        return dividendTracker.getAccount(account);
    }

    function getAccountDividendsInfoAtIndex(uint256 index) external view returns (address, int256, int256,
                                                                                  uint256, uint256, uint256) {
        return dividendTracker.getAccountAtIndex(index);
    }

    function processDividendTracker(uint256 gas) external {
        (uint256 iterations, uint256 claims, uint256 lastProcessedIndex) = dividendTracker.process(gas);
        emit ProcessedDividendTracker(iterations, claims, lastProcessedIndex, false, gas, tx.origin);
    }

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

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

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

    function setAutoClaim(bool value) external {
        dividendTracker.setAutoClaim(msg.sender, value);
    }

    function setReinvest(bool value) external {
        dividendTracker.setReinvest(msg.sender, value);
    }

    function setDividendsPaused(bool value) external onlyOwner {
        dividendTracker.setDividendsPaused(value);
    }

    function isExcludedFromAutoClaim(address account) external view returns (bool) {
        return dividendTracker.isExcludedFromAutoClaim(account);
    }

    function isReinvest(address account) external view returns (bool) {
        return dividendTracker.isReinvest(account);
    }

    function _transfer(address from, address to, uint256 amount) internal override {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");
        uint256 RewardsFee;
        uint256 deadFees;
        uint256 marketingFees;
        uint256 liquidityFee;
        uint256 devFees;

        if (!canTransferBeforeTradingIsEnabled[from]) {
            require(tradingEnabled, "Trading has not yet been enabled");
        }
        if (amount == 0) {
            super._transfer(from, to, 0);
            return;
        } 
        
        else if (!swapping && !_isExcludedFromFees[from] && !_isExcludedFromFees[to]) {
            bool isSelling = automatedMarketMakerPairs[to];
            bool isBuying = automatedMarketMakerPairs[from];

            if (!isBuying && !isSelling) {
                if (!_isExcludedFromFees[from] && !_isExcludedFromFees[to]) {
                    uint256 tFees = amount.mul(transferFee).div(100);
                    amount = amount.sub(tFees);
                    super._transfer(from, address(this), tFees);
                    super._transfer(from, to, amount);
                    dividendTracker.setBalance(from, balanceOf(from));
                    dividendTracker.setBalance(to, balanceOf(to));
                    return;
                }
                else {
                    super._transfer(from, to, amount);
                    dividendTracker.setBalance(from, balanceOf(from));
                    dividendTracker.setBalance(to, balanceOf(to));
                    return;
                }
            }

            else if (isSelling) {
                RewardsFee = sellRewardsFee;
                deadFees = sellDeadFees;
                marketingFees = sellMarketingFees;
                liquidityFee = sellLiquidityFee;
                devFees = sellDevFee;

                if (limitsInEffect) {
                require(block.timestamp >= _holderLastTransferTimestamp[tx.origin] + cooldowntimer,
                        "cooldown period active");
                require(amount <= maxTX,"above max transaction limit");
                _holderLastTransferTimestamp[tx.origin] = block.timestamp;

                }

            } else if (isBuying) {
                RewardsFee = buyRewardsFee;
                deadFees = buyDeadFees;
                marketingFees = buyMarketingFees;
                liquidityFee = buyLiquidityFee;
                devFees = buyDevFee;

                if (limitsInEffect) {
                require(block.timestamp > launchtimestamp + delay,"you shall not pass");
                require(tx.gasprice <= gasPriceLimit,"Gas price exceeds limit.");
                require(_holderLastTransferBlock[tx.origin] != block.number,"Too many TX in block");
                require(amount <= maxTX,"above max transaction limit");
                _holderLastTransferBlock[tx.origin] = block.number;
            }
            
            uint256 contractBalanceRecipient = balanceOf(to);
            require(contractBalanceRecipient + amount <= maxWallet,"Exceeds maximum wallet token amount." );
            }

            uint256 totalFees = RewardsFee.add(liquidityFee + marketingFees + devFees);

            uint256 contractTokenBalance = balanceOf(address(this));

            bool canSwap = contractTokenBalance >= swapTokensAtAmount;

            if (canSwap && isSelling) {
                swapping = true;

                if (swapAndLiquifyEnabled && liquidityFee > 0 && totalBuyFees > 0) {
                    uint256 totalBuySell = buyAmount.add(sellAmount);
                    uint256 swapAmountBought = contractTokenBalance.mul(buyAmount).div(totalBuySell);
                    uint256 swapAmountSold = contractTokenBalance.mul(sellAmount).div(totalBuySell);
                    uint256 swapBuyTokens = swapAmountBought.mul(liquidityFee).div(totalBuyFees);
                    uint256 swapSellTokens = swapAmountSold.mul(liquidityFee).div(totalSellFees);
                    uint256 swapTokens = swapSellTokens.add(swapBuyTokens);

                    swapAndLiquify(swapTokens);
                }

                uint256 remainingBalance = balanceOf(address(this));
                swapAndSendDividends(remainingBalance);
                buyAmount = 1;
                sellAmount = 1;
                swapping = false;
            }

            uint256 fees = amount.mul(totalFees).div(100);
            uint256 burntokens;

            if (deadFees > 0) {
            burntokens = amount.mul(deadFees) / 100;
            super._transfer(from, DEAD, burntokens);
            _totalSupply = _totalSupply.sub(burntokens);

            }

            amount = amount.sub(fees + burntokens);

            if (isSelling) {
                sellAmount = sellAmount.add(fees);
            } 
            else {
                buyAmount = buyAmount.add(fees);
            }

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

            uint256 gas = gasForProcessing;

            try dividendTracker.process(gas) returns (uint256 iterations, uint256 claims, uint256 lastProcessedIndex) {
                emit ProcessedDividendTracker(iterations, claims, lastProcessedIndex, true, gas, tx.origin);
            } catch {}
        }

        super._transfer(from, to, amount);
        dividendTracker.setBalance(from, balanceOf(from));
        dividendTracker.setBalance(to, balanceOf(to));
    }

    function swapAndLiquify(uint256 tokens) private {
        uint256 half = tokens.div(2);
        uint256 otherHalf = tokens.sub(half);
        uint256 initialBalance = address(this).balance;
        swapTokensForEth(half); // <- this breaks the ETH -> HATE swap when swap+liquify is triggered
        uint256 newBalance = address(this).balance.sub(initialBalance);
        addLiquidity(otherHalf, newBalance);
        emit SwapAndLiquify(half, newBalance, otherHalf);
    }

    function swapTokensForEth(uint256 tokenAmount) private {
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();
        _approve(address(this), address(uniswapV2Router), tokenAmount);
        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0, // accept any amount of ETH
            path,
            address(this),
            block.timestamp
        );
    }

    function updatePayoutToken(address token) public onlyOwner {
        dividendTracker.updatePayoutToken(token);
        emit UpdatePayoutToken(token);
    }

    function getPayoutToken() public view returns (address) {
        return dividendTracker.getPayoutToken();
    }

    function setMinimumTokenBalanceForAutoDividends(uint256 value) public onlyOwner {
        dividendTracker.setMinimumTokenBalanceForAutoDividends(value);
    }

    function setMinimumTokenBalanceForDividends(uint256 value) public onlyOwner {
        dividendTracker.setMinimumTokenBalanceForDividends(value);
    }

    function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private {
        // approve token transfer to cover all possible scenarios
        _approve(address(this), address(uniswapV2Router), tokenAmount);

        // add the liquidity
        uniswapV2Router.addLiquidityETH{value: ethAmount}(
            address(this),
            tokenAmount,
            0, // slippage is unavoidable
            0, // slippage is unavoidable
            owner(),
            block.timestamp
        );
    }

    function forceSwapAndSendDividends(uint256 tokens) public onlyOwner {
        tokens = tokens * (10**18);
        uint256 totalAmount = buyAmount.add(sellAmount);
        uint256 fromBuy = tokens.mul(buyAmount).div(totalAmount);
        uint256 fromSell = tokens.mul(sellAmount).div(totalAmount);

        swapAndSendDividends(tokens);

        buyAmount = buyAmount.sub(fromBuy);
        sellAmount = sellAmount.sub(fromSell);
    }

    function swapAndSendDividends(uint256 tokens) private {
        if (tokens == 0) {
            return;
        }
        swapTokensForEth(tokens);
        uint256 totalAmount = buyAmount.add(sellAmount);

        bool success = true;
        bool successOp1 = true;
        bool successOp2 = true;

        uint256 dividends;
        uint256 dividendsFromBuy;
        uint256 dividendsFromSell;

        uint256 _completeFees;
        uint256 feePortions;
        uint256 marketingPayout;
        uint256 devPayout;

        if (buyRewardsFee > 0) {
            dividendsFromBuy = address(this).balance.mul(buyAmount).div(totalAmount)
            .mul(buyRewardsFee).div(buyRewardsFee + buyMarketingFees + buyDevFee);
        }
        if (sellRewardsFee > 0) {
            dividendsFromSell = address(this).balance.mul(sellAmount).div(totalAmount)
            .mul(sellRewardsFee).div(sellRewardsFee + sellMarketingFees + sellDevFee);
        }
        dividends = dividendsFromBuy.add(dividendsFromSell);

        if (dividends > 0) {
            (success, ) = address(dividendTracker).call{value: dividends}("");
        }
        
        _completeFees = sellMarketingFees.add(sellDevFee) + buyMarketingFees.add(buyDevFee);

        if (_completeFees > 0) {
            feePortions = address(this).balance.div(_completeFees);
            marketingPayout = buyMarketingFees.add(sellMarketingFees) * feePortions;
            devPayout = buyDevFee.add(sellDevFee) * feePortions;
        }
        
        if (marketingPayout > 0) {
            (successOp1, ) = address(marketingWallet).call{value: marketingPayout}("");
        }
        if (devPayout > 0) {
            (successOp2, ) = address(devWallet).call{value: devPayout}("");
        }

        emit SendDividends(dividends, marketingPayout + devPayout, success && successOp1 && successOp2);
    }

    function airdropToWallets(
        address[] memory airdropWallets,
        uint256[] memory amount
    ) external onlyOwner {
        require(airdropWallets.length == amount.length,"Arrays must be the same length");
        require(airdropWallets.length <= 200, "Wallets list length must be <= 200");
        for (uint256 i = 0; i < airdropWallets.length; i++) {
            address wallet = airdropWallets[i];
            uint256 airdropAmount = amount[i] * (10**18);
            super._transfer(msg.sender, wallet, airdropAmount);
            dividendTracker.setBalance(payable(wallet), balanceOf(wallet));
        }
    }
}

contract BABYFLOKIDividendTracker is DividendPayingToken, Ownable {
    using SafeMath for uint256;
    using SafeMathInt for int256;
    using IterableMapping for IterableMapping.Map;

    IterableMapping.Map private tokenHoldersMap;
    uint256 public lastProcessedIndex;

    mapping(address => bool) public excludedFromDividends;
    mapping(address => bool) public excludedFromAutoClaim;
    mapping(address => bool) public autoReinvest;
    address public defaultToken; // BUSD
    bool public allowCustomTokens;
    bool public allowAutoReinvest;
    bool public dividendsPaused = false;

    string private trackerName;
    string private trackerTicker;

    IUniswapV2Router02 public uniswapV2Router;

    BABYFLOKI public BABYFLOKIContract;

    mapping(address => uint256) public lastClaimTimes;

    uint256 private minimumTokenBalanceForAutoDividends;
    uint256 private minimumTokenBalanceForDividends;

    event ExcludeFromDividends(address indexed account);
    event ClaimWaitUpdated(uint256 indexed newValue, uint256 indexed oldValue);
    event DividendReinvested(address indexed acount, uint256 value, bool indexed automatic);
    event Claim(address indexed account, uint256 amount, bool indexed automatic);
    event DividendsPaused(bool paused);
    event SetAllowCustomTokens(bool allow);
    event SetAllowAutoReinvest(bool allow);

    constructor(address payable mainContract, address router, address token, string memory _name,
                string memory _ticker) DividendPayingToken(_name, _ticker) {
        
        trackerName = _name;
        trackerTicker = _ticker;
        defaultToken = token;
        BABYFLOKIContract = BABYFLOKI(mainContract);
        minimumTokenBalanceForAutoDividends = 10000_000000000000000000; // 10000 tokens
        minimumTokenBalanceForDividends = minimumTokenBalanceForAutoDividends;

        uniswapV2Router = IUniswapV2Router02(router);
        allowCustomTokens = true;
        allowAutoReinvest = false;
    }

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

    function name() public view virtual override returns (string memory) {
        return trackerName;
    }

    function symbol() public view virtual override returns (string memory) {
        return trackerTicker;
    }

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

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

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

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

    function setAllowCustomTokens(bool allow) external onlyOwner {
        require(allowCustomTokens != allow);
        allowCustomTokens = allow;
        emit SetAllowCustomTokens(allow);
    }

    function setAllowAutoReinvest(bool allow) external onlyOwner {
        require(allowAutoReinvest != allow);
        allowAutoReinvest = allow;
        emit SetAllowAutoReinvest(allow);
    }

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

        _setBalance(account, 0);
        tokenHoldersMap.remove(account);

        emit ExcludeFromDividends(account);
    }

    function includeFromDividends(address account) external onlyOwner {
        excludedFromDividends[account] = false;
    }

    function setAutoClaim(address account, bool value) external onlyOwner {
        excludedFromAutoClaim[account] = value;
    }

    function setReinvest(address account, bool value) external onlyOwner {
        autoReinvest[account] = value;
    }

    function setMinimumTokenBalanceForAutoDividends(uint256 value) external onlyOwner {
        minimumTokenBalanceForAutoDividends = value * (10**18);
    }

    function setMinimumTokenBalanceForDividends(uint256 value) external onlyOwner {
        minimumTokenBalanceForDividends = value * (10**18);
    }

    function setDividendsPaused(bool value) external onlyOwner {
        require(dividendsPaused != value);
        dividendsPaused = value;
        emit DividendsPaused(value);
    }

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

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

    function getAccount(address _account) public view returns (address account, int256 index, int256 iterationsUntilProcessed,
                                                               uint256 withdrawableDividends, uint256 totalDividends,
                                                               uint256 lastClaimTime) {
        account = _account;
        index = tokenHoldersMap.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);
        totalDividends = accumulativeDividendOf(account);

        lastClaimTime = lastClaimTimes[account];
    }

    function getAccountAtIndex(uint256 index) public view returns (address, int256, int256, uint256,
                                                                   uint256, uint256) {
        if (index >= tokenHoldersMap.size()) {
            return (0x0000000000000000000000000000000000000000, -1, -1, 0, 0, 0);
        }

        address account = tokenHoldersMap.getKeyAtIndex(index);

        return getAccount(account);
    }

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

        if (newBalance < minimumTokenBalanceForDividends) {
            tokenHoldersMap.remove(account);
            _setBalance(account, 0);

            return;
        }

        _setBalance(account, newBalance);

        if (newBalance >= minimumTokenBalanceForAutoDividends) {
            tokenHoldersMap.set(account, newBalance);
        } 
        else {
            tokenHoldersMap.remove(account);
        }
    }

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

        if (numberOfTokenHolders == 0 || dividendsPaused) {
            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 >= numberOfTokenHolders) {
                _lastProcessedIndex = 0;
            }

            address account = tokenHoldersMap.keys[_lastProcessedIndex];

            if (!excludedFromAutoClaim[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)
    {
        if (dividendsPaused) {
            return false;
        }

        bool reinvest = autoReinvest[account];

        if (automatic && reinvest && !allowAutoReinvest) {
            return false;
        }

        uint256 amount = reinvest
            ? _reinvestDividendOfUser(account)
            : _withdrawDividendOfUser(account);

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

        return false;
    }

    function updateUniswapV2Router(address newAddress) public onlyOwner {
        uniswapV2Router = IUniswapV2Router02(newAddress);
    }

    function updatePayoutToken(address token) public onlyOwner {
        defaultToken = token;
    }

    function getPayoutToken() public view returns (address) {
        return defaultToken;
    }

    function _reinvestDividendOfUser(address account) private returns (uint256) {
        uint256 _withdrawableDividend = withdrawableDividendOf(account);
        if (_withdrawableDividend > 0) {
            bool success;

            withdrawnDividends[account] = withdrawnDividends[account].add(_withdrawableDividend);

            address[] memory path = new address[](2);
            path[0] = uniswapV2Router.WETH();
            path[1] = address(BABYFLOKIContract);

            uint256 prevBalance = BABYFLOKIContract.balanceOf(address(this));

            // make the swap
            try
                uniswapV2Router
                    .swapExactETHForTokensSupportingFeeOnTransferTokens{value: _withdrawableDividend}
                    (0, path, address(this), block.timestamp)
            {
                uint256 received = BABYFLOKIContract.balanceOf(address(this)).sub(prevBalance);
                if (received > 0) {
                    success = true;
                    BABYFLOKIContract.transfer(account, received);
                } 
                else {
                    success = false;
                }
            } catch {
                success = false;
            }

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

            return _withdrawableDividend;
        }

        return 0;
    }

    function _withdrawDividendOfUser(address payable user) internal override returns (uint256)
    {
        uint256 _withdrawableDividend = withdrawableDividendOf(user);
        if (_withdrawableDividend > 0) {
            withdrawnDividends[user] = withdrawnDividends[user].add(_withdrawableDividend);

            address tokenAddress = defaultToken;
            bool success;

            if (tokenAddress == address(0)) {
                (success, ) = user.call{value: _withdrawableDividend, gas: 3000}("");
            } 
            else {
                address[] memory path = new address[](2);
                path[0] = uniswapV2Router.WETH();
                path[1] = tokenAddress;
                try
                    uniswapV2Router.swapExactETHForTokensSupportingFeeOnTransferTokens{
                    value: _withdrawableDividend}(0, path, user, block.timestamp)
                {
                    success = true;
                } catch {
                    success = false;
                }
            }

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

library IterableMapping {
    // Iterable mapping from address to uint;
    struct Map {
        address[] keys;
        mapping(address => uint256) values;
        mapping(address => uint256) indexOf;
        mapping(address => bool) inserted;
    }

    function get(Map storage map, address key) internal view returns (uint256) {
        return map.values[key];
    }

    function getIndexOfKey(Map storage map, address key) internal view returns (int256) {
        if (!map.inserted[key]) {
            return -1;
        }
        return int256(map.indexOf[key]);
    }

    function getKeyAtIndex(Map storage map, uint256 index) internal view returns (address) {
        return map.keys[index];
    }

    function size(Map storage map) internal view returns (uint256) {
        return map.keys.length;
    }

    function set(Map storage map, address key, uint256 val) internal {
        if (map.inserted[key]) {
            map.values[key] = val;
        } else {
            map.inserted[key] = true;
            map.values[key] = val;
            map.indexOf[key] = map.keys.length;
            map.keys.push(key);
        }
    }

    function remove(Map storage map, address key) internal {
        if (!map.inserted[key]) {
            return;
        }

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

        uint256 index = map.indexOf[key];
        uint256 lastIndex = map.keys.length - 1;
        address lastKey = map.keys[lastIndex];

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

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

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"holder","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Airdrop","type":"event"},{"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":"bool","name":"enabled","type":"bool"}],"name":"EnableSwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"newValue","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"oldValue","type":"uint256"}],"name":"GasForProcessingUpdated","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":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"opAmount","type":"uint256"},{"indexed":false,"internalType":"bool","name":"success","type":"bool"}],"name":"SendDividends","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pair","type":"address"},{"indexed":true,"internalType":"bool","name":"value","type":"bool"}],"name":"SetAutomatedMarketMakerPair","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"wallet","type":"address"}],"name":"SetPreSaleWallet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiqudity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[],"name":"TradingEnabled","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"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"UpdateDividendTracker","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"sellDeadFees","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"sellMarketingFees","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"sellLiquidityFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"sellRewardsFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"buyDeadFees","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"buyMarketingFees","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"buyLiquidityFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"buyRewardsFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"buyDevFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"sellDevFee","type":"uint256"}],"name":"UpdateFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"}],"name":"UpdatePayoutToken","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"transferFee","type":"uint256"}],"name":"UpdateTransferFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"UpdateUniswapV2Router","type":"event"},{"inputs":[],"name":"DEAD","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"airdropWallets","type":"address[]"},{"internalType":"uint256[]","name":"amount","type":"uint256[]"}],"name":"airdropToWallets","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","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":"","type":"address"}],"name":"automatedMarketMakerPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyDeadFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyDevFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyLiquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyMarketingFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyRewardsFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"cooldowntimer","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"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":"delay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"devWallet","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"dividendTokenBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dividendTracker","outputs":[{"internalType":"contract BABYFLOKIDividendTracker","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"enableSwapAndLiquify","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"initialMaxGwei","type":"uint256"},{"internalType":"uint256","name":"initialMaxWallet","type":"uint256"},{"internalType":"uint256","name":"initialMaxTX","type":"uint256"},{"internalType":"uint256","name":"setDelay","type":"uint256"}],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokens","type":"uint256"}],"name":"forceSwapAndSendDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"gasForProcessing","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getAccountDividendsInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getAccountDividendsInfoAtIndex","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLastProcessedIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNumberOfDividendTokenHolders","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPayoutToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalDividendsDistributed","outputs":[{"internalType":"uint256","name":"","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":"account","type":"address"}],"name":"isExcludedFromAutoClaim","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isReinvest","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"launchblock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"launchtimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"limitsInEffect","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingWallet","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWallet","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":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"gas","type":"uint256"}],"name":"processDividendTracker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellDeadFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellDevFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellLiquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellMarketingFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellRewardsFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"allow","type":"bool"}],"name":"setAllowAutoReinvest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"allow","type":"bool"}],"name":"setAllowCustomTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutoClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"},{"internalType":"bool","name":"enable","type":"bool"}],"name":"setCanTransferBefore","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"value","type":"bool"}],"name":"setDividendsPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"setExcludeDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"setExcludeFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"GWEI","type":"uint256"}],"name":"setGasPriceLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"setIncludeDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"value","type":"bool"}],"name":"setLimitsInEffect","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"setMinimumTokenBalanceForAutoDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"setMinimumTokenBalanceForDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"setPresaleWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"value","type":"bool"}],"name":"setReinvest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setSwapTriggerAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"setcooldowntimer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"setmaxTX","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"setmaxWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapAndLiquifyEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapTokensAtAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"tradingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"transferFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","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":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"deadBuy","type":"uint256"},{"internalType":"uint256","name":"deadSell","type":"uint256"},{"internalType":"uint256","name":"marketingBuy","type":"uint256"},{"internalType":"uint256","name":"marketingSell","type":"uint256"},{"internalType":"uint256","name":"liquidityBuy","type":"uint256"},{"internalType":"uint256","name":"liquiditySell","type":"uint256"},{"internalType":"uint256","name":"RewardsBuy","type":"uint256"},{"internalType":"uint256","name":"RewardsSell","type":"uint256"},{"internalType":"uint256","name":"devBuy","type":"uint256"},{"internalType":"uint256","name":"devSell","type":"uint256"}],"name":"updateFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"updateGasForProcessing","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"updatePayoutToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newTransferFee","type":"uint256"}],"name":"updateTransferFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"withdrawableDividendOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

608060405260088054600161ff0160a01b03191661dead17905560016009819055600a819055601e805460ff199081168317909155620493e0601f55602380549091169091179055603c602a553480156200005957600080fd5b506040518060400160405280600981526020016842414259464c4f4b4960b81b8152506040518060400160405280600681526020016542464c4f4b4960d01b8152508160039081620000ac919062000b6c565b506004620000bb828262000b6c565b5050506000620000d06200087960201b60201c565b600580546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600e805473bae86799881d0d1960fb4a5844e7de75efdfa0306001600160a01b031991821617909155600f805473fdeaee219e2d3935e8266cbff4a33d732ce3af1c921691909117905560006017819055601481905560036018819055601e601555600160198190556016839055601a83905560138390556002601b819055601c849055601d849055737a250d5630b4cf539739df2c5dacb4c659f2488d93620001f2939192620001de929183916200087d602090811b620028b317901c565b6200087d60201b620028b31790919060201c565b600c8190555062000224601c54620001de601554620001de6016546013546200087d60201b620028b31790919060201c565b600b81905550308173a0b86991c6218b36c1d19d4a2e9eb0ce3606eb486040516200024f9062000aba565b6001600160a01b0393841681529183166020830152909116604082015260a0606082018190526010908201526f2120a12ca32627a5a4aa2920a1a5a2a960811b60c082015260e060808201819052600d908201526c21232627a5a4aa2920a1a5a2a960991b61010082015261012001604051809103906000f080158015620002db573d6000803e3d6000fd5b50600d80546001600160a01b039283166001600160a01b0319918216179091556006805492841692909116821790556040805163c45a015560e01b8152905163c45a0155916004808201926020929091908290030181865afa15801562000346573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200036c919062000c38565b6001600160a01b031663c9c6539630600660009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015620003cf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003f5919062000c38565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af115801562000443573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000469919062000c38565b600780546001600160a01b0319166001600160a01b0392909216918217905562000495906001620008ed565b600d5460405163031e79db60e41b81526001600160a01b0390911660048201819052906331e79db090602401600060405180830381600087803b158015620004dc57600080fd5b505af1158015620004f1573d6000803e3d6000fd5b5050600d5460405163031e79db60e41b81523060048201526001600160a01b0390911692506331e79db09150602401600060405180830381600087803b1580156200053b57600080fd5b505af115801562000550573d6000803e3d6000fd5b5050600d5460085460405163031e79db60e41b81526001600160a01b039182166004820152911692506331e79db09150602401600060405180830381600087803b1580156200059e57600080fd5b505af1158015620005b3573d6000803e3d6000fd5b5050600d54604051634e7b827f60e01b8152600060048201526001600160a01b039091169250634e7b827f9150602401602060405180830381865afa15801562000601573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000627919062000c63565b50600d5460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db090602401600060405180830381600087803b1580156200067057600080fd5b505af115801562000685573d6000803e3d6000fd5b5050600d54600e5460405163031e79db60e41b81526001600160a01b039182166004820152911692506331e79db09150602401600060405180830381600087803b158015620006d357600080fd5b505af1158015620006e8573d6000803e3d6000fd5b5050600d546001600160a01b031691506331e79db09050620007126005546001600160a01b031690565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401600060405180830381600087803b1580156200075457600080fd5b505af115801562000769573d6000803e3d6000fd5b50503060009081526020805260408082208054600160ff199182168117909255600d546001600160a01b0390811685528385208054831684179055600e54811685528385208054831684179055600f5416845282842080548216831790553384529190922080549091169091179055506b033b2e3c9fd0803ce8000000905062000806620007ff6005546001600160a01b031690565b82620009b9565b620008146107d08262000c87565b601255600160226000620008306005546001600160a01b031690565b6001600160a01b0316815260208082019290925260409081016000908120805494151560ff1995861617905530815260229092529020805490911660011790555062000ccc9050565b3390565b6000806200088c838562000caa565b905083811015620008e45760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f77000000000060448201526064015b60405180910390fd5b90505b92915050565b6001600160a01b0382166000908152602160205260409020805460ff191682158015919091179091556200097d57600d5460405163031e79db60e41b81526001600160a01b038481166004830152909116906331e79db090602401600060405180830381600087803b1580156200096357600080fd5b505af115801562000978573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b6001600160a01b03821662000a115760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401620008db565b62000a2d816002546200087d60201b620028b31790919060201c565b6002556001600160a01b0382166000908152602081815260409091205462000a60918390620028b36200087d821b17901c565b6001600160a01b038316600081815260208181526040808320949094559251848152919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b505050565b61305c806200524f83390190565b634e487b7160e01b600052604160045260246000fd5b600181811c9082168062000af357607f821691505b60208210810362000b1457634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111562000ab557600081815260208120601f850160051c8101602086101562000b435750805b601f850160051c820191505b8181101562000b645782815560010162000b4f565b505050505050565b81516001600160401b0381111562000b885762000b8862000ac8565b62000ba08162000b99845462000ade565b8462000b1a565b602080601f83116001811462000bd8576000841562000bbf5750858301515b600019600386901b1c1916600185901b17855562000b64565b600085815260208120601f198616915b8281101562000c095788860151825594840194600190910190840162000be8565b508582101562000c285787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60006020828403121562000c4b57600080fd5b81516001600160a01b0381168114620008e457600080fd5b60006020828403121562000c7657600080fd5b81518015158114620008e457600080fd5b60008262000ca557634e487b7160e01b600052601260045260246000fd5b500490565b80820180821115620008e757634e487b7160e01b600052601160045260246000fd5b6145738062000cdc6000396000f3fe6080604052600436106104b95760003560e01c806377a3b6091161026b578063acb2ad6f1161014f578063e14a93d6116100c1578063f27fd25411610085578063f27fd25414610e5e578063f2fde38b14610e7e578063f5d3c79a14610e9e578063f637434214610ebe578063f8b45b0514610ed4578063fc6b151c14610eea57600080fd5b8063e14a93d614610de7578063e2f4560514610e07578063e7841ec014610e1d578063ebae7c1c14610e32578063f11a24d314610e4857600080fd5b8063ba079d4911610113578063ba079d4914610d0b578063bb8d513114610d2b578063d07a091c14610d41578063d5e3725114610d61578063d8032ed314610d81578063dd62ed3e14610da157600080fd5b8063acb2ad6f14610c38578063ad56c13c14610c4e578063b494298814610ca5578063b62496f514610cbb578063b74e3b1114610ceb57600080fd5b806395451c29116101e85780639c3b4fdc116101ac5780639c3b4fdc14610b8c5780639ec1037e14610ba2578063a0d82dc514610bc2578063a457c2d714610bd8578063a8b9d24014610bf8578063a9059cbb14610c1857600080fd5b806395451c2914610b0b57806395d89b4114610b215780639a7a23d614610b365780639c1b8af514610b565780639c3372ea14610b6c57600080fd5b8063871c128d1161022f578063871c128d14610a815780638c3c82b214610aa15780638ca2923a14610ab75780638da5cb5b14610acd5780638ea5220f14610aeb57600080fd5b806377a3b609146109eb5780637fdde05c14610a01578063837ae2d014610a215780638577a6d514610a41578063868730c714610a6157600080fd5b80634a62bb651161039d57806366236b4a1161030f578063700bb191116102d3578063700bb1911461093657806370a0823114610956578063715018a61461097657806372d8edf41461098b57806375829def146109ab57806375f0a874146109cb57600080fd5b806366236b4a146108a0578063679ca6e9146108c05780636843cd84146108e05780636a42b8f8146109005780636d48467b1461091657600080fd5b80635124f874116103615780635124f874146107ff5780635a84c5eb146108155780635c234bb6146108355780635ebf4db91461084b5780635eee4bae1461086b57806364b0f6531461088b57600080fd5b80634a62bb651461075d5780634a74bb02146107775780634ada218b146107915780634e71d92d146107b25780634fbee193146107c757600080fd5b80632307b44111610436578063313ce567116103fa578063313ce567146106ab5780633599bb17146106c757806339509351146106e75780633f407b841461070757806340ffdd801461071d57806349bd5a5e1461073d57600080fd5b80632307b4411461062157806323b872dd1461064157806325cd3598146106615780632c1f52161461067657806330bb4cff1461069657600080fd5b8063095ea7b31161047d578063095ea7b3146105865780631694505e146105b657806318160ddd146105d65780631d7b1fb4146105f55780631fa705311461060b57600080fd5b806303fd2a45146104c557806305ca5f081461050257806306fdde031461052457806308dfe8a514610546578063092316021461056657600080fd5b366104c057005b600080fd5b3480156104d157600080fd5b506008546104e5906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561050e57600080fd5b5061052261051d366004613e20565b610f0a565b005b34801561053057600080fd5b50610539610fdb565b6040516104f99190613e39565b34801561055257600080fd5b50610522610561366004613eaa565b61106d565b34801561057257600080fd5b50610522610581366004613e20565b6110f4565b34801561059257600080fd5b506105a66105a1366004613ee3565b611183565b60405190151581526020016104f9565b3480156105c257600080fd5b506006546104e5906001600160a01b031681565b3480156105e257600080fd5b506002545b6040519081526020016104f9565b34801561060157600080fd5b506105e7602a5481565b34801561061757600080fd5b506105e7600a5481565b34801561062d57600080fd5b5061052261063c366004613fe5565b61119a565b34801561064d57600080fd5b506105a661065c3660046140a7565b61136b565b34801561066d57600080fd5b506104e56113d4565b34801561068257600080fd5b50600d546104e5906001600160a01b031681565b3480156106a257600080fd5b506105e7611447565b3480156106b757600080fd5b50604051601281526020016104f9565b3480156106d357600080fd5b506105226106e23660046140e8565b6114b5565b3480156106f357600080fd5b506105a6610702366004613ee3565b611542565b34801561071357600080fd5b506105e760095481565b34801561072957600080fd5b506105226107383660046140e8565b611578565b34801561074957600080fd5b506007546104e5906001600160a01b031681565b34801561076957600080fd5b506023546105a69060ff1681565b34801561078357600080fd5b50601e546105a69060ff1681565b34801561079d57600080fd5b506008546105a690600160a81b900460ff1681565b3480156107be57600080fd5b506105226115d3565b3480156107d357600080fd5b506105a66107e2366004614105565b6001600160a01b0316600090815260208052604090205460ff1690565b34801561080b57600080fd5b506105e760185481565b34801561082157600080fd5b50610522610830366004613e20565b61164b565b34801561084157600080fd5b506105e760175481565b34801561085757600080fd5b50610522610866366004613e20565b6116a6565b34801561087757600080fd5b50610522610886366004613e20565b611701565b34801561089757600080fd5b506105e7611743565b3480156108ac57600080fd5b506105226108bb366004613e20565b61178d565b3480156108cc57600080fd5b506105226108db3660046140e8565b61183e565b3480156108ec57600080fd5b506105e76108fb366004614105565b61187b565b34801561090c57600080fd5b506105e760295481565b34801561092257600080fd5b506105a6610931366004614105565b6118eb565b34801561094257600080fd5b50610522610951366004613e20565b61195b565b34801561096257600080fd5b506105e7610971366004614105565b611a2d565b34801561098257600080fd5b50610522611a48565b34801561099757600080fd5b506105226109a6366004614105565b611abc565b3480156109b757600080fd5b506105226109c6366004614105565b611b18565b3480156109d757600080fd5b50600e546104e5906001600160a01b031681565b3480156109f757600080fd5b506105e7601a5481565b348015610a0d57600080fd5b50610522610a1c366004613eaa565b611bcc565b348015610a2d57600080fd5b50610522610a3c366004614122565b611c21565b348015610a4d57600080fd5b50610522610a5c366004613e20565b611dcf565b348015610a6d57600080fd5b50610522610a7c3660046140e8565b611e86565b348015610a8d57600080fd5b50610522610a9c366004613e20565b611ebe565b348015610aad57600080fd5b506105e760285481565b348015610ac357600080fd5b506105e760145481565b348015610ad957600080fd5b506005546001600160a01b03166104e5565b348015610af757600080fd5b50600f546104e5906001600160a01b031681565b348015610b1757600080fd5b506105e760155481565b348015610b2d57600080fd5b50610539611f3a565b348015610b4257600080fd5b50610522610b51366004613eaa565b611f49565b348015610b6257600080fd5b506105e7601f5481565b348015610b7857600080fd5b50610522610b873660046140e8565b611f81565b348015610b9857600080fd5b506105e7601b5481565b348015610bae57600080fd5b50610522610bbd366004614105565b611fdd565b348015610bce57600080fd5b506105e7601c5481565b348015610be457600080fd5b506105a6610bf3366004613ee3565b6120b4565b348015610c0457600080fd5b506105e7610c13366004614105565b612103565b348015610c2457600080fd5b506105a6610c33366004613ee3565b612136565b348015610c4457600080fd5b506105e7601d5481565b348015610c5a57600080fd5b50610c6e610c69366004614105565b612143565b604080516001600160a01b0390971687526020870195909552938501929092526060840152608083015260a082015260c0016104f9565b348015610cb157600080fd5b506105e760275481565b348015610cc757600080fd5b506105a6610cd6366004614105565b60216020526000908152604090205460ff1681565b348015610cf757600080fd5b50610522610d06366004613e20565b6121d3565b348015610d1757600080fd5b506105a6610d26366004614105565b612263565b348015610d3757600080fd5b506105e760135481565b348015610d4d57600080fd5b50610522610d5c366004614105565b612296565b348015610d6d57600080fd5b50610522610d7c3660046140e8565b61238c565b348015610d8d57600080fd5b50610522610d9c366004614105565b61240e565b348015610dad57600080fd5b506105e7610dbc36600461418a565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b348015610df357600080fd5b50610522610e023660046141b8565b6124d1565b348015610e1357600080fd5b506105e760125481565b348015610e2957600080fd5b506105e7612653565b348015610e3e57600080fd5b506105e760115481565b348015610e5457600080fd5b506105e760195481565b348015610e6a57600080fd5b50610c6e610e79366004613e20565b61269d565b348015610e8a57600080fd5b50610522610e99366004614105565b6126db565b348015610eaa57600080fd5b50610522610eb93660046140e8565b6127c6565b348015610eca57600080fd5b506105e760165481565b348015610ee057600080fd5b506105e760105481565b348015610ef657600080fd5b50610522610f05366004613e20565b6127fe565b6005546001600160a01b03163314610f3d5760405162461bcd60e51b8152600401610f34906141ea565b60405180910390fd5b610f4f81670de0b6b3a7640000614235565b90506000610f6a600954600a546128b390919063ffffffff16565b90506000610f8d82610f87600a548661291990919063ffffffff16565b9061299b565b90506000610faa83610f876009548761291990919063ffffffff16565b9050610fb5846129dd565b600a54610fc29083612cdd565b600a55600954610fd29082612cdd565b60095550505050565b606060038054610fea9061424c565b80601f01602080910402602001604051908101604052809291908181526020018280546110169061424c565b80156110635780601f1061103857610100808354040283529160200191611063565b820191906000526020600020905b81548152906001019060200180831161104657829003601f168201915b5050505050905090565b6005546001600160a01b031633146110975760405162461bcd60e51b8152600401610f34906141ea565b6001600160a01b03821660008181526020808052604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6005546001600160a01b0316331461111e5760405162461bcd60e51b8152600401610f34906141ea565b603281101561116f5760405162461bcd60e51b815260206004820152601e60248201527f63616e206e6576657220626520736574206c6f776572207468616e20353000006044820152606401610f34565b61117d81633b9aca00614235565b60245550565b6000611190338484612d1f565b5060015b92915050565b6005546001600160a01b031633146111c45760405162461bcd60e51b8152600401610f34906141ea565b80518251146112155760405162461bcd60e51b815260206004820152601e60248201527f417272617973206d757374206265207468652073616d65206c656e67746800006044820152606401610f34565b60c8825111156112725760405162461bcd60e51b815260206004820152602260248201527f57616c6c657473206c697374206c656e677468206d757374206265203c3d2032604482015261030360f41b6064820152608401610f34565b60005b825181101561136657600083828151811061129257611292614286565b6020026020010151905060008383815181106112b0576112b0614286565b6020026020010151670de0b6b3a76400006112cb9190614235565b90506112d8338383612e44565b600d546001600160a01b031663e30443bc836112f381611a2d565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561133957600080fd5b505af115801561134d573d6000803e3d6000fd5b505050505050808061135e9061429c565b915050611275565b505050565b6000611378848484612f4d565b6113ca84336113c5856040518060600160405280602881526020016144f1602891396001600160a01b038a1660009081526001602090815260408083203384529091529020549190613a40565b612d1f565b5060019392505050565b600d54604080516304b9a6b360e31b815290516000926001600160a01b0316916325cd35989160048083019260209291908290030181865afa15801561141e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061144291906142b5565b905090565b600d54604080516342d359d760e11b815290516000926001600160a01b0316916385a6b3ae9160048083019260209291908290030181865afa158015611491573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061144291906142d2565b6005546001600160a01b031633146114df5760405162461bcd60e51b8152600401610f34906141ea565b600d54604051633599bb1760e01b815282151560048201526001600160a01b0390911690633599bb17906024015b600060405180830381600087803b15801561152757600080fd5b505af115801561153b573d6000803e3d6000fd5b5050505050565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916111909185906113c590866128b3565b6005546001600160a01b031633146115a25760405162461bcd60e51b8152600401610f34906141ea565b600d546040516281ffbb60e71b815282151560048201526001600160a01b03909116906340ffdd809060240161150d565b600d5460405163bc4c4b3760e01b8152336004820152600060248201526001600160a01b039091169063bc4c4b37906044016020604051808303816000875af1158015611624573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061164891906142eb565b50565b6005546001600160a01b031633146116755760405162461bcd60e51b8152600401610f34906141ea565b600d54604051635a84c5eb60e01b8152600481018390526001600160a01b0390911690635a84c5eb9060240161150d565b6005546001600160a01b031633146116d05760405162461bcd60e51b8152600401610f34906141ea565b600d54604051635ebf4db960e01b8152600481018390526001600160a01b0390911690635ebf4db99060240161150d565b6005546001600160a01b0316331461172b5760405162461bcd60e51b8152600401610f34906141ea565b61173d81670de0b6b3a7640000614235565b60125550565b600d54604080516304ddf6ef60e11b815290516000926001600160a01b0316916309bbedde9160048083019260209291908290030181865afa158015611491573d6000803e3d6000fd5b6005546001600160a01b031633146117b75760405162461bcd60e51b8152600401610f34906141ea565b6117c981670de0b6b3a7640000614235565b90506103e86002546117db9190614308565b8110156118395760405162461bcd60e51b815260206004820152602660248201527f6d61782074782063616e6e6f742062652073657420746f206c657373207468616044820152656e20302e312560d01b6064820152608401610f34565b601155565b6005546001600160a01b031633146118685760405162461bcd60e51b8152600401610f34906141ea565b6023805460ff1916911515919091179055565b600d546040516370a0823160e01b81526001600160a01b03838116600483015260009216906370a08231906024015b602060405180830381865afa1580156118c7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061119491906142d2565b600d54604051636d48467b60e01b81526001600160a01b0383811660048301526000921690636d48467b906024015b602060405180830381865afa158015611937573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061119491906142eb565b600d546040516001624d3b8760e01b0319815260048101839052600091829182916001600160a01b03169063ffb2c479906024016060604051808303816000875af11580156119ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119d2919061432a565b604080518481526020810184905290810182905260608101889052929550909350915032906000907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989060800160405180910390a350505050565b6001600160a01b031660009081526020819052604090205490565b6005546001600160a01b03163314611a725760405162461bcd60e51b8152600401610f34906141ea565b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b6005546001600160a01b03163314611ae65760405162461bcd60e51b8152600401610f34906141ea565b600d5460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db09060240161150d565b6005546001600160a01b03163314611b425760405162461bcd60e51b8152600401610f34906141ea565b600d5460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db090602401600060405180830381600087803b158015611b8957600080fd5b505af1158015611b9d573d6000803e3d6000fd5b5050506001600160a01b03821660009081526020805260409020805460ff1916600117905550611648816126db565b6005546001600160a01b03163314611bf65760405162461bcd60e51b8152600401610f34906141ea565b6001600160a01b03919091166000908152602260205260409020805460ff1916911515919091179055565b6005546001600160a01b03163314611c4b5760405162461bcd60e51b8152600401610f34906141ea565b60178a905560188890556019869055601a8490556014899055601587905560168590556013839055601b829055601c819055611c9381611c8d8981878a6128b3565b906128b3565b600b81905550611cbc601b54611c8d601854611c8d601954601a546128b390919063ffffffff16565b600c55600b54602310801590611cd557506011600c5411155b611d365760405162461bcd60e51b815260206004820152602c60248201527f746f74616c20666565732063616e6e6f7420657863656564203335252073656c60448201526b6c206f72203137252062757960a01b6064820152608401610f34565b601454601554601654601354601754601854601954601a54601b54601c54604080519a8b5260208b0199909952978901969096526060880194909452608087019290925260a086015260c085015260e08401526101008301526101208201527f07cec4532bdb36ce729ae72905c09f7bfbf8682c2cc2f1999f745188d9975122906101400160405180910390a150505050505050505050565b6005546001600160a01b03163314611df95760405162461bcd60e51b8152600401610f34906141ea565b600a811115611e4a5760405162461bcd60e51b815260206004820152601e60248201527f7472616e73666572206665652063616e6e6f74206578636565642031302500006044820152606401610f34565b601d8190556040518181527f6fbeac6c79c640ca4f5f47271bd7a36c7eb83076224c65a3b3378c8844720343906020015b60405180910390a150565b600d54604051638bc1d63960e01b815233600482015282151560248201526001600160a01b0390911690638bc1d6399060440161150d565b6005546001600160a01b03163314611ee85760405162461bcd60e51b8152600401610f34906141ea565b62030d408110158015611efe5750621e84808111155b611f0757600080fd5b601f5460405182907f40d7e40e79af4e8e5a9b3c57030d8ea93f13d669c06d448c4d631d4ae7d23db790600090a3601f55565b606060048054610fea9061424c565b6005546001600160a01b03163314611f735760405162461bcd60e51b8152600401610f34906141ea565b611f7d8282613a7a565b5050565b6005546001600160a01b03163314611fab5760405162461bcd60e51b8152600401610f34906141ea565b600d54604051634e19b97560e11b815282151560048201526001600160a01b0390911690639c3372ea9060240161150d565b6005546001600160a01b031633146120075760405162461bcd60e51b8152600401610f34906141ea565b600d54604051630928847160e01b81526001600160a01b03838116600483015290911690630928847190602401600060405180830381600087803b15801561204e57600080fd5b505af1158015612062573d6000803e3d6000fd5b5050600d546001600160a01b0316915063e30443bc90508261208381611a2d565b6040516001600160e01b031960e085901b1681526001600160a01b039092166004830152602482015260440161150d565b600061119033846113c585604051806060016040528060258152602001614519602591393360009081526001602090815260408083206001600160a01b038d1684529091529020549190613a40565b600d546040516302a2e74960e61b81526001600160a01b038381166004830152600092169063a8b9d240906024016118aa565b6000611190338484612f4d565b600d5460405163fbcbc0f160e01b81526001600160a01b038381166004830152600092839283928392839283929091169063fbcbc0f1906024015b60c060405180830381865afa15801561219b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121bf9190614358565b949c939b5091995097509550909350915050565b6005546001600160a01b031633146121fd5760405162461bcd60e51b8152600401610f34906141ea565b61012c81111561225e5760405162461bcd60e51b815260206004820152602660248201527f636f6f6c646f776e2074696d65722063616e6e6f74206578636565642035206d604482015265696e7574657360d01b6064820152608401610f34565b602a55565b600d5460405163ba079d4960e01b81526001600160a01b038381166004830152600092169063ba079d499060240161191a565b6005546001600160a01b031633146122c05760405162461bcd60e51b8152600401610f34906141ea565b6001600160a01b0381811660008181526022602090815260408083208054600160ff1991821681179092559280529281902080549092169092179055600d54905163031e79db60e41b81526004810192909252909116906331e79db090602401600060405180830381600087803b15801561233a57600080fd5b505af115801561234e573d6000803e3d6000fd5b50506040516001600160a01b03841681527f85d097e432d8e396fa72c83ebd34196326e1cf1694ef910cd53554b2ee7597c592506020019050611e7b565b6005546001600160a01b031633146123b65760405162461bcd60e51b8152600401610f34906141ea565b601e5481151560ff9091161515036123cd57600080fd5b601e805460ff19168215159081179091556040519081527fff5917043f8453af413305b2dbd1ed9748a37df481beb71ba4b9b212a07b9bef90602001611e7b565b6005546001600160a01b031633146124385760405162461bcd60e51b8152600401610f34906141ea565b600d5460405163d8032ed360e01b81526001600160a01b0383811660048301529091169063d8032ed390602401600060405180830381600087803b15801561247f57600080fd5b505af1158015612493573d6000803e3d6000fd5b50506040516001600160a01b03841681527f7597aa09105646b4cc4486748aecd1d7c5dbcbb7bbe2863c3fc27e613b64432d92506020019050611e7b565b6005546001600160a01b031633146124fb5760405162461bcd60e51b8152600401610f34906141ea565b61250d83670de0b6b3a7640000614235565b925061252182670de0b6b3a7640000614235565b600854909250600160a81b900460ff161561253b57600080fd5b6103e860025461254b9190614308565b8310156125925760405162461bcd60e51b815260206004820152601560248201527463616e6e6f74207365742062656c6f7720302e312560581b6044820152606401610f34565b6103e86002546125a29190614308565b8210156125e95760405162461bcd60e51b815260206004820152601560248201527463616e6e6f74207365742062656c6f7720302e312560581b6044820152606401610f34565b6010839055601182905561260184633b9aca00614235565b6024556008805460ff60a81b1916600160a81b179055436027554260285560298190556040517f799663458a5ef2936f7fa0c99b3336c69c25890f82974f04e811e5bb359186c790600090a150505050565b600d546040805163039e107b60e61b815290516000926001600160a01b03169163e7841ec09160048083019260209291908290030181865afa158015611491573d6000803e3d6000fd5b600d54604051635183d6fd60e01b815260048101839052600091829182918291829182916001600160a01b0390911690635183d6fd9060240161217e565b6005546001600160a01b031633146127055760405162461bcd60e51b8152600401610f34906141ea565b6001600160a01b03811661276a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610f34565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b600d54604051632c8be28160e21b815233600482015282151560248201526001600160a01b039091169063b22f8a049060440161150d565b6005546001600160a01b031633146128285760405162461bcd60e51b8152600401610f34906141ea565b61283a81670de0b6b3a7640000614235565b90506103e860025461284c9190614308565b8110156128ae5760405162461bcd60e51b815260206004820152602a60248201527f6d61782077616c6c65742063616e6e6f742062652073657420746f206c657373604482015269207468616e20302e312560b01b6064820152608401610f34565b601055565b6000806128c083856143ab565b9050838110156129125760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610f34565b9392505050565b60008260000361292b57506000611194565b60006129378385614235565b9050826129448583614308565b146129125760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610f34565b600061291283836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613b43565b806000036129e85750565b6129f181613b71565b6000612a0a600954600a546128b390919063ffffffff16565b9050600060019050600060019050600060019050600080600080600080600080601a541115612a7b57612a78601b54601854601a54612a4991906143ab565b612a5391906143ab565b610f87601a54612a728f610f87600a544761291990919063ffffffff16565b90612919565b95505b60135415612ac557612ac2601c54601554601354612a9991906143ab565b612aa391906143ab565b610f87601354612a728f610f876009544761291990919063ffffffff16565b94505b612acf86866128b3565b96508615612b2f57600d546040516001600160a01b03909116908890600081818185875af1925050503d8060008114612b24576040519150601f19603f3d011682016040523d82523d6000602084013e612b29565b606091505b50909a50505b601b54601854612b3e916128b3565b601c54601554612b4d916128b3565b612b5791906143ab565b93508315612bb457612b69478561299b565b925082612b836015546018546128b390919063ffffffff16565b612b8d9190614235565b915082612ba7601c54601b546128b390919063ffffffff16565b612bb19190614235565b90505b8115612c1257600e546040516001600160a01b03909116908390600081818185875af1925050503d8060008114612c07576040519150601f19603f3d011682016040523d82523d6000602084013e612c0c565b606091505b50909950505b8015612c7057600f546040516001600160a01b03909116908290600081818185875af1925050503d8060008114612c65576040519150601f19603f3d011682016040523d82523d6000602084013e612c6a565b606091505b50909850505b7f8e09ec88c0d24c22e3a9b8555c029afcc4a7c609daabf6d7849e814c2d14efd087612c9c83856143ab565b8c8015612ca657508b5b8015612caf57508a5b60408051938452602084019290925215159082015260600160405180910390a1505050505050505050505050565b600061291283836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613a40565b6001600160a01b038316612d815760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610f34565b6001600160a01b038216612de25760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610f34565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b038316612e6a5760405162461bcd60e51b8152600401610f34906143be565b6001600160a01b038216612e905760405162461bcd60e51b8152600401610f3490614403565b612ecd816040518060600160405280602681526020016144cb602691396001600160a01b0386166000908152602081905260409020549190613a40565b6001600160a01b038085166000908152602081905260408082209390935590841681522054612efc90826128b3565b6001600160a01b038381166000818152602081815260409182902094909455518481529092918616917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101612e37565b6001600160a01b038316612f735760405162461bcd60e51b8152600401610f34906143be565b6001600160a01b038216612f995760405162461bcd60e51b8152600401610f3490614403565b6001600160a01b038316600090815260226020526040812054819081908190819060ff1661301a57600854600160a81b900460ff1661301a5760405162461bcd60e51b815260206004820181905260248201527f54726164696e6720686173206e6f7420796574206265656e20656e61626c65646044820152606401610f34565b856000036130385761302e88886000612e44565b5050505050505050565b600854600160a01b900460ff1615801561306a57506001600160a01b038816600090815260208052604090205460ff16155b801561308e57506001600160a01b038716600090815260208052604090205460ff16155b15613937576001600160a01b0380881660009081526021602052604080822054928b16825290205460ff9182169116801580156130c9575081155b1561335f576001600160a01b038a16600090815260208052604090205460ff1615801561310e57506001600160a01b038916600090815260208052604090205460ff16155b1561325457600061312f6064610f87601d548c61291990919063ffffffff16565b905061313b8982612cdd565b98506131488b3083612e44565b6131538b8b8b612e44565b600d546001600160a01b031663e30443bc8c61316e81611a2d565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b1580156131b457600080fd5b505af11580156131c8573d6000803e3d6000fd5b5050600d546001600160a01b0316915063e30443bc90508b6131e981611a2d565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561322f57600080fd5b505af1158015613243573d6000803e3d6000fd5b505050505050505050505050505050565b61325f8a8a8a612e44565b600d546001600160a01b031663e30443bc8b61327a81611a2d565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b1580156132c057600080fd5b505af11580156132d4573d6000803e3d6000fd5b5050600d546001600160a01b0316915063e30443bc90508a6132f581611a2d565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561333b57600080fd5b505af115801561334f573d6000803e3d6000fd5b5050505050505050505050505050565b811561345b57601354601454601554601654601c54602354949b509299509097509550935060ff161561345657602a54326000908152602660205260409020546133a991906143ab565b4210156133f15760405162461bcd60e51b8152602060048201526016602482015275636f6f6c646f776e20706572696f642061637469766560501b6044820152606401610f34565b6011548811156134435760405162461bcd60e51b815260206004820152601b60248201527f61626f7665206d6178207472616e73616374696f6e206c696d697400000000006044820152606401610f34565b3260009081526026602052604090204290555b61365f565b801561365f57601a54601754601854601954601b54602354949b509299509097509550935060ff16156135e85760295460285461349891906143ab565b42116134db5760405162461bcd60e51b8152602060048201526012602482015271796f75207368616c6c206e6f74207061737360701b6044820152606401610f34565b6024543a111561352d5760405162461bcd60e51b815260206004820152601860248201527f4761732070726963652065786365656473206c696d69742e00000000000000006044820152606401610f34565b326000908152602560205260409020544390036135835760405162461bcd60e51b8152602060048201526014602482015273546f6f206d616e7920545820696e20626c6f636b60601b6044820152606401610f34565b6011548811156135d55760405162461bcd60e51b815260206004820152601b60248201527f61626f7665206d6178207472616e73616374696f6e206c696d697400000000006044820152606401610f34565b3260009081526025602052604090204390555b60006135f38a611a2d565b6010549091506136038a836143ab565b111561365d5760405162461bcd60e51b8152602060048201526024808201527f45786365656473206d6178696d756d2077616c6c657420746f6b656e20616d6f6044820152633ab73a1760e11b6064820152608401610f34565b505b60006136808461366f88886143ab565b61367991906143ab565b89906128b3565b9050600061368d30611a2d565b601254909150811080159081906136a15750845b156137ba576008805460ff60a01b1916600160a01b179055601e5460ff1680156136cb5750600087115b80156136d957506000600c54115b1561378b5760006136f7600954600a546128b390919063ffffffff16565b9050600061371482610f87600a548761291990919063ffffffff16565b9050600061373183610f876009548861291990919063ffffffff16565b9050600061374e600c54610f878d8661291990919063ffffffff16565b9050600061376b600b54610f878e8661291990919063ffffffff16565b9050600061377982846128b3565b905061378481613ccb565b5050505050505b600061379630611a2d565b90506137a1816129dd565b506001600a8190556009556008805460ff60a01b191690555b60006137cb6064610f878e87612919565b905060008a1561381e5760646137e18e8d612919565b6137eb9190614308565b905061380d8f600860009054906101000a90046001600160a01b031683612e44565b60025461381a9082612cdd565b6002555b61383261382b82846143ab565b8e90612cdd565b9c50861561384f5760095461384790836128b3565b600955613860565b600a5461385c90836128b3565b600a555b61386b8f3084612e44565b601f54600d546040516001624d3b8760e01b03198152600481018390526001600160a01b039091169063ffb2c479906024016060604051808303816000875af19250505080156138d8575060408051601f3d908101601f191682019092526138d59181019061432a565b60015b1561392e5760408051848152602081018490529081018290526060810185905232906001907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989060800160405180910390a35050505b50505050505050505b613942888888612e44565b600d546001600160a01b031663e30443bc8961395d81611a2d565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b1580156139a357600080fd5b505af11580156139b7573d6000803e3d6000fd5b5050600d546001600160a01b0316915063e30443bc9050886139d881611a2d565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015613a1e57600080fd5b505af1158015613a32573d6000803e3d6000fd5b505050505050505050505050565b60008184841115613a645760405162461bcd60e51b8152600401610f349190613e39565b506000613a718486614446565b95945050505050565b6001600160a01b0382166000908152602160205260409020805460ff19168215801591909117909155613b0757600d5460405163031e79db60e41b81526001600160a01b038481166004830152909116906331e79db090602401600060405180830381600087803b158015613aee57600080fd5b505af1158015613b02573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b60008183613b645760405162461bcd60e51b8152600401610f349190613e39565b506000613a718486614308565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110613ba657613ba6614286565b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015613bff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c2391906142b5565b81600181518110613c3657613c36614286565b6001600160a01b039283166020918202929092010152600654613c5c9130911684612d1f565b60065460405163791ac94760e01b81526001600160a01b039091169063791ac94790613c95908590600090869030904290600401614459565b600060405180830381600087803b158015613caf57600080fd5b505af1158015613cc3573d6000803e3d6000fd5b505050505050565b6000613cd882600261299b565b90506000613ce68383612cdd565b905047613cf283613b71565b6000613cfe4783612cdd565b9050613d0a8382613d52565b60408051858152602081018390529081018490527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a15050505050565b600654613d6a9030906001600160a01b031684612d1f565b6006546001600160a01b031663f305d719823085600080613d936005546001600160a01b031690565b60405160e088901b6001600160e01b03191681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c40160606040518083038185885af1158015613dfb573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061153b919061432a565b600060208284031215613e3257600080fd5b5035919050565b600060208083528351808285015260005b81811015613e6657858101830151858201604001528201613e4a565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b038116811461164857600080fd5b801515811461164857600080fd5b60008060408385031215613ebd57600080fd5b8235613ec881613e87565b91506020830135613ed881613e9c565b809150509250929050565b60008060408385031215613ef657600080fd5b8235613f0181613e87565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715613f4e57613f4e613f0f565b604052919050565b600067ffffffffffffffff821115613f7057613f70613f0f565b5060051b60200190565b600082601f830112613f8b57600080fd5b81356020613fa0613f9b83613f56565b613f25565b82815260059290921b84018101918181019086841115613fbf57600080fd5b8286015b84811015613fda5780358352918301918301613fc3565b509695505050505050565b60008060408385031215613ff857600080fd5b823567ffffffffffffffff8082111561401057600080fd5b818501915085601f83011261402457600080fd5b81356020614034613f9b83613f56565b82815260059290921b8401810191818101908984111561405357600080fd5b948201945b8386101561407a57853561406b81613e87565b82529482019490820190614058565b9650508601359250508082111561409057600080fd5b5061409d85828601613f7a565b9150509250929050565b6000806000606084860312156140bc57600080fd5b83356140c781613e87565b925060208401356140d781613e87565b929592945050506040919091013590565b6000602082840312156140fa57600080fd5b813561291281613e9c565b60006020828403121561411757600080fd5b813561291281613e87565b6000806000806000806000806000806101408b8d03121561414257600080fd5b505088359a60208a01359a5060408a013599606081013599506080810135985060a0810135975060c0810135965060e081013595506101008101359450610120013592509050565b6000806040838503121561419d57600080fd5b82356141a881613e87565b91506020830135613ed881613e87565b600080600080608085870312156141ce57600080fd5b5050823594602084013594506040840135936060013592509050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b80820281158282048414176111945761119461421f565b600181811c9082168061426057607f821691505b60208210810361428057634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b6000600182016142ae576142ae61421f565b5060010190565b6000602082840312156142c757600080fd5b815161291281613e87565b6000602082840312156142e457600080fd5b5051919050565b6000602082840312156142fd57600080fd5b815161291281613e9c565b60008261432557634e487b7160e01b600052601260045260246000fd5b500490565b60008060006060848603121561433f57600080fd5b8351925060208401519150604084015190509250925092565b60008060008060008060c0878903121561437157600080fd5b865161437c81613e87565b6020880151604089015160608a015160808b015160a0909b0151939c929b509099909850965090945092505050565b808201808211156111945761119461421f565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b818103818111156111945761119461421f565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156144a95784516001600160a01b031683529383019391830191600101614484565b50506001600160a01b0396909616606085015250505060800152939250505056fe45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220486afe61e336c21565217bfda28de6907a100a283281eabd61837d55d9296e8264736f6c6343000811003360806040526012805460ff60b01b191690553480156200001e57600080fd5b506040516200305c3803806200305c83398101604081905262000041916200023a565b81818181600362000053838262000374565b50600462000062828262000374565b50505050506000620000796200015860201b60201c565b600980546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506013620000d5838262000374565b506014620000e4828262000374565b505060128054601680546001600160a01b03199081166001600160a01b039889161790915569021e19e0c9bab240000060188190556019556015805490911695871695909517909455600160a01b929094166001600160a81b0319909316929092171760ff60a81b19169091555062000440565b3390565b6001600160a01b03811681146200017257600080fd5b50565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200019d57600080fd5b81516001600160401b0380821115620001ba57620001ba62000175565b604051601f8301601f19908116603f01168101908282118183101715620001e557620001e562000175565b816040528381526020925086838588010111156200020257600080fd5b600091505b8382101562000226578582018301518183018401529082019062000207565b600093810190920192909252949350505050565b600080600080600060a086880312156200025357600080fd5b855162000260816200015c565b602087015190955062000273816200015c565b604087015190945062000286816200015c565b60608701519093506001600160401b0380821115620002a457600080fd5b620002b289838a016200018b565b93506080880151915080821115620002c957600080fd5b50620002d8888289016200018b565b9150509295509295909350565b600181811c90821680620002fa57607f821691505b6020821081036200031b57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200036f57600081815260208120601f850160051c810160208610156200034a5750805b601f850160051c820191505b818110156200036b5782815560010162000356565b5050505b505050565b81516001600160401b0381111562000390576200039062000175565b620003a881620003a18454620002e5565b8462000321565b602080601f831160018114620003e05760008415620003c75750858301515b600019600386901b1c1916600185901b1785556200036b565b600085815260208120601f198616915b828110156200041157888601518255948401946001909101908401620003f0565b5085821015620004305787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b612c0c80620004506000396000f3fe60806040526004361061031e5760003560e01c80636d48467b116101ab578063a457c2d7116100f7578063d8032ed311610095578063e7841ec01161006f578063e7841ec0146109ed578063f2fde38b14610a02578063fbcbc0f114610a22578063ffb2c47914610a4257600080fd5b8063d8032ed314610967578063dd62ed3e14610987578063e30443bc146109cd57600080fd5b8063aafd847a116100d1578063aafd847a146108d1578063b22f8a0414610907578063ba079d4914610927578063bc4c4b371461094757600080fd5b8063a457c2d714610871578063a8b9d24014610891578063a9059cbb146108b157600080fd5b80638da5cb5b1161016457806397f012d91161013e57806397f012d9146107ef5780639c3372ea1461080f5780639eec101e1461082f578063a42340691461085057600080fd5b80638da5cb5b1461079c57806391b89fba146107ba57806395d89b41146107da57600080fd5b80636d48467b146106db57806370a08231146106fb578063715018a61461073157806374c13fda1461074657806385a6b3ae146107665780638bc1d6391461077c57600080fd5b8063313ce5671161026a5780634e7b827f116102235780635ebf4db9116101fd5780635ebf4db91461065657806365b8dbc0146106765780636a474002146106965780636b69163b146106ab57600080fd5b80634e7b827f146105af5780635183d6fd146105df5780635a84c5eb1461063657600080fd5b8063313ce567146104f257806331e79db01461050e5780633599bb171461052e578063395093511461054e57806340ffdd801461056e578063418089041461058e57600080fd5b806318160ddd116102d757806323b872dd116102b157806323b872dd1461047e57806325cd35981461049e57806327ce0147146104bc5780633009a609146104dc57600080fd5b806318160ddd1461040c5780631d4ff89a14610421578063226cfa3d1461045157600080fd5b806303c833021461033257806306fdde031461033a5780630928847114610365578063095ea7b31461038557806309bbedde146103b55780631694505e146103d457600080fd5b3661032d5761032b610a7d565b005b600080fd5b61032b610a7d565b34801561034657600080fd5b5061034f610b10565b60405161035c9190612788565b60405180910390f35b34801561037157600080fd5b5061032b6103803660046127ee565b610ba2565b34801561039157600080fd5b506103a56103a036600461280b565b610bf6565b604051901515815260200161035c565b3480156103c157600080fd5b50600a545b60405190815260200161035c565b3480156103e057600080fd5b506015546103f4906001600160a01b031681565b6040516001600160a01b03909116815260200161035c565b34801561041857600080fd5b506002546103c6565b34801561042d57600080fd5b506103a561043c3660046127ee565b60116020526000908152604090205460ff1681565b34801561045d57600080fd5b506103c661046c3660046127ee565b60176020526000908152604090205481565b34801561048a57600080fd5b506103a5610499366004612837565b610c0d565b3480156104aa57600080fd5b506012546001600160a01b03166103f4565b3480156104c857600080fd5b506103c66104d73660046127ee565b610c76565b3480156104e857600080fd5b506103c6600e5481565b3480156104fe57600080fd5b506040516012815260200161035c565b34801561051a57600080fd5b5061032b6105293660046127ee565b610cd2565b34801561053a57600080fd5b5061032b610549366004612886565b610d6c565b34801561055a57600080fd5b506103a561056936600461280b565b610e0d565b34801561057a57600080fd5b5061032b610589366004612886565b610e43565b34801561059a57600080fd5b506012546103a590600160a81b900460ff1681565b3480156105bb57600080fd5b506103a56105ca3660046127ee565b600f6020526000908152604090205460ff1681565b3480156105eb57600080fd5b506105ff6105fa3660046128a3565b610ed9565b604080516001600160a01b0390971687526020870195909552938501929092526060840152608083015260a082015260c00161035c565b34801561064257600080fd5b5061032b6106513660046128a3565b610f39565b34801561066257600080fd5b5061032b6106713660046128a3565b610f7b565b34801561068257600080fd5b5061032b6106913660046127ee565b610fbd565b3480156106a257600080fd5b5061032b611009565b3480156106b757600080fd5b506103a56106c63660046127ee565b60106020526000908152604090205460ff1681565b3480156106e757600080fd5b506103a56106f63660046127ee565b611093565b34801561070757600080fd5b506103c66107163660046127ee565b6001600160a01b031660009081526020819052604090205490565b34801561073d57600080fd5b5061032b6110df565b34801561075257600080fd5b506012546103f4906001600160a01b031681565b34801561077257600080fd5b506103c660085481565b34801561078857600080fd5b5061032b6107973660046128bc565b611153565b3480156107a857600080fd5b506009546001600160a01b03166103f4565b3480156107c657600080fd5b506103c66107d53660046127ee565b6111a8565b3480156107e657600080fd5b5061034f6111b3565b3480156107fb57600080fd5b506016546103f4906001600160a01b031681565b34801561081b57600080fd5b5061032b61082a366004612886565b6111c2565b34801561083b57600080fd5b506012546103a590600160a01b900460ff1681565b34801561085c57600080fd5b506012546103a590600160b01b900460ff1681565b34801561087d57600080fd5b506103a561088c36600461280b565b611258565b34801561089d57600080fd5b506103c66108ac3660046127ee565b6112a7565b3480156108bd57600080fd5b506103a56108cc36600461280b565b6112d3565b3480156108dd57600080fd5b506103c66108ec3660046127ee565b6001600160a01b031660009081526007602052604090205490565b34801561091357600080fd5b5061032b6109223660046128bc565b6112e0565b34801561093357600080fd5b506103a56109423660046127ee565b611335565b34801561095357600080fd5b506103a56109623660046128bc565b611381565b34801561097357600080fd5b5061032b6109823660046127ee565b611502565b34801561099357600080fd5b506103c66109a23660046128f5565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b3480156109d957600080fd5b5061032b6109e836600461280b565b61154e565b3480156109f957600080fd5b50600e546103c6565b348015610a0e57600080fd5b5061032b610a1d3660046127ee565b6115e6565b348015610a2e57600080fd5b506105ff610a3d3660046127ee565b6116d1565b348015610a4e57600080fd5b50610a62610a5d3660046128a3565b611780565b6040805193845260208401929092529082015260600161035c565b6000610a8860025490565b11610a9257600080fd5b3415610b0e57610ac5610aa460025490565b610ab234600160801b6118a6565b610abc9190612939565b6005549061192f565b60055560405134815233907fa493a9229478c3fcd73f66d2cdeb7f94fd0f341da924d1054236d784541165119060200160405180910390a2600854610b0a903461192f565b6008555b565b606060138054610b1f9061295b565b80601f0160208091040260200160405190810160405280929190818152602001828054610b4b9061295b565b8015610b985780601f10610b6d57610100808354040283529160200191610b98565b820191906000526020600020905b815481529060010190602001808311610b7b57829003601f168201915b5050505050905090565b6009546001600160a01b03163314610bd55760405162461bcd60e51b8152600401610bcc90612995565b60405180910390fd5b6001600160a01b03166000908152600f60205260409020805460ff19169055565b6000610c0333848461198e565b5060015b92915050565b6000610c1a848484611ab2565b610c6c8433610c6785604051806060016040528060288152602001612b8a602891396001600160a01b038a1660009081526001602090815260408083203384529091529020549190611af6565b61198e565b5060019392505050565b6001600160a01b03811660009081526006602090815260408083205491839052822054600554600160801b92610cc892610cc392610cbd91610cb891906118a6565b611b30565b90611b40565b611b7e565b610c079190612939565b6009546001600160a01b03163314610cfc5760405162461bcd60e51b8152600401610bcc90612995565b6001600160a01b0381166000908152600f60205260408120805460ff19166001179055610d2a908290611b91565b610d35600a82611bf0565b6040516001600160a01b038216907fa878b31040b2e6d0a9a3d3361209db3908ba62014b0dca52adbaee451d128b2590600090a250565b6009546001600160a01b03163314610d965760405162461bcd60e51b8152600401610bcc90612995565b801515601260169054906101000a900460ff16151503610db557600080fd5b60128054821515600160b01b0260ff60b01b199091161790556040517f3da2593f2c4724acfbd754045321e852cad26f3974834b1890045530f89c21b390610e0290831515815260200190565b60405180910390a150565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610c03918590610c67908661192f565b6009546001600160a01b03163314610e6d5760405162461bcd60e51b8152600401610bcc90612995565b801515601260159054906101000a900460ff16151503610e8c57600080fd5b60128054821515600160a81b0260ff60a81b199091161790556040517fc138a28750b971696f46ea59731c471ef1e08e4015404afdb139fd2e87dca1bb90610e0290831515815260200190565b600080600080600080610eeb600a5490565b8710610f0a575060009450600019935083925084915081905080610f30565b6000610f17600a89611d2b565b9050610f22816116d1565b965096509650965096509650505b91939550919395565b6009546001600160a01b03163314610f635760405162461bcd60e51b8152600401610bcc90612995565b610f7581670de0b6b3a76400006129ca565b60185550565b6009546001600160a01b03163314610fa55760405162461bcd60e51b8152600401610bcc90612995565b610fb781670de0b6b3a76400006129ca565b60195550565b6009546001600160a01b03163314610fe75760405162461bcd60e51b8152600401610bcc90612995565b601580546001600160a01b0319166001600160a01b0392909216919091179055565b60405162461bcd60e51b815260206004820152605360248201527f77697468647261774469766964656e642064697361626c65642e20557365207460448201527f68652027636c61696d272066756e6374696f6e206f6e20746865206d61696e206064820152722120a12ca32627a5a49031b7b73a3930b1ba1760691b608482015260a401610bcc565b6009546000906001600160a01b031633146110c05760405162461bcd60e51b8152600401610bcc90612995565b506001600160a01b031660009081526010602052604090205460ff1690565b6009546001600160a01b031633146111095760405162461bcd60e51b8152600401610bcc90612995565b6009546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600980546001600160a01b0319169055565b6009546001600160a01b0316331461117d5760405162461bcd60e51b8152600401610bcc90612995565b6001600160a01b03919091166000908152601060205260409020805460ff1916911515919091179055565b6000610c07826112a7565b606060148054610b1f9061295b565b6009546001600160a01b031633146111ec5760405162461bcd60e51b8152600401610bcc90612995565b801515601260149054906101000a900460ff1615150361120b57600080fd5b60128054821515600160a01b0260ff60a01b199091161790556040517f8d34c313963017194ed726d050e868657d0e2d2c6748d13e358cd4b89d4ee7c890610e0290831515815260200190565b6000610c033384610c6785604051806060016040528060258152602001612bb2602591393360009081526001602090815260408083206001600160a01b038d1684529091529020549190611af6565b6001600160a01b038116600090815260076020526040812054610c07906112cd84610c76565b90611d5e565b6000610c03338484611ab2565b6009546001600160a01b0316331461130a5760405162461bcd60e51b8152600401610bcc90612995565b6001600160a01b03919091166000908152601160205260409020805460ff1916911515919091179055565b6009546000906001600160a01b031633146113625760405162461bcd60e51b8152600401610bcc90612995565b506001600160a01b031660009081526011602052604090205460ff1690565b6009546000906001600160a01b031633146113ae5760405162461bcd60e51b8152600401610bcc90612995565b601254600160b01b900460ff16156113c857506000610c07565b6001600160a01b03831660009081526011602052604090205460ff168280156113ee5750805b80156114045750601254600160a81b900460ff16155b15611413576000915050610c07565b6000816114285761142385611da0565b611431565b61143185612059565b905080156114f7576001600160a01b038516600090815260176020526040902042905581156114a557831515856001600160a01b03167ffbd928dd3806a2bdf802f3a28a2cc55205f95dbcd2c3ed313abfca278366f80c8360405161149891815260200190565b60405180910390a36114ec565b831515856001600160a01b03167fa2c38e2d2fb7e3e1912d937fd1ca11ed6d51864dee4cfa7a7bf02becd7acf092836040516114e391815260200190565b60405180910390a35b600192505050610c07565b506000949350505050565b6009546001600160a01b0316331461152c5760405162461bcd60e51b8152600401610bcc90612995565b601280546001600160a01b0319166001600160a01b0392909216919091179055565b6009546001600160a01b031633146115785760405162461bcd60e51b8152600401610bcc90612995565b6001600160a01b0382166000908152600f602052604090205460ff166115b8576019548110156115bc576115ad600a83611bf0565b6115b8826000611b91565b5050565b6115c68282611b91565b60185481106115db576115b8600a83836123cc565b6115b8600a83611bf0565b6009546001600160a01b031633146116105760405162461bcd60e51b8152600401610bcc90612995565b6001600160a01b0381166116755760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610bcc565b6009546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600980546001600160a01b0319166001600160a01b0392909216919091179055565b806000808080806116e3600a87612475565b945060001993506000851261174557600e5485111561171157600e5461170a9086906124c0565b9350611745565b600e54600a5460009110611726576000611735565b600e54600a5461173591611d5e565b90506117418682611b40565b9450505b61174e866112a7565b925061175986610c76565b6001600160a01b038716600090815260176020526040902054969895975093959294915050565b600a54600090819081908015806117a05750601254600160b01b900460ff165b156117b6575050600e546000925082915061189f565b600e546000805a90506000805b89841080156117d157508582105b1561188e57846117e0816129e1565b9550508585106117ef57600094505b6000600a6000018681548110611807576118076129fa565b60009182526020808320909101546001600160a01b0316808352601090915260409091205490915060ff1661185457611841816001611381565b156118545781611850816129e1565b9250505b8261185e816129e1565b93505060005a9050808511156118855761188261187b8683611d5e565b879061192f565b95505b93506117c39050565b600e85905590975095509193505050505b9193909250565b6000826000036118b857506000610c07565b60006118c483856129ca565b9050826118d18583612939565b146119285760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610bcc565b9392505050565b60008061193c8385612a10565b9050838110156119285760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610bcc565b6001600160a01b0383166119f05760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610bcc565b6001600160a01b038216611a515760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610bcc565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60405162461bcd60e51b8152602060048201526014602482015273139bc81d1c985b9cd9995c9cc8185b1b1bddd95960621b6044820152606401610bcc565b505050565b60008184841115611b1a5760405162461bcd60e51b8152600401610bcc9190612788565b506000611b278486612a23565b95945050505050565b60008181811215610c0757600080fd5b600080611b4d8385612a36565b905060008312158015611b605750838112155b80611b755750600083128015611b7557508381125b61192857600080fd5b600080821215611b8d57600080fd5b5090565b6001600160a01b03821660009081526020819052604090205480821115611bd0576000611bbe8383611d5e565b9050611bca84826124fd565b50505050565b80821015611af1576000611be48284611d5e565b9050611bca8482612561565b6001600160a01b038116600090815260038301602052604090205460ff16611c16575050565b6001600160a01b03811660009081526003830160209081526040808320805460ff1916905560018086018352818420849055600286019092528220548454909291611c6091612a23565b90506000846000018281548110611c7957611c796129fa565b60009182526020808320909101546001600160a01b03908116808452600289019092526040808420879055908716835282209190915585549091508190869085908110611cc857611cc86129fa565b600091825260209091200180546001600160a01b0319166001600160a01b03929092169190911790558454859080611d0257611d02612a5e565b600082815260209020810160001990810180546001600160a01b03191690550190555050505050565b6000826000018281548110611d4257611d426129fa565b6000918252602090912001546001600160a01b03169392505050565b600061192883836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611af6565b600080611dac836112a7565b90508015612050576001600160a01b038316600090815260076020526040902054611dd7908261192f565b6001600160a01b03808516600090815260076020526040812092909255601254169081611e5c576040516001600160a01b03861690610bb89085906000818181858888f193505050503d8060008114611e4c576040519150601f19603f3d011682016040523d82523d6000602084013e611e51565b606091505b505080915050611fb6565b6040805160028082526060820183526000926020830190803683375050601554604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c4648925060048083019260209291908290030181865afa158015611ec6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611eea9190612a74565b81600081518110611efd57611efd6129fa565b60200260200101906001600160a01b031690816001600160a01b0316815250508281600181518110611f3157611f316129fa565b6001600160a01b03928316602091820292909201015260155460405163b6f9de9560e01b815291169063b6f9de95908690611f779060009086908c904290600401612ad5565b6000604051808303818588803b158015611f9057600080fd5b505af193505050508015611fa2575060015b611faf5760009150611fb4565b600191505b505b80612004576001600160a01b038516600090815260076020526040902054611fde9084611d5e565b6001600160a01b0390951660009081526007602052604081209590955550929392505050565b846001600160a01b03167fee503bee2bb6a87e57bc57db795f98137327401a0e7b7ce42e37926cc1a9ca4d8460405161203f91815260200190565b60405180910390a250909392505050565b50600092915050565b600080612065836112a7565b90508015612050576001600160a01b038316600090815260076020526040812054612090908361192f565b6001600160a01b03851660009081526007602052604080822092909255815160028082526060820190935290918160200160208202803683375050601554604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c4648925060048083019260209291908290030181865afa158015612118573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061213c9190612a74565b8160008151811061214f5761214f6129fa565b6001600160a01b039283166020918202929092010152601654825191169082906001908110612180576121806129fa565b6001600160a01b0392831660209182029290920101526016546040516370a0823160e01b815230600482015260009291909116906370a0823190602401602060405180830381865afa1580156121da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121fe9190612b0a565b60155460405163b6f9de9560e01b81529192506001600160a01b03169063b6f9de9590869061223890600090879030904290600401612ad5565b6000604051808303818588803b15801561225157600080fd5b505af193505050508015612263575060015b6122705760009250612373565b6016546040516370a0823160e01b81523060048201526000916122e39184916001600160a01b0316906370a0823190602401602060405180830381865afa1580156122bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112cd9190612b0a565b9050801561236c5760165460405163a9059cbb60e01b81526001600160a01b03898116600483015260248201849052600196509091169063a9059cbb906044016020604051808303816000875af1158015612342573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123669190612b23565b50612371565b600093505b505b826123c2576001600160a01b03861660009081526007602052604090205461239b9085611d5e565b6001600160a01b039096166000908152600760205260408120969096555093949350505050565b5091949350505050565b6001600160a01b038216600090815260038401602052604090205460ff1615612411576001600160a01b03821660009081526001840160205260409020819055505050565b6001600160a01b03821660008181526003850160209081526040808320805460ff19166001908117909155878101835281842086905587546002890184529184208290558101875586835291200180546001600160a01b0319169091179055505050565b6001600160a01b038116600090815260038301602052604081205460ff166124a05750600019610c07565b506001600160a01b03166000908152600291909101602052604090205490565b6000806124cd8385612b40565b9050600083121580156124e05750838113155b80611b755750600083128015611b75575083811361192857600080fd5b61250782826125a5565b612541612522610cb8836005546118a690919063ffffffff16565b6001600160a01b038416600090815260066020526040902054906124c0565b6001600160a01b0390921660009081526006602052604090209190915550565b61256b8282612684565b612541612586610cb8836005546118a690919063ffffffff16565b6001600160a01b03841660009081526006602052604090205490611b40565b6001600160a01b0382166125fb5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610bcc565b600254612608908261192f565b6002556001600160a01b03821660009081526020819052604090205461262e908261192f565b6001600160a01b038316600081815260208181526040808320949094559251848152919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91015b60405180910390a35050565b6001600160a01b0382166126e45760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610bcc565b61272181604051806060016040528060228152602001612b68602291396001600160a01b0385166000908152602081905260409020549190611af6565b6001600160a01b0383166000908152602081905260409020556002546127479082611d5e565b6002556040518181526000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001612678565b600060208083528351808285015260005b818110156127b557858101830151858201604001528201612799565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b03811681146127eb57600080fd5b50565b60006020828403121561280057600080fd5b8135611928816127d6565b6000806040838503121561281e57600080fd5b8235612829816127d6565b946020939093013593505050565b60008060006060848603121561284c57600080fd5b8335612857816127d6565b92506020840135612867816127d6565b929592945050506040919091013590565b80151581146127eb57600080fd5b60006020828403121561289857600080fd5b813561192881612878565b6000602082840312156128b557600080fd5b5035919050565b600080604083850312156128cf57600080fd5b82356128da816127d6565b915060208301356128ea81612878565b809150509250929050565b6000806040838503121561290857600080fd5b8235612913816127d6565b915060208301356128ea816127d6565b634e487b7160e01b600052601160045260246000fd5b60008261295657634e487b7160e01b600052601260045260246000fd5b500490565b600181811c9082168061296f57607f821691505b60208210810361298f57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b8082028115828204841417610c0757610c07612923565b6000600182016129f3576129f3612923565b5060010190565b634e487b7160e01b600052603260045260246000fd5b80820180821115610c0757610c07612923565b81810381811115610c0757610c07612923565b8082018281126000831280158216821582161715612a5657612a56612923565b505092915050565b634e487b7160e01b600052603160045260246000fd5b600060208284031215612a8657600080fd5b8151611928816127d6565b600081518084526020808501945080840160005b83811015612aca5781516001600160a01b031687529582019590820190600101612aa5565b509495945050505050565b848152608060208201526000612aee6080830186612a91565b6001600160a01b03949094166040830152506060015292915050565b600060208284031215612b1c57600080fd5b5051919050565b600060208284031215612b3557600080fd5b815161192881612878565b8181036000831280158383131683831282161715612b6057612b60612923565b509291505056fe45524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212209981fa0bb45019d63eb880cae6d660f0236ec6f0cd3cfb27a6ee489f0f17167164736f6c63430008110033

Deployed Bytecode

0x6080604052600436106104b95760003560e01c806377a3b6091161026b578063acb2ad6f1161014f578063e14a93d6116100c1578063f27fd25411610085578063f27fd25414610e5e578063f2fde38b14610e7e578063f5d3c79a14610e9e578063f637434214610ebe578063f8b45b0514610ed4578063fc6b151c14610eea57600080fd5b8063e14a93d614610de7578063e2f4560514610e07578063e7841ec014610e1d578063ebae7c1c14610e32578063f11a24d314610e4857600080fd5b8063ba079d4911610113578063ba079d4914610d0b578063bb8d513114610d2b578063d07a091c14610d41578063d5e3725114610d61578063d8032ed314610d81578063dd62ed3e14610da157600080fd5b8063acb2ad6f14610c38578063ad56c13c14610c4e578063b494298814610ca5578063b62496f514610cbb578063b74e3b1114610ceb57600080fd5b806395451c29116101e85780639c3b4fdc116101ac5780639c3b4fdc14610b8c5780639ec1037e14610ba2578063a0d82dc514610bc2578063a457c2d714610bd8578063a8b9d24014610bf8578063a9059cbb14610c1857600080fd5b806395451c2914610b0b57806395d89b4114610b215780639a7a23d614610b365780639c1b8af514610b565780639c3372ea14610b6c57600080fd5b8063871c128d1161022f578063871c128d14610a815780638c3c82b214610aa15780638ca2923a14610ab75780638da5cb5b14610acd5780638ea5220f14610aeb57600080fd5b806377a3b609146109eb5780637fdde05c14610a01578063837ae2d014610a215780638577a6d514610a41578063868730c714610a6157600080fd5b80634a62bb651161039d57806366236b4a1161030f578063700bb191116102d3578063700bb1911461093657806370a0823114610956578063715018a61461097657806372d8edf41461098b57806375829def146109ab57806375f0a874146109cb57600080fd5b806366236b4a146108a0578063679ca6e9146108c05780636843cd84146108e05780636a42b8f8146109005780636d48467b1461091657600080fd5b80635124f874116103615780635124f874146107ff5780635a84c5eb146108155780635c234bb6146108355780635ebf4db91461084b5780635eee4bae1461086b57806364b0f6531461088b57600080fd5b80634a62bb651461075d5780634a74bb02146107775780634ada218b146107915780634e71d92d146107b25780634fbee193146107c757600080fd5b80632307b44111610436578063313ce567116103fa578063313ce567146106ab5780633599bb17146106c757806339509351146106e75780633f407b841461070757806340ffdd801461071d57806349bd5a5e1461073d57600080fd5b80632307b4411461062157806323b872dd1461064157806325cd3598146106615780632c1f52161461067657806330bb4cff1461069657600080fd5b8063095ea7b31161047d578063095ea7b3146105865780631694505e146105b657806318160ddd146105d65780631d7b1fb4146105f55780631fa705311461060b57600080fd5b806303fd2a45146104c557806305ca5f081461050257806306fdde031461052457806308dfe8a514610546578063092316021461056657600080fd5b366104c057005b600080fd5b3480156104d157600080fd5b506008546104e5906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561050e57600080fd5b5061052261051d366004613e20565b610f0a565b005b34801561053057600080fd5b50610539610fdb565b6040516104f99190613e39565b34801561055257600080fd5b50610522610561366004613eaa565b61106d565b34801561057257600080fd5b50610522610581366004613e20565b6110f4565b34801561059257600080fd5b506105a66105a1366004613ee3565b611183565b60405190151581526020016104f9565b3480156105c257600080fd5b506006546104e5906001600160a01b031681565b3480156105e257600080fd5b506002545b6040519081526020016104f9565b34801561060157600080fd5b506105e7602a5481565b34801561061757600080fd5b506105e7600a5481565b34801561062d57600080fd5b5061052261063c366004613fe5565b61119a565b34801561064d57600080fd5b506105a661065c3660046140a7565b61136b565b34801561066d57600080fd5b506104e56113d4565b34801561068257600080fd5b50600d546104e5906001600160a01b031681565b3480156106a257600080fd5b506105e7611447565b3480156106b757600080fd5b50604051601281526020016104f9565b3480156106d357600080fd5b506105226106e23660046140e8565b6114b5565b3480156106f357600080fd5b506105a6610702366004613ee3565b611542565b34801561071357600080fd5b506105e760095481565b34801561072957600080fd5b506105226107383660046140e8565b611578565b34801561074957600080fd5b506007546104e5906001600160a01b031681565b34801561076957600080fd5b506023546105a69060ff1681565b34801561078357600080fd5b50601e546105a69060ff1681565b34801561079d57600080fd5b506008546105a690600160a81b900460ff1681565b3480156107be57600080fd5b506105226115d3565b3480156107d357600080fd5b506105a66107e2366004614105565b6001600160a01b0316600090815260208052604090205460ff1690565b34801561080b57600080fd5b506105e760185481565b34801561082157600080fd5b50610522610830366004613e20565b61164b565b34801561084157600080fd5b506105e760175481565b34801561085757600080fd5b50610522610866366004613e20565b6116a6565b34801561087757600080fd5b50610522610886366004613e20565b611701565b34801561089757600080fd5b506105e7611743565b3480156108ac57600080fd5b506105226108bb366004613e20565b61178d565b3480156108cc57600080fd5b506105226108db3660046140e8565b61183e565b3480156108ec57600080fd5b506105e76108fb366004614105565b61187b565b34801561090c57600080fd5b506105e760295481565b34801561092257600080fd5b506105a6610931366004614105565b6118eb565b34801561094257600080fd5b50610522610951366004613e20565b61195b565b34801561096257600080fd5b506105e7610971366004614105565b611a2d565b34801561098257600080fd5b50610522611a48565b34801561099757600080fd5b506105226109a6366004614105565b611abc565b3480156109b757600080fd5b506105226109c6366004614105565b611b18565b3480156109d757600080fd5b50600e546104e5906001600160a01b031681565b3480156109f757600080fd5b506105e7601a5481565b348015610a0d57600080fd5b50610522610a1c366004613eaa565b611bcc565b348015610a2d57600080fd5b50610522610a3c366004614122565b611c21565b348015610a4d57600080fd5b50610522610a5c366004613e20565b611dcf565b348015610a6d57600080fd5b50610522610a7c3660046140e8565b611e86565b348015610a8d57600080fd5b50610522610a9c366004613e20565b611ebe565b348015610aad57600080fd5b506105e760285481565b348015610ac357600080fd5b506105e760145481565b348015610ad957600080fd5b506005546001600160a01b03166104e5565b348015610af757600080fd5b50600f546104e5906001600160a01b031681565b348015610b1757600080fd5b506105e760155481565b348015610b2d57600080fd5b50610539611f3a565b348015610b4257600080fd5b50610522610b51366004613eaa565b611f49565b348015610b6257600080fd5b506105e7601f5481565b348015610b7857600080fd5b50610522610b873660046140e8565b611f81565b348015610b9857600080fd5b506105e7601b5481565b348015610bae57600080fd5b50610522610bbd366004614105565b611fdd565b348015610bce57600080fd5b506105e7601c5481565b348015610be457600080fd5b506105a6610bf3366004613ee3565b6120b4565b348015610c0457600080fd5b506105e7610c13366004614105565b612103565b348015610c2457600080fd5b506105a6610c33366004613ee3565b612136565b348015610c4457600080fd5b506105e7601d5481565b348015610c5a57600080fd5b50610c6e610c69366004614105565b612143565b604080516001600160a01b0390971687526020870195909552938501929092526060840152608083015260a082015260c0016104f9565b348015610cb157600080fd5b506105e760275481565b348015610cc757600080fd5b506105a6610cd6366004614105565b60216020526000908152604090205460ff1681565b348015610cf757600080fd5b50610522610d06366004613e20565b6121d3565b348015610d1757600080fd5b506105a6610d26366004614105565b612263565b348015610d3757600080fd5b506105e760135481565b348015610d4d57600080fd5b50610522610d5c366004614105565b612296565b348015610d6d57600080fd5b50610522610d7c3660046140e8565b61238c565b348015610d8d57600080fd5b50610522610d9c366004614105565b61240e565b348015610dad57600080fd5b506105e7610dbc36600461418a565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b348015610df357600080fd5b50610522610e023660046141b8565b6124d1565b348015610e1357600080fd5b506105e760125481565b348015610e2957600080fd5b506105e7612653565b348015610e3e57600080fd5b506105e760115481565b348015610e5457600080fd5b506105e760195481565b348015610e6a57600080fd5b50610c6e610e79366004613e20565b61269d565b348015610e8a57600080fd5b50610522610e99366004614105565b6126db565b348015610eaa57600080fd5b50610522610eb93660046140e8565b6127c6565b348015610eca57600080fd5b506105e760165481565b348015610ee057600080fd5b506105e760105481565b348015610ef657600080fd5b50610522610f05366004613e20565b6127fe565b6005546001600160a01b03163314610f3d5760405162461bcd60e51b8152600401610f34906141ea565b60405180910390fd5b610f4f81670de0b6b3a7640000614235565b90506000610f6a600954600a546128b390919063ffffffff16565b90506000610f8d82610f87600a548661291990919063ffffffff16565b9061299b565b90506000610faa83610f876009548761291990919063ffffffff16565b9050610fb5846129dd565b600a54610fc29083612cdd565b600a55600954610fd29082612cdd565b60095550505050565b606060038054610fea9061424c565b80601f01602080910402602001604051908101604052809291908181526020018280546110169061424c565b80156110635780601f1061103857610100808354040283529160200191611063565b820191906000526020600020905b81548152906001019060200180831161104657829003601f168201915b5050505050905090565b6005546001600160a01b031633146110975760405162461bcd60e51b8152600401610f34906141ea565b6001600160a01b03821660008181526020808052604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6005546001600160a01b0316331461111e5760405162461bcd60e51b8152600401610f34906141ea565b603281101561116f5760405162461bcd60e51b815260206004820152601e60248201527f63616e206e6576657220626520736574206c6f776572207468616e20353000006044820152606401610f34565b61117d81633b9aca00614235565b60245550565b6000611190338484612d1f565b5060015b92915050565b6005546001600160a01b031633146111c45760405162461bcd60e51b8152600401610f34906141ea565b80518251146112155760405162461bcd60e51b815260206004820152601e60248201527f417272617973206d757374206265207468652073616d65206c656e67746800006044820152606401610f34565b60c8825111156112725760405162461bcd60e51b815260206004820152602260248201527f57616c6c657473206c697374206c656e677468206d757374206265203c3d2032604482015261030360f41b6064820152608401610f34565b60005b825181101561136657600083828151811061129257611292614286565b6020026020010151905060008383815181106112b0576112b0614286565b6020026020010151670de0b6b3a76400006112cb9190614235565b90506112d8338383612e44565b600d546001600160a01b031663e30443bc836112f381611a2d565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561133957600080fd5b505af115801561134d573d6000803e3d6000fd5b505050505050808061135e9061429c565b915050611275565b505050565b6000611378848484612f4d565b6113ca84336113c5856040518060600160405280602881526020016144f1602891396001600160a01b038a1660009081526001602090815260408083203384529091529020549190613a40565b612d1f565b5060019392505050565b600d54604080516304b9a6b360e31b815290516000926001600160a01b0316916325cd35989160048083019260209291908290030181865afa15801561141e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061144291906142b5565b905090565b600d54604080516342d359d760e11b815290516000926001600160a01b0316916385a6b3ae9160048083019260209291908290030181865afa158015611491573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061144291906142d2565b6005546001600160a01b031633146114df5760405162461bcd60e51b8152600401610f34906141ea565b600d54604051633599bb1760e01b815282151560048201526001600160a01b0390911690633599bb17906024015b600060405180830381600087803b15801561152757600080fd5b505af115801561153b573d6000803e3d6000fd5b5050505050565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916111909185906113c590866128b3565b6005546001600160a01b031633146115a25760405162461bcd60e51b8152600401610f34906141ea565b600d546040516281ffbb60e71b815282151560048201526001600160a01b03909116906340ffdd809060240161150d565b600d5460405163bc4c4b3760e01b8152336004820152600060248201526001600160a01b039091169063bc4c4b37906044016020604051808303816000875af1158015611624573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061164891906142eb565b50565b6005546001600160a01b031633146116755760405162461bcd60e51b8152600401610f34906141ea565b600d54604051635a84c5eb60e01b8152600481018390526001600160a01b0390911690635a84c5eb9060240161150d565b6005546001600160a01b031633146116d05760405162461bcd60e51b8152600401610f34906141ea565b600d54604051635ebf4db960e01b8152600481018390526001600160a01b0390911690635ebf4db99060240161150d565b6005546001600160a01b0316331461172b5760405162461bcd60e51b8152600401610f34906141ea565b61173d81670de0b6b3a7640000614235565b60125550565b600d54604080516304ddf6ef60e11b815290516000926001600160a01b0316916309bbedde9160048083019260209291908290030181865afa158015611491573d6000803e3d6000fd5b6005546001600160a01b031633146117b75760405162461bcd60e51b8152600401610f34906141ea565b6117c981670de0b6b3a7640000614235565b90506103e86002546117db9190614308565b8110156118395760405162461bcd60e51b815260206004820152602660248201527f6d61782074782063616e6e6f742062652073657420746f206c657373207468616044820152656e20302e312560d01b6064820152608401610f34565b601155565b6005546001600160a01b031633146118685760405162461bcd60e51b8152600401610f34906141ea565b6023805460ff1916911515919091179055565b600d546040516370a0823160e01b81526001600160a01b03838116600483015260009216906370a08231906024015b602060405180830381865afa1580156118c7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061119491906142d2565b600d54604051636d48467b60e01b81526001600160a01b0383811660048301526000921690636d48467b906024015b602060405180830381865afa158015611937573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061119491906142eb565b600d546040516001624d3b8760e01b0319815260048101839052600091829182916001600160a01b03169063ffb2c479906024016060604051808303816000875af11580156119ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119d2919061432a565b604080518481526020810184905290810182905260608101889052929550909350915032906000907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989060800160405180910390a350505050565b6001600160a01b031660009081526020819052604090205490565b6005546001600160a01b03163314611a725760405162461bcd60e51b8152600401610f34906141ea565b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b6005546001600160a01b03163314611ae65760405162461bcd60e51b8152600401610f34906141ea565b600d5460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db09060240161150d565b6005546001600160a01b03163314611b425760405162461bcd60e51b8152600401610f34906141ea565b600d5460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db090602401600060405180830381600087803b158015611b8957600080fd5b505af1158015611b9d573d6000803e3d6000fd5b5050506001600160a01b03821660009081526020805260409020805460ff1916600117905550611648816126db565b6005546001600160a01b03163314611bf65760405162461bcd60e51b8152600401610f34906141ea565b6001600160a01b03919091166000908152602260205260409020805460ff1916911515919091179055565b6005546001600160a01b03163314611c4b5760405162461bcd60e51b8152600401610f34906141ea565b60178a905560188890556019869055601a8490556014899055601587905560168590556013839055601b829055601c819055611c9381611c8d8981878a6128b3565b906128b3565b600b81905550611cbc601b54611c8d601854611c8d601954601a546128b390919063ffffffff16565b600c55600b54602310801590611cd557506011600c5411155b611d365760405162461bcd60e51b815260206004820152602c60248201527f746f74616c20666565732063616e6e6f7420657863656564203335252073656c60448201526b6c206f72203137252062757960a01b6064820152608401610f34565b601454601554601654601354601754601854601954601a54601b54601c54604080519a8b5260208b0199909952978901969096526060880194909452608087019290925260a086015260c085015260e08401526101008301526101208201527f07cec4532bdb36ce729ae72905c09f7bfbf8682c2cc2f1999f745188d9975122906101400160405180910390a150505050505050505050565b6005546001600160a01b03163314611df95760405162461bcd60e51b8152600401610f34906141ea565b600a811115611e4a5760405162461bcd60e51b815260206004820152601e60248201527f7472616e73666572206665652063616e6e6f74206578636565642031302500006044820152606401610f34565b601d8190556040518181527f6fbeac6c79c640ca4f5f47271bd7a36c7eb83076224c65a3b3378c8844720343906020015b60405180910390a150565b600d54604051638bc1d63960e01b815233600482015282151560248201526001600160a01b0390911690638bc1d6399060440161150d565b6005546001600160a01b03163314611ee85760405162461bcd60e51b8152600401610f34906141ea565b62030d408110158015611efe5750621e84808111155b611f0757600080fd5b601f5460405182907f40d7e40e79af4e8e5a9b3c57030d8ea93f13d669c06d448c4d631d4ae7d23db790600090a3601f55565b606060048054610fea9061424c565b6005546001600160a01b03163314611f735760405162461bcd60e51b8152600401610f34906141ea565b611f7d8282613a7a565b5050565b6005546001600160a01b03163314611fab5760405162461bcd60e51b8152600401610f34906141ea565b600d54604051634e19b97560e11b815282151560048201526001600160a01b0390911690639c3372ea9060240161150d565b6005546001600160a01b031633146120075760405162461bcd60e51b8152600401610f34906141ea565b600d54604051630928847160e01b81526001600160a01b03838116600483015290911690630928847190602401600060405180830381600087803b15801561204e57600080fd5b505af1158015612062573d6000803e3d6000fd5b5050600d546001600160a01b0316915063e30443bc90508261208381611a2d565b6040516001600160e01b031960e085901b1681526001600160a01b039092166004830152602482015260440161150d565b600061119033846113c585604051806060016040528060258152602001614519602591393360009081526001602090815260408083206001600160a01b038d1684529091529020549190613a40565b600d546040516302a2e74960e61b81526001600160a01b038381166004830152600092169063a8b9d240906024016118aa565b6000611190338484612f4d565b600d5460405163fbcbc0f160e01b81526001600160a01b038381166004830152600092839283928392839283929091169063fbcbc0f1906024015b60c060405180830381865afa15801561219b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121bf9190614358565b949c939b5091995097509550909350915050565b6005546001600160a01b031633146121fd5760405162461bcd60e51b8152600401610f34906141ea565b61012c81111561225e5760405162461bcd60e51b815260206004820152602660248201527f636f6f6c646f776e2074696d65722063616e6e6f74206578636565642035206d604482015265696e7574657360d01b6064820152608401610f34565b602a55565b600d5460405163ba079d4960e01b81526001600160a01b038381166004830152600092169063ba079d499060240161191a565b6005546001600160a01b031633146122c05760405162461bcd60e51b8152600401610f34906141ea565b6001600160a01b0381811660008181526022602090815260408083208054600160ff1991821681179092559280529281902080549092169092179055600d54905163031e79db60e41b81526004810192909252909116906331e79db090602401600060405180830381600087803b15801561233a57600080fd5b505af115801561234e573d6000803e3d6000fd5b50506040516001600160a01b03841681527f85d097e432d8e396fa72c83ebd34196326e1cf1694ef910cd53554b2ee7597c592506020019050611e7b565b6005546001600160a01b031633146123b65760405162461bcd60e51b8152600401610f34906141ea565b601e5481151560ff9091161515036123cd57600080fd5b601e805460ff19168215159081179091556040519081527fff5917043f8453af413305b2dbd1ed9748a37df481beb71ba4b9b212a07b9bef90602001611e7b565b6005546001600160a01b031633146124385760405162461bcd60e51b8152600401610f34906141ea565b600d5460405163d8032ed360e01b81526001600160a01b0383811660048301529091169063d8032ed390602401600060405180830381600087803b15801561247f57600080fd5b505af1158015612493573d6000803e3d6000fd5b50506040516001600160a01b03841681527f7597aa09105646b4cc4486748aecd1d7c5dbcbb7bbe2863c3fc27e613b64432d92506020019050611e7b565b6005546001600160a01b031633146124fb5760405162461bcd60e51b8152600401610f34906141ea565b61250d83670de0b6b3a7640000614235565b925061252182670de0b6b3a7640000614235565b600854909250600160a81b900460ff161561253b57600080fd5b6103e860025461254b9190614308565b8310156125925760405162461bcd60e51b815260206004820152601560248201527463616e6e6f74207365742062656c6f7720302e312560581b6044820152606401610f34565b6103e86002546125a29190614308565b8210156125e95760405162461bcd60e51b815260206004820152601560248201527463616e6e6f74207365742062656c6f7720302e312560581b6044820152606401610f34565b6010839055601182905561260184633b9aca00614235565b6024556008805460ff60a81b1916600160a81b179055436027554260285560298190556040517f799663458a5ef2936f7fa0c99b3336c69c25890f82974f04e811e5bb359186c790600090a150505050565b600d546040805163039e107b60e61b815290516000926001600160a01b03169163e7841ec09160048083019260209291908290030181865afa158015611491573d6000803e3d6000fd5b600d54604051635183d6fd60e01b815260048101839052600091829182918291829182916001600160a01b0390911690635183d6fd9060240161217e565b6005546001600160a01b031633146127055760405162461bcd60e51b8152600401610f34906141ea565b6001600160a01b03811661276a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610f34565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b600d54604051632c8be28160e21b815233600482015282151560248201526001600160a01b039091169063b22f8a049060440161150d565b6005546001600160a01b031633146128285760405162461bcd60e51b8152600401610f34906141ea565b61283a81670de0b6b3a7640000614235565b90506103e860025461284c9190614308565b8110156128ae5760405162461bcd60e51b815260206004820152602a60248201527f6d61782077616c6c65742063616e6e6f742062652073657420746f206c657373604482015269207468616e20302e312560b01b6064820152608401610f34565b601055565b6000806128c083856143ab565b9050838110156129125760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610f34565b9392505050565b60008260000361292b57506000611194565b60006129378385614235565b9050826129448583614308565b146129125760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610f34565b600061291283836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613b43565b806000036129e85750565b6129f181613b71565b6000612a0a600954600a546128b390919063ffffffff16565b9050600060019050600060019050600060019050600080600080600080600080601a541115612a7b57612a78601b54601854601a54612a4991906143ab565b612a5391906143ab565b610f87601a54612a728f610f87600a544761291990919063ffffffff16565b90612919565b95505b60135415612ac557612ac2601c54601554601354612a9991906143ab565b612aa391906143ab565b610f87601354612a728f610f876009544761291990919063ffffffff16565b94505b612acf86866128b3565b96508615612b2f57600d546040516001600160a01b03909116908890600081818185875af1925050503d8060008114612b24576040519150601f19603f3d011682016040523d82523d6000602084013e612b29565b606091505b50909a50505b601b54601854612b3e916128b3565b601c54601554612b4d916128b3565b612b5791906143ab565b93508315612bb457612b69478561299b565b925082612b836015546018546128b390919063ffffffff16565b612b8d9190614235565b915082612ba7601c54601b546128b390919063ffffffff16565b612bb19190614235565b90505b8115612c1257600e546040516001600160a01b03909116908390600081818185875af1925050503d8060008114612c07576040519150601f19603f3d011682016040523d82523d6000602084013e612c0c565b606091505b50909950505b8015612c7057600f546040516001600160a01b03909116908290600081818185875af1925050503d8060008114612c65576040519150601f19603f3d011682016040523d82523d6000602084013e612c6a565b606091505b50909850505b7f8e09ec88c0d24c22e3a9b8555c029afcc4a7c609daabf6d7849e814c2d14efd087612c9c83856143ab565b8c8015612ca657508b5b8015612caf57508a5b60408051938452602084019290925215159082015260600160405180910390a1505050505050505050505050565b600061291283836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613a40565b6001600160a01b038316612d815760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610f34565b6001600160a01b038216612de25760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610f34565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b038316612e6a5760405162461bcd60e51b8152600401610f34906143be565b6001600160a01b038216612e905760405162461bcd60e51b8152600401610f3490614403565b612ecd816040518060600160405280602681526020016144cb602691396001600160a01b0386166000908152602081905260409020549190613a40565b6001600160a01b038085166000908152602081905260408082209390935590841681522054612efc90826128b3565b6001600160a01b038381166000818152602081815260409182902094909455518481529092918616917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101612e37565b6001600160a01b038316612f735760405162461bcd60e51b8152600401610f34906143be565b6001600160a01b038216612f995760405162461bcd60e51b8152600401610f3490614403565b6001600160a01b038316600090815260226020526040812054819081908190819060ff1661301a57600854600160a81b900460ff1661301a5760405162461bcd60e51b815260206004820181905260248201527f54726164696e6720686173206e6f7420796574206265656e20656e61626c65646044820152606401610f34565b856000036130385761302e88886000612e44565b5050505050505050565b600854600160a01b900460ff1615801561306a57506001600160a01b038816600090815260208052604090205460ff16155b801561308e57506001600160a01b038716600090815260208052604090205460ff16155b15613937576001600160a01b0380881660009081526021602052604080822054928b16825290205460ff9182169116801580156130c9575081155b1561335f576001600160a01b038a16600090815260208052604090205460ff1615801561310e57506001600160a01b038916600090815260208052604090205460ff16155b1561325457600061312f6064610f87601d548c61291990919063ffffffff16565b905061313b8982612cdd565b98506131488b3083612e44565b6131538b8b8b612e44565b600d546001600160a01b031663e30443bc8c61316e81611a2d565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b1580156131b457600080fd5b505af11580156131c8573d6000803e3d6000fd5b5050600d546001600160a01b0316915063e30443bc90508b6131e981611a2d565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561322f57600080fd5b505af1158015613243573d6000803e3d6000fd5b505050505050505050505050505050565b61325f8a8a8a612e44565b600d546001600160a01b031663e30443bc8b61327a81611a2d565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b1580156132c057600080fd5b505af11580156132d4573d6000803e3d6000fd5b5050600d546001600160a01b0316915063e30443bc90508a6132f581611a2d565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561333b57600080fd5b505af115801561334f573d6000803e3d6000fd5b5050505050505050505050505050565b811561345b57601354601454601554601654601c54602354949b509299509097509550935060ff161561345657602a54326000908152602660205260409020546133a991906143ab565b4210156133f15760405162461bcd60e51b8152602060048201526016602482015275636f6f6c646f776e20706572696f642061637469766560501b6044820152606401610f34565b6011548811156134435760405162461bcd60e51b815260206004820152601b60248201527f61626f7665206d6178207472616e73616374696f6e206c696d697400000000006044820152606401610f34565b3260009081526026602052604090204290555b61365f565b801561365f57601a54601754601854601954601b54602354949b509299509097509550935060ff16156135e85760295460285461349891906143ab565b42116134db5760405162461bcd60e51b8152602060048201526012602482015271796f75207368616c6c206e6f74207061737360701b6044820152606401610f34565b6024543a111561352d5760405162461bcd60e51b815260206004820152601860248201527f4761732070726963652065786365656473206c696d69742e00000000000000006044820152606401610f34565b326000908152602560205260409020544390036135835760405162461bcd60e51b8152602060048201526014602482015273546f6f206d616e7920545820696e20626c6f636b60601b6044820152606401610f34565b6011548811156135d55760405162461bcd60e51b815260206004820152601b60248201527f61626f7665206d6178207472616e73616374696f6e206c696d697400000000006044820152606401610f34565b3260009081526025602052604090204390555b60006135f38a611a2d565b6010549091506136038a836143ab565b111561365d5760405162461bcd60e51b8152602060048201526024808201527f45786365656473206d6178696d756d2077616c6c657420746f6b656e20616d6f6044820152633ab73a1760e11b6064820152608401610f34565b505b60006136808461366f88886143ab565b61367991906143ab565b89906128b3565b9050600061368d30611a2d565b601254909150811080159081906136a15750845b156137ba576008805460ff60a01b1916600160a01b179055601e5460ff1680156136cb5750600087115b80156136d957506000600c54115b1561378b5760006136f7600954600a546128b390919063ffffffff16565b9050600061371482610f87600a548761291990919063ffffffff16565b9050600061373183610f876009548861291990919063ffffffff16565b9050600061374e600c54610f878d8661291990919063ffffffff16565b9050600061376b600b54610f878e8661291990919063ffffffff16565b9050600061377982846128b3565b905061378481613ccb565b5050505050505b600061379630611a2d565b90506137a1816129dd565b506001600a8190556009556008805460ff60a01b191690555b60006137cb6064610f878e87612919565b905060008a1561381e5760646137e18e8d612919565b6137eb9190614308565b905061380d8f600860009054906101000a90046001600160a01b031683612e44565b60025461381a9082612cdd565b6002555b61383261382b82846143ab565b8e90612cdd565b9c50861561384f5760095461384790836128b3565b600955613860565b600a5461385c90836128b3565b600a555b61386b8f3084612e44565b601f54600d546040516001624d3b8760e01b03198152600481018390526001600160a01b039091169063ffb2c479906024016060604051808303816000875af19250505080156138d8575060408051601f3d908101601f191682019092526138d59181019061432a565b60015b1561392e5760408051848152602081018490529081018290526060810185905232906001907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989060800160405180910390a35050505b50505050505050505b613942888888612e44565b600d546001600160a01b031663e30443bc8961395d81611a2d565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b1580156139a357600080fd5b505af11580156139b7573d6000803e3d6000fd5b5050600d546001600160a01b0316915063e30443bc9050886139d881611a2d565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015613a1e57600080fd5b505af1158015613a32573d6000803e3d6000fd5b505050505050505050505050565b60008184841115613a645760405162461bcd60e51b8152600401610f349190613e39565b506000613a718486614446565b95945050505050565b6001600160a01b0382166000908152602160205260409020805460ff19168215801591909117909155613b0757600d5460405163031e79db60e41b81526001600160a01b038481166004830152909116906331e79db090602401600060405180830381600087803b158015613aee57600080fd5b505af1158015613b02573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b60008183613b645760405162461bcd60e51b8152600401610f349190613e39565b506000613a718486614308565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110613ba657613ba6614286565b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015613bff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c2391906142b5565b81600181518110613c3657613c36614286565b6001600160a01b039283166020918202929092010152600654613c5c9130911684612d1f565b60065460405163791ac94760e01b81526001600160a01b039091169063791ac94790613c95908590600090869030904290600401614459565b600060405180830381600087803b158015613caf57600080fd5b505af1158015613cc3573d6000803e3d6000fd5b505050505050565b6000613cd882600261299b565b90506000613ce68383612cdd565b905047613cf283613b71565b6000613cfe4783612cdd565b9050613d0a8382613d52565b60408051858152602081018390529081018490527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a15050505050565b600654613d6a9030906001600160a01b031684612d1f565b6006546001600160a01b031663f305d719823085600080613d936005546001600160a01b031690565b60405160e088901b6001600160e01b03191681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c40160606040518083038185885af1158015613dfb573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061153b919061432a565b600060208284031215613e3257600080fd5b5035919050565b600060208083528351808285015260005b81811015613e6657858101830151858201604001528201613e4a565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b038116811461164857600080fd5b801515811461164857600080fd5b60008060408385031215613ebd57600080fd5b8235613ec881613e87565b91506020830135613ed881613e9c565b809150509250929050565b60008060408385031215613ef657600080fd5b8235613f0181613e87565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715613f4e57613f4e613f0f565b604052919050565b600067ffffffffffffffff821115613f7057613f70613f0f565b5060051b60200190565b600082601f830112613f8b57600080fd5b81356020613fa0613f9b83613f56565b613f25565b82815260059290921b84018101918181019086841115613fbf57600080fd5b8286015b84811015613fda5780358352918301918301613fc3565b509695505050505050565b60008060408385031215613ff857600080fd5b823567ffffffffffffffff8082111561401057600080fd5b818501915085601f83011261402457600080fd5b81356020614034613f9b83613f56565b82815260059290921b8401810191818101908984111561405357600080fd5b948201945b8386101561407a57853561406b81613e87565b82529482019490820190614058565b9650508601359250508082111561409057600080fd5b5061409d85828601613f7a565b9150509250929050565b6000806000606084860312156140bc57600080fd5b83356140c781613e87565b925060208401356140d781613e87565b929592945050506040919091013590565b6000602082840312156140fa57600080fd5b813561291281613e9c565b60006020828403121561411757600080fd5b813561291281613e87565b6000806000806000806000806000806101408b8d03121561414257600080fd5b505088359a60208a01359a5060408a013599606081013599506080810135985060a0810135975060c0810135965060e081013595506101008101359450610120013592509050565b6000806040838503121561419d57600080fd5b82356141a881613e87565b91506020830135613ed881613e87565b600080600080608085870312156141ce57600080fd5b5050823594602084013594506040840135936060013592509050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b80820281158282048414176111945761119461421f565b600181811c9082168061426057607f821691505b60208210810361428057634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b6000600182016142ae576142ae61421f565b5060010190565b6000602082840312156142c757600080fd5b815161291281613e87565b6000602082840312156142e457600080fd5b5051919050565b6000602082840312156142fd57600080fd5b815161291281613e9c565b60008261432557634e487b7160e01b600052601260045260246000fd5b500490565b60008060006060848603121561433f57600080fd5b8351925060208401519150604084015190509250925092565b60008060008060008060c0878903121561437157600080fd5b865161437c81613e87565b6020880151604089015160608a015160808b015160a0909b0151939c929b509099909850965090945092505050565b808201808211156111945761119461421f565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b818103818111156111945761119461421f565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156144a95784516001600160a01b031683529383019391830191600101614484565b50506001600160a01b0396909616606085015250505060800152939250505056fe45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220486afe61e336c21565217bfda28de6907a100a283281eabd61837d55d9296e8264736f6c63430008110033

Deployed Bytecode Sourcemap

23379:25600:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23543:64;;;;;;;;;;-1:-1:-1;23543:64:0;;;;-1:-1:-1;;;;;23543:64:0;;;;;;-1:-1:-1;;;;;178:32:1;;;160:51;;148:2;133:18;23543:64:0;;;;;;;;45972:443;;;;;;;;;;-1:-1:-1;45972:443:0;;;;;:::i;:::-;;:::i;:::-;;5028:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;30788:181::-;;;;;;;;;;-1:-1:-1;30788:181:0;;;;;:::i;:::-;;:::i;31752:171::-;;;;;;;;;;-1:-1:-1;31752:171:0;;;;;:::i;:::-;;:::i;5942:169::-;;;;;;;;;;-1:-1:-1;5942:169:0;;;;;:::i;:::-;;:::i;:::-;;;2091:14:1;;2084:22;2066:41;;2054:2;2039:18;5942:169:0;1926:187:1;23458:41:0;;;;;;;;;;-1:-1:-1;23458:41:0;;;;-1:-1:-1;;;;;23458:41:0;;;5349:108;;;;;;;;;;-1:-1:-1;5437:12:0;;5349:108;;;2499:25:1;;;2487:2;2472:18;5349:108:0;2353:177:1;25429:33:0;;;;;;;;;;;;;;;;23721:28;;;;;;;;;;;;;;;;48339:637;;;;;;;;;;-1:-1:-1;48339:637:0;;;;;:::i;:::-;;:::i;6119:338::-;;;;;;;;;;-1:-1:-1;6119:338:0;;;;;:::i;:::-;;:::i;45001:114::-;;;;;;;;;;;;;:::i;23831:47::-;;;;;;;;;;-1:-1:-1;23831:47:0;;;;-1:-1:-1;;;;;23831:47:0;;;35733:141;;;;;;;;;;;;;:::i;29413:93::-;;;;;;;;;;-1:-1:-1;29413:93:0;;29496:2;5874:36:1;;5862:2;5847:18;29413:93:0;5732:184:1;37792:119:0;;;;;;;;;;-1:-1:-1;37792:119:0;;;;;:::i;:::-;;:::i;6465:218::-;;;;;;;;;;-1:-1:-1;6465:218:0;;;;;:::i;:::-;;:::i;23685:29::-;;;;;;;;;;;;;;;;33403:121;;;;;;;;;;-1:-1:-1;33403:121:0;;;;;:::i;:::-;;:::i;23508:28::-;;;;;;;;;;-1:-1:-1;23508:28:0;;;;-1:-1:-1;;;;;23508:28:0;;;25027:33;;;;;;;;;;-1:-1:-1;25027:33:0;;;;;;;;24512:40;;;;;;;;;;-1:-1:-1;24512:40:0;;;;;;;;23642:34;;;;;;;;;;-1:-1:-1;23642:34:0;;;;-1:-1:-1;;;23642:34:0;;;;;;37161:103;;;;;;;;;;;;;:::i;35882:126::-;;;;;;;;;;-1:-1:-1;35882:126:0;;;;;:::i;:::-;-1:-1:-1;;;;;35972:28:0;35948:4;35972:28;;;:19;:28;;;;;;;;;35882:126;24304:31;;;;;;;;;;;;;;;;45123:160;;;;;;;;;;-1:-1:-1;45123:160:0;;;;;:::i;:::-;;:::i;24271:26::-;;;;;;;;;;;;;;;;45291:152;;;;;;;;;;-1:-1:-1;45291:152:0;;;;;:::i;:::-;;:::i;32782:120::-;;;;;;;;;;-1:-1:-1;32782:120:0;;;;;:::i;:::-;;:::i;37410:142::-;;;;;;;;;;;;;:::i;32539:209::-;;;;;;;;;;-1:-1:-1;32539:209:0;;;;;:::i;:::-;;:::i;31624:99::-;;;;;;;;;;-1:-1:-1;31624:99:0;;;;;:::i;:::-;;:::i;36176:139::-;;;;;;;;;;-1:-1:-1;36176:139:0;;;;;:::i;:::-;;:::i;25402:20::-;;;;;;;;;;;;;;;;37919:153;;;;;;;;;;-1:-1:-1;37919:153:0;;;;;:::i;:::-;;:::i;36882:271::-;;;;;;;;;;-1:-1:-1;36882:271:0;;;;;:::i;:::-;;:::i;5465:127::-;;;;;;;;;;-1:-1:-1;5465:127:0;;;;;:::i;:::-;;:::i;11544:148::-;;;;;;;;;;;;;:::i;31018:127::-;;;;;;;;;;-1:-1:-1;31018:127:0;;;;;:::i;:::-;;:::i;34069:208::-;;;;;;;;;;-1:-1:-1;34069:208:0;;;;;:::i;:::-;;:::i;23887:38::-;;;;;;;;;;-1:-1:-1;23887:38:0;;;;-1:-1:-1;;;;;23887:38:0;;;24379:28;;;;;;;;;;;;;;;;31438:147;;;;;;;;;;-1:-1:-1;31438:147:0;;;;;:::i;:::-;;:::i;34529:1196::-;;;;;;;;;;-1:-1:-1;34529:1196:0;;;;;:::i;:::-;;:::i;34285:236::-;;;;;;;;;;-1:-1:-1;34285:236:0;;;;;:::i;:::-;;:::i;37560:109::-;;;;;;;;;;-1:-1:-1;37560:109:0;;;;;:::i;:::-;;:::i;33820:241::-;;;;;;;;;;-1:-1:-1;33820:241:0;;;;;:::i;:::-;;:::i;25365:30::-;;;;;;;;;;;;;;;;24160:27;;;;;;;;;;;;;;;;11330:79;;;;;;;;;;-1:-1:-1;11395:6:0;;-1:-1:-1;;;;;11395:6:0;11330:79;;23932:32;;;;;;;;;;-1:-1:-1;23932:32:0;;;;-1:-1:-1;;;;;23932:32:0;;;24194;;;;;;;;;;;;;;;;5136:104;;;;;;;;;;;;;:::i;33126:140::-;;;;;;;;;;-1:-1:-1;33126:140:0;;;;;:::i;:::-;;:::i;24610:40::-;;;;;;;;;;;;;;;;33274:121;;;;;;;;;;-1:-1:-1;33274:121:0;;;;;:::i;:::-;;:::i;24414:24::-;;;;;;;;;;;;;;;;31183:193;;;;;;;;;;-1:-1:-1;31183:193:0;;;;;:::i;:::-;;:::i;24445:25::-;;;;;;;;;;;;;;;;6691:286;;;;;;;;;;-1:-1:-1;6691:286:0;;;;;:::i;:::-;;:::i;36016:152::-;;;;;;;;;;-1:-1:-1;36016:152:0;;;;;:::i;:::-;;:::i;5600:175::-;;;;;;;;;;-1:-1:-1;5600:175:0;;;;;:::i;:::-;;:::i;24477:26::-;;;;;;;;;;;;;;;;36323:264;;;;;;;;;;-1:-1:-1;36323:264:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;7748:32:1;;;7730:51;;7812:2;7797:18;;7790:34;;;;7840:18;;;7833:34;;;;7898:2;7883:18;;7876:34;7941:3;7926:19;;7919:35;7768:3;7970:19;;7963:35;7717:3;7702:19;36323:264:0;7447:557:1;25332:26:0;;;;;;;;;;;;;;;;24757:57;;;;;;;;;;-1:-1:-1;24757:57:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;32010:174;;;;;;;;;;-1:-1:-1;32010:174:0;;;;;:::i;:::-;;:::i;38080:127::-;;;;;;;;;;-1:-1:-1;38080:127:0;;;;;:::i;:::-;;:::i;24124:29::-;;;;;;;;;;;;;;;;30472:268;;;;;;;;;;-1:-1:-1;30472:268:0;;;;;:::i;:::-;;:::i;32910:208::-;;;;;;;;;;-1:-1:-1;32910:208:0;;;;;:::i;:::-;;:::i;44835:158::-;;;;;;;;;;-1:-1:-1;44835:158:0;;;;;:::i;:::-;;:::i;5783:151::-;;;;;;;;;;-1:-1:-1;5783:151:0;;;;;:::i;:::-;-1:-1:-1;;;;;5899:18:0;;;5872:7;5899:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;5783:151;29644:763;;;;;;;;;;-1:-1:-1;29644:763:0;;;;;:::i;:::-;;:::i;24084:33::-;;;;;;;;;;;;;;;;37272:130;;;;;;;;;;;;;:::i;24057:20::-;;;;;;;;;;;;;;;;24342:30;;;;;;;;;;;;;;;;36595:279;;;;;;;;;;-1:-1:-1;36595:279:0;;;;;:::i;:::-;;:::i;11700:243::-;;;;;;;;;;-1:-1:-1;11700:243:0;;;;;:::i;:::-;;:::i;37677:107::-;;;;;;;;;;-1:-1:-1;37677:107:0;;;;;:::i;:::-;;:::i;24233:31::-;;;;;;;;;;;;;;;;24026:24;;;;;;;;;;;;;;;;32253:221;;;;;;;;;;-1:-1:-1;32253:221:0;;;;;:::i;:::-;;:::i;45972:443::-;11457:6;;-1:-1:-1;;;;;11457:6:0;210:10;11457:22;11449:67;;;;-1:-1:-1;;;11449:67:0;;;;;;;:::i;:::-;;;;;;;;;46060:17:::1;:6:::0;46070::::1;46060:17;:::i;:::-;46051:26;;46088:19;46110:25;46124:10;;46110:9;;:13;;:25;;;;:::i;:::-;46088:47;;46146:15;46164:38;46190:11;46164:21;46175:9;;46164:6;:10;;:21;;;;:::i;:::-;:25:::0;::::1;:38::i;:::-;46146:56;;46213:16;46232:39;46259:11;46232:22;46243:10;;46232:6;:10;;:22;;;;:::i;:39::-;46213:58;;46284:28;46305:6;46284:20;:28::i;:::-;46337:9;::::0;:22:::1;::::0;46351:7;46337:13:::1;:22::i;:::-;46325:9;:34:::0;46383:10:::1;::::0;:24:::1;::::0;46398:8;46383:14:::1;:24::i;:::-;46370:10;:37:::0;-1:-1:-1;;;;45972:443:0:o;5028:100::-;5082:13;5115:5;5108:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5028:100;:::o;30788:181::-;11457:6;;-1:-1:-1;;;;;11457:6:0;210:10;11457:22;11449:67;;;;-1:-1:-1;;;11449:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;30872:28:0;::::1;;::::0;;;:19:::1;:28:::0;;;;;;;;:39;;-1:-1:-1;;30872:39:0::1;::::0;::::1;;::::0;;::::1;::::0;;;30927:34;;2066:41:1;;;30927:34:0::1;::::0;2039:18:1;30927:34:0::1;;;;;;;30788:181:::0;;:::o;31752:171::-;11457:6;;-1:-1:-1;;;;;11457:6:0;210:10;11457:22;11449:67;;;;-1:-1:-1;;;11449:67:0;;;;;;;:::i;:::-;31838:2:::1;31830:4;:10;;31822:53;;;::::0;-1:-1:-1;;;31822:53:0;;10045:2:1;31822:53:0::1;::::0;::::1;10027:21:1::0;10084:2;10064:18;;;10057:30;10123:32;10103:18;;;10096:60;10173:18;;31822:53:0::1;9843:354:1::0;31822:53:0::1;31902:13;:4:::0;31909:6:::1;31902:13;:::i;:::-;31886;:29:::0;-1:-1:-1;31752:171:0:o;5942:169::-;6025:4;6042:39;210:10;6065:7;6074:6;6042:8;:39::i;:::-;-1:-1:-1;6099:4:0;5942:169;;;;;:::o;48339:637::-;11457:6;;-1:-1:-1;;;;;11457:6:0;210:10;11457:22;11449:67;;;;-1:-1:-1;;;11449:67:0;;;;;;;:::i;:::-;48511:6:::1;:13;48486:14;:21;:38;48478:80;;;::::0;-1:-1:-1;;;48478:80:0;;10404:2:1;48478:80:0::1;::::0;::::1;10386:21:1::0;10443:2;10423:18;;;10416:30;10482:32;10462:18;;;10455:60;10532:18;;48478:80:0::1;10202:354:1::0;48478:80:0::1;48602:3;48577:14;:21;:28;;48569:75;;;::::0;-1:-1:-1;;;48569:75:0;;10763:2:1;48569:75:0::1;::::0;::::1;10745:21:1::0;10802:2;10782:18;;;10775:30;10841:34;10821:18;;;10814:62;-1:-1:-1;;;10892:18:1;;;10885:32;10934:19;;48569:75:0::1;10561:398:1::0;48569:75:0::1;48660:9;48655:314;48679:14;:21;48675:1;:25;48655:314;;;48722:14;48739;48754:1;48739:17;;;;;;;;:::i;:::-;;;;;;;48722:34;;48771:21;48795:6;48802:1;48795:9;;;;;;;;:::i;:::-;;;;;;;48808:6;48795:20;;;;:::i;:::-;48771:44;;48830:50;48846:10;48858:6;48866:13;48830:15;:50::i;:::-;48895:15;::::0;-1:-1:-1;;;;;48895:15:0::1;:26;48930:6:::0;48939:17:::1;48930:6:::0;48939:9:::1;:17::i;:::-;48895:62;::::0;-1:-1:-1;;;;;;48895:62:0::1;::::0;;;;;;-1:-1:-1;;;;;11296:32:1;;;48895:62:0::1;::::0;::::1;11278:51:1::0;11345:18;;;11338:34;11251:18;;48895:62:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;48707:262;;48702:3;;;;;:::i;:::-;;;;48655:314;;;;48339:637:::0;;:::o;6119:338::-;6225:4;6242:36;6252:6;6260:9;6271:6;6242:9;:36::i;:::-;6289:138;6298:6;210:10;6320:106;6358:6;6320:106;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;6320:19:0;;;;;;:11;:19;;;;;;;;210:10;6320:33;;;;;;;;;;:37;:106::i;:::-;6289:8;:138::i;:::-;-1:-1:-1;6445:4:0;6119:338;;;;;:::o;45001:114::-;45075:15;;:32;;;-1:-1:-1;;;45075:32:0;;;;45048:7;;-1:-1:-1;;;;;45075:15:0;;:30;;:32;;;;;;;;;;;;;;:15;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45068:39;;45001:114;:::o;35733:141::-;35823:15;;:43;;;-1:-1:-1;;;35823:43:0;;;;35796:7;;-1:-1:-1;;;;;35823:15:0;;:41;;:43;;;;;;;;;;;;;;:15;:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;37792:119::-;11457:6;;-1:-1:-1;;;;;11457:6:0;210:10;11457:22;11449:67;;;;-1:-1:-1;;;11449:67:0;;;;;;;:::i;:::-;37862:15:::1;::::0;:41:::1;::::0;-1:-1:-1;;;37862:41:0;;2091:14:1;;2084:22;37862:41:0::1;::::0;::::1;2066::1::0;-1:-1:-1;;;;;37862:15:0;;::::1;::::0;:34:::1;::::0;2039:18:1;;37862:41:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;37792:119:::0;:::o;6465:218::-;210:10;6553:4;6602:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;6602:34:0;;;;;;;;;;6553:4;;6570:83;;6593:7;;6602:50;;6641:10;6602:38;:50::i;33403:121::-;11457:6;;-1:-1:-1;;;;;11457:6:0;210:10;11457:22;11449:67;;;;-1:-1:-1;;;11449:67:0;;;;;;;:::i;:::-;33473:15:::1;::::0;:43:::1;::::0;-1:-1:-1;;;33473:43:0;;2091:14:1;;2084:22;33473:43:0::1;::::0;::::1;2066:41:1::0;-1:-1:-1;;;;;33473:15:0;;::::1;::::0;:36:::1;::::0;2039:18:1;;33473:43:0::1;1926:187:1::0;37161:103:0;37198:15;;:58;;-1:-1:-1;;;37198:58:0;;37237:10;37198:58;;;12152:51:1;37198:15:0;12219:18:1;;;12212:50;-1:-1:-1;;;;;37198:15:0;;;;:30;;12125:18:1;;37198:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;37161:103::o;45123:160::-;11457:6;;-1:-1:-1;;;;;11457:6:0;210:10;11457:22;11449:67;;;;-1:-1:-1;;;11449:67:0;;;;;;;:::i;:::-;45214:15:::1;::::0;:61:::1;::::0;-1:-1:-1;;;45214:61:0;;::::1;::::0;::::1;2499:25:1::0;;;-1:-1:-1;;;;;45214:15:0;;::::1;::::0;:54:::1;::::0;2472:18:1;;45214:61:0::1;2353:177:1::0;45291:152:0;11457:6;;-1:-1:-1;;;;;11457:6:0;210:10;11457:22;11449:67;;;;-1:-1:-1;;;11449:67:0;;;;;;;:::i;:::-;45378:15:::1;::::0;:57:::1;::::0;-1:-1:-1;;;45378:57:0;;::::1;::::0;::::1;2499:25:1::0;;;-1:-1:-1;;;;;45378:15:0;;::::1;::::0;:50:::1;::::0;2472:18:1;;45378:57:0::1;2353:177:1::0;32782:120:0;11457:6;;-1:-1:-1;;;;;11457:6:0;210:10;11457:22;11449:67;;;;-1:-1:-1;;;11449:67:0;;;;;;;:::i;:::-;32877:17:::1;:6:::0;32887::::1;32877:17;:::i;:::-;32856:18;:38:::0;-1:-1:-1;32782:120:0:o;37410:142::-;37503:15;;:41;;;-1:-1:-1;;;37503:41:0;;;;37476:7;;-1:-1:-1;;;;;37503:15:0;;:39;;:41;;;;;;;;;;;;;;:15;:41;;;;;;;;;;;;;;32539:209;11457:6;;-1:-1:-1;;;;;11457:6:0;210:10;11457:22;11449:67;;;;-1:-1:-1;;;11449:67:0;;;;;;;:::i;:::-;32610:16:::1;:5:::0;32619:6:::1;32610:16;:::i;:::-;32602:24;;32669:4;32654:12;;:19;;;;:::i;:::-;32645:5;:28;;32637:79;;;::::0;-1:-1:-1;;;32637:79:0;;12947:2:1;32637:79:0::1;::::0;::::1;12929:21:1::0;12986:2;12966:18;;;12959:30;13025:34;13005:18;;;12998:62;-1:-1:-1;;;13076:18:1;;;13069:36;13122:19;;32637:79:0::1;12745:402:1::0;32637:79:0::1;32727:5;:13:::0;32539:209::o;31624:99::-;11457:6;;-1:-1:-1;;;;;11457:6:0;210:10;11457:22;11449:67;;;;-1:-1:-1;;;11449:67:0;;;;;;;:::i;:::-;31693:14:::1;:22:::0;;-1:-1:-1;;31693:22:0::1;::::0;::::1;;::::0;;;::::1;::::0;;31624:99::o;36176:139::-;36273:15;;:34;;-1:-1:-1;;;36273:34:0;;-1:-1:-1;;;;;178:32:1;;;36273:34:0;;;160:51:1;36246:7:0;;36273:15;;:25;;133:18:1;;36273:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;37919:153::-;38016:15;;:48;;-1:-1:-1;;;38016:48:0;;-1:-1:-1;;;;;178:32:1;;;38016:48:0;;;160:51:1;37992:4:0;;38016:15;;:39;;133:18:1;;38016:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;36882:271::-;37014:15;;:28;;-1:-1:-1;;;;;;37014:28:0;;;;;2499:25:1;;;36948:18:0;;;;;;-1:-1:-1;;;;;37014:15:0;;:23;;2472:18:1;;37014:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37058:87;;;13694:25:1;;;13750:2;13735:18;;13728:34;;;13778:18;;;13771:34;;;13836:2;13821:18;;13814:34;;;36947:95:0;;-1:-1:-1;36947:95:0;;-1:-1:-1;36947:95:0;-1:-1:-1;37135:9:0;;37123:5;;37058:87;;13681:3:1;13666:19;37058:87:0;;;;;;;36936:217;;;36882:271;:::o;5465:127::-;-1:-1:-1;;;;;5566:18:0;5539:7;5566:18;;;;;;;;;;;;5465:127::o;11544:148::-;11457:6;;-1:-1:-1;;;;;11457:6:0;210:10;11457:22;11449:67;;;;-1:-1:-1;;;11449:67:0;;;;;;;:::i;:::-;11635:6:::1;::::0;11614:40:::1;::::0;11651:1:::1;::::0;-1:-1:-1;;;;;11635:6:0::1;::::0;11614:40:::1;::::0;11651:1;;11614:40:::1;11665:6;:19:::0;;-1:-1:-1;;;;;;11665:19:0::1;::::0;;11544:148::o;31018:127::-;11457:6;;-1:-1:-1;;;;;11457:6:0;210:10;11457:22;11449:67;;;;-1:-1:-1;;;11449:67:0;;;;;;;:::i;:::-;31092:15:::1;::::0;:45:::1;::::0;-1:-1:-1;;;31092:45:0;;-1:-1:-1;;;;;178:32:1;;;31092:45:0::1;::::0;::::1;160:51:1::0;31092:15:0;;::::1;::::0;:36:::1;::::0;133:18:1;;31092:45:0::1;14:203:1::0;34069:208:0;11457:6;;-1:-1:-1;;;;;11457:6:0;210:10;11457:22;11449:67;;;;-1:-1:-1;;;11449:67:0;;;;;;;:::i;:::-;34138:15:::1;::::0;:46:::1;::::0;-1:-1:-1;;;34138:46:0;;-1:-1:-1;;;;;178:32:1;;;34138:46:0::1;::::0;::::1;160:51:1::0;34138:15:0;;::::1;::::0;:36:::1;::::0;133:18:1;;34138:46:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;;;;;;;34195:29:0;::::1;;::::0;;;:19:::1;:29:::0;;;;;:36;;-1:-1:-1;;34195:36:0::1;34227:4;34195:36;::::0;;-1:-1:-1;34242:27:0::1;34215:8:::0;34242:17:::1;:27::i;31438:147::-:0;11457:6;;-1:-1:-1;;;;;11457:6:0;210:10;11457:22;11449:67;;;;-1:-1:-1;;;11449:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;31527:41:0;;;::::1;;::::0;;;:33:::1;:41;::::0;;;;:50;;-1:-1:-1;;31527:50:0::1;::::0;::::1;;::::0;;;::::1;::::0;;31438:147::o;34529:1196::-;11457:6;;-1:-1:-1;;;;;11457:6:0;210:10;11457:22;11449:67;;;;-1:-1:-1;;;11449:67:0;;;;;;;:::i;:::-;34836:11:::1;:21:::0;;;34868:16:::1;:31:::0;;;34910:15:::1;:30:::0;;;34951:13:::1;:26:::0;;;34988:12:::1;:23:::0;;;35022:17:::1;:33:::0;;;35066:16:::1;:32:::0;;;35109:14:::1;:28:::0;;;35148:9:::1;:18:::0;;;35177:10:::1;:20:::0;;;35226:75:::1;35190:7:::0;35226:59:::1;35042:13:::0;35226:59;35126:11;35085:13;35226:18:::1;:36::i;:::-;:40:::0;::::1;:59::i;:75::-;35210:13;:91;;;;35329:71;35390:9;;35329:56;35368:16;;35329:34;35347:15;;35329:13;;:17;;:34;;;;:::i;:71::-;35314:12;:86:::0;35421:13:::1;::::0;35438:2:::1;-1:-1:-1::0;35421:19:0;::::1;::::0;:41:::1;;;35460:2;35444:12;;:18;;35421:41;35413:98;;;::::0;-1:-1:-1;;;35413:98:0;;14061:2:1;35413:98:0::1;::::0;::::1;14043:21:1::0;14100:2;14080:18;;;14073:30;14139:34;14119:18;;;14112:62;-1:-1:-1;;;14190:18:1;;;14183:42;14242:19;;35413:98:0::1;13859:408:1::0;35413:98:0::1;35540:12;::::0;35554:17:::1;::::0;35573:16:::1;::::0;35591:14:::1;::::0;35607:11:::1;::::0;35645:16:::1;::::0;35663:15:::1;::::0;35680:13:::1;::::0;35695:9:::1;::::0;35706:10:::1;::::0;35529:188:::1;::::0;;14671:25:1;;;14727:2;14712:18;;14705:34;;;;14755:18;;;14748:34;;;;14813:2;14798:18;;14791:34;;;;14856:3;14841:19;;14834:35;;;;14900:3;14885:19;;14878:35;14944:3;14929:19;;14922:35;14988:3;14973:19;;14966:35;15032:3;15017:19;;15010:35;15076:3;15061:19;;15054:35;35529:188:0::1;::::0;14658:3:1;14643:19;35529:188:0::1;;;;;;;34529:1196:::0;;;;;;;;;;:::o;34285:236::-;11457:6;;-1:-1:-1;;;;;11457:6:0;210:10;11457:22;11449:67;;;;-1:-1:-1;;;11449:67:0;;;;;;;:::i;:::-;34391:2:::1;34373:14;:20;;34364:64;;;::::0;-1:-1:-1;;;34364:64:0;;15302:2:1;34364:64:0::1;::::0;::::1;15284:21:1::0;15341:2;15321:18;;;15314:30;15380:32;15360:18;;;15353:60;15430:18;;34364:64:0::1;15100:354:1::0;34364:64:0::1;34439:11;:28:::0;;;34483:30:::1;::::0;2499:25:1;;;34483:30:0::1;::::0;2487:2:1;2472:18;34483:30:0::1;;;;;;;;34285:236:::0;:::o;37560:109::-;37614:15;;:47;;-1:-1:-1;;;37614:47:0;;37643:10;37614:47;;;12152:51:1;12246:14;;12239:22;12219:18;;;12212:50;-1:-1:-1;;;;;37614:15:0;;;;:28;;12125:18:1;;37614:47:0;11968:300:1;33820:241:0;11457:6;;-1:-1:-1;;;;;11457:6:0;210:10;11457:22;11449:67;;;;-1:-1:-1;;;11449:67:0;;;;;;;:::i;:::-;33918:6:::1;33906:8;:18;;:41;;;;;33940:7;33928:8;:19;;33906:41;33898:50;;;::::0;::::1;;33998:16;::::0;33964:51:::1;::::0;33988:8;;33964:51:::1;::::0;;;::::1;34026:16;:27:::0;33820:241::o;5136:104::-;5192:13;5225:7;5218:14;;;;;:::i;33126:140::-;11457:6;;-1:-1:-1;;;;;11457:6:0;210:10;11457:22;11449:67;;;;-1:-1:-1;;;11449:67:0;;;;;;;:::i;:::-;33217:41:::1;33246:4;33252:5;33217:28;:41::i;:::-;33126:140:::0;;:::o;33274:121::-;11457:6;;-1:-1:-1;;;;;11457:6:0;210:10;11457:22;11449:67;;;;-1:-1:-1;;;11449:67:0;;;;;;;:::i;:::-;33344:15:::1;::::0;:43:::1;::::0;-1:-1:-1;;;33344:43:0;;2091:14:1;;2084:22;33344:43:0::1;::::0;::::1;2066:41:1::0;-1:-1:-1;;;;;33344:15:0;;::::1;::::0;:36:::1;::::0;2039:18:1;;33344:43:0::1;1926:187:1::0;31183:193:0;11457:6;;-1:-1:-1;;;;;11457:6:0;210:10;11457:22;11449:67;;;;-1:-1:-1;;;11449:67:0;;;;;;;:::i;:::-;31257:15:::1;::::0;:45:::1;::::0;-1:-1:-1;;;31257:45:0;;-1:-1:-1;;;;;178:32:1;;;31257:45:0::1;::::0;::::1;160:51:1::0;31257:15:0;;::::1;::::0;:36:::1;::::0;133:18:1;;31257:45:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;31313:15:0::1;::::0;-1:-1:-1;;;;;31313:15:0::1;::::0;-1:-1:-1;31313:26:0::1;::::0;-1:-1:-1;31340:7:0;31349:18:::1;31340:7:::0;31349:9:::1;:18::i;:::-;31313:55;::::0;-1:-1:-1;;;;;;31313:55:0::1;::::0;;;;;;-1:-1:-1;;;;;11296:32:1;;;31313:55:0::1;::::0;::::1;11278:51:1::0;11345:18;;;11338:34;11251:18;;31313:55:0::1;11096:282:1::0;6691:286:0;6784:4;6801:146;210:10;6824:7;6833:113;6872:15;6833:113;;;;;;;;;;;;;;;;;210:10;6833:25;;;;:11;:25;;;;;;;;-1:-1:-1;;;;;6833:34:0;;;;;;;;;;;;:38;:113::i;36016:152::-;36113:15;;:47;;-1:-1:-1;;;36113:47:0;;-1:-1:-1;;;;;178:32:1;;;36113:47:0;;;160:51:1;36086:7:0;;36113:15;;:38;;133:18:1;;36113:47:0;14:203:1;5600:175:0;5686:4;5703:42;210:10;5727:9;5738:6;5703:9;:42::i;36323:264::-;36544:15;;:35;;-1:-1:-1;;;36544:35:0;;-1:-1:-1;;;;;178:32:1;;;36544:35:0;;;160:51:1;36396:7:0;;;;;;;;;;;;36544:15;;;;:26;;133:18:1;;36544:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36537:42;;;;-1:-1:-1;36537:42:0;;-1:-1:-1;36537:42:0;-1:-1:-1;36537:42:0;-1:-1:-1;36537:42:0;;-1:-1:-1;36323:264:0;-1:-1:-1;;36323:264:0:o;32010:174::-;11457:6;;-1:-1:-1;;;;;11457:6:0;210:10;11457:22;11449:67;;;;-1:-1:-1;;;11449:67:0;;;;;;;:::i;:::-;32098:3:::1;32089:5;:12;;32081:63;;;::::0;-1:-1:-1;;;32081:63:0;;16791:2:1;32081:63:0::1;::::0;::::1;16773:21:1::0;16830:2;16810:18;;;16803:30;16869:34;16849:18;;;16842:62;-1:-1:-1;;;16920:18:1;;;16913:36;16966:19;;32081:63:0::1;16589:402:1::0;32081:63:0::1;32155:13;:21:::0;32010:174::o;38080:127::-;38164:15;;:35;;-1:-1:-1;;;38164:35:0;;-1:-1:-1;;;;;178:32:1;;;38164:35:0;;;160:51:1;38140:4:0;;38164:15;;:26;;133:18:1;;38164:35:0;14:203:1;30472:268:0;11457:6;;-1:-1:-1;;;;;11457:6:0;210:10;11457:22;11449:67;;;;-1:-1:-1;;;11449:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;30544:41:0;;::::1;;::::0;;;:33:::1;:41;::::0;;;;;;;:48;;30588:4:::1;-1:-1:-1::0;;30544:48:0;;::::1;::::0;::::1;::::0;;;30603:27;;;;;;;:34;;;;::::1;::::0;;::::1;::::0;;30648:15:::1;::::0;:44;;-1:-1:-1;;;30648:44:0;;::::1;::::0;::::1;160:51:1::0;;;;30648:15:0;;::::1;::::0;:36:::1;::::0;133:18:1;;30648:44:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;30708:24:0::1;::::0;-1:-1:-1;;;;;178:32:1;;160:51;;30708:24:0::1;::::0;-1:-1:-1;148:2:1;133:18;;-1:-1:-1;30708:24:0::1;14:203:1::0;32910:208:0;11457:6;;-1:-1:-1;;;;;11457:6:0;210:10;11457:22;11449:67;;;;-1:-1:-1;;;11449:67:0;;;;;;;:::i;:::-;32990:21:::1;::::0;:32;::::1;;:21;::::0;;::::1;:32;;::::0;32982:41:::1;;;::::0;::::1;;33034:21;:31:::0;;-1:-1:-1;;33034:31:0::1;::::0;::::1;;::::0;;::::1;::::0;;;33081:29:::1;::::0;2066:41:1;;;33081:29:0::1;::::0;2054:2:1;2039:18;33081:29:0::1;1926:187:1::0;44835:158:0;11457:6;;-1:-1:-1;;;;;11457:6:0;210:10;11457:22;11449:67;;;;-1:-1:-1;;;11449:67:0;;;;;;;:::i;:::-;44905:15:::1;::::0;:40:::1;::::0;-1:-1:-1;;;44905:40:0;;-1:-1:-1;;;;;178:32:1;;;44905:40:0::1;::::0;::::1;160:51:1::0;44905:15:0;;::::1;::::0;:33:::1;::::0;133:18:1;;44905:40:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;44961:24:0::1;::::0;-1:-1:-1;;;;;178:32:1;;160:51;;44961:24:0::1;::::0;-1:-1:-1;148:2:1;133:18;;-1:-1:-1;44961:24:0::1;14:203:1::0;29644:763:0;11457:6;;-1:-1:-1;;;;;11457:6:0;210:10;11457:22;11449:67;;;;-1:-1:-1;;;11449:67:0;;;;;;;:::i;:::-;29834:27:::1;:16:::0;29854:6:::1;29834:27;:::i;:::-;29815:46:::0;-1:-1:-1;29887:23:0::1;:12:::0;29903:6:::1;29887:23;:::i;:::-;29930:14;::::0;29872:38;;-1:-1:-1;;;;29930:14:0;::::1;;;29929:15;29921:24;;;::::0;::::1;;29999:4;29984:12;;:19;;;;:::i;:::-;29964:16;:39;;29956:72;;;::::0;-1:-1:-1;;;29956:72:0;;17198:2:1;29956:72:0::1;::::0;::::1;17180:21:1::0;17237:2;17217:18;;;17210:30;-1:-1:-1;;;17256:18:1;;;17249:51;17317:18;;29956:72:0::1;16996:345:1::0;29956:72:0::1;30078:4;30063:12;;:19;;;;:::i;:::-;30047:12;:35;;30039:68;;;::::0;-1:-1:-1;;;30039:68:0;;17198:2:1;30039:68:0::1;::::0;::::1;17180:21:1::0;17237:2;17217:18;;;17210:30;-1:-1:-1;;;17256:18:1;;;17249:51;17317:18;;30039:68:0::1;16996:345:1::0;30039:68:0::1;30118:9;:28:::0;;;30157:5:::1;:20:::0;;;30204:23:::1;:14:::0;30221:6:::1;30204:23;:::i;:::-;30188:13;:39:::0;30238:14:::1;:21:::0;;-1:-1:-1;;;;30238:21:0::1;-1:-1:-1::0;;;30238:21:0::1;::::0;;30284:12:::1;30270:11;:26:::0;30325:15:::1;30307;:33:::0;30351:5:::1;:16:::0;;;30383::::1;::::0;::::1;::::0;30238:21;;30383:16:::1;29644:763:::0;;;;:::o;37272:130::-;37355:15;;:39;;;-1:-1:-1;;;37355:39:0;;;;37328:7;;-1:-1:-1;;;;;37355:15:0;;:37;;:39;;;;;;;;;;;;;;:15;:39;;;;;;;;;;;;;;36595:279;36826:15;;:40;;-1:-1:-1;;;36826:40:0;;;;;2499:25:1;;;36673:7:0;;;;;;;;;;;;-1:-1:-1;;;;;36826:15:0;;;;:33;;2472:18:1;;36826:40:0;2353:177:1;11700:243:0;11457:6;;-1:-1:-1;;;;;11457:6:0;210:10;11457:22;11449:67;;;;-1:-1:-1;;;11449:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;11789:22:0;::::1;11781:72;;;::::0;-1:-1:-1;;;11781:72:0;;17548:2:1;11781:72:0::1;::::0;::::1;17530:21:1::0;17587:2;17567:18;;;17560:30;17626:34;17606:18;;;17599:62;-1:-1:-1;;;17677:18:1;;;17670:36;17723:19;;11781:72:0::1;17346:402:1::0;11781:72:0::1;11890:6;::::0;11869:38:::1;::::0;-1:-1:-1;;;;;11869:38:0;;::::1;::::0;11890:6:::1;::::0;11869:38:::1;::::0;11890:6:::1;::::0;11869:38:::1;11918:6;:17:::0;;-1:-1:-1;;;;;;11918:17:0::1;-1:-1:-1::0;;;;;11918:17:0;;;::::1;::::0;;;::::1;::::0;;11700:243::o;37677:107::-;37730:15;;:46;;-1:-1:-1;;;37730:46:0;;37758:10;37730:46;;;12152:51:1;12246:14;;12239:22;12219:18;;;12212:50;-1:-1:-1;;;;;37730:15:0;;;;:27;;12125:18:1;;37730:46:0;11968:300:1;32253:221:0;11457:6;;-1:-1:-1;;;;;11457:6:0;210:10;11457:22;11449:67;;;;-1:-1:-1;;;11449:67:0;;;;;;;:::i;:::-;32328:16:::1;:5:::0;32337:6:::1;32328:16;:::i;:::-;32320:24;;32387:4;32372:12;;:19;;;;:::i;:::-;32363:5;:28;;32355:83;;;::::0;-1:-1:-1;;;32355:83:0;;17955:2:1;32355:83:0::1;::::0;::::1;17937:21:1::0;17994:2;17974:18;;;17967:30;18033:34;18013:18;;;18006:62;-1:-1:-1;;;18084:18:1;;;18077:40;18134:19;;32355:83:0::1;17753:406:1::0;32355:83:0::1;32449:9;:17:::0;32253:221::o;9491:179::-;9549:7;;9581:5;9585:1;9581;:5;:::i;:::-;9569:17;;9610:1;9605;:6;;9597:46;;;;-1:-1:-1;;;9597:46:0;;18496:2:1;9597:46:0;;;18478:21:1;18535:2;18515:18;;;18508:30;18574:29;18554:18;;;18547:57;18621:18;;9597:46:0;18294:351:1;9597:46:0;9661:1;9491:179;-1:-1:-1;;;9491:179:0:o;10020:248::-;10078:7;10102:1;10107;10102:6;10098:47;;-1:-1:-1;10132:1:0;10125:8;;10098:47;10157:9;10169:5;10173:1;10169;:5;:::i;:::-;10157:17;-1:-1:-1;10202:1:0;10193:5;10197:1;10157:17;10193:5;:::i;:::-;:10;10185:56;;;;-1:-1:-1;;;10185:56:0;;18852:2:1;10185:56:0;;;18834:21:1;18891:2;18871:18;;;18864:30;18930:34;18910:18;;;18903:62;-1:-1:-1;;;18981:18:1;;;18974:31;19022:19;;10185:56:0;18650:397:1;10276:132:0;10334:7;10361:39;10365:1;10368;10361:39;;;;;;;;;;;;;;;;;:3;:39::i;46423:1908::-;46492:6;46502:1;46492:11;46488:50;;46423:1908;:::o;46488:50::-;46548:24;46565:6;46548:16;:24::i;:::-;46583:19;46605:25;46619:10;;46605:9;;:13;;:25;;;;:::i;:::-;46583:47;;46643:12;46658:4;46643:19;;46673:15;46691:4;46673:22;;46706:15;46724:4;46706:22;;46741:17;46769:24;46804:25;46842:21;46874:19;46904:23;46938:17;46988:1;46972:13;;:17;46968:205;;;47025:136;47151:9;;47132:16;;47116:13;;:32;;;;:::i;:::-;:44;;;;:::i;:::-;47025:86;47097:13;;47025:53;47066:11;47025:36;47051:9;;47025:21;:25;;:36;;;;:::i;:53::-;:71;;:86::i;:136::-;47006:155;;46968:205;47187:14;;:18;47183:212;;47242:141;47372:10;;47352:17;;47335:14;;:34;;;;:::i;:::-;:47;;;;:::i;:::-;47242:88;47315:14;;47242:54;47284:11;47242:37;47268:10;;47242:21;:25;;:37;;;;:::i;:141::-;47222:161;;47183:212;47417:39;:16;47438:17;47417:20;:39::i;:::-;47405:51;-1:-1:-1;47473:13:0;;47469:111;;47525:15;;47517:51;;-1:-1:-1;;;;;47525:15:0;;;;47554:9;;47517:51;;;;47554:9;47525:15;47517:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47503:65:0;;-1:-1:-1;;47469:111:0;47673:9;;47652:16;;:31;;:20;:31::i;:::-;47638:10;;47616:17;;:33;;:21;:33::i;:::-;:67;;;;:::i;:::-;47600:83;-1:-1:-1;47700:17:0;;47696:256;;47748:40;:21;47774:13;47748:25;:40::i;:::-;47734:54;;47863:11;47821:39;47842:17;;47821:16;;:20;;:39;;;;:::i;:::-;:53;;;;:::i;:::-;47803:71;;47929:11;47901:25;47915:10;;47901:9;;:13;;:25;;;;:::i;:::-;:39;;;;:::i;:::-;47889:51;;47696:256;47976:19;;47972:126;;48037:15;;48029:57;;-1:-1:-1;;;;;48037:15:0;;;;48066;;48029:57;;;;48066:15;48037;48029:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;48012:74:0;;-1:-1:-1;;47972:126:0;48112:13;;48108:108;;48167:9;;48159:45;;-1:-1:-1;;;;;48167:9:0;;;;48190;;48159:45;;;;48190:9;48167;48159:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;48142:62:0;;-1:-1:-1;;48108:108:0;48233:90;48247:9;48258:27;48276:9;48258:15;:27;:::i;:::-;48287:7;:21;;;;;48298:10;48287:21;:35;;;;;48312:10;48287:35;48233:90;;;19458:25:1;;;19514:2;19499:18;;19492:34;;;;19569:14;19562:22;19542:18;;;19535:50;19446:2;19431:18;48233:90:0;;;;;;;46477:1854;;;;;;;;;;;46423:1908;:::o;9678:136::-;9736:7;9763:43;9767:1;9770;9763:43;;;;;;;;;;;;;;;;;:3;:43::i;8342:346::-;-1:-1:-1;;;;;8444:19:0;;8436:68;;;;-1:-1:-1;;;8436:68:0;;19798:2:1;8436:68:0;;;19780:21:1;19837:2;19817:18;;;19810:30;19876:34;19856:18;;;19849:62;-1:-1:-1;;;19927:18:1;;;19920:34;19971:19;;8436:68:0;19596:400:1;8436:68:0;-1:-1:-1;;;;;8523:21:0;;8515:68;;;;-1:-1:-1;;;8515:68:0;;20203:2:1;8515:68:0;;;20185:21:1;20242:2;20222:18;;;20215:30;20281:34;20261:18;;;20254:62;-1:-1:-1;;;20332:18:1;;;20325:32;20374:19;;8515:68:0;20001:398:1;8515:68:0;-1:-1:-1;;;;;8596:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;8648:32;;2499:25:1;;;8648:32:0;;2472:18:1;8648:32:0;;;;;;;;8342:346;;;:::o;6985:538::-;-1:-1:-1;;;;;7091:20:0;;7083:70;;;;-1:-1:-1;;;7083:70:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;7172:23:0;;7164:71;;;;-1:-1:-1;;;7164:71:0;;;;;;;:::i;:::-;7328:70;7350:6;7328:70;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;7328:17:0;;:9;:17;;;;;;;;;;;;:70;:21;:70::i;:::-;-1:-1:-1;;;;;7308:17:0;;;:9;:17;;;;;;;;;;;:90;;;;7432:20;;;;;;;:32;;7457:6;7432:24;:32::i;:::-;-1:-1:-1;;;;;7409:20:0;;;:9;:20;;;;;;;;;;;;:55;;;;7480:35;2499:25:1;;;7409:20:0;;7480:35;;;;;;2472:18:1;7480:35:0;2353:177:1;38215:5617:0;-1:-1:-1;;;;;38313:18:0;;38305:68;;;;-1:-1:-1;;;38305:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;38392:16:0;;38384:64;;;;-1:-1:-1;;;38384:64:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;38611:39:0;;38459:18;38611:39;;;:33;:39;;;;;;38459:18;;;;;;;;38611:39;;38606:132;;38675:14;;-1:-1:-1;;;38675:14:0;;;;38667:59;;;;-1:-1:-1;;;38667:59:0;;21416:2:1;38667:59:0;;;21398:21:1;;;21435:18;;;21428:30;21494:34;21474:18;;;21467:62;21546:18;;38667:59:0;21214:356:1;38667:59:0;38752:6;38762:1;38752:11;38748:4915;;38780:28;38796:4;38802:2;38806:1;38780:15;:28::i;:::-;38823:7;;;;;38215:5617;;;:::o;38748:4915::-;38872:8;;-1:-1:-1;;;38872:8:0;;;;38871:9;:39;;;;-1:-1:-1;;;;;;38885:25:0;;;;;;:19;:25;;;;;;;;38884:26;38871:39;:67;;;;-1:-1:-1;;;;;;38915:23:0;;;;;;:19;:23;;;;;;;;38914:24;38871:67;38867:4796;;;-1:-1:-1;;;;;38972:29:0;;;38955:14;38972:29;;;:25;:29;;;;;;;39032:31;;;;;;;;38972:29;;;;;39032:31;39084:9;;:23;;;;;39098:9;39097:10;39084:23;39080:2389;;;-1:-1:-1;;;;;39133:25:0;;;;;;:19;:25;;;;;;;;39132:26;:54;;;;-1:-1:-1;;;;;;39163:23:0;;;;;;:19;:23;;;;;;;;39162:24;39132:54;39128:759;;;39211:13;39227:32;39255:3;39227:23;39238:11;;39227:6;:10;;:23;;;;:::i;:32::-;39211:48;-1:-1:-1;39291:17:0;:6;39211:48;39291:10;:17::i;:::-;39282:26;;39331:43;39347:4;39361;39368:5;39331:15;:43::i;:::-;39397:33;39413:4;39419:2;39423:6;39397:15;:33::i;:::-;39453:15;;-1:-1:-1;;;;;39453:15:0;:26;39480:4;39486:15;39480:4;39486:9;:15::i;:::-;39453:49;;-1:-1:-1;;;;;;39453:49:0;;;;;;;-1:-1:-1;;;;;11296:32:1;;;39453:49:0;;;11278:51:1;11345:18;;;11338:34;11251:18;;39453:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;39525:15:0;;-1:-1:-1;;;;;39525:15:0;;-1:-1:-1;39525:26:0;;-1:-1:-1;39552:2:0;39556:13;39552:2;39556:9;:13::i;:::-;39525:45;;-1:-1:-1;;;;;;39525:45:0;;;;;;;-1:-1:-1;;;;;11296:32:1;;;39525:45:0;;;11278:51:1;11345:18;;;11338:34;11251:18;;39525:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39593:7;;;;;;;;38215:5617;;;:::o;39128:759::-;39665:33;39681:4;39687:2;39691:6;39665:15;:33::i;:::-;39721:15;;-1:-1:-1;;;;;39721:15:0;:26;39748:4;39754:15;39748:4;39754:9;:15::i;:::-;39721:49;;-1:-1:-1;;;;;;39721:49:0;;;;;;;-1:-1:-1;;;;;11296:32:1;;;39721:49:0;;;11278:51:1;11345:18;;;11338:34;11251:18;;39721:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;39793:15:0;;-1:-1:-1;;;;;39793:15:0;;-1:-1:-1;39793:26:0;;-1:-1:-1;39820:2:0;39824:13;39820:2;39824:9;:13::i;:::-;39793:45;;-1:-1:-1;;;;;;39793:45:0;;;;;;;-1:-1:-1;;;;;11296:32:1;;;39793:45:0;;;11278:51:1;11345:18;;;11338:34;11251:18;;39793:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39861:7;;;;;;;38215:5617;;;:::o;39080:2389::-;39927:9;39923:1546;;;39970:14;;40014:12;;40061:17;;40112:16;;40157:10;;40192:14;;39970;;-1:-1:-1;40014:12:0;;-1:-1:-1;40061:17:0;;-1:-1:-1;40112:16:0;-1:-1:-1;40157:10:0;-1:-1:-1;40192:14:0;;40188:344;;;40296:13;;40283:9;40254:39;;;;:28;:39;;;;;;:55;;40296:13;40254:55;:::i;:::-;40235:15;:74;;40227:134;;;;-1:-1:-1;;;40227:134:0;;21777:2:1;40227:134:0;;;21759:21:1;21816:2;21796:18;;;21789:30;-1:-1:-1;;;21835:18:1;;;21828:52;21897:18;;40227:134:0;21575:346:1;40227:134:0;40398:5;;40388:6;:15;;40380:54;;;;-1:-1:-1;;;40380:54:0;;22128:2:1;40380:54:0;;;22110:21:1;22167:2;22147:18;;;22140:30;22206:29;22186:18;;;22179:57;22253:18;;40380:54:0;21926:351:1;40380:54:0;40482:9;40453:39;;;;:28;:39;;;;;40495:15;40453:57;;40188:344;39923:1546;;;40559:8;40555:914;;;40601:13;;40644:11;;40690:16;;40740:15;;40784:9;;40818:14;;40601:13;;-1:-1:-1;40644:11:0;;-1:-1:-1;40690:16:0;;-1:-1:-1;40740:15:0;-1:-1:-1;40784:9:0;-1:-1:-1;40818:14:0;;40814:453;;;40897:5;;40879:15;;:23;;;;:::i;:::-;40861:15;:41;40853:71;;;;-1:-1:-1;;;40853:71:0;;22484:2:1;40853:71:0;;;22466:21:1;22523:2;22503:18;;;22496:30;-1:-1:-1;;;22542:18:1;;;22535:48;22600:18;;40853:71:0;22282:342:1;40853:71:0;40966:13;;40951:11;:28;;40943:64;;;;-1:-1:-1;;;40943:64:0;;22831:2:1;40943:64:0;;;22813:21:1;22870:2;22850:18;;;22843:30;22909:26;22889:18;;;22882:54;22953:18;;40943:64:0;22629:348:1;40943:64:0;41059:9;41034:35;;;;:24;:35;;;;;;41073:12;41034:51;;41026:83;;;;-1:-1:-1;;;41026:83:0;;23184:2:1;41026:83:0;;;23166:21:1;23223:2;23203:18;;;23196:30;-1:-1:-1;;;23242:18:1;;;23235:50;23302:18;;41026:83:0;22982:344:1;41026:83:0;41146:5;;41136:6;:15;;41128:54;;;;-1:-1:-1;;;41128:54:0;;22128:2:1;41128:54:0;;;22110:21:1;22167:2;22147:18;;;22140:30;22206:29;22186:18;;;22179:57;22253:18;;41128:54:0;21926:351:1;41128:54:0;41226:9;41201:35;;;;:24;:35;;;;;41239:12;41201:50;;40814:453;41295:32;41330:13;41340:2;41330:9;:13::i;:::-;41403:9;;41295:48;;-1:-1:-1;41366:33:0;41393:6;41295:48;41366:33;:::i;:::-;:46;;41358:95;;;;-1:-1:-1;;;41358:95:0;;23533:2:1;41358:95:0;;;23515:21:1;23572:2;23552:18;;;23545:30;23611:34;23591:18;;;23584:62;-1:-1:-1;;;23662:18:1;;;23655:34;23706:19;;41358:95:0;23331:400:1;41358:95:0;40569:900;40555:914;41485:17;41505:54;41551:7;41520:28;41535:13;41520:12;:28;:::i;:::-;:38;;;;:::i;:::-;41505:10;;:14;:54::i;:::-;41485:74;;41576:28;41607:24;41625:4;41607:9;:24::i;:::-;41687:18;;41576:55;;-1:-1:-1;41663:42:0;;;;;;;41726:20;;;41737:9;41726:20;41722:1014;;;41767:8;:15;;-1:-1:-1;;;;41767:15:0;-1:-1:-1;;;41767:15:0;;;41807:21;;41767:15;41807:21;:41;;;;;41847:1;41832:12;:16;41807:41;:61;;;;;41867:1;41852:12;;:16;41807:61;41803:689;;;41893:20;41916:25;41930:10;;41916:9;;:13;;:25;;;;:::i;:::-;41893:48;;41964:24;41991:53;42031:12;41991:35;42016:9;;41991:20;:24;;:35;;;;:::i;:53::-;41964:80;;42067:22;42092:54;42133:12;42092:36;42117:10;;42092:20;:24;;:36;;;;:::i;:54::-;42067:79;;42169:21;42193:52;42232:12;;42193:34;42214:12;42193:16;:20;;:34;;;;:::i;:52::-;42169:76;;42268:22;42293:51;42330:13;;42293:32;42312:12;42293:14;:18;;:32;;;;:::i;:51::-;42268:76;-1:-1:-1;42367:18:0;42388:33;42268:76;42407:13;42388:18;:33::i;:::-;42367:54;;42446:26;42461:10;42446:14;:26::i;:::-;41870:622;;;;;;41803:689;42512:24;42539;42557:4;42539:9;:24::i;:::-;42512:51;;42582:38;42603:16;42582:20;:38::i;:::-;-1:-1:-1;42651:1:0;42639:9;:13;;;42671:10;:14;42704:8;:16;;-1:-1:-1;;;;42704:16:0;;;41722:1014;42752:12;42767:30;42793:3;42767:21;:6;42778:9;42767:10;:21::i;:30::-;42752:45;-1:-1:-1;42812:18:0;42851:12;;42847:202;;42916:3;42893:20;:6;42904:8;42893:10;:20::i;:::-;:26;;;;:::i;:::-;42880:39;;42934;42950:4;42956;;;;;;;;;-1:-1:-1;;;;;42956:4:0;42962:10;42934:15;:39::i;:::-;43003:12;;:28;;43020:10;43003:16;:28::i;:::-;42988:12;:43;42847:202;43074:29;43085:17;43092:10;43085:4;:17;:::i;:::-;43074:6;;:10;:29::i;:::-;43065:38;;43124:9;43120:169;;;43167:10;;:20;;43182:4;43167:14;:20::i;:::-;43154:10;:33;43120:169;;;43254:9;;:19;;43268:4;43254:13;:19::i;:::-;43242:9;:31;43120:169;43305:42;43321:4;43335;43342;43305:15;:42::i;:::-;43378:16;;43415:15;;:28;;-1:-1:-1;;;;;;43415:28:0;;;;;2499:25:1;;;-1:-1:-1;;;;;43415:15:0;;;;:23;;2472:18:1;;43415:28:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;43415:28:0;;;;;;;;-1:-1:-1;;43415:28:0;;;;;;;;;;;;:::i;:::-;;;43411:241;;;43541:86;;;13694:25:1;;;13750:2;13735:18;;13728:34;;;13778:18;;;13771:34;;;13836:2;13821:18;;13814:34;;;43617:9:0;;43606:4;;43541:86;;13681:3:1;13666:19;43541:86:0;;;;;;;43444:199;;;43411:241;38940:4723;;;;;;;;38867:4796;43675:33;43691:4;43697:2;43701:6;43675:15;:33::i;:::-;43719:15;;-1:-1:-1;;;;;43719:15:0;:26;43746:4;43752:15;43746:4;43752:9;:15::i;:::-;43719:49;;-1:-1:-1;;;;;;43719:49:0;;;;;;;-1:-1:-1;;;;;11296:32:1;;;43719:49:0;;;11278:51:1;11345:18;;;11338:34;11251:18;;43719:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;43779:15:0;;-1:-1:-1;;;;;43779:15:0;;-1:-1:-1;43779:26:0;;-1:-1:-1;43806:2:0;43810:13;43806:2;43810:9;:13::i;:::-;43779:45;;-1:-1:-1;;;;;;43779:45:0;;;;;;;-1:-1:-1;;;;;11296:32:1;;;43779:45:0;;;11278:51:1;11345:18;;;11338:34;11251:18;;43779:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38294:5538;;;;;38215:5617;;;:::o;9822:190::-;9908:7;9944:12;9936:6;;;;9928:29;;;;-1:-1:-1;;;9928:29:0;;;;;;;;:::i;:::-;-1:-1:-1;9968:9:0;9980:5;9984:1;9980;:5;:::i;:::-;9968:17;9822:190;-1:-1:-1;;;;;9822:190:0:o;33532:280::-;-1:-1:-1;;;;;33615:31:0;;;;;;:25;:31;;;;;:39;;-1:-1:-1;;33615:39:0;;;;;;;;;;;;33667:80;;33693:15;;:42;;-1:-1:-1;;;33693:42:0;;-1:-1:-1;;;;;178:32:1;;;33693:42:0;;;160:51:1;33693:15:0;;;;:36;;133:18:1;;33693:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33667:80;33764:40;;;;;;-1:-1:-1;;;;;33764:40:0;;;;;;;;33532:280;;:::o;10416:276::-;10502:7;10537:12;10530:5;10522:28;;;;-1:-1:-1;;;10522:28:0;;;;;;;;:::i;:::-;-1:-1:-1;10561:9:0;10573:5;10577:1;10573;:5;:::i;44328:499::-;44418:16;;;44432:1;44418:16;;;;;;;;44394:21;;44418:16;;;;;;;;;;-1:-1:-1;44418:16:0;44394:40;;44463:4;44445;44450:1;44445:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;44445:23:0;;;:7;;;;;;;;;;:23;;;;44489:15;;:22;;;-1:-1:-1;;;44489:22:0;;;;:15;;;;;:20;;:22;;;;;44445:7;;44489:22;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44479:4;44484:1;44479:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;44479:32:0;;;:7;;;;;;;;;:32;44554:15;;44522:62;;44539:4;;44554:15;44572:11;44522:8;:62::i;:::-;44595:15;;:224;;-1:-1:-1;;;44595:224:0;;-1:-1:-1;;;;;44595:15:0;;;;:66;;:224;;44676:11;;44595:15;;44746:4;;44773;;44793:15;;44595:224;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44383:444;44328:499;:::o;43840:480::-;43899:12;43914:13;:6;43925:1;43914:10;:13::i;:::-;43899:28;-1:-1:-1;43938:17:0;43958:16;:6;43899:28;43958:10;:16::i;:::-;43938:36;-1:-1:-1;44010:21:0;44042:22;44059:4;44042:16;:22::i;:::-;44145:18;44166:41;:21;44192:14;44166:25;:41::i;:::-;44145:62;;44218:35;44231:9;44242:10;44218:12;:35::i;:::-;44269:43;;;25056:25:1;;;25112:2;25097:18;;25090:34;;;25140:18;;;25133:34;;;44269:43:0;;25044:2:1;25029:18;44269:43:0;;;;;;;43888:432;;;;43840:480;:::o;45451:513::-;45631:15;;45599:62;;45616:4;;-1:-1:-1;;;;;45631:15:0;45649:11;45599:8;:62::i;:::-;45704:15;;-1:-1:-1;;;;;45704:15:0;:31;45743:9;45776:4;45796:11;45704:15;;45908:7;11395:6;;-1:-1:-1;;;;;11395:6:0;;11330:79;45908:7;45704:252;;;;;;-1:-1:-1;;;;;;45704:252:0;;;-1:-1:-1;;;;;25537:15:1;;;45704:252:0;;;25519:34:1;25569:18;;;25562:34;;;;25612:18;;;25605:34;;;;25655:18;;;25648:34;25719:15;;;25698:19;;;25691:44;45930:15:0;25751:19:1;;;25744:35;25453:19;;45704:252:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;222:180:1:-;281:6;334:2;322:9;313:7;309:23;305:32;302:52;;;350:1;347;340:12;302:52;-1:-1:-1;373:23:1;;222:180;-1:-1:-1;222:180:1:o;407:548::-;519:4;548:2;577;566:9;559:21;609:6;603:13;652:6;647:2;636:9;632:18;625:34;677:1;687:140;701:6;698:1;695:13;687:140;;;796:14;;;792:23;;786:30;762:17;;;781:2;758:26;751:66;716:10;;687:140;;;691:3;876:1;871:2;862:6;851:9;847:22;843:31;836:42;946:2;939;935:7;930:2;922:6;918:15;914:29;903:9;899:45;895:54;887:62;;;;407:548;;;;:::o;960:131::-;-1:-1:-1;;;;;1035:31:1;;1025:42;;1015:70;;1081:1;1078;1071:12;1096:118;1182:5;1175:13;1168:21;1161:5;1158:32;1148:60;;1204:1;1201;1194:12;1219:382;1284:6;1292;1345:2;1333:9;1324:7;1320:23;1316:32;1313:52;;;1361:1;1358;1351:12;1313:52;1400:9;1387:23;1419:31;1444:5;1419:31;:::i;:::-;1469:5;-1:-1:-1;1526:2:1;1511:18;;1498:32;1539:30;1498:32;1539:30;:::i;:::-;1588:7;1578:17;;;1219:382;;;;;:::o;1606:315::-;1674:6;1682;1735:2;1723:9;1714:7;1710:23;1706:32;1703:52;;;1751:1;1748;1741:12;1703:52;1790:9;1777:23;1809:31;1834:5;1809:31;:::i;:::-;1859:5;1911:2;1896:18;;;;1883:32;;-1:-1:-1;;;1606:315:1:o;2535:127::-;2596:10;2591:3;2587:20;2584:1;2577:31;2627:4;2624:1;2617:15;2651:4;2648:1;2641:15;2667:275;2738:2;2732:9;2803:2;2784:13;;-1:-1:-1;;2780:27:1;2768:40;;2838:18;2823:34;;2859:22;;;2820:62;2817:88;;;2885:18;;:::i;:::-;2921:2;2914:22;2667:275;;-1:-1:-1;2667:275:1:o;2947:183::-;3007:4;3040:18;3032:6;3029:30;3026:56;;;3062:18;;:::i;:::-;-1:-1:-1;3107:1:1;3103:14;3119:4;3099:25;;2947:183::o;3135:662::-;3189:5;3242:3;3235:4;3227:6;3223:17;3219:27;3209:55;;3260:1;3257;3250:12;3209:55;3296:6;3283:20;3322:4;3346:60;3362:43;3402:2;3362:43;:::i;:::-;3346:60;:::i;:::-;3440:15;;;3526:1;3522:10;;;;3510:23;;3506:32;;;3471:12;;;;3550:15;;;3547:35;;;3578:1;3575;3568:12;3547:35;3614:2;3606:6;3602:15;3626:142;3642:6;3637:3;3634:15;3626:142;;;3708:17;;3696:30;;3746:12;;;;3659;;3626:142;;;-1:-1:-1;3786:5:1;3135:662;-1:-1:-1;;;;;;3135:662:1:o;3802:1215::-;3920:6;3928;3981:2;3969:9;3960:7;3956:23;3952:32;3949:52;;;3997:1;3994;3987:12;3949:52;4037:9;4024:23;4066:18;4107:2;4099:6;4096:14;4093:34;;;4123:1;4120;4113:12;4093:34;4161:6;4150:9;4146:22;4136:32;;4206:7;4199:4;4195:2;4191:13;4187:27;4177:55;;4228:1;4225;4218:12;4177:55;4264:2;4251:16;4286:4;4310:60;4326:43;4366:2;4326:43;:::i;4310:60::-;4404:15;;;4486:1;4482:10;;;;4474:19;;4470:28;;;4435:12;;;;4510:19;;;4507:39;;;4542:1;4539;4532:12;4507:39;4566:11;;;;4586:217;4602:6;4597:3;4594:15;4586:217;;;4682:3;4669:17;4699:31;4724:5;4699:31;:::i;:::-;4743:18;;4619:12;;;;4781;;;;4586:217;;;4822:5;-1:-1:-1;;4865:18:1;;4852:32;;-1:-1:-1;;4896:16:1;;;4893:36;;;4925:1;4922;4915:12;4893:36;;4948:63;5003:7;4992:8;4981:9;4977:24;4948:63;:::i;:::-;4938:73;;;3802:1215;;;;;:::o;5022:456::-;5099:6;5107;5115;5168:2;5156:9;5147:7;5143:23;5139:32;5136:52;;;5184:1;5181;5174:12;5136:52;5223:9;5210:23;5242:31;5267:5;5242:31;:::i;:::-;5292:5;-1:-1:-1;5349:2:1;5334:18;;5321:32;5362:33;5321:32;5362:33;:::i;:::-;5022:456;;5414:7;;-1:-1:-1;;;5468:2:1;5453:18;;;;5440:32;;5022:456::o;5921:241::-;5977:6;6030:2;6018:9;6009:7;6005:23;6001:32;5998:52;;;6046:1;6043;6036:12;5998:52;6085:9;6072:23;6104:28;6126:5;6104:28;:::i;6167:247::-;6226:6;6279:2;6267:9;6258:7;6254:23;6250:32;6247:52;;;6295:1;6292;6285:12;6247:52;6334:9;6321:23;6353:31;6378:5;6353:31;:::i;6643:799::-;6783:6;6791;6799;6807;6815;6823;6831;6839;6847;6855;6908:3;6896:9;6887:7;6883:23;6879:33;6876:53;;;6925:1;6922;6915:12;6876:53;-1:-1:-1;;6948:23:1;;;7018:2;7003:18;;6990:32;;-1:-1:-1;7069:2:1;7054:18;;7041:32;;7120:2;7105:18;;7092:32;;-1:-1:-1;7171:3:1;7156:19;;7143:33;;-1:-1:-1;7223:3:1;7208:19;;7195:33;;-1:-1:-1;7275:3:1;7260:19;;7247:33;;-1:-1:-1;7327:3:1;7312:19;;7299:33;;-1:-1:-1;7379:3:1;7364:19;;7351:33;;-1:-1:-1;7431:3:1;7416:19;7403:33;;-1:-1:-1;6643:799:1;-1:-1:-1;6643:799:1:o;8009:388::-;8077:6;8085;8138:2;8126:9;8117:7;8113:23;8109:32;8106:52;;;8154:1;8151;8144:12;8106:52;8193:9;8180:23;8212:31;8237:5;8212:31;:::i;:::-;8262:5;-1:-1:-1;8319:2:1;8304:18;;8291:32;8332:33;8291:32;8332:33;:::i;8402:385::-;8488:6;8496;8504;8512;8565:3;8553:9;8544:7;8540:23;8536:33;8533:53;;;8582:1;8579;8572:12;8533:53;-1:-1:-1;;8605:23:1;;;8675:2;8660:18;;8647:32;;-1:-1:-1;8726:2:1;8711:18;;8698:32;;8777:2;8762:18;8749:32;;-1:-1:-1;8402:385:1;-1:-1:-1;8402:385:1:o;8792:356::-;8994:2;8976:21;;;9013:18;;;9006:30;9072:34;9067:2;9052:18;;9045:62;9139:2;9124:18;;8792:356::o;9153:127::-;9214:10;9209:3;9205:20;9202:1;9195:31;9245:4;9242:1;9235:15;9269:4;9266:1;9259:15;9285:168;9358:9;;;9389;;9406:15;;;9400:22;;9386:37;9376:71;;9427:18;;:::i;9458:380::-;9537:1;9533:12;;;;9580;;;9601:61;;9655:4;9647:6;9643:17;9633:27;;9601:61;9708:2;9700:6;9697:14;9677:18;9674:38;9671:161;;9754:10;9749:3;9745:20;9742:1;9735:31;9789:4;9786:1;9779:15;9817:4;9814:1;9807:15;9671:161;;9458:380;;;:::o;10964:127::-;11025:10;11020:3;11016:20;11013:1;11006:31;11056:4;11053:1;11046:15;11080:4;11077:1;11070:15;11383:135;11422:3;11443:17;;;11440:43;;11463:18;;:::i;:::-;-1:-1:-1;11510:1:1;11499:13;;11383:135::o;11523:251::-;11593:6;11646:2;11634:9;11625:7;11621:23;11617:32;11614:52;;;11662:1;11659;11652:12;11614:52;11694:9;11688:16;11713:31;11738:5;11713:31;:::i;11779:184::-;11849:6;11902:2;11890:9;11881:7;11877:23;11873:32;11870:52;;;11918:1;11915;11908:12;11870:52;-1:-1:-1;11941:16:1;;11779:184;-1:-1:-1;11779:184:1:o;12273:245::-;12340:6;12393:2;12381:9;12372:7;12368:23;12364:32;12361:52;;;12409:1;12406;12399:12;12361:52;12441:9;12435:16;12460:28;12482:5;12460:28;:::i;12523:217::-;12563:1;12589;12579:132;;12633:10;12628:3;12624:20;12621:1;12614:31;12668:4;12665:1;12658:15;12696:4;12693:1;12686:15;12579:132;-1:-1:-1;12725:9:1;;12523:217::o;13152:306::-;13240:6;13248;13256;13309:2;13297:9;13288:7;13284:23;13280:32;13277:52;;;13325:1;13322;13315:12;13277:52;13354:9;13348:16;13338:26;;13404:2;13393:9;13389:18;13383:25;13373:35;;13448:2;13437:9;13433:18;13427:25;13417:35;;13152:306;;;;;:::o;16027:557::-;16140:6;16148;16156;16164;16172;16180;16233:3;16221:9;16212:7;16208:23;16204:33;16201:53;;;16250:1;16247;16240:12;16201:53;16282:9;16276:16;16301:31;16326:5;16301:31;:::i;:::-;16396:2;16381:18;;16375:25;16440:2;16425:18;;16419:25;16484:2;16469:18;;16463:25;16528:3;16513:19;;16507:26;16573:3;16558:19;;;16552:26;16351:5;;16375:25;;-1:-1:-1;16419:25:1;;16463;;-1:-1:-1;16507:26:1;-1:-1:-1;16552:26:1;;-1:-1:-1;16027:557:1;-1:-1:-1;;;16027:557:1:o;18164:125::-;18229:9;;;18250:10;;;18247:36;;;18263:18;;:::i;20404:401::-;20606:2;20588:21;;;20645:2;20625:18;;;20618:30;20684:34;20679:2;20664:18;;20657:62;-1:-1:-1;;;20750:2:1;20735:18;;20728:35;20795:3;20780:19;;20404:401::o;20810:399::-;21012:2;20994:21;;;21051:2;21031:18;;;21024:30;21090:34;21085:2;21070:18;;21063:62;-1:-1:-1;;;21156:2:1;21141:18;;21134:33;21199:3;21184:19;;20810:399::o;23736:128::-;23803:9;;;23824:11;;;23821:37;;;23838:18;;:::i;23869:980::-;24131:4;24179:3;24168:9;24164:19;24210:6;24199:9;24192:25;24236:2;24274:6;24269:2;24258:9;24254:18;24247:34;24317:3;24312:2;24301:9;24297:18;24290:31;24341:6;24376;24370:13;24407:6;24399;24392:22;24445:3;24434:9;24430:19;24423:26;;24484:2;24476:6;24472:15;24458:29;;24505:1;24515:195;24529:6;24526:1;24523:13;24515:195;;;24594:13;;-1:-1:-1;;;;;24590:39:1;24578:52;;24685:15;;;;24650:12;;;;24626:1;24544:9;24515:195;;;-1:-1:-1;;;;;;;24766:32:1;;;;24761:2;24746:18;;24739:60;-1:-1:-1;;;24830:3:1;24815:19;24808:35;24727:3;23869:980;-1:-1:-1;;;23869:980:1:o

Swarm Source

ipfs://9981fa0bb45019d63eb880cae6d660f0236ec6f0cd3cfb27a6ee489f0f171671
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.