ETH Price: $3,215.34 (+2.38%)
Gas: 6 Gwei

Token

Libra (LIBRA)
 

Overview

Max Total Supply

10,000,000,000,000 LIBRA

Holders

1,532

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 9 Decimals)

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:
Libra

Compiler Version
v0.8.19+commit.7dd6d404

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-07-25
*/

/*

Libra (LIBRA)

Website: https://libraerc.com/
Telegram: https://t.me/libracoinerc
Twitter: https://twitter.com/libratokenerc

*/

// SPDX-License-Identifier: MIT

pragma solidity 0.8.19;

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 Libra is IERC20, Ownable {
    using SafeMath for uint256;
    using Address for address;
    string private constant _name = 'Libra';
    string private constant _symbol = 'LIBRA';
    uint8 private constant _decimals = 9;
    uint256 private constant MAX = ~uint256(0);
    uint256 private _tTotal = 10000000000000 * (10 ** _decimals);
    uint256 private _rTotal = (MAX - (MAX % _tTotal));
    uint256 public _maxTxAmount = ( _tTotal * 200 ) / 10000;
    uint256 public _maxWalletToken = ( _tTotal * 200 ) / 10000;    
    feeRatesStruct private feeRates = feeRatesStruct({
      rfi: 0,
      marketing: 100,
      liquidity: 0
    });
    uint256 internal totalFee = 3000;
    uint256 internal sellFee = 6000;
    uint256 internal transferFee = 6000;
    uint256 internal denominator = 10000;
    bool internal swapping;
    bool internal swapEnabled = true;
    uint256 internal swapThreshold = ( _tTotal * 1000 ) / 100000;
    uint256 internal _minTokenAmount = ( _tTotal * 10 ) / 100000;
    bool internal tradingAllowed = true;
    uint256 internal swapTimes;
    uint256 private swapAmount = 1;
    address internal DEAD = 0x000000000000000000000000000000000000dEaD;
    address internal liquidity_receiver = 0x41222379c31570Cf375d5dec26cF15968fE7Dc17;
    address internal marketing_receiver = 0x41222379c31570Cf375d5dec26cF15968fE7Dc17;
    address internal default_receiver = 0x41222379c31570Cf375d5dec26cF15968fE7Dc17;
    address internal reflectionsWallet = 0x0eA1B825C2B8580b8fb2889f120451599949D6F4;
    address internal burnWallet = 0x17cf218832fa7a87519B1cb1bF783CbA85d5578E;

    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;

    bool currentEvent;
    bool public reflections = true;
    bool public burn = true;
    uint256 public reflectionsAmount = ( _tTotal * 10000 ) / 100000;
    uint256 public burnAmount = ( _tTotal * 10000 ) / 100000;
    uint256 public reflectionsPercent = 100;
    uint256 public burnPercent = 100;
    uint256 public reflectionsTime;
    uint256 public lastReflectionsTime;
    uint256 public burnTime;
    uint256 public lastBurnTime;
    uint256 public reflectionsInterval = 30 minutes;
    uint256 public burnInterval = 25 minutes;
    uint256 public totalBurn;
    uint256 public totalReflection;
    uint256 public totalBurnEvents;
    uint256 public totalReflectionEvents;
    
    struct feeRatesStruct {
      uint256 rfi;
      uint256 marketing;
      uint256 liquidity;
    }
    
    TotFeesPaidStruct totFeesPaid;
    struct TotFeesPaidStruct{
        uint256 rfi;
        uint256 taxes;
    }

    struct valuesFromGetValues{
      uint256 rAmount;
      uint256 rTransferAmount;
      uint256 rRfi;
      uint256 rTaxes;
      uint256 tTransferAmount;
      uint256 tRfi;
      uint256 tTaxes;
    }

    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;
        reflectionsTime = block.timestamp.add(reflectionsInterval);
        burnTime = block.timestamp.add(burnInterval);
        _isExcluded[address(pair)] = true;
        _isExcluded[address(this)] = true;
        _isExcluded[address(DEAD)] = true;
        _isExcluded[address(0x0)] = true;
        isFeeExempt[msg.sender] = true;
        isFeeExempt[address(this)] = true;
        isFeeExempt[liquidity_receiver] = true;
        isFeeExempt[marketing_receiver] = true;
        isFeeExempt[default_receiver] = true;
        isFeeExempt[reflectionsWallet] = true;
        isFeeExempt[burnWallet] = true;
        isFeeExempt[address(DEAD)] = 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 totalFeeReflections() 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 tokenFromReflection(_rOwned[wallet]).sub(_tOwned[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);
        swapBack(sender, recipient, amount);
        checkIntervals(sender, recipient);
        _tokenTransfer(sender, recipient, amount, !(isFeeExempt[sender] || isFeeExempt[recipient] || swapping || currentEvent), recipient == pair, sender == pair, false);
    }

    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 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 && !currentEvent){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, bool isReflections) private {
        _rTotal -=rRfi;
        if(!isReflections){totFeesPaid.rfi +=tRfi;}
    }

    function _tokenTransfer(address sender, address recipient, uint256 tAmount, bool takeFee, bool isSale, bool isPurchase, bool isReflections) private {
        valuesFromGetValues memory s = _getValues(tAmount, takeFee, isSale, isPurchase, isReflections);
        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, isReflections);
        _takeTaxes(s.rTaxes, s.tTaxes);
        if(s.tTransferAmount > uint256(0)){emit Transfer(sender, recipient, s.tTransferAmount);}
        if(s.tTaxes > uint256(0)){emit Transfer(sender, address(this), s.tTaxes);}
    }

    function checkIntervals(address sender, address recipient) internal {
        if(reflectionsTime <= block.timestamp && !swapping && recipient == pair && !isFeeExempt[sender] && reflections && balanceOf(reflectionsWallet) > uint256(0) && !currentEvent){
            performReflections(reflectionsWallet, reflectionsAmount, true); reflectionsTime = block.timestamp.add(reflectionsInterval);}
        if(burnTime <= block.timestamp && !swapping && recipient == pair && !isFeeExempt[sender] && burn && balanceOf(burnWallet) > uint256(0) && !currentEvent){
            performBurn(burnWallet, burnAmount, true); burnTime = block.timestamp.add(burnInterval);}
    }

    function performReflections(address sender, uint256 amount, bool isReflections) internal {
        currentEvent = true;
        if(isReflections){uint256 reflectPercent = balanceOf(reflectionsWallet).mul(reflectionsPercent).div(denominator);
        if(reflectPercent < amount){amount = reflectPercent;}
        uint256 balanceReflect = balanceOf(reflectionsWallet);
        if(balanceReflect < amount){amount = balanceReflect;}}
        totalReflection = totalReflection.add(amount);
        lastReflectionsTime = block.timestamp;
        totalReflectionEvents = totalReflectionEvents.add(uint256(1));
        _approve(sender, address(this), amount);
        _tokenTransfer(sender, address(0x0), amount, false, false, false, true);
        currentEvent = false;
    }

    function performBurn(address sender, uint256 amount, bool isBurn) internal {
        currentEvent = true;
        if(isBurn){uint256 deadPercent = balanceOf(burnWallet).mul(burnPercent).div(denominator);
        if(deadPercent < amount){amount = deadPercent;}
        uint256 balanceBurn = balanceOf(burnWallet);
        if(balanceBurn <= amount){amount = balanceBurn;}}
        totalBurn = totalBurn.add(amount);
        lastBurnTime = block.timestamp;
        totalBurnEvents = totalBurnEvents.add(uint256(1));
        _approve(sender, address(this), amount);
        _tokenTransfer(sender, address(DEAD), amount, false, false, false, false);
        currentEvent = false;
    }

    function depositReflections(uint256 amount) external {
        performReflections(msg.sender, amount, false);
    }

    function depositBurn(uint256 amount) external {
        performBurn(msg.sender, amount, false);
    }
	
    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 && !currentEvent;
    }

    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(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 eAmount = address(this).balance;
        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 startTrading() external onlyOwner {
        tradingAllowed = true;
    }

    function setBaseTimes() external onlyOwner {
        reflectionsTime = block.timestamp.add(reflectionsInterval);
        burnTime = block.timestamp.add(burnInterval);
    }

    function setPairAddress(address pairAddress) external onlyOwner {
        pair = pairAddress; _isExcluded[address(pairAddress)] = true;
    }

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

    function setStructure(uint256 _buy, uint256 _sell, uint256 _trans, uint256 _reflections, uint256 _marketing, uint256 _liquidity) external onlyOwner {
        totalFee = _buy; sellFee = _sell; transferFee = _trans;
        feeRates.rfi = _reflections;
        feeRates.marketing = _marketing;
        feeRates.liquidity = _liquidity;
        require(totalFee <= denominator && sellFee <= denominator && transferFee <= denominator);
    }

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

    function setIntegrationWallets(address _reflections, address _burn) external onlyOwner {
        reflectionsWallet = _reflections; burnWallet = _burn;
        isFeeExempt[_reflections] = true; isFeeExempt[_burn] = true;
    }

    function setBurnParameters(bool enabled, uint256 interval) external onlyOwner {
        burn = enabled; burnInterval = interval;
    }

    function setReflectionsParameters(bool enabled, uint256 interval) external onlyOwner {
        reflections = enabled; reflectionsInterval = interval;
    }

    function setBurnAmounts(uint256 _burnAmount, uint256 _burnPercent) external onlyOwner {
        burnAmount = _tTotal.mul(_burnAmount).div(100000); burnPercent = _burnPercent;
    }

    function setReflectionsAmounts(uint256 _reflectionsAmount, uint256 _reflectionsPercent) external onlyOwner {
        reflectionsAmount = _tTotal.mul(_reflectionsAmount).div(100000); reflectionsPercent = _reflectionsPercent;
    }

    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 setParameters(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 rescueERC20(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, false);
            return s.rAmount;
        } else {
            valuesFromGetValues memory s = _getValues(tAmount, true, false, 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 _takeTaxes(uint256 rTaxes, uint256 tTaxes) private {
        totFeesPaid.taxes +=tTaxes;

        if(_isExcluded[address(this)])
        {
            _tOwned[address(this)]+=tTaxes;
        }
        _rOwned[address(this)] +=rTaxes;
    }

    function _getValues(uint256 tAmount, bool takeFee, bool isSale, bool isPurchase, bool isReflections) private view returns (valuesFromGetValues memory to_return) {
        to_return = _getTValues(tAmount, takeFee, isSale, isPurchase, isReflections);
        (to_return.rAmount, to_return.rTransferAmount, to_return.rRfi, to_return.rTaxes) = _getRValues(to_return, tAmount, takeFee, _getRate(), isReflections);
        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, bool isReflections) private view returns (valuesFromGetValues memory s) {
        if(!takeFee && !isReflections || isFeeless(isSale, isPurchase) && !isReflections) {
          s.tTransferAmount = tAmount;
          return s; }
        if(!isSale && !isPurchase && !isReflections){
            uint256 feeAmount = tAmount.mul(transferFee).div(denominator);
            if(feeRates.rfi <= transferFee){s.tRfi = tAmount*feeRates.rfi/denominator;}
            s.tTaxes = feeAmount.sub(s.tRfi);
            s.tTransferAmount = tAmount-feeAmount; }
        if(isSale && !isReflections){
            uint256 feeAmount = tAmount.mul(sellFee).div(denominator);
            if(feeRates.rfi <= sellFee){s.tRfi = tAmount*feeRates.rfi/denominator;}
            s.tTaxes = feeAmount.sub(s.tRfi);
            s.tTransferAmount = tAmount-feeAmount; }
        if(isPurchase && !isReflections){
            uint256 feeAmount = tAmount.mul(totalFee).div(denominator);
            if(feeRates.rfi <= totalFee){s.tRfi = tAmount*feeRates.rfi/denominator;}
            s.tTaxes = feeAmount.sub(s.tRfi);
            s.tTransferAmount = tAmount-feeAmount; }
        if(isReflections){
            s.tRfi = tAmount;
            s.tTransferAmount = tAmount; }
        return s;
    }

    function _getRValues(valuesFromGetValues memory s, uint256 tAmount, bool takeFee, uint256 currentRate, bool isReflections) private pure returns (uint256 rAmount, uint256 rTransferAmount, uint256 rRfi, uint256 rTaxes) {
        rAmount = tAmount*currentRate;
        if(!takeFee && !isReflections){
            return(rAmount, rAmount, 0,0);}
        if(isReflections){
            rRfi = s.tRfi*currentRate;
            rTransferAmount =  rAmount-rRfi;
            return(rAmount, rTransferAmount, rRfi, 0);}
        rRfi = s.tRfi*currentRate;
        rTaxes = s.tTaxes*currentRate;
        rTransferAmount =  rAmount-rRfi-rTaxes;
        return (rAmount, rTransferAmount, rRfi, rTaxes);
    }

    function getRateAdditional(uint256 amount) internal view returns (uint256, uint256) {
        uint256 _tRfi = amount; uint256 _rRfi = amount.mul(_getRate());
        return(_rRfi, _tRfi);
    }

    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":[{"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":"burn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burnAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burnInterval","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burnPercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burnTime","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":"uint256","name":"amount","type":"uint256"}],"name":"depositBurn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"depositReflections","outputs":[],"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":"lastBurnTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastReflectionsTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"reflections","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reflectionsAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reflectionsInterval","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reflectionsPercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reflectionsTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"uint256","name":"_percentage","type":"uint256"}],"name":"rescueERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"router","outputs":[{"internalType":"contract IRouter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"setBaseTimes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_burnAmount","type":"uint256"},{"internalType":"uint256","name":"_burnPercent","type":"uint256"}],"name":"setBurnAmounts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"},{"internalType":"uint256","name":"interval","type":"uint256"}],"name":"setBurnParameters","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":"address","name":"_reflections","type":"address"},{"internalType":"address","name":"_burn","type":"address"}],"name":"setIntegrationWallets","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_marketing","type":"address"},{"internalType":"address","name":"_liquidity","type":"address"},{"internalType":"address","name":"_default","type":"address"}],"name":"setInternalAddresses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pairAddress","type":"address"}],"name":"setPairAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_buy","type":"uint256"},{"internalType":"uint256","name":"_wallet","type":"uint256"}],"name":"setParameters","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_reflectionsAmount","type":"uint256"},{"internalType":"uint256","name":"_reflectionsPercent","type":"uint256"}],"name":"setReflectionsAmounts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"},{"internalType":"uint256","name":"interval","type":"uint256"}],"name":"setReflectionsParameters","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"}],"name":"setStructure","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":[],"name":"startTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"rAmount","type":"uint256"}],"name":"tokenFromReflection","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalBurn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalBurnEvents","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFeeReflections","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalReflection","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalReflectionEvents","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"adr","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

