ETH Price: $2,544.00 (-3.11%)
Gas: 1 Gwei

Token

GOL D INU (GINU)
 

Overview

Max Total Supply

1,000,000,000,000,000 GINU

Holders

395 (0.00%)

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 9 Decimals)

Balance
7,619,283.352692385 GINU

Value
$0.00
0xecdf5728096bf060b0fa9c42abab0824099b932b
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

GOL D INU is a RFI with a future UTILITY in the latter phase and it will be the first treasure hunting on a blockchain migrated with NFTs to provide tools.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
GolDInu

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
Yes with 5000 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-11-10
*/

// SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.9.0;

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

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

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

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

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

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

  /**
   * @dev Returns the bep token owner.
   */
  function getOwner() external view returns (address);

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

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

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

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

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

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

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

interface IUniswapV2Factory {
    event PairCreated(address indexed token0, address indexed token1, address lpPair, uint);
    function feeTo() external view returns (address);
    function feeToSetter() external view returns (address);
    function getPair(address tokenA, address tokenB) external view returns (address lpPair);
    function allPairs(uint) external view returns (address lpPair);
    function allPairsLength() external view returns (uint);
    function createPair(address tokenA, address tokenB) external returns (address lpPair);
    function setFeeTo(address) external;
    function setFeeToSetter(address) external;
}

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

    function name() external pure returns (string memory);
    function symbol() external pure returns (string memory);
    function decimals() external pure returns (uint8);
    function totalSupply() external view returns (uint);
    function balanceOf(address owner) external view returns (uint);
    function allowance(address owner, address spender) external view returns (uint);
    function approve(address spender, uint value) external returns (bool);
    function transfer(address to, uint value) external returns (bool);
    function transferFrom(address from, address to, uint value) external returns (bool);
    function DOMAIN_SEPARATOR() external view returns (bytes32);
    function PERMIT_TYPEHASH() external pure returns (bytes32);
    function nonces(address owner) external view returns (uint);
    function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;
    event Burn(address indexed sender, uint amount0, uint amount1, address indexed to);
    event Swap(
        address indexed sender,
        uint amount0In,
        uint amount1In,
        uint amount0Out,
        uint amount1Out,
        address indexed to
    );
    event Sync(uint112 reserve0, uint112 reserve1);

    function MINIMUM_LIQUIDITY() external pure returns (uint);
    function factory() external view returns (address);
    function token0() external view returns (address);
    function token1() external view returns (address);
    function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
    function price0CumulativeLast() external view returns (uint);
    function price1CumulativeLast() external view returns (uint);
    function kLast() external view returns (uint);
    function mint(address to) external returns (uint liquidity);
    function burn(address to) external returns (uint amount0, uint amount1);
    function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
    function skim(address to) external;
    function sync() external;
    function initialize(address, address) external;
}

interface IUniswapV2Router01 {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);
    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountToken, uint amountETH);
    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETHWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountToken, uint amountETH);
    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
    external
    payable
    returns (uint[] memory amounts);
    function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
    external
    returns (uint[] memory amounts);
    function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
    external
    returns (uint[] memory amounts);
    function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
    external
    payable
    returns (uint[] memory amounts);

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

interface IUniswapV2Router02 is IUniswapV2Router01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountETH);
    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountETH);

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable;
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
}

interface AntiSnipe {
    function checkUser(address from, address to, uint256 amt) external returns (bool);
    function setLaunch(address _initialLpPair, uint32 _liqAddBlock, uint64 _liqAddStamp) external;
    function setLpPair(address pair, bool enabled) external;
    function setProtections(bool _as, bool _ag, bool _ab, bool _aspecial) external;
    function removeSniper(address account) external;
    function getSniperAmt() external view returns (uint256);
    function removeBlacklisted(address account) external;
    function isBlacklisted(address account) external view returns (bool);
}

