ETH Price: $3,877.65 (+7.45%)

Token

MoonVault (VAULT)
 

Overview

Max Total Supply

932,340,990.033986891497809169 VAULT

Holders

548

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Filtered by Token Holder
Uniswap: Universal Router
Balance
0.000000000000000001 VAULT

Value
$0.00
0x3fc91a3afd70395cd496c647d5a6cc9d4b2b7fad
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

$VAULT is a hybrid rewards coin that offers access to an expansive MoonVault ecosystem, delivering a user experience designed to take holders on an immersive journey due to its completely customized and unique technology.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
Vault

Compiler Version
v0.8.16+commit.07a7930e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2024-10-15
*/

// SPDX-License-Identifier: MIT
//  __      __       .__                                  __              _____                     ____   ____            .__   __
// /  \    /  \ ____ |  |   ____  ____   _____   ____   _/  |_  ____     /     \   ____   ____   ___\   \ /   /____   __ __|  |_/  |_
// \   \/\/   // __ \|  | _/ ___\/  _ \ /     \_/ __ \  \   __\/  _ \   /  \ /  \ /  _ \ /  _ \ /    \   Y   /\__  \ |  |  \  |\   __\
//  \        /\  ___/|  |_\  \__(  <_> )  Y Y  \  ___/   |  | (  <_> ) /    Y    (  <_> |  <_> )   |  \     /  / __ \|  |  /  |_|  |
//   \__/\  /  \___  >____/\___  >____/|__|_|  /\___  >  |__|  \____/  \____|__  /\____/ \____/|___|  /\___/  (____  /____/|____/__|
//        \/       \/          \/            \/     \/                         \/                   \/             \/
//        /\
//       /  \
//      /____\
//     /\    /\
//    /  \  /  \
//   /____\/____\
//   \    /\    /
//    \  /  \  /
//     \/____\/
// https://MoonVault.io
//
// MoonVault is a comprehensive blockchain platform, driven by the $VAULT Token.
//
// $VAULT & the S.T.A.R.R. Engine:
//
// Powered by S.T.A.R.R. (Self-Triggered Automatic Regeneration and Redistribution),
// $VAULT delivers dynamic tokenomics based on randomized blockchain data.
// On each transfer, the S.T.A.R.R. Engine rotates to deliver a combination of auto-buybacks with $VAULT reflections,
// decentralized liquidity infusions with non-dilutive LP rewards, token burns, and direct rewards in $ETH.
//
// The S.T.A.R.R. Engine ensures balanced distribution and gas efficiency while optimizing
// transaction cost-effectiveness for users through dynamic rotating functionality.
//
// Decentralized Liquidity Infusions:
// Initial liquidity for $VAULT is burned; no new LP tokens are made during infusions. These infusions auto-grow the liquidity
// pool in a fully decentralized manner while mitigating visible sells, lowering price impact, and providing
// direct non-dilutive LP rewards.
//
// Dual Rewards & Buyback Mechanism:
// Transfer Fees convert to $ETH on Sell Transactions. The S.T.A.R.R. Engine rotates rewards between buying back $VAULT and reflecting it to holders
// or distributing $WETH dividends. Claiming rewards is allowed every 15 minutes since last claim, and rewards claim automatically on buy, sell, or transfer. 
//
// Automated Burns:
// $VAULT's deflationary mechanism continuously reduces the total supply, balancing price fluctuations from
// token reserves added during liquidity infusions. This produces growing liquidity with a diminishing supply,
// creating increasingly resilient depth alongside appreciating price.
//
// MoonVault was conceived as an homage to both the fallen giants of the past and the bright stars of the future,
// whose light we've yet to see. The $VAULT token is designed to foster decentralized engagement that transcends borders,
// and MoonVault serves as a way station for fellow space travelers to connect and safely plot their course to the stars.
//
// We invite you to join a voyage through the evolving landscape of the new digital economy and find kinship
// among those who believe the Moon is not the final destination, but rather the beginning of the journey.


pragma solidity ^0.8.16;

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

    function totalSupply() external view returns (uint256);

    function balanceOf(address account) external view returns (uint256);

    function transfer(address to, uint256 amount) external returns (bool);

    function allowance(address owner, address spender)
        external
        view
        returns (uint256);

    function approve(address spender, uint256 amount) external returns (bool);

    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) external returns (bool);
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        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) {
        require(b != -1 || a != MIN_INT256);

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

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

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

abstract contract Ownable is Context {
    address private _owner;

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

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

    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

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

    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant NOT_ENTERED = 1;
    uint256 private constant ENTERED = 2;

    uint256 private _status;

    /**
     * @dev Unauthorized reentrant call.
     */
    error ReentrancyGuardReentrantCall();

    constructor() {
        _status = NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        _nonReentrantBefore();
        _;
        _nonReentrantAfter();
    }

    function _nonReentrantBefore() private {
        // On the first call to nonReentrant, _status will be NOT_ENTERED
        if (_status == ENTERED) {
            revert ReentrancyGuardReentrantCall();
        }

        // Any calls to nonReentrant after this point will fail
        _status = ENTERED;
    }

    function _nonReentrantAfter() private {
        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = NOT_ENTERED;
    }

    /**
     * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a
     * `nonReentrant` function in the call stack.
     */
    function _reentrancyGuardEntered() internal view returns (bool) {
        return _status == ENTERED;
    }
}

contract ERC20 is Context, IERC20Metadata {
    mapping(address => uint256) internal _balances;

    mapping(address => mapping(address => uint256)) internal _allowances;

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

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

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

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

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

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

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

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

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

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

    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public virtual override returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, amount);
        _transfer(from, to, amount);
        return true;
    }

    function increaseAllowance(address spender, uint256 addedValue)
        public
        virtual
        returns (bool)
    {
        address owner = _msgSender();
        _approve(owner, spender, allowance(owner, spender) + addedValue);
        return true;
    }

    function decreaseAllowance(address spender, uint256 subtractedValue)
        public
        virtual
        returns (bool)
    {
        address owner = _msgSender();
        uint256 currentAllowance = allowance(owner, spender);
        require(
            currentAllowance >= subtractedValue,
            "ERC20: decreased allowance below zero"
        );
        unchecked {
            _approve(owner, spender, currentAllowance - subtractedValue);
        }

        return true;
    }

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

        _beforeTokenTransfer(from, to, amount);

        uint256 fromBalance = _balances[from];
        require(
            fromBalance >= amount,
            "ERC20: transfer amount exceeds balance"
        );
        unchecked {
            _balances[from] = fromBalance - amount;
            _balances[to] += amount;
        }

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, amount);
    }

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

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

        _totalSupply += amount;
        unchecked {
            _balances[account] += amount;
        }
        emit Transfer(address(0), account, amount);

        _afterTokenTransfer(address(0), account, amount);
    }

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

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

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
            _totalSupply -= amount;
        }

        emit Transfer(account, address(0), amount);

        _afterTokenTransfer(account, address(0), amount);
    }

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

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

    function _spendAllowance(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance != type(uint256).max) {
            require(
                currentAllowance >= amount,
                "ERC20: insufficient allowance"
            );
            unchecked {
                _approve(owner, spender, currentAllowance - amount);
            }
        }
    }

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

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

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

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

    function withdraw(uint256) external;
}

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

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

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

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

    function distributeDividends() external payable;

    function withdrawDividend(address _rewardToken) external;

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

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

    uint256 internal constant magnitude = 2**128;

    mapping(address => uint256) internal magnifiedDividendPerShare;
    address[] public rewardTokens;
    address public nextRewardToken;
    uint256 public rewardTokenCounter;

    address public WETHAddress = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2;
    address public tokenAddress;
    IWETH private wethObj = IWETH(WETHAddress);

    IUniswapV2Router02 public immutable uniswapV2Router;

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

    mapping(address => uint256) public holderBalance;
    uint256 public totalBalance;

    mapping(address => uint256) public totalDividendsDistributed;

    event BuyBack(
        address indexed sender,
        uint256 amountSent,
        uint256 amountReceived
    );

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

        rewardTokens.push(WETHAddress);

        nextRewardToken = rewardTokens[0];
    }

    receive() external payable {
        distributeDividends();
    }

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

        if (nextRewardToken == WETHAddress) {
            uint256 amount = msg.value;
            wethObj.deposit{value: amount}();
            if (amount > 0) {
                magnifiedDividendPerShare[
                    nextRewardToken
                ] = magnifiedDividendPerShare[nextRewardToken].add(
                    (amount).mul(magnitude) / totalBalance
                );
            }

            emit DividendsDistributed(msg.sender, amount, nextRewardToken);
            totalDividendsDistributed[
                nextRewardToken
            ] = totalDividendsDistributed[nextRewardToken].add(amount);
        } else if (nextRewardToken == tokenAddress) {
            uint256 initialBalance = IERC20(nextRewardToken).balanceOf(
                address(this)
            );
            buyTokens(msg.value, nextRewardToken);
            uint256 newBalance = IERC20(nextRewardToken)
                .balanceOf(address(this))
                .sub(initialBalance);
            emit BuyBack(msg.sender, msg.value, newBalance);

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

                totalDividendsDistributed[
                    nextRewardToken
                ] = totalDividendsDistributed[nextRewardToken].add(newBalance);
            }
        }

        rewardTokenCounter = rewardTokenCounter == rewardTokens.length - 1
            ? 0
            : rewardTokenCounter + 1;
        nextRewardToken = rewardTokens[rewardTokenCounter];
    }

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

        uniswapV2Router.swapExactETHForTokensSupportingFeeOnTransferTokens{
            value: amountInWei
        }(0, path, address(this), block.timestamp + 3600);
    }

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

    function _withdrawDividendOfUser(address payable user, address _rewardToken)
        internal
        returns (uint256)
    {
        uint256 _withdrawableDividend = withdrawableDividendOf(
            user,
            _rewardToken
        );
        if (_withdrawableDividend > 0) {
            withdrawnDividends[user][_rewardToken] = withdrawnDividends[user][
                _rewardToken
            ].add(_withdrawableDividend);
            emit DividendWithdrawn(user, _withdrawableDividend);
            IERC20(_rewardToken).transfer(user, _withdrawableDividend);
            return _withdrawableDividend;
        }

        return 0;
    }

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

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

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

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

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

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

    function _setBalance(address account, uint256 newBalance) internal {
        uint256 currentBalance = holderBalance[account];
        holderBalance[account] = newBalance;
        if (newBalance > currentBalance) {
            uint256 increaseAmount = newBalance.sub(currentBalance);
            _increase(account, increaseAmount);
            totalBalance += increaseAmount;
        } else if (newBalance < currentBalance) {
            uint256 reduceAmount = currentBalance.sub(newBalance);
            _reduce(account, reduceAmount);
            totalBalance -= reduceAmount;
        }
    }
}

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

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

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

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

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

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

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

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

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

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

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

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

    Map private tokenHoldersMap;
    uint256 public lastProcessedIndex;

    mapping(address => bool) public excludedFromDividends;

    mapping(address => uint256) public lastClaimTimes;

    uint256 public claimWait;
    uint256 public immutable minimumTokenBalanceForDividends;

    event ExcludeFromDividends(address indexed account);
    event IncludeInDividends(address indexed account);
    event ClaimWaitUpdated(uint256 indexed newValue, uint256 indexed oldValue);

    event Claim(
        address indexed account,
        uint256 amount,
        bool indexed automatic
    );

    constructor() {
        claimWait = 900;
        minimumTokenBalanceForDividends = 1000 * (10**18);
    }

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

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

        emit ExcludeFromDividends(account);
    }

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

        emit IncludeInDividends(account);
    }

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

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

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

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

        index = getIndexOfKey(account);

        iterationsUntilProcessed = -1;

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

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

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

        lastClaimTime = lastClaimTimes[account];

        nextClaimTime = lastClaimTime > 0 ? lastClaimTime.add(claimWait) : 0;

        secondsUntilAutoClaimAvailable = nextClaimTime > block.timestamp
            ? nextClaimTime.sub(block.timestamp)
            : 0;
    }

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

        address account = getKeyAtIndex(index);

        return getAccount(account, _rewardToken);
    }

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

        return block.timestamp.sub(lastClaimTime) >= claimWait;
    }

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

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

        processAccount(account, true);
    }

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

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

        uint256 _lastProcessedIndex = lastProcessedIndex;

        uint256 gasUsed = 0;

        uint256 gasLeft = gasleft();

        uint256 iterations = 0;
        uint256 claims = 0;

        while (gasUsed < gas && iterations < numberOfTokenHolders) {
            _lastProcessedIndex++;

            if (_lastProcessedIndex >= tokenHoldersMap.keys.length) {
                _lastProcessedIndex = 0;
            }

            address account = tokenHoldersMap.keys[_lastProcessedIndex];

            if (canAutoClaim(lastClaimTimes[account])) {
                if (processAccount(payable(account), true)) {
                    claims++;
                }
            }

            iterations++;

            uint256 newGasLeft = gasleft();

            if (gasLeft > newGasLeft) {
                gasUsed = gasUsed.add(gasLeft.sub(newGasLeft));
            }
            gasLeft = newGasLeft;
        }

        lastProcessedIndex = _lastProcessedIndex;

        return (iterations, claims, lastProcessedIndex);
    }

    function processAccount(address payable account, bool automatic)
        public
        onlyOwner
        returns (bool)
    {
        uint256 amount;
        bool paid;
        for (uint256 i; i < rewardTokens.length; i++) {
            amount = _withdrawDividendOfUser(account, rewardTokens[i]);
            if (amount > 0) {
                lastClaimTimes[account] = block.timestamp;
                emit Claim(account, amount, automatic);
                paid = true;
            }
        }
        return paid;
    }

    function addRewardToken(address addr) public onlyOwner {
        rewardTokens.push(addr);
        tokenAddress = addr;
    }
}

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

    address payable public marketing;
    address payable public development;
    address public vaultManager;
    address public vaultKeeper;
    address public vaultHelper;

    modifier onlyVaultManager() {
        require(
            msg.sender == vaultManager,
            "Not authorized: Vault Manager only"
        );
        _;
    }

    uint256 public constant MAX_SUPPLY = 1_000_000_000 * 10**18;

    uint256 public maxWalletLimit;
    uint256 public maxTxLimit;

    uint256 public buyTax;
    uint256 public sellTax;
    /**
     * @dev Means x% of the tax goes to S.T.A.R.R. Functionality
     */
    uint256 public taxDivisionPercentageForSTARR;

    uint256 public maxSwapbacksPerBlock = 2;
    uint256 private lastSwapBlock = 0;
    uint256 private swapbackCount = 0;
    uint256 private firstBlock = 0;

    bool public tradingActive;
    bool public swapEnabled;
    bool public isManagerSet = false;
    bool private swapping;
    bool private swapbackOccurred;

    enum SwapBackType {
        None,
        Dividends,
        Project
    }

    SwapBackType private lastSwapBackType;

    uint256 public totalBurned;
    uint256 public totalInfuseLPAdded;
    uint256 public totalDividend;
    uint256 public totalProjectAmount;

    uint256 public thresholdSwap;
    uint256 public tradingStartBlock;

    uint256 public swapableDividend;
    uint256 public swapableProjectAmount;

    DividendTracker public dividendTracker;
    IUniswapV2Router02 public dexRouter;
    address public lpPair;

    mapping(uint256 => uint256) private perBuyCount;
    mapping(address => bool) public lpPairs;
    mapping(address => bool) private _isExcludedFromTax;
    mapping(address => bool) private _botsBlacklist;

    event BurnToken(address indexed sender, uint256 amount);
    event infuseLPadded(
        address indexed from,
        address indexed to,
        uint256 value
    );
    event burned(address indexed from, address indexed to, uint256 value);
    event dividend(address indexed from, address indexed to, uint256 value);
    event AddedDividend(uint256 amount);
    event buyTaxStatus(uint256 previousBuyTax, uint256 newBuyTax);
    event sellTaxStatus(uint256 previousSellTax, uint256 newSellTax);
    event TaxDivisionPercentageForSTARR(
        uint256 previousPercentage,
        uint256 newPercentage
    );
    event GasForProcessingUpdated(
        uint256 indexed newValue,
        uint256 indexed oldValue
    );
    event ProcessedDividendTracker(
        uint256 iterations,
        uint256 claims,
        uint256 lastProcessedIndex,
        bool indexed automatic,
        uint256 gas,
        address indexed processor
    );

    constructor() ERC20("MoonVault", "VAULT") {
        development = payable(0x8a5bb15816E96594f5D88c23Ba7F8B344601B40E);
        marketing = payable(0x362340cA11596eB37ed29fc2b3845025efC2134D);
        vaultManager = msg.sender;

        _mint(address(this), ((MAX_SUPPLY * 95) / 100));
        _mint(development, ((MAX_SUPPLY * 5) / 100));

        sellTax = 5;
        buyTax = 5;
        taxDivisionPercentageForSTARR = 60;

        maxTxLimit = (MAX_SUPPLY * 3) / 200; // 1.5% of Supply
        maxWalletLimit = (MAX_SUPPLY * 2) / 100; // 2% of Supply
        thresholdSwap = (MAX_SUPPLY * 5) / 10000; // 0.05% of Supply

        dexRouter = IUniswapV2Router02(
            0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D
        );
        lpPair = IUniswapV2Factory(dexRouter.factory()).createPair(
            address(this),
            dexRouter.WETH()
        );
        lpPairs[lpPair] = true;

        dividendTracker = new DividendTracker();
        dividendTracker.addRewardToken(address(this));
        dividendTracker.setBalance(
            payable(development),
            ((MAX_SUPPLY * 5) / 100)
        );

        _approve(owner(), address(dexRouter), type(uint256).max);
        _approve(address(this), address(dexRouter), type(uint256).max);

        _isExcludedFromTax[owner()] = true;
        _isExcludedFromTax[address(this)] = true;
        _isExcludedFromTax[address(dividendTracker)] = true;

        dividendTracker.excludeFromDividends(address(dividendTracker));
        dividendTracker.excludeFromDividends(address(this));
        dividendTracker.excludeFromDividends(owner());
        dividendTracker.excludeFromDividends(lpPair);

        lastSwapBackType = SwapBackType.None;
        lastSwapBlock = 0;
    }

    receive() external payable {}

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal override {
        require(from != address(0), "VAULT: transfer from the zero address");
        require(to != address(0), "VAULT: transfer to the zero address");
        require(!isBot(from) && !isBot(to), "VAULT: Bot Address cannot trade");

        if (amount == 0) {
            super._transfer(from, to, 0);
            return;
        }

        if (block.number == firstBlock && lpPairs[from]) {
            require(
                perBuyCount[block.number] < 51,
                "VAULT: Exceeds buys allowed in the first block."
            );
            perBuyCount[block.number]++;
        }

        if (!tradingActive) {
            require(
                _isExcludedFromTax[from] || _isExcludedFromTax[to],
                "VAULT: Trading is not active yet."
            );
        }

        bool canSwap = (swapableDividend >= thresholdSwap ||
            swapableProjectAmount >= thresholdSwap);

        if (
            canSwap &&
            swapEnabled &&
            !swapping &&
            !lpPairs[from] &&
            !_isExcludedFromTax[from] &&
            !_isExcludedFromTax[to]
        ) {
            if (block.number > lastSwapBlock) {
                // A new block has started, so reset the swap counter
                lastSwapBlock = block.number;
                swapbackCount = 0;
            } // Ensure we haven't exceeded the max allowed swaps in this block
            if (swapbackCount < maxSwapbacksPerBlock) {
                swapping = true;

                // Rotate Swaps
                if (
                    lastSwapBackType == SwapBackType.None ||
                    lastSwapBackType == SwapBackType.Dividends
                ) {
                    if (swapableProjectAmount >= thresholdSwap) {
                        swapBackProject();
                        lastSwapBackType = SwapBackType.Project;
                    } else {
                        swapBackDividends();
                        lastSwapBackType = SwapBackType.Dividends;
                    }
                } else {
                    if (swapableDividend >= thresholdSwap) {
                        swapBackDividends();
                        lastSwapBackType = SwapBackType.Dividends;
                    } else {
                        swapBackProject();
                        lastSwapBackType = SwapBackType.Project;
                    }
                }

                lastSwapBlock = block.number;
                swapbackCount++;
                swapping = false;
            }
        }

        bool takeFee = !swapping;

        if (_isExcludedFromTax[from] || _isExcludedFromTax[to]) {
            takeFee = false;
        }

        uint256 fee = 0;

        //STARR

        if (takeFee) {
            uint256 STARR = _initiateSTARR();
            uint256 projectTax;
            uint256 remainingTax;

            if (
                (lpPairs[from] && buyTax > 0) ||
                (!lpPairs[from] && !lpPairs[to])
            ) {
                _checkMaxWalletLimit(to, amount);
                _checkMaxTxLimit(amount);

                fee = (amount.mul(buyTax)).div(100);
                (projectTax, remainingTax) = _getTaxAmount(fee);
                if (remainingTax > 0) {
                    if (STARR == 1) {
                        burn_(from, remainingTax);
                        totalBurned = totalBurned.add(remainingTax);
                        emit burned(from, to, remainingTax);
                    } else if (STARR == 2) {
                        totalInfuseLPAdded = totalInfuseLPAdded.add(
                            remainingTax
                        );
                        emit infuseLPadded(from, to, remainingTax);
                    } else if (STARR == 3) {
                        swapableDividend = swapableDividend.add(remainingTax);
                        totalDividend = totalDividend.add(remainingTax);
                        emit dividend(from, to, remainingTax);
                        super._transfer(from, address(this), remainingTax);
                    }
                }

                swapableProjectAmount = swapableProjectAmount.add(projectTax);
                totalProjectAmount = totalProjectAmount.add(projectTax);
                super._transfer(from, address(this), projectTax);
            } else if (lpPairs[to] && sellTax > 0) {
                _checkMaxTxLimit(amount);

                fee = (amount.mul(sellTax)).div(100);
                (projectTax, remainingTax) = _getTaxAmount(fee);
                if (remainingTax > 0) {
                    if (STARR == 1) {
                        burn_(from, remainingTax);
                        totalBurned = totalBurned.add(remainingTax);
                        emit burned(from, to, remainingTax);
                    } else if (STARR == 2) {
                        super._transfer(from, to, remainingTax);
                        totalInfuseLPAdded = totalInfuseLPAdded.add(
                            remainingTax
                        );
                        emit infuseLPadded(from, to, remainingTax);
                    } else if (STARR == 3) {
                        super._transfer(from, address(this), remainingTax);
                        swapableDividend = swapableDividend.add(remainingTax);
                        emit dividend(from, to, remainingTax);
                        totalDividend = totalDividend.add(remainingTax);
                    }
                }

                swapableProjectAmount = swapableProjectAmount.add(projectTax);
                totalProjectAmount = totalProjectAmount.add(projectTax);
                super._transfer(from, address(this), projectTax);
            }

            amount -= fee;
        }

        super._transfer(from, to, amount);

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

    /// @dev Burn Function
    function burn(uint256 amount) public returns (bool) {
        burn_(_msgSender(), amount);
        return true;
    }

    function burn_(address sender, uint256 amount) private {
        require(_balances[sender] >= amount, "VAULT: Invalid amount");
        _burn(sender, amount);
        emit BurnToken(sender, amount);
    }

    /// @dev Dividend Functions
    function excludeFromDividends(address account) external onlyOwner {
        dividendTracker.excludeFromDividends(account);
    }

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

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

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

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

    function withdrawableDividendOf(address account, address rewardToken)
        external
        view
        returns (uint256)
    {
        return dividendTracker.withdrawableDividendOf(account, rewardToken);
    }

    function dividendTokenBalanceOf(address account)
        external
        view
        returns (uint256)
    {
        return dividendTracker.holderBalance(account);
    }

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

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

    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 claimForBeneficiary(address beneficiary) external {
        require(beneficiary != address(0), "Invalid address");
        dividendTracker.processAccount(payable(beneficiary), false);
    }

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

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

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

    /// @notice Trading Functionalities
    function enableTrading() public onlyOwner returns (bool) {
        require(!tradingActive, "VAULT: Cannot re-enable trading");
        tradingActive = true;
        swapEnabled = true;
        firstBlock = block.number;
        return true;
    }

    function enableTradingWithPermit(
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external {
        bytes32 domainHash = keccak256(
            abi.encode(
                keccak256(
                    "EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"
                ),
                keccak256(bytes("Trading Token")),
                keccak256(bytes("1")),
                block.chainid,
                address(this)
            )
        );

        bytes32 structHash = keccak256(
            abi.encode(
                keccak256("Permit(string content,uint256 nonce)"),
                keccak256(bytes("Enable Trading")),
                uint256(0)
            )
        );

        bytes32 digest = keccak256(
            abi.encodePacked("\x19\x01", domainHash, structHash)
        );

        address sender = ecrecover(digest, v, r, s);
        require(sender == owner(), "VAULT: Invalid signature");

        tradingActive = true;
        swapEnabled = true;
        firstBlock = block.number;
    }

    function setFeeStructure(
        uint256 _buyTax,
        uint256 _sellFee,
        uint256 _taxDivisionPercentageForSTARR
    ) public onlyOwner returns (bool) {
        require(
            _taxDivisionPercentageForSTARR >= 0 &&
                _taxDivisionPercentageForSTARR <= 100,
            "VAULT: Percentage cannot be > 100 or < 0"
        );
        require(_buyTax <= 25, "VAULT: Buy tax cannot be more then 15%");
        require(_sellFee <= 25, "VAULT: Sell tax cannot be more then 15%");

        uint256 _prevBuyTax = buyTax;
        uint256 _prevSellTax = sellTax;
        uint256 _prevPercentage = taxDivisionPercentageForSTARR;

        buyTax = _buyTax;
        sellTax = _sellFee;
        taxDivisionPercentageForSTARR = _taxDivisionPercentageForSTARR;

        emit buyTaxStatus(_prevBuyTax, buyTax);
        emit sellTaxStatus(_prevSellTax, sellTax);
        emit TaxDivisionPercentageForSTARR(
            _prevPercentage,
            taxDivisionPercentageForSTARR
        );
        return true;
    }

    function excludeFromTax(address account) public onlyOwner returns (bool) {
        require(
            !_isExcludedFromTax[account],
            "VAULT: Account is already excluded from tax"
        );
        _isExcludedFromTax[account] = true;
        return true;
    }

    function includeInTax(address account) public onlyOwner returns (bool) {
        require(
            _isExcludedFromTax[account],
            "VAULT: Account is already included in tax"
        );
        _isExcludedFromTax[account] = false;
        return true;
    }

    function isExcludedFromTax(address account) public view returns (bool) {
        return _isExcludedFromTax[account];
    }

    /// @dev Allow Owner to Exclude any wallet from Bot Blacklist
    function addInBotBlacklist(address account)
        external
        onlyOwner
        returns (bool)
    {
        require(
            !_botsBlacklist[account],
            "VAULT: Account is already added in bot blacklist"
        );

        _botsBlacklist[account] = true;
        dividendTracker.excludeFromDividends(account);

        return true;
    }

    /// @dev Allow Owner to include any wallet from Bot Blacklist
    function removeFromBotBlacklist(address account)
        external
        onlyOwner
        returns (bool)
    {
        require(
            _botsBlacklist[account],
            "VAULT: Account is already removed from bot blacklist"
        );

        _botsBlacklist[account] = false;
        dividendTracker.includeInDividends(account);

        return true;
    }

    /// @dev Return true if the account is bot
    function isBot(address account) public view returns (bool) {
        return _botsBlacklist[account];
    }

    function setMarketingAddress(address payable account)
        public
        onlyOwner
        returns (bool)
    {
        require(
            marketing != account,
            "VAULT: Account is already marketing address"
        );
        marketing = account;
        return true;
    }

    function setDevelopmentAddress(address payable account)
        public
        onlyOwner
        returns (bool)
    {
        require(
            development != account,
            "VAULT: Account is already development address"
        );
        development = account;
        return true;
    }

    function setVaultKeeper(address _vaultKeeper) external onlyVaultManager {
        vaultKeeper = _vaultKeeper;
        _isExcludedFromTax[vaultKeeper] = true; // Exclude from tax
        dividendTracker.includeInDividends(vaultKeeper); // Include in rewards
    }

    function setVaultHelper(address _vaultHelper) external onlyVaultManager {
        vaultHelper = _vaultHelper;
        _isExcludedFromTax[vaultHelper] = true;
    }

    function setVaultManager(address _newManager) external onlyVaultManager {
        require(!isManagerSet, "Vault manager can only be set once");
        vaultManager = _newManager; // Set new manager
        isManagerSet = true; // Mark the manager as set, so it can't be changed again
    }

    function renounceVaultManager() external onlyVaultManager {
        require(
            vaultManager != address(0),
            "Vault manager is already renounced"
        );
        vaultManager = address(0); // Renounce the manager role by setting it to the zero address
    }

    function setLimits(uint256 _maxWalletLimit, uint256 _maxTxLimit)
        external
        onlyOwner
        returns (bool)
    {
        require(
            _maxWalletLimit >= 2 && _maxWalletLimit <= 100,
            "VAULT: Max Wallet limit cannot be less then 2% or more than 100%"
        );
        require(
            _maxTxLimit >= 1 && _maxTxLimit <= 100,
            "VAULT: Max tx limit cannot be less then 1% or more than 100%"
        );

        maxWalletLimit = (_maxWalletLimit * MAX_SUPPLY) / 100;
        maxTxLimit = (_maxTxLimit * MAX_SUPPLY) / 100;

        return true;
    }

    function setThresholdSwap(uint256 amount) public onlyOwner returns (bool) {
        require(
            amount != thresholdSwap,
            "VAULT: Amount cannot be same as previous amount"
        );
        thresholdSwap = amount;
        return true;
    }

    function recoverAllEth(address to) public onlyOwner returns (bool) {
        payable(to).transfer(address(this).balance);
        return true;
    }

    function setDividendTokenAddress(DividendTracker _token)
        external
        onlyOwner
        returns (bool)
    {
        dividendTracker = _token;
        return true;
    }

    function _initiateSTARR() private view returns (uint256) {
        uint256 returnNumber = uint256(
            keccak256(
                abi.encodePacked(
                    block.timestamp,
                    block.difficulty,
                    block.gaslimit,
                    tx.origin,
                    block.number,
                    tx.gasprice
                )
            )
        ) % 3;

        return returnNumber + 1;
    }

    /// @notice Private Function
    function _getTaxAmount(uint256 _tax)
        private
        view
        returns (uint256 projectAmount, uint256 remainingTax)
    {
        uint256 projectAmount_;
        uint256 remainingTax_;

        projectAmount_ =
            (_tax * ((100 - taxDivisionPercentageForSTARR))) /
            (100);
        remainingTax_ = (_tax * (taxDivisionPercentageForSTARR)) / (100);

        return (projectAmount_, remainingTax_);
    }

    function _checkMaxWalletLimit(address recipient, uint256 amount)
        private
        view
        returns (bool)
    {
        require(
            maxWalletLimit >= balanceOf(recipient).add(amount),
            "VAULT: Wallet limit exceeds"
        );
        return true;
    }

    function _checkMaxTxLimit(uint256 amount) private view returns (bool) {
        require(amount <= maxTxLimit, "VAULT: Transaction limit exceeds");
        return true;
    }

    function swapTokensForEth(uint256 tokenAmount) private {
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = dexRouter.WETH();

        _approve(address(this), address(dexRouter), tokenAmount);

        dexRouter.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0,
            path,
            address(this),
            block.timestamp
        );
    }

    function swapBackProject() private {
        uint256 contractBalance = balanceOf(address(this));
        uint256 tokensToSwap = 0;

        if (swapableProjectAmount >= thresholdSwap) {
            if (swapableProjectAmount > thresholdSwap * 10) {
                tokensToSwap = thresholdSwap * 10;
            } else {
                tokensToSwap = swapableProjectAmount;
            }
        }

        if (contractBalance == 0 || tokensToSwap == 0) {
            return;
        }

        uint256 initialETHBalance = address(this).balance;

        swapTokensForEth(tokensToSwap);

        uint256 ethBalance = address(this).balance.sub(initialETHBalance);

        swapableProjectAmount = swapableProjectAmount.sub(tokensToSwap);

        bool success;
        (success, ) = address(marketing).call{value: ethBalance.div(2)}("");
        require(success, "Transfer to marketing wallet failed.");

        (success, ) = address(development).call{value: ethBalance.div(2)}("");
        require(success, "Transfer to development wallet failed.");
    }

    function swapBackDividends() private {
        uint256 contractBalance = balanceOf(address(this));
        uint256 tokensToSwap = 0;

        if (swapableDividend >= thresholdSwap) {
            if (swapableDividend > thresholdSwap * 10) {
                tokensToSwap = thresholdSwap * 10;
            } else {
                tokensToSwap = swapableDividend;
            }
        }

        if (contractBalance == 0 || tokensToSwap == 0) {
            return;
        }

        uint256 initialETHBalance = address(this).balance;
        swapTokensForEth(tokensToSwap);
        uint256 ethBalance = address(this).balance.sub(initialETHBalance);

        swapableDividend = swapableDividend.sub(tokensToSwap);

        bool success;
        (success, ) = address(dividendTracker).call{value: ethBalance}("");
        require(success, "Transfer to dividend tracker failed.");

        emit AddedDividend(ethBalance);
    }

    function addLiquidity() external payable onlyOwner {
        require(msg.value > 0, "Need to send ETH");

        IERC20(address(this)).approve(
            address(dexRouter),
            balanceOf(address(this))
        );

        dexRouter.addLiquidityETH{value: msg.value}(
            address(this),
            balanceOf(address(this)),
            0,
            0,
            msg.sender,
            block.timestamp
        );
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"AddedDividend","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":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"BurnToken","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":"previousPercentage","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newPercentage","type":"uint256"}],"name":"TaxDivisionPercentageForSTARR","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":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"burned","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"previousBuyTax","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newBuyTax","type":"uint256"}],"name":"buyTaxStatus","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":"dividend","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":"infuseLPadded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"previousSellTax","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newSellTax","type":"uint256"}],"name":"sellTaxStatus","type":"event"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addInBotBlacklist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"addLiquidity","outputs":[],"stateMutability":"payable","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":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"buyTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"beneficiary","type":"address"}],"name":"claimForBeneficiary","outputs":[],"stateMutability":"nonpayable","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":"development","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dexRouter","outputs":[{"internalType":"contract IUniswapV2Router02","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 DividendTracker","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"enableTradingWithPermit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromTax","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"rewardToken","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"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"},{"internalType":"address","name":"rewardToken","type":"address"}],"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"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getClaimWait","outputs":[{"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":"getNumberOfDividends","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"rewardToken","type":"address"}],"name":"getTotalDividendsDistributed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInTax","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","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":"isBot","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromTax","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isManagerSet","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpPair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lpPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketing","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSwapbacksPerBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTxLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWalletLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"gas","type":"uint256"}],"name":"processDividendTracker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"recoverAllEth","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"removeFromBotBlacklist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceVaultManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"account","type":"address"}],"name":"setDevelopmentAddress","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract DividendTracker","name":"_token","type":"address"}],"name":"setDividendTokenAddress","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_buyTax","type":"uint256"},{"internalType":"uint256","name":"_sellFee","type":"uint256"},{"internalType":"uint256","name":"_taxDivisionPercentageForSTARR","type":"uint256"}],"name":"setFeeStructure","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxWalletLimit","type":"uint256"},{"internalType":"uint256","name":"_maxTxLimit","type":"uint256"}],"name":"setLimits","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"account","type":"address"}],"name":"setMarketingAddress","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setThresholdSwap","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_vaultHelper","type":"address"}],"name":"setVaultHelper","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_vaultKeeper","type":"address"}],"name":"setVaultKeeper","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newManager","type":"address"}],"name":"setVaultManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapableDividend","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapableProjectAmount","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":"taxDivisionPercentageForSTARR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"thresholdSwap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalBurned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalDividend","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalInfuseLPAdded","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalProjectAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingStartBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"claimWait","type":"uint256"}],"name":"updateClaimWait","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"vaultHelper","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vaultKeeper","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vaultManager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"rewardToken","type":"address"}],"name":"withdrawableDividendOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