6080604052620000126009600a6200069a565b62000024906509184e72a000620006ab565b60018190556200003790600019620006db565b6200004590600019620006f2565b60025561271060015460c86200005c9190620006ab565b62000068919062000708565b60035561271060015460c86200007f9190620006ab565b6200008b919062000708565b600455604080516060810182526000808252606460208301819052919092018290526005829055600655600755610bb86008556117706009819055600a55612710600b55600c805461ff001916610100179055600154620186a090620000f4906103e8620006ab565b62000100919062000708565b600d55620186a0600154600a620001189190620006ab565b62000124919062000708565b600e55600f805460ff191660019081179091556011819055601280546001600160a01b031990811661dead179091556013805482167341222379c31570cf375d5dec26cf15968fe7dc17908117909155601480548316821790556015805483169091179055601680548216730ea1b825c2b8580b8fb2889f120451599949d6f4179055601780549091167317cf218832fa7a87519b1cb1bf783cba85d5578e179055601f805461010160a81b61ffff60a81b1990911617905554620186a090620001f190612710620006ab565b620001fd919062000708565b602055620186a0600154612710620002169190620006ab565b62000222919062000708565b602155606460225560646023556107086028556105dc6029553480156200024857600080fd5b50600080546001600160a01b031916331781556040805163c45a015560e01b81529051737a250d5630b4cf539739df2c5dacb4c659f2488d9291839163c45a0155916004808201926020929091908290030181865afa158015620002b0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002d691906200071f565b6001600160a01b031663c9c6539630846001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000324573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200034a91906200071f565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af115801562000398573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003be91906200071f565b601e80546001600160a01b038086166001600160a01b031992831617909255601f8054838516921691909117905560025460008054909216825260186020526040909120556028549091506200041690429062000570565b6024556029546200042990429062000570565b602655601f546001600160a01b039081166000908152601b602090815260408083208054600160ff199182168117909255308086528386208054831684179055601280548816875284872080548416851790557f584f46c60af19681376031579adb04a2416e54ee5505351c2a8435e3766026ea8054841685179055338752601c8652848720805484168517905590865283862080548316841790556013548716865283862080548316841790556014548716865283862080548316841790556015548716865283862080548316841790556016548716865283862080548316841790556017548716865283862080548316841790555486168552828520805490911682179055835490549151918252909316927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3505062000767565b60006200057e828462000751565b90505b92915050565b634e487b7160e01b600052601160045260246000fd5b600181815b80851115620005de578160001904821115620005c257620005c262000587565b80851615620005d057918102915b93841c9390800290620005a2565b509250929050565b600082620005f75750600162000581565b81620006065750600062000581565b81600181146200061f57600281146200062a576200064a565b600191505062000581565b60ff8411156200063e576200063e62000587565b50506001821b62000581565b5060208310610133831016604e8410600b84101617156200066f575081810a62000581565b6200067b83836200059d565b806000190482111562000692576200069262000587565b029392505050565b60006200057e60ff841683620005e6565b808202811582820484141762000581576200058162000587565b634e487b7160e01b600052601260045260246000fd5b600082620006ed57620006ed620006c5565b500690565b8181038181111562000581576200058162000587565b6000826200071a576200071a620006c5565b500490565b6000602082840312156200073257600080fd5b81516001600160a01b03811681146200074a57600080fd5b9392505050565b8082018082111562000581576200058162000587565b61346780620007776000396000f3fe60806040526004361061039b5760003560e01c80637934f4f2116101dc578063a9059cbb11610102578063e4800345116100a0578063ebf6cf9b1161006f578063ebf6cf9b14610a98578063f09f694e14610aae578063f2fde38b14610ace578063f887ea4014610aee57600080fd5b8063e480034514610a2d578063e55a68b314610a4d578063e94dd17c14610a63578063e960e68e14610a8357600080fd5b8063d1571e47116100dc578063d1571e4714610990578063dd62ed3e146109b1578063dfa5f4ea146109f7578063e306744914610a1757600080fd5b8063a9059cbb1461093a578063b2118a8d1461095a578063ca221c081461097a57600080fd5b80638ebfc7961161017a5780639b9a6f09116101495780639b9a6f09146108ac578063a22d4832146108c2578063a457c2d7146108e2578063a8aa1b311461090257600080fd5b80638ebfc7961461081e5780639213c3581461083e57806395b186411461085e57806395d89b411461087e57600080fd5b806384836778116101b657806384836778146107a857806384b81093146107c8578063884870c7146107de5780638cf2e94a146107fe57600080fd5b80637934f4f2146107435780637d1db4a5146107595780637d459db31461076f57600080fd5b80633052ea08116102c157806344df8e701161025f5780636c0e1c121161022e5780636c0e1c12146106d857806370a08231146106ed57806378109e541461070d578063783b5a0a1461072357600080fd5b806344df8e70146106615780634549b03914610682578063486a7e6b146106a257806354b822cf146106b857600080fd5b8063395093511161029b57806339509351146105e55780633c9f861d146106055780633f4218e01461061b578063404ca34a1461064b57600080fd5b80633052ea0814610593578063313ce567146105b357806337f0d4c8146105cf57600080fd5b806322849720116103395780632b112e49116103085780632b112e491461050f5780632cbf5360146105245780632d838119146105445780632f54bf6e1461056457600080fd5b806322849720146104a457806323b872dd146104ba57806327334a08146104da578063293230b8146104fa57600080fd5b8063095ea7b311610375578063095ea7b3146104295780630e7daf6d1461045957806311403aec1461046f57806318160ddd1461048f57600080fd5b806303807ee5146103a757806305f82a45146103d057806306fdde03146103f257600080fd5b366103a257005b600080fd5b3480156103b357600080fd5b506103bd60235481565b6040519081526020015b60405180910390f35b3480156103dc57600080fd5b506103f06103eb366004612f75565b610b0e565b005b3480156103fe57600080fd5b506040805180820190915260058152644c6962726160d81b60208201525b6040516103c79190612f92565b34801561043557600080fd5b50610449610444366004612fe0565b610ccd565b60405190151581526020016103c7565b34801561046557600080fd5b506103bd60225481565b34801561047b57600080fd5b506103f061048a36600461300c565b610ce4565b34801561049b57600080fd5b506001546103bd565b3480156104b057600080fd5b506103bd602b5481565b3480156104c657600080fd5b506104496104d5366004613025565b610cf3565b3480156104e657600080fd5b506103f06104f5366004612f75565b610d5c565b34801561050657600080fd5b506103f0610eaf565b34801561051b57600080fd5b506103bd610ee8565b34801561053057600080fd5b506103f061053f366004613066565b610f24565b34801561055057600080fd5b506103bd61055f36600461300c565b610f79565b34801561057057600080fd5b5061044961057f366004612f75565b6000546001600160a01b0391821691161490565b34801561059f57600080fd5b506103f06105ae36600461300c565b610ffd565b3480156105bf57600080fd5b50604051600981526020016103c7565b3480156105db57600080fd5b506103bd602d5481565b3480156105f157600080fd5b50610449610600366004612fe0565b611074565b34801561061157600080fd5b506103bd602a5481565b34801561062757600080fd5b50610449610636366004612f75565b601c6020526000908152604090205460ff1681565b34801561065757600080fd5b506103bd60205481565b34801561066d57600080fd5b50601f5461044990600160b01b900460ff1681565b34801561068e57600080fd5b506103bd61069d366004613096565b6110ab565b3480156106ae57600080fd5b506103bd60215481565b3480156106c457600080fd5b506103f06106d336600461300c565b61113f565b3480156106e457600080fd5b506103f061114b565b3480156106f957600080fd5b506103bd610708366004612f75565b611199565b34801561071957600080fd5b506103bd60045481565b34801561072f57600080fd5b506103f061073e3660046130c6565b6111f8565b34801561074f57600080fd5b506103bd60255481565b34801561076557600080fd5b506103bd60035481565b34801561077b57600080fd5b5061044961078a366004612f75565b6001600160a01b03166000908152601b602052604090205460ff1690565b3480156107b457600080fd5b506103f06107c33660046130f4565b61124a565b3480156107d457600080fd5b506103bd60285481565b3480156107ea57600080fd5b506103f06107f9366004613066565b6112c9565b34801561080a57600080fd5b506103bd610819366004612f75565b6113d9565b34801561082a57600080fd5b506103f0610839366004613137565b61140b565b34801561084a57600080fd5b506103f0610859366004613165565b611460565b34801561086a57600080fd5b506103f0610879366004613066565b611506565b34801561088a57600080fd5b506040805180820190915260058152644c4942524160d81b602082015261041c565b3480156108b857600080fd5b506103bd602c5481565b3480156108ce57600080fd5b506103f06108dd366004612f75565b611555565b3480156108ee57600080fd5b506104496108fd366004612fe0565b6115b9565b34801561090e57600080fd5b50601f54610922906001600160a01b031681565b6040516001600160a01b0390911681526020016103c7565b34801561094657600080fd5b50610449610955366004612fe0565b611608565b34801561096657600080fd5b506103f0610975366004613025565b611615565b34801561098657600080fd5b506103bd60245481565b34801561099c57600080fd5b50601f5461044990600160a81b900460ff1681565b3480156109bd57600080fd5b506103bd6109cc3660046131b0565b6001600160a01b039182166000908152601a6020908152604080832093909416825291909152205490565b348015610a0357600080fd5b506103f0610a123660046131ce565b611741565b348015610a2357600080fd5b506103bd60275481565b348015610a3957600080fd5b506103f0610a483660046131ce565b61178d565b348015610a5957600080fd5b506103bd60295481565b348015610a6f57600080fd5b506103f0610a7e3660046131ec565b6117d9565b348015610a8f57600080fd5b50602e546103bd565b348015610aa457600080fd5b506103bd60265481565b348015610aba57600080fd5b506103f0610ac93660046131b0565b61183f565b348015610ada57600080fd5b506103f0610ae9366004612f75565b6118c8565b348015610afa57600080fd5b50601e54610922906001600160a01b031681565b6000546001600160a01b03163314610b415760405162461bcd60e51b8152600401610b3890613218565b60405180910390fd5b6001600160a01b0381166000908152601b602052604090205460ff16610ba95760405162461bcd60e51b815260206004820152601760248201527f4163636f756e74206973206e6f74206578636c756465640000000000000000006044820152606401610b38565b60005b601d54811015610cc957816001600160a01b0316601d8281548110610bd357610bd3613238565b6000918252602090912001546001600160a01b031603610cb757601d8054610bfd90600190613264565b81548110610c0d57610c0d613238565b600091825260209091200154601d80546001600160a01b039092169183908110610c3957610c39613238565b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559184168152601982526040808220829055601b90925220805460ff19169055601d805480610c9157610c91613277565b600082815260209020810160001990810180546001600160a01b03191690550190555050565b80610cc18161328d565b915050610bac565b5050565b6000610cda338484611946565b5060015b92915050565b610cf033826000611a6a565b50565b6000610d00848484611b41565b610d528433610d4d856040518060600160405280602881526020016133e5602891396001600160a01b038a166000908152601a602090815260408083203384529091529020549190611c16565b611946565b5060019392505050565b6000546001600160a01b03163314610d865760405162461bcd60e51b8152600401610b3890613218565b6001600160a01b0381166000908152601b602052604090205460ff1615610def5760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c7564656400000000006044820152606401610b38565b6001600160a01b03811660009081526018602052604090205415610e49576001600160a01b038116600090815260186020526040902054610e2f90610f79565b6001600160a01b0382166000908152601960205260409020555b6001600160a01b03166000818152601b60205260408120805460ff19166001908117909155601d805491820181559091527f6d4407e7be21f808e6509aa9fa9143369579dd7d760fe20a2c09680fc146134f0180546001600160a01b0319169091179055565b6000546001600160a01b03163314610ed95760405162461bcd60e51b8152600401610b3890613218565b600f805460ff19166001179055565b6000610f1f610ef76000611199565b601254610f1990610f10906001600160a01b0316611199565b60015490611c42565b90611c42565b905090565b6000546001600160a01b03163314610f4e5760405162461bcd60e51b8152600401610b3890613218565b610f70620186a0610f6a84600154611c4e90919063ffffffff16565b90611c5a565b60215560235550565b6000600254821115610fe05760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b6064820152608401610b38565b6000610fea611c66565b9050610ff681846132a6565b9392505050565b6000546001600160a01b031633146110275760405162461bcd60e51b8152600401610b3890613218565b60155447906001600160a01b03166108fc6110476064610f6a8587611c4e565b6040518115909202916000818181858888f1935050505015801561106f573d6000803e3d6000fd5b505050565b336000818152601a602090815260408083206001600160a01b03871684529091528120549091610cda918590610d4d9086906132c8565b60006001548311156110ff5760405162461bcd60e51b815260206004820152601f60248201527f416d6f756e74206d757374206265206c657373207468616e20737570706c79006044820152606401610b38565b816111205760006111168460016000806000611c89565b519150610cde9050565b60006111328460016000806000611c89565b602001519150610cde9050565b610cf033826000611d07565b6000546001600160a01b031633146111755760405162461bcd60e51b8152600401610b3890613218565b602854611183904290611dcf565b602455602954611194904290611dcf565b602655565b6001600160a01b0381166000908152601b602052604081205460ff16156111d657506001600160a01b031660009081526019602052604090205490565b6001600160a01b038216600090815260186020526040902054610cde90610f79565b6000546001600160a01b031633146112225760405162461bcd60e51b8152600401610b3890613218565b6001600160a01b03166000908152601c60205260409020805460ff1916911515919091179055565b6000546001600160a01b031633146112745760405162461bcd60e51b8152600401610b3890613218565b60088690556009859055600a849055600583905560068290556007819055600b5486118015906112a85750600b5460095411155b80156112b85750600b54600a5411155b6112c157600080fd5b505050505050565b6000546001600160a01b031633146112f35760405162461bcd60e51b8152600401610b3890613218565b6000611310600b54610f6a85600154611c4e90919063ffffffff16565b9050600061132f600b54610f6a85600154611c4e90919063ffffffff16565b9050600061134f620186a0610f6a60018054611c4e90919063ffffffff16565b90508083101580156113615750808210155b6113cb5760405162461bcd60e51b815260206004820152603560248201527f45524332303a206d61782054587320616e64206d61782057616c6c65742063616044820152746e6e6f74206265206c657373207468616e202e352560581b6064820152608401610b38565b506003919091556004555050565b6001600160a01b0381166000908152601960209081526040808320546018909252822054610cde9190610f1990610f79565b6000546001600160a01b031633146114355760405162461bcd60e51b8152600401610b3890613218565b6001600160a01b03919091166000908152601c60205260409020805460ff1916911515919091179055565b6000546001600160a01b0316331461148a5760405162461bcd60e51b8152600401610b3890613218565b601480546001600160a01b039485166001600160a01b0319918216811790925560138054948616948216851790556015805493909516921682179093556000928352601c6020526040808420805460ff199081166001908117909255938552818520805485168217905591845290922080549091169091179055565b6000546001600160a01b031633146115305760405162461bcd60e51b8152600401610b3890613218565b61154c620186a0610f6a84600154611c4e90919063ffffffff16565b60205560225550565b6000546001600160a01b0316331461157f5760405162461bcd60e51b8152600401610b3890613218565b601f80546001600160a01b039092166001600160a01b0319909216821790556000908152601b60205260409020805460ff19166001179055565b6000610cda3384610d4d8560405180606001604052806025815260200161340d60259139336000908152601a602090815260408083206001600160a01b038d1684529091529020549190611c16565b6000610cda338484611b41565b6000546001600160a01b0316331461163f5760405162461bcd60e51b8152600401610b3890613218565b6040516370a0823160e01b81523060048201526000906001600160a01b038516906370a0823190602401602060405180830381865afa158015611686573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116aa91906132db565b90506001600160a01b03841663a9059cbb846116cb6064610f6a8688611c4e565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015611716573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061173a91906132f4565b5050505050565b6000546001600160a01b0316331461176b5760405162461bcd60e51b8152600401610b3890613218565b601f8054921515600160a81b0260ff60a81b1990931692909217909155602855565b6000546001600160a01b031633146117b75760405162461bcd60e51b8152600401610b3890613218565b601f8054921515600160b01b0260ff60b01b1990931692909217909155602955565b6000546001600160a01b031633146118035760405162461bcd60e51b8152600401610b3890613218565b601183905560015461181e90620186a090610f6a9085611c4e565b600d5560015461183790620186a090610f6a9084611c4e565b600e55505050565b6000546001600160a01b031633146118695760405162461bcd60e51b8152600401610b3890613218565b601680546001600160a01b039384166001600160a01b031991821681179092556017805493909416921682179092556000918252601c6020526040808320805460ff199081166001908117909255928452922080549091169091179055565b6000546001600160a01b031633146118f25760405162461bcd60e51b8152600401610b3890613218565b600080546001600160a01b0319166001600160a01b0383169081179091556040519081527f04dba622d284ed0014ee4b9a6a68386be1a4c08a4913ae272de89199cc6861639060200160405180910390a150565b6001600160a01b0383166119a85760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610b38565b6001600160a01b038216611a095760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610b38565b6001600160a01b038381166000818152601a602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b601f805460ff60a01b1916600160a01b1790558015611aec576000611ab5600b54610f6a602254611aaf601660009054906101000a90046001600160a01b0316611199565b90611c4e565b905082811015611ac3578092505b601654600090611adb906001600160a01b0316611199565b905083811015611ae9578093505b50505b602b54611af99083611dcf565b602b5542602555602d54611b0e906001611dcf565b602d55611b1c833084611946565b611b2f8360008460008060006001611ddb565b5050601f805460ff60a01b1916905550565b611b4c838383612010565b611b568383612148565b611b618383836121e1565b611b6c8284836122f0565b611b76838361237c565b611b818383836123f1565b611b8b8383612416565b6001600160a01b0383166000908152601c602052604090205461106f9084908490849060ff1680611bd457506001600160a01b0386166000908152601c602052604090205460ff165b80611be15750600c5460ff165b80611bf55750601f54600160a01b900460ff165b601f549015906001600160a01b039081168882168114918a16146000611ddb565b60008184841115611c3a5760405162461bcd60e51b8152600401610b389190612f92565b505050900390565b6000610ff68284613264565b6000610ff68284613311565b6000610ff682846132a6565b6000806000611c736125bb565b9092509050611c8281836132a6565b9250505090565b611cc96040518060e00160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b611cd6868686868661273e565b9050611cec818787611ce6611c66565b86612966565b60608501526040840152602083015281525b95945050505050565b601f805460ff60a01b1916600160a01b1790558015611d82576000611d4c600b54610f6a602354611aaf601760009054906101000a90046001600160a01b0316611199565b905082811015611d5a578092505b601754600090611d72906001600160a01b0316611199565b9050838111611d7f578093505b50505b602a54611d8f9083611dcf565b602a5542602755602c54611da4906001611dcf565b602c55611db2833084611946565b601254611b2f9084906001600160a01b0316846000808080611ddb565b6000610ff682846132c8565b6000611dea8686868686611c89565b6001600160a01b0389166000908152601b602052604090205490915060ff1615611e4c576001600160a01b038816600090815260196020526040902054611e32908790613264565b6001600160a01b0389166000908152601960205260409020555b6001600160a01b0387166000908152601b602052604090205460ff1615611eaf5760808101516001600160a01b038816600090815260196020526040902054611e9591906132c8565b6001600160a01b0388166000908152601960205260409020555b80516001600160a01b038916600090815260186020526040902054611ed49190613264565b6001600160a01b03808a16600090815260186020908152604080832094909455840151918a1681529190912054611f0b91906132c8565b6001600160a01b038816600090815260186020526040908190209190915581015160a0820151611f3c919084612a0b565b611f4e81606001518260c00151612a47565b608081015115611faa57866001600160a01b0316886001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360800151604051611fa191815260200190565b60405180910390a35b60c08101511561200657306001600160a01b0316886001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360c00151604051611ffd91815260200190565b60405180910390a35b5050505050505050565b6001600160a01b0383166120745760405162461bcd60e51b815260206004820152602560248201527f42455032303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610b38565b6001600160a01b0382166120d65760405162461bcd60e51b815260206004820152602360248201527f42455032303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610b38565b6120df83611199565b81111561106f5760405162461bcd60e51b815260206004820152603160248201527f596f752061726520747279696e6720746f207472616e73666572206d6f7265206044820152707468616e20796f75722062616c616e636560781b6064820152608401610b38565b6001600160a01b0382166000908152601c602052604090205460ff1615801561218a57506001600160a01b0381166000908152601c602052604090205460ff16155b15610cc957600f5460ff16610cc95760405162461bcd60e51b815260206004820152601d60248201527f45524332303a2054726164696e67206973206e6f7420616c6c6f7765640000006044820152606401610b38565b6001600160a01b0382166000908152601c602052604090205460ff1615801561222357506001600160a01b0383166000908152601c602052604090205460ff16155b801561223857506001600160a01b0382163014155b801561225257506012546001600160a01b03838116911614155b801561226c5750601f546001600160a01b03838116911614155b801561228657506013546001600160a01b03838116911614155b1561106f576004548161229884611199565b6122a291906132c8565b111561106f5760405162461bcd60e51b815260206004820152601e60248201527f45786365656473206d6178696d756d2077616c6c657420616d6f756e742e00006044820152606401610b38565b6003548111158061231957506001600160a01b0382166000908152601c602052604090205460ff165b8061233c57506001600160a01b0383166000908152601c602052604090205460ff165b61106f5760405162461bcd60e51b8152602060048201526011602482015270151608131a5b5a5d08115e18d959591959607a1b6044820152606401610b38565b601f546001600160a01b0382811691161480156123b257506001600160a01b0382166000908152601c602052604090205460ff16155b80156123c15750600c5460ff16155b80156123d75750601f54600160a01b900460ff16155b15610cc9576010546123ea906001611dcf565b6010555050565b6123fc838383612ac6565b1561106f5761240c600d54612b8c565b6000601055505050565b426024541115801561242b5750600c5460ff16155b80156124445750601f546001600160a01b038281169116145b801561246957506001600160a01b0382166000908152601c602052604090205460ff16155b801561247e5750601f54600160a81b900460ff165b801561249f575060165460009061249d906001600160a01b0316611199565b115b80156124b55750601f54600160a01b900460ff16155b156124e7576016546020546124d5916001600160a01b0316906001611a6a565b6028546124e3904290611dcf565b6024555b42602654111580156124fc5750600c5460ff16155b80156125155750601f546001600160a01b038281169116145b801561253a57506001600160a01b0382166000908152601c602052604090205460ff16155b801561254f5750601f54600160b01b900460ff165b8015612570575060175460009061256e906001600160a01b0316611199565b115b80156125865750601f54600160a01b900460ff16155b15610cc9576017546021546125a6916001600160a01b0316906001611d07565b6029546125b4904290611dcf565b6026555050565b6002546001546000918291825b601d5481101561270d578260186000601d84815481106125ea576125ea613238565b60009182526020808320909101546001600160a01b03168352820192909252604001902054118061265557508160196000601d848154811061262e5761262e613238565b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b1561266b57600254600154945094505050509091565b60186000601d838154811061268257612682613238565b60009182526020808320909101546001600160a01b031683528201929092526040019020546126b19084613264565b925060196000601d83815481106126ca576126ca613238565b60009182526020808320909101546001600160a01b031683528201929092526040019020546126f99083613264565b9150806127058161328d565b9150506125c8565b5060015460025461271e91906132a6565b821015612735576002546001549350935050509091565b90939092509050565b61277e6040518060e00160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b8415801561278a575081155b806127a4575061279a8484612d1b565b80156127a4575081155b156127b55760808101869052611cfe565b831580156127c1575082155b80156127cb575081155b156128435760006127ed600b54610f6a600a548a611c4e90919063ffffffff16565b9050600a546005600001541161281d57600b5460055461280d9089613311565b61281791906132a6565b60a08301525b60a082015161282d908290611c42565b60c083015261283c8188613264565b6080830152505b83801561284e575081155b156128c6576000612870600b54610f6a6009548a611c4e90919063ffffffff16565b9050600954600560000154116128a057600b546005546128909089613311565b61289a91906132a6565b60a08301525b60a08201516128b0908290611c42565b60c08301526128bf8188613264565b6080830152505b8280156128d1575081155b156129495760006128f3600b54610f6a6008548a611c4e90919063ffffffff16565b90506008546005600001541161292357600b546005546129139089613311565b61291d91906132a6565b60a08301525b60a0820151612933908290611c42565b60c08301526129428188613264565b6080830152505b8115611cfe5760a081018690526080810186905295945050505050565b60008080806129758689613311565b935086158015612983575084155b15612996575082915060009050806129ff565b84156129c357858960a001516129ac9190613311565b91506129b88285613264565b9250600090506129ff565b858960a001516129d39190613311565b9150858960c001516129e59190613311565b9050806129f28386613264565b6129fc9190613264565b92505b95509550955095915050565b8260026000828254612a1d9190613264565b9091555081905061106f5781602e6000016000828254612a3d91906132c8565b9091555050505050565b80602e6001016000828254612a5c91906132c8565b9091555050306000908152601b602052604090205460ff1615612a9e573060009081526019602052604081208054839290612a989084906132c8565b90915550505b3060009081526018602052604081208054849290612abd9084906132c8565b90915550505050565b600080600e5483101590506000600d54612adf30611199565b600c54911115915060ff16158015612afe5750600c54610100900460ff165b8015612b075750815b8015612b2c57506001600160a01b0386166000908152601c602052604090205460ff16155b8015612b3a5750600f5460ff165b8015612b535750601f546001600160a01b038681169116145b8015612b63575060115460105410155b8015612b6c5750805b8015612b825750601f54600160a01b900460ff16155b9695505050505050565b600c805460ff19166001908117909155600854600091612bb391600291611aaf9190611dcf565b9050600854600003612be557600654600754612be291600291611aaf91600191612bdc91611dcf565b90611dcf565b90505b6007546000908290612bf79085613311565b612c0191906132a6565b90506000612c0f8285613264565b905047612c1b82612d61565b6000612c278247613264565b600754909150600090612c3a9087613264565b612c4490836132a6565b600754909150600090612c579083613311565b90508015612c6957612c698682612eb3565b600654600090612c7e90611aaf856002611c4e565b90508015612cc2576014546040516001600160a01b039091169082156108fc029083906000818181858888f19350505050158015612cc0573d6000803e3d6000fd5b505b478015612d05576015546040516001600160a01b039091169082156108fc029083906000818181858888f19350505050158015612d03573d6000803e3d6000fd5b505b5050600c805460ff191690555050505050505050565b6000828015612d2a5750600954155b80612d3d5750818015612d3d5750600854155b80610ff6575082158015612d4f575081155b8015610ff6575050600a541592915050565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110612d9657612d96613238565b6001600160a01b03928316602091820292909201810191909152601e54604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015612def573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e139190613328565b81600181518110612e2657612e26613238565b6001600160a01b039283166020918202929092010152601e54612e4c9130911684611946565b601e5460405163791ac94760e01b81526001600160a01b039091169063791ac94790612e85908590600090869030904290600401613345565b600060405180830381600087803b158015612e9f57600080fd5b505af11580156112c1573d6000803e3d6000fd5b601e54612ecb9030906001600160a01b031684611946565b601e5460135460405163f305d71960e01b81523060048201526024810185905260006044820181905260648201526001600160a01b0391821660848201524260a482015291169063f305d71990839060c40160606040518083038185885af1158015612f3b573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061173a91906133b6565b6001600160a01b0381168114610cf057600080fd5b600060208284031215612f8757600080fd5b8135610ff681612f60565b600060208083528351808285015260005b81811015612fbf57858101830151858201604001528201612fa3565b506000604082860101526040601f19601f8301168501019250505092915050565b60008060408385031215612ff357600080fd5b8235612ffe81612f60565b946020939093013593505050565b60006020828403121561301e57600080fd5b5035919050565b60008060006060848603121561303a57600080fd5b833561304581612f60565b9250602084013561305581612f60565b929592945050506040919091013590565b6000806040838503121561307957600080fd5b50508035926020909101359150565b8015158114610cf057600080fd5b600080604083850312156130a957600080fd5b8235915060208301356130bb81613088565b809150509250929050565b600080604083850312156130d957600080fd5b82356130e481613088565b915060208301356130bb81612f60565b60008060008060008060c0878903121561310d57600080fd5b505084359660208601359650604086013595606081013595506080810135945060a0013592509050565b6000806040838503121561314a57600080fd5b823561315581612f60565b915060208301356130bb81613088565b60008060006060848603121561317a57600080fd5b833561318581612f60565b9250602084013561319581612f60565b915060408401356131a581612f60565b809150509250925092565b600080604083850312156131c357600080fd5b82356130e481612f60565b600080604083850312156131e157600080fd5b8235612ffe81613088565b60008060006060848603121561320157600080fd5b505081359360208301359350604090920135919050565b60208082526006908201526510a7aba722a960d11b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b81810381811115610cde57610cde61324e565b634e487b7160e01b600052603160045260246000fd5b60006001820161329f5761329f61324e565b5060010190565b6000826132c357634e487b7160e01b600052601260045260246000fd5b500490565b80820180821115610cde57610cde61324e565b6000602082840312156132ed57600080fd5b5051919050565b60006020828403121561330657600080fd5b8151610ff681613088565b8082028115828204841417610cde57610cde61324e565b60006020828403121561333a57600080fd5b8151610ff681612f60565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156133955784516001600160a01b031683529383019391830191600101613370565b50506001600160a01b03969096166060850152505050608001529392505050565b6000806000606084860312156133cb57600080fd5b835192506020840151915060408401519050925092509256fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220b6fa08c69face258ad7c1fea11551d7e10d7f172073a33713044862208fcde2d64736f6c63430008130033

