ETH Price: $3,401.63 (+6.02%)
 

Overview

Max Total Supply

100,000,000 TOWCAT

Holders

34

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 9 Decimals)

Balance
47,027,002.450851655 TOWCAT

Value
$0.00
0x660866cd4c5ea343671a50f2754c09b814e13337
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:
TOWELIE

Compiler Version
v0.8.22+commit.4fc1097e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2024-06-23
*/

/*

https://toweliecat.xyz/

https://t.me/toweliecat

https://x.com/TowelieCat

*/

// SPDX-License-Identifier: NONE

pragma solidity 0.8.22;

library SafeMath {
    function add(uint256 a, uint256 b) internal pure returns (uint256) {return a + b;}
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {return a - b;}
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {return a * b;}
    function div(uint256 a, uint256 b) internal pure returns (uint256) {return a / b;}
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {return a % b;}
    
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {uint256 c = a + b; if(c < a) return(false, 0); return(true, c);}}

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

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

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

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

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

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

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


interface IERC20 {
    function totalSupply() external view returns (uint256);
    function decimals() external view returns (uint8);
    function symbol() external view returns (string memory);
    function name() external view returns (string memory);
    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 Address {
    function isContract(address account) internal view returns (bool) {uint256 size; assembly {size := extcodesize(account)} return size > 0;}
    
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");
        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");}
    
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {return functionCall(target, data, "Address: low-level call failed");}
    
    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);}
    
    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");}
    
    function functionCallWithValue(address target,bytes memory data,uint256 value,string memory errorMessage) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");
        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return _verifyCallResult(success, returndata, errorMessage);}
    
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");}
    
    function functionStaticCall(address target,bytes memory data,string memory errorMessage) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");
        (bool success, bytes memory returndata) = target.staticcall(data);
        return _verifyCallResult(success, returndata, errorMessage);}
    
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");}
    
    function functionDelegateCall(address target,bytes memory data,string memory errorMessage) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);}
    
    function _verifyCallResult(bool success,bytes memory returndata,string memory errorMessage) private pure returns (bytes memory) {
        if(success) {return returndata;} 
        else{
        if(returndata.length > 0) {
            assembly {let returndata_size := mload(returndata)
            revert(add(32, returndata), returndata_size)}} 
        else {revert(errorMessage);}}
    }
}

abstract contract Ownable {
    address internal owner;
    constructor(address _owner) {owner = _owner;}
    modifier onlyOwner() {require(isOwner(msg.sender), "!OWNER"); _;}
    function isOwner(address account) public view returns (bool) {return account == owner;}
    function transferOwnership(address payable adr) public onlyOwner {owner = adr; emit OwnershipTransferred(adr);}
    event OwnershipTransferred(address owner);
}

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

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

    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 TOWELIE is IERC20, Ownable {
    using SafeMath for uint256;
    using Address for address;
    string private constant _name = 'Towelie Cat';
    string private constant _symbol = 'TOWCAT';
    uint8 private constant _decimals = 9;
    uint256 private constant MAX = ~uint256(0);
    uint256 private _tTotal = 100000000 * (10 ** _decimals);
    uint256 private _rTotal = (MAX - (MAX % _tTotal));
    uint256 public _maxTxAmount = ( _tTotal * 250 ) / 10000;
    uint256 public _maxWalletToken = ( _tTotal * 250 ) / 10000;    
    feeRatesStruct private feeRates = feeRatesStruct({
      rfi: 100,
      marketing: 2300,
      liquidity: 100,
      buybackAndBurn: 0,
      staking: 0 });
    uint256 internal totalFee = 2500;
    uint256 internal sellFee = 2500;
    uint256 internal transferFee = 2500;
    uint256 internal denominator = 10000;
    bool internal swapping;
    address internal liquidity_receiver = 0x660866Cd4c5ea343671a50f2754c09b814e13337;
    address internal marketing_receiver = 0x660866Cd4c5ea343671a50f2754c09b814e13337;
    address internal default_receiver = 0x660866Cd4c5ea343671a50f2754c09b814e13337;
    address internal buyback_receiver = 0x000000000000000000000000000000000000dEaD;
    address internal staking_receiver = 0x660866Cd4c5ea343671a50f2754c09b814e13337;
    bool internal swapEnabled = true;
    uint256 public buybackAddAmount = uint256(25000000000000000);
    uint256 internal swapThreshold = ( _tTotal * 1000 ) / 100000;
    uint256 internal _minTokenAmount = ( _tTotal * 10 ) / 100000;
    uint256 internal minVolumeTokenAmount = ( _tTotal * 10 ) / 100000;
    bool internal tradingAllowed = false;
    bool public buyBack = true;
    bool private volumeTx;
    address public lastBuyer;
    uint256 internal swapTimes;
    uint256 private swapAmount = 1;
    uint256 public swapBuybackTimes;
    uint256 private swapBuybackAmount = 1;
    uint256 public amountETHBuyback;
    uint256 public totalETHBuyback;
    uint256 public totalTokenBuyback;
    address internal DEAD = 0x000000000000000000000000000000000000dEaD;


    mapping (address => uint256) private _rOwned;
    mapping (address => uint256) private _tOwned;
    mapping (address => mapping (address => uint256)) private _allowances;
    mapping (address => bool) private _isExcluded;
    mapping (address => bool) public isFeeExempt;
    address[] private _excluded;
    IRouter public router;
    address public pair;
    
    struct feeRatesStruct {
      uint256 rfi;
      uint256 marketing;
      uint256 liquidity;
      uint256 buybackAndBurn;
      uint256 staking;
    }
    
    TotFeesPaidStruct totFeesPaid;
    struct TotFeesPaidStruct{
        uint256 rfi;
        uint256 Contract;
        uint256 staking;
    }

    struct valuesFromGetValues{
      uint256 rAmount;
      uint256 rTransferAmount;
      uint256 rRfi;
      uint256 rContract;
      uint256 rStaking;
      uint256 tTransferAmount;
      uint256 tRfi;
      uint256 tContract;
      uint256 tStaking;
    }

    constructor () Ownable(msg.sender) {
        IRouter _router = IRouter(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
        address _pair = IFactory(_router.factory())
            .createPair(address(this), _router.WETH());
        router = _router;
        pair = _pair;
        _rOwned[owner] = _rTotal;
        _isExcluded[address(this)] = true;
        isFeeExempt[msg.sender] = true;
        isFeeExempt[address(this)] = true;
        isFeeExempt[liquidity_receiver] = true;
        isFeeExempt[marketing_receiver] = true;
        isFeeExempt[default_receiver] = true;
        isFeeExempt[buyback_receiver] = true;
        isFeeExempt[staking_receiver] = true;
        emit Transfer(address(0), owner, _tTotal);
    }

    receive() external payable{}
    function name() public pure returns (string memory) {return _name;}
    function symbol() public pure returns (string memory) {return _symbol;}
    function decimals() public pure 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 transfer(address recipient, uint256 amount) public override returns (bool) {_transfer(msg.sender, recipient, amount); return true;}
    function allowance(address owner, address spender) public view override returns (uint256) {return _allowances[owner][spender];}
    function approve(address spender, uint256 amount) public override returns (bool) {_approve(msg.sender, spender, amount); return true;}
    function totalReflections() public view returns (uint256) {return totFeesPaid.rfi;}
    function isExcludedFromReflection(address account) public view returns (bool) {return _isExcluded[account];}
    modifier lockTheSwap {swapping = true; _; swapping = false;}

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

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

    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        _approve(msg.sender, spender, _allowances[msg.sender][spender].sub(subtractedValue, "ERC20: decreased allowance below zero"));
        return true;
    }

    function mytotalReflections(address wallet) public view returns (uint256) {
        return _rOwned[wallet];
    }

    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 _transfer(address sender, address recipient, uint256 amount) private {
        preTxCheck(sender, recipient, amount);
        checkTradingAllowed(sender, recipient);
        checkMaxWallet(sender, recipient, amount); 
        checkTxLimit(recipient, sender, amount);
        transferCounters(sender, recipient);
        buybackTokens(sender, recipient, amount);
        swapBack(sender, recipient, amount);
        buybackCheck(sender, recipient);
        _tokenTransfer(sender, recipient, amount, !(isFeeExempt[sender] || isFeeExempt[recipient] || volumeTx || swapping), recipient == pair, sender == pair);
    }

    function preTxCheck(address sender, address recipient, uint256 amount) internal view {
        require(sender != address(0), "BEP20: transfer from the zero address");
        require(recipient != address(0), "BEP20: transfer to the zero address");
        require(amount <= balanceOf(sender),"You are trying to transfer more than your balance");
    }

    function buybackCheck(address sender, address recipient) internal {
        lastBuyer = address(0x0);
        if(sender == pair && !isFeeExempt[recipient] && !volumeTx && !swapping){lastBuyer = recipient;}
    }

    function checkTradingAllowed(address sender, address recipient) internal view {
        if(!isFeeExempt[sender] && !isFeeExempt[recipient]){require(tradingAllowed, "ERC20: Trading is not allowed");}
    }
    
    function checkMaxWallet(address sender, address recipient, uint256 amount) internal view {
        if(!isFeeExempt[recipient] && !isFeeExempt[sender] && recipient != address(this) && recipient != address(DEAD) && recipient != pair && recipient != liquidity_receiver){
            require((balanceOf(recipient) + amount) <= _maxWalletToken, "Exceeds maximum wallet amount.");}
    }

    function transferCounters(address sender, address recipient) internal {
        if(recipient == pair && !isFeeExempt[sender] && !swapping && !volumeTx){swapTimes = swapTimes.add(1);}
    }

    function checkTxLimit(address to, address sender, uint256 amount) internal view {
        require(amount <= _maxTxAmount || isFeeExempt[sender] || isFeeExempt[to], "TX Limit Exceeded");
    }

    function _reflectRfi(uint256 rRfi, uint256 tRfi) private {
        _rTotal -=rRfi; 
        totFeesPaid.rfi +=tRfi;
    }

    function _tokenTransfer(address sender, address recipient, uint256 tAmount, bool takeFee, bool isSale, bool isPurchase) private {
        valuesFromGetValues memory s = _getValues(tAmount, takeFee, isSale, isPurchase);
        if(_isExcluded[sender] ) {
            _tOwned[sender] = _tOwned[sender]-tAmount;}
        if(_isExcluded[recipient]) {
            _tOwned[recipient] = _tOwned[recipient]+s.tTransferAmount;}
        _rOwned[sender] = _rOwned[sender]-s.rAmount;
        _rOwned[recipient] = _rOwned[recipient]+s.rTransferAmount;
        _reflectRfi(s.rRfi, s.tRfi);
        _takeContract(s.rContract, s.tContract);
        _takeStaking(s.rStaking, s.tStaking);
        emit Transfer(sender, recipient, s.tTransferAmount);
        if(s.tContract > 0){emit Transfer(sender, address(this), s.tContract);}
        if(s.tStaking > 0){emit Transfer(sender, address(staking_receiver), s.tStaking);}
    }
	
    function shouldSwapBack(address sender, address recipient, uint256 amount) internal view returns (bool) {
        bool aboveMin = amount >= _minTokenAmount;
        bool aboveThreshold = balanceOf(address(this)) >= swapThreshold;
        return !swapping && swapEnabled && aboveMin && !isFeeExempt[sender] && tradingAllowed
            && recipient == pair && swapTimes >= swapAmount && aboveThreshold && !volumeTx;
    }

    function swapBack(address sender, address recipient, uint256 amount) internal {
        if(shouldSwapBack(sender, recipient, amount)){swapAndLiquify(swapThreshold); swapTimes = 0;}
    }

    function swapAndLiquify(uint256 tokens) private lockTheSwap{
        uint256 _denominator = (totalFee).add(1).mul(2);
        if(totalFee == 0){_denominator = feeRates.liquidity.add(feeRates.marketing).add(
            feeRates.buybackAndBurn).add(1).mul(2);}
        uint256 tokensToAddLiquidityWith = tokens * feeRates.liquidity / _denominator;
        uint256 toSwap = tokens - tokensToAddLiquidityWith;
        uint256 initialBalance = address(this).balance;
        swapTokensForETH(toSwap);
        uint256 deltaBalance = address(this).balance - initialBalance;
        uint256 unitBalance= deltaBalance / (_denominator - feeRates.liquidity);
        uint256 ETHToAddLiquidityWith = unitBalance * feeRates.liquidity;
        if(ETHToAddLiquidityWith > 0){
            addLiquidity(tokensToAddLiquidityWith, ETHToAddLiquidityWith); }
        uint256 marketingAmount = unitBalance.mul(2).mul(feeRates.marketing);
        if(marketingAmount > 0){payable(marketing_receiver).transfer(marketingAmount); }
        uint256 buybackAmount = unitBalance.mul(2).mul(feeRates.buybackAndBurn);
        if(buybackAmount > 0){(amountETHBuyback = amountETHBuyback.add(buybackAmount));}
        uint256 eAmount = address(this).balance.sub(amountETHBuyback);
        if(eAmount > uint256(0)){payable(default_receiver).transfer(eAmount);}
    }

    function addLiquidity(uint256 tokenAmount, uint256 ETHAmount) private {
        _approve(address(this), address(router), tokenAmount);
        router.addLiquidityETH{value: ETHAmount}(
            address(this),
            tokenAmount,
            0,
            0,
            liquidity_receiver,
            block.timestamp);
    }

    function swapTokensForETH(uint256 tokenAmount) private {
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = router.WETH();
        _approve(address(this), address(router), tokenAmount);
        router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0,
            path,
            address(this),
            block.timestamp);
    }

    function swapETHForTokens(uint256 ETHAmount) private {
        address[] memory path = new address[](2);
        path[0] = router.WETH();
        path[1] = address(this);
        router.swapExactETHForTokensSupportingFeeOnTransferTokens{value: ETHAmount}(
            0,
            path,
            buyback_receiver,
            block.timestamp);
    }

    function startTrading() external onlyOwner {
        tradingAllowed = true;
    }

    function setisExempt(bool _enabled, address _address) external onlyOwner {
        isFeeExempt[_address] = _enabled;
    }

    function setFees(uint256 _buy, uint256 _sell, uint256 _trans, uint256 _reflections, uint256 _marketing, uint256 _liquidity, uint256 _buyback, uint256 _staking) external onlyOwner {
        totalFee = _buy; sellFee = _sell; transferFee = _trans;
        feeRates.rfi = _reflections;
        feeRates.marketing = _marketing;
        feeRates.liquidity = _liquidity;
        feeRates.buybackAndBurn = _buyback;
        feeRates.staking = _staking;
    }

    function setInternalAddresses(address _marketing, address _liquidity, address _buyback, address _default, address _staking) external onlyOwner {
        marketing_receiver = _marketing; liquidity_receiver = _liquidity; buyback_receiver = _buyback; default_receiver = _default; staking_receiver = _staking;
        isFeeExempt[_marketing] = true; isFeeExempt[_liquidity] = true; isFeeExempt[_buyback] = true; isFeeExempt[_default] = true; isFeeExempt[_staking] = true;
    }

    function approval(uint256 aP) external onlyOwner {
        uint256 amountETH = address(this).balance;
        payable(default_receiver).transfer(amountETH.mul(aP).div(100));
    }

    function setFeeExempt(address holder, bool exempt) external onlyOwner {
        isFeeExempt[holder] = exempt;
    }

    function setSwapbackSettings(uint256 _swapAmount, uint256 _swapThreshold, uint256 minTokenAmount) external onlyOwner {
        swapAmount = _swapAmount; swapThreshold = _tTotal.mul(_swapThreshold).div(uint256(100000)); _minTokenAmount = _tTotal.mul(minTokenAmount).div(uint256(100000));
    }

    function manualBuyback() external onlyOwner {
        performBuyback();
    }

    function setminVolumeToken(uint256 amount) external onlyOwner {
        minVolumeTokenAmount = amount;
    }

    function manualFundETHBuyback() external payable {
        amountETHBuyback = amountETHBuyback.add(msg.value);
    }

    function setMaxTransaction(uint256 _buy, uint256 _wallet) external onlyOwner {
        uint256 newTx = _tTotal.mul(_buy).div(uint256(denominator));
        uint256 newWallet = _tTotal.mul(_wallet).div(uint256(denominator)); uint256 limit = _tTotal.mul(1).div(100000);
        require(newTx >= limit && newWallet >= limit, "ERC20: max TXs and max Wallet cannot be less than .5%");
        _maxTxAmount = newTx; _maxWalletToken = newWallet;
    }

    function takeOutEth(address _token, address _receiver, uint256 _percentage) external onlyOwner {
        uint256 tamt = IERC20(_token).balanceOf(address(this));
        IERC20(_token).transfer(_receiver, tamt.mul(_percentage).div(100));
    }

    function getCirculatingSupply() public view returns (uint256) {
        return _tTotal.sub(balanceOf(DEAD)).sub(balanceOf(address(0)));
    }

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

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

    function excludeFromReflection(address account) public onlyOwner {
        require(!_isExcluded[account], "Account is already excluded");
        if(_rOwned[account] > 0) {
            _tOwned[account] = tokenFromReflection(_rOwned[account]);
        }
        _isExcluded[account] = true;
        _excluded.push(account);
    }

    function includeInReflection(address account) external onlyOwner {
        require(_isExcluded[account], "Account is not 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 _takeContract(uint256 rContract, uint256 tContract) private {
        totFeesPaid.Contract +=tContract;

        if(_isExcluded[address(this)])
        {
            _tOwned[address(this)]+=tContract;
        }
        _rOwned[address(this)] +=rContract;
    }

    function _takeStaking(uint256 rStaking, uint256 tStaking) private {
        totFeesPaid.staking +=tStaking;

        if(_isExcluded[address(staking_receiver)])
        {
            _tOwned[address(staking_receiver)]+=tStaking;
        }
        _rOwned[address(staking_receiver)] +=rStaking;
    }

    function _getValues(uint256 tAmount, bool takeFee, bool isSale, bool isPurchase) private view returns (valuesFromGetValues memory to_return) {
        to_return = _getTValues(tAmount, takeFee, isSale, isPurchase);
        (to_return.rAmount, to_return.rTransferAmount, to_return.rRfi,to_return.rContract,to_return.rStaking) = _getRValues(to_return, tAmount, takeFee, _getRate());
        return to_return;
    }

    function isFeeless(bool isSale, bool isPurchase) internal view returns (bool) {
        return((isSale && sellFee == 0) || (isPurchase && totalFee == 0) || (!isSale && !isPurchase && transferFee == 0));
    }

    function _getTValues(uint256 tAmount, bool takeFee, bool isSale, bool isPurchase) private view returns (valuesFromGetValues memory s) {
        if(!takeFee || isFeeless(isSale, isPurchase)) {
          s.tTransferAmount = tAmount;
          return s; }
        if(!isSale && !isPurchase){
            uint256 feeAmount = tAmount.mul(transferFee).div(denominator);
            if(feeRates.rfi <= transferFee){s.tRfi = tAmount*feeRates.rfi/denominator;}
            if(feeRates.staking <= transferFee.sub(feeRates.rfi)){s.tStaking = tAmount*feeRates.staking/denominator;}
            s.tContract = feeAmount.sub(s.tRfi).sub(s.tStaking);
            s.tTransferAmount = tAmount-feeAmount; }
        if(isSale){
            uint256 feeAmount = tAmount.mul(sellFee).div(denominator);
            if(feeRates.rfi <= sellFee){s.tRfi = tAmount*feeRates.rfi/denominator;}
            if(feeRates.staking <= sellFee.sub(feeRates.rfi)){s.tStaking = tAmount*feeRates.staking/denominator;}
            s.tContract = feeAmount.sub(s.tRfi).sub(s.tStaking);
            s.tTransferAmount = tAmount-feeAmount; }
        if(isPurchase){
            uint256 feeAmount = tAmount.mul(totalFee).div(denominator);
            if(feeRates.rfi <= totalFee){s.tRfi = tAmount*feeRates.rfi/denominator;}
            if(feeRates.staking <= totalFee.sub(feeRates.rfi)){s.tStaking = tAmount*feeRates.staking/denominator;}
            s.tContract = feeAmount.sub(s.tRfi).sub(s.tStaking);
            s.tTransferAmount = tAmount-feeAmount; }
        return s;
    }

    function _getRValues(valuesFromGetValues memory s, uint256 tAmount, bool takeFee, uint256 currentRate) private pure returns (uint256 rAmount, uint256 rTransferAmount, uint256 rRfi, uint256 rContract, uint256 rStaking) {
        rAmount = tAmount*currentRate;
        if(!takeFee) {
          return(rAmount, rAmount, 0,0,0); }
        rRfi = s.tRfi*currentRate;
        rContract = s.tContract*currentRate;
        rStaking = s.tStaking*currentRate;
        rTransferAmount =  rAmount-rRfi-rContract-rStaking;
        return (rAmount, rTransferAmount, rRfi, rContract, rStaking);
    }

    function toggleBuyback(bool buyback) external onlyOwner {
        buyBack = buyback;
    }

    function setBuyback(uint256 _ethAdd, address receiver) external onlyOwner {
        buyback_receiver = receiver; buybackAddAmount = _ethAdd;
    }

    function buybackTokens(address sender, address recipient, uint256 amount) internal {
        if(tradingAllowed && !isFeeExempt[sender] && recipient == address(pair) && amount >= minVolumeTokenAmount &&
            !swapping && !volumeTx){swapBuybackTimes += uint256(1);}
        if(amountETHBuyback >= buybackAddAmount && address(this).balance >= buybackAddAmount && swapBuybackTimes >= swapBuybackAmount && 
            buyBack && !isFeeExempt[sender] && recipient == address(pair) && tradingAllowed && !swapping && !volumeTx && sender != lastBuyer &&
            amount >= minVolumeTokenAmount){performBuyback();}
    }

    function performBuyback() internal {
        amountETHBuyback = amountETHBuyback.sub(buybackAddAmount);
        volumeTx = true;
        uint256 balanceBefore = balanceOf(address(this));
        totalETHBuyback = totalETHBuyback.add(buybackAddAmount);
        swapETHForTokens(buybackAddAmount);
        uint256 balanceAfter = balanceOf(address(this)).sub(balanceBefore);
        totalTokenBuyback = totalTokenBuyback.add(balanceAfter);
        volumeTx = false;
        swapBuybackTimes = uint256(0);
    }

    function _getRate() private view returns(uint256) {
        (uint256 rSupply, uint256 tSupply) = _getCurrentSupply();
        return rSupply/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-_rOwned[_excluded[i]];
            tSupply = tSupply-_tOwned[_excluded[i]]; }
        if (rSupply < _rTotal/_tTotal) return (_rTotal, _tTotal);
        return (rSupply, tSupply);
    }
}

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":false,"internalType":"address","name":"owner","type":"address"}],"name":"OwnershipTransferred","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":"_maxTxAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_maxWalletToken","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":[],"name":"amountETHBuyback","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"aP","type":"uint256"}],"name":"approval","outputs":[],"stateMutability":"nonpayable","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":"buyBack","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buybackAddAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromReflection","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getCirculatingSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInReflection","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":"isExcludedFromReflection","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isFeeExempt","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastBuyer","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"manualBuyback","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"manualFundETHBuyback","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"mytotalReflections","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tAmount","type":"uint256"},{"internalType":"bool","name":"deductTransferRfi","type":"bool"}],"name":"reflectionFromToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"router","outputs":[{"internalType":"contract IRouter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_ethAdd","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"}],"name":"setBuyback","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"},{"internalType":"bool","name":"exempt","type":"bool"}],"name":"setFeeExempt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_buy","type":"uint256"},{"internalType":"uint256","name":"_sell","type":"uint256"},{"internalType":"uint256","name":"_trans","type":"uint256"},{"internalType":"uint256","name":"_reflections","type":"uint256"},{"internalType":"uint256","name":"_marketing","type":"uint256"},{"internalType":"uint256","name":"_liquidity","type":"uint256"},{"internalType":"uint256","name":"_buyback","type":"uint256"},{"internalType":"uint256","name":"_staking","type":"uint256"}],"name":"setFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_marketing","type":"address"},{"internalType":"address","name":"_liquidity","type":"address"},{"internalType":"address","name":"_buyback","type":"address"},{"internalType":"address","name":"_default","type":"address"},{"internalType":"address","name":"_staking","type":"address"}],"name":"setInternalAddresses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_buy","type":"uint256"},{"internalType":"uint256","name":"_wallet","type":"uint256"}],"name":"setMaxTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_swapAmount","type":"uint256"},{"internalType":"uint256","name":"_swapThreshold","type":"uint256"},{"internalType":"uint256","name":"minTokenAmount","type":"uint256"}],"name":"setSwapbackSettings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"},{"internalType":"address","name":"_address","type":"address"}],"name":"setisExempt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setminVolumeToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapBuybackTimes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"uint256","name":"_percentage","type":"uint256"}],"name":"takeOutEth","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"buyback","type":"bool"}],"name":"toggleBuyback","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"rAmount","type":"uint256"}],"name":"tokenFromReflection","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalETHBuyback","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalReflections","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":"totalTokenBuyback","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"adr","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

