ETH Price: $2,516.85 (+2.56%)

Token

puta.ai (PUTE)
 

Overview

Max Total Supply

1,000,000,000 PUTE

Holders

17

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 9 Decimals)

Balance
1,966,409.7582196 PUTE

Value
$0.00
0xf5194fd2b0894a8fb538b6cdd45445cafb361828
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
PUTE

Compiler Version
v0.8.21+commit.d9974bed

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-08-30
*/

/*
    $PUTE
    
    pute.ai is a full suite of AI tools run by the community
    members of $PUTE | pute.ai是$PUTE社区成员运行的一整套AI工具
    (website) https://pute.ai/
    (telegram) https://t.me/puteaiportal
    (twitter) https://twitter.com/pute_ai

*/

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

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

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

interface IERC20 {

    function totalSupply() external view returns (uint256);
    function balanceOf(address account) external view returns (uint256);
    function transfer(address recipient, uint256 amount) external returns (bool);
    function allowance(address owner, address spender) external view returns (uint256);
    function approve(address spender, uint256 amount) external returns (bool);
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);
    

}

library SafeMath {

    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

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

        return c;
    }

    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

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

library Address {

    function isContract(address account) internal view returns (bool) {
        // According to EIP-1052, 0x0 is the value returned for not-yet created accounts
        // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned
        // for accounts without code, i.e. `keccak256('')`
        bytes32 codehash;
        bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
        // solhint-disable-next-line no-inline-assembly
        assembly { codehash := extcodehash(account) }
        return (codehash != accountHash && codehash != 0x0);
    }

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

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (bool success, ) = recipient.call{ value: amount }("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }


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

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

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

    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        return _functionCallWithValue(target, data, value, errorMessage);
    }

    function _functionCallWithValue(address target, bytes memory data, uint256 weiValue, string memory errorMessage) private returns (bytes memory) {
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{ value: weiValue }(data);
        if (success) {
            return returndata;
        } else {
            
            if (returndata.length > 0) {
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

contract Ownable is Context {
    address private _owner;
    address private _previousOwner;
    uint256 private _lockTime;

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

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

    function owner() public view returns (address) {
        return _owner;
    }   
    
    modifier onlyOwner() {
        require(_owner == _msgSender(), "Ownable: caller is not the owner");
        _;
    }
    
    function renounceOwnership() public virtual onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

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

interface IUniswapV2Factory {
    event PairCreated(address indexed token0, address indexed token1, address pair, uint);

    function feeTo() external view returns (address);
    function feeToSetter() external view returns (address);

    function getPair(address tokenA, address tokenB) external view returns (address pair);
    function allPairs(uint) external view returns (address pair);
    function allPairsLength() external view returns (uint);

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

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

contract PUTE is Context, IERC20, Ownable {
    using SafeMath for uint256;
    using Address for address;

    uint8 private _decimals = 9;
    uint256 public deadBlocks = 2;
    uint256 public launchedAt = 0;
    
    uint256 private constant MAX = ~uint256(0);
    uint256 private _tTotal = 1000000000 * 10**_decimals;
    uint256 private _rTotal = (MAX - (MAX % _tTotal));
    uint256 private _tFeeTotal;
    uint256 public _maxWalletToken = _tTotal.div(1000).mul(10); //2% for first few mins

    uint256 public _buyLiquidityFee = 0;    
    uint256 public _buymarketdevFee = 200;   
    uint256 public _buyReflectionFee = 0;

    uint256 public _sellLiquidityFee = 0; 
    uint256 public _sellmarketdevFee = 500;  
    uint256 public _sellReflectionFee = 0;
      
    uint256 private liquidityFee = _buyLiquidityFee;
    uint256 private marketdevFee = _buymarketdevFee;
    uint256 private reflectionFee=_buyReflectionFee;

    uint256 private totalFee = liquidityFee.add(marketdevFee);
    uint256 private currenttotalFee = totalFee;
    
    uint256 public swapThreshold = _tTotal.div(10000).mul(20); //0.2% 

    bool inSwap;
    bool public tradingOpen = false;
    bool public zeroBuyTaxmode = false;
    bool private antiBotmode = true;

    string private _name = "puta.ai";
    string private _symbol = "PUTE";
   
    IUniswapV2Router02 public uniswapV2Router;
    address public uniswapV2Pair;
    address payable private marketdevWallet = payable (0x205c05412A60329Ee9a39b99D5E01263Cd25d457); // marketdev Wallet
    address DEAD = 0x000000000000000000000000000000000000dEaD;
    mapping (address => uint256) private _rOwned;
    mapping (address => uint256) private _tOwned;
    mapping (address => mapping (address => uint256)) private _allowances;
    mapping (address => bool) private _isSniper;
    mapping (address => bool) private _isExcludedFromFee;
    mapping (address => bool) private _isMaxWalletExempt;
    mapping (address => bool) private _isExcluded;
    mapping (address => bool) private _isTrusted;
    address[] private _excluded;

    event SwapETHForTokens(
        uint256 amountIn,
        address[] path
    );
    
    event SwapTokensForETH(
        uint256 amountIn,
        address[] path
    );
    
    modifier lockTheSwap {
        inSwap = true;
        _;
        inSwap = false;
    }

    constructor () {

        _rOwned[_msgSender()] = _rTotal;
        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
        uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory())
        .createPair(address(this), _uniswapV2Router.WETH());

        uniswapV2Router = _uniswapV2Router;

        _isExcludedFromFee[owner()] = true;
        _isExcludedFromFee[address(this)] = true;
        _isMaxWalletExempt[owner()] = true;
        _isMaxWalletExempt[address(this)] = true;
        _isMaxWalletExempt[uniswapV2Pair] = true;
        _isMaxWalletExempt[DEAD] = true;
        _isTrusted[owner()] = true;
        _isTrusted[uniswapV2Pair] = true;

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

    function transferFrom(address sender, address recipient, uint256 amount) public override returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance"));
        return true;
    }

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

    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero"));
        return true;
    }
    
    function approve(address spender, uint256 amount) public override returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }
    
    function deliver(uint256 tAmount) public {
        address sender = _msgSender();
        require(!_isExcluded[sender], "Excluded addresses cannot call this function");
        (uint256 rAmount,,,,,) = _getValues(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _rTotal = _rTotal.sub(rAmount);
        _tFeeTotal = _tFeeTotal.add(tAmount);
    }

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

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

    function transferToAddressETH(address payable recipient, uint256 amount) private {
        recipient.transfer(amount);
    }

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) private {
        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");
        require(!_isSniper[to], "did not compute");
        require(!_isSniper[from], "did not compute");
        if (from!= owner() && to!= owner()) require(tradingOpen, "Trading not yet enabled."); //transfers disabled before openTrading
        
        bool takeFee = false;
        //take fee on swaps
        if ( (from==uniswapV2Pair || to==uniswapV2Pair) && !(_isExcludedFromFee[from] || _isExcludedFromFee[to]) ) {
            takeFee = true;
        }

        if(launchedAt>0 && (!_isMaxWalletExempt[to] && from!= owner()) && ((launchedAt + deadBlocks) > block.number)){
                require(amount+ balanceOf(to)<=_maxWalletToken,
                    "Total Holding is currently limited");
        } 

        currenttotalFee=totalFee;
        reflectionFee=_buyReflectionFee;

        if(tradingOpen && to == uniswapV2Pair) { //sell
            currenttotalFee= _sellLiquidityFee.add(_sellmarketdevFee);
            reflectionFee=_sellReflectionFee;
        }
        
        //antibot
        if(launchedAt>0 && (launchedAt + deadBlocks) > block.number){
                _isSniper[to]=true;
        }
        
        //only bot 
        if(launchedAt>0 && from!= owner() && block.number <= (launchedAt + deadBlocks)  && antiBotmode){
                currenttotalFee=990;    //95%
        }

        //buys
        if(zeroBuyTaxmode){
             if(tradingOpen && from == uniswapV2Pair) { 
                    currenttotalFee=0;
             }
        }

        //sell
        if (!inSwap && tradingOpen && to == uniswapV2Pair) {
      
            uint256 contractTokenBalance = balanceOf(address(this));
            
            if(contractTokenBalance>=swapThreshold){
                    contractTokenBalance = swapThreshold;
                    swapTokens(contractTokenBalance);
            }
          
        }
        _tokenTransfer(from,to,amount,takeFee);
    }

    function _tokenTransfer(address sender, address recipient, uint256 amount,bool takeFee) private {

        uint256 _previousReflectionFee=reflectionFee;
        uint256 _previousTotalFee=currenttotalFee;
        if(!takeFee){
            reflectionFee = 0;
            currenttotalFee=0;
        }
        
        if (_isExcluded[sender] && !_isExcluded[recipient]) {
            _transferFromExcluded(sender, recipient, amount);
        } else if (!_isExcluded[sender] && _isExcluded[recipient]) {
            _transferToExcluded(sender, recipient, amount);
        } else if (_isExcluded[sender] && _isExcluded[recipient]) {
            _transferBothExcluded(sender, recipient, amount);
        } else {
            _transferStandard(sender, recipient, amount);
        }
        
        if(!takeFee){
            reflectionFee = _previousReflectionFee;
            currenttotalFee=_previousTotalFee;
        }
    }

    function _transferStandard(address sender, address recipient, uint256 tAmount) private {
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee, uint256 tLiquidity) = _getValues(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);
        _takeLiquidity(tLiquidity);
        _reflectFee(rFee, tFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }

    function _transferToExcluded(address sender, address recipient, uint256 tAmount) private {
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee, uint256 tLiquidity) = _getValues(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _tOwned[recipient] = _tOwned[recipient].add(tTransferAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);           
        _takeLiquidity(tLiquidity);
        _reflectFee(rFee, tFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }

    function _transferFromExcluded(address sender, address recipient, uint256 tAmount) private {
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee, uint256 tLiquidity) = _getValues(tAmount);
        _tOwned[sender] = _tOwned[sender].sub(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);   
        _takeLiquidity(tLiquidity);
        _reflectFee(rFee, tFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }

    function _transferBothExcluded(address sender, address recipient, uint256 tAmount) private {
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee, uint256 tLiquidity) = _getValues(tAmount);
        _tOwned[sender] = _tOwned[sender].sub(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _tOwned[recipient] = _tOwned[recipient].add(tTransferAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);        
        _takeLiquidity(tLiquidity);
        _reflectFee(rFee, tFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }

    function _reflectFee(uint256 rFee, uint256 tFee) private {
        _rTotal = _rTotal.sub(rFee);
        _tFeeTotal = _tFeeTotal.add(tFee);
    }

    function _getRValues(uint256 tAmount, uint256 tFee, uint256 tLiquidity, uint256 currentRate) private pure returns (uint256, uint256, uint256) {
        uint256 rAmount = tAmount.mul(currentRate);
        uint256 rFee = tFee.mul(currentRate);
        uint256 rLiquidity = tLiquidity.mul(currentRate);
        uint256 rTransferAmount = rAmount.sub(rFee).sub(rLiquidity);
        return (rAmount, rTransferAmount, rFee);
    }
    
    function _takeLiquidity(uint256 tLiquidity) private {
        uint256 currentRate =  _getRate();
        uint256 rLiquidity = tLiquidity.mul(currentRate);
        _rOwned[address(this)] = _rOwned[address(this)].add(rLiquidity);
        if(_isExcluded[address(this)])
            _tOwned[address(this)] = _tOwned[address(this)].add(tLiquidity);
    }

    //Swap and send 
    function swapTokens(uint256 contractTokenBalance) private lockTheSwap {
        
        uint256 amountToLiquify = contractTokenBalance
            .mul(liquidityFee)
            .div(totalFee)
            .div(2);

        uint256 amountToSwap = contractTokenBalance.sub(amountToLiquify);
        
        swapTokensForEth(amountToSwap);

        uint256 amountETH = address(this).balance;

        uint256 totalETHFee = totalFee.sub(liquidityFee.div(2));

        uint256 amountETHLiquidity = amountETH
            .mul(liquidityFee)
            .div(totalETHFee)
            .div(2);
        
        uint256 amountETHmarketdev = amountETH.mul(marketdevFee).div(totalETHFee);
        //Send to marketdev wallet
        uint256 contractETHBalance = address(this).balance;
        if(contractETHBalance > 0) {
            sendETHToFee(amountETHmarketdev,marketdevWallet);
        }
        if (amountToLiquify > 0) {
                addLiquidity(amountToLiquify,amountETHLiquidity);
        }
    }
    
    function sendETHToFee(uint256 amount,address payable wallet) private {
        wallet.transfer(amount);
    }
   
    function swapTokensForEth(uint256 tokenAmount) private {
        // generate the uniswap pair path of token -> weth
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();

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

        // make the swap
        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0, // accept any amount of ETH
            path,
            address(this), // The contract
            block.timestamp
        );
        
        emit SwapTokensForETH(tokenAmount, path);
    }

    function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private {
        // approve token transfer to cover all possible scenarios
        _approve(address(this), address(uniswapV2Router), tokenAmount);

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

    //-------------------Private View-------------------
    function _getValues(uint256 tAmount) private view returns (uint256, uint256, uint256, uint256, uint256, uint256) {
        (uint256 tTransferAmount, uint256 tFee, uint256 tLiquidity) = _getTValues(tAmount);
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee) = _getRValues(tAmount, tFee, tLiquidity, _getRate());
        return (rAmount, rTransferAmount, rFee, tTransferAmount, tFee, tLiquidity);
    }

    function _getTValues(uint256 tAmount) private view returns (uint256, uint256, uint256) {
        uint256 tFee = calculateTaxFee(tAmount);
        uint256 tLiquidity = calculateLiquidityFee(tAmount);
        uint256 tTransferAmount = tAmount.sub(tFee).sub(tLiquidity);
        return (tTransferAmount, tFee, tLiquidity);
    }

    function _getRate() private view returns(uint256) {
        (uint256 rSupply, uint256 tSupply) = _getCurrentSupply();
        return rSupply.div(tSupply);
    }

    function _getCurrentSupply() private view returns(uint256, 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.sub(_rOwned[_excluded[i]]);
            tSupply = tSupply.sub(_tOwned[_excluded[i]]);
        }
        if (rSupply < _rTotal.div(_tTotal)) return (_rTotal, _tTotal);
        return (rSupply, tSupply);
    }
    
    function calculateTaxFee(uint256 _amount) private view returns (uint256) {
        return _amount.mul(reflectionFee).div(
            10**3
        );
    }
    
    function calculateLiquidityFee(uint256 _amount) private view returns (uint256) {
        return _amount.mul(currenttotalFee).div(
            10**3
        );
    }

    //-------------------Public View-------------------
    function name() public view returns (string memory) {
        return _name;
    }

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

    function decimals() public view returns (uint8) {
        return _decimals;
    }

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

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

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

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

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

    function isSniper(address account) public view returns (bool) {
        return _isSniper[account];
    }

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

    function totalFees() public view returns (uint256) {
        return _tFeeTotal;
    }

    function reflectionFromToken(uint256 tAmount, bool deductTransferFee) public view returns(uint256) {
        require(tAmount <= _tTotal, "Amount must be less than supply");
        if (!deductTransferFee) {
            (uint256 rAmount,,,,,) = _getValues(tAmount);
            return rAmount;
        } else {
            (,uint256 rTransferAmount,,,,) = _getValues(tAmount);
            return rTransferAmount;
        }
    }

    //-------------------only Owner-------------------
    function excludeFromReward(address account) public onlyOwner() {
        if(_rOwned[account] > 0) {
            _tOwned[account] = tokenFromReflection(_rOwned[account]);
        }
        _isExcluded[account] = true;
        _excluded.push(account);
    }

    function includeInReward(address account) external onlyOwner() {
        require(_isExcluded[account], "Account is already excluded");
        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 openTrading(bool _status,uint256 _deadBlocks) external onlyOwner() {
        tradingOpen = _status;
        excludeFromReward(address(this));
        excludeFromReward(uniswapV2Pair);
        if(tradingOpen && launchedAt == 0){
            launchedAt = block.number;
            deadBlocks = _deadBlocks;
        }
    }
    
    function ruleZeroTax(bool _status) external onlyOwner() {
       zeroBuyTaxmode=_status;
    }

    function ruleAntiBot(bool _status) external onlyOwner() {
       antiBotmode=_status;
    }
    
    function setNewRouter(address newRouter) external onlyOwner() {
        IUniswapV2Router02 _newRouter = IUniswapV2Router02(newRouter);
        address get_pair = IUniswapV2Factory(_newRouter.factory()).getPair(address(this), _newRouter.WETH());
        if (get_pair == address(0)) {
            uniswapV2Pair = IUniswapV2Factory(_newRouter.factory()).createPair(address(this), _newRouter.WETH());
        }
        else {
            uniswapV2Pair = get_pair;
        }
        uniswapV2Router = _newRouter;
    }
    
    function excludeMultiple(address account) public onlyOwner {
        _isExcludedFromFee[account] = true;
    }

    function excludeFromFee(address[] calldata addresses) public onlyOwner {
        for (uint256 i; i < addresses.length; ++i) {
            _isExcludedFromFee[addresses[i]] = true;
        }
    }
    
    function includeInFee(address account) public onlyOwner {
        _isExcludedFromFee[account] = false;
    }
    
    function setWallet(address _marketdevWallet) external onlyOwner() {
        marketdevWallet = payable(_marketdevWallet);
    }
    
    function manage_Snipers(address[] calldata addresses, bool status) public onlyOwner {
        for (uint256 i; i < addresses.length; ++i) {
                _isSniper[addresses[i]] = status; 
        }
    }
    
    function manage_trusted(address[] calldata addresses) public onlyOwner {
        for (uint256 i; i < addresses.length; ++i) {
            _isTrusted[addresses[i]]=true;
        }
    }
   
    function withDrawLeftoverETH(address payable receipient) public onlyOwner {
        receipient.transfer(address(this).balance);
    }

    function withdrawStuck(IERC20 token, address to) public onlyOwner {
        uint256 balance = token.balanceOf(address(this));
        token.transfer(to, balance);
    }

    function setMaxWallet_base1000(uint256 maxWallPercent_base1000) external onlyOwner() {
        _maxWalletToken = _tTotal.div(1000).mul(maxWallPercent_base1000);
    }

    function setMaxWalletExempt(address _addr) external onlyOwner {
        _isMaxWalletExempt[_addr] = true;
    }

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

    function multiTransfer( address[] calldata addresses, uint256[] calldata tokens) external onlyOwner {

        require(addresses.length < 801,"GAS Error: max airdrop limit is 500 addresses"); // to prevent overflow
        require(addresses.length == tokens.length,"Mismatch between Address and token count");

        uint256 SCCC = 0;

        for(uint i=0; i < addresses.length; i++){
            SCCC = SCCC + (tokens[i] * 10**_decimals);
        }

        require(balanceOf(msg.sender) >= SCCC, "Not enough tokens in wallet");

        for(uint i=0; i < addresses.length; i++){
            _transfer(msg.sender,addresses[i],(tokens[i] * 10**_decimals));
        
        }
    }

    function multiTransfer_fixed( address[] calldata addresses, uint256 tokens) external onlyOwner {

        require(addresses.length < 2001,"GAS Error: max airdrop limit is 2000 addresses"); // to prevent overflow

        uint256 SCCC = tokens* 10**_decimals * addresses.length;

        require(balanceOf(msg.sender) >= SCCC, "Not enough tokens in wallet");

        for(uint i=0; i < addresses.length; i++){
            _transfer(msg.sender,addresses[i],(tokens* 10**_decimals));

        }
    }

    function ruleBuyTax(uint256 _bReflectionFee, uint256 _bLiquidityFee, uint256 _bMarketdevFee) external onlyOwner {
       
        _buyLiquidityFee = _bLiquidityFee;
        _buymarketdevFee = _bMarketdevFee;
        _buyReflectionFee= _bReflectionFee;

        reflectionFee= _bReflectionFee;
        liquidityFee = _bLiquidityFee;
        marketdevFee = _bMarketdevFee;
        totalFee = liquidityFee.add(marketdevFee);
    }

    function ruleSellTax(uint256 _sReflectionFee,uint256 _sLiquidityFee, uint256 _sMarketdevFee) external onlyOwner {
        _sellLiquidityFee = _sLiquidityFee;
        _sellmarketdevFee = _sMarketdevFee;
        _sellReflectionFee= _sReflectionFee;
    }
     //to recieve ETH uniswapV2Router
    receive() external payable {}
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amountIn","type":"uint256"},{"indexed":false,"internalType":"address[]","name":"path","type":"address[]"}],"name":"SwapETHForTokens","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amountIn","type":"uint256"},{"indexed":false,"internalType":"address[]","name":"path","type":"address[]"}],"name":"SwapTokensForETH","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":"_buyLiquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_buyReflectionFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_buymarketdevFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_maxWalletToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_sellLiquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_sellReflectionFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_sellmarketdevFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deadBlocks","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tAmount","type":"uint256"}],"name":"deliver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"excludeFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeMultiple","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromReward","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isSniper","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"launchedAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"bool","name":"status","type":"bool"}],"name":"manage_Snipers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"manage_trusted","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"uint256[]","name":"tokens","type":"uint256[]"}],"name":"multiTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"uint256","name":"tokens","type":"uint256"}],"name":"multiTransfer_fixed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_status","type":"bool"},{"internalType":"uint256","name":"_deadBlocks","type":"uint256"}],"name":"openTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tAmount","type":"uint256"},{"internalType":"bool","name":"deductTransferFee","type":"bool"}],"name":"reflectionFromToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_status","type":"bool"}],"name":"ruleAntiBot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_bReflectionFee","type":"uint256"},{"internalType":"uint256","name":"_bLiquidityFee","type":"uint256"},{"internalType":"uint256","name":"_bMarketdevFee","type":"uint256"}],"name":"ruleBuyTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_sReflectionFee","type":"uint256"},{"internalType":"uint256","name":"_sLiquidityFee","type":"uint256"},{"internalType":"uint256","name":"_sMarketdevFee","type":"uint256"}],"name":"ruleSellTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_status","type":"bool"}],"name":"ruleZeroTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"setMaxWalletExempt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxWallPercent_base1000","type":"uint256"}],"name":"setMaxWallet_base1000","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newRouter","type":"address"}],"name":"setNewRouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"thresholdPercent","type":"uint256"},{"internalType":"uint256","name":"thresholdDivisor","type":"uint256"}],"name":"setSwapSettings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_marketdevWallet","type":"address"}],"name":"setWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"rAmount","type":"uint256"}],"name":"tokenFromReflection","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFees","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":"tradingOpen","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":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"receipient","type":"address"}],"name":"withDrawLeftoverETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"to","type":"address"}],"name":"withdrawStuck","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"zeroBuyTaxmode","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040526003805460ff1916600990811790915560026004555f6005556200002a90600a6200078b565b6200003a90633b9aca006200079b565b60068190556200004c905f19620007c9565b62000059905f19620007df565b6007556006546200007c90600a9062000075906103e862000506565b9062000558565b6009555f600a5560c8600b555f600c555f600d556101f4600e555f600f55600a54601055600b54601155600c54601255620000c5601154601054620005e260201b90919060201c565b60138190556014908155600654620000e69190620000759061271062000506565b6015556016805463ffffff0019166301000000179055604080518082019091526007815266707574612e616960c81b602082015260179062000129908262000895565b506040805180820190915260048152635055544560e01b602082015260189062000154908262000895565b50601b80546001600160a01b031990811673205c05412a60329ee9a39b99d5e01263cd25d45717909155601c805490911661dead17905534801562000197575f80fd5b505f80546001600160a01b031916339081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600754335f908152601d602090815260409182902092909255805163c45a015560e01b81529051737a250d5630b4cf539739df2c5dacb4c659f2488d92839263c45a015592600480830193928290030181865afa1580156200023c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200026291906200095d565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015620002ae573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620002d491906200095d565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303815f875af11580156200031f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200034591906200095d565b601a80546001600160a01b03199081166001600160a01b039384161790915560198054909116918316919091179055600160215f6200038b5f546001600160a01b031690565b6001600160a01b0316815260208082019290925260409081015f908120805494151560ff199586161790553081526021909252812080549092166001908117909255602290620003e25f546001600160a01b031690565b6001600160a01b03908116825260208083019390935260409182015f908120805495151560ff199687161790553081526022909352818320805485166001908117909155601a54821684528284208054861682179055601c54909116835290822080549093168117909255602490620004625f546001600160a01b031690565b6001600160a01b03908116825260208083019390935260409182015f908120805495151560ff19968716179055601a5490911681526024909252902080549091166001179055620004b03390565b6001600160a01b03165f6001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600654604051620004f791815260200190565b60405180910390a350620009fe565b5f6200054f83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506200064460201b60201c565b90505b92915050565b5f825f036200056957505f62000552565b5f6200057683856200079b565b90508262000585858362000985565b146200054f5760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b60648201526084015b60405180910390fd5b5f80620005f083856200099b565b9050838110156200054f5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401620005d9565b5f8183620006675760405162461bcd60e51b8152600401620005d99190620009b1565b505f62000675848662000985565b95945050505050565b634e487b7160e01b5f52601160045260245ffd5b600181815b80851115620006d257815f1904821115620006b657620006b66200067e565b80851615620006c457918102915b93841c939080029062000697565b509250929050565b5f82620006ea5750600162000552565b81620006f857505f62000552565b81600181146200071157600281146200071c576200073c565b600191505062000552565b60ff8411156200073057620007306200067e565b50506001821b62000552565b5060208310610133831016604e8410600b841016171562000761575081810a62000552565b6200076d838362000692565b805f19048211156200078357620007836200067e565b029392505050565b5f6200054f60ff841683620006da565b80820281158282048414176200055257620005526200067e565b634e487b7160e01b5f52601260045260245ffd5b5f82620007da57620007da620007b5565b500690565b818103818111156200055257620005526200067e565b634e487b7160e01b5f52604160045260245ffd5b600181811c908216806200081e57607f821691505b6020821081036200083d57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111562000890575f81815260208120601f850160051c810160208610156200086b5750805b601f850160051c820191505b818110156200088c5782815560010162000877565b5050505b505050565b81516001600160401b03811115620008b157620008b1620007f5565b620008c981620008c2845462000809565b8462000843565b602080601f831160018114620008ff575f8415620008e75750858301515b5f19600386901b1c1916600185901b1785556200088c565b5f85815260208120601f198616915b828110156200092f578886015182559484019460019091019084016200090e565b50858210156200094d57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f602082840312156200096e575f80fd5b81516001600160a01b03811681146200054f575f80fd5b5f82620009965762000996620007b5565b500490565b808201808211156200055257620005526200067e565b5f6020808352835180828501525f5b81811015620009de57858101830151858201604001528201620009c0565b505f604082860101526040601f19601f8301168501019250505092915050565b6138b68062000a0c5f395ff3fe608060405260043610610344575f3560e01c806371b9189c116101bd578063a9059cbb116100f2578063ea2f0b3711610092578063f2fde38b1161006d578063f2fde38b14610992578063f3b1e83b146109b1578063fabb0b4f146109c6578063ffb54a99146109db575f80fd5b8063ea2f0b3714610935578063eafb5a3c14610954578063f259c57b14610973575f80fd5b8063bf56b371116100cd578063bf56b371146108a8578063dc44b6a0146108bd578063dd62ed3e146108d2578063deaa59df14610916575f80fd5b8063a9059cbb1461084b578063afb8865e1461086a578063b1fe948414610889575f80fd5b806388790a681161015d5780638e393fbe116101385780638e393fbe146107da5780638f4590d2146107f957806395d89b4114610818578063a457c2d71461082c575f80fd5b806388790a681461077257806388f82020146107875780638da5cb5b146107be575f80fd5b80637598f8bc116101985780637598f8bc1461070a57806378109e541461071f57806378eb6d201461073457806384530c4614610753575f80fd5b806371b9189c146106b757806372fdf6ee146106d6578063743942b6146106eb575f80fd5b80632dd5efe71161029357806349bd5a5e116102335780635d54c0af1161020e5780635d54c0af14610646578063632e54421461066557806370a0823114610684578063715018a6146106a3575f80fd5b806349bd5a5e146105e95780634da093f11461060857806352390c0214610627575f80fd5b8063395093511161026e57806339509351146105775780633bd5d17314610596578063401aa5c0146105b55780634549b039146105ca575f80fd5b80632dd5efe714610518578063313ce567146105375780633685d41914610558575f80fd5b806318160ddd116102fe5780632691bc80116102d95780632691bc801461049c57806328a23cd1146104bb5780632d4103d6146104da5780632d838119146104f9575f80fd5b806318160ddd146104485780631e89d5451461045c57806323b872dd1461047d575f80fd5b80630445b6671461034f57806306fdde0314610377578063095ea7b3146103985780630f3a325f146103c757806313114a9d146103fd5780631694505e14610411575f80fd5b3661034b57005b5f80fd5b34801561035a575f80fd5b5061036460155481565b6040519081526020015b60405180910390f35b348015610382575f80fd5b5061038b6109f9565b60405161036e91906131a7565b3480156103a3575f80fd5b506103b76103b2366004613209565b610a89565b604051901515815260200161036e565b3480156103d2575f80fd5b506103b76103e1366004613233565b6001600160a01b03165f90815260208052604090205460ff1690565b348015610408575f80fd5b50600854610364565b34801561041c575f80fd5b50601954610430906001600160a01b031681565b6040516001600160a01b03909116815260200161036e565b348015610453575f80fd5b50600654610364565b348015610467575f80fd5b5061047b610476366004613296565b610a9f565b005b348015610488575f80fd5b506103b76104973660046132fd565b610cd6565b3480156104a7575f80fd5b506016546103b79062010000900460ff1681565b3480156104c6575f80fd5b5061047b6104d536600461333b565b610d3d565b3480156104e5575f80fd5b5061047b6104f436600461337f565b610e48565b348015610504575f80fd5b5061036461051336600461339b565b610ecc565b348015610523575f80fd5b5061047b610532366004613233565b610f4e565b348015610542575f80fd5b5060035460405160ff909116815260200161036e565b348015610563575f80fd5b5061047b610572366004613233565b610f9a565b348015610582575f80fd5b506103b7610591366004613209565b611144565b3480156105a1575f80fd5b5061047b6105b036600461339b565b611179565b3480156105c0575f80fd5b50610364600c5481565b3480156105d5575f80fd5b506103646105e43660046133b2565b61125f565b3480156105f4575f80fd5b50601a54610430906001600160a01b031681565b348015610613575f80fd5b5061047b6106223660046133d5565b6112e9565b348015610632575f80fd5b5061047b610641366004613233565b611320565b348015610651575f80fd5b5061047b6106603660046133fe565b611405565b348015610670575f80fd5b5061047b61067f366004613451565b61149a565b34801561068f575f80fd5b5061036461069e366004613233565b611617565b3480156106ae575f80fd5b5061047b611673565b3480156106c2575f80fd5b5061047b6106d1366004613499565b6116e4565b3480156106e1575f80fd5b50610364600b5481565b3480156106f6575f80fd5b5061047b610705366004613233565b61177f565b348015610715575f80fd5b50610364600f5481565b34801561072a575f80fd5b5061036460095481565b34801561073f575f80fd5b5061047b61074e3660046133d5565b6117da565b34801561075e575f80fd5b5061047b61076d366004613499565b611833565b34801561077d575f80fd5b50610364600d5481565b348015610792575f80fd5b506103b76107a1366004613233565b6001600160a01b03165f9081526023602052604090205460ff1690565b3480156107c9575f80fd5b505f546001600160a01b0316610430565b3480156107e5575f80fd5b5061047b6107f43660046134d8565b6118c9565b348015610804575f80fd5b5061047b6108133660046134f3565b611910565b348015610823575f80fd5b5061038b611959565b348015610837575f80fd5b506103b7610846366004613209565b611968565b348015610856575f80fd5b506103b7610865366004613209565b6119b5565b348015610875575f80fd5b5061047b61088436600461339b565b6119c1565b348015610894575f80fd5b5061047b6108a33660046134d8565b611a11565b3480156108b3575f80fd5b5061036460055481565b3480156108c8575f80fd5b50610364600a5481565b3480156108dd575f80fd5b506103646108ec36600461333b565b6001600160a01b039182165f908152601f6020908152604080832093909416825291909152205490565b348015610921575f80fd5b5061047b610930366004613233565b611a56565b348015610940575f80fd5b5061047b61094f366004613233565b611aa1565b34801561095f575f80fd5b5061047b61096e366004613233565b611aea565b34801561097e575f80fd5b5061047b61098d366004613233565b611e06565b34801561099d575f80fd5b5061047b6109ac366004613233565b611e52565b3480156109bc575f80fd5b50610364600e5481565b3480156109d1575f80fd5b5061036460045481565b3480156109e6575f80fd5b506016546103b790610100900460ff1681565b606060178054610a0890613513565b80601f0160208091040260200160405190810160405280929190818152602001828054610a3490613513565b8015610a7f5780601f10610a5657610100808354040283529160200191610a7f565b820191905f5260205f20905b815481529060010190602001808311610a6257829003601f168201915b5050505050905090565b5f610a95338484611f39565b5060015b92915050565b5f546001600160a01b03163314610ad15760405162461bcd60e51b8152600401610ac89061354b565b60405180910390fd5b6103218310610b385760405162461bcd60e51b815260206004820152602d60248201527f474153204572726f723a206d61782061697264726f70206c696d69742069732060448201526c3530302061646472657373657360981b6064820152608401610ac8565b828114610b985760405162461bcd60e51b815260206004820152602860248201527f4d69736d61746368206265747765656e204164647265737320616e6420746f6b604482015267195b8818dbdd5b9d60c21b6064820152608401610ac8565b5f805b84811015610bf557600354610bb49060ff16600a613674565b848483818110610bc657610bc6613682565b90506020020135610bd79190613696565b610be190836136ad565b915080610bed816136c0565b915050610b9b565b5080610c0033611617565b1015610c4e5760405162461bcd60e51b815260206004820152601b60248201527f4e6f7420656e6f75676820746f6b656e7320696e2077616c6c657400000000006044820152606401610ac8565b5f5b84811015610cce57610cbc33878784818110610c6e57610c6e613682565b9050602002016020810190610c839190613233565b600354610c949060ff16600a613674565b878786818110610ca657610ca6613682565b90506020020135610cb79190613696565b61205c565b80610cc6816136c0565b915050610c50565b505050505050565b5f610ce284848461205c565b610d338433610d2e85604051806060016040528060288152602001613834602891396001600160a01b038a165f908152601f602090815260408083203384529091529020549190612599565b611f39565b5060019392505050565b5f546001600160a01b03163314610d665760405162461bcd60e51b8152600401610ac89061354b565b6040516370a0823160e01b81523060048201525f906001600160a01b038416906370a0823190602401602060405180830381865afa158015610daa573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610dce91906136d8565b60405163a9059cbb60e01b81526001600160a01b038481166004830152602482018390529192509084169063a9059cbb906044016020604051808303815f875af1158015610e1e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e4291906136ef565b50505050565b5f546001600160a01b03163314610e715760405162461bcd60e51b8152600401610ac89061354b565b6016805461ff00191661010084151502179055610e8d30611320565b601a54610ea2906001600160a01b0316611320565b601654610100900460ff168015610eb95750600554155b15610ec8574360055560048190555b5050565b5f600754821115610f325760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b6064820152608401610ac8565b5f610f3b6125d1565b9050610f4783826125f2565b9392505050565b5f546001600160a01b03163314610f775760405162461bcd60e51b8152600401610ac89061354b565b6001600160a01b03165f908152602260205260409020805460ff19166001179055565b5f546001600160a01b03163314610fc35760405162461bcd60e51b8152600401610ac89061354b565b6001600160a01b0381165f9081526023602052604090205460ff1661102a5760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c7564656400000000006044820152606401610ac8565b5f5b602554811015610ec857816001600160a01b03166025828154811061105357611053613682565b5f918252602090912001546001600160a01b031603611132576025805461107c9060019061370a565b8154811061108c5761108c613682565b5f91825260209091200154602580546001600160a01b0390921691839081106110b7576110b7613682565b5f91825260208083209190910180546001600160a01b0319166001600160a01b039485161790559184168152601e82526040808220829055602390925220805460ff19169055602580548061110e5761110e61371d565b5f8281526020902081015f1990810180546001600160a01b03191690550190555050565b8061113c816136c0565b91505061102c565b335f818152601f602090815260408083206001600160a01b03871684529091528120549091610a95918590610d2e9086612633565b335f8181526023602052604090205460ff16156111ed5760405162461bcd60e51b815260206004820152602c60248201527f4578636c75646564206164647265737365732063616e6e6f742063616c6c207460448201526b3434b990333ab731ba34b7b760a11b6064820152608401610ac8565b5f6111f783612691565b505050506001600160a01b0384165f908152601d6020526040902054919250611222919050826126d9565b6001600160a01b0383165f908152601d602052604090205560075461124790826126d9565b6007556008546112579084612633565b600855505050565b5f6006548311156112b25760405162461bcd60e51b815260206004820152601f60248201527f416d6f756e74206d757374206265206c657373207468616e20737570706c79006044820152606401610ac8565b816112d0575f6112c184612691565b50939550610a99945050505050565b5f6112da84612691565b50929550610a99945050505050565b5f546001600160a01b031633146113125760405162461bcd60e51b8152600401610ac89061354b565b600d91909155600e55600f55565b5f546001600160a01b031633146113495760405162461bcd60e51b8152600401610ac89061354b565b6001600160a01b0381165f908152601d6020526040902054156113a0576001600160a01b0381165f908152601d602052604090205461138790610ecc565b6001600160a01b0382165f908152601e60205260409020555b6001600160a01b03165f818152602360205260408120805460ff191660019081179091556025805491820181559091527f401968ff42a154441da5f6c4c935ac46b8671f0e062baaa62a7545ba53bb6e4c0180546001600160a01b0319169091179055565b5f546001600160a01b0316331461142e5760405162461bcd60e51b8152600401610ac89061354b565b5f5b82811015610e42578160205f86868581811061144e5761144e613682565b90506020020160208101906114639190613233565b6001600160a01b0316815260208101919091526040015f20805460ff1916911515919091179055611493816136c0565b9050611430565b5f546001600160a01b031633146114c35760405162461bcd60e51b8152600401610ac89061354b565b6107d1821061152b5760405162461bcd60e51b815260206004820152602e60248201527f474153204572726f723a206d61782061697264726f70206c696d69742069732060448201526d323030302061646472657373657360901b6064820152608401610ac8565b6003545f9083906115409060ff16600a613674565b61154a9084613696565b6115549190613696565b90508061156033611617565b10156115ae5760405162461bcd60e51b815260206004820152601b60248201527f4e6f7420656e6f75676820746f6b656e7320696e2077616c6c657400000000006044820152606401610ac8565b5f5b83811015611610576115fe338686848181106115ce576115ce613682565b90506020020160208101906115e39190613233565b6003546115f49060ff16600a613674565b610cb79087613696565b80611608816136c0565b9150506115b0565b5050505050565b6001600160a01b0381165f9081526023602052604081205460ff161561165257506001600160a01b03165f908152601e602052604090205490565b6001600160a01b0382165f908152601d6020526040902054610a9990610ecc565b5f546001600160a01b0316331461169c5760405162461bcd60e51b8152600401610ac89061354b565b5f80546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a35f80546001600160a01b0319169055565b5f546001600160a01b0316331461170d5760405162461bcd60e51b8152600401610ac89061354b565b5f5b8181101561177a57600160215f85858581811061172e5761172e613682565b90506020020160208101906117439190613233565b6001600160a01b0316815260208101919091526040015f20805460ff1916911515919091179055611773816136c0565b905061170f565b505050565b5f546001600160a01b031633146117a85760405162461bcd60e51b8152600401610ac89061354b565b6040516001600160a01b038216904780156108fc02915f818181858888f19350505050158015610ec8573d5f803e3d5ffd5b5f546001600160a01b031633146118035760405162461bcd60e51b8152600401610ac89061354b565b600a829055600b819055600c83905560128390556010829055601181905561182b8282612633565b601355505050565b5f546001600160a01b0316331461185c5760405162461bcd60e51b8152600401610ac89061354b565b5f5b8181101561177a57600160245f85858581811061187d5761187d613682565b90506020020160208101906118929190613233565b6001600160a01b0316815260208101919091526040015f20805460ff19169115159190911790556118c2816136c0565b905061185e565b5f546001600160a01b031633146118f25760405162461bcd60e51b8152600401610ac89061354b565b6016805491151563010000000263ff00000019909216919091179055565b5f546001600160a01b031633146119395760405162461bcd60e51b8152600401610ac89061354b565b80826006546119489190613696565b6119529190613731565b6015555050565b606060188054610a0890613513565b5f610a953384610d2e8560405180606001604052806025815260200161385c60259139335f908152601f602090815260408083206001600160a01b038d1684529091529020549190612599565b5f610a9533848461205c565b5f546001600160a01b031633146119ea5760405162461bcd60e51b8152600401610ac89061354b565b611a0b81611a056103e86006546125f290919063ffffffff16565b9061271a565b60095550565b5f546001600160a01b03163314611a3a5760405162461bcd60e51b8152600401610ac89061354b565b60168054911515620100000262ff000019909216919091179055565b5f546001600160a01b03163314611a7f5760405162461bcd60e51b8152600401610ac89061354b565b601b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f546001600160a01b03163314611aca5760405162461bcd60e51b8152600401610ac89061354b565b6001600160a01b03165f908152602160205260409020805460ff19169055565b5f546001600160a01b03163314611b135760405162461bcd60e51b8152600401610ac89061354b565b5f8190505f816001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b54573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b789190613750565b6001600160a01b031663e6a4390530846001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611bc3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611be79190613750565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381865afa158015611c30573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c549190613750565b90506001600160a01b038116611dc657816001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ca0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611cc49190613750565b6001600160a01b031663c9c6539630846001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611d0f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d339190613750565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303815f875af1158015611d7d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611da19190613750565b601a80546001600160a01b0319166001600160a01b0392909216919091179055611de2565b601a80546001600160a01b0319166001600160a01b0383161790555b50601980546001600160a01b0319166001600160a01b039290921691909117905550565b5f546001600160a01b03163314611e2f5760405162461bcd60e51b8152600401610ac89061354b565b6001600160a01b03165f908152602160205260409020805460ff19166001179055565b5f546001600160a01b03163314611e7b5760405162461bcd60e51b8152600401610ac89061354b565b6001600160a01b038116611ee05760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610ac8565b5f80546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a35f80546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b038316611f9b5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610ac8565b6001600160a01b038216611ffc5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610ac8565b6001600160a01b038381165f818152601f602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166120c05760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610ac8565b6001600160a01b0382166121225760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610ac8565b5f81116121835760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b6064820152608401610ac8565b6001600160a01b0382165f90815260208052604090205460ff16156121dc5760405162461bcd60e51b815260206004820152600f60248201526e646964206e6f7420636f6d7075746560881b6044820152606401610ac8565b6001600160a01b0383165f90815260208052604090205460ff16156122355760405162461bcd60e51b815260206004820152600f60248201526e646964206e6f7420636f6d7075746560881b6044820152606401610ac8565b5f546001600160a01b0384811691161480159061225f57505f546001600160a01b03838116911614155b156122bb57601654610100900460ff166122bb5760405162461bcd60e51b815260206004820152601860248201527f54726164696e67206e6f742079657420656e61626c65642e00000000000000006044820152606401610ac8565b601a545f906001600160a01b03858116911614806122e65750601a546001600160a01b038481169116145b801561232c57506001600160a01b0384165f9081526021602052604090205460ff168061232a57506001600160a01b0383165f9081526021602052604090205460ff165b155b15612335575060015b5f60055411801561237657506001600160a01b0383165f9081526022602052604090205460ff1615801561237657505f546001600160a01b03858116911614155b801561239057504360045460055461238e91906136ad565b115b15612404576009546123a184611617565b6123ab90846136ad565b11156124045760405162461bcd60e51b815260206004820152602260248201527f546f74616c20486f6c64696e672069732063757272656e746c79206c696d6974604482015261195960f21b6064820152608401610ac8565b601354601455600c54601255601654610100900460ff1680156124345750601a546001600160a01b038481169116145b1561245257600e54600d5461244891612633565b601455600f546012555b5f60055411801561247157504360045460055461246f91906136ad565b115b15612498576001600160a01b0383165f9081526020805260409020805460ff191660011790555b5f6005541180156124b657505f546001600160a01b03858116911614155b80156124d157506004546005546124cd91906136ad565b4311155b80156124e657506016546301000000900460ff165b156124f2576103de6014555b60165462010000900460ff161561253157601654610100900460ff1680156125275750601a546001600160a01b038581169116145b15612531575f6014555b60165460ff1615801561254b5750601654610100900460ff165b80156125645750601a546001600160a01b038481169116145b1561258d575f61257330611617565b9050601554811061258b575060155461258b81612798565b505b610e428484848461287f565b5f81848411156125bc5760405162461bcd60e51b8152600401610ac891906131a7565b505f6125c8848661370a565b95945050505050565b5f805f6125dc6129a4565b90925090506125eb82826125f2565b9250505090565b5f610f4783836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612b1d565b5f8061263f83856136ad565b905083811015610f475760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610ac8565b5f805f805f805f805f6126a38a612b49565b9250925092505f805f6126bf8d86866126ba6125d1565b612b87565b919f909e50909c50959a5093985091965092945050505050565b5f610f4783836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612599565b5f825f0361272957505f610a99565b5f6127348385613696565b9050826127418583613731565b14610f475760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610ac8565b6016805460ff191660011790556013546010545f916127c7916002916127c1918290879061271a565b906125f2565b90505f6127d483836126d9565b90506127df81612bd3565b60105447905f906127fe906127f59060026125f2565b601354906126d9565b90505f61281f60026127c1846127c16010548861271a90919063ffffffff16565b90505f61283b836127c16011548761271a90919063ffffffff16565b905047801561285b57601b5461285b9083906001600160a01b0316612d5c565b861561286b5761286b8784612d8f565b50506016805460ff19169055505050505050565b60125460145482612894575f60128190556014555b6001600160a01b0386165f9081526023602052604090205460ff1680156128d357506001600160a01b0385165f9081526023602052604090205460ff16155b156128e8576128e3868686612e59565b612990565b6001600160a01b0386165f9081526023602052604090205460ff1615801561292757506001600160a01b0385165f9081526023602052604090205460ff165b15612937576128e3868686612f78565b6001600160a01b0386165f9081526023602052604090205460ff16801561297557506001600160a01b0385165f9081526023602052604090205460ff165b15612985576128e386868661301b565b612990868686613089565b82610cce5760129190915560145550505050565b6007546006545f918291825b602554811015612aed5782601d5f602584815481106129d1576129d1613682565b5f9182526020808320909101546001600160a01b031683528201929092526040019020541180612a39575081601e5f60258481548110612a1357612a13613682565b5f9182526020808320909101546001600160a01b03168352820192909252604001902054115b15612a4f57600754600654945094505050509091565b612a93601d5f60258481548110612a6857612a68613682565b5f9182526020808320909101546001600160a01b0316835282019290925260400190205484906126d9565b9250612ad9601e5f60258481548110612aae57612aae613682565b5f9182526020808320909101546001600160a01b0316835282019290925260400190205483906126d9565b915080612ae5816136c0565b9150506129b0565b50600654600754612afd916125f2565b821015612b14576007546006549350935050509091565b90939092509050565b5f8183612b3d5760405162461bcd60e51b8152600401610ac891906131a7565b505f6125c88486613731565b5f805f80612b56856130c9565b90505f612b62866130e5565b90505f612b7982612b7389866126d9565b906126d9565b979296509094509092505050565b5f808080612b95888661271a565b90505f612ba2888761271a565b90505f612baf888861271a565b90505f612bc082612b7386866126d9565b939b939a50919850919650505050505050565b6040805160028082526060820183525f9260208301908036833701905050905030815f81518110612c0657612c06613682565b6001600160a01b03928316602091820292909201810191909152601954604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015612c5d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c819190613750565b81600181518110612c9457612c94613682565b6001600160a01b039283166020918202929092010152601954612cba9130911684611f39565b60195460405163791ac94760e01b81526001600160a01b039091169063791ac94790612cf29085905f908690309042906004016137ad565b5f604051808303815f87803b158015612d09575f80fd5b505af1158015612d1b573d5f803e3d5ffd5b505050507f32cde87eb454f3a0b875ab23547023107cfad454363ec88ba5695e2c24aa52a78282604051612d509291906137e8565b60405180910390a15050565b6040516001600160a01b0382169083156108fc029084905f818181858888f1935050505015801561177a573d5f803e3d5ffd5b601954612da79030906001600160a01b031684611f39565b6019546001600160a01b031663f305d7198230855f80612dce5f546001600160a01b031690565b60405160e088901b6001600160e01b03191681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c40160606040518083038185885af1158015612e34573d5f803e3d5ffd5b50505050506040513d601f19601f820116820180604052508101906116109190613808565b5f805f805f80612e6887612691565b6001600160a01b038f165f908152601e6020526040902054959b50939950919750955093509150612e9990886126d9565b6001600160a01b038a165f908152601e6020908152604080832093909355601d90522054612ec790876126d9565b6001600160a01b03808b165f908152601d602052604080822093909355908a1681522054612ef59086612633565b6001600160a01b0389165f908152601d6020526040902055612f1681613101565b612f208483613183565b876001600160a01b0316896001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef85604051612f6591815260200190565b60405180910390a3505050505050505050565b5f805f805f80612f8787612691565b6001600160a01b038f165f908152601d6020526040902054959b50939950919750955093509150612fb890876126d9565b6001600160a01b03808b165f908152601d6020908152604080832094909455918b168152601e9091522054612fed9084612633565b6001600160a01b0389165f908152601e6020908152604080832093909355601d90522054612ef59086612633565b5f805f805f8061302a87612691565b6001600160a01b038f165f908152601e6020526040902054959b5093995091975095509350915061305b90886126d9565b6001600160a01b038a165f908152601e6020908152604080832093909355601d90522054612fb890876126d9565b5f805f805f8061309887612691565b6001600160a01b038f165f908152601d6020526040902054959b50939950919750955093509150612ec790876126d9565b5f610a996103e86127c16012548561271a90919063ffffffff16565b5f610a996103e86127c16014548561271a90919063ffffffff16565b5f61310a6125d1565b90505f613117838361271a565b305f908152601d60205260409020549091506131339082612633565b305f908152601d602090815260408083209390935560239052205460ff161561177a57305f908152601e602052604090205461316f9084612633565b305f908152601e6020526040902055505050565b60075461319090836126d9565b6007556008546131a09082612633565b6008555050565b5f6020808352835180828501525f5b818110156131d2578581018301518582016040015282016131b6565b505f604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114613206575f80fd5b50565b5f806040838503121561321a575f80fd5b8235613225816131f2565b946020939093013593505050565b5f60208284031215613243575f80fd5b8135610f47816131f2565b5f8083601f84011261325e575f80fd5b50813567ffffffffffffffff811115613275575f80fd5b6020830191508360208260051b850101111561328f575f80fd5b9250929050565b5f805f80604085870312156132a9575f80fd5b843567ffffffffffffffff808211156132c0575f80fd5b6132cc8883890161324e565b909650945060208701359150808211156132e4575f80fd5b506132f18782880161324e565b95989497509550505050565b5f805f6060848603121561330f575f80fd5b833561331a816131f2565b9250602084013561332a816131f2565b929592945050506040919091013590565b5f806040838503121561334c575f80fd5b8235613357816131f2565b91506020830135613367816131f2565b809150509250929050565b8015158114613206575f80fd5b5f8060408385031215613390575f80fd5b823561322581613372565b5f602082840312156133ab575f80fd5b5035919050565b5f80604083850312156133c3575f80fd5b82359150602083013561336781613372565b5f805f606084860312156133e7575f80fd5b505081359360208301359350604090920135919050565b5f805f60408486031215613410575f80fd5b833567ffffffffffffffff811115613426575f80fd5b6134328682870161324e565b909450925050602084013561344681613372565b809150509250925092565b5f805f60408486031215613463575f80fd5b833567ffffffffffffffff811115613479575f80fd5b6134858682870161324e565b909790965060209590950135949350505050565b5f80602083850312156134aa575f80fd5b823567ffffffffffffffff8111156134c0575f80fd5b6134cc8582860161324e565b90969095509350505050565b5f602082840312156134e8575f80fd5b8135610f4781613372565b5f8060408385031215613504575f80fd5b50508035926020909101359150565b600181811c9082168061352757607f821691505b60208210810361354557634e487b7160e01b5f52602260045260245ffd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b5f52601160045260245ffd5b600181815b808511156135ce57815f19048211156135b4576135b4613580565b808516156135c157918102915b93841c9390800290613599565b509250929050565b5f826135e457506001610a99565b816135f057505f610a99565b816001811461360657600281146136105761362c565b6001915050610a99565b60ff84111561362157613621613580565b50506001821b610a99565b5060208310610133831016604e8410600b841016171561364f575081810a610a99565b6136598383613594565b805f190482111561366c5761366c613580565b029392505050565b5f610f4760ff8416836135d6565b634e487b7160e01b5f52603260045260245ffd5b8082028115828204841417610a9957610a99613580565b80820180821115610a9957610a99613580565b5f600182016136d1576136d1613580565b5060010190565b5f602082840312156136e8575f80fd5b5051919050565b5f602082840312156136ff575f80fd5b8151610f4781613372565b81810381811115610a9957610a99613580565b634e487b7160e01b5f52603160045260245ffd5b5f8261374b57634e487b7160e01b5f52601260045260245ffd5b500490565b5f60208284031215613760575f80fd5b8151610f47816131f2565b5f8151808452602080850194508084015f5b838110156137a25781516001600160a01b03168752958201959082019060010161377d565b509495945050505050565b85815284602082015260a060408201525f6137cb60a083018661376b565b6001600160a01b0394909416606083015250608001529392505050565b828152604060208201525f613800604083018461376b565b949350505050565b5f805f6060848603121561381a575f80fd5b835192506020840151915060408401519050925092509256fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa264697066735822122028f9b0f316909acedefc6fd3e5cbf190833b99550cdde2578ce5c0d5e82fd1fd64736f6c63430008150033