Deployed Bytecode

0x60806040526004361061039b5760003560e01c80637934f4f2116101dc578063a9059cbb11610102578063e4800345116100a0578063ebf6cf9b1161006f578063ebf6cf9b14610a98578063f09f694e14610aae578063f2fde38b14610ace578063f887ea4014610aee57600080fd5b8063e480034514610a2d578063e55a68b314610a4d578063e94dd17c14610a63578063e960e68e14610a8357600080fd5b8063d1571e47116100dc578063d1571e4714610990578063dd62ed3e146109b1578063dfa5f4ea146109f7578063e306744914610a1757600080fd5b8063a9059cbb1461093a578063b2118a8d1461095a578063ca221c081461097a57600080fd5b80638ebfc7961161017a5780639b9a6f09116101495780639b9a6f09146108ac578063a22d4832146108c2578063a457c2d7146108e2578063a8aa1b311461090257600080fd5b80638ebfc7961461081e5780639213c3581461083e57806395b186411461085e57806395d89b411461087e57600080fd5b806384836778116101b657806384836778146107a857806384b81093146107c8578063884870c7146107de5780638cf2e94a146107fe57600080fd5b80637934f4f2146107435780637d1db4a5146107595780637d459db31461076f57600080fd5b80633052ea08116102c157806344df8e701161025f5780636c0e1c121161022e5780636c0e1c12146106d857806370a08231146106ed57806378109e541461070d578063783b5a0a1461072357600080fd5b806344df8e70146106615780634549b03914610682578063486a7e6b146106a257806354b822cf146106b857600080fd5b8063395093511161029b57806339509351146105e55780633c9f861d146106055780633f4218e01461061b578063404ca34a1461064b57600080fd5b80633052ea0814610593578063313ce567146105b357806337f0d4c8146105cf57600080fd5b806322849720116103395780632b112e49116103085780632b112e491461050f5780632cbf5360146105245780632d838119146105445780632f54bf6e1461056457600080fd5b806322849720146104a457806323b872dd146104ba57806327334a08146104da578063293230b8146104fa57600080fd5b8063095ea7b311610375578063095ea7b3146104295780630e7daf6d1461045957806311403aec1461046f57806318160ddd1461048f57600080fd5b806303807ee5146103a757806305f82a45146103d057806306fdde03146103f257600080fd5b366103a257005b600080fd5b3480156103b357600080fd5b506103bd60235481565b6040519081526020015b60405180910390f35b3480156103dc57600080fd5b506103f06103eb366004612f75565b610b0e565b005b3480156103fe57600080fd5b506040805180820190915260058152644c6962726160d81b60208201525b6040516103c79190612f92565b34801561043557600080fd5b50610449610444366004612fe0565b610ccd565b60405190151581526020016103c7565b34801561046557600080fd5b506103bd60225481565b34801561047b57600080fd5b506103f061048a36600461300c565b610ce4565b34801561049b57600080fd5b506001546103bd565b3480156104b057600080fd5b506103bd602b5481565b3480156104c657600080fd5b506104496104d5366004613025565b610cf3565b3480156104e657600080fd5b506103f06104f5366004612f75565b610d5c565b34801561050657600080fd5b506103f0610eaf565b34801561051b57600080fd5b506103bd610ee8565b34801561053057600080fd5b506103f061053f366004613066565b610f24565b34801561055057600080fd5b506103bd61055f36600461300c565b610f79565b34801561057057600080fd5b5061044961057f366004612f75565b6000546001600160a01b0391821691161490565b34801561059f57600080fd5b506103f06105ae36600461300c565b610ffd565b3480156105bf57600080fd5b50604051600981526020016103c7565b3480156105db57600080fd5b506103bd602d5481565b3480156105f157600080fd5b50610449610600366004612fe0565b611074565b34801561061157600080fd5b506103bd602a5481565b34801561062757600080fd5b50610449610636366004612f75565b601c6020526000908152604090205460ff1681565b34801561065757600080fd5b506103bd60205481565b34801561066d57600080fd5b50601f5461044990600160b01b900460ff1681565b34801561068e57600080fd5b506103bd61069d366004613096565b6110ab565b3480156106ae57600080fd5b506103bd60215481565b3480156106c457600080fd5b506103f06106d336600461300c565b61113f565b3480156106e457600080fd5b506103f061114b565b3480156106f957600080fd5b506103bd610708366004612f75565b611199565b34801561071957600080fd5b506103bd60045481565b34801561072f57600080fd5b506103f061073e3660046130c6565b6111f8565b34801561074f57600080fd5b506103bd60255481565b34801561076557600080fd5b506103bd60035481565b34801561077b57600080fd5b5061044961078a366004612f75565b6001600160a01b03166000908152601b602052604090205460ff1690565b3480156107b457600080fd5b506103f06107c33660046130f4565b61124a565b3480156107d457600080fd5b506103bd60285481565b3480156107ea57600080fd5b506103f06107f9366004613066565b6112c9565b34801561080a57600080fd5b506103bd610819366004612f75565b6113d9565b34801561082a57600080fd5b506103f0610839366004613137565b61140b565b34801561084a57600080fd5b506103f0610859366004613165565b611460565b34801561086a57600080fd5b506103f0610879366004613066565b611506565b34801561088a57600080fd5b506040805180820190915260058152644c4942524160d81b602082015261041c565b3480156108b857600080fd5b506103bd602c5481565b3480156108ce57600080fd5b506103f06108dd366004612f75565b611555565b3480156108ee57600080fd5b506104496108fd366004612fe0565b6115b9565b34801561090e57600080fd5b50601f54610922906001600160a01b031681565b6040516001600160a01b0390911681526020016103c7565b34801561094657600080fd5b50610449610955366004612fe0565b611608565b34801561096657600080fd5b506103f0610975366004613025565b611615565b34801561098657600080fd5b506103bd60245481565b34801561099c57600080fd5b50601f5461044990600160a81b900460ff1681565b3480156109bd57600080fd5b506103bd6109cc3660046131b0565b6001600160a01b039182166000908152601a6020908152604080832093909416825291909152205490565b348015610a0357600080fd5b506103f0610a123660046131ce565b611741565b348015610a2357600080fd5b506103bd60275481565b348015610a3957600080fd5b506103f0610a483660046131ce565b61178d565b348015610a5957600080fd5b506103bd60295481565b348015610a6f57600080fd5b506103f0610a7e3660046131ec565b6117d9565b348015610a8f57600080fd5b50602e546103bd565b348015610aa457600080fd5b506103bd60265481565b348015610aba57600080fd5b506103f0610ac93660046131b0565b61183f565b348015610ada57600080fd5b506103f0610ae9366004612f75565b6118c8565b348015610afa57600080fd5b50601e54610922906001600160a01b031681565b6000546001600160a01b03163314610b415760405162461bcd60e51b8152600401610b3890613218565b60405180910390fd5b6001600160a01b0381166000908152601b602052604090205460ff16610ba95760405162461bcd60e51b815260206004820152601760248201527f4163636f756e74206973206e6f74206578636c756465640000000000000000006044820152606401610b38565b60005b601d54811015610cc957816001600160a01b0316601d8281548110610bd357610bd3613238565b6000918252602090912001546001600160a01b031603610cb757601d8054610bfd90600190613264565b81548110610c0d57610c0d613238565b600091825260209091200154601d80546001600160a01b039092169183908110610c3957610c39613238565b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559184168152601982526040808220829055601b90925220805460ff19169055601d805480610c9157610c91613277565b600082815260209020810160001990810180546001600160a01b03191690550190555050565b80610cc18161328d565b915050610bac565b5050565b6000610cda338484611946565b5060015b92915050565b610cf033826000611a6a565b50565b6000610d00848484611b41565b610d528433610d4d856040518060600160405280602881526020016133e5602891396001600160a01b038a166000908152601a602090815260408083203384529091529020549190611c16565b611946565b5060019392505050565b6000546001600160a01b03163314610d865760405162461bcd60e51b8152600401610b3890613218565b6001600160a01b0381166000908152601b602052604090205460ff1615610def5760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c7564656400000000006044820152606401610b38565b6001600160a01b03811660009081526018602052604090205415610e49576001600160a01b038116600090815260186020526040902054610e2f90610f79565b6001600160a01b0382166000908152601960205260409020555b6001600160a01b03166000818152601b60205260408120805460ff19166001908117909155601d805491820181559091527f6d4407e7be21f808e6509aa9fa9143369579dd7d760fe20a2c09680fc146134f0180546001600160a01b0319169091179055565b6000546001600160a01b03163314610ed95760405162461bcd60e51b8152600401610b3890613218565b600f805460ff19166001179055565b6000610f1f610ef76000611199565b601254610f1990610f10906001600160a01b0316611199565b60015490611c42565b90611c42565b905090565b6000546001600160a01b03163314610f4e5760405162461bcd60e51b8152600401610b3890613218565b610f70620186a0610f6a84600154611c4e90919063ffffffff16565b90611c5a565b60215560235550565b6000600254821115610fe05760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b6064820152608401610b38565b6000610fea611c66565b9050610ff681846132a6565b9392505050565b6000546001600160a01b031633146110275760405162461bcd60e51b8152600401610b3890613218565b60155447906001600160a01b03166108fc6110476064610f6a8587611c4e565b6040518115909202916000818181858888f1935050505015801561106f573d6000803e3d6000fd5b505050565b336000818152601a602090815260408083206001600160a01b03871684529091528120549091610cda918590610d4d9086906132c8565b60006001548311156110ff5760405162461bcd60e51b815260206004820152601f60248201527f416d6f756e74206d757374206265206c657373207468616e20737570706c79006044820152606401610b38565b816111205760006111168460016000806000611c89565b519150610cde9050565b60006111328460016000806000611c89565b602001519150610cde9050565b610cf033826000611d07565b6000546001600160a01b031633146111755760405162461bcd60e51b8152600401610b3890613218565b602854611183904290611dcf565b602455602954611194904290611dcf565b602655565b6001600160a01b0381166000908152601b602052604081205460ff16156111d657506001600160a01b031660009081526019602052604090205490565b6001600160a01b038216600090815260186020526040902054610cde90610f79565b6000546001600160a01b031633146112225760405162461bcd60e51b8152600401610b3890613218565b6001600160a01b03166000908152601c60205260409020805460ff1916911515919091179055565b6000546001600160a01b031633146112745760405162461bcd60e51b8152600401610b3890613218565b60088690556009859055600a849055600583905560068290556007819055600b5486118015906112a85750600b5460095411155b80156112b85750600b54600a5411155b6112c157600080fd5b505050505050565b6000546001600160a01b031633146112f35760405162461bcd60e51b8152600401610b3890613218565b6000611310600b54610f6a85600154611c4e90919063ffffffff16565b9050600061132f600b54610f6a85600154611c4e90919063ffffffff16565b9050600061134f620186a0610f6a60018054611c4e90919063ffffffff16565b90508083101580156113615750808210155b6113cb5760405162461bcd60e51b815260206004820152603560248201527f45524332303a206d61782054587320616e64206d61782057616c6c65742063616044820152746e6e6f74206265206c657373207468616e202e352560581b6064820152608401610b38565b506003919091556004555050565b6001600160a01b0381166000908152601960209081526040808320546018909252822054610cde9190610f1990610f79565b6000546001600160a01b031633146114355760405162461bcd60e51b8152600401610b3890613218565b6001600160a01b03919091166000908152601c60205260409020805460ff1916911515919091179055565b6000546001600160a01b0316331461148a5760405162461bcd60e51b8152600401610b3890613218565b601480546001600160a01b039485166001600160a01b0319918216811790925560138054948616948216851790556015805493909516921682179093556000928352601c6020526040808420805460ff199081166001908117909255938552818520805485168217905591845290922080549091169091179055565b6000546001600160a01b031633146115305760405162461bcd60e51b8152600401610b3890613218565b61154c620186a0610f6a84600154611c4e90919063ffffffff16565b60205560225550565b6000546001600160a01b0316331461157f5760405162461bcd60e51b8152600401610b3890613218565b601f80546001600160a01b039092166001600160a01b0319909216821790556000908152601b60205260409020805460ff19166001179055565b6000610cda3384610d4d8560405180606001604052806025815260200161340d60259139336000908152601a602090815260408083206001600160a01b038d1684529091529020549190611c16565b6000610cda338484611b41565b6000546001600160a01b0316331461163f5760405162461bcd60e51b8152600401610b3890613218565b6040516370a0823160e01b81523060048201526000906001600160a01b038516906370a0823190602401602060405180830381865afa158015611686573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116aa91906132db565b90506001600160a01b03841663a9059cbb846116cb6064610f6a8688611c4e565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015611716573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061173a91906132f4565b5050505050565b6000546001600160a01b0316331461176b5760405162461bcd60e51b8152600401610b3890613218565b601f8054921515600160a81b0260ff60a81b1990931692909217909155602855565b6000546001600160a01b031633146117b75760405162461bcd60e51b8152600401610b3890613218565b601f8054921515600160b01b0260ff60b01b1990931692909217909155602955565b6000546001600160a01b031633146118035760405162461bcd60e51b8152600401610b3890613218565b601183905560015461181e90620186a090610f6a9085611c4e565b600d5560015461183790620186a090610f6a9084611c4e565b600e55505050565b6000546001600160a01b031633146118695760405162461bcd60e51b8152600401610b3890613218565b601680546001600160a01b039384166001600160a01b031991821681179092556017805493909416921682179092556000918252601c6020526040808320805460ff199081166001908117909255928452922080549091169091179055565b6000546001600160a01b031633146118f25760405162461bcd60e51b8152600401610b3890613218565b600080546001600160a01b0319166001600160a01b0383169081179091556040519081527f04dba622d284ed0014ee4b9a6a68386be1a4c08a4913ae272de89199cc6861639060200160405180910390a150565b6001600160a01b0383166119a85760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610b38565b6001600160a01b038216611a095760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610b38565b6001600160a01b038381166000818152601a602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b601f805460ff60a01b1916600160a01b1790558015611aec576000611ab5600b54610f6a602254611aaf601660009054906101000a90046001600160a01b0316611199565b90611c4e565b905082811015611ac3578092505b601654600090611adb906001600160a01b0316611199565b905083811015611ae9578093505b50505b602b54611af99083611dcf565b602b5542602555602d54611b0e906001611dcf565b602d55611b1c833084611946565b611b2f8360008460008060006001611ddb565b5050601f805460ff60a01b1916905550565b611b4c838383612010565b611b568383612148565b611b618383836121e1565b611b6c8284836122f0565b611b76838361237c565b611b818383836123f1565b611b8b8383612416565b6001600160a01b0383166000908152601c602052604090205461106f9084908490849060ff1680611bd457506001600160a01b0386166000908152601c602052604090205460ff165b80611be15750600c5460ff165b80611bf55750601f54600160a01b900460ff165b601f549015906001600160a01b039081168882168114918a16146000611ddb565b60008184841115611c3a5760405162461bcd60e51b8152600401610b389190612f92565b505050900390565b6000610ff68284613264565b6000610ff68284613311565b6000610ff682846132a6565b6000806000611c736125bb565b9092509050611c8281836132a6565b9250505090565b611cc96040518060e00160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b611cd6868686868661273e565b9050611cec818787611ce6611c66565b86612966565b60608501526040840152602083015281525b95945050505050565b601f805460ff60a01b1916600160a01b1790558015611d82576000611d4c600b54610f6a602354611aaf601760009054906101000a90046001600160a01b0316611199565b905082811015611d5a578092505b601754600090611d72906001600160a01b0316611199565b9050838111611d7f578093505b50505b602a54611d8f9083611dcf565b602a5542602755602c54611da4906001611dcf565b602c55611db2833084611946565b601254611b2f9084906001600160a01b0316846000808080611ddb565b6000610ff682846132c8565b6000611dea8686868686611c89565b6001600160a01b0389166000908152601b602052604090205490915060ff1615611e4c576001600160a01b038816600090815260196020526040902054611e32908790613264565b6001600160a01b0389166000908152601960205260409020555b6001600160a01b0387166000908152601b602052604090205460ff1615611eaf5760808101516001600160a01b038816600090815260196020526040902054611e9591906132c8565b6001600160a01b0388166000908152601960205260409020555b80516001600160a01b038916600090815260186020526040902054611ed49190613264565b6001600160a01b03808a16600090815260186020908152604080832094909455840151918a1681529190912054611f0b91906132c8565b6001600160a01b038816600090815260186020526040908190209190915581015160a0820151611f3c919084612a0b565b611f4e81606001518260c00151612a47565b608081015115611faa57866001600160a01b0316886001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360800151604051611fa191815260200190565b60405180910390a35b60c08101511561200657306001600160a01b0316886001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360c00151604051611ffd91815260200190565b60405180910390a35b5050505050505050565b6001600160a01b0383166120745760405162461bcd60e51b815260206004820152602560248201527f42455032303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610b38565b6001600160a01b0382166120d65760405162461bcd60e51b815260206004820152602360248201527f42455032303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610b38565b6120df83611199565b81111561106f5760405162461bcd60e51b815260206004820152603160248201527f596f752061726520747279696e6720746f207472616e73666572206d6f7265206044820152707468616e20796f75722062616c616e636560781b6064820152608401610b38565b6001600160a01b0382166000908152601c602052604090205460ff1615801561218a57506001600160a01b0381166000908152601c602052604090205460ff16155b15610cc957600f5460ff16610cc95760405162461bcd60e51b815260206004820152601d60248201527f45524332303a2054726164696e67206973206e6f7420616c6c6f7765640000006044820152606401610b38565b6001600160a01b0382166000908152601c602052604090205460ff1615801561222357506001600160a01b0383166000908152601c602052604090205460ff16155b801561223857506001600160a01b0382163014155b801561225257506012546001600160a01b03838116911614155b801561226c5750601f546001600160a01b03838116911614155b801561228657506013546001600160a01b03838116911614155b1561106f576004548161229884611199565b6122a291906132c8565b111561106f5760405162461bcd60e51b815260206004820152601e60248201527f45786365656473206d6178696d756d2077616c6c657420616d6f756e742e00006044820152606401610b38565b6003548111158061231957506001600160a01b0382166000908152601c602052604090205460ff165b8061233c57506001600160a01b0383166000908152601c602052604090205460ff165b61106f5760405162461bcd60e51b8152602060048201526011602482015270151608131a5b5a5d08115e18d959591959607a1b6044820152606401610b38565b601f546001600160a01b0382811691161480156123b257506001600160a01b0382166000908152601c602052604090205460ff16155b80156123c15750600c5460ff16155b80156123d75750601f54600160a01b900460ff16155b15610cc9576010546123ea906001611dcf565b6010555050565b6123fc838383612ac6565b1561106f5761240c600d54612b8c565b6000601055505050565b426024541115801561242b5750600c5460ff16155b80156124445750601f546001600160a01b038281169116145b801561246957506001600160a01b0382166000908152601c602052604090205460ff16155b801561247e5750601f54600160a81b900460ff165b801561249f575060165460009061249d906001600160a01b0316611199565b115b80156124b55750601f54600160a01b900460ff16155b156124e7576016546020546124d5916001600160a01b0316906001611a6a565b6028546124e3904290611dcf565b6024555b42602654111580156124fc5750600c5460ff16155b80156125155750601f546001600160a01b038281169116145b801561253a57506001600160a01b0382166000908152601c602052604090205460ff16155b801561254f5750601f54600160b01b900460ff165b8015612570575060175460009061256e906001600160a01b0316611199565b115b80156125865750601f54600160a01b900460ff16155b15610cc9576017546021546125a6916001600160a01b0316906001611d07565b6029546125b4904290611dcf565b6026555050565b6002546001546000918291825b601d5481101561270d578260186000601d84815481106125ea576125ea613238565b60009182526020808320909101546001600160a01b03168352820192909252604001902054118061265557508160196000601d848154811061262e5761262e613238565b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b1561266b57600254600154945094505050509091565b60186000601d838154811061268257612682613238565b60009182526020808320909101546001600160a01b031683528201929092526040019020546126b19084613264565b925060196000601d83815481106126ca576126ca613238565b60009182526020808320909101546001600160a01b031683528201929092526040019020546126f99083613264565b9150806127058161328d565b9150506125c8565b5060015460025461271e91906132a6565b821015612735576002546001549350935050509091565b90939092509050565b61277e6040518060e00160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b8415801561278a575081155b806127a4575061279a8484612d1b565b80156127a4575081155b156127b55760808101869052611cfe565b831580156127c1575082155b80156127cb575081155b156128435760006127ed600b54610f6a600a548a611c4e90919063ffffffff16565b9050600a546005600001541161281d57600b5460055461280d9089613311565b61281791906132a6565b60a08301525b60a082015161282d908290611c42565b60c083015261283c8188613264565b6080830152505b83801561284e575081155b156128c6576000612870600b54610f6a6009548a611c4e90919063ffffffff16565b9050600954600560000154116128a057600b546005546128909089613311565b61289a91906132a6565b60a08301525b60a08201516128b0908290611c42565b60c08301526128bf8188613264565b6080830152505b8280156128d1575081155b156129495760006128f3600b54610f6a6008548a611c4e90919063ffffffff16565b90506008546005600001541161292357600b546005546129139089613311565b61291d91906132a6565b60a08301525b60a0820151612933908290611c42565b60c08301526129428188613264565b6080830152505b8115611cfe5760a081018690526080810186905295945050505050565b60008080806129758689613311565b935086158015612983575084155b15612996575082915060009050806129ff565b84156129c357858960a001516129ac9190613311565b91506129b88285613264565b9250600090506129ff565b858960a001516129d39190613311565b9150858960c001516129e59190613311565b9050806129f28386613264565b6129fc9190613264565b92505b95509550955095915050565b8260026000828254612a1d9190613264565b9091555081905061106f5781602e6000016000828254612a3d91906132c8565b9091555050505050565b80602e6001016000828254612a5c91906132c8565b9091555050306000908152601b602052604090205460ff1615612a9e573060009081526019602052604081208054839290612a989084906132c8565b90915550505b3060009081526018602052604081208054849290612abd9084906132c8565b90915550505050565b600080600e5483101590506000600d54612adf30611199565b600c54911115915060ff16158015612afe5750600c54610100900460ff165b8015612b075750815b8015612b2c57506001600160a01b0386166000908152601c602052604090205460ff16155b8015612b3a5750600f5460ff165b8015612b535750601f546001600160a01b038681169116145b8015612b63575060115460105410155b8015612b6c5750805b8015612b825750601f54600160a01b900460ff16155b9695505050505050565b600c805460ff19166001908117909155600854600091612bb391600291611aaf9190611dcf565b9050600854600003612be557600654600754612be291600291611aaf91600191612bdc91611dcf565b90611dcf565b90505b6007546000908290612bf79085613311565b612c0191906132a6565b90506000612c0f8285613264565b905047612c1b82612d61565b6000612c278247613264565b600754909150600090612c3a9087613264565b612c4490836132a6565b600754909150600090612c579083613311565b90508015612c6957612c698682612eb3565b600654600090612c7e90611aaf856002611c4e565b90508015612cc2576014546040516001600160a01b039091169082156108fc029083906000818181858888f19350505050158015612cc0573d6000803e3d6000fd5b505b478015612d05576015546040516001600160a01b039091169082156108fc029083906000818181858888f19350505050158015612d03573d6000803e3d6000fd5b505b5050600c805460ff191690555050505050505050565b6000828015612d2a5750600954155b80612d3d5750818015612d3d5750600854155b80610ff6575082158015612d4f575081155b8015610ff6575050600a541592915050565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110612d9657612d96613238565b6001600160a01b03928316602091820292909201810191909152601e54604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015612def573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e139190613328565b81600181518110612e2657612e26613238565b6001600160a01b039283166020918202929092010152601e54612e4c9130911684611946565b601e5460405163791ac94760e01b81526001600160a01b039091169063791ac94790612e85908590600090869030904290600401613345565b600060405180830381600087803b158015612e9f57600080fd5b505af11580156112c1573d6000803e3d6000fd5b601e54612ecb9030906001600160a01b031684611946565b601e5460135460405163f305d71960e01b81523060048201526024810185905260006044820181905260648201526001600160a01b0391821660848201524260a482015291169063f305d71990839060c40160606040518083038185885af1158015612f3b573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061173a91906133b6565b6001600160a01b0381168114610cf057600080fd5b600060208284031215612f8757600080fd5b8135610ff681612f60565b600060208083528351808285015260005b81811015612fbf57858101830151858201604001528201612fa3565b506000604082860101526040601f19601f8301168501019250505092915050565b60008060408385031215612ff357600080fd5b8235612ffe81612f60565b946020939093013593505050565b60006020828403121561301e57600080fd5b5035919050565b60008060006060848603121561303a57600080fd5b833561304581612f60565b9250602084013561305581612f60565b929592945050506040919091013590565b6000806040838503121561307957600080fd5b50508035926020909101359150565b8015158114610cf057600080fd5b600080604083850312156130a957600080fd5b8235915060208301356130bb81613088565b809150509250929050565b600080604083850312156130d957600080fd5b82356130e481613088565b915060208301356130bb81612f60565b60008060008060008060c0878903121561310d57600080fd5b505084359660208601359650604086013595606081013595506080810135945060a0013592509050565b6000806040838503121561314a57600080fd5b823561315581612f60565b915060208301356130bb81613088565b60008060006060848603121561317a57600080fd5b833561318581612f60565b9250602084013561319581612f60565b915060408401356131a581612f60565b809150509250925092565b600080604083850312156131c357600080fd5b82356130e481612f60565b600080604083850312156131e157600080fd5b8235612ffe81613088565b60008060006060848603121561320157600080fd5b505081359360208301359350604090920135919050565b60208082526006908201526510a7aba722a960d11b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b81810381811115610cde57610cde61324e565b634e487b7160e01b600052603160045260246000fd5b60006001820161329f5761329f61324e565b5060010190565b6000826132c357634e487b7160e01b600052601260045260246000fd5b500490565b80820180821115610cde57610cde61324e565b6000602082840312156132ed57600080fd5b5051919050565b60006020828403121561330657600080fd5b8151610ff681613088565b8082028115828204841417610cde57610cde61324e565b60006020828403121561333a57600080fd5b8151610ff681612f60565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156133955784516001600160a01b031683529383019391830191600101613370565b50506001600160a01b03969096166060850152505050608001529392505050565b6000806000606084860312156133cb57600080fd5b835192506020840151915060408401519050925092509256fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220b6fa08c69face258ad7c1fea11551d7e10d7f172073a33713044862208fcde2d64736f6c63430008130033

