ETH Price: $2,514.61 (-0.26%)

Token

Zero Inflation Finance (ZiFi)
 

Overview

Max Total Supply

1,000,000,000 ZiFi

Holders

11

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 9 Decimals)

Balance
175,500 ZiFi

Value
$0.00
0x56189779b0642c506f21616b11088f161b7dbaf8
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:
ZiFi

Compiler Version
v0.8.21+commit.d9974bed

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

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



/**
 * SAFEMATH LIBRARY
 */
library SafeMath {
    
    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 {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            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 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 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 IBEP20 {
    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 getOwner() external view returns (address);
    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);
}

abstract contract Auth {
    address internal owner;
    mapping (address => bool) internal authorizations;

    constructor(address _owner) {
        owner = _owner;
        authorizations[_owner] = true;
    }

    /**
     * Function modifier to require caller to be contract owner
     */
    modifier onlyOwner() {
        require(isOwner(msg.sender), "!OWNER"); _;
    }

    /**
     * Function modifier to require caller to be authorized
     */
    modifier authorized() {
        require(isAuthorized(msg.sender), "!AUTHORIZED"); _;
    }

    /**
     * Authorize address. Owner only
     */
    function authorize(address adr) public onlyOwner {
        authorizations[adr] = true;
    }

    /**
     * Remove address' authorization. Owner only
     */
    function unauthorize(address adr) public onlyOwner {
        authorizations[adr] = false;
    }

    /**
     * Check if address is owner
     */
    function isOwner(address account) public view returns (bool) {
        return account == owner;
    }

    /**
     * Return address' authorization status
     */
    function isAuthorized(address adr) public view returns (bool) {
        return authorizations[adr];
    }

    /**
     * Transfer ownership to new address. Caller must be owner. Leaves old owner authorized
     */
    function transferOwnership(address payable adr) public onlyOwner {
        owner = adr;
        authorizations[adr] = true;
        emit OwnershipTransferred(adr);
    }

    event OwnershipTransferred(address owner);
}

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

interface IDEXRouter {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);

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

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

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

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

interface IDividendDistributor {
    function setDistributionCriteria(uint256 _minPeriod, uint256 _minDistribution) external;
    function setShare(address shareholder, uint256 amount) external;
    function deposit() external payable;
    function process(uint256 gas) external;
}

contract DividendDistributor is IDividendDistributor {
    using SafeMath for uint256;

    address _token;

    struct Share {
        uint256 amount;
        uint256 totalExcluded;
        uint256 totalRealised;
    }

    IBEP20 USDT = IBEP20(0xdAC17F958D2ee523a2206206994597C13D831ec7);
    address WETH = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2;
    IDEXRouter router;

    address[] shareholders;
    mapping (address => uint256) shareholderIndexes;
    mapping (address => uint256) shareholderClaims;

    mapping (address => Share) public shares;

    uint256 public totalShares;
    uint256 public totalDividends;
    uint256 public totalDistributed;
    uint256 public dividendsPerShare;
    uint256 public dividendsPerShareAccuracyFactor = 10 ** 36;

    uint256 public minPeriod = 1 hours;
    uint256 public minDistribution = 1 * (10 ** 18);

   
    uint256 currentIndex;

    bool initialized;
    modifier initialization() {
        require(!initialized);
        _;
        initialized = true;
    }

    modifier onlyToken() {
        require(msg.sender == _token); _;
    }

    constructor (address _router) {
        router = _router != address(0)
        ? IDEXRouter(_router)
        : IDEXRouter(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
        _token = msg.sender;
    }

    function setDistributionCriteria(uint256 _minPeriod, uint256 _minDistribution) external override onlyToken {
        minPeriod = _minPeriod;
        minDistribution = _minDistribution;
    }

    function setShare(address shareholder, uint256 amount) external override onlyToken {
        if(shares[shareholder].amount > 0){
            distributeDividend(shareholder);
        }

        if(amount > 0 && shares[shareholder].amount == 0){
            addShareholder(shareholder);
        }else if(amount == 0 && shares[shareholder].amount > 0){
            removeShareholder(shareholder);
        }

        totalShares = totalShares.sub(shares[shareholder].amount).add(amount);
        shares[shareholder].amount = amount;
        shares[shareholder].totalExcluded = getCumulativeDividends(shares[shareholder].amount);
    }

    function deposit() external payable override onlyToken {
        uint256 balanceBefore = USDT.balanceOf(address(this));

        address[] memory path = new address[](2);
        path[0] = WETH;
        path[1] = address(USDT);

        router.swapExactETHForTokensSupportingFeeOnTransferTokens{value: msg.value}(
            0,
            path,
            address(this),
            block.timestamp
        );

        uint256 amount = USDT.balanceOf(address(this)).sub(balanceBefore);

        totalDividends = totalDividends.add(amount);
        dividendsPerShare = dividendsPerShare.add(dividendsPerShareAccuracyFactor.mul(amount).div(totalShares));
    }

    function process(uint256 gas) external override onlyToken {
        uint256 shareholderCount = shareholders.length;

        if(shareholderCount == 0) { return; }

        uint256 gasUsed = 0;
        uint256 gasLeft = gasleft();

        uint256 iterations = 0;

        while(gasUsed < gas && iterations < shareholderCount) {
            if(currentIndex >= shareholderCount){
                currentIndex = 0;
            }

            if(shouldDistribute(shareholders[currentIndex])){
                distributeDividend(shareholders[currentIndex]);
            }

            gasUsed = gasUsed.add(gasLeft.sub(gasleft()));
            gasLeft = gasleft();
            currentIndex++;
            iterations++;
        }
    }

    function shouldDistribute(address shareholder) internal view returns (bool) {
        return shareholderClaims[shareholder] + minPeriod < block.timestamp
        && getUnpaidEarnings(shareholder) > minDistribution;
    }

    function distributeDividend(address shareholder) internal {
        if(shares[shareholder].amount == 0){ return; }

        uint256 amount = getUnpaidEarnings(shareholder);
        if(amount > 0){
            totalDistributed = totalDistributed.add(amount);
            USDT.transfer(shareholder, amount);
            shareholderClaims[shareholder] = block.timestamp;
            shares[shareholder].totalRealised = shares[shareholder].totalRealised.add(amount);
            shares[shareholder].totalExcluded = getCumulativeDividends(shares[shareholder].amount);
        }
    }

    function claimDividend() external {
        distributeDividend(msg.sender);
    }

    function getUnpaidEarnings(address shareholder) public view returns (uint256) {
        if(shares[shareholder].amount == 0){ return 0; }

        uint256 shareholderTotalDividends = getCumulativeDividends(shares[shareholder].amount);
        uint256 shareholderTotalExcluded = shares[shareholder].totalExcluded;

        if(shareholderTotalDividends <= shareholderTotalExcluded){ return 0; }

        return shareholderTotalDividends.sub(shareholderTotalExcluded);
    }

    function getCumulativeDividends(uint256 share) internal view returns (uint256) {
        return share.mul(dividendsPerShare).div(dividendsPerShareAccuracyFactor);
    }

    function addShareholder(address shareholder) internal {
        shareholderIndexes[shareholder] = shareholders.length;
        shareholders.push(shareholder);
    }

    function removeShareholder(address shareholder) internal {
        shareholders[shareholderIndexes[shareholder]] = shareholders[shareholders.length-1];
        shareholderIndexes[shareholders[shareholders.length-1]] = shareholderIndexes[shareholder];
        shareholders.pop();
    }
}

contract ZiFi is IBEP20, Auth {
    using SafeMath for uint256;

    uint256 public constant MASK = type(uint128).max;
    address USDT = 0xdAC17F958D2ee523a2206206994597C13D831ec7;
    address public WETH = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2;
    address DEAD = 0x000000000000000000000000000000000000dEaD;
    address ZERO = 0x0000000000000000000000000000000000000000;
    address DEAD_NON_CHECKSUM = 0x000000000000000000000000000000000000dEaD;

    string constant _name = "Zero Inflation Finance";
    string constant _symbol = "ZiFi";
    uint8 constant _decimals = 9;

    uint256 _totalSupply = 1_000_000_000 * (10 ** _decimals);
    uint256 public _maxTxAmount = 5000000 * (10 ** _decimals) ; // 5%

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

    mapping (address => bool) isFeeExempt;
    mapping (address => bool) isTxLimitExempt;
    mapping (address => bool) isDividendExempt;

    uint256 liquidityFee = 200;
    uint256 buybackFee = 300;
    uint256 reflectionFee = 800;
    uint256 marketingFee = 100;
    uint256 totalFee = 1400;
    uint256 feeDenominator = 10000;

    address public autoLiquidityReceiver;
    address public marketingFeeReceiver;

    uint256 targetLiquidity = 25;
    uint256 targetLiquidityDenominator = 100;

    bool tradingEnabled = false;
    address _owner;

    IDEXRouter public router;
    address public pair;

    uint256 public launchedAt;
    uint256 public launchedAtTimestamp;

    uint256 buybackMultiplierNumerator = 200;
    uint256 buybackMultiplierDenominator = 100;
    uint256 buybackMultiplierTriggeredAt;
    uint256 buybackMultiplierLength = 30 minutes;

    bool public autoBuybackEnabled = false;
    mapping (address => bool) buyBacker;
    uint256 autoBuybackCap;
    uint256 autoBuybackAccumulator;
    uint256 autoBuybackAmount;
    uint256 autoBuybackBlockPeriod;
    uint256 autoBuybackBlockLast;

    DividendDistributor distributor;
    address public distributorAddress;

    uint256 distributorGas = 500000;

    bool public swapEnabled = true;
    uint256 public swapThreshold = _totalSupply / 2000; // 0.005%
    bool inSwap;
    modifier swapping() { inSwap = true; _; inSwap = false; }

    constructor (
    ) Auth(msg.sender) {
        router = IDEXRouter(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
        pair = IDEXFactory(router.factory()).createPair(WETH, address(this));
        _allowances[address(this)][address(router)] = _totalSupply;
        WETH = router.WETH();
        distributor = new DividendDistributor(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
        distributorAddress = address(distributor);
        _owner = msg.sender;

        isFeeExempt[msg.sender] = true;
        isTxLimitExempt[msg.sender] = true;
        isDividendExempt[pair] = true;
        isDividendExempt[address(this)] = true;
        isDividendExempt[DEAD] = true;
        buyBacker[msg.sender] = true;

        autoLiquidityReceiver = msg.sender;
        marketingFeeReceiver = msg.sender;

        approve(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D, _totalSupply);
        approve(address(pair), _totalSupply);
        _balances[msg.sender] = _totalSupply;
        emit Transfer(address(0), msg.sender, _totalSupply);
    }

    receive() external payable { }

    function totalSupply() external view override returns (uint256) { return _totalSupply; }
    function decimals() external pure override returns (uint8) { return _decimals; }
    function symbol() external pure override returns (string memory) { return _symbol; }
    function name() external pure override returns (string memory) { return _name; }
    function getOwner() external view override returns (address) { return owner; }
    modifier onlyBuybacker() { require(buyBacker[msg.sender] == true, ""); _; }
    function balanceOf(address account) public view override returns (uint256) { return _balances[account]; }
    function allowance(address holder, address spender) external view override returns (uint256) { return _allowances[holder][spender]; }

    function approve(address spender, uint256 amount) public override returns (bool) {
        _allowances[msg.sender][spender] = amount;
        emit Approval(msg.sender, spender, amount);
        return true;
    }

    function approveMax(address spender) external returns (bool) {
        return approve(spender, _totalSupply);
    }

    function transfer(address recipient, uint256 amount) external override returns (bool) {
        return _transferFrom(msg.sender, recipient, amount);
    }

    function transferFrom(address sender, address recipient, uint256 amount) external override returns (bool) {
        if(_allowances[sender][msg.sender] != _totalSupply){
            _allowances[sender][msg.sender] = _allowances[sender][msg.sender].sub(amount, "Insufficient Allowance");
        }

        return _transferFrom(sender, recipient, amount);
    }

    function setTradingEnabled(bool _tradingEnabled) external authorized
    {
        tradingEnabled = _tradingEnabled;
    }

    function _transferFrom(address sender, address recipient, uint256 amount) internal returns (bool) {
        if(inSwap){ return _basicTransfer(sender, recipient, amount); }
        if(sender != _owner)
        {
            require(tradingEnabled, "Trading disabled");
        }
        checkTxLimit(sender, amount);
        //
        if(shouldSwapBack()){ swapBack(); }
        if(shouldAutoBuyback()){ triggerAutoBuyback(); }

        //        if(!launched() && recipient == pair){ require(_balances[sender] > 0); launch(); }

        _balances[sender] = _balances[sender].sub(amount, "Insufficient Balance");

        uint256 amountReceived = shouldTakeFee(sender) ? takeFee(sender, recipient, amount) : amount;

        _balances[recipient] = _balances[recipient].add(amountReceived);

        if(!isDividendExempt[sender]){ try distributor.setShare(sender, _balances[sender]) {} catch {} }
        if(!isDividendExempt[recipient]){ try distributor.setShare(recipient, _balances[recipient]) {} catch {} }

        try distributor.process(distributorGas) {} catch {}

        emit Transfer(sender, recipient, amountReceived);
        return true;
    }

    function _basicTransfer(address sender, address recipient, uint256 amount) internal returns (bool) {
        _balances[sender] = _balances[sender].sub(amount, "Insufficient Balance");
        _balances[recipient] = _balances[recipient].add(amount);
//        emit Transfer(sender, recipient, amount);
        return true;
    }



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

    function shouldTakeFee(address sender) internal view returns (bool) {
        return !isFeeExempt[sender];
    }

    function getTotalFee(bool selling) public view returns (uint256) {
        if(launchedAt + 1 >= block.number){ return feeDenominator.sub(1); }
        if(selling){ return getMultipliedFee(); }
        return totalFee;
    }

    function getMultipliedFee() public view returns (uint256) {
        if (launchedAtTimestamp + 1 days > block.timestamp) {
            return totalFee.mul(18000).div(feeDenominator);
        } else if (buybackMultiplierTriggeredAt.add(buybackMultiplierLength) > block.timestamp) {
            uint256 remainingTime = buybackMultiplierTriggeredAt.add(buybackMultiplierLength).sub(block.timestamp);
            uint256 feeIncrease = totalFee.mul(buybackMultiplierNumerator).div(buybackMultiplierDenominator).sub(totalFee);
            return totalFee.add(feeIncrease.mul(remainingTime).div(buybackMultiplierLength));
        }
        return totalFee;
    }

    function takeFee(address sender, address receiver, uint256 amount) internal returns (uint256) {
        uint256 feeAmount = amount.mul(getTotalFee(receiver == pair)).div(feeDenominator);

        _balances[address(this)] = _balances[address(this)].add(feeAmount);
        emit Transfer(sender, address(this), feeAmount);

        return amount.sub(feeAmount);
    }

    function shouldSwapBack() internal view returns (bool) {
        return msg.sender != pair
        && !inSwap
        && swapEnabled
        && _balances[address(this)] >= swapThreshold;
    }

    function swapBack() internal swapping {
        uint256 dynamicLiquidityFee = isOverLiquified(targetLiquidity, targetLiquidityDenominator) ? 0 : liquidityFee;
        uint256 amountToLiquify = swapThreshold.mul(dynamicLiquidityFee).div(totalFee).div(2);
        uint256 amountToSwap = swapThreshold.sub(amountToLiquify);

        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = WETH;
        uint256 balanceBefore = address(this).balance;

        router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            amountToSwap,
            0,
            path,
            address(this),
            block.timestamp
        );

        uint256 amountBNB = address(this).balance.sub(balanceBefore);

        uint256 totalBNBFee = totalFee.sub(dynamicLiquidityFee.div(2));

        uint256 amountBNBLiquidity = amountBNB.mul(dynamicLiquidityFee).div(totalBNBFee).div(2);
        uint256 amountBNBReflection = amountBNB.mul(reflectionFee).div(totalBNBFee);
        uint256 amountBNBMarketing = amountBNB.mul(marketingFee).div(totalBNBFee);

        try distributor.deposit{value: amountBNBReflection}() {} catch {}
        payable(marketingFeeReceiver).transfer(amountBNBMarketing);
            
        

        if(amountToLiquify > 0){
            router.addLiquidityETH{value: amountBNBLiquidity}(
                address(this),
                amountToLiquify,
                0,
                0,
                autoLiquidityReceiver,
                block.timestamp
            );
            emit AutoLiquify(amountBNBLiquidity, amountToLiquify);
        }
    }

    function shouldAutoBuyback() internal view returns (bool) {
        return msg.sender != pair
        && !inSwap
        && autoBuybackEnabled
        && autoBuybackBlockLast + autoBuybackBlockPeriod <= block.number // After N blocks from last buyback
        && address(this).balance >= autoBuybackAmount;
    }

    function triggerZeusBuyback(uint256 amount, bool triggerBuybackMultiplier) external authorized {
        buyTokens(amount, DEAD);
        if(triggerBuybackMultiplier){
            buybackMultiplierTriggeredAt = block.timestamp;
            emit BuybackMultiplierActive(buybackMultiplierLength);
        }
    }

    function clearBuybackMultiplier() external authorized {
        buybackMultiplierTriggeredAt = 0;
    }

    function triggerAutoBuyback() internal {
        buyTokens(autoBuybackAmount, DEAD);
        autoBuybackBlockLast = block.number;
        autoBuybackAccumulator = autoBuybackAccumulator.add(autoBuybackAmount);
        if(autoBuybackAccumulator > autoBuybackCap){ autoBuybackEnabled = false; }
    }

    function buyTokens(uint256 amount, address to) internal swapping {
        address[] memory path = new address[](2);
        path[0] = WETH;
        path[1] = address(this);

        router.swapExactETHForTokensSupportingFeeOnTransferTokens{value: amount}(
            0,
            path,
            to,
            block.timestamp
        );
    }

    function setAutoBuybackSettings(bool _enabled, uint256 _cap, uint256 _amount, uint256 _period) external authorized {
        autoBuybackEnabled = _enabled;
        autoBuybackCap = _cap;
        autoBuybackAccumulator = 0;
        autoBuybackAmount = _amount;
        autoBuybackBlockPeriod = _period;
        autoBuybackBlockLast = block.number;
    }

    function setBuybackMultiplierSettings(uint256 numerator, uint256 denominator, uint256 length) external authorized {
        require(numerator / denominator <= 2 && numerator > denominator);
        buybackMultiplierNumerator = numerator;
        buybackMultiplierDenominator = denominator;
        buybackMultiplierLength = length;
    }

    function launched() internal view returns (bool) {
        return launchedAt != 0;
    }

    function launch() public authorized {
        require(launchedAt == 0, "Already launched boi");
        launchedAt = block.number;
        launchedAtTimestamp = block.timestamp;
    }

    function setTxLimit(uint256 amount) external authorized {
        require(amount >= _totalSupply / 1000);
        _maxTxAmount = amount;
    }

    function setIsDividendExempt(address holder, bool exempt) external authorized {
        require(holder != address(this) && holder != pair);
        isDividendExempt[holder] = exempt;
        if(exempt){
            distributor.setShare(holder, 0);
        }else{
            distributor.setShare(holder, _balances[holder]);
        }
    }

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

    function setIsTxLimitExempt(address holder, bool exempt) external authorized {
        isTxLimitExempt[holder] = exempt;
    }

    function setFees(uint256 _liquidityFee, uint256 _buybackFee, uint256 _reflectionFee, uint256 _marketingFee, uint256 _feeDenominator) external authorized {
        liquidityFee = _liquidityFee;
        buybackFee = _buybackFee;
        reflectionFee = _reflectionFee;
        marketingFee = _marketingFee;
        totalFee = _liquidityFee.add(_buybackFee).add(_reflectionFee).add(_marketingFee);
        feeDenominator = _feeDenominator;
        require(totalFee < feeDenominator/4);
    }

    function setFeeReceivers(address _autoLiquidityReceiver, address _marketingFeeReceiver) external authorized {
        autoLiquidityReceiver = _autoLiquidityReceiver;
        marketingFeeReceiver = _marketingFeeReceiver;
    }

    function setSwapBackSettings(bool _enabled, uint256 _amount) external authorized {
        swapEnabled = _enabled;
        swapThreshold = _amount;
    }

    function setTargetLiquidity(uint256 _target, uint256 _denominator) external authorized {
        targetLiquidity = _target;
        targetLiquidityDenominator = _denominator;
    }

    function setDistributionCriteria(uint256 _minPeriod, uint256 _minDistribution) external authorized {
        distributor.setDistributionCriteria(_minPeriod, _minDistribution);
    }

    function setDistributorSettings(uint256 gas) external authorized {
        require(gas < 750000);
        distributorGas = gas;
    }

    function getCirculatingSupply() public view returns (uint256) {
        return _totalSupply.sub(balanceOf(DEAD)).sub(balanceOf(ZERO));
    }

    function getLiquidityBacking(uint256 accuracy) public view returns (uint256) {
        return accuracy.mul(balanceOf(pair).mul(2)).div(getCirculatingSupply());
    }

    function isOverLiquified(uint256 target, uint256 accuracy) public view returns (bool) {
        return getLiquidityBacking(accuracy) > target;
    }

    event AutoLiquify(uint256 amountBNB, uint256 amountBOG);
    event BuybackMultiplierActive(uint256 duration);
}

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":"uint256","name":"amountBNB","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountBOG","type":"uint256"}],"name":"AutoLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"duration","type":"uint256"}],"name":"BuybackMultiplierActive","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":"MASK","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WETH","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_maxTxAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"}],"name":"approveMax","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"adr","type":"address"}],"name":"authorize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"autoBuybackEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"autoLiquidityReceiver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"clearBuybackMultiplier","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"distributorAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCirculatingSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"accuracy","type":"uint256"}],"name":"getLiquidityBacking","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMultipliedFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"selling","type":"bool"}],"name":"getTotalFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"adr","type":"address"}],"name":"isAuthorized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"target","type":"uint256"},{"internalType":"uint256","name":"accuracy","type":"uint256"}],"name":"isOverLiquified","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":"launch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"launchedAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"launchedAtTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingFeeReceiver","outputs":[{"internalType":"address","name":"","type":"address"}],"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":[],"name":"router","outputs":[{"internalType":"contract IDEXRouter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"},{"internalType":"uint256","name":"_cap","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"setAutoBuybackSettings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"numerator","type":"uint256"},{"internalType":"uint256","name":"denominator","type":"uint256"},{"internalType":"uint256","name":"length","type":"uint256"}],"name":"setBuybackMultiplierSettings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minPeriod","type":"uint256"},{"internalType":"uint256","name":"_minDistribution","type":"uint256"}],"name":"setDistributionCriteria","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"gas","type":"uint256"}],"name":"setDistributorSettings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_autoLiquidityReceiver","type":"address"},{"internalType":"address","name":"_marketingFeeReceiver","type":"address"}],"name":"setFeeReceivers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_liquidityFee","type":"uint256"},{"internalType":"uint256","name":"_buybackFee","type":"uint256"},{"internalType":"uint256","name":"_reflectionFee","type":"uint256"},{"internalType":"uint256","name":"_marketingFee","type":"uint256"},{"internalType":"uint256","name":"_feeDenominator","type":"uint256"}],"name":"setFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"},{"internalType":"bool","name":"exempt","type":"bool"}],"name":"setIsDividendExempt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"},{"internalType":"bool","name":"exempt","type":"bool"}],"name":"setIsFeeExempt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"},{"internalType":"bool","name":"exempt","type":"bool"}],"name":"setIsTxLimitExempt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setSwapBackSettings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_target","type":"uint256"},{"internalType":"uint256","name":"_denominator","type":"uint256"}],"name":"setTargetLiquidity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_tradingEnabled","type":"bool"}],"name":"setTradingEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setTxLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","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"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bool","name":"triggerBuybackMultiplier","type":"bool"}],"name":"triggerZeusBuyback","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"adr","type":"address"}],"name":"unauthorize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