contract GolDInu is Context, IERC20 {
    // Ownership moved to in-contract for customizability.
    address private _owner;

    mapping (address => uint256) private _rOwned;
    mapping (address => uint256) private _tOwned;
    mapping (address => bool) lpPairs;
    uint256 private timeSinceLastPair = 0;
    mapping (address => mapping (address => uint256)) private _allowances;

    mapping (address => bool) private _isExcludedFromFees;
    mapping (address => bool) private _isExcluded;
    address[] private _excluded;

    mapping (address => bool) private _liquidityHolders;
   
    uint256 private startingSupply = 1_000_000_000_000_000;

    string constant private _name = "GOL D INU";
    string constant private _symbol = "GINU";

    struct FeesStruct {
        uint16 reflectFee;
        uint16 treasuryFee;
        uint16 marketingFee;
    }

    struct StaticValuesStruct {
        uint16 maxReflectFee;
        uint16 maxLiquidityFee;
        uint16 maxMarketingFee;
        uint16 masterTaxDivisor;
    }

    struct Ratios {
        uint16 treasury;
        uint16 marketing;
        uint16 total;
    }

    FeesStruct private currentTaxes = FeesStruct({
        reflectFee: 0,
        treasuryFee: 0,
        marketingFee: 0
        });

    FeesStruct public _buyTaxes = FeesStruct({
        reflectFee: 100,
        treasuryFee: 400,
        marketingFee: 500
        });

    FeesStruct public _sellTaxes = FeesStruct({
        reflectFee: 100,
        treasuryFee: 400,
        marketingFee: 500
        });

    FeesStruct public _transferTaxes = FeesStruct({
        reflectFee: 100,
        treasuryFee: 400,
        marketingFee: 500
        });

    Ratios public _ratios = Ratios({
        treasury: 4,
        marketing: 5,
        total: 9
        });

    StaticValuesStruct public staticVals = StaticValuesStruct({
        maxReflectFee: 800,
        maxLiquidityFee: 800,
        maxMarketingFee: 800,
        masterTaxDivisor: 10000
        });

    uint256 private constant MAX = ~uint256(0);
    uint8 private _decimals = 9;
    uint256 private _tTotal = startingSupply * 10**_decimals;
    uint256 private _rTotal = (MAX - (MAX % _tTotal));
    uint256 private _tFeeTotal;

    IUniswapV2Router02 public dexRouter;
    address public lpPair;

    // UNI ROUTER
    address constant private _routerAddress = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D;

    address constant public DEAD = 0x000000000000000000000000000000000000dEaD;
    address payable private _marketingWallet = payable(0x905A29d4046E6F534D6c116550a24EB1AB4F715C);
    address payable private _treasuryWallet = payable(0x2501Fa56De1eC28189F2916c80149b867230345a);
    
    bool inSwap;
    bool public contractSwapEnabled = false;
    
    uint256 private maxTxPercent = 25;
    uint256 private maxTxDivisor = 10000;
    uint256 private _maxTxAmount = (_tTotal * maxTxPercent) / maxTxDivisor;
    uint256 public maxTxAmountUI = (startingSupply * maxTxPercent) / maxTxDivisor;

    uint256 private maxWalletPercent = 25;
    uint256 private maxWalletDivisor = 1000;
    uint256 private _maxWalletSize = (_tTotal * maxWalletPercent) / maxWalletDivisor;
    uint256 public maxWalletSizeUI = (startingSupply * maxWalletPercent) / maxWalletDivisor;

    uint256 private swapThreshold = (_tTotal * 5) / 10000;
    uint256 private swapAmount = (_tTotal * 5) / 1000;

    bool public tradingEnabled = false;
    bool public _hasLiqBeenAdded = false;
    AntiSnipe antiSnipe;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
    event MinTokensBeforeSwapUpdated(uint256 minTokensBeforeSwap);
    event ContractSwapEnabledUpdated(bool enabled);
    event SwapAndLiquify(
        uint256 tokensSwapped,
        uint256 ethReceived,
        uint256 tokensIntoLiqudity
    );
    event SniperCaught(address sniperAddress);
    
    modifier lockTheSwap {
        inSwap = true;
        _;
        inSwap = false;
    }

    modifier onlyOwner() {
        require(_owner == _msgSender(), "Caller =/= owner.");
        _;
    }
    
    constructor () payable {
        _rOwned[_msgSender()] = _rTotal;

        // Set the owner.
        _owner = msg.sender;

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

        _approve(msg.sender, _routerAddress, type(uint256).max);
        _approve(address(this), _routerAddress, type(uint256).max);

        _isExcludedFromFees[owner()] = true;
        _isExcludedFromFees[address(this)] = true;
        _isExcludedFromFees[DEAD] = true;
        _liquidityHolders[owner()] = true;

        emit Transfer(address(0), _msgSender(), _tTotal);
    }

    receive() external payable {}

//===============================================================================================================
//===============================================================================================================
//===============================================================================================================
    // Ownable removed as a lib and added here to allow for custom transfers and recnouncements.
    // This allows for removal of ownership privelages from the owner once renounced or transferred.
    function owner() public view returns (address) {
        return _owner;
    }

    function transferOwner(address newOwner) external onlyOwner() {
        require(newOwner != address(0), "Call renounceOwnership to transfer owner to the zero address.");
        require(newOwner != DEAD, "Call renounceOwnership to transfer owner to the zero address.");
        setExcludedFromFees(_owner, false);
        setExcludedFromFees(newOwner, true);
        
        if (_marketingWallet == payable(_owner))
            _marketingWallet = payable(newOwner);
        
        if(balanceOf(_owner) > 0) {
            _transfer(_owner, newOwner, balanceOf(_owner));
        }
        
        _owner = newOwner;
        emit OwnershipTransferred(_owner, newOwner);
        
    }

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

    function totalSupply() external view override returns (uint256) { return _tTotal; }
    function decimals() external view override returns (uint8) { return _decimals; }
    function symbol() external pure override returns (string memory) { return _symbol; }
    function name() external pure override returns (string memory) { return _name; }
    function getOwner() external view override returns (address) { return owner(); }
    function allowance(address holder, address spender) external view override returns (uint256) { return _allowances[holder][spender]; }

    function balanceOf(address account) public view override returns (uint256) {
        if (_isExcluded[account]) return _tOwned[account];
        return tokenFromReflection(_rOwned[account]);
    }

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

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

    function _approve(address sender, address spender, uint256 amount) private {
        require(sender != address(0), "ERC20: Zero Address");
        require(spender != address(0), "ERC20: Zero Address");

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

    function approveContractContingency() public onlyOwner returns (bool) {
        _approve(address(this), address(dexRouter), type(uint256).max);
        return true;
    }

    function transferFrom(address sender, address recipient, uint256 amount) external override returns (bool) {
        if (_allowances[sender][msg.sender] != type(uint256).max) {
            _allowances[sender][msg.sender] -= amount;
        }

        return _transfer(sender, recipient, amount);
    }

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

    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender] - subtractedValue);
        return true;
    }

    function setNewRouter(address newRouter) public onlyOwner() {
        IUniswapV2Router02 _newRouter = IUniswapV2Router02(newRouter);
        address get_pair = IUniswapV2Factory(_newRouter.factory()).getPair(address(this), _newRouter.WETH());
        if (get_pair == address(0)) {
            lpPair = IUniswapV2Factory(_newRouter.factory()).createPair(address(this), _newRouter.WETH());
        }
        else {
            lpPair = get_pair;
        }
        dexRouter = _newRouter;
        _approve(address(this), address(dexRouter), type(uint256).max);
    }

    function setLpPair(address pair, bool enabled) external onlyOwner {
        if (enabled == false) {
            lpPairs[pair] = false;
            antiSnipe.setLpPair(pair, false);
        } else {
            if (timeSinceLastPair != 0) {
                require(block.timestamp - timeSinceLastPair > 3 days, "Cannot set a new pair this week!");
            }
            lpPairs[pair] = true;
            timeSinceLastPair = block.timestamp;
            antiSnipe.setLpPair(pair, true);
        }
    }

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

    function setExcludedFromFees(address account, bool enabled) public onlyOwner {
        _isExcludedFromFees[account] = enabled;
    }

    function isExcludedFromReward(address account) public view returns (bool) {
        return _isExcluded[account];
    }

    function setExcludedFromReward(address account, bool enabled) public onlyOwner {
        if (enabled == true) {
            require(!_isExcluded[account], "Account is already excluded.");
            if(_rOwned[account] > 0) {
                _tOwned[account] = tokenFromReflection(_rOwned[account]);
            }
            _isExcluded[account] = true;
            _excluded.push(account);
        } else if (enabled == false) {
            require(_isExcluded[account], "Account is already included.");
            if(_excluded.length == 1){
                _tOwned[account] = 0;
                _isExcluded[account] = false;
                _excluded.pop();
            } else {
                for (uint256 i = 0; i < _excluded.length; i++) {
                    if (_excluded[i] == account) {
                        _excluded[i] = _excluded[_excluded.length - 1];
                        _tOwned[account] = 0;
                        _isExcluded[account] = false;
                        _excluded.pop();
                        break;
                    }
                }
            }
        }
    }

    function setInitializer(address initializer) external onlyOwner {
        require(!_hasLiqBeenAdded, "Liquidity is already in.");
        require(initializer != address(this), "Can't be self.");
        antiSnipe = AntiSnipe(initializer);
    }

    function removeSniper(address account) external onlyOwner {
        antiSnipe.removeSniper(account);
    }

    function isBlacklisted(address account) public view returns (bool) {
        return antiSnipe.isBlacklisted(account);
    }

    function removeBlacklisted(address account) external onlyOwner {
        antiSnipe.removeBlacklisted(account);
    }

    function getSniperAmt() public view returns (uint256) {
        return antiSnipe.getSniperAmt();
    }

    function setProtectionSettings(bool _antiSnipe, bool _antiGas, bool _antiBlock, bool _antiSpecial) external onlyOwner {
        antiSnipe.setProtections(_antiSnipe, _antiGas, _antiBlock, _antiSpecial);
    }

    function setTaxesBuy(uint16 reflectFee, uint16 treasuryFee, uint16 marketingFee) external onlyOwner {
        require(reflectFee <= staticVals.maxReflectFee
                && treasuryFee <= staticVals.maxLiquidityFee
                && marketingFee <= staticVals.maxMarketingFee);
        require(treasuryFee + reflectFee + marketingFee <= 3450);
        _buyTaxes.treasuryFee = treasuryFee;
        _buyTaxes.reflectFee = reflectFee;
        _buyTaxes.marketingFee = marketingFee;
    }

    function setTaxesSell(uint16 reflectFee, uint16 treasuryFee, uint16 marketingFee) external onlyOwner {
        require(reflectFee <= staticVals.maxReflectFee
                && treasuryFee <= staticVals.maxLiquidityFee
                && marketingFee <= staticVals.maxMarketingFee);
        require(treasuryFee + reflectFee + marketingFee <= 3450);
        _sellTaxes.treasuryFee = treasuryFee;
        _sellTaxes.reflectFee = reflectFee;
        _sellTaxes.marketingFee = marketingFee;
    }

    function setTaxesTransfer(uint16 reflectFee, uint16 treasuryFee, uint16 marketingFee) external onlyOwner {
        require(reflectFee <= staticVals.maxReflectFee
                && treasuryFee <= staticVals.maxLiquidityFee
                && marketingFee <= staticVals.maxMarketingFee);
        require(treasuryFee + reflectFee + marketingFee <= 3450);
        _transferTaxes.treasuryFee = treasuryFee;
        _transferTaxes.reflectFee = reflectFee;
        _transferTaxes.marketingFee = marketingFee;
    }

    function setRatios(uint16 treasury, uint16 marketing) external onlyOwner {
        require (treasury + marketing >= 99, "Must add up to 100% or 99%.");
        _ratios.treasury = treasury;
        _ratios.marketing = marketing;
        _ratios.total = treasury + marketing;
    }

    function setMaxTxPercent(uint256 percent, uint256 divisor) external onlyOwner {
        uint256 check = (_tTotal * percent) / divisor;
        require(check >= (_tTotal / 1000), "Max Transaction amt must be above 0.1% of total supply.");
        _maxTxAmount = check;
        maxTxAmountUI = (startingSupply * percent) / divisor;
    }

    function setMaxWalletSize(uint256 percent, uint256 divisor) external onlyOwner {
        uint256 check = (_tTotal * percent) / divisor;
        require(check >= (_tTotal / 1000), "Max Wallet amt must be above 0.1% of total supply.");
        _maxWalletSize = check;
        maxWalletSizeUI = (startingSupply * percent) / divisor;
    }

    function setSwapSettings(uint256 thresholdPercent, uint256 thresholdDivisor, uint256 amountPercent, uint256 amountDivisor) external onlyOwner {
        swapThreshold = (_tTotal * thresholdPercent) / thresholdDivisor;
        swapAmount = (_tTotal * amountPercent) / amountDivisor;
    }

    function setWallets(address payable marketingWallet, address payable treasuryWallet) external onlyOwner {
        _marketingWallet = payable(marketingWallet);
        _treasuryWallet = payable(treasuryWallet);
    }

    function setContractSwapEnabled(bool _enabled) public onlyOwner {
        contractSwapEnabled = _enabled;
        emit ContractSwapEnabledUpdated(_enabled);
    }

    function _hasLimits(address from, address to) private view returns (bool) {
        return from != owner()
            && to != owner()
            && !_liquidityHolders[to]
            && !_liquidityHolders[from]
            && to != DEAD
            && to != address(0)
            && from != address(this);
    }

    function tokenFromReflection(uint256 rAmount) public view returns(uint256) {
        require(rAmount <= _rTotal, "Amount must be less than total reflections");
        uint256 currentRate =  _getRate();
        return rAmount / currentRate;
    }

    function _transfer(address from, address to, uint256 amount) internal returns (bool) {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");
        require(amount > 0, "Transfer amount must be greater than zero");
        if(_hasLimits(from, to)) {
            if(!tradingEnabled) {
                revert("Trading not yet enabled!");
            }
            if(lpPairs[from] || lpPairs[to]){
                require(amount <= _maxTxAmount, "Transfer amount exceeds the maxTxAmount.");
            }
            if(to != _routerAddress && !lpPairs[to]) {
                require(balanceOf(to) + amount <= _maxWalletSize, "Transfer amount exceeds the maxWalletSize.");
            }
        }

        bool takeFee = true;
        if(_isExcludedFromFees[from] || _isExcludedFromFees[to]){
            takeFee = false;
        }

        if (lpPairs[to]) {
            if (!inSwap
                && contractSwapEnabled
            ) {
                uint256 contractTokenBalance = balanceOf(address(this));
                if (contractTokenBalance >= swapThreshold) {
                    if(contractTokenBalance >= swapAmount) { contractTokenBalance = swapAmount; }
                    contractSwap(contractTokenBalance);
                }
            }      
        } 
        return _finalizeTransfer(from, to, amount, takeFee);
    }

    function contractSwap(uint256 contractTokenBalance) private lockTheSwap {
        if (_ratios.total == 0)
            return;

        if(_allowances[address(this)][address(dexRouter)] != type(uint256).max) {
            _allowances[address(this)][address(dexRouter)] = type(uint256).max;
        }
        
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = dexRouter.WETH();

        dexRouter.swapExactTokensForETHSupportingFeeOnTransferTokens(
            contractTokenBalance,
            0, // accept any amount of ETH
            path,
            address(this),
            block.timestamp
        );

        if (address(this).balance > 0) {
            _marketingWallet.transfer(address(this).balance * _ratios.marketing / _ratios.total);
            _treasuryWallet.transfer(address(this).balance);
        }
    }

    function _checkLiquidityAdd(address from, address to) private {
        require(!_hasLiqBeenAdded, "Liquidity already added and marked.");
        if (!_hasLimits(from, to) && to == lpPair) {
            _liquidityHolders[from] = true;
            _hasLiqBeenAdded = true;
            if(address(antiSnipe) == address(0)){
                antiSnipe = AntiSnipe(address(this));
            }
            contractSwapEnabled = true;
            emit ContractSwapEnabledUpdated(true);
        }
    }

    function enableTrading() public onlyOwner {
        require(!tradingEnabled, "Trading already enabled!");
        require(_hasLiqBeenAdded, "Liquidity must be added.");
        setExcludedFromReward(address(this), true);
        setExcludedFromReward(lpPair, true);
        try antiSnipe.setLaunch(lpPair, uint32(block.number), uint64(block.timestamp)) {} catch {}
        tradingEnabled = true;
    }

    function sweepContingency() external onlyOwner {
        require(!_hasLiqBeenAdded, "Cannot call after liquidity.");
        payable(owner()).transfer(address(this).balance);
    }

    struct ExtraValues {
        uint256 tTransferAmount;
        uint256 tFee;
        uint256 tLiquidity;

        uint256 rTransferAmount;
        uint256 rAmount;
        uint256 rFee;
    }

    function _finalizeTransfer(address from, address to, uint256 tAmount, bool takeFee) private returns (bool) {
        if (!_hasLiqBeenAdded) {
            _checkLiquidityAdd(from, to);
            if (!_hasLiqBeenAdded && _hasLimits(from, to)) {
                revert("Only owner can transfer at this time.");
            }
        }

        ExtraValues memory values = _getValues(from, to, tAmount, takeFee);

        _rOwned[from] = _rOwned[from] - values.rAmount;
        _rOwned[to] = _rOwned[to] + values.rTransferAmount;

        if (_isExcluded[from] && !_isExcluded[to]) {
            _tOwned[from] = _tOwned[from] - tAmount;
        } else if (!_isExcluded[from] && _isExcluded[to]) {
            _tOwned[to] = _tOwned[to] + values.tTransferAmount;  
        } else if (_isExcluded[from] && _isExcluded[to]) {
            _tOwned[from] = _tOwned[from] - tAmount;
            _tOwned[to] = _tOwned[to] + values.tTransferAmount;
        }

        if (values.tLiquidity > 0)
            _takeLiquidity(from, values.tLiquidity);
        if (values.rFee > 0 || values.tFee > 0)
            _rTotal -= values.rFee;
            _tFeeTotal += values.tFee;

        emit Transfer(from, to, values.tTransferAmount);
        return true;
    }

    function _getValues(address from, address to, uint256 tAmount, bool takeFee) private returns (ExtraValues memory) {
        ExtraValues memory values;
        uint256 currentRate = _getRate();

        values.rAmount = tAmount * currentRate;

        if (_hasLimits(from, to)) {
            bool checked;
            try antiSnipe.checkUser(from, to, tAmount) returns (bool check) {
                checked = check;
            } catch {
                revert();
            }

            if(!checked) {
                revert();
            }
        }

        if(takeFee) {
            if (lpPairs[to]) {
                currentTaxes.reflectFee = _sellTaxes.reflectFee;
                currentTaxes.treasuryFee = _sellTaxes.treasuryFee;
                currentTaxes.marketingFee = _sellTaxes.marketingFee;
            } else if (lpPairs[from]) {
                currentTaxes.reflectFee = _buyTaxes.reflectFee;
                currentTaxes.treasuryFee = _buyTaxes.treasuryFee;
                currentTaxes.marketingFee = _buyTaxes.marketingFee;
            } else {
                currentTaxes.reflectFee = _transferTaxes.reflectFee;
                currentTaxes.treasuryFee = _transferTaxes.treasuryFee;
                currentTaxes.marketingFee = _transferTaxes.marketingFee;
            }

            values.tFee = (tAmount * currentTaxes.reflectFee) / staticVals.masterTaxDivisor;
            values.tLiquidity = (tAmount * (currentTaxes.treasuryFee + currentTaxes.marketingFee)) / staticVals.masterTaxDivisor;
            values.tTransferAmount = tAmount - (values.tFee + values.tLiquidity);

            values.rFee = values.tFee * currentRate;
        } else {
            values.tFee = 0;
            values.tLiquidity = 0;
            values.tTransferAmount = tAmount;

            values.rFee = 0;
        }
        values.rTransferAmount = values.rAmount - (values.rFee + (values.tLiquidity * currentRate));
        return values;
    }

    function _getRate() internal view returns(uint256) {
        uint256 rSupply = _rTotal;
        uint256 tSupply = _tTotal;
        for (uint256 i = 0; i < _excluded.length; i++) {
            if (_rOwned[_excluded[i]] > rSupply || _tOwned[_excluded[i]] > tSupply) return _rTotal / _tTotal;
            rSupply = rSupply - _rOwned[_excluded[i]];
            tSupply = tSupply - _tOwned[_excluded[i]];
        }
        if (rSupply < _rTotal / _tTotal) return _rTotal / _tTotal;
        return rSupply / tSupply;
    }

    function _takeLiquidity(address sender, uint256 tLiquidity) private {
        _rOwned[address(this)] = _rOwned[address(this)] + (tLiquidity * _getRate());
        if(_isExcluded[address(this)])
            _tOwned[address(this)] = _tOwned[address(this)] + tLiquidity;
        emit Transfer(sender, address(this), tLiquidity); // Transparency is the key to success.
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"payable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"ContractSwapEnabledUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"minTokensBeforeSwap","type":"uint256"}],"name":"MinTokensBeforeSwapUpdated","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":"address","name":"sniperAddress","type":"address"}],"name":"SniperCaught","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":"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"},{"inputs":[],"name":"DEAD","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_buyTaxes","outputs":[{"internalType":"uint16","name":"reflectFee","type":"uint16"},{"internalType":"uint16","name":"treasuryFee","type":"uint16"},{"internalType":"uint16","name":"marketingFee","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_hasLiqBeenAdded","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_ratios","outputs":[{"internalType":"uint16","name":"treasury","type":"uint16"},{"internalType":"uint16","name":"marketing","type":"uint16"},{"internalType":"uint16","name":"total","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_sellTaxes","outputs":[{"internalType":"uint16","name":"reflectFee","type":"uint16"},{"internalType":"uint16","name":"treasuryFee","type":"uint16"},{"internalType":"uint16","name":"marketingFee","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_transferTaxes","outputs":[{"internalType":"uint16","name":"reflectFee","type":"uint16"},{"internalType":"uint16","name":"treasuryFee","type":"uint16"},{"internalType":"uint16","name":"marketingFee","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"holder","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":[],"name":"approveContractContingency","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractSwapEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"dexRouter","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSniperAmt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isBlacklisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromReward","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpPair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTxAmountUI","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWalletSizeUI","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"removeBlacklisted","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"removeSniper","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setContractSwapEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setExcludedFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setExcludedFromReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"initializer","type":"address"}],"name":"setInitializer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setLpPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"percent","type":"uint256"},{"internalType":"uint256","name":"divisor","type":"uint256"}],"name":"setMaxTxPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"percent","type":"uint256"},{"internalType":"uint256","name":"divisor","type":"uint256"}],"name":"setMaxWalletSize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newRouter","type":"address"}],"name":"setNewRouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_antiSnipe","type":"bool"},{"internalType":"bool","name":"_antiGas","type":"bool"},{"internalType":"bool","name":"_antiBlock","type":"bool"},{"internalType":"bool","name":"_antiSpecial","type":"bool"}],"name":"setProtectionSettings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"treasury","type":"uint16"},{"internalType":"uint16","name":"marketing","type":"uint16"}],"name":"setRatios","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"thresholdPercent","type":"uint256"},{"internalType":"uint256","name":"thresholdDivisor","type":"uint256"},{"internalType":"uint256","name":"amountPercent","type":"uint256"},{"internalType":"uint256","name":"amountDivisor","type":"uint256"}],"name":"setSwapSettings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"reflectFee","type":"uint16"},{"internalType":"uint16","name":"treasuryFee","type":"uint16"},{"internalType":"uint16","name":"marketingFee","type":"uint16"}],"name":"setTaxesBuy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"reflectFee","type":"uint16"},{"internalType":"uint16","name":"treasuryFee","type":"uint16"},{"internalType":"uint16","name":"marketingFee","type":"uint16"}],"name":"setTaxesSell","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"reflectFee","type":"uint16"},{"internalType":"uint16","name":"treasuryFee","type":"uint16"},{"internalType":"uint16","name":"marketingFee","type":"uint16"}],"name":"setTaxesTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"marketingWallet","type":"address"},{"internalType":"address payable","name":"treasuryWallet","type":"address"}],"name":"setWallets","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"staticVals","outputs":[{"internalType":"uint16","name":"maxReflectFee","type":"uint16"},{"internalType":"uint16","name":"maxLiquidityFee","type":"uint16"},{"internalType":"uint16","name":"maxMarketingFee","type":"uint16"},{"internalType":"uint16","name":"masterTaxDivisor","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sweepContingency","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"rAmount","type":"uint256"}],"name":"tokenFromReflection","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

6000600481815566038d7ea4c68000600a908155608083905260a083905260c092909252600b805465ffffffffffff19908116909155606460e08190526101906101008190526101f4610120819052600c805485166501f401900064908117909155610140849052610160839052610180829052600d80548616821790556101a0939093526101c0919091526101e052600e805483169091179055610200919091526005610220526009610240819052600f8054909216640900050004179091556102e06040526103206102608190526102808190526102a0526127106102c052601080546001600160401b0319166727100320032003201790556011805460ff191682179055620001119162000814565b600a546200012091906200082c565b6012819055620001339060001962000864565b62000141906000196200087b565b601355601780546001600160a01b03191673905a29d4046e6f534d6c116550a24eb1ab4f715c17905560188054600161ff0160a01b031916732501fa56de1ec28189f2916c80149b867230345a1790556019808055612710601a8190556012549091620001ae916200082c565b620001ba919062000895565b601b55601a54601954600a54620001d291906200082c565b620001de919062000895565b601c556019601d556103e8601e55601e54601d546012546200020191906200082c565b6200020d919062000895565b601f55601e54601d54600a546200022591906200082c565b62000231919062000895565b60205561271060125460056200024891906200082c565b62000254919062000895565b6021556103e860125460056200026b91906200082c565b62000277919062000895565b6022556023805461ffff191690556013543360008181526001602090815260408083209490945581546001600160a01b031990811690931790915560158054737a250d5630b4cf539739df2c5dacb4c659f2488d931683179055825163c45a015560e01b81529251919263c45a01559260048083019392829003018186803b1580156200030357600080fd5b505afa15801562000318573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200033e9190620008ac565b6001600160a01b031663c9c65396601560009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156200039b57600080fd5b505afa158015620003b0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003d69190620008ac565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152306024820152604401602060405180830381600087803b1580156200041e57600080fd5b505af115801562000433573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620004599190620008ac565b601680546001600160a01b0319166001600160a01b039290921691821790556000908152600360205260409020805460ff19166001179055620004b433737a250d5630b4cf539739df2c5dacb4c659f2488d600019620005fe565b620004d730737a250d5630b4cf539739df2c5dacb4c659f2488d600019620005fe565b600160066000620004f06000546001600160a01b031690565b6001600160a01b0316815260208082019290925260409081016000908120805494151560ff199586161790553081526006909252812080548316600190811790915561dead82527f1aecba4ebe7a4e0673e4891b2b092b2228e4322380b579fb494fad3da8586e2280549093168117909255600990620005786000546001600160a01b031690565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055620005a83390565b6001600160a01b031660006001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef601254604051620005f091815260200190565b60405180910390a3620008d7565b6001600160a01b038316620006505760405162461bcd60e51b815260206004820152601360248201527245524332303a205a65726f204164647265737360681b60448201526064015b60405180910390fd5b6001600160a01b0382166200069e5760405162461bcd60e51b815260206004820152601360248201527245524332303a205a65726f204164647265737360681b604482015260640162000647565b6001600160a01b0383811660008181526005602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b634e487b7160e01b600052601160045260246000fd5b600181815b80851115620007565781600019048211156200073a576200073a620006ff565b808516156200074857918102915b93841c93908002906200071a565b509250929050565b6000826200076f575060016200080e565b816200077e575060006200080e565b8160018114620007975760028114620007a257620007c2565b60019150506200080e565b60ff841115620007b657620007b6620006ff565b50506001821b6200080e565b5060208310610133831016604e8410600b8410161715620007e7575081810a6200080e565b620007f3838362000715565b80600019048211156200080a576200080a620006ff565b0290505b92915050565b60006200082560ff8416836200075e565b9392505050565b6000816000190483118215151615620008495762000849620006ff565b500290565b634e487b7160e01b600052601260045260246000fd5b6000826200087657620008766200084e565b500690565b600082821015620008905762000890620006ff565b500390565b600082620008a757620008a76200084e565b500490565b600060208284031215620008bf57600080fd5b81516001600160a01b03811681146200082557600080fd5b6144b480620008e76000396000f3fe60806040526004361061034e5760003560e01c806370a08231116101bb578063bcd96a25116100f7578063dd62ed3e11610095578063f6540ec71161006f578063f6540ec714610a97578063fb78680d14610aad578063fdb78c0e14610acd578063fe575a8714610b0057600080fd5b8063dd62ed3e14610a1c578063eafb5a3c14610a62578063ee5d9c2d14610a8257600080fd5b8063c6a276c2116100d1578063c6a276c21461098b578063cab5ebea146109ab578063cf847706146109cb578063d3f6a157146109fc57600080fd5b8063bcd96a2514610909578063c2fa418f14610929578063c6831cd81461095a57600080fd5b80638965b55d116101645780638da5cb5b1161013e5780638da5cb5b1461081b57806395d89b4114610883578063a457c2d7146108c9578063a9059cbb146108e957600080fd5b80638965b55d146108395780638a63bd9b146108595780638a8c523c1461086e57600080fd5b806380c581d11161019557806380c581d1146107c257806388f82020146107e2578063893d20e81461081b57600080fd5b806370a0823114610737578063715018a6146107575780637b45d4311461076c57600080fd5b806333251a0b1161028a5780634fbee1931161023357806355dbc3691161020d57806355dbc369146106cc578063590ffdce146106e15780635c24b07414610701578063640384091461072157600080fd5b80634fbee1931461065457806350a8e0161461068d57806355d8ece6146106ac57600080fd5b8063452ed4f111610264578063452ed4f1146105fa5780634ada218b1461061a5780634fb2e45d1461063457600080fd5b806333251a0b1461059a57806339509351146105ba5780633f3cf56c146105da57600080fd5b80631b6afa2d116102f757806326003957116102d1578063260039571461051857806329dd8798146105385780632d83811914610558578063313ce5671461057857600080fd5b80631b6afa2d1461046d5780631e90afe3146104d857806323b872dd146104f857600080fd5b8063095ea7b311610328578063095ea7b3146103fc57806313e461921461042c57806318160ddd1461044e57600080fd5b806303fd2a451461035a57806306fdde031461038d5780630758d924146103dc57600080fd5b3661035557005b600080fd5b34801561036657600080fd5b5061037061dead81565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561039957600080fd5b5060408051808201909152600981527f474f4c204420494e55000000000000000000000000000000000000000000000060208201525b6040516103849190613f69565b3480156103e857600080fd5b50601554610370906001600160a01b031681565b34801561040857600080fd5b5061041c610417366004613ff1565b610b20565b6040519015158152602001610384565b34801561043857600080fd5b5061044c61044736600461402b565b610b36565b005b34801561045a57600080fd5b506012545b604051908152602001610384565b34801561047957600080fd5b506010546104aa9061ffff808216916201000081048216916401000000008204811691660100000000000090041684565b6040805161ffff95861681529385166020850152918416918301919091529091166060820152608001610384565b3480156104e457600080fd5b5061044c6104f336600461407b565b610ef6565b34801561050457600080fd5b5061041c6105133660046140be565b61102c565b34801561052457600080fd5b5061044c6105333660046140ff565b6110a4565b34801561054457600080fd5b5061044c610553366004614121565b6111bb565b34801561056457600080fd5b5061045f61057336600461417d565b6112a4565b34801561058457600080fd5b5060115460405160ff9091168152602001610384565b3480156105a657600080fd5b5061044c6105b5366004614196565b61133b565b3480156105c657600080fd5b5061041c6105d5366004613ff1565b61140c565b3480156105e657600080fd5b5061044c6105f53660046140ff565b611448565b34801561060657600080fd5b50601654610370906001600160a01b031681565b34801561062657600080fd5b5060235461041c9060ff1681565b34801561064057600080fd5b5061044c61064f366004614196565b61155f565b34801561066057600080fd5b5061041c61066f366004614196565b6001600160a01b031660009081526006602052604090205460ff1690565b34801561069957600080fd5b5060235461041c90610100900460ff1681565b3480156106b857600080fd5b5061044c6106c736600461407b565b6117a5565b3480156106d857600080fd5b5061045f6118db565b3480156106ed57600080fd5b5061044c6106fc36600461402b565b611968565b34801561070d57600080fd5b5061044c61071c366004614196565b6119e1565b34801561072d57600080fd5b5061045f601c5481565b34801561074357600080fd5b5061045f610752366004614196565b611b20565b34801561076357600080fd5b5061044c611b85565b34801561077857600080fd5b50600c5461079d9061ffff808216916201000081048216916401000000009091041683565b6040805161ffff94851681529284166020840152921691810191909152606001610384565b3480156107ce57600080fd5b5061044c6107dd36600461402b565b611c35565b3480156107ee57600080fd5b5061041c6107fd366004614196565b6001600160a01b031660009081526007602052604090205460ff1690565b34801561082757600080fd5b506000546001600160a01b0316610370565b34801561084557600080fd5b5061044c61085436600461407b565b611e22565b34801561086557600080fd5b5061041c611f58565b34801561087a57600080fd5b5061044c611fc7565b34801561088f57600080fd5b5060408051808201909152600481527f47494e550000000000000000000000000000000000000000000000000000000060208201526103cf565b3480156108d557600080fd5b5061041c6108e4366004613ff1565b612186565b3480156108f557600080fd5b5061041c610904366004613ff1565b6121bd565b34801561091557600080fd5b5061044c6109243660046141b3565b6121d4565b34801561093557600080fd5b50600e5461079d9061ffff808216916201000081048216916401000000009091041683565b34801561096657600080fd5b50600d5461079d9061ffff808216916201000081048216916401000000009091041683565b34801561099757600080fd5b5061044c6109a6366004614196565b6122d0565b3480156109b757600080fd5b5061044c6109c63660046141e6565b612370565b3480156109d757600080fd5b50600f5461079d9061ffff808216916201000081048216916401000000009091041683565b348015610a0857600080fd5b5061044c610a17366004614203565b612443565b348015610a2857600080fd5b5061045f610a37366004614203565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205490565b348015610a6e57600080fd5b5061044c610a7d366004614196565b6124cc565b348015610a8e57600080fd5b5061044c6128d5565b348015610aa357600080fd5b5061045f60205481565b348015610ab957600080fd5b5061044c610ac8366004614231565b6129b8565b348015610ad957600080fd5b5060185461041c907501000000000000000000000000000000000000000000900460ff1681565b348015610b0c57600080fd5b5061041c610b1b366004614196565b612a45565b6000610b2d338484612ae2565b50600192915050565b6000546001600160a01b03163314610b895760405162461bcd60e51b815260206004820152601160248201527021b0b63632b9101e979e9037bbb732b91760791b60448201526064015b60405180910390fd5b60018115151415610ccb576001600160a01b03821660009081526007602052604090205460ff1615610bfd5760405162461bcd60e51b815260206004820152601c60248201527f4163636f756e7420697320616c7265616479206578636c756465642e000000006044820152606401610b80565b6001600160a01b03821660009081526001602052604090205415610c57576001600160a01b038216600090815260016020526040902054610c3d906112a4565b6001600160a01b0383166000908152600260205260409020555b506001600160a01b03166000818152600760205260408120805460ff191660019081179091556008805491820181559091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee301805473ffffffffffffffffffffffffffffffffffffffff19169091179055565b80610ef2576001600160a01b03821660009081526007602052604090205460ff16610d385760405162461bcd60e51b815260206004820152601c60248201527f4163636f756e7420697320616c726561647920696e636c756465642e000000006044820152606401610b80565b60085460011415610db4576001600160a01b038216600090815260026020908152604080832083905560079091529020805460ff191690556008805480610d8157610d81614263565b6000828152602090208101600019908101805473ffffffffffffffffffffffffffffffffffffffff191690550190555050565b60005b600854811015610ef057826001600160a01b031660088281548110610dde57610dde614292565b6000918252602090912001546001600160a01b03161415610ede5760088054610e09906001906142f0565b81548110610e1957610e19614292565b600091825260209091200154600880546001600160a01b039092169183908110610e4557610e45614292565b6000918252602080832091909101805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b039485161790559185168152600282526040808220829055600790925220805460ff191690556008805480610eaa57610eaa614263565b6000828152602090208101600019908101805473ffffffffffffffffffffffffffffffffffffffff19169055019055610ef0565b80610ee881614307565b915050610db7565b505b5050565b6000546001600160a01b03163314610f445760405162461bcd60e51b815260206004820152601160248201527021b0b63632b9101e979e9037bbb732b91760791b6044820152606401610b80565b60105461ffff90811690841611801590610f6e575060105461ffff62010000909104811690831611155b8015610f8c575060105461ffff640100000000909104811690821611155b610f9557600080fd5b610d7a81610fa38585614322565b610fad9190614322565b61ffff161115610fbc57600080fd5b600e805461ffff928316640100000000027fffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffff00009484166201000002949094167fffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000909116179390911692909217179055565b6001600160a01b038316600090815260056020908152604080832033845290915281205460001914611091576001600160a01b03841660009081526005602090815260408083203384529091528120805484929061108b9084906142f0565b90915550505b61109c848484612bef565b949350505050565b6000546001600160a01b031633146110f25760405162461bcd60e51b815260206004820152601160248201527021b0b63632b9101e979e9037bbb732b91760791b6044820152606401610b80565b600081836012546111039190614348565b61110d9190614367565b90506103e860125461111f9190614367565b8110156111945760405162461bcd60e51b815260206004820152603260248201527f4d61782057616c6c657420616d74206d7573742062652061626f766520302e3160448201527f25206f6620746f74616c20737570706c792e00000000000000000000000000006064820152608401610b80565b601f819055600a5482906111a9908590614348565b6111b39190614367565b602055505050565b6000546001600160a01b031633146112095760405162461bcd60e51b815260206004820152601160248201527021b0b63632b9101e979e9037bbb732b91760791b6044820152606401610b80565b6023546040517f0109da690000000000000000000000000000000000000000000000000000000081528515156004820152841515602482015283151560448201528215156064820152620100009091046001600160a01b031690630109da6990608401600060405180830381600087803b15801561128657600080fd5b505af115801561129a573d6000803e3d6000fd5b5050505050505050565b600060135482111561131e5760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201527f65666c656374696f6e73000000000000000000000000000000000000000000006064820152608401610b80565b600061132861304d565b90506113348184614367565b9392505050565b6000546001600160a01b031633146113895760405162461bcd60e51b815260206004820152601160248201527021b0b63632b9101e979e9037bbb732b91760791b6044820152606401610b80565b6023546040517f33251a0b0000000000000000000000000000000000000000000000000000000081526001600160a01b03838116600483015262010000909204909116906333251a0b906024015b600060405180830381600087803b1580156113f157600080fd5b505af1158015611405573d6000803e3d6000fd5b5050505050565b3360008181526005602090815260408083206001600160a01b03871684529091528120549091610b2d9185906114439086906143a2565b612ae2565b6000546001600160a01b031633146114965760405162461bcd60e51b815260206004820152601160248201527021b0b63632b9101e979e9037bbb732b91760791b6044820152606401610b80565b600081836012546114a79190614348565b6114b19190614367565b90506103e86012546114c39190614367565b8110156115385760405162461bcd60e51b815260206004820152603760248201527f4d6178205472616e73616374696f6e20616d74206d7573742062652061626f7660448201527f6520302e3125206f6620746f74616c20737570706c792e0000000000000000006064820152608401610b80565b601b819055600a54829061154d908590614348565b6115579190614367565b601c55505050565b6000546001600160a01b031633146115ad5760405162461bcd60e51b815260206004820152601160248201527021b0b63632b9101e979e9037bbb732b91760791b6044820152606401610b80565b6001600160a01b0381166116295760405162461bcd60e51b815260206004820152603d60248201527f43616c6c2072656e6f756e63654f776e65727368697020746f207472616e736660448201527f6572206f776e657220746f20746865207a65726f20616464726573732e0000006064820152608401610b80565b6001600160a01b03811661dead14156116aa5760405162461bcd60e51b815260206004820152603d60248201527f43616c6c2072656e6f756e63654f776e65727368697020746f207472616e736660448201527f6572206f776e657220746f20746865207a65726f20616464726573732e0000006064820152608401610b80565b600080546116c3916001600160a01b0390911690611968565b6116ce816001611968565b6000546017546001600160a01b0390811691161415611710576017805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383161790555b60008054611726906001600160a01b0316611b20565b111561174d5760005461174b906001600160a01b03168261174682611b20565b612bef565b505b6000805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383169081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a350565b6000546001600160a01b031633146117f35760405162461bcd60e51b815260206004820152601160248201527021b0b63632b9101e979e9037bbb732b91760791b6044820152606401610b80565b60105461ffff9081169084161180159061181d575060105461ffff62010000909104811690831611155b801561183b575060105461ffff640100000000909104811690821611155b61184457600080fd5b610d7a816118528585614322565b61185c9190614322565b61ffff16111561186b57600080fd5b600c805461ffff928316640100000000027fffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffff00009484166201000002949094167fffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000909116179390911692909217179055565b6000602360029054906101000a90046001600160a01b03166001600160a01b03166355dbc3696040518163ffffffff1660e01b815260040160206040518083038186803b15801561192b57600080fd5b505afa15801561193f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061196391906143ba565b905090565b6000546001600160a01b031633146119b65760405162461bcd60e51b815260206004820152601160248201527021b0b63632b9101e979e9037bbb732b91760791b6044820152606401610b80565b6001600160a01b03919091166000908152600660205260409020805460ff1916911515919091179055565b6000546001600160a01b03163314611a2f5760405162461bcd60e51b815260206004820152601160248201527021b0b63632b9101e979e9037bbb732b91760791b6044820152606401610b80565b602354610100900460ff1615611a875760405162461bcd60e51b815260206004820152601860248201527f4c697175696469747920697320616c726561647920696e2e00000000000000006044820152606401610b80565b6001600160a01b038116301415611ae05760405162461bcd60e51b815260206004820152600e60248201527f43616e27742062652073656c662e0000000000000000000000000000000000006044820152606401610b80565b602380546001600160a01b0390921662010000027fffffffffffffffffffff0000000000000000000000000000000000000000ffff909216919091179055565b6001600160a01b03811660009081526007602052604081205460ff1615611b5d57506001600160a01b031660009081526002602052604090205490565b6001600160a01b038216600090815260016020526040902054611b7f906112a4565b92915050565b6000546001600160a01b03163314611bd35760405162461bcd60e51b815260206004820152601160248201527021b0b63632b9101e979e9037bbb732b91760791b6044820152606401610b80565b60008054611bec916001600160a01b0390911690611968565b6000805473ffffffffffffffffffffffffffffffffffffffff1916815560405181907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3565b6000546001600160a01b03163314611c835760405162461bcd60e51b815260206004820152601160248201527021b0b63632b9101e979e9037bbb732b91760791b6044820152606401610b80565b80611d2b576001600160a01b03828116600081815260036020526040808220805460ff1916905560235490517f80c581d100000000000000000000000000000000000000000000000000000000815260048101939093526024830191909152620100009004909116906380c581d190604401600060405180830381600087803b158015611d0f57600080fd5b505af1158015611d23573d6000803e3d6000fd5b505050505050565b60045415611d92576203f48060045442611d4591906142f0565b11611d925760405162461bcd60e51b815260206004820181905260248201527f43616e6e6f74207365742061206e657720706169722074686973207765656b216044820152606401610b80565b6001600160a01b0382811660008181526003602052604090819020805460ff1916600190811790915542600490815560235492517f80c581d1000000000000000000000000000000000000000000000000000000008152908101939093526024830152620100009004909116906380c581d190604401600060405180830381600087803b158015611d0f57600080fd5b6000546001600160a01b03163314611e705760405162461bcd60e51b815260206004820152601160248201527021b0b63632b9101e979e9037bbb732b91760791b6044820152606401610b80565b60105461ffff90811690841611801590611e9a575060105461ffff62010000909104811690831611155b8015611eb8575060105461ffff640100000000909104811690821611155b611ec157600080fd5b610d7a81611ecf8585614322565b611ed99190614322565b61ffff161115611ee857600080fd5b600d805461ffff928316640100000000027fffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffff00009484166201000002949094167fffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000909116179390911692909217179055565b600080546001600160a01b03163314611fa75760405162461bcd60e51b815260206004820152601160248201527021b0b63632b9101e979e9037bbb732b91760791b6044820152606401610b80565b601554611fc19030906001600160a01b0316600019612ae2565b50600190565b6000546001600160a01b031633146120155760405162461bcd60e51b815260206004820152601160248201527021b0b63632b9101e979e9037bbb732b91760791b6044820152606401610b80565b60235460ff16156120685760405162461bcd60e51b815260206004820152601860248201527f54726164696e6720616c726561647920656e61626c65642100000000000000006044820152606401610b80565b602354610100900460ff166120bf5760405162461bcd60e51b815260206004820152601860248201527f4c6971756964697479206d7573742062652061646465642e00000000000000006044820152606401610b80565b6120ca306001610b36565b6016546120e1906001600160a01b03166001610b36565b6023546016546040517f4b38f1d40000000000000000000000000000000000000000000000000000000081526001600160a01b03918216600482015263ffffffff4316602482015267ffffffffffffffff42166044820152620100009092041690634b38f1d490606401600060405180830381600087803b15801561216557600080fd5b505af1925050508015612176575060015b506023805460ff19166001179055565b3360008181526005602090815260408083206001600160a01b03871684529091528120549091610b2d9185906114439086906142f0565b60006121ca338484612bef565b5060019392505050565b6000546001600160a01b031633146122225760405162461bcd60e51b815260206004820152601160248201527021b0b63632b9101e979e9037bbb732b91760791b6044820152606401610b80565b606361222e8284614322565b61ffff1610156122805760405162461bcd60e51b815260206004820152601b60248201527f4d7573742061646420757020746f2031303025206f72203939252e00000000006044820152606401610b80565b600f805461ffff838116620100000263ffffffff19909216908516171790556122a98183614322565b600f805461ffff929092166401000000000265ffff00000000199092169190911790555050565b6000546001600160a01b0316331461231e5760405162461bcd60e51b815260206004820152601160248201527021b0b63632b9101e979e9037bbb732b91760791b6044820152606401610b80565b6023546040517fc6a276c20000000000000000000000000000000000000000000000000000000081526001600160a01b038381166004830152620100009092049091169063c6a276c2906024016113d7565b6000546001600160a01b031633146123be5760405162461bcd60e51b815260206004820152601160248201527021b0b63632b9101e979e9037bbb732b91760791b6044820152606401610b80565b601880548215157501000000000000000000000000000000000000000000027fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff9091161790556040517f7b0a47d3b0234280b6c9213c5bbff44c8b6001bea7770b3950280f91410532579061243890831515815260200190565b60405180910390a150565b6000546001600160a01b031633146124915760405162461bcd60e51b815260206004820152601160248201527021b0b63632b9101e979e9037bbb732b91760791b6044820152606401610b80565b601780546001600160a01b0393841673ffffffffffffffffffffffffffffffffffffffff199182161790915560188054929093169116179055565b6000546001600160a01b0316331461251a5760405162461bcd60e51b815260206004820152601160248201527021b0b63632b9101e979e9037bbb732b91760791b6044820152606401610b80565b60008190506000816001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b15801561255a57600080fd5b505afa15801561256e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061259291906143d3565b6001600160a01b031663e6a4390530846001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156125da57600080fd5b505afa1580156125ee573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061261291906143d3565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b0392831660048201529116602482015260440160206040518083038186803b15801561267057600080fd5b505afa158015612684573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126a891906143d3565b90506001600160a01b03811661287357816001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b1580156126f157600080fd5b505afa158015612705573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061272991906143d3565b6001600160a01b031663c9c6539630846001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b15801561277157600080fd5b505afa158015612785573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127a991906143d3565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381600087803b15801561280957600080fd5b505af115801561281d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061284191906143d3565b6016805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b039290921691909117905561289c565b6016805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383161790555b6015805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b038416908117909155610ef0903090600019612ae2565b6000546001600160a01b031633146129235760405162461bcd60e51b815260206004820152601160248201527021b0b63632b9101e979e9037bbb732b91760791b6044820152606401610b80565b602354610100900460ff161561297b5760405162461bcd60e51b815260206004820152601c60248201527f43616e6e6f742063616c6c206166746572206c69717569646974792e000000006044820152606401610b80565b600080546040516001600160a01b03909116914780156108fc02929091818181858888f193505050501580156129b5573d6000803e3d6000fd5b50565b6000546001600160a01b03163314612a065760405162461bcd60e51b815260206004820152601160248201527021b0b63632b9101e979e9037bbb732b91760791b6044820152606401610b80565b8284601254612a159190614348565b612a1f9190614367565b6021556012548190612a32908490614348565b612a3c9190614367565b60225550505050565b6023546040517ffe575a870000000000000000000000000000000000000000000000000000000081526001600160a01b038381166004830152600092620100009004169063fe575a879060240160206040518083038186803b158015612aaa57600080fd5b505afa158015612abe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b7f91906143f0565b6001600160a01b038316612b385760405162461bcd60e51b815260206004820152601360248201527f45524332303a205a65726f2041646472657373000000000000000000000000006044820152606401610b80565b6001600160a01b038216612b8e5760405162461bcd60e51b815260206004820152601360248201527f45524332303a205a65726f2041646472657373000000000000000000000000006044820152606401610b80565b6001600160a01b0383811660008181526005602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60006001600160a01b038416612c6d5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610b80565b6001600160a01b038316612ce95760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610b80565b60008211612d5f5760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d75737420626520677265617465722060448201527f7468616e207a65726f00000000000000000000000000000000000000000000006064820152608401610b80565b612d6984846131de565b15612f525760235460ff16612dc05760405162461bcd60e51b815260206004820152601860248201527f54726164696e67206e6f742079657420656e61626c65642100000000000000006044820152606401610b80565b6001600160a01b03841660009081526003602052604090205460ff1680612dff57506001600160a01b03831660009081526003602052604090205460ff165b15612e7c57601b54821115612e7c5760405162461bcd60e51b815260206004820152602860248201527f5472616e7366657220616d6f756e74206578636565647320746865206d61785460448201527f78416d6f756e742e0000000000000000000000000000000000000000000000006064820152608401610b80565b6001600160a01b038316737a250d5630b4cf539739df2c5dacb4c659f2488d14801590612ec257506001600160a01b03831660009081526003602052604090205460ff16155b15612f5257601f5482612ed485611b20565b612ede91906143a2565b1115612f525760405162461bcd60e51b815260206004820152602a60248201527f5472616e7366657220616d6f756e74206578636565647320746865206d61785760448201527f616c6c657453697a652e000000000000000000000000000000000000000000006064820152608401610b80565b6001600160a01b03841660009081526006602052604090205460019060ff1680612f9457506001600160a01b03841660009081526006602052604090205460ff165b15612f9d575060005b6001600160a01b03841660009081526003602052604090205460ff16156130385760185474010000000000000000000000000000000000000000900460ff1615801561300457506018547501000000000000000000000000000000000000000000900460ff165b1561303857600061301430611b20565b9050602154811061303657602254811061302d57506022545b6130368161329b565b505b613044858585846135a4565b95945050505050565b60135460125460009190825b6008548110156131a55782600160006008848154811061307b5761307b614292565b60009182526020808320909101546001600160a01b0316835282019290925260400190205411806130e657508160026000600884815481106130bf576130bf614292565b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b15613103576012546013546130fb9190614367565b935050505090565b600160006008838154811061311a5761311a614292565b60009182526020808320909101546001600160a01b0316835282019290925260400190205461314990846142f0565b9250600260006008838154811061316257613162614292565b60009182526020808320909101546001600160a01b0316835282019290925260400190205461319190836142f0565b91508061319d81614307565b915050613059565b506012546013546131b69190614367565b8210156131d4576012546013546131cd9190614367565b9250505090565b6131cd8183614367565b600080546001600160a01b0384811691161480159061320b57506000546001600160a01b03838116911614155b801561323057506001600160a01b03821660009081526009602052604090205460ff16155b801561325557506001600160a01b03831660009081526009602052604090205460ff16155b801561326c57506001600160a01b03821661dead14155b801561328057506001600160a01b03821615155b801561133457506001600160a01b0383163014159392505050565b601880547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1674010000000000000000000000000000000000000000179055600f5461ffff640100000000909104166132f357613579565b3060009081526005602090815260408083206015546001600160a01b031684529091529020546000191461334c573060009081526005602090815260408083206015546001600160a01b03168452909152902060001990555b604080516002808252606082018352600092602083019080368337019050509050308160008151811061338157613381614292565b6001600160a01b03928316602091820292909201810191909152601554604080517fad5c46480000000000000000000000000000000000000000000000000000000081529051919093169263ad5c4648926004808301939192829003018186803b1580156133ee57600080fd5b505afa158015613402573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061342691906143d3565b8160018151811061343957613439614292565b6001600160a01b0392831660209182029290920101526015546040517f791ac94700000000000000000000000000000000000000000000000000000000815291169063791ac9479061349890859060009086903090429060040161440d565b600060405180830381600087803b1580156134b257600080fd5b505af11580156134c6573d6000803e3d6000fd5b50505050600047111561357757601754600f546001600160a01b03909116906108fc9061ffff640100000000820481169161350991620100009091041647614348565b6135139190614367565b6040518115909202916000818181858888f1935050505015801561353b573d6000803e3d6000fd5b506018546040516001600160a01b03909116904780156108fc02916000818181858888f19350505050158015613575573d6000803e3d6000fd5b505b505b50601880547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff169055565b602354600090610100900460ff16613650576135c08585613956565b602354610100900460ff161580156135dd57506135dd85856131de565b156136505760405162461bcd60e51b815260206004820152602560248201527f4f6e6c79206f776e65722063616e207472616e7366657220617420746869732060448201527f74696d652e0000000000000000000000000000000000000000000000000000006064820152608401610b80565b600061365e86868686613b02565b60808101516001600160a01b038816600090815260016020526040902054919250613688916142f0565b6001600160a01b03808816600090815260016020526040808220939093556060840151918816815291909120546136bf91906143a2565b6001600160a01b0380871660009081526001602090815260408083209490945591891681526007909152205460ff16801561371357506001600160a01b03851660009081526007602052604090205460ff16155b1561375a576001600160a01b03861660009081526002602052604090205461373c9085906142f0565b6001600160a01b03871660009081526002602052604090205561389a565b6001600160a01b03861660009081526007602052604090205460ff1615801561379b57506001600160a01b03851660009081526007602052604090205460ff165b156137e35780516001600160a01b0386166000908152600260205260409020546137c591906143a2565b6001600160a01b03861660009081526002602052604090205561389a565b6001600160a01b03861660009081526007602052604090205460ff16801561382357506001600160a01b03851660009081526007602052604090205460ff165b1561389a576001600160a01b03861660009081526002602052604090205461384c9085906142f0565b6001600160a01b038088166000908152600260205260408082209390935583519188168152919091205461388091906143a2565b6001600160a01b0386166000908152600260205260409020555b6040810151156138b2576138b2868260400151613ea9565b60008160a0015111806138c9575060008160200151115b156138ea578060a00151601360008282546138e491906142f0565b90915550505b80602001516014600082825461390091906143a2565b909155505080516040519081526001600160a01b0386811691908816907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a350600195945050505050565b602354610100900460ff16156139d45760405162461bcd60e51b815260206004820152602360248201527f4c697175696469747920616c726561647920616464656420616e64206d61726b60448201527f65642e00000000000000000000000000000000000000000000000000000000006064820152608401610b80565b6139de82826131de565b1580156139f857506016546001600160a01b038281169116145b15610ef2576001600160a01b038083166000908152600960205260409020805460ff19166001179055602380547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16610100179081905562010000900416613a8a57602380547fffffffffffffffffffff0000000000000000000000000000000000000000ffff163062010000021790555b601880547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff167501000000000000000000000000000000000000000000179055604051600181527f7b0a47d3b0234280b6c9213c5bbff44c8b6001bea7770b3950280f91410532579060200160405180910390a15050565b613b3b6040518060c001604052806000815260200160008152602001600081526020016000815260200160008152602001600081525090565b613b746040518060c001604052806000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6000613b7e61304d565b9050613b8a8186614348565b6080830152613b9987876131de565b15613c79576023546040517fecd07a530000000000000000000000000000000000000000000000000000000081526001600160a01b038981166004830152888116602483015260448201889052600092620100009004169063ecd07a5390606401602060405180830381600087803b158015613c1457600080fd5b505af1925050508015613c62575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252613c5f918101906143f0565b60015b613c6b57600080fd5b905080613c7757600080fd5b505b8315613e53576001600160a01b03861660009081526003602052604090205460ff1615613cea57600d54600b805461ffff80841663ffffffff1990921691909117620100008085048316021765ffff0000000019166401000000009384900491909116909202919091179055613d9b565b6001600160a01b03871660009081526003602052604090205460ff1615613d5557600c54600b805461ffff80841663ffffffff1990921691909117620100008085048316021765ffff0000000019166401000000009384900491909116909202919091179055613d9b565b600e54600b805461ffff80841663ffffffff1990921691909117620100008085048316021765ffff00000000191664010000000093849004919091169092029190911790555b601054600b5461ffff6601000000000000909204821691613dbd911687614348565b613dc79190614367565b6020830152601054600b5461ffff6601000000000000909204821691613dff9164010000000081048216916201000090910416614322565b613e0d9061ffff1687614348565b613e179190614367565b604083018190526020830151613e2d91906143a2565b613e3790866142f0565b82526020820151613e49908290614348565b60a0830152613e6c565b6000602083018190526040830181905285835260a08301525b808260400151613e7c9190614348565b8260a00151613e8b91906143a2565b8260800151613e9a91906142f0565b60608301525095945050505050565b613eb161304d565b613ebb9082614348565b30600090815260016020526040902054613ed591906143a2565b3060009081526001602090815260408083209390935560079052205460ff1615613f255730600090815260026020526040902054613f149082906143a2565b306000908152600260205260409020555b60405181815230906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b600060208083528351808285015260005b81811015613f9657858101830151858201604001528201613f7a565b81811115613fa8576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b6001600160a01b03811681146129b557600080fd5b6000806040838503121561400457600080fd5b823561400f81613fdc565b946020939093013593505050565b80151581146129b557600080fd5b6000806040838503121561403e57600080fd5b823561404981613fdc565b915060208301356140598161401d565b809150509250929050565b803561ffff8116811461407657600080fd5b919050565b60008060006060848603121561409057600080fd5b61409984614064565b92506140a760208501614064565b91506140b560408501614064565b90509250925092565b6000806000606084860312156140d357600080fd5b83356140de81613fdc565b925060208401356140ee81613fdc565b929592945050506040919091013590565b6000806040838503121561411257600080fd5b50508035926020909101359150565b6000806000806080858703121561413757600080fd5b84356141428161401d565b935060208501356141528161401d565b925060408501356141628161401d565b915060608501356141728161401d565b939692955090935050565b60006020828403121561418f57600080fd5b5035919050565b6000602082840312156141a857600080fd5b813561133481613fdc565b600080604083850312156141c657600080fd5b6141cf83614064565b91506141dd60208401614064565b90509250929050565b6000602082840312156141f857600080fd5b81356113348161401d565b6000806040838503121561421657600080fd5b823561422181613fdc565b9150602083013561405981613fdc565b6000806000806080858703121561424757600080fd5b5050823594602084013594506040840135936060013592509050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015614302576143026142c1565b500390565b600060001982141561431b5761431b6142c1565b5060010190565b600061ffff80831681851680830382111561433f5761433f6142c1565b01949350505050565b6000816000190483118215151615614362576143626142c1565b500290565b60008261439d577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b600082198211156143b5576143b56142c1565b500190565b6000602082840312156143cc57600080fd5b5051919050565b6000602082840312156143e557600080fd5b815161133481613fdc565b60006020828403121561440257600080fd5b81516113348161401d565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b8181101561445d5784516001600160a01b031683529383019391830191600101614438565b50506001600160a01b0396909616606085015250505060800152939250505056fea26469706673582212201a927297078c6c4f5553197b1d0a9bfb919a00cf6446fa9832b56866f1d2909964736f6c63430008090033

Deployed Bytecode

0x60806040526004361061034e5760003560e01c806370a08231116101bb578063bcd96a25116100f7578063dd62ed3e11610095578063f6540ec71161006f578063f6540ec714610a97578063fb78680d14610aad578063fdb78c0e14610acd578063fe575a8714610b0057600080fd5b8063dd62ed3e14610a1c578063eafb5a3c14610a62578063ee5d9c2d14610a8257600080fd5b8063c6a276c2116100d1578063c6a276c21461098b578063cab5ebea146109ab578063cf847706146109cb578063d3f6a157146109fc57600080fd5b8063bcd96a2514610909578063c2fa418f14610929578063c6831cd81461095a57600080fd5b80638965b55d116101645780638da5cb5b1161013e5780638da5cb5b1461081b57806395d89b4114610883578063a457c2d7146108c9578063a9059cbb146108e957600080fd5b80638965b55d146108395780638a63bd9b146108595780638a8c523c1461086e57600080fd5b806380c581d11161019557806380c581d1146107c257806388f82020146107e2578063893d20e81461081b57600080fd5b806370a0823114610737578063715018a6146107575780637b45d4311461076c57600080fd5b806333251a0b1161028a5780634fbee1931161023357806355dbc3691161020d57806355dbc369146106cc578063590ffdce146106e15780635c24b07414610701578063640384091461072157600080fd5b80634fbee1931461065457806350a8e0161461068d57806355d8ece6146106ac57600080fd5b8063452ed4f111610264578063452ed4f1146105fa5780634ada218b1461061a5780634fb2e45d1461063457600080fd5b806333251a0b1461059a57806339509351146105ba5780633f3cf56c146105da57600080fd5b80631b6afa2d116102f757806326003957116102d1578063260039571461051857806329dd8798146105385780632d83811914610558578063313ce5671461057857600080fd5b80631b6afa2d1461046d5780631e90afe3146104d857806323b872dd146104f857600080fd5b8063095ea7b311610328578063095ea7b3146103fc57806313e461921461042c57806318160ddd1461044e57600080fd5b806303fd2a451461035a57806306fdde031461038d5780630758d924146103dc57600080fd5b3661035557005b600080fd5b34801561036657600080fd5b5061037061dead81565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561039957600080fd5b5060408051808201909152600981527f474f4c204420494e55000000000000000000000000000000000000000000000060208201525b6040516103849190613f69565b3480156103e857600080fd5b50601554610370906001600160a01b031681565b34801561040857600080fd5b5061041c610417366004613ff1565b610b20565b6040519015158152602001610384565b34801561043857600080fd5b5061044c61044736600461402b565b610b36565b005b34801561045a57600080fd5b506012545b604051908152602001610384565b34801561047957600080fd5b506010546104aa9061ffff808216916201000081048216916401000000008204811691660100000000000090041684565b6040805161ffff95861681529385166020850152918416918301919091529091166060820152608001610384565b3480156104e457600080fd5b5061044c6104f336600461407b565b610ef6565b34801561050457600080fd5b5061041c6105133660046140be565b61102c565b34801561052457600080fd5b5061044c6105333660046140ff565b6110a4565b34801561054457600080fd5b5061044c610553366004614121565b6111bb565b34801561056457600080fd5b5061045f61057336600461417d565b6112a4565b34801561058457600080fd5b5060115460405160ff9091168152602001610384565b3480156105a657600080fd5b5061044c6105b5366004614196565b61133b565b3480156105c657600080fd5b5061041c6105d5366004613ff1565b61140c565b3480156105e657600080fd5b5061044c6105f53660046140ff565b611448565b34801561060657600080fd5b50601654610370906001600160a01b031681565b34801561062657600080fd5b5060235461041c9060ff1681565b34801561064057600080fd5b5061044c61064f366004614196565b61155f565b34801561066057600080fd5b5061041c61066f366004614196565b6001600160a01b031660009081526006602052604090205460ff1690565b34801561069957600080fd5b5060235461041c90610100900460ff1681565b3480156106b857600080fd5b5061044c6106c736600461407b565b6117a5565b3480156106d857600080fd5b5061045f6118db565b3480156106ed57600080fd5b5061044c6106fc36600461402b565b611968565b34801561070d57600080fd5b5061044c61071c366004614196565b6119e1565b34801561072d57600080fd5b5061045f601c5481565b34801561074357600080fd5b5061045f610752366004614196565b611b20565b34801561076357600080fd5b5061044c611b85565b34801561077857600080fd5b50600c5461079d9061ffff808216916201000081048216916401000000009091041683565b6040805161ffff94851681529284166020840152921691810191909152606001610384565b3480156107ce57600080fd5b5061044c6107dd36600461402b565b611c35565b3480156107ee57600080fd5b5061041c6107fd366004614196565b6001600160a01b031660009081526007602052604090205460ff1690565b34801561082757600080fd5b506000546001600160a01b0316610370565b34801561084557600080fd5b5061044c61085436600461407b565b611e22565b34801561086557600080fd5b5061041c611f58565b34801561087a57600080fd5b5061044c611fc7565b34801561088f57600080fd5b5060408051808201909152600481527f47494e550000000000000000000000000000000000000000000000000000000060208201526103cf565b3480156108d557600080fd5b5061041c6108e4366004613ff1565b612186565b3480156108f557600080fd5b5061041c610904366004613ff1565b6121bd565b34801561091557600080fd5b5061044c6109243660046141b3565b6121d4565b34801561093557600080fd5b50600e5461079d9061ffff808216916201000081048216916401000000009091041683565b34801561096657600080fd5b50600d5461079d9061ffff808216916201000081048216916401000000009091041683565b34801561099757600080fd5b5061044c6109a6366004614196565b6122d0565b3480156109b757600080fd5b5061044c6109c63660046141e6565b612370565b3480156109d757600080fd5b50600f5461079d9061ffff808216916201000081048216916401000000009091041683565b348015610a0857600080fd5b5061044c610a17366004614203565b612443565b348015610a2857600080fd5b5061045f610a37366004614203565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205490565b348015610a6e57600080fd5b5061044c610a7d366004614196565b6124cc565b348015610a8e57600080fd5b5061044c6128d5565b348015610aa357600080fd5b5061045f60205481565b348015610ab957600080fd5b5061044c610ac8366004614231565b6129b8565b348015610ad957600080fd5b5060185461041c907501000000000000000000000000000000000000000000900460ff1681565b348015610b0c57600080fd5b5061041c610b1b366004614196565b612a45565b6000610b2d338484612ae2565b50600192915050565b6000546001600160a01b03163314610b895760405162461bcd60e51b815260206004820152601160248201527021b0b63632b9101e979e9037bbb732b91760791b60448201526064015b60405180910390fd5b60018115151415610ccb576001600160a01b03821660009081526007602052604090205460ff1615610bfd5760405162461bcd60e51b815260206004820152601c60248201527f4163636f756e7420697320616c7265616479206578636c756465642e000000006044820152606401610b80565b6001600160a01b03821660009081526001602052604090205415610c57576001600160a01b038216600090815260016020526040902054610c3d906112a4565b6001600160a01b0383166000908152600260205260409020555b506001600160a01b03166000818152600760205260408120805460ff191660019081179091556008805491820181559091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee301805473ffffffffffffffffffffffffffffffffffffffff19169091179055565b80610ef2576001600160a01b03821660009081526007602052604090205460ff16610d385760405162461bcd60e51b815260206004820152601c60248201527f4163636f756e7420697320616c726561647920696e636c756465642e000000006044820152606401610b80565b60085460011415610db4576001600160a01b038216600090815260026020908152604080832083905560079091529020805460ff191690556008805480610d8157610d81614263565b6000828152602090208101600019908101805473ffffffffffffffffffffffffffffffffffffffff191690550190555050565b60005b600854811015610ef057826001600160a01b031660088281548110610dde57610dde614292565b6000918252602090912001546001600160a01b03161415610ede5760088054610e09906001906142f0565b81548110610e1957610e19614292565b600091825260209091200154600880546001600160a01b039092169183908110610e4557610e45614292565b6000918252602080832091909101805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b039485161790559185168152600282526040808220829055600790925220805460ff191690556008805480610eaa57610eaa614263565b6000828152602090208101600019908101805473ffffffffffffffffffffffffffffffffffffffff19169055019055610ef0565b80610ee881614307565b915050610db7565b505b5050565b6000546001600160a01b03163314610f445760405162461bcd60e51b815260206004820152601160248201527021b0b63632b9101e979e9037bbb732b91760791b6044820152606401610b80565b60105461ffff90811690841611801590610f6e575060105461ffff62010000909104811690831611155b8015610f8c575060105461ffff640100000000909104811690821611155b610f9557600080fd5b610d7a81610fa38585614322565b610fad9190614322565b61ffff161115610fbc57600080fd5b600e805461ffff928316640100000000027fffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffff00009484166201000002949094167fffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000909116179390911692909217179055565b6001600160a01b038316600090815260056020908152604080832033845290915281205460001914611091576001600160a01b03841660009081526005602090815260408083203384529091528120805484929061108b9084906142f0565b90915550505b61109c848484612bef565b949350505050565b6000546001600160a01b031633146110f25760405162461bcd60e51b815260206004820152601160248201527021b0b63632b9101e979e9037bbb732b91760791b6044820152606401610b80565b600081836012546111039190614348565b61110d9190614367565b90506103e860125461111f9190614367565b8110156111945760405162461bcd60e51b815260206004820152603260248201527f4d61782057616c6c657420616d74206d7573742062652061626f766520302e3160448201527f25206f6620746f74616c20737570706c792e00000000000000000000000000006064820152608401610b80565b601f819055600a5482906111a9908590614348565b6111b39190614367565b602055505050565b6000546001600160a01b031633146112095760405162461bcd60e51b815260206004820152601160248201527021b0b63632b9101e979e9037bbb732b91760791b6044820152606401610b80565b6023546040517f0109da690000000000000000000000000000000000000000000000000000000081528515156004820152841515602482015283151560448201528215156064820152620100009091046001600160a01b031690630109da6990608401600060405180830381600087803b15801561128657600080fd5b505af115801561129a573d6000803e3d6000fd5b5050505050505050565b600060135482111561131e5760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201527f65666c656374696f6e73000000000000000000000000000000000000000000006064820152608401610b80565b600061132861304d565b90506113348184614367565b9392505050565b6000546001600160a01b031633146113895760405162461bcd60e51b815260206004820152601160248201527021b0b63632b9101e979e9037bbb732b91760791b6044820152606401610b80565b6023546040517f33251a0b0000000000000000000000000000000000000000000000000000000081526001600160a01b03838116600483015262010000909204909116906333251a0b906024015b600060405180830381600087803b1580156113f157600080fd5b505af1158015611405573d6000803e3d6000fd5b5050505050565b3360008181526005602090815260408083206001600160a01b03871684529091528120549091610b2d9185906114439086906143a2565b612ae2565b6000546001600160a01b031633146114965760405162461bcd60e51b815260206004820152601160248201527021b0b63632b9101e979e9037bbb732b91760791b6044820152606401610b80565b600081836012546114a79190614348565b6114b19190614367565b90506103e86012546114c39190614367565b8110156115385760405162461bcd60e51b815260206004820152603760248201527f4d6178205472616e73616374696f6e20616d74206d7573742062652061626f7660448201527f6520302e3125206f6620746f74616c20737570706c792e0000000000000000006064820152608401610b80565b601b819055600a54829061154d908590614348565b6115579190614367565b601c55505050565b6000546001600160a01b031633146115ad5760405162461bcd60e51b815260206004820152601160248201527021b0b63632b9101e979e9037bbb732b91760791b6044820152606401610b80565b6001600160a01b0381166116295760405162461bcd60e51b815260206004820152603d60248201527f43616c6c2072656e6f756e63654f776e65727368697020746f207472616e736660448201527f6572206f776e657220746f20746865207a65726f20616464726573732e0000006064820152608401610b80565b6001600160a01b03811661dead14156116aa5760405162461bcd60e51b815260206004820152603d60248201527f43616c6c2072656e6f756e63654f776e65727368697020746f207472616e736660448201527f6572206f776e657220746f20746865207a65726f20616464726573732e0000006064820152608401610b80565b600080546116c3916001600160a01b0390911690611968565b6116ce816001611968565b6000546017546001600160a01b0390811691161415611710576017805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383161790555b60008054611726906001600160a01b0316611b20565b111561174d5760005461174b906001600160a01b03168261174682611b20565b612bef565b505b6000805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383169081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a350565b6000546001600160a01b031633146117f35760405162461bcd60e51b815260206004820152601160248201527021b0b63632b9101e979e9037bbb732b91760791b6044820152606401610b80565b60105461ffff9081169084161180159061181d575060105461ffff62010000909104811690831611155b801561183b575060105461ffff640100000000909104811690821611155b61184457600080fd5b610d7a816118528585614322565b61185c9190614322565b61ffff16111561186b57600080fd5b600c805461ffff928316640100000000027fffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffff00009484166201000002949094167fffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000909116179390911692909217179055565b6000602360029054906101000a90046001600160a01b03166001600160a01b03166355dbc3696040518163ffffffff1660e01b815260040160206040518083038186803b15801561192b57600080fd5b505afa15801561193f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061196391906143ba565b905090565b6000546001600160a01b031633146119b65760405162461bcd60e51b815260206004820152601160248201527021b0b63632b9101e979e9037bbb732b91760791b6044820152606401610b80565b6001600160a01b03919091166000908152600660205260409020805460ff1916911515919091179055565b6000546001600160a01b03163314611a2f5760405162461bcd60e51b815260206004820152601160248201527021b0b63632b9101e979e9037bbb732b91760791b6044820152606401610b80565b602354610100900460ff1615611a875760405162461bcd60e51b815260206004820152601860248201527f4c697175696469747920697320616c726561647920696e2e00000000000000006044820152606401610b80565b6001600160a01b038116301415611ae05760405162461bcd60e51b815260206004820152600e60248201527f43616e27742062652073656c662e0000000000000000000000000000000000006044820152606401610b80565b602380546001600160a01b0390921662010000027fffffffffffffffffffff0000000000000000000000000000000000000000ffff909216919091179055565b6001600160a01b03811660009081526007602052604081205460ff1615611b5d57506001600160a01b031660009081526002602052604090205490565b6001600160a01b038216600090815260016020526040902054611b7f906112a4565b92915050565b6000546001600160a01b03163314611bd35760405162461bcd60e51b815260206004820152601160248201527021b0b63632b9101e979e9037bbb732b91760791b6044820152606401610b80565b60008054611bec916001600160a01b0390911690611968565b6000805473ffffffffffffffffffffffffffffffffffffffff1916815560405181907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3565b6000546001600160a01b03163314611c835760405162461bcd60e51b815260206004820152601160248201527021b0b63632b9101e979e9037bbb732b91760791b6044820152606401610b80565b80611d2b576001600160a01b03828116600081815260036020526040808220805460ff1916905560235490517f80c581d100000000000000000000000000000000000000000000000000000000815260048101939093526024830191909152620100009004909116906380c581d190604401600060405180830381600087803b158015611d0f57600080fd5b505af1158015611d23573d6000803e3d6000fd5b505050505050565b60045415611d92576203f48060045442611d4591906142f0565b11611d925760405162461bcd60e51b815260206004820181905260248201527f43616e6e6f74207365742061206e657720706169722074686973207765656b216044820152606401610b80565b6001600160a01b0382811660008181526003602052604090819020805460ff1916600190811790915542600490815560235492517f80c581d1000000000000000000000000000000000000000000000000000000008152908101939093526024830152620100009004909116906380c581d190604401600060405180830381600087803b158015611d0f57600080fd5b6000546001600160a01b03163314611e705760405162461bcd60e51b815260206004820152601160248201527021b0b63632b9101e979e9037bbb732b91760791b6044820152606401610b80565b60105461ffff90811690841611801590611e9a575060105461ffff62010000909104811690831611155b8015611eb8575060105461ffff640100000000909104811690821611155b611ec157600080fd5b610d7a81611ecf8585614322565b611ed99190614322565b61ffff161115611ee857600080fd5b600d805461ffff928316640100000000027fffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffff00009484166201000002949094167fffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000909116179390911692909217179055565b600080546001600160a01b03163314611fa75760405162461bcd60e51b815260206004820152601160248201527021b0b63632b9101e979e9037bbb732b91760791b6044820152606401610b80565b601554611fc19030906001600160a01b0316600019612ae2565b50600190565b6000546001600160a01b031633146120155760405162461bcd60e51b815260206004820152601160248201527021b0b63632b9101e979e9037bbb732b91760791b6044820152606401610b80565b60235460ff16156120685760405162461bcd60e51b815260206004820152601860248201527f54726164696e6720616c726561647920656e61626c65642100000000000000006044820152606401610b80565b602354610100900460ff166120bf5760405162461bcd60e51b815260206004820152601860248201527f4c6971756964697479206d7573742062652061646465642e00000000000000006044820152606401610b80565b6120ca306001610b36565b6016546120e1906001600160a01b03166001610b36565b6023546016546040517f4b38f1d40000000000000000000000000000000000000000000000000000000081526001600160a01b03918216600482015263ffffffff4316602482015267ffffffffffffffff42166044820152620100009092041690634b38f1d490606401600060405180830381600087803b15801561216557600080fd5b505af1925050508015612176575060015b506023805460ff19166001179055565b3360008181526005602090815260408083206001600160a01b03871684529091528120549091610b2d9185906114439086906142f0565b60006121ca338484612bef565b5060019392505050565b6000546001600160a01b031633146122225760405162461bcd60e51b815260206004820152601160248201527021b0b63632b9101e979e9037bbb732b91760791b6044820152606401610b80565b606361222e8284614322565b61ffff1610156122805760405162461bcd60e51b815260206004820152601b60248201527f4d7573742061646420757020746f2031303025206f72203939252e00000000006044820152606401610b80565b600f805461ffff838116620100000263ffffffff19909216908516171790556122a98183614322565b600f805461ffff929092166401000000000265ffff00000000199092169190911790555050565b6000546001600160a01b0316331461231e5760405162461bcd60e51b815260206004820152601160248201527021b0b63632b9101e979e9037bbb732b91760791b6044820152606401610b80565b6023546040517fc6a276c20000000000000000000000000000000000000000000000000000000081526001600160a01b038381166004830152620100009092049091169063c6a276c2906024016113d7565b6000546001600160a01b031633146123be5760405162461bcd60e51b815260206004820152601160248201527021b0b63632b9101e979e9037bbb732b91760791b6044820152606401610b80565b601880548215157501000000000000000000000000000000000000000000027fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff9091161790556040517f7b0a47d3b0234280b6c9213c5bbff44c8b6001bea7770b3950280f91410532579061243890831515815260200190565b60405180910390a150565b6000546001600160a01b031633146124915760405162461bcd60e51b815260206004820152601160248201527021b0b63632b9101e979e9037bbb732b91760791b6044820152606401610b80565b601780546001600160a01b0393841673ffffffffffffffffffffffffffffffffffffffff199182161790915560188054929093169116179055565b6000546001600160a01b0316331461251a5760405162461bcd60e51b815260206004820152601160248201527021b0b63632b9101e979e9037bbb732b91760791b6044820152606401610b80565b60008190506000816001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b15801561255a57600080fd5b505afa15801561256e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061259291906143d3565b6001600160a01b031663e6a4390530846001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156125da57600080fd5b505afa1580156125ee573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061261291906143d3565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b0392831660048201529116602482015260440160206040518083038186803b15801561267057600080fd5b505afa158015612684573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126a891906143d3565b90506001600160a01b03811661287357816001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b1580156126f157600080fd5b505afa158015612705573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061272991906143d3565b6001600160a01b031663c9c6539630846001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b15801561277157600080fd5b505afa158015612785573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127a991906143d3565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381600087803b15801561280957600080fd5b505af115801561281d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061284191906143d3565b6016805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b039290921691909117905561289c565b6016805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383161790555b6015805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b038416908117909155610ef0903090600019612ae2565b6000546001600160a01b031633146129235760405162461bcd60e51b815260206004820152601160248201527021b0b63632b9101e979e9037bbb732b91760791b6044820152606401610b80565b602354610100900460ff161561297b5760405162461bcd60e51b815260206004820152601c60248201527f43616e6e6f742063616c6c206166746572206c69717569646974792e000000006044820152606401610b80565b600080546040516001600160a01b03909116914780156108fc02929091818181858888f193505050501580156129b5573d6000803e3d6000fd5b50565b6000546001600160a01b03163314612a065760405162461bcd60e51b815260206004820152601160248201527021b0b63632b9101e979e9037bbb732b91760791b6044820152606401610b80565b8284601254612a159190614348565b612a1f9190614367565b6021556012548190612a32908490614348565b612a3c9190614367565b60225550505050565b6023546040517ffe575a870000000000000000000000000000000000000000000000000000000081526001600160a01b038381166004830152600092620100009004169063fe575a879060240160206040518083038186803b158015612aaa57600080fd5b505afa158015612abe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b7f91906143f0565b6001600160a01b038316612b385760405162461bcd60e51b815260206004820152601360248201527f45524332303a205a65726f2041646472657373000000000000000000000000006044820152606401610b80565b6001600160a01b038216612b8e5760405162461bcd60e51b815260206004820152601360248201527f45524332303a205a65726f2041646472657373000000000000000000000000006044820152606401610b80565b6001600160a01b0383811660008181526005602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60006001600160a01b038416612c6d5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610b80565b6001600160a01b038316612ce95760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610b80565b60008211612d5f5760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d75737420626520677265617465722060448201527f7468616e207a65726f00000000000000000000000000000000000000000000006064820152608401610b80565b612d6984846131de565b15612f525760235460ff16612dc05760405162461bcd60e51b815260206004820152601860248201527f54726164696e67206e6f742079657420656e61626c65642100000000000000006044820152606401610b80565b6001600160a01b03841660009081526003602052604090205460ff1680612dff57506001600160a01b03831660009081526003602052604090205460ff165b15612e7c57601b54821115612e7c5760405162461bcd60e51b815260206004820152602860248201527f5472616e7366657220616d6f756e74206578636565647320746865206d61785460448201527f78416d6f756e742e0000000000000000000000000000000000000000000000006064820152608401610b80565b6001600160a01b038316737a250d5630b4cf539739df2c5dacb4c659f2488d14801590612ec257506001600160a01b03831660009081526003602052604090205460ff16155b15612f5257601f5482612ed485611b20565b612ede91906143a2565b1115612f525760405162461bcd60e51b815260206004820152602a60248201527f5472616e7366657220616d6f756e74206578636565647320746865206d61785760448201527f616c6c657453697a652e000000000000000000000000000000000000000000006064820152608401610b80565b6001600160a01b03841660009081526006602052604090205460019060ff1680612f9457506001600160a01b03841660009081526006602052604090205460ff165b15612f9d575060005b6001600160a01b03841660009081526003602052604090205460ff16156130385760185474010000000000000000000000000000000000000000900460ff1615801561300457506018547501000000000000000000000000000000000000000000900460ff165b1561303857600061301430611b20565b9050602154811061303657602254811061302d57506022545b6130368161329b565b505b613044858585846135a4565b95945050505050565b60135460125460009190825b6008548110156131a55782600160006008848154811061307b5761307b614292565b60009182526020808320909101546001600160a01b0316835282019290925260400190205411806130e657508160026000600884815481106130bf576130bf614292565b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b15613103576012546013546130fb9190614367565b935050505090565b600160006008838154811061311a5761311a614292565b60009182526020808320909101546001600160a01b0316835282019290925260400190205461314990846142f0565b9250600260006008838154811061316257613162614292565b60009182526020808320909101546001600160a01b0316835282019290925260400190205461319190836142f0565b91508061319d81614307565b915050613059565b506012546013546131b69190614367565b8210156131d4576012546013546131cd9190614367565b9250505090565b6131cd8183614367565b600080546001600160a01b0384811691161480159061320b57506000546001600160a01b03838116911614155b801561323057506001600160a01b03821660009081526009602052604090205460ff16155b801561325557506001600160a01b03831660009081526009602052604090205460ff16155b801561326c57506001600160a01b03821661dead14155b801561328057506001600160a01b03821615155b801561133457506001600160a01b0383163014159392505050565b601880547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1674010000000000000000000000000000000000000000179055600f5461ffff640100000000909104166132f357613579565b3060009081526005602090815260408083206015546001600160a01b031684529091529020546000191461334c573060009081526005602090815260408083206015546001600160a01b03168452909152902060001990555b604080516002808252606082018352600092602083019080368337019050509050308160008151811061338157613381614292565b6001600160a01b03928316602091820292909201810191909152601554604080517fad5c46480000000000000000000000000000000000000000000000000000000081529051919093169263ad5c4648926004808301939192829003018186803b1580156133ee57600080fd5b505afa158015613402573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061342691906143d3565b8160018151811061343957613439614292565b6001600160a01b0392831660209182029290920101526015546040517f791ac94700000000000000000000000000000000000000000000000000000000815291169063791ac9479061349890859060009086903090429060040161440d565b600060405180830381600087803b1580156134b257600080fd5b505af11580156134c6573d6000803e3d6000fd5b50505050600047111561357757601754600f546001600160a01b03909116906108fc9061ffff640100000000820481169161350991620100009091041647614348565b6135139190614367565b6040518115909202916000818181858888f1935050505015801561353b573d6000803e3d6000fd5b506018546040516001600160a01b03909116904780156108fc02916000818181858888f19350505050158015613575573d6000803e3d6000fd5b505b505b50601880547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff169055565b602354600090610100900460ff16613650576135c08585613956565b602354610100900460ff161580156135dd57506135dd85856131de565b156136505760405162461bcd60e51b815260206004820152602560248201527f4f6e6c79206f776e65722063616e207472616e7366657220617420746869732060448201527f74696d652e0000000000000000000000000000000000000000000000000000006064820152608401610b80565b600061365e86868686613b02565b60808101516001600160a01b038816600090815260016020526040902054919250613688916142f0565b6001600160a01b03808816600090815260016020526040808220939093556060840151918816815291909120546136bf91906143a2565b6001600160a01b0380871660009081526001602090815260408083209490945591891681526007909152205460ff16801561371357506001600160a01b03851660009081526007602052604090205460ff16155b1561375a576001600160a01b03861660009081526002602052604090205461373c9085906142f0565b6001600160a01b03871660009081526002602052604090205561389a565b6001600160a01b03861660009081526007602052604090205460ff1615801561379b57506001600160a01b03851660009081526007602052604090205460ff165b156137e35780516001600160a01b0386166000908152600260205260409020546137c591906143a2565b6001600160a01b03861660009081526002602052604090205561389a565b6001600160a01b03861660009081526007602052604090205460ff16801561382357506001600160a01b03851660009081526007602052604090205460ff165b1561389a576001600160a01b03861660009081526002602052604090205461384c9085906142f0565b6001600160a01b038088166000908152600260205260408082209390935583519188168152919091205461388091906143a2565b6001600160a01b0386166000908152600260205260409020555b6040810151156138b2576138b2868260400151613ea9565b60008160a0015111806138c9575060008160200151115b156138ea578060a00151601360008282546138e491906142f0565b90915550505b80602001516014600082825461390091906143a2565b909155505080516040519081526001600160a01b0386811691908816907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a350600195945050505050565b602354610100900460ff16156139d45760405162461bcd60e51b815260206004820152602360248201527f4c697175696469747920616c726561647920616464656420616e64206d61726b60448201527f65642e00000000000000000000000000000000000000000000000000000000006064820152608401610b80565b6139de82826131de565b1580156139f857506016546001600160a01b038281169116145b15610ef2576001600160a01b038083166000908152600960205260409020805460ff19166001179055602380547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16610100179081905562010000900416613a8a57602380547fffffffffffffffffffff0000000000000000000000000000000000000000ffff163062010000021790555b601880547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff167501000000000000000000000000000000000000000000179055604051600181527f7b0a47d3b0234280b6c9213c5bbff44c8b6001bea7770b3950280f91410532579060200160405180910390a15050565b613b3b6040518060c001604052806000815260200160008152602001600081526020016000815260200160008152602001600081525090565b613b746040518060c001604052806000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6000613b7e61304d565b9050613b8a8186614348565b6080830152613b9987876131de565b15613c79576023546040517fecd07a530000000000000000000000000000000000000000000000000000000081526001600160a01b038981166004830152888116602483015260448201889052600092620100009004169063ecd07a5390606401602060405180830381600087803b158015613c1457600080fd5b505af1925050508015613c62575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252613c5f918101906143f0565b60015b613c6b57600080fd5b905080613c7757600080fd5b505b8315613e53576001600160a01b03861660009081526003602052604090205460ff1615613cea57600d54600b805461ffff80841663ffffffff1990921691909117620100008085048316021765ffff0000000019166401000000009384900491909116909202919091179055613d9b565b6001600160a01b03871660009081526003602052604090205460ff1615613d5557600c54600b805461ffff80841663ffffffff1990921691909117620100008085048316021765ffff0000000019166401000000009384900491909116909202919091179055613d9b565b600e54600b805461ffff80841663ffffffff1990921691909117620100008085048316021765ffff00000000191664010000000093849004919091169092029190911790555b601054600b5461ffff6601000000000000909204821691613dbd911687614348565b613dc79190614367565b6020830152601054600b5461ffff6601000000000000909204821691613dff9164010000000081048216916201000090910416614322565b613e0d9061ffff1687614348565b613e179190614367565b604083018190526020830151613e2d91906143a2565b613e3790866142f0565b82526020820151613e49908290614348565b60a0830152613e6c565b6000602083018190526040830181905285835260a08301525b808260400151613e7c9190614348565b8260a00151613e8b91906143a2565b8260800151613e9a91906142f0565b60608301525095945050505050565b613eb161304d565b613ebb9082614348565b30600090815260016020526040902054613ed591906143a2565b3060009081526001602090815260408083209390935560079052205460ff1615613f255730600090815260026020526040902054613f149082906143a2565b306000908152600260205260409020555b60405181815230906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b600060208083528351808285015260005b81811015613f9657858101830151858201604001528201613f7a565b81811115613fa8576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b6001600160a01b03811681146129b557600080fd5b6000806040838503121561400457600080fd5b823561400f81613fdc565b946020939093013593505050565b80151581146129b557600080fd5b6000806040838503121561403e57600080fd5b823561404981613fdc565b915060208301356140598161401d565b809150509250929050565b803561ffff8116811461407657600080fd5b919050565b60008060006060848603121561409057600080fd5b61409984614064565b92506140a760208501614064565b91506140b560408501614064565b90509250925092565b6000806000606084860312156140d357600080fd5b83356140de81613fdc565b925060208401356140ee81613fdc565b929592945050506040919091013590565b6000806040838503121561411257600080fd5b50508035926020909101359150565b6000806000806080858703121561413757600080fd5b84356141428161401d565b935060208501356141528161401d565b925060408501356141628161401d565b915060608501356141728161401d565b939692955090935050565b60006020828403121561418f57600080fd5b5035919050565b6000602082840312156141a857600080fd5b813561133481613fdc565b600080604083850312156141c657600080fd5b6141cf83614064565b91506141dd60208401614064565b90509250929050565b6000602082840312156141f857600080fd5b81356113348161401d565b6000806040838503121561421657600080fd5b823561422181613fdc565b9150602083013561405981613fdc565b6000806000806080858703121561424757600080fd5b5050823594602084013594506040840135936060013592509050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015614302576143026142c1565b500390565b600060001982141561431b5761431b6142c1565b5060010190565b600061ffff80831681851680830382111561433f5761433f6142c1565b01949350505050565b6000816000190483118215151615614362576143626142c1565b500290565b60008261439d577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b600082198211156143b5576143b56142c1565b500190565b6000602082840312156143cc57600080fd5b5051919050565b6000602082840312156143e557600080fd5b815161133481613fdc565b60006020828403121561440257600080fd5b81516113348161401d565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b8181101561445d5784516001600160a01b031683529383019391830191600101614438565b50506001600160a01b0396909616606085015250505060800152939250505056fea26469706673582212201a927297078c6c4f5553197b1d0a9bfb919a00cf6446fa9832b56866f1d2909964736f6c63430008090033

Deployed Bytecode Sourcemap

11860:24589:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14348:73;;;;;;;;;;;;14379:42;14348:73;;;;;-1:-1:-1;;;;;178:55:1;;;160:74;;148:2;133:18;14348:73:0;;;;;;;;18976:80;;;;;;;;;;-1:-1:-1;19048:5:0;;;;;;;;;;;;;;;;;18976:80;;;;;;;:::i;14164:35::-;;;;;;;;;;-1:-1:-1;14164:35:0;;;;-1:-1:-1;;;;;14164:35:0;;;19670:161;;;;;;;;;;-1:-1:-1;19670:161:0;;;;;:::i;:::-;;:::i;:::-;;;1807:14:1;;1800:22;1782:41;;1770:2;1755:18;19670:161:0;1642:187:1;22616:1139:0;;;;;;;;;;-1:-1:-1;22616:1139:0;;;;;:::i;:::-;;:::i;:::-;;18711:83;;;;;;;;;;-1:-1:-1;18784:7:0;;18711:83;;;2490:25:1;;;2478:2;2463:18;18711:83:0;2344:177:1;13723:195:0;;;;;;;;;;-1:-1:-1;13723:195:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2759:6:1;2792:15;;;2774:34;;2844:15;;;2839:2;2824:18;;2817:43;2896:15;;;2876:18;;;2869:43;;;;2948:15;;;2943:2;2928:18;;2921:43;2736:3;2721:19;13723:195:0;2526:444:1;25735:516:0;;;;;;;;;;-1:-1:-1;25735:516:0;;;;;:::i;:::-;;:::i;20337:306::-;;;;;;;;;;-1:-1:-1;20337:306:0;;;;;:::i;:::-;;:::i;26899:340::-;;;;;;;;;;-1:-1:-1;26899:340:0;;;;;:::i;:::-;;:::i;24506:209::-;;;;;;;;;;-1:-1:-1;24506:209:0;;;;;:::i;:::-;;:::i;28274:250::-;;;;;;;;;;-1:-1:-1;28274:250:0;;;;;:::i;:::-;;:::i;18800:80::-;;;;;;;;;;-1:-1:-1;18868:9:0;;18800:80;;18868:9;;;;5165:36:1;;5153:2;5138:18;18800:80:0;5023:184:1;24019:108:0;;;;;;;;;;-1:-1:-1;24019:108:0;;;;;:::i;:::-;;:::i;20651:215::-;;;;;;;;;;-1:-1:-1;20651:215:0;;;;;:::i;:::-;;:::i;26551:340::-;;;;;;;;;;-1:-1:-1;26551:340:0;;;;;:::i;:::-;;:::i;14206:21::-;;;;;;;;;;-1:-1:-1;14206:21:0;;;;-1:-1:-1;;;;;14206:21:0;;;15342:34;;;;;;;;;;-1:-1:-1;15342:34:0;;;;;;;;17454:701;;;;;;;;;;-1:-1:-1;17454:701:0;;;;;:::i;:::-;;:::i;22213:125::-;;;;;;;;;;-1:-1:-1;22213:125:0;;;;;:::i;:::-;-1:-1:-1;;;;;22302:28:0;22278:4;22302:28;;;:19;:28;;;;;;;;;22213:125;15383:36;;;;;;;;;;-1:-1:-1;15383:36:0;;;;;;;;;;;24723:496;;;;;;;;;;-1:-1:-1;24723:496:0;;;;;:::i;:::-;;:::i;24394:104::-;;;;;;;;;;;;;:::i;22346:134::-;;;;;;;;;;-1:-1:-1;22346:134:0;;;;;:::i;:::-;;:::i;23763:248::-;;;;;;;;;;-1:-1:-1;23763:248:0;;;;;:::i;:::-;;:::i;14865:77::-;;;;;;;;;;;;;;;;19289:198;;;;;;;;;;-1:-1:-1;19289:198:0;;;;;:::i;:::-;;:::i;18163:195::-;;;;;;;;;;;;;:::i;13172:134::-;;;;;;;;;;-1:-1:-1;13172:134:0;;;;;;;;;;;;;;;;;;;;;;;;;;5670:6:1;5703:15;;;5685:34;;5755:15;;;5750:2;5735:18;;5728:43;5807:15;;5787:18;;;5780:43;;;;5648:2;5633:18;13172:134:0;5464:365:1;21689:516:0;;;;;;;;;;-1:-1:-1;21689:516:0;;;;;:::i;:::-;;:::i;22488:120::-;;;;;;;;;;-1:-1:-1;22488:120:0;;;;;:::i;:::-;-1:-1:-1;;;;;22580:20:0;22556:4;22580:20;;;:11;:20;;;;;;;;;22488:120;19062:80;;;;;;;;;;-1:-1:-1;19114:7:0;17432:6;-1:-1:-1;;;;;17432:6:0;19062:80;24394:104;25227:500;;;;;;;;;;-1:-1:-1;25227:500:0;;;;;:::i;:::-;;:::i;20156:173::-;;;;;;;;;;;;;:::i;31434:408::-;;;;;;;;;;;;;:::i;18886:84::-;;;;;;;;;;-1:-1:-1;18960:7:0;;;;;;;;;;;;;;;;;18886:84;;20874:225;;;;;;;;;;-1:-1:-1;20874:225:0;;;;;:::i;:::-;;:::i;19495:167::-;;;;;;;;;;-1:-1:-1;19495:167:0;;;;;:::i;:::-;;:::i;26259:284::-;;;;;;;;;;-1:-1:-1;26259:284:0;;;;;:::i;:::-;;:::i;13459:139::-;;;;;;;;;;-1:-1:-1;13459:139:0;;;;;;;;;;;;;;;;;;;;;;13315:135;;;;;;;;;;-1:-1:-1;13315:135:0;;;;;;;;;;;;;;;;;;;;;;24268:118;;;;;;;;;;-1:-1:-1;24268:118:0;;;;;:::i;:::-;;:::i;27770:165::-;;;;;;;;;;-1:-1:-1;27770:165:0;;;;;:::i;:::-;;:::i;13607:107::-;;;;;;;;;;-1:-1:-1;13607:107:0;;;;;;;;;;;;;;;;;;;;;;27544:218;;;;;;;;;;-1:-1:-1;27544:218:0;;;;;:::i;:::-;;:::i;19148:133::-;;;;;;;;;;-1:-1:-1;19148:133:0;;;;;:::i;:::-;-1:-1:-1;;;;;19250:19:0;;;19232:7;19250:19;;;:11;:19;;;;;;;;:28;;;;;;;;;;;;;19148:133;21107:574;;;;;;;;;;-1:-1:-1;21107:574:0;;;;;:::i;:::-;;:::i;31850:183::-;;;;;;;;;;;;;:::i;15128:87::-;;;;;;;;;;;;;;;;27247:289;;;;;;;;;;-1:-1:-1;27247:289:0;;;;;:::i;:::-;;:::i;14653:39::-;;;;;;;;;;-1:-1:-1;14653:39:0;;;;;;;;;;;24135:125;;;;;;;;;;-1:-1:-1;24135:125:0;;;;;:::i;:::-;;:::i;19670:161::-;19745:4;19762:39;189:10;19785:7;19794:6;19762:8;:39::i;:::-;-1:-1:-1;19819:4:0;19670:161;;;;:::o;22616:1139::-;15990:6;;-1:-1:-1;;;;;15990:6:0;189:10;15990:22;15982:52;;;;-1:-1:-1;;;15982:52:0;;7735:2:1;15982:52:0;;;7717:21:1;7774:2;7754:18;;;7747:30;-1:-1:-1;;;7793:18:1;;;7786:47;7850:18;;15982:52:0;;;;;;;;;22721:4:::1;22710:15:::0;::::1;;;22706:1042;;;-1:-1:-1::0;;;;;22751:20:0;::::1;;::::0;;;:11:::1;:20;::::0;;;;;::::1;;22750:21;22742:62;;;::::0;-1:-1:-1;;;22742:62:0;;8081:2:1;22742:62:0::1;::::0;::::1;8063:21:1::0;8120:2;8100:18;;;8093:30;8159;8139:18;;;8132:58;8207:18;;22742:62:0::1;7879:352:1::0;22742:62:0::1;-1:-1:-1::0;;;;;22822:16:0;::::1;22841:1;22822:16:::0;;;:7:::1;:16;::::0;;;;;:20;22819:116:::1;;-1:-1:-1::0;;;;;22902:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;;22882:37:::1;::::0;:19:::1;:37::i;:::-;-1:-1:-1::0;;;;;22863:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;:56;22819:116:::1;-1:-1:-1::0;;;;;;22949:20:0::1;;::::0;;;:11:::1;:20;::::0;;;;:27;;-1:-1:-1;;22949:27:0::1;22972:4;22949:27:::0;;::::1;::::0;;;22991:9:::1;:23:::0;;;;::::1;::::0;;;;;;::::1;::::0;;-1:-1:-1;;22991:23:0::1;::::0;;::::1;::::0;;22616:1139::o;22706:1042::-:1;23036:16:::0;23032:716:::1;;-1:-1:-1::0;;;;;23077:20:0;::::1;;::::0;;;:11:::1;:20;::::0;;;;;::::1;;23069:61;;;::::0;-1:-1:-1;;;23069:61:0;;8438:2:1;23069:61:0::1;::::0;::::1;8420:21:1::0;8477:2;8457:18;;;8450:30;8516;8496:18;;;8489:58;8564:18;;23069:61:0::1;8236:352:1::0;23069:61:0::1;23148:9;:16:::0;23168:1:::1;23148:21;23145:592;;;-1:-1:-1::0;;;;;23189:16:0;::::1;23208:1;23189:16:::0;;;:7:::1;:16;::::0;;;;;;;:20;;;23228:11:::1;:20:::0;;;;;:28;;-1:-1:-1;;23228:28:0::1;::::0;;23275:9:::1;:15:::0;;;::::1;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;-1:-1:-1;;23275:15:0;;;;;-1:-1:-1;;23275:15:0::1;::::0;;;;;22616:1139;;:::o;23145:592::-:1;23336:9;23331:391;23355:9;:16:::0;23351:20;::::1;23331:391;;;23421:7;-1:-1:-1::0;;;;;23405:23:0::1;:9;23415:1;23405:12;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;23405:12:0::1;:23;23401:302;;;23472:9;23482:16:::0;;:20:::1;::::0;23501:1:::1;::::0;23482:20:::1;:::i;:::-;23472:31;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;23457:9:::1;:12:::0;;-1:-1:-1;;;;;23472:31:0;;::::1;::::0;23467:1;;23457:12;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;;::::1;:46:::0;;-1:-1:-1;;23457:46:0::1;-1:-1:-1::0;;;;;23457:46:0;;::::1;;::::0;;23530:16;;::::1;::::0;;:7:::1;:16:::0;;;;;;:20;;;23577:11:::1;:20:::0;;;;:28;;-1:-1:-1;;23577:28:0::1;::::0;;23632:9:::1;:15:::0;;;::::1;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;-1:-1:-1;;23632:15:0;;;;;-1:-1:-1;;23632:15:0::1;::::0;;;;;23674:5:::1;;23401:302;23373:3:::0;::::1;::::0;::::1;:::i;:::-;;;;23331:391;;;;23145:592;22616:1139:::0;;:::o;25735:516::-;15990:6;;-1:-1:-1;;;;;15990:6:0;189:10;15990:22;15982:52;;;;-1:-1:-1;;;15982:52:0;;7735:2:1;15982:52:0;;;7717:21:1;7774:2;7754:18;;;7747:30;-1:-1:-1;;;7793:18:1;;;7786:47;7850:18;;15982:52:0;7533:341:1;15982:52:0;25873:10:::1;:24:::0;::::1;::::0;;::::1;25859:38:::0;;::::1;;::::0;::::1;::::0;:100:::1;;-1:-1:-1::0;25933:10:0::1;:26:::0;::::1;::::0;;;::::1;::::0;::::1;25918:41:::0;;::::1;;;25859:100;:163;;;;-1:-1:-1::0;25996:10:0::1;:26:::0;::::1;::::0;;;::::1;::::0;::::1;25980:42:::0;;::::1;;;25859:163;25851:172;;;::::0;::::1;;26085:4;26069:12:::0;26042:24:::1;26056:10:::0;26042:11;:24:::1;:::i;:::-;:39;;;;:::i;:::-;:47;;;;26034:56;;;::::0;::::1;;26101:14;:40:::0;;::::1;26201:42:::0;;::::1;::::0;::::1;::::0;26101:40;;::::1;::::0;::::1;26201:42:::0;;;;;;;;;26152:38;;;::::1;26201:42:::0;;;;::::1;::::0;;25735:516::o;20337:306::-;-1:-1:-1;;;;;20458:19:0;;20437:4;20458:19;;;:11;:19;;;;;;;;20478:10;20458:31;;;;;;;;-1:-1:-1;;20458:52:0;20454:126;;-1:-1:-1;;;;;20527:19:0;;;;;;:11;:19;;;;;;;;20547:10;20527:31;;;;;;;:41;;20562:6;;20527:19;:41;;20562:6;;20527:41;:::i;:::-;;;;-1:-1:-1;;20454:126:0;20599:36;20609:6;20617:9;20628:6;20599:9;:36::i;:::-;20592:43;20337:306;-1:-1:-1;;;;20337:306:0:o;26899:340::-;15990:6;;-1:-1:-1;;;;;15990:6:0;189:10;15990:22;15982:52;;;;-1:-1:-1;;;15982:52:0;;7735:2:1;15982:52:0;;;7717:21:1;7774:2;7754:18;;;7747:30;-1:-1:-1;;;7793:18:1;;;7786:47;7850:18;;15982:52:0;7533:341:1;15982:52:0;26989:13:::1;27027:7;27016;27006;;:17;;;;:::i;:::-;27005:29;;;;:::i;:::-;26989:45;;27073:4;27063:7;;:14;;;;:::i;:::-;27053:5;:25;;27045:88;;;::::0;-1:-1:-1;;;27045:88:0;;10433:2:1;27045:88:0::1;::::0;::::1;10415:21:1::0;10472:2;10452:18;;;10445:30;10511:34;10491:18;;;10484:62;10582:20;10562:18;;;10555:48;10620:19;;27045:88:0::1;10231:414:1::0;27045:88:0::1;27144:14;:22:::0;;;27196:14:::1;::::0;27224:7;;27196:24:::1;::::0;27213:7;;27196:24:::1;:::i;:::-;27195:36;;;;:::i;:::-;27177:15;:54:::0;-1:-1:-1;;;26899:340:0:o;24506:209::-;15990:6;;-1:-1:-1;;;;;15990:6:0;189:10;15990:22;15982:52;;;;-1:-1:-1;;;15982:52:0;;7735:2:1;15982:52:0;;;7717:21:1;7774:2;7754:18;;;7747:30;-1:-1:-1;;;7793:18:1;;;7786:47;7850:18;;15982:52:0;7533:341:1;15982:52:0;24635:9:::1;::::0;:72:::1;::::0;;;;10882:14:1;;10875:22;24635:72:0::1;::::0;::::1;10857:41:1::0;10941:14;;10934:22;10914:18;;;10907:50;11000:14;;10993:22;10973:18;;;10966:50;11059:14;;11052:22;11032:18;;;11025:50;24635:9:0;;;::::1;-1:-1:-1::0;;;;;24635:9:0::1;::::0;:24:::1;::::0;10829:19:1;;24635:72:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;24506:209:::0;;;;:::o;28274:250::-;28340:7;28379;;28368;:18;;28360:73;;;;-1:-1:-1;;;28360:73:0;;11288:2:1;28360:73:0;;;11270:21:1;11327:2;11307:18;;;11300:30;11366:34;11346:18;;;11339:62;11437:12;11417:18;;;11410:40;11467:19;;28360:73:0;11086:406:1;28360:73:0;28444:19;28467:10;:8;:10::i;:::-;28444:33;-1:-1:-1;28495:21:0;28444:33;28495:7;:21;:::i;:::-;28488:28;28274:250;-1:-1:-1;;;28274:250:0:o;24019:108::-;15990:6;;-1:-1:-1;;;;;15990:6:0;189:10;15990:22;15982:52;;;;-1:-1:-1;;;15982:52:0;;7735:2:1;15982:52:0;;;7717:21:1;7774:2;7754:18;;;7747:30;-1:-1:-1;;;7793:18:1;;;7786:47;7850:18;;15982:52:0;7533:341:1;15982:52:0;24088:9:::1;::::0;:31:::1;::::0;;;;-1:-1:-1;;;;;178:55:1;;;24088:31:0::1;::::0;::::1;160:74:1::0;24088:9:0;;;::::1;::::0;;::::1;::::0;:22:::1;::::0;133:18:1;;24088:31:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;24019:108:::0;:::o;20651:215::-;189:10;20739:4;20788:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;20788:34:0;;;;;;;;;;20739:4;;20756:80;;20779:7;;20788:47;;20825:10;;20788:47;:::i;:::-;20756:8;:80::i;26551:340::-;15990:6;;-1:-1:-1;;;;;15990:6:0;189:10;15990:22;15982:52;;;;-1:-1:-1;;;15982:52:0;;7735:2:1;15982:52:0;;;7717:21:1;7774:2;7754:18;;;7747:30;-1:-1:-1;;;7793:18:1;;;7786:47;7850:18;;15982:52:0;7533:341:1;15982:52:0;26640:13:::1;26678:7;26667;26657;;:17;;;;:::i;:::-;26656:29;;;;:::i;:::-;26640:45;;26724:4;26714:7;;:14;;;;:::i;:::-;26704:5;:25;;26696:93;;;::::0;-1:-1:-1;;;26696:93:0;;11832:2:1;26696:93:0::1;::::0;::::1;11814:21:1::0;11871:2;11851:18;;;11844:30;11910:34;11890:18;;;11883:62;11981:25;11961:18;;;11954:53;12024:19;;26696:93:0::1;11630:419:1::0;26696:93:0::1;26800:12;:20:::0;;;26848:14:::1;::::0;26876:7;;26848:24:::1;::::0;26865:7;;26848:24:::1;:::i;:::-;26847:36;;;;:::i;:::-;26831:13;:52:::0;-1:-1:-1;;;26551:340:0:o;17454:701::-;15990:6;;-1:-1:-1;;;;;15990:6:0;189:10;15990:22;15982:52;;;;-1:-1:-1;;;15982:52:0;;7735:2:1;15982:52:0;;;7717:21:1;7774:2;7754:18;;;7747:30;-1:-1:-1;;;7793:18:1;;;7786:47;7850:18;;15982:52:0;7533:341:1;15982:52:0;-1:-1:-1;;;;;17535:22:0;::::1;17527:96;;;::::0;-1:-1:-1;;;17527:96:0;;12256:2:1;17527:96:0::1;::::0;::::1;12238:21:1::0;12295:2;12275:18;;;12268:30;12334:34;12314:18;;;12307:62;12405:31;12385:18;;;12378:59;12454:19;;17527:96:0::1;12054:425:1::0;17527:96:0::1;-1:-1:-1::0;;;;;17642:16:0;::::1;14379:42;17642:16;;17634:90;;;::::0;-1:-1:-1;;;17634:90:0;;12256:2:1;17634:90:0::1;::::0;::::1;12238:21:1::0;12295:2;12275:18;;;12268:30;12334:34;12314:18;;;12307:62;12405:31;12385:18;;;12378:59;12454:19;;17634:90:0::1;12054:425:1::0;17634:90:0::1;17755:6;::::0;;17735:34:::1;::::0;-1:-1:-1;;;;;17755:6:0;;::::1;::::0;17735:19:::1;:34::i;:::-;17780:35;17800:8;17810:4;17780:19;:35::i;:::-;17868:6;::::0;17840:16:::1;::::0;-1:-1:-1;;;;;17840:16:0;;::::1;17868:6:::0;::::1;17840:35;17836:90;;;17890:16;:36:::0;;-1:-1:-1;;17890:36:0::1;-1:-1:-1::0;;;;;17890:36:0;::::1;;::::0;;17836:90:::1;17970:1;17960:6:::0;;17950:17:::1;::::0;-1:-1:-1;;;;;17960:6:0::1;17950:9;:17::i;:::-;:21;17947:99;;;17998:6;::::0;17988:46:::1;::::0;-1:-1:-1;;;;;17998:6:0::1;18006:8:::0;18016:17:::1;17998:6:::0;18016:9:::1;:17::i;:::-;17988:9;:46::i;:::-;;17947:99;18066:6;:17:::0;;-1:-1:-1;;18066:17:0::1;-1:-1:-1::0;;;;;18066:17:0;::::1;::::0;;::::1;::::0;;18099:38:::1;::::0;18066:17;;;;18099:38:::1;::::0;18066:6;18099:38:::1;17454:701:::0;:::o;24723:496::-;15990:6;;-1:-1:-1;;;;;15990:6:0;189:10;15990:22;15982:52;;;;-1:-1:-1;;;15982:52:0;;7735:2:1;15982:52:0;;;7717:21:1;7774:2;7754:18;;;7747:30;-1:-1:-1;;;7793:18:1;;;7786:47;7850:18;;15982:52:0;7533:341:1;15982:52:0;24856:10:::1;:24:::0;::::1;::::0;;::::1;24842:38:::0;;::::1;;::::0;::::1;::::0;:100:::1;;-1:-1:-1::0;24916:10:0::1;:26:::0;::::1;::::0;;;::::1;::::0;::::1;24901:41:::0;;::::1;;;24842:100;:163;;;;-1:-1:-1::0;24979:10:0::1;:26:::0;::::1;::::0;;;::::1;::::0;::::1;24963:42:::0;;::::1;;;24842:163;24834:172;;;::::0;::::1;;25068:4;25052:12:::0;25025:24:::1;25039:10:::0;25025:11;:24:::1;:::i;:::-;:39;;;;:::i;:::-;:47;;;;25017:56;;;::::0;::::1;;25084:9;:35:::0;;::::1;25174:37:::0;;::::1;::::0;::::1;::::0;25084:35;;::::1;::::0;::::1;25174:37:::0;;;;;;;;;25130:33;;;::::1;25174:37:::0;;;;::::1;::::0;;24723:496::o;24394:104::-;24439:7;24466:9;;;;;;;;;-1:-1:-1;;;;;24466:9:0;-1:-1:-1;;;;;24466:22:0;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24459:31;;24394:104;:::o;22346:134::-;15990:6;;-1:-1:-1;;;;;15990:6:0;189:10;15990:22;15982:52;;;;-1:-1:-1;;;15982:52:0;;7735:2:1;15982:52:0;;;7717:21:1;7774:2;7754:18;;;7747:30;-1:-1:-1;;;7793:18:1;;;7786:47;7850:18;;15982:52:0;7533:341:1;15982:52:0;-1:-1:-1;;;;;22434:28:0;;;::::1;;::::0;;;:19:::1;:28;::::0;;;;:38;;-1:-1:-1;;22434:38:0::1;::::0;::::1;;::::0;;;::::1;::::0;;22346:134::o;23763:248::-;15990:6;;-1:-1:-1;;;;;15990:6:0;189:10;15990:22;15982:52;;;;-1:-1:-1;;;15982:52:0;;7735:2:1;15982:52:0;;;7717:21:1;7774:2;7754:18;;;7747:30;-1:-1:-1;;;7793:18:1;;;7786:47;7850:18;;15982:52:0;7533:341:1;15982:52:0;23847:16:::1;::::0;::::1;::::0;::::1;;;23846:17;23838:54;;;::::0;-1:-1:-1;;;23838:54:0;;12875:2:1;23838:54:0::1;::::0;::::1;12857:21:1::0;12914:2;12894:18;;;12887:30;12953:26;12933:18;;;12926:54;12997:18;;23838:54:0::1;12673:348:1::0;23838:54:0::1;-1:-1:-1::0;;;;;23911:28:0;::::1;23934:4;23911:28;;23903:55;;;::::0;-1:-1:-1;;;23903:55:0;;13228:2:1;23903:55:0::1;::::0;::::1;13210:21:1::0;13267:2;13247:18;;;13240:30;13306:16;13286:18;;;13279:44;13340:18;;23903:55:0::1;13026:338:1::0;23903:55:0::1;23969:9;:34:::0;;-1:-1:-1;;;;;23969:34:0;;::::1;::::0;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;23763:248::o;19289:198::-;-1:-1:-1;;;;;19379:20:0;;19355:7;19379:20;;;:11;:20;;;;;;;;19375:49;;;-1:-1:-1;;;;;;19408:16:0;;;;;:7;:16;;;;;;;19289:198::o;19375:49::-;-1:-1:-1;;;;;19462:16:0;;;;;;:7;:16;;;;;;19442:37;;:19;:37::i;:::-;19435:44;19289:198;-1:-1:-1;;19289:198:0:o;18163:195::-;15990:6;;-1:-1:-1;;;;;15990:6:0;189:10;15990:22;15982:52;;;;-1:-1:-1;;;15982:52:0;;7735:2:1;15982:52:0;;;7717:21:1;7774:2;7754:18;;;7747:30;-1:-1:-1;;;7793:18:1;;;7786:47;7850:18;;15982:52:0;7533:341:1;15982:52:0;18250:6:::1;::::0;;18230:34:::1;::::0;-1:-1:-1;;;;;18250:6:0;;::::1;::::0;18230:19:::1;:34::i;:::-;18292:1;18275:19:::0;;-1:-1:-1;;18275:19:0::1;::::0;;18310:40:::1;::::0;18292:1;;18310:40:::1;::::0;18292:1;;18310:40:::1;18163:195::o:0;21689:516::-;15990:6;;-1:-1:-1;;;;;15990:6:0;189:10;15990:22;15982:52;;;;-1:-1:-1;;;15982:52:0;;7735:2:1;15982:52:0;;;7717:21:1;7774:2;7754:18;;;7747:30;-1:-1:-1;;;7793:18:1;;;7786:47;7850:18;;15982:52:0;7533:341:1;15982:52:0;21770:16;21766:432:::1;;-1:-1:-1::0;;;;;21803:13:0;;::::1;21819:5;21803:13:::0;;;:7:::1;:13;::::0;;;;;:21;;-1:-1:-1;;21803:21:0::1;::::0;;21839:9:::1;::::0;:32;;;;;::::1;::::0;::::1;13537:74:1::0;;;;13627:18;;;13620:50;;;;21839:9:0;;::::1;::::0;;::::1;::::0;:19:::1;::::0;13510:18:1;;21839:32:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;22616:1139:::0;;:::o;21766:432::-:1;21908:17;::::0;:22;21904:152:::1;;21997:6;21977:17;;21959:15;:35;;;;:::i;:::-;:44;21951:89;;;::::0;-1:-1:-1;;;21951:89:0;;13883:2:1;21951:89:0::1;::::0;::::1;13865:21:1::0;;;13902:18;;;13895:30;13961:34;13941:18;;;13934:62;14013:18;;21951:89:0::1;13681:356:1::0;21951:89:0::1;-1:-1:-1::0;;;;;22070:13:0;;::::1;;::::0;;;:7:::1;:13;::::0;;;;;;:20;;-1:-1:-1;;22070:20:0::1;22086:4;22070:20:::0;;::::1;::::0;;;22125:15:::1;22105:17;:35:::0;;;22155:9:::1;::::0;:31;;;;;;;::::1;13537:74:1::0;;;;13627:18;;;13620:50;22155:9:0;;::::1;::::0;;::::1;::::0;:19:::1;::::0;13510:18:1;;22155:31:0::1;;;;;;;;;;;;;;;;;::::0;::::1;25227:500:::0;15990:6;;-1:-1:-1;;;;;15990:6:0;189:10;15990:22;15982:52;;;;-1:-1:-1;;;15982:52:0;;7735:2:1;15982:52:0;;;7717:21:1;7774:2;7754:18;;;7747:30;-1:-1:-1;;;7793:18:1;;;7786:47;7850:18;;15982:52:0;7533:341:1;15982:52:0;25361:10:::1;:24:::0;::::1;::::0;;::::1;25347:38:::0;;::::1;;::::0;::::1;::::0;:100:::1;;-1:-1:-1::0;25421:10:0::1;:26:::0;::::1;::::0;;;::::1;::::0;::::1;25406:41:::0;;::::1;;;25347:100;:163;;;;-1:-1:-1::0;25484:10:0::1;:26:::0;::::1;::::0;;;::::1;::::0;::::1;25468:42:::0;;::::1;;;25347:163;25339:172;;;::::0;::::1;;25573:4;25557:12:::0;25530:24:::1;25544:10:::0;25530:11;:24:::1;:::i;:::-;:39;;;;:::i;:::-;:47;;;;25522:56;;;::::0;::::1;;25589:10;:36:::0;;::::1;25681:38:::0;;::::1;::::0;::::1;::::0;25589:36;;::::1;::::0;::::1;25681:38:::0;;;;;;;;;25636:34;;;::::1;25681:38:::0;;;;::::1;::::0;;25227:500::o;20156:173::-;20220:4;15990:6;;-1:-1:-1;;;;;15990:6:0;189:10;15990:22;15982:52;;;;-1:-1:-1;;;15982:52:0;;7735:2:1;15982:52:0;;;7717:21:1;7774:2;7754:18;;;7747:30;-1:-1:-1;;;7793:18:1;;;7786:47;7850:18;;15982:52:0;7533:341:1;15982:52:0;20269:9:::1;::::0;20237:62:::1;::::0;20254:4:::1;::::0;-1:-1:-1;;;;;20269:9:0::1;-1:-1:-1::0;;20237:8:0::1;:62::i;:::-;-1:-1:-1::0;20317:4:0::1;20156:173:::0;:::o;31434:408::-;15990:6;;-1:-1:-1;;;;;15990:6:0;189:10;15990:22;15982:52;;;;-1:-1:-1;;;15982:52:0;;7735:2:1;15982:52:0;;;7717:21:1;7774:2;7754:18;;;7747:30;-1:-1:-1;;;7793:18:1;;;7786:47;7850:18;;15982:52:0;7533:341:1;15982:52:0;31496:14:::1;::::0;::::1;;31495:15;31487:52;;;::::0;-1:-1:-1;;;31487:52:0;;14244:2:1;31487:52:0::1;::::0;::::1;14226:21:1::0;14283:2;14263:18;;;14256:30;14322:26;14302:18;;;14295:54;14366:18;;31487:52:0::1;14042:348:1::0;31487:52:0::1;31558:16;::::0;::::1;::::0;::::1;;;31550:53;;;::::0;-1:-1:-1;;;31550:53:0;;14597:2:1;31550:53:0::1;::::0;::::1;14579:21:1::0;14636:2;14616:18;;;14609:30;14675:26;14655:18;;;14648:54;14719:18;;31550:53:0::1;14395:348:1::0;31550:53:0::1;31614:42;31644:4;31651;31614:21;:42::i;:::-;31689:6;::::0;31667:35:::1;::::0;-1:-1:-1;;;;;31689:6:0::1;::::0;31667:21:::1;:35::i;:::-;31717:9;::::0;31737:6:::1;::::0;31717:74:::1;::::0;;;;-1:-1:-1;;;;;31737:6:0;;::::1;31717:74;::::0;::::1;14946::1::0;15068:10;31752:12:0::1;15056:23:1::0;15036:18;;;15029:51;15128:18;31774:15:0::1;15116:31:1::0;15096:18;;;15089:59;31717:9:0;;;::::1;;::::0;:19:::1;::::0;14919:18:1;;31717:74:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;31713:90:::0;31813:14:::1;:21:::0;;-1:-1:-1;;31813:21:0::1;31830:4;31813:21;::::0;;31434:408::o;20874:225::-;189:10;20967:4;21016:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;21016:34:0;;;;;;;;;;20967:4;;20984:85;;21007:7;;21016:52;;21053:15;;21016:52;:::i;19495:167::-;19573:4;19590:42;189:10;19614:9;19625:6;19590:9;:42::i;:::-;-1:-1:-1;19650:4:0;;19495:167;-1:-1:-1;;;19495:167:0:o;26259:284::-;15990:6;;-1:-1:-1;;;;;15990:6:0;189:10;15990:22;15982:52;;;;-1:-1:-1;;;15982:52:0;;7735:2:1;15982:52:0;;;7717:21:1;7774:2;7754:18;;;7747:30;-1:-1:-1;;;7793:18:1;;;7786:47;7850:18;;15982:52:0;7533:341:1;15982:52:0;26376:2:::1;26352:20;26363:9:::0;26352:8;:20:::1;:::i;:::-;:26;;;;26343:67;;;::::0;-1:-1:-1;;;26343:67:0;;15361:2:1;26343:67:0::1;::::0;::::1;15343:21:1::0;15400:2;15380:18;;;15373:30;15439:29;15419:18;;;15412:57;15486:18;;26343:67:0::1;15159:351:1::0;26343:67:0::1;26421:7;:27:::0;;::::1;26459:29:::0;;::::1;::::0;::::1;-1:-1:-1::0;;26459:29:0;;;26421:27;;::::1;26459:29:::0;::::1;::::0;;26515:20:::1;26479:9:::0;26440:8;26515:20:::1;:::i;:::-;26499:7;:36:::0;;::::1;::::0;;;::::1;::::0;::::1;-1:-1:-1::0;;26499:36:0;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;26259:284:0:o;24268:118::-;15990:6;;-1:-1:-1;;;;;15990:6:0;189:10;15990:22;15982:52;;;;-1:-1:-1;;;15982:52:0;;7735:2:1;15982:52:0;;;7717:21:1;7774:2;7754:18;;;7747:30;-1:-1:-1;;;7793:18:1;;;7786:47;7850:18;;15982:52:0;7533:341:1;15982:52:0;24342:9:::1;::::0;:36:::1;::::0;;;;-1:-1:-1;;;;;178:55:1;;;24342:36:0::1;::::0;::::1;160:74:1::0;24342:9:0;;;::::1;::::0;;::::1;::::0;:27:::1;::::0;133:18:1;;24342:36:0::1;14:226:1::0;27770:165:0;15990:6;;-1:-1:-1;;;;;15990:6:0;189:10;15990:22;15982:52;;;;-1:-1:-1;;;15982:52:0;;7735:2:1;15982:52:0;;;7717:21:1;7774:2;7754:18;;;7747:30;-1:-1:-1;;;7793:18:1;;;7786:47;7850:18;;15982:52:0;7533:341:1;15982:52:0;27845:19:::1;:30:::0;;;::::1;;::::0;::::1;::::0;;;::::1;;::::0;;27891:36:::1;::::0;::::1;::::0;::::1;::::0;27867:8;1807:14:1;1800:22;1782:41;;1770:2;1755:18;;1642:187;27891:36:0::1;;;;;;;;27770:165:::0;:::o;27544:218::-;15990:6;;-1:-1:-1;;;;;15990:6:0;189:10;15990:22;15982:52;;;;-1:-1:-1;;;15982:52:0;;7735:2:1;15982:52:0;;;7717:21:1;7774:2;7754:18;;;7747:30;-1:-1:-1;;;7793:18:1;;;7786:47;7850:18;;15982:52:0;7533:341:1;15982:52:0;27659:16:::1;:43:::0;;-1:-1:-1;;;;;27659:43:0;;::::1;-1:-1:-1::0;;27659:43:0;;::::1;;::::0;;;27713:15:::1;:41:::0;;;;;::::1;::::0;::::1;;::::0;;27544:218::o;21107:574::-;15990:6;;-1:-1:-1;;;;;15990:6:0;189:10;15990:22;15982:52;;;;-1:-1:-1;;;15982:52:0;;7735:2:1;15982:52:0;;;7717:21:1;7774:2;7754:18;;;7747:30;-1:-1:-1;;;7793:18:1;;;7786:47;7850:18;;15982:52:0;7533:341:1;15982:52:0;21178:29:::1;21229:9;21178:61;;21250:16;21287:10;-1:-1:-1::0;;;;;21287:18:0::1;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;21269:47:0::1;;21325:4;21332:10;-1:-1:-1::0;;;;;21332:15:0::1;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21269:81;::::0;;::::1;::::0;;;;;;-1:-1:-1;;;;;16024:15:1;;;21269:81:0::1;::::0;::::1;16006:34:1::0;16076:15;;16056:18;;;16049:43;15918:18;;21269:81:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21250:100:::0;-1:-1:-1;;;;;;21365:22:0;::::1;21361:207;;21431:10;-1:-1:-1::0;;;;;21431:18:0::1;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;21413:50:0::1;;21472:4;21479:10;-1:-1:-1::0;;;;;21479:15:0::1;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21413:84;::::0;;::::1;::::0;;;;;;-1:-1:-1;;;;;16024:15:1;;;21413:84:0::1;::::0;::::1;16006:34:1::0;16076:15;;16056:18;;;16049:43;15918:18;;21413:84:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21404:6;:93:::0;;-1:-1:-1;;21404:93:0::1;-1:-1:-1::0;;;;;21404:93:0;;;::::1;::::0;;;::::1;::::0;;21361:207:::1;;;21539:6;:17:::0;;-1:-1:-1;;21539:17:0::1;-1:-1:-1::0;;;;;21539:17:0;::::1;;::::0;;21361:207:::1;21578:9;:22:::0;;-1:-1:-1;;21578:22:0::1;-1:-1:-1::0;;;;;21578:22:0;::::1;::::0;;::::1;::::0;;;21611:62:::1;::::0;21628:4:::1;::::0;-1:-1:-1;;21611:8:0::1;:62::i;31850:183::-:0;15990:6;;-1:-1:-1;;;;;15990:6:0;189:10;15990:22;15982:52;;;;-1:-1:-1;;;15982:52:0;;7735:2:1;15982:52:0;;;7717:21:1;7774:2;7754:18;;;7747:30;-1:-1:-1;;;7793:18:1;;;7786:47;7850:18;;15982:52:0;7533:341:1;15982:52:0;31917:16:::1;::::0;::::1;::::0;::::1;;;31916:17;31908:58;;;::::0;-1:-1:-1;;;31908:58:0;;16305:2:1;31908:58:0::1;::::0;::::1;16287:21:1::0;16344:2;16324:18;;;16317:30;16383;16363:18;;;16356:58;16431:18;;31908:58:0::1;16103:352:1::0;31908:58:0::1;17405:7:::0;17432:6;;31977:48:::1;::::0;-1:-1:-1;;;;;17432:6:0;;;;32003:21:::1;31977:48:::0;::::1;;;::::0;32003:21;;31977:48;17405:7;31977:48;32003:21;17432:6;31977:48;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;31850:183::o:0;27247:289::-;15990:6;;-1:-1:-1;;;;;15990:6:0;189:10;15990:22;15982:52;;;;-1:-1:-1;;;15982:52:0;;7735:2:1;15982:52:0;;;7717:21:1;7774:2;7754:18;;;7747:30;-1:-1:-1;;;7793:18:1;;;7786:47;7850:18;;15982:52:0;7533:341:1;15982:52:0;27447:16:::1;27427;27417:7;;:26;;;;:::i;:::-;27416:47;;;;:::i;:::-;27400:13;:63:::0;27488:7:::1;::::0;27515:13;;27488:23:::1;::::0;27498:13;;27488:23:::1;:::i;:::-;27487:41;;;;:::i;:::-;27474:10;:54:::0;-1:-1:-1;;;;27247:289:0:o;24135:125::-;24220:9;;:32;;;;;-1:-1:-1;;;;;178:55:1;;;24220:32:0;;;160:74:1;24196:4:0;;24220:9;;;;;:23;;133:18:1;;24220:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;19839:309::-;-1:-1:-1;;;;;19933:20:0;;19925:52;;;;-1:-1:-1;;;19925:52:0;;16912:2:1;19925:52:0;;;16894:21:1;16951:2;16931:18;;;16924:30;16990:21;16970:18;;;16963:49;17029:18;;19925:52:0;16710:343:1;19925:52:0;-1:-1:-1;;;;;19996:21:0;;19988:53;;;;-1:-1:-1;;;19988:53:0;;16912:2:1;19988:53:0;;;16894:21:1;16951:2;16931:18;;;16924:30;16990:21;16970:18;;;16963:49;17029:18;;19988:53:0;16710:343:1;19988:53:0;-1:-1:-1;;;;;20054:19:0;;;;;;;:11;:19;;;;;;;;:28;;;;;;;;;;;;;:37;;;20107:33;;2490:25:1;;;20107:33:0;;2463:18:1;20107:33:0;;;;;;;19839:309;;;:::o;28532:1471::-;28611:4;-1:-1:-1;;;;;28636:18:0;;28628:68;;;;-1:-1:-1;;;28628:68:0;;17260:2:1;28628:68:0;;;17242:21:1;17299:2;17279:18;;;17272:30;17338:34;17318:18;;;17311:62;17409:7;17389:18;;;17382:35;17434:19;;28628:68:0;17058:401:1;28628:68:0;-1:-1:-1;;;;;28715:16:0;;28707:64;;;;-1:-1:-1;;;28707:64:0;;17666:2:1;28707:64:0;;;17648:21:1;17705:2;17685:18;;;17678:30;17744:34;17724:18;;;17717:62;17815:5;17795:18;;;17788:33;17838:19;;28707:64:0;17464:399:1;28707:64:0;28799:1;28790:6;:10;28782:64;;;;-1:-1:-1;;;28782:64:0;;18070:2:1;28782:64:0;;;18052:21:1;18109:2;18089:18;;;18082:30;18148:34;18128:18;;;18121:62;18219:11;18199:18;;;18192:39;18248:19;;28782:64:0;17868:405:1;28782:64:0;28860:20;28871:4;28877:2;28860:10;:20::i;:::-;28857:481;;;28901:14;;;;28897:89;;28936:34;;-1:-1:-1;;;28936:34:0;;18480:2:1;28936:34:0;;;18462:21:1;18519:2;18499:18;;;18492:30;18558:26;18538:18;;;18531:54;18602:18;;28936:34:0;18278:348:1;28897:89:0;-1:-1:-1;;;;;29003:13:0;;;;;;:7;:13;;;;;;;;;:28;;-1:-1:-1;;;;;;29020:11:0;;;;;;:7;:11;;;;;;;;29003:28;29000:142;;;29069:12;;29059:6;:22;;29051:75;;;;-1:-1:-1;;;29051:75:0;;18833:2:1;29051:75:0;;;18815:21:1;18872:2;18852:18;;;18845:30;18911:34;18891:18;;;18884:62;18982:10;18962:18;;;18955:38;19010:19;;29051:75:0;18631:404:1;29051:75:0;-1:-1:-1;;;;;29159:20:0;;14297:42;29159:20;;;;:36;;-1:-1:-1;;;;;;29184:11:0;;;;;;:7;:11;;;;;;;;29183:12;29159:36;29156:171;;;29250:14;;29240:6;29224:13;29234:2;29224:9;:13::i;:::-;:22;;;;:::i;:::-;:40;;29216:95;;;;-1:-1:-1;;;29216:95:0;;19242:2:1;29216:95:0;;;19224:21:1;19281:2;19261:18;;;19254:30;19320:34;19300:18;;;19293:62;19391:12;19371:18;;;19364:40;19421:19;;29216:95:0;19040:406:1;29216:95:0;-1:-1:-1;;;;;29383:25:0;;29350:12;29383:25;;;:19;:25;;;;;;29365:4;;29383:25;;;:52;;-1:-1:-1;;;;;;29412:23:0;;;;;;:19;:23;;;;;;;;29383:52;29380:98;;;-1:-1:-1;29461:5:0;29380:98;-1:-1:-1;;;;;29494:11:0;;;;;;:7;:11;;;;;;;;29490:443;;;29527:6;;;;;;;29526:7;:47;;;;-1:-1:-1;29554:19:0;;;;;;;29526:47;29522:394;;;29608:28;29639:24;29657:4;29639:9;:24::i;:::-;29608:55;;29710:13;;29686:20;:37;29682:219;;29775:10;;29751:20;:34;29748:77;;-1:-1:-1;29812:10:0;;29748:77;29847:34;29860:20;29847:12;:34::i;:::-;29589:327;29522:394;29951:44;29969:4;29975:2;29979:6;29987:7;29951:17;:44::i;:::-;29944:51;28532:1471;-1:-1:-1;;;;;28532:1471:0:o;35537:526::-;35617:7;;35653;;35579;;35617;35579;35671:282;35695:9;:16;35691:20;;35671:282;;;35761:7;35737;:21;35745:9;35755:1;35745:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;35745:12:0;35737:21;;;;;;;;;;;;;:31;;:66;;;35796:7;35772;:21;35780:9;35790:1;35780:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;35780:12:0;35772:21;;;;;;;;;;;;;:31;35737:66;35733:96;;;35822:7;;35812;;:17;;;;:::i;:::-;35805:24;;;;;35537:526;:::o;35733:96::-;35864:7;:21;35872:9;35882:1;35872:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;35872:12:0;35864:21;;;;;;;;;;;;;35854:31;;:7;:31;:::i;:::-;35844:41;;35920:7;:21;35928:9;35938:1;35928:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;35928:12:0;35920:21;;;;;;;;;;;;;35910:31;;:7;:31;:::i;:::-;35900:41;-1:-1:-1;35713:3:0;;;;:::i;:::-;;;;35671:282;;;;35987:7;;35977;;:17;;;;:::i;:::-;35967:7;:27;35963:57;;;36013:7;;36003;;:17;;;;:::i;:::-;35996:24;;;;35537:526;:::o;35963:57::-;36038:17;36048:7;36038;:17;:::i;27943:323::-;28011:4;17432:6;;-1:-1:-1;;;;;28035:15:0;;;17432:6;;28035:15;;;;:45;;-1:-1:-1;17405:7:0;17432:6;-1:-1:-1;;;;;28067:13:0;;;17432:6;;28067:13;;28035:45;:84;;;;-1:-1:-1;;;;;;28098:21:0;;;;;;:17;:21;;;;;;;;28097:22;28035:84;:125;;;;-1:-1:-1;;;;;;28137:23:0;;;;;;:17;:23;;;;;;;;28136:24;28035:125;:152;;;;-1:-1:-1;;;;;;28177:10:0;;14379:42;28177:10;;28035:152;:185;;;;-1:-1:-1;;;;;;28204:16:0;;;;28035:185;:223;;;;-1:-1:-1;;;;;;28237:21:0;;28253:4;28237:21;;28028:230;27943:323;-1:-1:-1;;;27943:323:0:o;30011:899::-;15884:6;:13;;;;;;;;30098:7:::1;:13:::0;::::1;::::0;;;::::1;;30094:44;;30131:7;;30094:44;30173:4;30153:26;::::0;;;:11:::1;:26;::::0;;;;;;;30188:9:::1;::::0;-1:-1:-1;;;;;30188:9:0::1;30153:46:::0;;;;;;;;-1:-1:-1;;30153:67:0::1;30150:165;;30257:4;30237:26;::::0;;;:11:::1;:26;::::0;;;;;;;30272:9:::1;::::0;-1:-1:-1;;;;;30272:9:0::1;30237:46:::0;;;;;;;-1:-1:-1;;30237:66:0;;30150:165:::1;30359:16;::::0;;30373:1:::1;30359:16:::0;;;;;::::1;::::0;;30335:21:::1;::::0;30359:16:::1;::::0;::::1;::::0;;::::1;::::0;::::1;;::::0;-1:-1:-1;30359:16:0::1;30335:40;;30404:4;30386;30391:1;30386:7;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;30386:23:0;;::::1;:7;::::0;;::::1;::::0;;;;;;:23;;;;30430:9:::1;::::0;:16:::1;::::0;;;;;;;:9;;;::::1;::::0;:14:::1;::::0;:16:::1;::::0;;::::1;::::0;30386:7;;30430:16;;;;;:9;:16;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30420:4;30425:1;30420:7;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;30420:26:0;;::::1;:7;::::0;;::::1;::::0;;;;;:26;30459:9:::1;::::0;:227:::1;::::0;;;;:9;::::1;::::0;:60:::1;::::0;:227:::1;::::0;30534:20;;30459:9:::1;::::0;30613:4;;30640::::1;::::0;30660:15:::1;::::0;30459:227:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;30727:1;30703:21;:25;30699:204;;;30745:16;::::0;30815:7:::1;:13:::0;-1:-1:-1;;;;;30745:16:0;;::::1;::::0;:84:::1;::::0;30815:13:::1;::::0;;::::1;::::0;::::1;::::0;30771:41:::1;::::0;30795:17;;;::::1;;30771:21;:41;:::i;:::-;:57;;;;:::i;:::-;30745:84;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;30844:15:0::1;::::0;:47:::1;::::0;-1:-1:-1;;;;;30844:15:0;;::::1;::::0;30869:21:::1;30844:47:::0;::::1;;;::::0;:15:::1;:47:::0;:15;:47;30869:21;30844:15;:47;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;30699:204;30083:827;15908:1;-1:-1:-1::0;15920:6:0;:14;;;;;;30011:899::o;32247:1273::-;32370:16;;32348:4;;32370:16;;;;;32365:221;;32403:28;32422:4;32428:2;32403:18;:28::i;:::-;32451:16;;;;;;;32450:17;:41;;;;;32471:20;32482:4;32488:2;32471:10;:20::i;:::-;32446:129;;;32512:47;;-1:-1:-1;;;32512:47:0;;20873:2:1;32512:47:0;;;20855:21:1;20912:2;20892:18;;;20885:30;20951:34;20931:18;;;20924:62;21022:7;21002:18;;;20995:35;21047:19;;32512:47:0;20671:401:1;32446:129:0;32598:25;32626:38;32637:4;32643:2;32647:7;32656;32626:10;:38::i;:::-;32709:14;;;;-1:-1:-1;;;;;32693:13:0;;;;;;:7;:13;;;;;;32598:66;;-1:-1:-1;32693:30:0;;;:::i;:::-;-1:-1:-1;;;;;32677:13:0;;;;;;;:7;:13;;;;;;:46;;;;32762:22;;;;32748:11;;;;;;;;;;:36;;32762:22;32748:36;:::i;:::-;-1:-1:-1;;;;;32734:11:0;;;;;;;:7;:11;;;;;;;;:50;;;;32801:17;;;;;:11;:17;;;;;;;:37;;;;-1:-1:-1;;;;;;32823:15:0;;;;;;:11;:15;;;;;;;;32822:16;32801:37;32797:416;;;-1:-1:-1;;;;;32871:13:0;;;;;;:7;:13;;;;;;:23;;32887:7;;32871:23;:::i;:::-;-1:-1:-1;;;;;32855:13:0;;;;;;:7;:13;;;;;:39;32797:416;;;-1:-1:-1;;;;;32917:17:0;;;;;;:11;:17;;;;;;;;32916:18;:37;;;;-1:-1:-1;;;;;;32938:15:0;;;;;;:11;:15;;;;;;;;32916:37;32912:301;;;32998:22;;-1:-1:-1;;;;;32984:11:0;;32998:22;32984:11;;;:7;:11;;;;;;:36;;32998:22;32984:36;:::i;:::-;-1:-1:-1;;;;;32970:11:0;;;;;;:7;:11;;;;;:50;32912:301;;;-1:-1:-1;;;;;33044:17:0;;;;;;:11;:17;;;;;;;;:36;;;;-1:-1:-1;;;;;;33065:15:0;;;;;;:11;:15;;;;;;;;33044:36;33040:173;;;-1:-1:-1;;;;;33113:13:0;;;;;;:7;:13;;;;;;:23;;33129:7;;33113:23;:::i;:::-;-1:-1:-1;;;;;33097:13:0;;;;;;;:7;:13;;;;;;:39;;;;33179:22;;33165:11;;;;;;;;;;:36;;33179:22;33165:36;:::i;:::-;-1:-1:-1;;;;;33151:11:0;;;;;;:7;:11;;;;;:50;33040:173;33229:17;;;;:21;33225:79;;33265:39;33280:4;33286:6;:17;;;33265:14;:39::i;:::-;33333:1;33319:6;:11;;;:15;:34;;;;33352:1;33338:6;:11;;;:15;33319:34;33315:75;;;33379:6;:11;;;33368:7;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;33315:75:0;33419:6;:11;;;33405:10;;:25;;;;;;;:::i;:::-;;;;-1:-1:-1;;33467:22:0;;33448:42;;2490:25:1;;;-1:-1:-1;;;;;33448:42:0;;;;;;;;;;2478:2:1;2463:18;33448:42:0;;;;;;;-1:-1:-1;33508:4:0;;32247:1273;-1:-1:-1;;;;;32247:1273:0:o;30918:508::-;31000:16;;;;;;;30999:17;30991:65;;;;-1:-1:-1;;;30991:65:0;;21279:2:1;30991:65:0;;;21261:21:1;21318:2;21298:18;;;21291:30;21357:34;21337:18;;;21330:62;21428:5;21408:18;;;21401:33;21451:19;;30991:65:0;21077:399:1;30991:65:0;31072:20;31083:4;31089:2;31072:10;:20::i;:::-;31071:21;:37;;;;-1:-1:-1;31102:6:0;;-1:-1:-1;;;;;31096:12:0;;;31102:6;;31096:12;31071:37;31067:352;;;-1:-1:-1;;;;;31125:23:0;;;;;;;:17;:23;;;;;:30;;-1:-1:-1;;31125:30:0;31151:4;31125:30;;;31170:16;:23;;;;31125:30;31170:23;;;;;31219:9;;;;31208:107;;31263:9;:36;;;;31293:4;31263:36;;;;;31208:107;31329:19;:26;;;;;;;;31375:32;;-1:-1:-1;1782:41:1;;31375:32:0;;1770:2:1;1755:18;31375:32:0;;;;;;;30918:508;;:::o;33528:2001::-;33622:18;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33622:18:0;33653:25;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33653:25:0;33689:19;33711:10;:8;:10::i;:::-;33689:32;-1:-1:-1;33751:21:0;33689:32;33751:7;:21;:::i;:::-;33734:14;;;:38;33789:20;33800:4;33806:2;33789:10;:20::i;:::-;33785:315;;;33857:9;;:38;;;;;-1:-1:-1;;;;;21762:15:1;;;33857:38:0;;;21744:34:1;21814:15;;;21794:18;;;21787:43;21846:18;;;21839:34;;;33826:12:0;;33857:9;;;;;:19;;21656:18:1;;33857:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33857:38:0;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;33853:164;;33993:8;;;33853:164;33946:5;-1:-1:-1;34037:7:0;34033:56;;34065:8;;;34033:56;33811:289;33785:315;34115:7;34112:1284;;;-1:-1:-1;;;;;34143:11:0;;;;;;:7;:11;;;;;;;;34139:717;;;34201:10;:21;34175:12;:47;;34201:21;;;;-1:-1:-1;;34241:49:0;;;;;;;34268:22;;;;;;34241:49;;-1:-1:-1;;34309:51:0;34337:23;;;;;;;;;34309:51;;;;;;;;;34139:717;;;-1:-1:-1;;;;;34386:13:0;;;;;;:7;:13;;;;;;;;34382:474;;;34446:9;:20;34420:12;:46;;34446:20;;;;-1:-1:-1;;34485:48:0;;;;;;;34512:21;;;;;;34485:48;;-1:-1:-1;;34552:50:0;34580:22;;;;;;;;;34552:50;;;;;;;;;34382:474;;;34669:14;:25;34643:12;:51;;34669:25;;;;-1:-1:-1;;34713:53:0;;;;;;;34740:26;;;;;;34713:53;;-1:-1:-1;;34785:55:0;34813:27;;;;;;;;;34785:55;;;;;;;;;34382:474;34924:10;:27;34897:12;:23;34924:27;;;;;;;;34887:33;;34897:23;34887:7;:33;:::i;:::-;34886:65;;;;:::i;:::-;34872:11;;;:79;35055:10;:27;35025:12;:25;35055:27;;;;;;;;34998:52;;35025:25;;;;;;34998:24;;;;;:52;:::i;:::-;34987:64;;;;:7;:64;:::i;:::-;34986:96;;;;:::i;:::-;34966:17;;;:116;;;35133:11;;;;:31;;34966:116;35133:31;:::i;:::-;35122:43;;:7;:43;:::i;:::-;35097:68;;35196:11;;;;:25;;35210:11;;35196:25;:::i;:::-;35182:11;;;:39;34112:1284;;;35268:1;35254:11;;;:15;;;35284:17;;;:21;;;35320:32;;;35369:11;;;:15;34112:1284;35484:11;35464:6;:17;;;:31;;;;:::i;:::-;35449:6;:11;;;:47;;;;:::i;:::-;35431:6;:14;;;:66;;;;:::i;:::-;35406:22;;;:91;-1:-1:-1;35406:22:0;33528:2001;-1:-1:-1;;;;;33528:2001:0:o;36071:375::-;36214:10;:8;:10::i;:::-;36201:23;;:10;:23;:::i;:::-;36191:4;36175:22;;;;:7;:22;;;;;;:50;;;;:::i;:::-;36166:4;36150:22;;;;:7;:22;;;;;;;;:75;;;;36239:11;:26;;;;;;36236:104;;;36321:4;36305:22;;;;:7;:22;;;;;;:35;;36330:10;;36305:35;:::i;:::-;36296:4;36280:22;;;;:7;:22;;;;;:60;36236:104;36356:43;;2490:25:1;;;36381:4:0;;-1:-1:-1;;;;;36356:43:0;;;;;2478:2:1;2463:18;36356:43:0;;;;;;;36071:375;;:::o;245:656:1:-;357:4;386:2;415;404:9;397:21;447:6;441:13;490:6;485:2;474:9;470:18;463:34;515:1;525:140;539:6;536:1;533:13;525:140;;;634:14;;;630:23;;624:30;600:17;;;619:2;596:26;589:66;554:10;;525:140;;;683:6;680:1;677:13;674:91;;;753:1;748:2;739:6;728:9;724:22;720:31;713:42;674:91;-1:-1:-1;817:2:1;805:15;822:66;801:88;786:104;;;;892:2;782:113;;245:656;-1:-1:-1;;;245:656:1:o;1163:154::-;-1:-1:-1;;;;;1242:5:1;1238:54;1231:5;1228:65;1218:93;;1307:1;1304;1297:12;1322:315;1390:6;1398;1451:2;1439:9;1430:7;1426:23;1422:32;1419:52;;;1467:1;1464;1457:12;1419:52;1506:9;1493:23;1525:31;1550:5;1525:31;:::i;:::-;1575:5;1627:2;1612:18;;;;1599:32;;-1:-1:-1;;;1322:315:1:o;1834:118::-;1920:5;1913:13;1906:21;1899:5;1896:32;1886:60;;1942:1;1939;1932:12;1957:382;2022:6;2030;2083:2;2071:9;2062:7;2058:23;2054:32;2051:52;;;2099:1;2096;2089:12;2051:52;2138:9;2125:23;2157:31;2182:5;2157:31;:::i;:::-;2207:5;-1:-1:-1;2264:2:1;2249:18;;2236:32;2277:30;2236:32;2277:30;:::i;:::-;2326:7;2316:17;;;1957:382;;;;;:::o;2975:159::-;3042:20;;3102:6;3091:18;;3081:29;;3071:57;;3124:1;3121;3114:12;3071:57;2975:159;;;:::o;3139:328::-;3213:6;3221;3229;3282:2;3270:9;3261:7;3257:23;3253:32;3250:52;;;3298:1;3295;3288:12;3250:52;3321:28;3339:9;3321:28;:::i;:::-;3311:38;;3368:37;3401:2;3390:9;3386:18;3368:37;:::i;:::-;3358:47;;3424:37;3457:2;3446:9;3442:18;3424:37;:::i;:::-;3414:47;;3139:328;;;;;:::o;3472:456::-;3549:6;3557;3565;3618:2;3606:9;3597:7;3593:23;3589:32;3586:52;;;3634:1;3631;3624:12;3586:52;3673:9;3660:23;3692:31;3717:5;3692:31;:::i;:::-;3742:5;-1:-1:-1;3799:2:1;3784:18;;3771:32;3812:33;3771:32;3812:33;:::i;:::-;3472:456;;3864:7;;-1:-1:-1;;;3918:2:1;3903:18;;;;3890:32;;3472:456::o;3933:248::-;4001:6;4009;4062:2;4050:9;4041:7;4037:23;4033:32;4030:52;;;4078:1;4075;4068:12;4030:52;-1:-1:-1;;4101:23:1;;;4171:2;4156:18;;;4143:32;;-1:-1:-1;3933:248:1:o;4186:647::-;4260:6;4268;4276;4284;4337:3;4325:9;4316:7;4312:23;4308:33;4305:53;;;4354:1;4351;4344:12;4305:53;4393:9;4380:23;4412:28;4434:5;4412:28;:::i;:::-;4459:5;-1:-1:-1;4516:2:1;4501:18;;4488:32;4529:30;4488:32;4529:30;:::i;:::-;4578:7;-1:-1:-1;4637:2:1;4622:18;;4609:32;4650:30;4609:32;4650:30;:::i;:::-;4699:7;-1:-1:-1;4758:2:1;4743:18;;4730:32;4771:30;4730:32;4771:30;:::i;:::-;4186:647;;;;-1:-1:-1;4186:647:1;;-1:-1:-1;;4186:647:1:o;4838:180::-;4897:6;4950:2;4938:9;4929:7;4925:23;4921:32;4918:52;;;4966:1;4963;4956:12;4918:52;-1:-1:-1;4989:23:1;;4838:180;-1:-1:-1;4838:180:1:o;5212:247::-;5271:6;5324:2;5312:9;5303:7;5299:23;5295:32;5292:52;;;5340:1;5337;5330:12;5292:52;5379:9;5366:23;5398:31;5423:5;5398:31;:::i;5834:256::-;5900:6;5908;5961:2;5949:9;5940:7;5936:23;5932:32;5929:52;;;5977:1;5974;5967:12;5929:52;6000:28;6018:9;6000:28;:::i;:::-;5990:38;;6047:37;6080:2;6069:9;6065:18;6047:37;:::i;:::-;6037:47;;5834:256;;;;;:::o;6095:241::-;6151:6;6204:2;6192:9;6183:7;6179:23;6175:32;6172:52;;;6220:1;6217;6210:12;6172:52;6259:9;6246:23;6278:28;6300:5;6278:28;:::i;6341:404::-;6425:6;6433;6486:2;6474:9;6465:7;6461:23;6457:32;6454:52;;;6502:1;6499;6492:12;6454:52;6541:9;6528:23;6560:31;6585:5;6560:31;:::i;:::-;6610:5;-1:-1:-1;6667:2:1;6652:18;;6639:32;6680:33;6639:32;6680:33;:::i;7143:385::-;7229:6;7237;7245;7253;7306:3;7294:9;7285:7;7281:23;7277:33;7274:53;;;7323:1;7320;7313:12;7274:53;-1:-1:-1;;7346:23:1;;;7416:2;7401:18;;7388:32;;-1:-1:-1;7467:2:1;7452:18;;7439:32;;7518:2;7503:18;7490:32;;-1:-1:-1;7143:385:1;-1:-1:-1;7143:385:1:o;8593:184::-;8645:77;8642:1;8635:88;8742:4;8739:1;8732:15;8766:4;8763:1;8756:15;8782:184;8834:77;8831:1;8824:88;8931:4;8928:1;8921:15;8955:4;8952:1;8945:15;8971:184;9023:77;9020:1;9013:88;9120:4;9117:1;9110:15;9144:4;9141:1;9134:15;9160:125;9200:4;9228:1;9225;9222:8;9219:34;;;9233:18;;:::i;:::-;-1:-1:-1;9270:9:1;;9160:125::o;9290:195::-;9329:3;-1:-1:-1;;9353:5:1;9350:77;9347:103;;;9430:18;;:::i;:::-;-1:-1:-1;9477:1:1;9466:13;;9290:195::o;9490:224::-;9529:3;9557:6;9590:2;9587:1;9583:10;9620:2;9617:1;9613:10;9651:3;9647:2;9643:12;9638:3;9635:21;9632:47;;;9659:18;;:::i;:::-;9695:13;;9490:224;-1:-1:-1;;;;9490:224:1:o;9719:228::-;9759:7;9885:1;-1:-1:-1;;9813:74:1;9810:1;9807:81;9802:1;9795:9;9788:17;9784:105;9781:131;;;9892:18;;:::i;:::-;-1:-1:-1;9932:9:1;;9719:228::o;9952:274::-;9992:1;10018;10008:189;;10053:77;10050:1;10043:88;10154:4;10151:1;10144:15;10182:4;10179:1;10172:15;10008:189;-1:-1:-1;10211:9:1;;9952:274::o;11497:128::-;11537:3;11568:1;11564:6;11561:1;11558:13;11555:39;;;11574:18;;:::i;:::-;-1:-1:-1;11610:9:1;;11497:128::o;12484:184::-;12554:6;12607:2;12595:9;12586:7;12582:23;12578:32;12575:52;;;12623:1;12620;12613:12;12575:52;-1:-1:-1;12646:16:1;;12484:184;-1:-1:-1;12484:184:1:o;15515:251::-;15585:6;15638:2;15626:9;15617:7;15613:23;15609:32;15606:52;;;15654:1;15651;15644:12;15606:52;15686:9;15680:16;15705:31;15730:5;15705:31;:::i;16460:245::-;16527:6;16580:2;16568:9;16559:7;16555:23;16551:32;16548:52;;;16596:1;16593;16586:12;16548:52;16628:9;16622:16;16647:28;16669:5;16647:28;:::i;19640:1026::-;19902:4;19950:3;19939:9;19935:19;19981:6;19970:9;19963:25;20007:2;20045:6;20040:2;20029:9;20025:18;20018:34;20088:3;20083:2;20072:9;20068:18;20061:31;20112:6;20147;20141:13;20178:6;20170;20163:22;20216:3;20205:9;20201:19;20194:26;;20255:2;20247:6;20243:15;20229:29;;20276:1;20286:218;20300:6;20297:1;20294:13;20286:218;;;20365:13;;-1:-1:-1;;;;;20361:62:1;20349:75;;20479:15;;;;20444:12;;;;20322:1;20315:9;20286:218;;;-1:-1:-1;;;;;;;20560:55:1;;;;20555:2;20540:18;;20533:83;-1:-1:-1;;;20647:3:1;20632:19;20625:35;20521:3;19640:1026;-1:-1:-1;;;19640:1026:1:o

Swarm Source

ipfs://1a927297078c6c4f5553197b1d0a9bfb919a00cf6446fa9832b56866f1d29099
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.