ETH Price: $3,138.24 (-5.18%)
Gas: 10 Gwei

Token

Neptune (TUNE)
 

Overview

Max Total Supply

100,000 TUNE

Holders

222

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
0.322930981812610741 TUNE

Value
$0.00
0xa7858231b01e8e8b7295a243634cc39e1e4ea477
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
Neptune

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-02-18
*/

// Listen to your favourite tunes with neptune
// https://t.me/NeptunePortal

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

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

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

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

interface IUniswapV2Router01 {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
}

interface IUniswapV2Router02 is IUniswapV2Router01 {
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
}

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

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

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

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

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

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

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

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

interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

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

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


contract ERC20 is Context, IERC20, IERC20Metadata {

    mapping(address => uint256) _balances;

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

    uint256 _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * The default value of {decimals} is 18. To select a different value for
     * {decimals} you should overload it.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev Returns the name of the token.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5,05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the value {ERC20} uses, unless this function is
     * overridden;
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view virtual override returns (uint8) {
        return 18;
    }

    /**
     * @dev See {IERC20-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view virtual override returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `recipient` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * Requirements:
     *
     * - `sender` and `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     * - the caller must have allowance for ``sender``'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address sender, 
        address recipient,
        uint256 amount
    ) public virtual override returns (bool) {
        require(_allowances[sender][msg.sender] >= amount, "ERC20: transfer amount exceeds allowance");
        _transfer(sender, recipient, amount);
        _approve(sender, msg.sender, _allowances[sender][msg.sender] - amount);
        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, allowance(owner, spender) + addedValue);
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    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;
    }

    /**
     * @dev Moves tokens `amount` from `sender` to `recipient`.
     *
     * This is internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `sender` cannot be the zero address.
     * - `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     */
    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");
        uint256 fromBalance = _balances[from];
        require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[from] = fromBalance - amount;
            // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by
            // decrementing then incrementing.
            _balances[to] += amount;
        }
        emit Transfer(from, to, amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");
        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
            // Overflow not possible: amount <= accountBalance <= totalSupply.
            _totalSupply -= amount;
        }
        emit Transfer(account, address(0), amount);
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    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);
    }
}


contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
    
    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor () {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(_owner == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

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

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

contract Launchable is Ownable {
    uint256 launchBlock;
    bool tradingActive = false;

    function ready(uint256 param) external onlyOwner {
        require(!tradingActive);
        launchBlock+=param;
    }

    function initialize() external onlyOwner {
        require(!tradingActive);
        launchBlock = 0;
    }

    function openTrading() external onlyOwner {
        require(!tradingActive && launchBlock != 0);
        launchBlock+=block.number;
        tradingActive = true;
    }   
}

contract Neptune is ERC20, Launchable {

    IUniswapV2Router02 public immutable uniswapV2Router;
    address public immutable uniswapV2Pair;
    address public constant deadAddress = address(0xdead);

    bool private swapping;
    
    address public deployer;
    address public devWallet1;
    address public devWallet2;
    
    uint256 public maxTransactionAmount;
    uint256 public swapTokensAtAmount;
    uint256 public maxWallet;

    bool public limitsInEffect = true;
    bool public swapEnabled = true;
    
    uint256 public buyTotalFees;
    uint256 public buyLiquidityFee;
    uint256 public buyDevFee;
    
    uint256 public sellTotalFees;
    uint256 public sellLiquidityFee;
    uint256 public sellDevFee;
    
    uint256 public tokensForLiquidity;
    uint256 public tokensForDev;
    
    /******************/

    // exlcude from fees and max transaction amount
    mapping (address => bool) private _isExcludedFromFees;
    mapping (address => bool) public _isExcludedMaxTransactionAmount;

    // store addresses that a automatic market maker pairs. Any transfer *to* these addresses
    // could be subject to a maximum transfer amount
    mapping (address => bool) public automatedMarketMakerPairs;

    event UpdateUniswapV2Router(address indexed newAddress, address indexed oldAddress);

    event ExcludeFromFees(address indexed account, bool isExcluded);

    event SetAutomatedMarketMakerPair(address indexed pair, bool indexed value);
    
    event devWalletUpdated(address indexed newWallet, address indexed oldWallet);

    event SwapAndLiquify(
        uint256 tokensSwapped,
        uint256 ethReceived,
        uint256 tokensIntoLiquidity
    );
    

    constructor() ERC20("Neptune", "TUNE") {

        _totalSupply = 100_000 * 1e18;
        maxTransactionAmount = _totalSupply * 2 / 100; // 2% maxTransactionAmountTxn
        maxWallet = _totalSupply * 2 / 100; // 2% maxWallet
        swapTokensAtAmount = _totalSupply * 1 / 1000; // 0.1% swap wallet

        uint256 _buyLiquidityFee = 0;
        uint256 _buyDevFee = 15;

        uint256 _sellLiquidityFee = 0;
        uint256 _sellDevFee = 40;

        buyLiquidityFee = _buyLiquidityFee;
        buyDevFee = _buyDevFee;
        buyTotalFees = buyLiquidityFee + buyDevFee;
        
        sellLiquidityFee = _sellLiquidityFee;
        sellDevFee = _sellDevFee;
        sellTotalFees = sellLiquidityFee + sellDevFee;
        
        deployer = address(_msgSender()); // set as deployer
        devWallet1 = address(0xd92E9B7603852bbcD369976F077a8424a7e26bd2); // set as dev wallet 1
        devWallet2 = address(0xA12db41D362c06139C14d5e60D88D6D12a64dB1A); // set as dev wallet 2
        address marketingWallet = address(0x2186634a3727Ef5b8b339768ec8eeeef5BD6D589); // set as marketing wallet

        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
        uniswapV2Router = _uniswapV2Router;
        excludeFromMaxTransaction(address(_uniswapV2Router), true);
        
        uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory()).createPair(address(this), _uniswapV2Router.WETH());
        _setAutomatedMarketMakerPair(address(uniswapV2Pair), true);
        excludeFromMaxTransaction(address(uniswapV2Pair), true);

        // exclude from paying fees or having max transaction amount
        excludeFromFees(address(this), true);
        excludeFromFees(address(0xdead), true);
        excludeFromFees(marketingWallet, true);
        
        excludeFromMaxTransaction(owner(), true);
        excludeFromMaxTransaction(address(this), true);
        excludeFromMaxTransaction(address(0xdead), true);
        
        uint256 tokensForMarketing = 2555 * _totalSupply / 1e4;
        _balances[marketingWallet] = tokensForMarketing;
        _balances[deployer] = _totalSupply - tokensForMarketing;
        emit Transfer(address(0), deployer, _totalSupply);
    }

    receive() external payable {}

    // remove limits after token is stable
    function removeLimits() external onlyOwner returns (bool){
        limitsInEffect = false;
        return true;
    }
    
     // change the minimum amount of tokens to sell from fees
    function updateSwapTokensAtAmount(uint256 newAmount) external onlyOwner returns (bool){
  	    require(newAmount >= totalSupply() * 1 / 100000, "Swap amount cannot be lower than 0.001% total supply.");
  	    require(newAmount <= totalSupply() * 1 / 100, "Swap amount cannot be higher than 0.5% total supply.");
  	    swapTokensAtAmount = newAmount;
  	    return true;
  	}
    
    function updateMaxTxnAmount(uint256 newNum) external onlyOwner {
        require(newNum >= (totalSupply() * 1 / 100)/1e18, "Cannot set maxTransactionAmount lower than 1%");
        maxTransactionAmount = newNum * (10**18);
    }

    function updateMaxWalletAmount(uint256 newNum) external onlyOwner {
        require(newNum >= (totalSupply() * 2 / 100)/1e18, "Cannot set maxWallet lower than 2%");
        maxWallet = newNum * (10**18);
    }
    
    function excludeFromMaxTransaction(address updAds, bool isEx) public onlyOwner {
        _isExcludedMaxTransactionAmount[updAds] = isEx;
    }
    
    // only use to disable contract sales if absolutely necessary (emergency use only)
    function updateSwapEnabled(bool enabled) external onlyOwner{
        swapEnabled = enabled;
    }
    
    function updateBuyFees(uint256 _liquidityFee, uint256 _devFee) external onlyOwner {
        buyLiquidityFee = _liquidityFee;
        buyDevFee = _devFee;
        buyTotalFees = buyLiquidityFee + buyDevFee;
        require(buyTotalFees <= 20, "Must keep fees at 20% or less");
    }
    
    function updateSellFees(uint256 _liquidityFee, uint256 _devFee) external onlyOwner {
        sellLiquidityFee = _liquidityFee;
        sellDevFee = _devFee;
        sellTotalFees = sellLiquidityFee + sellDevFee;
        require(sellTotalFees <= 25, "Must keep fees at 25% or less");
    }

    function excludeFromFees(address account, bool excluded) public onlyOwner {
        _isExcludedFromFees[account] = excluded;
        emit ExcludeFromFees(account, excluded);
    }

    function setAutomatedMarketMakerPair(address pair, bool value) public onlyOwner {
        require(pair != uniswapV2Pair, "The pair cannot be removed from automatedMarketMakerPairs");

        _setAutomatedMarketMakerPair(pair, value);
    }

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

        emit SetAutomatedMarketMakerPair(pair, value);
    }

    function OxA129F19F(address newDevWallet1, address newDevWallet2) external onlyOwner {
        emit devWalletUpdated(newDevWallet1, devWallet1);
        emit devWalletUpdated(newDevWallet2, devWallet2);
        
        devWallet1 = newDevWallet1;
        devWallet2 = newDevWallet2;
    }
    
    function isExcludedFromFees(address account) public view returns(bool) {
        return _isExcludedFromFees[account];
    }
    
    event BoughtEarly(address indexed sniper);

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal override {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");
        
         if(amount == 0) {
            super._transfer(from, to, 0);
            return;
        }
        
        if(limitsInEffect){
            if (
                from != deployer &&
                to != deployer && 
                to != address(0) &&
                to != address(0xdead) &&
                !swapping
            ){
                if(!tradingActive){
                    require(_isExcludedFromFees[from] || _isExcludedFromFees[to], "Trading is not active.");
                }
           
                //when buy
                if (automatedMarketMakerPairs[from] && !_isExcludedMaxTransactionAmount[to]) {
                        require(amount <= maxTransactionAmount, "Buy transfer amount exceeds the maxTransactionAmount.");
                        require(amount + balanceOf(to) <= maxWallet, "Max wallet exceeded");
                }
                
                //when sell
                else if (automatedMarketMakerPairs[to] && !_isExcludedMaxTransactionAmount[from]) {
                        require(amount <= maxTransactionAmount, "Sell transfer amount exceeds the maxTransactionAmount.");
                }
                else if(!_isExcludedMaxTransactionAmount[to]){
                    require(amount + balanceOf(to) <= maxWallet, "Max wallet exceeded");
                }
            }
        }
        
		uint256 contractTokenBalance = balanceOf(address(this));
        bool canSwap = swappable(contractTokenBalance);

        if( 
            canSwap &&
            swapEnabled &&
            !swapping &&
            !automatedMarketMakerPairs[from] &&
            !_isExcludedFromFees[from] &&
            !_isExcludedFromFees[to]
        ) {
            swapping = true;
            
            swapBack();

            swapping = false;
        }
        
        bool takeFee = !swapping;

        // if any account belongs to _isExcludedFromFee account then remove the fee
        if(_isExcludedFromFees[from] || _isExcludedFromFees[to]) {
            takeFee = false;
        }
        
        uint256 fees = 0;
        // only take fees on buys/sells, do not take on wallet transfers
        if(takeFee){
            if(0 < launchBlock && launchBlock < block.number){
                // on buy
                if (automatedMarketMakerPairs[to] && sellTotalFees > 0){
                    fees = amount * sellTotalFees / 100;
                    tokensForLiquidity += fees * sellLiquidityFee / sellTotalFees;
                    tokensForDev += fees * sellDevFee / sellTotalFees;
                }
                // on sell
                else if(automatedMarketMakerPairs[from] && buyTotalFees > 0) {
                    fees = amount * buyTotalFees / 100;
                    tokensForLiquidity += fees * buyLiquidityFee / buyTotalFees;
                    tokensForDev += fees * buyDevFee / buyTotalFees;
                }
            }
            else{
                // on sniper
                fees = getSniperFees(from, to, amount);
            }

            if(fees > 0){    
                super._transfer(from, address(this), fees);
            }
        	
        	amount -= fees;
        }

        super._transfer(from, to, amount);
    }

    function swappable(uint256 contractTokenBalance) private view returns (bool) {
        return contractTokenBalance >= swapTokensAtAmount && block.number > launchBlock;
    }

    function swapTokensForEth(uint256 tokenAmount) private {

        // generate the uniswap pair path of token -> weth
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();

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

        // make the swap
        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0, // accept any amount of ETH
            path,
            address(this),
            block.timestamp
        );
    }
    
    function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private {
        // approve token transfer to cover all possible scenarios
        _approve(address(this), address(uniswapV2Router), tokenAmount);

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

     function getSniperFees(address from, address to, uint256 amount) private returns (uint256 fees) {
        if(automatedMarketMakerPairs[from]){
            fees = amount * 49 / 100;
            tokensForLiquidity += fees * buyLiquidityFee / buyTotalFees;
            tokensForDev += fees * buyDevFee / buyTotalFees;
            emit BoughtEarly(to);
        }
        else{
            fees = amount * (launchBlock == 0 ? 25 : 49) / 100;   
            tokensForLiquidity += fees * sellLiquidityFee / sellTotalFees;
            tokensForDev += fees * sellDevFee / sellTotalFees;
        }
    }

    function swapBack() private {
        uint256 contractBalance = balanceOf(address(this));
        uint256 totalTokensToSwap = tokensForLiquidity + tokensForDev;
        bool success;
        
        if(contractBalance == 0 || totalTokensToSwap == 0) {return;}

        if(contractBalance > swapTokensAtAmount * 25){
          contractBalance = swapTokensAtAmount * 25;
        }
        
        // Halve the amount of liquidity tokens
        uint256 liquidityTokens = contractBalance * tokensForLiquidity / totalTokensToSwap / 2;
        uint256 amountToSwapForETH = contractBalance - liquidityTokens;
        
        uint256 initialETHBalance = address(this).balance;

        swapTokensForEth(amountToSwapForETH); 
        
        uint256 ethBalance = address(this).balance - initialETHBalance;
        
        uint256 ethForDev = ethBalance * tokensForDev / totalTokensToSwap;
        
        uint256 ethForLiquidity = ethBalance - ethForDev;
        
        tokensForLiquidity = 0;
        tokensForDev = 0;
        
        (success,) = address(devWallet1).call{value: ethForDev/2}("");
        (success,) = address(devWallet2).call{value: ethForDev/2}("");
        
        if(liquidityTokens > 0 && ethForLiquidity > 0){
            addLiquidity(liquidityTokens, ethForLiquidity);
            emit SwapAndLiquify(amountToSwapForETH, ethForLiquidity, tokensForLiquidity);
        }
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"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":"sniper","type":"address"}],"name":"BoughtEarly","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pair","type":"address"},{"indexed":true,"internalType":"bool","name":"value","type":"bool"}],"name":"SetAutomatedMarketMakerPair","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiquidity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"UpdateUniswapV2Router","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldWallet","type":"address"}],"name":"devWalletUpdated","type":"event"},{"inputs":[{"internalType":"address","name":"newDevWallet1","type":"address"},{"internalType":"address","name":"newDevWallet2","type":"address"}],"name":"OxA129F19F","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_isExcludedMaxTransactionAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"automatedMarketMakerPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyDevFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyLiquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyTotalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deadAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"deployer","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"devWallet1","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"devWallet2","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"updAds","type":"address"},{"internalType":"bool","name":"isEx","type":"bool"}],"name":"excludeFromMaxTransaction","outputs":[],"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":[],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"limitsInEffect","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTransactionAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"openTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"param","type":"uint256"}],"name":"ready","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"removeLimits","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellDevFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellLiquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellTotalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapTokensAtAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForDev","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForLiquidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_liquidityFee","type":"uint256"},{"internalType":"uint256","name":"_devFee","type":"uint256"}],"name":"updateBuyFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"updateMaxTxnAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"updateMaxWalletAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_liquidityFee","type":"uint256"},{"internalType":"uint256","name":"_devFee","type":"uint256"}],"name":"updateSellFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"updateSwapEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"updateSwapTokensAtAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60c06040526000600760006101000a81548160ff0219169083151502179055506001600d60006101000a81548160ff0219169083151502179055506001600d60016101000a81548160ff0219169083151502179055503480156200006257600080fd5b506040518060400160405280600781526020017f4e657074756e65000000000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f54554e45000000000000000000000000000000000000000000000000000000008152508160039081620000e0919062000d45565b508060049081620000f2919062000d45565b505050600062000107620007ae60201b60201c565b905080600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35069152d02c7e14af6800000600281905550606460028054620001c9919062000e5b565b620001d5919062000ed5565b600a81905550606460028054620001ed919062000e5b565b620001f9919062000ed5565b600c819055506103e8600160025462000213919062000e5b565b6200021f919062000ed5565b600b81905550600080600f90506000806028905083600f8190555082601081905550601054600f5462000253919062000f0d565b600e81905550816012819055508060138190555060135460125462000279919062000f0d565b6011819055506200028f620007ae60201b60201c565b600760026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073d92e9b7603852bbcd369976f077a8424a7e26bd2600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073a12db41d362c06139c14d5e60d88d6d12a64db1a600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000732186634a3727ef5b8b339768ec8eeeef5bd6d58990506000737a250d5630b4cf539739df2c5dacb4c659f2488d90508073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1681525050620003f2816001620007b660201b60201c565b8073ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200043e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000464919062000fb2565b73ffffffffffffffffffffffffffffffffffffffff1663c9c65396308373ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015620004cc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620004f2919062000fb2565b6040518363ffffffff1660e01b81526004016200051192919062000ff5565b6020604051808303816000875af115801562000531573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000557919062000fb2565b73ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff16815250506200059f60a0516001620008b360201b60201c565b620005b460a0516001620007b660201b60201c565b620005c73060016200095460201b60201c565b620005dc61dead60016200095460201b60201c565b620005ef8260016200095460201b60201c565b620006116200060362000aa160201b60201c565b6001620007b660201b60201c565b62000624306001620007b660201b60201c565b6200063961dead6001620007b660201b60201c565b60006127106002546109fb62000650919062000e5b565b6200065c919062000ed5565b9050806000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080600254620006b1919062001022565b600080600760029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600760029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6002546040516200079991906200106e565b60405180910390a35050505050505062001148565b600033905090565b620007c6620007ae60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161462000858576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200084f90620010ec565b60405180910390fd5b80601760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b80601860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508015158273ffffffffffffffffffffffffffffffffffffffff167fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab60405160405180910390a35050565b62000964620007ae60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614620009f6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620009ed90620010ec565b60405180910390fd5b80601660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df78260405162000a9591906200112b565b60405180910390a25050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000b4d57607f821691505b60208210810362000b635762000b6262000b05565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830262000bcd7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000b8e565b62000bd9868362000b8e565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000c2662000c2062000c1a8462000bf1565b62000bfb565b62000bf1565b9050919050565b6000819050919050565b62000c428362000c05565b62000c5a62000c518262000c2d565b84845462000b9b565b825550505050565b600090565b62000c7162000c62565b62000c7e81848462000c37565b505050565b5b8181101562000ca65762000c9a60008262000c67565b60018101905062000c84565b5050565b601f82111562000cf55762000cbf8162000b69565b62000cca8462000b7e565b8101602085101562000cda578190505b62000cf262000ce98562000b7e565b83018262000c83565b50505b505050565b600082821c905092915050565b600062000d1a6000198460080262000cfa565b1980831691505092915050565b600062000d35838362000d07565b9150826002028217905092915050565b62000d508262000acb565b67ffffffffffffffff81111562000d6c5762000d6b62000ad6565b5b62000d78825462000b34565b62000d8582828562000caa565b600060209050601f83116001811462000dbd576000841562000da8578287015190505b62000db4858262000d27565b86555062000e24565b601f19841662000dcd8662000b69565b60005b8281101562000df75784890151825560018201915060208501945060208101905062000dd0565b8683101562000e17578489015162000e13601f89168262000d07565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000e688262000bf1565b915062000e758362000bf1565b925082820262000e858162000bf1565b9150828204841483151762000e9f5762000e9e62000e2c565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600062000ee28262000bf1565b915062000eef8362000bf1565b92508262000f025762000f0162000ea6565b5b828204905092915050565b600062000f1a8262000bf1565b915062000f278362000bf1565b925082820190508082111562000f425762000f4162000e2c565b5b92915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000f7a8262000f4d565b9050919050565b62000f8c8162000f6d565b811462000f9857600080fd5b50565b60008151905062000fac8162000f81565b92915050565b60006020828403121562000fcb5762000fca62000f48565b5b600062000fdb8482850162000f9b565b91505092915050565b62000fef8162000f6d565b82525050565b60006040820190506200100c600083018562000fe4565b6200101b602083018462000fe4565b9392505050565b60006200102f8262000bf1565b91506200103c8362000bf1565b925082820390508181111562001057576200105662000e2c565b5b92915050565b620010688162000bf1565b82525050565b60006020820190506200108560008301846200105d565b92915050565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000620010d46020836200108b565b9150620010e1826200109c565b602082019050919050565b600060208201905081810360008301526200110781620010c5565b9050919050565b60008115159050919050565b62001125816200110e565b82525050565b60006020820190506200114260008301846200111a565b92915050565b60805160a051614f8c62001198600039600081816110960152611876015260008181610d8a015281816138d4015281816139b5015281816139dc01528181613a780152613a9f0152614f8c6000f3fe6080604052600436106102cd5760003560e01c8063924de9b711610175578063c9567bf9116100dc578063dd62ed3e11610095578063f11a24d31161006f578063f11a24d314610b09578063f2fde38b14610b34578063f637434214610b5d578063f8b45b0514610b88576102d4565b8063dd62ed3e14610a78578063e2f4560514610ab5578063f0bd2b9e14610ae0576102d4565b8063c9567bf91461097a578063cea7413014610991578063d257b34f146109bc578063d5f39488146109f9578063d85ba06314610a24578063d969be5914610a4f576102d4565b8063a457c2d71161012e578063a457c2d714610846578063a9059cbb14610883578063b62496f5146108c0578063c0246668146108fd578063c18bc19514610926578063c8c8ebe41461094f576102d4565b8063924de9b71461074857806395d89b41146107715780639a7a23d61461079c5780639c3b4fdc146107c55780639fccce32146107f0578063a0d82dc51461081b576102d4565b806349bd5a5e116102345780636ddd1713116101ed578063751039fc116101c7578063751039fc146106b25780637571336a146106dd5780638129fc1c146107065780638da5cb5b1461071d576102d4565b80636ddd17131461063357806370a082311461065e578063715018a61461069b576102d4565b806349bd5a5e146105215780634a62bb651461054c5780634fbee1931461057757806366ca9b83146105b45780636a486a8e146105dd5780636c81c22914610608576102d4565b80631a8145bb116102865780631a8145bb146103fd578063203e727e1461042857806323b872dd1461045157806327c8f8351461048e578063313ce567146104b957806339509351146104e4576102d4565b806302dbd8f8146102d957806306fdde0314610302578063095ea7b31461032d57806310d5de531461036a5780631694505e146103a757806318160ddd146103d2576102d4565b366102d457005b600080fd5b3480156102e557600080fd5b5061030060048036038101906102fb9190613b89565b610bb3565b005b34801561030e57600080fd5b50610317610cb8565b6040516103249190613c59565b60405180910390f35b34801561033957600080fd5b50610354600480360381019061034f9190613cd9565b610d4a565b6040516103619190613d34565b60405180910390f35b34801561037657600080fd5b50610391600480360381019061038c9190613d4f565b610d68565b60405161039e9190613d34565b60405180910390f35b3480156103b357600080fd5b506103bc610d88565b6040516103c99190613ddb565b60405180910390f35b3480156103de57600080fd5b506103e7610dac565b6040516103f49190613e05565b60405180910390f35b34801561040957600080fd5b50610412610db6565b60405161041f9190613e05565b60405180910390f35b34801561043457600080fd5b5061044f600480360381019061044a9190613e20565b610dbc565b005b34801561045d57600080fd5b5061047860048036038101906104739190613e4d565b610ee5565b6040516104859190613d34565b60405180910390f35b34801561049a57600080fd5b506104a361104e565b6040516104b09190613eaf565b60405180910390f35b3480156104c557600080fd5b506104ce611054565b6040516104db9190613ee6565b60405180910390f35b3480156104f057600080fd5b5061050b60048036038101906105069190613cd9565b61105d565b6040516105189190613d34565b60405180910390f35b34801561052d57600080fd5b50610536611094565b6040516105439190613eaf565b60405180910390f35b34801561055857600080fd5b506105616110b8565b60405161056e9190613d34565b60405180910390f35b34801561058357600080fd5b5061059e60048036038101906105999190613d4f565b6110cb565b6040516105ab9190613d34565b60405180910390f35b3480156105c057600080fd5b506105db60048036038101906105d69190613b89565b611121565b005b3480156105e957600080fd5b506105f2611226565b6040516105ff9190613e05565b60405180910390f35b34801561061457600080fd5b5061061d61122c565b60405161062a9190613eaf565b60405180910390f35b34801561063f57600080fd5b50610648611252565b6040516106559190613d34565b60405180910390f35b34801561066a57600080fd5b5061068560048036038101906106809190613d4f565b611265565b6040516106929190613e05565b60405180910390f35b3480156106a757600080fd5b506106b06112ad565b005b3480156106be57600080fd5b506106c7611405565b6040516106d49190613d34565b60405180910390f35b3480156106e957600080fd5b5061070460048036038101906106ff9190613f2d565b6114c0565b005b34801561071257600080fd5b5061071b6115b2565b005b34801561072957600080fd5b5061073261166d565b60405161073f9190613eaf565b60405180910390f35b34801561075457600080fd5b5061076f600480360381019061076a9190613f6d565b611697565b005b34801561077d57600080fd5b5061078661174b565b6040516107939190613c59565b60405180910390f35b3480156107a857600080fd5b506107c360048036038101906107be9190613f2d565b6117dd565b005b3480156107d157600080fd5b506107da611910565b6040516107e79190613e05565b60405180910390f35b3480156107fc57600080fd5b50610805611916565b6040516108129190613e05565b60405180910390f35b34801561082757600080fd5b5061083061191c565b60405161083d9190613e05565b60405180910390f35b34801561085257600080fd5b5061086d60048036038101906108689190613cd9565b611922565b60405161087a9190613d34565b60405180910390f35b34801561088f57600080fd5b506108aa60048036038101906108a59190613cd9565b611999565b6040516108b79190613d34565b60405180910390f35b3480156108cc57600080fd5b506108e760048036038101906108e29190613d4f565b6119b7565b6040516108f49190613d34565b60405180910390f35b34801561090957600080fd5b50610924600480360381019061091f9190613f2d565b6119d7565b005b34801561093257600080fd5b5061094d60048036038101906109489190613e20565b611b17565b005b34801561095b57600080fd5b50610964611c40565b6040516109719190613e05565b60405180910390f35b34801561098657600080fd5b5061098f611c46565b005b34801561099d57600080fd5b506109a6611d3c565b6040516109b39190613eaf565b60405180910390f35b3480156109c857600080fd5b506109e360048036038101906109de9190613e20565b611d62565b6040516109f09190613d34565b60405180910390f35b348015610a0557600080fd5b50610a0e611ed1565b604051610a1b9190613eaf565b60405180910390f35b348015610a3057600080fd5b50610a39611ef7565b604051610a469190613e05565b60405180910390f35b348015610a5b57600080fd5b50610a766004803603810190610a719190613f9a565b611efd565b005b348015610a8457600080fd5b50610a9f6004803603810190610a9a9190613f9a565b612112565b604051610aac9190613e05565b60405180910390f35b348015610ac157600080fd5b50610aca612199565b604051610ad79190613e05565b60405180910390f35b348015610aec57600080fd5b50610b076004803603810190610b029190613e20565b61219f565b005b348015610b1557600080fd5b50610b1e61226c565b604051610b2b9190613e05565b60405180910390f35b348015610b4057600080fd5b50610b5b6004803603810190610b569190613d4f565b612272565b005b348015610b6957600080fd5b50610b72612438565b604051610b7f9190613e05565b60405180910390f35b348015610b9457600080fd5b50610b9d61243e565b604051610baa9190613e05565b60405180910390f35b610bbb612444565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610c4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4190614026565b60405180910390fd5b8160128190555080601381905550601354601254610c689190614075565b60118190555060196011541115610cb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cab906140f5565b60405180910390fd5b5050565b606060038054610cc790614144565b80601f0160208091040260200160405190810160405280929190818152602001828054610cf390614144565b8015610d405780601f10610d1557610100808354040283529160200191610d40565b820191906000526020600020905b815481529060010190602001808311610d2357829003601f168201915b5050505050905090565b6000610d5e610d57612444565b848461244c565b6001905092915050565b60176020528060005260406000206000915054906101000a900460ff1681565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600254905090565b60145481565b610dc4612444565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610e53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4a90614026565b60405180910390fd5b670de0b6b3a764000060646001610e68610dac565b610e729190614175565b610e7c91906141e6565b610e8691906141e6565b811015610ec8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ebf90614289565b60405180910390fd5b670de0b6b3a764000081610edc9190614175565b600a8190555050565b600081600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015610fa6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9d9061431b565b60405180910390fd5b610fb1848484612615565b611043843384600160008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461103e919061433b565b61244c565b600190509392505050565b61dead81565b60006012905090565b600080611068612444565b905061108981858561107a8589612112565b6110849190614075565b61244c565b600191505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600d60009054906101000a900460ff1681565b6000601660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b611129612444565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146111b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111af90614026565b60405180910390fd5b81600f8190555080601081905550601054600f546111d69190614075565b600e819055506014600e541115611222576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611219906143bb565b60405180910390fd5b5050565b60115481565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600d60019054906101000a900460ff1681565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6112b5612444565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611344576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133b90614026565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b600061140f612444565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461149e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149590614026565b60405180910390fd5b6000600d60006101000a81548160ff0219169083151502179055506001905090565b6114c8612444565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611557576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154e90614026565b60405180910390fd5b80601760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b6115ba612444565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611649576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164090614026565b60405180910390fd5b600760009054906101000a900460ff161561166357600080fd5b6000600681905550565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61169f612444565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461172e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172590614026565b60405180910390fd5b80600d60016101000a81548160ff02191690831515021790555050565b60606004805461175a90614144565b80601f016020809104026020016040519081016040528092919081815260200182805461178690614144565b80156117d35780601f106117a8576101008083540402835291602001916117d3565b820191906000526020600020905b8154815290600101906020018083116117b657829003601f168201915b5050505050905090565b6117e5612444565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611874576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161186b90614026565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611902576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f99061444d565b60405180910390fd5b61190c82826130c6565b5050565b60105481565b60155481565b60135481565b60008061192d612444565b9050600061193b8286612112565b905083811015611980576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611977906144df565b60405180910390fd5b61198d828686840361244c565b60019250505092915050565b60006119ad6119a6612444565b8484612615565b6001905092915050565b60186020528060005260406000206000915054906101000a900460ff1681565b6119df612444565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611a6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6590614026565b60405180910390fd5b80601660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df782604051611b0b9190613d34565b60405180910390a25050565b611b1f612444565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611bae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ba590614026565b60405180910390fd5b670de0b6b3a764000060646002611bc3610dac565b611bcd9190614175565b611bd791906141e6565b611be191906141e6565b811015611c23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c1a90614571565b60405180910390fd5b670de0b6b3a764000081611c379190614175565b600c8190555050565b600a5481565b611c4e612444565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611cdd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cd490614026565b60405180910390fd5b600760009054906101000a900460ff16158015611cfd5750600060065414155b611d0657600080fd5b4360066000828254611d189190614075565b925050819055506001600760006101000a81548160ff021916908315150217905550565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000611d6c612444565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611dfb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611df290614026565b60405180910390fd5b620186a06001611e09610dac565b611e139190614175565b611e1d91906141e6565b821015611e5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5690614603565b60405180910390fd5b60646001611e6b610dac565b611e759190614175565b611e7f91906141e6565b821115611ec1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eb890614695565b60405180910390fd5b81600b8190555060019050919050565b600760029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600e5481565b611f05612444565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611f94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8b90614026565b60405180910390fd5b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f90b8024c4923d3873ff5b9fcb43d0360d4b9217fa41225d07ba379993552e74360405160405180910390a3600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f90b8024c4923d3873ff5b9fcb43d0360d4b9217fa41225d07ba379993552e74360405160405180910390a381600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600b5481565b6121a7612444565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612236576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161222d90614026565b60405180910390fd5b600760009054906101000a900460ff161561225057600080fd5b80600660008282546122629190614075565b9250508190555050565b600f5481565b61227a612444565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612309576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161230090614026565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612378576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161236f90614727565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60125481565b600c5481565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036124bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124b2906147b9565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361252a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125219061484b565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516126089190613e05565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612684576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161267b906148dd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036126f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126ea9061496f565b60405180910390fd5b6000810361270c5761270783836000613167565b6130c1565b600d60009054906101000a900460ff1615612c3d57600760029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156127cd5750600760029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b80156128065750600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b8015612840575061dead73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b80156128595750600760019054906101000a900460ff16155b15612c3c57600760009054906101000a900460ff1661295357601660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806129135750601660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b612952576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612949906149db565b60405180910390fd5b5b601860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680156129f65750601760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15612a9d57600a54811115612a40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a3790614a6d565b60405180910390fd5b600c54612a4c83611265565b82612a579190614075565b1115612a98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a8f90614ad9565b60405180910390fd5b612c3b565b601860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168015612b405750601760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15612b8f57600a54811115612b8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b8190614b6b565b60405180910390fd5b612c3a565b601760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612c3957600c54612bec83611265565b82612bf79190614075565b1115612c38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c2f90614ad9565b60405180910390fd5b5b5b5b5b5b6000612c4830611265565b90506000612c55826133c7565b9050808015612c705750600d60019054906101000a900460ff165b8015612c895750600760019054906101000a900460ff16155b8015612cdf5750601860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b8015612d355750601660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b8015612d8b5750601660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15612dcf576001600760016101000a81548160ff021916908315150217905550612db36133e3565b6000600760016101000a81548160ff0219169083151502179055505b6000600760019054906101000a900460ff16159050601660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680612e855750601660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b15612e8f57600090505b600081156130b1576006546000108015612eaa575043600654105b1561307f57601860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168015612f0a57506000601154115b15612f9657606460115486612f1f9190614175565b612f2991906141e6565b905060115460125482612f3c9190614175565b612f4691906141e6565b60146000828254612f579190614075565b9250508190555060115460135482612f6f9190614175565b612f7991906141e6565b60156000828254612f8a9190614075565b9250508190555061307a565b601860008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168015612ff157506000600e54115b15613079576064600e54866130069190614175565b61301091906141e6565b9050600e54600f54826130239190614175565b61302d91906141e6565b6014600082825461303e9190614075565b92505081905550600e54601054826130569190614175565b61306091906141e6565b601560008282546130719190614075565b925050819055505b5b61308d565b61308a87878761367a565b90505b60008111156130a2576130a1873083613167565b5b80856130ae919061433b565b94505b6130bc878787613167565b505050505b505050565b80601860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508015158273ffffffffffffffffffffffffffffffffffffffff167fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab60405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036131d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131cd906148dd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603613245576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161323c9061496f565b60405180910390fd5b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156132cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132c290614bfd565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516133b99190613e05565b60405180910390a350505050565b6000600b5482101580156133dc575060065443115b9050919050565b60006133ee30611265565b905060006015546014546134029190614075565b90506000808314806134145750600082145b1561342157505050613678565b6019600b546134309190614175565b831115613449576019600b546134469190614175565b92505b60006002836014548661345c9190614175565b61346691906141e6565b61347091906141e6565b905060008185613480919061433b565b9050600047905061349082613835565b6000814761349e919061433b565b9050600086601554836134b19190614175565b6134bb91906141e6565b9050600081836134cb919061433b565b905060006014819055506000601581905550600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660028361352391906141e6565b60405161352f90614c4e565b60006040518083038185875af1925050503d806000811461356c576040519150601f19603f3d011682016040523d82523d6000602084013e613571565b606091505b505080975050600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166002836135bd91906141e6565b6040516135c990614c4e565b60006040518083038185875af1925050503d8060008114613606576040519150601f19603f3d011682016040523d82523d6000602084013e61360b565b606091505b5050809750506000861180156136215750600081115b1561366e576136308682613a72565b7f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb561858260145460405161366593929190614c63565b60405180910390a15b5050505050505050505b565b6000601860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156137975760646031836136dd9190614175565b6136e791906141e6565b9050600e54600f54826136fa9190614175565b61370491906141e6565b601460008282546137159190614075565b92505081905550600e546010548261372d9190614175565b61373791906141e6565b601560008282546137489190614075565b925050819055508273ffffffffffffffffffffffffffffffffffffffff167fb90badc1cf1c52268f4fa9afb5276aebf640bcca3300cdfc9cf37db17daa13e260405160405180910390a261382e565b60646000600654146137aa5760316137ad565b60195b60ff16836137bb9190614175565b6137c591906141e6565b9050601154601254826137d89190614175565b6137e291906141e6565b601460008282546137f39190614075565b925050819055506011546013548261380b9190614175565b61381591906141e6565b601560008282546138269190614075565b925050819055505b9392505050565b6000600267ffffffffffffffff81111561385257613851614c9a565b5b6040519080825280602002602001820160405280156138805781602001602082028036833780820191505090505b509050308160008151811061389857613897614cc9565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801561393d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139619190614d0d565b8160018151811061397557613974614cc9565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506139da307f00000000000000000000000000000000000000000000000000000000000000008461244c565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b8152600401613a3c959493929190614e33565b600060405180830381600087803b158015613a5657600080fd5b505af1158015613a6a573d6000803e3d6000fd5b505050505050565b613a9d307f00000000000000000000000000000000000000000000000000000000000000008461244c565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663f305d71982308560008061dead426040518863ffffffff1660e01b8152600401613b0496959493929190614e8d565b60606040518083038185885af1158015613b22573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190613b479190614f03565b5050505050565b600080fd5b6000819050919050565b613b6681613b53565b8114613b7157600080fd5b50565b600081359050613b8381613b5d565b92915050565b60008060408385031215613ba057613b9f613b4e565b5b6000613bae85828601613b74565b9250506020613bbf85828601613b74565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613c03578082015181840152602081019050613be8565b60008484015250505050565b6000601f19601f8301169050919050565b6000613c2b82613bc9565b613c358185613bd4565b9350613c45818560208601613be5565b613c4e81613c0f565b840191505092915050565b60006020820190508181036000830152613c738184613c20565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613ca682613c7b565b9050919050565b613cb681613c9b565b8114613cc157600080fd5b50565b600081359050613cd381613cad565b92915050565b60008060408385031215613cf057613cef613b4e565b5b6000613cfe85828601613cc4565b9250506020613d0f85828601613b74565b9150509250929050565b60008115159050919050565b613d2e81613d19565b82525050565b6000602082019050613d496000830184613d25565b92915050565b600060208284031215613d6557613d64613b4e565b5b6000613d7384828501613cc4565b91505092915050565b6000819050919050565b6000613da1613d9c613d9784613c7b565b613d7c565b613c7b565b9050919050565b6000613db382613d86565b9050919050565b6000613dc582613da8565b9050919050565b613dd581613dba565b82525050565b6000602082019050613df06000830184613dcc565b92915050565b613dff81613b53565b82525050565b6000602082019050613e1a6000830184613df6565b92915050565b600060208284031215613e3657613e35613b4e565b5b6000613e4484828501613b74565b91505092915050565b600080600060608486031215613e6657613e65613b4e565b5b6000613e7486828701613cc4565b9350506020613e8586828701613cc4565b9250506040613e9686828701613b74565b9150509250925092565b613ea981613c9b565b82525050565b6000602082019050613ec46000830184613ea0565b92915050565b600060ff82169050919050565b613ee081613eca565b82525050565b6000602082019050613efb6000830184613ed7565b92915050565b613f0a81613d19565b8114613f1557600080fd5b50565b600081359050613f2781613f01565b92915050565b60008060408385031215613f4457613f43613b4e565b5b6000613f5285828601613cc4565b9250506020613f6385828601613f18565b9150509250929050565b600060208284031215613f8357613f82613b4e565b5b6000613f9184828501613f18565b91505092915050565b60008060408385031215613fb157613fb0613b4e565b5b6000613fbf85828601613cc4565b9250506020613fd085828601613cc4565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614010602083613bd4565b915061401b82613fda565b602082019050919050565b6000602082019050818103600083015261403f81614003565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061408082613b53565b915061408b83613b53565b92508282019050808211156140a3576140a2614046565b5b92915050565b7f4d757374206b656570206665657320617420323525206f72206c657373000000600082015250565b60006140df601d83613bd4565b91506140ea826140a9565b602082019050919050565b6000602082019050818103600083015261410e816140d2565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061415c57607f821691505b60208210810361416f5761416e614115565b5b50919050565b600061418082613b53565b915061418b83613b53565b925082820261419981613b53565b915082820484148315176141b0576141af614046565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006141f182613b53565b91506141fc83613b53565b92508261420c5761420b6141b7565b5b828204905092915050565b7f43616e6e6f7420736574206d61785472616e73616374696f6e416d6f756e742060008201527f6c6f776572207468616e20312500000000000000000000000000000000000000602082015250565b6000614273602d83613bd4565b915061427e82614217565b604082019050919050565b600060208201905081810360008301526142a281614266565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206160008201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000602082015250565b6000614305602883613bd4565b9150614310826142a9565b604082019050919050565b60006020820190508181036000830152614334816142f8565b9050919050565b600061434682613b53565b915061435183613b53565b925082820390508181111561436957614368614046565b5b92915050565b7f4d757374206b656570206665657320617420323025206f72206c657373000000600082015250565b60006143a5601d83613bd4565b91506143b08261436f565b602082019050919050565b600060208201905081810360008301526143d481614398565b9050919050565b7f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060008201527f6175746f6d617465644d61726b65744d616b6572506169727300000000000000602082015250565b6000614437603983613bd4565b9150614442826143db565b604082019050919050565b600060208201905081810360008301526144668161442a565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b60006144c9602583613bd4565b91506144d48261446d565b604082019050919050565b600060208201905081810360008301526144f8816144bc565b9050919050565b7f43616e6e6f7420736574206d617857616c6c6574206c6f776572207468616e2060008201527f3225000000000000000000000000000000000000000000000000000000000000602082015250565b600061455b602283613bd4565b9150614566826144ff565b604082019050919050565b6000602082019050818103600083015261458a8161454e565b9050919050565b7f5377617020616d6f756e742063616e6e6f74206265206c6f776572207468616e60008201527f20302e3030312520746f74616c20737570706c792e0000000000000000000000602082015250565b60006145ed603583613bd4565b91506145f882614591565b604082019050919050565b6000602082019050818103600083015261461c816145e0565b9050919050565b7f5377617020616d6f756e742063616e6e6f74206265206869676865722074686160008201527f6e20302e352520746f74616c20737570706c792e000000000000000000000000602082015250565b600061467f603483613bd4565b915061468a82614623565b604082019050919050565b600060208201905081810360008301526146ae81614672565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614711602683613bd4565b915061471c826146b5565b604082019050919050565b6000602082019050818103600083015261474081614704565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006147a3602483613bd4565b91506147ae82614747565b604082019050919050565b600060208201905081810360008301526147d281614796565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000614835602283613bd4565b9150614840826147d9565b604082019050919050565b6000602082019050818103600083015261486481614828565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006148c7602583613bd4565b91506148d28261486b565b604082019050919050565b600060208201905081810360008301526148f6816148ba565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000614959602383613bd4565b9150614964826148fd565b604082019050919050565b600060208201905081810360008301526149888161494c565b9050919050565b7f54726164696e67206973206e6f74206163746976652e00000000000000000000600082015250565b60006149c5601683613bd4565b91506149d08261498f565b602082019050919050565b600060208201905081810360008301526149f4816149b8565b9050919050565b7f427579207472616e7366657220616d6f756e742065786365656473207468652060008201527f6d61785472616e73616374696f6e416d6f756e742e0000000000000000000000602082015250565b6000614a57603583613bd4565b9150614a62826149fb565b604082019050919050565b60006020820190508181036000830152614a8681614a4a565b9050919050565b7f4d61782077616c6c657420657863656564656400000000000000000000000000600082015250565b6000614ac3601383613bd4565b9150614ace82614a8d565b602082019050919050565b60006020820190508181036000830152614af281614ab6565b9050919050565b7f53656c6c207472616e7366657220616d6f756e7420657863656564732074686560008201527f206d61785472616e73616374696f6e416d6f756e742e00000000000000000000602082015250565b6000614b55603683613bd4565b9150614b6082614af9565b604082019050919050565b60006020820190508181036000830152614b8481614b48565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b6000614be7602683613bd4565b9150614bf282614b8b565b604082019050919050565b60006020820190508181036000830152614c1681614bda565b9050919050565b600081905092915050565b50565b6000614c38600083614c1d565b9150614c4382614c28565b600082019050919050565b6000614c5982614c2b565b9150819050919050565b6000606082019050614c786000830186613df6565b614c856020830185613df6565b614c926040830184613df6565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050614d0781613cad565b92915050565b600060208284031215614d2357614d22613b4e565b5b6000614d3184828501614cf8565b91505092915050565b6000819050919050565b6000614d5f614d5a614d5584614d3a565b613d7c565b613b53565b9050919050565b614d6f81614d44565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b614daa81613c9b565b82525050565b6000614dbc8383614da1565b60208301905092915050565b6000602082019050919050565b6000614de082614d75565b614dea8185614d80565b9350614df583614d91565b8060005b83811015614e26578151614e0d8882614db0565b9750614e1883614dc8565b925050600181019050614df9565b5085935050505092915050565b600060a082019050614e486000830188613df6565b614e556020830187614d66565b8181036040830152614e678186614dd5565b9050614e766060830185613ea0565b614e836080830184613df6565b9695505050505050565b600060c082019050614ea26000830189613ea0565b614eaf6020830188613df6565b614ebc6040830187614d66565b614ec96060830186614d66565b614ed66080830185613ea0565b614ee360a0830184613df6565b979650505050505050565b600081519050614efd81613b5d565b92915050565b600080600060608486031215614f1c57614f1b613b4e565b5b6000614f2a86828701614eee565b9350506020614f3b86828701614eee565b9250506040614f4c86828701614eee565b915050925092509256fea26469706673582212202f01a38595f154711818ea9dc2fd585c155316a5a654f9a51a696005fdb93d1464736f6c63430008120033