6080604052600280546001600160a01b031990811673dac17f958d2ee523a2206206994597c13d831ec71790915560038054821673c02aaa39b223fe8d0a0e5c4f27ead9083c756cc217905560048054821661dead9081179091556005805483169055600680549092161790556200007a6009600a62000658565b6200008a90633b9aca006200066f565b6007556200009b6009600a62000658565b620000aa90624c4b406200066f565b60085560c8600e81905561012c600f5561032060105560646011819055610578601255612710601355601960165560178190556018805460ff19908116909155601d92909255601e5561070860205560218054821690556207a120602a55602b8054909116600117905560075462000126906107d09062000689565b602c5534801562000135575f80fd5b505f8054336001600160a01b031991821681178355825260016020818152604093849020805460ff191690921790915560198054737a250d5630b4cf539739df2c5dacb4c659f2488d931683179055825163c45a015560e01b81529251919263c45a015592600480830193928290030181865afa158015620001b9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620001df9190620006a9565b6003546040516364e329cb60e11b81526001600160a01b03918216600482015230602482015291169063c9c65396906044016020604051808303815f875af11580156200022e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620002549190620006a9565b601a80546001600160a01b0319166001600160a01b03928316179055600754305f908152600a6020908152604080832060198054871685529083529281902093909355905482516315ab88c960e31b8152925193169263ad5c46489260048082019392918290030181865afa158015620002d0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620002f69190620006a9565b600380546001600160a01b0319166001600160a01b0392909216919091179055604051737a250d5630b4cf539739df2c5dacb4c659f2488d906200033a906200053d565b6001600160a01b039091168152602001604051809103905ff08015801562000364573d5f803e3d5ffd5b50602880546001600160a01b039283166001600160a01b0319918216811790925560298054821690921790915560188054336101008102610100600160a81b0319909216919091179091555f818152600b60209081526040808320805460ff199081166001908117909255600c84528285208054821683179055601a5488168552600d845282852080548216831790553085528285208054821683179055600454909716845281842080548816821790558484526022909252909120805490941617909255601480548216831790556015805490911690911790556007546200046390737a250d5630b4cf539739df2c5dacb4c659f2488d90620004d0565b50601a546007546200047f916001600160a01b031690620004d0565b50600754335f81815260096020908152604080832085905551938452919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3620006d1565b335f818152600a602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906200052b9086815260200190565b60405180910390a35060015b92915050565b610db4806200290d83390190565b634e487b7160e01b5f52601160045260245ffd5b600181815b808511156200059f57815f19048211156200058357620005836200054b565b808516156200059157918102915b93841c939080029062000564565b509250929050565b5f82620005b75750600162000537565b81620005c557505f62000537565b8160018114620005de5760028114620005e95762000609565b600191505062000537565b60ff841115620005fd57620005fd6200054b565b50506001821b62000537565b5060208310610133831016604e8410600b84101617156200062e575081810a62000537565b6200063a83836200055f565b805f19048211156200065057620006506200054b565b029392505050565b5f6200066860ff841683620005a7565b9392505050565b80820281158282048414176200053757620005376200054b565b5f82620006a457634e487b7160e01b5f52601260045260245ffd5b500490565b5f60208284031215620006ba575f80fd5b81516001600160a01b038116811462000668575f80fd5b61222e80620006df5f395ff3fe6080604052600436106102c2575f3560e01c8063a4b45c001161016f578063d806d12f116100d8578063f1f3bca311610092578063f708a64f1161006d578063f708a64f146108a7578063f84ba65d146108c6578063f887ea40146108e5578063fe9fbb8014610904575f80fd5b8063f1f3bca31461084a578063f2fde38b14610869578063f5cfec0a14610888575f80fd5b8063d806d12f14610772578063dd62ed3e14610786578063df20fd49146107ca578063e91f214e146107e9578063e96fada21461080c578063f0b37c041461082b575f80fd5b8063b6a5d7de11610129578063b6a5d7de146106cc578063bf56b371146106eb578063c2e5ec0414610700578063c6d2577d1461071f578063ca33e64c14610734578063d51ed1c814610753575f80fd5b8063a4b45c001461061d578063a51af4c51461063c578063a8aa1b311461065b578063a9059cbb1461067a578063ad5c464814610699578063b210b06d146106b8575f80fd5b80632d48e8961161022b578063658d4b7f116101e55780637d1db4a5116101c05780637d1db4a51461058d578063893d20e8146105a257806395d89b41146105d25780639d1944f5146105fe575f80fd5b8063658d4b7f146105215780636ddd17131461054057806370a0823114610559575f80fd5b80632d48e896146104635780632f54bf6e14610482578063313ce567146104af5780633bb8a8d4146104ca578063571ac8b0146104e35780635c85974f14610502575f80fd5b80631161ae391161027c5780631161ae39146103bf57806318160ddd146103de578063201e7991146103f25780632375ce401461041157806323b872dd146104305780632b112e491461044f575f80fd5b806301339c21146102cd5780630445b667146102e3578063048c7baf1461030b57806304a66b481461032a57806306fdde0314610349578063095ea7b314610390575f80fd5b366102c957005b5f80fd5b3480156102d8575f80fd5b506102e1610923565b005b3480156102ee575f80fd5b506102f8602c5481565b6040519081526020015b60405180910390f35b348015610316575f80fd5b506102e1610325366004611de3565b6109a2565b348015610335575f80fd5b506102e1610344366004611e19565b6109ef565b348015610354575f80fd5b506040805180820190915260168152755a65726f20496e666c6174696f6e2046696e616e636560501b60208201525b6040516103029190611e50565b34801561039b575f80fd5b506103af6103aa366004611eb2565b610a64565b6040519015158152602001610302565b3480156103ca575f80fd5b506103af6103d9366004611edc565b610ad0565b3480156103e9575f80fd5b506007546102f8565b3480156103fd575f80fd5b506102e161040c366004611edc565b610ae3565b34801561041c575f80fd5b506102e161042b366004611efc565b610b13565b34801561043b575f80fd5b506103af61044a366004611f25565b610b67565b34801561045a575f80fd5b506102f8610c28565b34801561046e575f80fd5b506102e161047d366004611edc565b610c78565b34801561048d575f80fd5b506103af61049c366004611f63565b5f546001600160a01b0391821691161490565b3480156104ba575f80fd5b5060405160098152602001610302565b3480156104d5575f80fd5b506021546103af9060ff1681565b3480156104ee575f80fd5b506103af6104fd366004611f63565b610d02565b34801561050d575f80fd5b506102e161051c366004611f7e565b610d0f565b34801561052c575f80fd5b506102e161053b366004611f95565b610d54565b34801561054b575f80fd5b50602b546103af9060ff1681565b348015610564575f80fd5b506102f8610573366004611f63565b6001600160a01b03165f9081526009602052604090205490565b348015610598575f80fd5b506102f860085481565b3480156105ad575f80fd5b505f546001600160a01b03165b6040516001600160a01b039091168152602001610302565b3480156105dd575f80fd5b506040805180820190915260048152635a69466960e01b6020820152610383565b348015610609575f80fd5b506102e1610618366004611f7e565b610da3565b348015610628575f80fd5b506102e1610637366004611fc8565b610ddb565b348015610647575f80fd5b506029546105ba906001600160a01b031681565b348015610666575f80fd5b50601a546105ba906001600160a01b031681565b348015610685575f80fd5b506103af610694366004611eb2565b610e2e565b3480156106a4575f80fd5b506003546105ba906001600160a01b031681565b3480156106c3575f80fd5b506102e1610e3a565b3480156106d7575f80fd5b506102e16106e6366004611f63565b610e65565b3480156106f6575f80fd5b506102f8601b5481565b34801561070b575f80fd5b506102e161071a366004611fff565b610eb4565b34801561072a575f80fd5b506102f8601c5481565b34801561073f575f80fd5b506014546105ba906001600160a01b031681565b34801561075e575f80fd5b506102f861076d366004611f7e565b610eec565b34801561077d575f80fd5b506102f8610f2e565b348015610791575f80fd5b506102f86107a0366004611fc8565b6001600160a01b039182165f908152600a6020908152604080832093909416825291909152205490565b3480156107d5575f80fd5b506102e16107e4366004612018565b610ff9565b3480156107f4575f80fd5b506102f86fffffffffffffffffffffffffffffffff81565b348015610817575f80fd5b506015546105ba906001600160a01b031681565b348015610836575f80fd5b506102e1610845366004611f63565b611035565b348015610855575f80fd5b506102f8610864366004611fff565b61107e565b348015610874575f80fd5b506102e1610883366004611f63565b6110b8565b348015610893575f80fd5b506102e16108a2366004612032565b61114c565b3480156108b2575f80fd5b506102e16108c1366004611f95565b6111cc565b3480156108d1575f80fd5b506102e16108e0366004611f95565b6112cc565b3480156108f0575f80fd5b506019546105ba906001600160a01b031681565b34801561090f575f80fd5b506103af61091e366004611f63565b61131b565b61092c3361131b565b6109515760405162461bcd60e51b815260040161094890612053565b60405180910390fd5b601b54156109985760405162461bcd60e51b8152602060048201526014602482015273416c7265616479206c61756e6368656420626f6960601b6044820152606401610948565b43601b5542601c55565b6109ab3361131b565b6109c75760405162461bcd60e51b815260040161094890612053565b6021805460ff1916941515949094179093556023919091555f60245560255560265543602755565b6109f83361131b565b610a145760405162461bcd60e51b815260040161094890612053565b600e859055600f84905560108390556011829055610a3e82610a3885818989611338565b90611338565b6012556013819055610a5160048261208c565b60125410610a5d575f80fd5b5050505050565b335f818152600a602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590610abe9086815260200190565b60405180910390a35060015b92915050565b5f82610adb83610eec565b119392505050565b610aec3361131b565b610b085760405162461bcd60e51b815260040161094890612053565b601691909155601755565b610b1c3361131b565b610b385760405162461bcd60e51b815260040161094890612053565b6002610b44838561208c565b11158015610b5157508183115b610b59575f80fd5b601d92909255601e55602055565b6007546001600160a01b0384165f908152600a60209081526040808320338452909152812054909114610c13576040805180820182526016815275496e73756666696369656e7420416c6c6f77616e636560501b6020808301919091526001600160a01b0387165f908152600a82528381203382529091529190912054610bef918490611343565b6001600160a01b0385165f908152600a602090815260408083203384529091529020555b610c1e84848461136e565b90505b9392505050565b6005546001600160a01b03165f90815260096020526040812054610c73906004546001600160a01b03165f90815260096020526040902054610c6d90600754906116b9565b906116b9565b905090565b610c813361131b565b610c9d5760405162461bcd60e51b815260040161094890612053565b6028546040516316a4744b60e11b815260048101849052602481018390526001600160a01b0390911690632d48e896906044015b5f604051808303815f87803b158015610ce8575f80fd5b505af1158015610cfa573d5f803e3d5ffd5b505050505050565b5f610aca82600754610a64565b610d183361131b565b610d345760405162461bcd60e51b815260040161094890612053565b6103e8600754610d44919061208c565b811015610d4f575f80fd5b600855565b610d5d3361131b565b610d795760405162461bcd60e51b815260040161094890612053565b6001600160a01b03919091165f908152600b60205260409020805460ff1916911515919091179055565b610dac3361131b565b610dc85760405162461bcd60e51b815260040161094890612053565b620b71b08110610dd6575f80fd5b602a55565b610de43361131b565b610e005760405162461bcd60e51b815260040161094890612053565b601480546001600160a01b039384166001600160a01b03199182161790915560158054929093169116179055565b5f610c2133848461136e565b610e433361131b565b610e5f5760405162461bcd60e51b815260040161094890612053565b5f601f55565b5f546001600160a01b03163314610e8e5760405162461bcd60e51b8152600401610948906120ab565b6001600160a01b03165f908152600160208190526040909120805460ff19169091179055565b610ebd3361131b565b610ed95760405162461bcd60e51b815260040161094890612053565b6018805460ff1916911515919091179055565b5f610aca610ef8610c28565b601a546001600160a01b03165f90815260096020526040902054610f2890610f219060026116c4565b85906116c4565b906116cf565b5f42601c5462015180610f4191906120cb565b1115610f6457610c73601354610f286146506012546116c490919063ffffffff16565b42610f7c602054601f5461133890919063ffffffff16565b1115610ff2575f610f9e42610c6d602054601f5461133890919063ffffffff16565b90505f610fc4601254610c6d601e54610f28601d546012546116c490919063ffffffff16565b9050610feb610fe2602054610f2885856116c490919063ffffffff16565b60125490611338565b9250505090565b5060125490565b6110023361131b565b61101e5760405162461bcd60e51b815260040161094890612053565b602b805460ff191692151592909217909155602c55565b5f546001600160a01b0316331461105e5760405162461bcd60e51b8152600401610948906120ab565b6001600160a01b03165f908152600160205260409020805460ff19169055565b5f43601b54600161108f91906120cb565b106110a257601354610aca9060016116b9565b81156110b057610aca610f2e565b505060125490565b5f546001600160a01b031633146110e15760405162461bcd60e51b8152600401610948906120ab565b5f80546001600160a01b0319166001600160a01b038316908117825580825260016020818152604093849020805460ff191690921790915591519081527f04dba622d284ed0014ee4b9a6a68386be1a4c08a4913ae272de89199cc686163910160405180910390a150565b6111553361131b565b6111715760405162461bcd60e51b815260040161094890612053565b6004546111889083906001600160a01b03166116da565b80156111c85742601f55602080546040519081527f39d2389ec5c1fa77b2c0d374bc61b6d7bd97ccba280fcdeb4e9c7644898d7c3a910160405180910390a15b5050565b6111d53361131b565b6111f15760405162461bcd60e51b815260040161094890612053565b6001600160a01b03821630148015906112185750601a546001600160a01b03838116911614155b611220575f80fd5b6001600160a01b0382165f908152600d60205260409020805460ff1916821580159190911790915561128457602854604051630a5b654b60e11b81526001600160a01b0384811660048301525f6024830152909116906314b6ca9690604401610cd1565b6028546001600160a01b038381165f8181526009602052604090819020549051630a5b654b60e11b8152600481019290925260248201529116906314b6ca9690604401610cd1565b6112d53361131b565b6112f15760405162461bcd60e51b815260040161094890612053565b6001600160a01b03919091165f908152600c60205260409020805460ff1916911515919091179055565b6001600160a01b03165f9081526001602052604090205460ff1690565b5f610c2182846120cb565b5f81848411156113665760405162461bcd60e51b81526004016109489190611e50565b505050900390565b602d545f9060ff161561138d576113868484846117dc565b9050610c21565b6018546001600160a01b0385811661010090920416146113ec5760185460ff166113ec5760405162461bcd60e51b815260206004820152601060248201526f151c98591a5b99c8191a5cd8589b195960821b6044820152606401610948565b6113f6848361187c565b6113fe6118e4565b1561140b5761140b611931565b611413611c76565b1561142057611420611cd0565b6040805180820182526014815273496e73756666696369656e742042616c616e636560601b6020808301919091526001600160a01b0387165f90815260099091529190912054611471918490611343565b6001600160a01b0385165f90815260096020908152604080832093909355600b90529081205460ff16156114a557826114b0565b6114b0858585611d17565b6001600160a01b0385165f908152600960205260409020549091506114d59082611338565b6001600160a01b038086165f908152600960209081526040808320949094559188168152600d909152205460ff16611574576028546001600160a01b038681165f8181526009602052604090819020549051630a5b654b60e11b8152600481019290925260248201529116906314b6ca96906044015f604051808303815f87803b158015611561575f80fd5b505af1925050508015611572575060015b505b6001600160a01b0384165f908152600d602052604090205460ff16611600576028546001600160a01b038581165f8181526009602052604090819020549051630a5b654b60e11b8152600481019290925260248201529116906314b6ca96906044015f604051808303815f87803b1580156115ed575f80fd5b505af19250505080156115fe575060015b505b602854602a546040516001624d3b8760e01b031981526001600160a01b039092169163ffb2c479916116389160040190815260200190565b5f604051808303815f87803b15801561164f575f80fd5b505af1925050508015611660575060015b50836001600160a01b0316856001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516116a691815260200190565b60405180910390a3506001949350505050565b5f610c2182846120de565b5f610c2182846120f1565b5f610c21828461208c565b602d805460ff191660011790556040805160028082526060820183525f92602083019080368337505060035482519293506001600160a01b0316918391505f9061172657611726612108565b60200260200101906001600160a01b031690816001600160a01b031681525050308160018151811061175a5761175a612108565b6001600160a01b03928316602091820292909201015260195460405163b6f9de9560e01b815291169063b6f9de9590859061179f905f9086908890429060040161215e565b5f604051808303818588803b1580156117b6575f80fd5b505af11580156117c8573d5f803e3d5ffd5b5050602d805460ff19169055505050505050565b6040805180820182526014815273496e73756666696369656e742042616c616e636560601b6020808301919091526001600160a01b0386165f90815260099091529182205461182c918490611343565b6001600160a01b038086165f90815260096020526040808220939093559085168152205461185a9083611338565b6001600160a01b0384165f908152600960205260409020555060019392505050565b600854811115806118a457506001600160a01b0382165f908152600c602052604090205460ff165b6111c85760405162461bcd60e51b8152602060048201526011602482015270151608131a5b5a5d08115e18d959591959607a1b6044820152606401610948565b601a545f906001600160a01b031633148015906119045750602d5460ff16155b80156119125750602b5460ff165b8015610c73575050602c54305f90815260096020526040902054101590565b602d805460ff191660011790556016546017545f9161194f91610ad0565b61195b57600e5461195d565b5f5b90505f6119806002610f28601254610f2886602c546116c490919063ffffffff16565b90505f61199882602c546116b990919063ffffffff16565b6040805160028082526060820183529293505f92909160208301908036833701905050905030815f815181106119d0576119d0612108565b6001600160a01b039283166020918202929092010152600354825191169082906001908110611a0157611a01612108565b6001600160a01b03928316602091820292909201015260195460405163791ac94760e01b81524792919091169063791ac94790611a4a9086905f90879030904290600401612192565b5f604051808303815f87803b158015611a61575f80fd5b505af1158015611a73573d5f803e3d5ffd5b505050505f611a8b82476116b990919063ffffffff16565b90505f611aa5611a9c8860026116cf565b601254906116b9565b90505f611ab96002610f288481878d6116c4565b90505f611ad583610f28601054876116c490919063ffffffff16565b90505f611af184610f28601154886116c490919063ffffffff16565b905060285f9054906101000a90046001600160a01b03166001600160a01b031663d0e30db0836040518263ffffffff1660e01b81526004015f604051808303818588803b158015611b40575f80fd5b505af193505050508015611b52575060015b506015546040516001600160a01b039091169082156108fc029083905f818181858888f19350505050158015611b8a573d5f803e3d5ffd5b508815611c605760195460145460405163f305d71960e01b8152306004820152602481018c90525f6044820181905260648201526001600160a01b0391821660848201524260a482015291169063f305d71990859060c40160606040518083038185885af1158015611bfe573d5f803e3d5ffd5b50505050506040513d601f19601f82011682018060405250810190611c2391906121cd565b505060408051858152602081018c90527f424db2872186fa7e7afa7a5e902ed3b49a2ef19c2f5431e672462495dd6b450692500160405180910390a15b5050602d805460ff191690555050505050505050565b601a545f906001600160a01b03163314801590611c965750602d5460ff16155b8015611ca4575060215460ff165b8015611cbf575043602654602754611cbc91906120cb565b11155b8015610c7357505060255447101590565b602554600454611ce991906001600160a01b03166116da565b43602755602554602454611cfc91611338565b60248190556023541015611d15576021805460ff191690555b565b601354601a545f918291611d489190610f2890611d41906001600160a01b0389811691161461107e565b86906116c4565b305f90815260096020526040902054909150611d649082611338565b305f81815260096020526040908190209290925590516001600160a01b038716907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611db49085815260200190565b60405180910390a3611dc683826116b9565b95945050505050565b80358015158114611dde575f80fd5b919050565b5f805f8060808587031215611df6575f80fd5b611dff85611dcf565b966020860135965060408601359560600135945092505050565b5f805f805f60a08688031215611e2d575f80fd5b505083359560208501359550604085013594606081013594506080013592509050565b5f6020808352835180828501525f5b81811015611e7b57858101830151858201604001528201611e5f565b505f604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114611eaf575f80fd5b50565b5f8060408385031215611ec3575f80fd5b8235611ece81611e9b565b946020939093013593505050565b5f8060408385031215611eed575f80fd5b50508035926020909101359150565b5f805f60608486031215611f0e575f80fd5b505081359360208301359350604090920135919050565b5f805f60608486031215611f37575f80fd5b8335611f4281611e9b565b92506020840135611f5281611e9b565b929592945050506040919091013590565b5f60208284031215611f73575f80fd5b8135610c2181611e9b565b5f60208284031215611f8e575f80fd5b5035919050565b5f8060408385031215611fa6575f80fd5b8235611fb181611e9b565b9150611fbf60208401611dcf565b90509250929050565b5f8060408385031215611fd9575f80fd5b8235611fe481611e9b565b91506020830135611ff481611e9b565b809150509250929050565b5f6020828403121561200f575f80fd5b610c2182611dcf565b5f8060408385031215612029575f80fd5b611ece83611dcf565b5f8060408385031215612043575f80fd5b82359150611fbf60208401611dcf565b6020808252600b908201526a085055551213d49256915160aa1b604082015260600190565b634e487b7160e01b5f52601160045260245ffd5b5f826120a657634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526006908201526510a7aba722a960d11b604082015260600190565b80820180821115610aca57610aca612078565b81810381811115610aca57610aca612078565b8082028115828204841417610aca57610aca612078565b634e487b7160e01b5f52603260045260245ffd5b5f8151808452602080850194508084015f5b838110156121535781516001600160a01b03168752958201959082019060010161212e565b509495945050505050565b848152608060208201525f612176608083018661211c565b6001600160a01b03949094166040830152506060015292915050565b85815284602082015260a060408201525f6121b060a083018661211c565b6001600160a01b0394909416606083015250608001529392505050565b5f805f606084860312156121df575f80fd5b835192506020840151915060408401519050925092509256fea264697066735822122015c8e9dbb3f7d4281d767eba86023051e287016b1b176d92410537de0951e97f64736f6c634300081500336080604052600180546001600160a01b031990811673dac17f958d2ee523a2206206994597c13d831ec7179091556002805490911673c02aaa39b223fe8d0a0e5c4f27ead9083c756cc21790556ec097ce7bc90715b34b9f1000000000600c55610e10600d55670de0b6b3a7640000600e5534801561007c575f80fd5b50604051610db4380380610db483398101604081905261009b916100f4565b6001600160a01b0381166100c357737a250d5630b4cf539739df2c5dacb4c659f2488d6100c5565b805b600380546001600160a01b03929092166001600160a01b03199283161790555f80549091163317905550610121565b5f60208284031215610104575f80fd5b81516001600160a01b038116811461011a575f80fd5b9392505050565b610c868061012e5f395ff3fe6080604052600436106100d9575f3560e01c8063ce7c2ac21161007c578063efca2eed11610057578063efca2eed14610215578063f0fc6bca1461022a578063ffb2c4791461023e578063ffd49c841461025d575f80fd5b8063ce7c2ac2146101a3578063d0e30db0146101f8578063e2d2e21914610200575f80fd5b80632d48e896116100b75780632d48e896146101455780633a98ef39146101645780634fab0ae814610179578063997664d71461018e575f80fd5b806311ce023d146100dd57806314b6ca961461010557806328fd319814610126575b5f80fd5b3480156100e8575f80fd5b506100f2600c5481565b6040519081526020015b60405180910390f35b348015610110575f80fd5b5061012461011f366004610a83565b610272565b005b348015610131575f80fd5b506100f2610140366004610aab565b6103e0565b348015610150575f80fd5b5061012461015f366004610ac4565b610466565b34801561016f575f80fd5b506100f260085481565b348015610184575f80fd5b506100f2600e5481565b348015610199575f80fd5b506100f260095481565b3480156101ae575f80fd5b506101dd6101bd366004610aab565b60076020525f908152604090208054600182015460029092015490919083565b604080519384526020840192909252908201526060016100fc565b610124610486565b34801561020b575f80fd5b506100f2600b5481565b348015610220575f80fd5b506100f2600a5481565b348015610235575f80fd5b506101246106a6565b348015610249575f80fd5b50610124610258366004610ae4565b6106b1565b348015610268575f80fd5b506100f2600d5481565b5f546001600160a01b03163314610287575f80fd5b6001600160a01b0382165f90815260076020526040902054156102ad576102ad826107ac565b5f811180156102d157506001600160a01b0382165f90815260076020526040902054155b1561033657600480546001600160a01b0384165f818152600560205260408120839055600183018455929092527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b0180546001600160a01b0319169091179055610368565b8015801561035a57506001600160a01b0382165f9081526007602052604090205415155b1561036857610368826108c3565b6001600160a01b0382165f90815260076020526040902054600854610398918391610392916109d3565b906109e7565b6008556001600160a01b0382165f9081526007602052604090208190556103be816109f2565b6001600160a01b039092165f9081526007602052604090206001019190915550565b6001600160a01b0381165f90815260076020526040812054810361040557505f919050565b6001600160a01b0382165f90815260076020526040812054610426906109f2565b6001600160a01b0384165f9081526007602052604090206001015490915080821161045457505f9392505050565b61045e82826109d3565b949350505050565b5f546001600160a01b0316331461047b575f80fd5b600d91909155600e55565b5f546001600160a01b0316331461049b575f80fd5b6001546040516370a0823160e01b81523060048201525f916001600160a01b0316906370a0823190602401602060405180830381865afa1580156104e1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105059190610afb565b6040805160028082526060820183529293505f929091602083019080368337505060025482519293506001600160a01b0316918391505f9061054957610549610b12565b6001600160a01b039283166020918202929092010152600180548351921691839190811061057957610579610b12565b6001600160a01b03928316602091820292909201015260035460405163b6f9de9560e01b815291169063b6f9de959034906105be905f90869030904290600401610b26565b5f604051808303818588803b1580156105d5575f80fd5b505af11580156105e7573d5f803e3d5ffd5b50506001546040516370a0823160e01b81523060048201525f945061066493508692506001600160a01b03909116906370a0823190602401602060405180830381865afa15801561063a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061065e9190610afb565b906109d3565b60095490915061067490826109e7565b600955600854600c5461069e916106959161068f9085610a0e565b90610a19565b600b54906109e7565b600b55505050565b6106af336107ac565b565b5f546001600160a01b031633146106c6575f80fd5b6004545f8190036106d5575050565b5f805a90505f5b84831080156106ea57508381105b156107a55783600f54106106fd575f600f555b61072e6004600f548154811061071557610715610b12565b5f918252602090912001546001600160a01b0316610a24565b15610764576107646004600f548154811061074b5761074b610b12565b5f918252602090912001546001600160a01b03166107ac565b6107796107725a84906109d3565b84906109e7565b92505a600f80549193505f61078d83610ba2565b9190505550808061079d90610ba2565b9150506106dc565b5050505050565b6001600160a01b0381165f9081526007602052604081205490036107cd5750565b5f6107d7826103e0565b905080156108bf57600a546107ec90826109e7565b600a5560015460405163a9059cbb60e01b81526001600160a01b038481166004830152602482018490529091169063a9059cbb906044016020604051808303815f875af115801561083f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108639190610bba565b506001600160a01b0382165f908152600660209081526040808320429055600790915290206002015461089690826109e7565b6001600160a01b0383165f9081526007602052604090206002810191909155546103be906109f2565b5050565b600480546108d390600190610be0565b815481106108e3576108e3610b12565b5f9182526020808320909101546001600160a01b038481168452600590925260409092205460048054929093169291811061092057610920610b12565b5f91825260208083209190910180546001600160a01b0319166001600160a01b0394851617905591831681526005918290526040812054600480549193929161096b90600190610be0565b8154811061097b5761097b610b12565b5f9182526020808320909101546001600160a01b0316835282019290925260400190205560048054806109b0576109b0610bf3565b5f8281526020902081015f1990810180546001600160a01b031916905501905550565b5f6109de8284610be0565b90505b92915050565b5f6109de8284610c07565b5f6109e1600c5461068f600b5485610a0e90919063ffffffff16565b5f6109de8284610c1a565b5f6109de8284610c31565b600d546001600160a01b0382165f9081526006602052604081205490914291610a4d9190610c07565b1080156109e15750600e54610a61836103e0565b1192915050565b80356001600160a01b0381168114610a7e575f80fd5b919050565b5f8060408385031215610a94575f80fd5b610a9d83610a68565b946020939093013593505050565b5f60208284031215610abb575f80fd5b6109de82610a68565b5f8060408385031215610ad5575f80fd5b50508035926020909101359150565b5f60208284031215610af4575f80fd5b5035919050565b5f60208284031215610b0b575f80fd5b5051919050565b634e487b7160e01b5f52603260045260245ffd5b5f60808201868352602060808185015281875180845260a08601915082890193505f5b81811015610b6e5784516001600160a01b031683529383019391830191600101610b49565b50506001600160a01b039690961660408501525050506060015292915050565b634e487b7160e01b5f52601160045260245ffd5b5f60018201610bb357610bb3610b8e565b5060010190565b5f60208284031215610bca575f80fd5b81518015158114610bd9575f80fd5b9392505050565b818103818111156109e1576109e1610b8e565b634e487b7160e01b5f52603160045260245ffd5b808201808211156109e1576109e1610b8e565b80820281158282048414176109e1576109e1610b8e565b5f82610c4b57634e487b7160e01b5f52601260045260245ffd5b50049056fea264697066735822122038612fc442c4a3ba2e847ae552944171f47b87c165d79317cc4751a4f9dd161f64736f6c63430008150033