Deployed Bytecode Sourcemap

7482:23960:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9767:32;;;;;;;;;;;;;;;;;;;160:25:1;;;148:2;133:18;9767:32:0;;;;;;;;27050:464;;;;;;;;;;-1:-1:-1;27050:464:0;;;;;:::i;:::-;;:::i;:::-;;11708:67;;;;;;;;;;-1:-1:-1;11768:5:0;;;;;;;;;;;;-1:-1:-1;;;11768:5:0;;;;11708:67;;;;;;;:::i;12474:134::-;;;;;;;;;;-1:-1:-1;12474:134:0;;;;;:::i;:::-;;:::i;:::-;;;1622:14:1;;1615:22;1597:41;;1585:2;1570:18;12474:134:0;1457:187:1;9721:39:0;;;;;;;;;;;;;;;;19383:117;;;;;;;;;;-1:-1:-1;19383:117:0;;;;;:::i;:::-;;:::i;11931:79::-;;;;;;;;;;-1:-1:-1;12001:7:0;;11931:79;;10080:30;;;;;;;;;;;;;;;;12888:309;;;;;;;;;;-1:-1:-1;12888:309:0;;;;;:::i;:::-;;:::i;26707:335::-;;;;;;;;;;-1:-1:-1;26707:335:0;;;;;:::i;:::-;;:::i;22168:83::-;;;;;;;;;;;;;:::i;25803:143::-;;;;;;;;;;;;;:::i;24050:182::-;;;;;;;;;;-1:-1:-1;24050:182:0;;;;;:::i;:::-;;:::i;26451:248::-;;;;;;;;;;-1:-1:-1;26451:248:0;;;;;:::i;:::-;;:::i;6187:87::-;;;;;;;;;;-1:-1:-1;6187:87:0;;;;;:::i;:::-;6242:4;6267:5;-1:-1:-1;;;;;6256:16:0;;;6267:5;;6256:16;;6187:87;24479:182;;;;;;;;;;-1:-1:-1;24479:182:0;;;;;:::i;:::-;;:::i;11858:67::-;;;;;;;;;;-1:-1:-1;11858:67:0;;7717:1;2690:36:1;;2678:2;2663:18;11858:67:0;2548:184:1;10154:36:0;;;;;;;;;;;;;;;;13205:209;;;;;;;;;;-1:-1:-1;13205:209:0;;;;;:::i;:::-;;:::i;10049:24::-;;;;;;;;;;;;;;;;9356:44;;;;;;;;;;-1:-1:-1;9356:44:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;9588:63;;;;;;;;;;;;;;;;9558:23;;;;;;;;;;-1:-1:-1;9558:23:0;;;;-1:-1:-1;;;9558:23:0;;;;;;25954:489;;;;;;;;;;-1:-1:-1;25954:489:0;;;;;:::i;:::-;;:::i;9658:56::-;;;;;;;;;;;;;;;;19508:103;;;;;;;;;;-1:-1:-1;19508:103:0;;;;;:::i;:::-;;:::i;22259:175::-;;;;;;;;;;;;;:::i;12016:173::-;;;;;;;;;;-1:-1:-1;12016:173:0;;;;;:::i;:::-;;:::i;7959:58::-;;;;;;;;;;;;;;;;22593:124;;;;;;;;;;-1:-1:-1;22593:124:0;;;;;:::i;:::-;;:::i;9843:34::-;;;;;;;;;;;;;;;;7897:55;;;;;;;;;;;;;;;;12706:108;;;;;;;;;;-1:-1:-1;12706:108:0;;;;;:::i;:::-;-1:-1:-1;;;;;12792:20:0;12778:4;12792:20;;;:11;:20;;;;;;;;;12706:108;22725:442;;;;;;;;;;-1:-1:-1;22725:442:0;;;;;:::i;:::-;;:::i;9948:47::-;;;;;;;;;;;;;;;;25096:445;;;;;;;;;;-1:-1:-1;25096:445:0;;;;;:::i;:::-;;:::i;13695:157::-;;;;;;;;;;-1:-1:-1;13695:157:0;;;;;:::i;:::-;;:::i;24669:117::-;;;;;;;;;;-1:-1:-1;24669:117:0;;;;;:::i;:::-;;:::i;23175:322::-;;;;;;;;;;-1:-1:-1;23175:322:0;;;;;:::i;:::-;;:::i;24240:231::-;;;;;;;;;;-1:-1:-1;24240:231:0;;;;;:::i;:::-;;:::i;11781:71::-;;;;;;;;;;-1:-1:-1;11843:7:0;;;;;;;;;;;;-1:-1:-1;;;11843:7:0;;;;11781:71;;10117:30;;;;;;;;;;;;;;;;22442:143;;;;;;;;;;-1:-1:-1;22442:143:0;;;;;:::i;:::-;;:::i;13422:265::-;;;;;;;;;;-1:-1:-1;13422:265:0;;;;;:::i;:::-;;:::i;9469:19::-;;;;;;;;;;-1:-1:-1;9469:19:0;;;;-1:-1:-1;;;;;9469:19:0;;;;;;-1:-1:-1;;;;;5174:32:1;;;5156:51;;5144:2;5129:18;9469:19:0;5010:203:1;12195:140:0;;;;;;;;;;-1:-1:-1;12195:140:0;;;;;:::i;:::-;;:::i;25549:246::-;;;;;;;;;;-1:-1:-1;25549:246:0;;;;;:::i;:::-;;:::i;9806:30::-;;;;;;;;;;;;;;;;9521;;;;;;;;;;-1:-1:-1;9521:30:0;;;;-1:-1:-1;;;9521:30:0;;;;;;12341:127;;;;;;;;;;-1:-1:-1;12341:127:0;;;;;:::i;:::-;-1:-1:-1;;;;;12439:18:0;;;12422:7;12439:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;12341:127;23885:157;;;;;;;;;;-1:-1:-1;23885:157:0;;;;;:::i;:::-;;:::i;9914:27::-;;;;;;;;;;;;;;;;23741:136;;;;;;;;;;-1:-1:-1;23741:136:0;;;;;:::i;:::-;;:::i;10002:40::-;;;;;;;;;;;;;;;;24794:294;;;;;;;;;;-1:-1:-1;24794:294:0;;;;;:::i;:::-;;:::i;12614:86::-;;;;;;;;;;-1:-1:-1;12683:11:0;:15;12614:86;;9884:23;;;;;;;;;;;;;;;;23505:228;;;;;;;;;;-1:-1:-1;23505:228:0;;;;;:::i;:::-;;:::i;6280:111::-;;;;;;;;;;-1:-1:-1;6280:111:0;;;;;:::i;:::-;;:::i;9441:21::-;;;;;;;;;;-1:-1:-1;9441:21:0;;;;-1:-1:-1;;;;;9441:21:0;;;27050:464;6242:4;6267:5;-1:-1:-1;;;;;6267:5:0;6154:10;6256:16;6138:38;;;;-1:-1:-1;;;6138:38:0;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;;;;27134:20:0;::::1;;::::0;;;:11:::1;:20;::::0;;;;;::::1;;27126:56;;;::::0;-1:-1:-1;;;27126:56:0;;7265:2:1;27126:56:0::1;::::0;::::1;7247:21:1::0;7304:2;7284:18;;;7277:30;7343:25;7323:18;;;7316:53;7386:18;;27126:56:0::1;7063:347:1::0;27126:56:0::1;27198:9;27193:314;27217:9;:16:::0;27213:20;::::1;27193:314;;;27275:7;-1:-1:-1::0;;;;;27259:23:0::1;:9;27269:1;27259:12;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;27259:12:0::1;:23:::0;27255:241:::1;;27318:9;27328:16:::0;;:20:::1;::::0;27347:1:::1;::::0;27328:20:::1;:::i;:::-;27318:31;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;27303:9:::1;:12:::0;;-1:-1:-1;;;;;27318:31:0;;::::1;::::0;27313:1;;27303:12;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;;::::1;:46:::0;;-1:-1:-1;;;;;;27303:46:0::1;-1:-1:-1::0;;;;;27303:46:0;;::::1;;::::0;;27368:16;;::::1;::::0;;:7:::1;:16:::0;;;;;;:20;;;27407:11:::1;:20:::0;;;;:28;;-1:-1:-1;;27407:28:0::1;::::0;;27454:9:::1;:15:::0;;;::::1;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;-1:-1:-1;;27454:15:0;;;;;-1:-1:-1;;;;;;27454:15:0::1;::::0;;;;;27193:314:::1;27050:464:::0;:::o;27255:241::-:1;27235:3:::0;::::1;::::0;::::1;:::i;:::-;;;;27193:314;;;;27050:464:::0;:::o;12474:134::-;12549:4;12556:37;12565:10;12577:7;12586:6;12556:8;:37::i;:::-;-1:-1:-1;12602:4:0;12474:134;;;;;:::o;19383:117::-;19447:45;19466:10;19478:6;19486:5;19447:18;:45::i;:::-;19383:117;:::o;12888:309::-;12986:4;13003:36;13013:6;13021:9;13032:6;13003:9;:36::i;:::-;13050:117;13059:6;13067:10;13079:87;13115:6;13079:87;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;13079:19:0;;;;;;:11;:19;;;;;;;;13099:10;13079:31;;;;;;;;;:87;:35;:87::i;:::-;13050:8;:117::i;:::-;-1:-1:-1;13185:4:0;12888:309;;;;;:::o;26707:335::-;6242:4;6267:5;-1:-1:-1;;;;;6267:5:0;6154:10;6256:16;6138:38;;;;-1:-1:-1;;;6138:38:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;26792:20:0;::::1;;::::0;;;:11:::1;:20;::::0;;;;;::::1;;26791:21;26783:61;;;::::0;-1:-1:-1;;;26783:61:0;;8286:2:1;26783:61:0::1;::::0;::::1;8268:21:1::0;8325:2;8305:18;;;8298:30;8364:29;8344:18;;;8337:57;8411:18;;26783:61:0::1;8084:351:1::0;26783:61:0::1;-1:-1:-1::0;;;;;26858:16:0;::::1;26877:1;26858:16:::0;;;:7:::1;:16;::::0;;;;;:20;26855:108:::1;;-1:-1:-1::0;;;;;26934:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;;26914:37:::1;::::0;:19:::1;:37::i;:::-;-1:-1:-1::0;;;;;26895:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;:56;26855:108:::1;-1:-1:-1::0;;;;;26973:20:0::1;;::::0;;;:11:::1;:20;::::0;;;;:27;;-1:-1:-1;;26973:27:0::1;26996:4;26973:27:::0;;::::1;::::0;;;27011:9:::1;:23:::0;;;;::::1;::::0;;;;;;::::1;::::0;;-1:-1:-1;;;;;;27011:23:0::1;::::0;;::::1;::::0;;26707:335::o;22168:83::-;6242:4;6267:5;-1:-1:-1;;;;;6267:5:0;6154:10;6256:16;6138:38;;;;-1:-1:-1;;;6138:38:0;;;;;;;:::i;:::-;22222:14:::1;:21:::0;;-1:-1:-1;;22222:21:0::1;22239:4;22222:21;::::0;;22168:83::o;25803:143::-;25856:7;25883:55;25916:21;25934:1;25916:9;:21::i;:::-;25905:4;;25883:28;;25895:15;;-1:-1:-1;;;;;25905:4:0;25895:9;:15::i;:::-;25883:7;;;:11;:28::i;:::-;:32;;:55::i;:::-;25876:62;;25803:143;:::o;24050:182::-;6242:4;6267:5;-1:-1:-1;;;;;6267:5:0;6154:10;6256:16;6138:38;;;;-1:-1:-1;;;6138:38:0;;;;;;;:::i;:::-;24160:36:::1;24189:6;24160:24;24172:11;24160:7;;:11;;:24;;;;:::i;:::-;:28:::0;::::1;:36::i;:::-;24147:10;:49:::0;24198:11:::1;:26:::0;-1:-1:-1;24050:182:0:o;26451:248::-;26517:7;26556;;26545;:18;;26537:73;;;;-1:-1:-1;;;26537:73:0;;8642:2:1;26537:73:0;;;8624:21:1;8681:2;8661:18;;;8654:30;8720:34;8700:18;;;8693:62;-1:-1:-1;;;8771:18:1;;;8764:40;8821:19;;26537:73:0;8440:406:1;26537:73:0;26621:19;26644:10;:8;:10::i;:::-;26621:33;-1:-1:-1;26672:19:0;26621:33;26672:7;:19;:::i;:::-;26665:26;26451:248;-1:-1:-1;;;26451:248:0:o;24479:182::-;6242:4;6267:5;-1:-1:-1;;;;;6267:5:0;6154:10;6256:16;6138:38;;;;-1:-1:-1;;;6138:38:0;;;;;;;:::i;:::-;24599:16:::1;::::0;24559:21:::1;::::0;-1:-1:-1;;;;;24599:16:0::1;24591:62;24626:26;24648:3;24626:17;24559:21:::0;24640:2;24626:13:::1;:17::i;:26::-;24591:62;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;24528:133;24479:182:::0;:::o;13205:209::-;13319:10;13293:4;13340:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;13340:32:0;;;;;;;;;;13293:4;;13310:74;;13331:7;;13340:43;;13373:10;;13340:43;:::i;25954:489::-;26044:7;26083;;26072;:18;;26064:62;;;;-1:-1:-1;;;26064:62:0;;9405:2:1;26064:62:0;;;9387:21:1;9444:2;9424:18;;;9417:30;9483:33;9463:18;;;9456:61;9534:18;;26064:62:0;9203:355:1;26064:62:0;26142:17;26137:299;;26176:28;26207:46;26218:7;26227:4;26233:5;26240;26247;26207:10;:46::i;:::-;26275:9;;-1:-1:-1;26268:16:0;;-1:-1:-1;26268:16:0;26137:299;26317:28;26348:46;26359:7;26368:4;26374:5;26381;26388;26348:10;:46::i;:::-;26416:17;;;;-1:-1:-1;26409:24:0;;-1:-1:-1;26409:24:0;19508:103;19565:38;19577:10;19589:6;19597:5;19565:11;:38::i;22259:175::-;6242:4;6267:5;-1:-1:-1;;;;;6267:5:0;6154:10;6256:16;6138:38;;;;-1:-1:-1;;;6138:38:0;;;;;;;:::i;:::-;22351:19:::1;::::0;22331:40:::1;::::0;:15:::1;::::0;:19:::1;:40::i;:::-;22313:15;:58:::0;22413:12:::1;::::0;22393:33:::1;::::0;:15:::1;::::0;:19:::1;:33::i;:::-;22382:8;:44:::0;22259:175::o;12016:173::-;-1:-1:-1;;;;;12096:20:0;;12082:7;12096:20;;;:11;:20;;;;;;;;12092:49;;;-1:-1:-1;;;;;;12125:16:0;;;;;:7;:16;;;;;;;12016:173::o;12092:49::-;-1:-1:-1;;;;;12170:16:0;;;;;;:7;:16;;;;;;12150:37;;:19;:37::i;22593:124::-;6242:4;6267:5;-1:-1:-1;;;;;6267:5:0;6154:10;6256:16;6138:38;;;;-1:-1:-1;;;6138:38:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;22677:21:0::1;;::::0;;;:11:::1;:21;::::0;;;;:32;;-1:-1:-1;;22677:32:0::1;::::0;::::1;;::::0;;;::::1;::::0;;22593:124::o;22725:442::-;6242:4;6267:5;-1:-1:-1;;;;;6267:5:0;6154:10;6256:16;6138:38;;;;-1:-1:-1;;;6138:38:0;;;;;;;:::i;:::-;22884:8:::1;:15:::0;;;22901:7:::1;:15:::0;;;22918:11:::1;:20:::0;;;22949:8:::1;:27:::0;;;22987:18;:31;;;23029:18;:31;;;23091:11:::1;::::0;23079:23;::::1;::::0;::::1;::::0;:49:::1;;;23117:11;;23106:7;;:22;;23079:49;:79;;;;;23147:11;;23132;;:26;;23079:79;23071:88;;;::::0;::::1;;22725:442:::0;;;;;;:::o;25096:445::-;6242:4;6267:5;-1:-1:-1;;;;;6267:5:0;6154:10;6256:16;6138:38;;;;-1:-1:-1;;;6138:38:0;;;;;;;:::i;:::-;25180:13:::1;25196:43;25226:11;;25196:17;25208:4;25196:7;;:11;;:17;;;;:::i;:43::-;25180:59;;25250:17;25270:46;25303:11;;25270:20;25282:7;25270;;:11;;:20;;;;:::i;:46::-;25250:66;;25318:13;25334:26;25353:6;25334:14;25346:1;25334:7:::0;::::1;:11;;:14;;;;:::i;:26::-;25318:42;;25388:5;25379;:14;;:36;;;;;25410:5;25397:9;:18;;25379:36;25371:102;;;::::0;-1:-1:-1;;;25371:102:0;;9765:2:1;25371:102:0::1;::::0;::::1;9747:21:1::0;9804:2;9784:18;;;9777:30;9843:34;9823:18;;;9816:62;-1:-1:-1;;;9894:18:1;;;9887:51;9955:19;;25371:102:0::1;9563:417:1::0;25371:102:0::1;-1:-1:-1::0;25484:12:0::1;:20:::0;;;;25506:15:::1;:27:::0;-1:-1:-1;;25096:445:0:o;13695:157::-;-1:-1:-1;;;;;13828:15:0;;13760:7;13828:15;;;:7;:15;;;;;;;;;13807:7;:15;;;;;;13787:57;;13828:15;13787:36;;:19;:36::i;24669:117::-;6242:4;6267:5;-1:-1:-1;;;;;6267:5:0;6154:10;6256:16;6138:38;;;;-1:-1:-1;;;6138:38:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;24750:19:0;;;::::1;;::::0;;;:11:::1;:19;::::0;;;;:28;;-1:-1:-1;;24750:28:0::1;::::0;::::1;;::::0;;;::::1;::::0;;24669:117::o;23175:322::-;6242:4;6267:5;-1:-1:-1;;;;;6267:5:0;6154:10;6256:16;6138:38;;;;-1:-1:-1;;;6138:38:0;;;;;;;:::i;:::-;23293:18:::1;:31:::0;;-1:-1:-1;;;;;23293:31:0;;::::1;-1:-1:-1::0;;;;;;23293:31:0;;::::1;::::0;::::1;::::0;;;23326:18:::1;:31:::0;;;;::::1;::::0;;::::1;::::0;::::1;::::0;;23359:16:::1;:27:::0;;;;;::::1;::::0;::::1;::::0;::::1;::::0;;;23293:18:::1;23397:23:::0;;;:11:::1;:23;::::0;;;;;:30;;-1:-1:-1;;23397:30:0;;::::1;23293:31:::0;23397:30;;::::1;::::0;;;23429:23;;;;;;:30;;;::::1;::::0;::::1;::::0;;23461:21;;;;;;:28;;;;::::1;::::0;;::::1;::::0;;23175:322::o;24240:231::-;6242:4;6267:5;-1:-1:-1;;;;;6267:5:0;6154:10;6256:16;6138:38;;;;-1:-1:-1;;;6138:38:0;;;;;;;:::i;:::-;24378:43:::1;24414:6;24378:31;24390:18;24378:7;;:11;;:31;;;;:::i;:43::-;24358:17;:63:::0;24423:18:::1;:40:::0;-1:-1:-1;24240:231:0:o;22442:143::-;6242:4;6267:5;-1:-1:-1;;;;;6267:5:0;6154:10;6256:16;6138:38;;;;-1:-1:-1;;;6138:38:0;;;;;;;:::i;:::-;22517:4:::1;:18:::0;;-1:-1:-1;;;;;22517:18:0;;::::1;-1:-1:-1::0;;;;;;22517:18:0;;::::1;::::0;::::1;::::0;;:4:::1;22537:33:::0;;;:11:::1;:33;::::0;;;;:40;;-1:-1:-1;;22537:40:0::1;22517:18:::0;22537:40:::1;::::0;;22442:143::o;13422:265::-;13515:4;13532:125;13541:10;13553:7;13562:94;13599:15;13562:94;;;;;;;;;;;;;;;;;13574:10;13562:23;;;;:11;:23;;;;;;;;-1:-1:-1;;;;;13562:32:0;;;;;;;;;;;:94;:36;:94::i;12195:140::-;12273:4;12280:40;12290:10;12302:9;12313:6;12280:9;:40::i;25549:246::-;6242:4;6267:5;-1:-1:-1;;;;;6267:5:0;6154:10;6256:16;6138:38;;;;-1:-1:-1;;;6138:38:0;;;;;;;:::i;:::-;25671:39:::1;::::0;-1:-1:-1;;;25671:39:0;;25704:4:::1;25671:39;::::0;::::1;5156:51:1::0;25656:12:0::1;::::0;-1:-1:-1;;;;;25671:24:0;::::1;::::0;::::1;::::0;5129:18:1;;25671:39:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25656:54:::0;-1:-1:-1;;;;;;25721:23:0;::::1;;25745:9:::0;25756:30:::1;25782:3;25756:21;25656:54:::0;25765:11;25756:8:::1;:21::i;:30::-;25721:66;::::0;-1:-1:-1;;;;;;25721:66:0::1;::::0;;;;;;-1:-1:-1;;;;;10366:32:1;;;25721:66:0::1;::::0;::::1;10348:51:1::0;10415:18;;;10408:34;10321:18;;25721:66:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;25645:150;25549:246:::0;;;:::o;23885:157::-;6242:4;6267:5;-1:-1:-1;;;;;6267:5:0;6154:10;6256:16;6138:38;;;;-1:-1:-1;;;6138:38:0;;;;;;;:::i;:::-;23981:11:::1;:21:::0;;;::::1;;-1:-1:-1::0;;;23981:21:0::1;-1:-1:-1::0;;;;23981:21:0;;::::1;::::0;;;::::1;::::0;;;24004:19:::1;:30:::0;23885:157::o;23741:136::-;6242:4;6267:5;-1:-1:-1;;;;;6267:5:0;6154:10;6256:16;6138:38;;;;-1:-1:-1;;;6138:38:0;;;;;;;:::i;:::-;23830:4:::1;:14:::0;;;::::1;;-1:-1:-1::0;;;23830:14:0::1;-1:-1:-1::0;;;;23830:14:0;;::::1;::::0;;;::::1;::::0;;;23846:12:::1;:23:::0;23741:136::o;24794:294::-;6242:4;6267:5;-1:-1:-1;;;;;6267:5:0;6154:10;6256:16;6138:38;;;;-1:-1:-1;;;6138:38:0;;;;;;;:::i;:::-;24922:10:::1;:24:::0;;;24964:7:::1;::::0;:48:::1;::::0;25004:6:::1;::::0;24964:27:::1;::::0;24976:14;24964:11:::1;:27::i;:48::-;24948:13;:64:::0;25032:7:::1;::::0;:48:::1;::::0;25072:6:::1;::::0;25032:27:::1;::::0;25044:14;25032:11:::1;:27::i;:48::-;25014:15;:66:::0;-1:-1:-1;;;24794:294:0:o;23505:228::-;6242:4;6267:5;-1:-1:-1;;;;;6267:5:0;6154:10;6256:16;6138:38;;;;-1:-1:-1;;;6138:38:0;;;;;;;:::i;:::-;23603:17:::1;:32:::0;;-1:-1:-1;;;;;23603:32:0;;::::1;-1:-1:-1::0;;;;;;23603:32:0;;::::1;::::0;::::1;::::0;;;23637:10:::1;:18:::0;;;;;::::1;::::0;::::1;::::0;::::1;::::0;;;23603:17:::1;23666:25:::0;;;:11:::1;:25;::::0;;;;;:32;;-1:-1:-1;;23666:32:0;;::::1;23603::::0;23666;;::::1;::::0;;;23700:18;;;;;:25;;;;::::1;::::0;;::::1;::::0;;23505:228::o;6280:111::-;6242:4;6267:5;-1:-1:-1;;;;;6267:5:0;6154:10;6256:16;6138:38;;;;-1:-1:-1;;;6138:38:0;;;;;;;:::i;:::-;6346:5:::1;:11:::0;;-1:-1:-1;;;;;;6346:11:0::1;-1:-1:-1::0;;;;;6346:11:0;::::1;::::0;;::::1;::::0;;;6364:25:::1;::::0;5156:51:1;;;6364:25:0::1;::::0;5144:2:1;5129:18;6364:25:0::1;;;;;;;6280:111:::0;:::o;13860:335::-;-1:-1:-1;;;;;13953:19:0;;13945:68;;;;-1:-1:-1;;;13945:68:0;;11121:2:1;13945:68:0;;;11103:21:1;11160:2;11140:18;;;11133:30;11199:34;11179:18;;;11172:62;-1:-1:-1;;;11250:18:1;;;11243:34;11294:19;;13945:68:0;10919:400:1;13945:68:0;-1:-1:-1;;;;;14032:21:0;;14024:68;;;;-1:-1:-1;;;14024:68:0;;11526:2:1;14024:68:0;;;11508:21:1;11565:2;11545:18;;;11538:30;11604:34;11584:18;;;11577:62;-1:-1:-1;;;11655:18:1;;;11648:32;11697:19;;14024:68:0;11324:398:1;14024:68:0;-1:-1:-1;;;;;14103:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;14155:32;;160:25:1;;;14155:32:0;;133:18:1;14155:32:0;;;;;;;13860:335;;;:::o;17895:780::-;17995:12;:19;;-1:-1:-1;;;;17995:19:0;-1:-1:-1;;;17995:19:0;;;18025:304;;;;18043:22;18068:69;18125:11;;18068:52;18101:18;;18068:28;18078:17;;;;;;;;;-1:-1:-1;;;;;18078:17:0;18068:9;:28::i;:::-;:32;;:52::i;:69::-;18043:94;;18168:6;18151:14;:23;18148:53;;;18185:14;18176:23;;18148:53;18246:17;;18211:22;;18236:28;;-1:-1:-1;;;;;18246:17:0;18236:9;:28::i;:::-;18211:53;;18295:6;18278:14;:23;18275:53;;;18312:14;18303:23;;18275:53;18042:287;;18025:304;18357:15;;:27;;18377:6;18357:19;:27::i;:::-;18339:15;:45;18417:15;18395:19;:37;18467:21;;:37;;18501:1;18467:25;:37::i;:::-;18443:21;:61;18515:39;18524:6;18540:4;18547:6;18515:8;:39::i;:::-;18565:71;18580:6;18596:3;18602:6;18610:5;18617;18624;18631:4;18565:14;:71::i;:::-;-1:-1:-1;;18647:12:0;:20;;-1:-1:-1;;;;18647:20:0;;;-1:-1:-1;17895:780:0:o;14203:594::-;14292:37;14303:6;14311:9;14322:6;14292:10;:37::i;:::-;14340:38;14360:6;14368:9;14340:19;:38::i;:::-;14389:41;14404:6;14412:9;14423:6;14389:14;:41::i;:::-;14442:39;14455:9;14466:6;14474;14442:12;:39::i;:::-;14492:35;14509:6;14517:9;14492:16;:35::i;:::-;14538;14547:6;14555:9;14566:6;14538:8;:35::i;:::-;14584:33;14599:6;14607:9;14584:14;:33::i;:::-;-1:-1:-1;;;;;14672:19:0;;;;;;:11;:19;;;;;;14628:161;;14643:6;;14651:9;;14662:6;;14672:19;;;:45;;-1:-1:-1;;;;;;14695:22:0;;;;;;:11;:22;;;;;;;;14672:45;:57;;;-1:-1:-1;14721:8:0;;;;14672:57;:73;;;-1:-1:-1;14733:12:0;;-1:-1:-1;;;14733:12:0;;;;14672:73;14761:4;;14670:76;;;-1:-1:-1;;;;;14761:4:0;;;14748:17;;;;;;14767:14;;;14761:4;14628:14;:161::i;1531:162::-;1617:7;1663:12;1655:6;;;;1647:29;;;;-1:-1:-1;;;1647:29:0;;;;;;;;:::i;:::-;-1:-1:-1;;;1685:5:0;;;1531:162::o;318:82::-;376:7;393:5;397:1;393;:5;:::i;406:82::-;464:7;481:5;485:1;481;:5;:::i;494:82::-;552:7;569:5;573:1;569;:5;:::i;30742:158::-;30783:7;30804:15;30821;30840:19;:17;:19::i;:::-;30803:56;;-1:-1:-1;30803:56:0;-1:-1:-1;30877:15:0;30803:56;;30877:15;:::i;:::-;30870:22;;;;30742:158;:::o;27786:444::-;27909:36;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27909:36:0;27970:64;27982:7;27991;28000:6;28008:10;28020:13;27970:11;:64::i;:::-;27958:76;;28128:67;28140:9;28151:7;28160;28169:10;:8;:10::i;:::-;28181:13;28128:11;:67::i;:::-;28108:16;;;28045:150;28092:14;;;28045:150;28065:25;;;28045:150;;;27786:444;;;;;;;;:::o;18683:692::-;18769:12;:19;;-1:-1:-1;;;;18769:19:0;-1:-1:-1;;;18769:19:0;;;18799:259;;;;18810:19;18832:55;18875:11;;18832:38;18858:11;;18832:21;18842:10;;;;;;;;;-1:-1:-1;;;;;18842:10:0;18832:9;:21::i;:55::-;18810:77;;18915:6;18901:11;:20;18898:47;;;18932:11;18923:20;;18898:47;18987:10;;18955:19;;18977:21;;-1:-1:-1;;;;;18987:10:0;18977:9;:21::i;:::-;18955:43;;19027:6;19012:11;:21;19009:48;;19044:11;19035:20;;19009:48;18809:249;;18799:259;19080:9;;:21;;19094:6;19080:13;:21::i;:::-;19068:9;:33;19127:15;19112:12;:30;19171:15;;:31;;19199:1;19171:19;:31::i;:::-;19153:15;:49;19213:39;19222:6;19238:4;19245:6;19213:8;:39::i;:::-;19294:4;;19263:73;;19278:6;;-1:-1:-1;;;;;19294:4:0;19301:6;19294:4;;;;19263:14;:73::i;230:82::-;288:7;305:5;309:1;305;:5;:::i;16352:863::-;16511:28;16542:63;16553:7;16562;16571:6;16579:10;16591:13;16542:10;:63::i;:::-;-1:-1:-1;;;;;16619:19:0;;;;;;:11;:19;;;;;;16511:94;;-1:-1:-1;16619:19:0;;16616:83;;;-1:-1:-1;;;;;16674:15:0;;;;;;:7;:15;;;;;;:23;;16690:7;;16674:23;:::i;:::-;-1:-1:-1;;;;;16656:15:0;;;;;;:7;:15;;;;;:41;16616:83;-1:-1:-1;;;;;16712:22:0;;;;;;:11;:22;;;;;;;;16709:101;;;16791:17;;;;-1:-1:-1;;;;;16772:18:0;;;;;;:7;:18;;;;;;:36;;16791:17;16772:36;:::i;:::-;-1:-1:-1;;;;;16751:18:0;;;;;;:7;:18;;;;;:57;16709:101;16854:9;;-1:-1:-1;;;;;16838:15:0;;16854:9;16838:15;;;:7;:15;;;;;;:25;;16854:9;16838:25;:::i;:::-;-1:-1:-1;;;;;16820:15:0;;;;;;;:7;:15;;;;;;;;:43;;;;16914:17;;;16895:18;;;;;;;;;;:36;;16914:17;16895:36;:::i;:::-;-1:-1:-1;;;;;16874:18:0;;;;;;:7;:18;;;;;;;:57;;;;16954:6;;;16962;;;;16942:42;;16954:6;16970:13;16942:11;:42::i;:::-;16995:30;17006:1;:8;;;17016:1;:8;;;16995:10;:30::i;:::-;17039:17;;;;:30;17036:88;;17093:9;-1:-1:-1;;;;;17076:46:0;17085:6;-1:-1:-1;;;;;17076:46:0;;17104:1;:17;;;17076:46;;;;160:25:1;;148:2;133:18;;14:177;17076:46:0;;;;;;;;17036:88;17137:8;;;;:21;17134:74;;17190:4;-1:-1:-1;;;;;17165:41:0;17174:6;-1:-1:-1;;;;;17165:41:0;;17197:1;:8;;;17165:41;;;;160:25:1;;148:2;133:18;;14:177;17165:41:0;;;;;;;;17134:74;16500:715;16352:863;;;;;;;:::o;14805:355::-;-1:-1:-1;;;;;14909:20:0;;14901:70;;;;-1:-1:-1;;;14901:70:0;;12102:2:1;14901:70:0;;;12084:21:1;12141:2;12121:18;;;12114:30;12180:34;12160:18;;;12153:62;-1:-1:-1;;;12231:18:1;;;12224:35;12276:19;;14901:70:0;11900:401:1;14901:70:0;-1:-1:-1;;;;;14990:23:0;;14982:71;;;;-1:-1:-1;;;14982:71:0;;12508:2:1;14982:71:0;;;12490:21:1;12547:2;12527:18;;;12520:30;12586:34;12566:18;;;12559:62;-1:-1:-1;;;12637:18:1;;;12630:33;12680:19;;14982:71:0;12306:399:1;14982:71:0;15082:17;15092:6;15082:9;:17::i;:::-;15072:6;:27;;15064:88;;;;-1:-1:-1;;;15064:88:0;;12912:2:1;15064:88:0;;;12894:21:1;12951:2;12931:18;;;12924:30;12990:34;12970:18;;;12963:62;-1:-1:-1;;;13041:18:1;;;13034:47;13098:19;;15064:88:0;12710:413:1;15168:206:0;-1:-1:-1;;;;;15261:19:0;;;;;;:11;:19;;;;;;;;15260:20;:47;;;;-1:-1:-1;;;;;;15285:22:0;;;;;;:11;:22;;;;;;;;15284:23;15260:47;15257:110;;;15317:14;;;;15309:56;;;;-1:-1:-1;;;15309:56:0;;13330:2:1;15309:56:0;;;13312:21:1;13369:2;13349:18;;;13342:30;13408:31;13388:18;;;13381:59;13457:18;;15309:56:0;13128:353:1;15386:384:0;-1:-1:-1;;;;;15490:22:0;;;;;;:11;:22;;;;;;;;15489:23;:47;;;;-1:-1:-1;;;;;;15517:19:0;;;;;;:11;:19;;;;;;;;15516:20;15489:47;:77;;;;-1:-1:-1;;;;;;15540:26:0;;15561:4;15540:26;;15489:77;:107;;;;-1:-1:-1;15591:4:0;;-1:-1:-1;;;;;15570:26:0;;;15591:4;;15570:26;;15489:107;:128;;;;-1:-1:-1;15613:4:0;;-1:-1:-1;;;;;15600:17:0;;;15613:4;;15600:17;;15489:128;:163;;;;-1:-1:-1;15634:18:0;;-1:-1:-1;;;;;15621:31:0;;;15634:18;;15621:31;;15489:163;15486:277;;;15711:15;;15700:6;15677:20;15687:9;15677;:20::i;:::-;:29;;;;:::i;:::-;15676:50;;15668:93;;;;-1:-1:-1;;;15668:93:0;;13688:2:1;15668:93:0;;;13670:21:1;13727:2;13707:18;;;13700:30;13766:32;13746:18;;;13739:60;13816:18;;15668:93:0;13486:354:1;15980:193:0;16089:12;;16079:6;:22;;:45;;;-1:-1:-1;;;;;;16105:19:0;;;;;;:11;:19;;;;;;;;16079:45;:64;;;-1:-1:-1;;;;;;16128:15:0;;;;;;:11;:15;;;;;;;;16079:64;16071:94;;;;-1:-1:-1;;;16071:94:0;;14047:2:1;16071:94:0;;;14029:21:1;14086:2;14066:18;;;14059:30;-1:-1:-1;;;14105:18:1;;;14098:47;14162:18;;16071:94:0;13845:341:1;15778:194:0;15875:4;;-1:-1:-1;;;;;15862:17:0;;;15875:4;;15862:17;:41;;;;-1:-1:-1;;;;;;15884:19:0;;;;;;:11;:19;;;;;;;;15883:20;15862:41;:54;;;;-1:-1:-1;15908:8:0;;;;15907:9;15862:54;:71;;;;-1:-1:-1;15921:12:0;;-1:-1:-1;;;15921:12:0;;;;15920:13;15862:71;15859:106;;;15947:9;;:16;;15961:1;15947:13;:16::i;:::-;15935:9;:28;15778:194;;:::o;20058:188::-;20150:41;20165:6;20173:9;20184:6;20150:14;:41::i;:::-;20147:92;;;20193:29;20208:13;;20193:14;:29::i;:::-;20236:1;20224:9;:13;20058:188;;;:::o;17223:664::-;17324:15;17305;;:34;;:47;;;;-1:-1:-1;17344:8:0;;;;17343:9;17305:47;:68;;;;-1:-1:-1;17369:4:0;;-1:-1:-1;;;;;17356:17:0;;;17369:4;;17356:17;17305:68;:92;;;;-1:-1:-1;;;;;;17378:19:0;;;;;;:11;:19;;;;;;;;17377:20;17305:92;:107;;;;-1:-1:-1;17401:11:0;;-1:-1:-1;;;17401:11:0;;;;17305:107;:152;;;;-1:-1:-1;17426:17:0;;17455:1;;17416:28;;-1:-1:-1;;;;;17426:17:0;17416:9;:28::i;:::-;:41;17305:152;:169;;;;-1:-1:-1;17462:12:0;;-1:-1:-1;;;17462:12:0;;;;17461:13;17305:169;17302:312;;;17509:17;;17528;;17490:62;;-1:-1:-1;;;;;17509:17:0;;;17490:18;:62::i;:::-;17592:19;;17572:40;;:15;;:19;:40::i;:::-;17554:15;:58;17302:312;17639:15;17627:8;;:27;;:40;;;;-1:-1:-1;17659:8:0;;;;17658:9;17627:40;:61;;;;-1:-1:-1;17684:4:0;;-1:-1:-1;;;;;17671:17:0;;;17684:4;;17671:17;17627:61;:85;;;;-1:-1:-1;;;;;;17693:19:0;;;;;;:11;:19;;;;;;;;17692:20;17627:85;:93;;;;-1:-1:-1;17716:4:0;;-1:-1:-1;;;17716:4:0;;;;17627:93;:131;;;;-1:-1:-1;17734:10:0;;17756:1;;17724:21;;-1:-1:-1;;;;;17734:10:0;17724:9;:21::i;:::-;:34;17627:131;:148;;;;-1:-1:-1;17763:12:0;;-1:-1:-1;;;17763:12:0;;;;17762:13;17627:148;17624:256;;;17803:10;;17815;;17791:41;;-1:-1:-1;;;;;17803:10:0;;;17791:11;:41::i;:::-;17865:12;;17845:33;;:15;;:19;:33::i;:::-;17834:8;:44;17223:664;;:::o;30908:531::-;31005:7;;31041;;30958;;;;;31059:270;31083:9;:16;31079:20;;31059:270;;;31149:7;31125;:21;31133:9;31143:1;31133:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;31133:12:0;31125:21;;;;;;;;;;;;;:31;;:66;;;31184:7;31160;:21;31168:9;31178:1;31168:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;31168:12:0;31160:21;;;;;;;;;;;;;:31;31125:66;31121:97;;;31201:7;;31210;;31193:25;;;;;;;30908:531;;:::o;31121:97::-;31251:7;:21;31259:9;31269:1;31259:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;31259:12:0;31251:21;;;;;;;;;;;;;31243:29;;:7;:29;:::i;:::-;31233:39;;31305:7;:21;31313:9;31323:1;31313:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;31313:12:0;31305:21;;;;;;;;;;;;;31297:29;;:7;:29;:::i;:::-;31287:39;-1:-1:-1;31101:3:0;;;;:::i;:::-;;;;31059:270;;;;31361:7;;31353;;:15;;;;:::i;:::-;31343:7;:25;31339:56;;;31378:7;;31387;;31370:25;;;;;;30908:531;;:::o;31339:56::-;31414:7;;31423;;-1:-1:-1;30908:531:0;-1:-1:-1;30908:531:0:o;28456:1361::-;28580:28;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28580:28:0;28625:7;28624:8;:26;;;;;28637:13;28636:14;28624:26;:77;;;;28654:29;28664:6;28672:10;28654:9;:29::i;:::-;:47;;;;;28688:13;28687:14;28654:47;28621:146;;;28716:17;;;:27;;;28756:8;;28621:146;28781:6;28780:7;:22;;;;;28792:10;28791:11;28780:22;:40;;;;;28807:13;28806:14;28780:40;28777:311;;;28836:17;28856:41;28885:11;;28856:24;28868:11;;28856:7;:11;;:24;;;;:::i;:41::-;28836:61;;28931:11;;28915:8;:12;;;:27;28912:75;;28974:11;;28961:8;:12;28953:20;;:7;:20;:::i;:::-;:32;;;;:::i;:::-;28944:6;;;:41;28912:75;29026:6;;;;29012:21;;:9;;:13;:21::i;:::-;29001:8;;;:32;29068:17;29076:9;29068:7;:17;:::i;:::-;29048;;;:37;-1:-1:-1;28777:311:0;29101:6;:24;;;;;29112:13;29111:14;29101:24;29098:287;;;29141:17;29161:37;29186:11;;29161:20;29173:7;;29161;:11;;:20;;;;:::i;:37::-;29141:57;;29232:7;;29216:8;:12;;;:23;29213:71;;29271:11;;29258:8;:12;29250:20;;:7;:20;:::i;:::-;:32;;;;:::i;:::-;29241:6;;;:41;29213:71;29323:6;;;;29309:21;;:9;;:13;:21::i;:::-;29298:8;;;:32;29365:17;29373:9;29365:7;:17;:::i;:::-;29345;;;:37;-1:-1:-1;29098:287:0;29398:10;:28;;;;;29413:13;29412:14;29398:28;29395:293;;;29442:17;29462:38;29488:11;;29462:21;29474:8;;29462:7;:11;;:21;;;;:::i;:38::-;29442:58;;29534:8;;29518;:12;;;:24;29515:72;;29574:11;;29561:8;:12;29553:20;;:7;:20;:::i;:::-;:32;;;;:::i;:::-;29544:6;;;:41;29515:72;29626:6;;;;29612:21;;:9;;:13;:21::i;:::-;29601:8;;;:32;29668:17;29676:9;29668:7;:17;:::i;:::-;29648;;;:37;-1:-1:-1;29395:293:0;29701:13;29698:93;;;29730:6;;;:16;;;29761:17;;;:27;;;28456:1361;;;;;;;:::o;29825:705::-;29970:15;;;;30063:19;30071:11;30063:7;:19;:::i;:::-;30053:29;;30097:7;30096:8;:26;;;;;30109:13;30108:14;30096:26;30093:76;;;-1:-1:-1;30145:7:0;;-1:-1:-1;30163:1:0;;-1:-1:-1;30163:1:0;30138:29;;30093:76;30182:13;30179:161;;;30225:11;30218:1;:6;;;:18;;;;:::i;:::-;30211:25;-1:-1:-1;30270:12:0;30211:25;30270:7;:12;:::i;:::-;30251:31;-1:-1:-1;30336:1:0;;-1:-1:-1;30297:41:0;;30179:161;30364:11;30357:1;:6;;;:18;;;;:::i;:::-;30350:25;;30404:11;30395:1;:8;;;:20;;;;:::i;:::-;30386:29;-1:-1:-1;30386:29:0;30445:12;30453:4;30445:7;:12;:::i;:::-;:19;;;;:::i;:::-;30426:38;;29825:705;;;;;;;;;;;:::o;16181:163::-;16279:4;16269:7;;:14;;;;;;;:::i;:::-;;;;-1:-1:-1;16298:13:0;;-1:-1:-1;16294:43:0;;16331:4;16313:11;:15;;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;16181:163:0;;;:::o;27522:256::-;27613:6;27593:11;:17;;;:26;;;;;;;:::i;:::-;;;;-1:-1:-1;;27655:4:0;27635:26;;;;:11;:26;;;;;;;;27632:97;;;27703:4;27687:22;;;;:7;:22;;;;;:30;;27711:6;;27687:22;:30;;27711:6;;27687:30;:::i;:::-;;;;-1:-1:-1;;27632:97:0;27755:4;27739:22;;;;:7;:22;;;;;:31;;27764:6;;27739:22;:31;;27764:6;;27739:31;:::i;:::-;;;;-1:-1:-1;;;;27522:256:0:o;19620:430::-;19718:4;19735:13;19761:15;;19751:6;:25;;19735:41;;19787:19;19837:13;;19809:24;19827:4;19809:9;:24::i;:::-;19869:8;;19809:41;-1:-1:-1;19809:41:0;;-1:-1:-1;19869:8:0;;19868:9;:24;;;;-1:-1:-1;19881:11:0;;;;;;;19868:24;:36;;;;;19896:8;19868:36;:60;;;;-1:-1:-1;;;;;;19909:19:0;;;;;;:11;:19;;;;;;;;19908:20;19868:60;:78;;;;-1:-1:-1;19932:14:0;;;;19868:78;:112;;;;-1:-1:-1;19976:4:0;;-1:-1:-1;;;;;19963:17:0;;;19976:4;;19963:17;19868:112;:139;;;;;19997:10;;19984:9;;:23;;19868:139;:157;;;;;20011:14;19868:157;:174;;;;-1:-1:-1;20030:12:0;;-1:-1:-1;;;20030:12:0;;;;20029:13;19868:174;19861:181;19620:430;-1:-1:-1;;;;;;19620:430:0:o;20254:1113::-;12842:8;:15;;-1:-1:-1;;12842:15:0;12853:4;12842:15;;;;;;20348:8:::1;::::0;12842;;20347:24:::1;::::0;20369:1:::1;::::0;20347:17:::1;::::0;20348:8;20347:14:::1;:17::i;:24::-;20324:47;;20385:8;;20397:1;20385:13:::0;20382:91:::1;;20438:18:::0;;20415;;:56:::1;::::0;20469:1:::1;::::0;20415:49:::1;::::0;20462:1:::1;::::0;20415:42:::1;::::0;:22:::1;:42::i;:::-;:46:::0;::::1;:49::i;:56::-;20400:71;;20382:91;20527:18:::0;;20483:32:::1;::::0;20548:12;;20518:27:::1;::::0;:6;:27:::1;:::i;:::-;:42;;;;:::i;:::-;20483:77:::0;-1:-1:-1;20571:14:0::1;20588:33;20483:77:::0;20588:6;:33:::1;:::i;:::-;20571:50:::0;-1:-1:-1;20657:21:0::1;20689:24;20571:50:::0;20689:16:::1;:24::i;:::-;20724:20;20747:38;20771:14:::0;20747:21:::1;:38;:::i;:::-;20848:18:::0;;20724:61;;-1:-1:-1;20796:19:0::1;::::0;20833:33:::1;::::0;:12;:33:::1;:::i;:::-;20817:50;::::0;:12;:50:::1;:::i;:::-;20924:18:::0;;20796:71;;-1:-1:-1;20878:29:0::1;::::0;20910:32:::1;::::0;20796:71;20910:32:::1;:::i;:::-;20878:64:::0;-1:-1:-1;20956:25:0;;20953:108:::1;;20997:61;21010:24;21036:21;20997:12;:61::i;:::-;21120:18:::0;;21071:23:::1;::::0;21097:42:::1;::::0;:18:::1;:11:::0;21113:1:::1;21097:15;:18::i;:42::-;21071:68:::0;-1:-1:-1;21153:19:0;;21150:80:::1;;21182:18;::::0;21174:53:::1;::::0;-1:-1:-1;;;;;21182:18:0;;::::1;::::0;21174:53;::::1;;;::::0;21211:15;;21182:18:::1;21174:53:::0;21182:18;21174:53;21211:15;21182:18;21174:53;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;21150:80;21258:21;21293:20:::0;;21290:70:::1;;21323:16;::::0;21315:43:::1;::::0;-1:-1:-1;;;;;21323:16:0;;::::1;::::0;21315:43;::::1;;;::::0;21350:7;;21323:16:::1;21315:43:::0;21323:16;21315:43;21350:7;21323:16;21315:43;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;21290:70;-1:-1:-1::0;;12862:8:0;:16;;-1:-1:-1;;12862:16:0;;;-1:-1:-1;;;;;;;;20254:1113:0:o;28238:210::-;28310:4;28335:6;:22;;;;-1:-1:-1;28345:7:0;;:12;28335:22;28334:57;;;;28363:10;:27;;;;-1:-1:-1;28377:8:0;;:13;28363:27;28334:105;;;;28397:6;28396:7;:22;;;;;28408:10;28407:11;28396:22;:42;;;;-1:-1:-1;;28422:11:0;;:16;;28238:210;-1:-1:-1;;28238:210:0:o;21726:434::-;21816:16;;;21830:1;21816:16;;;;;;;;21792:21;;21816:16;;;;;;;;;;-1:-1:-1;21816:16:0;21792:40;;21861:4;21843;21848:1;21843:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;21843:23:0;;;:7;;;;;;;;;;:23;;;;21887:6;;:13;;;-1:-1:-1;;;21887:13:0;;;;:6;;;;;:11;;:13;;;;;21843:7;;21887:13;;;;;:6;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21877:4;21882:1;21877:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;21877:23:0;;;:7;;;;;;;;;:23;21943:6;;21911:53;;21928:4;;21943:6;21952:11;21911:8;:53::i;:::-;21975:6;;:177;;-1:-1:-1;;;21975:177:0;;-1:-1:-1;;;;;21975:6:0;;;;:57;;:177;;22047:11;;21975:6;;22089:4;;22116;;22136:15;;21975:177;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21375:343;21488:6;;21456:53;;21473:4;;-1:-1:-1;;;;;21488:6:0;21497:11;21456:8;:53::i;:::-;21520:6;;21661:18;;21520:190;;-1:-1:-1;;;21520:190:0;;21583:4;21520:190;;;15905:34:1;15955:18;;;15948:34;;;21520:6:0;15998:18:1;;;15991:34;;;16041:18;;;16034:34;-1:-1:-1;;;;;21661:18:0;;;16084:19:1;;;16077:44;21694:15:0;16137:19:1;;;16130:35;21520:6:0;;;:22;;21550:9;;15839:19:1;;21520:190:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;196:131:1:-;-1:-1:-1;;;;;271:31:1;;261:42;;251:70;;317:1;314;307:12;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;1649:180::-;1708:6;1761:2;1749:9;1740:7;1736:23;1732:32;1729:52;;;1777:1;1774;1767:12;1729:52;-1:-1:-1;1800:23:1;;1649:180;-1:-1:-1;1649:180:1:o;1834:456::-;1911:6;1919;1927;1980:2;1968:9;1959:7;1955:23;1951:32;1948:52;;;1996:1;1993;1986:12;1948:52;2035:9;2022:23;2054:31;2079:5;2054:31;:::i;:::-;2104:5;-1:-1:-1;2161:2:1;2146:18;;2133:32;2174:33;2133:32;2174:33;:::i;:::-;1834:456;;2226:7;;-1:-1:-1;;;2280:2:1;2265:18;;;;2252:32;;1834:456::o;2295:248::-;2363:6;2371;2424:2;2412:9;2403:7;2399:23;2395:32;2392:52;;;2440:1;2437;2430:12;2392:52;-1:-1:-1;;2463:23:1;;;2533:2;2518:18;;;2505:32;;-1:-1:-1;2295:248:1:o;2737:118::-;2823:5;2816:13;2809:21;2802:5;2799:32;2789:60;;2845:1;2842;2835:12;2860:309;2925:6;2933;2986:2;2974:9;2965:7;2961:23;2957:32;2954:52;;;3002:1;2999;2992:12;2954:52;3038:9;3025:23;3015:33;;3098:2;3087:9;3083:18;3070:32;3111:28;3133:5;3111:28;:::i;:::-;3158:5;3148:15;;;2860:309;;;;;:::o;3174:382::-;3239:6;3247;3300:2;3288:9;3279:7;3275:23;3271:32;3268:52;;;3316:1;3313;3306:12;3268:52;3355:9;3342:23;3374:28;3396:5;3374:28;:::i;:::-;3421:5;-1:-1:-1;3478:2:1;3463:18;;3450:32;3491:33;3450:32;3491:33;:::i;3561:523::-;3665:6;3673;3681;3689;3697;3705;3758:3;3746:9;3737:7;3733:23;3729:33;3726:53;;;3775:1;3772;3765:12;3726:53;-1:-1:-1;;3798:23:1;;;3868:2;3853:18;;3840:32;;-1:-1:-1;3919:2:1;3904:18;;3891:32;;3970:2;3955:18;;3942:32;;-1:-1:-1;4021:3:1;4006:19;;3993:33;;-1:-1:-1;4073:3:1;4058:19;4045:33;;-1:-1:-1;3561:523:1;-1:-1:-1;3561:523:1:o;4089:382::-;4154:6;4162;4215:2;4203:9;4194:7;4190:23;4186:32;4183:52;;;4231:1;4228;4221:12;4183:52;4270:9;4257:23;4289:31;4314:5;4289:31;:::i;:::-;4339:5;-1:-1:-1;4396:2:1;4381:18;;4368:32;4409:30;4368:32;4409:30;:::i;4476:529::-;4553:6;4561;4569;4622:2;4610:9;4601:7;4597:23;4593:32;4590:52;;;4638:1;4635;4628:12;4590:52;4677:9;4664:23;4696:31;4721:5;4696:31;:::i;:::-;4746:5;-1:-1:-1;4803:2:1;4788:18;;4775:32;4816:33;4775:32;4816:33;:::i;:::-;4868:7;-1:-1:-1;4927:2:1;4912:18;;4899:32;4940:33;4899:32;4940:33;:::i;:::-;4992:7;4982:17;;;4476:529;;;;;:::o;5218:388::-;5286:6;5294;5347:2;5335:9;5326:7;5322:23;5318:32;5315:52;;;5363:1;5360;5353:12;5315:52;5402:9;5389:23;5421:31;5446:5;5421:31;:::i;5611:309::-;5676:6;5684;5737:2;5725:9;5716:7;5712:23;5708:32;5705:52;;;5753:1;5750;5743:12;5705:52;5792:9;5779:23;5811:28;5833:5;5811:28;:::i;5925:316::-;6002:6;6010;6018;6071:2;6059:9;6050:7;6046:23;6042:32;6039:52;;;6087:1;6084;6077:12;6039:52;-1:-1:-1;;6110:23:1;;;6180:2;6165:18;;6152:32;;-1:-1:-1;6231:2:1;6216:18;;;6203:32;;5925:316;-1:-1:-1;5925:316:1:o;6729:329::-;6931:2;6913:21;;;6970:1;6950:18;;;6943:29;-1:-1:-1;;;7003:2:1;6988:18;;6981:36;7049:2;7034:18;;6729:329::o;7415:127::-;7476:10;7471:3;7467:20;7464:1;7457:31;7507:4;7504:1;7497:15;7531:4;7528:1;7521:15;7547:127;7608:10;7603:3;7599:20;7596:1;7589:31;7639:4;7636:1;7629:15;7663:4;7660:1;7653:15;7679:128;7746:9;;;7767:11;;;7764:37;;;7781:18;;:::i;7812:127::-;7873:10;7868:3;7864:20;7861:1;7854:31;7904:4;7901:1;7894:15;7928:4;7925:1;7918:15;7944:135;7983:3;8004:17;;;8001:43;;8024:18;;:::i;:::-;-1:-1:-1;8071:1:1;8060:13;;7944:135::o;8851:217::-;8891:1;8917;8907:132;;8961:10;8956:3;8952:20;8949:1;8942:31;8996:4;8993:1;8986:15;9024:4;9021:1;9014:15;8907:132;-1:-1:-1;9053:9:1;;8851:217::o;9073:125::-;9138:9;;;9159:10;;;9156:36;;;9172:18;;:::i;9985:184::-;10055:6;10108:2;10096:9;10087:7;10083:23;10079:32;10076:52;;;10124:1;10121;10114:12;10076:52;-1:-1:-1;10147:16:1;;9985:184;-1:-1:-1;9985:184:1:o;10453:245::-;10520:6;10573:2;10561:9;10552:7;10548:23;10544:32;10541:52;;;10589:1;10586;10579:12;10541:52;10621:9;10615:16;10640:28;10662:5;10640:28;:::i;11727:168::-;11800:9;;;11831;;11848:15;;;11842:22;;11828:37;11818:71;;11869:18;;:::i;14323:251::-;14393:6;14446:2;14434:9;14425:7;14421:23;14417:32;14414:52;;;14462:1;14459;14452:12;14414:52;14494:9;14488:16;14513:31;14538:5;14513:31;:::i;14579:980::-;14841:4;14889:3;14878:9;14874:19;14920:6;14909:9;14902:25;14946:2;14984:6;14979:2;14968:9;14964:18;14957:34;15027:3;15022:2;15011:9;15007:18;15000:31;15051:6;15086;15080:13;15117:6;15109;15102:22;15155:3;15144:9;15140:19;15133:26;;15194:2;15186:6;15182:15;15168:29;;15215:1;15225:195;15239:6;15236:1;15233:13;15225:195;;;15304:13;;-1:-1:-1;;;;;15300:39:1;15288:52;;15395:15;;;;15360:12;;;;15336:1;15254:9;15225:195;;;-1:-1:-1;;;;;;;15476:32:1;;;;15471:2;15456:18;;15449:60;-1:-1:-1;;;15540:3:1;15525:19;15518:35;15437:3;14579:980;-1:-1:-1;;;14579:980:1:o;16176:306::-;16264:6;16272;16280;16333:2;16321:9;16312:7;16308:23;16304:32;16301:52;;;16349:1;16346;16339:12;16301:52;16378:9;16372:16;16362:26;;16428:2;16417:9;16413:18;16407:25;16397:35;;16472:2;16461:9;16457:18;16451:25;16441:35;;16176:306;;;;;:::o

Swarm Source

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