ETH Price: $2,965.89 (-2.80%)
Gas: 3 Gwei

Token

Funicular Token (FUNICULAR)
 

Overview

Max Total Supply

1,000,000 FUNICULAR

Holders

402 (0.00%)

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
0.038635105638966691 FUNICULAR

Value
$0.00
0x1c2c52d01062940175148b091659e1c6cd43efac
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Autonomous compounding buy back yield farming protocol.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
FunicularToken

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-12-19
*/

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

interface IERC20 {
    function totalSupply() external view returns (uint256);

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

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

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

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

    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

    event Transfer(address indexed from, address indexed to, uint256 value);

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

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

    function getPair(address tokenA, address tokenB) external view returns (address pair);
}

interface IRouter {
    function factory() external pure returns (address);

    function WETH() external pure returns (address);

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

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

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

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

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

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

library Address {
	function isContract(address account) internal view returns (bool) {
		uint256 size;
		assembly {
			size := extcodesize(account)
		}
		return size > 0;
	}

	function sendValue(address payable recipient, uint256 amount) internal {
		require(
			address(this).balance >= amount,
			"Address: insufficient balance"
		);

		(bool success, ) = recipient.call{value: amount}("");
		require(
			success,
			"Address: unable to send value, recipient may have reverted"
		);
	}

	function functionCall(address target, bytes memory data)
	internal
	returns (bytes memory)
	{
		return functionCall(target, data, "Address: low-level call failed");
	}

	function functionCall(
		address target,
		bytes memory data,
		string memory errorMessage
	) internal returns (bytes memory) {
		return functionCallWithValue(target, data, 0, errorMessage);
	}

	function functionCallWithValue(
		address target,
		bytes memory data,
		uint256 value
	) internal returns (bytes memory) {
		return
		functionCallWithValue(
			target,
			data,
			value,
			"Address: low-level call with value failed"
		);
	}

	function functionCallWithValue(
		address target,
		bytes memory data,
		uint256 value,
		string memory errorMessage
	) internal returns (bytes memory) {
		require(
			address(this).balance >= value,
			"Address: insufficient balance for call"
		);
		require(isContract(target), "Address: call to non-contract");

		(bool success, bytes memory returndata) = target.call{value: value}(
		data
		);
		return _verifyCallResult(success, returndata, errorMessage);
	}

	function functionStaticCall(address target, bytes memory data)
	internal
	view
	returns (bytes memory)
	{
		return
		functionStaticCall(
			target,
			data,
			"Address: low-level static call failed"
		);
	}

	function functionStaticCall(
		address target,
		bytes memory data,
		string memory errorMessage
	) internal view returns (bytes memory) {
		require(isContract(target), "Address: static call to non-contract");

		(bool success, bytes memory returndata) = target.staticcall(data);
		return _verifyCallResult(success, returndata, errorMessage);
	}

	function functionDelegateCall(address target, bytes memory data)
	internal
	returns (bytes memory)
	{
		return
		functionDelegateCall(
			target,
			data,
			"Address: low-level delegate call failed"
		);
	}

	function functionDelegateCall(
		address target,
		bytes memory data,
		string memory errorMessage
	) internal returns (bytes memory) {
		require(isContract(target), "Address: delegate call to non-contract");

		(bool success, bytes memory returndata) = target.delegatecall(data);
		return _verifyCallResult(success, returndata, errorMessage);
	}

	function _verifyCallResult(
		bool success,
		bytes memory returndata,
		string memory errorMessage
	) private pure returns (bytes memory) {
		if (success) {
			return returndata;
		} else {
			if (returndata.length > 0) {
				assembly {
					let returndata_size := mload(returndata)
					revert(add(32, returndata), returndata_size)
				}
			} else {
				revert(errorMessage);
			}
		}
	}
}

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

contract Ownable is Context {
    address private _owner;

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

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

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

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

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

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

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

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

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

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

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

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

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

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

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

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

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


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

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

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

        return true;
    }

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

        _beforeTokenTransfer(from, to, amount);

        uint256 fromBalance = _balances[from];
        require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[from] = fromBalance - amount;
            // 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);

        _afterTokenTransfer(from, to, amount);
    }

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

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

        _totalSupply += amount;
        unchecked {
            // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above.
            _balances[account] += amount;
        }
        emit Transfer(address(0), account, amount);

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

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

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

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
            // Overflow not possible: amount <= accountBalance <= totalSupply.
            _totalSupply -= amount;
        }

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

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

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

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

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

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

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