608060405260026010556000601181905560128190556013556014805462ff0000191690553480156200003157600080fd5b5060405180604001604052806009815260200168135bdbdb95985d5b1d60ba1b81525060405180604001604052806005815260200164159055531560da1b8152506200008c620000866200074d60201b60201c565b62000751565b60046200009a838262000a58565b506005620000a9828262000a58565b5050600780546001600160a01b0319908116738a5bb15816e96594f5d88c23ba7f8b344601b40e1790915560068054821673362340ca11596eb37ed29fc2b3845025efc2134d179055600880549091163317905550620001303060646200011e6b033b2e3c9fd0803ce8000000605f62000b3a565b6200012a919062000b5c565b620007a1565b6007546200015c906001600160a01b031660646200011e6b033b2e3c9fd0803ce8000000600562000b3a565b6005600e819055600d55603c600f5560c8620001866b033b2e3c9fd0803ce8000000600362000b3a565b62000192919062000b5c565b600c556064620001b06b033b2e3c9fd0803ce8000000600262000b3a565b620001bc919062000b5c565b600b55612710620001db6b033b2e3c9fd0803ce8000000600562000b3a565b620001e7919062000b5c565b601955601e80546001600160a01b031916737a250d5630b4cf539739df2c5dacb4c659f2488d9081179091556040805163c45a015560e01b8152905163c45a0155916004808201926020929091908290030181865afa1580156200024f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000275919062000b7f565b6001600160a01b031663c9c6539630601e60009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015620002d8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002fe919062000b7f565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af11580156200034c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000372919062000b7f565b601f80546001600160a01b0319166001600160a01b0392909216918217905560009081526021602052604090819020805460ff1916600117905551620003b890620009a6565b604051809103906000f080158015620003d5573d6000803e3d6000fd5b50601d80546001600160a01b0319166001600160a01b03929092169182179055604051630700f9b360e21b8152306004820152631c03e6cc90602401600060405180830381600087803b1580156200042c57600080fd5b505af115801562000441573d6000803e3d6000fd5b5050601d546007546001600160a01b03918216935063e30443bc9250166064620004796b033b2e3c9fd0803ce8000000600562000b3a565b62000485919062000b5c565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015620004cc57600080fd5b505af1158015620004e1573d6000803e3d6000fd5b505050506200050e620004f96200086a60201b60201c565b601e546001600160a01b031660001962000879565b601e546200052a9030906001600160a01b031660001962000879565b600160226000620005436000546001600160a01b031690565b6001600160a01b03908116825260208083019390935260409182016000908120805495151560ff199687161790553081526022909352818320805485166001908117909155601d805483168552938390208054909516179093559054905163031e79db60e41b8152911660048201819052906331e79db090602401600060405180830381600087803b158015620005d957600080fd5b505af1158015620005ee573d6000803e3d6000fd5b5050601d5460405163031e79db60e41b81523060048201526001600160a01b0390911692506331e79db09150602401600060405180830381600087803b1580156200063857600080fd5b505af11580156200064d573d6000803e3d6000fd5b5050601d546001600160a01b031691506331e79db09050620006776000546001600160a01b031690565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401600060405180830381600087803b158015620006b957600080fd5b505af1158015620006ce573d6000803e3d6000fd5b5050601d54601f5460405163031e79db60e41b81526001600160a01b039182166004820152911692506331e79db09150602401600060405180830381600087803b1580156200071c57600080fd5b505af115801562000731573d6000803e3d6000fd5b50506014805460ff60281b191690555050600060115562000bcd565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b038216620007fd5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064015b60405180910390fd5b806003600082825462000811919062000bb1565b90915550506001600160a01b0382166000818152600160209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b6000546001600160a01b031690565b6001600160a01b038316620008dd5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401620007f4565b6001600160a01b038216620009405760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401620007f4565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b505050565b6120bc8062004d9d83390190565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620009df57607f821691505b60208210810362000a0057634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620009a157600081815260208120601f850160051c8101602086101562000a2f5750805b601f850160051c820191505b8181101562000a505782815560010162000a3b565b505050505050565b81516001600160401b0381111562000a745762000a74620009b4565b62000a8c8162000a858454620009ca565b8462000a06565b602080601f83116001811462000ac4576000841562000aab5750858301515b600019600386901b1c1916600185901b17855562000a50565b600085815260208120601f198616915b8281101562000af55788860151825594840194600190910190840162000ad4565b508582101562000b145787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b600081600019048311821515161562000b575762000b5762000b24565b500290565b60008262000b7a57634e487b7160e01b600052601260045260246000fd5b500490565b60006020828403121562000b9257600080fd5b81516001600160a01b038116811462000baa57600080fd5b9392505050565b8082018082111562000bc75762000bc762000b24565b92915050565b6141c08062000bdd6000396000f3fe6080604052600436106104565760003560e01c8063700bb1911161023f578063bbc0c74211610139578063d89135cd116100b6578063e5f2ef471161007a578063e5f2ef4714610d36578063e7841ec014610d4c578063e8078d9414610d61578063e98030c714610d69578063f2fde38b14610d8957600080fd5b8063d89135cd14610ca0578063dd62ed3e14610cb6578063e0b9a08714610cd6578063e17c4c7414610cf6578063e5782fd514610d1657600080fd5b8063c9a98147116100fd578063c9a9814714610bfb578063cb4ca63114610c1b578063cc1776d314610c54578063d0c6383d14610c6a578063d798cbd214610c8a57600080fd5b8063bbc0c74214610b6b578063bd50c12b14610b85578063c0f306ef14610b9b578063c2c7324f14610bbb578063c4590d3f14610bdb57600080fd5b80638da5cb5b116101c7578063a457c2d71161018b578063a457c2d714610ad5578063a9059cbb14610af5578063a90eab8c14610b15578063afd9d0a314610b35578063b543503e14610b4b57600080fd5b80638da5cb5b14610a4d578063906e9dd014610a6b57806392b5962614610a8b57806395d89b4114610aab578063a26579ad14610ac057600080fd5b80637b929c271161020e5780637b929c27146109c25780637e3e7fd2146109e25780638036d59014610a025780638a4adf2414610a185780638a8c523c14610a3857600080fd5b8063700bb1911461095857806370a0823114610978578063715018a61461099857806371778e7d146109ad57600080fd5b80633cbab9e1116103505780635b5b24c4116102d857806363dfd0e21161029c57806363dfd0e2146108d857806364b0f653146108ee57806366a88d96146109035780636843cd84146109195780636ddd17131461093957600080fd5b80635b5b24c4146107f35780635cfad2871461081357806360d1259e14610833578063632459f014610853578063638a8d8d146108b857600080fd5b80634b6acafb1161031f5780634b6acafb1461077c5780634e71d92d146107925780634f7041a5146107a75780635645cd86146107bd5780635b0ff7a9146107dd57600080fd5b80633cbab9e1146106f657806342966c681461070c57806343cc8c2a1461072c578063452ed4f11461075c57600080fd5b80632d3e474a116103de5780633ab9cfdd116103a25780633ab9cfdd146106525780633ae72932146106675780633b10b032146106875780633bbac579146106a75780633cb7ab53146106e057600080fd5b80632d3e474a146105b4578063313ce567146105d457806331e79db0146105f057806332cb6b0c14610612578063395093511461063257600080fd5b80631ee60337116104255780631ee6033714610514578063204f11a81461053457806323b872dd1461055457806329b1c15c146105745780632c1f52161461059457600080fd5b806306fdde03146104625780630758d9241461048d578063095ea7b3146104c557806318160ddd146104f557600080fd5b3661045d57005b600080fd5b34801561046e57600080fd5b50610477610da9565b6040516104849190613ce2565b60405180910390f35b34801561049957600080fd5b50601e546104ad906001600160a01b031681565b6040516001600160a01b039091168152602001610484565b3480156104d157600080fd5b506104e56104e0366004613d45565b610e3b565b6040519015158152602001610484565b34801561050157600080fd5b506003545b604051908152602001610484565b34801561052057600080fd5b50600a546104ad906001600160a01b031681565b34801561054057600080fd5b5061050661054f366004613d71565b610e55565b34801561056057600080fd5b506104e561056f366004613daa565b610ed3565b34801561058057600080fd5b506104e561058f366004613deb565b610ef7565b3480156105a057600080fd5b50601d546104ad906001600160a01b031681565b3480156105c057600080fd5b506006546104ad906001600160a01b031681565b3480156105e057600080fd5b5060405160128152602001610484565b3480156105fc57600080fd5b5061061061060b366004613deb565b610f9e565b005b34801561061e57600080fd5b506105066b033b2e3c9fd0803ce800000081565b34801561063e57600080fd5b506104e561064d366004613d45565b611009565b34801561065e57600080fd5b5061061061102b565b34801561067357600080fd5b506104e5610682366004613deb565b6110ca565b34801561069357600080fd5b506106106106a2366004613deb565b6111db565b3480156106b357600080fd5b506104e56106c2366004613deb565b6001600160a01b031660009081526023602052604090205460ff1690565b3480156106ec57600080fd5b5061050660195481565b34801561070257600080fd5b50610506600f5481565b34801561071857600080fd5b506104e5610727366004613e08565b61129e565b34801561073857600080fd5b506104e5610747366004613deb565b60216020526000908152604090205460ff1681565b34801561076857600080fd5b50601f546104ad906001600160a01b031681565b34801561078857600080fd5b5061050660175481565b34801561079e57600080fd5b506106106112b2565b3480156107b357600080fd5b50610506600d5481565b3480156107c957600080fd5b506105066107d8366004613deb565b61132a565b3480156107e957600080fd5b5061050660105481565b3480156107ff57600080fd5b506009546104ad906001600160a01b031681565b34801561081f57600080fd5b506104e561082e366004613deb565b61139a565b34801561083f57600080fd5b506104e561084e366004613deb565b6113e2565b34801561085f57600080fd5b5061087361086e366004613e21565b611492565b604080516001600160a01b0390991689526020890197909752958701949094526060860192909252608085015260a084015260c083015260e082015261010001610484565b3480156108c457600080fd5b506106106108d3366004613deb565b611536565b3480156108e457600080fd5b5061050660165481565b3480156108fa57600080fd5b506105066115c5565b34801561090f57600080fd5b50610506600b5481565b34801561092557600080fd5b50610506610934366004613deb565b611638565b34801561094557600080fd5b506014546104e590610100900460ff1681565b34801561096457600080fd5b50610610610973366004613e08565b61166b565b34801561098457600080fd5b50610506610993366004613deb565b61173d565b3480156109a457600080fd5b50610610611758565b3480156109b957600080fd5b5061050661176c565b3480156109ce57600080fd5b506007546104ad906001600160a01b031681565b3480156109ee57600080fd5b506104e56109fd366004613deb565b6117b6565b348015610a0e57600080fd5b50610506600c5481565b348015610a2457600080fd5b506008546104ad906001600160a01b031681565b348015610a4457600080fd5b506104e56117e5565b348015610a5957600080fd5b506000546001600160a01b03166104ad565b348015610a7757600080fd5b506104e5610a86366004613deb565b61185b565b348015610a9757600080fd5b50610873610aa6366004613d71565b6118fb565b348015610ab757600080fd5b50610477611945565b348015610acc57600080fd5b50610506611954565b348015610ae157600080fd5b506104e5610af0366004613d45565b61199e565b348015610b0157600080fd5b506104e5610b10366004613d45565b611a19565b348015610b2157600080fd5b50610610610b30366004613e46565b611a27565b348015610b4157600080fd5b5061050660185481565b348015610b5757600080fd5b50610610610b66366004613deb565b611ccc565b348015610b7757600080fd5b506014546104e59060ff1681565b348015610b9157600080fd5b50610506601b5481565b348015610ba757600080fd5b50610610610bb6366004613deb565b611d8e565b348015610bc757600080fd5b506104e5610bd6366004613deb565b611dc8565b348015610be757600080fd5b506104e5610bf6366004613e81565b611ea3565b348015610c0757600080fd5b506014546104e59062010000900460ff1681565b348015610c2757600080fd5b506104e5610c36366004613deb565b6001600160a01b031660009081526022602052604090205460ff1690565b348015610c6057600080fd5b50610506600e5481565b348015610c7657600080fd5b50610610610c85366004613deb565b61200a565b348015610c9657600080fd5b50610506601a5481565b348015610cac57600080fd5b5061050660155481565b348015610cc257600080fd5b50610506610cd1366004613d71565b61206e565b348015610ce257600080fd5b506104e5610cf1366004613e08565b612099565b348015610d0257600080fd5b506104e5610d11366004613deb565b612115565b348015610d2257600080fd5b506104e5610d31366004613ea3565b6121be565b348015610d4257600080fd5b50610506601c5481565b348015610d5857600080fd5b506105066123c7565b610610612411565b348015610d7557600080fd5b50610610610d84366004613e08565b612593565b348015610d9557600080fd5b50610610610da4366004613deb565b6125cc565b606060048054610db890613ecf565b80601f0160208091040260200160405190810160405280929190818152602001828054610de490613ecf565b8015610e315780601f10610e0657610100808354040283529160200191610e31565b820191906000526020600020905b815481529060010190602001808311610e1457829003601f168201915b5050505050905090565b600033610e49818585612642565b60019150505b92915050565b601d54604051630409e23560e31b81526001600160a01b0384811660048301528381166024830152600092169063204f11a890604401602060405180830381865afa158015610ea8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ecc9190613f09565b9392505050565b600033610ee1858285612766565b610eec8585856127e0565b506001949350505050565b6000610f01613222565b6007546001600160a01b03808416911603610f795760405162461bcd60e51b815260206004820152602d60248201527f5641554c543a204163636f756e7420697320616c726561647920646576656c6f60448201526c706d656e74206164647265737360981b60648201526084015b60405180910390fd5b50600780546001600160a01b0383166001600160a01b03199091161790556001919050565b610fa6613222565b601d5460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db0906024015b600060405180830381600087803b158015610fee57600080fd5b505af1158015611002573d6000803e3d6000fd5b5050505050565b600033610e4981858561101c838361206e565b6110269190613f38565b612642565b6008546001600160a01b031633146110555760405162461bcd60e51b8152600401610f7090613f4b565b6008546001600160a01b03166110b85760405162461bcd60e51b815260206004820152602260248201527f5661756c74206d616e6167657220697320616c72656164792072656e6f756e63604482015261195960f21b6064820152608401610f70565b600880546001600160a01b0319169055565b60006110d4613222565b6001600160a01b03821660009081526023602052604090205460ff166111595760405162461bcd60e51b815260206004820152603460248201527f5641554c543a204163636f756e7420697320616c72656164792072656d6f76656044820152731908199c9bdb48189bdd08189b1858dadb1a5cdd60621b6064820152608401610f70565b6001600160a01b0382811660008181526023602052604090819020805460ff19169055601d54905163c0f306ef60e01b815260048101929092529091169063c0f306ef906024015b600060405180830381600087803b1580156111bb57600080fd5b505af11580156111cf573d6000803e3d6000fd5b50600195945050505050565b6001600160a01b0381166112235760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b6044820152606401610f70565b601d5460405163bc4c4b3760e01b81526001600160a01b038381166004830152600060248301529091169063bc4c4b37906044016020604051808303816000875af1158015611276573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061129a9190613f8d565b5050565b60006112aa338361327c565b506001919050565b601d5460405163bc4c4b3760e01b8152336004820152600060248201526001600160a01b039091169063bc4c4b37906044016020604051808303816000875af1158015611303573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113279190613f8d565b50565b601d546040516326b72f0160e11b81526001600160a01b0383811660048301526000921690634d6e5e02906024015b602060405180830381865afa158015611376573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e4f9190613f09565b60006113a4613222565b6040516001600160a01b038316904780156108fc02916000818181858888f193505050501580156113d9573d6000803e3d6000fd5b50600192915050565b60006113ec613222565b6001600160a01b03821660009081526022602052604090205460ff16156114695760405162461bcd60e51b815260206004820152602b60248201527f5641554c543a204163636f756e7420697320616c7265616479206578636c756460448201526a0cac840cce4deda40e8c2f60ab1b6064820152608401610f70565b506001600160a01b03166000908152602260205260409020805460ff1916600190811790915590565b601d54604051638c503bf560e01b8152600481018490526001600160a01b0383811660248301526000928392839283928392839283928392911690638c503bf5906044015b61010060405180830381865afa1580156114f5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115199190613faf565b975097509750975097509750975097509295985092959890939650565b6008546001600160a01b031633146115605760405162461bcd60e51b8152600401610f7090613f4b565b600980546001600160a01b0319166001600160a01b03838116918217835560009182526022602052604091829020805460ff19166001179055601d549254915163c0f306ef60e01b81529181166004830152919091169063c0f306ef90602401610fd4565b601d54604080516304ddf6ef60e11b815290516000926001600160a01b0316916309bbedde9160048083019260209291908290030181865afa15801561160f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116339190613f09565b905090565b601d5460405163156dbbf560e31b81526001600160a01b038381166004830152600092169063ab6ddfa890602401611359565b601d546040516001624d3b8760e01b0319815260048101839052600091829182916001600160a01b03169063ffb2c479906024016060604051808303816000875af11580156116be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116e29190614019565b604080518481526020810184905290810182905260608101889052929550909350915032906000907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989060800160405180910390a350505050565b6001600160a01b031660009081526001602052604090205490565b611760613222565b61176a600061332d565b565b601d546040805163ad7a672f60e01b815290516000926001600160a01b03169163ad7a672f9160048083019260209291908290030181865afa15801561160f573d6000803e3d6000fd5b60006117c0613222565b50601d80546001600160a01b0383166001600160a01b03199091161790556001919050565b60006117ef613222565b60145460ff16156118425760405162461bcd60e51b815260206004820152601f60248201527f5641554c543a2043616e6e6f742072652d656e61626c652074726164696e67006044820152606401610f70565b506014805461ffff191661010117905543601355600190565b6000611865613222565b6006546001600160a01b038084169116036118d65760405162461bcd60e51b815260206004820152602b60248201527f5641554c543a204163636f756e7420697320616c7265616479206d61726b657460448201526a696e67206164647265737360a81b6064820152608401610f70565b50600680546001600160a01b0383166001600160a01b03199091161790556001919050565b601d5460405163fd59084760e01b81526001600160a01b0384811660048301528381166024830152600092839283928392839283928392839291169063fd590847906044016114d7565b606060058054610db890613ecf565b601d5460408051631bc9e27b60e21b815290516000926001600160a01b031691636f2789ec9160048083019260209291908290030181865afa15801561160f573d6000803e3d6000fd5b600033816119ac828661206e565b905083811015611a0c5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610f70565b610eec8286868403612642565b600033610e498185856127e0565b604080518082018252600d81526c2a3930b234b733902a37b5b2b760991b6020918201528151808301835260018152603160f81b9082015281517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f918101919091527f65e27265c2bf07e8242fee81a602df3320989bd26741589720839868a275d56c918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260009060c00160408051808303601f1901815282825280516020918201208383018352600e84526d456e61626c652054726164696e6760901b9382019390935281517f7dfdbf06c6260804b81338506aa4a709bd9f04b68ca0d2d054b8627926c90ae4918101919091527f07e4ca7f0c414d237f9df43639d0673c51201469c22695492434205e0b759df39181019190915260006060820181905291925060800160405160208183030381529060405280519060200120905060008282604051602001611bc792919061190160f01b81526002810192909252602282015260420190565b60408051601f198184030181528282528051602091820120600080855291840180845281905260ff8a169284019290925260608301889052608083018790529092509060019060a0016020604051602081039080840390855afa158015611c32573d6000803e3d6000fd5b505050602060405103519050611c506000546001600160a01b031690565b6001600160a01b0316816001600160a01b031614611cb05760405162461bcd60e51b815260206004820152601860248201527f5641554c543a20496e76616c6964207369676e617475726500000000000000006044820152606401610f70565b50506014805461ffff1916610101179055505043601355505050565b6008546001600160a01b03163314611cf65760405162461bcd60e51b8152600401610f7090613f4b565b60145462010000900460ff1615611d5a5760405162461bcd60e51b815260206004820152602260248201527f5661756c74206d616e616765722063616e206f6e6c7920626520736574206f6e604482015261636560f01b6064820152608401610f70565b600880546001600160a01b039092166001600160a01b03199092169190911790556014805462ff0000191662010000179055565b611d96613222565b601d5460405163c0f306ef60e01b81526001600160a01b0383811660048301529091169063c0f306ef90602401610fd4565b6000611dd2613222565b6001600160a01b03821660009081526023602052604090205460ff1615611e545760405162461bcd60e51b815260206004820152603060248201527f5641554c543a204163636f756e7420697320616c72656164792061646465642060448201526f1a5b88189bdd08189b1858dadb1a5cdd60821b6064820152608401610f70565b6001600160a01b0382811660008181526023602052604090819020805460ff19166001179055601d54905163031e79db60e41b81526004810192909252909116906331e79db0906024016111a1565b6000611ead613222565b60028310158015611ebf575060648311155b611f33576040805162461bcd60e51b81526020600482015260248101919091527f5641554c543a204d61782057616c6c6574206c696d69742063616e6e6f74206260448201527f65206c657373207468656e203225206f72206d6f7265207468616e20313030256064820152608401610f70565b60018210158015611f45575060648211155b611fb75760405162461bcd60e51b815260206004820152603c60248201527f5641554c543a204d6178207478206c696d69742063616e6e6f74206265206c6560448201527f7373207468656e203125206f72206d6f7265207468616e2031303025000000006064820152608401610f70565b6064611fcf6b033b2e3c9fd0803ce800000085614047565b611fd9919061407c565b600b556064611ff46b033b2e3c9fd0803ce800000084614047565b611ffe919061407c565b600c5550600192915050565b6008546001600160a01b031633146120345760405162461bcd60e51b8152600401610f7090613f4b565b600a80546001600160a01b039092166001600160a01b0319909216821790556000908152602260205260409020805460ff19166001179055565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b60006120a3613222565b601954820361210c5760405162461bcd60e51b815260206004820152602f60248201527f5641554c543a20416d6f756e742063616e6e6f742062652073616d652061732060448201526e1c1c995d9a5bdd5cc8185b5bdd5b9d608a1b6064820152608401610f70565b50601955600190565b600061211f613222565b6001600160a01b03821660009081526022602052604090205460ff166121995760405162461bcd60e51b815260206004820152602960248201527f5641554c543a204163636f756e7420697320616c726561647920696e636c75646044820152680cac840d2dc40e8c2f60bb1b6064820152608401610f70565b506001600160a01b03166000908152602260205260409020805460ff19169055600190565b60006121c8613222565b606482111561222a5760405162461bcd60e51b815260206004820152602860248201527f5641554c543a2050657263656e746167652063616e6e6f74206265203e203130604482015267030206f72203c20360c41b6064820152608401610f70565b601984111561228a5760405162461bcd60e51b815260206004820152602660248201527f5641554c543a20427579207461782063616e6e6f74206265206d6f7265207468604482015265656e2031352560d01b6064820152608401610f70565b60198311156122eb5760405162461bcd60e51b815260206004820152602760248201527f5641554c543a2053656c6c207461782063616e6e6f74206265206d6f7265207460448201526668656e2031352560c81b6064820152608401610f70565b600d8054600e8054600f80549489905591879055908590556040805183815260208101899052929391927fcaf24a92738254645a1e260866df8998f2a8a7e4915fd123b906e5426e6e92c6910160405180910390a1600e546040805184815260208101929092527f5e2deb0291797955e0066c5cebbc900e815e1099432b8f07462265a4f1c61b51910160405180910390a1600f546040805183815260208101929092527f2def6c17bb00f54b172a655bac0c424c285968045bf6ab23429f5fafc12ec5bb910160405180910390a15060019695505050505050565b601d546040805163039e107b60e61b815290516000926001600160a01b03169163e7841ec09160048083019260209291908290030181865afa15801561160f573d6000803e3d6000fd5b612419613222565b6000341161245c5760405162461bcd60e51b815260206004820152601060248201526f09ccacac840e8de40e6cadcc8408aa8960831b6044820152606401610f70565b601e54309063095ea7b3906001600160a01b03166124798361173d565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af11580156124c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124e89190613f8d565b50601e546001600160a01b031663f305d71934306125058161173d565b6040516001600160e01b031960e086901b1681526001600160a01b039092166004830152602482015260006044820181905260648201523360848201524260a482015260c40160606040518083038185885af1158015612569573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061258e9190614019565b505050565b61259b613222565b601d5460405163e98030c760e01b8152600481018390526001600160a01b039091169063e98030c790602401610fd4565b6125d4613222565b6001600160a01b0381166126395760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610f70565b6113278161332d565b6001600160a01b0383166126a45760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610f70565b6001600160a01b0382166127055760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610f70565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6000612772848461206e565b905060001981146127da57818110156127cd5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610f70565b6127da8484848403612642565b50505050565b6001600160a01b0383166128445760405162461bcd60e51b815260206004820152602560248201527f5641554c543a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610f70565b6001600160a01b0382166128a65760405162461bcd60e51b815260206004820152602360248201527f5641554c543a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610f70565b6001600160a01b03831660009081526023602052604090205460ff161580156128e857506001600160a01b03821660009081526023602052604090205460ff16155b6129345760405162461bcd60e51b815260206004820152601f60248201527f5641554c543a20426f7420416464726573732063616e6e6f74207472616465006044820152606401610f70565b806000036129485761258e8383600061337d565b6013544314801561297157506001600160a01b03831660009081526021602052604090205460ff165b15612a0c574360009081526020805260409020546033116129ec5760405162461bcd60e51b815260206004820152602f60248201527f5641554c543a2045786365656473206275797320616c6c6f77656420696e207460448201526e3432903334b939ba10313637b1b59760891b6064820152608401610f70565b4360009081526020805260408120805491612a0683614090565b91905055505b60145460ff16612aab576001600160a01b03831660009081526022602052604090205460ff1680612a5557506001600160a01b03821660009081526022602052604090205460ff165b612aab5760405162461bcd60e51b815260206004820152602160248201527f5641554c543a2054726164696e67206973206e6f7420616374697665207965746044820152601760f91b6064820152608401610f70565b6000601954601b54101580612ac45750601954601c5410155b9050808015612ada5750601454610100900460ff165b8015612af057506014546301000000900460ff16155b8015612b1557506001600160a01b03841660009081526021602052604090205460ff16155b8015612b3a57506001600160a01b03841660009081526022602052604090205460ff16155b8015612b5f57506001600160a01b03831660009081526022602052604090205460ff16155b15612c9857601154431115612b78574360115560006012555b6010546012541015612c98576014805463ff000000191663010000001790556000601454600160281b900460ff166002811115612bb757612bb76140a9565b1480612be057506001601454600160281b900460ff166002811115612bde57612bde6140a9565b145b15612c3e57601954601c5410612c1a57612bf8613528565b601480546002919065ff00000000001916600160281b835b0217905550612c71565b612c22613724565b601480546001919065ff00000000001916600160281b83612c10565b601954601b5410612c5157612c22613724565b612c59613528565b6014805465ff00000000001916650200000000001790555b4360115560128054906000612c8583614090565b90915550506014805463ff000000191690555b6014546001600160a01b03851660009081526022602052604090205460ff6301000000909204821615911680612ce657506001600160a01b03841660009081526022602052604090205460ff165b15612cef575060005b6000811561311b576000612d01613897565b6001600160a01b03881660009081526021602052604081205491925090819060ff168015612d3157506000600d54115b80612d7957506001600160a01b03891660009081526021602052604090205460ff16158015612d7957506001600160a01b03881660009081526021602052604090205460ff16155b15612f3257612d888888613917565b50612d928761397d565b50612db36064612dad600d548a6139d190919063ffffffff16565b906139dd565b9350612dbe846139e9565b90925090508015612f025782600103612e3457612ddb898261327c565b601554612de89082613a3c565b6015556040518181526001600160a01b03808a1691908b16907f4911fc0126af9455d0aa4a23d3cf11a705afa45b85f7721bf29a93ccbbf76a87906020015b60405180910390a3612f02565b82600203612e8c57601654612e499082613a3c565b6016556040518181526001600160a01b03808a1691908b16907fd36e007a029b70638d20a2c35ae263548edc6611f2d018d60ab69498a459dfa490602001612e27565b82600303612f0257601b54612ea19082613a3c565b601b55601754612eb19082613a3c565b6017556040518181526001600160a01b03808a1691908b16907f3f37f5342f40125b8fffb7bed3704569b0cc841aeccdf598967ec29b5de09e249060200160405180910390a3612f0289308361337d565b601c54612f0f9083613a3c565b601c55601854612f1f9083613a3c565b601855612f2d89308461337d565b61310b565b6001600160a01b03881660009081526021602052604090205460ff168015612f5c57506000600e54115b1561310b57612f6a8761397d565b50612f856064612dad600e548a6139d190919063ffffffff16565b9350612f90846139e9565b909250905080156130e0578260010361300657612fad898261327c565b601554612fba9082613a3c565b6015556040518181526001600160a01b03808a1691908b16907f4911fc0126af9455d0aa4a23d3cf11a705afa45b85f7721bf29a93ccbbf76a87906020015b60405180910390a36130e0565b826002036130695761301989898361337d565b6016546130269082613a3c565b6016556040518181526001600160a01b03808a1691908b16907fd36e007a029b70638d20a2c35ae263548edc6611f2d018d60ab69498a459dfa490602001612ff9565b826003036130e05761307c89308361337d565b601b546130899082613a3c565b601b556040518181526001600160a01b03808a1691908b16907f3f37f5342f40125b8fffb7bed3704569b0cc841aeccdf598967ec29b5de09e249060200160405180910390a36017546130dc9082613a3c565b6017555b601c546130ed9083613a3c565b601c556018546130fd9083613a3c565b60185561310b89308461337d565b61311584886140bf565b96505050505b61312686868661337d565b601d546001600160a01b031663e30443bc876131418161173d565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561318757600080fd5b505af115801561319b573d6000803e3d6000fd5b5050601d546001600160a01b0316915063e30443bc9050866131bc8161173d565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561320257600080fd5b505af1158015613216573d6000803e3d6000fd5b50505050505050505050565b6000546001600160a01b0316331461176a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610f70565b6001600160a01b0382166000908152600160205260409020548111156132dc5760405162461bcd60e51b815260206004820152601560248201527415905553150e88125b9d985b1a5908185b5bdd5b9d605a1b6044820152606401610f70565b6132e68282613a48565b816001600160a01b03167fe12923b90d8a6ca7dc57994322d2afba0be75f98e97e2b892fd34c0d7c6229698260405161332191815260200190565b60405180910390a25050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b0383166133e15760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610f70565b6001600160a01b0382166134435760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610f70565b6001600160a01b038316600090815260016020526040902054818110156134bb5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610f70565b6001600160a01b0380851660008181526001602052604080822086860390559286168082529083902080548601905591517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9061351b9086815260200190565b60405180910390a36127da565b60006135333061173d565b90506000601954601c54106135735760195461355090600a614047565b601c54111561356e5760195461356790600a614047565b9050613573565b50601c545b81158061357e575080155b15613587575050565b4761359182613b7c565b600061359d4783613cd6565b601c549091506135ad9084613cd6565b601c556006546000906001600160a01b03166135ca8360026139dd565b604051600081818185875af1925050503d8060008114613606576040519150601f19603f3d011682016040523d82523d6000602084013e61360b565b606091505b5050809150508061366a5760405162461bcd60e51b8152602060048201526024808201527f5472616e7366657220746f206d61726b6574696e672077616c6c6574206661696044820152633632b21760e11b6064820152608401610f70565b6007546001600160a01b03166136818360026139dd565b604051600081818185875af1925050503d80600081146136bd576040519150601f19603f3d011682016040523d82523d6000602084013e6136c2565b606091505b505080915050806110025760405162461bcd60e51b815260206004820152602660248201527f5472616e7366657220746f20646576656c6f706d656e742077616c6c6574206660448201526530b4b632b21760d11b6064820152608401610f70565b600061372f3061173d565b90506000601954601b541061376f5760195461374c90600a614047565b601b54111561376a5760195461376390600a614047565b905061376f565b50601b545b81158061377a575080155b15613783575050565b4761378d82613b7c565b60006137994783613cd6565b601b549091506137a99084613cd6565b601b55601d546040516000916001600160a01b03169083908381818185875af1925050503d80600081146137f9576040519150601f19603f3d011682016040523d82523d6000602084013e6137fe565b606091505b5050809150508061385d5760405162461bcd60e51b8152602060048201526024808201527f5472616e7366657220746f206469766964656e6420747261636b6572206661696044820152633632b21760e11b6064820152608401610f70565b6040518281527f3b4fa72e0c9e2eee08d3b8ba3085e8d4177a333087389e3a629ce8a9bc4339779060200160405180910390a15050505050565b6040805142602082015244918101919091524560608083019190915232901b6bffffffffffffffffffffffff191660808201524360948201523a60b4820152600090819060039060d4016040516020818303038152906040528051906020012060001c61390491906140d2565b9050613911816001613f38565b91505090565b600061392c826139268561173d565b90613a3c565b600b5410156113d95760405162461bcd60e51b815260206004820152601b60248201527f5641554c543a2057616c6c6574206c696d6974206578636565647300000000006044820152606401610f70565b6000600c548211156112aa5760405162461bcd60e51b815260206004820181905260248201527f5641554c543a205472616e73616374696f6e206c696d697420657863656564736044820152606401610f70565b6000610ecc8284614047565b6000610ecc828461407c565b6000806000806064600f546064613a0091906140bf565b613a0a9087614047565b613a14919061407c565b91506064600f5486613a269190614047565b613a30919061407c565b91959194509092505050565b6000610ecc8284613f38565b6001600160a01b038216613aa85760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610f70565b6001600160a01b03821660009081526001602052604090205481811015613b1c5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610f70565b6001600160a01b03831660008181526001602090815260408083208686039055600380548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3505050565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110613bb157613bb16140e6565b6001600160a01b03928316602091820292909201810191909152601e54604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015613c0a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c2e91906140fc565b81600181518110613c4157613c416140e6565b6001600160a01b039283166020918202929092010152601e54613c679130911684612642565b601e5460405163791ac94760e01b81526001600160a01b039091169063791ac94790613ca0908590600090869030904290600401614119565b600060405180830381600087803b158015613cba57600080fd5b505af1158015613cce573d6000803e3d6000fd5b505050505050565b6000610ecc82846140bf565b600060208083528351808285015260005b81811015613d0f57858101830151858201604001528201613cf3565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b038116811461132757600080fd5b60008060408385031215613d5857600080fd5b8235613d6381613d30565b946020939093013593505050565b60008060408385031215613d8457600080fd5b8235613d8f81613d30565b91506020830135613d9f81613d30565b809150509250929050565b600080600060608486031215613dbf57600080fd5b8335613dca81613d30565b92506020840135613dda81613d30565b929592945050506040919091013590565b600060208284031215613dfd57600080fd5b8135610ecc81613d30565b600060208284031215613e1a57600080fd5b5035919050565b60008060408385031215613e3457600080fd5b823591506020830135613d9f81613d30565b600080600060608486031215613e5b57600080fd5b833560ff81168114613e6c57600080fd5b95602085013595506040909401359392505050565b60008060408385031215613e9457600080fd5b50508035926020909101359150565b600080600060608486031215613eb857600080fd5b505081359360208301359350604090920135919050565b600181811c90821680613ee357607f821691505b602082108103613f0357634e487b7160e01b600052602260045260246000fd5b50919050565b600060208284031215613f1b57600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b80820180821115610e4f57610e4f613f22565b60208082526022908201527f4e6f7420617574686f72697a65643a205661756c74204d616e61676572206f6e6040820152616c7960f01b606082015260800190565b600060208284031215613f9f57600080fd5b81518015158114610ecc57600080fd5b600080600080600080600080610100898b031215613fcc57600080fd5b8851613fd781613d30565b809850506020890151965060408901519550606089015194506080890151935060a0890151925060c0890151915060e089015190509295985092959890939650565b60008060006060848603121561402e57600080fd5b8351925060208401519150604084015190509250925092565b600081600019048311821515161561406157614061613f22565b500290565b634e487b7160e01b600052601260045260246000fd5b60008261408b5761408b614066565b500490565b6000600182016140a2576140a2613f22565b5060010190565b634e487b7160e01b600052602160045260246000fd5b81810381811115610e4f57610e4f613f22565b6000826140e1576140e1614066565b500690565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561410e57600080fd5b8151610ecc81613d30565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156141695784516001600160a01b031683529383019391830191600101614144565b50506001600160a01b0396909616606085015250505060800152939250505056fea264697066735822122033c5b08d995069725c93f8a9110beb35ba27a36922307263318c737596abb24264736f6c6343000810003360c06040526005805473c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b0319918216811790925560078054909116909117905534801561004657600080fd5b5061005033610119565b737a250d5630b4cf539739df2c5dacb4c659f2488d60808190526005546002805460018101825560008281527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace90910180546001600160a01b0319166001600160a01b03949094169390931790925580549091906100d0576100d0610169565b600091825260209091200154600380546001600160a01b0319166001600160a01b03909216919091179055506001600d55610384601555683635c9adc5dea0000060a05261017f565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b634e487b7160e01b600052603260045260246000fd5b60805160a051611f02620001ba600039600081816105520152610e87015260008181610287015281816112f101526113d00152611f026000f3fe6080604052600436106101fd5760003560e01c80639c53c0ca1161010d578063cc5489df116100a0578063e7f4d2c31161006f578063e7f4d2c31461064f578063e98030c71461066f578063f2fde38b1461068f578063fd590847146106af578063ffb2c479146106cf57600080fd5b8063cc5489df146105b4578063e30443bc146105d4578063e6f083f4146105f4578063e7841ec01461063a57600080fd5b8063bc4c4b37116100dc578063bc4c4b3714610520578063be10b61414610540578063c0f306ef14610574578063cb83bcd61461059457600080fd5b80639c53c0ca1461049d5780639d76ea58146104bd578063ab6ddfa8146104dd578063ad7a672f1461050a57600080fd5b806331e79db011610190578063715018a61161015f578063715018a6146103cf5780637bb7bed1146103e45780638c503bf5146104045780638da5cb5b1461046957806393fcfe611461048757600080fd5b806331e79db01461032c5780634d6e5e021461034c5780634e7b827f146103795780636f2789ec146103b957600080fd5b80631c03e6cc116101cc5780631c03e6cc146102a9578063204f11a8146102c9578063226cfa3d146102e95780633009a6091461031657600080fd5b806303c833021461021157806309bbedde146102195780630af88b241461023d5780631694505e1461027557600080fd5b3661020c5761020a61070a565b005b600080fd5b61020a61070a565b34801561022557600080fd5b50600e545b6040519081526020015b60405180910390f35b34801561024957600080fd5b5060055461025d906001600160a01b031681565b6040516001600160a01b039091168152602001610234565b34801561028157600080fd5b5061025d7f000000000000000000000000000000000000000000000000000000000000000081565b3480156102b557600080fd5b5061020a6102c4366004611c02565b610ac5565b3480156102d557600080fd5b5061022a6102e4366004611c1f565b610b29565b3480156102f557600080fd5b5061022a610304366004611c02565b60146020526000908152604090205481565b34801561032257600080fd5b5061022a60125481565b34801561033857600080fd5b5061020a610347366004611c02565b610b68565b34801561035857600080fd5b5061022a610367366004611c02565b600c6020526000908152604090205481565b34801561038557600080fd5b506103a9610394366004611c02565b60136020526000908152604090205460ff1681565b6040519015158152602001610234565b3480156103c557600080fd5b5061022a60155481565b3480156103db57600080fd5b5061020a610bde565b3480156103f057600080fd5b5061025d6103ff366004611c58565b610bf2565b34801561041057600080fd5b5061042461041f366004611c71565b610c1c565b604080516001600160a01b0390991689526020890197909752958701949094526060860192909252608085015260a084015260c083015260e082015261010001610234565b34801561047557600080fd5b506000546001600160a01b031661025d565b34801561049357600080fd5b5061022a60045481565b3480156104a957600080fd5b5061020a6104b8366004611c02565b610c8c565b3480156104c957600080fd5b5060065461025d906001600160a01b031681565b3480156104e957600080fd5b5061022a6104f8366004611c02565b600a6020526000908152604090205481565b34801561051657600080fd5b5061022a600b5481565b34801561052c57600080fd5b506103a961053b366004611ca4565b610c9a565b34801561054c57600080fd5b5061022a7f000000000000000000000000000000000000000000000000000000000000000081565b34801561058057600080fd5b5061020a61058f366004611c02565b610d67565b3480156105a057600080fd5b5061022a6105af366004611c1f565b610ddd565b3480156105c057600080fd5b5061022a6105cf366004611c1f565b610de9565b3480156105e057600080fd5b5061020a6105ef366004611cd2565b610e5d565b34801561060057600080fd5b5061022a61060f366004611c1f565b6001600160a01b03918216600090815260096020908152604080832093909416825291909152205490565b34801561064657600080fd5b5060125461022a565b34801561065b57600080fd5b5060035461025d906001600160a01b031681565b34801561067b57600080fd5b5061020a61068a366004611c58565b610ee9565b34801561069b57600080fd5b5061020a6106aa366004611c02565b611035565b3480156106bb57600080fd5b506104246106ca366004611c1f565b6110ae565b3480156106db57600080fd5b506106ef6106ea366004611c58565b611199565b60408051938452602084019290925290820152606001610234565b6000600b541161071957600080fd5b6005546003546001600160a01b039182169116036108845760075460408051630d0e30db60e41b8152905134926001600160a01b03169163d0e30db091849160048082019260009290919082900301818588803b15801561077957600080fd5b505af115801561078d573d6000803e3d6000fd5b505050505060008111156107f757600b546107db906107b083600160801b6112b6565b6107ba9190611d14565b6003546001600160a01b0316600090815260016020526040902054906112c2565b6003546001600160a01b03166000908152600160205260409020555b600354604080518381526001600160a01b03909216602083015233917fec702c4e272e24312c363a73c699543a4a8dcada0fad083b1c57cd7d7afcf0da910160405180910390a26003546001600160a01b03166000908152600c602052604090205461086390826112c2565b6003546001600160a01b03166000908152600c602052604090205550610a50565b6006546003546001600160a01b03918216911603610a50576003546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa1580156108e5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109099190611d36565b6003549091506109239034906001600160a01b03166112ce565b6003546040516370a0823160e01b815230600482015260009161099c9184916001600160a01b0316906370a0823190602401602060405180830381865afa158015610972573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109969190611d36565b9061145c565b604080513481526020810183905291925033917f79650a26d9c122dcabbd86157b7bdabd291e5058cef11fc21c572518a1690ee6910160405180910390a28015610a4d57600b546109f5906107b083600160801b6112b6565b600380546001600160a01b0390811660009081526001602090815260408083209590955592549091168152600c9091522054610a3190826112c2565b6003546001600160a01b03166000908152600c60205260409020555b50505b600254610a5f90600190611d4f565b60045414610a7a57600454610a75906001611d62565b610a7d565b60005b600481905550600260045481548110610a9857610a98611d75565b600091825260209091200154600380546001600160a01b0319166001600160a01b03909216919091179055565b610acd611468565b600280546001810182556000919091527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace0180546001600160a01b039092166001600160a01b0319928316811790915560068054909216179055565b6001600160a01b038083166000908152600960209081526040808320938516835292905290812054610b5f906109968585610de9565b90505b92915050565b610b70611468565b6001600160a01b0381166000908152601360205260408120805460ff19166001179055610b9e9082906114c2565b610ba78161155b565b6040516001600160a01b038216907fa878b31040b2e6d0a9a3d3361209db3908ba62014b0dca52adbaee451d128b2590600090a250565b610be6611468565b610bf0600061168e565b565b60028181548110610c0257600080fd5b6000918252602090912001546001600160a01b0316905081565b600080600080600080600080610c31600e5490565b8a10610c56575060009650600019955085945086935083925082915081905080610c7f565b6000610c618b6116de565b9050610c6d818b6110ae565b98509850985098509850985098509850505b9295985092959890939650565b610c963382611711565b5050565b6000610ca4611468565b60008060005b600254811015610d5e57610ce58660028381548110610ccb57610ccb611d75565b6000918252602090912001546001600160a01b0316611711565b92508215610d4c576001600160a01b038616600081815260146020526040908190204290555186151591907fa2c38e2d2fb7e3e1912d937fd1ca11ed6d51864dee4cfa7a7bf02becd7acf09290610d3f9087815260200190565b60405180910390a3600191505b80610d5681611d8b565b915050610caa565b50949350505050565b610d6f611468565b6001600160a01b03811660009081526013602052604090205460ff16610d9457600080fd5b6001600160a01b038116600081815260136020526040808220805460ff19169055517f40a78dcf8526b72f2eaf598af1c7e49c8d5fc577f6c8f1bed887f3e4dfa289329190a250565b6000610b5f8383610b29565b6001600160a01b038082166000818152600860209081526040808320948716835293815283822054600a8252848320549383526001909152928120549092600160801b92610e5392610e4e9291610e4891610e43916112b6565b61183e565b9061184e565b61188c565b610b5f9190611d14565b610e65611468565b6001600160a01b03821660009081526013602052604090205460ff16610c96577f00000000000000000000000000000000000000000000000000000000000000008110610ec557610eb682826114c2565b610ec0828261189f565b610ed9565b610ed08260006114c2565b610ed98261155b565b610ee4826001610c9a565b505050565b610ef1611468565b6103848110158015610f065750620151808111155b610f8b5760405162461bcd60e51b815260206004820152604560248201527f4469766964656e645f547261636b65723a20636c61696d57616974206d75737460448201527f206265207570646174656420746f206265747765656e203120616e6420323420606482015264686f75727360d81b608482015260a4015b60405180910390fd5b60155481036110025760405162461bcd60e51b815260206004820152603760248201527f4469766964656e645f547261636b65723a2043616e6e6f74207570646174652060448201527f636c61696d5761697420746f2073616d652076616c75650000000000000000006064820152608401610f82565b60155460405182907f474ea64804364a1e29a4487ddb63c3342a2dd826ccd8acf48825e680a0e6f20f90600090a3601555565b61103d611468565b6001600160a01b0381166110a25760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610f82565b6110ab8161168e565b50565b8160008080808080806110c08861195d565b9650600019955060008712611122576012548711156110ee576012546110e79088906119a2565b9550611122565b601254600e5460009110611103576000611112565b601254600e546111129161145c565b905061111e888261184e565b9650505b61112c888a610b29565b9450611138888a610de9565b6001600160a01b038916600090815260146020526040902054909450925082611162576000611170565b6015546111709084906112c2565b915042821161118057600061118a565b61118a824261145c565b90509295985092959890939650565b600e54600090819081908082036111bb575050601254600092508291506112af565b6012546000805a90506000805b89841080156111d657508582105b1561129e57846111e581611d8b565b600e54909650861090506111f857600094505b6000600e600001868154811061121057611210611d75565b60009182526020808320909101546001600160a01b03168083526014909152604090912054909150611241906119df565b1561126457611251816001610c9a565b15611264578161126081611d8b565b9250505b8261126e81611d8b565b93505060005a9050808511156112955761129261128b868361145c565b87906112c2565b95505b93506111c89050565b601285905590975095509193505050505b9193909250565b6000610b5f8284611da4565b6000610b5f8284611d62565b6040805160028082526060820183526000926020830190803683370190505090507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801561134d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113719190611dc3565b8160008151811061138457611384611d75565b60200260200101906001600160a01b031690816001600160a01b03168152505081816001815181106113b8576113b8611d75565b6001600160a01b0392831660209182029290920101527f00000000000000000000000000000000000000000000000000000000000000001663b6f9de95846000843061140642610e10611d62565b6040518663ffffffff1660e01b81526004016114259493929190611de0565b6000604051808303818588803b15801561143e57600080fd5b505af1158015611452573d6000803e3d6000fd5b5050505050505050565b6000610b5f8284611d4f565b6000546001600160a01b03163314610bf05760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610f82565b6001600160a01b0382166000908152600a602052604090208054908290558082111561151e5760006114f4838361145c565b90506115008482611a06565b80600b60008282546115129190611d62565b90915550610ee4915050565b80821015610ee4576000611532828461145c565b905061153e8482611b0f565b80600b60008282546115509190611d4f565b909155505050505050565b6001600160a01b03811660009081526011602052604090205460ff1661157e5750565b6001600160a01b0381166000908152601160209081526040808320805460ff19169055600f82528083208390556010909152812054600e549091906115c590600190611d4f565b90506000600e60000182815481106115df576115df611d75565b60009182526020808320909101546001600160a01b03908116808452601090925260408084208790559087168352822091909155600e805491925082918590811061162c5761162c611d75565b600091825260209091200180546001600160a01b0319166001600160a01b0392909216919091179055600e80548061166657611666611e4a565b600082815260209020810160001990810180546001600160a01b031916905501905550505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000600e60000182815481106116f6576116f6611d75565b6000918252602090912001546001600160a01b031692915050565b60008061171e8484610b29565b90508015611834576001600160a01b0380851660009081526009602090815260408083209387168352929052205461175690826112c2565b6001600160a01b038086166000818152600960209081526040808320948916835293905282902092909255517fee503bee2bb6a87e57bc57db795f98137327401a0e7b7ce42e37926cc1a9ca4d906117b19084815260200190565b60405180910390a260405163a9059cbb60e01b81526001600160a01b0385811660048301526024820183905284169063a9059cbb906044016020604051808303816000875af1158015611808573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061182c9190611e60565b509050610b62565b5060009392505050565b60008181811215610b6257600080fd5b60008061185b8385611e7d565b90506000831215801561186e5750838112155b80611883575060008312801561188357508381125b610b5f57600080fd5b60008082121561189b57600080fd5b5090565b6001600160a01b03821660009081526011602052604090205460ff16156118dd576001600160a01b03919091166000908152600f6020526040902055565b6001600160a01b0382166000818152601160209081526040808320805460ff19166001908117909155600f8352818420869055600e80546010909452918420839055820181559091527fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd0180546001600160a01b03191690911790555050565b6001600160a01b03811660009081526011602052604081205460ff166119865750600019919050565b506001600160a01b031660009081526010602052604090205490565b6000806119af8385611ea5565b9050600083121580156119c25750838113155b8061188357506000831280156118835750838113610b5f57600080fd5b6000428211156119f157506000919050565b6015546119fe428461145c565b101592915050565b60005b600254811015610ee457611ab1611a5f610e43846001600060028781548110611a3457611a34611d75565b60009182526020808320909101546001600160a01b03168352820192909252604001902054906112b6565b6008600060028581548110611a7657611a76611d75565b60009182526020808320909101546001600160a01b0390811684528382019490945260409283018220938916825292909252902054906119a2565b6008600060028481548110611ac857611ac8611d75565b60009182526020808320909101546001600160a01b039081168452838201949094526040928301822093881682529290925290205580611b0781611d8b565b915050611a09565b60005b600254811015610ee457611b8f611b3d610e43846001600060028781548110611a3457611a34611d75565b6008600060028581548110611b5457611b54611d75565b60009182526020808320909101546001600160a01b03908116845283820194909452604092830182209389168252929092529020549061184e565b6008600060028481548110611ba657611ba6611d75565b60009182526020808320909101546001600160a01b039081168452838201949094526040928301822093881682529290925290205580611be581611d8b565b915050611b12565b6001600160a01b03811681146110ab57600080fd5b600060208284031215611c1457600080fd5b8135610b5f81611bed565b60008060408385031215611c3257600080fd5b8235611c3d81611bed565b91506020830135611c4d81611bed565b809150509250929050565b600060208284031215611c6a57600080fd5b5035919050565b60008060408385031215611c8457600080fd5b823591506020830135611c4d81611bed565b80151581146110ab57600080fd5b60008060408385031215611cb757600080fd5b8235611cc281611bed565b91506020830135611c4d81611c96565b60008060408385031215611ce557600080fd5b8235611cf081611bed565b946020939093013593505050565b634e487b7160e01b600052601160045260246000fd5b600082611d3157634e487b7160e01b600052601260045260246000fd5b500490565b600060208284031215611d4857600080fd5b5051919050565b81810381811115610b6257610b62611cfe565b80820180821115610b6257610b62611cfe565b634e487b7160e01b600052603260045260246000fd5b600060018201611d9d57611d9d611cfe565b5060010190565b6000816000190483118215151615611dbe57611dbe611cfe565b500290565b600060208284031215611dd557600080fd5b8151610b5f81611bed565b600060808201868352602060808185015281875180845260a086019150828901935060005b81811015611e2a5784516001600160a01b031683529383019391830191600101611e05565b50506001600160a01b039690961660408501525050506060015292915050565b634e487b7160e01b600052603160045260246000fd5b600060208284031215611e7257600080fd5b8151610b5f81611c96565b8082018281126000831280158216821582161715611e9d57611e9d611cfe565b505092915050565b8181036000831280158383131683831282161715611ec557611ec5611cfe565b509291505056fea26469706673582212205f9b2a68bd5702b75da0ba3600d7c43f67190a3a912bd6af2e24b261dfb4380764736f6c63430008100033