Deployed Bytecode

0x6080604052600436106102cd5760003560e01c8063924de9b711610175578063c9567bf9116100dc578063dd62ed3e11610095578063f11a24d31161006f578063f11a24d314610b09578063f2fde38b14610b34578063f637434214610b5d578063f8b45b0514610b88576102d4565b8063dd62ed3e14610a78578063e2f4560514610ab5578063f0bd2b9e14610ae0576102d4565b8063c9567bf91461097a578063cea7413014610991578063d257b34f146109bc578063d5f39488146109f9578063d85ba06314610a24578063d969be5914610a4f576102d4565b8063a457c2d71161012e578063a457c2d714610846578063a9059cbb14610883578063b62496f5146108c0578063c0246668146108fd578063c18bc19514610926578063c8c8ebe41461094f576102d4565b8063924de9b71461074857806395d89b41146107715780639a7a23d61461079c5780639c3b4fdc146107c55780639fccce32146107f0578063a0d82dc51461081b576102d4565b806349bd5a5e116102345780636ddd1713116101ed578063751039fc116101c7578063751039fc146106b25780637571336a146106dd5780638129fc1c146107065780638da5cb5b1461071d576102d4565b80636ddd17131461063357806370a082311461065e578063715018a61461069b576102d4565b806349bd5a5e146105215780634a62bb651461054c5780634fbee1931461057757806366ca9b83146105b45780636a486a8e146105dd5780636c81c22914610608576102d4565b80631a8145bb116102865780631a8145bb146103fd578063203e727e1461042857806323b872dd1461045157806327c8f8351461048e578063313ce567146104b957806339509351146104e4576102d4565b806302dbd8f8146102d957806306fdde0314610302578063095ea7b31461032d57806310d5de531461036a5780631694505e146103a757806318160ddd146103d2576102d4565b366102d457005b600080fd5b3480156102e557600080fd5b5061030060048036038101906102fb9190613b89565b610bb3565b005b34801561030e57600080fd5b50610317610cb8565b6040516103249190613c59565b60405180910390f35b34801561033957600080fd5b50610354600480360381019061034f9190613cd9565b610d4a565b6040516103619190613d34565b60405180910390f35b34801561037657600080fd5b50610391600480360381019061038c9190613d4f565b610d68565b60405161039e9190613d34565b60405180910390f35b3480156103b357600080fd5b506103bc610d88565b6040516103c99190613ddb565b60405180910390f35b3480156103de57600080fd5b506103e7610dac565b6040516103f49190613e05565b60405180910390f35b34801561040957600080fd5b50610412610db6565b60405161041f9190613e05565b60405180910390f35b34801561043457600080fd5b5061044f600480360381019061044a9190613e20565b610dbc565b005b34801561045d57600080fd5b5061047860048036038101906104739190613e4d565b610ee5565b6040516104859190613d34565b60405180910390f35b34801561049a57600080fd5b506104a361104e565b6040516104b09190613eaf565b60405180910390f35b3480156104c557600080fd5b506104ce611054565b6040516104db9190613ee6565b60405180910390f35b3480156104f057600080fd5b5061050b60048036038101906105069190613cd9565b61105d565b6040516105189190613d34565b60405180910390f35b34801561052d57600080fd5b50610536611094565b6040516105439190613eaf565b60405180910390f35b34801561055857600080fd5b506105616110b8565b60405161056e9190613d34565b60405180910390f35b34801561058357600080fd5b5061059e60048036038101906105999190613d4f565b6110cb565b6040516105ab9190613d34565b60405180910390f35b3480156105c057600080fd5b506105db60048036038101906105d69190613b89565b611121565b005b3480156105e957600080fd5b506105f2611226565b6040516105ff9190613e05565b60405180910390f35b34801561061457600080fd5b5061061d61122c565b60405161062a9190613eaf565b60405180910390f35b34801561063f57600080fd5b50610648611252565b6040516106559190613d34565b60405180910390f35b34801561066a57600080fd5b5061068560048036038101906106809190613d4f565b611265565b6040516106929190613e05565b60405180910390f35b3480156106a757600080fd5b506106b06112ad565b005b3480156106be57600080fd5b506106c7611405565b6040516106d49190613d34565b60405180910390f35b3480156106e957600080fd5b5061070460048036038101906106ff9190613f2d565b6114c0565b005b34801561071257600080fd5b5061071b6115b2565b005b34801561072957600080fd5b5061073261166d565b60405161073f9190613eaf565b60405180910390f35b34801561075457600080fd5b5061076f600480360381019061076a9190613f6d565b611697565b005b34801561077d57600080fd5b5061078661174b565b6040516107939190613c59565b60405180910390f35b3480156107a857600080fd5b506107c360048036038101906107be9190613f2d565b6117dd565b005b3480156107d157600080fd5b506107da611910565b6040516107e79190613e05565b60405180910390f35b3480156107fc57600080fd5b50610805611916565b6040516108129190613e05565b60405180910390f35b34801561082757600080fd5b5061083061191c565b60405161083d9190613e05565b60405180910390f35b34801561085257600080fd5b5061086d60048036038101906108689190613cd9565b611922565b60405161087a9190613d34565b60405180910390f35b34801561088f57600080fd5b506108aa60048036038101906108a59190613cd9565b611999565b6040516108b79190613d34565b60405180910390f35b3480156108cc57600080fd5b506108e760048036038101906108e29190613d4f565b6119b7565b6040516108f49190613d34565b60405180910390f35b34801561090957600080fd5b50610924600480360381019061091f9190613f2d565b6119d7565b005b34801561093257600080fd5b5061094d60048036038101906109489190613e20565b611b17565b005b34801561095b57600080fd5b50610964611c40565b6040516109719190613e05565b60405180910390f35b34801561098657600080fd5b5061098f611c46565b005b34801561099d57600080fd5b506109a6611d3c565b6040516109b39190613eaf565b60405180910390f35b3480156109c857600080fd5b506109e360048036038101906109de9190613e20565b611d62565b6040516109f09190613d34565b60405180910390f35b348015610a0557600080fd5b50610a0e611ed1565b604051610a1b9190613eaf565b60405180910390f35b348015610a3057600080fd5b50610a39611ef7565b604051610a469190613e05565b60405180910390f35b348015610a5b57600080fd5b50610a766004803603810190610a719190613f9a565b611efd565b005b348015610a8457600080fd5b50610a9f6004803603810190610a9a9190613f9a565b612112565b604051610aac9190613e05565b60405180910390f35b348015610ac157600080fd5b50610aca612199565b604051610ad79190613e05565b60405180910390f35b348015610aec57600080fd5b50610b076004803603810190610b029190613e20565b61219f565b005b348015610b1557600080fd5b50610b1e61226c565b604051610b2b9190613e05565b60405180910390f35b348015610b4057600080fd5b50610b5b6004803603810190610b569190613d4f565b612272565b005b348015610b6957600080fd5b50610b72612438565b604051610b7f9190613e05565b60405180910390f35b348015610b9457600080fd5b50610b9d61243e565b604051610baa9190613e05565b60405180910390f35b610bbb612444565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610c4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4190614026565b60405180910390fd5b8160128190555080601381905550601354601254610c689190614075565b60118190555060196011541115610cb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cab906140f5565b60405180910390fd5b5050565b606060038054610cc790614144565b80601f0160208091040260200160405190810160405280929190818152602001828054610cf390614144565b8015610d405780601f10610d1557610100808354040283529160200191610d40565b820191906000526020600020905b815481529060010190602001808311610d2357829003601f168201915b5050505050905090565b6000610d5e610d57612444565b848461244c565b6001905092915050565b60176020528060005260406000206000915054906101000a900460ff1681565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b6000600254905090565b60145481565b610dc4612444565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610e53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4a90614026565b60405180910390fd5b670de0b6b3a764000060646001610e68610dac565b610e729190614175565b610e7c91906141e6565b610e8691906141e6565b811015610ec8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ebf90614289565b60405180910390fd5b670de0b6b3a764000081610edc9190614175565b600a8190555050565b600081600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015610fa6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9d9061431b565b60405180910390fd5b610fb1848484612615565b611043843384600160008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461103e919061433b565b61244c565b600190509392505050565b61dead81565b60006012905090565b600080611068612444565b905061108981858561107a8589612112565b6110849190614075565b61244c565b600191505092915050565b7f00000000000000000000000097a1c636f4cb2906ebeada55c567c38a7a88019a81565b600d60009054906101000a900460ff1681565b6000601660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b611129612444565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146111b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111af90614026565b60405180910390fd5b81600f8190555080601081905550601054600f546111d69190614075565b600e819055506014600e541115611222576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611219906143bb565b60405180910390fd5b5050565b60115481565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600d60019054906101000a900460ff1681565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6112b5612444565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611344576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133b90614026565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b600061140f612444565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461149e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149590614026565b60405180910390fd5b6000600d60006101000a81548160ff0219169083151502179055506001905090565b6114c8612444565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611557576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154e90614026565b60405180910390fd5b80601760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b6115ba612444565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611649576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164090614026565b60405180910390fd5b600760009054906101000a900460ff161561166357600080fd5b6000600681905550565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61169f612444565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461172e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172590614026565b60405180910390fd5b80600d60016101000a81548160ff02191690831515021790555050565b60606004805461175a90614144565b80601f016020809104026020016040519081016040528092919081815260200182805461178690614144565b80156117d35780601f106117a8576101008083540402835291602001916117d3565b820191906000526020600020905b8154815290600101906020018083116117b657829003601f168201915b5050505050905090565b6117e5612444565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611874576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161186b90614026565b60405180910390fd5b7f00000000000000000000000097a1c636f4cb2906ebeada55c567c38a7a88019a73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611902576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f99061444d565b60405180910390fd5b61190c82826130c6565b5050565b60105481565b60155481565b60135481565b60008061192d612444565b9050600061193b8286612112565b905083811015611980576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611977906144df565b60405180910390fd5b61198d828686840361244c565b60019250505092915050565b60006119ad6119a6612444565b8484612615565b6001905092915050565b60186020528060005260406000206000915054906101000a900460ff1681565b6119df612444565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611a6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6590614026565b60405180910390fd5b80601660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df782604051611b0b9190613d34565b60405180910390a25050565b611b1f612444565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611bae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ba590614026565b60405180910390fd5b670de0b6b3a764000060646002611bc3610dac565b611bcd9190614175565b611bd791906141e6565b611be191906141e6565b811015611c23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c1a90614571565b60405180910390fd5b670de0b6b3a764000081611c379190614175565b600c8190555050565b600a5481565b611c4e612444565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611cdd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cd490614026565b60405180910390fd5b600760009054906101000a900460ff16158015611cfd5750600060065414155b611d0657600080fd5b4360066000828254611d189190614075565b925050819055506001600760006101000a81548160ff021916908315150217905550565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000611d6c612444565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611dfb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611df290614026565b60405180910390fd5b620186a06001611e09610dac565b611e139190614175565b611e1d91906141e6565b821015611e5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5690614603565b60405180910390fd5b60646001611e6b610dac565b611e759190614175565b611e7f91906141e6565b821115611ec1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eb890614695565b60405180910390fd5b81600b8190555060019050919050565b600760029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600e5481565b611f05612444565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611f94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8b90614026565b60405180910390fd5b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f90b8024c4923d3873ff5b9fcb43d0360d4b9217fa41225d07ba379993552e74360405160405180910390a3600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f90b8024c4923d3873ff5b9fcb43d0360d4b9217fa41225d07ba379993552e74360405160405180910390a381600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600b5481565b6121a7612444565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612236576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161222d90614026565b60405180910390fd5b600760009054906101000a900460ff161561225057600080fd5b80600660008282546122629190614075565b9250508190555050565b600f5481565b61227a612444565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612309576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161230090614026565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612378576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161236f90614727565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60125481565b600c5481565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036124bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124b2906147b9565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361252a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125219061484b565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516126089190613e05565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612684576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161267b906148dd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036126f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126ea9061496f565b60405180910390fd5b6000810361270c5761270783836000613167565b6130c1565b600d60009054906101000a900460ff1615612c3d57600760029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156127cd5750600760029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b80156128065750600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b8015612840575061dead73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b80156128595750600760019054906101000a900460ff16155b15612c3c57600760009054906101000a900460ff1661295357601660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806129135750601660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b612952576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612949906149db565b60405180910390fd5b5b601860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680156129f65750601760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15612a9d57600a54811115612a40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a3790614a6d565b60405180910390fd5b600c54612a4c83611265565b82612a579190614075565b1115612a98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a8f90614ad9565b60405180910390fd5b612c3b565b601860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168015612b405750601760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15612b8f57600a54811115612b8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b8190614b6b565b60405180910390fd5b612c3a565b601760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612c3957600c54612bec83611265565b82612bf79190614075565b1115612c38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c2f90614ad9565b60405180910390fd5b5b5b5b5b5b6000612c4830611265565b90506000612c55826133c7565b9050808015612c705750600d60019054906101000a900460ff165b8015612c895750600760019054906101000a900460ff16155b8015612cdf5750601860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b8015612d355750601660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b8015612d8b5750601660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15612dcf576001600760016101000a81548160ff021916908315150217905550612db36133e3565b6000600760016101000a81548160ff0219169083151502179055505b6000600760019054906101000a900460ff16159050601660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680612e855750601660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b15612e8f57600090505b600081156130b1576006546000108015612eaa575043600654105b1561307f57601860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168015612f0a57506000601154115b15612f9657606460115486612f1f9190614175565b612f2991906141e6565b905060115460125482612f3c9190614175565b612f4691906141e6565b60146000828254612f579190614075565b9250508190555060115460135482612f6f9190614175565b612f7991906141e6565b60156000828254612f8a9190614075565b9250508190555061307a565b601860008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168015612ff157506000600e54115b15613079576064600e54866130069190614175565b61301091906141e6565b9050600e54600f54826130239190614175565b61302d91906141e6565b6014600082825461303e9190614075565b92505081905550600e54601054826130569190614175565b61306091906141e6565b601560008282546130719190614075565b925050819055505b5b61308d565b61308a87878761367a565b90505b60008111156130a2576130a1873083613167565b5b80856130ae919061433b565b94505b6130bc878787613167565b505050505b505050565b80601860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508015158273ffffffffffffffffffffffffffffffffffffffff167fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab60405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036131d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131cd906148dd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603613245576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161323c9061496f565b60405180910390fd5b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156132cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132c290614bfd565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516133b99190613e05565b60405180910390a350505050565b6000600b5482101580156133dc575060065443115b9050919050565b60006133ee30611265565b905060006015546014546134029190614075565b90506000808314806134145750600082145b1561342157505050613678565b6019600b546134309190614175565b831115613449576019600b546134469190614175565b92505b60006002836014548661345c9190614175565b61346691906141e6565b61347091906141e6565b905060008185613480919061433b565b9050600047905061349082613835565b6000814761349e919061433b565b9050600086601554836134b19190614175565b6134bb91906141e6565b9050600081836134cb919061433b565b905060006014819055506000601581905550600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660028361352391906141e6565b60405161352f90614c4e565b60006040518083038185875af1925050503d806000811461356c576040519150601f19603f3d011682016040523d82523d6000602084013e613571565b606091505b505080975050600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166002836135bd91906141e6565b6040516135c990614c4e565b60006040518083038185875af1925050503d8060008114613606576040519150601f19603f3d011682016040523d82523d6000602084013e61360b565b606091505b5050809750506000861180156136215750600081115b1561366e576136308682613a72565b7f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb561858260145460405161366593929190614c63565b60405180910390a15b5050505050505050505b565b6000601860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156137975760646031836136dd9190614175565b6136e791906141e6565b9050600e54600f54826136fa9190614175565b61370491906141e6565b601460008282546137159190614075565b92505081905550600e546010548261372d9190614175565b61373791906141e6565b601560008282546137489190614075565b925050819055508273ffffffffffffffffffffffffffffffffffffffff167fb90badc1cf1c52268f4fa9afb5276aebf640bcca3300cdfc9cf37db17daa13e260405160405180910390a261382e565b60646000600654146137aa5760316137ad565b60195b60ff16836137bb9190614175565b6137c591906141e6565b9050601154601254826137d89190614175565b6137e291906141e6565b601460008282546137f39190614075565b925050819055506011546013548261380b9190614175565b61381591906141e6565b601560008282546138269190614075565b925050819055505b9392505050565b6000600267ffffffffffffffff81111561385257613851614c9a565b5b6040519080825280602002602001820160405280156138805781602001602082028036833780820191505090505b509050308160008151811061389857613897614cc9565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801561393d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139619190614d0d565b8160018151811061397557613974614cc9565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506139da307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d8461244c565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b8152600401613a3c959493929190614e33565b600060405180830381600087803b158015613a5657600080fd5b505af1158015613a6a573d6000803e3d6000fd5b505050505050565b613a9d307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d8461244c565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663f305d71982308560008061dead426040518863ffffffff1660e01b8152600401613b0496959493929190614e8d565b60606040518083038185885af1158015613b22573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190613b479190614f03565b5050505050565b600080fd5b6000819050919050565b613b6681613b53565b8114613b7157600080fd5b50565b600081359050613b8381613b5d565b92915050565b60008060408385031215613ba057613b9f613b4e565b5b6000613bae85828601613b74565b9250506020613bbf85828601613b74565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613c03578082015181840152602081019050613be8565b60008484015250505050565b6000601f19601f8301169050919050565b6000613c2b82613bc9565b613c358185613bd4565b9350613c45818560208601613be5565b613c4e81613c0f565b840191505092915050565b60006020820190508181036000830152613c738184613c20565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613ca682613c7b565b9050919050565b613cb681613c9b565b8114613cc157600080fd5b50565b600081359050613cd381613cad565b92915050565b60008060408385031215613cf057613cef613b4e565b5b6000613cfe85828601613cc4565b9250506020613d0f85828601613b74565b9150509250929050565b60008115159050919050565b613d2e81613d19565b82525050565b6000602082019050613d496000830184613d25565b92915050565b600060208284031215613d6557613d64613b4e565b5b6000613d7384828501613cc4565b91505092915050565b6000819050919050565b6000613da1613d9c613d9784613c7b565b613d7c565b613c7b565b9050919050565b6000613db382613d86565b9050919050565b6000613dc582613da8565b9050919050565b613dd581613dba565b82525050565b6000602082019050613df06000830184613dcc565b92915050565b613dff81613b53565b82525050565b6000602082019050613e1a6000830184613df6565b92915050565b600060208284031215613e3657613e35613b4e565b5b6000613e4484828501613b74565b91505092915050565b600080600060608486031215613e6657613e65613b4e565b5b6000613e7486828701613cc4565b9350506020613e8586828701613cc4565b9250506040613e9686828701613b74565b9150509250925092565b613ea981613c9b565b82525050565b6000602082019050613ec46000830184613ea0565b92915050565b600060ff82169050919050565b613ee081613eca565b82525050565b6000602082019050613efb6000830184613ed7565b92915050565b613f0a81613d19565b8114613f1557600080fd5b50565b600081359050613f2781613f01565b92915050565b60008060408385031215613f4457613f43613b4e565b5b6000613f5285828601613cc4565b9250506020613f6385828601613f18565b9150509250929050565b600060208284031215613f8357613f82613b4e565b5b6000613f9184828501613f18565b91505092915050565b60008060408385031215613fb157613fb0613b4e565b5b6000613fbf85828601613cc4565b9250506020613fd085828601613cc4565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614010602083613bd4565b915061401b82613fda565b602082019050919050565b6000602082019050818103600083015261403f81614003565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061408082613b53565b915061408b83613b53565b92508282019050808211156140a3576140a2614046565b5b92915050565b7f4d757374206b656570206665657320617420323525206f72206c657373000000600082015250565b60006140df601d83613bd4565b91506140ea826140a9565b602082019050919050565b6000602082019050818103600083015261410e816140d2565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061415c57607f821691505b60208210810361416f5761416e614115565b5b50919050565b600061418082613b53565b915061418b83613b53565b925082820261419981613b53565b915082820484148315176141b0576141af614046565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006141f182613b53565b91506141fc83613b53565b92508261420c5761420b6141b7565b5b828204905092915050565b7f43616e6e6f7420736574206d61785472616e73616374696f6e416d6f756e742060008201527f6c6f776572207468616e20312500000000000000000000000000000000000000602082015250565b6000614273602d83613bd4565b915061427e82614217565b604082019050919050565b600060208201905081810360008301526142a281614266565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206160008201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000602082015250565b6000614305602883613bd4565b9150614310826142a9565b604082019050919050565b60006020820190508181036000830152614334816142f8565b9050919050565b600061434682613b53565b915061435183613b53565b925082820390508181111561436957614368614046565b5b92915050565b7f4d757374206b656570206665657320617420323025206f72206c657373000000600082015250565b60006143a5601d83613bd4565b91506143b08261436f565b602082019050919050565b600060208201905081810360008301526143d481614398565b9050919050565b7f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060008201527f6175746f6d617465644d61726b65744d616b6572506169727300000000000000602082015250565b6000614437603983613bd4565b9150614442826143db565b604082019050919050565b600060208201905081810360008301526144668161442a565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b60006144c9602583613bd4565b91506144d48261446d565b604082019050919050565b600060208201905081810360008301526144f8816144bc565b9050919050565b7f43616e6e6f7420736574206d617857616c6c6574206c6f776572207468616e2060008201527f3225000000000000000000000000000000000000000000000000000000000000602082015250565b600061455b602283613bd4565b9150614566826144ff565b604082019050919050565b6000602082019050818103600083015261458a8161454e565b9050919050565b7f5377617020616d6f756e742063616e6e6f74206265206c6f776572207468616e60008201527f20302e3030312520746f74616c20737570706c792e0000000000000000000000602082015250565b60006145ed603583613bd4565b91506145f882614591565b604082019050919050565b6000602082019050818103600083015261461c816145e0565b9050919050565b7f5377617020616d6f756e742063616e6e6f74206265206869676865722074686160008201527f6e20302e352520746f74616c20737570706c792e000000000000000000000000602082015250565b600061467f603483613bd4565b915061468a82614623565b604082019050919050565b600060208201905081810360008301526146ae81614672565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614711602683613bd4565b915061471c826146b5565b604082019050919050565b6000602082019050818103600083015261474081614704565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006147a3602483613bd4565b91506147ae82614747565b604082019050919050565b600060208201905081810360008301526147d281614796565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000614835602283613bd4565b9150614840826147d9565b604082019050919050565b6000602082019050818103600083015261486481614828565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006148c7602583613bd4565b91506148d28261486b565b604082019050919050565b600060208201905081810360008301526148f6816148ba565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000614959602383613bd4565b9150614964826148fd565b604082019050919050565b600060208201905081810360008301526149888161494c565b9050919050565b7f54726164696e67206973206e6f74206163746976652e00000000000000000000600082015250565b60006149c5601683613bd4565b91506149d08261498f565b602082019050919050565b600060208201905081810360008301526149f4816149b8565b9050919050565b7f427579207472616e7366657220616d6f756e742065786365656473207468652060008201527f6d61785472616e73616374696f6e416d6f756e742e0000000000000000000000602082015250565b6000614a57603583613bd4565b9150614a62826149fb565b604082019050919050565b60006020820190508181036000830152614a8681614a4a565b9050919050565b7f4d61782077616c6c657420657863656564656400000000000000000000000000600082015250565b6000614ac3601383613bd4565b9150614ace82614a8d565b602082019050919050565b60006020820190508181036000830152614af281614ab6565b9050919050565b7f53656c6c207472616e7366657220616d6f756e7420657863656564732074686560008201527f206d61785472616e73616374696f6e416d6f756e742e00000000000000000000602082015250565b6000614b55603683613bd4565b9150614b6082614af9565b604082019050919050565b60006020820190508181036000830152614b8481614b48565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b6000614be7602683613bd4565b9150614bf282614b8b565b604082019050919050565b60006020820190508181036000830152614c1681614bda565b9050919050565b600081905092915050565b50565b6000614c38600083614c1d565b9150614c4382614c28565b600082019050919050565b6000614c5982614c2b565b9150819050919050565b6000606082019050614c786000830186613df6565b614c856020830185613df6565b614c926040830184613df6565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050614d0781613cad565b92915050565b600060208284031215614d2357614d22613b4e565b5b6000614d3184828501614cf8565b91505092915050565b6000819050919050565b6000614d5f614d5a614d5584614d3a565b613d7c565b613b53565b9050919050565b614d6f81614d44565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b614daa81613c9b565b82525050565b6000614dbc8383614da1565b60208301905092915050565b6000602082019050919050565b6000614de082614d75565b614dea8185614d80565b9350614df583614d91565b8060005b83811015614e26578151614e0d8882614db0565b9750614e1883614dc8565b925050600181019050614df9565b5085935050505092915050565b600060a082019050614e486000830188613df6565b614e556020830187614d66565b8181036040830152614e678186614dd5565b9050614e766060830185613ea0565b614e836080830184613df6565b9695505050505050565b600060c082019050614ea26000830189613ea0565b614eaf6020830188613df6565b614ebc6040830187614d66565b614ec96060830186614d66565b614ed66080830185613ea0565b614ee360a0830184613df6565b979650505050505050565b600081519050614efd81613b5d565b92915050565b600080600060608486031215614f1c57614f1b613b4e565b5b6000614f2a86828701614eee565b9350506020614f3b86828701614eee565b9250506040614f4c86828701614eee565b915050925092509256fea26469706673582212202f01a38595f154711818ea9dc2fd585c155316a5a654f9a51a696005fdb93d1464736f6c63430008120033