contract FunicularToken is Ownable, ERC20 {
    using Address for address;

    IRouter public uniswapV2Router;
    address public immutable uniswapV2Pair;

    string private constant _name = "Funicular Token";
    string private constant _symbol = "FUNICULAR";

    bool public isTradingEnabled;

    uint256 public initialSupply = 1000000 * (10**18);

    // max buy and sell tx is 100% of initialSupply
    uint256 public maxTxAmount = initialSupply;

    // max wallet is 1% of initialSupply
    uint256 public maxWalletAmount = initialSupply * 100 / 10000;

    bool private _swapping;
    uint256 public minimumTokensBeforeSwap = initialSupply * 1 / 100000;

    address public liquidity1Wallet;
    address public liquidity2Wallet;
    address public operationsWallet;

    struct CustomTaxPeriod {
        bytes23 periodName;
        uint8 liquidity1FeeOnBuy;
        uint8 liquidity1FeeOnSell;
        uint8 liquidity2FeeOnBuy;
        uint8 liquidity2FeeOnSell;
        uint8 operationsFeeOnBuy;
        uint8 operationsFeeOnSell;
    }

    // Base taxes
    CustomTaxPeriod private _base = CustomTaxPeriod("base", 1, 1, 9, 9, 1, 1);

    bool private _isLaunched;
    bool public _launchTokensClaimed;
    uint256 private _launchStartTimestamp;
    uint256 private _launchBlockNumber;
    uint256 public launchTokens;

    mapping (address => bool) private _isBlocked;
    mapping(address => bool) private _isAllowedToTradeWhenDisabled;
    mapping(address => bool) private _feeOnSelectedWalletTransfers;
    mapping(address => bool) private _isExcludedFromFee;
    mapping(address => bool) private _isExcludedFromMaxTransactionLimit;
    mapping(address => bool) private _isExcludedFromMaxWalletLimit;
    mapping(address => bool) public automatedMarketMakerPairs;

    uint8 private _liquidity1Fee;
    uint8 private _liquidity2Fee;
    uint8 private _operationsFee;
    uint8 private _totalFee;

    event AutomatedMarketMakerPairChange(address indexed pair, bool indexed value);
    event BlockedAccountChange(address indexed holder, bool indexed status);
    event UniswapV2RouterChange(address indexed newAddress, address indexed oldAddress);
    event WalletChange(string indexed indentifier,address indexed newWallet,address indexed oldWallet);
    event FeeChange(string indexed identifier,uint8 liquidity1Fee,uint8 liquidity2Fee,uint8 operationsFee);
    event CustomTaxPeriodChange(uint256 indexed newValue,uint256 indexed oldValue,string indexed taxType,bytes23 period);
    event MaxTransactionAmountChange(uint256 indexed newValue, uint256 indexed oldValue);
    event MaxWalletAmountChange(uint256 indexed newValue, uint256 indexed oldValue);
    event ExcludeFromFeesChange(address indexed account, bool isExcluded);
    event ExcludeFromMaxTransferChange(address indexed account, bool isExcluded);
    event ExcludeFromMaxWalletChange(address indexed account, bool isExcluded);
    event AllowedWhenTradingDisabledChange(address indexed account, bool isExcluded);
    event MinTokenAmountBeforeSwapChange(uint256 indexed newValue, uint256 indexed oldValue);
    event SwapAndLiquify(uint256 tokensSwapped, uint256 ethReceived, uint256 tokensIntoLiqudity);
    event FeeOnSelectedWalletTransfersChange(address indexed account, bool newValue);
    event ClaimOverflow(address token, uint256 amount);
    event TradingStatusChange(bool indexed newValue, bool indexed oldValue);
    event FeesApplied(uint8 liquidity1Fee,uint8 liquidity2Fee,uint8 operationsFee,uint8 totalFee);

    constructor() ERC20(_name, _symbol) {
        liquidity1Wallet = owner();
        liquidity2Wallet = owner();
        operationsWallet = owner();

        IRouter _uniswapV2Router = IRouter(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
        address _uniswapV2Pair = IFactory(_uniswapV2Router.factory()).createPair(address(this),_uniswapV2Router.WETH());
        uniswapV2Router = _uniswapV2Router;
        uniswapV2Pair = _uniswapV2Pair;
        _setAutomatedMarketMakerPair(_uniswapV2Pair, true);

        _isExcludedFromFee[owner()] = true;
        _isExcludedFromFee[address(this)] = true;

        _isAllowedToTradeWhenDisabled[owner()] = true;
        _isAllowedToTradeWhenDisabled[address(this)] = true;

        _isExcludedFromMaxTransactionLimit[address(this)] = true;

        _isExcludedFromMaxWalletLimit[_uniswapV2Pair] = true;
        _isExcludedFromMaxWalletLimit[address(uniswapV2Router)] = true;
        _isExcludedFromMaxWalletLimit[address(this)] = true;
        _isExcludedFromMaxWalletLimit[owner()] = true;

        _mint(owner(), initialSupply);
    }

    receive() external payable {}

    function activateTrading() external onlyOwner {
        isTradingEnabled = true;
        if(_launchBlockNumber == 0) {
            _launchBlockNumber = block.number;
            _launchStartTimestamp = block.timestamp;
            _isLaunched = true;
        }
        emit TradingStatusChange(true, false);
    }
    function deactivateTrading() external onlyOwner {
        isTradingEnabled = false;
        emit TradingStatusChange(false, true);
    }
    function _setAutomatedMarketMakerPair(address pair, bool value) private {
        require(automatedMarketMakerPairs[pair] != value,"Funicular: Automated market maker pair is already set to that value");
        automatedMarketMakerPairs[pair] = value;
        emit AutomatedMarketMakerPairChange(pair, value);
    }
    function allowTradingWhenDisabled(address account, bool allowed) external onlyOwner {
        _isAllowedToTradeWhenDisabled[account] = allowed;
        emit AllowedWhenTradingDisabledChange(account, allowed);
    }
    function blockAccount(address account) external onlyOwner {
        require(!_isBlocked[account], "Funicular: Account is already blocked");
        if (_isLaunched) {
            require((block.timestamp - _launchStartTimestamp) < 172800, "Funicular: Time to block accounts has expired");
        }
        _isBlocked[account] = true;
        emit BlockedAccountChange(account, true);
    }
    function unblockAccount(address account) external onlyOwner {
        require(_isBlocked[account], "Funicular: Account is not blcoked");
        _isBlocked[account] = false;
        emit BlockedAccountChange(account, false);
    }
    function setFeeOnSelectedWalletTransfers(address account, bool value) external onlyOwner {
        require(_feeOnSelectedWalletTransfers[account] != value,"Funicular: The selected wallet is already set to the value ");
        _feeOnSelectedWalletTransfers[account] = value;
        emit FeeOnSelectedWalletTransfersChange(account, value);
    }
    function excludeFromFees(address account, bool excluded) external onlyOwner {
        require(_isExcludedFromFee[account] != excluded,"Funicular: Account is already the value of 'excluded'");
        _isExcludedFromFee[account] = excluded;
        emit ExcludeFromFeesChange(account, excluded);
    }
    function excludeFromMaxTransactionLimit(address account, bool excluded) external onlyOwner {
        require(_isExcludedFromMaxTransactionLimit[account] != excluded,"Funicular: Account is already the value of 'excluded'");
        _isExcludedFromMaxTransactionLimit[account] = excluded;
        emit ExcludeFromMaxTransferChange(account, excluded);
    }
    function excludeFromMaxWalletLimit(address account, bool excluded) external onlyOwner {
        require(_isExcludedFromMaxWalletLimit[account] != excluded,"Funicular: Account is already the value of 'excluded'");
        _isExcludedFromMaxWalletLimit[account] = excluded;
        emit ExcludeFromMaxWalletChange(account, excluded);
    }
    function setWallets(address newLiquidity1Wallet,address newLiquidity2Wallet,address newOperationsWallet) external onlyOwner {
        if (liquidity1Wallet != newLiquidity1Wallet) {
            require(newLiquidity1Wallet != address(0), "Funicular: The liquidity1Wallet cannot be 0");
            emit WalletChange("liquidity1Wallet", newLiquidity1Wallet, liquidity1Wallet);
            liquidity1Wallet = newLiquidity1Wallet;
        }
        if (liquidity2Wallet != newLiquidity2Wallet) {
            require(newLiquidity2Wallet != address(0), "Funicular: The liquidity2Wallet cannot be 0");
            emit WalletChange("liquidity2Wallet", newLiquidity2Wallet, liquidity2Wallet);
            liquidity2Wallet = newLiquidity2Wallet;
        }
        if (operationsWallet != newOperationsWallet) {
            require(newOperationsWallet != address(0), "Funicular: The operationsWallet cannot be 0");
            emit WalletChange("operationsWallet", newOperationsWallet, operationsWallet);
            operationsWallet = newOperationsWallet;
        }
    }
    // Base fees
    function setBaseFeesOnBuy(uint8 _liquidity1FeeOnBuy,uint8 _liquidity2FeeOnBuy,uint8 _operationsFeeOnBuy) external onlyOwner {
        _setCustomBuyTaxPeriod(_base,_liquidity1FeeOnBuy,_liquidity2FeeOnBuy,_operationsFeeOnBuy);
        emit FeeChange("baseFees-Buy",_liquidity1FeeOnBuy,_liquidity2FeeOnBuy,_operationsFeeOnBuy);
    }
    function setBaseFeesOnSell(uint8 _liquidity1FeeOnSell,uint8 _liquidity2FeeOnSell,uint8 _operationsFeeOnSell) external onlyOwner {
        _setCustomSellTaxPeriod(_base,_liquidity1FeeOnSell,_liquidity2FeeOnSell,_operationsFeeOnSell);
        emit FeeChange("baseFees-Sell",_liquidity1FeeOnSell,_liquidity2FeeOnSell,_operationsFeeOnSell);
    }
    function setUniswapRouter(address newAddress) external onlyOwner {
        require(newAddress != address(uniswapV2Router),"Funicular: The router already has that address");
        emit UniswapV2RouterChange(newAddress, address(uniswapV2Router));
        uniswapV2Router = IRouter(newAddress);
    }
    function setMaxTransactionAmount(uint256 newValue) external onlyOwner {
        require(newValue != maxTxAmount, "Funicular: Cannot update maxTxAmount to same value");
        emit MaxTransactionAmountChange(newValue, maxTxAmount);
        maxTxAmount = newValue;
    }
    function setMaxWalletAmount(uint256 newValue) external onlyOwner {
        require(newValue != maxWalletAmount,"Funicular: Cannot update maxWalletAmount to same value");
        emit MaxWalletAmountChange(newValue, maxWalletAmount);
        maxWalletAmount = newValue;
    }
    function setMinimumTokensBeforeSwap(uint256 newValue) external onlyOwner {
        require(newValue != minimumTokensBeforeSwap,"Funicular: Cannot update minimumTokensBeforeSwap to same value");
        emit MinTokenAmountBeforeSwapChange(newValue, minimumTokensBeforeSwap);
        minimumTokensBeforeSwap = newValue;
    }
    function claimLaunchTokens() external onlyOwner {
		require(_launchStartTimestamp > 0, "Funicular: Launch must have occurred");
		require(!_launchTokensClaimed, "Funicular: Launch tokens have already been claimed");
		require(block.number - _launchBlockNumber > 5, "Funicular: Only claim launch tokens after launch");
		uint256 tokenBalance = balanceOf(address(this));
		_launchTokensClaimed = true;
		require(launchTokens <= tokenBalance, "Funicular: A swap and liquify has already occurred");
		uint256 amount = launchTokens;
		launchTokens = 0;
        (bool success) = IERC20(address(this)).transfer(owner(), amount);
        if (success){
            emit ClaimOverflow(address(this), amount);
        }
    }
    function claimETHOverflow(uint256 amount) external onlyOwner {
        require(amount <= address(this).balance, "Funicular: Cannot send more than contract balance");
        (bool success, ) = address(owner()).call{ value: amount }("");
        if (success) {
            emit ClaimOverflow(uniswapV2Router.WETH(), amount);
        }
    }

    // Getters
    function getBaseBuyFees() external view returns (uint8,uint8,uint8) {
        return (_base.liquidity1FeeOnBuy,_base.liquidity2FeeOnBuy,_base.operationsFeeOnBuy);
    }
    function getBaseSellFees() external view returns (uint8,uint8,uint8) {
        return (_base.liquidity1FeeOnSell,_base.liquidity2FeeOnSell,_base.operationsFeeOnSell);
    }
    // Main
    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 (!_isAllowedToTradeWhenDisabled[from] && !_isAllowedToTradeWhenDisabled[to]) {
            require(isTradingEnabled, "Funicular: Trading is currently disabled.");
            require(!_isBlocked[to], "Funicular: Account is blocked");
            require(!_isBlocked[from], "Funicular: Account is blocked");
            if (!_isExcludedFromMaxTransactionLimit[to] && !_isExcludedFromMaxTransactionLimit[from]) {
                require(amount <= maxTxAmount, "Funicular: Buy amount exceeds the maxTxBuyAmount.");
            }
            if (!_isExcludedFromMaxWalletLimit[to]) {
                require((balanceOf(to) + amount) <= maxWalletAmount, "Funicular: Expected wallet amount exceeds the maxWalletAmount.");
            }
        }

        _adjustTaxes(automatedMarketMakerPairs[from], automatedMarketMakerPairs[to], from, to);
        bool canSwap = balanceOf(address(this)) >= minimumTokensBeforeSwap;

        if (
            isTradingEnabled &&
            canSwap &&
            !_swapping &&
            _totalFee > 0 &&
            automatedMarketMakerPairs[to]
        ) {
            _swapping = true;
            _swapAndLiquify();
            _swapping = false;
        }

        bool takeFee = !_swapping && isTradingEnabled;

        if (_isExcludedFromFee[from] || _isExcludedFromFee[to]) {
            takeFee = false;
        }
        if (takeFee && _totalFee > 0) {
            uint256 fee = (amount * _totalFee) / 100;
            amount = amount - fee;
            if (_launchStartTimestamp > 0 && (block.number - _launchBlockNumber <= 5)) {
                launchTokens += fee;
            }
            super._transfer(from, address(this), fee);
        }
        super._transfer(from, to, amount);
    }

    function _adjustTaxes(bool isBuyFromLp,bool isSelltoLp,address from,address to) private {
        _liquidity1Fee = 0;
        _liquidity2Fee = 0;
        _operationsFee = 0;

        if (isBuyFromLp) {
            if (_isLaunched && block.timestamp - _launchBlockNumber <= 5) {
                _liquidity1Fee = 100;
            } else {
                _liquidity1Fee = _base.liquidity1FeeOnBuy;
                _liquidity2Fee = _base.liquidity2FeeOnBuy;
                _operationsFee = _base.operationsFeeOnBuy;
            }
        }
        if (isSelltoLp) {
            _liquidity1Fee = _base.liquidity1FeeOnSell;
            _liquidity2Fee = _base.liquidity2FeeOnSell;
            _operationsFee = _base.operationsFeeOnSell;
        }
        if (!isSelltoLp && !isBuyFromLp && (_feeOnSelectedWalletTransfers[from] || _feeOnSelectedWalletTransfers[to])) {
            _liquidity1Fee = _base.liquidity1FeeOnBuy;
            _liquidity2Fee = _base.liquidity2FeeOnBuy;
            _operationsFee = _base.operationsFeeOnBuy;
        }
        _totalFee = _liquidity1Fee + _liquidity2Fee + _operationsFee;
        emit FeesApplied(_liquidity1Fee, _liquidity2Fee, _operationsFee, _totalFee);
    }

    function _setCustomSellTaxPeriod(CustomTaxPeriod storage map,uint8 _liquidity1FeeOnSell,uint8 _liquidity2FeeOnSell,uint8 _operationsFeeOnSell) private {
        if (map.liquidity1FeeOnSell != _liquidity1FeeOnSell) {
            emit CustomTaxPeriodChange(_liquidity1FeeOnSell,map.liquidity1FeeOnSell,"liquidity1FeeOnSell",map.periodName);
            map.liquidity1FeeOnSell = _liquidity1FeeOnSell;
        }
        if (map.liquidity2FeeOnSell != _liquidity2FeeOnSell) {
            emit CustomTaxPeriodChange(_liquidity2FeeOnSell,map.liquidity2FeeOnSell,"liquidity2FeeOnSell",map.periodName);
            map.liquidity2FeeOnSell = _liquidity2FeeOnSell;
        }
        if (map.operationsFeeOnSell != _operationsFeeOnSell) {
            emit CustomTaxPeriodChange(_operationsFeeOnSell,map.operationsFeeOnSell,"operationsFeeOnSell",map.periodName);
            map.operationsFeeOnSell = _operationsFeeOnSell;
        }
    }
    function _setCustomBuyTaxPeriod(CustomTaxPeriod storage map,uint8 _liquidity1FeeOnBuy,uint8 _liquidity2FeeOnBuy,uint8 _operationsFeeOnBuy) private {
        if (map.liquidity1FeeOnBuy != _liquidity1FeeOnBuy) {
            emit CustomTaxPeriodChange(_liquidity1FeeOnBuy,map.liquidity1FeeOnBuy,"liquidity1FeeOnBuy",map.periodName);
            map.liquidity1FeeOnBuy = _liquidity1FeeOnBuy;
        }
        if (map.liquidity2FeeOnBuy != _liquidity2FeeOnBuy) {
            emit CustomTaxPeriodChange(_liquidity2FeeOnBuy,map.liquidity2FeeOnBuy,"liquidity2FeeOnBuy",map.periodName);
            map.liquidity2FeeOnBuy = _liquidity2FeeOnBuy;
        }
        if (map.operationsFeeOnBuy != _operationsFeeOnBuy) {
            emit CustomTaxPeriodChange(_operationsFeeOnBuy,map.operationsFeeOnBuy,"operationsFeeOnBuy",map.periodName);
            map.operationsFeeOnBuy = _operationsFeeOnBuy;
        }
    }

    function _swapAndLiquify() private {
        uint256 contractBalance = balanceOf(address(this));
        uint256 initialETHBalance = address(this).balance;

        uint256 amountToLiquify = (contractBalance * _liquidity1Fee) / _totalFee / 2;
        uint256 amountToSwap = contractBalance - amountToLiquify;

        _swapTokensForETH(amountToSwap);

        uint256 ETHBalanceAfterSwap = address(this).balance - initialETHBalance;
        uint256 totalETHFee = _totalFee - (_liquidity1Fee / 2);
        uint256 amountETHLiquidity1 = (ETHBalanceAfterSwap * _liquidity1Fee) / totalETHFee / 2;
        uint256 amountETHLiquidity2 = (ETHBalanceAfterSwap * _liquidity2Fee) / totalETHFee;
        uint256 amountETHOperations = ETHBalanceAfterSwap - (amountETHLiquidity1  + amountETHLiquidity2);

        Address.sendValue(payable(operationsWallet),amountETHOperations);
        Address.sendValue(payable(liquidity2Wallet),amountETHLiquidity2);

        if (amountToLiquify > 0) {
            _addLiquidity(amountToLiquify, amountETHLiquidity1);
            emit SwapAndLiquify(amountToSwap, amountETHLiquidity1, amountToLiquify);
        }
    }

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

    function _addLiquidity(uint256 tokenAmount, uint256 ethAmount) private {
        _approve(address(this), address(uniswapV2Router), tokenAmount);
        uniswapV2Router.addLiquidityETH{ value: ethAmount }(
            address(this),
            tokenAmount,
            1, // slippage is unavoidable
            1, // slippage is unavoidable
            liquidity1Wallet,
            block.timestamp
        );
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"AllowedWhenTradingDisabledChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pair","type":"address"},{"indexed":true,"internalType":"bool","name":"value","type":"bool"}],"name":"AutomatedMarketMakerPairChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"holder","type":"address"},{"indexed":true,"internalType":"bool","name":"status","type":"bool"}],"name":"BlockedAccountChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ClaimOverflow","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"newValue","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"oldValue","type":"uint256"},{"indexed":true,"internalType":"string","name":"taxType","type":"string"},{"indexed":false,"internalType":"bytes23","name":"period","type":"bytes23"}],"name":"CustomTaxPeriodChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromFeesChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromMaxTransferChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromMaxWalletChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"string","name":"identifier","type":"string"},{"indexed":false,"internalType":"uint8","name":"liquidity1Fee","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"liquidity2Fee","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"operationsFee","type":"uint8"}],"name":"FeeChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"newValue","type":"bool"}],"name":"FeeOnSelectedWalletTransfersChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"liquidity1Fee","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"liquidity2Fee","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"operationsFee","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"totalFee","type":"uint8"}],"name":"FeesApplied","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"newValue","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"oldValue","type":"uint256"}],"name":"MaxTransactionAmountChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"newValue","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"oldValue","type":"uint256"}],"name":"MaxWalletAmountChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"newValue","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"oldValue","type":"uint256"}],"name":"MinTokenAmountBeforeSwapChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiqudity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bool","name":"newValue","type":"bool"},{"indexed":true,"internalType":"bool","name":"oldValue","type":"bool"}],"name":"TradingStatusChange","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":"UniswapV2RouterChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"string","name":"indentifier","type":"string"},{"indexed":true,"internalType":"address","name":"newWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldWallet","type":"address"}],"name":"WalletChange","type":"event"},{"inputs":[],"name":"_launchTokensClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"activateTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"allowed","type":"bool"}],"name":"allowTradingWhenDisabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"automatedMarketMakerPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"blockAccount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"claimETHOverflow","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimLaunchTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"deactivateTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromMaxTransactionLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromMaxWalletLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getBaseBuyFees","outputs":[{"internalType":"uint8","name":"","type":"uint8"},{"internalType":"uint8","name":"","type":"uint8"},{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBaseSellFees","outputs":[{"internalType":"uint8","name":"","type":"uint8"},{"internalType":"uint8","name":"","type":"uint8"},{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initialSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isTradingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"launchTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidity1Wallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidity2Wallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTxAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWalletAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minimumTokensBeforeSwap","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":"operationsWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_liquidity1FeeOnBuy","type":"uint8"},{"internalType":"uint8","name":"_liquidity2FeeOnBuy","type":"uint8"},{"internalType":"uint8","name":"_operationsFeeOnBuy","type":"uint8"}],"name":"setBaseFeesOnBuy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_liquidity1FeeOnSell","type":"uint8"},{"internalType":"uint8","name":"_liquidity2FeeOnSell","type":"uint8"},{"internalType":"uint8","name":"_operationsFeeOnSell","type":"uint8"}],"name":"setBaseFeesOnSell","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setFeeOnSelectedWalletTransfers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"setMaxTransactionAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"setMaxWalletAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"setMinimumTokensBeforeSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"setUniswapRouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newLiquidity1Wallet","type":"address"},{"internalType":"address","name":"newLiquidity2Wallet","type":"address"},{"internalType":"address","name":"newOperationsWallet","type":"address"}],"name":"setWallets","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"unblockAccount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IRouter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

60a060405269d3c21bcecceda100000060075560075460085561271060075460646200002c91906200069c565b620000389190620006bc565b600955620186a060075460016200005091906200069c565b6200005c9190620006bc565b600b556040805160e081018252636261736560e01b8152600160208201819052918101829052600960608201819052608082015260a0810182905260c00152600f80546001600160e81b031916690101090901016261736560981b179055348015620000c757600080fd5b506040518060400160405280600f81526020016e233ab734b1bab630b9102a37b5b2b760891b81525060405180604001604052806009815260200168232aa724a1aaa620a960b91b815250600062000124620004bc60201b60201c565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35060046200017c838262000783565b5060056200018b828262000783565b505060008054600c80546001600160a01b039092166001600160a01b03199283168117909155600d8054831682179055600e80549092161790556040805163c45a015560e01b81529051737a250d5630b4cf539739df2c5dacb4c659f2488d9350839163c45a01559160048083019260209291908290030181865afa15801562000219573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200023f91906200084f565b6001600160a01b031663c9c6539630846001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200028d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002b391906200084f565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af115801562000301573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200032791906200084f565b600680546001600160a01b0319166001600160a01b0385811691909117909155811660805290506200035b816001620004c0565b600160176000620003746000546001600160a01b031690565b6001600160a01b0316815260208082019290925260409081016000908120805494151560ff199586161790553081526017909252812080549092166001908117909255601590620003cd6000546001600160a01b031690565b6001600160a01b03908116825260208083019390935260409182016000908120805495151560ff19968716179055308082526015855283822080548716600190811790915560188652848320805488168217905587841683526019958690528483208054881682179055600654909316825283822080548716841790558152918220805490941681179093556200046c6000546001600160a01b031690565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055620004b4620004ab6000546001600160a01b031690565b600754620005bc565b505062000897565b3390565b6001600160a01b0382166000908152601a602052604090205481151560ff909116151503620005685760405162461bcd60e51b815260206004820152604360248201527f46756e6963756c61723a204175746f6d61746564206d61726b6574206d616b6560448201527f72207061697220697320616c72656164792073657420746f20746861742076616064820152626c756560e81b608482015260a4015b60405180910390fd5b6001600160a01b0382166000818152601a6020526040808220805460ff191685151590811790915590519092917fa666b9b2dc2c8f2d86fda7ba3a115be30d3a958fd84d359cbc6bc919df97990a91a35050565b6001600160a01b038216620006145760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016200055f565b806003600082825462000628919062000881565b90915550506001600160a01b0382166000818152600160209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b505050565b634e487b7160e01b600052601160045260246000fd5b8082028115828204841417620006b657620006b662000686565b92915050565b600082620006da57634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200070a57607f821691505b6020821081036200072b57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200068157600081815260208120601f850160051c810160208610156200075a5750805b601f850160051c820191505b818110156200077b5782815560010162000766565b505050505050565b81516001600160401b038111156200079f576200079f620006df565b620007b781620007b08454620006f5565b8462000731565b602080601f831160018114620007ef5760008415620007d65750858301515b600019600386901b1c1916600185901b1785556200077b565b600085815260208120601f198616915b828110156200082057888601518255948401946001909101908401620007ff565b50858210156200083f5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6000602082840312156200086257600080fd5b81516001600160a01b03811681146200087a57600080fd5b9392505050565b80820180821115620006b657620006b662000686565b6080516136fd620008b360003960006104e101526136fd6000f3fe60806040526004361061028c5760003560e01c806375cb1bd11161015a578063aee50b1e116100c1578063d32215761161007a578063d3221576146107e7578063dd62ed3e14610807578063e625724614610827578063f2fde38b14610847578063fd72e22a14610867578063fe0175351461088757600080fd5b8063aee50b1e146106ed578063b62496f51461070d578063bea9849e1461073d578063c02466681461075d578063cd43e2281461077d578063d2d7ad83146107d157600080fd5b80638da5cb5b116101135780638da5cb5b14610644578063924241e31461066257806395d89b4114610682578063a457c2d714610697578063a9059cbb146106b7578063aa4bde28146106d757600080fd5b806375cb1bd11461058e57806376dca835146105ae578063781edb3c146105ce5780637c0a893d146105ee578063880bcbc11461060e5780638c0b5e221461062e57600080fd5b806327a14fc2116101fe57806345a42329116101b757806345a42329146104af57806349bd5a5e146104cf5780634d78fdc6146105035780634f225e6d1461052357806370a0823114610543578063715018a61461057957600080fd5b806327a14fc2146104135780632cc25d1414610433578063313ce5671461044857806334cf1fea14610464578063378dc3dc14610479578063395093511461048f57600080fd5b806314fbc5f31161025057806314fbc5f3146103475780631694505e1461036657806318160ddd1461039e5780631e293c10146103bd5780631fcfefcd146103dd57806323b872dd146103f357600080fd5b8063064a59d01461029857806306fdde03146102ce578063095ea7b3146102f0578063098df585146103105780630bd05b691461033257600080fd5b3661029357005b600080fd5b3480156102a457600080fd5b506006546102b990600160a01b900460ff1681565b60405190151581526020015b60405180910390f35b3480156102da57600080fd5b506102e36108bb565b6040516102c5919061315b565b3480156102fc57600080fd5b506102b961030b3660046131c1565b61094d565b34801561031c57600080fd5b5061033061032b3660046131ed565b610967565b005b34801561033e57600080fd5b50610330610b13565b34801561035357600080fd5b506010546102b990610100900460ff1681565b34801561037257600080fd5b50600654610386906001600160a01b031681565b6040516001600160a01b0390911681526020016102c5565b3480156103aa57600080fd5b506003545b6040519081526020016102c5565b3480156103c957600080fd5b506103306103d83660046131ed565b610ba0565b3480156103e957600080fd5b506103af60135481565b3480156103ff57600080fd5b506102b961040e366004613206565b610c69565b34801561041f57600080fd5b5061033061042e3660046131ed565b610c8d565b34801561043f57600080fd5b50610330610d5a565b34801561045457600080fd5b50604051601281526020016102c5565b34801561047057600080fd5b50610330611032565b34801561048557600080fd5b506103af60075481565b34801561049b57600080fd5b506102b96104aa3660046131c1565b611099565b3480156104bb57600080fd5b506103306104ca366004613255565b6110bb565b3480156104db57600080fd5b506103867f000000000000000000000000000000000000000000000000000000000000000081565b34801561050f57600080fd5b5061033061051e36600461328e565b6111db565b34801561052f57600080fd5b50600d54610386906001600160a01b031681565b34801561054f57600080fd5b506103af61055e36600461328e565b6001600160a01b031660009081526001602052604090205490565b34801561058557600080fd5b506103306112c4565b34801561059a57600080fd5b506103306105a93660046132b2565b611338565b3480156105ba57600080fd5b506103306105c9366004613313565b611653565b3480156105da57600080fd5b506103306105e9366004613255565b6116f7565b3480156105fa57600080fd5b5061033061060936600461328e565b6117b9565b34801561061a57600080fd5b50610330610629366004613255565b61192c565b34801561063a57600080fd5b506103af60085481565b34801561065057600080fd5b506000546001600160a01b0316610386565b34801561066e57600080fd5b50600c54610386906001600160a01b031681565b34801561068e57600080fd5b506102e36119ee565b3480156106a357600080fd5b506102b96106b23660046131c1565b6119fd565b3480156106c357600080fd5b506102b96106d23660046131c1565b611a78565b3480156106e357600080fd5b506103af60095481565b3480156106f957600080fd5b506103306107083660046131ed565b611a86565b34801561071957600080fd5b506102b961072836600461328e565b601a6020526000908152604090205460ff1681565b34801561074957600080fd5b5061033061075836600461328e565b611b5a565b34801561076957600080fd5b50610330610778366004613255565b611c56565b34801561078957600080fd5b50600f5460ff600160b81b8204811691600160c81b8104821691600160d81b909104165b6040805160ff948516815292841660208401529216918101919091526060016102c5565b3480156107dd57600080fd5b506103af600b5481565b3480156107f357600080fd5b50610330610802366004613255565b611d18565b34801561081357600080fd5b506103af610822366004613356565b611d9a565b34801561083357600080fd5b50610330610842366004613313565b611dc5565b34801561085357600080fd5b5061033061086236600461328e565b611e19565b34801561087357600080fd5b50600e54610386906001600160a01b031681565b34801561089357600080fd5b50600f5460ff600160c01b8204811691600160d01b8104821691600160e01b909104166107ad565b6060600480546108ca90613384565b80601f01602080910402602001604051908101604052809291908181526020018280546108f690613384565b80156109435780601f1061091857610100808354040283529160200191610943565b820191906000526020600020905b81548152906001019060200180831161092657829003601f168201915b5050505050905090565b60003361095b818585611f03565b60019150505b92915050565b6000546001600160a01b0316331461099a5760405162461bcd60e51b8152600401610991906133be565b60405180910390fd5b47811115610a045760405162461bcd60e51b815260206004820152603160248201527f46756e6963756c61723a2043616e6e6f742073656e64206d6f7265207468616e60448201527020636f6e74726163742062616c616e636560781b6064820152608401610991565b600080546040516001600160a01b039091169083908381818185875af1925050503d8060008114610a51576040519150601f19603f3d011682016040523d82523d6000602084013e610a56565b606091505b505090508015610b0f57600654604080516315ab88c960e31b815290517fb16273d5dd95f4997020a9e2e429331d472940f09fe08af28db9672639cc251d926001600160a01b03169163ad5c46489160048083019260209291908290030181865afa158015610ac9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aed91906133f3565b604080516001600160a01b039092168252602082018590520160405180910390a15b5050565b6000546001600160a01b03163314610b3d5760405162461bcd60e51b8152600401610991906133be565b6006805460ff60a01b1916600160a01b179055601254600003610b705743601255426011556010805460ff191660011790555b6040516000906001907fa0f694e30e34d9f05d12691b612650129ed8888d1f93b25fa0cd92e4416a8338908390a3565b6000546001600160a01b03163314610bca5760405162461bcd60e51b8152600401610991906133be565b6008548103610c365760405162461bcd60e51b815260206004820152603260248201527f46756e6963756c61723a2043616e6e6f7420757064617465206d61785478416d6044820152716f756e7420746f2073616d652076616c756560701b6064820152608401610991565b60085460405182907f75f1c17bf623f0f7a2bd91ba61e89dff216960370e3e9a46b250750d03e4215e90600090a3600855565b600033610c77858285612027565b610c828585856120a1565b506001949350505050565b6000546001600160a01b03163314610cb75760405162461bcd60e51b8152600401610991906133be565b6009548103610d275760405162461bcd60e51b815260206004820152603660248201527f46756e6963756c61723a2043616e6e6f7420757064617465206d617857616c6c6044820152756574416d6f756e7420746f2073616d652076616c756560501b6064820152608401610991565b60095460405182907f6d3e257c59a11116c3e97bb144abf5ba1a6a9da6bd509192ecf0d48f7be1fc7690600090a3600955565b6000546001600160a01b03163314610d845760405162461bcd60e51b8152600401610991906133be565b600060115411610de25760405162461bcd60e51b8152602060048201526024808201527f46756e6963756c61723a204c61756e6368206d7573742068617665206f6363756044820152631c9c995960e21b6064820152608401610991565b601054610100900460ff1615610e555760405162461bcd60e51b815260206004820152603260248201527f46756e6963756c61723a204c61756e636820746f6b656e73206861766520616c6044820152711c9958591e481899595b8818db185a5b595960721b6064820152608401610991565b600560125443610e659190613426565b11610ecb5760405162461bcd60e51b815260206004820152603060248201527f46756e6963756c61723a204f6e6c7920636c61696d206c61756e636820746f6b60448201526f0cadce640c2cce8cae440d8c2eadcc6d60831b6064820152608401610991565b306000908152600160205260409020546010805461ff001916610100179055601354811015610f575760405162461bcd60e51b815260206004820152603260248201527f46756e6963756c61723a2041207377617020616e64206c6971756966792068616044820152711cc8185b1c9958591e481bd8d8dd5c9c995960721b6064820152608401610991565b60138054600091829055903063a9059cbb610f7a6000546001600160a01b031690565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602481018590526044016020604051808303816000875af1158015610fc7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610feb9190613439565b9050801561102d5760408051308152602081018490527fb16273d5dd95f4997020a9e2e429331d472940f09fe08af28db9672639cc251d910160405180910390a15b505050565b6000546001600160a01b0316331461105c5760405162461bcd60e51b8152600401610991906133be565b6006805460ff60a01b191690556040516001906000907fa0f694e30e34d9f05d12691b612650129ed8888d1f93b25fa0cd92e4416a8338908290a3565b60003361095b8185856110ac8383611d9a565b6110b69190613456565b611f03565b6000546001600160a01b031633146110e55760405162461bcd60e51b8152600401610991906133be565b6001600160a01b03821660009081526016602052604090205481151560ff90911615150361117b5760405162461bcd60e51b815260206004820152603b60248201527f46756e6963756c61723a205468652073656c65637465642077616c6c6574206960448201527f7320616c72656164792073657420746f207468652076616c75652000000000006064820152608401610991565b6001600160a01b038216600081815260166020908152604091829020805460ff191685151590811790915591519182527fe70512a569cf898db2e20aa3b4cc3f0dd13377b82a493840d326ab5a1966687791015b60405180910390a25050565b6000546001600160a01b031633146112055760405162461bcd60e51b8152600401610991906133be565b6001600160a01b03811660009081526014602052604090205460ff166112775760405162461bcd60e51b815260206004820152602160248201527f46756e6963756c61723a204163636f756e74206973206e6f7420626c636f6b656044820152601960fa1b6064820152608401610991565b6001600160a01b038116600081815260146020526040808220805460ff19169055519091907f2f092974a5a89dc001cc04aa60bc3afe575e0b7444ef2197f7bb5714b51528ba908390a350565b6000546001600160a01b031633146112ee5760405162461bcd60e51b8152600401610991906133be565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b031633146113625760405162461bcd60e51b8152600401610991906133be565b600c546001600160a01b0384811691161461145b576001600160a01b0383166113e15760405162461bcd60e51b815260206004820152602b60248201527f46756e6963756c61723a20546865206c69717569646974793157616c6c65742060448201526a063616e6e6f7420626520360ac1b6064820152608401610991565b600c546040516f1b1a5c5d5a591a5d1e4c55d85b1b195d60821b81526001600160a01b0391821691851690601001604051908190038120907f4af24be54adc5e716fbcaa3fca0ad593e28dff90dffd49487c0a33b1547c6b5290600090a4600c80546001600160a01b0319166001600160a01b0385161790555b600d546001600160a01b03838116911614611554576001600160a01b0382166114da5760405162461bcd60e51b815260206004820152602b60248201527f46756e6963756c61723a20546865206c69717569646974793257616c6c65742060448201526a063616e6e6f7420626520360ac1b6064820152608401610991565b600d546040516f1b1a5c5d5a591a5d1e4c95d85b1b195d60821b81526001600160a01b0391821691841690601001604051908190038120907f4af24be54adc5e716fbcaa3fca0ad593e28dff90dffd49487c0a33b1547c6b5290600090a4600d80546001600160a01b0319166001600160a01b0384161790555b600e546001600160a01b0382811691161461102d576001600160a01b0381166115d35760405162461bcd60e51b815260206004820152602b60248201527f46756e6963756c61723a20546865206f7065726174696f6e7357616c6c65742060448201526a063616e6e6f7420626520360ac1b6064820152608401610991565b600e546040516f1bdc195c985d1a5bdb9cd5d85b1b195d60821b81526001600160a01b0391821691831690601001604051908190038120907f4af24be54adc5e716fbcaa3fca0ad593e28dff90dffd49487c0a33b1547c6b5290600090a4600e80546001600160a01b0383166001600160a01b0319909116179055505050565b6000546001600160a01b0316331461167d5760405162461bcd60e51b8152600401610991906133be565b61168a600f8484846125e2565b6040516c18985cd95199595ccb54d95b1b609a1b8152600d015b6040805191829003822060ff86811684528581166020850152841683830152905190917f0fc5b99eebb78c10fca186b25746da968ffa81b56e2a79e89fd5ed16f238b576919081900360600190a2505050565b6000546001600160a01b031633146117215760405162461bcd60e51b8152600401610991906133be565b6001600160a01b03821660009081526019602052604090205481151560ff9091161515036117615760405162461bcd60e51b815260040161099190613469565b6001600160a01b038216600081815260196020908152604091829020805460ff191685151590811790915591519182527ff5133f371b17bf21ce0df4ae2c1b6e11ca7c2f27257eb55282edb1ccfd4ecb2e91016111cf565b6000546001600160a01b031633146117e35760405162461bcd60e51b8152600401610991906133be565b6001600160a01b03811660009081526014602052604090205460ff161561185a5760405162461bcd60e51b815260206004820152602560248201527f46756e6963756c61723a204163636f756e7420697320616c726561647920626c6044820152641bd8dad95960da1b6064820152608401610991565b60105460ff16156118da576202a300601154426118779190613426565b106118da5760405162461bcd60e51b815260206004820152602d60248201527f46756e6963756c61723a2054696d6520746f20626c6f636b206163636f756e7460448201526c1cc81a185cc8195e1c1a5c9959609a1b6064820152608401610991565b6001600160a01b038116600081815260146020526040808220805460ff1916600190811790915590519092917f2f092974a5a89dc001cc04aa60bc3afe575e0b7444ef2197f7bb5714b51528ba91a350565b6000546001600160a01b031633146119565760405162461bcd60e51b8152600401610991906133be565b6001600160a01b03821660009081526018602052604090205481151560ff9091161515036119965760405162461bcd60e51b815260040161099190613469565b6001600160a01b038216600081815260186020908152604091829020805460ff191685151590811790915591519182527f30098fc83ab61b1a98835d32c4e611adedccfc260eeef586bd329d48e8a40a4091016111cf565b6060600580546108ca90613384565b60003381611a0b8286611d9a565b905083811015611a6b5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610991565b610c828286868403611f03565b60003361095b8185856120a1565b6000546001600160a01b03163314611ab05760405162461bcd60e51b8152600401610991906133be565b600b548103611b275760405162461bcd60e51b815260206004820152603e60248201527f46756e6963756c61723a2043616e6e6f7420757064617465206d696e696d756d60448201527f546f6b656e734265666f72655377617020746f2073616d652076616c756500006064820152608401610991565b600b5460405182907f5b0491f767c1463bea8972339f785795be1a38784cc6483cf649cdcbb28c46b090600090a3600b55565b6000546001600160a01b03163314611b845760405162461bcd60e51b8152600401610991906133be565b6006546001600160a01b0390811690821603611bf95760405162461bcd60e51b815260206004820152602e60248201527f46756e6963756c61723a2054686520726f7574657220616c726561647920686160448201526d732074686174206164647265737360901b6064820152608401610991565b6006546040516001600160a01b03918216918316907f2afbff3ed601a8723765c7072d8ea8445e08f6f1874afd34a2b747a272c3ebad90600090a3600680546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314611c805760405162461bcd60e51b8152600401610991906133be565b6001600160a01b03821660009081526017602052604090205481151560ff909116151503611cc05760405162461bcd60e51b815260040161099190613469565b6001600160a01b038216600081815260176020908152604091829020805460ff191685151590811790915591519182527fa856ba9fdc54a5434b2359874c95612f520a2d7f858864ae98d15c1b2099ca8b91016111cf565b6000546001600160a01b03163314611d425760405162461bcd60e51b8152600401610991906133be565b6001600160a01b038216600081815260156020908152604091829020805460ff191685151590811790915591519182527fcb9f97b7b4b41413e5c8d418a8cf9a88db1cf34dee66b213d070faf881d9d35091016111cf565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b6000546001600160a01b03163314611def5760405162461bcd60e51b8152600401610991906133be565b611dfc600f848484612799565b6040516b62617365466565732d42757960a01b8152600c016116a4565b6000546001600160a01b03163314611e435760405162461bcd60e51b8152600401610991906133be565b6001600160a01b038116611ea85760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610991565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b038316611f655760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610991565b6001600160a01b038216611fc65760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610991565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60006120338484611d9a565b9050600019811461209b578181101561208e5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610991565b61209b8484848403611f03565b50505050565b6001600160a01b0383166120c75760405162461bcd60e51b8152600401610991906134be565b6001600160a01b0382166120ed5760405162461bcd60e51b815260040161099190613503565b806000036121015761102d8383600061294d565b6001600160a01b03831660009081526015602052604090205460ff1615801561214357506001600160a01b03821660009081526015602052604090205460ff16155b156123f957600654600160a01b900460ff166121b35760405162461bcd60e51b815260206004820152602960248201527f46756e6963756c61723a2054726164696e672069732063757272656e746c79206044820152683234b9b0b13632b21760b91b6064820152608401610991565b6001600160a01b03821660009081526014602052604090205460ff161561221c5760405162461bcd60e51b815260206004820152601d60248201527f46756e6963756c61723a204163636f756e7420697320626c6f636b65640000006044820152606401610991565b6001600160a01b03831660009081526014602052604090205460ff16156122855760405162461bcd60e51b815260206004820152601d60248201527f46756e6963756c61723a204163636f756e7420697320626c6f636b65640000006044820152606401610991565b6001600160a01b03821660009081526018602052604090205460ff161580156122c757506001600160a01b03831660009081526018602052604090205460ff16155b15612338576008548111156123385760405162461bcd60e51b815260206004820152603160248201527f46756e6963756c61723a2042757920616d6f756e742065786365656473207468604482015270329036b0bc2a3c213abca0b6b7bab73a1760791b6064820152608401610991565b6001600160a01b03821660009081526019602052604090205460ff166123f9576009548161237b846001600160a01b031660009081526001602052604090205490565b6123859190613456565b11156123f95760405162461bcd60e51b815260206004820152603e60248201527f46756e6963756c61723a2045787065637465642077616c6c657420616d6f756e60448201527f74206578636565647320746865206d617857616c6c6574416d6f756e742e00006064820152608401610991565b6001600160a01b038084166000908152601a602052604080822054928516825290205461242e9160ff90811691168585612a7e565b600b543060009081526001602052604090205460065491111590600160a01b900460ff16801561245b5750805b801561246a5750600a5460ff16155b80156124815750601b546301000000900460ff1615155b80156124a557506001600160a01b0383166000908152601a602052604090205460ff165b156124ca57600a805460ff191660011790556124bf612ca6565b600a805460ff191690555b600a5460009060ff161580156124e95750600654600160a01b900460ff165b6001600160a01b03861660009081526017602052604090205490915060ff168061252b57506001600160a01b03841660009081526017602052604090205460ff165b15612534575060005b80801561254c5750601b546301000000900460ff1615155b156125d057601b5460009060649061256e906301000000900460ff1686613546565b6125789190613573565b90506125848185613426565b935060006011541180156125a657506005601254436125a39190613426565b11155b156125c35780601360008282546125bd9190613456565b90915550505b6125ce86308361294d565b505b6125db85858561294d565b5050505050565b835460ff848116600160c01b909204161461267257604051721b1a5c5d5a591a5d1e4c51995953db94d95b1b606a1b81526013016040519081900381208554909160ff600160c01b8304811692908716916000805160206136a8833981519152916126539160489190911b90613587565b60405180910390a4835460ff60c01b1916600160c01b60ff8516021784555b835460ff838116600160d01b909204161461270257604051721b1a5c5d5a591a5d1e4c91995953db94d95b1b606a1b81526013016040519081900381208554909160ff600160d01b8304811692908616916000805160206136a8833981519152916126e39160489190911b90613587565b60405180910390a4835460ff60d01b1916600160d01b60ff8416021784555b835460ff828116600160e01b909204161461209b57604051721bdc195c985d1a5bdb9cd1995953db94d95b1b606a1b81526013016040519081900381208554909160ff600160e01b8304811692908516916000805160206136a8833981519152916127739160489190911b90613587565b60405180910390a4835460ff8216600160e01b0260ff60e01b1990911617845550505050565b835460ff848116600160b81b909204161461282857604051716c6971756964697479314665654f6e42757960701b81526012016040519081900381208554909160ff600160b81b8304811692908716916000805160206136a8833981519152916128099160489190911b90613587565b60405180910390a4835460ff60b81b1916600160b81b60ff8516021784555b835460ff838116600160c81b90920416146128b757604051716c6971756964697479324665654f6e42757960701b81526012016040519081900381208554909160ff600160c81b8304811692908616916000805160206136a8833981519152916128989160489190911b90613587565b60405180910390a4835460ff60c81b1916600160c81b60ff8416021784555b835460ff828116600160d81b909204161461209b57604051716f7065726174696f6e734665654f6e42757960701b81526012016040519081900381208554909160ff600160d81b8304811692908516916000805160206136a8833981519152916129279160489190911b90613587565b60405180910390a4835460ff8216600160d81b0260ff60d81b1990911617845550505050565b6001600160a01b0383166129735760405162461bcd60e51b8152600401610991906134be565b6001600160a01b0382166129995760405162461bcd60e51b815260040161099190613503565b6001600160a01b03831660009081526001602052604090205481811015612a115760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610991565b6001600160a01b0380851660008181526001602052604080822086860390559286168082529083902080548601905591517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90612a719086815260200190565b60405180910390a361209b565b601b805462ffffff191690558315612b0e5760105460ff168015612ab05750600560125442612aad9190613426565b11155b15612ac757601b805460ff19166064179055612b0e565b600f54601b8054600160b81b830460ff90811661ffff1990921691909117610100600160c81b85048316021762ff00001916600160d81b9093041662010000029190911790555b8215612b5b57600f54601b8054600160c01b830460ff90811661ffff1990921691909117610100600160d01b85048316021762ff00001916600160e01b9093041662010000029190911790555b82158015612b67575083155b8015612bad57506001600160a01b03821660009081526016602052604090205460ff1680612bad57506001600160a01b03811660009081526016602052604090205460ff165b15612bf957600f54601b8054600160b81b830460ff90811661ffff1990921691909117610100600160c81b85048316021762ff00001916600160d81b9093041662010000029190911790555b601b5460ff620100008204811691612c199161010082048116911661359e565b612c23919061359e565b601b805460ff928316630100000090810263ff000000198316811793849055604080519186169386169390931781526101008404851660208201526201000084048516818401529204909216606082015290517fe732842e0997f2bd5f26f9b53d4f761dfb12c53c4352fa949eb7b4d8522dd25b9181900360800190a150505050565b30600090815260016020526040812054601b549091479160029060ff63010000008204811691612cd7911686613546565b612ce19190613573565b612ceb9190613573565b90506000612cf98285613426565b9050612d0481612e3b565b6000612d108447613426565b601b54909150600090612d289060029060ff166135b7565b601b54612d3f91906301000000900460ff166135d9565b601b5460ff91821692506000916002918491612d5c911686613546565b612d669190613573565b612d709190613573565b601b549091506000908390612d8d90610100900460ff1686613546565b612d979190613573565b90506000612da58284613456565b612daf9086613426565b600e54909150612dc8906001600160a01b031682612f95565b600d54612dde906001600160a01b031683612f95565b8615612e3057612dee87846130ae565b60408051878152602081018590529081018890527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a15b505050505050505050565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110612e7057612e706135f2565b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015612ec9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612eed91906133f3565b81600181518110612f0057612f006135f2565b6001600160a01b039283166020918202929092010152600654612f269130911684611f03565b60065460405163791ac94760e01b81526001600160a01b039091169063791ac94790612f5f908590600190869030904290600401613608565b600060405180830381600087803b158015612f7957600080fd5b505af1158015612f8d573d6000803e3d6000fd5b505050505050565b80471015612fe55760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610991565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114613032576040519150601f19603f3d011682016040523d82523d6000602084013e613037565b606091505b505090508061102d5760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610991565b6006546130c69030906001600160a01b031684611f03565b600654600c5460405163f305d71960e01b81523060048201526024810185905260016044820181905260648201526001600160a01b0391821660848201524260a482015291169063f305d71990839060c40160606040518083038185885af1158015613136573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906125db9190613679565b600060208083528351808285015260005b818110156131885785810183015185820160400152820161316c565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b03811681146131be57600080fd5b50565b600080604083850312156131d457600080fd5b82356131df816131a9565b946020939093013593505050565b6000602082840312156131ff57600080fd5b5035919050565b60008060006060848603121561321b57600080fd5b8335613226816131a9565b92506020840135613236816131a9565b929592945050506040919091013590565b80151581146131be57600080fd5b6000806040838503121561326857600080fd5b8235613273816131a9565b9150602083013561328381613247565b809150509250929050565b6000602082840312156132a057600080fd5b81356132ab816131a9565b9392505050565b6000806000606084860312156132c757600080fd5b83356132d2816131a9565b925060208401356132e2816131a9565b915060408401356132f2816131a9565b809150509250925092565b803560ff8116811461330e57600080fd5b919050565b60008060006060848603121561332857600080fd5b613331846132fd565b925061333f602085016132fd565b915061334d604085016132fd565b90509250925092565b6000806040838503121561336957600080fd5b8235613374816131a9565b91506020830135613283816131a9565b600181811c9082168061339857607f821691505b6020821081036133b857634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60006020828403121561340557600080fd5b81516132ab816131a9565b634e487b7160e01b600052601160045260246000fd5b8181038181111561096157610961613410565b60006020828403121561344b57600080fd5b81516132ab81613247565b8082018082111561096157610961613410565b60208082526035908201527f46756e6963756c61723a204163636f756e7420697320616c7265616479207468604082015274652076616c7565206f6620276578636c756465642760581b606082015260800190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b808202811582820484141761096157610961613410565b634e487b7160e01b600052601260045260246000fd5b6000826135825761358261355d565b500490565b68ffffffffffffffffff1991909116815260200190565b60ff818116838216019081111561096157610961613410565b600060ff8316806135ca576135ca61355d565b8060ff84160491505092915050565b60ff828116828216039081111561096157610961613410565b634e487b7160e01b600052603260045260246000fd5b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156136585784516001600160a01b031683529383019391830191600101613633565b50506001600160a01b03969096166060850152505050608001529392505050565b60008060006060848603121561368e57600080fd5b835192506020840151915060408401519050925092509256fe00edc71549f0cbe47086c2237ce0cf874d6897fd1d7ce43ee6b65c0230d7606ea26469706673582212206312b33f7498be54c0aa1228cd3afbca6ef6f4cc3d02abd92eb2e5eab178b6b564736f6c63430008110033

Deployed Bytecode

0x60806040526004361061028c5760003560e01c806375cb1bd11161015a578063aee50b1e116100c1578063d32215761161007a578063d3221576146107e7578063dd62ed3e14610807578063e625724614610827578063f2fde38b14610847578063fd72e22a14610867578063fe0175351461088757600080fd5b8063aee50b1e146106ed578063b62496f51461070d578063bea9849e1461073d578063c02466681461075d578063cd43e2281461077d578063d2d7ad83146107d157600080fd5b80638da5cb5b116101135780638da5cb5b14610644578063924241e31461066257806395d89b4114610682578063a457c2d714610697578063a9059cbb146106b7578063aa4bde28146106d757600080fd5b806375cb1bd11461058e57806376dca835146105ae578063781edb3c146105ce5780637c0a893d146105ee578063880bcbc11461060e5780638c0b5e221461062e57600080fd5b806327a14fc2116101fe57806345a42329116101b757806345a42329146104af57806349bd5a5e146104cf5780634d78fdc6146105035780634f225e6d1461052357806370a0823114610543578063715018a61461057957600080fd5b806327a14fc2146104135780632cc25d1414610433578063313ce5671461044857806334cf1fea14610464578063378dc3dc14610479578063395093511461048f57600080fd5b806314fbc5f31161025057806314fbc5f3146103475780631694505e1461036657806318160ddd1461039e5780631e293c10146103bd5780631fcfefcd146103dd57806323b872dd146103f357600080fd5b8063064a59d01461029857806306fdde03146102ce578063095ea7b3146102f0578063098df585146103105780630bd05b691461033257600080fd5b3661029357005b600080fd5b3480156102a457600080fd5b506006546102b990600160a01b900460ff1681565b60405190151581526020015b60405180910390f35b3480156102da57600080fd5b506102e36108bb565b6040516102c5919061315b565b3480156102fc57600080fd5b506102b961030b3660046131c1565b61094d565b34801561031c57600080fd5b5061033061032b3660046131ed565b610967565b005b34801561033e57600080fd5b50610330610b13565b34801561035357600080fd5b506010546102b990610100900460ff1681565b34801561037257600080fd5b50600654610386906001600160a01b031681565b6040516001600160a01b0390911681526020016102c5565b3480156103aa57600080fd5b506003545b6040519081526020016102c5565b3480156103c957600080fd5b506103306103d83660046131ed565b610ba0565b3480156103e957600080fd5b506103af60135481565b3480156103ff57600080fd5b506102b961040e366004613206565b610c69565b34801561041f57600080fd5b5061033061042e3660046131ed565b610c8d565b34801561043f57600080fd5b50610330610d5a565b34801561045457600080fd5b50604051601281526020016102c5565b34801561047057600080fd5b50610330611032565b34801561048557600080fd5b506103af60075481565b34801561049b57600080fd5b506102b96104aa3660046131c1565b611099565b3480156104bb57600080fd5b506103306104ca366004613255565b6110bb565b3480156104db57600080fd5b506103867f000000000000000000000000aa85a90b2d53f9aa3b3ec56d0dd45b6794cb485881565b34801561050f57600080fd5b5061033061051e36600461328e565b6111db565b34801561052f57600080fd5b50600d54610386906001600160a01b031681565b34801561054f57600080fd5b506103af61055e36600461328e565b6001600160a01b031660009081526001602052604090205490565b34801561058557600080fd5b506103306112c4565b34801561059a57600080fd5b506103306105a93660046132b2565b611338565b3480156105ba57600080fd5b506103306105c9366004613313565b611653565b3480156105da57600080fd5b506103306105e9366004613255565b6116f7565b3480156105fa57600080fd5b5061033061060936600461328e565b6117b9565b34801561061a57600080fd5b50610330610629366004613255565b61192c565b34801561063a57600080fd5b506103af60085481565b34801561065057600080fd5b506000546001600160a01b0316610386565b34801561066e57600080fd5b50600c54610386906001600160a01b031681565b34801561068e57600080fd5b506102e36119ee565b3480156106a357600080fd5b506102b96106b23660046131c1565b6119fd565b3480156106c357600080fd5b506102b96106d23660046131c1565b611a78565b3480156106e357600080fd5b506103af60095481565b3480156106f957600080fd5b506103306107083660046131ed565b611a86565b34801561071957600080fd5b506102b961072836600461328e565b601a6020526000908152604090205460ff1681565b34801561074957600080fd5b5061033061075836600461328e565b611b5a565b34801561076957600080fd5b50610330610778366004613255565b611c56565b34801561078957600080fd5b50600f5460ff600160b81b8204811691600160c81b8104821691600160d81b909104165b6040805160ff948516815292841660208401529216918101919091526060016102c5565b3480156107dd57600080fd5b506103af600b5481565b3480156107f357600080fd5b50610330610802366004613255565b611d18565b34801561081357600080fd5b506103af610822366004613356565b611d9a565b34801561083357600080fd5b50610330610842366004613313565b611dc5565b34801561085357600080fd5b5061033061086236600461328e565b611e19565b34801561087357600080fd5b50600e54610386906001600160a01b031681565b34801561089357600080fd5b50600f5460ff600160c01b8204811691600160d01b8104821691600160e01b909104166107ad565b6060600480546108ca90613384565b80601f01602080910402602001604051908101604052809291908181526020018280546108f690613384565b80156109435780601f1061091857610100808354040283529160200191610943565b820191906000526020600020905b81548152906001019060200180831161092657829003601f168201915b5050505050905090565b60003361095b818585611f03565b60019150505b92915050565b6000546001600160a01b0316331461099a5760405162461bcd60e51b8152600401610991906133be565b60405180910390fd5b47811115610a045760405162461bcd60e51b815260206004820152603160248201527f46756e6963756c61723a2043616e6e6f742073656e64206d6f7265207468616e60448201527020636f6e74726163742062616c616e636560781b6064820152608401610991565b600080546040516001600160a01b039091169083908381818185875af1925050503d8060008114610a51576040519150601f19603f3d011682016040523d82523d6000602084013e610a56565b606091505b505090508015610b0f57600654604080516315ab88c960e31b815290517fb16273d5dd95f4997020a9e2e429331d472940f09fe08af28db9672639cc251d926001600160a01b03169163ad5c46489160048083019260209291908290030181865afa158015610ac9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aed91906133f3565b604080516001600160a01b039092168252602082018590520160405180910390a15b5050565b6000546001600160a01b03163314610b3d5760405162461bcd60e51b8152600401610991906133be565b6006805460ff60a01b1916600160a01b179055601254600003610b705743601255426011556010805460ff191660011790555b6040516000906001907fa0f694e30e34d9f05d12691b612650129ed8888d1f93b25fa0cd92e4416a8338908390a3565b6000546001600160a01b03163314610bca5760405162461bcd60e51b8152600401610991906133be565b6008548103610c365760405162461bcd60e51b815260206004820152603260248201527f46756e6963756c61723a2043616e6e6f7420757064617465206d61785478416d6044820152716f756e7420746f2073616d652076616c756560701b6064820152608401610991565b60085460405182907f75f1c17bf623f0f7a2bd91ba61e89dff216960370e3e9a46b250750d03e4215e90600090a3600855565b600033610c77858285612027565b610c828585856120a1565b506001949350505050565b6000546001600160a01b03163314610cb75760405162461bcd60e51b8152600401610991906133be565b6009548103610d275760405162461bcd60e51b815260206004820152603660248201527f46756e6963756c61723a2043616e6e6f7420757064617465206d617857616c6c6044820152756574416d6f756e7420746f2073616d652076616c756560501b6064820152608401610991565b60095460405182907f6d3e257c59a11116c3e97bb144abf5ba1a6a9da6bd509192ecf0d48f7be1fc7690600090a3600955565b6000546001600160a01b03163314610d845760405162461bcd60e51b8152600401610991906133be565b600060115411610de25760405162461bcd60e51b8152602060048201526024808201527f46756e6963756c61723a204c61756e6368206d7573742068617665206f6363756044820152631c9c995960e21b6064820152608401610991565b601054610100900460ff1615610e555760405162461bcd60e51b815260206004820152603260248201527f46756e6963756c61723a204c61756e636820746f6b656e73206861766520616c6044820152711c9958591e481899595b8818db185a5b595960721b6064820152608401610991565b600560125443610e659190613426565b11610ecb5760405162461bcd60e51b815260206004820152603060248201527f46756e6963756c61723a204f6e6c7920636c61696d206c61756e636820746f6b60448201526f0cadce640c2cce8cae440d8c2eadcc6d60831b6064820152608401610991565b306000908152600160205260409020546010805461ff001916610100179055601354811015610f575760405162461bcd60e51b815260206004820152603260248201527f46756e6963756c61723a2041207377617020616e64206c6971756966792068616044820152711cc8185b1c9958591e481bd8d8dd5c9c995960721b6064820152608401610991565b60138054600091829055903063a9059cbb610f7a6000546001600160a01b031690565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602481018590526044016020604051808303816000875af1158015610fc7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610feb9190613439565b9050801561102d5760408051308152602081018490527fb16273d5dd95f4997020a9e2e429331d472940f09fe08af28db9672639cc251d910160405180910390a15b505050565b6000546001600160a01b0316331461105c5760405162461bcd60e51b8152600401610991906133be565b6006805460ff60a01b191690556040516001906000907fa0f694e30e34d9f05d12691b612650129ed8888d1f93b25fa0cd92e4416a8338908290a3565b60003361095b8185856110ac8383611d9a565b6110b69190613456565b611f03565b6000546001600160a01b031633146110e55760405162461bcd60e51b8152600401610991906133be565b6001600160a01b03821660009081526016602052604090205481151560ff90911615150361117b5760405162461bcd60e51b815260206004820152603b60248201527f46756e6963756c61723a205468652073656c65637465642077616c6c6574206960448201527f7320616c72656164792073657420746f207468652076616c75652000000000006064820152608401610991565b6001600160a01b038216600081815260166020908152604091829020805460ff191685151590811790915591519182527fe70512a569cf898db2e20aa3b4cc3f0dd13377b82a493840d326ab5a1966687791015b60405180910390a25050565b6000546001600160a01b031633146112055760405162461bcd60e51b8152600401610991906133be565b6001600160a01b03811660009081526014602052604090205460ff166112775760405162461bcd60e51b815260206004820152602160248201527f46756e6963756c61723a204163636f756e74206973206e6f7420626c636f6b656044820152601960fa1b6064820152608401610991565b6001600160a01b038116600081815260146020526040808220805460ff19169055519091907f2f092974a5a89dc001cc04aa60bc3afe575e0b7444ef2197f7bb5714b51528ba908390a350565b6000546001600160a01b031633146112ee5760405162461bcd60e51b8152600401610991906133be565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b031633146113625760405162461bcd60e51b8152600401610991906133be565b600c546001600160a01b0384811691161461145b576001600160a01b0383166113e15760405162461bcd60e51b815260206004820152602b60248201527f46756e6963756c61723a20546865206c69717569646974793157616c6c65742060448201526a063616e6e6f7420626520360ac1b6064820152608401610991565b600c546040516f1b1a5c5d5a591a5d1e4c55d85b1b195d60821b81526001600160a01b0391821691851690601001604051908190038120907f4af24be54adc5e716fbcaa3fca0ad593e28dff90dffd49487c0a33b1547c6b5290600090a4600c80546001600160a01b0319166001600160a01b0385161790555b600d546001600160a01b03838116911614611554576001600160a01b0382166114da5760405162461bcd60e51b815260206004820152602b60248201527f46756e6963756c61723a20546865206c69717569646974793257616c6c65742060448201526a063616e6e6f7420626520360ac1b6064820152608401610991565b600d546040516f1b1a5c5d5a591a5d1e4c95d85b1b195d60821b81526001600160a01b0391821691841690601001604051908190038120907f4af24be54adc5e716fbcaa3fca0ad593e28dff90dffd49487c0a33b1547c6b5290600090a4600d80546001600160a01b0319166001600160a01b0384161790555b600e546001600160a01b0382811691161461102d576001600160a01b0381166115d35760405162461bcd60e51b815260206004820152602b60248201527f46756e6963756c61723a20546865206f7065726174696f6e7357616c6c65742060448201526a063616e6e6f7420626520360ac1b6064820152608401610991565b600e546040516f1bdc195c985d1a5bdb9cd5d85b1b195d60821b81526001600160a01b0391821691831690601001604051908190038120907f4af24be54adc5e716fbcaa3fca0ad593e28dff90dffd49487c0a33b1547c6b5290600090a4600e80546001600160a01b0383166001600160a01b0319909116179055505050565b6000546001600160a01b0316331461167d5760405162461bcd60e51b8152600401610991906133be565b61168a600f8484846125e2565b6040516c18985cd95199595ccb54d95b1b609a1b8152600d015b6040805191829003822060ff86811684528581166020850152841683830152905190917f0fc5b99eebb78c10fca186b25746da968ffa81b56e2a79e89fd5ed16f238b576919081900360600190a2505050565b6000546001600160a01b031633146117215760405162461bcd60e51b8152600401610991906133be565b6001600160a01b03821660009081526019602052604090205481151560ff9091161515036117615760405162461bcd60e51b815260040161099190613469565b6001600160a01b038216600081815260196020908152604091829020805460ff191685151590811790915591519182527ff5133f371b17bf21ce0df4ae2c1b6e11ca7c2f27257eb55282edb1ccfd4ecb2e91016111cf565b6000546001600160a01b031633146117e35760405162461bcd60e51b8152600401610991906133be565b6001600160a01b03811660009081526014602052604090205460ff161561185a5760405162461bcd60e51b815260206004820152602560248201527f46756e6963756c61723a204163636f756e7420697320616c726561647920626c6044820152641bd8dad95960da1b6064820152608401610991565b60105460ff16156118da576202a300601154426118779190613426565b106118da5760405162461bcd60e51b815260206004820152602d60248201527f46756e6963756c61723a2054696d6520746f20626c6f636b206163636f756e7460448201526c1cc81a185cc8195e1c1a5c9959609a1b6064820152608401610991565b6001600160a01b038116600081815260146020526040808220805460ff1916600190811790915590519092917f2f092974a5a89dc001cc04aa60bc3afe575e0b7444ef2197f7bb5714b51528ba91a350565b6000546001600160a01b031633146119565760405162461bcd60e51b8152600401610991906133be565b6001600160a01b03821660009081526018602052604090205481151560ff9091161515036119965760405162461bcd60e51b815260040161099190613469565b6001600160a01b038216600081815260186020908152604091829020805460ff191685151590811790915591519182527f30098fc83ab61b1a98835d32c4e611adedccfc260eeef586bd329d48e8a40a4091016111cf565b6060600580546108ca90613384565b60003381611a0b8286611d9a565b905083811015611a6b5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610991565b610c828286868403611f03565b60003361095b8185856120a1565b6000546001600160a01b03163314611ab05760405162461bcd60e51b8152600401610991906133be565b600b548103611b275760405162461bcd60e51b815260206004820152603e60248201527f46756e6963756c61723a2043616e6e6f7420757064617465206d696e696d756d60448201527f546f6b656e734265666f72655377617020746f2073616d652076616c756500006064820152608401610991565b600b5460405182907f5b0491f767c1463bea8972339f785795be1a38784cc6483cf649cdcbb28c46b090600090a3600b55565b6000546001600160a01b03163314611b845760405162461bcd60e51b8152600401610991906133be565b6006546001600160a01b0390811690821603611bf95760405162461bcd60e51b815260206004820152602e60248201527f46756e6963756c61723a2054686520726f7574657220616c726561647920686160448201526d732074686174206164647265737360901b6064820152608401610991565b6006546040516001600160a01b03918216918316907f2afbff3ed601a8723765c7072d8ea8445e08f6f1874afd34a2b747a272c3ebad90600090a3600680546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314611c805760405162461bcd60e51b8152600401610991906133be565b6001600160a01b03821660009081526017602052604090205481151560ff909116151503611cc05760405162461bcd60e51b815260040161099190613469565b6001600160a01b038216600081815260176020908152604091829020805460ff191685151590811790915591519182527fa856ba9fdc54a5434b2359874c95612f520a2d7f858864ae98d15c1b2099ca8b91016111cf565b6000546001600160a01b03163314611d425760405162461bcd60e51b8152600401610991906133be565b6001600160a01b038216600081815260156020908152604091829020805460ff191685151590811790915591519182527fcb9f97b7b4b41413e5c8d418a8cf9a88db1cf34dee66b213d070faf881d9d35091016111cf565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b6000546001600160a01b03163314611def5760405162461bcd60e51b8152600401610991906133be565b611dfc600f848484612799565b6040516b62617365466565732d42757960a01b8152600c016116a4565b6000546001600160a01b03163314611e435760405162461bcd60e51b8152600401610991906133be565b6001600160a01b038116611ea85760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610991565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b038316611f655760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610991565b6001600160a01b038216611fc65760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610991565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60006120338484611d9a565b9050600019811461209b578181101561208e5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610991565b61209b8484848403611f03565b50505050565b6001600160a01b0383166120c75760405162461bcd60e51b8152600401610991906134be565b6001600160a01b0382166120ed5760405162461bcd60e51b815260040161099190613503565b806000036121015761102d8383600061294d565b6001600160a01b03831660009081526015602052604090205460ff1615801561214357506001600160a01b03821660009081526015602052604090205460ff16155b156123f957600654600160a01b900460ff166121b35760405162461bcd60e51b815260206004820152602960248201527f46756e6963756c61723a2054726164696e672069732063757272656e746c79206044820152683234b9b0b13632b21760b91b6064820152608401610991565b6001600160a01b03821660009081526014602052604090205460ff161561221c5760405162461bcd60e51b815260206004820152601d60248201527f46756e6963756c61723a204163636f756e7420697320626c6f636b65640000006044820152606401610991565b6001600160a01b03831660009081526014602052604090205460ff16156122855760405162461bcd60e51b815260206004820152601d60248201527f46756e6963756c61723a204163636f756e7420697320626c6f636b65640000006044820152606401610991565b6001600160a01b03821660009081526018602052604090205460ff161580156122c757506001600160a01b03831660009081526018602052604090205460ff16155b15612338576008548111156123385760405162461bcd60e51b815260206004820152603160248201527f46756e6963756c61723a2042757920616d6f756e742065786365656473207468604482015270329036b0bc2a3c213abca0b6b7bab73a1760791b6064820152608401610991565b6001600160a01b03821660009081526019602052604090205460ff166123f9576009548161237b846001600160a01b031660009081526001602052604090205490565b6123859190613456565b11156123f95760405162461bcd60e51b815260206004820152603e60248201527f46756e6963756c61723a2045787065637465642077616c6c657420616d6f756e60448201527f74206578636565647320746865206d617857616c6c6574416d6f756e742e00006064820152608401610991565b6001600160a01b038084166000908152601a602052604080822054928516825290205461242e9160ff90811691168585612a7e565b600b543060009081526001602052604090205460065491111590600160a01b900460ff16801561245b5750805b801561246a5750600a5460ff16155b80156124815750601b546301000000900460ff1615155b80156124a557506001600160a01b0383166000908152601a602052604090205460ff165b156124ca57600a805460ff191660011790556124bf612ca6565b600a805460ff191690555b600a5460009060ff161580156124e95750600654600160a01b900460ff165b6001600160a01b03861660009081526017602052604090205490915060ff168061252b57506001600160a01b03841660009081526017602052604090205460ff165b15612534575060005b80801561254c5750601b546301000000900460ff1615155b156125d057601b5460009060649061256e906301000000900460ff1686613546565b6125789190613573565b90506125848185613426565b935060006011541180156125a657506005601254436125a39190613426565b11155b156125c35780601360008282546125bd9190613456565b90915550505b6125ce86308361294d565b505b6125db85858561294d565b5050505050565b835460ff848116600160c01b909204161461267257604051721b1a5c5d5a591a5d1e4c51995953db94d95b1b606a1b81526013016040519081900381208554909160ff600160c01b8304811692908716916000805160206136a8833981519152916126539160489190911b90613587565b60405180910390a4835460ff60c01b1916600160c01b60ff8516021784555b835460ff838116600160d01b909204161461270257604051721b1a5c5d5a591a5d1e4c91995953db94d95b1b606a1b81526013016040519081900381208554909160ff600160d01b8304811692908616916000805160206136a8833981519152916126e39160489190911b90613587565b60405180910390a4835460ff60d01b1916600160d01b60ff8416021784555b835460ff828116600160e01b909204161461209b57604051721bdc195c985d1a5bdb9cd1995953db94d95b1b606a1b81526013016040519081900381208554909160ff600160e01b8304811692908516916000805160206136a8833981519152916127739160489190911b90613587565b60405180910390a4835460ff8216600160e01b0260ff60e01b1990911617845550505050565b835460ff848116600160b81b909204161461282857604051716c6971756964697479314665654f6e42757960701b81526012016040519081900381208554909160ff600160b81b8304811692908716916000805160206136a8833981519152916128099160489190911b90613587565b60405180910390a4835460ff60b81b1916600160b81b60ff8516021784555b835460ff838116600160c81b90920416146128b757604051716c6971756964697479324665654f6e42757960701b81526012016040519081900381208554909160ff600160c81b8304811692908616916000805160206136a8833981519152916128989160489190911b90613587565b60405180910390a4835460ff60c81b1916600160c81b60ff8416021784555b835460ff828116600160d81b909204161461209b57604051716f7065726174696f6e734665654f6e42757960701b81526012016040519081900381208554909160ff600160d81b8304811692908516916000805160206136a8833981519152916129279160489190911b90613587565b60405180910390a4835460ff8216600160d81b0260ff60d81b1990911617845550505050565b6001600160a01b0383166129735760405162461bcd60e51b8152600401610991906134be565b6001600160a01b0382166129995760405162461bcd60e51b815260040161099190613503565b6001600160a01b03831660009081526001602052604090205481811015612a115760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610991565b6001600160a01b0380851660008181526001602052604080822086860390559286168082529083902080548601905591517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90612a719086815260200190565b60405180910390a361209b565b601b805462ffffff191690558315612b0e5760105460ff168015612ab05750600560125442612aad9190613426565b11155b15612ac757601b805460ff19166064179055612b0e565b600f54601b8054600160b81b830460ff90811661ffff1990921691909117610100600160c81b85048316021762ff00001916600160d81b9093041662010000029190911790555b8215612b5b57600f54601b8054600160c01b830460ff90811661ffff1990921691909117610100600160d01b85048316021762ff00001916600160e01b9093041662010000029190911790555b82158015612b67575083155b8015612bad57506001600160a01b03821660009081526016602052604090205460ff1680612bad57506001600160a01b03811660009081526016602052604090205460ff165b15612bf957600f54601b8054600160b81b830460ff90811661ffff1990921691909117610100600160c81b85048316021762ff00001916600160d81b9093041662010000029190911790555b601b5460ff620100008204811691612c199161010082048116911661359e565b612c23919061359e565b601b805460ff928316630100000090810263ff000000198316811793849055604080519186169386169390931781526101008404851660208201526201000084048516818401529204909216606082015290517fe732842e0997f2bd5f26f9b53d4f761dfb12c53c4352fa949eb7b4d8522dd25b9181900360800190a150505050565b30600090815260016020526040812054601b549091479160029060ff63010000008204811691612cd7911686613546565b612ce19190613573565b612ceb9190613573565b90506000612cf98285613426565b9050612d0481612e3b565b6000612d108447613426565b601b54909150600090612d289060029060ff166135b7565b601b54612d3f91906301000000900460ff166135d9565b601b5460ff91821692506000916002918491612d5c911686613546565b612d669190613573565b612d709190613573565b601b549091506000908390612d8d90610100900460ff1686613546565b612d979190613573565b90506000612da58284613456565b612daf9086613426565b600e54909150612dc8906001600160a01b031682612f95565b600d54612dde906001600160a01b031683612f95565b8615612e3057612dee87846130ae565b60408051878152602081018590529081018890527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a15b505050505050505050565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110612e7057612e706135f2565b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015612ec9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612eed91906133f3565b81600181518110612f0057612f006135f2565b6001600160a01b039283166020918202929092010152600654612f269130911684611f03565b60065460405163791ac94760e01b81526001600160a01b039091169063791ac94790612f5f908590600190869030904290600401613608565b600060405180830381600087803b158015612f7957600080fd5b505af1158015612f8d573d6000803e3d6000fd5b505050505050565b80471015612fe55760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610991565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114613032576040519150601f19603f3d011682016040523d82523d6000602084013e613037565b606091505b505090508061102d5760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610991565b6006546130c69030906001600160a01b031684611f03565b600654600c5460405163f305d71960e01b81523060048201526024810185905260016044820181905260648201526001600160a01b0391821660848201524260a482015291169063f305d71990839060c40160606040518083038185885af1158015613136573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906125db9190613679565b600060208083528351808285015260005b818110156131885785810183015185820160400152820161316c565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b03811681146131be57600080fd5b50565b600080604083850312156131d457600080fd5b82356131df816131a9565b946020939093013593505050565b6000602082840312156131ff57600080fd5b5035919050565b60008060006060848603121561321b57600080fd5b8335613226816131a9565b92506020840135613236816131a9565b929592945050506040919091013590565b80151581146131be57600080fd5b6000806040838503121561326857600080fd5b8235613273816131a9565b9150602083013561328381613247565b809150509250929050565b6000602082840312156132a057600080fd5b81356132ab816131a9565b9392505050565b6000806000606084860312156132c757600080fd5b83356132d2816131a9565b925060208401356132e2816131a9565b915060408401356132f2816131a9565b809150509250925092565b803560ff8116811461330e57600080fd5b919050565b60008060006060848603121561332857600080fd5b613331846132fd565b925061333f602085016132fd565b915061334d604085016132fd565b90509250925092565b6000806040838503121561336957600080fd5b8235613374816131a9565b91506020830135613283816131a9565b600181811c9082168061339857607f821691505b6020821081036133b857634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60006020828403121561340557600080fd5b81516132ab816131a9565b634e487b7160e01b600052601160045260246000fd5b8181038181111561096157610961613410565b60006020828403121561344b57600080fd5b81516132ab81613247565b8082018082111561096157610961613410565b60208082526035908201527f46756e6963756c61723a204163636f756e7420697320616c7265616479207468604082015274652076616c7565206f6620276578636c756465642760581b606082015260800190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b808202811582820484141761096157610961613410565b634e487b7160e01b600052601260045260246000fd5b6000826135825761358261355d565b500490565b68ffffffffffffffffff1991909116815260200190565b60ff818116838216019081111561096157610961613410565b600060ff8316806135ca576135ca61355d565b8060ff84160491505092915050565b60ff828116828216039081111561096157610961613410565b634e487b7160e01b600052603260045260246000fd5b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156136585784516001600160a01b031683529383019391830191600101613633565b50506001600160a01b03969096166060850152505050608001529392505050565b60008060006060848603121561368e57600080fd5b835192506020840151915060408401519050925092509256fe00edc71549f0cbe47086c2237ce0cf874d6897fd1d7ce43ee6b65c0230d7606ea26469706673582212206312b33f7498be54c0aa1228cd3afbca6ef6f4cc3d02abd92eb2e5eab178b6b564736f6c63430008110033

Deployed Bytecode Sourcemap

12438:19618:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12715:28;;;;;;;;;;-1:-1:-1;12715:28:0;;;;-1:-1:-1;;;12715:28:0;;;;;;;;;179:14:1;;172:22;154:41;;142:2;127:18;12715:28:0;;;;;;;;7103:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;8034:201::-;;;;;;;;;;-1:-1:-1;8034:201:0;;;;;:::i;:::-;;:::i;23937:345::-;;;;;;;;;;-1:-1:-1;23937:345:0;;;;;:::i;:::-;;:::i;:::-;;17169:321;;;;;;;;;;;;;:::i;13659:32::-;;;;;;;;;;-1:-1:-1;13659:32:0;;;;;;;;;;;12521:30;;;;;;;;;;-1:-1:-1;12521:30:0;;;;-1:-1:-1;;;;;12521:30:0;;;;;;-1:-1:-1;;;;;1579:32:1;;;1561:51;;1549:2;1534:18;12521:30:0;1400:218:1;7423:108:0;;;;;;;;;;-1:-1:-1;7511:12:0;;7423:108;;;1769:25:1;;;1757:2;1742:18;7423:108:0;1623:177:1;22308:273:0;;;;;;;;;;-1:-1:-1;22308:273:0;;;;;:::i;:::-;;:::i;13783:27::-;;;;;;;;;;;;;;;;8245:295;;;;;;;;;;-1:-1:-1;8245:295:0;;;;;:::i;:::-;;:::i;22587:278::-;;;;;;;;;;-1:-1:-1;22587:278:0;;;;;:::i;:::-;;:::i;23204:727::-;;;;;;;;;;;;;:::i;7322:93::-;;;;;;;;;;-1:-1:-1;7322:93:0;;7405:2;2408:36:1;;2396:2;2381:18;7322:93:0;2266:184:1;17496:139:0;;;;;;;;;;;;;:::i;12752:49::-;;;;;;;;;;;;;;;;8548:238;;;;;;;;;;-1:-1:-1;8548:238:0;;;;;:::i;:::-;;:::i;18832:349::-;;;;;;;;;;-1:-1:-1;18832:349:0;;;;;:::i;:::-;;:::i;12558:38::-;;;;;;;;;;;;;;;18592:234;;;;;;;;;;-1:-1:-1;18592:234:0;;;;;:::i;:::-;;:::i;13168:31::-;;;;;;;;;;-1:-1:-1;13168:31:0;;;;-1:-1:-1;;;;;13168:31:0;;;7539:127;;;;;;;;;;-1:-1:-1;7539:127:0;;;;;:::i;:::-;-1:-1:-1;;;;;7640:18:0;7613:7;7640:18;;;:9;:18;;;;;;;7539:127;6290:148;;;;;;;;;;;;;:::i;20208:1077::-;;;;;;;;;;-1:-1:-1;20208:1077:0;;;;;:::i;:::-;;:::i;21648:345::-;;;;;;;;;;-1:-1:-1;21648:345:0;;;;;:::i;:::-;;:::i;19861:341::-;;;;;;;;;;-1:-1:-1;19861:341:0;;;;;:::i;:::-;;:::i;18189:397::-;;;;;;;;;;-1:-1:-1;18189:397:0;;;;;:::i;:::-;;:::i;19497:358::-;;;;;;;;;;-1:-1:-1;19497:358:0;;;;;:::i;:::-;;:::i;12863:42::-;;;;;;;;;;;;;;;;6076:79;;;;;;;;;;-1:-1:-1;6114:7:0;6141:6;-1:-1:-1;;;;;6141:6:0;6076:79;;13130:31;;;;;;;;;;-1:-1:-1;13130:31:0;;;;-1:-1:-1;;;;;13130:31:0;;;7211:104;;;;;;;;;;;;;:::i;8794:436::-;;;;;;;;;;-1:-1:-1;8794:436:0;;;;;:::i;:::-;;:::i;7674:193::-;;;;;;;;;;-1:-1:-1;7674:193:0;;;;;:::i;:::-;;:::i;12956:60::-;;;;;;;;;;;;;;;;22871:327;;;;;;;;;;-1:-1:-1;22871:327:0;;;;;:::i;:::-;;:::i;14209:57::-;;;;;;;;;;-1:-1:-1;14209:57:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;21999:303;;;;;;;;;;-1:-1:-1;21999:303:0;;;;;:::i;:::-;;:::i;19187:304::-;;;;;;;;;;-1:-1:-1;19187:304:0;;;;;:::i;:::-;;:::i;24306:170::-;;;;;;;;;;-1:-1:-1;24393:5:0;:24;;-1:-1:-1;;;24393:24:0;;;;;-1:-1:-1;;;24418:24:0;;;;;-1:-1:-1;;;24443:24:0;;;;24306:170;;;;4667:4:1;4655:17;;;4637:36;;4709:17;;;4704:2;4689:18;;4682:45;4763:17;;4743:18;;;4736:45;;;;4625:2;4610:18;24306:170:0;4447:340:1;13054:67:0;;;;;;;;;;;;;;;;17966:217;;;;;;;;;;-1:-1:-1;17966:217:0;;;;;:::i;:::-;;:::i;7875:151::-;;;;;;;;;;-1:-1:-1;7875:151:0;;;;;:::i;:::-;;:::i;21309:333::-;;;;;;;;;;-1:-1:-1;21309:333:0;;;;;:::i;:::-;;:::i;6446:244::-;;;;;;;;;;-1:-1:-1;6446:244:0;;;;;:::i;:::-;;:::i;13206:31::-;;;;;;;;;;-1:-1:-1;13206:31:0;;;;-1:-1:-1;;;;;13206:31:0;;;24482:174;;;;;;;;;;-1:-1:-1;24570:5:0;:25;;-1:-1:-1;;;24570:25:0;;;;;-1:-1:-1;;;24596:25:0;;;;;-1:-1:-1;;;24622:25:0;;;;24482:174;;7103:100;7157:13;7190:5;7183:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7103:100;:::o;8034:201::-;8117:4;5489:10;8173:32;5489:10;8189:7;8198:6;8173:8;:32::i;:::-;8223:4;8216:11;;;8034:201;;;;;:::o;23937:345::-;6203:6;;-1:-1:-1;;;;;6203:6:0;5489:10;6203:22;6195:67;;;;-1:-1:-1;;;6195:67:0;;;;;;;:::i;:::-;;;;;;;;;24027:21:::1;24017:6;:31;;24009:93;;;::::0;-1:-1:-1;;;24009:93:0;;6133:2:1;24009:93:0::1;::::0;::::1;6115:21:1::0;6172:2;6152:18;;;6145:30;6211:34;6191:18;;;6184:62;-1:-1:-1;;;6262:18:1;;;6255:47;6319:19;;24009:93:0::1;5931:413:1::0;24009:93:0::1;24114:12;6141:6:::0;;24132:42:::1;::::0;-1:-1:-1;;;;;6141:6:0;;;;24162;;24114:12;24132:42;24114:12;24132:42;24162:6;6141;24132:42:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24113:61;;;24189:7;24185:90;;;24232:15;::::0;:22:::1;::::0;;-1:-1:-1;;;24232:22:0;;;;24218:45:::1;::::0;-1:-1:-1;;;;;24232:15:0::1;::::0;:20:::1;::::0;:22:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;:15;:22:::1;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24218:45;::::0;;-1:-1:-1;;;;;7007:32:1;;;6989:51;;7071:2;7056:18;;7049:34;;;6962:18;24218:45:0::1;;;;;;;24185:90;23998:284;23937:345:::0;:::o;17169:321::-;6203:6;;-1:-1:-1;;;;;6203:6:0;5489:10;6203:22;6195:67;;;;-1:-1:-1;;;6195:67:0;;;;;;;:::i;:::-;17226:16:::1;:23:::0;;-1:-1:-1;;;;17226:23:0::1;-1:-1:-1::0;;;17226:23:0::1;::::0;;17263:18:::1;::::0;17226:23;17263;17260:175:::1;;17324:12;17303:18;:33:::0;17375:15:::1;17351:21;:39:::0;17405:11:::1;:18:::0;;-1:-1:-1;;17405:18:0::1;-1:-1:-1::0;17405:18:0::1;::::0;;17260:175:::1;17450:32;::::0;17476:5:::1;::::0;17450:32;;::::1;::::0;17476:5;;17450:32:::1;17169:321::o:0;22308:273::-;6203:6;;-1:-1:-1;;;;;6203:6:0;5489:10;6203:22;6195:67;;;;-1:-1:-1;;;6195:67:0;;;;;;;:::i;:::-;22409:11:::1;;22397:8;:23:::0;22389:86:::1;;;::::0;-1:-1:-1;;;22389:86:0;;7296:2:1;22389:86:0::1;::::0;::::1;7278:21:1::0;7335:2;7315:18;;;7308:30;7374:34;7354:18;;;7347:62;-1:-1:-1;;;7425:18:1;;;7418:48;7483:19;;22389:86:0::1;7094:414:1::0;22389:86:0::1;22528:11;::::0;22491:49:::1;::::0;22518:8;;22491:49:::1;::::0;;;::::1;22551:11;:22:::0;22308:273::o;8245:295::-;8376:4;5489:10;8434:38;8450:4;5489:10;8465:6;8434:15;:38::i;:::-;8483:27;8493:4;8499:2;8503:6;8483:9;:27::i;:::-;-1:-1:-1;8528:4:0;;8245:295;-1:-1:-1;;;;8245:295:0:o;22587:278::-;6203:6;;-1:-1:-1;;;;;6203:6:0;5489:10;6203:22;6195:67;;;;-1:-1:-1;;;6195:67:0;;;;;;;:::i;:::-;22683:15:::1;;22671:8;:27:::0;22663:93:::1;;;::::0;-1:-1:-1;;;22663:93:0;;7715:2:1;22663:93:0::1;::::0;::::1;7697:21:1::0;7754:2;7734:18;;;7727:30;7793:34;7773:18;;;7766:62;-1:-1:-1;;;7844:18:1;;;7837:52;7906:19;;22663:93:0::1;7513:418:1::0;22663:93:0::1;22804:15;::::0;22772:48:::1;::::0;22794:8;;22772:48:::1;::::0;;;::::1;22831:15;:26:::0;22587:278::o;23204:727::-;6203:6;;-1:-1:-1;;;;;6203:6:0;5489:10;6203:22;6195:67;;;;-1:-1:-1;;;6195:67:0;;;;;;;:::i;:::-;23289:1:::1;23265:21;;:25;23257:74;;;::::0;-1:-1:-1;;;23257:74:0;;8138:2:1;23257:74:0::1;::::0;::::1;8120:21:1::0;8177:2;8157:18;;;8150:30;8216:34;8196:18;;;8189:62;-1:-1:-1;;;8267:18:1;;;8260:34;8311:19;;23257:74:0::1;7936:400:1::0;23257:74:0::1;23345:20;::::0;::::1;::::0;::::1;;;23344:21;23336:84;;;::::0;-1:-1:-1;;;23336:84:0;;8543:2:1;23336:84:0::1;::::0;::::1;8525:21:1::0;8582:2;8562:18;;;8555:30;8621:34;8601:18;;;8594:62;-1:-1:-1;;;8672:18:1;;;8665:48;8730:19;;23336:84:0::1;8341:414:1::0;23336:84:0::1;23469:1;23448:18;;23433:12;:33;;;;:::i;:::-;:37;23425:98;;;::::0;-1:-1:-1;;;23425:98:0;;9227:2:1;23425:98:0::1;::::0;::::1;9209:21:1::0;9266:2;9246:18;;;9239:30;9305:34;9285:18;;;9278:62;-1:-1:-1;;;9356:18:1;;;9349:46;9412:19;;23425:98:0::1;9025:412:1::0;23425:98:0::1;23569:4;23528:20;7640:18:::0;;;:9;:18;;;;;;23580:20:::1;:27:::0;;-1:-1:-1;;23580:27:0::1;;;::::0;;23620:12:::1;::::0;-1:-1:-1;;23620:28:0::1;23612:91;;;::::0;-1:-1:-1;;;23612:91:0;;9644:2:1;23612:91:0::1;::::0;::::1;9626:21:1::0;9683:2;9663:18;;;9656:30;9722:34;9702:18;;;9695:62;-1:-1:-1;;;9773:18:1;;;9766:48;9831:19;;23612:91:0::1;9442:414:1::0;23612:91:0::1;23725:12;::::0;;23708:14:::1;23742:16:::0;;;;23725:12;23801:4:::1;23786:30;23817:7;6114::::0;6141:6;-1:-1:-1;;;;;6141:6:0;;6076:79;23817:7:::1;23786:47;::::0;-1:-1:-1;;;;;;23786:47:0::1;::::0;;;;;;-1:-1:-1;;;;;7007:32:1;;;23786:47:0::1;::::0;::::1;6989:51:1::0;7056:18;;;7049:34;;;6962:18;;23786:47:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;23769:64;;23848:7;23844:80;;;23876:36;::::0;;23898:4:::1;6989:51:1::0;;7071:2;7056:18;;7049:34;;;23876:36:0::1;::::0;6962:18:1;23876:36:0::1;;;;;;;23844:80;23252:679;;;23204:727::o:0;17496:139::-;6203:6;;-1:-1:-1;;;;;6203:6:0;5489:10;6203:22;6195:67;;;;-1:-1:-1;;;6195:67:0;;;;;;;:::i;:::-;17555:16:::1;:24:::0;;-1:-1:-1;;;;17555:24:0::1;::::0;;17595:32:::1;::::0;17555:24;;17574:5:::1;::::0;17595:32:::1;::::0;17574:5;;17595:32:::1;17496:139::o:0;8548:238::-;8636:4;5489:10;8692:64;5489:10;8708:7;8745:10;8717:25;5489:10;8708:7;8717:9;:25::i;:::-;:38;;;;:::i;:::-;8692:8;:64::i;18832:349::-;6203:6;;-1:-1:-1;;;;;6203:6:0;5489:10;6203:22;6195:67;;;;-1:-1:-1;;;6195:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;18940:38:0;::::1;;::::0;;;:29:::1;:38;::::0;;;;;:47;::::1;;:38;::::0;;::::1;:47;;::::0;18932:118:::1;;;::::0;-1:-1:-1;;;18932:118:0;;10443:2:1;18932:118:0::1;::::0;::::1;10425:21:1::0;10482:2;10462:18;;;10455:30;10521:34;10501:18;;;10494:62;10592:29;10572:18;;;10565:57;10639:19;;18932:118:0::1;10241:423:1::0;18932:118:0::1;-1:-1:-1::0;;;;;19061:38:0;::::1;;::::0;;;:29:::1;:38;::::0;;;;;;;;:46;;-1:-1:-1;;19061:46:0::1;::::0;::::1;;::::0;;::::1;::::0;;;19123:50;;154:41:1;;;19123:50:0::1;::::0;127:18:1;19123:50:0::1;;;;;;;;18832:349:::0;;:::o;18592:234::-;6203:6;;-1:-1:-1;;;;;6203:6:0;5489:10;6203:22;6195:67;;;;-1:-1:-1;;;6195:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;18671:19:0;::::1;;::::0;;;:10:::1;:19;::::0;;;;;::::1;;18663:65;;;::::0;-1:-1:-1;;;18663:65:0;;10871:2:1;18663:65:0::1;::::0;::::1;10853:21:1::0;10910:2;10890:18;;;10883:30;10949:34;10929:18;;;10922:62;-1:-1:-1;;;11000:18:1;;;10993:31;11041:19;;18663:65:0::1;10669:397:1::0;18663:65:0::1;-1:-1:-1::0;;;;;18739:19:0;::::1;18761:5;18739:19:::0;;;:10:::1;:19;::::0;;;;;:27;;-1:-1:-1;;18739:27:0::1;::::0;;18782:36;18761:5;;18739:19;18782:36:::1;::::0;18761:5;;18782:36:::1;18592:234:::0;:::o;6290:148::-;6203:6;;-1:-1:-1;;;;;6203:6:0;5489:10;6203:22;6195:67;;;;-1:-1:-1;;;6195:67:0;;;;;;;:::i;:::-;6397:1:::1;6381:6:::0;;6360:40:::1;::::0;-1:-1:-1;;;;;6381:6:0;;::::1;::::0;6360:40:::1;::::0;6397:1;;6360:40:::1;6428:1;6411:19:::0;;-1:-1:-1;;;;;;6411:19:0::1;::::0;;6290:148::o;20208:1077::-;6203:6;;-1:-1:-1;;;;;6203:6:0;5489:10;6203:22;6195:67;;;;-1:-1:-1;;;6195:67:0;;;;;;;:::i;:::-;20347:16:::1;::::0;-1:-1:-1;;;;;20347:39:0;;::::1;:16:::0;::::1;:39;20343:305;;-1:-1:-1::0;;;;;20411:33:0;::::1;20403:89;;;::::0;-1:-1:-1;;;20403:89:0;;11273:2:1;20403:89:0::1;::::0;::::1;11255:21:1::0;11312:2;11292:18;;;11285:30;11351:34;11331:18;;;11324:62;-1:-1:-1;;;11402:18:1;;;11395:41;11453:19;;20403:89:0::1;11071:407:1::0;20403:89:0::1;20566:16;::::0;20512:71:::1;::::0;-1:-1:-1;;;11685:31:1;;-1:-1:-1;;;;;20566:16:0;;::::1;::::0;20512:71;::::1;::::0;11741:2:1;11732:12;20512:71:0::1;::::0;;;;::::1;::::0;;;::::1;::::0;;;::::1;20598:16;:38:::0;;-1:-1:-1;;;;;;20598:38:0::1;-1:-1:-1::0;;;;;20598:38:0;::::1;;::::0;;20343:305:::1;20662:16;::::0;-1:-1:-1;;;;;20662:39:0;;::::1;:16:::0;::::1;:39;20658:305;;-1:-1:-1::0;;;;;20726:33:0;::::1;20718:89;;;::::0;-1:-1:-1;;;20718:89:0;;11957:2:1;20718:89:0::1;::::0;::::1;11939:21:1::0;11996:2;11976:18;;;11969:30;12035:34;12015:18;;;12008:62;-1:-1:-1;;;12086:18:1;;;12079:41;12137:19;;20718:89:0::1;11755:407:1::0;20718:89:0::1;20881:16;::::0;20827:71:::1;::::0;-1:-1:-1;;;12369:31:1;;-1:-1:-1;;;;;20881:16:0;;::::1;::::0;20827:71;::::1;::::0;12425:2:1;12416:12;20827:71:0::1;::::0;;;;::::1;::::0;;;::::1;::::0;;;::::1;20913:16;:38:::0;;-1:-1:-1;;;;;;20913:38:0::1;-1:-1:-1::0;;;;;20913:38:0;::::1;;::::0;;20658:305:::1;20977:16;::::0;-1:-1:-1;;;;;20977:39:0;;::::1;:16:::0;::::1;:39;20973:305;;-1:-1:-1::0;;;;;21041:33:0;::::1;21033:89;;;::::0;-1:-1:-1;;;21033:89:0;;12641:2:1;21033:89:0::1;::::0;::::1;12623:21:1::0;12680:2;12660:18;;;12653:30;12719:34;12699:18;;;12692:62;-1:-1:-1;;;12770:18:1;;;12763:41;12821:19;;21033:89:0::1;12439:407:1::0;21033:89:0::1;21196:16;::::0;21142:71:::1;::::0;-1:-1:-1;;;13053:31:1;;-1:-1:-1;;;;;21196:16:0;;::::1;::::0;21142:71;::::1;::::0;13109:2:1;13100:12;21142:71:0::1;::::0;;;;::::1;::::0;;;::::1;::::0;;;::::1;21228:16;:38:::0;;-1:-1:-1;;;;;21228:38:0;::::1;-1:-1:-1::0;;;;;;21228:38:0;;::::1;;::::0;;20208:1077;;;:::o;21648:345::-;6203:6;;-1:-1:-1;;;;;6203:6:0;5489:10;6203:22;6195:67;;;;-1:-1:-1;;;6195:67:0;;;;;;;:::i;:::-;21787:93:::1;21811:5;21817:20;21838;21859;21787:23;:93::i;:::-;21896:89;::::0;-1:-1:-1;;;13325:28:1;;13378:2;13369:12;21896:89:0::1;;::::0;;;;;::::1;::::0;;4667:4:1;4655:17;;;4637:36;;4709:17;;;4704:2;4689:18;;4682:45;4763:17;;4743:18;;;4736:45;21896:89:0;;;;::::1;::::0;;;;;4625:2:1;21896:89:0;;::::1;21648:345:::0;;;:::o;19861:341::-;6203:6;;-1:-1:-1;;;;;6203:6:0;5489:10;6203:22;6195:67;;;;-1:-1:-1;;;6195:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;19966:38:0;::::1;;::::0;;;:29:::1;:38;::::0;;;;;:50;::::1;;:38;::::0;;::::1;:50;;::::0;19958:115:::1;;;;-1:-1:-1::0;;;19958:115:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;20084:38:0;::::1;;::::0;;;:29:::1;:38;::::0;;;;;;;;:49;;-1:-1:-1;;20084:49:0::1;::::0;::::1;;::::0;;::::1;::::0;;;20149:45;;154:41:1;;;20149:45:0::1;::::0;127:18:1;20149:45:0::1;14:187:1::0;18189:397:0;6203:6;;-1:-1:-1;;;;;6203:6:0;5489:10;6203:22;6195:67;;;;-1:-1:-1;;;6195:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;18267:19:0;::::1;;::::0;;;:10:::1;:19;::::0;;;;;::::1;;18266:20;18258:70;;;::::0;-1:-1:-1;;;18258:70:0;;14016:2:1;18258:70:0::1;::::0;::::1;13998:21:1::0;14055:2;14035:18;;;14028:30;14094:34;14074:18;;;14067:62;-1:-1:-1;;;14145:18:1;;;14138:35;14190:19;;18258:70:0::1;13814:401:1::0;18258:70:0::1;18343:11;::::0;::::1;;18339:152;;;18423:6;18398:21;;18380:15;:39;;;;:::i;:::-;18379:50;18371:108;;;::::0;-1:-1:-1;;;18371:108:0;;14422:2:1;18371:108:0::1;::::0;::::1;14404:21:1::0;14461:2;14441:18;;;14434:30;14500:34;14480:18;;;14473:62;-1:-1:-1;;;14551:18:1;;;14544:43;14604:19;;18371:108:0::1;14220:409:1::0;18371:108:0::1;-1:-1:-1::0;;;;;18501:19:0;::::1;;::::0;;;:10:::1;:19;::::0;;;;;:26;;-1:-1:-1;;18501:26:0::1;18523:4;18501:26:::0;;::::1;::::0;;;18543:35;;18523:4;;18501:19;18543:35:::1;::::0;::::1;18189:397:::0;:::o;19497:358::-;6203:6;;-1:-1:-1;;;;;6203:6:0;5489:10;6203:22;6195:67;;;;-1:-1:-1;;;6195:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;19607:43:0;::::1;;::::0;;;:34:::1;:43;::::0;;;;;:55;::::1;;:43;::::0;;::::1;:55;;::::0;19599:120:::1;;;;-1:-1:-1::0;;;19599:120:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;19730:43:0;::::1;;::::0;;;:34:::1;:43;::::0;;;;;;;;:54;;-1:-1:-1;;19730:54:0::1;::::0;::::1;;::::0;;::::1;::::0;;;19800:47;;154:41:1;;;19800:47:0::1;::::0;127:18:1;19800:47:0::1;14:187:1::0;7211:104:0;7267:13;7300:7;7293:14;;;;;:::i;8794:436::-;8887:4;5489:10;8887:4;8970:25;5489:10;8987:7;8970:9;:25::i;:::-;8943:52;;9034:15;9014:16;:35;;9006:85;;;;-1:-1:-1;;;9006:85:0;;14836:2:1;9006:85:0;;;14818:21:1;14875:2;14855:18;;;14848:30;14914:34;14894:18;;;14887:62;-1:-1:-1;;;14965:18:1;;;14958:35;15010:19;;9006:85:0;14634:401:1;9006:85:0;9127:60;9136:5;9143:7;9171:15;9152:16;:34;9127:8;:60::i;7674:193::-;7753:4;5489:10;7809:28;5489:10;7826:2;7830:6;7809:9;:28::i;22871:327::-;6203:6;;-1:-1:-1;;;;;6203:6:0;5489:10;6203:22;6195:67;;;;-1:-1:-1;;;6195:67:0;;;;;;;:::i;:::-;22975:23:::1;;22963:8;:35:::0;22955:109:::1;;;::::0;-1:-1:-1;;;22955:109:0;;15242:2:1;22955:109:0::1;::::0;::::1;15224:21:1::0;15281:2;15261:18;;;15254:30;15320:34;15300:18;;;15293:62;15391:32;15371:18;;;15364:60;15441:19;;22955:109:0::1;15040:426:1::0;22955:109:0::1;23121:23;::::0;23080:65:::1;::::0;23111:8;;23080:65:::1;::::0;;;::::1;23156:23;:34:::0;22871:327::o;21999:303::-;6203:6;;-1:-1:-1;;;;;6203:6:0;5489:10;6203:22;6195:67;;;;-1:-1:-1;;;6195:67:0;;;;;;;:::i;:::-;22105:15:::1;::::0;-1:-1:-1;;;;;22105:15:0;;::::1;22083:38:::0;;::::1;::::0;22075:96:::1;;;::::0;-1:-1:-1;;;22075:96:0;;15673:2:1;22075:96:0::1;::::0;::::1;15655:21:1::0;15712:2;15692:18;;;15685:30;15751:34;15731:18;;;15724:62;-1:-1:-1;;;15802:18:1;;;15795:44;15856:19;;22075:96:0::1;15471:410:1::0;22075:96:0::1;22229:15;::::0;22187:59:::1;::::0;-1:-1:-1;;;;;22229:15:0;;::::1;::::0;22187:59;::::1;::::0;::::1;::::0;22229:15:::1;::::0;22187:59:::1;22257:15;:37:::0;;-1:-1:-1;;;;;;22257:37:0::1;-1:-1:-1::0;;;;;22257:37:0;;;::::1;::::0;;;::::1;::::0;;21999:303::o;19187:304::-;6203:6;;-1:-1:-1;;;;;6203:6:0;5489:10;6203:22;6195:67;;;;-1:-1:-1;;;6195:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;19282:27:0;::::1;;::::0;;;:18:::1;:27;::::0;;;;;:39;::::1;;:27;::::0;;::::1;:39;;::::0;19274:104:::1;;;;-1:-1:-1::0;;;19274:104:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;19389:27:0;::::1;;::::0;;;:18:::1;:27;::::0;;;;;;;;:38;;-1:-1:-1;;19389:38:0::1;::::0;::::1;;::::0;;::::1;::::0;;;19443:40;;154:41:1;;;19443:40:0::1;::::0;127:18:1;19443:40:0::1;14:187:1::0;17966:217:0;6203:6;;-1:-1:-1;;;;;6203:6:0;5489:10;6203:22;6195:67;;;;-1:-1:-1;;;6195:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;18061:38:0;::::1;;::::0;;;:29:::1;:38;::::0;;;;;;;;:48;;-1:-1:-1;;18061:48:0::1;::::0;::::1;;::::0;;::::1;::::0;;;18125:50;;154:41:1;;;18125:50:0::1;::::0;127:18:1;18125:50:0::1;14:187:1::0;7875:151:0;-1:-1:-1;;;;;7991:18:0;;;7964:7;7991:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;7875:151::o;21309:333::-;6203:6;;-1:-1:-1;;;;;6203:6:0;5489:10;6203:22;6195:67;;;;-1:-1:-1;;;6195:67:0;;;;;;;:::i;:::-;21444:89:::1;21467:5;21473:19;21493;21513;21444:22;:89::i;:::-;21549:85;::::0;-1:-1:-1;;;16088:27:1;;16140:2;16131:12;21549:85:0::1;15886:263:1::0;6446:244:0;6203:6;;-1:-1:-1;;;;;6203:6:0;5489:10;6203:22;6195:67;;;;-1:-1:-1;;;6195:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;6535:22:0;::::1;6527:73;;;::::0;-1:-1:-1;;;6527:73:0;;16356:2:1;6527:73:0::1;::::0;::::1;16338:21:1::0;16395:2;16375:18;;;16368:30;16434:34;16414:18;;;16407:62;-1:-1:-1;;;16485:18:1;;;16478:36;16531:19;;6527:73:0::1;16154:402:1::0;6527:73:0::1;6637:6;::::0;;6616:38:::1;::::0;-1:-1:-1;;;;;6616:38:0;;::::1;::::0;6637:6;::::1;::::0;6616:38:::1;::::0;::::1;6665:6;:17:::0;;-1:-1:-1;;;;;;6665:17:0::1;-1:-1:-1::0;;;;;6665:17:0;;;::::1;::::0;;;::::1;::::0;;6446:244::o;11325:380::-;-1:-1:-1;;;;;11461:19:0;;11453:68;;;;-1:-1:-1;;;11453:68:0;;16763:2:1;11453:68:0;;;16745:21:1;16802:2;16782:18;;;16775:30;16841:34;16821:18;;;16814:62;-1:-1:-1;;;16892:18:1;;;16885:34;16936:19;;11453:68:0;16561:400:1;11453:68:0;-1:-1:-1;;;;;11540:21:0;;11532:68;;;;-1:-1:-1;;;11532:68:0;;17168:2:1;11532:68:0;;;17150:21:1;17207:2;17187:18;;;17180:30;17246:34;17226:18;;;17219:62;-1:-1:-1;;;17297:18:1;;;17290:32;17339:19;;11532:68:0;16966:398:1;11532:68:0;-1:-1:-1;;;;;11613:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;11665:32;;1769:25:1;;;11665:32:0;;1742:18:1;11665:32:0;;;;;;;11325:380;;;:::o;11713:453::-;11848:24;11875:25;11885:5;11892:7;11875:9;:25::i;:::-;11848:52;;-1:-1:-1;;11915:16:0;:37;11911:248;;11997:6;11977:16;:26;;11969:68;;;;-1:-1:-1;;;11969:68:0;;17571:2:1;11969:68:0;;;17553:21:1;17610:2;17590:18;;;17583:30;17649:31;17629:18;;;17622:59;17698:18;;11969:68:0;17369:353:1;11969:68:0;12081:51;12090:5;12097:7;12125:6;12106:16;:25;12081:8;:51::i;:::-;11837:329;11713:453;;;:::o;24675:2166::-;-1:-1:-1;;;;;24807:18:0;;24799:68;;;;-1:-1:-1;;;24799:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;24886:16:0;;24878:64;;;;-1:-1:-1;;;24878:64:0;;;;;;;:::i;:::-;24959:6;24969:1;24959:11;24955:93;;24987:28;25003:4;25009:2;25013:1;24987:15;:28::i;24955:93::-;-1:-1:-1;;;;;25065:35:0;;;;;;:29;:35;;;;;;;;25064:36;:74;;;;-1:-1:-1;;;;;;25105:33:0;;;;;;:29;:33;;;;;;;;25104:34;25064:74;25060:752;;;25163:16;;-1:-1:-1;;;25163:16:0;;;;25155:70;;;;-1:-1:-1;;;25155:70:0;;18739:2:1;25155:70:0;;;18721:21:1;18778:2;18758:18;;;18751:30;18817:34;18797:18;;;18790:62;-1:-1:-1;;;18868:18:1;;;18861:39;18917:19;;25155:70:0;18537:405:1;25155:70:0;-1:-1:-1;;;;;25249:14:0;;;;;;:10;:14;;;;;;;;25248:15;25240:57;;;;-1:-1:-1;;;25240:57:0;;19149:2:1;25240:57:0;;;19131:21:1;19188:2;19168:18;;;19161:30;19227:31;19207:18;;;19200:59;19276:18;;25240:57:0;18947:353:1;25240:57:0;-1:-1:-1;;;;;25321:16:0;;;;;;:10;:16;;;;;;;;25320:17;25312:59;;;;-1:-1:-1;;;25312:59:0;;19149:2:1;25312:59:0;;;19131:21:1;19188:2;19168:18;;;19161:30;19227:31;19207:18;;;19200:59;19276:18;;25312:59:0;18947:353:1;25312:59:0;-1:-1:-1;;;;;25391:38:0;;;;;;:34;:38;;;;;;;;25390:39;:84;;;;-1:-1:-1;;;;;;25434:40:0;;;;;;:34;:40;;;;;;;;25433:41;25390:84;25386:208;;;25513:11;;25503:6;:21;;25495:83;;;;-1:-1:-1;;;25495:83:0;;19507:2:1;25495:83:0;;;19489:21:1;19546:2;19526:18;;;19519:30;19585:34;19565:18;;;19558:62;-1:-1:-1;;;19636:18:1;;;19629:47;19693:19;;25495:83:0;19305:413:1;25495:83:0;-1:-1:-1;;;;;25613:33:0;;;;;;:29;:33;;;;;;;;25608:193;;25703:15;;25692:6;25676:13;25686:2;-1:-1:-1;;;;;7640:18:0;7613:7;7640:18;;;:9;:18;;;;;;;7539:127;25676:13;:22;;;;:::i;:::-;25675:43;;25667:118;;;;-1:-1:-1;;;25667:118:0;;19925:2:1;25667:118:0;;;19907:21:1;19964:2;19944:18;;;19937:30;20003:34;19983:18;;;19976:62;20074:32;20054:18;;;20047:60;20124:19;;25667:118:0;19723:426:1;25667:118:0;-1:-1:-1;;;;;25837:31:0;;;;;;;:25;:31;;;;;;;25870:29;;;;;;;;25824:86;;25837:31;;;;;25870:29;25863:4;25896:2;25824:12;:86::i;:::-;25964:23;;25954:4;25921:12;7640:18;;;:9;:18;;;;;;26018:16;;-1:-1:-1;;25936:51:0;;-1:-1:-1;;;26018:16:0;;;;:40;;;;;26051:7;26018:40;:67;;;;-1:-1:-1;26076:9:0;;;;26075:10;26018:67;:97;;;;-1:-1:-1;26102:9:0;;;;;;;:13;;26018:97;:143;;;;-1:-1:-1;;;;;;26132:29:0;;;;;;:25;:29;;;;;;;;26018:143;26000:280;;;26188:9;:16;;-1:-1:-1;;26188:16:0;26200:4;26188:16;;;26219:17;:15;:17::i;:::-;26251:9;:17;;-1:-1:-1;;26251:17:0;;;26000:280;26308:9;;26292:12;;26308:9;;26307:10;:30;;;;-1:-1:-1;26321:16:0;;-1:-1:-1;;;26321:16:0;;;;26307:30;-1:-1:-1;;;;;26354:24:0;;;;;;:18;:24;;;;;;26292:45;;-1:-1:-1;26354:24:0;;;:50;;-1:-1:-1;;;;;;26382:22:0;;;;;;:18;:22;;;;;;;;26354:50;26350:98;;;-1:-1:-1;26431:5:0;26350:98;26462:7;:24;;;;-1:-1:-1;26473:9:0;;;;;;;:13;;26462:24;26458:332;;;26527:9;;26503:11;;26540:3;;26518:18;;26527:9;;;;;26518:6;:18;:::i;:::-;26517:26;;;;:::i;:::-;26503:40;-1:-1:-1;26567:12:0;26503:40;26567:6;:12;:::i;:::-;26558:21;;26622:1;26598:21;;:25;:69;;;;;26665:1;26643:18;;26628:12;:33;;;;:::i;:::-;:38;;26598:69;26594:129;;;26704:3;26688:12;;:19;;;;;;;:::i;:::-;;;;-1:-1:-1;;26594:129:0;26737:41;26753:4;26767;26774:3;26737:15;:41::i;:::-;26488:302;26458:332;26800:33;26816:4;26822:2;26826:6;26800:15;:33::i;:::-;24788:2053;;24675:2166;;;:::o;28081:939::-;28247:23;;:47;;;;-1:-1:-1;;;28247:23:0;;;;:47;28243:250;;28316:104;;-1:-1:-1;;;20786:34:1;;20845:2;20836:12;28316:104:0;;;;;;;;28359:23;;28316:104;;28359:23;-1:-1:-1;;;28359:23:0;;;;;28316:104;;;;-1:-1:-1;;;;;;;;;;;28316:104:0;;;28405:14;;;;;;28316:104;:::i;:::-;;;;;;;;28435:46;;-1:-1:-1;;;;28435:46:0;-1:-1:-1;;;28435:46:0;;;;;;;28243:250;28507:23;;:47;;;;-1:-1:-1;;;28507:23:0;;;;:47;28503:250;;28576:104;;-1:-1:-1;;;21275:34:1;;21334:2;21325:12;28576:104:0;;;;;;;;28619:23;;28576:104;;28619:23;-1:-1:-1;;;28619:23:0;;;;;28576:104;;;;-1:-1:-1;;;;;;;;;;;28576:104:0;;;28665:14;;;;;;28576:104;:::i;:::-;;;;;;;;28695:46;;-1:-1:-1;;;;28695:46:0;-1:-1:-1;;;28695:46:0;;;;;;;28503:250;28767:23;;:47;;;;-1:-1:-1;;;28767:23:0;;;;:47;28763:250;;28836:104;;-1:-1:-1;;;21550:34:1;;21609:2;21600:12;28836:104:0;;;;;;;;28879:23;;28836:104;;28879:23;-1:-1:-1;;;28879:23:0;;;;;28836:104;;;;-1:-1:-1;;;;;;;;;;;28836:104:0;;;28925:14;;;;;;28836:104;:::i;:::-;;;;;;;;28955:46;;;;;-1:-1:-1;;;28955:46:0;-1:-1:-1;;;;28955:46:0;;;;;;28081:939;;;;:::o;29026:914::-;29188:22;;:45;;;;-1:-1:-1;;;29188:22:0;;;;:45;29184:243;;29255:101;;-1:-1:-1;;;21825:33:1;;21883:2;21874:12;29255:101:0;;;;;;;;29297:22;;29255:101;;29297:22;-1:-1:-1;;;29297:22:0;;;;;29255:101;;;;-1:-1:-1;;;;;;;;;;;29255:101:0;;;29341:14;;;;;;29255:101;:::i;:::-;;;;;;;;29371:44;;-1:-1:-1;;;;29371:44:0;-1:-1:-1;;;29371:44:0;;;;;;;29184:243;29441:22;;:45;;;;-1:-1:-1;;;29441:22:0;;;;:45;29437:243;;29508:101;;-1:-1:-1;;;22099:33:1;;22157:2;22148:12;29508:101:0;;;;;;;;29550:22;;29508:101;;29550:22;-1:-1:-1;;;29550:22:0;;;;;29508:101;;;;-1:-1:-1;;;;;;;;;;;29508:101:0;;;29594:14;;;;;;29508:101;:::i;:::-;;;;;;;;29624:44;;-1:-1:-1;;;;29624:44:0;-1:-1:-1;;;29624:44:0;;;;;;;29437:243;29694:22;;:45;;;;-1:-1:-1;;;29694:22:0;;;;:45;29690:243;;29761:101;;-1:-1:-1;;;22373:33:1;;22431:2;22422:12;29761:101:0;;;;;;;;29803:22;;29761:101;;29803:22;-1:-1:-1;;;29803:22:0;;;;;29761:101;;;;-1:-1:-1;;;;;;;;;;;29761:101:0;;;29847:14;;;;;;29761:101;:::i;:::-;;;;;;;;29877:44;;;;;-1:-1:-1;;;29877:44:0;-1:-1:-1;;;;29877:44:0;;;;;;29026:914;;;;:::o;9238:840::-;-1:-1:-1;;;;;9369:18:0;;9361:68;;;;-1:-1:-1;;;9361:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;9448:16:0;;9440:64;;;;-1:-1:-1;;;9440:64:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;9590:15:0;;9568:19;9590:15;;;:9;:15;;;;;;9624:21;;;;9616:72;;;;-1:-1:-1;;;9616:72:0;;22647:2:1;9616:72:0;;;22629:21:1;22686:2;22666:18;;;22659:30;22725:34;22705:18;;;22698:62;-1:-1:-1;;;22776:18:1;;;22769:36;22822:19;;9616:72:0;22445:402:1;9616:72:0;-1:-1:-1;;;;;9724:15:0;;;;;;;:9;:15;;;;;;9742:20;;;9724:38;;9942:13;;;;;;;;;;:23;;;;;;9994:26;;;;;;9756:6;1769:25:1;;1757:2;1742:18;;1623:177;9994:26:0;;;;;;;;10033:37;23204:727;26849:1224;26948:14;:18;;-1:-1:-1;;27006:18:0;;;27037:362;;;;27073:11;;;;:56;;;;;27128:1;27106:18;;27088:15;:36;;;;:::i;:::-;:41;;27073:56;27069:319;;;27150:14;:20;;-1:-1:-1;;27150:20:0;27167:3;27150:20;;;27069:319;;;27228:5;:24;27211:14;:41;;-1:-1:-1;;;27228:24:0;;;;;;-1:-1:-1;;27271:41:0;;;;;;;27228:24;-1:-1:-1;;;27288:24:0;;;;27271:41;;-1:-1:-1;;27331:41:0;-1:-1:-1;;;27348:24:0;;;;27331:41;;;;;;;;27069:319;27413:10;27409:199;;;27457:5;:25;27440:14;:42;;-1:-1:-1;;;27457:25:0;;;;;;-1:-1:-1;;27497:42:0;;;;;;;27457:25;-1:-1:-1;;;27514:25:0;;;;27497:42;;-1:-1:-1;;27554:42:0;-1:-1:-1;;;27571:25:0;;;;27554:42;;;;;;;;27409:199;27623:10;27622:11;:27;;;;;27638:11;27637:12;27622:27;:105;;;;-1:-1:-1;;;;;;27654:35:0;;;;;;:29;:35;;;;;;;;;:72;;-1:-1:-1;;;;;;27693:33:0;;;;;;:29;:33;;;;;;;;27654:72;27618:291;;;27761:5;:24;27744:14;:41;;-1:-1:-1;;;27761:24:0;;;;;;-1:-1:-1;;27800:41:0;;;;;;;27761:24;-1:-1:-1;;;27817:24:0;;;;27800:41;;-1:-1:-1;;27856:41:0;-1:-1:-1;;;27873:24:0;;;;27856:41;;;;;;;;27618:291;27965:14;;;;;;;;;27931:31;;27965:14;27948;;;;;27931;:31;:::i;:::-;:48;;;;:::i;:::-;27919:9;:60;;;;;;;;;;-1:-1:-1;;27919:60:0;;;;;;;;27995:70;;;28007:14;;;;;;;;;;23220:36:1;;27919:60:0;28023:14;;;;23287:2:1;23272:18;;23265:45;28039:14:0;;;;;23326:18:1;;;23319:45;28055:9:0;;;;;23395:2:1;23380:18;;23373:45;27995:70:0;;;;;;;23207:3:1;27995:70:0;;;26849:1224;;;;:::o;29948:1163::-;30038:4;29994:23;7640:18;;;:9;:18;;;;;;30180:9;;7640:18;;30083:21;;30192:1;;30180:9;;;;;;;30144:32;;30162:14;7640:18;30144:32;:::i;:::-;30143:46;;;;:::i;:::-;:50;;;;:::i;:::-;30117:76;-1:-1:-1;30204:20:0;30227:33;30117:76;30227:15;:33;:::i;:::-;30204:56;;30273:31;30291:12;30273:17;:31::i;:::-;30317:27;30347:41;30371:17;30347:21;:41;:::i;:::-;30434:14;;30317:71;;-1:-1:-1;30399:19:0;;30434:18;;30451:1;;30434:14;;:18;:::i;:::-;30421:9;;:32;;;:9;;;;;:32;:::i;:::-;30517:14;;30399:54;;;;;-1:-1:-1;30464:27:0;;30549:1;;30399:54;;30495:36;;30517:14;30495:19;:36;:::i;:::-;30494:52;;;;:::i;:::-;:56;;;;:::i;:::-;30614:14;;30464:86;;-1:-1:-1;30561:27:0;;30632:11;;30592:36;;30614:14;;;;;30592:19;:36;:::i;:::-;30591:52;;;;:::i;:::-;30561:82;-1:-1:-1;30654:27:0;30707:42;30561:82;30707:19;:42;:::i;:::-;30684:66;;:19;:66;:::i;:::-;30789:16;;30654:96;;-1:-1:-1;30763:64:0;;-1:-1:-1;;;;;30789:16:0;30654:96;30763:17;:64::i;:::-;30864:16;;30838:64;;-1:-1:-1;;;;;30864:16:0;30882:19;30838:17;:64::i;:::-;30919:19;;30915:189;;30955:51;30969:15;30986:19;30955:13;:51::i;:::-;31026:66;;;23957:25:1;;;24013:2;23998:18;;23991:34;;;24041:18;;;24034:34;;;31026:66:0;;23945:2:1;23930:18;31026:66:0;;;;;;;30915:189;29983:1128;;;;;;;;;29948:1163::o;31119:500::-;31210:16;;;31224:1;31210:16;;;;;;;;31186:21;;31210:16;;;;;;;;;;-1:-1:-1;31210:16:0;31186:40;;31255:4;31237;31242:1;31237:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;31237:23:0;;;:7;;;;;;;;;;:23;;;;31281:15;;:22;;;-1:-1:-1;;;31281:22:0;;;;:15;;;;;:20;;:22;;;;;31237:7;;31281:22;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31271:4;31276:1;31271:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;31271:32:0;;;:7;;;;;;;;;:32;31346:15;;31314:62;;31331:4;;31346:15;31364:11;31314:8;:62::i;:::-;31387:15;;:224;;-1:-1:-1;;;31387:224:0;;-1:-1:-1;;;;;31387:15:0;;;;:66;;:224;;31468:11;;31387:15;;31538:4;;31565;;31585:15;;31387:224;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31175:444;31119:500;:::o;2349:322::-;2463:6;2438:21;:31;;2425:86;;;;-1:-1:-1;;;2425:86:0;;25530:2:1;2425:86:0;;;25512:21:1;25569:2;25549:18;;;25542:30;25608:31;25588:18;;;25581:59;25657:18;;2425:86:0;25328:353:1;2425:86:0;2519:12;2537:9;-1:-1:-1;;;;;2537:14:0;2559:6;2537:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2518:52;;;2588:7;2575:91;;;;-1:-1:-1;;;2575:91:0;;25888:2:1;2575:91:0;;;25870:21:1;25927:2;25907:18;;;25900:30;25966:34;25946:18;;;25939:62;26037:28;26017:18;;;26010:56;26083:19;;2575:91:0;25686:422:1;31627:426:0;31741:15;;31709:62;;31726:4;;-1:-1:-1;;;;;31741:15:0;31759:11;31709:8;:62::i;:::-;31782:15;;31988:16;;31782:263;;-1:-1:-1;;;31782:263:0;;31856:4;31782:263;;;26454:34:1;26504:18;;;26497:34;;;31782:15:0;26547:18:1;;;26540:34;;;26590:18;;;26583:34;-1:-1:-1;;;;;31988:16:0;;;26633:19:1;;;26626:44;32019:15:0;26686:19:1;;;26679:35;31782:15:0;;;:31;;31822:9;;26388:19:1;;31782:263:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;206:548:1:-;318:4;347:2;376;365:9;358:21;408:6;402:13;451:6;446:2;435:9;431:18;424:34;476:1;486:140;500:6;497:1;494:13;486:140;;;595:14;;;591:23;;585:30;561:17;;;580:2;557:26;550:66;515:10;;486:140;;;490:3;675:1;670:2;661:6;650:9;646:22;642:31;635:42;745:2;738;734:7;729:2;721:6;717:15;713:29;702:9;698:45;694:54;686:62;;;;206:548;;;;:::o;759:131::-;-1:-1:-1;;;;;834:31:1;;824:42;;814:70;;880:1;877;870:12;814:70;759:131;:::o;895:315::-;963:6;971;1024:2;1012:9;1003:7;999:23;995:32;992:52;;;1040:1;1037;1030:12;992:52;1079:9;1066:23;1098:31;1123:5;1098:31;:::i;:::-;1148:5;1200:2;1185:18;;;;1172:32;;-1:-1:-1;;;895:315:1:o;1215:180::-;1274:6;1327:2;1315:9;1306:7;1302:23;1298:32;1295:52;;;1343:1;1340;1333:12;1295:52;-1:-1:-1;1366:23:1;;1215:180;-1:-1:-1;1215:180:1:o;1805:456::-;1882:6;1890;1898;1951:2;1939:9;1930:7;1926:23;1922:32;1919:52;;;1967:1;1964;1957:12;1919:52;2006:9;1993:23;2025:31;2050:5;2025:31;:::i;:::-;2075:5;-1:-1:-1;2132:2:1;2117:18;;2104:32;2145:33;2104:32;2145:33;:::i;:::-;1805:456;;2197:7;;-1:-1:-1;;;2251:2:1;2236:18;;;;2223:32;;1805:456::o;2455:118::-;2541:5;2534:13;2527:21;2520:5;2517:32;2507:60;;2563:1;2560;2553:12;2578:382;2643:6;2651;2704:2;2692:9;2683:7;2679:23;2675:32;2672:52;;;2720:1;2717;2710:12;2672:52;2759:9;2746:23;2778:31;2803:5;2778:31;:::i;:::-;2828:5;-1:-1:-1;2885:2:1;2870:18;;2857:32;2898:30;2857:32;2898:30;:::i;:::-;2947:7;2937:17;;;2578:382;;;;;:::o;3173:247::-;3232:6;3285:2;3273:9;3264:7;3260:23;3256:32;3253:52;;;3301:1;3298;3291:12;3253:52;3340:9;3327:23;3359:31;3384:5;3359:31;:::i;:::-;3409:5;3173:247;-1:-1:-1;;;3173:247:1:o;3425:529::-;3502:6;3510;3518;3571:2;3559:9;3550:7;3546:23;3542:32;3539:52;;;3587:1;3584;3577:12;3539:52;3626:9;3613:23;3645:31;3670:5;3645:31;:::i;:::-;3695:5;-1:-1:-1;3752:2:1;3737:18;;3724:32;3765:33;3724:32;3765:33;:::i;:::-;3817:7;-1:-1:-1;3876:2:1;3861:18;;3848:32;3889:33;3848:32;3889:33;:::i;:::-;3941:7;3931:17;;;3425:529;;;;;:::o;3959:156::-;4025:20;;4085:4;4074:16;;4064:27;;4054:55;;4105:1;4102;4095:12;4054:55;3959:156;;;:::o;4120:322::-;4191:6;4199;4207;4260:2;4248:9;4239:7;4235:23;4231:32;4228:52;;;4276:1;4273;4266:12;4228:52;4299:27;4316:9;4299:27;:::i;:::-;4289:37;;4345:36;4377:2;4366:9;4362:18;4345:36;:::i;:::-;4335:46;;4400:36;4432:2;4421:9;4417:18;4400:36;:::i;:::-;4390:46;;4120:322;;;;;:::o;4792:388::-;4860:6;4868;4921:2;4909:9;4900:7;4896:23;4892:32;4889:52;;;4937:1;4934;4927:12;4889:52;4976:9;4963:23;4995:31;5020:5;4995:31;:::i;:::-;5045:5;-1:-1:-1;5102:2:1;5087:18;;5074:32;5115:33;5074:32;5115:33;:::i;5185:380::-;5264:1;5260:12;;;;5307;;;5328:61;;5382:4;5374:6;5370:17;5360:27;;5328:61;5435:2;5427:6;5424:14;5404:18;5401:38;5398:161;;5481:10;5476:3;5472:20;5469:1;5462:31;5516:4;5513:1;5506:15;5544:4;5541:1;5534:15;5398:161;;5185:380;;;:::o;5570:356::-;5772:2;5754:21;;;5791:18;;;5784:30;5850:34;5845:2;5830:18;;5823:62;5917:2;5902:18;;5570:356::o;6559:251::-;6629:6;6682:2;6670:9;6661:7;6657:23;6653:32;6650:52;;;6698:1;6695;6688:12;6650:52;6730:9;6724:16;6749:31;6774:5;6749:31;:::i;8760:127::-;8821:10;8816:3;8812:20;8809:1;8802:31;8852:4;8849:1;8842:15;8876:4;8873:1;8866:15;8892:128;8959:9;;;8980:11;;;8977:37;;;8994:18;;:::i;9861:245::-;9928:6;9981:2;9969:9;9960:7;9956:23;9952:32;9949:52;;;9997:1;9994;9987:12;9949:52;10029:9;10023:16;10048:28;10070:5;10048:28;:::i;10111:125::-;10176:9;;;10197:10;;;10194:36;;;10210:18;;:::i;13392:417::-;13594:2;13576:21;;;13633:2;13613:18;;;13606:30;13672:34;13667:2;13652:18;;13645:62;-1:-1:-1;;;13738:2:1;13723:18;;13716:51;13799:3;13784:19;;13392:417::o;17727:401::-;17929:2;17911:21;;;17968:2;17948:18;;;17941:30;18007:34;18002:2;17987:18;;17980:62;-1:-1:-1;;;18073:2:1;18058:18;;18051:35;18118:3;18103:19;;17727:401::o;18133:399::-;18335:2;18317:21;;;18374:2;18354:18;;;18347:30;18413:34;18408:2;18393:18;;18386:62;-1:-1:-1;;;18479:2:1;18464:18;;18457:33;18522:3;18507:19;;18133:399::o;20154:168::-;20227:9;;;20258;;20275:15;;;20269:22;;20255:37;20245:71;;20296:18;;:::i;20327:127::-;20388:10;20383:3;20379:20;20376:1;20369:31;20419:4;20416:1;20409:15;20443:4;20440:1;20433:15;20459:120;20499:1;20525;20515:35;;20530:18;;:::i;:::-;-1:-1:-1;20564:9:1;;20459:120::o;20859:209::-;-1:-1:-1;;21023:38:1;;;;21005:57;;20993:2;20978:18;;20859:209::o;22852:148::-;22940:4;22919:12;;;22933;;;22915:31;;22958:13;;22955:39;;;22974:18;;:::i;23429:165::-;23467:1;23501:4;23498:1;23494:12;23525:3;23515:37;;23532:18;;:::i;:::-;23584:3;23577:4;23574:1;23570:12;23566:22;23561:27;;;23429:165;;;;:::o;23599:151::-;23689:4;23682:12;;;23668;;;23664:31;;23707:14;;23704:40;;;23724:18;;:::i;24211:127::-;24272:10;24267:3;24263:20;24260:1;24253:31;24303:4;24300:1;24293:15;24327:4;24324:1;24317:15;24343:980;24605:4;24653:3;24642:9;24638:19;24684:6;24673:9;24666:25;24710:2;24748:6;24743:2;24732:9;24728:18;24721:34;24791:3;24786:2;24775:9;24771:18;24764:31;24815:6;24850;24844:13;24881:6;24873;24866:22;24919:3;24908:9;24904:19;24897:26;;24958:2;24950:6;24946:15;24932:29;;24979:1;24989:195;25003:6;25000:1;24997:13;24989:195;;;25068:13;;-1:-1:-1;;;;;25064:39:1;25052:52;;25159:15;;;;25124:12;;;;25100:1;25018:9;24989:195;;;-1:-1:-1;;;;;;;25240:32:1;;;;25235:2;25220:18;;25213:60;-1:-1:-1;;;25304:3:1;25289:19;25282:35;25201:3;24343:980;-1:-1:-1;;;24343:980:1:o;26725:306::-;26813:6;26821;26829;26882:2;26870:9;26861:7;26857:23;26853:32;26850:52;;;26898:1;26895;26888:12;26850:52;26927:9;26921:16;26911:26;;26977:2;26966:9;26962:18;26956:25;26946:35;;27021:2;27010:9;27006:18;27000:25;26990:35;;26725:306;;;;;:::o

Swarm Source

ipfs://6312b33f7498be54c0aa1228cd3afbca6ef6f4cc3d02abd92eb2e5eab178b6b5
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.