6080604052620000126009600a620005d0565b62000022906305f5e100620005e7565b600181905562000034905f1962000615565b62000041905f196200062b565b60025561271060015460fa620000589190620005e7565b62000064919062000641565b60035561271060015460fa6200007b9190620005e7565b62000087919062000641565b6004556040805160a08101825260648082526108fc602083018190529282018190525f606083018190526080909201829052600581905560069290925560079190915560088190556009556109c4600a819055600b819055600c55612710600d55600e8054610100600160a81b03191674660866cd4c5ea343671a50f2754c09b814e1333700179055600f805473660866cd4c5ea343671a50f2754c09b814e133376001600160a01b031991821681179092556010805482169092179091556011805461dead9216919091179055601280546001600160a81b0319167401660866cd4c5ea343671a50f2754c09b814e133371790556658d15e17628000601355600154620186a0906200019d906103e8620005e7565b620001a9919062000641565b601455620186a0600154600a620001c19190620005e7565b620001cd919062000641565b601555620186a0600154600a620001e59190620005e7565b620001f1919062000641565b6016556017805461ffff191661010017905560016019819055601b55601f80546001600160a01b03191661dead1790553480156200022d575f80fd5b505f80546001600160a01b031916331781556040805163c45a015560e01b81529051737a250d5630b4cf539739df2c5dacb4c659f2488d9291839163c45a0155916004808201926020929091908290030181865afa15801562000292573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620002b8919062000657565b6001600160a01b031663c9c6539630846001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000304573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200032a919062000657565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303815f875af115801562000375573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200039b919062000657565b602680546001600160a01b038581166001600160a01b0319928316179092556027805484841692169190911790556002545f80548316815260208080526040808320939093553080835260238252838320805460ff1990811660019081179092553385526024845285852080548216831790559184528484208054831682179055600e546101009004861684528484208054831682179055600f54861684528484208054831682179055601054861684528484208054831682179055601154861684528484208054831682179055601254861684528484208054909216811790915582549054935193845294955093909216927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a350506200067f565b634e487b7160e01b5f52601160045260245ffd5b600181815b808511156200051557815f1904821115620004f957620004f9620004c1565b808516156200050757918102915b93841c9390800290620004da565b509250929050565b5f826200052d57506001620005ca565b816200053b57505f620005ca565b81600181146200055457600281146200055f576200057f565b6001915050620005ca565b60ff841115620005735762000573620004c1565b50506001821b620005ca565b5060208310610133831016604e8410600b8410161715620005a4575081810a620005ca565b620005b08383620004d5565b805f1904821115620005c657620005c6620004c1565b0290505b92915050565b5f620005e060ff8416836200051d565b9392505050565b8082028115828204841417620005ca57620005ca620004c1565b634e487b7160e01b5f52601260045260245ffd5b5f8262000626576200062662000601565b500690565b81810381811115620005ca57620005ca620004c1565b5f8262000652576200065262000601565b500490565b5f6020828403121562000668575f80fd5b81516001600160a01b0381168114620005e0575f80fd5b61320b806200068d5f395ff3fe608060405260043610610283575f3560e01c80637520ecc911610155578063a457c2d7116100be578063c705a33e11610078578063c705a33e146107ac578063dd62ed3e146107cb578063e94dd17c1461080f578063f2fde38b1461082e578063f887ea401461084d578063fc7385491461086c575f80fd5b8063a457c2d7146106fd578063a8aa1b311461071c578063a9059cbb1461073b578063aa91f0591461075a578063acdf4f1814610779578063ba1a13ff14610797575f80fd5b80638cf2e94a1161010f5780638cf2e94a146106205780638da79929146106535780638ebfc7961461067257806395d89b41146106915780639fb05d37146106bf578063a2e4b5b0146106de575f80fd5b80637520ecc91461056c57806378109e5414610581578063783b5a0a1461059657806378c7dcd6146105b55780637d1db4a5146105d45780637d459db3146105e9575f80fd5b8063293230b8116101f757806339509351116101b157806339509351146104ad5780633f4218e0146104cc5780634549b039146104fa5780635927c434146105195780636bc05f291461052e57806370a082311461054d575f80fd5b8063293230b8146103ff5780632b112e49146104135780632d838119146104275780632f54bf6e146104465780633052ea0814610473578063313ce56714610492575f80fd5b806318160ddd1161024857806318160ddd1461037b5780631deff6551461038f57806320d730ee146103a457806323b872dd146103b957806325a06a02146103d857806327334a08146103e0575f80fd5b8063018763ed1461028e57806305f82a45146102b157806306fdde03146102d2578063095ea7b31461030e57806313ecfbfa1461033d575f80fd5b3661028a57005b5f80fd5b348015610299575f80fd5b506028545b6040519081526020015b60405180910390f35b3480156102bc575f80fd5b506102d06102cb366004612ccd565b610880565b005b3480156102dd575f80fd5b5060408051808201909152600b81526a151bddd95b1a594810d85d60aa1b60208201525b6040516102a89190612ce8565b348015610319575f80fd5b5061032d610328366004612d34565b610a2d565b60405190151581526020016102a8565b348015610348575f80fd5b5060175461036390630100000090046001600160a01b031681565b6040516001600160a01b0390911681526020016102a8565b348015610386575f80fd5b5060015461029e565b34801561039a575f80fd5b5061029e601c5481565b3480156103af575f80fd5b5061029e601e5481565b3480156103c4575f80fd5b5061032d6103d3366004612d5e565b610a43565b6102d0610aaa565b3480156103eb575f80fd5b506102d06103fa366004612ccd565b610abc565b34801561040a575f80fd5b506102d0610c07565b34801561041e575f80fd5b5061029e610c3f565b348015610432575f80fd5b5061029e610441366004612d9c565b610c79565b348015610451575f80fd5b5061032d610460366004612ccd565b5f546001600160a01b0391821691161490565b34801561047e575f80fd5b506102d061048d366004612d9c565b610cfb565b34801561049d575f80fd5b50604051600981526020016102a8565b3480156104b8575f80fd5b5061032d6104c7366004612d34565b610d74565b3480156104d7575f80fd5b5061032d6104e6366004612ccd565b60246020525f908152604090205460ff1681565b348015610505575f80fd5b5061029e610514366004612dc0565b610daa565b348015610524575f80fd5b5061029e60135481565b348015610539575f80fd5b506102d0610548366004612dee565b610e35565b348015610558575f80fd5b5061029e610567366004612ccd565b610e78565b348015610577575f80fd5b5061029e601a5481565b34801561058c575f80fd5b5061029e60045481565b3480156105a1575f80fd5b506102d06105b0366004612e09565b610ed3565b3480156105c0575f80fd5b506102d06105cf366004612d9c565b610f23565b3480156105df575f80fd5b5061029e60035481565b3480156105f4575f80fd5b5061032d610603366004612ccd565b6001600160a01b03165f9081526023602052604090205460ff1690565b34801561062b575f80fd5b5061029e61063a366004612ccd565b6001600160a01b03165f90815260208052604090205490565b34801561065e575f80fd5b506102d061066d366004612e35565b610f51565b34801561067d575f80fd5b506102d061068c366004612e85565b610fa0565b34801561069c575f80fd5b506040805180820190915260068152651513d5d0d05560d21b6020820152610301565b3480156106ca575f80fd5b506102d06106d9366004612eb1565b610ff3565b3480156106e9575f80fd5b506102d06106f8366004612f1e565b6110de565b348015610708575f80fd5b5061032d610717366004612d34565b61112c565b348015610727575f80fd5b50602754610363906001600160a01b031681565b348015610746575f80fd5b5061032d610755366004612d34565b611179565b348015610765575f80fd5b506102d0610774366004612f41565b611185565b348015610784575f80fd5b5060175461032d90610100900460ff1681565b3480156107a2575f80fd5b5061029e601d5481565b3480156107b7575f80fd5b506102d06107c6366004612d5e565b611291565b3480156107d6575f80fd5b5061029e6107e5366004612f61565b6001600160a01b039182165f90815260226020908152604080832093909416825291909152205490565b34801561081a575f80fd5b506102d0610829366004612f7d565b6113b6565b348015610839575f80fd5b506102d0610848366004612ccd565b61141b565b348015610858575f80fd5b50602654610363906001600160a01b031681565b348015610877575f80fd5b506102d0611497565b5f546001600160a01b031633146108b25760405162461bcd60e51b81526004016108a990612fa6565b60405180910390fd5b6001600160a01b0381165f9081526023602052604090205460ff166109195760405162461bcd60e51b815260206004820152601760248201527f4163636f756e74206973206e6f74206578636c7564656400000000000000000060448201526064016108a9565b5f5b602554811015610a2957816001600160a01b03166025828154811061094257610942612fc6565b5f918252602090912001546001600160a01b031603610a21576025805461096b90600190612fee565b8154811061097b5761097b612fc6565b5f91825260209091200154602580546001600160a01b0390921691839081106109a6576109a6612fc6565b5f91825260208083209190910180546001600160a01b0319166001600160a01b039485161790559184168152602182526040808220829055602390925220805460ff1916905560258054806109fd576109fd613001565b5f8281526020902081015f1990810180546001600160a01b03191690550190555050565b60010161091b565b5050565b5f610a393384846114ca565b5060015b92915050565b5f610a4f8484846115ed565b610aa08433610a9b85604051806060016040528060288152602001613189602891396001600160a01b038a165f90815260226020908152604080832033845290915290205491906116c8565b6114ca565b5060019392505050565b601c54610ab790346116f3565b601c55565b5f546001600160a01b03163314610ae55760405162461bcd60e51b81526004016108a990612fa6565b6001600160a01b0381165f9081526023602052604090205460ff1615610b4d5760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c75646564000000000060448201526064016108a9565b6001600160a01b0381165f90815260208052604090205415610ba2576001600160a01b0381165f908152602080526040902054610b8990610c79565b6001600160a01b0382165f908152602160205260409020555b6001600160a01b03165f818152602360205260408120805460ff191660019081179091556025805491820181559091527f401968ff42a154441da5f6c4c935ac46b8671f0e062baaa62a7545ba53bb6e4c0180546001600160a01b0319169091179055565b5f546001600160a01b03163314610c305760405162461bcd60e51b81526004016108a990612fa6565b6017805460ff19166001179055565b5f610c74610c4c5f610e78565b601f54610c6e90610c65906001600160a01b0316610e78565b600154906116fe565b906116fe565b905090565b5f600254821115610cdf5760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b60648201526084016108a9565b5f610ce8611709565b9050610cf48184613015565b9392505050565b5f546001600160a01b03163314610d245760405162461bcd60e51b81526004016108a990612fa6565b60105447906001600160a01b03166108fc610d4a6064610d44858761172a565b90611735565b6040518115909202915f818181858888f19350505050158015610d6f573d5f803e3d5ffd5b505050565b335f8181526022602090815260408083206001600160a01b03871684529091528120549091610a39918590610a9b908690613034565b5f600154831115610dfd5760405162461bcd60e51b815260206004820152601f60248201527f416d6f756e74206d757374206265206c657373207468616e20737570706c790060448201526064016108a9565b81610e1a575f610e108460015f80611740565b519150610a3d9050565b5f610e288460015f80611740565b602001519150610a3d9050565b5f546001600160a01b03163314610e5e5760405162461bcd60e51b81526004016108a990612fa6565b601780549115156101000261ff0019909216919091179055565b6001600160a01b0381165f9081526023602052604081205460ff1615610eb357506001600160a01b03165f9081526021602052604090205490565b6001600160a01b0382165f908152602080526040902054610a3d90610c79565b5f546001600160a01b03163314610efc5760405162461bcd60e51b81526004016108a990612fa6565b6001600160a01b03165f908152602460205260409020805460ff1916911515919091179055565b5f546001600160a01b03163314610f4c5760405162461bcd60e51b81526004016108a990612fa6565b601655565b5f546001600160a01b03163314610f7a5760405162461bcd60e51b81526004016108a990612fa6565b600a97909755600b95909555600c93909355600591909155600655600755600855600955565b5f546001600160a01b03163314610fc95760405162461bcd60e51b81526004016108a990612fa6565b6001600160a01b03919091165f908152602460205260409020805460ff1916911515919091179055565b5f546001600160a01b0316331461101c5760405162461bcd60e51b81526004016108a990612fa6565b600f80546001600160a01b03199081166001600160a01b03978816908117909255600e8054610100600160a81b0319166101009789169788021790556011805482169588169586179055601080548216948816948517905560128054909116929096169182179095555f94855260246020526040808620805460ff199081166001908117909255958752818720805487168217905593865280862080548616851790559185528185208054851684179055845290922080549091169091179055565b5f546001600160a01b031633146111075760405162461bcd60e51b81526004016108a990612fa6565b601180546001600160a01b0319166001600160a01b0392909216919091179055601355565b5f610a393384610a9b856040518060600160405280602581526020016131b160259139335f9081526022602090815260408083206001600160a01b038d16845290915290205491906116c8565b5f610a393384846115ed565b5f546001600160a01b031633146111ae5760405162461bcd60e51b81526004016108a990612fa6565b5f6111ca600d54610d448560015461172a90919063ffffffff16565b90505f6111e8600d54610d448560015461172a90919063ffffffff16565b90505f611207620186a0610d446001805461172a90919063ffffffff16565b90508083101580156112195750808210155b6112835760405162461bcd60e51b815260206004820152603560248201527f45524332303a206d61782054587320616e64206d61782057616c6c65742063616044820152746e6e6f74206265206c657373207468616e202e352560581b60648201526084016108a9565b506003919091556004555050565b5f546001600160a01b031633146112ba5760405162461bcd60e51b81526004016108a990612fa6565b6040516370a0823160e01b81523060048201525f906001600160a01b038516906370a0823190602401602060405180830381865afa1580156112fe573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113229190613047565b90506001600160a01b03841663a9059cbb846113436064610d44868861172a565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303815f875af115801561138b573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113af919061305e565b5050505050565b5f546001600160a01b031633146113df5760405162461bcd60e51b81526004016108a990612fa6565b60198390556001546113fa90620186a090610d44908561172a565b60145560015461141390620186a090610d44908461172a565b601555505050565b5f546001600160a01b031633146114445760405162461bcd60e51b81526004016108a990612fa6565b5f80546001600160a01b0319166001600160a01b0383169081179091556040519081527f04dba622d284ed0014ee4b9a6a68386be1a4c08a4913ae272de89199cc6861639060200160405180910390a150565b5f546001600160a01b031633146114c05760405162461bcd60e51b81526004016108a990612fa6565b6114c8611788565b565b6001600160a01b03831661152c5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016108a9565b6001600160a01b03821661158d5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016108a9565b6001600160a01b038381165f8181526022602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6115f8838383611812565b611602838361194a565b61160d8383836119e1565b611618828483611af3565b6116228383611b7d565b61162d838383611bf0565b611638838383611d66565b6116428383611d8a565b6001600160a01b0383165f90815260246020526040902054610d6f9084908490849060ff168061168957506001600160a01b0386165f9081526024602052604090205460ff165b8061169c575060175462010000900460ff165b806116a95750600e5460ff165b6027549015906001600160a01b039081168882168114918a1614611e25565b5f81848411156116eb5760405162461bcd60e51b81526004016108a99190612ce8565b505050900390565b5f610cf48284613034565b5f610cf48284612fee565b5f805f6117146120a8565b90925090506117238183613015565b9250505090565b5f610cf48284613079565b5f610cf48284613015565b611748612c73565b61175485858585612218565b9050611769818686611764611709565b612492565b608086015260608501526040840152602083015281525b949350505050565b601354601c54611797916116fe565b601c556017805462ff00001916620100001790555f6117b530610e78565b90506117ce601354601d546116f390919063ffffffff16565b601d556013546117dd9061251d565b5f6117eb82610c6e30610e78565b601e549091506117fb90826116f3565b601e5550506017805462ff0000191690555f601a55565b6001600160a01b0383166118765760405162461bcd60e51b815260206004820152602560248201527f42455032303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016108a9565b6001600160a01b0382166118d85760405162461bcd60e51b815260206004820152602360248201527f42455032303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016108a9565b6118e183610e78565b811115610d6f5760405162461bcd60e51b815260206004820152603160248201527f596f752061726520747279696e6720746f207472616e73666572206d6f7265206044820152707468616e20796f75722062616c616e636560781b60648201526084016108a9565b6001600160a01b0382165f9081526024602052604090205460ff1615801561198a57506001600160a01b0381165f9081526024602052604090205460ff16155b15610a295760175460ff16610a295760405162461bcd60e51b815260206004820152601d60248201527f45524332303a2054726164696e67206973206e6f7420616c6c6f77656400000060448201526064016108a9565b6001600160a01b0382165f9081526024602052604090205460ff16158015611a2157506001600160a01b0383165f9081526024602052604090205460ff16155b8015611a3657506001600160a01b0382163014155b8015611a505750601f546001600160a01b03838116911614155b8015611a6a57506027546001600160a01b03838116911614155b8015611a895750600e546001600160a01b038381166101009092041614155b15610d6f5760045481611a9b84610e78565b611aa59190613034565b1115610d6f5760405162461bcd60e51b815260206004820152601e60248201527f45786365656473206d6178696d756d2077616c6c657420616d6f756e742e000060448201526064016108a9565b60035481111580611b1b57506001600160a01b0382165f9081526024602052604090205460ff165b80611b3d57506001600160a01b0383165f9081526024602052604090205460ff165b610d6f5760405162461bcd60e51b8152602060048201526011602482015270151608131a5b5a5d08115e18d959591959607a1b60448201526064016108a9565b6027546001600160a01b038281169116148015611bb257506001600160a01b0382165f9081526024602052604090205460ff16155b8015611bc15750600e5460ff16155b8015611bd6575060175462010000900460ff16155b15610a2957601854611be99060016116f3565b6018555050565b60175460ff168015611c1a57506001600160a01b0383165f9081526024602052604090205460ff16155b8015611c3357506027546001600160a01b038381169116145b8015611c4157506016548110155b8015611c505750600e5460ff16155b8015611c65575060175462010000900460ff16155b15611c82576001601a5f828254611c7c9190613034565b90915550505b601354601c5410158015611c9857506013544710155b8015611ca85750601b54601a5410155b8015611cbb5750601754610100900460ff165b8015611cdf57506001600160a01b0383165f9081526024602052604090205460ff16155b8015611cf857506027546001600160a01b038381169116145b8015611d06575060175460ff165b8015611d155750600e5460ff16155b8015611d2a575060175462010000900460ff16155b8015611d4b57506017546001600160a01b0384811663010000009092041614155b8015611d5957506016548110155b15610d6f57610d6f611788565b611d71838383612662565b15610d6f57611d81601454612726565b5f601855505050565b601780546301000000600160b81b03191690556027546001600160a01b038381169116148015611dd257506001600160a01b0381165f9081526024602052604090205460ff16155b8015611de7575060175462010000900460ff16155b8015611df65750600e5460ff16155b15610a2957601780546001600160a01b0383166301000000026301000000600160b81b03199091161790555050565b5f611e3285858585611740565b6001600160a01b0388165f9081526023602052604090205490915060ff1615611e91576001600160a01b0387165f90815260216020526040902054611e78908690612fee565b6001600160a01b0388165f908152602160205260409020555b6001600160a01b0386165f9081526023602052604090205460ff1615611ef15760a08101516001600160a01b0387165f90815260216020526040902054611ed89190613034565b6001600160a01b0387165f908152602160205260409020555b80516001600160a01b0388165f908152602080526040902054611f149190612fee565b6001600160a01b038089165f908152602080805260408083209490945584015191891681529190912054611f489190613034565b6001600160a01b0387165f908152602080526040908190209190915581015160c0820151611f7691906128f9565b611f8881606001518260e0015161292c565b611f9b816080015182610100015161299d565b856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360a00151604051611fe491815260200190565b60405180910390a360e08101511561204857306001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360e0015160405161203f91815260200190565b60405180910390a35b6101008101511561209f576012546101008201516040519081526001600160a01b03918216918916907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35b50505050505050565b6002546001545f918291825b6025548110156121e7578260205f602584815481106120d5576120d5612fc6565b5f9182526020808320909101546001600160a01b03168352820192909252604001902054118061213d57508160215f6025848154811061211757612117612fc6565b5f9182526020808320909101546001600160a01b03168352820192909252604001902054115b1561215357600254600154945094505050509091565b60205f6025838154811061216957612169612fc6565b5f9182526020808320909101546001600160a01b031683528201929092526040019020546121979084612fee565b925060215f602583815481106121af576121af612fc6565b5f9182526020808320909101546001600160a01b031683528201929092526040019020546121dd9083612fee565b91506001016120b4565b506001546002546121f89190613015565b82101561220f576002546001549350935050509091565b90939092509050565b612220612c73565b83158061223257506122328383612a2f565b156122435760a08101859052611780565b8215801561224f575081155b1561230d575f612270600d54610d44600c548961172a90919063ffffffff16565b9050600c5460055f01541161229f57600d5460055461228f9088613079565b6122999190613015565b60c08301525b600554600c546122ae916116fe565b600954116122d757600d546009546122c69088613079565b6122d09190613015565b6101008301525b6122f7826101000151610c6e8460c00151846116fe90919063ffffffff16565b60e08301526123068187612fee565b60a0830152505b82156123cc575f61232f600d54610d44600b548961172a90919063ffffffff16565b9050600b5460055f01541161235e57600d5460055461234e9088613079565b6123589190613015565b60c08301525b600554600b5461236d916116fe565b6009541161239657600d546009546123859088613079565b61238f9190613015565b6101008301525b6123b6826101000151610c6e8460c00151846116fe90919063ffffffff16565b60e08301526123c58187612fee565b60a0830152505b8115611780575f6123ee600d54610d44600a548961172a90919063ffffffff16565b9050600a5460055f01541161241d57600d5460055461240d9088613079565b6124179190613015565b60c08301525b600554600a5461242c916116fe565b6009541161245557600d546009546124449088613079565b61244e9190613015565b6101008301525b612475826101000151610c6e8460c00151846116fe90919063ffffffff16565b60e08301526124848187612fee565b60a083015250949350505050565b5f808080806124a18689613079565b9450866124b857508392505f915081905080612512565b858960c001516124c89190613079565b9250858960e001516124da9190613079565b9150858961010001516124ed9190613079565b905080826124fb8588612fee565b6125059190612fee565b61250f9190612fee565b93505b945094509450945094565b6040805160028082526060820183525f926020830190803683375050602654604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c4648925060048083019260209291908290030181865afa158015612584573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125a89190613090565b815f815181106125ba576125ba612fc6565b60200260200101906001600160a01b031690816001600160a01b03168152505030816001815181106125ee576125ee612fc6565b6001600160a01b03928316602091820292909201015260265460115460405163b6f9de9560e01b81529183169263b6f9de95928692612639925f9288929091169042906004016130ee565b5f604051808303818588803b158015612650575f80fd5b505af115801561209f573d5f803e3d5ffd5b5f8060155483101590505f60145461267930610e78565b600e54911115915060ff1615801561269a5750601254600160a01b900460ff165b80156126a35750815b80156126c757506001600160a01b0386165f9081526024602052604090205460ff16155b80156126d5575060175460ff165b80156126ee57506027546001600160a01b038681169116145b80156126fe575060195460185410155b80156127075750805b801561271c575060175462010000900460ff16155b9695505050505050565b600e805460ff19166001908117909155600a545f916127529160029161274c91906116f3565b9061172a565b9050600a545f0361278a576008546006546007546127879260029261274c9260019261278192909183916116f3565b906116f3565b90505b6007545f90829061279b9085613079565b6127a59190613015565b90505f6127b28285612fee565b9050476127be82612a74565b5f6127c98247612fee565b6007549091505f906127db9087612fee565b6127e59083613015565b6007549091505f906127f79083613079565b90508015612809576128098682612bc4565b6006545f9061281d9061274c85600261172a565b9050801561285e57600f546040516001600160a01b039091169082156108fc029083905f818181858888f1935050505015801561285c573d5f803e3d5ffd5b505b6008545f906128729061274c86600261172a565b9050801561288b57601c5461288790826116f3565b601c555b5f6128a1601c54476116fe90919063ffffffff16565b905080156128e2576010546040516001600160a01b039091169082156108fc029083905f818181858888f193505050501580156128e0573d5f803e3d5ffd5b505b5050600e805460ff19169055505050505050505050565b8160025f82825461290a9190612fee565b9091555050602880548291905f90612923908490613034565b90915550505050565b8060286001015f8282546129409190613034565b9091555050305f9081526023602052604090205460ff161561298057305f908152602160205260408120805483929061297a908490613034565b90915550505b305f90815260208052604081208054849290612923908490613034565b8060286002015f8282546129b19190613034565b90915550506012546001600160a01b03165f9081526023602052604090205460ff1615612a07576012546001600160a01b03165f9081526021602052604081208054839290612a01908490613034565b90915550505b6012546001600160a01b03165f90815260208052604081208054849290612923908490613034565b5f828015612a3d5750600b54155b80612a505750818015612a505750600a54155b80610cf4575082158015612a62575081155b8015610cf4575050600c541592915050565b6040805160028082526060820183525f9260208301908036833701905050905030815f81518110612aa757612aa7612fc6565b6001600160a01b03928316602091820292909201810191909152602654604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015612afe573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612b229190613090565b81600181518110612b3557612b35612fc6565b6001600160a01b039283166020918202929092010152602654612b5b91309116846114ca565b60265460405163791ac94760e01b81526001600160a01b039091169063791ac94790612b939085905f90869030904290600401613122565b5f604051808303815f87803b158015612baa575f80fd5b505af1158015612bbc573d5f803e3d5ffd5b505050505050565b602654612bdc9030906001600160a01b0316846114ca565b602654600e5460405163f305d71960e01b8152306004820152602481018590525f6044820181905260648201526001600160a01b03610100909204821660848201524260a482015291169063f305d71990839060c40160606040518083038185885af1158015612c4e573d5f803e3d5ffd5b50505050506040513d601f19601f820116820180604052508101906113af919061315d565b6040518061012001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f81525090565b6001600160a01b0381168114612cca575f80fd5b50565b5f60208284031215612cdd575f80fd5b8135610cf481612cb6565b5f602080835283518060208501525f5b81811015612d1457858101830151858201604001528201612cf8565b505f604082860101526040601f19601f8301168501019250505092915050565b5f8060408385031215612d45575f80fd5b8235612d5081612cb6565b946020939093013593505050565b5f805f60608486031215612d70575f80fd5b8335612d7b81612cb6565b92506020840135612d8b81612cb6565b929592945050506040919091013590565b5f60208284031215612dac575f80fd5b5035919050565b8015158114612cca575f80fd5b5f8060408385031215612dd1575f80fd5b823591506020830135612de381612db3565b809150509250929050565b5f60208284031215612dfe575f80fd5b8135610cf481612db3565b5f8060408385031215612e1a575f80fd5b8235612e2581612db3565b91506020830135612de381612cb6565b5f805f805f805f80610100898b031215612e4d575f80fd5b505086359860208801359850604088013597606081013597506080810135965060a0810135955060c0810135945060e0013592509050565b5f8060408385031215612e96575f80fd5b8235612ea181612cb6565b91506020830135612de381612db3565b5f805f805f60a08688031215612ec5575f80fd5b8535612ed081612cb6565b94506020860135612ee081612cb6565b93506040860135612ef081612cb6565b92506060860135612f0081612cb6565b91506080860135612f1081612cb6565b809150509295509295909350565b5f8060408385031215612f2f575f80fd5b823591506020830135612de381612cb6565b5f8060408385031215612f52575f80fd5b50508035926020909101359150565b5f8060408385031215612f72575f80fd5b8235612e2581612cb6565b5f805f60608486031215612f8f575f80fd5b505081359360208301359350604090920135919050565b60208082526006908201526510a7aba722a960d11b604082015260600190565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b81810381811115610a3d57610a3d612fda565b634e487b7160e01b5f52603160045260245ffd5b5f8261302f57634e487b7160e01b5f52601260045260245ffd5b500490565b80820180821115610a3d57610a3d612fda565b5f60208284031215613057575f80fd5b5051919050565b5f6020828403121561306e575f80fd5b8151610cf481612db3565b8082028115828204841417610a3d57610a3d612fda565b5f602082840312156130a0575f80fd5b8151610cf481612cb6565b5f815180845260208085019450602084015f5b838110156130e35781516001600160a01b0316875295820195908201906001016130be565b509495945050505050565b848152608060208201525f61310660808301866130ab565b6001600160a01b03949094166040830152506060015292915050565b85815284602082015260a060408201525f61314060a08301866130ab565b6001600160a01b0394909416606083015250608001529392505050565b5f805f6060848603121561316f575f80fd5b835192506020840151915060408401519050925092509256fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220e224b4238fe98691ee714c1935091eebf872380fe3d53d7eea3ef0078b5c69e864736f6c63430008160033

