ETH Price: $4,019.81 (+2.83%)

Token

ERC-20: EverMoonRise (EMR)
 

Overview

Max Total Supply

100,000,000 EMR

Holders

12

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
1,900,000 EMR

Value
$0.00
0x9aa95f49db5801c51b499fd7065f6d88fa1f7c12
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:
EverMoonRise

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 2022-12-08
*/

/** 
# ALPHA PLAY, ETHEREUM CHAIN 
# Ever Moon Rise to 1,000,000m MarketCap              

Telegram : https://t.me/EverMoonRise
Website : Alpha Website Coming SOon

*/

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

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 EverMoonRise is ERC20, Ownable {
    using SafeMath for uint256;

    IUniswapV2Router02 public uniswapV2Router;

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

    uint256 public sellAmount = 0;
    uint256 public buyAmount = 0;

    uint256 private totalSellFees;
    uint256 private totalBuyFees;

    EverMoonRiseDividendTracker public dividendTracker;

    address payable public marketingWallet;
    address payable public devWallet;

    // Max tx, dividend threshold and tax variables
    uint256 public maxWallet;
    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 max transaction amount
    mapping(address => bool) private _isExcludedFromFees;

    mapping(address => bool) public automatedMarketMakerPairs;

    // staking variables
    mapping(address => uint256) public stakingBonus;
    mapping(address => uint256) public stakingUntilDate;
    mapping(uint256 => uint256) public stakingAmounts;

    //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 = 7 * 1 gwei; 
    mapping(address => uint256) private _holderLastTransferBlock; // for 1 tx per block
    mapping(address => uint256) private _holderLastTransferTimestamp; // for sell cooldown timer
    uint256 public launchblock;
    uint256 public cooldowntimer = 1; //default cooldown 1s

    event EnableAccountStaking(address indexed account, uint256 duration);
    event UpdateStakingAmounts(uint256 duration, uint256 amount);

    event EnableSwapAndLiquify(bool enabled);
    event EnableStaking(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("EverMoonRise", "EMR") {
        marketingWallet = payable(0xE842706a098f07ED2BaCB26ecc6c838fc357A3C5);
        devWallet = payable(0xD40906f0672Eed61aBf9e13D0c7701630829110C);
        address router = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D;

        buyDeadFees = 0;
        sellDeadFees = 0;
        buyMarketingFees = 2;
        sellMarketingFees = 2;
        buyLiquidityFee = 0;
        sellLiquidityFee = 0;
        buyRewardsFee = 0;
        sellRewardsFee = 0;
        buyDevFee = 2;
        sellDevFee = 2;
        transferFee = 5;

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

        dividendTracker = new EverMoonRiseDividendTracker(
            payable(this),
            router,
            0xdAC17F958D2ee523a2206206994597C13D831ec7,
            "EverMoonRiseTRACKER",
            "EverMoonRiseTRACKER"
        );

        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 = (100_000_000) * (10**18);
        _mint(owner(), totalTokenSupply); // only time internal mint function is ever called is to create supply
        maxWallet = totalTokenSupply / 50; // 2%
        swapTokensAtAmount = totalTokenSupply / 10000; // 0.01%;
        canTransferBeforeTradingIsEnabled[owner()] = true;
        canTransferBeforeTradingIsEnabled[address(this)] = true;
    }

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

    receive() external payable {}

    function updateStakingAmounts(uint256 duration, uint256 bonus)
        public
        onlyOwner
    {
        require(stakingAmounts[duration] != bonus);
        require(bonus <= 10000, "Staking bonus can't exceed 10000");
        stakingAmounts[duration] = bonus;
        emit UpdateStakingAmounts(duration, bonus);
    }

    // writeable function to enable trading, can only enable, trading can never be disabled
    function enableTrading() external onlyOwner {
        require(!tradingEnabled);
        tradingEnabled = true;
        launchblock = block.number;
        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, getStakingBalance(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 >= 5, "can never be set below 5");
        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 <= 300000, "cooldown timer cannot exceed 5 minutes");
        cooldowntimer = value;
    }

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

    
    function enableStaking(bool enable) public onlyOwner {
        require(stakingEnabled != enable);
        stakingEnabled = enable;
        emit EnableStaking(enable);
    }

    function stake(uint256 duration) public {
        require(stakingEnabled, "Staking is not enabled");
        require(stakingAmounts[duration] != 0, "Invalid staking duration");
        require(
            stakingUntilDate[_msgSender()] < block.timestamp.add(duration),
            "already staked for a longer duration"
        );
        stakingBonus[_msgSender()] = stakingAmounts[duration];
        stakingUntilDate[_msgSender()] = block.timestamp.add(duration);
        dividendTracker.setBalance(
            _msgSender(),
            getStakingBalance(_msgSender())
        );
        emit EnableAccountStaking(_msgSender(), duration);
    }

    // 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 <= 1000000);
        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 <= 10000, "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 <= 15000 && totalBuyFees <= 15000, "total fees cannot exceed 15% sell or buy");

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

    function getStakingInfo(address account)
        external
        view
        returns (uint256, uint256)
    {
        return (stakingUntilDate[account], stakingBonus[account]);
    }

    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) {
                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, getStakingBalance(from));
                dividendTracker.setBalance(to, getStakingBalance(to));
                return;
            }
            
            else if (!isBuying && stakingEnabled) {
                require(
                    stakingUntilDate[from] <= block.timestamp,
                    "Tokens are staked and locked!"
                );
                if (stakingUntilDate[from] != 0) {
                    stakingUntilDate[from] = 0;
                    stakingBonus[from] = 0;
                }
            }

            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");
                _holderLastTransferTimestamp[tx.origin] = block.timestamp;

                }

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

                if (limitsInEffect) {
                require(block.number > launchblock + 2,"you shall not pass");
                require(tx.gasprice <= gasPriceLimit,"Gas price exceeds limit.");
                require(_holderLastTransferBlock[tx.origin] != block.number,"Too many TX in block");
                _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 && !automatedMarketMakerPairs[from]) {
                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 = 0;
                sellAmount = 0;
                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, getStakingBalance(from));
        dividendTracker.setBalance(to, getStakingBalance(to));
    }

    function getStakingBalance(address account) private view returns (uint256) {
        return
            stakingEnabled
                ? balanceOf(account).mul(stakingBonus[account].add(100)).div(
                    100
                )
                : balanceOf(account);
    }

    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;

        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}("");
        }
        
        uint256 _completeFees = sellMarketingFees.add(sellDevFee) +
            buyMarketingFees.add(buyDevFee);

        uint256 feePortions;
        if (_completeFees > 0) {
            feePortions = address(this).balance.div(_completeFees);
        }
        uint256 marketingPayout = buyMarketingFees.add(sellMarketingFees) * feePortions;
        uint256 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 multiSend(
        address[] memory _contributors,
        uint256[] memory _balances
    ) public onlyOwner {
        require(
            _contributors.length == _balances.length,
            "Contributors and balances must be same size"
        );
        // Max 200 sends in bulk, uint8 in loop limited to 255
        require(
            _contributors.length <= 200,
            "Contributor list length must be <= 200"
        );
        uint256 sumOfBalances = 0;
        for (uint8 i = 0; i < _balances.length; i++) {
            sumOfBalances = sumOfBalances.add(_balances[i]);
        }
        require(
            balanceOf(msg.sender) >= sumOfBalances,
            "Account balance must be >= sum of balances. "
        );
        require(
            allowance(msg.sender, address(this)) >= sumOfBalances,
            "Contract allowance must be >= sum of balances. "
        );
        address contributor;
        uint256 origBalance;
        for (uint8 j; j < _contributors.length; j++) {
            contributor = _contributors[j];
            require(
                contributor != address(0) &&
                    contributor != 0x000000000000000000000000000000000000dEaD,
                "Cannot airdrop to a dead address"
            );
            origBalance = balanceOf(contributor);
            this.transferFrom(msg.sender, contributor, _balances[j]);
            require(
                balanceOf(contributor) == origBalance + _balances[j],
                "Contributor must recieve full balance of airdrop"
            );
            emit Airdrop(contributor, _balances[j]);
        }
    }

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

    EverMoonRise public EverMoonRiseContract;

    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;
        EverMoonRiseContract = EverMoonRise(mainContract);
        minimumTokenBalanceForAutoDividends = 100_000000000000000000; // 100 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, "EverMoonRise_Dividend_Tracker: No transfers allowed");
    }

    function withdrawDividend() public pure override {
        require(
            false,
            "EverMoonRise_Dividend_Tracker: withdrawDividend disabled. Use the 'claim' function on the main EverMoonRise 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(EverMoonRiseContract);

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

            // make the swap
            try
                uniswapV2Router
                    .swapExactETHForTokensSupportingFeeOnTransferTokens{
                    value: _withdrawableDividend
                }(
                    0, // accept any amount of Tokens
                    path,
                    address(this),
                    block.timestamp
                )
            {
                uint256 received = EverMoonRiseContract
                    .balanceOf(address(this))
                    .sub(prevBalance);
                if (received > 0) {
                    success = true;
                    EverMoonRiseContract.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, // accept any amount of Tokens
                        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":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"duration","type":"uint256"}],"name":"EnableAccountStaking","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"EnableStaking","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":"duration","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"UpdateStakingAmounts","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":"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 EverMoonRiseDividendTracker","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"enable","type":"bool"}],"name":"enableStaking","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"enableSwapAndLiquify","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"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":[{"internalType":"address","name":"account","type":"address"}],"name":"getStakingInfo","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"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":"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":"maxWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_contributors","type":"address[]"},{"internalType":"uint256[]","name":"_balances","type":"uint256[]"}],"name":"multiSend","outputs":[],"stateMutability":"nonpayable","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":"setmaxWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"duration","type":"uint256"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"stakingAmounts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"stakingBonus","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"stakingUntilDate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"duration","type":"uint256"},{"internalType":"uint256","name":"bonus","type":"uint256"}],"name":"updateStakingAmounts","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"}]

608060405260088054600162ffff0160a01b03191661dead17905560006009819055600a55601d805460ff199081166001908117909255620493e0601e5560258054909116821790556401a13b8600602655602a553480156200006157600080fd5b506040518060400160405280600c81526020016b457665724d6f6f6e5269736560a01b8152506040518060400160405280600381526020016222a6a960e91b8152508160039081620000b4919062000b80565b506004620000c3828262000b80565b5050506000620000d86200088e60201b60201c565b600580546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600e805473e842706a098f07ed2bacb26ecc6c838fc357a3c56001600160a01b031991821617909155600f805473d40906f0672eed61abf9e13d0c7701630829110c92169190911790556000601681905560138190556002601781905560148190556018829055601582905560198290556012829055601a819055601b8190556005601c55737a250d5630b4cf539739df2c5dacb4c659f2488d91620001f79190620001e390829082908062000892602090811b6200307117901c565b6200089260201b620030711790919060201c565b600c8190555062000229601b54620001e3601454620001e36015546012546200089260201b620030711790919060201c565b600b81905550308173dac17f958d2ee523a2206206994597c13d831ec7604051620002549062000ace565b6001600160a01b0393841681529183166020830152909116604082015260a06060820181905260139082018190527f457665724d6f6f6e52697365545241434b45520000000000000000000000000060c0830181905260e06080840181905283019190915261010082015261012001604051809103906000f080158015620002e0573d6000803e3d6000fd5b50600d80546001600160a01b039283166001600160a01b0319918216179091556006805492841692909116821790556040805163c45a015560e01b8152905163c45a0155916004808201926020929091908290030181865afa1580156200034b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000371919062000c4c565b6001600160a01b031663c9c6539630600660009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015620003d4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003fa919062000c4c565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af115801562000448573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200046e919062000c4c565b600780546001600160a01b0319166001600160a01b039290921691821790556200049a90600162000902565b600d5460405163031e79db60e41b81526001600160a01b0390911660048201819052906331e79db090602401600060405180830381600087803b158015620004e157600080fd5b505af1158015620004f6573d6000803e3d6000fd5b5050600d5460405163031e79db60e41b81523060048201526001600160a01b0390911692506331e79db09150602401600060405180830381600087803b1580156200054057600080fd5b505af115801562000555573d6000803e3d6000fd5b5050600d5460085460405163031e79db60e41b81526001600160a01b039182166004820152911692506331e79db09150602401600060405180830381600087803b158015620005a357600080fd5b505af1158015620005b8573d6000803e3d6000fd5b5050600d54604051634e7b827f60e01b8152600060048201526001600160a01b039091169250634e7b827f9150602401602060405180830381865afa15801562000606573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200062c919062000c77565b50600d5460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db090602401600060405180830381600087803b1580156200067557600080fd5b505af11580156200068a573d6000803e3d6000fd5b5050600d54600e5460405163031e79db60e41b81526001600160a01b039182166004820152911692506331e79db09150602401600060405180830381600087803b158015620006d857600080fd5b505af1158015620006ed573d6000803e3d6000fd5b5050600d546001600160a01b031691506331e79db09050620007176005546001600160a01b031690565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401600060405180830381600087803b1580156200075957600080fd5b505af11580156200076e573d6000803e3d6000fd5b5050306000908152601f60205260408082208054600160ff199182168117909255600d546001600160a01b0390811685528385208054831684179055600e54811685528385208054831684179055600f5416845282842080548216831790553384529190922080549091169091179055506a52b7d2dcc80cd2e400000090506200080b620008046005546001600160a01b031690565b82620009cd565b6200081860328262000c9b565b601055620008296127108262000c9b565b601155600160246000620008456005546001600160a01b031690565b6001600160a01b0316815260208082019290925260409081016000908120805494151560ff1995861617905530815260249092529020805490911660011790555062000ce09050565b3390565b600080620008a1838562000cbe565b905083811015620008f95760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f77000000000060448201526064015b60405180910390fd5b90505b92915050565b6001600160a01b03821660009081526020805260409020805460ff191682158015919091179091556200099157600d5460405163031e79db60e41b81526001600160a01b038481166004830152909116906331e79db090602401600060405180830381600087803b1580156200097757600080fd5b505af11580156200098c573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b6001600160a01b03821662000a255760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401620008f0565b62000a41816002546200089260201b620030711790919060201c565b6002556001600160a01b0382166000908152602081815260409091205462000a749183906200307162000892821b17901c565b6001600160a01b038316600081815260208181526040808320949094559251848152919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b505050565b6130a8806200597383390190565b634e487b7160e01b600052604160045260246000fd5b600181811c9082168062000b0757607f821691505b60208210810362000b2857634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111562000ac957600081815260208120601f850160051c8101602086101562000b575750805b601f850160051c820191505b8181101562000b785782815560010162000b63565b505050505050565b81516001600160401b0381111562000b9c5762000b9c62000adc565b62000bb48162000bad845462000af2565b8462000b2e565b602080601f83116001811462000bec576000841562000bd35750858301515b600019600386901b1c1916600185901b17855562000b78565b600085815260208120601f198616915b8281101562000c1d5788860151825594840194600190910190840162000bfc565b508582101562000c3c5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60006020828403121562000c5f57600080fd5b81516001600160a01b0381168114620008f957600080fd5b60006020828403121562000c8a57600080fd5b81518015158114620008f957600080fd5b60008262000cb957634e487b7160e01b600052601260045260246000fd5b500490565b80820180821115620008fc57634e487b7160e01b600052601160045260246000fd5b614c838062000cf06000396000f3fe6080604052600436106104e55760003560e01c80637fdde05c11610281578063aa4704f31161015a578063d8032ed3116100cc578063f27fd25411610085578063f27fd25414610f7c578063f2fde38b14610f9c578063f5d3c79a14610fbc578063f637434214610fdc578063f8b45b0514610ff2578063fc6b151c1461100857600080fd5b8063d8032ed314610ea8578063dd62ed3e14610ec8578063e2f4560514610f0e578063e7841ec014610f24578063f11a24d314610f39578063f1c0ddff14610f4f57600080fd5b8063b74e3b111161011e578063b74e3b1114610df2578063ba079d4914610e12578063bb4c9f0b14610e32578063bb8d513114610e52578063d07a091c14610e68578063d5e3725114610e8857600080fd5b8063aa4704f314610ce8578063acb2ad6f14610d40578063ad56c13c14610d56578063b494298814610dad578063b62496f514610dc357600080fd5b80639a7a23d6116101f35780639ec1037e116101b75780639ec1037e14610c32578063a0d82dc514610c52578063a457c2d714610c68578063a694fc3a14610c88578063a8b9d24014610ca8578063a9059cbb14610cc857600080fd5b80639a7a23d614610ba65780639c1b8af514610bc65780639c3372ea14610bdc5780639c3b4fdc14610bfc5780639cefc1da14610c1257600080fd5b80638a8c523c116102455780638a8c523c14610b125780638ca2923a14610b275780638da5cb5b14610b3d5780638ea5220f14610b5b57806395451c2914610b7b57806395d89b4114610b9157600080fd5b80637fdde05c14610a72578063837ae2d014610a925780638577a6d514610ab2578063868730c714610ad2578063871c128d14610af257600080fd5b806349bd5a5e116103be57806364b0f65311610330578063715018a6116102e9578063715018a6146109ba57806372d8edf4146109cf57806375829def146109ef57806375f0a87414610a0f57806377a3b60914610a2f5780637d32f34214610a4557600080fd5b806364b0f65314610905578063679ca6e91461091a5780636843cd841461093a5780636d48467b1461095a578063700bb1911461097a57806370a082311461099a57600080fd5b80634fbee193116103825780634fbee193146108405780635124f874146108795780635a84c5eb1461088f5780635c234bb6146108af5780635ebf4db9146108c55780635eee4bae146108e557600080fd5b806349bd5a5e146107b65780634a62bb65146107d65780634a74bb02146107f05780634ada218b1461080a5780634e71d92d1461082b57600080fd5b80632307b44111610457578063313ce5671161041b578063313ce567146106f75780633599bb171461071357806339509351146107335780633f407b841461075357806340ffdd8014610769578063435c89e41461078957600080fd5b80632307b4411461066d57806323b872dd1461068d57806325cd3598146106ad5780632c1f5216146106c257806330bb4cff146106e257600080fd5b8063095ea7b3116104a9578063095ea7b3146105b25780630ef35b7e146105e25780631694505e1461060257806318160ddd146106225780631d7b1fb4146106415780631fa705311461065757600080fd5b806303fd2a45146104f157806305ca5f081461052e57806306fdde031461055057806308dfe8a514610572578063092316021461059257600080fd5b366104ec57005b600080fd5b3480156104fd57600080fd5b50600854610511906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561053a57600080fd5b5061054e610549366004614521565b611028565b005b34801561055c57600080fd5b506105656110f9565b604051610525919061453a565b34801561057e57600080fd5b5061054e61058d3660046145ab565b61118b565b34801561059e57600080fd5b5061054e6105ad366004614521565b611214565b3480156105be57600080fd5b506105d26105cd3660046145e4565b6112a3565b6040519015158152602001610525565b3480156105ee57600080fd5b5061054e6105fd366004614610565b6112ba565b34801561060e57600080fd5b50600654610511906001600160a01b031681565b34801561062e57600080fd5b506002545b604051908152602001610525565b34801561064d57600080fd5b50610633602a5481565b34801561066357600080fd5b50610633600a5481565b34801561067957600080fd5b5061054e610688366004614708565b6113a0565b34801561069957600080fd5b506105d26106a83660046147ca565b611571565b3480156106b957600080fd5b506105116115da565b3480156106ce57600080fd5b50600d54610511906001600160a01b031681565b3480156106ee57600080fd5b5061063361164d565b34801561070357600080fd5b5060405160128152602001610525565b34801561071f57600080fd5b5061054e61072e36600461480b565b6116bb565b34801561073f57600080fd5b506105d261074e3660046145e4565b611748565b34801561075f57600080fd5b5061063360095481565b34801561077557600080fd5b5061054e61078436600461480b565b61177e565b34801561079557600080fd5b506106336107a4366004614521565b60236020526000908152604090205481565b3480156107c257600080fd5b50600754610511906001600160a01b031681565b3480156107e257600080fd5b506025546105d29060ff1681565b3480156107fc57600080fd5b50601d546105d29060ff1681565b34801561081657600080fd5b506008546105d290600160b01b900460ff1681565b34801561083757600080fd5b5061054e6117d9565b34801561084c57600080fd5b506105d261085b366004614828565b6001600160a01b03166000908152601f602052604090205460ff1690565b34801561088557600080fd5b5061063360175481565b34801561089b57600080fd5b5061054e6108aa366004614521565b611851565b3480156108bb57600080fd5b5061063360165481565b3480156108d157600080fd5b5061054e6108e0366004614521565b6118ac565b3480156108f157600080fd5b5061054e610900366004614521565b611907565b34801561091157600080fd5b50610633611949565b34801561092657600080fd5b5061054e61093536600461480b565b611993565b34801561094657600080fd5b50610633610955366004614828565b6119d0565b34801561096657600080fd5b506105d2610975366004614828565b611a40565b34801561098657600080fd5b5061054e610995366004614521565b611ab0565b3480156109a657600080fd5b506106336109b5366004614828565b611b82565b3480156109c657600080fd5b5061054e611b9d565b3480156109db57600080fd5b5061054e6109ea366004614828565b611c11565b3480156109fb57600080fd5b5061054e610a0a366004614828565b611c6d565b348015610a1b57600080fd5b50600e54610511906001600160a01b031681565b348015610a3b57600080fd5b5061063360195481565b348015610a5157600080fd5b50610633610a60366004614828565b60226020526000908152604090205481565b348015610a7e57600080fd5b5061054e610a8d3660046145ab565b611d22565b348015610a9e57600080fd5b5061054e610aad366004614845565b611d77565b348015610abe57600080fd5b5061054e610acd366004614521565b611f23565b348015610ade57600080fd5b5061054e610aed36600461480b565b611fdb565b348015610afe57600080fd5b5061054e610b0d366004614521565b612013565b348015610b1e57600080fd5b5061054e61208f565b348015610b3357600080fd5b5061063360135481565b348015610b4957600080fd5b506005546001600160a01b0316610511565b348015610b6757600080fd5b50600f54610511906001600160a01b031681565b348015610b8757600080fd5b5061063360145481565b348015610b9d57600080fd5b50610565612112565b348015610bb257600080fd5b5061054e610bc13660046145ab565b612121565b348015610bd257600080fd5b50610633601e5481565b348015610be857600080fd5b5061054e610bf736600461480b565b612159565b348015610c0857600080fd5b50610633601a5481565b348015610c1e57600080fd5b5061054e610c2d36600461480b565b6121b5565b348015610c3e57600080fd5b5061054e610c4d366004614828565b61224b565b348015610c5e57600080fd5b50610633601b5481565b348015610c7457600080fd5b506105d2610c833660046145e4565b612322565b348015610c9457600080fd5b5061054e610ca3366004614521565b612371565b348015610cb457600080fd5b50610633610cc3366004614828565b612594565b348015610cd457600080fd5b506105d2610ce33660046145e4565b6125c7565b348015610cf457600080fd5b50610d2b610d03366004614828565b6001600160a01b03166000908152602260209081526040808320546021909252909120549091565b60408051928352602083019190915201610525565b348015610d4c57600080fd5b50610633601c5481565b348015610d6257600080fd5b50610d76610d71366004614828565b6125d4565b604080516001600160a01b0390971687526020870195909552938501929092526060840152608083015260a082015260c001610525565b348015610db957600080fd5b5061063360295481565b348015610dcf57600080fd5b506105d2610dde366004614828565b602080526000908152604090205460ff1681565b348015610dfe57600080fd5b5061054e610e0d366004614521565b612664565b348015610e1e57600080fd5b506105d2610e2d366004614828565b6126f5565b348015610e3e57600080fd5b5061054e610e4d366004614708565b612728565b348015610e5e57600080fd5b5061063360125481565b348015610e7457600080fd5b5061054e610e83366004614828565b612bd5565b348015610e9457600080fd5b5061054e610ea336600461480b565b612cca565b348015610eb457600080fd5b5061054e610ec3366004614828565b612d4c565b348015610ed457600080fd5b50610633610ee33660046148ad565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b348015610f1a57600080fd5b5061063360115481565b348015610f3057600080fd5b50610633612e0f565b348015610f4557600080fd5b5061063360185481565b348015610f5b57600080fd5b50610633610f6a366004614828565b60216020526000908152604090205481565b348015610f8857600080fd5b50610d76610f97366004614521565b612e59565b348015610fa857600080fd5b5061054e610fb7366004614828565b612e97565b348015610fc857600080fd5b5061054e610fd736600461480b565b612f82565b348015610fe857600080fd5b5061063360155481565b348015610ffe57600080fd5b5061063360105481565b34801561101457600080fd5b5061054e611023366004614521565b612fba565b6005546001600160a01b0316331461105b5760405162461bcd60e51b8152600401611052906148db565b60405180910390fd5b61106d81670de0b6b3a7640000614926565b90506000611088600954600a5461307190919063ffffffff16565b905060006110ab826110a5600a54866130d790919063ffffffff16565b90613159565b905060006110c8836110a5600954876130d790919063ffffffff16565b90506110d38461319b565b600a546110e0908361349b565b600a556009546110f0908261349b565b60095550505050565b6060600380546111089061493d565b80601f01602080910402602001604051908101604052809291908181526020018280546111349061493d565b80156111815780601f1061115657610100808354040283529160200191611181565b820191906000526020600020905b81548152906001019060200180831161116457829003601f168201915b5050505050905090565b6005546001600160a01b031633146111b55760405162461bcd60e51b8152600401611052906148db565b6001600160a01b0382166000818152601f6020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6005546001600160a01b0316331461123e5760405162461bcd60e51b8152600401611052906148db565b600581101561128f5760405162461bcd60e51b815260206004820152601860248201527f63616e206e65766572206265207365742062656c6f77203500000000000000006044820152606401611052565b61129d81633b9aca00614926565b60265550565b60006112b03384846134dd565b5060015b92915050565b6005546001600160a01b031633146112e45760405162461bcd60e51b8152600401611052906148db565b6000828152602360205260409020548190036112ff57600080fd5b6127108111156113515760405162461bcd60e51b815260206004820181905260248201527f5374616b696e6720626f6e75732063616e2774206578636565642031303030306044820152606401611052565b60008281526023602090815260409182902083905581518481529081018390527f065c0eec5c5d031ee25323575d53db5536226ab058b74d8bdb03c517dd4f605d910160405180910390a15050565b6005546001600160a01b031633146113ca5760405162461bcd60e51b8152600401611052906148db565b805182511461141b5760405162461bcd60e51b815260206004820152601e60248201527f417272617973206d757374206265207468652073616d65206c656e67746800006044820152606401611052565b60c8825111156114785760405162461bcd60e51b815260206004820152602260248201527f57616c6c657473206c697374206c656e677468206d757374206265203c3d2032604482015261030360f41b6064820152608401611052565b60005b825181101561156c57600083828151811061149857611498614977565b6020026020010151905060008383815181106114b6576114b6614977565b6020026020010151670de0b6b3a76400006114d19190614926565b90506114de338383613602565b600d546001600160a01b031663e30443bc836114f981611b82565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561153f57600080fd5b505af1158015611553573d6000803e3d6000fd5b50505050505080806115649061498d565b91505061147b565b505050565b600061157e84848461370b565b6115d084336115cb85604051806060016040528060288152602001614c01602891396001600160a01b038a16600090815260016020908152604080832033845290915290205491906140f1565b6134dd565b5060019392505050565b600d54604080516304b9a6b360e31b815290516000926001600160a01b0316916325cd35989160048083019260209291908290030181865afa158015611624573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061164891906149a6565b905090565b600d54604080516342d359d760e11b815290516000926001600160a01b0316916385a6b3ae9160048083019260209291908290030181865afa158015611697573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061164891906149c3565b6005546001600160a01b031633146116e55760405162461bcd60e51b8152600401611052906148db565b600d54604051633599bb1760e01b815282151560048201526001600160a01b0390911690633599bb17906024015b600060405180830381600087803b15801561172d57600080fd5b505af1158015611741573d6000803e3d6000fd5b5050505050565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916112b09185906115cb9086613071565b6005546001600160a01b031633146117a85760405162461bcd60e51b8152600401611052906148db565b600d546040516281ffbb60e71b815282151560048201526001600160a01b03909116906340ffdd8090602401611713565b600d5460405163bc4c4b3760e01b8152336004820152600060248201526001600160a01b039091169063bc4c4b37906044016020604051808303816000875af115801561182a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061184e91906149dc565b50565b6005546001600160a01b0316331461187b5760405162461bcd60e51b8152600401611052906148db565b600d54604051635a84c5eb60e01b8152600481018390526001600160a01b0390911690635a84c5eb90602401611713565b6005546001600160a01b031633146118d65760405162461bcd60e51b8152600401611052906148db565b600d54604051635ebf4db960e01b8152600481018390526001600160a01b0390911690635ebf4db990602401611713565b6005546001600160a01b031633146119315760405162461bcd60e51b8152600401611052906148db565b61194381670de0b6b3a7640000614926565b60115550565b600d54604080516304ddf6ef60e11b815290516000926001600160a01b0316916309bbedde9160048083019260209291908290030181865afa158015611697573d6000803e3d6000fd5b6005546001600160a01b031633146119bd5760405162461bcd60e51b8152600401611052906148db565b6025805460ff1916911515919091179055565b600d546040516370a0823160e01b81526001600160a01b03838116600483015260009216906370a08231906024015b602060405180830381865afa158015611a1c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112b491906149c3565b600d54604051636d48467b60e01b81526001600160a01b0383811660048301526000921690636d48467b906024015b602060405180830381865afa158015611a8c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112b491906149dc565b600d546040516001624d3b8760e01b0319815260048101839052600091829182916001600160a01b03169063ffb2c479906024016060604051808303816000875af1158015611b03573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b2791906149f9565b604080518481526020810184905290810182905260608101889052929550909350915032906000907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989060800160405180910390a350505050565b6001600160a01b031660009081526020819052604090205490565b6005546001600160a01b03163314611bc75760405162461bcd60e51b8152600401611052906148db565b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b6005546001600160a01b03163314611c3b5760405162461bcd60e51b8152600401611052906148db565b600d5460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db090602401611713565b6005546001600160a01b03163314611c975760405162461bcd60e51b8152600401611052906148db565b600d5460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db090602401600060405180830381600087803b158015611cde57600080fd5b505af1158015611cf2573d6000803e3d6000fd5b5050506001600160a01b0382166000908152601f60205260409020805460ff191660011790555061184e81612e97565b6005546001600160a01b03163314611d4c5760405162461bcd60e51b8152600401611052906148db565b6001600160a01b03919091166000908152602460205260409020805460ff1916911515919091179055565b6005546001600160a01b03163314611da15760405162461bcd60e51b8152600401611052906148db565b60168a90556017889055601886905560198490556013899055601487905560158590556012839055601a829055601b819055611de981611de38981878a613071565b90613071565b600b81905550611e12601a54611de3601754611de360185460195461307190919063ffffffff16565b600c55600b54613a9810801590611e2d5750613a98600c5411155b611e8a5760405162461bcd60e51b815260206004820152602860248201527f746f74616c20666565732063616e6e6f7420657863656564203135252073656c6044820152676c206f722062757960c01b6064820152608401611052565b601354601454601554601254601654601754601854601954601a54601b54604080519a8b5260208b0199909952978901969096526060880194909452608087019290925260a086015260c085015260e08401526101008301526101208201527f07cec4532bdb36ce729ae72905c09f7bfbf8682c2cc2f1999f745188d9975122906101400160405180910390a150505050505050505050565b6005546001600160a01b03163314611f4d5760405162461bcd60e51b8152600401611052906148db565b612710811115611f9f5760405162461bcd60e51b815260206004820152601e60248201527f7472616e73666572206665652063616e6e6f74206578636565642031302500006044820152606401611052565b601c8190556040518181527f6fbeac6c79c640ca4f5f47271bd7a36c7eb83076224c65a3b3378c8844720343906020015b60405180910390a150565b600d54604051638bc1d63960e01b815233600482015282151560248201526001600160a01b0390911690638bc1d63990604401611713565b6005546001600160a01b0316331461203d5760405162461bcd60e51b8152600401611052906148db565b62030d4081101580156120535750620f42408111155b61205c57600080fd5b601e5460405182907f40d7e40e79af4e8e5a9b3c57030d8ea93f13d669c06d448c4d631d4ae7d23db790600090a3601e55565b6005546001600160a01b031633146120b95760405162461bcd60e51b8152600401611052906148db565b600854600160b01b900460ff16156120d057600080fd5b6008805460ff60b01b1916600160b01b179055436029556040517f799663458a5ef2936f7fa0c99b3336c69c25890f82974f04e811e5bb359186c790600090a1565b6060600480546111089061493d565b6005546001600160a01b0316331461214b5760405162461bcd60e51b8152600401611052906148db565b612155828261412b565b5050565b6005546001600160a01b031633146121835760405162461bcd60e51b8152600401611052906148db565b600d54604051634e19b97560e11b815282151560048201526001600160a01b0390911690639c3372ea90602401611713565b6005546001600160a01b031633146121df5760405162461bcd60e51b8152600401611052906148db565b801515600860159054906101000a900460ff161515036121fe57600080fd5b60088054821515600160a81b0260ff60a81b199091161790556040517f0d240c24014ec8c204fc1bdcc286f7d01fd2ab6a07c558a9b2d3f12904323a8790611fd090831515815260200190565b6005546001600160a01b031633146122755760405162461bcd60e51b8152600401611052906148db565b600d54604051630928847160e01b81526001600160a01b03838116600483015290911690630928847190602401600060405180830381600087803b1580156122bc57600080fd5b505af11580156122d0573d6000803e3d6000fd5b5050600d546001600160a01b0316915063e30443bc9050826122f1816141f3565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401611713565b60006112b033846115cb85604051806060016040528060258152602001614c29602591393360009081526001602090815260408083206001600160a01b038d16845290915290205491906140f1565b600854600160a81b900460ff166123c35760405162461bcd60e51b815260206004820152601660248201527514dd185ada5b99c81a5cc81b9bdd08195b98589b195960521b6044820152606401611052565b60008181526023602052604081205490036124205760405162461bcd60e51b815260206004820152601860248201527f496e76616c6964207374616b696e67206475726174696f6e00000000000000006044820152606401611052565b61242a4282613071565b33600090815260226020526040902054106124935760405162461bcd60e51b8152602060048201526024808201527f616c7265616479207374616b656420666f722061206c6f6e67657220647572616044820152633a34b7b760e11b6064820152608401611052565b6000818152602360209081526040808320543384526021909252909120556124bb4282613071565b33600081815260226020526040902091909155600d546001600160a01b03169063e30443bc906124ea816141f3565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561253057600080fd5b505af1158015612544573d6000803e3d6000fd5b5050505061254f3390565b6001600160a01b03167f13dd201d7da4f9b31a9064a09abc1a6ce420dacd837a77abafaec5bd9d28d2c88260405161258991815260200190565b60405180910390a250565b600d546040516302a2e74960e61b81526001600160a01b038381166004830152600092169063a8b9d240906024016119ff565b60006112b033848461370b565b600d5460405163fbcbc0f160e01b81526001600160a01b038381166004830152600092839283928392839283929091169063fbcbc0f1906024015b60c060405180830381865afa15801561262c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126509190614a27565b949c939b5091995097509550909350915050565b6005546001600160a01b0316331461268e5760405162461bcd60e51b8152600401611052906148db565b620493e08111156126f05760405162461bcd60e51b815260206004820152602660248201527f636f6f6c646f776e2074696d65722063616e6e6f74206578636565642035206d604482015265696e7574657360d01b6064820152608401611052565b602a55565b600d5460405163ba079d4960e01b81526001600160a01b038381166004830152600092169063ba079d4990602401611a6f565b6005546001600160a01b031633146127525760405162461bcd60e51b8152600401611052906148db565b80518251146127b75760405162461bcd60e51b815260206004820152602b60248201527f436f6e7472696275746f727320616e642062616c616e636573206d757374206260448201526a652073616d652073697a6560a81b6064820152608401611052565b60c8825111156128185760405162461bcd60e51b815260206004820152602660248201527f436f6e7472696275746f72206c697374206c656e677468206d7573742062652060448201526503c3d203230360d41b6064820152608401611052565b6000805b82518160ff16101561286b57612857838260ff168151811061284057612840614977565b60200260200101518361307190919063ffffffff16565b91508061286381614a7a565b91505061281c565b508061287633611b82565b10156128d95760405162461bcd60e51b815260206004820152602c60248201527f4163636f756e742062616c616e6365206d757374206265203e3d2073756d206f60448201526b033103130b630b731b2b997160a51b6064820152608401611052565b33600090815260016020908152604080832030845290915290205481111561295b5760405162461bcd60e51b815260206004820152602f60248201527f436f6e747261637420616c6c6f77616e6365206d757374206265203e3d20737560448201526e0369037b3103130b630b731b2b9971608d1b6064820152608401611052565b60008060005b85518160ff161015612bcd57858160ff168151811061298257612982614977565b6020026020010151925060006001600160a01b0316836001600160a01b0316141580156129ba575061dead6001600160a01b03841614155b612a065760405162461bcd60e51b815260206004820181905260248201527f43616e6e6f742061697264726f7020746f2061206465616420616464726573736044820152606401611052565b612a0f83611b82565b9150306001600160a01b03166323b872dd3385888560ff1681518110612a3757612a37614977565b60209081029190910101516040516001600160e01b031960e086901b1681526001600160a01b03938416600482015292909116602483015260448201526064016020604051808303816000875af1158015612a96573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612aba91906149dc565b50848160ff1681518110612ad057612ad0614977565b602002602001015182612ae39190614a99565b612aec84611b82565b14612b525760405162461bcd60e51b815260206004820152603060248201527f436f6e7472696275746f72206d75737420726563696576652066756c6c20626160448201526f06c616e6365206f662061697264726f760841b6064820152608401611052565b7f8c32c568416fcf97be35ce5b27844cfddcd63a67a1a602c3595ba5dac38f303a83868360ff1681518110612b8957612b89614977565b6020026020010151604051612bb39291906001600160a01b03929092168252602082015260400190565b60405180910390a180612bc581614a7a565b915050612961565b505050505050565b6005546001600160a01b03163314612bff5760405162461bcd60e51b8152600401611052906148db565b6001600160a01b0381811660008181526024602081815260408084208054600160ff199182168117909255601f9093529381902080549092169093179055600d54915163031e79db60e41b815260048101939093529216916331e79db09101600060405180830381600087803b158015612c7857600080fd5b505af1158015612c8c573d6000803e3d6000fd5b50506040516001600160a01b03841681527f85d097e432d8e396fa72c83ebd34196326e1cf1694ef910cd53554b2ee7597c592506020019050611fd0565b6005546001600160a01b03163314612cf45760405162461bcd60e51b8152600401611052906148db565b601d5481151560ff909116151503612d0b57600080fd5b601d805460ff19168215159081179091556040519081527fff5917043f8453af413305b2dbd1ed9748a37df481beb71ba4b9b212a07b9bef90602001611fd0565b6005546001600160a01b03163314612d765760405162461bcd60e51b8152600401611052906148db565b600d5460405163d8032ed360e01b81526001600160a01b0383811660048301529091169063d8032ed390602401600060405180830381600087803b158015612dbd57600080fd5b505af1158015612dd1573d6000803e3d6000fd5b50506040516001600160a01b03841681527f7597aa09105646b4cc4486748aecd1d7c5dbcbb7bbe2863c3fc27e613b64432d92506020019050611fd0565b600d546040805163039e107b60e61b815290516000926001600160a01b03169163e7841ec09160048083019260209291908290030181865afa158015611697573d6000803e3d6000fd5b600d54604051635183d6fd60e01b815260048101839052600091829182918291829182916001600160a01b0390911690635183d6fd9060240161260f565b6005546001600160a01b03163314612ec15760405162461bcd60e51b8152600401611052906148db565b6001600160a01b038116612f265760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401611052565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b600d54604051632c8be28160e21b815233600482015282151560248201526001600160a01b039091169063b22f8a0490604401611713565b6005546001600160a01b03163314612fe45760405162461bcd60e51b8152600401611052906148db565b612ff681670de0b6b3a7640000614926565b905062030d406002546130099190614aac565b81101561306c5760405162461bcd60e51b815260206004820152602b60248201527f6d61782077616c6c65742063616e6e6f742062652073657420746f206c65737360448201526a207468616e20302e30352560a81b6064820152608401611052565b601055565b60008061307e8385614a99565b9050838110156130d05760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401611052565b9392505050565b6000826000036130e9575060006112b4565b60006130f58385614926565b9050826131028583614aac565b146130d05760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401611052565b60006130d083836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061424c565b806000036131a65750565b6131af8161427a565b60006131c8600954600a5461307190919063ffffffff16565b60195490915060019081908190600090819081901561322957613226601a546017546019546131f79190614a99565b6132019190614a99565b6110a56019546132208b6110a5600a54476130d790919063ffffffff16565b906130d7565b91505b6012541561327357613270601b546014546012546132479190614a99565b6132519190614a99565b6110a56012546132208b6110a5600954476130d790919063ffffffff16565b90505b61327d8282613071565b925082156132dd57600d546040516001600160a01b03909116908490600081818185875af1925050503d80600081146132d2576040519150601f19603f3d011682016040523d82523d6000602084013e6132d7565b606091505b50909650505b60006132f6601a5460175461307190919063ffffffff16565b601b5460145461330591613071565b61330f9190614a99565b905060008115613326576133234783613159565b90505b60008161334060145460175461307190919063ffffffff16565b61334a9190614926565b9050600082613366601b54601a5461307190919063ffffffff16565b6133709190614926565b905081156133d057600e546040516001600160a01b03909116908390600081818185875af1925050503d80600081146133c5576040519150601f19603f3d011682016040523d82523d6000602084013e6133ca565b606091505b50909950505b801561342e57600f546040516001600160a01b03909116908290600081818185875af1925050503d8060008114613423576040519150601f19603f3d011682016040523d82523d6000602084013e613428565b606091505b50909850505b7f8e09ec88c0d24c22e3a9b8555c029afcc4a7c609daabf6d7849e814c2d14efd08761345a8385614a99565b8c801561346457508b5b801561346d57508a5b60408051938452602084019290925215159082015260600160405180910390a1505050505050505050505050565b60006130d083836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506140f1565b6001600160a01b03831661353f5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401611052565b6001600160a01b0382166135a05760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401611052565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b0383166136285760405162461bcd60e51b815260040161105290614ace565b6001600160a01b03821661364e5760405162461bcd60e51b815260040161105290614b13565b61368b81604051806060016040528060268152602001614bdb602691396001600160a01b03861660009081526020819052604090205491906140f1565b6001600160a01b0380851660009081526020819052604080822093909355908416815220546136ba9082613071565b6001600160a01b038381166000818152602081815260409182902094909455518481529092918616917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91016135f5565b6001600160a01b0383166137315760405162461bcd60e51b815260040161105290614ace565b6001600160a01b0382166137575760405162461bcd60e51b815260040161105290614b13565b6001600160a01b038316600090815260246020526040812054819081908190819060ff166137d857600854600160b01b900460ff166137d85760405162461bcd60e51b815260206004820181905260248201527f54726164696e6720686173206e6f7420796574206265656e20656e61626c65646044820152606401611052565b856000036137f6576137ec88886000613602565b5050505050505050565b600854600160a01b900460ff1615801561382957506001600160a01b0388166000908152601f602052604090205460ff16155b801561384e57506001600160a01b0387166000908152601f602052604090205460ff16155b15613fe8576001600160a01b03808816600090815260208052604080822054928b16825290205460ff918216911680158015613888575081155b156139ce5760006138a960646110a5601c548c6130d790919063ffffffff16565b90506138b5898261349b565b98506138c28b3083613602565b6138cd8b8b8b613602565b600d546001600160a01b031663e30443bc8c6138e8816141f3565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561392e57600080fd5b505af1158015613942573d6000803e3d6000fd5b5050600d546001600160a01b0316915063e30443bc90508b613963816141f3565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b1580156139a957600080fd5b505af11580156139bd573d6000803e3d6000fd5b505050505050505050505050505050565b801580156139e55750600854600160a81b900460ff165b15613a9c576001600160a01b038a16600090815260226020526040902054421015613a525760405162461bcd60e51b815260206004820152601d60248201527f546f6b656e7320617265207374616b656420616e64206c6f636b6564210000006044820152606401611052565b6001600160a01b038a1660009081526022602052604090205415613a97576001600160a01b038a16600090815260226020908152604080832083905560219091528120555b613cf5565b8115613b4557601254601354601454601554601b54602554949b509299509097509550935060ff1615613a9757602a5432600090815260286020526040902054613ae69190614a99565b421015613b2e5760405162461bcd60e51b8152602060048201526016602482015275636f6f6c646f776e20706572696f642061637469766560501b6044820152606401611052565b326000908152602860205260409020429055613cf5565b8015613cf557601954601654601754601854601a54602554949b509299509097509550935060ff1615613c7e57602954613b80906002614a99565b4311613bc35760405162461bcd60e51b8152602060048201526012602482015271796f75207368616c6c206e6f74207061737360701b6044820152606401611052565b6026543a1115613c155760405162461bcd60e51b815260206004820152601860248201527f4761732070726963652065786365656473206c696d69742e00000000000000006044820152606401611052565b32600090815260276020526040902054439003613c6b5760405162461bcd60e51b8152602060048201526014602482015273546f6f206d616e7920545820696e20626c6f636b60601b6044820152606401611052565b3260009081526027602052604090204390555b6000613c898a611b82565b601054909150613c998a83614a99565b1115613cf35760405162461bcd60e51b8152602060048201526024808201527f45786365656473206d6178696d756d2077616c6c657420746f6b656e20616d6f6044820152633ab73a1760e11b6064820152608401611052565b505b6000613d1684613d058888614a99565b613d0f9190614a99565b8990613071565b90506000613d2330611b82565b60115490915081108015908190613d5257506001600160a01b038d16600090815260208052604090205460ff16155b15613e6b576008805460ff60a01b1916600160a01b179055601d5460ff168015613d7c5750600087115b8015613d8a57506000600c54115b15613e3c576000613da8600954600a5461307190919063ffffffff16565b90506000613dc5826110a5600a54876130d790919063ffffffff16565b90506000613de2836110a5600954886130d790919063ffffffff16565b90506000613dff600c546110a58d866130d790919063ffffffff16565b90506000613e1c600b546110a58e866130d790919063ffffffff16565b90506000613e2a8284613071565b9050613e35816143cc565b5050505050505b6000613e4730611b82565b9050613e528161319b565b506000600a8190556009556008805460ff60a01b191690555b6000613e7c60646110a58e876130d7565b905060008a15613ecf576064613e928e8d6130d7565b613e9c9190614aac565b9050613ebe8f600860009054906101000a90046001600160a01b031683613602565b600254613ecb908261349b565b6002555b613ee3613edc8284614a99565b8e9061349b565b9c508615613f0057600954613ef89083613071565b600955613f11565b600a54613f0d9083613071565b600a555b613f1c8f3084613602565b601e54600d546040516001624d3b8760e01b03198152600481018390526001600160a01b039091169063ffb2c479906024016060604051808303816000875af1925050508015613f89575060408051601f3d908101601f19168201909252613f86918101906149f9565b60015b15613fdf5760408051848152602081018490529081018290526060810185905232906001907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989060800160405180910390a35050505b50505050505050505b613ff3888888613602565b600d546001600160a01b031663e30443bc8961400e816141f3565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561405457600080fd5b505af1158015614068573d6000803e3d6000fd5b5050600d546001600160a01b0316915063e30443bc905088614089816141f3565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b1580156140cf57600080fd5b505af11580156140e3573d6000803e3d6000fd5b505050505050505050505050565b600081848411156141155760405162461bcd60e51b8152600401611052919061453a565b5060006141228486614b56565b95945050505050565b6001600160a01b03821660009081526020805260409020805460ff191682158015919091179091556141b757600d5460405163031e79db60e41b81526001600160a01b038481166004830152909116906331e79db090602401600060405180830381600087803b15801561419e57600080fd5b505af11580156141b2573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b600854600090600160a81b900460ff166142155761421082611b82565b6112b4565b6001600160a01b0382166000908152602160205260409020546112b4906064906110a5906142439083613071565b61322086611b82565b6000818361426d5760405162461bcd60e51b8152600401611052919061453a565b5060006141228486614aac565b60408051600280825260608201835260009260208301908036833701905050905030816000815181106142af576142af614977565b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015614308573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061432c91906149a6565b8160018151811061433f5761433f614977565b6001600160a01b03928316602091820292909201015260065461436591309116846134dd565b60065460405163791ac94760e01b81526001600160a01b039091169063791ac9479061439e908590600090869030904290600401614b69565b600060405180830381600087803b1580156143b857600080fd5b505af1158015612bcd573d6000803e3d6000fd5b60006143d9826002613159565b905060006143e7838361349b565b9050476143f38361427a565b60006143ff478361349b565b905061440b8382614453565b60408051858152602081018390529081018490527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a15050505050565b60065461446b9030906001600160a01b0316846134dd565b6006546001600160a01b031663f305d7198230856000806144946005546001600160a01b031690565b60405160e088901b6001600160e01b03191681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c40160606040518083038185885af11580156144fc573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061174191906149f9565b60006020828403121561453357600080fd5b5035919050565b600060208083528351808285015260005b818110156145675785810183015185820160400152820161454b565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b038116811461184e57600080fd5b801515811461184e57600080fd5b600080604083850312156145be57600080fd5b82356145c981614588565b915060208301356145d98161459d565b809150509250929050565b600080604083850312156145f757600080fd5b823561460281614588565b946020939093013593505050565b6000806040838503121561462357600080fd5b50508035926020909101359150565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561467157614671614632565b604052919050565b600067ffffffffffffffff82111561469357614693614632565b5060051b60200190565b600082601f8301126146ae57600080fd5b813560206146c36146be83614679565b614648565b82815260059290921b840181019181810190868411156146e257600080fd5b8286015b848110156146fd57803583529183019183016146e6565b509695505050505050565b6000806040838503121561471b57600080fd5b823567ffffffffffffffff8082111561473357600080fd5b818501915085601f83011261474757600080fd5b813560206147576146be83614679565b82815260059290921b8401810191818101908984111561477657600080fd5b948201945b8386101561479d57853561478e81614588565b8252948201949082019061477b565b965050860135925050808211156147b357600080fd5b506147c08582860161469d565b9150509250929050565b6000806000606084860312156147df57600080fd5b83356147ea81614588565b925060208401356147fa81614588565b929592945050506040919091013590565b60006020828403121561481d57600080fd5b81356130d08161459d565b60006020828403121561483a57600080fd5b81356130d081614588565b6000806000806000806000806000806101408b8d03121561486557600080fd5b505088359a60208a01359a5060408a013599606081013599506080810135985060a0810135975060c0810135965060e081013595506101008101359450610120013592509050565b600080604083850312156148c057600080fd5b82356148cb81614588565b915060208301356145d981614588565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b80820281158282048414176112b4576112b4614910565b600181811c9082168061495157607f821691505b60208210810361497157634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b60006001820161499f5761499f614910565b5060010190565b6000602082840312156149b857600080fd5b81516130d081614588565b6000602082840312156149d557600080fd5b5051919050565b6000602082840312156149ee57600080fd5b81516130d08161459d565b600080600060608486031215614a0e57600080fd5b8351925060208401519150604084015190509250925092565b60008060008060008060c08789031215614a4057600080fd5b8651614a4b81614588565b6020880151604089015160608a015160808b015160a0909b0151939c929b509099909850965090945092505050565b600060ff821660ff8103614a9057614a90614910565b60010192915050565b808201808211156112b4576112b4614910565b600082614ac957634e487b7160e01b600052601260045260246000fd5b500490565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b818103818111156112b4576112b4614910565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015614bb95784516001600160a01b031683529383019391830191600101614b94565b50506001600160a01b0396909616606085015250505060800152939250505056fe45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212202ec03f01bee687b305416548341f978e78bd5c5af7b12937777218b97ac7e9bd64736f6c6343000811003360806040526012805460ff60b01b191690553480156200001e57600080fd5b50604051620030a8380380620030a8833981016040819052620000419162000239565b81818181600362000053838262000373565b50600462000062828262000373565b50505050506000620000796200015760201b60201c565b600980546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506013620000d5838262000373565b506014620000e4828262000373565b505060128054601680546001600160a01b03199081166001600160a01b039889161790915568056bc75e2d6310000060188190556019556015805490911695871695909517909455600160a01b929094166001600160a81b0319909316929092171760ff60a81b1916909155506200043f565b3390565b6001600160a01b03811681146200017157600080fd5b50565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200019c57600080fd5b81516001600160401b0380821115620001b957620001b962000174565b604051601f8301601f19908116603f01168101908282118183101715620001e457620001e462000174565b816040528381526020925086838588010111156200020157600080fd5b600091505b8382101562000225578582018301518183018401529082019062000206565b600093810190920192909252949350505050565b600080600080600060a086880312156200025257600080fd5b85516200025f816200015b565b602087015190955062000272816200015b565b604087015190945062000285816200015b565b60608701519093506001600160401b0380821115620002a357600080fd5b620002b189838a016200018a565b93506080880151915080821115620002c857600080fd5b50620002d7888289016200018a565b9150509295509295909350565b600181811c90821680620002f957607f821691505b6020821081036200031a57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200036e57600081815260208120601f850160051c81016020861015620003495750805b601f850160051c820191505b818110156200036a5782815560010162000355565b5050505b505050565b81516001600160401b038111156200038f576200038f62000174565b620003a781620003a08454620002e4565b8462000320565b602080601f831160018114620003df5760008415620003c65750858301515b600019600386901b1c1916600185901b1785556200036a565b600085815260208120601f198616915b828110156200041057888601518255948401946001909101908401620003ef565b50858210156200042f5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b612c59806200044f6000396000f3fe60806040526004361061031e5760003560e01c80636d48467b116101ab578063a8b9d240116100f7578063dd62ed3e11610095578063e7841ec01161006f578063e7841ec0146109ed578063f2fde38b14610a02578063fbcbc0f114610a22578063ffb2c47914610a4257600080fd5b8063dd62ed3e14610967578063df6b522d146109ad578063e30443bc146109cd57600080fd5b8063b22f8a04116100d1578063b22f8a04146108e7578063ba079d4914610907578063bc4c4b3714610927578063d8032ed31461094757600080fd5b8063a8b9d24014610871578063a9059cbb14610891578063aafd847a146108b157600080fd5b80638da5cb5b116101645780639c3372ea1161013e5780639c3372ea146107ef5780639eec101e1461080f578063a423406914610830578063a457c2d71461085157600080fd5b80638da5cb5b1461079c57806391b89fba146107ba57806395d89b41146107da57600080fd5b80636d48467b146106db57806370a08231146106fb578063715018a61461073157806374c13fda1461074657806385a6b3ae146107665780638bc1d6391461077c57600080fd5b8063313ce5671161026a5780634e7b827f116102235780635ebf4db9116101fd5780635ebf4db91461065657806365b8dbc0146106765780636a474002146106965780636b69163b146106ab57600080fd5b80634e7b827f146105af5780635183d6fd146105df5780635a84c5eb1461063657600080fd5b8063313ce567146104f257806331e79db01461050e5780633599bb171461052e578063395093511461054e57806340ffdd801461056e578063418089041461058e57600080fd5b806318160ddd116102d757806323b872dd116102b157806323b872dd1461047e57806325cd35981461049e57806327ce0147146104bc5780633009a609146104dc57600080fd5b806318160ddd1461040c5780631d4ff89a14610421578063226cfa3d1461045157600080fd5b806303c833021461033257806306fdde031461033a5780630928847114610365578063095ea7b31461038557806309bbedde146103b55780631694505e146103d457600080fd5b3661032d5761032b610a7d565b005b600080fd5b61032b610a7d565b34801561034657600080fd5b5061034f610b10565b60405161035c91906127d5565b60405180910390f35b34801561037157600080fd5b5061032b61038036600461283b565b610ba2565b34801561039157600080fd5b506103a56103a0366004612858565b610bf6565b604051901515815260200161035c565b3480156103c157600080fd5b50600a545b60405190815260200161035c565b3480156103e057600080fd5b506015546103f4906001600160a01b031681565b6040516001600160a01b03909116815260200161035c565b34801561041857600080fd5b506002546103c6565b34801561042d57600080fd5b506103a561043c36600461283b565b60116020526000908152604090205460ff1681565b34801561045d57600080fd5b506103c661046c36600461283b565b60176020526000908152604090205481565b34801561048a57600080fd5b506103a5610499366004612884565b610c0d565b3480156104aa57600080fd5b506012546001600160a01b03166103f4565b3480156104c857600080fd5b506103c66104d736600461283b565b610c76565b3480156104e857600080fd5b506103c6600e5481565b3480156104fe57600080fd5b506040516012815260200161035c565b34801561051a57600080fd5b5061032b61052936600461283b565b610cd2565b34801561053a57600080fd5b5061032b6105493660046128d3565b610d6c565b34801561055a57600080fd5b506103a5610569366004612858565b610e0d565b34801561057a57600080fd5b5061032b6105893660046128d3565b610e43565b34801561059a57600080fd5b506012546103a590600160a81b900460ff1681565b3480156105bb57600080fd5b506103a56105ca36600461283b565b600f6020526000908152604090205460ff1681565b3480156105eb57600080fd5b506105ff6105fa3660046128f0565b610ed9565b604080516001600160a01b0390971687526020870195909552938501929092526060840152608083015260a082015260c00161035c565b34801561064257600080fd5b5061032b6106513660046128f0565b610f39565b34801561066257600080fd5b5061032b6106713660046128f0565b610f7b565b34801561068257600080fd5b5061032b61069136600461283b565b610fbd565b3480156106a257600080fd5b5061032b611009565b3480156106b757600080fd5b506103a56106c636600461283b565b60106020526000908152604090205460ff1681565b3480156106e757600080fd5b506103a56106f636600461283b565b6110bb565b34801561070757600080fd5b506103c661071636600461283b565b6001600160a01b031660009081526020819052604090205490565b34801561073d57600080fd5b5061032b611107565b34801561075257600080fd5b506012546103f4906001600160a01b031681565b34801561077257600080fd5b506103c660085481565b34801561078857600080fd5b5061032b610797366004612909565b61117b565b3480156107a857600080fd5b506009546001600160a01b03166103f4565b3480156107c657600080fd5b506103c66107d536600461283b565b6111d0565b3480156107e657600080fd5b5061034f6111db565b3480156107fb57600080fd5b5061032b61080a3660046128d3565b6111ea565b34801561081b57600080fd5b506012546103a590600160a01b900460ff1681565b34801561083c57600080fd5b506012546103a590600160b01b900460ff1681565b34801561085d57600080fd5b506103a561086c366004612858565b611280565b34801561087d57600080fd5b506103c661088c36600461283b565b6112cf565b34801561089d57600080fd5b506103a56108ac366004612858565b6112fb565b3480156108bd57600080fd5b506103c66108cc36600461283b565b6001600160a01b031660009081526007602052604090205490565b3480156108f357600080fd5b5061032b610902366004612909565b611308565b34801561091357600080fd5b506103a561092236600461283b565b61135d565b34801561093357600080fd5b506103a5610942366004612909565b6113a9565b34801561095357600080fd5b5061032b61096236600461283b565b61152a565b34801561097357600080fd5b506103c6610982366004612942565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b3480156109b957600080fd5b506016546103f4906001600160a01b031681565b3480156109d957600080fd5b5061032b6109e8366004612858565b611576565b3480156109f957600080fd5b50600e546103c6565b348015610a0e57600080fd5b5061032b610a1d36600461283b565b61160e565b348015610a2e57600080fd5b506105ff610a3d36600461283b565b6116f9565b348015610a4e57600080fd5b50610a62610a5d3660046128f0565b6117a8565b6040805193845260208401929092529082015260600161035c565b6000610a8860025490565b11610a9257600080fd5b3415610b0e57610ac5610aa460025490565b610ab234600160801b6118ce565b610abc9190612986565b60055490611957565b60055560405134815233907fa493a9229478c3fcd73f66d2cdeb7f94fd0f341da924d1054236d784541165119060200160405180910390a2600854610b0a9034611957565b6008555b565b606060138054610b1f906129a8565b80601f0160208091040260200160405190810160405280929190818152602001828054610b4b906129a8565b8015610b985780601f10610b6d57610100808354040283529160200191610b98565b820191906000526020600020905b815481529060010190602001808311610b7b57829003601f168201915b5050505050905090565b6009546001600160a01b03163314610bd55760405162461bcd60e51b8152600401610bcc906129e2565b60405180910390fd5b6001600160a01b03166000908152600f60205260409020805460ff19169055565b6000610c033384846119b6565b5060015b92915050565b6000610c1a848484611ada565b610c6c8433610c6785604051806060016040528060288152602001612bd7602891396001600160a01b038a1660009081526001602090815260408083203384529091529020549190611b43565b6119b6565b5060019392505050565b6001600160a01b03811660009081526006602090815260408083205491839052822054600554600160801b92610cc892610cc392610cbd91610cb891906118ce565b611b7d565b90611b8d565b611bcb565b610c079190612986565b6009546001600160a01b03163314610cfc5760405162461bcd60e51b8152600401610bcc906129e2565b6001600160a01b0381166000908152600f60205260408120805460ff19166001179055610d2a908290611bde565b610d35600a82611c3d565b6040516001600160a01b038216907fa878b31040b2e6d0a9a3d3361209db3908ba62014b0dca52adbaee451d128b2590600090a250565b6009546001600160a01b03163314610d965760405162461bcd60e51b8152600401610bcc906129e2565b801515601260169054906101000a900460ff16151503610db557600080fd5b60128054821515600160b01b0260ff60b01b199091161790556040517f3da2593f2c4724acfbd754045321e852cad26f3974834b1890045530f89c21b390610e0290831515815260200190565b60405180910390a150565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610c03918590610c679086611957565b6009546001600160a01b03163314610e6d5760405162461bcd60e51b8152600401610bcc906129e2565b801515601260159054906101000a900460ff16151503610e8c57600080fd5b60128054821515600160a81b0260ff60a81b199091161790556040517fc138a28750b971696f46ea59731c471ef1e08e4015404afdb139fd2e87dca1bb90610e0290831515815260200190565b600080600080600080610eeb600a5490565b8710610f0a575060009450600019935083925084915081905080610f30565b6000610f17600a89611d78565b9050610f22816116f9565b965096509650965096509650505b91939550919395565b6009546001600160a01b03163314610f635760405162461bcd60e51b8152600401610bcc906129e2565b610f7581670de0b6b3a7640000612a17565b60185550565b6009546001600160a01b03163314610fa55760405162461bcd60e51b8152600401610bcc906129e2565b610fb781670de0b6b3a7640000612a17565b60195550565b6009546001600160a01b03163314610fe75760405162461bcd60e51b8152600401610bcc906129e2565b601580546001600160a01b0319166001600160a01b0392909216919091179055565b60405162461bcd60e51b815260206004820152607560248201527f457665724d6f6f6e526973655f4469766964656e645f547261636b65723a207760448201527f697468647261774469766964656e642064697361626c65642e2055736520746860648201527f652027636c61696d272066756e6374696f6e206f6e20746865206d61696e20456084820152743b32b926b7b7b72934b9b29031b7b73a3930b1ba1760591b60a482015260c401610bcc565b6009546000906001600160a01b031633146110e85760405162461bcd60e51b8152600401610bcc906129e2565b506001600160a01b031660009081526010602052604090205460ff1690565b6009546001600160a01b031633146111315760405162461bcd60e51b8152600401610bcc906129e2565b6009546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600980546001600160a01b0319169055565b6009546001600160a01b031633146111a55760405162461bcd60e51b8152600401610bcc906129e2565b6001600160a01b03919091166000908152601060205260409020805460ff1916911515919091179055565b6000610c07826112cf565b606060148054610b1f906129a8565b6009546001600160a01b031633146112145760405162461bcd60e51b8152600401610bcc906129e2565b801515601260149054906101000a900460ff1615150361123357600080fd5b60128054821515600160a01b0260ff60a01b199091161790556040517f8d34c313963017194ed726d050e868657d0e2d2c6748d13e358cd4b89d4ee7c890610e0290831515815260200190565b6000610c033384610c6785604051806060016040528060258152602001612bff602591393360009081526001602090815260408083206001600160a01b038d1684529091529020549190611b43565b6001600160a01b038116600090815260076020526040812054610c07906112f584610c76565b90611dab565b6000610c03338484611ada565b6009546001600160a01b031633146113325760405162461bcd60e51b8152600401610bcc906129e2565b6001600160a01b03919091166000908152601160205260409020805460ff1916911515919091179055565b6009546000906001600160a01b0316331461138a5760405162461bcd60e51b8152600401610bcc906129e2565b506001600160a01b031660009081526011602052604090205460ff1690565b6009546000906001600160a01b031633146113d65760405162461bcd60e51b8152600401610bcc906129e2565b601254600160b01b900460ff16156113f057506000610c07565b6001600160a01b03831660009081526011602052604090205460ff168280156114165750805b801561142c5750601254600160a81b900460ff16155b1561143b576000915050610c07565b6000816114505761144b85611ded565b611459565b611459856120a6565b9050801561151f576001600160a01b038516600090815260176020526040902042905581156114cd57831515856001600160a01b03167ffbd928dd3806a2bdf802f3a28a2cc55205f95dbcd2c3ed313abfca278366f80c836040516114c091815260200190565b60405180910390a3611514565b831515856001600160a01b03167fa2c38e2d2fb7e3e1912d937fd1ca11ed6d51864dee4cfa7a7bf02becd7acf0928360405161150b91815260200190565b60405180910390a35b600192505050610c07565b506000949350505050565b6009546001600160a01b031633146115545760405162461bcd60e51b8152600401610bcc906129e2565b601280546001600160a01b0319166001600160a01b0392909216919091179055565b6009546001600160a01b031633146115a05760405162461bcd60e51b8152600401610bcc906129e2565b6001600160a01b0382166000908152600f602052604090205460ff166115e0576019548110156115e4576115d5600a83611c3d565b6115e0826000611bde565b5050565b6115ee8282611bde565b6018548110611603576115e0600a8383612419565b6115e0600a83611c3d565b6009546001600160a01b031633146116385760405162461bcd60e51b8152600401610bcc906129e2565b6001600160a01b03811661169d5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610bcc565b6009546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600980546001600160a01b0319166001600160a01b0392909216919091179055565b8060008080808061170b600a876124c2565b945060001993506000851261176d57600e5485111561173957600e5461173290869061250d565b935061176d565b600e54600a546000911061174e57600061175d565b600e54600a5461175d91611dab565b90506117698682611b8d565b9450505b611776866112cf565b925061178186610c76565b6001600160a01b038716600090815260176020526040902054969895975093959294915050565b600a54600090819081908015806117c85750601254600160b01b900460ff165b156117de575050600e54600092508291506118c7565b600e546000805a90506000805b89841080156117f957508582105b156118b6578461180881612a2e565b95505085851061181757600094505b6000600a600001868154811061182f5761182f612a47565b60009182526020808320909101546001600160a01b0316808352601090915260409091205490915060ff1661187c576118698160016113a9565b1561187c578161187881612a2e565b9250505b8261188681612a2e565b93505060005a9050808511156118ad576118aa6118a38683611dab565b8790611957565b95505b93506117eb9050565b600e85905590975095509193505050505b9193909250565b6000826000036118e057506000610c07565b60006118ec8385612a17565b9050826118f98583612986565b146119505760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610bcc565b9392505050565b6000806119648385612a5d565b9050838110156119505760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610bcc565b6001600160a01b038316611a185760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610bcc565b6001600160a01b038216611a795760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610bcc565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60405162461bcd60e51b815260206004820152603360248201527f457665724d6f6f6e526973655f4469766964656e645f547261636b65723a204e6044820152721bc81d1c985b9cd9995c9cc8185b1b1bddd959606a1b6064820152608401610bcc565b505050565b60008184841115611b675760405162461bcd60e51b8152600401610bcc91906127d5565b506000611b748486612a70565b95945050505050565b60008181811215610c0757600080fd5b600080611b9a8385612a83565b905060008312158015611bad5750838112155b80611bc25750600083128015611bc257508381125b61195057600080fd5b600080821215611bda57600080fd5b5090565b6001600160a01b03821660009081526020819052604090205480821115611c1d576000611c0b8383611dab565b9050611c17848261254a565b50505050565b80821015611b3e576000611c318284611dab565b9050611c1784826125ae565b6001600160a01b038116600090815260038301602052604090205460ff16611c63575050565b6001600160a01b03811660009081526003830160209081526040808320805460ff1916905560018086018352818420849055600286019092528220548454909291611cad91612a70565b90506000846000018281548110611cc657611cc6612a47565b60009182526020808320909101546001600160a01b03908116808452600289019092526040808420879055908716835282209190915585549091508190869085908110611d1557611d15612a47565b600091825260209091200180546001600160a01b0319166001600160a01b03929092169190911790558454859080611d4f57611d4f612aab565b600082815260209020810160001990810180546001600160a01b03191690550190555050505050565b6000826000018281548110611d8f57611d8f612a47565b6000918252602090912001546001600160a01b03169392505050565b600061195083836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611b43565b600080611df9836112cf565b9050801561209d576001600160a01b038316600090815260076020526040902054611e249082611957565b6001600160a01b03808516600090815260076020526040812092909255601254169081611ea9576040516001600160a01b03861690610bb89085906000818181858888f193505050503d8060008114611e99576040519150601f19603f3d011682016040523d82523d6000602084013e611e9e565b606091505b505080915050612003565b6040805160028082526060820183526000926020830190803683375050601554604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c4648925060048083019260209291908290030181865afa158015611f13573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f379190612ac1565b81600081518110611f4a57611f4a612a47565b60200260200101906001600160a01b031690816001600160a01b0316815250508281600181518110611f7e57611f7e612a47565b6001600160a01b03928316602091820292909201015260155460405163b6f9de9560e01b815291169063b6f9de95908690611fc49060009086908c904290600401612b22565b6000604051808303818588803b158015611fdd57600080fd5b505af193505050508015611fef575060015b611ffc5760009150612001565b600191505b505b80612051576001600160a01b03851660009081526007602052604090205461202b9084611dab565b6001600160a01b0390951660009081526007602052604081209590955550929392505050565b846001600160a01b03167fee503bee2bb6a87e57bc57db795f98137327401a0e7b7ce42e37926cc1a9ca4d8460405161208c91815260200190565b60405180910390a250909392505050565b50600092915050565b6000806120b2836112cf565b9050801561209d576001600160a01b0383166000908152600760205260408120546120dd9083611957565b6001600160a01b03851660009081526007602052604080822092909255815160028082526060820190935290918160200160208202803683375050601554604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c4648925060048083019260209291908290030181865afa158015612165573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121899190612ac1565b8160008151811061219c5761219c612a47565b6001600160a01b0392831660209182029290920101526016548251911690829060019081106121cd576121cd612a47565b6001600160a01b0392831660209182029290920101526016546040516370a0823160e01b815230600482015260009291909116906370a0823190602401602060405180830381865afa158015612227573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061224b9190612b57565b60155460405163b6f9de9560e01b81529192506001600160a01b03169063b6f9de9590869061228590600090879030904290600401612b22565b6000604051808303818588803b15801561229e57600080fd5b505af1935050505080156122b0575060015b6122bd57600092506123c0565b6016546040516370a0823160e01b81523060048201526000916123309184916001600160a01b0316906370a0823190602401602060405180830381865afa15801561230c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112f59190612b57565b905080156123b95760165460405163a9059cbb60e01b81526001600160a01b03898116600483015260248201849052600196509091169063a9059cbb906044016020604051808303816000875af115801561238f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123b39190612b70565b506123be565b600093505b505b8261240f576001600160a01b0386166000908152600760205260409020546123e89085611dab565b6001600160a01b039096166000908152600760205260408120969096555093949350505050565b5091949350505050565b6001600160a01b038216600090815260038401602052604090205460ff161561245e576001600160a01b03821660009081526001840160205260409020819055505050565b6001600160a01b03821660008181526003850160209081526040808320805460ff19166001908117909155878101835281842086905587546002890184529184208290558101875586835291200180546001600160a01b0319169091179055505050565b6001600160a01b038116600090815260038301602052604081205460ff166124ed5750600019610c07565b506001600160a01b03166000908152600291909101602052604090205490565b60008061251a8385612b8d565b90506000831215801561252d5750838113155b80611bc25750600083128015611bc2575083811361195057600080fd5b61255482826125f2565b61258e61256f610cb8836005546118ce90919063ffffffff16565b6001600160a01b0384166000908152600660205260409020549061250d565b6001600160a01b0390921660009081526006602052604090209190915550565b6125b882826126d1565b61258e6125d3610cb8836005546118ce90919063ffffffff16565b6001600160a01b03841660009081526006602052604090205490611b8d565b6001600160a01b0382166126485760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610bcc565b6002546126559082611957565b6002556001600160a01b03821660009081526020819052604090205461267b9082611957565b6001600160a01b038316600081815260208181526040808320949094559251848152919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91015b60405180910390a35050565b6001600160a01b0382166127315760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610bcc565b61276e81604051806060016040528060228152602001612bb5602291396001600160a01b0385166000908152602081905260409020549190611b43565b6001600160a01b0383166000908152602081905260409020556002546127949082611dab565b6002556040518181526000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020016126c5565b600060208083528351808285015260005b81811015612802578581018301518582016040015282016127e6565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b038116811461283857600080fd5b50565b60006020828403121561284d57600080fd5b813561195081612823565b6000806040838503121561286b57600080fd5b823561287681612823565b946020939093013593505050565b60008060006060848603121561289957600080fd5b83356128a481612823565b925060208401356128b481612823565b929592945050506040919091013590565b801515811461283857600080fd5b6000602082840312156128e557600080fd5b8135611950816128c5565b60006020828403121561290257600080fd5b5035919050565b6000806040838503121561291c57600080fd5b823561292781612823565b91506020830135612937816128c5565b809150509250929050565b6000806040838503121561295557600080fd5b823561296081612823565b9150602083013561293781612823565b634e487b7160e01b600052601160045260246000fd5b6000826129a357634e487b7160e01b600052601260045260246000fd5b500490565b600181811c908216806129bc57607f821691505b6020821081036129dc57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b8082028115828204841417610c0757610c07612970565b600060018201612a4057612a40612970565b5060010190565b634e487b7160e01b600052603260045260246000fd5b80820180821115610c0757610c07612970565b81810381811115610c0757610c07612970565b8082018281126000831280158216821582161715612aa357612aa3612970565b505092915050565b634e487b7160e01b600052603160045260246000fd5b600060208284031215612ad357600080fd5b815161195081612823565b600081518084526020808501945080840160005b83811015612b175781516001600160a01b031687529582019590820190600101612af2565b509495945050505050565b848152608060208201526000612b3b6080830186612ade565b6001600160a01b03949094166040830152506060015292915050565b600060208284031215612b6957600080fd5b5051919050565b600060208284031215612b8257600080fd5b8151611950816128c5565b8181036000831280158383131683831282161715612bad57612bad612970565b509291505056fe45524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212204f5b4f82e7d8a0e632247725d3ab9bce9b18bb3d45c6bf3a5b17763b71d712eb64736f6c63430008110033

Deployed Bytecode

0x6080604052600436106104e55760003560e01c80637fdde05c11610281578063aa4704f31161015a578063d8032ed3116100cc578063f27fd25411610085578063f27fd25414610f7c578063f2fde38b14610f9c578063f5d3c79a14610fbc578063f637434214610fdc578063f8b45b0514610ff2578063fc6b151c1461100857600080fd5b8063d8032ed314610ea8578063dd62ed3e14610ec8578063e2f4560514610f0e578063e7841ec014610f24578063f11a24d314610f39578063f1c0ddff14610f4f57600080fd5b8063b74e3b111161011e578063b74e3b1114610df2578063ba079d4914610e12578063bb4c9f0b14610e32578063bb8d513114610e52578063d07a091c14610e68578063d5e3725114610e8857600080fd5b8063aa4704f314610ce8578063acb2ad6f14610d40578063ad56c13c14610d56578063b494298814610dad578063b62496f514610dc357600080fd5b80639a7a23d6116101f35780639ec1037e116101b75780639ec1037e14610c32578063a0d82dc514610c52578063a457c2d714610c68578063a694fc3a14610c88578063a8b9d24014610ca8578063a9059cbb14610cc857600080fd5b80639a7a23d614610ba65780639c1b8af514610bc65780639c3372ea14610bdc5780639c3b4fdc14610bfc5780639cefc1da14610c1257600080fd5b80638a8c523c116102455780638a8c523c14610b125780638ca2923a14610b275780638da5cb5b14610b3d5780638ea5220f14610b5b57806395451c2914610b7b57806395d89b4114610b9157600080fd5b80637fdde05c14610a72578063837ae2d014610a925780638577a6d514610ab2578063868730c714610ad2578063871c128d14610af257600080fd5b806349bd5a5e116103be57806364b0f65311610330578063715018a6116102e9578063715018a6146109ba57806372d8edf4146109cf57806375829def146109ef57806375f0a87414610a0f57806377a3b60914610a2f5780637d32f34214610a4557600080fd5b806364b0f65314610905578063679ca6e91461091a5780636843cd841461093a5780636d48467b1461095a578063700bb1911461097a57806370a082311461099a57600080fd5b80634fbee193116103825780634fbee193146108405780635124f874146108795780635a84c5eb1461088f5780635c234bb6146108af5780635ebf4db9146108c55780635eee4bae146108e557600080fd5b806349bd5a5e146107b65780634a62bb65146107d65780634a74bb02146107f05780634ada218b1461080a5780634e71d92d1461082b57600080fd5b80632307b44111610457578063313ce5671161041b578063313ce567146106f75780633599bb171461071357806339509351146107335780633f407b841461075357806340ffdd8014610769578063435c89e41461078957600080fd5b80632307b4411461066d57806323b872dd1461068d57806325cd3598146106ad5780632c1f5216146106c257806330bb4cff146106e257600080fd5b8063095ea7b3116104a9578063095ea7b3146105b25780630ef35b7e146105e25780631694505e1461060257806318160ddd146106225780631d7b1fb4146106415780631fa705311461065757600080fd5b806303fd2a45146104f157806305ca5f081461052e57806306fdde031461055057806308dfe8a514610572578063092316021461059257600080fd5b366104ec57005b600080fd5b3480156104fd57600080fd5b50600854610511906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561053a57600080fd5b5061054e610549366004614521565b611028565b005b34801561055c57600080fd5b506105656110f9565b604051610525919061453a565b34801561057e57600080fd5b5061054e61058d3660046145ab565b61118b565b34801561059e57600080fd5b5061054e6105ad366004614521565b611214565b3480156105be57600080fd5b506105d26105cd3660046145e4565b6112a3565b6040519015158152602001610525565b3480156105ee57600080fd5b5061054e6105fd366004614610565b6112ba565b34801561060e57600080fd5b50600654610511906001600160a01b031681565b34801561062e57600080fd5b506002545b604051908152602001610525565b34801561064d57600080fd5b50610633602a5481565b34801561066357600080fd5b50610633600a5481565b34801561067957600080fd5b5061054e610688366004614708565b6113a0565b34801561069957600080fd5b506105d26106a83660046147ca565b611571565b3480156106b957600080fd5b506105116115da565b3480156106ce57600080fd5b50600d54610511906001600160a01b031681565b3480156106ee57600080fd5b5061063361164d565b34801561070357600080fd5b5060405160128152602001610525565b34801561071f57600080fd5b5061054e61072e36600461480b565b6116bb565b34801561073f57600080fd5b506105d261074e3660046145e4565b611748565b34801561075f57600080fd5b5061063360095481565b34801561077557600080fd5b5061054e61078436600461480b565b61177e565b34801561079557600080fd5b506106336107a4366004614521565b60236020526000908152604090205481565b3480156107c257600080fd5b50600754610511906001600160a01b031681565b3480156107e257600080fd5b506025546105d29060ff1681565b3480156107fc57600080fd5b50601d546105d29060ff1681565b34801561081657600080fd5b506008546105d290600160b01b900460ff1681565b34801561083757600080fd5b5061054e6117d9565b34801561084c57600080fd5b506105d261085b366004614828565b6001600160a01b03166000908152601f602052604090205460ff1690565b34801561088557600080fd5b5061063360175481565b34801561089b57600080fd5b5061054e6108aa366004614521565b611851565b3480156108bb57600080fd5b5061063360165481565b3480156108d157600080fd5b5061054e6108e0366004614521565b6118ac565b3480156108f157600080fd5b5061054e610900366004614521565b611907565b34801561091157600080fd5b50610633611949565b34801561092657600080fd5b5061054e61093536600461480b565b611993565b34801561094657600080fd5b50610633610955366004614828565b6119d0565b34801561096657600080fd5b506105d2610975366004614828565b611a40565b34801561098657600080fd5b5061054e610995366004614521565b611ab0565b3480156109a657600080fd5b506106336109b5366004614828565b611b82565b3480156109c657600080fd5b5061054e611b9d565b3480156109db57600080fd5b5061054e6109ea366004614828565b611c11565b3480156109fb57600080fd5b5061054e610a0a366004614828565b611c6d565b348015610a1b57600080fd5b50600e54610511906001600160a01b031681565b348015610a3b57600080fd5b5061063360195481565b348015610a5157600080fd5b50610633610a60366004614828565b60226020526000908152604090205481565b348015610a7e57600080fd5b5061054e610a8d3660046145ab565b611d22565b348015610a9e57600080fd5b5061054e610aad366004614845565b611d77565b348015610abe57600080fd5b5061054e610acd366004614521565b611f23565b348015610ade57600080fd5b5061054e610aed36600461480b565b611fdb565b348015610afe57600080fd5b5061054e610b0d366004614521565b612013565b348015610b1e57600080fd5b5061054e61208f565b348015610b3357600080fd5b5061063360135481565b348015610b4957600080fd5b506005546001600160a01b0316610511565b348015610b6757600080fd5b50600f54610511906001600160a01b031681565b348015610b8757600080fd5b5061063360145481565b348015610b9d57600080fd5b50610565612112565b348015610bb257600080fd5b5061054e610bc13660046145ab565b612121565b348015610bd257600080fd5b50610633601e5481565b348015610be857600080fd5b5061054e610bf736600461480b565b612159565b348015610c0857600080fd5b50610633601a5481565b348015610c1e57600080fd5b5061054e610c2d36600461480b565b6121b5565b348015610c3e57600080fd5b5061054e610c4d366004614828565b61224b565b348015610c5e57600080fd5b50610633601b5481565b348015610c7457600080fd5b506105d2610c833660046145e4565b612322565b348015610c9457600080fd5b5061054e610ca3366004614521565b612371565b348015610cb457600080fd5b50610633610cc3366004614828565b612594565b348015610cd457600080fd5b506105d2610ce33660046145e4565b6125c7565b348015610cf457600080fd5b50610d2b610d03366004614828565b6001600160a01b03166000908152602260209081526040808320546021909252909120549091565b60408051928352602083019190915201610525565b348015610d4c57600080fd5b50610633601c5481565b348015610d6257600080fd5b50610d76610d71366004614828565b6125d4565b604080516001600160a01b0390971687526020870195909552938501929092526060840152608083015260a082015260c001610525565b348015610db957600080fd5b5061063360295481565b348015610dcf57600080fd5b506105d2610dde366004614828565b602080526000908152604090205460ff1681565b348015610dfe57600080fd5b5061054e610e0d366004614521565b612664565b348015610e1e57600080fd5b506105d2610e2d366004614828565b6126f5565b348015610e3e57600080fd5b5061054e610e4d366004614708565b612728565b348015610e5e57600080fd5b5061063360125481565b348015610e7457600080fd5b5061054e610e83366004614828565b612bd5565b348015610e9457600080fd5b5061054e610ea336600461480b565b612cca565b348015610eb457600080fd5b5061054e610ec3366004614828565b612d4c565b348015610ed457600080fd5b50610633610ee33660046148ad565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b348015610f1a57600080fd5b5061063360115481565b348015610f3057600080fd5b50610633612e0f565b348015610f4557600080fd5b5061063360185481565b348015610f5b57600080fd5b50610633610f6a366004614828565b60216020526000908152604090205481565b348015610f8857600080fd5b50610d76610f97366004614521565b612e59565b348015610fa857600080fd5b5061054e610fb7366004614828565b612e97565b348015610fc857600080fd5b5061054e610fd736600461480b565b612f82565b348015610fe857600080fd5b5061063360155481565b348015610ffe57600080fd5b5061063360105481565b34801561101457600080fd5b5061054e611023366004614521565b612fba565b6005546001600160a01b0316331461105b5760405162461bcd60e51b8152600401611052906148db565b60405180910390fd5b61106d81670de0b6b3a7640000614926565b90506000611088600954600a5461307190919063ffffffff16565b905060006110ab826110a5600a54866130d790919063ffffffff16565b90613159565b905060006110c8836110a5600954876130d790919063ffffffff16565b90506110d38461319b565b600a546110e0908361349b565b600a556009546110f0908261349b565b60095550505050565b6060600380546111089061493d565b80601f01602080910402602001604051908101604052809291908181526020018280546111349061493d565b80156111815780601f1061115657610100808354040283529160200191611181565b820191906000526020600020905b81548152906001019060200180831161116457829003601f168201915b5050505050905090565b6005546001600160a01b031633146111b55760405162461bcd60e51b8152600401611052906148db565b6001600160a01b0382166000818152601f6020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6005546001600160a01b0316331461123e5760405162461bcd60e51b8152600401611052906148db565b600581101561128f5760405162461bcd60e51b815260206004820152601860248201527f63616e206e65766572206265207365742062656c6f77203500000000000000006044820152606401611052565b61129d81633b9aca00614926565b60265550565b60006112b03384846134dd565b5060015b92915050565b6005546001600160a01b031633146112e45760405162461bcd60e51b8152600401611052906148db565b6000828152602360205260409020548190036112ff57600080fd5b6127108111156113515760405162461bcd60e51b815260206004820181905260248201527f5374616b696e6720626f6e75732063616e2774206578636565642031303030306044820152606401611052565b60008281526023602090815260409182902083905581518481529081018390527f065c0eec5c5d031ee25323575d53db5536226ab058b74d8bdb03c517dd4f605d910160405180910390a15050565b6005546001600160a01b031633146113ca5760405162461bcd60e51b8152600401611052906148db565b805182511461141b5760405162461bcd60e51b815260206004820152601e60248201527f417272617973206d757374206265207468652073616d65206c656e67746800006044820152606401611052565b60c8825111156114785760405162461bcd60e51b815260206004820152602260248201527f57616c6c657473206c697374206c656e677468206d757374206265203c3d2032604482015261030360f41b6064820152608401611052565b60005b825181101561156c57600083828151811061149857611498614977565b6020026020010151905060008383815181106114b6576114b6614977565b6020026020010151670de0b6b3a76400006114d19190614926565b90506114de338383613602565b600d546001600160a01b031663e30443bc836114f981611b82565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561153f57600080fd5b505af1158015611553573d6000803e3d6000fd5b50505050505080806115649061498d565b91505061147b565b505050565b600061157e84848461370b565b6115d084336115cb85604051806060016040528060288152602001614c01602891396001600160a01b038a16600090815260016020908152604080832033845290915290205491906140f1565b6134dd565b5060019392505050565b600d54604080516304b9a6b360e31b815290516000926001600160a01b0316916325cd35989160048083019260209291908290030181865afa158015611624573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061164891906149a6565b905090565b600d54604080516342d359d760e11b815290516000926001600160a01b0316916385a6b3ae9160048083019260209291908290030181865afa158015611697573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061164891906149c3565b6005546001600160a01b031633146116e55760405162461bcd60e51b8152600401611052906148db565b600d54604051633599bb1760e01b815282151560048201526001600160a01b0390911690633599bb17906024015b600060405180830381600087803b15801561172d57600080fd5b505af1158015611741573d6000803e3d6000fd5b5050505050565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916112b09185906115cb9086613071565b6005546001600160a01b031633146117a85760405162461bcd60e51b8152600401611052906148db565b600d546040516281ffbb60e71b815282151560048201526001600160a01b03909116906340ffdd8090602401611713565b600d5460405163bc4c4b3760e01b8152336004820152600060248201526001600160a01b039091169063bc4c4b37906044016020604051808303816000875af115801561182a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061184e91906149dc565b50565b6005546001600160a01b0316331461187b5760405162461bcd60e51b8152600401611052906148db565b600d54604051635a84c5eb60e01b8152600481018390526001600160a01b0390911690635a84c5eb90602401611713565b6005546001600160a01b031633146118d65760405162461bcd60e51b8152600401611052906148db565b600d54604051635ebf4db960e01b8152600481018390526001600160a01b0390911690635ebf4db990602401611713565b6005546001600160a01b031633146119315760405162461bcd60e51b8152600401611052906148db565b61194381670de0b6b3a7640000614926565b60115550565b600d54604080516304ddf6ef60e11b815290516000926001600160a01b0316916309bbedde9160048083019260209291908290030181865afa158015611697573d6000803e3d6000fd5b6005546001600160a01b031633146119bd5760405162461bcd60e51b8152600401611052906148db565b6025805460ff1916911515919091179055565b600d546040516370a0823160e01b81526001600160a01b03838116600483015260009216906370a08231906024015b602060405180830381865afa158015611a1c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112b491906149c3565b600d54604051636d48467b60e01b81526001600160a01b0383811660048301526000921690636d48467b906024015b602060405180830381865afa158015611a8c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112b491906149dc565b600d546040516001624d3b8760e01b0319815260048101839052600091829182916001600160a01b03169063ffb2c479906024016060604051808303816000875af1158015611b03573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b2791906149f9565b604080518481526020810184905290810182905260608101889052929550909350915032906000907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989060800160405180910390a350505050565b6001600160a01b031660009081526020819052604090205490565b6005546001600160a01b03163314611bc75760405162461bcd60e51b8152600401611052906148db565b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b6005546001600160a01b03163314611c3b5760405162461bcd60e51b8152600401611052906148db565b600d5460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db090602401611713565b6005546001600160a01b03163314611c975760405162461bcd60e51b8152600401611052906148db565b600d5460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db090602401600060405180830381600087803b158015611cde57600080fd5b505af1158015611cf2573d6000803e3d6000fd5b5050506001600160a01b0382166000908152601f60205260409020805460ff191660011790555061184e81612e97565b6005546001600160a01b03163314611d4c5760405162461bcd60e51b8152600401611052906148db565b6001600160a01b03919091166000908152602460205260409020805460ff1916911515919091179055565b6005546001600160a01b03163314611da15760405162461bcd60e51b8152600401611052906148db565b60168a90556017889055601886905560198490556013899055601487905560158590556012839055601a829055601b819055611de981611de38981878a613071565b90613071565b600b81905550611e12601a54611de3601754611de360185460195461307190919063ffffffff16565b600c55600b54613a9810801590611e2d5750613a98600c5411155b611e8a5760405162461bcd60e51b815260206004820152602860248201527f746f74616c20666565732063616e6e6f7420657863656564203135252073656c6044820152676c206f722062757960c01b6064820152608401611052565b601354601454601554601254601654601754601854601954601a54601b54604080519a8b5260208b0199909952978901969096526060880194909452608087019290925260a086015260c085015260e08401526101008301526101208201527f07cec4532bdb36ce729ae72905c09f7bfbf8682c2cc2f1999f745188d9975122906101400160405180910390a150505050505050505050565b6005546001600160a01b03163314611f4d5760405162461bcd60e51b8152600401611052906148db565b612710811115611f9f5760405162461bcd60e51b815260206004820152601e60248201527f7472616e73666572206665652063616e6e6f74206578636565642031302500006044820152606401611052565b601c8190556040518181527f6fbeac6c79c640ca4f5f47271bd7a36c7eb83076224c65a3b3378c8844720343906020015b60405180910390a150565b600d54604051638bc1d63960e01b815233600482015282151560248201526001600160a01b0390911690638bc1d63990604401611713565b6005546001600160a01b0316331461203d5760405162461bcd60e51b8152600401611052906148db565b62030d4081101580156120535750620f42408111155b61205c57600080fd5b601e5460405182907f40d7e40e79af4e8e5a9b3c57030d8ea93f13d669c06d448c4d631d4ae7d23db790600090a3601e55565b6005546001600160a01b031633146120b95760405162461bcd60e51b8152600401611052906148db565b600854600160b01b900460ff16156120d057600080fd5b6008805460ff60b01b1916600160b01b179055436029556040517f799663458a5ef2936f7fa0c99b3336c69c25890f82974f04e811e5bb359186c790600090a1565b6060600480546111089061493d565b6005546001600160a01b0316331461214b5760405162461bcd60e51b8152600401611052906148db565b612155828261412b565b5050565b6005546001600160a01b031633146121835760405162461bcd60e51b8152600401611052906148db565b600d54604051634e19b97560e11b815282151560048201526001600160a01b0390911690639c3372ea90602401611713565b6005546001600160a01b031633146121df5760405162461bcd60e51b8152600401611052906148db565b801515600860159054906101000a900460ff161515036121fe57600080fd5b60088054821515600160a81b0260ff60a81b199091161790556040517f0d240c24014ec8c204fc1bdcc286f7d01fd2ab6a07c558a9b2d3f12904323a8790611fd090831515815260200190565b6005546001600160a01b031633146122755760405162461bcd60e51b8152600401611052906148db565b600d54604051630928847160e01b81526001600160a01b03838116600483015290911690630928847190602401600060405180830381600087803b1580156122bc57600080fd5b505af11580156122d0573d6000803e3d6000fd5b5050600d546001600160a01b0316915063e30443bc9050826122f1816141f3565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401611713565b60006112b033846115cb85604051806060016040528060258152602001614c29602591393360009081526001602090815260408083206001600160a01b038d16845290915290205491906140f1565b600854600160a81b900460ff166123c35760405162461bcd60e51b815260206004820152601660248201527514dd185ada5b99c81a5cc81b9bdd08195b98589b195960521b6044820152606401611052565b60008181526023602052604081205490036124205760405162461bcd60e51b815260206004820152601860248201527f496e76616c6964207374616b696e67206475726174696f6e00000000000000006044820152606401611052565b61242a4282613071565b33600090815260226020526040902054106124935760405162461bcd60e51b8152602060048201526024808201527f616c7265616479207374616b656420666f722061206c6f6e67657220647572616044820152633a34b7b760e11b6064820152608401611052565b6000818152602360209081526040808320543384526021909252909120556124bb4282613071565b33600081815260226020526040902091909155600d546001600160a01b03169063e30443bc906124ea816141f3565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561253057600080fd5b505af1158015612544573d6000803e3d6000fd5b5050505061254f3390565b6001600160a01b03167f13dd201d7da4f9b31a9064a09abc1a6ce420dacd837a77abafaec5bd9d28d2c88260405161258991815260200190565b60405180910390a250565b600d546040516302a2e74960e61b81526001600160a01b038381166004830152600092169063a8b9d240906024016119ff565b60006112b033848461370b565b600d5460405163fbcbc0f160e01b81526001600160a01b038381166004830152600092839283928392839283929091169063fbcbc0f1906024015b60c060405180830381865afa15801561262c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126509190614a27565b949c939b5091995097509550909350915050565b6005546001600160a01b0316331461268e5760405162461bcd60e51b8152600401611052906148db565b620493e08111156126f05760405162461bcd60e51b815260206004820152602660248201527f636f6f6c646f776e2074696d65722063616e6e6f74206578636565642035206d604482015265696e7574657360d01b6064820152608401611052565b602a55565b600d5460405163ba079d4960e01b81526001600160a01b038381166004830152600092169063ba079d4990602401611a6f565b6005546001600160a01b031633146127525760405162461bcd60e51b8152600401611052906148db565b80518251146127b75760405162461bcd60e51b815260206004820152602b60248201527f436f6e7472696275746f727320616e642062616c616e636573206d757374206260448201526a652073616d652073697a6560a81b6064820152608401611052565b60c8825111156128185760405162461bcd60e51b815260206004820152602660248201527f436f6e7472696275746f72206c697374206c656e677468206d7573742062652060448201526503c3d203230360d41b6064820152608401611052565b6000805b82518160ff16101561286b57612857838260ff168151811061284057612840614977565b60200260200101518361307190919063ffffffff16565b91508061286381614a7a565b91505061281c565b508061287633611b82565b10156128d95760405162461bcd60e51b815260206004820152602c60248201527f4163636f756e742062616c616e6365206d757374206265203e3d2073756d206f60448201526b033103130b630b731b2b997160a51b6064820152608401611052565b33600090815260016020908152604080832030845290915290205481111561295b5760405162461bcd60e51b815260206004820152602f60248201527f436f6e747261637420616c6c6f77616e6365206d757374206265203e3d20737560448201526e0369037b3103130b630b731b2b9971608d1b6064820152608401611052565b60008060005b85518160ff161015612bcd57858160ff168151811061298257612982614977565b6020026020010151925060006001600160a01b0316836001600160a01b0316141580156129ba575061dead6001600160a01b03841614155b612a065760405162461bcd60e51b815260206004820181905260248201527f43616e6e6f742061697264726f7020746f2061206465616420616464726573736044820152606401611052565b612a0f83611b82565b9150306001600160a01b03166323b872dd3385888560ff1681518110612a3757612a37614977565b60209081029190910101516040516001600160e01b031960e086901b1681526001600160a01b03938416600482015292909116602483015260448201526064016020604051808303816000875af1158015612a96573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612aba91906149dc565b50848160ff1681518110612ad057612ad0614977565b602002602001015182612ae39190614a99565b612aec84611b82565b14612b525760405162461bcd60e51b815260206004820152603060248201527f436f6e7472696275746f72206d75737420726563696576652066756c6c20626160448201526f06c616e6365206f662061697264726f760841b6064820152608401611052565b7f8c32c568416fcf97be35ce5b27844cfddcd63a67a1a602c3595ba5dac38f303a83868360ff1681518110612b8957612b89614977565b6020026020010151604051612bb39291906001600160a01b03929092168252602082015260400190565b60405180910390a180612bc581614a7a565b915050612961565b505050505050565b6005546001600160a01b03163314612bff5760405162461bcd60e51b8152600401611052906148db565b6001600160a01b0381811660008181526024602081815260408084208054600160ff199182168117909255601f9093529381902080549092169093179055600d54915163031e79db60e41b815260048101939093529216916331e79db09101600060405180830381600087803b158015612c7857600080fd5b505af1158015612c8c573d6000803e3d6000fd5b50506040516001600160a01b03841681527f85d097e432d8e396fa72c83ebd34196326e1cf1694ef910cd53554b2ee7597c592506020019050611fd0565b6005546001600160a01b03163314612cf45760405162461bcd60e51b8152600401611052906148db565b601d5481151560ff909116151503612d0b57600080fd5b601d805460ff19168215159081179091556040519081527fff5917043f8453af413305b2dbd1ed9748a37df481beb71ba4b9b212a07b9bef90602001611fd0565b6005546001600160a01b03163314612d765760405162461bcd60e51b8152600401611052906148db565b600d5460405163d8032ed360e01b81526001600160a01b0383811660048301529091169063d8032ed390602401600060405180830381600087803b158015612dbd57600080fd5b505af1158015612dd1573d6000803e3d6000fd5b50506040516001600160a01b03841681527f7597aa09105646b4cc4486748aecd1d7c5dbcbb7bbe2863c3fc27e613b64432d92506020019050611fd0565b600d546040805163039e107b60e61b815290516000926001600160a01b03169163e7841ec09160048083019260209291908290030181865afa158015611697573d6000803e3d6000fd5b600d54604051635183d6fd60e01b815260048101839052600091829182918291829182916001600160a01b0390911690635183d6fd9060240161260f565b6005546001600160a01b03163314612ec15760405162461bcd60e51b8152600401611052906148db565b6001600160a01b038116612f265760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401611052565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b600d54604051632c8be28160e21b815233600482015282151560248201526001600160a01b039091169063b22f8a0490604401611713565b6005546001600160a01b03163314612fe45760405162461bcd60e51b8152600401611052906148db565b612ff681670de0b6b3a7640000614926565b905062030d406002546130099190614aac565b81101561306c5760405162461bcd60e51b815260206004820152602b60248201527f6d61782077616c6c65742063616e6e6f742062652073657420746f206c65737360448201526a207468616e20302e30352560a81b6064820152608401611052565b601055565b60008061307e8385614a99565b9050838110156130d05760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401611052565b9392505050565b6000826000036130e9575060006112b4565b60006130f58385614926565b9050826131028583614aac565b146130d05760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401611052565b60006130d083836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061424c565b806000036131a65750565b6131af8161427a565b60006131c8600954600a5461307190919063ffffffff16565b60195490915060019081908190600090819081901561322957613226601a546017546019546131f79190614a99565b6132019190614a99565b6110a56019546132208b6110a5600a54476130d790919063ffffffff16565b906130d7565b91505b6012541561327357613270601b546014546012546132479190614a99565b6132519190614a99565b6110a56012546132208b6110a5600954476130d790919063ffffffff16565b90505b61327d8282613071565b925082156132dd57600d546040516001600160a01b03909116908490600081818185875af1925050503d80600081146132d2576040519150601f19603f3d011682016040523d82523d6000602084013e6132d7565b606091505b50909650505b60006132f6601a5460175461307190919063ffffffff16565b601b5460145461330591613071565b61330f9190614a99565b905060008115613326576133234783613159565b90505b60008161334060145460175461307190919063ffffffff16565b61334a9190614926565b9050600082613366601b54601a5461307190919063ffffffff16565b6133709190614926565b905081156133d057600e546040516001600160a01b03909116908390600081818185875af1925050503d80600081146133c5576040519150601f19603f3d011682016040523d82523d6000602084013e6133ca565b606091505b50909950505b801561342e57600f546040516001600160a01b03909116908290600081818185875af1925050503d8060008114613423576040519150601f19603f3d011682016040523d82523d6000602084013e613428565b606091505b50909850505b7f8e09ec88c0d24c22e3a9b8555c029afcc4a7c609daabf6d7849e814c2d14efd08761345a8385614a99565b8c801561346457508b5b801561346d57508a5b60408051938452602084019290925215159082015260600160405180910390a1505050505050505050505050565b60006130d083836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506140f1565b6001600160a01b03831661353f5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401611052565b6001600160a01b0382166135a05760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401611052565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b0383166136285760405162461bcd60e51b815260040161105290614ace565b6001600160a01b03821661364e5760405162461bcd60e51b815260040161105290614b13565b61368b81604051806060016040528060268152602001614bdb602691396001600160a01b03861660009081526020819052604090205491906140f1565b6001600160a01b0380851660009081526020819052604080822093909355908416815220546136ba9082613071565b6001600160a01b038381166000818152602081815260409182902094909455518481529092918616917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91016135f5565b6001600160a01b0383166137315760405162461bcd60e51b815260040161105290614ace565b6001600160a01b0382166137575760405162461bcd60e51b815260040161105290614b13565b6001600160a01b038316600090815260246020526040812054819081908190819060ff166137d857600854600160b01b900460ff166137d85760405162461bcd60e51b815260206004820181905260248201527f54726164696e6720686173206e6f7420796574206265656e20656e61626c65646044820152606401611052565b856000036137f6576137ec88886000613602565b5050505050505050565b600854600160a01b900460ff1615801561382957506001600160a01b0388166000908152601f602052604090205460ff16155b801561384e57506001600160a01b0387166000908152601f602052604090205460ff16155b15613fe8576001600160a01b03808816600090815260208052604080822054928b16825290205460ff918216911680158015613888575081155b156139ce5760006138a960646110a5601c548c6130d790919063ffffffff16565b90506138b5898261349b565b98506138c28b3083613602565b6138cd8b8b8b613602565b600d546001600160a01b031663e30443bc8c6138e8816141f3565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561392e57600080fd5b505af1158015613942573d6000803e3d6000fd5b5050600d546001600160a01b0316915063e30443bc90508b613963816141f3565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b1580156139a957600080fd5b505af11580156139bd573d6000803e3d6000fd5b505050505050505050505050505050565b801580156139e55750600854600160a81b900460ff165b15613a9c576001600160a01b038a16600090815260226020526040902054421015613a525760405162461bcd60e51b815260206004820152601d60248201527f546f6b656e7320617265207374616b656420616e64206c6f636b6564210000006044820152606401611052565b6001600160a01b038a1660009081526022602052604090205415613a97576001600160a01b038a16600090815260226020908152604080832083905560219091528120555b613cf5565b8115613b4557601254601354601454601554601b54602554949b509299509097509550935060ff1615613a9757602a5432600090815260286020526040902054613ae69190614a99565b421015613b2e5760405162461bcd60e51b8152602060048201526016602482015275636f6f6c646f776e20706572696f642061637469766560501b6044820152606401611052565b326000908152602860205260409020429055613cf5565b8015613cf557601954601654601754601854601a54602554949b509299509097509550935060ff1615613c7e57602954613b80906002614a99565b4311613bc35760405162461bcd60e51b8152602060048201526012602482015271796f75207368616c6c206e6f74207061737360701b6044820152606401611052565b6026543a1115613c155760405162461bcd60e51b815260206004820152601860248201527f4761732070726963652065786365656473206c696d69742e00000000000000006044820152606401611052565b32600090815260276020526040902054439003613c6b5760405162461bcd60e51b8152602060048201526014602482015273546f6f206d616e7920545820696e20626c6f636b60601b6044820152606401611052565b3260009081526027602052604090204390555b6000613c898a611b82565b601054909150613c998a83614a99565b1115613cf35760405162461bcd60e51b8152602060048201526024808201527f45786365656473206d6178696d756d2077616c6c657420746f6b656e20616d6f6044820152633ab73a1760e11b6064820152608401611052565b505b6000613d1684613d058888614a99565b613d0f9190614a99565b8990613071565b90506000613d2330611b82565b60115490915081108015908190613d5257506001600160a01b038d16600090815260208052604090205460ff16155b15613e6b576008805460ff60a01b1916600160a01b179055601d5460ff168015613d7c5750600087115b8015613d8a57506000600c54115b15613e3c576000613da8600954600a5461307190919063ffffffff16565b90506000613dc5826110a5600a54876130d790919063ffffffff16565b90506000613de2836110a5600954886130d790919063ffffffff16565b90506000613dff600c546110a58d866130d790919063ffffffff16565b90506000613e1c600b546110a58e866130d790919063ffffffff16565b90506000613e2a8284613071565b9050613e35816143cc565b5050505050505b6000613e4730611b82565b9050613e528161319b565b506000600a8190556009556008805460ff60a01b191690555b6000613e7c60646110a58e876130d7565b905060008a15613ecf576064613e928e8d6130d7565b613e9c9190614aac565b9050613ebe8f600860009054906101000a90046001600160a01b031683613602565b600254613ecb908261349b565b6002555b613ee3613edc8284614a99565b8e9061349b565b9c508615613f0057600954613ef89083613071565b600955613f11565b600a54613f0d9083613071565b600a555b613f1c8f3084613602565b601e54600d546040516001624d3b8760e01b03198152600481018390526001600160a01b039091169063ffb2c479906024016060604051808303816000875af1925050508015613f89575060408051601f3d908101601f19168201909252613f86918101906149f9565b60015b15613fdf5760408051848152602081018490529081018290526060810185905232906001907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989060800160405180910390a35050505b50505050505050505b613ff3888888613602565b600d546001600160a01b031663e30443bc8961400e816141f3565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561405457600080fd5b505af1158015614068573d6000803e3d6000fd5b5050600d546001600160a01b0316915063e30443bc905088614089816141f3565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b1580156140cf57600080fd5b505af11580156140e3573d6000803e3d6000fd5b505050505050505050505050565b600081848411156141155760405162461bcd60e51b8152600401611052919061453a565b5060006141228486614b56565b95945050505050565b6001600160a01b03821660009081526020805260409020805460ff191682158015919091179091556141b757600d5460405163031e79db60e41b81526001600160a01b038481166004830152909116906331e79db090602401600060405180830381600087803b15801561419e57600080fd5b505af11580156141b2573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b600854600090600160a81b900460ff166142155761421082611b82565b6112b4565b6001600160a01b0382166000908152602160205260409020546112b4906064906110a5906142439083613071565b61322086611b82565b6000818361426d5760405162461bcd60e51b8152600401611052919061453a565b5060006141228486614aac565b60408051600280825260608201835260009260208301908036833701905050905030816000815181106142af576142af614977565b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015614308573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061432c91906149a6565b8160018151811061433f5761433f614977565b6001600160a01b03928316602091820292909201015260065461436591309116846134dd565b60065460405163791ac94760e01b81526001600160a01b039091169063791ac9479061439e908590600090869030904290600401614b69565b600060405180830381600087803b1580156143b857600080fd5b505af1158015612bcd573d6000803e3d6000fd5b60006143d9826002613159565b905060006143e7838361349b565b9050476143f38361427a565b60006143ff478361349b565b905061440b8382614453565b60408051858152602081018390529081018490527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a15050505050565b60065461446b9030906001600160a01b0316846134dd565b6006546001600160a01b031663f305d7198230856000806144946005546001600160a01b031690565b60405160e088901b6001600160e01b03191681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c40160606040518083038185885af11580156144fc573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061174191906149f9565b60006020828403121561453357600080fd5b5035919050565b600060208083528351808285015260005b818110156145675785810183015185820160400152820161454b565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b038116811461184e57600080fd5b801515811461184e57600080fd5b600080604083850312156145be57600080fd5b82356145c981614588565b915060208301356145d98161459d565b809150509250929050565b600080604083850312156145f757600080fd5b823561460281614588565b946020939093013593505050565b6000806040838503121561462357600080fd5b50508035926020909101359150565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561467157614671614632565b604052919050565b600067ffffffffffffffff82111561469357614693614632565b5060051b60200190565b600082601f8301126146ae57600080fd5b813560206146c36146be83614679565b614648565b82815260059290921b840181019181810190868411156146e257600080fd5b8286015b848110156146fd57803583529183019183016146e6565b509695505050505050565b6000806040838503121561471b57600080fd5b823567ffffffffffffffff8082111561473357600080fd5b818501915085601f83011261474757600080fd5b813560206147576146be83614679565b82815260059290921b8401810191818101908984111561477657600080fd5b948201945b8386101561479d57853561478e81614588565b8252948201949082019061477b565b965050860135925050808211156147b357600080fd5b506147c08582860161469d565b9150509250929050565b6000806000606084860312156147df57600080fd5b83356147ea81614588565b925060208401356147fa81614588565b929592945050506040919091013590565b60006020828403121561481d57600080fd5b81356130d08161459d565b60006020828403121561483a57600080fd5b81356130d081614588565b6000806000806000806000806000806101408b8d03121561486557600080fd5b505088359a60208a01359a5060408a013599606081013599506080810135985060a0810135975060c0810135965060e081013595506101008101359450610120013592509050565b600080604083850312156148c057600080fd5b82356148cb81614588565b915060208301356145d981614588565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b80820281158282048414176112b4576112b4614910565b600181811c9082168061495157607f821691505b60208210810361497157634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b60006001820161499f5761499f614910565b5060010190565b6000602082840312156149b857600080fd5b81516130d081614588565b6000602082840312156149d557600080fd5b5051919050565b6000602082840312156149ee57600080fd5b81516130d08161459d565b600080600060608486031215614a0e57600080fd5b8351925060208401519150604084015190509250925092565b60008060008060008060c08789031215614a4057600080fd5b8651614a4b81614588565b6020880151604089015160608a015160808b015160a0909b0151939c929b509099909850965090945092505050565b600060ff821660ff8103614a9057614a90614910565b60010192915050565b808201808211156112b4576112b4614910565b600082614ac957634e487b7160e01b600052601260045260246000fd5b500490565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b818103818111156112b4576112b4614910565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015614bb95784516001600160a01b031683529383019391830191600101614b94565b50506001600160a01b0396909616606085015250505060800152939250505056fe45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212202ec03f01bee687b305416548341f978e78bd5c5af7b12937777218b97ac7e9bd64736f6c63430008110033

Deployed Bytecode Sourcemap

25496:30015:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25663:64;;;;;;;;;;-1:-1:-1;25663:64:0;;;;-1:-1:-1;;;;;25663:64:0;;;;;;-1:-1:-1;;;;;178:32:1;;;160:51;;148:2;133:18;25663:64:0;;;;;;;;50736:443;;;;;;;;;;-1:-1:-1;50736:443:0;;;;;:::i;:::-;;:::i;:::-;;5766:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;33410:181::-;;;;;;;;;;-1:-1:-1;33410:181:0;;;;;:::i;:::-;;:::i;34405:164::-;;;;;;;;;;-1:-1:-1;34405:164:0;;;;;:::i;:::-;;:::i;6821:210::-;;;;;;;;;;-1:-1:-1;6821:210:0;;;;;:::i;:::-;;:::i;:::-;;;2091:14:1;;2084:22;2066:41;;2054:2;2039:18;6821:210:0;1926:187:1;32410:330:0;;;;;;;;;;-1:-1:-1;32410:330:0;;;;;:::i;:::-;;:::i;25578:41::-;;;;;;;;;;-1:-1:-1;25578:41:0;;;;-1:-1:-1;;;;;25578:41:0;;;6087:108;;;;;;;;;;-1:-1:-1;6175:12:0;;6087:108;;;2752:25:1;;;2740:2;2725:18;6087:108:0;2606:177:1;27728:32:0;;;;;;;;;;;;;;;;25883:28;;;;;;;;;;;;;;;;54871:637;;;;;;;;;;-1:-1:-1;54871:637:0;;;;;:::i;:::-;;:::i;7039:454::-;;;;;;;;;;-1:-1:-1;7039:454:0;;;;;:::i;:::-;;:::i;49719:114::-;;;;;;;;;;;;;:::i;25993:50::-;;;;;;;;;;-1:-1:-1;25993:50:0;;;;-1:-1:-1;;;;;25993:50:0;;;39435:141;;;;;;;;;;;;;:::i;32272:93::-;;;;;;;;;;-1:-1:-1;32272:93:0;;32355:2;6130:36:1;;6118:2;6103:18;32272:93:0;5988:184:1;41778:119:0;;;;;;;;;;-1:-1:-1;41778:119:0;;;;;:::i;:::-;;:::i;7501:300::-;;;;;;;;;;-1:-1:-1;7501:300:0;;;;;:::i;:::-;;:::i;25847:29::-;;;;;;;;;;;;;;;;36665:121;;;;;;;;;;-1:-1:-1;36665:121:0;;;;;:::i;:::-;;:::i;27115:49::-;;;;;;;;;;-1:-1:-1;27115:49:0;;;;;:::i;:::-;;;;;;;;;;;;;;25628:28;;;;;;;;;;-1:-1:-1;25628:28:0;;;;-1:-1:-1;;;;;25628:28:0;;;27377:33;;;;;;;;;;-1:-1:-1;27377:33:0;;;;;;;;26650:40;;;;;;;;;;-1:-1:-1;26650:40:0;;;;;;;;25804:34;;;;;;;;;;-1:-1:-1;25804:34:0;;;;-1:-1:-1;;;25804:34:0;;;;;;41147:103;;;;;;;;;;;;;:::i;39584:126::-;;;;;;;;;;-1:-1:-1;39584:126:0;;;;;:::i;:::-;-1:-1:-1;;;;;39674:28:0;39650:4;39674:28;;;:19;:28;;;;;;;;;39584:126;26442:31;;;;;;;;;;;;;;;;49841:183;;;;;;;;;;-1:-1:-1;49841:183:0;;;;;:::i;:::-;;:::i;26409:26::-;;;;;;;;;;;;;;;;50032:175;;;;;;;;;;-1:-1:-1;50032:175:0;;;;;:::i;:::-;;:::i;36021:120::-;;;;;;;;;;-1:-1:-1;36021:120:0;;;;;:::i;:::-;;:::i;41396:142::-;;;;;;;;;;;;;:::i;34277:99::-;;;;;;;;;;-1:-1:-1;34277:99:0;;;;;:::i;:::-;;:::i;39910:171::-;;;;;;;;;;-1:-1:-1;39910:171:0;;;;;:::i;:::-;;:::i;41905:185::-;;;;;;;;;;-1:-1:-1;41905:185:0;;;;;:::i;:::-;;:::i;40729:410::-;;;;;;;;;;-1:-1:-1;40729:410:0;;;;;:::i;:::-;;:::i;6203:177::-;;;;;;;;;;-1:-1:-1;6203:177:0;;;;;:::i;:::-;;:::i;13180:148::-;;;;;;;;;;;;;:::i;33640:127::-;;;;;;;;;;-1:-1:-1;33640:127:0;;;;;:::i;:::-;;:::i;37331:208::-;;;;;;;;;;-1:-1:-1;37331:208:0;;;;;:::i;:::-;;:::i;26052:38::-;;;;;;;;;;-1:-1:-1;26052:38:0;;;;-1:-1:-1;;;;;26052:38:0;;;26517:28;;;;;;;;;;;;;;;;27057:51;;;;;;;;;;-1:-1:-1;27057:51:0;;;;;:::i;:::-;;;;;;;;;;;;;;34068:170;;;;;;;;;;-1:-1:-1;34068:170:0;;;;;:::i;:::-;;:::i;37794:1435::-;;;;;;;;;;-1:-1:-1;37794:1435:0;;;;;:::i;:::-;;:::i;37547:239::-;;;;;;;;;;-1:-1:-1;37547:239:0;;;;;:::i;:::-;;:::i;41546:109::-;;;;;;;;;;-1:-1:-1;41546:109:0;;;;;:::i;:::-;;:::i;37082:241::-;;;;;;;;;;-1:-1:-1;37082:241:0;;;;;:::i;:::-;;:::i;32841:188::-;;;;;;;;;;;;;:::i;26298:27::-;;;;;;;;;;;;;;;;12966:79;;;;;;;;;;-1:-1:-1;13031:6:0;;-1:-1:-1;;;;;13031:6:0;12966:79;;26097:32;;;;;;;;;;-1:-1:-1;26097:32:0;;;;-1:-1:-1;;;;;26097:32:0;;;26332;;;;;;;;;;;;;;;;5874:104;;;;;;;;;;;;;:::i;36365:163::-;;;;;;;;;;-1:-1:-1;36365:163:0;;;;;:::i;:::-;;:::i;26748:40::-;;;;;;;;;;;;;;;;36536:121;;;;;;;;;;-1:-1:-1;36536:121:0;;;;;:::i;:::-;;:::i;26552:24::-;;;;;;;;;;;;;;;;35141:176;;;;;;;;;;-1:-1:-1;35141:176:0;;;;;:::i;:::-;;:::i;33805:201::-;;;;;;;;;;-1:-1:-1;33805:201:0;;;;;:::i;:::-;;:::i;26583:25::-;;;;;;;;;;;;;;;;7809:400;;;;;;;;;;-1:-1:-1;7809:400:0;;;;;:::i;:::-;;:::i;35325:662::-;;;;;;;;;;-1:-1:-1;35325:662:0;;;;;:::i;:::-;;:::i;39718:184::-;;;;;;;;;;-1:-1:-1;39718:184:0;;;;;:::i;:::-;;:::i;6388:216::-;;;;;;;;;;-1:-1:-1;6388:216:0;;;;;:::i;:::-;;:::i;39237:190::-;;;;;;;;;;-1:-1:-1;39237:190:0;;;;;:::i;:::-;-1:-1:-1;;;;;39370:25:0;39328:7;39370:25;;;:16;:25;;;;;;;;;39397:12;:21;;;;;;;39370:25;;39237:190;;;;;7877:25:1;;;7933:2;7918:18;;7911:34;;;;7850:18;39237:190:0;7703:248:1;26615:26:0;;;;;;;;;;;;;;;;40089:307;;;;;;;;;;-1:-1:-1;40089:307:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;8257:32:1;;;8239:51;;8321:2;8306:18;;8299:34;;;;8349:18;;;8342:34;;;;8407:2;8392:18;;8385:34;8450:3;8435:19;;8428:35;8277:3;8479:19;;8472:35;8226:3;8211:19;40089:307:0;7956:557:1;27695:26:0;;;;;;;;;;;;;;;;26911:57;;;;;;;;;;-1:-1:-1;26911:57:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;34656:177;;;;;;;;;;-1:-1:-1;34656:177:0;;;;;:::i;:::-;;:::i;42098:127::-;;;;;;;;;;-1:-1:-1;42098:127:0;;;;;:::i;:::-;;:::i;53190:1673::-;;;;;;;;;;-1:-1:-1;53190:1673:0;;;;;:::i;:::-;;:::i;26262:29::-;;;;;;;;;;;;;;;;33094:268;;;;;;;;;;-1:-1:-1;33094:268:0;;;;;:::i;:::-;;:::i;36149:208::-;;;;;;;;;;-1:-1:-1;36149:208:0;;;;;:::i;:::-;;:::i;49553:158::-;;;;;;;;;;-1:-1:-1;49553:158:0;;;;;:::i;:::-;;:::i;6612:201::-;;;;;;;;;;-1:-1:-1;6612:201:0;;;;;:::i;:::-;-1:-1:-1;;;;;6778:18:0;;;6746:7;6778:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;6612:201;26222:33;;;;;;;;;;;;;;;;41258:130;;;;;;;;;;;;;:::i;26480:30::-;;;;;;;;;;;;;;;;27003:47;;;;;;;;;;-1:-1:-1;27003:47:0;;;;;:::i;:::-;;;;;;;;;;;;;;40404:317;;;;;;;;;;-1:-1:-1;40404:317:0;;;;;:::i;:::-;;:::i;13336:281::-;;;;;;;;;;-1:-1:-1;13336:281:0;;;;;:::i;:::-;;:::i;41663:107::-;;;;;;;;;;-1:-1:-1;41663:107:0;;;;;:::i;:::-;;:::i;26371:31::-;;;;;;;;;;;;;;;;26191:24;;;;;;;;;;;;;;;;34903:224;;;;;;;;;;-1:-1:-1;34903:224:0;;;;;:::i;:::-;;:::i;50736:443::-;13093:6;;-1:-1:-1;;;;;13093:6:0;352:10;13093:22;13085:67;;;;-1:-1:-1;;;13085:67:0;;;;;;;:::i;:::-;;;;;;;;;50824:17:::1;:6:::0;50834::::1;50824:17;:::i;:::-;50815:26;;50852:19;50874:25;50888:10;;50874:9;;:13;;:25;;;;:::i;:::-;50852:47;;50910:15;50928:38;50954:11;50928:21;50939:9;;50928:6;:10;;:21;;;;:::i;:::-;:25:::0;::::1;:38::i;:::-;50910:56;;50977:16;50996:39;51023:11;50996:22;51007:10;;50996:6;:10;;:22;;;;:::i;:39::-;50977:58;;51048:28;51069:6;51048:20;:28::i;:::-;51101:9;::::0;:22:::1;::::0;51115:7;51101:13:::1;:22::i;:::-;51089:9;:34:::0;51147:10:::1;::::0;:24:::1;::::0;51162:8;51147:14:::1;:24::i;:::-;51134:10;:37:::0;-1:-1:-1;;;;50736:443:0:o;5766:100::-;5820:13;5853:5;5846:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5766:100;:::o;33410:181::-;13093:6;;-1:-1:-1;;;;;13093:6:0;352:10;13093:22;13085:67;;;;-1:-1:-1;;;13085:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;33494:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;;;;:39;;-1:-1:-1;;33494:39:0::1;::::0;::::1;;::::0;;::::1;::::0;;;33549:34;;2066:41:1;;;33549:34:0::1;::::0;2039:18:1;33549:34:0::1;;;;;;;33410:181:::0;;:::o;34405:164::-;13093:6;;-1:-1:-1;;;;;13093:6:0;352:10;13093:22;13085:67;;;;-1:-1:-1;;;13085:67:0;;;;;;;:::i;:::-;34491:1:::1;34483:4;:9;;34475:46;;;::::0;-1:-1:-1;;;34475:46:0;;10164:2:1;34475:46:0::1;::::0;::::1;10146:21:1::0;10203:2;10183:18;;;10176:30;10242:26;10222:18;;;10215:54;10286:18;;34475:46:0::1;9962:348:1::0;34475:46:0::1;34548:13;:4:::0;34555:6:::1;34548:13;:::i;:::-;34532;:29:::0;-1:-1:-1;34405:164:0:o;6821:210::-;6940:4;6962:39;352:10;6985:7;6994:6;6962:8;:39::i;:::-;-1:-1:-1;7019:4:0;6821:210;;;;;:::o;32410:330::-;13093:6;;-1:-1:-1;;;;;13093:6:0;352:10;13093:22;13085:67;;;;-1:-1:-1;;;13085:67:0;;;;;;;:::i;:::-;32532:24:::1;::::0;;;:14:::1;:24;::::0;;;;;:33;;;32524:42:::1;;;::::0;::::1;;32594:5;32585;:14;;32577:59;;;::::0;-1:-1:-1;;;32577:59:0;;10517:2:1;32577:59:0::1;::::0;::::1;10499:21:1::0;;;10536:18;;;10529:30;10595:34;10575:18;;;10568:62;10647:18;;32577:59:0::1;10315:356:1::0;32577:59:0::1;32647:24;::::0;;;:14:::1;:24;::::0;;;;;;;;:32;;;32695:37;;7877:25:1;;;7918:18;;;7911:34;;;32695:37:0::1;::::0;7850:18:1;32695:37:0::1;;;;;;;32410:330:::0;;:::o;54871:637::-;13093:6;;-1:-1:-1;;;;;13093:6:0;352:10;13093:22;13085:67;;;;-1:-1:-1;;;13085:67:0;;;;;;;:::i;:::-;55043:6:::1;:13;55018:14;:21;:38;55010:80;;;::::0;-1:-1:-1;;;55010:80:0;;10878:2:1;55010:80:0::1;::::0;::::1;10860:21:1::0;10917:2;10897:18;;;10890:30;10956:32;10936:18;;;10929:60;11006:18;;55010:80:0::1;10676:354:1::0;55010:80:0::1;55134:3;55109:14;:21;:28;;55101:75;;;::::0;-1:-1:-1;;;55101:75:0;;11237:2:1;55101:75:0::1;::::0;::::1;11219:21:1::0;11276:2;11256:18;;;11249:30;11315:34;11295:18;;;11288:62;-1:-1:-1;;;11366:18:1;;;11359:32;11408:19;;55101:75:0::1;11035:398:1::0;55101:75:0::1;55192:9;55187:314;55211:14;:21;55207:1;:25;55187:314;;;55254:14;55271;55286:1;55271:17;;;;;;;;:::i;:::-;;;;;;;55254:34;;55303:21;55327:6;55334:1;55327:9;;;;;;;;:::i;:::-;;;;;;;55340:6;55327:20;;;;:::i;:::-;55303:44;;55362:50;55378:10;55390:6;55398:13;55362:15;:50::i;:::-;55427:15;::::0;-1:-1:-1;;;;;55427:15:0::1;:26;55462:6:::0;55471:17:::1;55462:6:::0;55471:9:::1;:17::i;:::-;55427:62;::::0;-1:-1:-1;;;;;;55427:62:0::1;::::0;;;;;;-1:-1:-1;;;;;11770:32:1;;;55427:62:0::1;::::0;::::1;11752:51:1::0;11819:18;;;11812:34;11725:18;;55427:62:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;55239:262;;55234:3;;;;;:::i;:::-;;;;55187:314;;;;54871:637:::0;;:::o;7039:454::-;7179:4;7196:36;7206:6;7214:9;7225:6;7196:9;:36::i;:::-;7243:220;7266:6;352:10;7314:138;7370:6;7314:138;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;7314:19:0;;;;;;:11;:19;;;;;;;;352:10;7314:33;;;;;;;;;;:37;:138::i;:::-;7243:8;:220::i;:::-;-1:-1:-1;7481:4:0;7039:454;;;;;:::o;49719:114::-;49793:15;;:32;;;-1:-1:-1;;;49793:32:0;;;;49766:7;;-1:-1:-1;;;;;49793:15:0;;:30;;:32;;;;;;;;;;;;;;:15;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;49786:39;;49719:114;:::o;39435:141::-;39525:15;;:43;;;-1:-1:-1;;;39525:43:0;;;;39498:7;;-1:-1:-1;;;;;39525:15:0;;:41;;:43;;;;;;;;;;;;;;:15;:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;41778:119::-;13093:6;;-1:-1:-1;;;;;13093:6:0;352:10;13093:22;13085:67;;;;-1:-1:-1;;;13085:67:0;;;;;;;:::i;:::-;41848:15:::1;::::0;:41:::1;::::0;-1:-1:-1;;;41848:41:0;;2091:14:1;;2084:22;41848:41:0::1;::::0;::::1;2066::1::0;-1:-1:-1;;;;;41848:15:0;;::::1;::::0;:34:::1;::::0;2039:18:1;;41848:41:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;41778:119:::0;:::o;7501:300::-;352:10;7616:4;7710:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;7710:34:0;;;;;;;;;;7616:4;;7638:133;;7688:7;;7710:50;;7749:10;7710:38;:50::i;36665:121::-;13093:6;;-1:-1:-1;;;;;13093:6:0;352:10;13093:22;13085:67;;;;-1:-1:-1;;;13085:67:0;;;;;;;:::i;:::-;36735:15:::1;::::0;:43:::1;::::0;-1:-1:-1;;;36735:43:0;;2091:14:1;;2084:22;36735:43:0::1;::::0;::::1;2066:41:1::0;-1:-1:-1;;;;;36735:15:0;;::::1;::::0;:36:::1;::::0;2039:18:1;;36735:43:0::1;1926:187:1::0;41147:103:0;41184:15;;:58;;-1:-1:-1;;;41184:58:0;;41223:10;41184:58;;;12626:51:1;41184:15:0;12693:18:1;;;12686:50;-1:-1:-1;;;;;41184:15:0;;;;:30;;12599:18:1;;41184:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;41147:103::o;49841:183::-;13093:6;;-1:-1:-1;;;;;13093:6:0;352:10;13093:22;13085:67;;;;-1:-1:-1;;;13085:67:0;;;;;;;:::i;:::-;49955:15:::1;::::0;:61:::1;::::0;-1:-1:-1;;;49955:61:0;;::::1;::::0;::::1;2752:25:1::0;;;-1:-1:-1;;;;;49955:15:0;;::::1;::::0;:54:::1;::::0;2725:18:1;;49955:61:0::1;2606:177:1::0;50032:175:0;13093:6;;-1:-1:-1;;;;;13093:6:0;352:10;13093:22;13085:67;;;;-1:-1:-1;;;13085:67:0;;;;;;;:::i;:::-;50142:15:::1;::::0;:57:::1;::::0;-1:-1:-1;;;50142:57:0;;::::1;::::0;::::1;2752:25:1::0;;;-1:-1:-1;;;;;50142:15:0;;::::1;::::0;:50:::1;::::0;2725:18:1;;50142:57:0::1;2606:177:1::0;36021:120:0;13093:6;;-1:-1:-1;;;;;13093:6:0;352:10;13093:22;13085:67;;;;-1:-1:-1;;;13085:67:0;;;;;;;:::i;:::-;36116:17:::1;:6:::0;36126::::1;36116:17;:::i;:::-;36095:18;:38:::0;-1:-1:-1;36021:120:0:o;41396:142::-;41489:15;;:41;;;-1:-1:-1;;;41489:41:0;;;;41462:7;;-1:-1:-1;;;;;41489:15:0;;:39;;:41;;;;;;;;;;;;;;:15;:41;;;;;;;;;;;;;;34277:99;13093:6;;-1:-1:-1;;;;;13093:6:0;352:10;13093:22;13085:67;;;;-1:-1:-1;;;13085:67:0;;;;;;;:::i;:::-;34346:14:::1;:22:::0;;-1:-1:-1;;34346:22:0::1;::::0;::::1;;::::0;;;::::1;::::0;;34277:99::o;39910:171::-;40039:15;;:34;;-1:-1:-1;;;40039:34:0;;-1:-1:-1;;;;;178:32:1;;;40039:34:0;;;160:51:1;40007:7:0;;40039:15;;:25;;133:18:1;;40039:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;41905:185::-;42034:15;;:48;;-1:-1:-1;;;42034:48:0;;-1:-1:-1;;;;;178:32:1;;;42034:48:0;;;160:51:1;42005:4:0;;42034:15;;:39;;133:18:1;;42034:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;40729:410::-;40911:15;;:28;;-1:-1:-1;;;;;;40911:28:0;;;;;2752:25:1;;;40809:18:0;;;;;;-1:-1:-1;;;;;40911:15:0;;:23;;2725:18:1;;40911:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40955:176;;;13539:25:1;;;13595:2;13580:18;;13573:34;;;13623:18;;;13616:34;;;13681:2;13666:18;;13659:34;;;40794:145:0;;-1:-1:-1;40794:145:0;;-1:-1:-1;40794:145:0;-1:-1:-1;41111:9:0;;41073:5;;40955:176;;13526:3:1;13511:19;40955:176:0;;;;;;;40783:356;;;40729:410;:::o;6203:177::-;-1:-1:-1;;;;;6354:18:0;6322:7;6354:18;;;;;;;;;;;;6203:177::o;13180:148::-;13093:6;;-1:-1:-1;;;;;13093:6:0;352:10;13093:22;13085:67;;;;-1:-1:-1;;;13085:67:0;;;;;;;:::i;:::-;13271:6:::1;::::0;13250:40:::1;::::0;13287:1:::1;::::0;-1:-1:-1;;;;;13271:6:0::1;::::0;13250:40:::1;::::0;13287:1;;13250:40:::1;13301:6;:19:::0;;-1:-1:-1;;;;;;13301:19:0::1;::::0;;13180:148::o;33640:127::-;13093:6;;-1:-1:-1;;;;;13093:6:0;352:10;13093:22;13085:67;;;;-1:-1:-1;;;13085:67:0;;;;;;;:::i;:::-;33714:15:::1;::::0;:45:::1;::::0;-1:-1:-1;;;33714:45:0;;-1:-1:-1;;;;;178:32:1;;;33714:45:0::1;::::0;::::1;160:51:1::0;33714:15:0;;::::1;::::0;:36:::1;::::0;133:18:1;;33714:45:0::1;14:203:1::0;37331:208:0;13093:6;;-1:-1:-1;;;;;13093:6:0;352:10;13093:22;13085:67;;;;-1:-1:-1;;;13085:67:0;;;;;;;:::i;:::-;37400:15:::1;::::0;:46:::1;::::0;-1:-1:-1;;;37400:46:0;;-1:-1:-1;;;;;178:32:1;;;37400:46:0::1;::::0;::::1;160:51:1::0;37400:15:0;;::::1;::::0;:36:::1;::::0;133:18:1;;37400:46:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;;;;;;;37457:29:0;::::1;;::::0;;;:19:::1;:29;::::0;;;;:36;;-1:-1:-1;;37457:36:0::1;37489:4;37457:36;::::0;;-1:-1:-1;37504:27:0::1;37477:8:::0;37504:17:::1;:27::i;34068:170::-:0;13093:6;;-1:-1:-1;;;;;13093:6:0;352:10;13093:22;13085:67;;;;-1:-1:-1;;;13085:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;34180:41:0;;;::::1;;::::0;;;:33:::1;:41;::::0;;;;:50;;-1:-1:-1;;34180:50:0::1;::::0;::::1;;::::0;;;::::1;::::0;;34068:170::o;37794:1435::-;13093:6;;-1:-1:-1;;;;;13093:6:0;352:10;13093:22;13085:67;;;;-1:-1:-1;;;13085:67:0;;;;;;;:::i;:::-;38138:11:::1;:21:::0;;;38170:16:::1;:31:::0;;;38212:15:::1;:30:::0;;;38253:13:::1;:26:::0;;;38290:12:::1;:23:::0;;;38324:17:::1;:33:::0;;;38368:16:::1;:32:::0;;;38411:14:::1;:28:::0;;;38450:9:::1;:18:::0;;;38479:10:::1;:20:::0;;;38528:117:::1;38492:7:::0;38528:87:::1;38344:13:::0;38528:87;38428:11;38387:13;38528:32:::1;:50::i;:::-;:68:::0;::::1;:87::i;:117::-;38512:13;:133;;;;38673:113;38776:9;;38673:84;38740:16;;38673:48;38705:15;;38673:13;;:31;;:48;;;;:::i;:113::-;38658:12;:128:::0;38807:13:::1;::::0;38824:5:::1;-1:-1:-1::0;38807:22:0;::::1;::::0;:47:::1;;;38849:5;38833:12;;:21;;38807:47;38799:100;;;::::0;-1:-1:-1;;;38799:100:0;;13906:2:1;38799:100:0::1;::::0;::::1;13888:21:1::0;13945:2;13925:18;;;13918:30;13984:34;13964:18;;;13957:62;-1:-1:-1;;;14035:18:1;;;14028:38;14083:19;;38799:100:0::1;13704:404:1::0;38799:100:0::1;38942:12;::::0;38969:17:::1;::::0;39001:16:::1;::::0;39032:14:::1;::::0;39061:11:::1;::::0;39087:16:::1;::::0;39118:15:::1;::::0;39148:13:::1;::::0;39176:9:::1;::::0;39200:10:::1;::::0;38917:304:::1;::::0;;14512:25:1;;;14568:2;14553:18;;14546:34;;;;14596:18;;;14589:34;;;;14654:2;14639:18;;14632:34;;;;14697:3;14682:19;;14675:35;;;;14741:3;14726:19;;14719:35;14785:3;14770:19;;14763:35;14829:3;14814:19;;14807:35;14873:3;14858:19;;14851:35;14917:3;14902:19;;14895:35;38917:304:0::1;::::0;14499:3:1;14484:19;38917:304:0::1;;;;;;;37794:1435:::0;;;;;;;;;;:::o;37547:239::-;13093:6;;-1:-1:-1;;;;;13093:6:0;352:10;13093:22;13085:67;;;;-1:-1:-1;;;13085:67:0;;;;;;;:::i;:::-;37653:5:::1;37635:14;:23;;37626:67;;;::::0;-1:-1:-1;;;37626:67:0;;15143:2:1;37626:67:0::1;::::0;::::1;15125:21:1::0;15182:2;15162:18;;;15155:30;15221:32;15201:18;;;15194:60;15271:18;;37626:67:0::1;14941:354:1::0;37626:67:0::1;37704:11;:28:::0;;;37748:30:::1;::::0;2752:25:1;;;37748:30:0::1;::::0;2740:2:1;2725:18;37748:30:0::1;;;;;;;;37547:239:::0;:::o;41546:109::-;41600:15;;:47;;-1:-1:-1;;;41600:47:0;;41629:10;41600:47;;;12626:51:1;12720:14;;12713:22;12693:18;;;12686:50;-1:-1:-1;;;;;41600:15:0;;;;:28;;12599:18:1;;41600:47:0;12442:300:1;37082:241:0;13093:6;;-1:-1:-1;;;;;13093:6:0;352:10;13093:22;13085:67;;;;-1:-1:-1;;;13085:67:0;;;;;;;:::i;:::-;37180:6:::1;37168:8;:18;;:41;;;;;37202:7;37190:8;:19;;37168:41;37160:50;;;::::0;::::1;;37260:16;::::0;37226:51:::1;::::0;37250:8;;37226:51:::1;::::0;;;::::1;37288:16;:27:::0;37082:241::o;32841:188::-;13093:6;;-1:-1:-1;;;;;13093:6:0;352:10;13093:22;13085:67;;;;-1:-1:-1;;;13085:67:0;;;;;;;:::i;:::-;32905:14:::1;::::0;-1:-1:-1;;;32905:14:0;::::1;;;32904:15;32896:24;;;::::0;::::1;;32931:14;:21:::0;;-1:-1:-1;;;;32931:21:0::1;-1:-1:-1::0;;;32931:21:0::1;::::0;;32977:12:::1;32963:11;:26:::0;33005:16:::1;::::0;::::1;::::0;32931:21;;33005:16:::1;32841:188::o:0;5874:104::-;5930:13;5963:7;5956:14;;;;;:::i;36365:163::-;13093:6;;-1:-1:-1;;;;;13093:6:0;352:10;13093:22;13085:67;;;;-1:-1:-1;;;13085:67:0;;;;;;;:::i;:::-;36479:41:::1;36508:4;36514:5;36479:28;:41::i;:::-;36365:163:::0;;:::o;36536:121::-;13093:6;;-1:-1:-1;;;;;13093:6:0;352:10;13093:22;13085:67;;;;-1:-1:-1;;;13085:67:0;;;;;;;:::i;:::-;36606:15:::1;::::0;:43:::1;::::0;-1:-1:-1;;;36606:43:0;;2091:14:1;;2084:22;36606:43:0::1;::::0;::::1;2066:41:1::0;-1:-1:-1;;;;;36606:15:0;;::::1;::::0;:36:::1;::::0;2039:18:1;;36606:43:0::1;1926:187:1::0;35141:176:0;13093:6;;-1:-1:-1;;;;;13093:6:0;352:10;13093:22;13085:67;;;;-1:-1:-1;;;13085:67:0;;;;;;;:::i;:::-;35231:6:::1;35213:24;;:14;;;;;;;;;;;:24;;::::0;35205:33:::1;;;::::0;::::1;;35249:14;:23:::0;;;::::1;;-1:-1:-1::0;;;35249:23:0::1;-1:-1:-1::0;;;;35249:23:0;;::::1;;::::0;;35288:21:::1;::::0;::::1;::::0;::::1;::::0;35266:6;2091:14:1;2084:22;2066:41;;2054:2;2039:18;;1926:187;33805:201:0;13093:6;;-1:-1:-1;;;;;13093:6:0;352:10;13093:22;13085:67;;;;-1:-1:-1;;;13085:67:0;;;;;;;:::i;:::-;33879:15:::1;::::0;:45:::1;::::0;-1:-1:-1;;;33879:45:0;;-1:-1:-1;;;;;178:32:1;;;33879:45:0::1;::::0;::::1;160:51:1::0;33879:15:0;;::::1;::::0;:36:::1;::::0;133:18:1;;33879:45:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;33935:15:0::1;::::0;-1:-1:-1;;;;;33935:15:0::1;::::0;-1:-1:-1;33935:26:0::1;::::0;-1:-1:-1;33962:7:0;33971:26:::1;33962:7:::0;33971:17:::1;:26::i;:::-;33935:63;::::0;-1:-1:-1;;;;;;33935:63:0::1;::::0;;;;;;-1:-1:-1;;;;;11770:32:1;;;33935:63:0::1;::::0;::::1;11752:51:1::0;11819:18;;;11812:34;11725:18;;33935:63:0::1;11570:282:1::0;7809:400:0;7929:4;7951:228;352:10;8001:7;8023:145;8080:15;8023:145;;;;;;;;;;;;;;;;;352:10;8023:25;;;;:11;:25;;;;;;;;-1:-1:-1;;;;;8023:34:0;;;;;;;;;;;;:38;:145::i;35325:662::-;35384:14;;-1:-1:-1;;;35384:14:0;;;;35376:49;;;;-1:-1:-1;;;35376:49:0;;16070:2:1;35376:49:0;;;16052:21:1;16109:2;16089:18;;;16082:30;-1:-1:-1;;;16128:18:1;;;16121:52;16190:18;;35376:49:0;15868:346:1;35376:49:0;35444:24;;;;:14;:24;;;;;;:29;;35436:66;;;;-1:-1:-1;;;35436:66:0;;16421:2:1;35436:66:0;;;16403:21:1;16460:2;16440:18;;;16433:30;16499:26;16479:18;;;16472:54;16543:18;;35436:66:0;16219:348:1;35436:66:0;35568:29;:15;35588:8;35568:19;:29::i;:::-;352:10;35535:30;;;;:16;:30;;;;;;:62;35513:148;;;;-1:-1:-1;;;35513:148:0;;16774:2:1;35513:148:0;;;16756:21:1;16813:2;16793:18;;;16786:30;16852:34;16832:18;;;16825:62;-1:-1:-1;;;16903:18:1;;;16896:34;16947:19;;35513:148:0;16572:400:1;35513:148:0;35701:24;;;;:14;:24;;;;;;;;;352:10;35672:26;;:12;:26;;;;;;:53;35769:29;:15;35701:24;35769:19;:29::i;:::-;352:10;35736:30;;;;:16;:30;;;;;:62;;;;35809:15;;-1:-1:-1;;;;;35809:15:0;;:26;;35877:31;352:10;35877:17;:31::i;:::-;35809:110;;-1:-1:-1;;;;;;35809:110:0;;;;;;;-1:-1:-1;;;;;11770:32:1;;;35809:110:0;;;11752:51:1;11819:18;;;11812:34;11725:18;;35809:110:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35956:12;352:10;;272:98;35956:12;-1:-1:-1;;;;;35935:44:0;;35970:8;35935:44;;;;2752:25:1;;2740:2;2725:18;;2606:177;35935:44:0;;;;;;;;35325:662;:::o;39718:184::-;39847:15;;:47;;-1:-1:-1;;;39847:47:0;;-1:-1:-1;;;;;178:32:1;;;39847:47:0;;;160:51:1;39815:7:0;;39847:15;;:38;;133:18:1;;39847:47:0;14:203:1;6388:216:0;6510:4;6532:42;352:10;6556:9;6567:6;6532:9;:42::i;40089:307::-;40353:15;;:35;;-1:-1:-1;;;40353:35:0;;-1:-1:-1;;;;;178:32:1;;;40353:35:0;;;160:51:1;40203:7:0;;;;;;;;;;;;40353:15;;;;:26;;133:18:1;;40353:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40346:42;;;;-1:-1:-1;40346:42:0;;-1:-1:-1;40346:42:0;-1:-1:-1;40346:42:0;-1:-1:-1;40346:42:0;;-1:-1:-1;40089:307:0;-1:-1:-1;;40089:307:0:o;34656:177::-;13093:6;;-1:-1:-1;;;;;13093:6:0;352:10;13093:22;13085:67;;;;-1:-1:-1;;;13085:67:0;;;;;;;:::i;:::-;34744:6:::1;34735:5;:15;;34727:66;;;::::0;-1:-1:-1;;;34727:66:0;;17741:2:1;34727:66:0::1;::::0;::::1;17723:21:1::0;17780:2;17760:18;;;17753:30;17819:34;17799:18;;;17792:62;-1:-1:-1;;;17870:18:1;;;17863:36;17916:19;;34727:66:0::1;17539:402:1::0;34727:66:0::1;34804:13;:21:::0;34656:177::o;42098:127::-;42182:15;;:35;;-1:-1:-1;;;42182:35:0;;-1:-1:-1;;;;;178:32:1;;;42182:35:0;;;160:51:1;42158:4:0;;42182:15;;:26;;133:18:1;;42182:35:0;14:203:1;53190:1673:0;13093:6;;-1:-1:-1;;;;;13093:6:0;352:10;13093:22;13085:67;;;;-1:-1:-1;;;13085:67:0;;;;;;;:::i;:::-;53368:9:::1;:16;53344:13;:20;:40;53322:133;;;::::0;-1:-1:-1;;;53322:133:0;;18148:2:1;53322:133:0::1;::::0;::::1;18130:21:1::0;18187:2;18167:18;;;18160:30;18226:34;18206:18;;;18199:62;-1:-1:-1;;;18277:18:1;;;18270:41;18328:19;;53322:133:0::1;17946:407:1::0;53322:133:0::1;53576:3;53552:13;:20;:27;;53530:115;;;::::0;-1:-1:-1;;;53530:115:0;;18560:2:1;53530:115:0::1;::::0;::::1;18542:21:1::0;18599:2;18579:18;;;18572:30;18638:34;18618:18;;;18611:62;-1:-1:-1;;;18689:18:1;;;18682:36;18735:19;;53530:115:0::1;18358:402:1::0;53530:115:0::1;53656:21;53697:7:::0;53692:119:::1;53714:9;:16;53710:1;:20;;;53692:119;;;53768:31;53786:9;53796:1;53786:12;;;;;;;;;;:::i;:::-;;;;;;;53768:13;:17;;:31;;;;:::i;:::-;53752:47:::0;-1:-1:-1;53732:3:0;::::1;::::0;::::1;:::i;:::-;;;;53692:119;;;;53868:13;53843:21;53853:10;53843:9;:21::i;:::-;:38;;53821:132;;;::::0;-1:-1:-1;;;53821:132:0;;19147:2:1;53821:132:0::1;::::0;::::1;19129:21:1::0;19186:2;19166:18;;;19159:30;19225:34;19205:18;;;19198:62;-1:-1:-1;;;19276:18:1;;;19269:42;19328:19;;53821:132:0::1;18945:408:1::0;53821:132:0::1;53996:10;6746:7:::0;6778:18;;;:11;:18;;;;;;;;54016:4:::1;6778:27:::0;;;;;;;;54026:13;-1:-1:-1;53986:53:0::1;53964:150;;;::::0;-1:-1:-1;;;53964:150:0;;19560:2:1;53964:150:0::1;::::0;::::1;19542:21:1::0;19599:2;19579:18;;;19572:30;19638:34;19618:18;;;19611:62;-1:-1:-1;;;19689:18:1;;;19682:45;19744:19;;53964:150:0::1;19358:411:1::0;53964:150:0::1;54125:19;54155::::0;54190:7:::1;54185:671;54203:13;:20;54199:1;:24;;;54185:671;;;54259:13;54273:1;54259:16;;;;;;;;;;:::i;:::-;;;;;;;54245:30;;54339:1;-1:-1:-1::0;;;;;54316:25:0::1;:11;-1:-1:-1::0;;;;;54316:25:0::1;;;:107;;;;-1:-1:-1::0;54381:42:0::1;-1:-1:-1::0;;;;;54366:57:0;::::1;;;54316:107;54290:201;;;::::0;-1:-1:-1;;;54290:201:0;;19976:2:1;54290:201:0::1;::::0;::::1;19958:21:1::0;;;19995:18;;;19988:30;20054:34;20034:18;;;20027:62;20106:18;;54290:201:0::1;19774:356:1::0;54290:201:0::1;54520:22;54530:11;54520:9;:22::i;:::-;54506:36;;54557:4;-1:-1:-1::0;;;;;54557:17:0::1;;54575:10;54587:11;54600:9;54610:1;54600:12;;;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;54557:56:::1;::::0;-1:-1:-1;;;;;;54557:56:0::1;::::0;;;;;;-1:-1:-1;;;;;20393:15:1;;;54557:56:0::1;::::0;::::1;20375:34:1::0;20445:15;;;;20425:18;;;20418:43;20477:18;;;20470:34;20310:18;;54557:56:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;54694:9;54704:1;54694:12;;;;;;;;;;:::i;:::-;;;;;;;54680:11;:26;;;;:::i;:::-;54654:22;54664:11;54654:9;:22::i;:::-;:52;54628:162;;;::::0;-1:-1:-1;;;54628:162:0;;20847:2:1;54628:162:0::1;::::0;::::1;20829:21:1::0;20886:2;20866:18;;;20859:30;20925:34;20905:18;;;20898:62;-1:-1:-1;;;20976:18:1;;;20969:46;21032:19;;54628:162:0::1;20645:412:1::0;54628:162:0::1;54810:34;54818:11;54831:9;54841:1;54831:12;;;;;;;;;;:::i;:::-;;;;;;;54810:34;;;;;;-1:-1:-1::0;;;;;11770:32:1;;;;11752:51;;11834:2;11819:18;;11812:34;11740:2;11725:18;;11570:282;54810:34:0::1;;;;;;;;54225:3:::0;::::1;::::0;::::1;:::i;:::-;;;;54185:671;;;;53311:1552;;;53190:1673:::0;;:::o;33094:268::-;13093:6;;-1:-1:-1;;;;;13093:6:0;352:10;13093:22;13085:67;;;;-1:-1:-1;;;13085:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;33166:41:0;;::::1;;::::0;;;:33:::1;:41;::::0;;;;;;;:48;;33210:4:::1;-1:-1:-1::0;;33166:48:0;;::::1;::::0;::::1;::::0;;;33225:19:::1;:27:::0;;;;;;;:34;;;;::::1;::::0;;::::1;::::0;;33270:15:::1;::::0;:44;;-1:-1:-1;;;33270:44:0;;::::1;::::0;::::1;160:51:1::0;;;;33270:15:0;::::1;::::0;:36:::1;::::0;133:18:1;33270:44:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;33330:24:0::1;::::0;-1:-1:-1;;;;;178:32:1;;160:51;;33330:24:0::1;::::0;-1:-1:-1;148:2:1;133:18;;-1:-1:-1;33330:24:0::1;14:203:1::0;36149:208:0;13093:6;;-1:-1:-1;;;;;13093:6:0;352:10;13093:22;13085:67;;;;-1:-1:-1;;;13085:67:0;;;;;;;:::i;:::-;36229:21:::1;::::0;:32;::::1;;:21;::::0;;::::1;:32;;::::0;36221:41:::1;;;::::0;::::1;;36273:21;:31:::0;;-1:-1:-1;;36273:31:0::1;::::0;::::1;;::::0;;::::1;::::0;;;36320:29:::1;::::0;2066:41:1;;;36320:29:0::1;::::0;2054:2:1;2039:18;36320:29:0::1;1926:187:1::0;49553:158:0;13093:6;;-1:-1:-1;;;;;13093:6:0;352:10;13093:22;13085:67;;;;-1:-1:-1;;;13085:67:0;;;;;;;:::i;:::-;49623:15:::1;::::0;:40:::1;::::0;-1:-1:-1;;;49623:40:0;;-1:-1:-1;;;;;178:32:1;;;49623:40:0::1;::::0;::::1;160:51:1::0;49623:15:0;;::::1;::::0;:33:::1;::::0;133:18:1;;49623:40:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;49679:24:0::1;::::0;-1:-1:-1;;;;;178:32:1;;160:51;;49679:24:0::1;::::0;-1:-1:-1;148:2:1;133:18;;-1:-1:-1;49679:24:0::1;14:203:1::0;41258:130:0;41341:15;;:39;;;-1:-1:-1;;;41341:39:0;;;;41314:7;;-1:-1:-1;;;;;41341:15:0;;:37;;:39;;;;;;;;;;;;;;:15;:39;;;;;;;;;;;;;;40404:317;40673:15;;:40;;-1:-1:-1;;;40673:40:0;;;;;2752:25:1;;;40523:7:0;;;;;;;;;;;;-1:-1:-1;;;;;40673:15:0;;;;:33;;2725:18:1;;40673:40:0;2606:177:1;13336:281:0;13093:6;;-1:-1:-1;;;;;13093:6:0;352:10;13093:22;13085:67;;;;-1:-1:-1;;;13085:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;13439:22:0;::::1;13417:110;;;::::0;-1:-1:-1;;;13417:110:0;;21264:2:1;13417:110:0::1;::::0;::::1;21246:21:1::0;21303:2;21283:18;;;21276:30;21342:34;21322:18;;;21315:62;-1:-1:-1;;;21393:18:1;;;21386:36;21439:19;;13417:110:0::1;21062:402:1::0;13417:110:0::1;13564:6;::::0;13543:38:::1;::::0;-1:-1:-1;;;;;13543:38:0;;::::1;::::0;13564:6:::1;::::0;13543:38:::1;::::0;13564:6:::1;::::0;13543:38:::1;13592:6;:17:::0;;-1:-1:-1;;;;;;13592:17:0::1;-1:-1:-1::0;;;;;13592:17:0;;;::::1;::::0;;;::::1;::::0;;13336:281::o;41663:107::-;41716:15;;:46;;-1:-1:-1;;;41716:46:0;;41744:10;41716:46;;;12626:51:1;12720:14;;12713:22;12693:18;;;12686:50;-1:-1:-1;;;;;41716:15:0;;;;:27;;12599:18:1;;41716:46:0;12442:300:1;34903:224:0;13093:6;;-1:-1:-1;;;;;13093:6:0;352:10;13093:22;13085:67;;;;-1:-1:-1;;;13085:67:0;;;;;;;:::i;:::-;34978:16:::1;:5:::0;34987:6:::1;34978:16;:::i;:::-;34970:24;;35037:6;35022:12;;:21;;;;:::i;:::-;35013:5;:30;;35005:86;;;::::0;-1:-1:-1;;;35005:86:0;;21893:2:1;35005:86:0::1;::::0;::::1;21875:21:1::0;21932:2;21912:18;;;21905:30;21971:34;21951:18;;;21944:62;-1:-1:-1;;;22022:18:1;;;22015:41;22073:19;;35005:86:0::1;21691:407:1::0;35005:86:0::1;35102:9;:17:::0;34903:224::o;10992:181::-;11050:7;;11082:5;11086:1;11082;:5;:::i;:::-;11070:17;;11111:1;11106;:6;;11098:46;;;;-1:-1:-1;;;11098:46:0;;22305:2:1;11098:46:0;;;22287:21:1;22344:2;22324:18;;;22317:30;22383:29;22363:18;;;22356:57;22430:18;;11098:46:0;22103:351:1;11098:46:0;11164:1;10992:181;-1:-1:-1;;;10992:181:0:o;11559:250::-;11617:7;11641:1;11646;11641:6;11637:47;;-1:-1:-1;11671:1:0;11664:8;;11637:47;11696:9;11708:5;11712:1;11708;:5;:::i;:::-;11696:17;-1:-1:-1;11741:1:0;11732:5;11736:1;11696:17;11732:5;:::i;:::-;:10;11724:56;;;;-1:-1:-1;;;11724:56:0;;22661:2:1;11724:56:0;;;22643:21:1;22700:2;22680:18;;;22673:30;22739:34;22719:18;;;22712:62;-1:-1:-1;;;22790:18:1;;;22783:31;22831:19;;11724:56:0;22459:397:1;11817:132:0;11875:7;11902:39;11906:1;11909;11902:39;;;;;;;;;;;;;;;;;:3;:39::i;51187:1995::-;51256:6;51266:1;51256:11;51252:50;;51187:1995;:::o;51252:50::-;51312:24;51329:6;51312:16;:24::i;:::-;51347:19;51369:25;51383:10;;51369:9;;:13;;:25;;;;:::i;:::-;51610:13;;51347:47;;-1:-1:-1;51422:4:0;;;;;;51407:12;;;;;;51610:17;51606:261;;51663:192;51845:9;;51826:16;;51810:13;;:32;;;;:::i;:::-;:44;;;;:::i;:::-;51663:128;51777:13;;51663:95;51746:11;51663:64;51717:9;;51663:35;:53;;:64;;;;:::i;:95::-;:113;;:128::i;:192::-;51644:211;;51606:261;51881:14;;:18;51877:268;;51936:197;52122:10;;52102:17;;52085:14;;:34;;;;:::i;:::-;:47;;;;:::i;:::-;51936:130;52051:14;;51936:96;52020:11;51936:65;51990:10;;51936:35;:53;;:65;;;;:::i;:197::-;51916:217;;51877:268;52167:39;:16;52188:17;52167:20;:39::i;:::-;52155:51;-1:-1:-1;52223:13:0;;52219:111;;52275:15;;52267:51;;-1:-1:-1;;;;;52275:15:0;;;;52304:9;;52267:51;;;;52304:9;52275:15;52267:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;52253:65:0;;-1:-1:-1;;52219:111:0;52350:21;52423:31;52444:9;;52423:16;;:20;;:31;;;;:::i;:::-;52396:10;;52374:17;;:33;;:21;:33::i;:::-;:80;;;;:::i;:::-;52350:104;-1:-1:-1;52467:19:0;52501:17;;52497:104;;52549:40;:21;52575:13;52549:25;:40::i;:::-;52535:54;;52497:104;52611:23;52679:11;52637:39;52658:17;;52637:16;;:20;;:39;;;;:::i;:::-;:53;;;;:::i;:::-;52611:79;;52701:17;52749:11;52721:25;52735:10;;52721:9;;:13;;:25;;;;:::i;:::-;:39;;;;:::i;:::-;52701:59;-1:-1:-1;52777:19:0;;52773:126;;52838:15;;52830:57;;-1:-1:-1;;;;;52838:15:0;;;;52867;;52830:57;;;;52867:15;52838;52830:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;52813:74:0;;-1:-1:-1;;52773:126:0;52913:13;;52909:108;;52968:9;;52960:45;;-1:-1:-1;;;;;52968:9:0;;;;52991;;52960:45;;;;52991:9;52968;52960:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;52943:62:0;;-1:-1:-1;;52909:108:0;53034:140;53062:9;53086:27;53104:9;53086:15;:27;:::i;:::-;53128:7;:21;;;;;53139:10;53128:21;:35;;;;;53153:10;53128:35;53034:140;;;23267:25:1;;;23323:2;23308:18;;23301:34;;;;23378:14;23371:22;23351:18;;;23344:50;23255:2;23240:18;53034:140:0;;;;;;;51241:1941;;;;;;;;;;;51187:1995;:::o;11181:136::-;11239:7;11266:43;11270:1;11273;11266:43;;;;;;;;;;;;;;;;;:3;:43::i;9684:380::-;-1:-1:-1;;;;;9820:19:0;;9812:68;;;;-1:-1:-1;;;9812:68:0;;23607:2:1;9812:68:0;;;23589:21:1;23646:2;23626:18;;;23619:30;23685:34;23665:18;;;23658:62;-1:-1:-1;;;23736:18:1;;;23729:34;23780:19;;9812:68:0;23405:400:1;9812:68:0;-1:-1:-1;;;;;9899:21:0;;9891:68;;;;-1:-1:-1;;;9891:68:0;;24012:2:1;9891:68:0;;;23994:21:1;24051:2;24031:18;;;24024:30;24090:34;24070:18;;;24063:62;-1:-1:-1;;;24141:18:1;;;24134:32;24183:19;;9891:68:0;23810:398:1;9891:68:0;-1:-1:-1;;;;;9972:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;10024:32;;2752:25:1;;;10024:32:0;;2725:18:1;10024:32:0;;;;;;;;9684:380;;;:::o;8217:610::-;-1:-1:-1;;;;;8357:20:0;;8349:70;;;;-1:-1:-1;;;8349:70:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;8438:23:0;;8430:71;;;;-1:-1:-1;;;8430:71:0;;;;;;;:::i;:::-;8594:108;8630:6;8594:108;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;8594:17:0;;:9;:17;;;;;;;;;;;;:108;:21;:108::i;:::-;-1:-1:-1;;;;;8574:17:0;;;:9;:17;;;;;;;;;;;:128;;;;8736:20;;;;;;;:32;;8761:6;8736:24;:32::i;:::-;-1:-1:-1;;;;;8713:20:0;;;:9;:20;;;;;;;;;;;;:55;;;;8784:35;2752:25:1;;;8713:20:0;;8784:35;;;;;;2725:18:1;8784:35:0;2606:177:1;42233:6020:0;-1:-1:-1;;;;;42365:18:0;;42357:68;;;;-1:-1:-1;;;42357:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;42444:16:0;;42436:64;;;;-1:-1:-1;;;42436:64:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;42663:39:0;;42511:18;42663:39;;;:33;:39;;;;;;42511:18;;;;;;;;42663:39;;42658:132;;42727:14;;-1:-1:-1;;;42727:14:0;;;;42719:59;;;;-1:-1:-1;;;42719:59:0;;25225:2:1;42719:59:0;;;25207:21:1;;;25244:18;;;25237:30;25303:34;25283:18;;;25276:62;25355:18;;42719:59:0;25023:356:1;42719:59:0;42804:6;42814:1;42804:11;42800:5268;;42832:28;42848:4;42854:2;42858:1;42832:15;:28::i;:::-;42875:7;;;;;42233:6020;;;:::o;42800:5268::-;42918:8;;-1:-1:-1;;;42918:8:0;;;;42917:9;:39;;;;-1:-1:-1;;;;;;42931:25:0;;;;;;:19;:25;;;;;;;;42930:26;42917:39;:67;;;;-1:-1:-1;;;;;;42961:23:0;;;;;;:19;:23;;;;;;;;42960:24;42917:67;42899:5169;;;-1:-1:-1;;;;;43028:29:0;;;43011:14;43028:29;;;:25;:29;;;;;;;43088:31;;;;;;;;43028:29;;;;;43088:31;43140:9;;:23;;;;;43154:9;43153:10;43140:23;43136:2286;;;43184:13;43200:32;43228:3;43200:23;43211:11;;43200:6;:10;;:23;;;;:::i;:32::-;43184:48;-1:-1:-1;43260:17:0;:6;43184:48;43260:10;:17::i;:::-;43251:26;;43296:43;43312:4;43326;43333:5;43296:15;:43::i;:::-;43358:33;43374:4;43380:2;43384:6;43358:15;:33::i;:::-;43410:15;;-1:-1:-1;;;;;43410:15:0;:26;43437:4;43443:23;43437:4;43443:17;:23::i;:::-;43410:57;;-1:-1:-1;;;;;;43410:57:0;;;;;;;-1:-1:-1;;;;;11770:32:1;;;43410:57:0;;;11752:51:1;11819:18;;;11812:34;11725:18;;43410:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;43486:15:0;;-1:-1:-1;;;;;43486:15:0;;-1:-1:-1;43486:26:0;;-1:-1:-1;43513:2:0;43517:21;43513:2;43517:17;:21::i;:::-;43486:53;;-1:-1:-1;;;;;;43486:53:0;;;;;;;-1:-1:-1;;;;;11770:32:1;;;43486:53:0;;;11752:51:1;11819:18;;;11812:34;11725:18;;43486:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43558:7;;;;;;;;42233:6020;;;:::o;43136:2286::-;43618:8;43617:9;:27;;;;-1:-1:-1;43630:14:0;;-1:-1:-1;;;43630:14:0;;;;43617:27;43613:1809;;;-1:-1:-1;;;;;43695:22:0;;;;;;:16;:22;;;;;;43721:15;-1:-1:-1;43695:41:0;43665:144;;;;-1:-1:-1;;;43665:144:0;;25586:2:1;43665:144:0;;;25568:21:1;25625:2;25605:18;;;25598:30;25664:31;25644:18;;;25637:59;25713:18;;43665:144:0;25384:353:1;43665:144:0;-1:-1:-1;;;;;43832:22:0;;;;;;:16;:22;;;;;;:27;43828:147;;-1:-1:-1;;;;;43884:22:0;;43909:1;43884:22;;;:16;:22;;;;;;;;:26;;;43933:12;:18;;;;;:22;43828:147;43613:1809;;;44015:9;44011:1411;;;44058:14;;44102:12;;44149:17;;44200:16;;44245:10;;44280:14;;44058;;-1:-1:-1;44102:12:0;;-1:-1:-1;44149:17:0;;-1:-1:-1;44200:16:0;-1:-1:-1;44245:10:0;-1:-1:-1;44280:14:0;;44276:271;;;44384:13;;44371:9;44342:39;;;;:28;:39;;;;;;:55;;44384:13;44342:55;:::i;:::-;44323:15;:74;;44315:134;;;;-1:-1:-1;;;44315:134:0;;25944:2:1;44315:134:0;;;25926:21:1;25983:2;25963:18;;;25956:30;-1:-1:-1;;;26002:18:1;;;25995:52;26064:18;;44315:134:0;25742:346:1;44315:134:0;44497:9;44468:39;;;;:28;:39;;;;;44510:15;44468:57;;44011:1411;;;44574:8;44570:852;;;44616:13;;44659:11;;44705:16;;44755:15;;44799:9;;44833:14;;44616:13;;-1:-1:-1;44659:11:0;;-1:-1:-1;44705:16:0;;-1:-1:-1;44755:15:0;-1:-1:-1;44799:9:0;-1:-1:-1;44833:14:0;;44829:369;;;44891:11;;:15;;44905:1;44891:15;:::i;:::-;44876:12;:30;44868:60;;;;-1:-1:-1;;;44868:60:0;;26295:2:1;44868:60:0;;;26277:21:1;26334:2;26314:18;;;26307:30;-1:-1:-1;;;26353:18:1;;;26346:48;26411:18;;44868:60:0;26093:342:1;44868:60:0;44970:13;;44955:11;:28;;44947:64;;;;-1:-1:-1;;;44947:64:0;;26642:2:1;44947:64:0;;;26624:21:1;26681:2;26661:18;;;26654:30;26720:26;26700:18;;;26693:54;26764:18;;44947:64:0;26440:348:1;44947:64:0;45063:9;45038:35;;;;:24;:35;;;;;;45077:12;45038:51;;45030:83;;;;-1:-1:-1;;;45030:83:0;;26995:2:1;45030:83:0;;;26977:21:1;27034:2;27014:18;;;27007:30;-1:-1:-1;;;27053:18:1;;;27046:50;27113:18;;45030:83:0;26793:344:1;45030:83:0;45157:9;45132:35;;;;:24;:35;;;;;45170:12;45132:50;;44829:369;45226:32;45261:13;45271:2;45261:9;:13::i;:::-;45334:9;;45226:48;;-1:-1:-1;45297:33:0;45324:6;45226:48;45297:33;:::i;:::-;:46;;45289:117;;;;-1:-1:-1;;;45289:117:0;;27344:2:1;45289:117:0;;;27326:21:1;27383:2;27363:18;;;27356:30;27422:34;27402:18;;;27395:62;-1:-1:-1;;;27473:18:1;;;27466:34;27517:19;;45289:117:0;27142:400:1;45289:117:0;44584:838;44570:852;45438:17;45458:72;45522:7;45491:28;45506:13;45491:12;:28;:::i;:::-;:38;;;;:::i;:::-;45458:10;;:32;:72::i;:::-;45438:92;;45547:28;45578:24;45596:4;45578:9;:24::i;:::-;45658:18;;45547:55;;-1:-1:-1;45634:42:0;;;;;;;45697:43;;-1:-1:-1;;;;;;45709:31:0;;;;;;:25;:31;;;;;;;;45708:32;45697:43;45693:1251;;;45761:8;:15;;-1:-1:-1;;;;45761:15:0;-1:-1:-1;;;45761:15:0;;;45801:21;;45761:15;45801:21;:41;;;;;45841:1;45826:12;:16;45801:41;:61;;;;;45861:1;45846:12;;:16;45801:61;45797:903;;;45887:20;45910:25;45924:10;;45910:9;;:13;;:25;;;;:::i;:::-;45887:48;;45958:24;45985:105;46077:12;45985:61;46036:9;;45985:20;:50;;:61;;;;:::i;:105::-;45958:132;;46113:22;46138:106;46231:12;46138:62;46189:10;;46138:20;:50;;:62;;;;:::i;:106::-;46113:131;;46269:21;46293:104;46384:12;;46293:60;46340:12;46293:16;:46;;:60;;;;:::i;:104::-;46269:128;;46422:22;46447:103;46536:13;;46447:58;46492:12;46447:14;:44;;:58;;;;:::i;:103::-;46422:128;-1:-1:-1;46575:18:0;46596:33;46422:128;46615:13;46596:18;:33::i;:::-;46575:54;;46654:26;46669:10;46654:14;:26::i;:::-;45864:836;;;;;;45797:903;46720:24;46747;46765:4;46747:9;:24::i;:::-;46720:51;;46790:38;46811:16;46790:20;:38::i;:::-;-1:-1:-1;46859:1:0;46847:9;:13;;;46879:10;:14;46912:8;:16;;-1:-1:-1;;;;46912:16:0;;;45693:1251;46960:12;46975:30;47001:3;46975:21;:6;46986:9;46975:10;:21::i;:30::-;46960:45;-1:-1:-1;47020:18:0;47059:12;;47055:202;;47124:3;47101:20;:6;47112:8;47101:10;:20::i;:::-;:26;;;;:::i;:::-;47088:39;;47142;47158:4;47164;;;;;;;;;-1:-1:-1;;;;;47164:4:0;47170:10;47142:15;:39::i;:::-;47211:12;;:28;;47228:10;47211:16;:28::i;:::-;47196:12;:43;47055:202;47282:29;47293:17;47300:10;47293:4;:17;:::i;:::-;47282:6;;:10;:29::i;:::-;47273:38;;47332:9;47328:155;;;47375:10;;:20;;47390:4;47375:14;:20::i;:::-;47362:10;:33;47328:155;;;47448:9;;:19;;47462:4;47448:13;:19::i;:::-;47436:9;:31;47328:155;47499:42;47515:4;47529;47536;47499:15;:42::i;:::-;47572:16;;47609:15;;:28;;-1:-1:-1;;;;;;47609:28:0;;;;;2752:25:1;;;-1:-1:-1;;;;;47609:15:0;;;;:23;;2725:18:1;;47609:28:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;47609:28:0;;;;;;;;-1:-1:-1;;47609:28:0;;;;;;;;;;;;:::i;:::-;;;47605:452;;;47801:231;;;13539:25:1;;;13595:2;13580:18;;13573:34;;;13623:18;;;13616:34;;;13681:2;13666:18;;13659:34;;;48004:9:0;;47951:4;;47801:231;;13526:3:1;13511:19;47801:231:0;;;;;;;47638:410;;;47605:452;42996:5072;;;;;;;;42899:5169;48080:33;48096:4;48102:2;48106:6;48080:15;:33::i;:::-;48124:15;;-1:-1:-1;;;;;48124:15:0;:26;48151:4;48157:23;48151:4;48157:17;:23::i;:::-;48124:57;;-1:-1:-1;;;;;;48124:57:0;;;;;;;-1:-1:-1;;;;;11770:32:1;;;48124:57:0;;;11752:51:1;11819:18;;;11812:34;11725:18;;48124:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;48192:15:0;;-1:-1:-1;;;;;48192:15:0;;-1:-1:-1;48192:26:0;;-1:-1:-1;48219:2:0;48223:21;48219:2;48223:17;:21::i;:::-;48192:53;;-1:-1:-1;;;;;;48192:53:0;;;;;;;-1:-1:-1;;;;;11770:32:1;;;48192:53:0;;;11752:51:1;11819:18;;;11812:34;11725:18;;48192:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42346:5907;;;;;42233:6020;;;:::o;11325:226::-;11445:7;11481:12;11473:6;;;;11465:29;;;;-1:-1:-1;;;11465:29:0;;;;;;;;:::i;:::-;-1:-1:-1;11505:9:0;11517:5;11521:1;11517;:5;:::i;:::-;11505:17;11325:226;-1:-1:-1;;;;;11325:226:0:o;36794:280::-;-1:-1:-1;;;;;36877:31:0;;;;;;:25;:31;;;;;:39;;-1:-1:-1;;36877:39:0;;;;;;;;;;;;36929:80;;36955:15;;:42;;-1:-1:-1;;;36955:42:0;;-1:-1:-1;;;;;178:32:1;;;36955:42:0;;;160:51:1;36955:15:0;;;;:36;;133:18:1;;36955:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36929:80;37026:40;;;;;;-1:-1:-1;;;;;37026:40:0;;;;;;;;36794:280;;:::o;48261:289::-;48367:14;;48327:7;;-1:-1:-1;;;48367:14:0;;;;:175;;48524:18;48534:7;48524:9;:18::i;:::-;48367:175;;;-1:-1:-1;;;;;48424:21:0;;;;;;:12;:21;;;;;;48401:103;;48482:3;;48401:54;;48424:30;;48482:3;48424:25;:30::i;:::-;48401:18;48411:7;48401:9;:18::i;11957:312::-;12077:7;12112:12;12105:5;12097:28;;;;-1:-1:-1;;;12097:28:0;;;;;;;;:::i;:::-;-1:-1:-1;12136:9:0;12148:5;12152:1;12148;:5;:::i;49046:499::-;49136:16;;;49150:1;49136:16;;;;;;;;49112:21;;49136:16;;;;;;;;;;-1:-1:-1;49136:16:0;49112:40;;49181:4;49163;49168:1;49163:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;49163:23:0;;;:7;;;;;;;;;;:23;;;;49207:15;;:22;;;-1:-1:-1;;;49207:22:0;;;;:15;;;;;:20;;:22;;;;;49163:7;;49207:22;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;49197:4;49202:1;49197:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;49197:32:0;;;:7;;;;;;;;;:32;49272:15;;49240:62;;49257:4;;49272:15;49290:11;49240:8;:62::i;:::-;49313:15;;:224;;-1:-1:-1;;;49313:224:0;;-1:-1:-1;;;;;49313:15:0;;;;:66;;:224;;49394:11;;49313:15;;49464:4;;49491;;49511:15;;49313:224;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48558:480;48617:12;48632:13;:6;48643:1;48632:10;:13::i;:::-;48617:28;-1:-1:-1;48656:17:0;48676:16;:6;48617:28;48676:10;:16::i;:::-;48656:36;-1:-1:-1;48728:21:0;48760:22;48777:4;48760:16;:22::i;:::-;48863:18;48884:41;:21;48910:14;48884:25;:41::i;:::-;48863:62;;48936:35;48949:9;48960:10;48936:12;:35::i;:::-;48987:43;;;28867:25:1;;;28923:2;28908:18;;28901:34;;;28951:18;;;28944:34;;;48987:43:0;;28855:2:1;28840:18;48987:43:0;;;;;;;48606:432;;;;48558:480;:::o;50215:513::-;50395:15;;50363:62;;50380:4;;-1:-1:-1;;;;;50395:15:0;50413:11;50363:8;:62::i;:::-;50468:15;;-1:-1:-1;;;;;50468:15:0;:31;50507:9;50540:4;50560:11;50468:15;;50672:7;13031:6;;-1:-1:-1;;;;;13031:6:0;;12966:79;50672:7;50468:252;;;;;;-1:-1:-1;;;;;;50468:252:0;;;-1:-1:-1;;;;;29348:15:1;;;50468:252:0;;;29330:34:1;29380:18;;;29373:34;;;;29423:18;;;29416:34;;;;29466:18;;;29459:34;29530:15;;;29509:19;;;29502:44;50694:15:0;29562:19:1;;;29555:35;29264:19;;50468: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;2118:248::-;2186:6;2194;2247:2;2235:9;2226:7;2222:23;2218:32;2215:52;;;2263:1;2260;2253:12;2215:52;-1:-1:-1;;2286:23:1;;;2356:2;2341:18;;;2328:32;;-1:-1:-1;2118:248:1:o;2788:127::-;2849:10;2844:3;2840:20;2837:1;2830:31;2880:4;2877:1;2870:15;2904:4;2901:1;2894:15;2920:275;2991:2;2985:9;3056:2;3037:13;;-1:-1:-1;;3033:27:1;3021:40;;3091:18;3076:34;;3112:22;;;3073:62;3070:88;;;3138:18;;:::i;:::-;3174:2;3167:22;2920:275;;-1:-1:-1;2920:275:1:o;3200:183::-;3260:4;3293:18;3285:6;3282:30;3279:56;;;3315:18;;:::i;:::-;-1:-1:-1;3360:1:1;3356:14;3372:4;3352:25;;3200:183::o;3388:662::-;3442:5;3495:3;3488:4;3480:6;3476:17;3472:27;3462:55;;3513:1;3510;3503:12;3462:55;3549:6;3536:20;3575:4;3599:60;3615:43;3655:2;3615:43;:::i;:::-;3599:60;:::i;:::-;3693:15;;;3779:1;3775:10;;;;3763:23;;3759:32;;;3724:12;;;;3803:15;;;3800:35;;;3831:1;3828;3821:12;3800:35;3867:2;3859:6;3855:15;3879:142;3895:6;3890:3;3887:15;3879:142;;;3961:17;;3949:30;;3999:12;;;;3912;;3879:142;;;-1:-1:-1;4039:5:1;3388:662;-1:-1:-1;;;;;;3388:662:1:o;4055:1215::-;4173:6;4181;4234:2;4222:9;4213:7;4209:23;4205:32;4202:52;;;4250:1;4247;4240:12;4202:52;4290:9;4277:23;4319:18;4360:2;4352:6;4349:14;4346:34;;;4376:1;4373;4366:12;4346:34;4414:6;4403:9;4399:22;4389:32;;4459:7;4452:4;4448:2;4444:13;4440:27;4430:55;;4481:1;4478;4471:12;4430:55;4517:2;4504:16;4539:4;4563:60;4579:43;4619:2;4579:43;:::i;4563:60::-;4657:15;;;4739:1;4735:10;;;;4727:19;;4723:28;;;4688:12;;;;4763:19;;;4760:39;;;4795:1;4792;4785:12;4760:39;4819:11;;;;4839:217;4855:6;4850:3;4847:15;4839:217;;;4935:3;4922:17;4952:31;4977:5;4952:31;:::i;:::-;4996:18;;4872:12;;;;5034;;;;4839:217;;;5075:5;-1:-1:-1;;5118:18:1;;5105:32;;-1:-1:-1;;5149:16:1;;;5146:36;;;5178:1;5175;5168:12;5146:36;;5201:63;5256:7;5245:8;5234:9;5230:24;5201:63;:::i;:::-;5191:73;;;4055:1215;;;;;:::o;5275:456::-;5352:6;5360;5368;5421:2;5409:9;5400:7;5396:23;5392:32;5389:52;;;5437:1;5434;5427:12;5389:52;5476:9;5463:23;5495:31;5520:5;5495:31;:::i;:::-;5545:5;-1:-1:-1;5602:2:1;5587:18;;5574:32;5615:33;5574:32;5615:33;:::i;:::-;5275:456;;5667:7;;-1:-1:-1;;;5721:2:1;5706:18;;;;5693:32;;5275:456::o;6177:241::-;6233:6;6286:2;6274:9;6265:7;6261:23;6257:32;6254:52;;;6302:1;6299;6292:12;6254:52;6341:9;6328:23;6360:28;6382:5;6360:28;:::i;6423:247::-;6482:6;6535:2;6523:9;6514:7;6510:23;6506:32;6503:52;;;6551:1;6548;6541:12;6503:52;6590:9;6577:23;6609:31;6634:5;6609:31;:::i;6899:799::-;7039:6;7047;7055;7063;7071;7079;7087;7095;7103;7111;7164:3;7152:9;7143:7;7139:23;7135:33;7132:53;;;7181:1;7178;7171:12;7132:53;-1:-1:-1;;7204:23:1;;;7274:2;7259:18;;7246:32;;-1:-1:-1;7325:2:1;7310:18;;7297:32;;7376:2;7361:18;;7348:32;;-1:-1:-1;7427:3:1;7412:19;;7399:33;;-1:-1:-1;7479:3:1;7464:19;;7451:33;;-1:-1:-1;7531:3:1;7516:19;;7503:33;;-1:-1:-1;7583:3:1;7568:19;;7555:33;;-1:-1:-1;7635:3:1;7620:19;;7607:33;;-1:-1:-1;7687:3:1;7672:19;7659:33;;-1:-1:-1;6899:799:1;-1:-1:-1;6899:799:1:o;8518:388::-;8586:6;8594;8647:2;8635:9;8626:7;8622:23;8618:32;8615:52;;;8663:1;8660;8653:12;8615:52;8702:9;8689:23;8721:31;8746:5;8721:31;:::i;:::-;8771:5;-1:-1:-1;8828:2:1;8813:18;;8800:32;8841:33;8800:32;8841:33;:::i;8911:356::-;9113:2;9095:21;;;9132:18;;;9125:30;9191:34;9186:2;9171:18;;9164:62;9258:2;9243:18;;8911:356::o;9272:127::-;9333:10;9328:3;9324:20;9321:1;9314:31;9364:4;9361:1;9354:15;9388:4;9385:1;9378:15;9404:168;9477:9;;;9508;;9525:15;;;9519:22;;9505:37;9495:71;;9546:18;;:::i;9577:380::-;9656:1;9652:12;;;;9699;;;9720:61;;9774:4;9766:6;9762:17;9752:27;;9720:61;9827:2;9819:6;9816:14;9796:18;9793:38;9790:161;;9873:10;9868:3;9864:20;9861:1;9854:31;9908:4;9905:1;9898:15;9936:4;9933:1;9926:15;9790:161;;9577:380;;;:::o;11438:127::-;11499:10;11494:3;11490:20;11487:1;11480:31;11530:4;11527:1;11520:15;11554:4;11551:1;11544:15;11857:135;11896:3;11917:17;;;11914:43;;11937:18;;:::i;:::-;-1:-1:-1;11984:1:1;11973:13;;11857:135::o;11997:251::-;12067:6;12120:2;12108:9;12099:7;12095:23;12091:32;12088:52;;;12136:1;12133;12126:12;12088:52;12168:9;12162:16;12187:31;12212:5;12187:31;:::i;12253:184::-;12323:6;12376:2;12364:9;12355:7;12351:23;12347:32;12344:52;;;12392:1;12389;12382:12;12344:52;-1:-1:-1;12415:16:1;;12253:184;-1:-1:-1;12253:184:1:o;12747:245::-;12814:6;12867:2;12855:9;12846:7;12842:23;12838:32;12835:52;;;12883:1;12880;12873:12;12835:52;12915:9;12909:16;12934:28;12956:5;12934:28;:::i;12997:306::-;13085:6;13093;13101;13154:2;13142:9;13133:7;13129:23;13125:32;13122:52;;;13170:1;13167;13160:12;13122:52;13199:9;13193:16;13183:26;;13249:2;13238:9;13234:18;13228:25;13218:35;;13293:2;13282:9;13278:18;13272:25;13262:35;;12997:306;;;;;:::o;16977:557::-;17090:6;17098;17106;17114;17122;17130;17183:3;17171:9;17162:7;17158:23;17154:33;17151:53;;;17200:1;17197;17190:12;17151:53;17232:9;17226:16;17251:31;17276:5;17251:31;:::i;:::-;17346:2;17331:18;;17325:25;17390:2;17375:18;;17369:25;17434:2;17419:18;;17413:25;17478:3;17463:19;;17457:26;17523:3;17508:19;;;17502:26;17301:5;;17325:25;;-1:-1:-1;17369:25:1;;17413;;-1:-1:-1;17457:26:1;-1:-1:-1;17502:26:1;;-1:-1:-1;16977:557:1;-1:-1:-1;;;16977:557:1:o;18765:175::-;18802:3;18846:4;18839:5;18835:16;18875:4;18866:7;18863:17;18860:43;;18883:18;;:::i;:::-;18932:1;18919:15;;18765:175;-1:-1:-1;;18765:175:1:o;20515:125::-;20580:9;;;20601:10;;;20598:36;;;20614:18;;:::i;21469:217::-;21509:1;21535;21525:132;;21579:10;21574:3;21570:20;21567:1;21560:31;21614:4;21611:1;21604:15;21642:4;21639:1;21632:15;21525:132;-1:-1:-1;21671:9:1;;21469:217::o;24213:401::-;24415:2;24397:21;;;24454:2;24434:18;;;24427:30;24493:34;24488:2;24473:18;;24466:62;-1:-1:-1;;;24559:2:1;24544:18;;24537:35;24604:3;24589:19;;24213:401::o;24619:399::-;24821:2;24803:21;;;24860:2;24840:18;;;24833:30;24899:34;24894:2;24879:18;;24872:62;-1:-1:-1;;;24965:2:1;24950:18;;24943:33;25008:3;24993:19;;24619:399::o;27547:128::-;27614:9;;;27635:11;;;27632:37;;;27649:18;;:::i;27680:980::-;27942:4;27990:3;27979:9;27975:19;28021:6;28010:9;28003:25;28047:2;28085:6;28080:2;28069:9;28065:18;28058:34;28128:3;28123:2;28112:9;28108:18;28101:31;28152:6;28187;28181:13;28218:6;28210;28203:22;28256:3;28245:9;28241:19;28234:26;;28295:2;28287:6;28283:15;28269:29;;28316:1;28326:195;28340:6;28337:1;28334:13;28326:195;;;28405:13;;-1:-1:-1;;;;;28401:39:1;28389:52;;28496:15;;;;28461:12;;;;28437:1;28355:9;28326:195;;;-1:-1:-1;;;;;;;28577:32:1;;;;28572:2;28557:18;;28550:60;-1:-1:-1;;;28641:3:1;28626:19;28619:35;28538:3;27680:980;-1:-1:-1;;;27680:980:1:o

Swarm Source

ipfs://4f5b4f82e7d8a0e632247725d3ab9bce9b18bb3d45c6bf3a5b17763b71d712eb
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.