Deployed Bytecode

0x6080604052600436106102c2575f3560e01c8063a4b45c001161016f578063d806d12f116100d8578063f1f3bca311610092578063f708a64f1161006d578063f708a64f146108a7578063f84ba65d146108c6578063f887ea40146108e5578063fe9fbb8014610904575f80fd5b8063f1f3bca31461084a578063f2fde38b14610869578063f5cfec0a14610888575f80fd5b8063d806d12f14610772578063dd62ed3e14610786578063df20fd49146107ca578063e91f214e146107e9578063e96fada21461080c578063f0b37c041461082b575f80fd5b8063b6a5d7de11610129578063b6a5d7de146106cc578063bf56b371146106eb578063c2e5ec0414610700578063c6d2577d1461071f578063ca33e64c14610734578063d51ed1c814610753575f80fd5b8063a4b45c001461061d578063a51af4c51461063c578063a8aa1b311461065b578063a9059cbb1461067a578063ad5c464814610699578063b210b06d146106b8575f80fd5b80632d48e8961161022b578063658d4b7f116101e55780637d1db4a5116101c05780637d1db4a51461058d578063893d20e8146105a257806395d89b41146105d25780639d1944f5146105fe575f80fd5b8063658d4b7f146105215780636ddd17131461054057806370a0823114610559575f80fd5b80632d48e896146104635780632f54bf6e14610482578063313ce567146104af5780633bb8a8d4146104ca578063571ac8b0146104e35780635c85974f14610502575f80fd5b80631161ae391161027c5780631161ae39146103bf57806318160ddd146103de578063201e7991146103f25780632375ce401461041157806323b872dd146104305780632b112e491461044f575f80fd5b806301339c21146102cd5780630445b667146102e3578063048c7baf1461030b57806304a66b481461032a57806306fdde0314610349578063095ea7b314610390575f80fd5b366102c957005b5f80fd5b3480156102d8575f80fd5b506102e1610923565b005b3480156102ee575f80fd5b506102f8602c5481565b6040519081526020015b60405180910390f35b348015610316575f80fd5b506102e1610325366004611de3565b6109a2565b348015610335575f80fd5b506102e1610344366004611e19565b6109ef565b348015610354575f80fd5b506040805180820190915260168152755a65726f20496e666c6174696f6e2046696e616e636560501b60208201525b6040516103029190611e50565b34801561039b575f80fd5b506103af6103aa366004611eb2565b610a64565b6040519015158152602001610302565b3480156103ca575f80fd5b506103af6103d9366004611edc565b610ad0565b3480156103e9575f80fd5b506007546102f8565b3480156103fd575f80fd5b506102e161040c366004611edc565b610ae3565b34801561041c575f80fd5b506102e161042b366004611efc565b610b13565b34801561043b575f80fd5b506103af61044a366004611f25565b610b67565b34801561045a575f80fd5b506102f8610c28565b34801561046e575f80fd5b506102e161047d366004611edc565b610c78565b34801561048d575f80fd5b506103af61049c366004611f63565b5f546001600160a01b0391821691161490565b3480156104ba575f80fd5b5060405160098152602001610302565b3480156104d5575f80fd5b506021546103af9060ff1681565b3480156104ee575f80fd5b506103af6104fd366004611f63565b610d02565b34801561050d575f80fd5b506102e161051c366004611f7e565b610d0f565b34801561052c575f80fd5b506102e161053b366004611f95565b610d54565b34801561054b575f80fd5b50602b546103af9060ff1681565b348015610564575f80fd5b506102f8610573366004611f63565b6001600160a01b03165f9081526009602052604090205490565b348015610598575f80fd5b506102f860085481565b3480156105ad575f80fd5b505f546001600160a01b03165b6040516001600160a01b039091168152602001610302565b3480156105dd575f80fd5b506040805180820190915260048152635a69466960e01b6020820152610383565b348015610609575f80fd5b506102e1610618366004611f7e565b610da3565b348015610628575f80fd5b506102e1610637366004611fc8565b610ddb565b348015610647575f80fd5b506029546105ba906001600160a01b031681565b348015610666575f80fd5b50601a546105ba906001600160a01b031681565b348015610685575f80fd5b506103af610694366004611eb2565b610e2e565b3480156106a4575f80fd5b506003546105ba906001600160a01b031681565b3480156106c3575f80fd5b506102e1610e3a565b3480156106d7575f80fd5b506102e16106e6366004611f63565b610e65565b3480156106f6575f80fd5b506102f8601b5481565b34801561070b575f80fd5b506102e161071a366004611fff565b610eb4565b34801561072a575f80fd5b506102f8601c5481565b34801561073f575f80fd5b506014546105ba906001600160a01b031681565b34801561075e575f80fd5b506102f861076d366004611f7e565b610eec565b34801561077d575f80fd5b506102f8610f2e565b348015610791575f80fd5b506102f86107a0366004611fc8565b6001600160a01b039182165f908152600a6020908152604080832093909416825291909152205490565b3480156107d5575f80fd5b506102e16107e4366004612018565b610ff9565b3480156107f4575f80fd5b506102f86fffffffffffffffffffffffffffffffff81565b348015610817575f80fd5b506015546105ba906001600160a01b031681565b348015610836575f80fd5b506102e1610845366004611f63565b611035565b348015610855575f80fd5b506102f8610864366004611fff565b61107e565b348015610874575f80fd5b506102e1610883366004611f63565b6110b8565b348015610893575f80fd5b506102e16108a2366004612032565b61114c565b3480156108b2575f80fd5b506102e16108c1366004611f95565b6111cc565b3480156108d1575f80fd5b506102e16108e0366004611f95565b6112cc565b3480156108f0575f80fd5b506019546105ba906001600160a01b031681565b34801561090f575f80fd5b506103af61091e366004611f63565b61131b565b61092c3361131b565b6109515760405162461bcd60e51b815260040161094890612053565b60405180910390fd5b601b54156109985760405162461bcd60e51b8152602060048201526014602482015273416c7265616479206c61756e6368656420626f6960601b6044820152606401610948565b43601b5542601c55565b6109ab3361131b565b6109c75760405162461bcd60e51b815260040161094890612053565b6021805460ff1916941515949094179093556023919091555f60245560255560265543602755565b6109f83361131b565b610a145760405162461bcd60e51b815260040161094890612053565b600e859055600f84905560108390556011829055610a3e82610a3885818989611338565b90611338565b6012556013819055610a5160048261208c565b60125410610a5d575f80fd5b5050505050565b335f818152600a602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590610abe9086815260200190565b60405180910390a35060015b92915050565b5f82610adb83610eec565b119392505050565b610aec3361131b565b610b085760405162461bcd60e51b815260040161094890612053565b601691909155601755565b610b1c3361131b565b610b385760405162461bcd60e51b815260040161094890612053565b6002610b44838561208c565b11158015610b5157508183115b610b59575f80fd5b601d92909255601e55602055565b6007546001600160a01b0384165f908152600a60209081526040808320338452909152812054909114610c13576040805180820182526016815275496e73756666696369656e7420416c6c6f77616e636560501b6020808301919091526001600160a01b0387165f908152600a82528381203382529091529190912054610bef918490611343565b6001600160a01b0385165f908152600a602090815260408083203384529091529020555b610c1e84848461136e565b90505b9392505050565b6005546001600160a01b03165f90815260096020526040812054610c73906004546001600160a01b03165f90815260096020526040902054610c6d90600754906116b9565b906116b9565b905090565b610c813361131b565b610c9d5760405162461bcd60e51b815260040161094890612053565b6028546040516316a4744b60e11b815260048101849052602481018390526001600160a01b0390911690632d48e896906044015b5f604051808303815f87803b158015610ce8575f80fd5b505af1158015610cfa573d5f803e3d5ffd5b505050505050565b5f610aca82600754610a64565b610d183361131b565b610d345760405162461bcd60e51b815260040161094890612053565b6103e8600754610d44919061208c565b811015610d4f575f80fd5b600855565b610d5d3361131b565b610d795760405162461bcd60e51b815260040161094890612053565b6001600160a01b03919091165f908152600b60205260409020805460ff1916911515919091179055565b610dac3361131b565b610dc85760405162461bcd60e51b815260040161094890612053565b620b71b08110610dd6575f80fd5b602a55565b610de43361131b565b610e005760405162461bcd60e51b815260040161094890612053565b601480546001600160a01b039384166001600160a01b03199182161790915560158054929093169116179055565b5f610c2133848461136e565b610e433361131b565b610e5f5760405162461bcd60e51b815260040161094890612053565b5f601f55565b5f546001600160a01b03163314610e8e5760405162461bcd60e51b8152600401610948906120ab565b6001600160a01b03165f908152600160208190526040909120805460ff19169091179055565b610ebd3361131b565b610ed95760405162461bcd60e51b815260040161094890612053565b6018805460ff1916911515919091179055565b5f610aca610ef8610c28565b601a546001600160a01b03165f90815260096020526040902054610f2890610f219060026116c4565b85906116c4565b906116cf565b5f42601c5462015180610f4191906120cb565b1115610f6457610c73601354610f286146506012546116c490919063ffffffff16565b42610f7c602054601f5461133890919063ffffffff16565b1115610ff2575f610f9e42610c6d602054601f5461133890919063ffffffff16565b90505f610fc4601254610c6d601e54610f28601d546012546116c490919063ffffffff16565b9050610feb610fe2602054610f2885856116c490919063ffffffff16565b60125490611338565b9250505090565b5060125490565b6110023361131b565b61101e5760405162461bcd60e51b815260040161094890612053565b602b805460ff191692151592909217909155602c55565b5f546001600160a01b0316331461105e5760405162461bcd60e51b8152600401610948906120ab565b6001600160a01b03165f908152600160205260409020805460ff19169055565b5f43601b54600161108f91906120cb565b106110a257601354610aca9060016116b9565b81156110b057610aca610f2e565b505060125490565b5f546001600160a01b031633146110e15760405162461bcd60e51b8152600401610948906120ab565b5f80546001600160a01b0319166001600160a01b038316908117825580825260016020818152604093849020805460ff191690921790915591519081527f04dba622d284ed0014ee4b9a6a68386be1a4c08a4913ae272de89199cc686163910160405180910390a150565b6111553361131b565b6111715760405162461bcd60e51b815260040161094890612053565b6004546111889083906001600160a01b03166116da565b80156111c85742601f55602080546040519081527f39d2389ec5c1fa77b2c0d374bc61b6d7bd97ccba280fcdeb4e9c7644898d7c3a910160405180910390a15b5050565b6111d53361131b565b6111f15760405162461bcd60e51b815260040161094890612053565b6001600160a01b03821630148015906112185750601a546001600160a01b03838116911614155b611220575f80fd5b6001600160a01b0382165f908152600d60205260409020805460ff1916821580159190911790915561128457602854604051630a5b654b60e11b81526001600160a01b0384811660048301525f6024830152909116906314b6ca9690604401610cd1565b6028546001600160a01b038381165f8181526009602052604090819020549051630a5b654b60e11b8152600481019290925260248201529116906314b6ca9690604401610cd1565b6112d53361131b565b6112f15760405162461bcd60e51b815260040161094890612053565b6001600160a01b03919091165f908152600c60205260409020805460ff1916911515919091179055565b6001600160a01b03165f9081526001602052604090205460ff1690565b5f610c2182846120cb565b5f81848411156113665760405162461bcd60e51b81526004016109489190611e50565b505050900390565b602d545f9060ff161561138d576113868484846117dc565b9050610c21565b6018546001600160a01b0385811661010090920416146113ec5760185460ff166113ec5760405162461bcd60e51b815260206004820152601060248201526f151c98591a5b99c8191a5cd8589b195960821b6044820152606401610948565b6113f6848361187c565b6113fe6118e4565b1561140b5761140b611931565b611413611c76565b1561142057611420611cd0565b6040805180820182526014815273496e73756666696369656e742042616c616e636560601b6020808301919091526001600160a01b0387165f90815260099091529190912054611471918490611343565b6001600160a01b0385165f90815260096020908152604080832093909355600b90529081205460ff16156114a557826114b0565b6114b0858585611d17565b6001600160a01b0385165f908152600960205260409020549091506114d59082611338565b6001600160a01b038086165f908152600960209081526040808320949094559188168152600d909152205460ff16611574576028546001600160a01b038681165f8181526009602052604090819020549051630a5b654b60e11b8152600481019290925260248201529116906314b6ca96906044015f604051808303815f87803b158015611561575f80fd5b505af1925050508015611572575060015b505b6001600160a01b0384165f908152600d602052604090205460ff16611600576028546001600160a01b038581165f8181526009602052604090819020549051630a5b654b60e11b8152600481019290925260248201529116906314b6ca96906044015f604051808303815f87803b1580156115ed575f80fd5b505af19250505080156115fe575060015b505b602854602a546040516001624d3b8760e01b031981526001600160a01b039092169163ffb2c479916116389160040190815260200190565b5f604051808303815f87803b15801561164f575f80fd5b505af1925050508015611660575060015b50836001600160a01b0316856001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516116a691815260200190565b60405180910390a3506001949350505050565b5f610c2182846120de565b5f610c2182846120f1565b5f610c21828461208c565b602d805460ff191660011790556040805160028082526060820183525f92602083019080368337505060035482519293506001600160a01b0316918391505f9061172657611726612108565b60200260200101906001600160a01b031690816001600160a01b031681525050308160018151811061175a5761175a612108565b6001600160a01b03928316602091820292909201015260195460405163b6f9de9560e01b815291169063b6f9de9590859061179f905f9086908890429060040161215e565b5f604051808303818588803b1580156117b6575f80fd5b505af11580156117c8573d5f803e3d5ffd5b5050602d805460ff19169055505050505050565b6040805180820182526014815273496e73756666696369656e742042616c616e636560601b6020808301919091526001600160a01b0386165f90815260099091529182205461182c918490611343565b6001600160a01b038086165f90815260096020526040808220939093559085168152205461185a9083611338565b6001600160a01b0384165f908152600960205260409020555060019392505050565b600854811115806118a457506001600160a01b0382165f908152600c602052604090205460ff165b6111c85760405162461bcd60e51b8152602060048201526011602482015270151608131a5b5a5d08115e18d959591959607a1b6044820152606401610948565b601a545f906001600160a01b031633148015906119045750602d5460ff16155b80156119125750602b5460ff165b8015610c73575050602c54305f90815260096020526040902054101590565b602d805460ff191660011790556016546017545f9161194f91610ad0565b61195b57600e5461195d565b5f5b90505f6119806002610f28601254610f2886602c546116c490919063ffffffff16565b90505f61199882602c546116b990919063ffffffff16565b6040805160028082526060820183529293505f92909160208301908036833701905050905030815f815181106119d0576119d0612108565b6001600160a01b039283166020918202929092010152600354825191169082906001908110611a0157611a01612108565b6001600160a01b03928316602091820292909201015260195460405163791ac94760e01b81524792919091169063791ac94790611a4a9086905f90879030904290600401612192565b5f604051808303815f87803b158015611a61575f80fd5b505af1158015611a73573d5f803e3d5ffd5b505050505f611a8b82476116b990919063ffffffff16565b90505f611aa5611a9c8860026116cf565b601254906116b9565b90505f611ab96002610f288481878d6116c4565b90505f611ad583610f28601054876116c490919063ffffffff16565b90505f611af184610f28601154886116c490919063ffffffff16565b905060285f9054906101000a90046001600160a01b03166001600160a01b031663d0e30db0836040518263ffffffff1660e01b81526004015f604051808303818588803b158015611b40575f80fd5b505af193505050508015611b52575060015b506015546040516001600160a01b039091169082156108fc029083905f818181858888f19350505050158015611b8a573d5f803e3d5ffd5b508815611c605760195460145460405163f305d71960e01b8152306004820152602481018c90525f6044820181905260648201526001600160a01b0391821660848201524260a482015291169063f305d71990859060c40160606040518083038185885af1158015611bfe573d5f803e3d5ffd5b50505050506040513d601f19601f82011682018060405250810190611c2391906121cd565b505060408051858152602081018c90527f424db2872186fa7e7afa7a5e902ed3b49a2ef19c2f5431e672462495dd6b450692500160405180910390a15b5050602d805460ff191690555050505050505050565b601a545f906001600160a01b03163314801590611c965750602d5460ff16155b8015611ca4575060215460ff165b8015611cbf575043602654602754611cbc91906120cb565b11155b8015610c7357505060255447101590565b602554600454611ce991906001600160a01b03166116da565b43602755602554602454611cfc91611338565b60248190556023541015611d15576021805460ff191690555b565b601354601a545f918291611d489190610f2890611d41906001600160a01b0389811691161461107e565b86906116c4565b305f90815260096020526040902054909150611d649082611338565b305f81815260096020526040908190209290925590516001600160a01b038716907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611db49085815260200190565b60405180910390a3611dc683826116b9565b95945050505050565b80358015158114611dde575f80fd5b919050565b5f805f8060808587031215611df6575f80fd5b611dff85611dcf565b966020860135965060408601359560600135945092505050565b5f805f805f60a08688031215611e2d575f80fd5b505083359560208501359550604085013594606081013594506080013592509050565b5f6020808352835180828501525f5b81811015611e7b57858101830151858201604001528201611e5f565b505f604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114611eaf575f80fd5b50565b5f8060408385031215611ec3575f80fd5b8235611ece81611e9b565b946020939093013593505050565b5f8060408385031215611eed575f80fd5b50508035926020909101359150565b5f805f60608486031215611f0e575f80fd5b505081359360208301359350604090920135919050565b5f805f60608486031215611f37575f80fd5b8335611f4281611e9b565b92506020840135611f5281611e9b565b929592945050506040919091013590565b5f60208284031215611f73575f80fd5b8135610c2181611e9b565b5f60208284031215611f8e575f80fd5b5035919050565b5f8060408385031215611fa6575f80fd5b8235611fb181611e9b565b9150611fbf60208401611dcf565b90509250929050565b5f8060408385031215611fd9575f80fd5b8235611fe481611e9b565b91506020830135611ff481611e9b565b809150509250929050565b5f6020828403121561200f575f80fd5b610c2182611dcf565b5f8060408385031215612029575f80fd5b611ece83611dcf565b5f8060408385031215612043575f80fd5b82359150611fbf60208401611dcf565b6020808252600b908201526a085055551213d49256915160aa1b604082015260600190565b634e487b7160e01b5f52601160045260245ffd5b5f826120a657634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526006908201526510a7aba722a960d11b604082015260600190565b80820180821115610aca57610aca612078565b81810381811115610aca57610aca612078565b8082028115828204841417610aca57610aca612078565b634e487b7160e01b5f52603260045260245ffd5b5f8151808452602080850194508084015f5b838110156121535781516001600160a01b03168752958201959082019060010161212e565b509495945050505050565b848152608060208201525f612176608083018661211c565b6001600160a01b03949094166040830152506060015292915050565b85815284602082015260a060408201525f6121b060a083018661211c565b6001600160a01b0394909416606083015250608001529392505050565b5f805f606084860312156121df575f80fd5b835192506020840151915060408401519050925092509256fea264697066735822122015c8e9dbb3f7d4281d767eba86023051e287016b1b176d92410537de0951e97f64736f6c63430008150033