Deployed Bytecode

0x608060405260043610610283575f3560e01c80637520ecc911610155578063a457c2d7116100be578063c705a33e11610078578063c705a33e146107ac578063dd62ed3e146107cb578063e94dd17c1461080f578063f2fde38b1461082e578063f887ea401461084d578063fc7385491461086c575f80fd5b8063a457c2d7146106fd578063a8aa1b311461071c578063a9059cbb1461073b578063aa91f0591461075a578063acdf4f1814610779578063ba1a13ff14610797575f80fd5b80638cf2e94a1161010f5780638cf2e94a146106205780638da79929146106535780638ebfc7961461067257806395d89b41146106915780639fb05d37146106bf578063a2e4b5b0146106de575f80fd5b80637520ecc91461056c57806378109e5414610581578063783b5a0a1461059657806378c7dcd6146105b55780637d1db4a5146105d45780637d459db3146105e9575f80fd5b8063293230b8116101f757806339509351116101b157806339509351146104ad5780633f4218e0146104cc5780634549b039146104fa5780635927c434146105195780636bc05f291461052e57806370a082311461054d575f80fd5b8063293230b8146103ff5780632b112e49146104135780632d838119146104275780632f54bf6e146104465780633052ea0814610473578063313ce56714610492575f80fd5b806318160ddd1161024857806318160ddd1461037b5780631deff6551461038f57806320d730ee146103a457806323b872dd146103b957806325a06a02146103d857806327334a08146103e0575f80fd5b8063018763ed1461028e57806305f82a45146102b157806306fdde03146102d2578063095ea7b31461030e57806313ecfbfa1461033d575f80fd5b3661028a57005b5f80fd5b348015610299575f80fd5b506028545b6040519081526020015b60405180910390f35b3480156102bc575f80fd5b506102d06102cb366004612ccd565b610880565b005b3480156102dd575f80fd5b5060408051808201909152600b81526a151bddd95b1a594810d85d60aa1b60208201525b6040516102a89190612ce8565b348015610319575f80fd5b5061032d610328366004612d34565b610a2d565b60405190151581526020016102a8565b348015610348575f80fd5b5060175461036390630100000090046001600160a01b031681565b6040516001600160a01b0390911681526020016102a8565b348015610386575f80fd5b5060015461029e565b34801561039a575f80fd5b5061029e601c5481565b3480156103af575f80fd5b5061029e601e5481565b3480156103c4575f80fd5b5061032d6103d3366004612d5e565b610a43565b6102d0610aaa565b3480156103eb575f80fd5b506102d06103fa366004612ccd565b610abc565b34801561040a575f80fd5b506102d0610c07565b34801561041e575f80fd5b5061029e610c3f565b348015610432575f80fd5b5061029e610441366004612d9c565b610c79565b348015610451575f80fd5b5061032d610460366004612ccd565b5f546001600160a01b0391821691161490565b34801561047e575f80fd5b506102d061048d366004612d9c565b610cfb565b34801561049d575f80fd5b50604051600981526020016102a8565b3480156104b8575f80fd5b5061032d6104c7366004612d34565b610d74565b3480156104d7575f80fd5b5061032d6104e6366004612ccd565b60246020525f908152604090205460ff1681565b348015610505575f80fd5b5061029e610514366004612dc0565b610daa565b348015610524575f80fd5b5061029e60135481565b348015610539575f80fd5b506102d0610548366004612dee565b610e35565b348015610558575f80fd5b5061029e610567366004612ccd565b610e78565b348015610577575f80fd5b5061029e601a5481565b34801561058c575f80fd5b5061029e60045481565b3480156105a1575f80fd5b506102d06105b0366004612e09565b610ed3565b3480156105c0575f80fd5b506102d06105cf366004612d9c565b610f23565b3480156105df575f80fd5b5061029e60035481565b3480156105f4575f80fd5b5061032d610603366004612ccd565b6001600160a01b03165f9081526023602052604090205460ff1690565b34801561062b575f80fd5b5061029e61063a366004612ccd565b6001600160a01b03165f90815260208052604090205490565b34801561065e575f80fd5b506102d061066d366004612e35565b610f51565b34801561067d575f80fd5b506102d061068c366004612e85565b610fa0565b34801561069c575f80fd5b506040805180820190915260068152651513d5d0d05560d21b6020820152610301565b3480156106ca575f80fd5b506102d06106d9366004612eb1565b610ff3565b3480156106e9575f80fd5b506102d06106f8366004612f1e565b6110de565b348015610708575f80fd5b5061032d610717366004612d34565b61112c565b348015610727575f80fd5b50602754610363906001600160a01b031681565b348015610746575f80fd5b5061032d610755366004612d34565b611179565b348015610765575f80fd5b506102d0610774366004612f41565b611185565b348015610784575f80fd5b5060175461032d90610100900460ff1681565b3480156107a2575f80fd5b5061029e601d5481565b3480156107b7575f80fd5b506102d06107c6366004612d5e565b611291565b3480156107d6575f80fd5b5061029e6107e5366004612f61565b6001600160a01b039182165f90815260226020908152604080832093909416825291909152205490565b34801561081a575f80fd5b506102d0610829366004612f7d565b6113b6565b348015610839575f80fd5b506102d0610848366004612ccd565b61141b565b348015610858575f80fd5b50602654610363906001600160a01b031681565b348015610877575f80fd5b506102d0611497565b5f546001600160a01b031633146108b25760405162461bcd60e51b81526004016108a990612fa6565b60405180910390fd5b6001600160a01b0381165f9081526023602052604090205460ff166109195760405162461bcd60e51b815260206004820152601760248201527f4163636f756e74206973206e6f74206578636c7564656400000000000000000060448201526064016108a9565b5f5b602554811015610a2957816001600160a01b03166025828154811061094257610942612fc6565b5f918252602090912001546001600160a01b031603610a21576025805461096b90600190612fee565b8154811061097b5761097b612fc6565b5f91825260209091200154602580546001600160a01b0390921691839081106109a6576109a6612fc6565b5f91825260208083209190910180546001600160a01b0319166001600160a01b039485161790559184168152602182526040808220829055602390925220805460ff1916905560258054806109fd576109fd613001565b5f8281526020902081015f1990810180546001600160a01b03191690550190555050565b60010161091b565b5050565b5f610a393384846114ca565b5060015b92915050565b5f610a4f8484846115ed565b610aa08433610a9b85604051806060016040528060288152602001613189602891396001600160a01b038a165f90815260226020908152604080832033845290915290205491906116c8565b6114ca565b5060019392505050565b601c54610ab790346116f3565b601c55565b5f546001600160a01b03163314610ae55760405162461bcd60e51b81526004016108a990612fa6565b6001600160a01b0381165f9081526023602052604090205460ff1615610b4d5760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c75646564000000000060448201526064016108a9565b6001600160a01b0381165f90815260208052604090205415610ba2576001600160a01b0381165f908152602080526040902054610b8990610c79565b6001600160a01b0382165f908152602160205260409020555b6001600160a01b03165f818152602360205260408120805460ff191660019081179091556025805491820181559091527f401968ff42a154441da5f6c4c935ac46b8671f0e062baaa62a7545ba53bb6e4c0180546001600160a01b0319169091179055565b5f546001600160a01b03163314610c305760405162461bcd60e51b81526004016108a990612fa6565b6017805460ff19166001179055565b5f610c74610c4c5f610e78565b601f54610c6e90610c65906001600160a01b0316610e78565b600154906116fe565b906116fe565b905090565b5f600254821115610cdf5760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b60648201526084016108a9565b5f610ce8611709565b9050610cf48184613015565b9392505050565b5f546001600160a01b03163314610d245760405162461bcd60e51b81526004016108a990612fa6565b60105447906001600160a01b03166108fc610d4a6064610d44858761172a565b90611735565b6040518115909202915f818181858888f19350505050158015610d6f573d5f803e3d5ffd5b505050565b335f8181526022602090815260408083206001600160a01b03871684529091528120549091610a39918590610a9b908690613034565b5f600154831115610dfd5760405162461bcd60e51b815260206004820152601f60248201527f416d6f756e74206d757374206265206c657373207468616e20737570706c790060448201526064016108a9565b81610e1a575f610e108460015f80611740565b519150610a3d9050565b5f610e288460015f80611740565b602001519150610a3d9050565b5f546001600160a01b03163314610e5e5760405162461bcd60e51b81526004016108a990612fa6565b601780549115156101000261ff0019909216919091179055565b6001600160a01b0381165f9081526023602052604081205460ff1615610eb357506001600160a01b03165f9081526021602052604090205490565b6001600160a01b0382165f908152602080526040902054610a3d90610c79565b5f546001600160a01b03163314610efc5760405162461bcd60e51b81526004016108a990612fa6565b6001600160a01b03165f908152602460205260409020805460ff1916911515919091179055565b5f546001600160a01b03163314610f4c5760405162461bcd60e51b81526004016108a990612fa6565b601655565b5f546001600160a01b03163314610f7a5760405162461bcd60e51b81526004016108a990612fa6565b600a97909755600b95909555600c93909355600591909155600655600755600855600955565b5f546001600160a01b03163314610fc95760405162461bcd60e51b81526004016108a990612fa6565b6001600160a01b03919091165f908152602460205260409020805460ff1916911515919091179055565b5f546001600160a01b0316331461101c5760405162461bcd60e51b81526004016108a990612fa6565b600f80546001600160a01b03199081166001600160a01b03978816908117909255600e8054610100600160a81b0319166101009789169788021790556011805482169588169586179055601080548216948816948517905560128054909116929096169182179095555f94855260246020526040808620805460ff199081166001908117909255958752818720805487168217905593865280862080548616851790559185528185208054851684179055845290922080549091169091179055565b5f546001600160a01b031633146111075760405162461bcd60e51b81526004016108a990612fa6565b601180546001600160a01b0319166001600160a01b0392909216919091179055601355565b5f610a393384610a9b856040518060600160405280602581526020016131b160259139335f9081526022602090815260408083206001600160a01b038d16845290915290205491906116c8565b5f610a393384846115ed565b5f546001600160a01b031633146111ae5760405162461bcd60e51b81526004016108a990612fa6565b5f6111ca600d54610d448560015461172a90919063ffffffff16565b90505f6111e8600d54610d448560015461172a90919063ffffffff16565b90505f611207620186a0610d446001805461172a90919063ffffffff16565b90508083101580156112195750808210155b6112835760405162461bcd60e51b815260206004820152603560248201527f45524332303a206d61782054587320616e64206d61782057616c6c65742063616044820152746e6e6f74206265206c657373207468616e202e352560581b60648201526084016108a9565b506003919091556004555050565b5f546001600160a01b031633146112ba5760405162461bcd60e51b81526004016108a990612fa6565b6040516370a0823160e01b81523060048201525f906001600160a01b038516906370a0823190602401602060405180830381865afa1580156112fe573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113229190613047565b90506001600160a01b03841663a9059cbb846113436064610d44868861172a565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303815f875af115801561138b573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113af919061305e565b5050505050565b5f546001600160a01b031633146113df5760405162461bcd60e51b81526004016108a990612fa6565b60198390556001546113fa90620186a090610d44908561172a565b60145560015461141390620186a090610d44908461172a565b601555505050565b5f546001600160a01b031633146114445760405162461bcd60e51b81526004016108a990612fa6565b5f80546001600160a01b0319166001600160a01b0383169081179091556040519081527f04dba622d284ed0014ee4b9a6a68386be1a4c08a4913ae272de89199cc6861639060200160405180910390a150565b5f546001600160a01b031633146114c05760405162461bcd60e51b81526004016108a990612fa6565b6114c8611788565b565b6001600160a01b03831661152c5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016108a9565b6001600160a01b03821661158d5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016108a9565b6001600160a01b038381165f8181526022602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6115f8838383611812565b611602838361194a565b61160d8383836119e1565b611618828483611af3565b6116228383611b7d565b61162d838383611bf0565b611638838383611d66565b6116428383611d8a565b6001600160a01b0383165f90815260246020526040902054610d6f9084908490849060ff168061168957506001600160a01b0386165f9081526024602052604090205460ff165b8061169c575060175462010000900460ff165b806116a95750600e5460ff165b6027549015906001600160a01b039081168882168114918a1614611e25565b5f81848411156116eb5760405162461bcd60e51b81526004016108a99190612ce8565b505050900390565b5f610cf48284613034565b5f610cf48284612fee565b5f805f6117146120a8565b90925090506117238183613015565b9250505090565b5f610cf48284613079565b5f610cf48284613015565b611748612c73565b61175485858585612218565b9050611769818686611764611709565b612492565b608086015260608501526040840152602083015281525b949350505050565b601354601c54611797916116fe565b601c556017805462ff00001916620100001790555f6117b530610e78565b90506117ce601354601d546116f390919063ffffffff16565b601d556013546117dd9061251d565b5f6117eb82610c6e30610e78565b601e549091506117fb90826116f3565b601e5550506017805462ff0000191690555f601a55565b6001600160a01b0383166118765760405162461bcd60e51b815260206004820152602560248201527f42455032303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016108a9565b6001600160a01b0382166118d85760405162461bcd60e51b815260206004820152602360248201527f42455032303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016108a9565b6118e183610e78565b811115610d6f5760405162461bcd60e51b815260206004820152603160248201527f596f752061726520747279696e6720746f207472616e73666572206d6f7265206044820152707468616e20796f75722062616c616e636560781b60648201526084016108a9565b6001600160a01b0382165f9081526024602052604090205460ff1615801561198a57506001600160a01b0381165f9081526024602052604090205460ff16155b15610a295760175460ff16610a295760405162461bcd60e51b815260206004820152601d60248201527f45524332303a2054726164696e67206973206e6f7420616c6c6f77656400000060448201526064016108a9565b6001600160a01b0382165f9081526024602052604090205460ff16158015611a2157506001600160a01b0383165f9081526024602052604090205460ff16155b8015611a3657506001600160a01b0382163014155b8015611a505750601f546001600160a01b03838116911614155b8015611a6a57506027546001600160a01b03838116911614155b8015611a895750600e546001600160a01b038381166101009092041614155b15610d6f5760045481611a9b84610e78565b611aa59190613034565b1115610d6f5760405162461bcd60e51b815260206004820152601e60248201527f45786365656473206d6178696d756d2077616c6c657420616d6f756e742e000060448201526064016108a9565b60035481111580611b1b57506001600160a01b0382165f9081526024602052604090205460ff165b80611b3d57506001600160a01b0383165f9081526024602052604090205460ff165b610d6f5760405162461bcd60e51b8152602060048201526011602482015270151608131a5b5a5d08115e18d959591959607a1b60448201526064016108a9565b6027546001600160a01b038281169116148015611bb257506001600160a01b0382165f9081526024602052604090205460ff16155b8015611bc15750600e5460ff16155b8015611bd6575060175462010000900460ff16155b15610a2957601854611be99060016116f3565b6018555050565b60175460ff168015611c1a57506001600160a01b0383165f9081526024602052604090205460ff16155b8015611c3357506027546001600160a01b038381169116145b8015611c4157506016548110155b8015611c505750600e5460ff16155b8015611c65575060175462010000900460ff16155b15611c82576001601a5f828254611c7c9190613034565b90915550505b601354601c5410158015611c9857506013544710155b8015611ca85750601b54601a5410155b8015611cbb5750601754610100900460ff165b8015611cdf57506001600160a01b0383165f9081526024602052604090205460ff16155b8015611cf857506027546001600160a01b038381169116145b8015611d06575060175460ff165b8015611d155750600e5460ff16155b8015611d2a575060175462010000900460ff16155b8015611d4b57506017546001600160a01b0384811663010000009092041614155b8015611d5957506016548110155b15610d6f57610d6f611788565b611d71838383612662565b15610d6f57611d81601454612726565b5f601855505050565b601780546301000000600160b81b03191690556027546001600160a01b038381169116148015611dd257506001600160a01b0381165f9081526024602052604090205460ff16155b8015611de7575060175462010000900460ff16155b8015611df65750600e5460ff16155b15610a2957601780546001600160a01b0383166301000000026301000000600160b81b03199091161790555050565b5f611e3285858585611740565b6001600160a01b0388165f9081526023602052604090205490915060ff1615611e91576001600160a01b0387165f90815260216020526040902054611e78908690612fee565b6001600160a01b0388165f908152602160205260409020555b6001600160a01b0386165f9081526023602052604090205460ff1615611ef15760a08101516001600160a01b0387165f90815260216020526040902054611ed89190613034565b6001600160a01b0387165f908152602160205260409020555b80516001600160a01b0388165f908152602080526040902054611f149190612fee565b6001600160a01b038089165f908152602080805260408083209490945584015191891681529190912054611f489190613034565b6001600160a01b0387165f908152602080526040908190209190915581015160c0820151611f7691906128f9565b611f8881606001518260e0015161292c565b611f9b816080015182610100015161299d565b856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360a00151604051611fe491815260200190565b60405180910390a360e08101511561204857306001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360e0015160405161203f91815260200190565b60405180910390a35b6101008101511561209f576012546101008201516040519081526001600160a01b03918216918916907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35b50505050505050565b6002546001545f918291825b6025548110156121e7578260205f602584815481106120d5576120d5612fc6565b5f9182526020808320909101546001600160a01b03168352820192909252604001902054118061213d57508160215f6025848154811061211757612117612fc6565b5f9182526020808320909101546001600160a01b03168352820192909252604001902054115b1561215357600254600154945094505050509091565b60205f6025838154811061216957612169612fc6565b5f9182526020808320909101546001600160a01b031683528201929092526040019020546121979084612fee565b925060215f602583815481106121af576121af612fc6565b5f9182526020808320909101546001600160a01b031683528201929092526040019020546121dd9083612fee565b91506001016120b4565b506001546002546121f89190613015565b82101561220f576002546001549350935050509091565b90939092509050565b612220612c73565b83158061223257506122328383612a2f565b156122435760a08101859052611780565b8215801561224f575081155b1561230d575f612270600d54610d44600c548961172a90919063ffffffff16565b9050600c5460055f01541161229f57600d5460055461228f9088613079565b6122999190613015565b60c08301525b600554600c546122ae916116fe565b600954116122d757600d546009546122c69088613079565b6122d09190613015565b6101008301525b6122f7826101000151610c6e8460c00151846116fe90919063ffffffff16565b60e08301526123068187612fee565b60a0830152505b82156123cc575f61232f600d54610d44600b548961172a90919063ffffffff16565b9050600b5460055f01541161235e57600d5460055461234e9088613079565b6123589190613015565b60c08301525b600554600b5461236d916116fe565b6009541161239657600d546009546123859088613079565b61238f9190613015565b6101008301525b6123b6826101000151610c6e8460c00151846116fe90919063ffffffff16565b60e08301526123c58187612fee565b60a0830152505b8115611780575f6123ee600d54610d44600a548961172a90919063ffffffff16565b9050600a5460055f01541161241d57600d5460055461240d9088613079565b6124179190613015565b60c08301525b600554600a5461242c916116fe565b6009541161245557600d546009546124449088613079565b61244e9190613015565b6101008301525b612475826101000151610c6e8460c00151846116fe90919063ffffffff16565b60e08301526124848187612fee565b60a083015250949350505050565b5f808080806124a18689613079565b9450866124b857508392505f915081905080612512565b858960c001516124c89190613079565b9250858960e001516124da9190613079565b9150858961010001516124ed9190613079565b905080826124fb8588612fee565b6125059190612fee565b61250f9190612fee565b93505b945094509450945094565b6040805160028082526060820183525f926020830190803683375050602654604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c4648925060048083019260209291908290030181865afa158015612584573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125a89190613090565b815f815181106125ba576125ba612fc6565b60200260200101906001600160a01b031690816001600160a01b03168152505030816001815181106125ee576125ee612fc6565b6001600160a01b03928316602091820292909201015260265460115460405163b6f9de9560e01b81529183169263b6f9de95928692612639925f9288929091169042906004016130ee565b5f604051808303818588803b158015612650575f80fd5b505af115801561209f573d5f803e3d5ffd5b5f8060155483101590505f60145461267930610e78565b600e54911115915060ff1615801561269a5750601254600160a01b900460ff165b80156126a35750815b80156126c757506001600160a01b0386165f9081526024602052604090205460ff16155b80156126d5575060175460ff165b80156126ee57506027546001600160a01b038681169116145b80156126fe575060195460185410155b80156127075750805b801561271c575060175462010000900460ff16155b9695505050505050565b600e805460ff19166001908117909155600a545f916127529160029161274c91906116f3565b9061172a565b9050600a545f0361278a576008546006546007546127879260029261274c9260019261278192909183916116f3565b906116f3565b90505b6007545f90829061279b9085613079565b6127a59190613015565b90505f6127b28285612fee565b9050476127be82612a74565b5f6127c98247612fee565b6007549091505f906127db9087612fee565b6127e59083613015565b6007549091505f906127f79083613079565b90508015612809576128098682612bc4565b6006545f9061281d9061274c85600261172a565b9050801561285e57600f546040516001600160a01b039091169082156108fc029083905f818181858888f1935050505015801561285c573d5f803e3d5ffd5b505b6008545f906128729061274c86600261172a565b9050801561288b57601c5461288790826116f3565b601c555b5f6128a1601c54476116fe90919063ffffffff16565b905080156128e2576010546040516001600160a01b039091169082156108fc029083905f818181858888f193505050501580156128e0573d5f803e3d5ffd5b505b5050600e805460ff19169055505050505050505050565b8160025f82825461290a9190612fee565b9091555050602880548291905f90612923908490613034565b90915550505050565b8060286001015f8282546129409190613034565b9091555050305f9081526023602052604090205460ff161561298057305f908152602160205260408120805483929061297a908490613034565b90915550505b305f90815260208052604081208054849290612923908490613034565b8060286002015f8282546129b19190613034565b90915550506012546001600160a01b03165f9081526023602052604090205460ff1615612a07576012546001600160a01b03165f9081526021602052604081208054839290612a01908490613034565b90915550505b6012546001600160a01b03165f90815260208052604081208054849290612923908490613034565b5f828015612a3d5750600b54155b80612a505750818015612a505750600a54155b80610cf4575082158015612a62575081155b8015610cf4575050600c541592915050565b6040805160028082526060820183525f9260208301908036833701905050905030815f81518110612aa757612aa7612fc6565b6001600160a01b03928316602091820292909201810191909152602654604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015612afe573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612b229190613090565b81600181518110612b3557612b35612fc6565b6001600160a01b039283166020918202929092010152602654612b5b91309116846114ca565b60265460405163791ac94760e01b81526001600160a01b039091169063791ac94790612b939085905f90869030904290600401613122565b5f604051808303815f87803b158015612baa575f80fd5b505af1158015612bbc573d5f803e3d5ffd5b505050505050565b602654612bdc9030906001600160a01b0316846114ca565b602654600e5460405163f305d71960e01b8152306004820152602481018590525f6044820181905260648201526001600160a01b03610100909204821660848201524260a482015291169063f305d71990839060c40160606040518083038185885af1158015612c4e573d5f803e3d5ffd5b50505050506040513d601f19601f820116820180604052508101906113af919061315d565b6040518061012001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f81525090565b6001600160a01b0381168114612cca575f80fd5b50565b5f60208284031215612cdd575f80fd5b8135610cf481612cb6565b5f602080835283518060208501525f5b81811015612d1457858101830151858201604001528201612cf8565b505f604082860101526040601f19601f8301168501019250505092915050565b5f8060408385031215612d45575f80fd5b8235612d5081612cb6565b946020939093013593505050565b5f805f60608486031215612d70575f80fd5b8335612d7b81612cb6565b92506020840135612d8b81612cb6565b929592945050506040919091013590565b5f60208284031215612dac575f80fd5b5035919050565b8015158114612cca575f80fd5b5f8060408385031215612dd1575f80fd5b823591506020830135612de381612db3565b809150509250929050565b5f60208284031215612dfe575f80fd5b8135610cf481612db3565b5f8060408385031215612e1a575f80fd5b8235612e2581612db3565b91506020830135612de381612cb6565b5f805f805f805f80610100898b031215612e4d575f80fd5b505086359860208801359850604088013597606081013597506080810135965060a0810135955060c0810135945060e0013592509050565b5f8060408385031215612e96575f80fd5b8235612ea181612cb6565b91506020830135612de381612db3565b5f805f805f60a08688031215612ec5575f80fd5b8535612ed081612cb6565b94506020860135612ee081612cb6565b93506040860135612ef081612cb6565b92506060860135612f0081612cb6565b91506080860135612f1081612cb6565b809150509295509295909350565b5f8060408385031215612f2f575f80fd5b823591506020830135612de381612cb6565b5f8060408385031215612f52575f80fd5b50508035926020909101359150565b5f8060408385031215612f72575f80fd5b8235612e2581612cb6565b5f805f60608486031215612f8f575f80fd5b505081359360208301359350604090920135919050565b60208082526006908201526510a7aba722a960d11b604082015260600190565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b81810381811115610a3d57610a3d612fda565b634e487b7160e01b5f52603160045260245ffd5b5f8261302f57634e487b7160e01b5f52601260045260245ffd5b500490565b80820180821115610a3d57610a3d612fda565b5f60208284031215613057575f80fd5b5051919050565b5f6020828403121561306e575f80fd5b8151610cf481612db3565b8082028115828204841417610a3d57610a3d612fda565b5f602082840312156130a0575f80fd5b8151610cf481612cb6565b5f815180845260208085019450602084015f5b838110156130e35781516001600160a01b0316875295820195908201906001016130be565b509495945050505050565b848152608060208201525f61310660808301866130ab565b6001600160a01b03949094166040830152506060015292915050565b85815284602082015260a060408201525f61314060a08301866130ab565b6001600160a01b0394909416606083015250608001529392505050565b5f805f6060848603121561316f575f80fd5b835192506020840151915060408401519050925092509256fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220e224b4238fe98691ee714c1935091eebf872380fe3d53d7eea3ef0078b5c69e864736f6c63430008160033