Deployed Bytecode

0x608060405260043610610344575f3560e01c806371b9189c116101bd578063a9059cbb116100f2578063ea2f0b3711610092578063f2fde38b1161006d578063f2fde38b14610992578063f3b1e83b146109b1578063fabb0b4f146109c6578063ffb54a99146109db575f80fd5b8063ea2f0b3714610935578063eafb5a3c14610954578063f259c57b14610973575f80fd5b8063bf56b371116100cd578063bf56b371146108a8578063dc44b6a0146108bd578063dd62ed3e146108d2578063deaa59df14610916575f80fd5b8063a9059cbb1461084b578063afb8865e1461086a578063b1fe948414610889575f80fd5b806388790a681161015d5780638e393fbe116101385780638e393fbe146107da5780638f4590d2146107f957806395d89b4114610818578063a457c2d71461082c575f80fd5b806388790a681461077257806388f82020146107875780638da5cb5b146107be575f80fd5b80637598f8bc116101985780637598f8bc1461070a57806378109e541461071f57806378eb6d201461073457806384530c4614610753575f80fd5b806371b9189c146106b757806372fdf6ee146106d6578063743942b6146106eb575f80fd5b80632dd5efe71161029357806349bd5a5e116102335780635d54c0af1161020e5780635d54c0af14610646578063632e54421461066557806370a0823114610684578063715018a6146106a3575f80fd5b806349bd5a5e146105e95780634da093f11461060857806352390c0214610627575f80fd5b8063395093511161026e57806339509351146105775780633bd5d17314610596578063401aa5c0146105b55780634549b039146105ca575f80fd5b80632dd5efe714610518578063313ce567146105375780633685d41914610558575f80fd5b806318160ddd116102fe5780632691bc80116102d95780632691bc801461049c57806328a23cd1146104bb5780632d4103d6146104da5780632d838119146104f9575f80fd5b806318160ddd146104485780631e89d5451461045c57806323b872dd1461047d575f80fd5b80630445b6671461034f57806306fdde0314610377578063095ea7b3146103985780630f3a325f146103c757806313114a9d146103fd5780631694505e14610411575f80fd5b3661034b57005b5f80fd5b34801561035a575f80fd5b5061036460155481565b6040519081526020015b60405180910390f35b348015610382575f80fd5b5061038b6109f9565b60405161036e91906131a7565b3480156103a3575f80fd5b506103b76103b2366004613209565b610a89565b604051901515815260200161036e565b3480156103d2575f80fd5b506103b76103e1366004613233565b6001600160a01b03165f90815260208052604090205460ff1690565b348015610408575f80fd5b50600854610364565b34801561041c575f80fd5b50601954610430906001600160a01b031681565b6040516001600160a01b03909116815260200161036e565b348015610453575f80fd5b50600654610364565b348015610467575f80fd5b5061047b610476366004613296565b610a9f565b005b348015610488575f80fd5b506103b76104973660046132fd565b610cd6565b3480156104a7575f80fd5b506016546103b79062010000900460ff1681565b3480156104c6575f80fd5b5061047b6104d536600461333b565b610d3d565b3480156104e5575f80fd5b5061047b6104f436600461337f565b610e48565b348015610504575f80fd5b5061036461051336600461339b565b610ecc565b348015610523575f80fd5b5061047b610532366004613233565b610f4e565b348015610542575f80fd5b5060035460405160ff909116815260200161036e565b348015610563575f80fd5b5061047b610572366004613233565b610f9a565b348015610582575f80fd5b506103b7610591366004613209565b611144565b3480156105a1575f80fd5b5061047b6105b036600461339b565b611179565b3480156105c0575f80fd5b50610364600c5481565b3480156105d5575f80fd5b506103646105e43660046133b2565b61125f565b3480156105f4575f80fd5b50601a54610430906001600160a01b031681565b348015610613575f80fd5b5061047b6106223660046133d5565b6112e9565b348015610632575f80fd5b5061047b610641366004613233565b611320565b348015610651575f80fd5b5061047b6106603660046133fe565b611405565b348015610670575f80fd5b5061047b61067f366004613451565b61149a565b34801561068f575f80fd5b5061036461069e366004613233565b611617565b3480156106ae575f80fd5b5061047b611673565b3480156106c2575f80fd5b5061047b6106d1366004613499565b6116e4565b3480156106e1575f80fd5b50610364600b5481565b3480156106f6575f80fd5b5061047b610705366004613233565b61177f565b348015610715575f80fd5b50610364600f5481565b34801561072a575f80fd5b5061036460095481565b34801561073f575f80fd5b5061047b61074e3660046133d5565b6117da565b34801561075e575f80fd5b5061047b61076d366004613499565b611833565b34801561077d575f80fd5b50610364600d5481565b348015610792575f80fd5b506103b76107a1366004613233565b6001600160a01b03165f9081526023602052604090205460ff1690565b3480156107c9575f80fd5b505f546001600160a01b0316610430565b3480156107e5575f80fd5b5061047b6107f43660046134d8565b6118c9565b348015610804575f80fd5b5061047b6108133660046134f3565b611910565b348015610823575f80fd5b5061038b611959565b348015610837575f80fd5b506103b7610846366004613209565b611968565b348015610856575f80fd5b506103b7610865366004613209565b6119b5565b348015610875575f80fd5b5061047b61088436600461339b565b6119c1565b348015610894575f80fd5b5061047b6108a33660046134d8565b611a11565b3480156108b3575f80fd5b5061036460055481565b3480156108c8575f80fd5b50610364600a5481565b3480156108dd575f80fd5b506103646108ec36600461333b565b6001600160a01b039182165f908152601f6020908152604080832093909416825291909152205490565b348015610921575f80fd5b5061047b610930366004613233565b611a56565b348015610940575f80fd5b5061047b61094f366004613233565b611aa1565b34801561095f575f80fd5b5061047b61096e366004613233565b611aea565b34801561097e575f80fd5b5061047b61098d366004613233565b611e06565b34801561099d575f80fd5b5061047b6109ac366004613233565b611e52565b3480156109bc575f80fd5b50610364600e5481565b3480156109d1575f80fd5b5061036460045481565b3480156109e6575f80fd5b506016546103b790610100900460ff1681565b606060178054610a0890613513565b80601f0160208091040260200160405190810160405280929190818152602001828054610a3490613513565b8015610a7f5780601f10610a5657610100808354040283529160200191610a7f565b820191905f5260205f20905b815481529060010190602001808311610a6257829003601f168201915b5050505050905090565b5f610a95338484611f39565b5060015b92915050565b5f546001600160a01b03163314610ad15760405162461bcd60e51b8152600401610ac89061354b565b60405180910390fd5b6103218310610b385760405162461bcd60e51b815260206004820152602d60248201527f474153204572726f723a206d61782061697264726f70206c696d69742069732060448201526c3530302061646472657373657360981b6064820152608401610ac8565b828114610b985760405162461bcd60e51b815260206004820152602860248201527f4d69736d61746368206265747765656e204164647265737320616e6420746f6b604482015267195b8818dbdd5b9d60c21b6064820152608401610ac8565b5f805b84811015610bf557600354610bb49060ff16600a613674565b848483818110610bc657610bc6613682565b90506020020135610bd79190613696565b610be190836136ad565b915080610bed816136c0565b915050610b9b565b5080610c0033611617565b1015610c4e5760405162461bcd60e51b815260206004820152601b60248201527f4e6f7420656e6f75676820746f6b656e7320696e2077616c6c657400000000006044820152606401610ac8565b5f5b84811015610cce57610cbc33878784818110610c6e57610c6e613682565b9050602002016020810190610c839190613233565b600354610c949060ff16600a613674565b878786818110610ca657610ca6613682565b90506020020135610cb79190613696565b61205c565b80610cc6816136c0565b915050610c50565b505050505050565b5f610ce284848461205c565b610d338433610d2e85604051806060016040528060288152602001613834602891396001600160a01b038a165f908152601f602090815260408083203384529091529020549190612599565b611f39565b5060019392505050565b5f546001600160a01b03163314610d665760405162461bcd60e51b8152600401610ac89061354b565b6040516370a0823160e01b81523060048201525f906001600160a01b038416906370a0823190602401602060405180830381865afa158015610daa573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610dce91906136d8565b60405163a9059cbb60e01b81526001600160a01b038481166004830152602482018390529192509084169063a9059cbb906044016020604051808303815f875af1158015610e1e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e4291906136ef565b50505050565b5f546001600160a01b03163314610e715760405162461bcd60e51b8152600401610ac89061354b565b6016805461ff00191661010084151502179055610e8d30611320565b601a54610ea2906001600160a01b0316611320565b601654610100900460ff168015610eb95750600554155b15610ec8574360055560048190555b5050565b5f600754821115610f325760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b6064820152608401610ac8565b5f610f3b6125d1565b9050610f4783826125f2565b9392505050565b5f546001600160a01b03163314610f775760405162461bcd60e51b8152600401610ac89061354b565b6001600160a01b03165f908152602260205260409020805460ff19166001179055565b5f546001600160a01b03163314610fc35760405162461bcd60e51b8152600401610ac89061354b565b6001600160a01b0381165f9081526023602052604090205460ff1661102a5760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c7564656400000000006044820152606401610ac8565b5f5b602554811015610ec857816001600160a01b03166025828154811061105357611053613682565b5f918252602090912001546001600160a01b031603611132576025805461107c9060019061370a565b8154811061108c5761108c613682565b5f91825260209091200154602580546001600160a01b0390921691839081106110b7576110b7613682565b5f91825260208083209190910180546001600160a01b0319166001600160a01b039485161790559184168152601e82526040808220829055602390925220805460ff19169055602580548061110e5761110e61371d565b5f8281526020902081015f1990810180546001600160a01b03191690550190555050565b8061113c816136c0565b91505061102c565b335f818152601f602090815260408083206001600160a01b03871684529091528120549091610a95918590610d2e9086612633565b335f8181526023602052604090205460ff16156111ed5760405162461bcd60e51b815260206004820152602c60248201527f4578636c75646564206164647265737365732063616e6e6f742063616c6c207460448201526b3434b990333ab731ba34b7b760a11b6064820152608401610ac8565b5f6111f783612691565b505050506001600160a01b0384165f908152601d6020526040902054919250611222919050826126d9565b6001600160a01b0383165f908152601d602052604090205560075461124790826126d9565b6007556008546112579084612633565b600855505050565b5f6006548311156112b25760405162461bcd60e51b815260206004820152601f60248201527f416d6f756e74206d757374206265206c657373207468616e20737570706c79006044820152606401610ac8565b816112d0575f6112c184612691565b50939550610a99945050505050565b5f6112da84612691565b50929550610a99945050505050565b5f546001600160a01b031633146113125760405162461bcd60e51b8152600401610ac89061354b565b600d91909155600e55600f55565b5f546001600160a01b031633146113495760405162461bcd60e51b8152600401610ac89061354b565b6001600160a01b0381165f908152601d6020526040902054156113a0576001600160a01b0381165f908152601d602052604090205461138790610ecc565b6001600160a01b0382165f908152601e60205260409020555b6001600160a01b03165f818152602360205260408120805460ff191660019081179091556025805491820181559091527f401968ff42a154441da5f6c4c935ac46b8671f0e062baaa62a7545ba53bb6e4c0180546001600160a01b0319169091179055565b5f546001600160a01b0316331461142e5760405162461bcd60e51b8152600401610ac89061354b565b5f5b82811015610e42578160205f86868581811061144e5761144e613682565b90506020020160208101906114639190613233565b6001600160a01b0316815260208101919091526040015f20805460ff1916911515919091179055611493816136c0565b9050611430565b5f546001600160a01b031633146114c35760405162461bcd60e51b8152600401610ac89061354b565b6107d1821061152b5760405162461bcd60e51b815260206004820152602e60248201527f474153204572726f723a206d61782061697264726f70206c696d69742069732060448201526d323030302061646472657373657360901b6064820152608401610ac8565b6003545f9083906115409060ff16600a613674565b61154a9084613696565b6115549190613696565b90508061156033611617565b10156115ae5760405162461bcd60e51b815260206004820152601b60248201527f4e6f7420656e6f75676820746f6b656e7320696e2077616c6c657400000000006044820152606401610ac8565b5f5b83811015611610576115fe338686848181106115ce576115ce613682565b90506020020160208101906115e39190613233565b6003546115f49060ff16600a613674565b610cb79087613696565b80611608816136c0565b9150506115b0565b5050505050565b6001600160a01b0381165f9081526023602052604081205460ff161561165257506001600160a01b03165f908152601e602052604090205490565b6001600160a01b0382165f908152601d6020526040902054610a9990610ecc565b5f546001600160a01b0316331461169c5760405162461bcd60e51b8152600401610ac89061354b565b5f80546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a35f80546001600160a01b0319169055565b5f546001600160a01b0316331461170d5760405162461bcd60e51b8152600401610ac89061354b565b5f5b8181101561177a57600160215f85858581811061172e5761172e613682565b90506020020160208101906117439190613233565b6001600160a01b0316815260208101919091526040015f20805460ff1916911515919091179055611773816136c0565b905061170f565b505050565b5f546001600160a01b031633146117a85760405162461bcd60e51b8152600401610ac89061354b565b6040516001600160a01b038216904780156108fc02915f818181858888f19350505050158015610ec8573d5f803e3d5ffd5b5f546001600160a01b031633146118035760405162461bcd60e51b8152600401610ac89061354b565b600a829055600b819055600c83905560128390556010829055601181905561182b8282612633565b601355505050565b5f546001600160a01b0316331461185c5760405162461bcd60e51b8152600401610ac89061354b565b5f5b8181101561177a57600160245f85858581811061187d5761187d613682565b90506020020160208101906118929190613233565b6001600160a01b0316815260208101919091526040015f20805460ff19169115159190911790556118c2816136c0565b905061185e565b5f546001600160a01b031633146118f25760405162461bcd60e51b8152600401610ac89061354b565b6016805491151563010000000263ff00000019909216919091179055565b5f546001600160a01b031633146119395760405162461bcd60e51b8152600401610ac89061354b565b80826006546119489190613696565b6119529190613731565b6015555050565b606060188054610a0890613513565b5f610a953384610d2e8560405180606001604052806025815260200161385c60259139335f908152601f602090815260408083206001600160a01b038d1684529091529020549190612599565b5f610a9533848461205c565b5f546001600160a01b031633146119ea5760405162461bcd60e51b8152600401610ac89061354b565b611a0b81611a056103e86006546125f290919063ffffffff16565b9061271a565b60095550565b5f546001600160a01b03163314611a3a5760405162461bcd60e51b8152600401610ac89061354b565b60168054911515620100000262ff000019909216919091179055565b5f546001600160a01b03163314611a7f5760405162461bcd60e51b8152600401610ac89061354b565b601b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f546001600160a01b03163314611aca5760405162461bcd60e51b8152600401610ac89061354b565b6001600160a01b03165f908152602160205260409020805460ff19169055565b5f546001600160a01b03163314611b135760405162461bcd60e51b8152600401610ac89061354b565b5f8190505f816001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b54573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b789190613750565b6001600160a01b031663e6a4390530846001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611bc3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611be79190613750565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381865afa158015611c30573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c549190613750565b90506001600160a01b038116611dc657816001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ca0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611cc49190613750565b6001600160a01b031663c9c6539630846001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611d0f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d339190613750565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303815f875af1158015611d7d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611da19190613750565b601a80546001600160a01b0319166001600160a01b0392909216919091179055611de2565b601a80546001600160a01b0319166001600160a01b0383161790555b50601980546001600160a01b0319166001600160a01b039290921691909117905550565b5f546001600160a01b03163314611e2f5760405162461bcd60e51b8152600401610ac89061354b565b6001600160a01b03165f908152602160205260409020805460ff19166001179055565b5f546001600160a01b03163314611e7b5760405162461bcd60e51b8152600401610ac89061354b565b6001600160a01b038116611ee05760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610ac8565b5f80546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a35f80546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b038316611f9b5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610ac8565b6001600160a01b038216611ffc5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610ac8565b6001600160a01b038381165f818152601f602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166120c05760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610ac8565b6001600160a01b0382166121225760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610ac8565b5f81116121835760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b6064820152608401610ac8565b6001600160a01b0382165f90815260208052604090205460ff16156121dc5760405162461bcd60e51b815260206004820152600f60248201526e646964206e6f7420636f6d7075746560881b6044820152606401610ac8565b6001600160a01b0383165f90815260208052604090205460ff16156122355760405162461bcd60e51b815260206004820152600f60248201526e646964206e6f7420636f6d7075746560881b6044820152606401610ac8565b5f546001600160a01b0384811691161480159061225f57505f546001600160a01b03838116911614155b156122bb57601654610100900460ff166122bb5760405162461bcd60e51b815260206004820152601860248201527f54726164696e67206e6f742079657420656e61626c65642e00000000000000006044820152606401610ac8565b601a545f906001600160a01b03858116911614806122e65750601a546001600160a01b038481169116145b801561232c57506001600160a01b0384165f9081526021602052604090205460ff168061232a57506001600160a01b0383165f9081526021602052604090205460ff165b155b15612335575060015b5f60055411801561237657506001600160a01b0383165f9081526022602052604090205460ff1615801561237657505f546001600160a01b03858116911614155b801561239057504360045460055461238e91906136ad565b115b15612404576009546123a184611617565b6123ab90846136ad565b11156124045760405162461bcd60e51b815260206004820152602260248201527f546f74616c20486f6c64696e672069732063757272656e746c79206c696d6974604482015261195960f21b6064820152608401610ac8565b601354601455600c54601255601654610100900460ff1680156124345750601a546001600160a01b038481169116145b1561245257600e54600d5461244891612633565b601455600f546012555b5f60055411801561247157504360045460055461246f91906136ad565b115b15612498576001600160a01b0383165f9081526020805260409020805460ff191660011790555b5f6005541180156124b657505f546001600160a01b03858116911614155b80156124d157506004546005546124cd91906136ad565b4311155b80156124e657506016546301000000900460ff165b156124f2576103de6014555b60165462010000900460ff161561253157601654610100900460ff1680156125275750601a546001600160a01b038581169116145b15612531575f6014555b60165460ff1615801561254b5750601654610100900460ff165b80156125645750601a546001600160a01b038481169116145b1561258d575f61257330611617565b9050601554811061258b575060155461258b81612798565b505b610e428484848461287f565b5f81848411156125bc5760405162461bcd60e51b8152600401610ac891906131a7565b505f6125c8848661370a565b95945050505050565b5f805f6125dc6129a4565b90925090506125eb82826125f2565b9250505090565b5f610f4783836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612b1d565b5f8061263f83856136ad565b905083811015610f475760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610ac8565b5f805f805f805f805f6126a38a612b49565b9250925092505f805f6126bf8d86866126ba6125d1565b612b87565b919f909e50909c50959a5093985091965092945050505050565b5f610f4783836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612599565b5f825f0361272957505f610a99565b5f6127348385613696565b9050826127418583613731565b14610f475760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610ac8565b6016805460ff191660011790556013546010545f916127c7916002916127c1918290879061271a565b906125f2565b90505f6127d483836126d9565b90506127df81612bd3565b60105447905f906127fe906127f59060026125f2565b601354906126d9565b90505f61281f60026127c1846127c16010548861271a90919063ffffffff16565b90505f61283b836127c16011548761271a90919063ffffffff16565b905047801561285b57601b5461285b9083906001600160a01b0316612d5c565b861561286b5761286b8784612d8f565b50506016805460ff19169055505050505050565b60125460145482612894575f60128190556014555b6001600160a01b0386165f9081526023602052604090205460ff1680156128d357506001600160a01b0385165f9081526023602052604090205460ff16155b156128e8576128e3868686612e59565b612990565b6001600160a01b0386165f9081526023602052604090205460ff1615801561292757506001600160a01b0385165f9081526023602052604090205460ff165b15612937576128e3868686612f78565b6001600160a01b0386165f9081526023602052604090205460ff16801561297557506001600160a01b0385165f9081526023602052604090205460ff165b15612985576128e386868661301b565b612990868686613089565b82610cce5760129190915560145550505050565b6007546006545f918291825b602554811015612aed5782601d5f602584815481106129d1576129d1613682565b5f9182526020808320909101546001600160a01b031683528201929092526040019020541180612a39575081601e5f60258481548110612a1357612a13613682565b5f9182526020808320909101546001600160a01b03168352820192909252604001902054115b15612a4f57600754600654945094505050509091565b612a93601d5f60258481548110612a6857612a68613682565b5f9182526020808320909101546001600160a01b0316835282019290925260400190205484906126d9565b9250612ad9601e5f60258481548110612aae57612aae613682565b5f9182526020808320909101546001600160a01b0316835282019290925260400190205483906126d9565b915080612ae5816136c0565b9150506129b0565b50600654600754612afd916125f2565b821015612b14576007546006549350935050509091565b90939092509050565b5f8183612b3d5760405162461bcd60e51b8152600401610ac891906131a7565b505f6125c88486613731565b5f805f80612b56856130c9565b90505f612b62866130e5565b90505f612b7982612b7389866126d9565b906126d9565b979296509094509092505050565b5f808080612b95888661271a565b90505f612ba2888761271a565b90505f612baf888861271a565b90505f612bc082612b7386866126d9565b939b939a50919850919650505050505050565b6040805160028082526060820183525f9260208301908036833701905050905030815f81518110612c0657612c06613682565b6001600160a01b03928316602091820292909201810191909152601954604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015612c5d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c819190613750565b81600181518110612c9457612c94613682565b6001600160a01b039283166020918202929092010152601954612cba9130911684611f39565b60195460405163791ac94760e01b81526001600160a01b039091169063791ac94790612cf29085905f908690309042906004016137ad565b5f604051808303815f87803b158015612d09575f80fd5b505af1158015612d1b573d5f803e3d5ffd5b505050507f32cde87eb454f3a0b875ab23547023107cfad454363ec88ba5695e2c24aa52a78282604051612d509291906137e8565b60405180910390a15050565b6040516001600160a01b0382169083156108fc029084905f818181858888f1935050505015801561177a573d5f803e3d5ffd5b601954612da79030906001600160a01b031684611f39565b6019546001600160a01b031663f305d7198230855f80612dce5f546001600160a01b031690565b60405160e088901b6001600160e01b03191681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c40160606040518083038185885af1158015612e34573d5f803e3d5ffd5b50505050506040513d601f19601f820116820180604052508101906116109190613808565b5f805f805f80612e6887612691565b6001600160a01b038f165f908152601e6020526040902054959b50939950919750955093509150612e9990886126d9565b6001600160a01b038a165f908152601e6020908152604080832093909355601d90522054612ec790876126d9565b6001600160a01b03808b165f908152601d602052604080822093909355908a1681522054612ef59086612633565b6001600160a01b0389165f908152601d6020526040902055612f1681613101565b612f208483613183565b876001600160a01b0316896001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef85604051612f6591815260200190565b60405180910390a3505050505050505050565b5f805f805f80612f8787612691565b6001600160a01b038f165f908152601d6020526040902054959b50939950919750955093509150612fb890876126d9565b6001600160a01b03808b165f908152601d6020908152604080832094909455918b168152601e9091522054612fed9084612633565b6001600160a01b0389165f908152601e6020908152604080832093909355601d90522054612ef59086612633565b5f805f805f8061302a87612691565b6001600160a01b038f165f908152601e6020526040902054959b5093995091975095509350915061305b90886126d9565b6001600160a01b038a165f908152601e6020908152604080832093909355601d90522054612fb890876126d9565b5f805f805f8061309887612691565b6001600160a01b038f165f908152601d6020526040902054959b50939950919750955093509150612ec790876126d9565b5f610a996103e86127c16012548561271a90919063ffffffff16565b5f610a996103e86127c16014548561271a90919063ffffffff16565b5f61310a6125d1565b90505f613117838361271a565b305f908152601d60205260409020549091506131339082612633565b305f908152601d602090815260408083209390935560239052205460ff161561177a57305f908152601e602052604090205461316f9084612633565b305f908152601e6020526040902055505050565b60075461319090836126d9565b6007556008546131a09082612633565b6008555050565b5f6020808352835180828501525f5b818110156131d2578581018301518582016040015282016131b6565b505f604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114613206575f80fd5b50565b5f806040838503121561321a575f80fd5b8235613225816131f2565b946020939093013593505050565b5f60208284031215613243575f80fd5b8135610f47816131f2565b5f8083601f84011261325e575f80fd5b50813567ffffffffffffffff811115613275575f80fd5b6020830191508360208260051b850101111561328f575f80fd5b9250929050565b5f805f80604085870312156132a9575f80fd5b843567ffffffffffffffff808211156132c0575f80fd5b6132cc8883890161324e565b909650945060208701359150808211156132e4575f80fd5b506132f18782880161324e565b95989497509550505050565b5f805f6060848603121561330f575f80fd5b833561331a816131f2565b9250602084013561332a816131f2565b929592945050506040919091013590565b5f806040838503121561334c575f80fd5b8235613357816131f2565b91506020830135613367816131f2565b809150509250929050565b8015158114613206575f80fd5b5f8060408385031215613390575f80fd5b823561322581613372565b5f602082840312156133ab575f80fd5b5035919050565b5f80604083850312156133c3575f80fd5b82359150602083013561336781613372565b5f805f606084860312156133e7575f80fd5b505081359360208301359350604090920135919050565b5f805f60408486031215613410575f80fd5b833567ffffffffffffffff811115613426575f80fd5b6134328682870161324e565b909450925050602084013561344681613372565b809150509250925092565b5f805f60408486031215613463575f80fd5b833567ffffffffffffffff811115613479575f80fd5b6134858682870161324e565b909790965060209590950135949350505050565b5f80602083850312156134aa575f80fd5b823567ffffffffffffffff8111156134c0575f80fd5b6134cc8582860161324e565b90969095509350505050565b5f602082840312156134e8575f80fd5b8135610f4781613372565b5f8060408385031215613504575f80fd5b50508035926020909101359150565b600181811c9082168061352757607f821691505b60208210810361354557634e487b7160e01b5f52602260045260245ffd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b5f52601160045260245ffd5b600181815b808511156135ce57815f19048211156135b4576135b4613580565b808516156135c157918102915b93841c9390800290613599565b509250929050565b5f826135e457506001610a99565b816135f057505f610a99565b816001811461360657600281146136105761362c565b6001915050610a99565b60ff84111561362157613621613580565b50506001821b610a99565b5060208310610133831016604e8410600b841016171561364f575081810a610a99565b6136598383613594565b805f190482111561366c5761366c613580565b029392505050565b5f610f4760ff8416836135d6565b634e487b7160e01b5f52603260045260245ffd5b8082028115828204841417610a9957610a99613580565b80820180821115610a9957610a99613580565b5f600182016136d1576136d1613580565b5060010190565b5f602082840312156136e8575f80fd5b5051919050565b5f602082840312156136ff575f80fd5b8151610f4781613372565b81810381811115610a9957610a99613580565b634e487b7160e01b5f52603160045260245ffd5b5f8261374b57634e487b7160e01b5f52601260045260245ffd5b500490565b5f60208284031215613760575f80fd5b8151610f47816131f2565b5f8151808452602080850194508084015f5b838110156137a25781516001600160a01b03168752958201959082019060010161377d565b509495945050505050565b85815284602082015260a060408201525f6137cb60a083018661376b565b6001600160a01b0394909416606083015250608001529392505050565b828152604060208201525f613800604083018461376b565b949350505050565b5f805f6060848603121561381a575f80fd5b835192506020840151915060408401519050925092509256fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa264697066735822122028f9b0f316909acedefc6fd3e5cbf190833b99550cdde2578ce5c0d5e82fd1fd64736f6c63430008150033