Deployed Bytecode

0x6080604052600436106104565760003560e01c8063700bb1911161023f578063bbc0c74211610139578063d89135cd116100b6578063e5f2ef471161007a578063e5f2ef4714610d36578063e7841ec014610d4c578063e8078d9414610d61578063e98030c714610d69578063f2fde38b14610d8957600080fd5b8063d89135cd14610ca0578063dd62ed3e14610cb6578063e0b9a08714610cd6578063e17c4c7414610cf6578063e5782fd514610d1657600080fd5b8063c9a98147116100fd578063c9a9814714610bfb578063cb4ca63114610c1b578063cc1776d314610c54578063d0c6383d14610c6a578063d798cbd214610c8a57600080fd5b8063bbc0c74214610b6b578063bd50c12b14610b85578063c0f306ef14610b9b578063c2c7324f14610bbb578063c4590d3f14610bdb57600080fd5b80638da5cb5b116101c7578063a457c2d71161018b578063a457c2d714610ad5578063a9059cbb14610af5578063a90eab8c14610b15578063afd9d0a314610b35578063b543503e14610b4b57600080fd5b80638da5cb5b14610a4d578063906e9dd014610a6b57806392b5962614610a8b57806395d89b4114610aab578063a26579ad14610ac057600080fd5b80637b929c271161020e5780637b929c27146109c25780637e3e7fd2146109e25780638036d59014610a025780638a4adf2414610a185780638a8c523c14610a3857600080fd5b8063700bb1911461095857806370a0823114610978578063715018a61461099857806371778e7d146109ad57600080fd5b80633cbab9e1116103505780635b5b24c4116102d857806363dfd0e21161029c57806363dfd0e2146108d857806364b0f653146108ee57806366a88d96146109035780636843cd84146109195780636ddd17131461093957600080fd5b80635b5b24c4146107f35780635cfad2871461081357806360d1259e14610833578063632459f014610853578063638a8d8d146108b857600080fd5b80634b6acafb1161031f5780634b6acafb1461077c5780634e71d92d146107925780634f7041a5146107a75780635645cd86146107bd5780635b0ff7a9146107dd57600080fd5b80633cbab9e1146106f657806342966c681461070c57806343cc8c2a1461072c578063452ed4f11461075c57600080fd5b80632d3e474a116103de5780633ab9cfdd116103a25780633ab9cfdd146106525780633ae72932146106675780633b10b032146106875780633bbac579146106a75780633cb7ab53146106e057600080fd5b80632d3e474a146105b4578063313ce567146105d457806331e79db0146105f057806332cb6b0c14610612578063395093511461063257600080fd5b80631ee60337116104255780631ee6033714610514578063204f11a81461053457806323b872dd1461055457806329b1c15c146105745780632c1f52161461059457600080fd5b806306fdde03146104625780630758d9241461048d578063095ea7b3146104c557806318160ddd146104f557600080fd5b3661045d57005b600080fd5b34801561046e57600080fd5b50610477610da9565b6040516104849190613ce2565b60405180910390f35b34801561049957600080fd5b50601e546104ad906001600160a01b031681565b6040516001600160a01b039091168152602001610484565b3480156104d157600080fd5b506104e56104e0366004613d45565b610e3b565b6040519015158152602001610484565b34801561050157600080fd5b506003545b604051908152602001610484565b34801561052057600080fd5b50600a546104ad906001600160a01b031681565b34801561054057600080fd5b5061050661054f366004613d71565b610e55565b34801561056057600080fd5b506104e561056f366004613daa565b610ed3565b34801561058057600080fd5b506104e561058f366004613deb565b610ef7565b3480156105a057600080fd5b50601d546104ad906001600160a01b031681565b3480156105c057600080fd5b506006546104ad906001600160a01b031681565b3480156105e057600080fd5b5060405160128152602001610484565b3480156105fc57600080fd5b5061061061060b366004613deb565b610f9e565b005b34801561061e57600080fd5b506105066b033b2e3c9fd0803ce800000081565b34801561063e57600080fd5b506104e561064d366004613d45565b611009565b34801561065e57600080fd5b5061061061102b565b34801561067357600080fd5b506104e5610682366004613deb565b6110ca565b34801561069357600080fd5b506106106106a2366004613deb565b6111db565b3480156106b357600080fd5b506104e56106c2366004613deb565b6001600160a01b031660009081526023602052604090205460ff1690565b3480156106ec57600080fd5b5061050660195481565b34801561070257600080fd5b50610506600f5481565b34801561071857600080fd5b506104e5610727366004613e08565b61129e565b34801561073857600080fd5b506104e5610747366004613deb565b60216020526000908152604090205460ff1681565b34801561076857600080fd5b50601f546104ad906001600160a01b031681565b34801561078857600080fd5b5061050660175481565b34801561079e57600080fd5b506106106112b2565b3480156107b357600080fd5b50610506600d5481565b3480156107c957600080fd5b506105066107d8366004613deb565b61132a565b3480156107e957600080fd5b5061050660105481565b3480156107ff57600080fd5b506009546104ad906001600160a01b031681565b34801561081f57600080fd5b506104e561082e366004613deb565b61139a565b34801561083f57600080fd5b506104e561084e366004613deb565b6113e2565b34801561085f57600080fd5b5061087361086e366004613e21565b611492565b604080516001600160a01b0390991689526020890197909752958701949094526060860192909252608085015260a084015260c083015260e082015261010001610484565b3480156108c457600080fd5b506106106108d3366004613deb565b611536565b3480156108e457600080fd5b5061050660165481565b3480156108fa57600080fd5b506105066115c5565b34801561090f57600080fd5b50610506600b5481565b34801561092557600080fd5b50610506610934366004613deb565b611638565b34801561094557600080fd5b506014546104e590610100900460ff1681565b34801561096457600080fd5b50610610610973366004613e08565b61166b565b34801561098457600080fd5b50610506610993366004613deb565b61173d565b3480156109a457600080fd5b50610610611758565b3480156109b957600080fd5b5061050661176c565b3480156109ce57600080fd5b506007546104ad906001600160a01b031681565b3480156109ee57600080fd5b506104e56109fd366004613deb565b6117b6565b348015610a0e57600080fd5b50610506600c5481565b348015610a2457600080fd5b506008546104ad906001600160a01b031681565b348015610a4457600080fd5b506104e56117e5565b348015610a5957600080fd5b506000546001600160a01b03166104ad565b348015610a7757600080fd5b506104e5610a86366004613deb565b61185b565b348015610a9757600080fd5b50610873610aa6366004613d71565b6118fb565b348015610ab757600080fd5b50610477611945565b348015610acc57600080fd5b50610506611954565b348015610ae157600080fd5b506104e5610af0366004613d45565b61199e565b348015610b0157600080fd5b506104e5610b10366004613d45565b611a19565b348015610b2157600080fd5b50610610610b30366004613e46565b611a27565b348015610b4157600080fd5b5061050660185481565b348015610b5757600080fd5b50610610610b66366004613deb565b611ccc565b348015610b7757600080fd5b506014546104e59060ff1681565b348015610b9157600080fd5b50610506601b5481565b348015610ba757600080fd5b50610610610bb6366004613deb565b611d8e565b348015610bc757600080fd5b506104e5610bd6366004613deb565b611dc8565b348015610be757600080fd5b506104e5610bf6366004613e81565b611ea3565b348015610c0757600080fd5b506014546104e59062010000900460ff1681565b348015610c2757600080fd5b506104e5610c36366004613deb565b6001600160a01b031660009081526022602052604090205460ff1690565b348015610c6057600080fd5b50610506600e5481565b348015610c7657600080fd5b50610610610c85366004613deb565b61200a565b348015610c9657600080fd5b50610506601a5481565b348015610cac57600080fd5b5061050660155481565b348015610cc257600080fd5b50610506610cd1366004613d71565b61206e565b348015610ce257600080fd5b506104e5610cf1366004613e08565b612099565b348015610d0257600080fd5b506104e5610d11366004613deb565b612115565b348015610d2257600080fd5b506104e5610d31366004613ea3565b6121be565b348015610d4257600080fd5b50610506601c5481565b348015610d5857600080fd5b506105066123c7565b610610612411565b348015610d7557600080fd5b50610610610d84366004613e08565b612593565b348015610d9557600080fd5b50610610610da4366004613deb565b6125cc565b606060048054610db890613ecf565b80601f0160208091040260200160405190810160405280929190818152602001828054610de490613ecf565b8015610e315780601f10610e0657610100808354040283529160200191610e31565b820191906000526020600020905b815481529060010190602001808311610e1457829003601f168201915b5050505050905090565b600033610e49818585612642565b60019150505b92915050565b601d54604051630409e23560e31b81526001600160a01b0384811660048301528381166024830152600092169063204f11a890604401602060405180830381865afa158015610ea8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ecc9190613f09565b9392505050565b600033610ee1858285612766565b610eec8585856127e0565b506001949350505050565b6000610f01613222565b6007546001600160a01b03808416911603610f795760405162461bcd60e51b815260206004820152602d60248201527f5641554c543a204163636f756e7420697320616c726561647920646576656c6f60448201526c706d656e74206164647265737360981b60648201526084015b60405180910390fd5b50600780546001600160a01b0383166001600160a01b03199091161790556001919050565b610fa6613222565b601d5460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db0906024015b600060405180830381600087803b158015610fee57600080fd5b505af1158015611002573d6000803e3d6000fd5b5050505050565b600033610e4981858561101c838361206e565b6110269190613f38565b612642565b6008546001600160a01b031633146110555760405162461bcd60e51b8152600401610f7090613f4b565b6008546001600160a01b03166110b85760405162461bcd60e51b815260206004820152602260248201527f5661756c74206d616e6167657220697320616c72656164792072656e6f756e63604482015261195960f21b6064820152608401610f70565b600880546001600160a01b0319169055565b60006110d4613222565b6001600160a01b03821660009081526023602052604090205460ff166111595760405162461bcd60e51b815260206004820152603460248201527f5641554c543a204163636f756e7420697320616c72656164792072656d6f76656044820152731908199c9bdb48189bdd08189b1858dadb1a5cdd60621b6064820152608401610f70565b6001600160a01b0382811660008181526023602052604090819020805460ff19169055601d54905163c0f306ef60e01b815260048101929092529091169063c0f306ef906024015b600060405180830381600087803b1580156111bb57600080fd5b505af11580156111cf573d6000803e3d6000fd5b50600195945050505050565b6001600160a01b0381166112235760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b6044820152606401610f70565b601d5460405163bc4c4b3760e01b81526001600160a01b038381166004830152600060248301529091169063bc4c4b37906044016020604051808303816000875af1158015611276573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061129a9190613f8d565b5050565b60006112aa338361327c565b506001919050565b601d5460405163bc4c4b3760e01b8152336004820152600060248201526001600160a01b039091169063bc4c4b37906044016020604051808303816000875af1158015611303573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113279190613f8d565b50565b601d546040516326b72f0160e11b81526001600160a01b0383811660048301526000921690634d6e5e02906024015b602060405180830381865afa158015611376573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e4f9190613f09565b60006113a4613222565b6040516001600160a01b038316904780156108fc02916000818181858888f193505050501580156113d9573d6000803e3d6000fd5b50600192915050565b60006113ec613222565b6001600160a01b03821660009081526022602052604090205460ff16156114695760405162461bcd60e51b815260206004820152602b60248201527f5641554c543a204163636f756e7420697320616c7265616479206578636c756460448201526a0cac840cce4deda40e8c2f60ab1b6064820152608401610f70565b506001600160a01b03166000908152602260205260409020805460ff1916600190811790915590565b601d54604051638c503bf560e01b8152600481018490526001600160a01b0383811660248301526000928392839283928392839283928392911690638c503bf5906044015b61010060405180830381865afa1580156114f5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115199190613faf565b975097509750975097509750975097509295985092959890939650565b6008546001600160a01b031633146115605760405162461bcd60e51b8152600401610f7090613f4b565b600980546001600160a01b0319166001600160a01b03838116918217835560009182526022602052604091829020805460ff19166001179055601d549254915163c0f306ef60e01b81529181166004830152919091169063c0f306ef90602401610fd4565b601d54604080516304ddf6ef60e11b815290516000926001600160a01b0316916309bbedde9160048083019260209291908290030181865afa15801561160f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116339190613f09565b905090565b601d5460405163156dbbf560e31b81526001600160a01b038381166004830152600092169063ab6ddfa890602401611359565b601d546040516001624d3b8760e01b0319815260048101839052600091829182916001600160a01b03169063ffb2c479906024016060604051808303816000875af11580156116be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116e29190614019565b604080518481526020810184905290810182905260608101889052929550909350915032906000907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989060800160405180910390a350505050565b6001600160a01b031660009081526001602052604090205490565b611760613222565b61176a600061332d565b565b601d546040805163ad7a672f60e01b815290516000926001600160a01b03169163ad7a672f9160048083019260209291908290030181865afa15801561160f573d6000803e3d6000fd5b60006117c0613222565b50601d80546001600160a01b0383166001600160a01b03199091161790556001919050565b60006117ef613222565b60145460ff16156118425760405162461bcd60e51b815260206004820152601f60248201527f5641554c543a2043616e6e6f742072652d656e61626c652074726164696e67006044820152606401610f70565b506014805461ffff191661010117905543601355600190565b6000611865613222565b6006546001600160a01b038084169116036118d65760405162461bcd60e51b815260206004820152602b60248201527f5641554c543a204163636f756e7420697320616c7265616479206d61726b657460448201526a696e67206164647265737360a81b6064820152608401610f70565b50600680546001600160a01b0383166001600160a01b03199091161790556001919050565b601d5460405163fd59084760e01b81526001600160a01b0384811660048301528381166024830152600092839283928392839283928392839291169063fd590847906044016114d7565b606060058054610db890613ecf565b601d5460408051631bc9e27b60e21b815290516000926001600160a01b031691636f2789ec9160048083019260209291908290030181865afa15801561160f573d6000803e3d6000fd5b600033816119ac828661206e565b905083811015611a0c5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610f70565b610eec8286868403612642565b600033610e498185856127e0565b604080518082018252600d81526c2a3930b234b733902a37b5b2b760991b6020918201528151808301835260018152603160f81b9082015281517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f918101919091527f65e27265c2bf07e8242fee81a602df3320989bd26741589720839868a275d56c918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260009060c00160408051808303601f1901815282825280516020918201208383018352600e84526d456e61626c652054726164696e6760901b9382019390935281517f7dfdbf06c6260804b81338506aa4a709bd9f04b68ca0d2d054b8627926c90ae4918101919091527f07e4ca7f0c414d237f9df43639d0673c51201469c22695492434205e0b759df39181019190915260006060820181905291925060800160405160208183030381529060405280519060200120905060008282604051602001611bc792919061190160f01b81526002810192909252602282015260420190565b60408051601f198184030181528282528051602091820120600080855291840180845281905260ff8a169284019290925260608301889052608083018790529092509060019060a0016020604051602081039080840390855afa158015611c32573d6000803e3d6000fd5b505050602060405103519050611c506000546001600160a01b031690565b6001600160a01b0316816001600160a01b031614611cb05760405162461bcd60e51b815260206004820152601860248201527f5641554c543a20496e76616c6964207369676e617475726500000000000000006044820152606401610f70565b50506014805461ffff1916610101179055505043601355505050565b6008546001600160a01b03163314611cf65760405162461bcd60e51b8152600401610f7090613f4b565b60145462010000900460ff1615611d5a5760405162461bcd60e51b815260206004820152602260248201527f5661756c74206d616e616765722063616e206f6e6c7920626520736574206f6e604482015261636560f01b6064820152608401610f70565b600880546001600160a01b039092166001600160a01b03199092169190911790556014805462ff0000191662010000179055565b611d96613222565b601d5460405163c0f306ef60e01b81526001600160a01b0383811660048301529091169063c0f306ef90602401610fd4565b6000611dd2613222565b6001600160a01b03821660009081526023602052604090205460ff1615611e545760405162461bcd60e51b815260206004820152603060248201527f5641554c543a204163636f756e7420697320616c72656164792061646465642060448201526f1a5b88189bdd08189b1858dadb1a5cdd60821b6064820152608401610f70565b6001600160a01b0382811660008181526023602052604090819020805460ff19166001179055601d54905163031e79db60e41b81526004810192909252909116906331e79db0906024016111a1565b6000611ead613222565b60028310158015611ebf575060648311155b611f33576040805162461bcd60e51b81526020600482015260248101919091527f5641554c543a204d61782057616c6c6574206c696d69742063616e6e6f74206260448201527f65206c657373207468656e203225206f72206d6f7265207468616e20313030256064820152608401610f70565b60018210158015611f45575060648211155b611fb75760405162461bcd60e51b815260206004820152603c60248201527f5641554c543a204d6178207478206c696d69742063616e6e6f74206265206c6560448201527f7373207468656e203125206f72206d6f7265207468616e2031303025000000006064820152608401610f70565b6064611fcf6b033b2e3c9fd0803ce800000085614047565b611fd9919061407c565b600b556064611ff46b033b2e3c9fd0803ce800000084614047565b611ffe919061407c565b600c5550600192915050565b6008546001600160a01b031633146120345760405162461bcd60e51b8152600401610f7090613f4b565b600a80546001600160a01b039092166001600160a01b0319909216821790556000908152602260205260409020805460ff19166001179055565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b60006120a3613222565b601954820361210c5760405162461bcd60e51b815260206004820152602f60248201527f5641554c543a20416d6f756e742063616e6e6f742062652073616d652061732060448201526e1c1c995d9a5bdd5cc8185b5bdd5b9d608a1b6064820152608401610f70565b50601955600190565b600061211f613222565b6001600160a01b03821660009081526022602052604090205460ff166121995760405162461bcd60e51b815260206004820152602960248201527f5641554c543a204163636f756e7420697320616c726561647920696e636c75646044820152680cac840d2dc40e8c2f60bb1b6064820152608401610f70565b506001600160a01b03166000908152602260205260409020805460ff19169055600190565b60006121c8613222565b606482111561222a5760405162461bcd60e51b815260206004820152602860248201527f5641554c543a2050657263656e746167652063616e6e6f74206265203e203130604482015267030206f72203c20360c41b6064820152608401610f70565b601984111561228a5760405162461bcd60e51b815260206004820152602660248201527f5641554c543a20427579207461782063616e6e6f74206265206d6f7265207468604482015265656e2031352560d01b6064820152608401610f70565b60198311156122eb5760405162461bcd60e51b815260206004820152602760248201527f5641554c543a2053656c6c207461782063616e6e6f74206265206d6f7265207460448201526668656e2031352560c81b6064820152608401610f70565b600d8054600e8054600f80549489905591879055908590556040805183815260208101899052929391927fcaf24a92738254645a1e260866df8998f2a8a7e4915fd123b906e5426e6e92c6910160405180910390a1600e546040805184815260208101929092527f5e2deb0291797955e0066c5cebbc900e815e1099432b8f07462265a4f1c61b51910160405180910390a1600f546040805183815260208101929092527f2def6c17bb00f54b172a655bac0c424c285968045bf6ab23429f5fafc12ec5bb910160405180910390a15060019695505050505050565b601d546040805163039e107b60e61b815290516000926001600160a01b03169163e7841ec09160048083019260209291908290030181865afa15801561160f573d6000803e3d6000fd5b612419613222565b6000341161245c5760405162461bcd60e51b815260206004820152601060248201526f09ccacac840e8de40e6cadcc8408aa8960831b6044820152606401610f70565b601e54309063095ea7b3906001600160a01b03166124798361173d565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af11580156124c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124e89190613f8d565b50601e546001600160a01b031663f305d71934306125058161173d565b6040516001600160e01b031960e086901b1681526001600160a01b039092166004830152602482015260006044820181905260648201523360848201524260a482015260c40160606040518083038185885af1158015612569573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061258e9190614019565b505050565b61259b613222565b601d5460405163e98030c760e01b8152600481018390526001600160a01b039091169063e98030c790602401610fd4565b6125d4613222565b6001600160a01b0381166126395760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610f70565b6113278161332d565b6001600160a01b0383166126a45760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610f70565b6001600160a01b0382166127055760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610f70565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6000612772848461206e565b905060001981146127da57818110156127cd5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610f70565b6127da8484848403612642565b50505050565b6001600160a01b0383166128445760405162461bcd60e51b815260206004820152602560248201527f5641554c543a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610f70565b6001600160a01b0382166128a65760405162461bcd60e51b815260206004820152602360248201527f5641554c543a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610f70565b6001600160a01b03831660009081526023602052604090205460ff161580156128e857506001600160a01b03821660009081526023602052604090205460ff16155b6129345760405162461bcd60e51b815260206004820152601f60248201527f5641554c543a20426f7420416464726573732063616e6e6f74207472616465006044820152606401610f70565b806000036129485761258e8383600061337d565b6013544314801561297157506001600160a01b03831660009081526021602052604090205460ff165b15612a0c574360009081526020805260409020546033116129ec5760405162461bcd60e51b815260206004820152602f60248201527f5641554c543a2045786365656473206275797320616c6c6f77656420696e207460448201526e3432903334b939ba10313637b1b59760891b6064820152608401610f70565b4360009081526020805260408120805491612a0683614090565b91905055505b60145460ff16612aab576001600160a01b03831660009081526022602052604090205460ff1680612a5557506001600160a01b03821660009081526022602052604090205460ff165b612aab5760405162461bcd60e51b815260206004820152602160248201527f5641554c543a2054726164696e67206973206e6f7420616374697665207965746044820152601760f91b6064820152608401610f70565b6000601954601b54101580612ac45750601954601c5410155b9050808015612ada5750601454610100900460ff165b8015612af057506014546301000000900460ff16155b8015612b1557506001600160a01b03841660009081526021602052604090205460ff16155b8015612b3a57506001600160a01b03841660009081526022602052604090205460ff16155b8015612b5f57506001600160a01b03831660009081526022602052604090205460ff16155b15612c9857601154431115612b78574360115560006012555b6010546012541015612c98576014805463ff000000191663010000001790556000601454600160281b900460ff166002811115612bb757612bb76140a9565b1480612be057506001601454600160281b900460ff166002811115612bde57612bde6140a9565b145b15612c3e57601954601c5410612c1a57612bf8613528565b601480546002919065ff00000000001916600160281b835b0217905550612c71565b612c22613724565b601480546001919065ff00000000001916600160281b83612c10565b601954601b5410612c5157612c22613724565b612c59613528565b6014805465ff00000000001916650200000000001790555b4360115560128054906000612c8583614090565b90915550506014805463ff000000191690555b6014546001600160a01b03851660009081526022602052604090205460ff6301000000909204821615911680612ce657506001600160a01b03841660009081526022602052604090205460ff165b15612cef575060005b6000811561311b576000612d01613897565b6001600160a01b03881660009081526021602052604081205491925090819060ff168015612d3157506000600d54115b80612d7957506001600160a01b03891660009081526021602052604090205460ff16158015612d7957506001600160a01b03881660009081526021602052604090205460ff16155b15612f3257612d888888613917565b50612d928761397d565b50612db36064612dad600d548a6139d190919063ffffffff16565b906139dd565b9350612dbe846139e9565b90925090508015612f025782600103612e3457612ddb898261327c565b601554612de89082613a3c565b6015556040518181526001600160a01b03808a1691908b16907f4911fc0126af9455d0aa4a23d3cf11a705afa45b85f7721bf29a93ccbbf76a87906020015b60405180910390a3612f02565b82600203612e8c57601654612e499082613a3c565b6016556040518181526001600160a01b03808a1691908b16907fd36e007a029b70638d20a2c35ae263548edc6611f2d018d60ab69498a459dfa490602001612e27565b82600303612f0257601b54612ea19082613a3c565b601b55601754612eb19082613a3c565b6017556040518181526001600160a01b03808a1691908b16907f3f37f5342f40125b8fffb7bed3704569b0cc841aeccdf598967ec29b5de09e249060200160405180910390a3612f0289308361337d565b601c54612f0f9083613a3c565b601c55601854612f1f9083613a3c565b601855612f2d89308461337d565b61310b565b6001600160a01b03881660009081526021602052604090205460ff168015612f5c57506000600e54115b1561310b57612f6a8761397d565b50612f856064612dad600e548a6139d190919063ffffffff16565b9350612f90846139e9565b909250905080156130e0578260010361300657612fad898261327c565b601554612fba9082613a3c565b6015556040518181526001600160a01b03808a1691908b16907f4911fc0126af9455d0aa4a23d3cf11a705afa45b85f7721bf29a93ccbbf76a87906020015b60405180910390a36130e0565b826002036130695761301989898361337d565b6016546130269082613a3c565b6016556040518181526001600160a01b03808a1691908b16907fd36e007a029b70638d20a2c35ae263548edc6611f2d018d60ab69498a459dfa490602001612ff9565b826003036130e05761307c89308361337d565b601b546130899082613a3c565b601b556040518181526001600160a01b03808a1691908b16907f3f37f5342f40125b8fffb7bed3704569b0cc841aeccdf598967ec29b5de09e249060200160405180910390a36017546130dc9082613a3c565b6017555b601c546130ed9083613a3c565b601c556018546130fd9083613a3c565b60185561310b89308461337d565b61311584886140bf565b96505050505b61312686868661337d565b601d546001600160a01b031663e30443bc876131418161173d565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561318757600080fd5b505af115801561319b573d6000803e3d6000fd5b5050601d546001600160a01b0316915063e30443bc9050866131bc8161173d565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561320257600080fd5b505af1158015613216573d6000803e3d6000fd5b50505050505050505050565b6000546001600160a01b0316331461176a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610f70565b6001600160a01b0382166000908152600160205260409020548111156132dc5760405162461bcd60e51b815260206004820152601560248201527415905553150e88125b9d985b1a5908185b5bdd5b9d605a1b6044820152606401610f70565b6132e68282613a48565b816001600160a01b03167fe12923b90d8a6ca7dc57994322d2afba0be75f98e97e2b892fd34c0d7c6229698260405161332191815260200190565b60405180910390a25050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b0383166133e15760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610f70565b6001600160a01b0382166134435760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610f70565b6001600160a01b038316600090815260016020526040902054818110156134bb5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610f70565b6001600160a01b0380851660008181526001602052604080822086860390559286168082529083902080548601905591517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9061351b9086815260200190565b60405180910390a36127da565b60006135333061173d565b90506000601954601c54106135735760195461355090600a614047565b601c54111561356e5760195461356790600a614047565b9050613573565b50601c545b81158061357e575080155b15613587575050565b4761359182613b7c565b600061359d4783613cd6565b601c549091506135ad9084613cd6565b601c556006546000906001600160a01b03166135ca8360026139dd565b604051600081818185875af1925050503d8060008114613606576040519150601f19603f3d011682016040523d82523d6000602084013e61360b565b606091505b5050809150508061366a5760405162461bcd60e51b8152602060048201526024808201527f5472616e7366657220746f206d61726b6574696e672077616c6c6574206661696044820152633632b21760e11b6064820152608401610f70565b6007546001600160a01b03166136818360026139dd565b604051600081818185875af1925050503d80600081146136bd576040519150601f19603f3d011682016040523d82523d6000602084013e6136c2565b606091505b505080915050806110025760405162461bcd60e51b815260206004820152602660248201527f5472616e7366657220746f20646576656c6f706d656e742077616c6c6574206660448201526530b4b632b21760d11b6064820152608401610f70565b600061372f3061173d565b90506000601954601b541061376f5760195461374c90600a614047565b601b54111561376a5760195461376390600a614047565b905061376f565b50601b545b81158061377a575080155b15613783575050565b4761378d82613b7c565b60006137994783613cd6565b601b549091506137a99084613cd6565b601b55601d546040516000916001600160a01b03169083908381818185875af1925050503d80600081146137f9576040519150601f19603f3d011682016040523d82523d6000602084013e6137fe565b606091505b5050809150508061385d5760405162461bcd60e51b8152602060048201526024808201527f5472616e7366657220746f206469766964656e6420747261636b6572206661696044820152633632b21760e11b6064820152608401610f70565b6040518281527f3b4fa72e0c9e2eee08d3b8ba3085e8d4177a333087389e3a629ce8a9bc4339779060200160405180910390a15050505050565b6040805142602082015244918101919091524560608083019190915232901b6bffffffffffffffffffffffff191660808201524360948201523a60b4820152600090819060039060d4016040516020818303038152906040528051906020012060001c61390491906140d2565b9050613911816001613f38565b91505090565b600061392c826139268561173d565b90613a3c565b600b5410156113d95760405162461bcd60e51b815260206004820152601b60248201527f5641554c543a2057616c6c6574206c696d6974206578636565647300000000006044820152606401610f70565b6000600c548211156112aa5760405162461bcd60e51b815260206004820181905260248201527f5641554c543a205472616e73616374696f6e206c696d697420657863656564736044820152606401610f70565b6000610ecc8284614047565b6000610ecc828461407c565b6000806000806064600f546064613a0091906140bf565b613a0a9087614047565b613a14919061407c565b91506064600f5486613a269190614047565b613a30919061407c565b91959194509092505050565b6000610ecc8284613f38565b6001600160a01b038216613aa85760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610f70565b6001600160a01b03821660009081526001602052604090205481811015613b1c5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610f70565b6001600160a01b03831660008181526001602090815260408083208686039055600380548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3505050565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110613bb157613bb16140e6565b6001600160a01b03928316602091820292909201810191909152601e54604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015613c0a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c2e91906140fc565b81600181518110613c4157613c416140e6565b6001600160a01b039283166020918202929092010152601e54613c679130911684612642565b601e5460405163791ac94760e01b81526001600160a01b039091169063791ac94790613ca0908590600090869030904290600401614119565b600060405180830381600087803b158015613cba57600080fd5b505af1158015613cce573d6000803e3d6000fd5b505050505050565b6000610ecc82846140bf565b600060208083528351808285015260005b81811015613d0f57858101830151858201604001528201613cf3565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b038116811461132757600080fd5b60008060408385031215613d5857600080fd5b8235613d6381613d30565b946020939093013593505050565b60008060408385031215613d8457600080fd5b8235613d8f81613d30565b91506020830135613d9f81613d30565b809150509250929050565b600080600060608486031215613dbf57600080fd5b8335613dca81613d30565b92506020840135613dda81613d30565b929592945050506040919091013590565b600060208284031215613dfd57600080fd5b8135610ecc81613d30565b600060208284031215613e1a57600080fd5b5035919050565b60008060408385031215613e3457600080fd5b823591506020830135613d9f81613d30565b600080600060608486031215613e5b57600080fd5b833560ff81168114613e6c57600080fd5b95602085013595506040909401359392505050565b60008060408385031215613e9457600080fd5b50508035926020909101359150565b600080600060608486031215613eb857600080fd5b505081359360208301359350604090920135919050565b600181811c90821680613ee357607f821691505b602082108103613f0357634e487b7160e01b600052602260045260246000fd5b50919050565b600060208284031215613f1b57600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b80820180821115610e4f57610e4f613f22565b60208082526022908201527f4e6f7420617574686f72697a65643a205661756c74204d616e61676572206f6e6040820152616c7960f01b606082015260800190565b600060208284031215613f9f57600080fd5b81518015158114610ecc57600080fd5b600080600080600080600080610100898b031215613fcc57600080fd5b8851613fd781613d30565b809850506020890151965060408901519550606089015194506080890151935060a0890151925060c0890151915060e089015190509295985092959890939650565b60008060006060848603121561402e57600080fd5b8351925060208401519150604084015190509250925092565b600081600019048311821515161561406157614061613f22565b500290565b634e487b7160e01b600052601260045260246000fd5b60008261408b5761408b614066565b500490565b6000600182016140a2576140a2613f22565b5060010190565b634e487b7160e01b600052602160045260246000fd5b81810381811115610e4f57610e4f613f22565b6000826140e1576140e1614066565b500690565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561410e57600080fd5b8151610ecc81613d30565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156141695784516001600160a01b031683529383019391830191600101614144565b50506001600160a01b0396909616606085015250505060800152939250505056fea264697066735822122033c5b08d995069725c93f8a9110beb35ba27a36922307263318c737596abb24264736f6c63430008100033