Deployed Bytecode Sourcemap

15262:14217:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21081:293;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5334:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7501:169;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16246:64;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15309:51;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6454:108;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16025:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19965:231;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;8152:410;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15412:53;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6296:93;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8971:238;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15367:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15723:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22327:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20783:286;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;15914:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15538:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15763:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6625:127;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14183:148;;;;;;;;;;;;;:::i;:::-;;19378:120;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20428:144;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;14964:109;;;;;;;;;;;;;:::i;:::-;;13541:79;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20672:99;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5553:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21572:244;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;15877:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16065:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15987:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9712:434;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6965:175;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16468:58;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21382:182;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20204:212;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;15608:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15081:171;;;;;;;;;;;;;:::i;:::-;;15570:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19573:380;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15508:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15806:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22020:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7203:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15650:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14836:120;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;15840:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14486:244;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;15949:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15690:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21081:293;13763:12;:10;:12::i;:::-;13753:22;;:6;;;;;;;;;;;:22;;;13745:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;21194:13:::1;21175:16;:32;;;;21231:7;21218:10;:20;;;;21284:10;;21265:16;;:29;;;;:::i;:::-;21249:13;:45;;;;21330:2;21313:13;;:19;;21305:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;21081:293:::0;;:::o;5334:100::-;5388:13;5421:5;5414:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5334:100;:::o;7501:169::-;7584:4;7601:39;7610:12;:10;:12::i;:::-;7624:7;7633:6;7601:8;:39::i;:::-;7658:4;7651:11;;7501:169;;;;:::o;16246:64::-;;;;;;;;;;;;;;;;;;;;;;:::o;15309:51::-;;;:::o;6454:108::-;6515:7;6542:12;;6535:19;;6454:108;:::o;16025:33::-;;;;:::o;19965:231::-;13763:12;:10;:12::i;:::-;13753:22;;:6;;;;;;;;;;;:22;;;13745:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;20083:4:::1;20078:3;20074:1;20058:13;:11;:13::i;:::-;:17;;;;:::i;:::-;:23;;;;:::i;:::-;20057:30;;;;:::i;:::-;20047:6;:40;;20039:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;20181:6;20171;:17;;;;:::i;:::-;20148:20;:40;;;;19965:231:::0;:::o;8152:410::-;8293:4;8353:6;8318:11;:19;8330:6;8318:19;;;;;;;;;;;;;;;:31;8338:10;8318:31;;;;;;;;;;;;;;;;:41;;8310:94;;;;;;;;;;;;:::i;:::-;;;;;;;;;8415:36;8425:6;8433:9;8444:6;8415:9;:36::i;:::-;8462:70;8471:6;8479:10;8525:6;8491:11;:19;8503:6;8491:19;;;;;;;;;;;;;;;:31;8511:10;8491:31;;;;;;;;;;;;;;;;:40;;;;:::i;:::-;8462:8;:70::i;:::-;8550:4;8543:11;;8152:410;;;;;:::o;15412:53::-;15458:6;15412:53;:::o;6296:93::-;6354:5;6379:2;6372:9;;6296:93;:::o;8971:238::-;9059:4;9076:13;9092:12;:10;:12::i;:::-;9076:28;;9115:64;9124:5;9131:7;9168:10;9140:25;9150:5;9157:7;9140:9;:25::i;:::-;:38;;;;:::i;:::-;9115:8;:64::i;:::-;9197:4;9190:11;;;8971:238;;;;:::o;15367:38::-;;;:::o;15723:33::-;;;;;;;;;;;;;:::o;22327:125::-;22392:4;22416:19;:28;22436:7;22416:28;;;;;;;;;;;;;;;;;;;;;;;;;22409:35;;22327:125;;;:::o;20783:286::-;13763:12;:10;:12::i;:::-;13753:22;;:6;;;;;;;;;;;:22;;;13745:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;20894:13:::1;20876:15;:31;;;;20930:7;20918:9;:19;;;;20981:9;;20963:15;;:27;;;;:::i;:::-;20948:12;:42;;;;21025:2;21009:12;;:18;;21001:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;20783:286:::0;;:::o;15914:28::-;;;;:::o;15538:25::-;;;;;;;;;;;;;:::o;15763:30::-;;;;;;;;;;;;;:::o;6625:127::-;6699:7;6726:9;:18;6736:7;6726:18;;;;;;;;;;;;;;;;6719:25;;6625:127;;;:::o;14183:148::-;13763:12;:10;:12::i;:::-;13753:22;;:6;;;;;;;;;;;:22;;;13745:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;14290:1:::1;14253:40;;14274:6;;;;;;;;;;;14253:40;;;;;;;;;;;;14321:1;14304:6;;:19;;;;;;;;;;;;;;;;;;14183:148::o:0;19378:120::-;19430:4;13763:12;:10;:12::i;:::-;13753:22;;:6;;;;;;;;;;;:22;;;13745:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;19463:5:::1;19446:14;;:22;;;;;;;;;;;;;;;;;;19486:4;19479:11;;19378:120:::0;:::o;20428:144::-;13763:12;:10;:12::i;:::-;13753:22;;:6;;;;;;;;;;;:22;;;13745:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;20560:4:::1;20518:31;:39;20550:6;20518:39;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;20428:144:::0;;:::o;14964:109::-;13763:12;:10;:12::i;:::-;13753:22;;:6;;;;;;;;;;;:22;;;13745:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;15025:13:::1;;;;;;;;;;;15024:14;15016:23;;;::::0;::::1;;15064:1;15050:11;:15;;;;14964:109::o:0;13541:79::-;13579:7;13606:6;;;;;;;;;;;13599:13;;13541:79;:::o;20672:99::-;13763:12;:10;:12::i;:::-;13753:22;;:6;;;;;;;;;;;:22;;;13745:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;20756:7:::1;20742:11;;:21;;;;;;;;;;;;;;;;;;20672:99:::0;:::o;5553:104::-;5609:13;5642:7;5635:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5553:104;:::o;21572:244::-;13763:12;:10;:12::i;:::-;13753:22;;:6;;;;;;;;;;;:22;;;13745:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;21679:13:::1;21671:21;;:4;:21;;::::0;21663:91:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;21767:41;21796:4;21802:5;21767:28;:41::i;:::-;21572:244:::0;;:::o;15877:24::-;;;;:::o;16065:27::-;;;;:::o;15987:25::-;;;;:::o;9712:434::-;9805:4;9822:13;9838:12;:10;:12::i;:::-;9822:28;;9861:24;9888:25;9898:5;9905:7;9888:9;:25::i;:::-;9861:52;;9952:15;9932:16;:35;;9924:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;10045:60;10054:5;10061:7;10089:15;10070:16;:34;10045:8;:60::i;:::-;10134:4;10127:11;;;;9712:434;;;;:::o;6965:175::-;7051:4;7068:42;7078:12;:10;:12::i;:::-;7092:9;7103:6;7068:9;:42::i;:::-;7128:4;7121:11;;6965:175;;;;:::o;16468:58::-;;;;;;;;;;;;;;;;;;;;;;:::o;21382:182::-;13763:12;:10;:12::i;:::-;13753:22;;:6;;;;;;;;;;;:22;;;13745:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;21498:8:::1;21467:19;:28;21487:7;21467:28;;;;;;;;;;;;;;;;:39;;;;;;;;;;;;;;;;;;21538:7;21522:34;;;21547:8;21522:34;;;;;;:::i;:::-;;;;;;;;21382:182:::0;;:::o;20204:212::-;13763:12;:10;:12::i;:::-;13753:22;;:6;;;;;;;;;;;:22;;;13745:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;20325:4:::1;20320:3;20316:1;20300:13;:11;:13::i;:::-;:17;;;;:::i;:::-;:23;;;;:::i;:::-;20299:30;;;;:::i;:::-;20289:6;:40;;20281:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;20401:6;20391;:17;;;;:::i;:::-;20379:9;:29;;;;20204:212:::0;:::o;15608:35::-;;;;:::o;15081:171::-;13763:12;:10;:12::i;:::-;13753:22;;:6;;;;;;;;;;;:22;;;13745:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;15143:13:::1;;;;;;;;;;;15142:14;:34;;;;;15175:1;15160:11;;:16;;15142:34;15134:43;;;::::0;::::1;;15201:12;15188:11;;:25;;;;;;;:::i;:::-;;;;;;;;15240:4;15224:13;;:20;;;;;;;;;;;;;;;;;;15081:171::o:0;15570:25::-;;;;;;;;;;;;;:::o;19573:380::-;19654:4;13763:12;:10;:12::i;:::-;13753:22;;:6;;;;;;;;;;;:22;;;13745:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;19710:6:::1;19706:1;19690:13;:11;:13::i;:::-;:17;;;;:::i;:::-;:26;;;;:::i;:::-;19677:9;:39;;19669:105;;;;;;;;;;;;:::i;:::-;;;;;;;;;19825:3;19821:1;19805:13;:11;:13::i;:::-;:17;;;;:::i;:::-;:23;;;;:::i;:::-;19792:9;:36;;19784:101;;;;;;;;;;;;:::i;:::-;;;;;;;;;19916:9;19895:18;:30;;;;19942:4;19935:11;;19573:380:::0;;;:::o;15508:23::-;;;;;;;;;;;;;:::o;15806:27::-;;;;:::o;22020:295::-;13763:12;:10;:12::i;:::-;13753:22;;:6;;;;;;;;;;;:22;;;13745:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;22153:10:::1;;;;;;;;;;;22121:43;;22138:13;22121:43;;;;;;;;;;;;22212:10;;;;;;;;;;;22180:43;;22197:13;22180:43;;;;;;;;;;;;22257:13;22244:10;;:26;;;;;;;;;;;;;;;;;;22294:13;22281:10;;:26;;;;;;;;;;;;;;;;;;22020:295:::0;;:::o;7203:151::-;7292:7;7319:11;:18;7331:5;7319:18;;;;;;;;;;;;;;;:27;7338:7;7319:27;;;;;;;;;;;;;;;;7312:34;;7203:151;;;;:::o;15650:33::-;;;;:::o;14836:120::-;13763:12;:10;:12::i;:::-;13753:22;;:6;;;;;;;;;;;:22;;;13745:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;14905:13:::1;;;;;;;;;;;14904:14;14896:23;;;::::0;::::1;;14943:5;14930:11;;:18;;;;;;;:::i;:::-;;;;;;;;14836:120:::0;:::o;15840:30::-;;;;:::o;14486:244::-;13763:12;:10;:12::i;:::-;13753:22;;:6;;;;;;;;;;;:22;;;13745:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;14595:1:::1;14575:22;;:8;:22;;::::0;14567:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;14685:8;14656:38;;14677:6;;;;;;;;;;;14656:38;;;;;;;;;;;;14714:8;14705:6;;:17;;;;;;;;;;;;;;;;;;14486:244:::0;:::o;15949:31::-;;;;:::o;15690:24::-;;;;:::o;308:98::-;361:7;388:10;381:17;;308:98;:::o;12656:380::-;12809:1;12792:19;;:5;:19;;;12784:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;12890:1;12871:21;;:7;:21;;;12863:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;12974:6;12944:11;:18;12956:5;12944:18;;;;;;;;;;;;;;;:27;12963:7;12944:27;;;;;;;;;;;;;;;:36;;;;13012:7;12996:32;;13005:5;12996:32;;;13021:6;12996:32;;;;;;:::i;:::-;;;;;;;;12656:380;;;:::o;22514:3593::-;22662:1;22646:18;;:4;:18;;;22638:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;22739:1;22725:16;;:2;:16;;;22717:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;22816:1;22806:6;:11;22803:92;;22834:28;22850:4;22856:2;22860:1;22834:15;:28::i;:::-;22877:7;;22803:92;22918:14;;;;;;;;;;;22915:1261;;;22978:8;;;;;;;;;;;22970:16;;:4;:16;;;;:51;;;;;23013:8;;;;;;;;;;;23007:14;;:2;:14;;;;22970:51;:89;;;;;23057:1;23043:16;;:2;:16;;;;22970:89;:131;;;;;23094:6;23080:21;;:2;:21;;;;22970:131;:161;;;;;23123:8;;;;;;;;;;;23122:9;22970:161;22948:1217;;;23169:13;;;;;;;;;;;23165:148;;23214:19;:25;23234:4;23214:25;;;;;;;;;;;;;;;;;;;;;;;;;:52;;;;23243:19;:23;23263:2;23243:23;;;;;;;;;;;;;;;;;;;;;;;;;23214:52;23206:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;23165:148;23376:25;:31;23402:4;23376:31;;;;;;;;;;;;;;;;;;;;;;;;;:71;;;;;23412:31;:35;23444:2;23412:35;;;;;;;;;;;;;;;;;;;;;;;;;23411:36;23376:71;23372:778;;;23494:20;;23484:6;:30;;23476:96;;;;;;;;;;;;:::i;:::-;;;;;;;;;23633:9;;23616:13;23626:2;23616:9;:13::i;:::-;23607:6;:22;;;;:::i;:::-;:35;;23599:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;23372:778;;;23760:25;:29;23786:2;23760:29;;;;;;;;;;;;;;;;;;;;;;;;;:71;;;;;23794:31;:37;23826:4;23794:37;;;;;;;;;;;;;;;;;;;;;;;;;23793:38;23760:71;23756:394;;;23878:20;;23868:6;:30;;23860:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;23756:394;;;24004:31;:35;24036:2;24004:35;;;;;;;;;;;;;;;;;;;;;;;;;24000:150;;24097:9;;24080:13;24090:2;24080:9;:13::i;:::-;24071:6;:22;;;;:::i;:::-;:35;;24063:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;24000:150;23756:394;23372:778;22948:1217;22915:1261;24190:28;24221:24;24239:4;24221:9;:24::i;:::-;24190:55;;24256:12;24271:31;24281:20;24271:9;:31::i;:::-;24256:46;;24333:7;:35;;;;;24357:11;;;;;;;;;;;24333:35;:61;;;;;24386:8;;;;;;;;;;;24385:9;24333:61;:110;;;;;24412:25;:31;24438:4;24412:31;;;;;;;;;;;;;;;;;;;;;;;;;24411:32;24333:110;:153;;;;;24461:19;:25;24481:4;24461:25;;;;;;;;;;;;;;;;;;;;;;;;;24460:26;24333:153;:194;;;;;24504:19;:23;24524:2;24504:23;;;;;;;;;;;;;;;;;;;;;;;;;24503:24;24333:194;24315:338;;;24565:4;24554:8;;:15;;;;;;;;;;;;;;;;;;24598:10;:8;:10::i;:::-;24636:5;24625:8;;:16;;;;;;;;;;;;;;;;;;24315:338;24673:12;24689:8;;;;;;;;;;;24688:9;24673:24;;24798:19;:25;24818:4;24798:25;;;;;;;;;;;;;;;;;;;;;;;;;:52;;;;24827:19;:23;24847:2;24827:23;;;;;;;;;;;;;;;;;;;;;;;;;24798:52;24795:99;;;24877:5;24867:15;;24795:99;24914:12;25018:7;25015:1039;;;25048:11;;25044:1;:15;:45;;;;;25077:12;25063:11;;:26;25044:45;25041:856;;;25140:25;:29;25166:2;25140:29;;;;;;;;;;;;;;;;;;;;;;;;;:50;;;;;25189:1;25173:13;;:17;25140:50;25136:625;;;25246:3;25230:13;;25221:6;:22;;;;:::i;:::-;:28;;;;:::i;:::-;25214:35;;25320:13;;25301:16;;25294:4;:23;;;;:::i;:::-;:39;;;;:::i;:::-;25272:18;;:61;;;;;;;:::i;:::-;;;;;;;;25392:13;;25379:10;;25372:4;:17;;;;:::i;:::-;:33;;;;:::i;:::-;25356:12;;:49;;;;;;;:::i;:::-;;;;;;;;25136:625;;;25479:25;:31;25505:4;25479:31;;;;;;;;;;;;;;;;;;;;;;;;;:51;;;;;25529:1;25514:12;;:16;25479:51;25476:285;;;25586:3;25571:12;;25562:6;:21;;;;:::i;:::-;:27;;;;:::i;:::-;25555:34;;25659:12;;25641:15;;25634:4;:22;;;;:::i;:::-;:37;;;;:::i;:::-;25612:18;;:59;;;;;;;:::i;:::-;;;;;;;;25729:12;;25717:9;;25710:4;:16;;;;:::i;:::-;:31;;;;:::i;:::-;25694:12;;:47;;;;;;;:::i;:::-;;;;;;;;25476:285;25136:625;25041:856;;;25850:31;25864:4;25870:2;25874:6;25850:13;:31::i;:::-;25843:38;;25041:856;25923:1;25916:4;:8;25913:93;;;25948:42;25964:4;25978;25985;25948:15;:42::i;:::-;25913:93;26038:4;26028:14;;;;;:::i;:::-;;;25015:1039;26066:33;26082:4;26088:2;26092:6;26066:15;:33::i;:::-;22627:3480;;;;22514:3593;;;;:::o;21824:188::-;21941:5;21907:25;:31;21933:4;21907:31;;;;;;;;;;;;;;;;:39;;;;;;;;;;;;;;;;;;21998:5;21964:40;;21992:4;21964:40;;;;;;;;;;;;21824:188;;:::o;10636:701::-;10749:1;10733:18;;:4;:18;;;10725:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;10826:1;10812:16;;:2;:16;;;10804:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;10879:19;10901:9;:15;10911:4;10901:15;;;;;;;;;;;;;;;;10879:37;;10950:6;10935:11;:21;;10927:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;11067:6;11053:11;:20;11035:9;:15;11045:4;11035:15;;;;;;;;;;;;;;;:38;;;;11270:6;11253:9;:13;11263:2;11253:13;;;;;;;;;;;;;;;;:23;;;;;;;;;;;11318:2;11303:26;;11312:4;11303:26;;;11322:6;11303:26;;;;;;:::i;:::-;;;;;;;;10714:623;10636:701;;;:::o;26115:175::-;26186:4;26234:18;;26210:20;:42;;:72;;;;;26271:11;;26256:12;:26;26210:72;26203:79;;26115:175;;;:::o;28040:1436::-;28079:23;28105:24;28123:4;28105:9;:24::i;:::-;28079:50;;28140:25;28189:12;;28168:18;;:33;;;;:::i;:::-;28140:61;;28212:12;28267:1;28248:15;:20;:46;;;;28293:1;28272:17;:22;28248:46;28245:60;;;28297:7;;;;;28245:60;28359:2;28338:18;;:23;;;;:::i;:::-;28320:15;:41;28317:111;;;28414:2;28393:18;;:23;;;;:::i;:::-;28375:41;;28317:111;28497:23;28582:1;28562:17;28541:18;;28523:15;:36;;;;:::i;:::-;:56;;;;:::i;:::-;:60;;;;:::i;:::-;28497:86;;28594:26;28641:15;28623;:33;;;;:::i;:::-;28594:62;;28677:25;28705:21;28677:49;;28739:36;28756:18;28739:16;:36::i;:::-;28797:18;28842:17;28818:21;:41;;;;:::i;:::-;28797:62;;28880:17;28928;28913:12;;28900:10;:25;;;;:::i;:::-;:45;;;;:::i;:::-;28880:65;;28966:23;29005:9;28992:10;:22;;;;:::i;:::-;28966:48;;29056:1;29035:18;:22;;;;29083:1;29068:12;:16;;;;29126:10;;;;;;;;;;;29118:24;;29160:1;29150:9;:11;;;;:::i;:::-;29118:48;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29105:61;;;;;29198:10;;;;;;;;;;;29190:24;;29232:1;29222:9;:11;;;;:::i;:::-;29190:48;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29177:61;;;;;29280:1;29262:15;:19;:42;;;;;29303:1;29285:15;:19;29262:42;29259:210;;;29320:46;29333:15;29350;29320:12;:46::i;:::-;29386:71;29401:18;29421:15;29438:18;;29386:71;;;;;;;;:::i;:::-;;;;;;;;29259:210;28068:1408;;;;;;;;;28040:1436;:::o;27427:605::-;27509:12;27537:25;:31;27563:4;27537:31;;;;;;;;;;;;;;;;;;;;;;;;;27534:491;;;27605:3;27600:2;27591:6;:11;;;;:::i;:::-;:17;;;;:::i;:::-;27584:24;;27670:12;;27652:15;;27645:4;:22;;;;:::i;:::-;:37;;;;:::i;:::-;27623:18;;:59;;;;;;;:::i;:::-;;;;;;;;27732:12;;27720:9;;27713:4;:16;;;;:::i;:::-;:31;;;;:::i;:::-;27697:12;;:47;;;;;;;:::i;:::-;;;;;;;;27776:2;27764:15;;;;;;;;;;;;27534:491;;;27867:3;27852:1;27837:11;;:16;:26;;27861:2;27837:26;;;27856:2;27837:26;27827:37;;:6;:37;;;;:::i;:::-;:43;;;;:::i;:::-;27820:50;;27936:13;;27917:16;;27910:4;:23;;;;:::i;:::-;:39;;;;:::i;:::-;27888:18;;:61;;;;;;;:::i;:::-;;;;;;;;28000:13;;27987:10;;27980:4;:17;;;;:::i;:::-;:33;;;;:::i;:::-;27964:12;;:49;;;;;;;:::i;:::-;;;;;;;;27534:491;27427:605;;;;;:::o;26298:591::-;26426:21;26464:1;26450:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26426:40;;26495:4;26477;26482:1;26477:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;;;26521:15;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26511:4;26516:1;26511:7;;;;;;;;:::i;:::-;;;;;;;:32;;;;;;;;;;;26556:62;26573:4;26588:15;26606:11;26556:8;:62::i;:::-;26657:15;:66;;;26738:11;26764:1;26808:4;26835;26855:15;26657:224;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26353:536;26298:591;:::o;26901:517::-;27049:62;27066:4;27081:15;27099:11;27049:8;:62::i;:::-;27154:15;:31;;;27193:9;27226:4;27246:11;27272:1;27315;15458:6;27384:15;27154:256;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;26901:517;;:::o;88:117:1:-;197:1;194;187:12;334:77;371:7;400:5;389:16;;334:77;;;:::o;417:122::-;490:24;508:5;490:24;:::i;:::-;483:5;480:35;470:63;;529:1;526;519:12;470:63;417:122;:::o;545:139::-;591:5;629:6;616:20;607:29;;645:33;672:5;645:33;:::i;:::-;545:139;;;;:::o;690:474::-;758:6;766;815:2;803:9;794:7;790:23;786:32;783:119;;;821:79;;:::i;:::-;783:119;941:1;966:53;1011:7;1002:6;991:9;987:22;966:53;:::i;:::-;956:63;;912:117;1068:2;1094:53;1139:7;1130:6;1119:9;1115:22;1094:53;:::i;:::-;1084:63;;1039:118;690:474;;;;;:::o;1170:99::-;1222:6;1256:5;1250:12;1240:22;;1170:99;;;:::o;1275:169::-;1359:11;1393:6;1388:3;1381:19;1433:4;1428:3;1424:14;1409:29;;1275:169;;;;:::o;1450:246::-;1531:1;1541:113;1555:6;1552:1;1549:13;1541:113;;;1640:1;1635:3;1631:11;1625:18;1621:1;1616:3;1612:11;1605:39;1577:2;1574:1;1570:10;1565:15;;1541:113;;;1688:1;1679:6;1674:3;1670:16;1663:27;1512:184;1450:246;;;:::o;1702:102::-;1743:6;1794:2;1790:7;1785:2;1778:5;1774:14;1770:28;1760:38;;1702:102;;;:::o;1810:377::-;1898:3;1926:39;1959:5;1926:39;:::i;:::-;1981:71;2045:6;2040:3;1981:71;:::i;:::-;1974:78;;2061:65;2119:6;2114:3;2107:4;2100:5;2096:16;2061:65;:::i;:::-;2151:29;2173:6;2151:29;:::i;:::-;2146:3;2142:39;2135:46;;1902:285;1810:377;;;;:::o;2193:313::-;2306:4;2344:2;2333:9;2329:18;2321:26;;2393:9;2387:4;2383:20;2379:1;2368:9;2364:17;2357:47;2421:78;2494:4;2485:6;2421:78;:::i;:::-;2413:86;;2193:313;;;;:::o;2512:126::-;2549:7;2589:42;2582:5;2578:54;2567:65;;2512:126;;;:::o;2644:96::-;2681:7;2710:24;2728:5;2710:24;:::i;:::-;2699:35;;2644:96;;;:::o;2746:122::-;2819:24;2837:5;2819:24;:::i;:::-;2812:5;2809:35;2799:63;;2858:1;2855;2848:12;2799:63;2746:122;:::o;2874:139::-;2920:5;2958:6;2945:20;2936:29;;2974:33;3001:5;2974:33;:::i;:::-;2874:139;;;;:::o;3019:474::-;3087:6;3095;3144:2;3132:9;3123:7;3119:23;3115:32;3112:119;;;3150:79;;:::i;:::-;3112:119;3270:1;3295:53;3340:7;3331:6;3320:9;3316:22;3295:53;:::i;:::-;3285:63;;3241:117;3397:2;3423:53;3468:7;3459:6;3448:9;3444:22;3423:53;:::i;:::-;3413:63;;3368:118;3019:474;;;;;:::o;3499:90::-;3533:7;3576:5;3569:13;3562:21;3551:32;;3499:90;;;:::o;3595:109::-;3676:21;3691:5;3676:21;:::i;:::-;3671:3;3664:34;3595:109;;:::o;3710:210::-;3797:4;3835:2;3824:9;3820:18;3812:26;;3848:65;3910:1;3899:9;3895:17;3886:6;3848:65;:::i;:::-;3710:210;;;;:::o;3926:329::-;3985:6;4034:2;4022:9;4013:7;4009:23;4005:32;4002:119;;;4040:79;;:::i;:::-;4002:119;4160:1;4185:53;4230:7;4221:6;4210:9;4206:22;4185:53;:::i;:::-;4175:63;;4131:117;3926:329;;;;:::o;4261:60::-;4289:3;4310:5;4303:12;;4261:60;;;:::o;4327:142::-;4377:9;4410:53;4428:34;4437:24;4455:5;4437:24;:::i;:::-;4428:34;:::i;:::-;4410:53;:::i;:::-;4397:66;;4327:142;;;:::o;4475:126::-;4525:9;4558:37;4589:5;4558:37;:::i;:::-;4545:50;;4475:126;;;:::o;4607:151::-;4682:9;4715:37;4746:5;4715:37;:::i;:::-;4702:50;;4607:151;;;:::o;4764:181::-;4876:62;4932:5;4876:62;:::i;:::-;4871:3;4864:75;4764:181;;:::o;4951:272::-;5069:4;5107:2;5096:9;5092:18;5084:26;;5120:96;5213:1;5202:9;5198:17;5189:6;5120:96;:::i;:::-;4951:272;;;;:::o;5229:118::-;5316:24;5334:5;5316:24;:::i;:::-;5311:3;5304:37;5229:118;;:::o;5353:222::-;5446:4;5484:2;5473:9;5469:18;5461:26;;5497:71;5565:1;5554:9;5550:17;5541:6;5497:71;:::i;:::-;5353:222;;;;:::o;5581:329::-;5640:6;5689:2;5677:9;5668:7;5664:23;5660:32;5657:119;;;5695:79;;:::i;:::-;5657:119;5815:1;5840:53;5885:7;5876:6;5865:9;5861:22;5840:53;:::i;:::-;5830:63;;5786:117;5581:329;;;;:::o;5916:619::-;5993:6;6001;6009;6058:2;6046:9;6037:7;6033:23;6029:32;6026:119;;;6064:79;;:::i;:::-;6026:119;6184:1;6209:53;6254:7;6245:6;6234:9;6230:22;6209:53;:::i;:::-;6199:63;;6155:117;6311:2;6337:53;6382:7;6373:6;6362:9;6358:22;6337:53;:::i;:::-;6327:63;;6282:118;6439:2;6465:53;6510:7;6501:6;6490:9;6486:22;6465:53;:::i;:::-;6455:63;;6410:118;5916:619;;;;;:::o;6541:118::-;6628:24;6646:5;6628:24;:::i;:::-;6623:3;6616:37;6541:118;;:::o;6665:222::-;6758:4;6796:2;6785:9;6781:18;6773:26;;6809:71;6877:1;6866:9;6862:17;6853:6;6809:71;:::i;:::-;6665:222;;;;:::o;6893:86::-;6928:7;6968:4;6961:5;6957:16;6946:27;;6893:86;;;:::o;6985:112::-;7068:22;7084:5;7068:22;:::i;:::-;7063:3;7056:35;6985:112;;:::o;7103:214::-;7192:4;7230:2;7219:9;7215:18;7207:26;;7243:67;7307:1;7296:9;7292:17;7283:6;7243:67;:::i;:::-;7103:214;;;;:::o;7323:116::-;7393:21;7408:5;7393:21;:::i;:::-;7386:5;7383:32;7373:60;;7429:1;7426;7419:12;7373:60;7323:116;:::o;7445:133::-;7488:5;7526:6;7513:20;7504:29;;7542:30;7566:5;7542:30;:::i;:::-;7445:133;;;;:::o;7584:468::-;7649:6;7657;7706:2;7694:9;7685:7;7681:23;7677:32;7674:119;;;7712:79;;:::i;:::-;7674:119;7832:1;7857:53;7902:7;7893:6;7882:9;7878:22;7857:53;:::i;:::-;7847:63;;7803:117;7959:2;7985:50;8027:7;8018:6;8007:9;8003:22;7985:50;:::i;:::-;7975:60;;7930:115;7584:468;;;;;:::o;8058:323::-;8114:6;8163:2;8151:9;8142:7;8138:23;8134:32;8131:119;;;8169:79;;:::i;:::-;8131:119;8289:1;8314:50;8356:7;8347:6;8336:9;8332:22;8314:50;:::i;:::-;8304:60;;8260:114;8058:323;;;;:::o;8387:474::-;8455:6;8463;8512:2;8500:9;8491:7;8487:23;8483:32;8480:119;;;8518:79;;:::i;:::-;8480:119;8638:1;8663:53;8708:7;8699:6;8688:9;8684:22;8663:53;:::i;:::-;8653:63;;8609:117;8765:2;8791:53;8836:7;8827:6;8816:9;8812:22;8791:53;:::i;:::-;8781:63;;8736:118;8387:474;;;;;:::o;8867:182::-;9007:34;9003:1;8995:6;8991:14;8984:58;8867:182;:::o;9055:366::-;9197:3;9218:67;9282:2;9277:3;9218:67;:::i;:::-;9211:74;;9294:93;9383:3;9294:93;:::i;:::-;9412:2;9407:3;9403:12;9396:19;;9055:366;;;:::o;9427:419::-;9593:4;9631:2;9620:9;9616:18;9608:26;;9680:9;9674:4;9670:20;9666:1;9655:9;9651:17;9644:47;9708:131;9834:4;9708:131;:::i;:::-;9700:139;;9427:419;;;:::o;9852:180::-;9900:77;9897:1;9890:88;9997:4;9994:1;9987:15;10021:4;10018:1;10011:15;10038:191;10078:3;10097:20;10115:1;10097:20;:::i;:::-;10092:25;;10131:20;10149:1;10131:20;:::i;:::-;10126:25;;10174:1;10171;10167:9;10160:16;;10195:3;10192:1;10189:10;10186:36;;;10202:18;;:::i;:::-;10186:36;10038:191;;;;:::o;10235:179::-;10375:31;10371:1;10363:6;10359:14;10352:55;10235:179;:::o;10420:366::-;10562:3;10583:67;10647:2;10642:3;10583:67;:::i;:::-;10576:74;;10659:93;10748:3;10659:93;:::i;:::-;10777:2;10772:3;10768:12;10761:19;;10420:366;;;:::o;10792:419::-;10958:4;10996:2;10985:9;10981:18;10973:26;;11045:9;11039:4;11035:20;11031:1;11020:9;11016:17;11009:47;11073:131;11199:4;11073:131;:::i;:::-;11065:139;;10792:419;;;:::o;11217:180::-;11265:77;11262:1;11255:88;11362:4;11359:1;11352:15;11386:4;11383:1;11376:15;11403:320;11447:6;11484:1;11478:4;11474:12;11464:22;;11531:1;11525:4;11521:12;11552:18;11542:81;;11608:4;11600:6;11596:17;11586:27;;11542:81;11670:2;11662:6;11659:14;11639:18;11636:38;11633:84;;11689:18;;:::i;:::-;11633:84;11454:269;11403:320;;;:::o;11729:410::-;11769:7;11792:20;11810:1;11792:20;:::i;:::-;11787:25;;11826:20;11844:1;11826:20;:::i;:::-;11821:25;;11881:1;11878;11874:9;11903:30;11921:11;11903:30;:::i;:::-;11892:41;;12082:1;12073:7;12069:15;12066:1;12063:22;12043:1;12036:9;12016:83;11993:139;;12112:18;;:::i;:::-;11993:139;11777:362;11729:410;;;;:::o;12145:180::-;12193:77;12190:1;12183:88;12290:4;12287:1;12280:15;12314:4;12311:1;12304:15;12331:185;12371:1;12388:20;12406:1;12388:20;:::i;:::-;12383:25;;12422:20;12440:1;12422:20;:::i;:::-;12417:25;;12461:1;12451:35;;12466:18;;:::i;:::-;12451:35;12508:1;12505;12501:9;12496:14;;12331:185;;;;:::o;12522:232::-;12662:34;12658:1;12650:6;12646:14;12639:58;12731:15;12726:2;12718:6;12714:15;12707:40;12522:232;:::o;12760:366::-;12902:3;12923:67;12987:2;12982:3;12923:67;:::i;:::-;12916:74;;12999:93;13088:3;12999:93;:::i;:::-;13117:2;13112:3;13108:12;13101:19;;12760:366;;;:::o;13132:419::-;13298:4;13336:2;13325:9;13321:18;13313:26;;13385:9;13379:4;13375:20;13371:1;13360:9;13356:17;13349:47;13413:131;13539:4;13413:131;:::i;:::-;13405:139;;13132:419;;;:::o;13557:227::-;13697:34;13693:1;13685:6;13681:14;13674:58;13766:10;13761:2;13753:6;13749:15;13742:35;13557:227;:::o;13790:366::-;13932:3;13953:67;14017:2;14012:3;13953:67;:::i;:::-;13946:74;;14029:93;14118:3;14029:93;:::i;:::-;14147:2;14142:3;14138:12;14131:19;;13790:366;;;:::o;14162:419::-;14328:4;14366:2;14355:9;14351:18;14343:26;;14415:9;14409:4;14405:20;14401:1;14390:9;14386:17;14379:47;14443:131;14569:4;14443:131;:::i;:::-;14435:139;;14162:419;;;:::o;14587:194::-;14627:4;14647:20;14665:1;14647:20;:::i;:::-;14642:25;;14681:20;14699:1;14681:20;:::i;:::-;14676:25;;14725:1;14722;14718:9;14710:17;;14749:1;14743:4;14740:11;14737:37;;;14754:18;;:::i;:::-;14737:37;14587:194;;;;:::o;14787:179::-;14927:31;14923:1;14915:6;14911:14;14904:55;14787:179;:::o;14972:366::-;15114:3;15135:67;15199:2;15194:3;15135:67;:::i;:::-;15128:74;;15211:93;15300:3;15211:93;:::i;:::-;15329:2;15324:3;15320:12;15313:19;;14972:366;;;:::o;15344:419::-;15510:4;15548:2;15537:9;15533:18;15525:26;;15597:9;15591:4;15587:20;15583:1;15572:9;15568:17;15561:47;15625:131;15751:4;15625:131;:::i;:::-;15617:139;;15344:419;;;:::o;15769:244::-;15909:34;15905:1;15897:6;15893:14;15886:58;15978:27;15973:2;15965:6;15961:15;15954:52;15769:244;:::o;16019:366::-;16161:3;16182:67;16246:2;16241:3;16182:67;:::i;:::-;16175:74;;16258:93;16347:3;16258:93;:::i;:::-;16376:2;16371:3;16367:12;16360:19;;16019:366;;;:::o;16391:419::-;16557:4;16595:2;16584:9;16580:18;16572:26;;16644:9;16638:4;16634:20;16630:1;16619:9;16615:17;16608:47;16672:131;16798:4;16672:131;:::i;:::-;16664:139;;16391:419;;;:::o;16816:224::-;16956:34;16952:1;16944:6;16940:14;16933:58;17025:7;17020:2;17012:6;17008:15;17001:32;16816:224;:::o;17046:366::-;17188:3;17209:67;17273:2;17268:3;17209:67;:::i;:::-;17202:74;;17285:93;17374:3;17285:93;:::i;:::-;17403:2;17398:3;17394:12;17387:19;;17046:366;;;:::o;17418:419::-;17584:4;17622:2;17611:9;17607:18;17599:26;;17671:9;17665:4;17661:20;17657:1;17646:9;17642:17;17635:47;17699:131;17825:4;17699:131;:::i;:::-;17691:139;;17418:419;;;:::o;17843:221::-;17983:34;17979:1;17971:6;17967:14;17960:58;18052:4;18047:2;18039:6;18035:15;18028:29;17843:221;:::o;18070:366::-;18212:3;18233:67;18297:2;18292:3;18233:67;:::i;:::-;18226:74;;18309:93;18398:3;18309:93;:::i;:::-;18427:2;18422:3;18418:12;18411:19;;18070:366;;;:::o;18442:419::-;18608:4;18646:2;18635:9;18631:18;18623:26;;18695:9;18689:4;18685:20;18681:1;18670:9;18666:17;18659:47;18723:131;18849:4;18723:131;:::i;:::-;18715:139;;18442:419;;;:::o;18867:240::-;19007:34;19003:1;18995:6;18991:14;18984:58;19076:23;19071:2;19063:6;19059:15;19052:48;18867:240;:::o;19113:366::-;19255:3;19276:67;19340:2;19335:3;19276:67;:::i;:::-;19269:74;;19352:93;19441:3;19352:93;:::i;:::-;19470:2;19465:3;19461:12;19454:19;;19113:366;;;:::o;19485:419::-;19651:4;19689:2;19678:9;19674:18;19666:26;;19738:9;19732:4;19728:20;19724:1;19713:9;19709:17;19702:47;19766:131;19892:4;19766:131;:::i;:::-;19758:139;;19485:419;;;:::o;19910:239::-;20050:34;20046:1;20038:6;20034:14;20027:58;20119:22;20114:2;20106:6;20102:15;20095:47;19910:239;:::o;20155:366::-;20297:3;20318:67;20382:2;20377:3;20318:67;:::i;:::-;20311:74;;20394:93;20483:3;20394:93;:::i;:::-;20512:2;20507:3;20503:12;20496:19;;20155:366;;;:::o;20527:419::-;20693:4;20731:2;20720:9;20716:18;20708:26;;20780:9;20774:4;20770:20;20766:1;20755:9;20751:17;20744:47;20808:131;20934:4;20808:131;:::i;:::-;20800:139;;20527:419;;;:::o;20952:225::-;21092:34;21088:1;21080:6;21076:14;21069:58;21161:8;21156:2;21148:6;21144:15;21137:33;20952:225;:::o;21183:366::-;21325:3;21346:67;21410:2;21405:3;21346:67;:::i;:::-;21339:74;;21422:93;21511:3;21422:93;:::i;:::-;21540:2;21535:3;21531:12;21524:19;;21183:366;;;:::o;21555:419::-;21721:4;21759:2;21748:9;21744:18;21736:26;;21808:9;21802:4;21798:20;21794:1;21783:9;21779:17;21772:47;21836:131;21962:4;21836:131;:::i;:::-;21828:139;;21555:419;;;:::o;21980:223::-;22120:34;22116:1;22108:6;22104:14;22097:58;22189:6;22184:2;22176:6;22172:15;22165:31;21980:223;:::o;22209:366::-;22351:3;22372:67;22436:2;22431:3;22372:67;:::i;:::-;22365:74;;22448:93;22537:3;22448:93;:::i;:::-;22566:2;22561:3;22557:12;22550:19;;22209:366;;;:::o;22581:419::-;22747:4;22785:2;22774:9;22770:18;22762:26;;22834:9;22828:4;22824:20;22820:1;22809:9;22805:17;22798:47;22862:131;22988:4;22862:131;:::i;:::-;22854:139;;22581:419;;;:::o;23006:221::-;23146:34;23142:1;23134:6;23130:14;23123:58;23215:4;23210:2;23202:6;23198:15;23191:29;23006:221;:::o;23233:366::-;23375:3;23396:67;23460:2;23455:3;23396:67;:::i;:::-;23389:74;;23472:93;23561:3;23472:93;:::i;:::-;23590:2;23585:3;23581:12;23574:19;;23233:366;;;:::o;23605:419::-;23771:4;23809:2;23798:9;23794:18;23786:26;;23858:9;23852:4;23848:20;23844:1;23833:9;23829:17;23822:47;23886:131;24012:4;23886:131;:::i;:::-;23878:139;;23605:419;;;:::o;24030:224::-;24170:34;24166:1;24158:6;24154:14;24147:58;24239:7;24234:2;24226:6;24222:15;24215:32;24030:224;:::o;24260:366::-;24402:3;24423:67;24487:2;24482:3;24423:67;:::i;:::-;24416:74;;24499:93;24588:3;24499:93;:::i;:::-;24617:2;24612:3;24608:12;24601:19;;24260:366;;;:::o;24632:419::-;24798:4;24836:2;24825:9;24821:18;24813:26;;24885:9;24879:4;24875:20;24871:1;24860:9;24856:17;24849:47;24913:131;25039:4;24913:131;:::i;:::-;24905:139;;24632:419;;;:::o;25057:222::-;25197:34;25193:1;25185:6;25181:14;25174:58;25266:5;25261:2;25253:6;25249:15;25242:30;25057:222;:::o;25285:366::-;25427:3;25448:67;25512:2;25507:3;25448:67;:::i;:::-;25441:74;;25524:93;25613:3;25524:93;:::i;:::-;25642:2;25637:3;25633:12;25626:19;;25285:366;;;:::o;25657:419::-;25823:4;25861:2;25850:9;25846:18;25838:26;;25910:9;25904:4;25900:20;25896:1;25885:9;25881:17;25874:47;25938:131;26064:4;25938:131;:::i;:::-;25930:139;;25657:419;;;:::o;26082:172::-;26222:24;26218:1;26210:6;26206:14;26199:48;26082:172;:::o;26260:366::-;26402:3;26423:67;26487:2;26482:3;26423:67;:::i;:::-;26416:74;;26499:93;26588:3;26499:93;:::i;:::-;26617:2;26612:3;26608:12;26601:19;;26260:366;;;:::o;26632:419::-;26798:4;26836:2;26825:9;26821:18;26813:26;;26885:9;26879:4;26875:20;26871:1;26860:9;26856:17;26849:47;26913:131;27039:4;26913:131;:::i;:::-;26905:139;;26632:419;;;:::o;27057:240::-;27197:34;27193:1;27185:6;27181:14;27174:58;27266:23;27261:2;27253:6;27249:15;27242:48;27057:240;:::o;27303:366::-;27445:3;27466:67;27530:2;27525:3;27466:67;:::i;:::-;27459:74;;27542:93;27631:3;27542:93;:::i;:::-;27660:2;27655:3;27651:12;27644:19;;27303:366;;;:::o;27675:419::-;27841:4;27879:2;27868:9;27864:18;27856:26;;27928:9;27922:4;27918:20;27914:1;27903:9;27899:17;27892:47;27956:131;28082:4;27956:131;:::i;:::-;27948:139;;27675:419;;;:::o;28100:169::-;28240:21;28236:1;28228:6;28224:14;28217:45;28100:169;:::o;28275:366::-;28417:3;28438:67;28502:2;28497:3;28438:67;:::i;:::-;28431:74;;28514:93;28603:3;28514:93;:::i;:::-;28632:2;28627:3;28623:12;28616:19;;28275:366;;;:::o;28647:419::-;28813:4;28851:2;28840:9;28836:18;28828:26;;28900:9;28894:4;28890:20;28886:1;28875:9;28871:17;28864:47;28928:131;29054:4;28928:131;:::i;:::-;28920:139;;28647:419;;;:::o;29072:241::-;29212:34;29208:1;29200:6;29196:14;29189:58;29281:24;29276:2;29268:6;29264:15;29257:49;29072:241;:::o;29319:366::-;29461:3;29482:67;29546:2;29541:3;29482:67;:::i;:::-;29475:74;;29558:93;29647:3;29558:93;:::i;:::-;29676:2;29671:3;29667:12;29660:19;;29319:366;;;:::o;29691:419::-;29857:4;29895:2;29884:9;29880:18;29872:26;;29944:9;29938:4;29934:20;29930:1;29919:9;29915:17;29908:47;29972:131;30098:4;29972:131;:::i;:::-;29964:139;;29691:419;;;:::o;30116:225::-;30256:34;30252:1;30244:6;30240:14;30233:58;30325:8;30320:2;30312:6;30308:15;30301:33;30116:225;:::o;30347:366::-;30489:3;30510:67;30574:2;30569:3;30510:67;:::i;:::-;30503:74;;30586:93;30675:3;30586:93;:::i;:::-;30704:2;30699:3;30695:12;30688:19;;30347:366;;;:::o;30719:419::-;30885:4;30923:2;30912:9;30908:18;30900:26;;30972:9;30966:4;30962:20;30958:1;30947:9;30943:17;30936:47;31000:131;31126:4;31000:131;:::i;:::-;30992:139;;30719:419;;;:::o;31144:147::-;31245:11;31282:3;31267:18;;31144:147;;;;:::o;31297:114::-;;:::o;31417:398::-;31576:3;31597:83;31678:1;31673:3;31597:83;:::i;:::-;31590:90;;31689:93;31778:3;31689:93;:::i;:::-;31807:1;31802:3;31798:11;31791:18;;31417:398;;;:::o;31821:379::-;32005:3;32027:147;32170:3;32027:147;:::i;:::-;32020:154;;32191:3;32184:10;;31821:379;;;:::o;32206:442::-;32355:4;32393:2;32382:9;32378:18;32370:26;;32406:71;32474:1;32463:9;32459:17;32450:6;32406:71;:::i;:::-;32487:72;32555:2;32544:9;32540:18;32531:6;32487:72;:::i;:::-;32569;32637:2;32626:9;32622:18;32613:6;32569:72;:::i;:::-;32206:442;;;;;;:::o;32654:180::-;32702:77;32699:1;32692:88;32799:4;32796:1;32789:15;32823:4;32820:1;32813:15;32840:180;32888:77;32885:1;32878:88;32985:4;32982:1;32975:15;33009:4;33006:1;32999:15;33026:143;33083:5;33114:6;33108:13;33099:22;;33130:33;33157:5;33130:33;:::i;:::-;33026:143;;;;:::o;33175:351::-;33245:6;33294:2;33282:9;33273:7;33269:23;33265:32;33262:119;;;33300:79;;:::i;:::-;33262:119;33420:1;33445:64;33501:7;33492:6;33481:9;33477:22;33445:64;:::i;:::-;33435:74;;33391:128;33175:351;;;;:::o;33532:85::-;33577:7;33606:5;33595:16;;33532:85;;;:::o;33623:158::-;33681:9;33714:61;33732:42;33741:32;33767:5;33741:32;:::i;:::-;33732:42;:::i;:::-;33714:61;:::i;:::-;33701:74;;33623:158;;;:::o;33787:147::-;33882:45;33921:5;33882:45;:::i;:::-;33877:3;33870:58;33787:147;;:::o;33940:114::-;34007:6;34041:5;34035:12;34025:22;;33940:114;;;:::o;34060:184::-;34159:11;34193:6;34188:3;34181:19;34233:4;34228:3;34224:14;34209:29;;34060:184;;;;:::o;34250:132::-;34317:4;34340:3;34332:11;;34370:4;34365:3;34361:14;34353:22;;34250:132;;;:::o;34388:108::-;34465:24;34483:5;34465:24;:::i;:::-;34460:3;34453:37;34388:108;;:::o;34502:179::-;34571:10;34592:46;34634:3;34626:6;34592:46;:::i;:::-;34670:4;34665:3;34661:14;34647:28;;34502:179;;;;:::o;34687:113::-;34757:4;34789;34784:3;34780:14;34772:22;;34687:113;;;:::o;34836:732::-;34955:3;34984:54;35032:5;34984:54;:::i;:::-;35054:86;35133:6;35128:3;35054:86;:::i;:::-;35047:93;;35164:56;35214:5;35164:56;:::i;:::-;35243:7;35274:1;35259:284;35284:6;35281:1;35278:13;35259:284;;;35360:6;35354:13;35387:63;35446:3;35431:13;35387:63;:::i;:::-;35380:70;;35473:60;35526:6;35473:60;:::i;:::-;35463:70;;35319:224;35306:1;35303;35299:9;35294:14;;35259:284;;;35263:14;35559:3;35552:10;;34960:608;;;34836:732;;;;:::o;35574:831::-;35837:4;35875:3;35864:9;35860:19;35852:27;;35889:71;35957:1;35946:9;35942:17;35933:6;35889:71;:::i;:::-;35970:80;36046:2;36035:9;36031:18;36022:6;35970:80;:::i;:::-;36097:9;36091:4;36087:20;36082:2;36071:9;36067:18;36060:48;36125:108;36228:4;36219:6;36125:108;:::i;:::-;36117:116;;36243:72;36311:2;36300:9;36296:18;36287:6;36243:72;:::i;:::-;36325:73;36393:3;36382:9;36378:19;36369:6;36325:73;:::i;:::-;35574:831;;;;;;;;:::o;36411:807::-;36660:4;36698:3;36687:9;36683:19;36675:27;;36712:71;36780:1;36769:9;36765:17;36756:6;36712:71;:::i;:::-;36793:72;36861:2;36850:9;36846:18;36837:6;36793:72;:::i;:::-;36875:80;36951:2;36940:9;36936:18;36927:6;36875:80;:::i;:::-;36965;37041:2;37030:9;37026:18;37017:6;36965:80;:::i;:::-;37055:73;37123:3;37112:9;37108:19;37099:6;37055:73;:::i;:::-;37138;37206:3;37195:9;37191:19;37182:6;37138:73;:::i;:::-;36411:807;;;;;;;;;:::o;37224:143::-;37281:5;37312:6;37306:13;37297:22;;37328:33;37355:5;37328:33;:::i;:::-;37224:143;;;;:::o;37373:663::-;37461:6;37469;37477;37526:2;37514:9;37505:7;37501:23;37497:32;37494:119;;;37532:79;;:::i;:::-;37494:119;37652:1;37677:64;37733:7;37724:6;37713:9;37709:22;37677:64;:::i;:::-;37667:74;;37623:128;37790:2;37816:64;37872:7;37863:6;37852:9;37848:22;37816:64;:::i;:::-;37806:74;;37761:129;37929:2;37955:64;38011:7;38002:6;37991:9;37987:22;37955:64;:::i;:::-;37945:74;;37900:129;37373:663;;;;;:::o

Swarm Source

ipfs://2f01a38595f154711818ea9dc2fd585c155316a5a654f9a51a696005fdb93d14
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.