Deployed Bytecode Sourcemap

14552:23638:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15632:57;;;;;;;;;;;;;;;;;;;160:25:1;;;148:2;133:18;15632:57:0;;;;;;;;30500:83;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;18586:161::-;;;;;;;;;;-1:-1:-1;18586:161:0;;;;;:::i;:::-;;:::i;:::-;;;1370:14:1;;1363:22;1345:41;;1333:2;1318:18;18586:161:0;1205:187:1;31683:106:0;;;;;;;;;;-1:-1:-1;31683:106:0;;;;;:::i;:::-;-1:-1:-1;;;;;31763:18:0;31739:4;31763:18;;;:9;:18;;;;;;;;;31683:106;31925:87;;;;;;;;;;-1:-1:-1;31994:10:0;;31925:87;;15925:41;;;;;;;;;;-1:-1:-1;15925:41:0;;;;-1:-1:-1;;;;;15925:41:0;;;;;;-1:-1:-1;;;;;1840:32:1;;;1822:51;;1810:2;1795:18;15925:41:0;1649:230:1;30777:95:0;;;;;;;;;;-1:-1:-1;30857:7:0;;30777:95;;36186:701;;;;;;;;;;-1:-1:-1;36186:701:0;;;;;:::i;:::-;;:::i;:::-;;17758:313;;;;;;;;;;-1:-1:-1;17758:313:0;;;;;:::i;:::-;;:::i;15762:34::-;;;;;;;;;;-1:-1:-1;15762:34:0;;;;;;;;;;;35524:171;;;;;;;;;;-1:-1:-1;35524:171:0;;;;;:::i;:::-;;:::i;33276:337::-;;;;;;;;;;-1:-1:-1;33276:337:0;;;;;:::i;:::-;;:::i;31096:253::-;;;;;;;;;;-1:-1:-1;31096:253:0;;;;;:::i;:::-;;:::i;35879:113::-;;;;;;;;;;-1:-1:-1;35879:113:0;;;;;:::i;:::-;;:::i;30686:83::-;;;;;;;;;;-1:-1:-1;30752:9:0;;30686:83;;30752:9;;;;4665:36:1;;4653:2;4638:18;30686:83:0;4523:184:1;32789:479:0;;;;;;;;;;-1:-1:-1;32789:479:0;;;;;:::i;:::-;;:::i;18079:218::-;;;;;;;;;;-1:-1:-1;18079:218:0;;;;;:::i;:::-;;:::i;18759:377::-;;;;;;;;;;-1:-1:-1;18759:377:0;;;;;:::i;:::-;;:::i;15161:36::-;;;;;;;;;;;;;;;;32020:436;;;;;;;;;;-1:-1:-1;32020:436:0;;;;;:::i;:::-;;:::i;15973:28::-;;;;;;;;;;-1:-1:-1;15973:28:0;;;;-1:-1:-1;;;;;15973:28:0;;;37857:256;;;;;;;;;;-1:-1:-1;37857:256:0;;;;;:::i;:::-;;:::i;32520:261::-;;;;;;;;;;-1:-1:-1;32520:261:0;;;;;:::i;:::-;;:::i;34961:209::-;;;;;;;;;;-1:-1:-1;34961:209:0;;;;;:::i;:::-;;:::i;36895:509::-;;;;;;;;;;-1:-1:-1;36895:509:0;;;;;:::i;:::-;;:::i;30880:208::-;;;;;;;;;;-1:-1:-1;30880:208:0;;;;;:::i;:::-;;:::i;6313:148::-;;;;;;;;;;;;;:::i;34489:198::-;;;;;;;;;;-1:-1:-1;34489:198:0;;;;;:::i;:::-;;:::i;15114:37::-;;;;;;;;;;;;;;;;35381:135;;;;;;;;;;-1:-1:-1;35381:135:0;;;;;:::i;:::-;;:::i;15297:37::-;;;;;;;;;;;;;;;;14977:58;;;;;;;;;;;;;;;;37412:437;;;;;;;;;;-1:-1:-1;37412:437:0;;;;;:::i;:::-;;:::i;35182:188::-;;;;;;;;;;-1:-1:-1;35182:188:0;;;;;:::i;:::-;;:::i;15206:36::-;;;;;;;;;;;;;;;;31797:120;;;;;;;;;;-1:-1:-1;31797:120:0;;;;;:::i;:::-;-1:-1:-1;;;;;31889:20:0;31865:4;31889:20;;;:11;:20;;;;;;;;;31797:120;6088:79;;;;;;;;;;-1:-1:-1;6126:7:0;6153:6;-1:-1:-1;;;;;6153:6:0;6088:79;;33729:93;;;;;;;;;;-1:-1:-1;33729:93:0;;;;;:::i;:::-;;:::i;36000:178::-;;;;;;;;;;-1:-1:-1;36000:178:0;;;;;:::i;:::-;;:::i;30591:87::-;;;;;;;;;;;;;:::i;18305:269::-;;;;;;;;;;-1:-1:-1;18305:269:0;;;;;:::i;:::-;;:::i;31357:167::-;;;;;;;;;;-1:-1:-1;31357:167:0;;;;;:::i;:::-;;:::i;35703:168::-;;;;;;;;;;-1:-1:-1;35703:168:0;;;;;:::i;:::-;;:::i;33625:96::-;;;;;;;;;;-1:-1:-1;33625:96:0;;;;;:::i;:::-;;:::i;14738:29::-;;;;;;;;;;;;;;;;15068:35;;;;;;;;;;;;;;;;31532:143;;;;;;;;;;-1:-1:-1;31532:143:0;;;;;:::i;:::-;-1:-1:-1;;;;;31640:18:0;;;31613:7;31640:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;31532:143;34821:128;;;;;;;;;;-1:-1:-1;34821:128:0;;;;;:::i;:::-;;:::i;34699:110::-;;;;;;;;;;-1:-1:-1;34699:110:0;;;;;:::i;:::-;;:::i;33834:523::-;;;;;;;;;;-1:-1:-1;33834:523:0;;;;;:::i;:::-;;:::i;34369:112::-;;;;;;;;;;-1:-1:-1;34369:112:0;;;;;:::i;:::-;;:::i;6469:244::-;;;;;;;;;;-1:-1:-1;6469:244:0;;;;;:::i;:::-;;:::i;15250:38::-;;;;;;;;;;;;;;;;14702:29;;;;;;;;;;;;;;;;15724:31;;;;;;;;;;-1:-1:-1;15724:31:0;;;;;;;;;;;30500:83;30537:13;30570:5;30563:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30500:83;:::o;18586:161::-;18661:4;18678:39;476:10;18701:7;18710:6;18678:8;:39::i;:::-;-1:-1:-1;18735:4:0;18586:161;;;;;:::o;36186:701::-;6222:6;;-1:-1:-1;;;;;6222:6:0;476:10;6222:22;6214:67;;;;-1:-1:-1;;;6214:67:0;;;;;;;:::i;:::-;;;;;;;;;36326:3:::1;36307:22:::0;::::1;36299:79;;;::::0;-1:-1:-1;;;36299:79:0;;9178:2:1;36299:79:0::1;::::0;::::1;9160:21:1::0;9217:2;9197:18;;;9190:30;9256:34;9236:18;;;9229:62;-1:-1:-1;;;9307:18:1;;;9300:43;9360:19;;36299:79:0::1;8976:409:1::0;36299:79:0::1;36420:33:::0;;::::1;36412:85;;;::::0;-1:-1:-1;;;36412:85:0;;9592:2:1;36412:85:0::1;::::0;::::1;9574:21:1::0;9631:2;9611:18;;;9604:30;9670:34;9650:18;;;9643:62;-1:-1:-1;;;9721:18:1;;;9714:38;9769:19;;36412:85:0::1;9390:404:1::0;36412:85:0::1;36510:12;36543:6:::0;36539:108:::1;36553:20:::0;;::::1;36539:108;;;36625:9;::::0;36621:13:::1;::::0;36625:9:::1;;36621:2;:13;:::i;:::-;36609:6;;36616:1;36609:9;;;;;;;:::i;:::-;;;;;;;:25;;;;:::i;:::-;36601:34;::::0;:4;:34:::1;:::i;:::-;36594:41:::0;-1:-1:-1;36575:3:0;::::1;::::0;::::1;:::i;:::-;;;;36539:108;;;;36692:4;36667:21;36677:10;36667:9;:21::i;:::-;:29;;36659:69;;;::::0;-1:-1:-1;;;36659:69:0;;12091:2:1;36659:69:0::1;::::0;::::1;12073:21:1::0;12130:2;12110:18;;;12103:30;12169:29;12149:18;;;12142:57;12216:18;;36659:69:0::1;11889:351:1::0;36659:69:0::1;36745:6;36741:139;36755:20:::0;;::::1;36741:139;;;36796:62;36806:10;36817:9;;36827:1;36817:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;36847:9;::::0;36843:13:::1;::::0;36847:9:::1;;36843:2;:13;:::i;:::-;36831:6;;36838:1;36831:9;;;;;;;:::i;:::-;;;;;;;:25;;;;:::i;:::-;36796:9;:62::i;:::-;36777:3:::0;::::1;::::0;::::1;:::i;:::-;;;;36741:139;;;;36286:601;36186:701:::0;;;;:::o;17758:313::-;17856:4;17873:36;17883:6;17891:9;17902:6;17873:9;:36::i;:::-;17920:121;17929:6;476:10;17951:89;17989:6;17951:89;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;17951:19:0;;;;;;:11;:19;;;;;;;;476:10;17951:33;;;;;;;;;;:37;:89::i;:::-;17920:8;:121::i;:::-;-1:-1:-1;18059:4:0;17758:313;;;;;:::o;35524:171::-;6222:6;;-1:-1:-1;;;;;6222:6:0;476:10;6222:22;6214:67;;;;-1:-1:-1;;;6214:67:0;;;;;;;:::i;:::-;35619:30:::1;::::0;-1:-1:-1;;;35619:30:0;;35643:4:::1;35619:30;::::0;::::1;1822:51:1::0;35601:15:0::1;::::0;-1:-1:-1;;;;;35619:15:0;::::1;::::0;::::1;::::0;1795:18:1;;35619:30:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35660:27;::::0;-1:-1:-1;;;35660:27:0;;-1:-1:-1;;;;;12626:32:1;;;35660:27:0::1;::::0;::::1;12608:51:1::0;12675:18;;;12668:34;;;35601:48:0;;-1:-1:-1;35660:14:0;;::::1;::::0;::::1;::::0;12581:18:1;;35660:27:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;35590:105;35524:171:::0;;:::o;33276:337::-;6222:6;;-1:-1:-1;;;;;6222:6:0;476:10;6222:22;6214:67;;;;-1:-1:-1;;;6214:67:0;;;;;;;:::i;:::-;33363:11:::1;:21:::0;;-1:-1:-1;;33363:21:0::1;;::::0;::::1;;;;::::0;;33395:32:::1;33421:4;33395:17;:32::i;:::-;33456:13;::::0;33438:32:::1;::::0;-1:-1:-1;;;;;33456:13:0::1;33438:17;:32::i;:::-;33484:11;::::0;::::1;::::0;::::1;;;:30:::0;::::1;;;-1:-1:-1::0;33499:10:0::1;::::0;:15;33484:30:::1;33481:125;;;33543:12;33530:10;:25:::0;33570:10:::1;:24:::0;;;33481:125:::1;33276:337:::0;;:::o;31096:253::-;31162:7;31201;;31190;:18;;31182:73;;;;-1:-1:-1;;;31182:73:0;;13165:2:1;31182:73:0;;;13147:21:1;13204:2;13184:18;;;13177:30;13243:34;13223:18;;;13216:62;-1:-1:-1;;;13294:18:1;;;13287:40;13344:19;;31182:73:0;12963:406:1;31182:73:0;31266:19;31289:10;:8;:10::i;:::-;31266:33;-1:-1:-1;31317:24:0;:7;31266:33;31317:11;:24::i;:::-;31310:31;31096:253;-1:-1:-1;;;31096:253:0:o;35879:113::-;6222:6;;-1:-1:-1;;;;;6222:6:0;476:10;6222:22;6214:67;;;;-1:-1:-1;;;6214:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;35952:25:0::1;;::::0;;;:18:::1;:25;::::0;;;;:32;;-1:-1:-1;;35952:32:0::1;35980:4;35952:32;::::0;;35879:113::o;32789:479::-;6222:6;;-1:-1:-1;;;;;6222:6:0;476:10;6222:22;6214:67;;;;-1:-1:-1;;;6214:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;32871:20:0;::::1;;::::0;;;:11:::1;:20;::::0;;;;;::::1;;32863:60;;;::::0;-1:-1:-1;;;32863:60:0;;13576:2:1;32863:60:0::1;::::0;::::1;13558:21:1::0;13615:2;13595:18;;;13588:30;13654:29;13634:18;;;13627:57;13701:18;;32863:60:0::1;13374:351:1::0;32863:60:0::1;32939:9;32934:327;32958:9;:16:::0;32954:20;::::1;32934:327;;;33016:7;-1:-1:-1::0;;;;;33000:23:0::1;:9;33010:1;33000:12;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;33000:12:0::1;:23:::0;32996:254:::1;;33059:9;33069:16:::0;;:20:::1;::::0;33088:1:::1;::::0;33069:20:::1;:::i;:::-;33059:31;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;33044:9:::1;:12:::0;;-1:-1:-1;;;;;33059:31:0;;::::1;::::0;33054:1;;33044:12;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;;::::1;:46:::0;;-1:-1:-1;;;;;;33044:46:0::1;-1:-1:-1::0;;;;;33044:46:0;;::::1;;::::0;;33109:16;;::::1;::::0;;:7:::1;:16:::0;;;;;;:20;;;33148:11:::1;:20:::0;;;;:28;;-1:-1:-1;;33148:28:0::1;::::0;;33195:9:::1;:15:::0;;;::::1;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;-1:-1:-1;;33195:15:0;;;;;-1:-1:-1;;;;;;33195:15:0::1;::::0;;;;;33276:337;;:::o;32996:254::-:1;32976:3:::0;::::1;::::0;::::1;:::i;:::-;;;;32934:327;;18079:218:::0;476:10;18167:4;18216:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;18216:34:0;;;;;;;;;;18167:4;;18184:83;;18207:7;;18216:50;;18255:10;18216:38;:50::i;18759:377::-;476:10;18811:14;18860:19;;;:11;:19;;;;;;;;18859:20;18851:77;;;;-1:-1:-1;;;18851:77:0;;14197:2:1;18851:77:0;;;14179:21:1;14236:2;14216:18;;;14209:30;14275:34;14255:18;;;14248:62;-1:-1:-1;;;14326:18:1;;;14319:42;14378:19;;18851:77:0;13995:408:1;18851:77:0;18940:15;18964:19;18975:7;18964:10;:19::i;:::-;-1:-1:-1;;;;;;;;;19012:15:0;;;;;;:7;:15;;;;;;18939:44;;-1:-1:-1;19012:28:0;;:15;-1:-1:-1;18939:44:0;19012:19;:28::i;:::-;-1:-1:-1;;;;;18994:15:0;;;;;;:7;:15;;;;;:46;19061:7;;:20;;19073:7;19061:11;:20::i;:::-;19051:7;:30;19105:10;;:23;;19120:7;19105:14;:23::i;:::-;19092:10;:36;-1:-1:-1;;;18759:377:0:o;32020:436::-;32110:7;32149;;32138;:18;;32130:62;;;;-1:-1:-1;;;32130:62:0;;14610:2:1;32130:62:0;;;14592:21:1;14649:2;14629:18;;;14622:30;14688:33;14668:18;;;14661:61;14739:18;;32130:62:0;14408:355:1;32130:62:0;32208:17;32203:246;;32243:15;32267:19;32278:7;32267:10;:19::i;:::-;-1:-1:-1;32242:44:0;;-1:-1:-1;32301:14:0;;-1:-1:-1;;;;;32301:14:0;32203:246;32350:23;32381:19;32392:7;32381:10;:19::i;:::-;-1:-1:-1;32348:52:0;;-1:-1:-1;32415:22:0;;-1:-1:-1;;;;;32415:22:0;37857:256;6222:6;;-1:-1:-1;;;;;6222:6:0;476:10;6222:22;6214:67;;;;-1:-1:-1;;;6214:67:0;;;;;;;:::i;:::-;37980:17:::1;:34:::0;;;;38025:17:::1;:34:::0;38070:18:::1;:35:::0;37857:256::o;32520:261::-;6222:6;;-1:-1:-1;;;;;6222:6:0;476:10;6222:22;6214:67;;;;-1:-1:-1;;;6214:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;32597:16:0;::::1;32616:1;32597:16:::0;;;:7:::1;:16;::::0;;;;;:20;32594:108:::1;;-1:-1:-1::0;;;;;32673:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;;32653:37:::1;::::0;:19:::1;:37::i;:::-;-1:-1:-1::0;;;;;32634:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;:56;32594:108:::1;-1:-1:-1::0;;;;;32712:20:0::1;;::::0;;;:11:::1;:20;::::0;;;;:27;;-1:-1:-1;;32712:27:0::1;32735:4;32712:27:::0;;::::1;::::0;;;32750:9:::1;:23:::0;;;;::::1;::::0;;;;;;::::1;::::0;;-1:-1:-1;;;;;;32750:23:0::1;::::0;;::::1;::::0;;32520:261::o;34961:209::-;6222:6;;-1:-1:-1;;;;;6222:6:0;476:10;6222:22;6214:67;;;;-1:-1:-1;;;6214:67:0;;;;;;;:::i;:::-;35061:9:::1;35056:107;35072:20:::0;;::::1;35056:107;;;35144:6;35118:9;:23;35128:9;;35138:1;35128:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;35118:23:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;35118:23:0;:32;;-1:-1:-1;;35118:32:0::1;::::0;::::1;;::::0;;;::::1;::::0;;35094:3:::1;::::0;::::1;:::i;:::-;;;35056:107;;36895:509:::0;6222:6;;-1:-1:-1;;;;;6222:6:0;476:10;6222:22;6214:67;;;;-1:-1:-1;;;6214:67:0;;;;;;;:::i;:::-;37030:4:::1;37011:23:::0;::::1;37003:81;;;::::0;-1:-1:-1;;;37003:81:0;;14970:2:1;37003:81:0::1;::::0;::::1;14952:21:1::0;15009:2;14989:18;;;14982:30;15048:34;15028:18;;;15021:62;-1:-1:-1;;;15099:18:1;;;15092:44;15153:19;;37003:81:0::1;14768:410:1::0;37003:81:0::1;37147:9;::::0;37120:12:::1;::::0;37159:9;;37143:13:::1;::::0;37147:9:::1;;37143:2;:13;:::i;:::-;37135:21;::::0;:6;:21:::1;:::i;:::-;:40;;;;:::i;:::-;37120:55;;37221:4;37196:21;37206:10;37196:9;:21::i;:::-;:29;;37188:69;;;::::0;-1:-1:-1;;;37188:69:0;;12091:2:1;37188:69:0::1;::::0;::::1;12073:21:1::0;12130:2;12110:18;;;12103:30;12169:29;12149:18;;;12142:57;12216:18;;37188:69:0::1;11889:351:1::0;37188:69:0::1;37274:6;37270:127;37284:20:::0;;::::1;37270:127;;;37325:58;37335:10;37346:9;;37356:1;37346:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;37372:9;::::0;37368:13:::1;::::0;37372:9:::1;;37368:2;:13;:::i;:::-;37360:21;::::0;:6;:21:::1;:::i;37325:58::-;37306:3:::0;::::1;::::0;::::1;:::i;:::-;;;;37270:127;;;;36990:414;36895:509:::0;;;:::o;30880:208::-;-1:-1:-1;;;;;30970:20:0;;30946:7;30970:20;;;:11;:20;;;;;;;;30966:59;;;-1:-1:-1;;;;;;31009:16:0;;;;;:7;:16;;;;;;;30880:208::o;30966:59::-;-1:-1:-1;;;;;31063:16:0;;;;;;:7;:16;;;;;;31043:37;;:19;:37::i;6313:148::-;6222:6;;-1:-1:-1;;;;;6222:6:0;476:10;6222:22;6214:67;;;;-1:-1:-1;;;6214:67:0;;;;;;;:::i;:::-;6420:1:::1;6404:6:::0;;6383:40:::1;::::0;-1:-1:-1;;;;;6404:6:0;;::::1;::::0;6383:40:::1;::::0;6420:1;;6383:40:::1;6451:1;6434:19:::0;;-1:-1:-1;;;;;;6434:19:0::1;::::0;;6313:148::o;34489:198::-;6222:6;;-1:-1:-1;;;;;6222:6:0;476:10;6222:22;6214:67;;;;-1:-1:-1;;;6214:67:0;;;;;;;:::i;:::-;34576:9:::1;34571:109;34587:20:::0;;::::1;34571:109;;;34664:4;34629:18;:32;34648:9;;34658:1;34648:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;34629:32:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;34629:32:0;:39;;-1:-1:-1;;34629:39:0::1;::::0;::::1;;::::0;;;::::1;::::0;;34609:3:::1;::::0;::::1;:::i;:::-;;;34571:109;;;;34489:198:::0;;:::o;35381:135::-;6222:6;;-1:-1:-1;;;;;6222:6:0;476:10;6222:22;6214:67;;;;-1:-1:-1;;;6214:67:0;;;;;;;:::i;:::-;35466:42:::1;::::0;-1:-1:-1;;;;;35466:19:0;::::1;::::0;35486:21:::1;35466:42:::0;::::1;;;::::0;::::1;::::0;;;35486:21;35466:19;:42;::::1;;;;;;;;;;;;;::::0;::::1;;;;37412:437:::0;6222:6;;-1:-1:-1;;;;;6222:6:0;476:10;6222:22;6214:67;;;;-1:-1:-1;;;6214:67:0;;;;;;;:::i;:::-;37544:16:::1;:33:::0;;;37588:16:::1;:33:::0;;;37632:17:::1;:34:::0;;;37679:13:::1;:30:::0;;;37720:12:::1;:29:::0;;;37760:12:::1;:29:::0;;;37811:30:::1;37563:14:::0;37607;37811:16:::1;:30::i;:::-;37800:8;:41:::0;-1:-1:-1;;;37412:437:0:o;35182:188::-;6222:6;;-1:-1:-1;;;;;6222:6:0;476:10;6222:22;6214:67;;;;-1:-1:-1;;;6214:67:0;;;;;;;:::i;:::-;35269:9:::1;35264:99;35280:20:::0;;::::1;35264:99;;;35347:4;35322:10;:24;35333:9;;35343:1;35333:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;35322:24:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;35322:24:0;:29;;-1:-1:-1;;35322:29:0::1;::::0;::::1;;::::0;;;::::1;::::0;;35302:3:::1;::::0;::::1;:::i;:::-;;;35264:99;;33729:93:::0;6222:6;;-1:-1:-1;;;;;6222:6:0;476:10;6222:22;6214:67;;;;-1:-1:-1;;;6214:67:0;;;;;;;:::i;:::-;33795:11:::1;:19:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;33795:19:0;;::::1;::::0;;;::::1;::::0;;33729:93::o;36000:178::-;6222:6;;-1:-1:-1;;;;;6222:6:0;476:10;6222:22;6214:67;;;;-1:-1:-1;;;6214:67:0;;;;;;;:::i;:::-;36154:16:::1;36134;36124:7;;:26;;;;:::i;:::-;36123:47;;;;:::i;:::-;36107:13;:63:::0;-1:-1:-1;;36000:178:0:o;30591:87::-;30630:13;30663:7;30656:14;;;;;:::i;18305:269::-;18398:4;18415:129;476:10;18438:7;18447:96;18486:15;18447:96;;;;;;;;;;;;;;;;;476:10;18447:25;;;;:11;:25;;;;;;;;-1:-1:-1;;;;;18447:34:0;;;;;;;;;;;;:38;:96::i;31357:167::-;31435:4;31452:42;476:10;31476:9;31487:6;31452:9;:42::i;35703:168::-;6222:6;;-1:-1:-1;;;;;6222:6:0;476:10;6222:22;6214:67;;;;-1:-1:-1;;;6214:67:0;;;;;;;:::i;:::-;35817:46:::1;35839:23;35817:17;35829:4;35817:7;;:11;;:17;;;;:::i;:::-;:21:::0;::::1;:46::i;:::-;35799:15;:64:::0;-1:-1:-1;35703:168:0:o;33625:96::-;6222:6;;-1:-1:-1;;;;;6222:6:0;476:10;6222:22;6214:67;;;;-1:-1:-1;;;6214:67:0;;;;;;;:::i;:::-;33691:14:::1;:22:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;33691:22:0;;::::1;::::0;;;::::1;::::0;;33625:96::o;34821:128::-;6222:6;;-1:-1:-1;;;;;6222:6:0;476:10;6222:22;6214:67;;;;-1:-1:-1;;;6214:67:0;;;;;;;:::i;:::-;34898:15:::1;:43:::0;;-1:-1:-1;;;;;;34898:43:0::1;-1:-1:-1::0;;;;;34898:43:0;;;::::1;::::0;;;::::1;::::0;;34821:128::o;34699:110::-;6222:6;;-1:-1:-1;;;;;6222:6:0;476:10;6222:22;6214:67;;;;-1:-1:-1;;;6214:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;34766:27:0::1;34796:5;34766:27:::0;;;:18:::1;:27;::::0;;;;:35;;-1:-1:-1;;34766:35:0::1;::::0;;34699:110::o;33834:523::-;6222:6;;-1:-1:-1;;;;;6222:6:0;476:10;6222:22;6214:67;;;;-1:-1:-1;;;6214:67:0;;;;;;;:::i;:::-;33907:29:::1;33958:9;33907:61;;33979:16;34016:10;-1:-1:-1::0;;;;;34016:18:0::1;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;33998:47:0::1;;34054:4;34061:10;-1:-1:-1::0;;;;;34061:15:0::1;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33998:81;::::0;-1:-1:-1;;;;;;33998:81:0::1;::::0;;;;;;-1:-1:-1;;;;;15891:15:1;;;33998:81:0::1;::::0;::::1;15873:34:1::0;15943:15;;15923:18;;;15916:43;15808:18;;33998:81:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33979:100:::0;-1:-1:-1;;;;;;34094:22:0;::::1;34090:221;;34167:10;-1:-1:-1::0;;;;;34167:18:0::1;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;34149:50:0::1;;34208:4;34215:10;-1:-1:-1::0;;;;;34215:15:0::1;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34149:84;::::0;-1:-1:-1;;;;;;34149:84:0::1;::::0;;;;;;-1:-1:-1;;;;;15891:15:1;;;34149:84:0::1;::::0;::::1;15873:34:1::0;15943:15;;15923:18;;;15916:43;15808:18;;34149:84:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34133:13;:100:::0;;-1:-1:-1;;;;;;34133:100:0::1;-1:-1:-1::0;;;;;34133:100:0;;;::::1;::::0;;;::::1;::::0;;34090:221:::1;;;34275:13;:24:::0;;-1:-1:-1;;;;;;34275:24:0::1;-1:-1:-1::0;;;;;34275:24:0;::::1;;::::0;;34090:221:::1;-1:-1:-1::0;34321:15:0::1;:28:::0;;-1:-1:-1;;;;;;34321:28:0::1;-1:-1:-1::0;;;;;34321:28:0;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;33834:523:0:o;34369:112::-;6222:6;;-1:-1:-1;;;;;6222:6:0;476:10;6222:22;6214:67;;;;-1:-1:-1;;;6214:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;34439:27:0::1;;::::0;;;:18:::1;:27;::::0;;;;:34;;-1:-1:-1;;34439:34:0::1;34469:4;34439:34;::::0;;34369:112::o;6469:244::-;6222:6;;-1:-1:-1;;;;;6222:6:0;476:10;6222:22;6214:67;;;;-1:-1:-1;;;6214:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;6558:22:0;::::1;6550:73;;;::::0;-1:-1:-1;;;6550:73:0;;16172:2:1;6550:73:0::1;::::0;::::1;16154:21:1::0;16211:2;16191:18;;;16184:30;16250:34;16230:18;;;16223:62;-1:-1:-1;;;16301:18:1;;;16294:36;16347:19;;6550:73:0::1;15970:402:1::0;6550:73:0::1;6660:6;::::0;;6639:38:::1;::::0;-1:-1:-1;;;;;6639:38:0;;::::1;::::0;6660:6;::::1;::::0;6639:38:::1;::::0;::::1;6688:6;:17:::0;;-1:-1:-1;;;;;;6688:17:0::1;-1:-1:-1::0;;;;;6688:17:0;;;::::1;::::0;;;::::1;::::0;;6469:244::o;19144:337::-;-1:-1:-1;;;;;19237:19:0;;19229:68;;;;-1:-1:-1;;;19229:68:0;;16579:2:1;19229:68:0;;;16561:21:1;16618:2;16598:18;;;16591:30;16657:34;16637:18;;;16630:62;-1:-1:-1;;;16708:18:1;;;16701:34;16752:19;;19229:68:0;16377:400:1;19229:68:0;-1:-1:-1;;;;;19316:21:0;;19308:68;;;;-1:-1:-1;;;19308:68:0;;16984:2:1;19308:68:0;;;16966:21:1;17023:2;17003:18;;;16996:30;17062:34;17042:18;;;17035:62;-1:-1:-1;;;17113:18:1;;;17106:32;17155:19;;19308:68:0;16782:398:1;19308:68:0;-1:-1:-1;;;;;19389:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;19441:32;;160:25:1;;;19441:32:0;;133:18:1;19441:32:0;;;;;;;19144:337;;;:::o;19623:2280::-;-1:-1:-1;;;;;19745:18:0;;19737:68;;;;-1:-1:-1;;;19737:68:0;;17387:2:1;19737:68:0;;;17369:21:1;17426:2;17406:18;;;17399:30;17465:34;17445:18;;;17438:62;-1:-1:-1;;;17516:18:1;;;17509:35;17561:19;;19737:68:0;17185:401:1;19737:68:0;-1:-1:-1;;;;;19824:16:0;;19816:64;;;;-1:-1:-1;;;19816:64:0;;17793:2:1;19816:64:0;;;17775:21:1;17832:2;17812:18;;;17805:30;17871:34;17851:18;;;17844:62;-1:-1:-1;;;17922:18:1;;;17915:33;17965:19;;19816:64:0;17591:399:1;19816:64:0;19908:1;19899:6;:10;19891:64;;;;-1:-1:-1;;;19891:64:0;;18197:2:1;19891:64:0;;;18179:21:1;18236:2;18216:18;;;18209:30;18275:34;18255:18;;;18248:62;-1:-1:-1;;;18326:18:1;;;18319:39;18375:19;;19891:64:0;17995:405:1;19891:64:0;-1:-1:-1;;;;;19975:13:0;;;;;;:9;:13;;;;;;;;19974:14;19966:42;;;;-1:-1:-1;;;19966:42:0;;18607:2:1;19966:42:0;;;18589:21:1;18646:2;18626:18;;;18619:30;-1:-1:-1;;;18665:18:1;;;18658:45;18720:18;;19966:42:0;18405:339:1;19966:42:0;-1:-1:-1;;;;;20028:15:0;;;;;;:9;:15;;;;;;;;20027:16;20019:44;;;;-1:-1:-1;;;20019:44:0;;18607:2:1;20019:44:0;;;18589:21:1;18646:2;18626:18;;;18619:30;-1:-1:-1;;;18665:18:1;;;18658:45;18720:18;;20019:44:0;18405:339:1;20019:44:0;6126:7;6153:6;-1:-1:-1;;;;;20078:14:0;;;6153:6;;20078:14;;;;:30;;-1:-1:-1;6126:7:0;6153:6;-1:-1:-1;;;;;20096:12:0;;;6153:6;;20096:12;;20078:30;20074:84;;;20118:11;;;;;;;20110:48;;;;-1:-1:-1;;;20110:48:0;;18951:2:1;20110:48:0;;;18933:21:1;18990:2;18970:18;;;18963:30;19029:26;19009:18;;;19002:54;19073:18;;20110:48:0;18749:348:1;20110:48:0;20291:13;;20219:12;;-1:-1:-1;;;;;20285:19:0;;;20291:13;;20285:19;;:40;;-1:-1:-1;20312:13:0;;-1:-1:-1;;;;;20308:17:0;;;20312:13;;20308:17;20285:40;20284:99;;;;-1:-1:-1;;;;;;20332:24:0;;;;;;:18;:24;;;;;;;;;:50;;-1:-1:-1;;;;;;20360:22:0;;;;;;:18;:22;;;;;;;;20332:50;20330:53;20284:99;20279:148;;;-1:-1:-1;20411:4:0;20279:148;20453:1;20442:10;;:12;:59;;;;-1:-1:-1;;;;;;20460:22:0;;;;;;:18;:22;;;;;;;;20459:23;:41;;;;-1:-1:-1;6126:7:0;6153:6;-1:-1:-1;;;;;20486:14:0;;;6153:6;;20486:14;;20459:41;20442:105;;;;;20534:12;20520:10;;20507;;:23;;;;:::i;:::-;20506:40;20442:105;20439:246;;;20598:15;;20583:13;20593:2;20583:9;:13::i;:::-;20575:21;;:6;:21;:::i;:::-;:38;;20567:106;;;;-1:-1:-1;;;20567:106:0;;19304:2:1;20567:106:0;;;19286:21:1;19343:2;19323:18;;;19316:30;19382:34;19362:18;;;19355:62;-1:-1:-1;;;19433:18:1;;;19426:32;19475:19;;20567:106:0;19102:398:1;20567:106:0;20714:8;;20698:15;:24;20747:17;;20733:13;:31;20780:11;;;;;;;:34;;;;-1:-1:-1;20801:13:0;;-1:-1:-1;;;;;20795:19:0;;;20801:13;;20795:19;20780:34;20777:177;;;20877:17;;20855;;:40;;:21;:40::i;:::-;20838:15;:57;20924:18;;20910:13;:32;20777:177;21007:1;20996:10;;:12;:56;;;;;21040:12;21026:10;;21013;;:23;;;;:::i;:::-;21012:40;20996:56;20993:109;;;-1:-1:-1;;;;;21072:13:0;;;;;;:9;:13;;;;;:18;;-1:-1:-1;;21072:18:0;21086:4;21072:18;;;20993:109;21157:1;21146:10;;:12;:30;;;;-1:-1:-1;6126:7:0;6153:6;-1:-1:-1;;;;;21162:14:0;;;6153:6;;21162:14;;21146:30;:75;;;;;21210:10;;21197;;:23;;;;:::i;:::-;21180:12;:41;;21146:75;:91;;;;-1:-1:-1;21226:11:0;;;;;;;21146:91;21143:154;;;21273:3;21257:15;:19;21143:154;21328:14;;;;;;;21325:144;;;21362:11;;;;;;;:36;;;;-1:-1:-1;21385:13:0;;-1:-1:-1;;;;;21377:21:0;;;21385:13;;21377:21;21362:36;21359:99;;;21440:1;21424:15;:17;21359:99;21502:6;;;;21501:7;:22;;;;-1:-1:-1;21512:11:0;;;;;;;21501:22;:45;;;;-1:-1:-1;21533:13:0;;-1:-1:-1;;;;;21527:19:0;;;21533:13;;21527:19;21501:45;21497:350;;;21571:28;21602:24;21620:4;21602:9;:24::i;:::-;21571:55;;21680:13;;21658:20;:35;21655:169;;-1:-1:-1;21740:13:0;;21776:32;21740:13;21776:10;:32::i;:::-;21548:299;21497:350;21857:38;21872:4;21877:2;21880:6;21887:7;21857:14;:38::i;1789:192::-;1875:7;1911:12;1903:6;;;;1895:29;;;;-1:-1:-1;;;1895:29:0;;;;;;;;:::i;:::-;-1:-1:-1;1935:9:0;1947:5;1951:1;1947;:5;:::i;:::-;1935:17;1789:192;-1:-1:-1;;;;;1789:192:0:o;29351:163::-;29392:7;29413:15;29430;29449:19;:17;:19::i;:::-;29412:56;;-1:-1:-1;29412:56:0;-1:-1:-1;29486:20:0;29412:56;;29486:11;:20::i;:::-;29479:27;;;;29351:163;:::o;2247:132::-;2305:7;2332:39;2336:1;2339;2332:39;;;;;;;;;;;;;;;;;:3;:39::i;1456:181::-;1514:7;;1546:5;1550:1;1546;:5;:::i;:::-;1534:17;;1575:1;1570;:6;;1562:46;;;;-1:-1:-1;;;1562:46:0;;19707:2:1;1562:46:0;;;19689:21:1;19746:2;19726:18;;;19719:30;19785:29;19765:18;;;19758:57;19832:18;;1562:46:0;19505:351:1;28586:419:0;28645:7;28654;28663;28672;28681;28690;28711:23;28736:12;28750:18;28772:20;28784:7;28772:11;:20::i;:::-;28710:82;;;;;;28804:15;28821:23;28846:12;28862:50;28874:7;28883:4;28889:10;28901;:8;:10::i;:::-;28862:11;:50::i;:::-;28803:109;;;;-1:-1:-1;28803:109:0;;-1:-1:-1;28963:15:0;;-1:-1:-1;28980:4:0;;-1:-1:-1;28986:10:0;;-1:-1:-1;28586:419:0;;-1:-1:-1;;;;;28586:419:0:o;1645:136::-;1703:7;1730:43;1734:1;1737;1730:43;;;;;;;;;;;;;;;;;:3;:43::i;1989:250::-;2047:7;2071:1;2076;2071:6;2067:47;;-1:-1:-1;2101:1:0;2094:8;;2067:47;2126:9;2138:5;2142:1;2138;:5;:::i;:::-;2126:17;-1:-1:-1;2171:1:0;2162:5;2166:1;2126:17;2162:5;:::i;:::-;:10;2154:56;;;;-1:-1:-1;;;2154:56:0;;20063:2:1;2154:56:0;;;20045:21:1;20102:2;20082:18;;;20075:30;20141:34;20121:18;;;20114:62;-1:-1:-1;;;20192:18:1;;;20185:31;20233:19;;2154:56:0;19861:397:1;26171:1028:0;16898:6;:13;;-1:-1:-1;;16898:13:0;16907:4;16898:13;;;26359:8:::1;::::0;26327:12:::1;::::0;16898:6;;26288:101:::1;::::0;26387:1:::1;::::0;26288:80:::1;::::0;;;:20;;:38:::1;:52::i;:::-;:70:::0;::::1;:80::i;:101::-;26262:127:::0;-1:-1:-1;26402:20:0::1;26425:41;:20:::0;26262:127;26425:24:::1;:41::i;:::-;26402:64;;26487:30;26504:12;26487:16;:30::i;:::-;26619:12;::::0;26550:21:::1;::::0;26530:17:::1;::::0;26606:33:::1;::::0;26619:19:::1;::::0;26636:1:::1;26619:16;:19::i;:::-;26606:8;::::0;;:12:::1;:33::i;:::-;26584:55;;26652:26;26681:93;26772:1;26681:72;26741:11;26681:41;26709:12;;26681:9;:27;;:41;;;;:::i;:93::-;26652:122;;26795:26;26824:44;26856:11;26824:27;26838:12;;26824:9;:13;;:27;;;;:::i;:44::-;26795:73:::0;-1:-1:-1;26944:21:0::1;26979:22:::0;;26976:102:::1;;27050:15;::::0;27018:48:::1;::::0;27031:18;;-1:-1:-1;;;;;27050:15:0::1;27018:12;:48::i;:::-;27092:19:::0;;27088:104:::1;;27132:48;27145:15;27161:18;27132:12;:48::i;:::-;-1:-1:-1::0;;16934:6:0;:14;;-1:-1:-1;;16934:14:0;;;-1:-1:-1;;;;;;26171:1028:0:o;21911:943::-;22051:13;;22101:15;;22131:7;22127:88;;22170:1;22154:13;:17;;;22186:15;:17;22127:88;-1:-1:-1;;;;;22239:19:0;;;;;;:11;:19;;;;;;;;:46;;;;-1:-1:-1;;;;;;22263:22:0;;;;;;:11;:22;;;;;;;;22262:23;22239:46;22235:467;;;22302:48;22324:6;22332:9;22343:6;22302:21;:48::i;:::-;22235:467;;;-1:-1:-1;;;;;22373:19:0;;;;;;:11;:19;;;;;;;;22372:20;:46;;;;-1:-1:-1;;;;;;22396:22:0;;;;;;:11;:22;;;;;;;;22372:46;22368:334;;;22435:46;22455:6;22463:9;22474:6;22435:19;:46::i;22368:334::-;-1:-1:-1;;;;;22503:19:0;;;;;;:11;:19;;;;;;;;:45;;;;-1:-1:-1;;;;;;22526:22:0;;;;;;:11;:22;;;;;;;;22503:45;22499:203;;;22565:48;22587:6;22595:9;22606:6;22565:21;:48::i;22499:203::-;22646:44;22664:6;22672:9;22683:6;22646:17;:44::i;:::-;22726:7;22722:125;;22749:13;:38;;;;22802:15;:33;-1:-1:-1;;;;21911:943:0:o;29522:561::-;29619:7;;29655;;29572;;;;;29679:289;29703:9;:16;29699:20;;29679:289;;;29769:7;29745;:21;29753:9;29763:1;29753:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;29753:12:0;29745:21;;;;;;;;;;;;;:31;;:66;;;29804:7;29780;:21;29788:9;29798:1;29788:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;29788:12:0;29780:21;;;;;;;;;;;;;:31;29745:66;29741:97;;;29821:7;;29830;;29813:25;;;;;;;29522:561;;:::o;29741:97::-;29863:34;29875:7;:21;29883:9;29893:1;29883:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;29883:12:0;29875:21;;;;;;;;;;;;;29863:7;;:11;:34::i;:::-;29853:44;;29922:34;29934:7;:21;29942:9;29952:1;29942:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;29942:12:0;29934:21;;;;;;;;;;;;;29922:7;;:11;:34::i;:::-;29912:44;-1:-1:-1;29721:3:0;;;;:::i;:::-;;;;29679:289;;;-1:-1:-1;30004:7:0;;29992;;:20;;:11;:20::i;:::-;29982:7;:30;29978:61;;;30022:7;;30031;;30014:25;;;;;;29522:561;;:::o;29978:61::-;30058:7;;30067;;-1:-1:-1;29522:561:0;-1:-1:-1;29522:561:0:o;2387:278::-;2473:7;2508:12;2501:5;2493:28;;;;-1:-1:-1;;;2493:28:0;;;;;;;;:::i;:::-;-1:-1:-1;2532:9:0;2544:5;2548:1;2544;:5;:::i;29013:330::-;29073:7;29082;29091;29111:12;29126:24;29142:7;29126:15;:24::i;:::-;29111:39;;29161:18;29182:30;29204:7;29182:21;:30::i;:::-;29161:51;-1:-1:-1;29223:23:0;29249:33;29161:51;29249:17;:7;29261:4;29249:11;:17::i;:::-;:21;;:33::i;:::-;29223:59;29318:4;;-1:-1:-1;29324:10:0;;-1:-1:-1;29013:330:0;;-1:-1:-1;;;29013:330:0:o;25345:429::-;25460:7;;;;25516:24;:7;25528:11;25516;:24::i;:::-;25498:42;-1:-1:-1;25551:12:0;25566:21;:4;25575:11;25566:8;:21::i;:::-;25551:36;-1:-1:-1;25598:18:0;25619:27;:10;25634:11;25619:14;:27::i;:::-;25598:48;-1:-1:-1;25657:23:0;25683:33;25598:48;25683:17;:7;25695:4;25683:11;:17::i;:33::-;25735:7;;;;-1:-1:-1;25761:4:0;;-1:-1:-1;25345:429:0;;-1:-1:-1;;;;;;;25345:429:0:o;27333:666::-;27483:16;;;27497:1;27483:16;;;;;;;;27459:21;;27483:16;;;;;;;;;;-1:-1:-1;27483:16:0;27459:40;;27528:4;27510;27515:1;27510:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;27510:23:0;;;:7;;;;;;;;;;:23;;;;27554:15;;:22;;;-1:-1:-1;;;27554:22:0;;;;:15;;;;;:20;;:22;;;;;27510:7;;27554:22;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27544:4;27549:1;27544:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;27544:32:0;;;:7;;;;;;;;;:32;27621:15;;27589:62;;27606:4;;27621:15;27639:11;27589:8;:62::i;:::-;27690:15;;:240;;-1:-1:-1;;;27690:240:0;;-1:-1:-1;;;;;27690:15:0;;;;:66;;:240;;27771:11;;27690:15;;27841:4;;27868;;27904:15;;27690:240;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27956:35;27973:11;27986:4;27956:35;;;;;;;:::i;:::-;;;;;;;;27388:611;27333:666;:::o;27211:111::-;27291:23;;-1:-1:-1;;;;;27291:15:0;;;:23;;;;;27307:6;;27291:23;;;;27307:6;27291:15;:23;;;;;;;;;;;;;;;;;;;28007:513;28187:15;;28155:62;;28172:4;;-1:-1:-1;;;;;28187:15:0;28205:11;28155:8;:62::i;:::-;28260:15;;-1:-1:-1;;;;;28260:15:0;:31;28299:9;28332:4;28352:11;28260:15;;28464:7;6126;6153:6;-1:-1:-1;;;;;6153:6:0;;6088:79;28464:7;28260:252;;;;;;-1:-1:-1;;;;;;28260:252:0;;;-1:-1:-1;;;;;22144:15:1;;;28260:252:0;;;22126:34:1;22176:18;;;22169:34;;;;22219:18;;;22212:34;;;;22262:18;;;22255:34;22326:15;;;22305:19;;;22298:44;28486:15:0;22358:19:1;;;22351:35;22060:19;;28260:252:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;23966:566::-;24069:15;24086:23;24111:12;24125:23;24150:12;24164:18;24186:19;24197:7;24186:10;:19::i;:::-;-1:-1:-1;;;;;24234:15:0;;;;;;:7;:15;;;;;;24068:137;;-1:-1:-1;24068:137:0;;-1:-1:-1;24068:137:0;;-1:-1:-1;24068:137:0;-1:-1:-1;24068:137:0;-1:-1:-1;24068:137:0;-1:-1:-1;24234:28:0;;24254:7;24234:19;:28::i;:::-;-1:-1:-1;;;;;24216:15:0;;;;;;:7;:15;;;;;;;;:46;;;;24291:7;:15;;;;:28;;24311:7;24291:19;:28::i;:::-;-1:-1:-1;;;;;24273:15:0;;;;;;;:7;:15;;;;;;:46;;;;24351:18;;;;;;;:39;;24374:15;24351:22;:39::i;:::-;-1:-1:-1;;;;;24330:18:0;;;;;;:7;:18;;;;;:60;24404:26;24419:10;24404:14;:26::i;:::-;24441:23;24453:4;24459;24441:11;:23::i;:::-;24497:9;-1:-1:-1;;;;;24480:44:0;24489:6;-1:-1:-1;;;;;24480:44:0;;24508:15;24480:44;;;;160:25:1;;148:2;133:18;;14:177;24480:44:0;;;;;;;;24057:475;;;;;;23966:566;;;:::o;23372:586::-;23473:15;23490:23;23515:12;23529:23;23554:12;23568:18;23590:19;23601:7;23590:10;:19::i;:::-;-1:-1:-1;;;;;23638:15:0;;;;;;:7;:15;;;;;;23472:137;;-1:-1:-1;23472:137:0;;-1:-1:-1;23472:137:0;;-1:-1:-1;23472:137:0;-1:-1:-1;23472:137:0;-1:-1:-1;23472:137:0;-1:-1:-1;23638:28:0;;23472:137;23638:19;:28::i;:::-;-1:-1:-1;;;;;23620:15:0;;;;;;;:7;:15;;;;;;;;:46;;;;23698:18;;;;;:7;:18;;;;;:39;;23721:15;23698:22;:39::i;:::-;-1:-1:-1;;;;;23677:18:0;;;;;;:7;:18;;;;;;;;:60;;;;23769:7;:18;;;;:39;;23792:15;23769:22;:39::i;24540:642::-;24643:15;24660:23;24685:12;24699:23;24724:12;24738:18;24760:19;24771:7;24760:10;:19::i;:::-;-1:-1:-1;;;;;24808:15:0;;;;;;:7;:15;;;;;;24642:137;;-1:-1:-1;24642:137:0;;-1:-1:-1;24642:137:0;;-1:-1:-1;24642:137:0;-1:-1:-1;24642:137:0;-1:-1:-1;24642:137:0;-1:-1:-1;24808:28:0;;24828:7;24808:19;:28::i;:::-;-1:-1:-1;;;;;24790:15:0;;;;;;:7;:15;;;;;;;;:46;;;;24865:7;:15;;;;:28;;24885:7;24865:19;:28::i;22862:502::-;22961:15;22978:23;23003:12;23017:23;23042:12;23056:18;23078:19;23089:7;23078:10;:19::i;:::-;-1:-1:-1;;;;;23126:15:0;;;;;;:7;:15;;;;;;22960:137;;-1:-1:-1;22960:137:0;;-1:-1:-1;22960:137:0;;-1:-1:-1;22960:137:0;-1:-1:-1;22960:137:0;-1:-1:-1;22960:137:0;-1:-1:-1;23126:28:0;;22960:137;23126:19;:28::i;30095:160::-;30159:7;30186:61;30231:5;30186:26;30198:13;;30186:7;:11;;:26;;;;:::i;30267:168::-;30337:7;30364:63;30411:5;30364:28;30376:15;;30364:7;:11;;:28;;;;:::i;25786:355::-;25849:19;25872:10;:8;:10::i;:::-;25849:33;-1:-1:-1;25893:18:0;25914:27;:10;25849:33;25914:14;:27::i;:::-;25993:4;25977:22;;;;:7;:22;;;;;;25893:48;;-1:-1:-1;25977:38:0;;25893:48;25977:26;:38::i;:::-;25968:4;25952:22;;;;:7;:22;;;;;;;;:63;;;;26029:11;:26;;;;;;26026:107;;;26111:4;26095:22;;;;:7;:22;;;;;;:38;;26122:10;26095:26;:38::i;:::-;26086:4;26070:22;;;;:7;:22;;;;;:63;25838:303;;25786:355;:::o;25190:147::-;25268:7;;:17;;25280:4;25268:11;:17::i;:::-;25258:7;:27;25309:10;;:20;;25324:4;25309:14;:20::i;:::-;25296:10;:33;-1:-1:-1;;25190:147:0:o;196:548:1:-;308:4;337:2;366;355:9;348:21;398:6;392:13;441:6;436:2;425:9;421:18;414:34;466:1;476:140;490:6;487:1;484:13;476:140;;;585:14;;;581:23;;575:30;551:17;;;570:2;547:26;540:66;505:10;;476:140;;;480:3;665:1;660:2;651:6;640:9;636:22;632:31;625:42;735:2;728;724:7;719:2;711:6;707:15;703:29;692:9;688:45;684:54;676:62;;;;196:548;;;;:::o;749:131::-;-1:-1:-1;;;;;824:31:1;;814:42;;804:70;;870:1;867;860:12;804:70;749:131;:::o;885:315::-;953:6;961;1014:2;1002:9;993:7;989:23;985:32;982:52;;;1030:1;1027;1020:12;982:52;1069:9;1056:23;1088:31;1113:5;1088:31;:::i;:::-;1138:5;1190:2;1175:18;;;;1162:32;;-1:-1:-1;;;885:315:1:o;1397:247::-;1456:6;1509:2;1497:9;1488:7;1484:23;1480:32;1477:52;;;1525:1;1522;1515:12;1477:52;1564:9;1551:23;1583:31;1608:5;1583:31;:::i;1884:367::-;1947:8;1957:6;2011:3;2004:4;1996:6;1992:17;1988:27;1978:55;;2029:1;2026;2019:12;1978:55;-1:-1:-1;2052:20:1;;2095:18;2084:30;;2081:50;;;2127:1;2124;2117:12;2081:50;2164:4;2156:6;2152:17;2140:29;;2224:3;2217:4;2207:6;2204:1;2200:14;2192:6;2188:27;2184:38;2181:47;2178:67;;;2241:1;2238;2231:12;2178:67;1884:367;;;;;:::o;2256:773::-;2378:6;2386;2394;2402;2455:2;2443:9;2434:7;2430:23;2426:32;2423:52;;;2471:1;2468;2461:12;2423:52;2511:9;2498:23;2540:18;2581:2;2573:6;2570:14;2567:34;;;2597:1;2594;2587:12;2567:34;2636:70;2698:7;2689:6;2678:9;2674:22;2636:70;:::i;:::-;2725:8;;-1:-1:-1;2610:96:1;-1:-1:-1;2813:2:1;2798:18;;2785:32;;-1:-1:-1;2829:16:1;;;2826:36;;;2858:1;2855;2848:12;2826:36;;2897:72;2961:7;2950:8;2939:9;2935:24;2897:72;:::i;:::-;2256:773;;;;-1:-1:-1;2988:8:1;-1:-1:-1;;;;2256:773:1:o;3034:456::-;3111:6;3119;3127;3180:2;3168:9;3159:7;3155:23;3151:32;3148:52;;;3196:1;3193;3186:12;3148:52;3235:9;3222:23;3254:31;3279:5;3254:31;:::i;:::-;3304:5;-1:-1:-1;3361:2:1;3346:18;;3333:32;3374:33;3333:32;3374:33;:::i;:::-;3034:456;;3426:7;;-1:-1:-1;;;3480:2:1;3465:18;;;;3452:32;;3034:456::o;3495:401::-;3576:6;3584;3637:2;3625:9;3616:7;3612:23;3608:32;3605:52;;;3653:1;3650;3643:12;3605:52;3692:9;3679:23;3711:31;3736:5;3711:31;:::i;:::-;3761:5;-1:-1:-1;3818:2:1;3803:18;;3790:32;3831:33;3790:32;3831:33;:::i;:::-;3883:7;3873:17;;;3495:401;;;;;:::o;3901:118::-;3987:5;3980:13;3973:21;3966:5;3963:32;3953:60;;4009:1;4006;3999:12;4024:309;4089:6;4097;4150:2;4138:9;4129:7;4125:23;4121:32;4118:52;;;4166:1;4163;4156:12;4118:52;4205:9;4192:23;4224:28;4246:5;4224:28;:::i;4338:180::-;4397:6;4450:2;4438:9;4429:7;4425:23;4421:32;4418:52;;;4466:1;4463;4456:12;4418:52;-1:-1:-1;4489:23:1;;4338:180;-1:-1:-1;4338:180:1:o;4712:309::-;4777:6;4785;4838:2;4826:9;4817:7;4813:23;4809:32;4806:52;;;4854:1;4851;4844:12;4806:52;4890:9;4877:23;4867:33;;4950:2;4939:9;4935:18;4922:32;4963:28;4985:5;4963:28;:::i;5234:316::-;5311:6;5319;5327;5380:2;5368:9;5359:7;5355:23;5351:32;5348:52;;;5396:1;5393;5386:12;5348:52;-1:-1:-1;;5419:23:1;;;5489:2;5474:18;;5461:32;;-1:-1:-1;5540:2:1;5525:18;;;5512:32;;5234:316;-1:-1:-1;5234:316:1:o;5555:566::-;5647:6;5655;5663;5716:2;5704:9;5695:7;5691:23;5687:32;5684:52;;;5732:1;5729;5722:12;5684:52;5772:9;5759:23;5805:18;5797:6;5794:30;5791:50;;;5837:1;5834;5827:12;5791:50;5876:70;5938:7;5929:6;5918:9;5914:22;5876:70;:::i;:::-;5965:8;;-1:-1:-1;5850:96:1;-1:-1:-1;;6050:2:1;6035:18;;6022:32;6063:28;6022:32;6063:28;:::i;:::-;6110:5;6100:15;;;5555:566;;;;;:::o;6126:505::-;6221:6;6229;6237;6290:2;6278:9;6269:7;6265:23;6261:32;6258:52;;;6306:1;6303;6296:12;6258:52;6346:9;6333:23;6379:18;6371:6;6368:30;6365:50;;;6411:1;6408;6401:12;6365:50;6450:70;6512:7;6503:6;6492:9;6488:22;6450:70;:::i;:::-;6539:8;;6424:96;;-1:-1:-1;6621:2:1;6606:18;;;;6593:32;;6126:505;-1:-1:-1;;;;6126:505:1:o;6636:437::-;6722:6;6730;6783:2;6771:9;6762:7;6758:23;6754:32;6751:52;;;6799:1;6796;6789:12;6751:52;6839:9;6826:23;6872:18;6864:6;6861:30;6858:50;;;6904:1;6901;6894:12;6858:50;6943:70;7005:7;6996:6;6985:9;6981:22;6943:70;:::i;:::-;7032:8;;6917:96;;-1:-1:-1;6636:437:1;-1:-1:-1;;;;6636:437:1:o;7338:241::-;7394:6;7447:2;7435:9;7426:7;7422:23;7418:32;7415:52;;;7463:1;7460;7453:12;7415:52;7502:9;7489:23;7521:28;7543:5;7521:28;:::i;7584:248::-;7652:6;7660;7713:2;7701:9;7692:7;7688:23;7684:32;7681:52;;;7729:1;7726;7719:12;7681:52;-1:-1:-1;;7752:23:1;;;7822:2;7807:18;;;7794:32;;-1:-1:-1;7584:248:1:o;8230:380::-;8309:1;8305:12;;;;8352;;;8373:61;;8427:4;8419:6;8415:17;8405:27;;8373:61;8480:2;8472:6;8469:14;8449:18;8446:38;8443:161;;8526:10;8521:3;8517:20;8514:1;8507:31;8561:4;8558:1;8551:15;8589:4;8586:1;8579:15;8443:161;;8230:380;;;:::o;8615:356::-;8817:2;8799:21;;;8836:18;;;8829:30;8895:34;8890:2;8875:18;;8868:62;8962:2;8947:18;;8615:356::o;9799:127::-;9860:10;9855:3;9851:20;9848:1;9841:31;9891:4;9888:1;9881:15;9915:4;9912:1;9905:15;9931:422;10020:1;10063:5;10020:1;10077:270;10098:7;10088:8;10085:21;10077:270;;;10157:4;10153:1;10149:6;10145:17;10139:4;10136:27;10133:53;;;10166:18;;:::i;:::-;10216:7;10206:8;10202:22;10199:55;;;10236:16;;;;10199:55;10315:22;;;;10275:15;;;;10077:270;;;10081:3;9931:422;;;;;:::o;10358:806::-;10407:5;10437:8;10427:80;;-1:-1:-1;10478:1:1;10492:5;;10427:80;10526:4;10516:76;;-1:-1:-1;10563:1:1;10577:5;;10516:76;10608:4;10626:1;10621:59;;;;10694:1;10689:130;;;;10601:218;;10621:59;10651:1;10642:10;;10665:5;;;10689:130;10726:3;10716:8;10713:17;10710:43;;;10733:18;;:::i;:::-;-1:-1:-1;;10789:1:1;10775:16;;10804:5;;10601:218;;10903:2;10893:8;10890:16;10884:3;10878:4;10875:13;10871:36;10865:2;10855:8;10852:16;10847:2;10841:4;10838:12;10834:35;10831:77;10828:159;;;-1:-1:-1;10940:19:1;;;10972:5;;10828:159;11019:34;11044:8;11038:4;11019:34;:::i;:::-;11089:6;11085:1;11081:6;11077:19;11068:7;11065:32;11062:58;;;11100:18;;:::i;:::-;11138:20;;10358:806;-1:-1:-1;;;10358:806:1:o;11169:140::-;11227:5;11256:47;11297:4;11287:8;11283:19;11277:4;11256:47;:::i;11314:127::-;11375:10;11370:3;11366:20;11363:1;11356:31;11406:4;11403:1;11396:15;11430:4;11427:1;11420:15;11446:168;11519:9;;;11550;;11567:15;;;11561:22;;11547:37;11537:71;;11588:18;;:::i;11619:125::-;11684:9;;;11705:10;;;11702:36;;;11718:18;;:::i;11749:135::-;11788:3;11809:17;;;11806:43;;11829:18;;:::i;:::-;-1:-1:-1;11876:1:1;11865:13;;11749:135::o;12245:184::-;12315:6;12368:2;12356:9;12347:7;12343:23;12339:32;12336:52;;;12384:1;12381;12374:12;12336:52;-1:-1:-1;12407:16:1;;12245:184;-1:-1:-1;12245:184:1:o;12713:245::-;12780:6;12833:2;12821:9;12812:7;12808:23;12804:32;12801:52;;;12849:1;12846;12839:12;12801:52;12881:9;12875:16;12900:28;12922:5;12900:28;:::i;13730:128::-;13797:9;;;13818:11;;;13815:37;;;13832:18;;:::i;13863:127::-;13924:10;13919:3;13915:20;13912:1;13905:31;13955:4;13952:1;13945:15;13979:4;13976:1;13969:15;15183:217;15223:1;15249;15239:132;;15293:10;15288:3;15284:20;15281:1;15274:31;15328:4;15325:1;15318:15;15356:4;15353:1;15346:15;15239:132;-1:-1:-1;15385:9:1;;15183:217::o;15405:251::-;15475:6;15528:2;15516:9;15507:7;15503:23;15499:32;15496:52;;;15544:1;15541;15534:12;15496:52;15576:9;15570:16;15595:31;15620:5;15595:31;:::i;20395:461::-;20448:3;20486:5;20480:12;20513:6;20508:3;20501:19;20539:4;20568:2;20563:3;20559:12;20552:19;;20605:2;20598:5;20594:14;20626:1;20636:195;20650:6;20647:1;20644:13;20636:195;;;20715:13;;-1:-1:-1;;;;;20711:39:1;20699:52;;20771:12;;;;20806:15;;;;20747:1;20665:9;20636:195;;;-1:-1:-1;20847:3:1;;20395:461;-1:-1:-1;;;;;20395:461:1:o;20861:582::-;21160:6;21149:9;21142:25;21203:6;21198:2;21187:9;21183:18;21176:34;21246:3;21241:2;21230:9;21226:18;21219:31;21123:4;21267:57;21319:3;21308:9;21304:19;21296:6;21267:57;:::i;:::-;-1:-1:-1;;;;;21360:32:1;;;;21355:2;21340:18;;21333:60;-1:-1:-1;21424:3:1;21409:19;21402:35;21259:65;20861:582;-1:-1:-1;;;20861:582:1:o;21448:332::-;21655:6;21644:9;21637:25;21698:2;21693;21682:9;21678:18;21671:30;21618:4;21718:56;21770:2;21759:9;21755:18;21747:6;21718:56;:::i;:::-;21710:64;21448:332;-1:-1:-1;;;;21448:332:1:o;22397:306::-;22485:6;22493;22501;22554:2;22542:9;22533:7;22529:23;22525:32;22522:52;;;22570:1;22567;22560:12;22522:52;22599:9;22593:16;22583:26;;22649:2;22638:9;22634:18;22628:25;22618:35;;22693:2;22682:9;22678:18;22672:25;22662:35;;22397:306;;;;;:::o

Swarm Source

ipfs://28f9b0f316909acedefc6fd3e5cbf190833b99550cdde2578ce5c0d5e82fd1fd
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.