Deployed Bytecode Sourcemap

12625:15447:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25079:187;;;;;;;;;;;;;:::i;:::-;;14789:50;;;;;;;;;;;;;;;;;;;160:25:1;;;148:2;133:18;14789:50:0;;;;;;;;24264:359;;;;;;;;;;-1:-1:-1;24264:359:0;;;;;:::i;:::-;;:::i;26046:496::-;;;;;;;;;;-1:-1:-1;26046:496:0;;;;;:::i;:::-;;:::i;16309:80::-;;;;;;;;;;-1:-1:-1;16381:5:0;;;;;;;;;;;;-1:-1:-1;;;16381:5:0;;;;16309:80;;;;;;;:::i;16812:216::-;;;;;;;;;;-1:-1:-1;16812:216:0;;;;;:::i;:::-;;:::i;:::-;;;2384:14:1;;2377:22;2359:41;;2347:2;2332:18;16812:216:0;2219:187:1;27801:150:0;;;;;;;;;;-1:-1:-1;27801:150:0;;;;;:::i;:::-;;:::i;16039:88::-;;;;;;;;;;-1:-1:-1;16112:12:0;;16039:88;;26950:183;;;;;;;;;;-1:-1:-1;26950:183:0;;;;;:::i;:::-;;:::i;24631:342::-;;;;;;;;;;-1:-1:-1;24631:342:0;;;;;:::i;:::-;;:::i;17325:365::-;;;;;;;;;;-1:-1:-1;17325:365:0;;;;;:::i;:::-;;:::i;27476:142::-;;;;;;;;;;;;;:::i;27141:183::-;;;;;;;;;;-1:-1:-1;27141:183:0;;;;;:::i;:::-;;:::i;4516:103::-;;;;;;;;;;-1:-1:-1;4516:103:0;;;;;:::i;:::-;4571:4;4606:5;-1:-1:-1;;;;;4595:16:0;;;4606:5;;4595:16;;4516:103;16133:80;;;;;;;;;;-1:-1:-1;16133:80:0;;13215:1;3840:36:1;;3828:2;3813:18;16133:80:0;3698:184:1;14373:38:0;;;;;;;;;;-1:-1:-1;14373:38:0;;;;;;;;17036:117;;;;;;;;;;-1:-1:-1;17036:117:0;;;;;:::i;:::-;;:::i;25274:145::-;;;;;;;;;;-1:-1:-1;25274:145:0;;;;;:::i;:::-;;:::i;25782:120::-;;;;;;;;;;-1:-1:-1;25782:120:0;;;;;:::i;:::-;;:::i;14752:30::-;;;;;;;;;;-1:-1:-1;14752:30:0;;;;;;;;16560:105;;;;;;;;;;-1:-1:-1;16560:105:0;;;;;:::i;:::-;-1:-1:-1;;;;;16644:18:0;16626:7;16644:18;;;:9;:18;;;;;;;16560:105;13288:57;;;;;;;;;;;;;;;;16395:78;;;;;;;;;;-1:-1:-1;16447:7:0;16465:5;-1:-1:-1;;;;;16465:5:0;16395:78;;;-1:-1:-1;;;;;4556:32:1;;;4538:51;;4526:2;4511:18;16395:78:0;4392:203:1;16219:84:0;;;;;;;;;;-1:-1:-1;16293:7:0;;;;;;;;;;;;-1:-1:-1;;;16293:7:0;;;;16219:84;;27332:136;;;;;;;;;;-1:-1:-1;27332:136:0;;;;;:::i;:::-;;:::i;26550:228::-;;;;;;;;;;-1:-1:-1;26550:228:0;;;;;:::i;:::-;;:::i;14670:33::-;;;;;;;;;;-1:-1:-1;14670:33:0;;;;-1:-1:-1;;;;;14670:33:0;;;14078:19;;;;;;;;;;-1:-1:-1;14078:19:0;;;;-1:-1:-1;;;;;14078:19:0;;;17161:156;;;;;;;;;;-1:-1:-1;17161:156:0;;;;;:::i;:::-;;:::i;12816:64::-;;;;;;;;;;-1:-1:-1;12816:64:0;;;;-1:-1:-1;;;;;12816:64:0;;;23471:105;;;;;;;;;;;;;:::i;4189:94::-;;;;;;;;;;-1:-1:-1;4189:94:0;;;;;:::i;:::-;;:::i;14106:25::-;;;;;;;;;;;;;;;;17698:125;;;;;;;;;;-1:-1:-1;17698:125:0;;;;;:::i;:::-;;:::i;14138:34::-;;;;;;;;;;;;;;;;13819:36;;;;;;;;;;-1:-1:-1;13819:36:0;;;;-1:-1:-1;;;;;13819:36:0;;;27626:167;;;;;;;;;;-1:-1:-1;27626:167:0;;;;;:::i;:::-;;:::i;19896:663::-;;;;;;;;;;;;;:::i;16671:133::-;;;;;;;;;;-1:-1:-1;16671:133:0;;;;;:::i;:::-;-1:-1:-1;;;;;16773:19:0;;;16755:7;16773:19;;;:11;:19;;;;;;;;:28;;;;;;;;;;;;;16671:133;26786:156;;;;;;;;;;-1:-1:-1;26786:156:0;;;;;:::i;:::-;;:::i;12697:48::-;;;;;;;;;;-1:-1:-1;12697:48:0;12728:17;12697:48;;13862:35;;;;;;;;;;-1:-1:-1;13862:35:0;;;;-1:-1:-1;;;;;13862:35:0;;;4359:97;;;;;;;;;;-1:-1:-1;4359:97:0;;;;;:::i;:::-;;:::i;19661:227::-;;;;;;;;;;-1:-1:-1;19661:227:0;;;;;:::i;:::-;;:::i;4916:173::-;;;;;;;;;;-1:-1:-1;4916:173:0;;;;;:::i;:::-;;:::i;23147:316::-;;;;;;;;;;-1:-1:-1;23147:316:0;;;;;:::i;:::-;;:::i;25427:347::-;;;;;;;;;;-1:-1:-1;25427:347:0;;;;;:::i;:::-;;:::i;25910:128::-;;;;;;;;;;-1:-1:-1;25910:128:0;;;;;:::i;:::-;;:::i;14047:24::-;;;;;;;;;;-1:-1:-1;14047:24:0;;;;-1:-1:-1;;;;;14047:24:0;;;4690:107;;;;;;;;;;-1:-1:-1;4690:107:0;;;;;:::i;:::-;;:::i;25079:187::-;4074:24;4087:10;4074:12;:24::i;:::-;4066:48;;;;-1:-1:-1;;;4066:48:0;;;;;;;:::i;:::-;;;;;;;;;25134:10:::1;::::0;:15;25126:48:::1;;;::::0;-1:-1:-1;;;25126:48:0;;6712:2:1;25126:48:0::1;::::0;::::1;6694:21:1::0;6751:2;6731:18;;;6724:30;-1:-1:-1;;;6770:18:1;;;6763:50;6830:18;;25126:48:0::1;6510:344:1::0;25126:48:0::1;25198:12;25185:10;:25:::0;25243:15:::1;25221:19;:37:::0;25079:187::o;24264:359::-;4074:24;4087:10;4074:12;:24::i;:::-;4066:48;;;;-1:-1:-1;;;4066:48:0;;;;;;;:::i;:::-;24390:18:::1;:29:::0;;-1:-1:-1;;24390:29:0::1;::::0;::::1;;::::0;;;::::1;::::0;;;24430:14:::1;:21:::0;;;;-1:-1:-1;24462:22:0::1;:26:::0;24499:17:::1;:27:::0;24537:22:::1;:32:::0;24603:12:::1;24580:20;:35:::0;24264:359::o;26046:496::-;4074:24;4087:10;4074:12;:24::i;:::-;4066:48;;;;-1:-1:-1;;;4066:48:0;;;;;;;:::i;:::-;26210:12:::1;:28:::0;;;26249:10:::1;:24:::0;;;26284:13:::1;:30:::0;;;26325:12:::1;:28:::0;;;26375:69:::1;26340:13:::0;26375:50:::1;26300:14:::0;26375:50;26225:13;26262:11;26375:17:::1;:30::i;:::-;:34:::0;::::1;:50::i;:69::-;26364:8;:80:::0;26455:14:::1;:32:::0;;;26517:16:::1;26532:1;26472:15:::0;26517:16:::1;:::i;:::-;26506:8;;:27;26498:36;;;::::0;::::1;;26046:496:::0;;;;;:::o;16812:216::-;16916:10;16887:4;16904:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;16904:32:0;;;;;;;;;;:41;;;16961:37;16887:4;;16904:32;;16961:37;;;;16939:6;160:25:1;;148:2;133:18;;14:177;16961:37:0;;;;;;;;-1:-1:-1;17016:4:0;16812:216;;;;;:::o;27801:150::-;27881:4;27937:6;27905:29;27925:8;27905:19;:29::i;:::-;:38;;27801:150;-1:-1:-1;;;27801:150:0:o;26950:183::-;4074:24;4087:10;4074:12;:24::i;:::-;4066:48;;;;-1:-1:-1;;;4066:48:0;;;;;;;:::i;:::-;27048:15:::1;:25:::0;;;;27084:26:::1;:41:::0;26950:183::o;24631:342::-;4074:24;4087:10;4074:12;:24::i;:::-;4066:48;;;;-1:-1:-1;;;4066:48:0;;;;;;;:::i;:::-;24791:1:::1;24764:23;24776:11:::0;24764:9;:23:::1;:::i;:::-;:28;;:55;;;;;24808:11;24796:9;:23;24764:55;24756:64;;;::::0;::::1;;24831:26;:38:::0;;;;24880:28:::1;:42:::0;24933:23:::1;:32:::0;24631:342::o;17325:365::-;17480:12;;-1:-1:-1;;;;;17445:19:0;;17425:4;17445:19;;;:11;:19;;;;;;;;17465:10;17445:31;;;;;;;;17425:4;;17445:47;17442:181;;17542:69;;;;;;;;;;;-1:-1:-1;;;17542:69:0;;;;;;;;-1:-1:-1;;;;;17542:19:0;;-1:-1:-1;17542:19:0;;;:11;:19;;;;;17562:10;17542:31;;;;;;;;;;:69;;17578:6;;17542:35;:69::i;:::-;-1:-1:-1;;;;;17508:19:0;;;;;;:11;:19;;;;;;;;17528:10;17508:31;;;;;;;:103;17442:181;17642:40;17656:6;17664:9;17675:6;17642:13;:40::i;:::-;17635:47;;17325:365;;;;;;:::o;27476:142::-;27604:4;;-1:-1:-1;;;;;27604:4:0;27529:7;16644:18;;;:9;:18;;;;;;27556:54;;27583:4;;-1:-1:-1;;;;;27583:4:0;16626:7;16644:18;;;:9;:18;;;;;;27556:33;;:12;;;:16;:33::i;:::-;:37;;:54::i;:::-;27549:61;;27476:142;:::o;27141:183::-;4074:24;4087:10;4074:12;:24::i;:::-;4066:48;;;;-1:-1:-1;;;4066:48:0;;;;;;;:::i;:::-;27251:11:::1;::::0;:65:::1;::::0;-1:-1:-1;;;27251:65:0;;::::1;::::0;::::1;7387:25:1::0;;;7428:18;;;7421:34;;;-1:-1:-1;;;;;27251:11:0;;::::1;::::0;:35:::1;::::0;7360:18:1;;27251:65:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;27141:183:::0;;:::o;17036:117::-;17091:4;17115:30;17123:7;17132:12;;17115:7;:30::i;25274:145::-;4074:24;4087:10;4074:12;:24::i;:::-;4066:48;;;;-1:-1:-1;;;4066:48:0;;;;;;;:::i;:::-;25374:4:::1;25359:12;;:19;;;;:::i;:::-;25349:6;:29;;25341:38;;;::::0;::::1;;25390:12;:21:::0;25274:145::o;25782:120::-;4074:24;4087:10;4074:12;:24::i;:::-;4066:48;;;;-1:-1:-1;;;4066:48:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;25866:19:0;;;::::1;;::::0;;;:11:::1;:19;::::0;;;;:28;;-1:-1:-1;;25866:28:0::1;::::0;::::1;;::::0;;;::::1;::::0;;25782:120::o;27332:136::-;4074:24;4087:10;4074:12;:24::i;:::-;4066:48;;;;-1:-1:-1;;;4066:48:0;;;;;;;:::i;:::-;27422:6:::1;27416:3;:12;27408:21;;;::::0;::::1;;27440:14;:20:::0;27332:136::o;26550:228::-;4074:24;4087:10;4074:12;:24::i;:::-;4066:48;;;;-1:-1:-1;;;4066:48:0;;;;;;;:::i;:::-;26669:21:::1;:46:::0;;-1:-1:-1;;;;;26669:46:0;;::::1;-1:-1:-1::0;;;;;;26669:46:0;;::::1;;::::0;;;26726:20:::1;:44:::0;;;;;::::1;::::0;::::1;;::::0;;26550:228::o;17161:156::-;17241:4;17265:44;17279:10;17291:9;17302:6;17265:13;:44::i;23471:105::-;4074:24;4087:10;4074:12;:24::i;:::-;4066:48;;;;-1:-1:-1;;;4066:48:0;;;;;;;:::i;:::-;23567:1:::1;23536:28;:32:::0;23471:105::o;4189:94::-;4571:4;4606:5;-1:-1:-1;;;;;4606:5:0;3913:10;4595:16;3897:38;;;;-1:-1:-1;;;3897:38:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;4249:19:0::1;;::::0;;;4271:4:::1;4249:19;::::0;;;;;;;:26;;-1:-1:-1;;4249:26:0::1;::::0;;::::1;::::0;;4189:94::o;17698:125::-;4074:24;4087:10;4074:12;:24::i;:::-;4066:48;;;;-1:-1:-1;;;4066:48:0;;;;;;;:::i;:::-;17783:14:::1;:32:::0;;-1:-1:-1;;17783:32:0::1;::::0;::::1;;::::0;;;::::1;::::0;;17698:125::o;27626:167::-;27694:7;27721:64;27762:22;:20;:22::i;:::-;27744:4;;-1:-1:-1;;;;;27744:4:0;16626:7;16644:18;;;:9;:18;;;;;;27721:36;;27734:22;;27754:1;27734:19;:22::i;:::-;27721:8;;:12;:36::i;:::-;:40;;:64::i;19896:663::-;19945:7;20000:15;19969:19;;19991:6;19969:28;;;;:::i;:::-;:46;19965:561;;;20039:39;20063:14;;20039:19;20052:5;20039:8;;:12;;:19;;;;:::i;19965:561::-;20160:15;20100:57;20133:23;;20100:28;;:32;;:57;;;;:::i;:::-;:75;20096:430;;;20192:21;20216:78;20278:15;20216:57;20249:23;;20216:28;;:32;;:57;;;;:::i;:78::-;20192:102;;20309:19;20331:88;20410:8;;20331:74;20376:28;;20331:40;20344:26;;20331:8;;:12;;:40;;;;:::i;:88::-;20309:110;;20441:73;20454:59;20489:23;;20454:30;20470:13;20454:11;:15;;:30;;;;:::i;:59::-;20441:8;;;:12;:73::i;:::-;20434:80;;;;19896:663;:::o;20096:430::-;-1:-1:-1;20543:8:0;;;19896:663::o;26786:156::-;4074:24;4087:10;4074:12;:24::i;:::-;4066:48;;;;-1:-1:-1;;;4066:48:0;;;;;;;:::i;:::-;26878:11:::1;:22:::0;;-1:-1:-1;;26878:22:0::1;::::0;::::1;;::::0;;;::::1;::::0;;;26911:13:::1;:23:::0;26786:156::o;4359:97::-;4571:4;4606:5;-1:-1:-1;;;;;4606:5:0;3913:10;4595:16;3897:38;;;;-1:-1:-1;;;3897:38:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;4421:19:0::1;4443:5;4421:19:::0;;;:14:::1;:19;::::0;;;;:27;;-1:-1:-1;;4421:27:0::1;::::0;;4359:97::o;19661:227::-;19717:7;19758:12;19740:10;;19753:1;19740:14;;;;:::i;:::-;:30;19737:67;;19780:14;;:21;;19799:1;19780:18;:21::i;19737:67::-;19817:7;19814:41;;;19834:18;:16;:18::i;19814:41::-;-1:-1:-1;;19872:8:0;;;19661:227::o;4916:173::-;4571:4;4606:5;-1:-1:-1;;;;;4606:5:0;3913:10;4595:16;3897:38;;;;-1:-1:-1;;;3897:38:0;;;;;;;:::i;:::-;4992:5:::1;:11:::0;;-1:-1:-1;;;;;;4992:11:0::1;-1:-1:-1::0;;;;;4992:11:0;::::1;::::0;;::::1;::::0;;5014:19;;;-1:-1:-1;5014:19:0::1;::::0;;;;;;;;:26;;-1:-1:-1;;5014:26:0::1;::::0;;::::1;::::0;;;5056:25;;4538:51:1;;;5056:25:0::1;::::0;4511:18:1;5056:25:0::1;;;;;;;4916:173:::0;:::o;23147:316::-;4074:24;4087:10;4074:12;:24::i;:::-;4066:48;;;;-1:-1:-1;;;4066:48:0;;;;;;;:::i;:::-;23271:4:::1;::::0;23253:23:::1;::::0;23263:6;;-1:-1:-1;;;;;23271:4:0::1;23253:9;:23::i;:::-;23290:24;23287:169;;;23361:15;23330:28;:46:::0;23420:23:::1;::::0;;23396:48:::1;::::0;160:25:1;;;23396:48:0::1;::::0;133:18:1;23396:48:0::1;;;;;;;23287:169;23147:316:::0;;:::o;25427:347::-;4074:24;4087:10;4074:12;:24::i;:::-;4066:48;;;;-1:-1:-1;;;4066:48:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;25524:23:0;::::1;25542:4;25524:23;::::0;::::1;::::0;:41:::1;;-1:-1:-1::0;25561:4:0::1;::::0;-1:-1:-1;;;;;25551:14:0;;::::1;25561:4:::0;::::1;25551:14;;25524:41;25516:50;;;::::0;::::1;;-1:-1:-1::0;;;;;25577:24:0;::::1;;::::0;;;:16:::1;:24;::::0;;;;:33;;-1:-1:-1;;25577:33:0::1;::::0;::::1;::::0;::::1;::::0;;;::::1;::::0;;;25621:146:::1;;25646:11;::::0;:31:::1;::::0;-1:-1:-1;;;25646:31:0;;-1:-1:-1;;;;;8346:32:1;;;25646:31:0::1;::::0;::::1;8328:51:1::0;25646:11:0::1;8395:18:1::0;;;8388:34;25646:11:0;;::::1;::::0;:20:::1;::::0;8301:18:1;;25646:31:0::1;8146:282:1::0;25621:146:0::1;25708:11;::::0;-1:-1:-1;;;;;25737:17:0;;::::1;25708:11;25737:17:::0;;;:9:::1;:17;::::0;;;;;;;25708:47;;-1:-1:-1;;;25708:47:0;;::::1;::::0;::::1;8328:51:1::0;;;;8395:18;;;8388:34;25708:11:0;::::1;::::0;:20:::1;::::0;8301:18:1;;25708:47:0::1;8146:282:1::0;25910:128:0;4074:24;4087:10;4074:12;:24::i;:::-;4066:48;;;;-1:-1:-1;;;4066:48:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;25998:23:0;;;::::1;;::::0;;;:15:::1;:23;::::0;;;;:32;;-1:-1:-1;;25998:32:0::1;::::0;::::1;;::::0;;;::::1;::::0;;25910:128::o;4690:107::-;-1:-1:-1;;;;;4770:19:0;4746:4;4770:19;;;:14;:19;;;;;;;;;4690:107::o;1473:98::-;1531:7;1558:5;1562:1;1558;:5;:::i;2003:206::-;2089:7;2150:12;2142:6;;;;2134:29;;;;-1:-1:-1;;;2134:29:0;;;;;;;;:::i;:::-;-1:-1:-1;;;2185:5:0;;;2003:206::o;17831:1182::-;17943:6;;17923:4;;17943:6;;17940:63;;;17959:41;17974:6;17982:9;17993:6;17959:14;:41::i;:::-;17952:48;;;;17940:63;18026:6;;-1:-1:-1;;;;;18016:16:0;;;18026:6;;;;;18016:16;18013:100;;18066:14;;;;18058:43;;;;-1:-1:-1;;;18058:43:0;;8914:2:1;18058:43:0;;;8896:21:1;8953:2;8933:18;;;8926:30;-1:-1:-1;;;8972:18:1;;;8965:46;9028:18;;18058:43:0;8712:340:1;18058:43:0;18123:28;18136:6;18144;18123:12;:28::i;:::-;18177:16;:14;:16::i;:::-;18174:35;;;18196:10;:8;:10::i;:::-;18222:19;:17;:19::i;:::-;18219:48;;;18244:20;:18;:20::i;:::-;18402:53;;;;;;;;;;;-1:-1:-1;;;18402:53:0;;;;;;;;-1:-1:-1;;;;;18402:17:0;;-1:-1:-1;18402:17:0;;;:9;:17;;;;;;;;:53;;18424:6;;18402:21;:53::i;:::-;-1:-1:-1;;;;;18382:17:0;;;;;;:9;:17;;;;;;;;:73;;;;19626:11;:19;;;;;;;;19625:20;18493:67;;18554:6;18493:67;;;18517:34;18525:6;18533:9;18544:6;18517:7;:34::i;:::-;-1:-1:-1;;;;;18596:20:0;;;;;;:9;:20;;;;;;18468:92;;-1:-1:-1;18596:40:0;;18468:92;18596:24;:40::i;:::-;-1:-1:-1;;;;;18573:20:0;;;;;;;:9;:20;;;;;;;;:63;;;;18653:24;;;;;:16;:24;;;;;;;18649:96;;18684:11;;-1:-1:-1;;;;;18713:17:0;;;18684:11;18713:17;;;:9;:17;;;;;;;;18684:47;;-1:-1:-1;;;18684:47:0;;;;;8328:51:1;;;;8395:18;;;8388:34;18684:11:0;;;:20;;8301:18:1;;18684:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18680:63;;-1:-1:-1;;;;;18759:27:0;;;;;;:16;:27;;;;;;;;18755:105;;18793:11;;-1:-1:-1;;;;;18825:20:0;;;18793:11;18825:20;;;:9;:20;;;;;;;;18793:53;;-1:-1:-1;;;18793:53:0;;;;;8328:51:1;;;;8395:18;;;8388:34;18793:11:0;;;:20;;8301:18:1;;18793:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18789:69;;18876:11;;18896:14;;18876:35;;-1:-1:-1;;;;;;18876:35:0;;-1:-1:-1;;;;;18876:11:0;;;;:19;;:35;;;;160:25:1;;;148:2;133:18;;14:177;18876:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18872:51;18957:9;-1:-1:-1;;;;;18940:43:0;18949:6;-1:-1:-1;;;;;18940:43:0;;18968:14;18940:43;;;;160:25:1;;148:2;133:18;;14:177;18940:43:0;;;;;;;;-1:-1:-1;19001:4:0;;17831:1182;-1:-1:-1;;;;17831:1182:0:o;1579:98::-;1637:7;1664:5;1668:1;1664;:5;:::i;1685:98::-;1743:7;1770:5;1774:1;1770;:5;:::i;1791:98::-;1849:7;1876:5;1880:1;1876;:5;:::i;23895:361::-;14896:6;:13;;-1:-1:-1;;14896:13:0;14905:4;14896:13;;;23995:16:::1;::::0;;24009:1:::1;23995:16:::0;;;;;::::1;::::0;;-1:-1:-1;;23995:16:0::1;::::0;::::1;::::0;;::::1;::::0;::::1;-1:-1:-1::0;;24032:4:0::1;::::0;24022:7;;;;-1:-1:-1;;;;;;24032:4:0::1;::::0;24022:7;;-1:-1:-1;24032:4:0::1;::::0;24022:7:::1;;;;:::i;:::-;;;;;;:14;-1:-1:-1::0;;;;;24022:14:0::1;;;-1:-1:-1::0;;;;;24022:14:0::1;;;::::0;::::1;24065:4;24047;24052:1;24047:7;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;24047:23:0;;::::1;:7;::::0;;::::1;::::0;;;;;:23;24083:6:::1;::::0;:165:::1;::::0;-1:-1:-1;;;24083:165:0;;:6;::::1;::::0;:57:::1;::::0;24148:6;;24083:165:::1;::::0;:6:::1;::::0;24186:4;;24205:2;;24222:15:::1;::::0;24083:165:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;14914:6:0;:14;;-1:-1:-1;;14914:14:0;;;-1:-1:-1;;;;;;23895:361:0:o;19021:332::-;19151:53;;;;;;;;;;;-1:-1:-1;;;19151:53:0;;;;;;;;-1:-1:-1;;;;;19151:17:0;;19114:4;19151:17;;;:9;:17;;;;;;;:53;;19173:6;;19151:21;:53::i;:::-;-1:-1:-1;;;;;19131:17:0;;;;;;;:9;:17;;;;;;:73;;;;19238:20;;;;;;;:32;;19263:6;19238:24;:32::i;:::-;-1:-1:-1;;;;;19215:20:0;;;;;;:9;:20;;;;;:55;-1:-1:-1;19341:4:0;19021:332;;;;;:::o;19365:166::-;19462:12;;19452:6;:22;;:49;;;-1:-1:-1;;;;;;19478:23:0;;;;;;:15;:23;;;;;;;;19452:49;19444:79;;;;-1:-1:-1;;;19444:79:0;;10810:2:1;19444:79:0;;;10792:21:1;10849:2;10829:18;;;10822:30;-1:-1:-1;;;10868:18:1;;;10861:47;10925:18;;19444:79:0;10608:341:1;20947:197:0;21034:4;;20996;;-1:-1:-1;;;;;21034:4:0;21020:10;:18;;;;:38;;-1:-1:-1;21052:6:0;;;;21051:7;21020:38;:62;;;;-1:-1:-1;21071:11:0;;;;21020:62;:116;;;;-1:-1:-1;;21123:13:0;;21113:4;21095:24;;;;:9;:24;;;;;;:41;;;20947:197::o;21152:1661::-;14896:6;:13;;-1:-1:-1;;14896:13:0;14905:4;14896:13;;;21247:15:::1;::::0;21264:26:::1;::::0;14896:6;;21231:60:::1;::::0;:15:::1;:60::i;:::-;:79;;21298:12;;21231:79;;;21294:1;21231:79;21201:109;;21321:23;21347:59;21404:1;21347:52;21390:8;;21347:38;21365:19;21347:13;;:17;;:38;;;;:::i;:59::-;21321:85;;21417:20;21440:34;21458:15;21440:13;;:17;;:34;;;;:::i;:::-;21511:16;::::0;;21525:1:::1;21511:16:::0;;;;;::::1;::::0;;21417:57;;-1:-1:-1;21487:21:0::1;::::0;21511:16;;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;;::::0;-1:-1:-1;21511:16:0::1;21487:40;;21556:4;21538;21543:1;21538:7;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;21538:23:0;;::::1;:7;::::0;;::::1;::::0;;;;;:23;21582:4:::1;::::0;21572:7;;21582:4;::::1;::::0;21572;;21582;;21572:7;::::1;;;;;:::i;:::-;-1:-1:-1::0;;;;;21572:14:0;;::::1;:7;::::0;;::::1;::::0;;;;;:14;21655:6:::1;::::0;:188:::1;::::0;-1:-1:-1;;;21655:188:0;;21621:21:::1;::::0;21655:6;;;::::1;::::0;:57:::1;::::0;:188:::1;::::0;21727:12;;21597:21:::1;::::0;21770:4;;21797::::1;::::0;21817:15:::1;::::0;21655:188:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;21856:17;21876:40;21902:13;21876:21;:25;;:40;;;;:::i;:::-;21856:60:::0;-1:-1:-1;21929:19:0::1;21951:40;21964:26;:19:::0;21988:1:::1;21964:23;:26::i;:::-;21951:8;::::0;;:12:::1;:40::i;:::-;21929:62:::0;-1:-1:-1;22004:26:0::1;22033:58;22089:1;22033:51;21929:62:::0;22033:51;:9;22047:19;22033:13:::1;:34::i;:58::-;22004:87;;22102:27;22132:45;22165:11;22132:28;22146:13;;22132:9;:13;;:28;;;;:::i;:45::-;22102:75;;22188:26;22217:44;22249:11;22217:27;22231:12;;22217:9;:13;;:27;;;;:::i;:44::-;22188:73;;22278:11;;;;;;;;;-1:-1:-1::0;;;;;22278:11:0::1;-1:-1:-1::0;;;;;22278:19:0::1;;22305;22278:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;22274:65:::0;22357:20:::1;::::0;22349:58:::1;::::0;-1:-1:-1;;;;;22357:20:0;;::::1;::::0;22349:58;::::1;;;::::0;22388:18;;22357:20:::1;22349:58:::0;22357:20;22349:58;22388:18;22357:20;22349:58;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;22447:19:0;;22444:362:::1;;22482:6;::::0;22656:21:::1;::::0;22482:244:::1;::::0;-1:-1:-1;;;22482:244:0;;22558:4:::1;22482:244;::::0;::::1;11882:34:1::0;11932:18;;;11925:34;;;22482:6:0::1;11975:18:1::0;;;11968:34;;;12018:18;;;12011:34;-1:-1:-1;;;;;22656:21:0;;::::1;12061:19:1::0;;;12054:44;22696:15:0::1;12114:19:1::0;;;12107:35;22482:6:0;::::1;::::0;:22:::1;::::0;22512:18;;11816:19:1;;22482:244:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;22746:48:0::1;::::0;;7387:25:1;;;7443:2;7428:18;;7421:34;;;22746:48:0::1;::::0;-1:-1:-1;7360:18:1;22746:48:0::1;;;;;;;22444:362;-1:-1:-1::0;;14914:6:0;:14;;-1:-1:-1;;14914:14:0;;;-1:-1:-1;;;;;;;;21152:1661:0:o;22821:318::-;22911:4;;22873;;-1:-1:-1;;;;;22911:4:0;22897:10;:18;;;;:38;;-1:-1:-1;22929:6:0;;;;22928:7;22897:38;:69;;;;-1:-1:-1;22948:18:0;;;;22897:69;:143;;;;;23028:12;23002:22;;22979:20;;:45;;;;:::i;:::-;:61;;22897:143;:234;;;;-1:-1:-1;;23114:17:0;;23089:21;:42;;;22821:318::o;23584:303::-;23644:17;;23663:4;;23634:34;;23644:17;-1:-1:-1;;;;;23663:4:0;23634:9;:34::i;:::-;23702:12;23679:20;:35;23777:17;;23750:22;;:45;;:26;:45::i;:::-;23725:22;:70;;;23834:14;;-1:-1:-1;23806:74:0;;;23851:18;:26;;-1:-1:-1;;23851:26:0;;;23806:74;23584:303::o;20567:372::-;20738:14;;20727:4;;20652:7;;;;20692:61;;20738:14;20692:41;;20703:29;;-1:-1:-1;;;;;20715:16:0;;;20727:4;;20715:16;20703:11;:29::i;:::-;20692:6;;:10;:41::i;:61::-;20811:4;20793:24;;;;:9;:24;;;;;;20672:81;;-1:-1:-1;20793:39:0;;20672:81;20793:28;:39::i;:::-;20784:4;20766:24;;;;:9;:24;;;;;;;:66;;;;20848:42;;-1:-1:-1;;;;;20848:42:0;;;;;;;20880:9;160:25:1;;148:2;133:18;;14:177;20848:42:0;;;;;;;;20910:21;:6;20921:9;20910:10;:21::i;:::-;20903:28;20567:372;-1:-1:-1;;;;;20567:372:0:o;196:160:1:-;261:20;;317:13;;310:21;300:32;;290:60;;346:1;343;336:12;290:60;196:160;;;:::o;361:385::-;444:6;452;460;468;521:3;509:9;500:7;496:23;492:33;489:53;;;538:1;535;528:12;489:53;561:26;577:9;561:26;:::i;:::-;551:36;634:2;619:18;;606:32;;-1:-1:-1;685:2:1;670:18;;657:32;;736:2;721:18;708:32;;-1:-1:-1;361:385:1;-1:-1:-1;;;361:385:1:o;751:454::-;846:6;854;862;870;878;931:3;919:9;910:7;906:23;902:33;899:53;;;948:1;945;938:12;899:53;-1:-1:-1;;971:23:1;;;1041:2;1026:18;;1013:32;;-1:-1:-1;1092:2:1;1077:18;;1064:32;;1143:2;1128:18;;1115:32;;-1:-1:-1;1194:3:1;1179:19;1166:33;;-1:-1:-1;751:454:1;-1:-1:-1;751:454:1:o;1210:548::-;1322:4;1351:2;1380;1369:9;1362:21;1412:6;1406:13;1455:6;1450:2;1439:9;1435:18;1428:34;1480:1;1490:140;1504:6;1501:1;1498:13;1490:140;;;1599:14;;;1595:23;;1589:30;1565:17;;;1584:2;1561:26;1554:66;1519:10;;1490:140;;;1494:3;1679:1;1674:2;1665:6;1654:9;1650:22;1646:31;1639:42;1749:2;1742;1738:7;1733:2;1725:6;1721:15;1717:29;1706:9;1702:45;1698:54;1690:62;;;;1210:548;;;;:::o;1763:131::-;-1:-1:-1;;;;;1838:31:1;;1828:42;;1818:70;;1884:1;1881;1874:12;1818:70;1763:131;:::o;1899:315::-;1967:6;1975;2028:2;2016:9;2007:7;2003:23;1999:32;1996:52;;;2044:1;2041;2034:12;1996:52;2083:9;2070:23;2102:31;2127:5;2102:31;:::i;:::-;2152:5;2204:2;2189:18;;;;2176:32;;-1:-1:-1;;;1899:315:1:o;2411:248::-;2479:6;2487;2540:2;2528:9;2519:7;2515:23;2511:32;2508:52;;;2556:1;2553;2546:12;2508:52;-1:-1:-1;;2579:23:1;;;2649:2;2634:18;;;2621:32;;-1:-1:-1;2411:248:1:o;2664:316::-;2741:6;2749;2757;2810:2;2798:9;2789:7;2785:23;2781:32;2778:52;;;2826:1;2823;2816:12;2778:52;-1:-1:-1;;2849:23:1;;;2919:2;2904:18;;2891:32;;-1:-1:-1;2970:2:1;2955:18;;;2942:32;;2664:316;-1:-1:-1;2664:316:1:o;2985:456::-;3062:6;3070;3078;3131:2;3119:9;3110:7;3106:23;3102:32;3099:52;;;3147:1;3144;3137:12;3099:52;3186:9;3173:23;3205:31;3230:5;3205:31;:::i;:::-;3255:5;-1:-1:-1;3312:2:1;3297:18;;3284:32;3325:33;3284:32;3325:33;:::i;:::-;2985:456;;3377:7;;-1:-1:-1;;;3431:2:1;3416:18;;;;3403:32;;2985:456::o;3446:247::-;3505:6;3558:2;3546:9;3537:7;3533:23;3529:32;3526:52;;;3574:1;3571;3564:12;3526:52;3613:9;3600:23;3632:31;3657:5;3632:31;:::i;3887:180::-;3946:6;3999:2;3987:9;3978:7;3974:23;3970:32;3967:52;;;4015:1;4012;4005:12;3967:52;-1:-1:-1;4038:23:1;;3887:180;-1:-1:-1;3887:180:1:o;4072:315::-;4137:6;4145;4198:2;4186:9;4177:7;4173:23;4169:32;4166:52;;;4214:1;4211;4204:12;4166:52;4253:9;4240:23;4272:31;4297:5;4272:31;:::i;:::-;4322:5;-1:-1:-1;4346:35:1;4377:2;4362:18;;4346:35;:::i;:::-;4336:45;;4072:315;;;;;:::o;4600:388::-;4668:6;4676;4729:2;4717:9;4708:7;4704:23;4700:32;4697:52;;;4745:1;4742;4735:12;4697:52;4784:9;4771:23;4803:31;4828:5;4803:31;:::i;:::-;4853:5;-1:-1:-1;4910:2:1;4895:18;;4882:32;4923:33;4882:32;4923:33;:::i;:::-;4975:7;4965:17;;;4600:388;;;;;:::o;4993:180::-;5049:6;5102:2;5090:9;5081:7;5077:23;5073:32;5070:52;;;5118:1;5115;5108:12;5070:52;5141:26;5157:9;5141:26;:::i;5178:248::-;5243:6;5251;5304:2;5292:9;5283:7;5279:23;5275:32;5272:52;;;5320:1;5317;5310:12;5272:52;5343:26;5359:9;5343:26;:::i;5691:248::-;5756:6;5764;5817:2;5805:9;5796:7;5792:23;5788:32;5785:52;;;5833:1;5830;5823:12;5785:52;5869:9;5856:23;5846:33;;5898:35;5929:2;5918:9;5914:18;5898:35;:::i;6170:335::-;6372:2;6354:21;;;6411:2;6391:18;;;6384:30;-1:-1:-1;;;6445:2:1;6430:18;;6423:41;6496:2;6481:18;;6170:335::o;6859:127::-;6920:10;6915:3;6911:20;6908:1;6901:31;6951:4;6948:1;6941:15;6975:4;6972:1;6965:15;6991:217;7031:1;7057;7047:132;;7101:10;7096:3;7092:20;7089:1;7082:31;7136:4;7133:1;7126:15;7164:4;7161:1;7154:15;7047:132;-1:-1:-1;7193:9:1;;6991:217::o;7466:329::-;7668:2;7650:21;;;7707:1;7687:18;;;7680:29;-1:-1:-1;;;7740:2:1;7725:18;;7718:36;7786:2;7771:18;;7466:329::o;7800:125::-;7865:9;;;7886:10;;;7883:36;;;7899:18;;:::i;9057:128::-;9124:9;;;9145:11;;;9142:37;;;9159:18;;:::i;9190:168::-;9263:9;;;9294;;9311:15;;;9305:22;;9291:37;9281:71;;9332:18;;:::i;9495:127::-;9556:10;9551:3;9547:20;9544:1;9537:31;9587:4;9584:1;9577:15;9611:4;9608:1;9601:15;9627:461;9680:3;9718:5;9712:12;9745:6;9740:3;9733:19;9771:4;9800:2;9795:3;9791:12;9784:19;;9837:2;9830:5;9826:14;9858:1;9868:195;9882:6;9879:1;9876:13;9868:195;;;9947:13;;-1:-1:-1;;;;;9943:39:1;9931:52;;10003:12;;;;10038:15;;;;9979:1;9897:9;9868:195;;;-1:-1:-1;10079:3:1;;9627:461;-1:-1:-1;;;;;9627:461:1:o;10093:510::-;10364:6;10353:9;10346:25;10407:3;10402:2;10391:9;10387:18;10380:31;10327:4;10428:57;10480:3;10469:9;10465:19;10457:6;10428:57;:::i;:::-;-1:-1:-1;;;;;10521:32:1;;;;10516:2;10501:18;;10494:60;-1:-1:-1;10585:2:1;10570:18;10563:34;10420:65;10093:510;-1:-1:-1;;10093:510:1:o;10954:582::-;11253:6;11242:9;11235:25;11296:6;11291:2;11280:9;11276:18;11269:34;11339:3;11334:2;11323:9;11319:18;11312:31;11216:4;11360:57;11412:3;11401:9;11397:19;11389:6;11360:57;:::i;:::-;-1:-1:-1;;;;;11453:32:1;;;;11448:2;11433:18;;11426:60;-1:-1:-1;11517:3:1;11502:19;11495:35;11352:65;10954:582;-1:-1:-1;;;10954:582:1:o;12153:306::-;12241:6;12249;12257;12310:2;12298:9;12289:7;12285:23;12281:32;12278:52;;;12326:1;12323;12316:12;12278:52;12355:9;12349:16;12339:26;;12405:2;12394:9;12390:18;12384:25;12374:35;;12449:2;12438:9;12434:18;12428:25;12418:35;;12153:306;;;;;:::o

Swarm Source

ipfs://38612fc442c4a3ba2e847ae552944171f47b87c165d79317cc4751a4f9dd161f
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.