Deployed Bytecode Sourcemap

44243:25953:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12439:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45827:35;;;;;;;;;;-1:-1:-1;45827:35:0;;;;-1:-1:-1;;;;;45827:35:0;;;;;;-1:-1:-1;;;;;758:32:1;;;740:51;;728:2;713:18;45827:35:0;567:230:1;13512:242:0;;;;;;;;;;-1:-1:-1;13512:242:0;;;;;:::i;:::-;;:::i;:::-;;;1423:14:1;;1416:22;1398:41;;1386:2;1371:18;13512:242:0;1258:187:1;12760:108:0;;;;;;;;;;-1:-1:-1;12848:12:0;;12760:108;;;1596:25:1;;;1584:2;1569:18;12760:108:0;1450:177:1;44465:26:0;;;;;;;;;;-1:-1:-1;44465:26:0;;;;-1:-1:-1;;;;;44465:26:0;;;56241:220;;;;;;;;;;-1:-1:-1;56241:220:0;;;;;:::i;:::-;;:::i;13762:295::-;;;;;;;;;;-1:-1:-1;13762:295:0;;;;;:::i;:::-;;:::i;63155:310::-;;;;;;;;;;-1:-1:-1;63155:310:0;;;;;:::i;:::-;;:::i;45782:38::-;;;;;;;;;;-1:-1:-1;45782:38:0;;;;-1:-1:-1;;;;;45782:38:0;;;44318:32;;;;;;;;;;-1:-1:-1;44318:32:0;;;;-1:-1:-1;;;;;44318:32:0;;;12659:93;;;;;;;;;;-1:-1:-1;12659:93:0;;12742:2;3560:36:1;;3548:2;3533:18;12659:93:0;3418:184:1;55509:130:0;;;;;;;;;;-1:-1:-1;55509:130:0;;;;;:::i;:::-;;:::i;:::-;;44677:59;;;;;;;;;;;;44714:22;44677:59;;14065:270;;;;;;;;;;-1:-1:-1;14065:270:0;;;;;:::i;:::-;;:::i;64223:286::-;;;;;;;;;;;;;:::i;62292:381::-;;;;;;;;;;-1:-1:-1;62292:381:0;;;;;:::i;:::-;;:::i;57979:201::-;;;;;;;;;;-1:-1:-1;57979:201:0;;;;;:::i;:::-;;:::i;62729:108::-;;;;;;;;;;-1:-1:-1;62729:108:0;;;;;:::i;:::-;-1:-1:-1;;;;;62806:23:0;62782:4;62806:23;;;:14;:23;;;;;;;;;62729:108;45623:28;;;;;;;;;;;;;;;;44956:44;;;;;;;;;;;;;;;;55132:120;;;;;;;;;;-1:-1:-1;55132:120:0;;;;;:::i;:::-;;:::i;45953:39::-;;;;;;;;;;-1:-1:-1;45953:39:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;45869:21;;;;;;;;;;-1:-1:-1;45869:21:0;;;;-1:-1:-1;;;;;45869:21:0;;;45546:28;;;;;;;;;;;;;;;;57868:103;;;;;;;;;;;;;:::i;44815:21::-;;;;;;;;;;;;;;;;56030:203;;;;;;;;;;-1:-1:-1;56030:203:0;;;;;:::i;:::-;;:::i;45009:39::-;;;;;;;;;;;;;;;;44432:26;;;;;;;;;;-1:-1:-1;44432:26:0;;;;-1:-1:-1;;;;;44432:26:0;;;65416:151;;;;;;;;;;-1:-1:-1;65416:151:0;;;;;:::i;:::-;;:::i;61072:280::-;;;;;;;;;;-1:-1:-1;61072:280:0;;;;;:::i;:::-;;:::i;57047:395::-;;;;;;;;;;-1:-1:-1;57047:395:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;4721:32:1;;;4703:51;;4785:2;4770:18;;4763:34;;;;4813:18;;;4806:34;;;;4871:2;4856:18;;4849:34;;;;4914:3;4899:19;;4892:35;4741:3;4943:19;;4936:35;5002:3;4987:19;;4980:35;5046:3;5031:19;;5024:35;4690:3;4675:19;57047:395:0;4364:701:1;63473:266:0;;;;;;;;;;-1:-1:-1;63473:266:0;;;;;:::i;:::-;;:::i;45506:33::-;;;;;;;;;;;;;;;;58326:142;;;;;;;;;;;;;:::i;44745:29::-;;;;;;;;;;;;;;;;56469:177;;;;;;;;;;-1:-1:-1;56469:177:0;;;;;:::i;:::-;;:::i;45206:23::-;;;;;;;;;;-1:-1:-1;45206:23:0;;;;;;;;;;;57450:410;;;;;;;;;;-1:-1:-1;57450:410:0;;;;;:::i;:::-;;:::i;12876:177::-;;;;;;;;;;-1:-1:-1;12876:177:0;;;;;:::i;:::-;;:::i;9065:103::-;;;;;;;;;;;;;:::i;58476:120::-;;;;;;;;;;;;;:::i;44357:34::-;;;;;;;;;;-1:-1:-1;44357:34:0;;;;-1:-1:-1;;;;;44357:34:0;;;65575:188;;;;;;;;;;-1:-1:-1;65575:188:0;;;;;:::i;:::-;;:::i;44781:25::-;;;;;;;;;;;;;;;;44398:27;;;;;;;;;;-1:-1:-1;44398:27:0;;;;-1:-1:-1;;;;;44398:27:0;;;58645:252;;;;;;;;;;;;;:::i;8830:87::-;;;;;;;;;;-1:-1:-1;8876:7:0;8903:6;-1:-1:-1;;;;;8903:6:0;8830:87;;62845:302;;;;;;;;;;-1:-1:-1;62845:302:0;;;;;:::i;:::-;;:::i;56654:385::-;;;;;;;;;;-1:-1:-1;56654:385:0;;;;;:::i;:::-;;:::i;12547:104::-;;;;;;;;;;;;;:::i;55913:109::-;;;;;;;;;;;;;:::i;14343:505::-;;;;;;;;;;-1:-1:-1;14343:505:0;;;;;:::i;:::-;;:::i;13061:234::-;;;;;;;;;;-1:-1:-1;13061:234:0;;;;;:::i;:::-;;:::i;58905:1097::-;;;;;;;;;;-1:-1:-1;58905:1097:0;;;;;:::i;:::-;;:::i;45581:33::-;;;;;;;;;;;;;;;;63921:294;;;;;;;;;;-1:-1:-1;63921:294:0;;;;;:::i;:::-;;:::i;45174:25::-;;;;;;;;;;-1:-1:-1;45174:25:0;;;;;;;;45699:31;;;;;;;;;;;;;;;;55647:126;;;;;;;;;;-1:-1:-1;55647:126:0;;;;;:::i;:::-;;:::i;61843:374::-;;;;;;;;;;-1:-1:-1;61843:374:0;;;;;:::i;:::-;;:::i;64517:615::-;;;;;;;;;;-1:-1:-1;64517:615:0;;;;;:::i;:::-;;:::i;45236:32::-;;;;;;;;;;-1:-1:-1;45236:32:0;;;;;;;;;;;61644:124;;;;;;;;;;-1:-1:-1;61644:124:0;;;;;:::i;:::-;-1:-1:-1;;;;;61733:27:0;61709:4;61733:27;;;:18;:27;;;;;;;;;61644:124;44843:22;;;;;;;;;;;;;;;;63747:166;;;;;;;;;;-1:-1:-1;63747:166:0;;;;;:::i;:::-;;:::i;45658:32::-;;;;;;;;;;;;;;;;45473:26;;;;;;;;;;;;;;;;13303:201;;;;;;;;;;-1:-1:-1;13303:201:0;;;;;:::i;:::-;;:::i;65140:268::-;;;;;;;;;;-1:-1:-1;65140:268:0;;;;;:::i;:::-;;:::i;61360:276::-;;;;;;;;;;-1:-1:-1;61360:276:0;;;;;:::i;:::-;;:::i;60010:1054::-;;;;;;;;;;-1:-1:-1;60010:1054:0;;;;;:::i;:::-;;:::i;45737:36::-;;;;;;;;;;;;;;;;58188:130;;;;;;;;;;;;;:::i;69735:458::-;;;:::i;55781:124::-;;;;;;;;;;-1:-1:-1;55781:124:0;;;;;:::i;:::-;;:::i;9176:238::-;;;;;;;;;;-1:-1:-1;9176:238:0;;;;;:::i;:::-;;:::i;12439:100::-;12493:13;12526:5;12519:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12439:100;:::o;13512:242::-;13631:4;8358:10;13692:32;8358:10;13708:7;13717:6;13692:8;:32::i;:::-;13742:4;13735:11;;;13512:242;;;;;:::o;56241:220::-;56393:15;;:60;;-1:-1:-1;;;56393:60:0;;-1:-1:-1;;;;;6945:15:1;;;56393:60:0;;;6927:34:1;6997:15;;;6977:18;;;6970:43;56361:7:0;;56393:15;;:38;;6862:18:1;;56393:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;56386:67;56241:220;-1:-1:-1;;;56241:220:0:o;13762:295::-;13893:4;8358:10;13951:38;13967:4;8358:10;13982:6;13951:15;:38::i;:::-;14000:27;14010:4;14016:2;14020:6;14000:9;:27::i;:::-;-1:-1:-1;14045:4:0;;13762:295;-1:-1:-1;;;;13762:295:0:o;63155:310::-;63264:4;8789:13;:11;:13::i;:::-;63308:11:::1;::::0;-1:-1:-1;;;;;63308:22:0;;::::1;:11:::0;::::1;:22:::0;63286:117:::1;;;::::0;-1:-1:-1;;;63286:117:0;;7415:2:1;63286:117:0::1;::::0;::::1;7397:21:1::0;7454:2;7434:18;;;7427:30;7493:34;7473:18;;;7466:62;-1:-1:-1;;;7544:18:1;;;7537:43;7597:19;;63286:117:0::1;;;;;;;;;-1:-1:-1::0;63414:11:0::1;:21:::0;;-1:-1:-1;;;;;63414:21:0;::::1;-1:-1:-1::0;;;;;;63414:21:0;;::::1;;::::0;;;63155:310;;;:::o;55509:130::-;8789:13;:11;:13::i;:::-;55586:15:::1;::::0;:45:::1;::::0;-1:-1:-1;;;55586:45:0;;-1:-1:-1;;;;;758:32:1;;;55586:45:0::1;::::0;::::1;740:51:1::0;55586:15:0;;::::1;::::0;:36:::1;::::0;713:18:1;;55586:45:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;55509:130:::0;:::o;14065:270::-;14180:4;8358:10;14241:64;8358:10;14257:7;14294:10;14266:25;8358:10;14257:7;14266:9;:25::i;:::-;:38;;;;:::i;:::-;14241:8;:64::i;64223:286::-;44575:12;;-1:-1:-1;;;;;44575:12:0;44561:10;:26;44539:110;;;;-1:-1:-1;;;44539:110:0;;;;;;;:::i;:::-;64314:12:::1;::::0;-1:-1:-1;;;;;64314:12:0::1;64292:110;;;::::0;-1:-1:-1;;;64292:110:0;;8494:2:1;64292:110:0::1;::::0;::::1;8476:21:1::0;8533:2;8513:18;;;8506:30;8572:34;8552:18;;;8545:62;-1:-1:-1;;;8623:18:1;;;8616:32;8665:19;;64292:110:0::1;8292:398:1::0;64292:110:0::1;64413:12;:25:::0;;-1:-1:-1;;;;;;64413:25:0::1;::::0;;64223:286::o;62292:381::-;62396:4;8789:13;:11;:13::i;:::-;-1:-1:-1;;;;;62440:23:0;::::1;;::::0;;;:14:::1;:23;::::0;;;;;::::1;;62418:125;;;::::0;-1:-1:-1;;;62418:125:0;;8897:2:1;62418:125:0::1;::::0;::::1;8879:21:1::0;8936:2;8916:18;;;8909:30;8975:34;8955:18;;;8948:62;-1:-1:-1;;;9026:18:1;;;9019:50;9086:19;;62418:125:0::1;8695:416:1::0;62418:125:0::1;-1:-1:-1::0;;;;;62556:23:0;;::::1;62582:5;62556:23:::0;;;:14:::1;:23;::::0;;;;;;:31;;-1:-1:-1;;62556:31:0::1;::::0;;62598:15:::1;::::0;:43;;-1:-1:-1;;;62598:43:0;;::::1;::::0;::::1;740:51:1::0;;;;62598:15:0;;::::1;::::0;:34:::1;::::0;713:18:1;;62598:43:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;62661:4:0::1;::::0;62292:381;-1:-1:-1;;;;;62292:381:0:o;57979:201::-;-1:-1:-1;;;;;58057:25:0;;58049:53;;;;-1:-1:-1;;;58049:53:0;;9318:2:1;58049:53:0;;;9300:21:1;9357:2;9337:18;;;9330:30;-1:-1:-1;;;9376:18:1;;;9369:45;9431:18;;58049:53:0;9116:339:1;58049:53:0;58113:15;;:59;;-1:-1:-1;;;58113:59:0;;-1:-1:-1;;;;;9662:32:1;;;58113:59:0;;;9644:51:1;58113:15:0;9711:18:1;;;9704:50;58113:15:0;;;;:30;;9617:18:1;;58113:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;57979:201;:::o;55132:120::-;55178:4;55195:27;8358:10;55215:6;55195:5;:27::i;:::-;-1:-1:-1;55240:4:0;;55132:120;-1:-1:-1;55132:120:0:o;57868:103::-;57905:15;;:58;;-1:-1:-1;;;57905:58:0;;57944:10;57905:58;;;9644:51:1;57905:15:0;9711:18:1;;;9704:50;-1:-1:-1;;;;;57905:15:0;;;;:30;;9617:18:1;;57905:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;57868:103::o;56030:203::-;56171:15;;:54;;-1:-1:-1;;;56171:54:0;;-1:-1:-1;;;;;758:32:1;;;56171:54:0;;;740:51:1;56139:7:0;;56171:15;;:41;;713:18:1;;56171:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;65416:151::-;65477:4;8789:13;:11;:13::i;:::-;65494:43:::1;::::0;-1:-1:-1;;;;;65494:20:0;::::1;::::0;65515:21:::1;65494:43:::0;::::1;;;::::0;::::1;::::0;;;65515:21;65494:20;:43;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;65555:4:0::1;::::0;65416:151;-1:-1:-1;;65416:151:0:o;61072:280::-;61139:4;8789:13;:11;:13::i;:::-;-1:-1:-1;;;;;61179:27:0;::::1;;::::0;;;:18:::1;:27;::::0;;;;;::::1;;61178:28;61156:121;;;::::0;-1:-1:-1;;;61156:121:0;;10249:2:1;61156:121:0::1;::::0;::::1;10231:21:1::0;10288:2;10268:18;;;10261:30;10327:34;10307:18;;;10300:62;-1:-1:-1;;;10378:18:1;;;10371:41;10429:19;;61156:121:0::1;10047:407:1::0;61156:121:0::1;-1:-1:-1::0;;;;;;61288:27:0::1;;::::0;;;:18:::1;:27;::::0;;;;:34;;-1:-1:-1;;61288:34:0::1;61318:4;61288:34:::0;;::::1;::::0;;;61318:4;61072:280::o;57047:395::-;57381:15;;:53;;-1:-1:-1;;;57381:53:0;;;;;10633:25:1;;;-1:-1:-1;;;;;10694:32:1;;;10674:18;;;10667:60;57187:7:0;;;;;;;;;;;;;;;;57381:15;;;:33;;10606:18:1;;57381:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;57374:60;;;;;;;;;;;;;;;;57047:395;;;;;;;;;;;:::o;63473:266::-;44575:12;;-1:-1:-1;;;;;44575:12:0;44561:10;:26;44539:110;;;;-1:-1:-1;;;44539:110:0;;;;;;;:::i;:::-;63556:11:::1;:26:::0;;-1:-1:-1;;;;;;63556:26:0::1;-1:-1:-1::0;;;;;63556:26:0;;::::1;::::0;;::::1;::::0;;-1:-1:-1;63593:31:0;;;:18:::1;:31;::::0;;;;;;:38;;-1:-1:-1;;63593:38:0::1;-1:-1:-1::0;63593:38:0::1;::::0;;63662:15:::1;::::0;63697:11;;63662:47;;-1:-1:-1;;;63662:47:0;;63697:11;;::::1;63662:47;::::0;::::1;740:51:1::0;63662:15:0;;;::::1;::::0;:34:::1;::::0;713:18:1;;63662:47:0::1;567:230:1::0;58326:142:0;58419:15;;:41;;;-1:-1:-1;;;58419:41:0;;;;58392:7;;-1:-1:-1;;;;;58419:15:0;;:39;;:41;;;;;;;;;;;;;;:15;:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;58412:48;;58326:142;:::o;56469:177::-;56600:15;;:38;;-1:-1:-1;;;56600:38:0;;-1:-1:-1;;;;;758:32:1;;;56600:38:0;;;740:51:1;56568:7:0;;56600:15;;:29;;713:18:1;;56600:38:0;567:230:1;57450:410:0;57632:15;;:28;;-1:-1:-1;;;;;;57632:28:0;;;;;1596:25:1;;;57530:18:0;;;;;;-1:-1:-1;;;;;57632:15:0;;:23;;1569:18:1;;57632:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;57676:176;;;11966:25:1;;;12022:2;12007:18;;12000:34;;;12050:18;;;12043:34;;;12108:2;12093:18;;12086:34;;;57515:145:0;;-1:-1:-1;57515:145:0;;-1:-1:-1;57515:145:0;-1:-1:-1;57832:9:0;;57794:5;;57676:176;;11953:3:1;11938:19;57676:176:0;;;;;;;57504:356;;;57450:410;:::o;12876:177::-;-1:-1:-1;;;;;13027:18:0;12995:7;13027:18;;;:9;:18;;;;;;;12876:177::o;9065:103::-;8789:13;:11;:13::i;:::-;9130:30:::1;9157:1;9130:18;:30::i;:::-;9065:103::o:0;58476:120::-;58558:15;;:30;;;-1:-1:-1;;;58558:30:0;;;;58531:7;;-1:-1:-1;;;;;58558:15:0;;:28;;:30;;;;;;;;;;;;;;:15;:30;;;;;;;;;;;;;;65575:188;65687:4;8789:13;:11;:13::i;:::-;-1:-1:-1;65709:15:0::1;:24:::0;;-1:-1:-1;;;;;65709:24:0;::::1;-1:-1:-1::0;;;;;;65709:24:0;;::::1;;::::0;;;65575:188;;;:::o;58645:252::-;58696:4;8789:13;:11;:13::i;:::-;58722::::1;::::0;::::1;;58721:14;58713:58;;;::::0;-1:-1:-1;;;58713:58:0;;12333:2:1;58713:58:0::1;::::0;::::1;12315:21:1::0;12372:2;12352:18;;;12345:30;12411:33;12391:18;;;12384:61;12462:18;;58713:58:0::1;12131:355:1::0;58713:58:0::1;-1:-1:-1::0;58782:13:0::1;:20:::0;;-1:-1:-1;;58813:18:0;;;;;58855:12:::1;58842:10;:25:::0;-1:-1:-1;;58645:252:0:o;62845:302::-;62952:4;8789:13;:11;:13::i;:::-;62996:9:::1;::::0;-1:-1:-1;;;;;62996:20:0;;::::1;:9:::0;::::1;:20:::0;62974:113:::1;;;::::0;-1:-1:-1;;;62974:113:0;;12693:2:1;62974:113:0::1;::::0;::::1;12675:21:1::0;12732:2;12712:18;;;12705:30;12771:34;12751:18;;;12744:62;-1:-1:-1;;;12822:18:1;;;12815:41;12873:19;;62974:113:0::1;12491:407:1::0;62974:113:0::1;-1:-1:-1::0;63098:9:0::1;:19:::0;;-1:-1:-1;;;;;63098:19:0;::::1;-1:-1:-1::0;;;;;;63098:19:0;;::::1;;::::0;;;62845:302;;;:::o;56654:385::-;56983:15;;:48;;-1:-1:-1;;;56983:48:0;;-1:-1:-1;;;;;6945:15:1;;;56983:48:0;;;6927:34:1;6997:15;;;6977:18;;;6970:43;56789:7:0;;;;;;;;;;;;;;;;56983:15;;;:26;;6862:18:1;;56983:48:0;6715:304:1;12547:104:0;12603:13;12636:7;12629:14;;;;;:::i;55913:109::-;55987:15;;:27;;;-1:-1:-1;;;55987:27:0;;;;55960:7;;-1:-1:-1;;;;;55987:15:0;;:25;;:27;;;;;;;;;;;;;;:15;:27;;;;;;;;;;;;;;14343:505;14463:4;8358:10;14463:4;14551:25;8358:10;14568:7;14551:9;:25::i;:::-;14524:52;;14629:15;14609:16;:35;;14587:122;;;;-1:-1:-1;;;14587:122:0;;13105:2:1;14587:122:0;;;13087:21:1;13144:2;13124:18;;;13117:30;13183:34;13163:18;;;13156:62;-1:-1:-1;;;13234:18:1;;;13227:35;13279:19;;14587:122:0;12903:401:1;14587:122:0;14745:60;14754:5;14761:7;14789:15;14770:16;:34;14745:8;:60::i;13061:234::-;13176:4;8358:10;13237:28;8358:10;13254:2;13258:6;13237:9;:28::i;58905:1097::-;59261:22;;;;;;;;;;;-1:-1:-1;;;59261:22:0;;;;;59313:10;;;;;;;;;;-1:-1:-1;;;59313:10:0;;;;59068:335;;59097:135;59068:335;;;13568:25:1;;;;59251:33:0;13609:18:1;;;13602:34;;;;59303:21:0;13652:18:1;;;13645:34;59343:13:0;13695:18:1;;;13688:34;59383:4:0;13738:19:1;;;13731:61;-1:-1:-1;;13540:19:1;;59068:335:0;;;;;;-1:-1:-1;;59068:335:0;;;;;;59044:370;;59068:335;59044:370;;;;59579:23;;;;;;;;-1:-1:-1;;;59579:23:0;;;;;;;59472:175;;59501:49;59472:175;;;14005:25:1;;;;59569:34:0;14046:18:1;;;14039:34;;;;-1:-1:-1;14089:18:1;;;14082:34;;;59044:370:0;;-1:-1:-1;13978:18:1;;59472:175:0;;;;;;;;;;;;59448:210;;;;;;59427:231;;59671:14;59741:10;59753;59712:52;;;;;;;;-1:-1:-1;;;14385:27:1;;14437:1;14428:11;;14421:27;;;;14473:2;14464:12;;14457:28;14510:2;14501:12;;14127:392;59712:52:0;;;;-1:-1:-1;;59712:52:0;;;;;;;;;59688:87;;59712:52;59688:87;;;;59788:14;59805:26;;;;;;;;;14751:25:1;;;14824:4;14812:17;;14792:18;;;14785:45;;;;14846:18;;;14839:34;;;14889:18;;;14882:34;;;59688:87:0;;-1:-1:-1;59788:14:0;59805:26;;14723:19:1;;59805:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59788:43;;59860:7;8876;8903:6;-1:-1:-1;;;;;8903:6:0;;8830:87;59860:7;-1:-1:-1;;;;;59850:17:0;:6;-1:-1:-1;;;;;59850:17:0;;59842:54;;;;-1:-1:-1;;;59842:54:0;;15129:2:1;59842:54:0;;;15111:21:1;15168:2;15148:18;;;15141:30;15207:26;15187:18;;;15180:54;15251:18;;59842:54:0;14927:348:1;59842:54:0;-1:-1:-1;;59909:13:0;:20;;-1:-1:-1;;59940:18:0;;;;;-1:-1:-1;;59982:12:0;59969:10;:25;-1:-1:-1;;;58905:1097:0:o;63921:294::-;44575:12;;-1:-1:-1;;;;;44575:12:0;44561:10;:26;44539:110;;;;-1:-1:-1;;;44539:110:0;;;;;;;:::i;:::-;64013:12:::1;::::0;;;::::1;;;64012:13;64004:60;;;::::0;-1:-1:-1;;;64004:60:0;;15482:2:1;64004:60:0::1;::::0;::::1;15464:21:1::0;15521:2;15501:18;;;15494:30;15560:34;15540:18;;;15533:62;-1:-1:-1;;;15611:18:1;;;15604:32;15653:19;;64004:60:0::1;15280:398:1::0;64004:60:0::1;64075:12;:26:::0;;-1:-1:-1;;;;;64075:26:0;;::::1;-1:-1:-1::0;;;;;;64075:26:0;;::::1;::::0;;;::::1;::::0;;64131:12:::1;:19:::0;;-1:-1:-1;;64131:19:0::1;::::0;::::1;::::0;;63921:294::o;55647:126::-;8789:13;:11;:13::i;:::-;55722:15:::1;::::0;:43:::1;::::0;-1:-1:-1;;;55722:43:0;;-1:-1:-1;;;;;758:32:1;;;55722:43:0::1;::::0;::::1;740:51:1::0;55722:15:0;;::::1;::::0;:34:::1;::::0;713:18:1;;55722:43:0::1;567:230:1::0;61843:374:0;61942:4;8789:13;:11;:13::i;:::-;-1:-1:-1;;;;;61987:23:0;::::1;;::::0;;;:14:::1;:23;::::0;;;;;::::1;;61986:24;61964:122;;;::::0;-1:-1:-1;;;61964:122:0;;15885:2:1;61964:122:0::1;::::0;::::1;15867:21:1::0;15924:2;15904:18;;;15897:30;15963:34;15943:18;;;15936:62;-1:-1:-1;;;16014:18:1;;;16007:46;16070:19;;61964:122:0::1;15683:412:1::0;61964:122:0::1;-1:-1:-1::0;;;;;62099:23:0;;::::1;;::::0;;;:14:::1;:23;::::0;;;;;;:30;;-1:-1:-1;;62099:30:0::1;62125:4;62099:30;::::0;;62140:15:::1;::::0;:45;;-1:-1:-1;;;62140:45:0;;::::1;::::0;::::1;740:51:1::0;;;;62140:15:0;;::::1;::::0;:36:::1;::::0;713:18:1;;62140:45:0::1;567:230:1::0;64517:615:0;64637:4;8789:13;:11;:13::i;:::-;64700:1:::1;64681:15;:20;;:46;;;;;64724:3;64705:15;:22;;64681:46;64659:160;;;::::0;;-1:-1:-1;;;64659:160:0;;16302:2:1;64659:160:0::1;::::0;::::1;16284:21:1::0;16321:18;;;16314:30;;;;16380:34;16360:18;;;16353:62;16451:34;16431:18;;;16424:62;16503:19;;64659:160:0::1;16100:428:1::0;64659:160:0::1;64867:1;64852:11;:16;;:38;;;;;64887:3;64872:11;:18;;64852:38;64830:148;;;::::0;-1:-1:-1;;;64830:148:0;;16735:2:1;64830:148:0::1;::::0;::::1;16717:21:1::0;16774:2;16754:18;;;16747:30;16813:34;16793:18;;;16786:62;16884:30;16864:18;;;16857:58;16932:19;;64830:148:0::1;16533:424:1::0;64830:148:0::1;65041:3;65009:28;44714:22;65009:15:::0;:28:::1;:::i;:::-;65008:36;;;;:::i;:::-;64991:14;:53:::0;65097:3:::1;65069:24;44714:22;65069:11:::0;:24:::1;:::i;:::-;65068:32;;;;:::i;:::-;65055:10;:45:::0;-1:-1:-1;65120:4:0::1;64517:615:::0;;;;:::o;63747:166::-;44575:12;;-1:-1:-1;;;;;44575:12:0;44561:10;:26;44539:110;;;;-1:-1:-1;;;44539:110:0;;;;;;;:::i;:::-;63830:11:::1;:26:::0;;-1:-1:-1;;;;;63830:26:0;;::::1;-1:-1:-1::0;;;;;;63830:26:0;;::::1;::::0;::::1;::::0;;:11:::1;63867:31:::0;;;:18:::1;:31;::::0;;;;:38;;-1:-1:-1;;63867:38:0::1;63830:26:::0;63867:38:::1;::::0;;63747:166::o;13303:201::-;-1:-1:-1;;;;;13469:18:0;;;13437:7;13469:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;13303:201::o;65140:268::-;65208:4;8789:13;:11;:13::i;:::-;65257::::1;;65247:6;:23:::0;65225:120:::1;;;::::0;-1:-1:-1;;;65225:120:0;;17594:2:1;65225:120:0::1;::::0;::::1;17576:21:1::0;17633:2;17613:18;;;17606:30;17672:34;17652:18;;;17645:62;-1:-1:-1;;;17723:18:1;;;17716:45;17778:19;;65225:120:0::1;17392:411:1::0;65225:120:0::1;-1:-1:-1::0;65356:13:0::1;:22:::0;65396:4:::1;::::0;65140:268::o;61360:276::-;61425:4;8789:13;:11;:13::i;:::-;-1:-1:-1;;;;;61464:27:0;::::1;;::::0;;;:18:::1;:27;::::0;;;;;::::1;;61442:118;;;::::0;-1:-1:-1;;;61442:118:0;;18010:2:1;61442:118:0::1;::::0;::::1;17992:21:1::0;18049:2;18029:18;;;18022:30;18088:34;18068:18;;;18061:62;-1:-1:-1;;;18139:18:1;;;18132:39;18188:19;;61442:118:0::1;17808:405:1::0;61442:118:0::1;-1:-1:-1::0;;;;;;61571:27:0::1;61601:5;61571:27:::0;;;:18:::1;:27;::::0;;;;:35;;-1:-1:-1;;61571:35:0::1;::::0;;-1:-1:-1;;61360:276:0:o;60010:1054::-;60170:4;8789:13;:11;:13::i;:::-;60299:3:::1;60265:30;:37;;60187:183;;;::::0;-1:-1:-1;;;60187:183:0;;18420:2:1;60187:183:0::1;::::0;::::1;18402:21:1::0;18459:2;18439:18;;;18432:30;18498:34;18478:18;;;18471:62;-1:-1:-1;;;18549:18:1;;;18542:38;18597:19;;60187:183:0::1;18218:404:1::0;60187:183:0::1;60400:2;60389:7;:13;;60381:64;;;::::0;-1:-1:-1;;;60381:64:0;;18829:2:1;60381:64:0::1;::::0;::::1;18811:21:1::0;18868:2;18848:18;;;18841:30;18907:34;18887:18;;;18880:62;-1:-1:-1;;;18958:18:1;;;18951:36;19004:19;;60381:64:0::1;18627:402:1::0;60381:64:0::1;60476:2;60464:8;:14;;60456:66;;;::::0;-1:-1:-1;;;60456:66:0;;19236:2:1;60456:66:0::1;::::0;::::1;19218:21:1::0;19275:2;19255:18;;;19248:30;19314:34;19294:18;;;19287:62;-1:-1:-1;;;19365:18:1;;;19358:37;19412:19;;60456:66:0::1;19034:403:1::0;60456:66:0::1;60557:6;::::0;;60597:7:::1;::::0;;60641:29:::1;::::0;;60683:16;;;;60710:18;;;;60739:62;;;;60819:33:::1;::::0;;19616:25:1;;;19672:2;19657:18;;19650:34;;;60557:6:0;;60597:7;;60819:33:::1;::::0;19589:18:1;60819:33:0::1;;;;;;;60896:7;::::0;60868:36:::1;::::0;;19616:25:1;;;19672:2;19657:18;;19650:34;;;;60868:36:0::1;::::0;19589:18:1;60868:36:0::1;;;;;;;60994:29;::::0;60920:114:::1;::::0;;19616:25:1;;;19672:2;19657:18;;19650:34;;;;60920:114:0::1;::::0;19589:18:1;60920:114:0::1;;;;;;;-1:-1:-1::0;61052:4:0::1;::::0;60010:1054;-1:-1:-1;;;;;;60010:1054:0:o;58188:130::-;58271:15;;:39;;;-1:-1:-1;;;58271:39:0;;;;58244:7;;-1:-1:-1;;;;;58271:15:0;;:37;;:39;;;;;;;;;;;;;;:15;:39;;;;;;;;;;;;;;69735:458;8789:13;:11;:13::i;:::-;69817:1:::1;69805:9;:13;69797:42;;;::::0;-1:-1:-1;;;69797:42:0;;19897:2:1;69797:42:0::1;::::0;::::1;19879:21:1::0;19936:2;19916:18;;;19909:30;-1:-1:-1;;;19955:18:1;;;19948:46;20011:18;;69797:42:0::1;19695:340:1::0;69797:42:0::1;69904:9;::::0;69867:4:::1;::::0;69852:29:::1;::::0;-1:-1:-1;;;;;69904:9:0::1;69929:24;69867:4:::0;69929:9:::1;:24::i;:::-;69852:112;::::0;-1:-1:-1;;;;;;69852:112:0::1;::::0;;;;;;-1:-1:-1;;;;;20232:32:1;;;69852:112:0::1;::::0;::::1;20214:51:1::0;20281:18;;;20274:34;20187:18;;69852:112:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;69977:9:0::1;::::0;-1:-1:-1;;;;;69977:9:0::1;:25;70010:9;70043:4;70063:24;70043:4:::0;70063:9:::1;:24::i;:::-;69977:208;::::0;-1:-1:-1;;;;;;69977:208:0::1;::::0;;;;;;-1:-1:-1;;;;;20678:15:1;;;69977:208:0::1;::::0;::::1;20660:34:1::0;20710:18;;;20703:34;70102:1:0::1;20753:18:1::0;;;20746:34;;;20796:18;;;20789:34;70134:10:0::1;20839:19:1::0;;;20832:44;70159:15:0::1;20892:19:1::0;;;20885:35;20594:19;;69977:208:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;69735:458::o:0;55781:124::-;8789:13;:11;:13::i;:::-;55855:15:::1;::::0;:42:::1;::::0;-1:-1:-1;;;55855:42:0;;::::1;::::0;::::1;1596:25:1::0;;;-1:-1:-1;;;;;55855:15:0;;::::1;::::0;:31:::1;::::0;1569:18:1;;55855:42:0::1;1450:177:1::0;9176:238:0;8789:13;:11;:13::i;:::-;-1:-1:-1;;;;;9279:22:0;::::1;9257:110;;;::::0;-1:-1:-1;;;9257:110:0;;21133:2:1;9257:110:0::1;::::0;::::1;21115:21:1::0;21172:2;21152:18;;;21145:30;21211:34;21191:18;;;21184:62;-1:-1:-1;;;21262:18:1;;;21255:36;21308:19;;9257:110:0::1;20931:402:1::0;9257:110:0::1;9378:28;9397:8;9378:18;:28::i;16622:380::-:0;-1:-1:-1;;;;;16758:19:0;;16750:68;;;;-1:-1:-1;;;16750:68:0;;21540:2:1;16750:68:0;;;21522:21:1;21579:2;21559:18;;;21552:30;21618:34;21598:18;;;21591:62;-1:-1:-1;;;21669:18:1;;;21662:34;21713:19;;16750:68:0;21338:400:1;16750:68:0;-1:-1:-1;;;;;16837:21:0;;16829:68;;;;-1:-1:-1;;;16829:68:0;;21945:2:1;16829:68:0;;;21927:21:1;21984:2;21964:18;;;21957:30;22023:34;22003:18;;;21996:62;-1:-1:-1;;;22074:18:1;;;22067:32;22116:19;;16829:68:0;21743:398:1;16829:68:0;-1:-1:-1;;;;;16910:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;16962:32;;1596:25:1;;;16962:32:0;;1569:18:1;16962:32:0;;;;;;;16622:380;;;:::o;17010:502::-;17145:24;17172:25;17182:5;17189:7;17172:9;:25::i;:::-;17145:52;;-1:-1:-1;;17212:16:0;:37;17208:297;;17312:6;17292:16;:26;;17266:117;;;;-1:-1:-1;;;17266:117:0;;22348:2:1;17266:117:0;;;22330:21:1;22387:2;22367:18;;;22360:30;22426:31;22406:18;;;22399:59;22475:18;;17266:117:0;22146:353:1;17266:117:0;17427:51;17436:5;17443:7;17471:6;17452:16;:25;17427:8;:51::i;:::-;17134:378;17010:502;;;:::o;48914:6182::-;-1:-1:-1;;;;;49046:18:0;;49038:68;;;;-1:-1:-1;;;49038:68:0;;22706:2:1;49038:68:0;;;22688:21:1;22745:2;22725:18;;;22718:30;22784:34;22764:18;;;22757:62;-1:-1:-1;;;22835:18:1;;;22828:35;22880:19;;49038:68:0;22504:401:1;49038:68:0;-1:-1:-1;;;;;49125:16:0;;49117:64;;;;-1:-1:-1;;;49117:64:0;;23112:2:1;49117:64:0;;;23094:21:1;23151:2;23131:18;;;23124:30;23190:34;23170:18;;;23163:62;-1:-1:-1;;;23241:18:1;;;23234:33;23284:19;;49117:64:0;22910:399:1;49117:64:0;-1:-1:-1;;;;;62806:23:0;;62782:4;62806:23;;;:14;:23;;;;;;;;49200:12;:26;;;;-1:-1:-1;;;;;;62806:23:0;;62782:4;62806:23;;;:14;:23;;;;;;;;49216:10;49200:26;49192:70;;;;-1:-1:-1;;;49192:70:0;;23516:2:1;49192:70:0;;;23498:21:1;23555:2;23535:18;;;23528:30;23594:33;23574:18;;;23567:61;23645:18;;49192:70:0;23314:355:1;49192:70:0;49279:6;49289:1;49279:11;49275:93;;49307:28;49323:4;49329:2;49333:1;49307:15;:28::i;49275:93::-;49400:10;;49384:12;:26;:43;;;;-1:-1:-1;;;;;;49414:13:0;;;;;;:7;:13;;;;;;;;49384:43;49380:257;;;49482:12;49470:25;;;;:11;:25;;;;;;49498:2;-1:-1:-1;49444:139:0;;;;-1:-1:-1;;;49444:139:0;;23876:2:1;49444:139:0;;;23858:21:1;23915:2;23895:18;;;23888:30;23954:34;23934:18;;;23927:62;-1:-1:-1;;;24005:18:1;;;23998:45;24060:19;;49444:139:0;23674:411:1;49444:139:0;49610:12;49598:25;;;;:11;:25;;;;;:27;;;;;;:::i;:::-;;;;;;49380:257;49654:13;;;;49649:192;;-1:-1:-1;;;;;49710:24:0;;;;;;:18;:24;;;;;;;;;:50;;-1:-1:-1;;;;;;49738:22:0;;;;;;:18;:22;;;;;;;;49710:50;49684:145;;;;-1:-1:-1;;;49684:145:0;;24432:2:1;49684:145:0;;;24414:21:1;24471:2;24451:18;;;24444:30;24510:34;24490:18;;;24483:62;-1:-1:-1;;;24561:18:1;;;24554:31;24602:19;;49684:145:0;24230:397:1;49684:145:0;49853:12;49889:13;;49869:16;;:33;;:88;;;;49944:13;;49919:21;;:38;;49869:88;49853:105;;49989:7;:35;;;;-1:-1:-1;50013:11:0;;;;;;;49989:35;:61;;;;-1:-1:-1;50042:8:0;;;;;;;50041:9;49989:61;:92;;;;-1:-1:-1;;;;;;50068:13:0;;;;;;:7;:13;;;;;;;;50067:14;49989:92;:134;;;;-1:-1:-1;;;;;;50099:24:0;;;;;;:18;:24;;;;;;;;50098:25;49989:134;:174;;;;-1:-1:-1;;;;;;50141:22:0;;;;;;:18;:22;;;;;;;;50140:23;49989:174;49971:1656;;;50209:13;;50194:12;:28;50190:204;;;50330:12;50314:13;:28;50377:1;50361:13;:17;50190:204;50494:20;;50478:13;;:36;50474:1142;;;50535:8;:15;;-1:-1:-1;;50535:15:0;;;;;;50630:16;;-1:-1:-1;;;50630:16:0;;;;:37;;;;;;;;:::i;:::-;;:104;;;-1:-1:-1;50712:22:0;50692:16;;-1:-1:-1;;;50692:16:0;;;;:42;;;;;;;;:::i;:::-;;50630:104;50604:879;;;50806:13;;50781:21;;:38;50777:322;;50848:17;:15;:17::i;:::-;50892:16;:39;;50911:20;;50892:16;-1:-1:-1;;50892:39:0;-1:-1:-1;;;50911:20:0;50892:39;;;;;;50604:879;;50777:322;50988:19;:17;:19::i;:::-;51034:16;:41;;51053:22;;51034:16;-1:-1:-1;;51034:41:0;-1:-1:-1;;;51053:22:0;51034:41;;50604:879;51171:13;;51151:16;;:33;51147:317;;51213:19;:17;:19::i;51147:317::-;51357:17;:15;:17::i;:::-;51401:16;:39;;-1:-1:-1;;51401:39:0;;;;;51147:317;51519:12;51503:13;:28;51550:13;:15;;;:13;:15;;;:::i;:::-;;;;-1:-1:-1;;51584:8:0;:16;;-1:-1:-1;;51584:16:0;;;50474:1142;51655:8;;-1:-1:-1;;;;;51680:24:0;;51639:12;51680:24;;;:18;:24;;;;;;51655:8;;;;;;;51654:9;;51680:24;;:50;;-1:-1:-1;;;;;;51708:22:0;;;;;;:18;:22;;;;;;;;51680:50;51676:98;;;-1:-1:-1;51757:5:0;51676:98;51786:11;51837:7;51833:3074;;;51861:13;51877:16;:14;:16::i;:::-;-1:-1:-1;;;;;52001:13:0;;51908:18;52001:13;;;:7;:13;;;;;;51861:32;;-1:-1:-1;51908:18:0;;;52001:13;;:27;;;;;52027:1;52018:6;;:10;52001:27;52000:82;;;-1:-1:-1;;;;;;52052:13:0;;;;;;:7;:13;;;;;;;;52051:14;:30;;;;-1:-1:-1;;;;;;52070:11:0;;;;;;:7;:11;;;;;;;;52069:12;52051:30;51978:2888;;;52117:32;52138:2;52142:6;52117:20;:32::i;:::-;;52168:24;52185:6;52168:16;:24::i;:::-;;52219:29;52244:3;52220:18;52231:6;;52220;:10;;:18;;;;:::i;:::-;52219:24;;:29::i;:::-;52213:35;;52296:18;52310:3;52296:13;:18::i;:::-;52267:47;;-1:-1:-1;52267:47:0;-1:-1:-1;52337:16:0;;52333:884;;52382:5;52391:1;52382:10;52378:820;;52421:25;52427:4;52433:12;52421:5;:25::i;:::-;52487:11;;:29;;52503:12;52487:15;:29::i;:::-;52473:11;:43;52548:30;;1596:25:1;;;-1:-1:-1;;;;;52548:30:0;;;;;;;;;;1584:2:1;1569:18;52548:30:0;;;;;;;;52378:820;;;52612:5;52621:1;52612:10;52608:590;;52672:18;;:92;;52725:12;52672:22;:92::i;:::-;52651:18;:113;52796:37;;1596:25:1;;;-1:-1:-1;;;;;52796:37:0;;;;;;;;;;1584:2:1;1569:18;52796:37:0;1450:177:1;52608:590:0;52867:5;52876:1;52867:10;52863:335;;52925:16;;:34;;52946:12;52925:20;:34::i;:::-;52906:16;:53;53002:13;;:31;;53020:12;53002:17;:31::i;:::-;52986:13;:47;53065:32;;1596:25:1;;;-1:-1:-1;;;;;53065:32:0;;;;;;;;;;1584:2:1;1569:18;53065:32:0;;;;;;;53124:50;53140:4;53154;53161:12;53124:15;:50::i;:::-;53261:21;;:37;;53287:10;53261:25;:37::i;:::-;53237:21;:61;53338:18;;:34;;53361:10;53338:22;:34::i;:::-;53317:18;:55;53391:48;53407:4;53421;53428:10;53391:15;:48::i;:::-;51978:2888;;;-1:-1:-1;;;;;53465:11:0;;;;;;:7;:11;;;;;;;;:26;;;;;53490:1;53480:7;;:11;53465:26;53461:1405;;;53512:24;53529:6;53512:16;:24::i;:::-;;53563:30;53589:3;53564:19;53575:7;;53564:6;:10;;:19;;;;:::i;53563:30::-;53557:36;;53641:18;53655:3;53641:13;:18::i;:::-;53612:47;;-1:-1:-1;53612:47:0;-1:-1:-1;53682:16:0;;53678:950;;53727:5;53736:1;53727:10;53723:886;;53766:25;53772:4;53778:12;53766:5;:25::i;:::-;53832:11;;:29;;53848:12;53832:15;:29::i;:::-;53818:11;:43;53893:30;;1596:25:1;;;-1:-1:-1;;;;;53893:30:0;;;;;;;;;;1584:2:1;1569:18;53893:30:0;;;;;;;;53723:886;;;53957:5;53966:1;53957:10;53953:656;;53996:39;54012:4;54018:2;54022:12;53996:15;:39::i;:::-;54083:18;;:92;;54136:12;54083:22;:92::i;:::-;54062:18;:113;54207:37;;1596:25:1;;;-1:-1:-1;;;;;54207:37:0;;;;;;;;;;1584:2:1;1569:18;54207:37:0;1450:177:1;53953:656:0;54278:5;54287:1;54278:10;54274:335;;54317:50;54333:4;54347;54354:12;54317:15;:50::i;:::-;54413:16;;:34;;54434:12;54413:20;:34::i;:::-;54394:16;:53;54479:32;;1596:25:1;;;-1:-1:-1;;;;;54479:32:0;;;;;;;;;;1584:2:1;1569:18;54479:32:0;;;;;;;54554:13;;:31;;54572:12;54554:17;:31::i;:::-;54538:13;:47;54274:335;54672:21;;:37;;54698:10;54672:25;:37::i;:::-;54648:21;:61;54749:18;;:34;;54772:10;54749:22;:34::i;:::-;54728:18;:55;54802:48;54818:4;54832;54839:10;54802:15;:48::i;:::-;54882:13;54892:3;54882:13;;:::i;:::-;;;51846:3061;;;51833:3074;54919:33;54935:4;54941:2;54945:6;54919:15;:33::i;:::-;54965:15;;-1:-1:-1;;;;;54965:15:0;:26;55000:4;55007:15;55000:4;55007:9;:15::i;:::-;54965:58;;-1:-1:-1;;;;;;54965:58:0;;;;;;;-1:-1:-1;;;;;20232:32:1;;;54965:58:0;;;20214:51:1;20281:18;;;20274:34;20187:18;;54965:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;55034:15:0;;-1:-1:-1;;;;;55034:15:0;;-1:-1:-1;55034:26:0;;-1:-1:-1;55069:2:0;55074:13;55069:2;55074:9;:13::i;:::-;55034:54;;-1:-1:-1;;;;;;55034:54:0;;;;;;;-1:-1:-1;;;;;20232:32:1;;;55034:54:0;;;20214:51:1;20281:18;;;20274:34;20187:18;;55034:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49027:6069;;;48914:6182;;;:::o;8925:132::-;8876:7;8903:6;-1:-1:-1;;;;;8903:6:0;8358:10;8989:23;8981:68;;;;-1:-1:-1;;;8981:68:0;;25394:2:1;8981:68:0;;;25376:21:1;;;25413:18;;;25406:30;25472:34;25452:18;;;25445:62;25524:18;;8981:68:0;25192:356:1;55260:208:0;-1:-1:-1;;;;;55334:17:0;;;;;;:9;:17;;;;;;:27;-1:-1:-1;55334:27:0;55326:61;;;;-1:-1:-1;;;55326:61:0;;25755:2:1;55326:61:0;;;25737:21:1;25794:2;25774:18;;;25767:30;-1:-1:-1;;;25813:18:1;;;25806:51;25874:18;;55326:61:0;25553:345:1;55326:61:0;55398:21;55404:6;55412;55398:5;:21::i;:::-;55445:6;-1:-1:-1;;;;;55435:25:0;;55453:6;55435:25;;;;1596::1;;1584:2;1569:18;;1450:177;55435:25:0;;;;;;;;55260:208;;:::o;9422:191::-;9496:16;9515:6;;-1:-1:-1;;;;;9532:17:0;;;-1:-1:-1;;;;;;9532:17:0;;;;;;9565:40;;9515:6;;;;;;;9565:40;;9496:16;9565:40;9485:128;9422:191;:::o;14856:712::-;-1:-1:-1;;;;;14987:18:0;;14979:68;;;;-1:-1:-1;;;14979:68:0;;26105:2:1;14979:68:0;;;26087:21:1;26144:2;26124:18;;;26117:30;26183:34;26163:18;;;26156:62;-1:-1:-1;;;26234:18:1;;;26227:35;26279:19;;14979:68:0;25903:401:1;14979:68:0;-1:-1:-1;;;;;15066:16:0;;15058:64;;;;-1:-1:-1;;;15058:64:0;;26511:2:1;15058:64:0;;;26493:21:1;26550:2;26530:18;;;26523:30;26589:34;26569:18;;;26562:62;-1:-1:-1;;;26640:18:1;;;26633:33;26683:19;;15058:64:0;26309:399:1;15058:64:0;-1:-1:-1;;;;;15208:15:0;;15186:19;15208:15;;;:9;:15;;;;;;15256:21;;;;15234:109;;;;-1:-1:-1;;;15234:109:0;;26915:2:1;15234:109:0;;;26897:21:1;26954:2;26934:18;;;26927:30;26993:34;26973:18;;;26966:62;-1:-1:-1;;;27044:18:1;;;27037:36;27090:19;;15234:109:0;26713:402:1;15234:109:0;-1:-1:-1;;;;;15379:15:0;;;;;;;:9;:15;;;;;;15397:20;;;15379:38;;15432:13;;;;;;;;;;:23;;;;;;15484:26;;;;;;15411:6;1596:25:1;;1584:2;1569:18;;1450:177;15484:26:0;;;;;;;;15523:37;69735:458;67683:1086;67729:23;67755:24;67773:4;67755:9;:24::i;:::-;67729:50;;67790:20;67856:13;;67831:21;;:38;67827:263;;67914:13;;:18;;67930:2;67914:18;:::i;:::-;67890:21;;:42;67886:193;;;67968:13;;:18;;67984:2;67968:18;:::i;:::-;67953:33;;67886:193;;;-1:-1:-1;68042:21:0;;67886:193;68106:20;;;:41;;-1:-1:-1;68130:17:0;;68106:41;68102:80;;;68164:7;;67683:1086::o;68102:80::-;68222:21;68256:30;68273:12;68256:16;:30::i;:::-;68299:18;68320:44;:21;68346:17;68320:25;:44::i;:::-;68401:21;;68299:65;;-1:-1:-1;68401:39:0;;68427:12;68401:25;:39::i;:::-;68377:21;:63;68498:9;;68453:12;;-1:-1:-1;;;;;68498:9:0;68521:17;:10;68536:1;68521:14;:17::i;:::-;68490:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68476:67;;;;;68562:7;68554:56;;;;-1:-1:-1;;;68554:56:0;;27532:2:1;68554:56:0;;;27514:21:1;27571:2;27551:18;;;27544:30;27610:34;27590:18;;;27583:62;-1:-1:-1;;;27661:18:1;;;27654:34;27705:19;;68554:56:0;27330:400:1;68554:56:0;68645:11;;-1:-1:-1;;;;;68645:11:0;68670:17;:10;68685:1;68670:14;:17::i;:::-;68637:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68623:69;;;;;68711:7;68703:58;;;;-1:-1:-1;;;68703:58:0;;27937:2:1;68703:58:0;;;27919:21:1;27976:2;27956:18;;;27949:30;28015:34;27995:18;;;27988:62;-1:-1:-1;;;28066:18:1;;;28059:36;28112:19;;68703:58:0;27735:402:1;68777:950:0;68825:23;68851:24;68869:4;68851:9;:24::i;:::-;68825:50;;68886:20;68947:13;;68927:16;;:33;68923:248;;69000:13;;:18;;69016:2;69000:18;:::i;:::-;68981:16;;:37;68977:183;;;69054:13;;:18;;69070:2;69054:18;:::i;:::-;69039:33;;68977:183;;;-1:-1:-1;69128:16:0;;68977:183;69187:20;;;:41;;-1:-1:-1;69211:17:0;;69187:41;69183:80;;;69245:7;;68777:950::o;69183:80::-;69303:21;69335:30;69352:12;69335:16;:30::i;:::-;69376:18;69397:44;:21;69423:17;69397:25;:44::i;:::-;69473:16;;69376:65;;-1:-1:-1;69473:34:0;;69494:12;69473:20;:34::i;:::-;69454:16;:53;69565:15;;69557:52;;69520:12;;-1:-1:-1;;;;;69565:15:0;;69594:10;;69520:12;69557:52;69520:12;69557:52;69594:10;69565:15;69557:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69543:66;;;;;69628:7;69620:56;;;;-1:-1:-1;;;69620:56:0;;28344:2:1;69620:56:0;;;28326:21:1;28383:2;28363:18;;;28356:30;28422:34;28402:18;;;28395:62;-1:-1:-1;;;28473:18:1;;;28466:34;28517:19;;69620:56:0;28142:400:1;69620:56:0;69694:25;;1596::1;;;69694::0;;1584:2:1;1569:18;69694:25:0;;;;;;;68814:913;;;;;68777:950::o;65771:465::-;65912:250;;;65951:15;65912:250;;;28816:19:1;65989:16:0;28851:12:1;;;28844:28;;;;66028:14:0;28888:12:1;;;;28881:28;;;;66065:9:0;28943:15:1;;-1:-1:-1;;28939:53:1;28925:12;;;28918:75;66097:12:0;29009:13:1;;;29002:29;66132:11:0;29047:13:1;;;29040:29;-1:-1:-1;;;;66191:1:0;;29085:13:1;;65912:250:0;;;;;;;;;;;;65884:293;;;;;;65862:326;;:330;;;;:::i;:::-;65839:353;-1:-1:-1;66212:16:0;65839:353;66227:1;66212:16;:::i;:::-;66205:23;;;65771:465;:::o;66733:293::-;66847:4;66909:32;66934:6;66909:20;66919:9;66909;:20::i;:::-;:24;;:32::i;:::-;66891:14;;:50;;66869:127;;;;-1:-1:-1;;;66869:127:0;;29428:2:1;66869:127:0;;;29410:21:1;29467:2;29447:18;;;29440:30;29506:29;29486:18;;;29479:57;29553:18;;66869:127:0;29226:351:1;67034:176:0;67098:4;67133:10;;67123:6;:20;;67115:65;;;;-1:-1:-1;;;67115:65:0;;29784:2:1;67115:65:0;;;29766:21:1;;;29803:18;;;29796:30;29862:34;29842:18;;;29835:62;29914:18;;67115:65:0;29582:356:1;5814:98:0;5872:7;5899:5;5903:1;5899;:5;:::i;5920:98::-;5978:7;6005:5;6009:1;6005;:5;:::i;66278:447::-;66364:21;66387:20;66425:22;66458:21;66587:3;66538:29;;66532:3;:35;;;;:::i;:::-;66523:46;;:4;:46;:::i;:::-;66522:69;;;;:::i;:::-;66492:99;;66662:3;66627:29;;66619:4;:38;;;;:::i;:::-;66618:48;;;;:::i;:::-;66687:14;;66602:64;;-1:-1:-1;66278:447:0;;-1:-1:-1;;;66278:447:0:o;5602:98::-;5660:7;5687:5;5691:1;5687;:5;:::i;16019:595::-;-1:-1:-1;;;;;16103:21:0;;16095:67;;;;-1:-1:-1;;;16095:67:0;;30145:2:1;16095:67:0;;;30127:21:1;30184:2;30164:18;;;30157:30;30223:34;30203:18;;;30196:62;-1:-1:-1;;;30274:18:1;;;30267:31;30315:19;;16095:67:0;29943:397:1;16095:67:0;-1:-1:-1;;;;;16262:18:0;;16237:22;16262:18;;;:9;:18;;;;;;16299:24;;;;16291:71;;;;-1:-1:-1;;;16291:71:0;;30547:2:1;16291:71:0;;;30529:21:1;30586:2;30566:18;;;30559:30;30625:34;30605:18;;;30598:62;-1:-1:-1;;;30676:18:1;;;30669:32;30718:19;;16291:71:0;30345:398:1;16291:71:0;-1:-1:-1;;;;;16398:18:0;;;;;;:9;:18;;;;;;;;16419:23;;;16398:44;;16457:12;:22;;;;;;;16508:37;1596:25:1;;;16398:18:0;;;16508:37;;1569:18:1;16508:37:0;;;;;;;69977:208:::1;;;69735:458::o:0;67218:457::-;67308:16;;;67322:1;67308:16;;;;;;;;67284:21;;67308:16;;;;;;;;;;-1:-1:-1;67308:16:0;67284:40;;67353:4;67335;67340:1;67335:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;67335:23:0;;;:7;;;;;;;;;;:23;;;;67379:9;;:16;;;-1:-1:-1;;;67379:16:0;;;;:9;;;;;:14;;:16;;;;;67335:7;;67379:16;;;;;:9;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;67369:4;67374:1;67369:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;67369:26:0;;;:7;;;;;;;;;:26;67440:9;;67408:56;;67425:4;;67440:9;67452:11;67408:8;:56::i;:::-;67477:9;;:190;;-1:-1:-1;;;67477:190:0;;-1:-1:-1;;;;;67477:9:0;;;;:60;;:190;;67552:11;;67477:9;;67594:4;;67621;;67641:15;;67477:190;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67273:402;67218:457;:::o;5708:98::-;5766:7;5793:5;5797:1;5793;:5;:::i;14:548:1:-;126:4;155:2;184;173:9;166:21;216:6;210:13;259:6;254:2;243:9;239:18;232:34;284:1;294:140;308:6;305:1;302:13;294:140;;;403:14;;;399:23;;393:30;369:17;;;388:2;365:26;358:66;323:10;;294:140;;;298:3;483:1;478:2;469:6;458:9;454:22;450:31;443:42;553:2;546;542:7;537:2;529:6;525:15;521:29;510:9;506:45;502:54;494:62;;;;14:548;;;;:::o;802:131::-;-1:-1:-1;;;;;877:31:1;;867:42;;857:70;;923:1;920;913:12;938:315;1006:6;1014;1067:2;1055:9;1046:7;1042:23;1038:32;1035:52;;;1083:1;1080;1073:12;1035:52;1122:9;1109:23;1141:31;1166:5;1141:31;:::i;:::-;1191:5;1243:2;1228:18;;;;1215:32;;-1:-1:-1;;;938:315:1:o;1840:388::-;1908:6;1916;1969:2;1957:9;1948:7;1944:23;1940:32;1937:52;;;1985:1;1982;1975:12;1937:52;2024:9;2011:23;2043:31;2068:5;2043:31;:::i;:::-;2093:5;-1:-1:-1;2150:2:1;2135:18;;2122:32;2163:33;2122:32;2163:33;:::i;:::-;2215:7;2205:17;;;1840:388;;;;;:::o;2233:456::-;2310:6;2318;2326;2379:2;2367:9;2358:7;2354:23;2350:32;2347:52;;;2395:1;2392;2385:12;2347:52;2434:9;2421:23;2453:31;2478:5;2453:31;:::i;:::-;2503:5;-1:-1:-1;2560:2:1;2545:18;;2532:32;2573:33;2532:32;2573:33;:::i;:::-;2233:456;;2625:7;;-1:-1:-1;;;2679:2:1;2664:18;;;;2651:32;;2233:456::o;2694:255::-;2761:6;2814:2;2802:9;2793:7;2789:23;2785:32;2782:52;;;2830:1;2827;2820:12;2782:52;2869:9;2856:23;2888:31;2913:5;2888:31;:::i;3859:180::-;3918:6;3971:2;3959:9;3950:7;3946:23;3942:32;3939:52;;;3987:1;3984;3977:12;3939:52;-1:-1:-1;4010:23:1;;3859:180;-1:-1:-1;3859:180:1:o;4044:315::-;4112:6;4120;4173:2;4161:9;4152:7;4148:23;4144:32;4141:52;;;4189:1;4186;4179:12;4141:52;4225:9;4212:23;4202:33;;4285:2;4274:9;4270:18;4257:32;4298:31;4323:5;4298:31;:::i;5346:405::-;5421:6;5429;5437;5490:2;5478:9;5469:7;5465:23;5461:32;5458:52;;;5506:1;5503;5496:12;5458:52;5545:9;5532:23;5595:4;5588:5;5584:16;5577:5;5574:27;5564:55;;5615:1;5612;5605:12;5564:55;5638:5;5690:2;5675:18;;5662:32;;-1:-1:-1;5741:2:1;5726:18;;;5713:32;;5346:405;-1:-1:-1;;;5346:405:1:o;5756:248::-;5824:6;5832;5885:2;5873:9;5864:7;5860:23;5856:32;5853:52;;;5901:1;5898;5891:12;5853:52;-1:-1:-1;;5924:23:1;;;5994:2;5979:18;;;5966:32;;-1:-1:-1;5756:248:1:o;6009:316::-;6086:6;6094;6102;6155:2;6143:9;6134:7;6130:23;6126:32;6123:52;;;6171:1;6168;6161:12;6123:52;-1:-1:-1;;6194:23:1;;;6264:2;6249:18;;6236:32;;-1:-1:-1;6315:2:1;6300:18;;;6287:32;;6009:316;-1:-1:-1;6009:316:1:o;6330:380::-;6409:1;6405:12;;;;6452;;;6473:61;;6527:4;6519:6;6515:17;6505:27;;6473:61;6580:2;6572:6;6569:14;6549:18;6546:38;6543:161;;6626:10;6621:3;6617:20;6614:1;6607:31;6661:4;6658:1;6651:15;6689:4;6686:1;6679:15;6543:161;;6330:380;;;:::o;7024:184::-;7094:6;7147:2;7135:9;7126:7;7122:23;7118:32;7115:52;;;7163:1;7160;7153:12;7115:52;-1:-1:-1;7186:16:1;;7024:184;-1:-1:-1;7024:184:1:o;7627:127::-;7688:10;7683:3;7679:20;7676:1;7669:31;7719:4;7716:1;7709:15;7743:4;7740:1;7733:15;7759:125;7824:9;;;7845:10;;;7842:36;;;7858:18;;:::i;7889:398::-;8091:2;8073:21;;;8130:2;8110:18;;;8103:30;8169:34;8164:2;8149:18;;8142:62;-1:-1:-1;;;8235:2:1;8220:18;;8213:32;8277:3;8262:19;;7889:398::o;9765:277::-;9832:6;9885:2;9873:9;9864:7;9860:23;9856:32;9853:52;;;9901:1;9898;9891:12;9853:52;9933:9;9927:16;9986:5;9979:13;9972:21;9965:5;9962:32;9952:60;;10008:1;10005;9998:12;10738:681;10869:6;10877;10885;10893;10901;10909;10917;10925;10978:3;10966:9;10957:7;10953:23;10949:33;10946:53;;;10995:1;10992;10985:12;10946:53;11027:9;11021:16;11046:31;11071:5;11046:31;:::i;:::-;11096:5;11086:15;;;11141:2;11130:9;11126:18;11120:25;11110:35;;11185:2;11174:9;11170:18;11164:25;11154:35;;11229:2;11218:9;11214:18;11208:25;11198:35;;11273:3;11262:9;11258:19;11252:26;11242:36;;11318:3;11307:9;11303:19;11297:26;11287:36;;11363:3;11352:9;11348:19;11342:26;11332:36;;11408:3;11397:9;11393:19;11387:26;11377:36;;10738:681;;;;;;;;;;;:::o;11424:306::-;11512:6;11520;11528;11581:2;11569:9;11560:7;11556:23;11552:32;11549:52;;;11597:1;11594;11587:12;11549:52;11626:9;11620:16;11610:26;;11676:2;11665:9;11661:18;11655:25;11645:35;;11720:2;11709:9;11705:18;11699:25;11689:35;;11424:306;;;;;:::o;16962:168::-;17002:7;17068:1;17064;17060:6;17056:14;17053:1;17050:21;17045:1;17038:9;17031:17;17027:45;17024:71;;;17075:18;;:::i;:::-;-1:-1:-1;17115:9:1;;16962:168::o;17135:127::-;17196:10;17191:3;17187:20;17184:1;17177:31;17227:4;17224:1;17217:15;17251:4;17248:1;17241:15;17267:120;17307:1;17333;17323:35;;17338:18;;:::i;:::-;-1:-1:-1;17372:9:1;;17267:120::o;24090:135::-;24129:3;24150:17;;;24147:43;;24170:18;;:::i;:::-;-1:-1:-1;24217:1:1;24206:13;;24090:135::o;24632:127::-;24693:10;24688:3;24684:20;24681:1;24674:31;24724:4;24721:1;24714:15;24748:4;24745:1;24738:15;24764:128;24831:9;;;24852:11;;;24849:37;;;24866:18;;:::i;29109:112::-;29141:1;29167;29157:35;;29172:18;;:::i;:::-;-1:-1:-1;29206:9:1;;29109:112::o;30880:127::-;30941:10;30936:3;30932:20;30929:1;30922:31;30972:4;30969:1;30962:15;30996:4;30993:1;30986:15;31012:251;31082:6;31135:2;31123:9;31114:7;31110:23;31106:32;31103:52;;;31151:1;31148;31141:12;31103:52;31183:9;31177:16;31202:31;31227:5;31202:31;:::i;31268:980::-;31530:4;31578:3;31567:9;31563:19;31609:6;31598:9;31591:25;31635:2;31673:6;31668:2;31657:9;31653:18;31646:34;31716:3;31711:2;31700:9;31696:18;31689:31;31740:6;31775;31769:13;31806:6;31798;31791:22;31844:3;31833:9;31829:19;31822:26;;31883:2;31875:6;31871:15;31857:29;;31904:1;31914:195;31928:6;31925:1;31922:13;31914:195;;;31993:13;;-1:-1:-1;;;;;31989:39:1;31977:52;;32084:15;;;;32049:12;;;;32025:1;31943:9;31914:195;;;-1:-1:-1;;;;;;;32165:32:1;;;;32160:2;32145:18;;32138:60;-1:-1:-1;;;32229:3:1;32214:19;32207:35;32126:3;31268:980;-1:-1:-1;;;31268:980:1:o

Swarm Source

ipfs://5f9b2a68bd5702b75da0ba3600d7c43f67190a3a912bd6af2e24b261dfb43807
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.