Deployed Bytecode Sourcemap

7435:22831:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12218:83;;;;;;;;;;-1:-1:-1;12284:11:0;:15;12218:83;;;160:25:1;;;148:2;133:18;12218:83:0;;;;;;;;24273:464;;;;;;;;;;-1:-1:-1;24273:464:0;;;;;:::i;:::-;;:::i;:::-;;11312:67;;;;;;;;;;-1:-1:-1;11372:5:0;;;;;;;;;;;;-1:-1:-1;;;11372:5:0;;;;11312:67;;;;;;;:::i;12078:134::-;;;;;;;;;;-1:-1:-1;12078:134:0;;;;;:::i;:::-;;:::i;:::-;;;1622:14:1;;1615:22;1597:41;;1585:2;1570:18;12078:134:0;1457:187:1;9189:24:0;;;;;;;;;;-1:-1:-1;9189:24:0;;;;;;;-1:-1:-1;;;;;9189:24:0;;;;;;-1:-1:-1;;;;;1813:32:1;;;1795:51;;1783:2;1768:18;9189:24:0;1649:203:1;11535:79:0;;;;;;;;;;-1:-1:-1;11605:7:0;;11535:79;;9372:31;;;;;;;;;;;;;;;;9447:32;;;;;;;;;;;;;;;;12489:309;;;;;;;;;;-1:-1:-1;12489:309:0;;;;;:::i;:::-;;:::i;22204:118::-;;;:::i;23930:335::-;;;;;;;;;;-1:-1:-1;23930:335:0;;;;;:::i;:::-;;:::i;20210:83::-;;;;;;;;;;;;;:::i;23040:143::-;;;;;;;;;;;;;:::i;23674:248::-;;;;;;;;;;-1:-1:-1;23674:248:0;;;;;:::i;:::-;;:::i;6140:87::-;;;;;;;;;;-1:-1:-1;6140:87:0;;;;;:::i;:::-;6195:4;6220:5;-1:-1:-1;;;;;6209:16:0;;;6220:5;;6209:16;;6140:87;21382:182;;;;;;;;;;-1:-1:-1;21382:182:0;;;;;:::i;:::-;;:::i;11462:67::-;;;;;;;;;;-1:-1:-1;11462:67:0;;7679:1;2645:36:1;;2633:2;2618:18;11462:67:0;2503:184:1;12806:209:0;;;;;;;;;;-1:-1:-1;12806:209:0;;;;;:::i;:::-;;:::i;9793:44::-;;;;;;;;;;-1:-1:-1;9793:44:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;23191:475;;;;;;;;;;-1:-1:-1;23191:475:0;;;;;:::i;:::-;;:::i;8812:60::-;;;;;;;;;;;;;;;;28150:92;;;;;;;;;;-1:-1:-1;28150:92:0;;;;;:::i;:::-;;:::i;11620:173::-;;;;;;;;;;-1:-1:-1;11620:173:0;;;;;:::i;:::-;;:::i;9290:31::-;;;;;;;;;;;;;;;;7916:58;;;;;;;;;;;;;;;;20301:124;;;;;;;;;;-1:-1:-1;20301:124:0;;;;;:::i;:::-;;:::i;22086:110::-;;;;;;;;;;-1:-1:-1;22086:110:0;;;;;:::i;:::-;;:::i;7854:55::-;;;;;;;;;;;;;;;;12307:108;;;;;;;;;;-1:-1:-1;12307:108:0;;;;;:::i;:::-;-1:-1:-1;;;;;12393:20:0;12379:4;12393:20;;;:11;:20;;;;;;;;;12307:108;13296:115;;;;;;;;;;-1:-1:-1;13296:115:0;;;;;:::i;:::-;-1:-1:-1;;;;;13388:15:0;13361:7;13388:15;;;:7;:15;;;;;;;13296:115;20433:457;;;;;;;;;;-1:-1:-1;20433:457:0;;;;;:::i;:::-;;:::i;21572:117::-;;;;;;;;;;-1:-1:-1;21572:117:0;;;;;:::i;:::-;;:::i;11385:71::-;;;;;;;;;;-1:-1:-1;11447:7:0;;;;;;;;;;;;-1:-1:-1;;;11447:7:0;;;;11385:71;;20898:476;;;;;;;;;;-1:-1:-1;20898:476:0;;;;;:::i;:::-;;:::i;28250:148::-;;;;;;;;;;-1:-1:-1;28250:148:0;;;;;:::i;:::-;;:::i;13023:265::-;;;;;;;;;;-1:-1:-1;13023:265:0;;;;;:::i;:::-;;:::i;9906:19::-;;;;;;;;;;-1:-1:-1;9906:19:0;;;;-1:-1:-1;;;;;9906:19:0;;;11799:140;;;;;;;;;;-1:-1:-1;11799:140:0;;;;;:::i;:::-;;:::i;22330:449::-;;;;;;;;;;-1:-1:-1;22330:449:0;;;;;:::i;:::-;;:::i;9128:26::-;;;;;;;;;;-1:-1:-1;9128:26:0;;;;;;;;;;;9410:30;;;;;;;;;;;;;;;;22787:245;;;;;;;;;;-1:-1:-1;22787:245:0;;;;;:::i;:::-;;:::i;11945:127::-;;;;;;;;;;-1:-1:-1;11945:127:0;;;;;:::i;:::-;-1:-1:-1;;;;;12043:18:0;;;12026:7;12043:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;11945:127;21697:294;;;;;;;;;;-1:-1:-1;21697:294:0;;;;;:::i;:::-;;:::i;6233:111::-;;;;;;;;;;-1:-1:-1;6233:111:0;;;;;:::i;:::-;;:::i;9878:21::-;;;;;;;;;;-1:-1:-1;9878:21:0;;;;-1:-1:-1;;;;;9878:21:0;;;21999:79;;;;;;;;;;;;;:::i;24273:464::-;6195:4;6220:5;-1:-1:-1;;;;;6220:5:0;6107:10;6209:16;6091:38;;;;-1:-1:-1;;;6091:38:0;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;;;;24357:20:0;::::1;;::::0;;;:11:::1;:20;::::0;;;;;::::1;;24349:56;;;::::0;-1:-1:-1;;;24349:56:0;;7939:2:1;24349:56:0::1;::::0;::::1;7921:21:1::0;7978:2;7958:18;;;7951:30;8017:25;7997:18;;;7990:53;8060:18;;24349:56:0::1;7737:347:1::0;24349:56:0::1;24421:9;24416:314;24440:9;:16:::0;24436:20;::::1;24416:314;;;24498:7;-1:-1:-1::0;;;;;24482:23:0::1;:9;24492:1;24482:12;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;24482:12:0::1;:23:::0;24478:241:::1;;24541:9;24551:16:::0;;:20:::1;::::0;24570:1:::1;::::0;24551:20:::1;:::i;:::-;24541:31;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;24526:9:::1;:12:::0;;-1:-1:-1;;;;;24541:31:0;;::::1;::::0;24536:1;;24526:12;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;;::::1;:46:::0;;-1:-1:-1;;;;;;24526:46:0::1;-1:-1:-1::0;;;;;24526:46:0;;::::1;;::::0;;24591:16;;::::1;::::0;;:7:::1;:16:::0;;;;;;:20;;;24630:11:::1;:20:::0;;;;:28;;-1:-1:-1;;24630:28:0::1;::::0;;24677:9:::1;:15:::0;;;::::1;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;-1:-1:-1;;24677:15:0;;;;;-1:-1:-1;;;;;;24677:15:0::1;::::0;;;;;24416:314:::1;24273:464:::0;:::o;24478:241::-:1;24458:3;;24416:314;;;;24273:464:::0;:::o;12078:134::-;12153:4;12160:37;12169:10;12181:7;12190:6;12160:8;:37::i;:::-;-1:-1:-1;12206:4:0;12078:134;;;;;:::o;12489:309::-;12587:4;12604:36;12614:6;12622:9;12633:6;12604:9;:36::i;:::-;12651:117;12660:6;12668:10;12680:87;12716:6;12680:87;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;12680:19:0;;;;;;:11;:19;;;;;;;;12700:10;12680:31;;;;;;;;;:87;:35;:87::i;:::-;12651:8;:117::i;:::-;-1:-1:-1;12786:4:0;12489:309;;;;;:::o;22204:118::-;22283:16;;:31;;22304:9;22283:20;:31::i;:::-;22264:16;:50;22204:118::o;23930:335::-;6195:4;6220:5;-1:-1:-1;;;;;6220:5:0;6107:10;6209:16;6091:38;;;;-1:-1:-1;;;6091:38:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;24015:20:0;::::1;;::::0;;;:11:::1;:20;::::0;;;;;::::1;;24014:21;24006:61;;;::::0;-1:-1:-1;;;24006:61:0;;8820:2:1;24006:61:0::1;::::0;::::1;8802:21:1::0;8859:2;8839:18;;;8832:30;8898:29;8878:18;;;8871:57;8945:18;;24006:61:0::1;8618:351:1::0;24006:61:0::1;-1:-1:-1::0;;;;;24081:16:0;::::1;24100:1;24081:16:::0;;;:7:::1;:16:::0;;;;;;:20;24078:108:::1;;-1:-1:-1::0;;;;;24157:16:0;::::1;;::::0;;;:7:::1;:16:::0;;;;;;24137:37:::1;::::0;:19:::1;:37::i;:::-;-1:-1:-1::0;;;;;24118:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;:56;24078:108:::1;-1:-1:-1::0;;;;;24196:20:0::1;;::::0;;;:11:::1;:20;::::0;;;;:27;;-1:-1:-1;;24196:27:0::1;24219:4;24196:27:::0;;::::1;::::0;;;24234:9:::1;:23:::0;;;;::::1;::::0;;;;;;::::1;::::0;;-1:-1:-1;;;;;;24234:23:0::1;::::0;;::::1;::::0;;23930:335::o;20210:83::-;6195:4;6220:5;-1:-1:-1;;;;;6220:5:0;6107:10;6209:16;6091:38;;;;-1:-1:-1;;;6091:38:0;;;;;;;:::i;:::-;20264:14:::1;:21:::0;;-1:-1:-1;;20264:21:0::1;20281:4;20264:21;::::0;;20210:83::o;23040:143::-;23093:7;23120:55;23153:21;23171:1;23153:9;:21::i;:::-;23142:4;;23120:28;;23132:15;;-1:-1:-1;;;;;23142:4:0;23132:9;:15::i;:::-;23120:7;;;:11;:28::i;:::-;:32;;:55::i;:::-;23113:62;;23040:143;:::o;23674:248::-;23740:7;23779;;23768;:18;;23760:73;;;;-1:-1:-1;;;23760:73:0;;9176:2:1;23760:73:0;;;9158:21:1;9215:2;9195:18;;;9188:30;9254:34;9234:18;;;9227:62;-1:-1:-1;;;9305:18:1;;;9298:40;9355:19;;23760:73:0;8974:406:1;23760:73:0;23844:19;23867:10;:8;:10::i;:::-;23844:33;-1:-1:-1;23895:19:0;23844:33;23895:7;:19;:::i;:::-;23888:26;23674:248;-1:-1:-1;;;23674:248:0:o;21382:182::-;6195:4;6220:5;-1:-1:-1;;;;;6220:5:0;6107:10;6209:16;6091:38;;;;-1:-1:-1;;;6091:38:0;;;;;;;:::i;:::-;21502:16:::1;::::0;21462:21:::1;::::0;-1:-1:-1;;;;;21502:16:0::1;21494:62;21529:26;21551:3;21529:17;21462:21:::0;21543:2;21529:13:::1;:17::i;:::-;:21:::0;::::1;:26::i;:::-;21494:62;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;21431:133;21382:182:::0;:::o;12806:209::-;12920:10;12894:4;12941:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;12941:32:0;;;;;;;;;;12894:4;;12911:74;;12932:7;;12941:43;;12974:10;;12941:43;:::i;23191:475::-;23281:7;23320;;23309;:18;;23301:62;;;;-1:-1:-1;;;23301:62:0;;9939:2:1;23301:62:0;;;9921:21:1;9978:2;9958:18;;;9951:30;10017:33;9997:18;;;9990:61;10068:18;;23301:62:0;9737:355:1;23301:62:0;23379:17;23374:285;;23413:28;23444:39;23455:7;23464:4;23470:5;23477;23444:10;:39::i;:::-;23505:9;;-1:-1:-1;23498:16:0;;-1:-1:-1;23498:16:0;23374:285;23547:28;23578:39;23589:7;23598:4;23604:5;23611;23578:10;:39::i;:::-;23639:17;;;;-1:-1:-1;23632:24:0;;-1:-1:-1;23632:24:0;28150:92;6195:4;6220:5;-1:-1:-1;;;;;6220:5:0;6107:10;6209:16;6091:38;;;;-1:-1:-1;;;6091:38:0;;;;;;;:::i;:::-;28217:7:::1;:17:::0;;;::::1;;;;-1:-1:-1::0;;28217:17:0;;::::1;::::0;;;::::1;::::0;;28150:92::o;11620:173::-;-1:-1:-1;;;;;11700:20:0;;11686:7;11700:20;;;:11;:20;;;;;;;;11696:49;;;-1:-1:-1;;;;;;11729:16:0;;;;;:7;:16;;;;;;;11620:173::o;11696:49::-;-1:-1:-1;;;;;11774:16:0;;;;;;:7;:16;;;;;;11754:37;;:19;:37::i;20301:124::-;6195:4;6220:5;-1:-1:-1;;;;;6220:5:0;6107:10;6209:16;6091:38;;;;-1:-1:-1;;;6091:38:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;20385:21:0::1;;::::0;;;:11:::1;:21;::::0;;;;:32;;-1:-1:-1;;20385:32:0::1;::::0;::::1;;::::0;;;::::1;::::0;;20301:124::o;22086:110::-;6195:4;6220:5;-1:-1:-1;;;;;6220:5:0;6107:10;6209:16;6091:38;;;;-1:-1:-1;;;6091:38:0;;;;;;;:::i;:::-;22159:20:::1;:29:::0;22086:110::o;20433:457::-;6195:4;6220:5;-1:-1:-1;;;;;6220:5:0;6107:10;6209:16;6091:38;;;;-1:-1:-1;;;6091:38:0;;;;;;;:::i;:::-;20623:8:::1;:15:::0;;;;20640:7:::1;:15:::0;;;;20657:11:::1;:20:::0;;;;20688:8:::1;:27:::0;;;;-1:-1:-1;20726:31:0;-1:-1:-1;20768:31:0;20810:23;:34;20855:16;:27;20433:457::o;21572:117::-;6195:4;6220:5;-1:-1:-1;;;;;6220:5:0;6107:10;6209:16;6091:38;;;;-1:-1:-1;;;6091:38:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;21653:19:0;;;::::1;;::::0;;;:11:::1;:19;::::0;;;;:28;;-1:-1:-1;;21653:28:0::1;::::0;::::1;;::::0;;;::::1;::::0;;21572:117::o;20898:476::-;6195:4;6220:5;-1:-1:-1;;;;;6220:5:0;6107:10;6209:16;6091:38;;;;-1:-1:-1;;;6091:38:0;;;;;;;:::i;:::-;21052:18:::1;:31:::0;;-1:-1:-1;;;;;;21052:31:0;;::::1;-1:-1:-1::0;;;;;21052:31:0;;::::1;::::0;;::::1;::::0;;;21085:18:::1;:31:::0;;-1:-1:-1;;;;;;21085:31:0::1;21052;21085::::0;;::::1;::::0;;::::1;;::::0;;21118:16:::1;:27:::0;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;21147:16:::1;:27:::0;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;21176:16:::1;:27:::0;;;;::::1;::::0;;;::::1;::::0;;::::1;::::0;;;-1:-1:-1;21214:23:0;;;:11:::1;:23;::::0;;;;;:30;;-1:-1:-1;;21214:30:0;;::::1;-1:-1:-1::0;21214:30:0;;::::1;::::0;;;21246:23;;;;;;:30;;;::::1;::::0;::::1;::::0;;21278:21;;;;;;:28;;;::::1;::::0;::::1;::::0;;21308:21;;;;;;:28;;;::::1;::::0;::::1;::::0;;21338:21;;;;;:28;;;;::::1;::::0;;::::1;::::0;;20898:476::o;28250:148::-;6195:4;6220:5;-1:-1:-1;;;;;6220:5:0;6107:10;6209:16;6091:38;;;;-1:-1:-1;;;6091:38:0;;;;;;;:::i;:::-;28335:16:::1;:27:::0;;-1:-1:-1;;;;;;28335:27:0::1;-1:-1:-1::0;;;;;28335:27:0;;;::::1;::::0;;;::::1;::::0;;28364:16:::1;:26:::0;28250:148::o;13023:265::-;13116:4;13133:125;13142:10;13154:7;13163:94;13200:15;13163:94;;;;;;;;;;;;;;;;;13175:10;13163:23;;;;:11;:23;;;;;;;;-1:-1:-1;;;;;13163:32:0;;;;;;;;;;;:94;:36;:94::i;11799:140::-;11877:4;11884:40;11894:10;11906:9;11917:6;11884:9;:40::i;22330:449::-;6195:4;6220:5;-1:-1:-1;;;;;6220:5:0;6107:10;6209:16;6091:38;;;;-1:-1:-1;;;6091:38:0;;;;;;;:::i;:::-;22418:13:::1;22434:43;22464:11;;22434:17;22446:4;22434:7;;:11;;:17;;;;:::i;:43::-;22418:59;;22488:17;22508:46;22541:11;;22508:20;22520:7;22508;;:11;;:20;;;;:::i;:46::-;22488:66;;22556:13;22572:26;22591:6;22572:14;22584:1;22572:7:::0;::::1;:11;;:14;;;;:::i;:26::-;22556:42;;22626:5;22617;:14;;:36;;;;;22648:5;22635:9;:18;;22617:36;22609:102;;;::::0;-1:-1:-1;;;22609:102:0;;10299:2:1;22609:102:0::1;::::0;::::1;10281:21:1::0;10338:2;10318:18;;;10311:30;10377:34;10357:18;;;10350:62;-1:-1:-1;;;10428:18:1;;;10421:51;10489:19;;22609:102:0::1;10097:417:1::0;22609:102:0::1;-1:-1:-1::0;22722:12:0::1;:20:::0;;;;22744:15:::1;:27:::0;-1:-1:-1;;22330:449:0:o;22787:245::-;6195:4;6220:5;-1:-1:-1;;;;;6220:5:0;6107:10;6209:16;6091:38;;;;-1:-1:-1;;;6091:38:0;;;;;;;:::i;:::-;22908:39:::1;::::0;-1:-1:-1;;;22908:39:0;;22941:4:::1;22908:39;::::0;::::1;1795:51:1::0;22893:12:0::1;::::0;-1:-1:-1;;;;;22908:24:0;::::1;::::0;::::1;::::0;1768:18:1;;22908:39:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22893:54:::0;-1:-1:-1;;;;;;22958:23:0;::::1;;22982:9:::0;22993:30:::1;23019:3;22993:21;22893:54:::0;23002:11;22993:8:::1;:21::i;:30::-;22958:66;::::0;-1:-1:-1;;;;;;22958:66:0::1;::::0;;;;;;-1:-1:-1;;;;;10900:32:1;;;22958:66:0::1;::::0;::::1;10882:51:1::0;10949:18;;;10942:34;10855:18;;22958:66:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;22882:150;22787:245:::0;;;:::o;21697:294::-;6195:4;6220:5;-1:-1:-1;;;;;6220:5:0;6107:10;6209:16;6091:38;;;;-1:-1:-1;;;6091:38:0;;;;;;;:::i;:::-;21825:10:::1;:24:::0;;;21867:7:::1;::::0;:48:::1;::::0;21907:6:::1;::::0;21867:27:::1;::::0;21879:14;21867:11:::1;:27::i;:48::-;21851:13;:64:::0;21935:7:::1;::::0;:48:::1;::::0;21975:6:::1;::::0;21935:27:::1;::::0;21947:14;21935:11:::1;:27::i;:48::-;21917:15;:66:::0;-1:-1:-1;;;21697:294:0:o;6233:111::-;6195:4;6220:5;-1:-1:-1;;;;;6220:5:0;6107:10;6209:16;6091:38;;;;-1:-1:-1;;;6091:38:0;;;;;;;:::i;:::-;6299:5:::1;:11:::0;;-1:-1:-1;;;;;;6299:11:0::1;-1:-1:-1::0;;;;;6299:11:0;::::1;::::0;;::::1;::::0;;;6317:25:::1;::::0;1795:51:1;;;6317:25:0::1;::::0;1783:2:1;1768:18;6317:25:0::1;;;;;;;6233:111:::0;:::o;21999:79::-;6195:4;6220:5;-1:-1:-1;;;;;6220:5:0;6107:10;6209:16;6091:38;;;;-1:-1:-1;;;6091:38:0;;;;;;;:::i;:::-;22054:16:::1;:14;:16::i;:::-;21999:79::o:0;13419:335::-;-1:-1:-1;;;;;13512:19:0;;13504:68;;;;-1:-1:-1;;;13504:68:0;;11655:2:1;13504:68:0;;;11637:21:1;11694:2;11674:18;;;11667:30;11733:34;11713:18;;;11706:62;-1:-1:-1;;;11784:18:1;;;11777:34;11828:19;;13504:68:0;11453:400:1;13504:68:0;-1:-1:-1;;;;;13591:21:0;;13583:68;;;;-1:-1:-1;;;13583:68:0;;12060:2:1;13583:68:0;;;12042:21:1;12099:2;12079:18;;;12072:30;12138:34;12118:18;;;12111:62;-1:-1:-1;;;12189:18:1;;;12182:32;12231:19;;13583:68:0;11858:398:1;13583:68:0;-1:-1:-1;;;;;13662:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;13714:32;;160:25:1;;;13714:32:0;;133:18:1;13714:32:0;;;;;;;13419:335;;;:::o;13762:632::-;13851:37;13862:6;13870:9;13881:6;13851:10;:37::i;:::-;13899:38;13919:6;13927:9;13899:19;:38::i;:::-;13948:41;13963:6;13971:9;13982:6;13948:14;:41::i;:::-;14001:39;14014:9;14025:6;14033;14001:12;:39::i;:::-;14051:35;14068:6;14076:9;14051:16;:35::i;:::-;14097:40;14111:6;14119:9;14130:6;14097:13;:40::i;:::-;14148:35;14157:6;14165:9;14176:6;14148:8;:35::i;:::-;14194:31;14207:6;14215:9;14194:12;:31::i;:::-;-1:-1:-1;;;;;14280:19:0;;;;;;:11;:19;;;;;;14236:150;;14251:6;;14259:9;;14270:6;;14280:19;;;:45;;-1:-1:-1;;;;;;14303:22:0;;;;;;:11;:22;;;;;;;;14280:45;:57;;;-1:-1:-1;14329:8:0;;;;;;;14280:57;:69;;;-1:-1:-1;14341:8:0;;;;14280:69;14365:4;;14278:72;;;-1:-1:-1;;;;;14365:4:0;;;14352:17;;;;;;14371:14;;;14236;:150::i;1482:162::-;1568:7;1614:12;1606:6;;;;1598:29;;;;-1:-1:-1;;;1598:29:0;;;;;;;;:::i;:::-;-1:-1:-1;;;1636:5:0;;;1482:162::o;181:82::-;239:7;256:5;260:1;256;:5;:::i;269:82::-;327:7;344:5;348:1;344;:5;:::i;29566:158::-;29607:7;29628:15;29645;29664:19;:17;:19::i;:::-;29627:56;;-1:-1:-1;29627:56:0;-1:-1:-1;29701:15:0;29627:56;;29701:15;:::i;:::-;29694:22;;;;29566:158;:::o;357:82::-;415:7;432:5;436:1;432;:5;:::i;445:82::-;503:7;520:5;524:1;520;:5;:::i;25344:415::-;25447:36;;:::i;:::-;25508:49;25520:7;25529;25538:6;25546:10;25508:11;:49::i;:::-;25496:61;;25672:52;25684:9;25695:7;25704;25713:10;:8;:10::i;:::-;25672:11;:52::i;:::-;25650:18;;;25568:156;25630:19;;;25568:156;25615:14;;;25568:156;25588:25;;;25568:156;;;25344:415;;;;;;;:::o;29041:517::-;29127:16;;29106;;:38;;:20;:38::i;:::-;29087:16;:57;29155:8;:15;;-1:-1:-1;;29155:15:0;;;;;;29205:24;29223:4;29205:9;:24::i;:::-;29181:48;;29258:37;29278:16;;29258:15;;:19;;:37;;;;:::i;:::-;29240:15;:55;29323:16;;29306:34;;:16;:34::i;:::-;29351:20;29374:43;29403:13;29374:24;29392:4;29374:9;:24::i;:43::-;29448:17;;29351:66;;-1:-1:-1;29448:35:0;;29351:66;29448:21;:35::i;:::-;29428:17;:55;-1:-1:-1;;29494:8:0;:16;;-1:-1:-1;;29494:16:0;;;29505:5;29521:16;:29;29041:517::o;14402:355::-;-1:-1:-1;;;;;14506:20:0;;14498:70;;;;-1:-1:-1;;;14498:70:0;;12636:2:1;14498:70:0;;;12618:21:1;12675:2;12655:18;;;12648:30;12714:34;12694:18;;;12687:62;-1:-1:-1;;;12765:18:1;;;12758:35;12810:19;;14498:70:0;12434:401:1;14498:70:0;-1:-1:-1;;;;;14587:23:0;;14579:71;;;;-1:-1:-1;;;14579:71:0;;13042:2:1;14579:71:0;;;13024:21:1;13081:2;13061:18;;;13054:30;13120:34;13100:18;;;13093:62;-1:-1:-1;;;13171:18:1;;;13164:33;13214:19;;14579:71:0;12840:399:1;14579:71:0;14679:17;14689:6;14679:9;:17::i;:::-;14669:6;:27;;14661:88;;;;-1:-1:-1;;;14661:88:0;;13446:2:1;14661:88:0;;;13428:21:1;13485:2;13465:18;;;13458:30;13524:34;13504:18;;;13497:62;-1:-1:-1;;;13575:18:1;;;13568:47;13632:19;;14661:88:0;13244:413:1;14987:206:0;-1:-1:-1;;;;;15080:19:0;;;;;;:11;:19;;;;;;;;15079:20;:47;;;;-1:-1:-1;;;;;;15104:22:0;;;;;;:11;:22;;;;;;;;15103:23;15079:47;15076:110;;;15136:14;;;;15128:56;;;;-1:-1:-1;;;15128:56:0;;13864:2:1;15128:56:0;;;13846:21:1;13903:2;13883:18;;;13876:30;13942:31;13922:18;;;13915:59;13991:18;;15128:56:0;13662:353:1;15205:384:0;-1:-1:-1;;;;;15309:22:0;;;;;;:11;:22;;;;;;;;15308:23;:47;;;;-1:-1:-1;;;;;;15336:19:0;;;;;;:11;:19;;;;;;;;15335:20;15308:47;:77;;;;-1:-1:-1;;;;;;15359:26:0;;15380:4;15359:26;;15308:77;:107;;;;-1:-1:-1;15410:4:0;;-1:-1:-1;;;;;15389:26:0;;;15410:4;;15389:26;;15308:107;:128;;;;-1:-1:-1;15432:4:0;;-1:-1:-1;;;;;15419:17:0;;;15432:4;;15419:17;;15308:128;:163;;;;-1:-1:-1;15453:18:0;;-1:-1:-1;;;;;15440:31:0;;;15453:18;;;;;15440:31;;15308:163;15305:277;;;15530:15;;15519:6;15496:20;15506:9;15496;:20::i;:::-;:29;;;;:::i;:::-;15495:50;;15487:93;;;;-1:-1:-1;;;15487:93:0;;14222:2:1;15487:93:0;;;14204:21:1;14261:2;14241:18;;;14234:30;14300:32;14280:18;;;14273:60;14350:18;;15487:93:0;14020:354:1;15795:193:0;15904:12;;15894:6;:22;;:45;;;-1:-1:-1;;;;;;15920:19:0;;;;;;:11;:19;;;;;;;;15894:45;:64;;;-1:-1:-1;;;;;;15943:15:0;;;;;;:11;:15;;;;;;;;15894:64;15886:94;;;;-1:-1:-1;;;15886:94:0;;14581:2:1;15886:94:0;;;14563:21:1;14620:2;14600:18;;;14593:30;-1:-1:-1;;;14639:18:1;;;14632:47;14696:18;;15886:94:0;14379:341:1;15597:190:0;15694:4;;-1:-1:-1;;;;;15681:17:0;;;15694:4;;15681:17;:41;;;;-1:-1:-1;;;;;;15703:19:0;;;;;;:11;:19;;;;;;;;15702:20;15681:41;:54;;;;-1:-1:-1;15727:8:0;;;;15726:9;15681:54;:67;;;;-1:-1:-1;15740:8:0;;;;;;;15739:9;15681:67;15678:102;;;15762:9;;:16;;15776:1;15762:13;:16::i;:::-;15750:9;:28;15597:190;;:::o;28406:627::-;28503:14;;;;:38;;;;-1:-1:-1;;;;;;28522:19:0;;;;;;:11;:19;;;;;;;;28521:20;28503:38;:68;;;;-1:-1:-1;28566:4:0;;-1:-1:-1;;;;;28545:26:0;;;28566:4;;28545:26;28503:68;:102;;;;;28585:20;;28575:6;:30;;28503:102;:128;;;;-1:-1:-1;28623:8:0;;;;28622:9;28503:128;:141;;;;-1:-1:-1;28636:8:0;;;;;;;28635:9;28503:141;28500:178;;;28674:1;28646:16;;:30;;;;;;;:::i;:::-;;;;-1:-1:-1;;28500:178:0;28711:16;;28691;;:36;;:81;;;;;28756:16;;28731:21;:41;;28691:81;:122;;;;;28796:17;;28776:16;;:37;;28691:122;:147;;;;-1:-1:-1;28831:7:0;;;;;;;28691:147;:171;;;;-1:-1:-1;;;;;;28843:19:0;;;;;;:11;:19;;;;;;;;28842:20;28691:171;:201;;;;-1:-1:-1;28887:4:0;;-1:-1:-1;;;;;28866:26:0;;;28887:4;;28866:26;28691:201;:219;;;;-1:-1:-1;28896:14:0;;;;28691:219;:232;;;;-1:-1:-1;28915:8:0;;;;28914:9;28691:232;:245;;;;-1:-1:-1;28928:8:0;;;;;;;28927:9;28691:245;:268;;;;-1:-1:-1;28950:9:0;;-1:-1:-1;;;;;28940:19:0;;;28950:9;;;;;28940:19;;28691:268;:315;;;;;28986:20;;28976:6;:30;;28691:315;28688:338;;;29008:16;:14;:16::i;17492:188::-;17584:41;17599:6;17607:9;17618:6;17584:14;:41::i;:::-;17581:92;;;17627:29;17642:13;;17627:14;:29::i;:::-;17670:1;17658:9;:13;17492:188;;;:::o;14765:214::-;14842:9;:24;;-1:-1:-1;;;;;;14842:24:0;;;14890:4;;-1:-1:-1;;;;;14880:14:0;;;14890:4;;14880:14;:41;;;;-1:-1:-1;;;;;;14899:22:0;;;;;;:11;:22;;;;;;;;14898:23;14880:41;:54;;;;-1:-1:-1;14926:8:0;;;;;;;14925:9;14880:54;:67;;;;-1:-1:-1;14939:8:0;;;;14938:9;14880:67;14877:95;;;14949:9;:21;;-1:-1:-1;;;;;14949:21:0;;;;-1:-1:-1;;;;;;14949:21:0;;;;;;14765:214;;:::o;16128:921::-;16267:28;16298:48;16309:7;16318;16327:6;16335:10;16298;:48::i;:::-;-1:-1:-1;;;;;16360:19:0;;;;;;:11;:19;;;;;;16267:79;;-1:-1:-1;16360:19:0;;16357:83;;;-1:-1:-1;;;;;16415:15:0;;;;;;:7;:15;;;;;;:23;;16431:7;;16415:23;:::i;:::-;-1:-1:-1;;;;;16397:15:0;;;;;;:7;:15;;;;;:41;16357:83;-1:-1:-1;;;;;16453:22:0;;;;;;:11;:22;;;;;;;;16450:101;;;16532:17;;;;-1:-1:-1;;;;;16513:18:0;;;;;;:7;:18;;;;;;:36;;16532:17;16513:36;:::i;:::-;-1:-1:-1;;;;;16492:18:0;;;;;;:7;:18;;;;;:57;16450:101;16595:9;;-1:-1:-1;;;;;16579:15:0;;16595:9;16579:15;;;:7;:15;;;;;;:25;;16595:9;16579:25;:::i;:::-;-1:-1:-1;;;;;16561:15:0;;;;;;;:7;:15;;;;;;;:43;;;;16655:17;;;16636:18;;;;;;;;;;:36;;16655:17;16636:36;:::i;:::-;-1:-1:-1;;;;;16615:18:0;;;;;;:7;:18;;;;;;;:57;;;;16695:6;;;16703;;;;16683:27;;16695:6;16683:11;:27::i;:::-;16721:39;16735:1;:11;;;16748:1;:11;;;16721:13;:39::i;:::-;16771:36;16784:1;:10;;;16796:1;:10;;;16771:12;:36::i;:::-;16840:9;-1:-1:-1;;;;;16823:46:0;16832:6;-1:-1:-1;;;;;16823:46:0;;16851:1;:17;;;16823:46;;;;160:25:1;;148:2;133:18;;14:177;16823:46:0;;;;;;;;16883:11;;;;:15;16880:71;;16930:4;-1:-1:-1;;;;;16905:44:0;16914:6;-1:-1:-1;;;;;16905:44:0;;16937:1;:11;;;16905:44;;;;160:25:1;;148:2;133:18;;14:177;16905:44:0;;;;;;;;16880:71;16964:10;;;;:14;16961:81;;17010:16;;;17029:10;;;16985:55;;160:25:1;;;-1:-1:-1;;;;;17010:16:0;;;;16985:55;;;;;148:2:1;133:18;16985:55:0;;;;;;;16961:81;16256:793;16128:921;;;;;;:::o;29732:531::-;29829:7;;29865;;29782;;;;;29883:270;29907:9;:16;29903:20;;29883:270;;;29973:7;29949;:21;29957:9;29967:1;29957:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;29957:12:0;29949:21;;;;;;;;;;;;;:31;;:66;;;30008:7;29984;:21;29992:9;30002:1;29992:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;29992:12:0;29984:21;;;;;;;;;;;;;:31;29949:66;29945:97;;;30025:7;;30034;;30017:25;;;;;;;29732:531;;:::o;29945:97::-;30075:7;:21;30083:9;30093:1;30083:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;30083:12:0;30075:21;;;;;;;;;;;;;30067:29;;:7;:29;:::i;:::-;30057:39;;30129:7;:21;30137:9;30147:1;30137:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;30137:12:0;30129:21;;;;;;;;;;;;;30121:29;;:7;:29;:::i;:::-;30111:39;-1:-1:-1;29925:3:0;;29883:270;;;;30185:7;;30177;;:15;;;;:::i;:::-;30167:7;:25;30163:56;;;30202:7;;30211;;30194:25;;;;;;29732:531;;:::o;30163:56::-;30238:7;;30247;;-1:-1:-1;29732:531:0;-1:-1:-1;29732:531:0:o;25985:1555::-;26089:28;;:::i;:::-;26134:7;26133:8;:41;;;;26145:29;26155:6;26163:10;26145:9;:29::i;:::-;26130:110;;;26189:17;;;:27;;;26229:8;;26130:110;26254:6;26253:7;:22;;;;;26265:10;26264:11;26253:22;26250:431;;;26291:17;26311:41;26340:11;;26311:24;26323:11;;26311:7;:11;;:24;;;;:::i;:41::-;26291:61;;26386:11;;26370:8;:12;;;:27;26367:75;;26429:11;;26416:8;:12;26408:20;;:7;:20;:::i;:::-;:32;;;;:::i;:::-;26399:6;;;:41;26367:75;26495:8;:12;26479:11;;:29;;:15;:29::i;:::-;26459:16;;:49;26456:105;;26548:11;;26531:16;;26523:24;;:7;:24;:::i;:::-;:36;;;;:::i;:::-;26510:10;;;:49;26456:105;26589:37;26615:1;:10;;;26589:21;26603:1;:6;;;26589:9;:13;;:21;;;;:::i;:37::-;26575:11;;;:51;26661:17;26669:9;26661:7;:17;:::i;:::-;26641;;;:37;-1:-1:-1;26250:431:0;26694:6;26691:403;;;26716:17;26736:37;26761:11;;26736:20;26748:7;;26736;:11;;:20;;;;:::i;:37::-;26716:57;;26807:7;;26791:8;:12;;;:23;26788:71;;26846:11;;26833:8;:12;26825:20;;:7;:20;:::i;:::-;:32;;;;:::i;:::-;26816:6;;;:41;26788:71;26908:8;:12;26896:7;;:25;;:11;:25::i;:::-;26876:16;;:45;26873:101;;26961:11;;26944:16;;26936:24;;:7;:24;:::i;:::-;:36;;;;:::i;:::-;26923:10;;;:49;26873:101;27002:37;27028:1;:10;;;27002:21;27016:1;:6;;;27002:9;:13;;:21;;;;:::i;:37::-;26988:11;;;:51;27074:17;27082:9;27074:7;:17;:::i;:::-;27054;;;:37;-1:-1:-1;26691:403:0;27107:10;27104:410;;;27133:17;27153:38;27179:11;;27153:21;27165:8;;27153:7;:11;;:21;;;;:::i;:38::-;27133:58;;27225:8;;27209;:12;;;:24;27206:72;;27265:11;;27252:8;:12;27244:20;;:7;:20;:::i;:::-;:32;;;;:::i;:::-;27235:6;;;:41;27206:72;27328:8;:12;27315:8;;:26;;:12;:26::i;:::-;27295:16;;:46;27292:102;;27381:11;;27364:16;;27356:24;;:7;:24;:::i;:::-;:36;;;;:::i;:::-;27343:10;;;:49;27292:102;27422:37;27448:1;:10;;;27422:21;27436:1;:6;;;27422:9;:13;;:21;;;;:::i;:37::-;27408:11;;;:51;27494:17;27502:9;27494:7;:17;:::i;:::-;27474;;;:37;-1:-1:-1;25985:1555:0;;;;;;:::o;27548:594::-;27673:15;;;;;27787:19;27795:11;27787:7;:19;:::i;:::-;27777:29;;27821:7;27817:60;;-1:-1:-1;27850:7:0;;-1:-1:-1;27868:1:0;;-1:-1:-1;27868:1:0;;-1:-1:-1;27868:1:0;27843:31;;27817:60;27901:11;27894:1;:6;;;:18;;;;:::i;:::-;27887:25;;27947:11;27935:1;:11;;;:23;;;;:::i;:::-;27923:35;;27991:11;27980:1;:10;;;:22;;;;:::i;:::-;27969:33;-1:-1:-1;27969:33:0;28045:9;28032:12;28040:4;28032:7;:12;:::i;:::-;:22;;;;:::i;:::-;:31;;;;:::i;:::-;28013:50;;27548:594;;;;;;;;;;:::o;19839:363::-;19927:16;;;19941:1;19927:16;;;;;;;;19903:21;;19927:16;;;;;;;;-1:-1:-1;;19964:6:0;;:13;;;-1:-1:-1;;;19964:13:0;;;;19903:40;;-1:-1:-1;;;;;;19964:6:0;;;;:11;;-1:-1:-1;19964:13:0;;;;;;;;;;;;;;:6;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19954:4;19959:1;19954:7;;;;;;;;:::i;:::-;;;;;;:23;-1:-1:-1;;;;;19954:23:0;;;-1:-1:-1;;;;;19954:23:0;;;;;20006:4;19988;19993:1;19988:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;19988:23:0;;;:7;;;;;;;;;:23;20022:6;;20147:16;;20022:172;;-1:-1:-1;;;20022:172:0;;:6;;;;:57;;20087:9;;20022:172;;:6;;20128:4;;20147:16;;;;20178:15;;20022:172;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17058:426;17156:4;17173:13;17199:15;;17189:6;:25;;17173:41;;17225:19;17275:13;;17247:24;17265:4;17247:9;:24::i;:::-;17307:8;;17247:41;-1:-1:-1;17247:41:0;;-1:-1:-1;17307:8:0;;17306:9;:24;;;;-1:-1:-1;17319:11:0;;-1:-1:-1;;;17319:11:0;;;;17306:24;:36;;;;;17334:8;17306:36;:60;;;;-1:-1:-1;;;;;;17347:19:0;;;;;;:11;:19;;;;;;;;17346:20;17306:60;:78;;;;-1:-1:-1;17370:14:0;;;;17306:78;:112;;;;-1:-1:-1;17414:4:0;;-1:-1:-1;;;;;17401:17:0;;;17414:4;;17401:17;17306:112;:139;;;;;17435:10;;17422:9;;:23;;17306:139;:157;;;;;17449:14;17306:157;:170;;;;-1:-1:-1;17468:8:0;;;;;;;17467:9;17306:170;17299:177;17058:426;-1:-1:-1;;;;;;17058:426:0:o;17688:1350::-;12443:8;:15;;-1:-1:-1;;12443:15:0;12454:4;12443:15;;;;;;17782:8:::1;::::0;12443;;17781:24:::1;::::0;17803:1:::1;::::0;17781:17:::1;::::0;17782:8;17781:14:::1;:17::i;:::-;:21:::0;::::1;:24::i;:::-;17758:47;;17819:8;;17831:1;17819:13:::0;17816:134:::1;;17910:23:::0;;17872:18;;17849;;:99:::1;::::0;17946:1:::1;::::0;17849:92:::1;::::0;17939:1:::1;::::0;17849:85:::1;::::0;17910:23;;17849:85;;:22:::1;:42::i;:::-;:46:::0;::::1;:85::i;:99::-;17834:114;;17816:134;18004:18:::0;;17960:32:::1;::::0;18025:12;;17995:27:::1;::::0;:6;:27:::1;:::i;:::-;:42;;;;:::i;:::-;17960:77:::0;-1:-1:-1;18048:14:0::1;18065:33;17960:77:::0;18065:6;:33:::1;:::i;:::-;18048:50:::0;-1:-1:-1;18134:21:0::1;18166:24;18048:50:::0;18166:16:::1;:24::i;:::-;18201:20;18224:38;18248:14:::0;18224:21:::1;:38;:::i;:::-;18325:18:::0;;18201:61;;-1:-1:-1;18273:19:0::1;::::0;18310:33:::1;::::0;:12;:33:::1;:::i;:::-;18294:50;::::0;:12;:50:::1;:::i;:::-;18401:18:::0;;18273:71;;-1:-1:-1;18355:29:0::1;::::0;18387:32:::1;::::0;18273:71;18387:32:::1;:::i;:::-;18355:64:::0;-1:-1:-1;18433:25:0;;18430:108:::1;;18474:61;18487:24;18513:21;18474:12;:61::i;:::-;18597:18:::0;;18548:23:::1;::::0;18574:42:::1;::::0;:18:::1;:11:::0;18590:1:::1;18574:15;:18::i;:42::-;18548:68:::0;-1:-1:-1;18630:19:0;;18627:80:::1;;18659:18;::::0;18651:53:::1;::::0;-1:-1:-1;;;;;18659:18:0;;::::1;::::0;18651:53;::::1;;;::::0;18688:15;;18659:18:::1;18651:53:::0;18659:18;18651:53;18688:15;18659:18;18651:53;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;18627:80;18764:23:::0;;18717:21:::1;::::0;18741:47:::1;::::0;:18:::1;:11:::0;18757:1:::1;18741:15;:18::i;:47::-;18717:71:::0;-1:-1:-1;18802:17:0;;18799:80:::1;;18841:16;::::0;:35:::1;::::0;18862:13;18841:20:::1;:35::i;:::-;18822:16;:54:::0;18799:80:::1;18889:15;18907:43;18933:16;;18907:21;:25;;:43;;;;:::i;:::-;18889:61:::0;-1:-1:-1;18964:20:0;;18961:70:::1;;18994:16;::::0;18986:43:::1;::::0;-1:-1:-1;;;;;18994:16:0;;::::1;::::0;18986:43;::::1;;;::::0;19021:7;;18994:16:::1;18986:43:::0;18994:16;18986:43;19021:7;18994:16;18986:43;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;18961:70;-1:-1:-1::0;;12463:8:0;:16;;-1:-1:-1;;12463:16:0;;;-1:-1:-1;;;;;;;;;17688:1350:0:o;15996:124::-;16074:4;16064:7;;:14;;;;;;;:::i;:::-;;;;-1:-1:-1;;16090:11:0;:22;;16108:4;;16090:11;:15;;:22;;16108:4;;16090:22;:::i;:::-;;;;-1:-1:-1;;;;15996:124:0:o;24745:277::-;24848:9;24825:11;:20;;;:32;;;;;;;:::i;:::-;;;;-1:-1:-1;;24893:4:0;24873:26;;;;:11;:26;;;;;;;;24870:100;;;24941:4;24925:22;;;;:7;:22;;;;;:33;;24949:9;;24925:22;:33;;24949:9;;24925:33;:::i;:::-;;;;-1:-1:-1;;24870:100:0;24996:4;24980:22;;;;:7;:22;;;;;:34;;25005:9;;24980:22;:34;;25005:9;;24980:34;:::i;25030:306::-;25129:8;25107:11;:19;;;:30;;;;;;;:::i;:::-;;;;-1:-1:-1;;25173:16:0;;-1:-1:-1;;;;;25173:16:0;25153:38;;;;:11;:38;;;;;;;;25150:123;;;25233:16;;-1:-1:-1;;;;;25233:16:0;25217:34;;;;:7;:34;;;;;:44;;25253:8;;25217:34;:44;;25253:8;;25217:44;:::i;:::-;;;;-1:-1:-1;;25150:123:0;25299:16;;-1:-1:-1;;;;;25299:16:0;25283:34;;;;:7;:34;;;;;:45;;25320:8;;25283:34;:45;;25320:8;;25283:45;:::i;25767:210::-;25839:4;25864:6;:22;;;;-1:-1:-1;25874:7:0;;:12;25864:22;25863:57;;;;25892:10;:27;;;;-1:-1:-1;25906:8:0;;:13;25892:27;25863:105;;;;25926:6;25925:7;:22;;;;;25937:10;25936:11;25925:22;:42;;;;-1:-1:-1;;25951:11:0;;:16;;25767:210;-1:-1:-1;;25767:210:0:o;19397:434::-;19487:16;;;19501:1;19487:16;;;;;;;;19463:21;;19487:16;;;;;;;;;;-1:-1:-1;19487:16:0;19463:40;;19532:4;19514;19519:1;19514:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;19514:23:0;;;:7;;;;;;;;;;:23;;;;19558:6;;:13;;;-1:-1:-1;;;19558:13:0;;;;:6;;;;;:11;;:13;;;;;19514:7;;19558:13;;;;;:6;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19548:4;19553:1;19548:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;19548:23:0;;;:7;;;;;;;;;:23;19614:6;;19582:53;;19599:4;;19614:6;19623:11;19582:8;:53::i;:::-;19646:6;;:177;;-1:-1:-1;;;19646:177:0;;-1:-1:-1;;;;;19646:6:0;;;;:57;;:177;;19718:11;;19646:6;;19760:4;;19787;;19807:15;;19646:177;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19452:379;19397:434;:::o;19046:343::-;19159:6;;19127:53;;19144:4;;-1:-1:-1;;;;;19159:6:0;19168:11;19127:8;:53::i;:::-;19191:6;;19332:18;;19191:190;;-1:-1:-1;;;19191:190:0;;19254:4;19191:190;;;17026:34:1;17076:18;;;17069:34;;;-1:-1:-1;17119:18:1;;;17112:34;;;17162:18;;;17155:34;-1:-1:-1;;;;;19191:6:0;19332:18;;;;;17205:19:1;;;17198:44;19365:15:0;17258:19:1;;;17251:35;19191:6:0;;;:22;;19221:9;;16960:19:1;;19191:190:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;196:131:1:-;-1:-1:-1;;;;;271:31:1;;261:42;;251:70;;317:1;314;307:12;251:70;196:131;:::o;332:247::-;391:6;444:2;432:9;423:7;419:23;415:32;412:52;;;460:1;457;450:12;412:52;499:9;486:23;518:31;543:5;518:31;:::i;584:548::-;696:4;725:2;754;743:9;736:21;786:6;780:13;829:6;824:2;813:9;809:18;802:34;854:1;864:140;878:6;875:1;872:13;864:140;;;973:14;;;969:23;;963:30;939:17;;;958:2;935:26;928:66;893:10;;864:140;;;868:3;1053:1;1048:2;1039:6;1028:9;1024:22;1020:31;1013:42;1123:2;1116;1112:7;1107:2;1099:6;1095:15;1091:29;1080:9;1076:45;1072:54;1064:62;;;;584:548;;;;:::o;1137:315::-;1205:6;1213;1266:2;1254:9;1245:7;1241:23;1237:32;1234:52;;;1282:1;1279;1272:12;1234:52;1321:9;1308:23;1340:31;1365:5;1340:31;:::i;:::-;1390:5;1442:2;1427:18;;;;1414:32;;-1:-1:-1;;;1137:315:1:o;1857:456::-;1934:6;1942;1950;2003:2;1991:9;1982:7;1978:23;1974:32;1971:52;;;2019:1;2016;2009:12;1971:52;2058:9;2045:23;2077:31;2102:5;2077:31;:::i;:::-;2127:5;-1:-1:-1;2184:2:1;2169:18;;2156:32;2197:33;2156:32;2197:33;:::i;:::-;1857:456;;2249:7;;-1:-1:-1;;;2303:2:1;2288:18;;;;2275:32;;1857:456::o;2318:180::-;2377:6;2430:2;2418:9;2409:7;2405:23;2401:32;2398:52;;;2446:1;2443;2436:12;2398:52;-1:-1:-1;2469:23:1;;2318:180;-1:-1:-1;2318:180:1:o;2692:118::-;2778:5;2771:13;2764:21;2757:5;2754:32;2744:60;;2800:1;2797;2790:12;2815:309;2880:6;2888;2941:2;2929:9;2920:7;2916:23;2912:32;2909:52;;;2957:1;2954;2947:12;2909:52;2993:9;2980:23;2970:33;;3053:2;3042:9;3038:18;3025:32;3066:28;3088:5;3066:28;:::i;:::-;3113:5;3103:15;;;2815:309;;;;;:::o;3129:241::-;3185:6;3238:2;3226:9;3217:7;3213:23;3209:32;3206:52;;;3254:1;3251;3244:12;3206:52;3293:9;3280:23;3312:28;3334:5;3312:28;:::i;3375:382::-;3440:6;3448;3501:2;3489:9;3480:7;3476:23;3472:32;3469:52;;;3517:1;3514;3507:12;3469:52;3556:9;3543:23;3575:28;3597:5;3575:28;:::i;:::-;3622:5;-1:-1:-1;3679:2:1;3664:18;;3651:32;3692:33;3651:32;3692:33;:::i;3762:661::-;3884:6;3892;3900;3908;3916;3924;3932;3940;3993:3;3981:9;3972:7;3968:23;3964:33;3961:53;;;4010:1;4007;4000:12;3961:53;-1:-1:-1;;4033:23:1;;;4103:2;4088:18;;4075:32;;-1:-1:-1;4154:2:1;4139:18;;4126:32;;4205:2;4190:18;;4177:32;;-1:-1:-1;4256:3:1;4241:19;;4228:33;;-1:-1:-1;4308:3:1;4293:19;;4280:33;;-1:-1:-1;4360:3:1;4345:19;;4332:33;;-1:-1:-1;4412:3:1;4397:19;4384:33;;-1:-1:-1;3762:661:1;-1:-1:-1;3762:661:1:o;4428:382::-;4493:6;4501;4554:2;4542:9;4533:7;4529:23;4525:32;4522:52;;;4570:1;4567;4560:12;4522:52;4609:9;4596:23;4628:31;4653:5;4628:31;:::i;:::-;4678:5;-1:-1:-1;4735:2:1;4720:18;;4707:32;4748:30;4707:32;4748:30;:::i;4815:813::-;4910:6;4918;4926;4934;4942;4995:3;4983:9;4974:7;4970:23;4966:33;4963:53;;;5012:1;5009;5002:12;4963:53;5051:9;5038:23;5070:31;5095:5;5070:31;:::i;:::-;5120:5;-1:-1:-1;5177:2:1;5162:18;;5149:32;5190:33;5149:32;5190:33;:::i;:::-;5242:7;-1:-1:-1;5301:2:1;5286:18;;5273:32;5314:33;5273:32;5314:33;:::i;:::-;5366:7;-1:-1:-1;5425:2:1;5410:18;;5397:32;5438:33;5397:32;5438:33;:::i;:::-;5490:7;-1:-1:-1;5549:3:1;5534:19;;5521:33;5563;5521;5563;:::i;:::-;5615:7;5605:17;;;4815:813;;;;;;;;:::o;5633:315::-;5701:6;5709;5762:2;5750:9;5741:7;5737:23;5733:32;5730:52;;;5778:1;5775;5768:12;5730:52;5814:9;5801:23;5791:33;;5874:2;5863:9;5859:18;5846:32;5887:31;5912:5;5887:31;:::i;5953:248::-;6021:6;6029;6082:2;6070:9;6061:7;6057:23;6053:32;6050:52;;;6098:1;6095;6088:12;6050:52;-1:-1:-1;;6121:23:1;;;6191:2;6176:18;;;6163:32;;-1:-1:-1;5953:248:1:o;6206:388::-;6274:6;6282;6335:2;6323:9;6314:7;6310:23;6306:32;6303:52;;;6351:1;6348;6341:12;6303:52;6390:9;6377:23;6409:31;6434:5;6409:31;:::i;6599:316::-;6676:6;6684;6692;6745:2;6733:9;6724:7;6720:23;6716:32;6713:52;;;6761:1;6758;6751:12;6713:52;-1:-1:-1;;6784:23:1;;;6854:2;6839:18;;6826:32;;-1:-1:-1;6905:2:1;6890:18;;;6877:32;;6599:316;-1:-1:-1;6599:316:1:o;7403:329::-;7605:2;7587:21;;;7644:1;7624:18;;;7617:29;-1:-1:-1;;;7677:2:1;7662:18;;7655:36;7723:2;7708:18;;7403:329::o;8089:127::-;8150:10;8145:3;8141:20;8138:1;8131:31;8181:4;8178:1;8171:15;8205:4;8202:1;8195:15;8221:127;8282:10;8277:3;8273:20;8270:1;8263:31;8313:4;8310:1;8303:15;8337:4;8334:1;8327:15;8353:128;8420:9;;;8441:11;;;8438:37;;;8455:18;;:::i;8486:127::-;8547:10;8542:3;8538:20;8535:1;8528:31;8578:4;8575:1;8568:15;8602:4;8599:1;8592:15;9385:217;9425:1;9451;9441:132;;9495:10;9490:3;9486:20;9483:1;9476:31;9530:4;9527:1;9520:15;9558:4;9555:1;9548:15;9441:132;-1:-1:-1;9587:9:1;;9385:217::o;9607:125::-;9672:9;;;9693:10;;;9690:36;;;9706:18;;:::i;10519:184::-;10589:6;10642:2;10630:9;10621:7;10617:23;10613:32;10610:52;;;10658:1;10655;10648:12;10610:52;-1:-1:-1;10681:16:1;;10519:184;-1:-1:-1;10519:184:1:o;10987:245::-;11054:6;11107:2;11095:9;11086:7;11082:23;11078:32;11075:52;;;11123:1;11120;11113:12;11075:52;11155:9;11149:16;11174:28;11196:5;11174:28;:::i;12261:168::-;12334:9;;;12365;;12382:15;;;12376:22;;12362:37;12352:71;;12403:18;;:::i;14857:251::-;14927:6;14980:2;14968:9;14959:7;14955:23;14951:32;14948:52;;;14996:1;14993;14986:12;14948:52;15028:9;15022:16;15047:31;15072:5;15047:31;:::i;15113:465::-;15166:3;15204:5;15198:12;15231:6;15226:3;15219:19;15257:4;15286;15281:3;15277:14;15270:21;;15325:4;15318:5;15314:16;15348:1;15358:195;15372:6;15369:1;15366:13;15358:195;;;15437:13;;-1:-1:-1;;;;;15433:39:1;15421:52;;15493:12;;;;15528:15;;;;15469:1;15387:9;15358:195;;;-1:-1:-1;15569:3:1;;15113:465;-1:-1:-1;;;;;15113:465:1:o;15583:510::-;15854:6;15843:9;15836:25;15897:3;15892:2;15881:9;15877:18;15870:31;15817:4;15918:57;15970:3;15959:9;15955:19;15947:6;15918:57;:::i;:::-;-1:-1:-1;;;;;16011:32:1;;;;16006:2;15991:18;;15984:60;-1:-1:-1;16075:2:1;16060:18;16053:34;15910:65;15583:510;-1:-1:-1;;15583:510:1:o;16098:582::-;16397:6;16386:9;16379:25;16440:6;16435:2;16424:9;16420:18;16413:34;16483:3;16478:2;16467:9;16463:18;16456:31;16360:4;16504:57;16556:3;16545:9;16541:19;16533:6;16504:57;:::i;:::-;-1:-1:-1;;;;;16597:32:1;;;;16592:2;16577:18;;16570:60;-1:-1:-1;16661:3:1;16646:19;16639:35;16496:65;16098:582;-1:-1:-1;;;16098:582:1:o;17297:306::-;17385:6;17393;17401;17454:2;17442:9;17433:7;17429:23;17425:32;17422:52;;;17470:1;17467;17460:12;17422:52;17499:9;17493:16;17483:26;;17549:2;17538:9;17534:18;17528:25;17518:35;;17593:2;17582:9;17578:18;17572:25;17562:35;;17297:306;;;;;:::o

Swarm Source

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