ETH Price: $3,005.17 (+4.31%)
Gas: 1 Gwei

Token

ShibaWarp (SBWP)
 

Overview

Max Total Supply

371,623,543 SBWP

Holders

151

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
590,181.000000000025952256 SBWP

Value
$0.00
0xde916f407ba48acb0f2cf2b644fc32fb2b79c6ef
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
ShibaWarp

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-09-26
*/

// SPDX-License-Identifier: MIT

pragma solidity 0.8.18;

library SafeMathInt {
    int256 private constant MIN_INT256 = int256(1) << 255;
    int256 private constant MAX_INT256 = ~(int256(1) << 255);

    function mul(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a * b;

        require(c != MIN_INT256 || (a & MIN_INT256) != (b & MIN_INT256));
        require((b == 0) || (c / b == a));
        return c;
    }

    function div(int256 a, int256 b) internal pure returns (int256) {
        require(b != -1 || a != MIN_INT256);

        return a / b;
    }

    function sub(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a - b;
        require((b >= 0 && c <= a) || (b < 0 && c > a));
        return c;
    }

    function add(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a + b;
        require((b >= 0 && c >= a) || (b < 0 && c < a));
        return c;
    }
}

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;

        return c;
    }

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

interface IERC20 {
    function totalSupply() external view returns (uint256);

    function balanceOf(address who) external view returns (uint256);

    function allowance(address owner, address spender)
        external
        view
        returns (uint256);

    function transfer(address to, uint256 value) external returns (bool);

    function approve(address spender, uint256 value) external returns (bool);

    function transferFrom(
        address from,
        address to,
        uint256 value
    ) external returns (bool);

    event Transfer(address indexed from, address indexed to, uint256 value);

    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 value
    );
}

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

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

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

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

  function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;

  event Mint(address indexed sender, uint amount0, uint amount1);
  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 mint(address to) external returns (uint liquidity);
  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;
}

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

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

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

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

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

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

  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 feeTo() external view returns (address);
  function feeToSetter() external view returns (address);

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

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

contract DividendDistributor is IDividendDistributor {
    using SafeMath for uint256;

    address public _token;

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

    IERC20 SHIBA = IERC20(0x95aD61b0a150d79219dCF64E1E6Cc01f0B64C4cE);
    IUniswapV2Router02 router;

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

    mapping (address => Share) public shares;

    uint256 public totalShares;
    uint256 public totalDividends;
    uint256 public totalDistributed;
    uint256 public dividendsPerShare;
    uint256 public currentIndex;

    uint256 public constant dividendsPerShareAccuracyFactor = 10 ** 36;
    uint256 public minPeriod = 1 hours;
    uint256 public minDistribution = 1 * (10 ** 18);
    uint256 public minSharesRequired = 100;

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

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

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

    receive() external payable {}

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

    function setSelllessSwapAddress(address _selllessSwap) external override onlyToken {
        selllessSwap = _selllessSwap;
    }

    function setMinimumSharesRequired(uint256 _minSharesRequired) external override onlyToken {
        minSharesRequired = _minSharesRequired;
    }

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

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

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

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

        address[] memory path = new address[](2);
        path[0] = router.WETH();
        path[1] = address(SHIBA);

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

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

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

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

        if(shareholderCount == 0) { return; }

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

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

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

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

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

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

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


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

    function getSelllessSwap() external view returns (address) {
        return selllessSwap;
    }

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

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

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

        return shareholderTotalDividends.sub(shareholderTotalExcluded);
    }

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

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

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

abstract contract Ownable {
    address private _owner;

    event OwnershipRenounced(address indexed previousOwner);

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

    constructor() {
        _owner = msg.sender;
    }

    function owner() external view returns (address) {
        return _owner;
    }

    modifier onlyOwner() {
        require(isOwner());
        _;
    }

    function isOwner() public view returns (bool) {
        return msg.sender == _owner;
    }

    function renounceOwnership() external onlyOwner {
        emit OwnershipRenounced(_owner);
        _owner = address(0);
    }

    function transferOwnership(address newOwner) external onlyOwner {
        _transferOwnership(newOwner);
    }

    function _transferOwnership(address newOwner) internal {
        require(newOwner != address(0));
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

abstract contract ERC20Detailed is IERC20 {
    string private _name;
    string private _symbol;
    uint8 private _decimals;

    constructor(
        string memory name_,
        string memory symbol_,
        uint8 decimals_
    ) {
        _name = name_;
        _symbol = symbol_;
        _decimals = decimals_;
    }

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

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

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

contract ShibaWarp is ERC20Detailed, Ownable {

    using SafeMath for uint256;
    using SafeMathInt for int256;

    IUniswapV2Pair public pairContract;
    mapping(address => bool) _isFeeExempt;    

    IUniswapV2Router02 public immutable router;

    IERC20 constant SHIBA = IERC20(0x95aD61b0a150d79219dCF64E1E6Cc01f0B64C4cE);
    IERC20 public NFT = IERC20(0x0000000000000000000000000000000000000000);


    uint256 public constant DECIMALS = 18;

    uint256 public utilityBuyFee = 0;
    uint256 public utilitySellFee = 10;
    uint256 public rewardDividendBuyFee = 10;
    uint256 public rewardDividendSellFee = 20;
    uint256 public shibaBurnBuyFee = 10;
    uint256 public shibaBurnSellFee = 20;
    uint256 public buybackBuyFee = 10;
    uint256 public buybackSellFee = 20;
    uint256 public totalBuyFee = utilityBuyFee.add(rewardDividendBuyFee).add(shibaBurnBuyFee).add(buybackBuyFee);
    uint256 public totalSellFee = utilitySellFee.add(rewardDividendSellFee).add(shibaBurnSellFee.add(buybackSellFee));
    uint256 public constant feeDenominator = 1000;
    uint256 public _swapEnabledTime;
    uint256 public _totalSupply = 375000000 * 10**DECIMALS;
    uint256 public maxWallet;

    //addresses
    address constant DEAD = 0xdEAD000000000000000042069420694206942069;
    address constant ZERO = 0x0000000000000000000000000000000000000000;
    address payable public utilityReceiver;
    address payable public buybackReceiver;
    address public selllessSwap;

    DividendDistributor  distributor;
    address payable public  DividendReceiver;
    uint256 distributorGas = 500000;
    uint256 public minSharesRequired = 100;

    address public  pair;
    bool inSwap = false;
    modifier swapping() {
        inSwap = true;
        _;
        inSwap = false;
    }

    bool public _swapEnabled = false;

    //mapping
    mapping(address => bool) public isDividendExempt;
    mapping(address => mapping(address => uint256)) private _allowances;
    mapping(address => uint256) private _tOwned;




    //events
    event FeesChanged(uint256 buybackBuyFee, uint256 SHIBADividendFee, uint256 SHIBABurnBuyFee,  uint256 utilityBuyFee);
    event SellFeesChanged(uint256 buybackSellFee, uint256 SHIBADividendFee, uint256 SHIBABurnSellFee, uint256 utilitySellFee);
    event minShresRequiredChanged(uint256 minSharesRequired);
    event SwapEnabled(bool swapEnabled);
    event FeeReceiversChanged(address utilityReceiver, address buybackReceiver);

    constructor() ERC20Detailed("ShibaWarp", "SBWP", uint8(DECIMALS)) Ownable() {

        //mainnet
        router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D); 
        pair = IUniswapV2Factory(router.factory()).createPair(
            router.WETH(),
            address(this)
        );

        address shibaPair = IUniswapV2Factory(router.factory()).getPair(router.WETH(), address(SHIBA));
        require(shibaPair != address(0), "Uniswap pair does not exist!");

        
        buybackReceiver = payable(0x15E7C78756566f08F06F5639c0FBB5ED2FE588cB);  
        utilityReceiver = payable(0x15E7C78756566f08F06F5639c0FBB5ED2FE588cB);   
 
     
        pairContract = IUniswapV2Pair(pair);

        distributor = new DividendDistributor(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
        DividendReceiver = payable(address(distributor));
        

        //dividend exempt accounts
        isDividendExempt[msg.sender] = true;
        isDividendExempt[pair] = true;
        isDividendExempt[address(this)] = true;
        isDividendExempt[DEAD] = true;
        isDividendExempt[ZERO] = true;
        isDividendExempt[utilityReceiver] = true;
        isDividendExempt[buybackReceiver] = true;

        _swapEnabledTime = block.timestamp;
        maxWallet = (2 * _totalSupply) / 100;

        //fee exempt accounts
        _isFeeExempt[utilityReceiver] = true;
        _isFeeExempt[buybackReceiver] = true;
        _isFeeExempt[address(this)] = true;
        _isFeeExempt[msg.sender] = true;

        emit Transfer(address(0x0), msg.sender, _totalSupply);
        _tOwned[msg.sender] = _totalSupply;
    }


    function transfer(address to, uint256 value)
        external
        override
        returns (bool)
    {
        _transferFrom(msg.sender, to, value);
        return true;
    }    

    function transferFrom(
        address from,
        address to,
        uint256 value
    ) external override returns (bool) {
        
        if (_allowances[from][msg.sender] != type(uint128).max) {
            _allowances[from][msg.sender] = _allowances[from][
                msg.sender
            ].sub(value, "Insufficient Allowance");
        }
        _transferFrom(from, to, value);
        return true;
    }

    function _basicTransfer(
        address from,
        address to,
        uint256 amount
    ) internal returns (bool) {
        _tOwned[from] = _tOwned[from].sub(amount);
        _tOwned[to] = _tOwned[to].add(amount);
        return true;
    }

    function _transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) internal returns (bool) {
        if(recipient != pair){
            if(!_isFeeExempt[recipient]){
                require(_tOwned[recipient] + amount <= maxWallet, "transaction would exceed max wallet size");
            }
        }

        if(!_swapEnabled){
            require(_isFeeExempt[sender] || _isFeeExempt[recipient], "trading is not enabled yet");
        }

        if (inSwap) {
            return _basicTransfer(sender, recipient, amount);
        }

        if (shouldSwapBack()) {
            swapBack();
        }

        _tOwned[sender] = _tOwned[sender].sub(amount);
        uint256 amountReceived = shouldTakeFee(sender, recipient)
            ? takeFee(sender, recipient, amount)
            : amount;
        _tOwned[recipient] = _tOwned[recipient].add(
            amountReceived
        );

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

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

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

    function takeFee(
        address sender,
        address recipient,
        uint256 amount
    ) internal  returns (uint256) {
        uint256 _totalFee = totalBuyFee;

        if (recipient == pair) {
            _totalFee = totalSellFee;
        }

        // Check if the sender has the NFT balance
        if (getNFTBalance(recipient) == true){

            // If the sender has the NFT, reduce the buy fee by 1%
            if (sender == pair) {
                if(_totalFee > 0){
                _totalFee = _totalFee.sub(10);
                }
            }
        }

        uint256 feeAmount = amount.mul(_totalFee).div(feeDenominator);
        if(_isFeeExempt[sender] || _isFeeExempt[recipient]){
            feeAmount = 0;
        }
       
        _tOwned[address(this)] = _tOwned[address(this)].add(feeAmount);
        
        if(feeAmount > 0){
            emit Transfer(sender, address(this), feeAmount);
        }
        return amount.sub(feeAmount);
    }

    function swapBack() internal swapping {

        uint256 totalFee = totalSellFee.add(totalBuyFee);

        if(totalFee == 0) {
            totalFee = 1;
        }

        uint256 amountToSwap = _tOwned[address(this)];

        if( amountToSwap == 0) {
            return;
        }

        _allowances[address(this)][address(router)] = amountToSwap;

        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = router.WETH();
        
        bool swapTokensForETHSuccess = false;
        try router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            amountToSwap,
            0,
            path,
            address(this),
            block.timestamp
        ) {
            swapTokensForETHSuccess = true;
        } catch {}

        uint256 totalReceived = address(this).balance;

        uint256 totalRewardFee = (rewardDividendBuyFee.add(rewardDividendSellFee));

        uint256 totalShibaBurnFee = shibaBurnBuyFee.add(shibaBurnSellFee);

        uint256 totalBuybackFee = buybackBuyFee.add(buybackSellFee);

        uint256 portionToDistributor = totalReceived.mul(totalRewardFee).div(totalFee);

        uint256 portionToBuyback = totalReceived.mul(totalBuybackFee).div(totalFee);

        uint256 portionToShibaBurn = totalReceived.mul(totalShibaBurnFee).div(totalFee);

        uint256 portionToUtility = totalReceived.sub(portionToBuyback).sub(portionToDistributor).sub(portionToShibaBurn);

        address[] memory shibaPath = new address[](2);
        shibaPath[0] = router.WETH();
        shibaPath[1] = address(SHIBA);

        bool swapETHForTokensSuccess = false;
        try router.swapExactETHForTokensSupportingFeeOnTransferTokens{value: portionToShibaBurn}(
            0,
            shibaPath,
            DEAD,
            block.timestamp
        ) {
            swapETHForTokensSuccess = true;
        } catch {}
        
        // Try to deposit into distributor
        bool distributorDepositSuccess = false;
        try distributor.deposit{value: portionToDistributor}() {
            distributorDepositSuccess = true;
        } catch {}

        (bool success, ) = utilityReceiver.call{value: portionToUtility}("");
        require(success, "Utility transfer failed");

        (bool buybacksuccess, ) = buybackReceiver.call{value: portionToBuyback}("");
        require(buybacksuccess, "buyback transfer failed");
        
    }

    function shouldTakeFee(address from, address to)
        internal
        view
        returns (bool)
    {
        return 
            (pair == from || pair == to) &&
            (!_isFeeExempt[from] || !_isFeeExempt[to]);
    }

    function shouldSwapBack() internal view returns (bool) {
        return 
            !inSwap &&
            msg.sender != pair  ; 
    }

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

    function decreaseAllowance(address spender, uint256 subtractedValue)
        external
        returns (bool)
    {
        uint256 oldValue = _allowances[msg.sender][spender];
        if (subtractedValue >= oldValue) {
            _allowances[msg.sender][spender] = 0;
        } else {
            _allowances[msg.sender][spender] = oldValue.sub(
                subtractedValue
            );
        }
        emit Approval(
            msg.sender,
            spender,
            _allowances[msg.sender][spender]
        );
        return true;
    }

    function increaseAllowance(address spender, uint256 addedValue)
        external
        returns (bool)
    {
        _allowances[msg.sender][spender] = _allowances[msg.sender][
            spender
        ].add(addedValue);
        emit Approval(
            msg.sender,
            spender,
            _allowances[msg.sender][spender]
        );
        return true;
    }

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

    function burn(uint256 amount) external {
        _burn(msg.sender, amount);
    }

    function _burn(address account, uint256 amount) internal {
        require(amount != 0);
        require(amount <= _tOwned[account]);
        _totalSupply = _totalSupply.sub(amount);
        _tOwned[account] = _tOwned[account].sub(amount);
        emit Transfer(account, address(0), amount);
    }

    function setEnableSwap() external onlyOwner {
        _swapEnabled = true;
        _swapEnabledTime = block.timestamp;
        
        emit SwapEnabled(_swapEnabled);

    }

    function setIsDividendExempt(address holder, bool exempt) external onlyOwner {
        require(holder != address(this) && holder != pair);
        isDividendExempt[holder] = exempt;

        if (exempt) {
            distributor.setShare(holder, 0);
        } else {
            distributor.setShare(holder, balanceOf(holder));
        }
    }

    function setSelllessSwapAddress(address _selllessSwap) external onlyOwner {
        distributor.setSelllessSwapAddress(_selllessSwap);

        selllessSwap == _selllessSwap;

        _isFeeExempt[_selllessSwap] = true;
    }

    function setMaxWallet(uint256 _maxWallet) external onlyOwner{
        require(_maxWallet >= 1, "Max wallet must be greater than 0.01% of Total Supply");
        maxWallet = (_maxWallet * _totalSupply) / 10000;
    }

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

    function setDistributorSettings(uint256 gas) external onlyOwner {
        require(gas < 750000, "Gas must be lower than 750000");
        distributorGas = gas;
    }

    function setMinimumSharesRequired(uint256 _minSharesRequired) external onlyOwner {
        minSharesRequired = _minSharesRequired;

        emit minShresRequiredChanged(_minSharesRequired);
    }


    function setBuyFees(uint256 _buybackFee, uint256 _shibaDividendFee, uint256 _shibaBurnBuyFee, uint256 _utilityFee) external onlyOwner {
        buybackBuyFee = _buybackFee;
        rewardDividendBuyFee = _shibaDividendFee;
        shibaBurnBuyFee = _shibaBurnBuyFee;
        
        utilityBuyFee = _utilityFee;

        totalBuyFee = buybackBuyFee.add(rewardDividendBuyFee).add(shibaBurnBuyFee);
        require(totalBuyFee <= 250, "Must keep fees at 25% or less");

        emit FeesChanged(_buybackFee, _shibaDividendFee, _shibaBurnBuyFee, _utilityFee);
    }

    function setSellFees(uint256 _buybackFee, uint256 _shibaDividendFee, uint256 _shibaBurnSellFee, uint256 _utilityFee) external onlyOwner {
        buybackSellFee = _buybackFee;
        rewardDividendSellFee = _shibaDividendFee;
        shibaBurnSellFee = _shibaBurnSellFee;
        utilitySellFee = _utilityFee;

        totalSellFee = buybackSellFee.add(rewardDividendSellFee).add(shibaBurnSellFee).add(utilitySellFee);
        require(totalSellFee <= 250, "Must keep fees at 25% or less");

        emit SellFeesChanged(_buybackFee, _shibaDividendFee, _shibaBurnSellFee, _utilityFee);
    }

    function setFeeReceivers(
        address _utilityReceiver,
        address _buybackReceiver
    ) external onlyOwner {
        utilityReceiver = payable(_utilityReceiver);
        buybackReceiver = payable(_buybackReceiver);

        emit FeeReceiversChanged( _utilityReceiver, _buybackReceiver);      
    }

    function setWhitelist(address _addr) external onlyOwner {
        _isFeeExempt[_addr] = true;
    }

    function setLP(address _address) external onlyOwner {
        pairContract = IUniswapV2Pair(_address);
    }

    function setNFTContract(address _NFT) external onlyOwner {
        uint256 codeSize;
        assembly {
            codeSize := extcodesize(_NFT)
        }

        // Ensure _NFT is a contract
        require(codeSize > 0, "Given address is not a contract");

        NFT = IERC20(_NFT);
    }
    
    //getters
    function totalSupply() external view override returns (uint256) {
        return _totalSupply;
    }
   
    function balanceOf(address account) public view override returns (uint256) {
        return _tOwned[account];
    }

    function checkFeeExempt(address _addr) external view returns (bool) {
        return _isFeeExempt[_addr];
    }

    function isNotInSwap() external view returns (bool) {
        return !inSwap;
    }

    function getNFTBalance(address account) public view returns (bool) {
        if (address(NFT) == address(0)) {
            return false;  // return false if NFT address hasn't been set
        }

        (bool success, bytes memory data) = address(NFT).staticcall(abi.encodeWithSignature("balanceOf(address)", account));
    
        if (!success) {
            return false;  // Handle failed calls by returning false
        }

        uint256 balance = abi.decode(data, (uint256));
        if (balance >= 1) {
            return true;
        }       

        return false;
    }

    //utility extrasa

    //get sstuck tokens ftom contract
    function rescueToken(address tokenAddress, address to) external onlyOwner returns (bool success) {
        uint256 _contractBalance = IERC20(tokenAddress).balanceOf(address(this));

      
        return IERC20(tokenAddress).transfer(to, _contractBalance);
    }

    //gets stuck bnb from contract
    function rescueBNB(uint256 amount) external onlyOwner{
    payable(msg.sender).transfer(amount);
    }

    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":"address","name":"utilityReceiver","type":"address"},{"indexed":false,"internalType":"address","name":"buybackReceiver","type":"address"}],"name":"FeeReceiversChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"buybackBuyFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"SHIBADividendFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"SHIBABurnBuyFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"utilityBuyFee","type":"uint256"}],"name":"FeesChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"}],"name":"OwnershipRenounced","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":"buybackSellFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"SHIBADividendFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"SHIBABurnSellFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"utilitySellFee","type":"uint256"}],"name":"SellFeesChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"swapEnabled","type":"bool"}],"name":"SwapEnabled","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"minSharesRequired","type":"uint256"}],"name":"minShresRequiredChanged","type":"event"},{"inputs":[],"name":"DECIMALS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DividendReceiver","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NFT","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_swapEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_swapEnabledTime","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":"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":"value","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":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"buybackBuyFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buybackReceiver","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buybackSellFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"checkFeeExempt","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":[],"name":"feeDenominator","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getNFTBalance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isDividendExempt","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isNotInSwap","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minSharesRequired","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":"pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pairContract","outputs":[{"internalType":"contract IUniswapV2Pair","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"rescueBNB","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"address","name":"to","type":"address"}],"name":"rescueToken","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardDividendBuyFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardDividendSellFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"selllessSwap","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_buybackFee","type":"uint256"},{"internalType":"uint256","name":"_shibaDividendFee","type":"uint256"},{"internalType":"uint256","name":"_shibaBurnBuyFee","type":"uint256"},{"internalType":"uint256","name":"_utilityFee","type":"uint256"}],"name":"setBuyFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minPeriod","type":"uint256"},{"internalType":"uint256","name":"_minDistribution","type":"uint256"}],"name":"setDistributionCriteria","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"gas","type":"uint256"}],"name":"setDistributorSettings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setEnableSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_utilityReceiver","type":"address"},{"internalType":"address","name":"_buybackReceiver","type":"address"}],"name":"setFeeReceivers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"},{"internalType":"bool","name":"exempt","type":"bool"}],"name":"setIsDividendExempt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"setLP","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxWallet","type":"uint256"}],"name":"setMaxWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minSharesRequired","type":"uint256"}],"name":"setMinimumSharesRequired","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_NFT","type":"address"}],"name":"setNFTContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_buybackFee","type":"uint256"},{"internalType":"uint256","name":"_shibaDividendFee","type":"uint256"},{"internalType":"uint256","name":"_shibaBurnSellFee","type":"uint256"},{"internalType":"uint256","name":"_utilityFee","type":"uint256"}],"name":"setSellFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_selllessSwap","type":"address"}],"name":"setSelllessSwapAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"setWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"shibaBurnBuyFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"shibaBurnSellFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalBuyFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSellFee","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":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"utilityBuyFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"utilityReceiver","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"utilitySellFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

60a06040526000600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600655600a600755600a6008556014600955600a80556014600b55600a600c556014600d55620000c1600c54620000ad600a546200009960085460065462000dc860201b620028541790919060201c565b62000dc860201b620028541790919060201c565b62000dc860201b620028541790919060201c565b600e5562000118620000e6600d54600b5462000dc860201b620028541790919060201c565b6200010460095460075462000dc860201b620028541790919060201c565b62000dc860201b620028541790919060201c565b600f556012600a6200012b919062000fc6565b63165a0bc06200013c919062001017565b6011556207a12060185560646019556000601a60146101000a81548160ff0219169083151502179055506000601a60156101000a81548160ff0219169083151502179055503480156200018e57600080fd5b506040518060400160405280600981526020017f53686962615761727000000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f5342575000000000000000000000000000000000000000000000000000000000815250601282600090816200020e9190620012d2565b508160019081620002209190620012d2565b5080600260006101000a81548160ff021916908360ff16021790555050505033600260016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550737a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff168152505060805173ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000316573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200033c919062001423565b73ffffffffffffffffffffffffffffffffffffffff1663c9c6539660805173ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015620003a5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003cb919062001423565b306040518363ffffffff1660e01b8152600401620003eb92919062001466565b6020604051808303816000875af11580156200040b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000431919062001423565b601a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600060805173ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015620004c1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620004e7919062001423565b73ffffffffffffffffffffffffffffffffffffffff1663e6a4390560805173ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000550573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000576919062001423565b7395ad61b0a150d79219dcf64e1e6cc01f0b64c4ce6040518363ffffffff1660e01b8152600401620005aa92919062001466565b602060405180830381865afa158015620005c8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620005ee919062001423565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160362000662576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200065990620014f4565b60405180910390fd5b7315e7c78756566f08f06f5639c0fbb5ed2fe588cb601460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507315e7c78756566f08f06f5639c0fbb5ed2fe588cb601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550737a250d5630b4cf539739df2c5dacb4c659f2488d604051620007929062000e2b565b6200079e919062001516565b604051809103906000f080158015620007bb573d6000803e3d6000fd5b50601660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16601760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001601b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601b6000601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601b60003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601b600073dead00000000000000004206942069420694206973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601b60008073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601b6000601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601b6000601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550426010819055506064601154600262000b5b919062001017565b62000b67919062001562565b601281905550600160046000601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160046000601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600460003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60115460405162000d739190620015ab565b60405180910390a3601154601d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505062001675565b600080828462000dd99190620015c8565b90508381101562000e21576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000e189062001653565b60405180910390fd5b8091505092915050565b6122a4806200692983390190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008160011c9050919050565b6000808291508390505b600185111562000ec75780860481111562000e9f5762000e9e62000e39565b5b600185161562000eaf5780820291505b808102905062000ebf8562000e68565b945062000e7f565b94509492505050565b60008262000ee2576001905062000fb5565b8162000ef2576000905062000fb5565b816001811462000f0b576002811462000f165762000f4c565b600191505062000fb5565b60ff84111562000f2b5762000f2a62000e39565b5b8360020a91508482111562000f455762000f4462000e39565b5b5062000fb5565b5060208310610133831016604e8410600b841016171562000f865782820a90508381111562000f805762000f7f62000e39565b5b62000fb5565b62000f95848484600162000e75565b9250905081840481111562000faf5762000fae62000e39565b5b81810290505b9392505050565b6000819050919050565b600062000fd38262000fbc565b915062000fe08362000fbc565b92506200100f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848462000ed0565b905092915050565b6000620010248262000fbc565b9150620010318362000fbc565b9250828202620010418162000fbc565b915082820484148315176200105b576200105a62000e39565b5b5092915050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620010e457607f821691505b602082108103620010fa57620010f96200109c565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620011647fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262001125565b62001170868362001125565b95508019841693508086168417925050509392505050565b6000819050919050565b6000620011b3620011ad620011a78462000fbc565b62001188565b62000fbc565b9050919050565b6000819050919050565b620011cf8362001192565b620011e7620011de82620011ba565b84845462001132565b825550505050565b600090565b620011fe620011ef565b6200120b818484620011c4565b505050565b5b81811015620012335762001227600082620011f4565b60018101905062001211565b5050565b601f82111562001282576200124c8162001100565b620012578462001115565b8101602085101562001267578190505b6200127f620012768562001115565b83018262001210565b50505b505050565b600082821c905092915050565b6000620012a76000198460080262001287565b1980831691505092915050565b6000620012c2838362001294565b9150826002028217905092915050565b620012dd8262001062565b67ffffffffffffffff811115620012f957620012f86200106d565b5b620013058254620010cb565b6200131282828562001237565b600060209050601f8311600181146200134a576000841562001335578287015190505b620013418582620012b4565b865550620013b1565b601f1984166200135a8662001100565b60005b8281101562001384578489015182556001820191506020850194506020810190506200135d565b86831015620013a45784890151620013a0601f89168262001294565b8355505b6001600288020188555050505b505050505050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620013eb82620013be565b9050919050565b620013fd81620013de565b81146200140957600080fd5b50565b6000815190506200141d81620013f2565b92915050565b6000602082840312156200143c576200143b620013b9565b5b60006200144c848285016200140c565b91505092915050565b6200146081620013de565b82525050565b60006040820190506200147d600083018562001455565b6200148c602083018462001455565b9392505050565b600082825260208201905092915050565b7f556e6973776170207061697220646f6573206e6f742065786973742100000000600082015250565b6000620014dc601c8362001493565b9150620014e982620014a4565b602082019050919050565b600060208201905081810360008301526200150f81620014cd565b9050919050565b60006020820190506200152d600083018462001455565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006200156f8262000fbc565b91506200157c8362000fbc565b9250826200158f576200158e62001533565b5b828204905092915050565b620015a58162000fbc565b82525050565b6000602082019050620015c260008301846200159a565b92915050565b6000620015d58262000fbc565b9150620015e28362000fbc565b9250828201905080821115620015fd57620015fc62000e39565b5b92915050565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000600082015250565b60006200163b601b8362001493565b9150620016488262001603565b602082019050919050565b600060208201905081810360008301526200166e816200162c565b9050919050565b608051615275620016b46000396000818161282c015281816134c9015281816135c5015281816136a40152818161389501526139d701526152756000f3fe60806040526004361061039b5760003560e01c806383b4ac68116101dc578063aefde9f211610102578063dd62ed3e116100a0578063f51d72e91161006f578063f51d72e914610d91578063f708a64f14610dbc578063f887ea4014610de5578063f8b45b0514610e10576103a2565b8063dd62ed3e14610cd5578063ecc0d7bf14610d12578063edfb997e14610d3d578063f2fde38b14610d68576103a2565b8063cb39c7f0116100dc578063cb39c7f014610c17578063cdadc8c714610c42578063ce25a73814610c6d578063d439979014610c98576103a2565b8063aefde9f214610b84578063b2b250ec14610baf578063bf8ebd8514610bda576103a2565b80639d9241ec1161017a578063a8aa1b3111610149578063a8aa1b3114610ada578063a9059cbb14610b05578063ac3a5ee314610b42578063acb7f0f114610b6d576103a2565b80639d9241ec14610a20578063a457c2d714610a4b578063a4b45c0014610a88578063a7ccabdf14610ab1576103a2565b80638da5cb5b116101b65780638da5cb5b146109765780638f32d59b146109a157806395d89b41146109cc5780639d1944f5146109f7576103a2565b806383b4ac68146108f957806384ec884f14610924578063854cff2f1461094d576103a2565b80633eaaf86b116102c15780635821d4a01161025f5780636c5b28551161022e5780636c5b28551461085157806370a082311461087a578063715018a6146108b75780637c0b8de2146108ce576103a2565b80635821d4a0146107a757806359b107b9146107d25780635d0044ca146107fd5780636630d47114610826576103a2565b8063441b1d301161029b578063441b1d30146106eb5780634707d000146107145780634a7e73d3146107515780634d709adf1461077c576103a2565b80633eaaf86b1461065a57806342966c68146106855780634355855a146106ae576103a2565b806318160ddd116103395780632e0f2625116103085780632e0f26251461059e5780632f34d282146105c9578063313ce567146105f2578063395093511461061d576103a2565b806318160ddd146104e25780631df59e2f1461050d57806323b872dd146105385780632d48e89614610575576103a2565b8063095ea7b311610375578063095ea7b31461042657806309afb3ce14610463578063178d9b8e1461048e578063180b0d7e146104b7576103a2565b80630345e353146103a757806306fdde03146103d25780630710fb45146103fd576103a2565b366103a257005b600080fd5b3480156103b357600080fd5b506103bc610e3b565b6040516103c99190614256565b60405180910390f35b3480156103de57600080fd5b506103e7610e41565b6040516103f49190614301565b60405180910390f35b34801561040957600080fd5b50610424600480360381019061041f9190614386565b610ed3565b005b34801561043257600080fd5b5061044d600480360381019061044891906143df565b610ff2565b60405161045a919061443a565b60405180910390f35b34801561046f57600080fd5b506104786110e4565b604051610485919061443a565b60405180910390f35b34801561049a57600080fd5b506104b560048036038101906104b09190614455565b6110f7565b005b3480156104c357600080fd5b506104cc6111de565b6040516104d99190614256565b60405180910390f35b3480156104ee57600080fd5b506104f76111e4565b6040516105049190614256565b60405180910390f35b34801561051957600080fd5b506105226111ee565b60405161052f91906144dd565b60405180910390f35b34801561054457600080fd5b5061055f600480360381019061055a91906144f8565b611214565b60405161056c919061443a565b60405180910390f35b34801561058157600080fd5b5061059c6004803603810190610597919061454b565b611409565b005b3480156105aa57600080fd5b506105b36114ad565b6040516105c09190614256565b60405180910390f35b3480156105d557600080fd5b506105f060048036038101906105eb9190614386565b6114b2565b005b3480156105fe57600080fd5b50610607611507565b60405161061491906145a7565b60405180910390f35b34801561062957600080fd5b50610644600480360381019061063f91906143df565b61151e565b604051610651919061443a565b60405180910390f35b34801561066657600080fd5b5061066f61171a565b60405161067c9190614256565b60405180910390f35b34801561069157600080fd5b506106ac60048036038101906106a791906145c2565b611720565b005b3480156106ba57600080fd5b506106d560048036038101906106d09190614386565b61172d565b6040516106e2919061443a565b60405180910390f35b3480156106f757600080fd5b50610712600480360381019061070d91906145c2565b61174d565b005b34801561072057600080fd5b5061073b600480360381019061073691906145ef565b6117a8565b604051610748919061443a565b60405180910390f35b34801561075d57600080fd5b506107666118c0565b6040516107739190614256565b60405180910390f35b34801561078857600080fd5b506107916118c6565b60405161079e919061468e565b60405180910390f35b3480156107b357600080fd5b506107bc6118ec565b6040516107c99190614256565b60405180910390f35b3480156107de57600080fd5b506107e76118f2565b6040516107f49190614256565b60405180910390f35b34801561080957600080fd5b50610824600480360381019061081f91906145c2565b6118f8565b005b34801561083257600080fd5b5061083b611971565b6040516108489190614256565b60405180910390f35b34801561085d57600080fd5b5061087860048036038101906108739190614455565b611977565b005b34801561088657600080fd5b506108a1600480360381019061089c9190614386565b611a72565b6040516108ae9190614256565b60405180910390f35b3480156108c357600080fd5b506108cc611abb565b005b3480156108da57600080fd5b506108e3611b75565b6040516108f091906146ca565b60405180910390f35b34801561090557600080fd5b5061090e611b9b565b60405161091b919061443a565b60405180910390f35b34801561093057600080fd5b5061094b600480360381019061094691906145c2565b611bb3565b005b34801561095957600080fd5b50610974600480360381019061096f9190614386565b611c05565b005b34801561098257600080fd5b5061098b611c71565b60405161099891906146f4565b60405180910390f35b3480156109ad57600080fd5b506109b6611c9b565b6040516109c3919061443a565b60405180910390f35b3480156109d857600080fd5b506109e1611cf3565b6040516109ee9190614301565b60405180910390f35b348015610a0357600080fd5b50610a1e6004803603810190610a1991906145c2565b611d85565b005b348015610a2c57600080fd5b50610a35611de5565b604051610a429190614256565b60405180910390f35b348015610a5757600080fd5b50610a726004803603810190610a6d91906143df565b611deb565b604051610a7f919061443a565b60405180910390f35b348015610a9457600080fd5b50610aaf6004803603810190610aaa91906145ef565b61207b565b005b348015610abd57600080fd5b50610ad86004803603810190610ad39190614386565b61214b565b005b348015610ae657600080fd5b50610aef6121ea565b604051610afc91906146f4565b60405180910390f35b348015610b1157600080fd5b50610b2c6004803603810190610b2791906143df565b612210565b604051610b39919061443a565b60405180910390f35b348015610b4e57600080fd5b50610b57612228565b604051610b649190614256565b60405180910390f35b348015610b7957600080fd5b50610b8261222e565b005b348015610b9057600080fd5b50610b996122a9565b604051610ba69190614256565b60405180910390f35b348015610bbb57600080fd5b50610bc46122af565b604051610bd19190614256565b60405180910390f35b348015610be657600080fd5b50610c016004803603810190610bfc9190614386565b6122b5565b604051610c0e919061443a565b60405180910390f35b348015610c2357600080fd5b50610c2c61247a565b604051610c399190614256565b60405180910390f35b348015610c4e57600080fd5b50610c57612480565b604051610c6491906146f4565b60405180910390f35b348015610c7957600080fd5b50610c826124a6565b604051610c8f91906144dd565b60405180910390f35b348015610ca457600080fd5b50610cbf6004803603810190610cba9190614386565b6124cc565b604051610ccc919061443a565b60405180910390f35b348015610ce157600080fd5b50610cfc6004803603810190610cf791906145ef565b612522565b604051610d099190614256565b60405180910390f35b348015610d1e57600080fd5b50610d276125a9565b604051610d349190614256565b60405180910390f35b348015610d4957600080fd5b50610d526125af565b604051610d5f9190614256565b60405180910390f35b348015610d7457600080fd5b50610d8f6004803603810190610d8a9190614386565b6125b5565b005b348015610d9d57600080fd5b50610da66125d2565b604051610db391906144dd565b60405180910390f35b348015610dc857600080fd5b50610de36004803603810190610dde919061473b565b6125f8565b005b348015610df157600080fd5b50610dfa61282a565b604051610e07919061479c565b60405180910390f35b348015610e1c57600080fd5b50610e2561284e565b604051610e329190614256565b60405180910390f35b60105481565b606060008054610e50906147e6565b80601f0160208091040260200160405190810160405280929190818152602001828054610e7c906147e6565b8015610ec95780601f10610e9e57610100808354040283529160200191610ec9565b820191906000526020600020905b815481529060010190602001808311610eac57829003601f168201915b5050505050905090565b610edb611c9b565b610ee457600080fd5b601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630710fb45826040518263ffffffff1660e01b8152600401610f3f91906146f4565b600060405180830381600087803b158015610f5957600080fd5b505af1158015610f6d573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff16601560009054906101000a905050506001600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600081601c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516110d29190614256565b60405180910390a36001905092915050565b601a60159054906101000a900460ff1681565b6110ff611c9b565b61110857600080fd5b83600c819055508260088190555081600a819055508060068190555061114f600a54611141600854600c5461285490919063ffffffff16565b61285490919063ffffffff16565b600e8190555060fa600e54111561119b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119290614863565b60405180910390fd5b7f7027e29faa2460f22e800d92db38d4795b668c7104da6b87afaeaf502a269ca5848484846040516111d09493929190614883565b60405180910390a150505050565b6103e881565b6000601154905090565b601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006fffffffffffffffffffffffffffffffff8016601c60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054146113f257611371826040518060400160405280601681526020017f496e73756666696369656e7420416c6c6f77616e636500000000000000000000815250601c60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546128b29092919063ffffffff16565b601c60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b6113fd848484612916565b50600190509392505050565b611411611c9b565b61141a57600080fd5b601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632d48e89683836040518363ffffffff1660e01b81526004016114779291906148c8565b600060405180830381600087803b15801561149157600080fd5b505af11580156114a5573d6000803e3d6000fd5b505050505050565b601281565b6114ba611c9b565b6114c357600080fd5b80600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600260009054906101000a900460ff16905090565b60006115af82601c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461285490919063ffffffff16565b601c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925601c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040516117089190614256565b60405180910390a36001905092915050565b60115481565b61172a3382612f90565b50565b601b6020528060005260406000206000915054906101000a900460ff1681565b611755611c9b565b61175e57600080fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156117a4573d6000803e3d6000fd5b5050565b60006117b2611c9b565b6117bb57600080fd5b60008373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016117f691906146f4565b602060405180830381865afa158015611813573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118379190614906565b90508373ffffffffffffffffffffffffffffffffffffffff1663a9059cbb84836040518363ffffffff1660e01b8152600401611874929190614933565b6020604051808303816000875af1158015611893573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118b79190614971565b91505092915050565b60075481565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60065481565b600e5481565b611900611c9b565b61190957600080fd5b600181101561194d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194490614a10565b60405180910390fd5b6127106011548261195e9190614a5f565b6119689190614ad0565b60128190555050565b600d5481565b61197f611c9b565b61198857600080fd5b83600d819055508260098190555081600b81905550806007819055506119e36007546119d5600b546119c7600954600d5461285490919063ffffffff16565b61285490919063ffffffff16565b61285490919063ffffffff16565b600f8190555060fa600f541115611a2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2690614863565b60405180910390fd5b7f5323944abff53387ebe7bd518eb0a3b0b79d3534d234a96e9877a33b6442eb1c84848484604051611a649493929190614883565b60405180910390a150505050565b6000601d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611ac3611c9b565b611acc57600080fd5b600260019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482060405160405180910390a26000600260016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000601a60149054906101000a900460ff1615905090565b611bbb611c9b565b611bc457600080fd5b806019819055507f724662b0107aa55ae3d489082ef31ea9f1ca77f7300160c5355db1b279dc387f81604051611bfa9190614256565b60405180910390a150565b611c0d611c9b565b611c1657600080fd5b6001600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6000600260019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600260019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614905090565b606060018054611d02906147e6565b80601f0160208091040260200160405190810160405280929190818152602001828054611d2e906147e6565b8015611d7b5780601f10611d5057610100808354040283529160200191611d7b565b820191906000526020600020905b815481529060010190602001808311611d5e57829003601f168201915b5050505050905090565b611d8d611c9b565b611d9657600080fd5b620b71b08110611ddb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd290614b4d565b60405180910390fd5b8060188190555050565b600f5481565b600080601c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050808310611efb576000601c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611f8f565b611f0e838261310390919063ffffffff16565b601c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b8373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925601c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040516120689190614256565b60405180910390a3600191505092915050565b612083611c9b565b61208c57600080fd5b81601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080601460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f71aa1fc168f4b314943f7510c82f58650f0fcdf4ec4bb48f62cf4d7ad0aeed35828260405161213f929190614b6d565b60405180910390a15050565b612153611c9b565b61215c57600080fd5b6000813b9050600081116121a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161219c90614be2565b60405180910390fd5b81600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600061221d338484612916565b506001905092915050565b60095481565b612236611c9b565b61223f57600080fd5b6001601a60156101000a81548160ff021916908315150217905550426010819055507fb9bbb15e341600c8d067a0cadeba219905d5ba6d422b193c9c32265d26fc51c8601a60159054906101000a900460ff1660405161229f919061443a565b60405180910390a1565b60085481565b600c5481565b60008073ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036123155760009050612475565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168460405160240161236291906146f4565b6040516020818303038152906040527f70a08231000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516123ec9190614c49565b600060405180830381855afa9150503d8060008114612427576040519150601f19603f3d011682016040523d82523d6000602084013e61242c565b606091505b50915091508161244157600092505050612475565b6000818060200190518101906124579190614906565b90506001811061246d5760019350505050612475565b600093505050505b919050565b60195481565b601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6000601c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600a5481565b600b5481565b6125bd611c9b565b6125c657600080fd5b6125cf8161314d565b50565b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b612600611c9b565b61260957600080fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141580156126935750601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b61269c57600080fd5b80601b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550801561278e57601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166314b6ca968360006040518363ffffffff1660e01b8152600401612757929190614c9b565b600060405180830381600087803b15801561277157600080fd5b505af1158015612785573d6000803e3d6000fd5b50505050612826565b601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166314b6ca96836127d685611a72565b6040518363ffffffff1660e01b81526004016127f3929190614933565b600060405180830381600087803b15801561280d57600080fd5b505af1158015612821573d6000803e3d6000fd5b505050505b5050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60125481565b60008082846128639190614cc4565b9050838110156128a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161289f90614d44565b60405180910390fd5b8091505092915050565b60008383111582906128fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128f19190614301565b60405180910390fd5b50600083856129099190614d64565b9050809150509392505050565b6000601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612a4f57600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612a4e5760125482601d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612a0c9190614cc4565b1115612a4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a4490614e0a565b60405180910390fd5b5b5b601a60159054906101000a900460ff16612b4457600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680612b045750600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b612b43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b3a90614e76565b60405180910390fd5b5b601a60149054906101000a900460ff1615612b6b57612b64848484613246565b9050612f89565b612b7361337d565b15612b8157612b806133ef565b5b612bd382601d60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461310390919063ffffffff16565b601d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000612c228585613cd2565b612c2c5782612c38565b612c37858585613e30565b5b9050612c8c81601d60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461285490919063ffffffff16565b601d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550601b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612db257601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166314b6ca9686612d6888611a72565b6040518363ffffffff1660e01b8152600401612d85929190614933565b600060405180830381600087803b158015612d9f57600080fd5b505af1925050508015612db0575060015b505b601b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612e9557601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166314b6ca9685612e4b87611a72565b6040518363ffffffff1660e01b8152600401612e68929190614933565b600060405180830381600087803b158015612e8257600080fd5b505af1925050508015612e93575060015b505b601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ffb2c4796018546040518263ffffffff1660e01b8152600401612ef29190614256565b600060405180830381600087803b158015612f0c57600080fd5b505af1925050508015612f1d575060015b508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051612f7b9190614256565b60405180910390a360019150505b9392505050565b60008103612f9d57600080fd5b601d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054811115612fe957600080fd5b612ffe8160115461310390919063ffffffff16565b60118190555061305681601d60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461310390919063ffffffff16565b601d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516130f79190614256565b60405180910390a35050565b600061314583836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506128b2565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361318657600080fd5b8073ffffffffffffffffffffffffffffffffffffffff16600260019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600260016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600061329a82601d60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461310390919063ffffffff16565b601d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061332f82601d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461285490919063ffffffff16565b601d60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600190509392505050565b6000601a60149054906101000a900460ff161580156133ea5750601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614155b905090565b6001601a60146101000a81548160ff0219169083151502179055506000613423600e54600f5461285490919063ffffffff16565b90506000810361343257600190505b6000601d60003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008103613485575050613cb5565b80601c60003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000600267ffffffffffffffff81111561354357613542614e96565b5b6040519080825280602002602001820160405280156135715781602001602082028036833780820191505090505b509050308160008151811061358957613588614ec5565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801561362e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136529190614f09565b8160018151811061366657613665614ec5565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663791ac9478460008530426040518663ffffffff1660e01b8152600401613704959493929190614ff4565b600060405180830381600087803b15801561371e57600080fd5b505af192505050801561372f575060015b1561373957600190505b6000479050600061375760095460085461285490919063ffffffff16565b90506000613772600b54600a5461285490919063ffffffff16565b9050600061378d600d54600c5461285490919063ffffffff16565b905060006137b6896137a8868861411690919063ffffffff16565b61419090919063ffffffff16565b905060006137df8a6137d1858961411690919063ffffffff16565b61419090919063ffffffff16565b905060006138088b6137fa878a61411690919063ffffffff16565b61419090919063ffffffff16565b905060006138438261383586613827878d61310390919063ffffffff16565b61310390919063ffffffff16565b61310390919063ffffffff16565b90506000600267ffffffffffffffff81111561386257613861614e96565b5b6040519080825280602002602001820160405280156138905781602001602082028036833780820191505090505b5090507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156138fe573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139229190614f09565b8160008151811061393657613935614ec5565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507395ad61b0a150d79219dcf64e1e6cc01f0b64c4ce8160018151811061399957613998614ec5565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663b6f9de958560008573dead000000000000000042069420694206942069426040518663ffffffff1660e01b8152600401613a4a949392919061504e565b6000604051808303818588803b158015613a6357600080fd5b505af193505050508015613a75575060015b15613a7f57600190505b6000601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d0e30db0886040518263ffffffff1660e01b81526004016000604051808303818588803b158015613aeb57600080fd5b505af193505050508015613afd575060015b15613b0757600190505b6000601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1685604051613b4f906150c0565b60006040518083038185875af1925050503d8060008114613b8c576040519150601f19603f3d011682016040523d82523d6000602084013e613b91565b606091505b5050905080613bd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613bcc90615121565b60405180910390fd5b6000601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1688604051613c1d906150c0565b60006040518083038185875af1925050503d8060008114613c5a576040519150601f19603f3d011682016040523d82523d6000602084013e613c5f565b606091505b5050905080613ca3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613c9a9061518d565b60405180910390fd5b50505050505050505050505050505050505b6000601a60146101000a81548160ff021916908315150217905550565b60008273ffffffffffffffffffffffffffffffffffffffff16601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161480613d7d57508173ffffffffffffffffffffffffffffffffffffffff16601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b8015613e285750600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161580613e275750600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b5b905092915050565b600080600e549050601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603613e9357600f5490505b60011515613ea0856122b5565b151503613f1e57601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603613f1d576000811115613f1c57613f19600a8261310390919063ffffffff16565b90505b5b5b6000613f476103e8613f39848761411690919063ffffffff16565b61419090919063ffffffff16565b9050600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680613fea5750600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b15613ff457600090505b61404681601d60003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461285490919063ffffffff16565b601d60003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060008111156140f8573073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516140ef9190614256565b60405180910390a35b61410b818561310390919063ffffffff16565b925050509392505050565b6000808303614128576000905061418a565b600082846141369190614a5f565b90508284826141459190614ad0565b14614185576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161417c9061521f565b60405180910390fd5b809150505b92915050565b60006141d283836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506141da565b905092915050565b60008083118290614221576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016142189190614301565b60405180910390fd5b50600083856142309190614ad0565b9050809150509392505050565b6000819050919050565b6142508161423d565b82525050565b600060208201905061426b6000830184614247565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156142ab578082015181840152602081019050614290565b60008484015250505050565b6000601f19601f8301169050919050565b60006142d382614271565b6142dd818561427c565b93506142ed81856020860161428d565b6142f6816142b7565b840191505092915050565b6000602082019050818103600083015261431b81846142c8565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061435382614328565b9050919050565b61436381614348565b811461436e57600080fd5b50565b6000813590506143808161435a565b92915050565b60006020828403121561439c5761439b614323565b5b60006143aa84828501614371565b91505092915050565b6143bc8161423d565b81146143c757600080fd5b50565b6000813590506143d9816143b3565b92915050565b600080604083850312156143f6576143f5614323565b5b600061440485828601614371565b9250506020614415858286016143ca565b9150509250929050565b60008115159050919050565b6144348161441f565b82525050565b600060208201905061444f600083018461442b565b92915050565b6000806000806080858703121561446f5761446e614323565b5b600061447d878288016143ca565b945050602061448e878288016143ca565b935050604061449f878288016143ca565b92505060606144b0878288016143ca565b91505092959194509250565b60006144c782614328565b9050919050565b6144d7816144bc565b82525050565b60006020820190506144f260008301846144ce565b92915050565b60008060006060848603121561451157614510614323565b5b600061451f86828701614371565b935050602061453086828701614371565b9250506040614541868287016143ca565b9150509250925092565b6000806040838503121561456257614561614323565b5b6000614570858286016143ca565b9250506020614581858286016143ca565b9150509250929050565b600060ff82169050919050565b6145a18161458b565b82525050565b60006020820190506145bc6000830184614598565b92915050565b6000602082840312156145d8576145d7614323565b5b60006145e6848285016143ca565b91505092915050565b6000806040838503121561460657614605614323565b5b600061461485828601614371565b925050602061462585828601614371565b9150509250929050565b6000819050919050565b600061465461464f61464a84614328565b61462f565b614328565b9050919050565b600061466682614639565b9050919050565b60006146788261465b565b9050919050565b6146888161466d565b82525050565b60006020820190506146a3600083018461467f565b92915050565b60006146b48261465b565b9050919050565b6146c4816146a9565b82525050565b60006020820190506146df60008301846146bb565b92915050565b6146ee81614348565b82525050565b600060208201905061470960008301846146e5565b92915050565b6147188161441f565b811461472357600080fd5b50565b6000813590506147358161470f565b92915050565b6000806040838503121561475257614751614323565b5b600061476085828601614371565b925050602061477185828601614726565b9150509250929050565b60006147868261465b565b9050919050565b6147968161477b565b82525050565b60006020820190506147b1600083018461478d565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806147fe57607f821691505b602082108103614811576148106147b7565b5b50919050565b7f4d757374206b656570206665657320617420323525206f72206c657373000000600082015250565b600061484d601d8361427c565b915061485882614817565b602082019050919050565b6000602082019050818103600083015261487c81614840565b9050919050565b60006080820190506148986000830187614247565b6148a56020830186614247565b6148b26040830185614247565b6148bf6060830184614247565b95945050505050565b60006040820190506148dd6000830185614247565b6148ea6020830184614247565b9392505050565b600081519050614900816143b3565b92915050565b60006020828403121561491c5761491b614323565b5b600061492a848285016148f1565b91505092915050565b600060408201905061494860008301856146e5565b6149556020830184614247565b9392505050565b60008151905061496b8161470f565b92915050565b60006020828403121561498757614986614323565b5b60006149958482850161495c565b91505092915050565b7f4d61782077616c6c6574206d7573742062652067726561746572207468616e2060008201527f302e303125206f6620546f74616c20537570706c790000000000000000000000602082015250565b60006149fa60358361427c565b9150614a058261499e565b604082019050919050565b60006020820190508181036000830152614a29816149ed565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614a6a8261423d565b9150614a758361423d565b9250828202614a838161423d565b91508282048414831517614a9a57614a99614a30565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614adb8261423d565b9150614ae68361423d565b925082614af657614af5614aa1565b5b828204905092915050565b7f476173206d757374206265206c6f776572207468616e20373530303030000000600082015250565b6000614b37601d8361427c565b9150614b4282614b01565b602082019050919050565b60006020820190508181036000830152614b6681614b2a565b9050919050565b6000604082019050614b8260008301856146e5565b614b8f60208301846146e5565b9392505050565b7f476976656e2061646472657373206973206e6f74206120636f6e747261637400600082015250565b6000614bcc601f8361427c565b9150614bd782614b96565b602082019050919050565b60006020820190508181036000830152614bfb81614bbf565b9050919050565b600081519050919050565b600081905092915050565b6000614c2382614c02565b614c2d8185614c0d565b9350614c3d81856020860161428d565b80840191505092915050565b6000614c558284614c18565b915081905092915050565b6000819050919050565b6000614c85614c80614c7b84614c60565b61462f565b61423d565b9050919050565b614c9581614c6a565b82525050565b6000604082019050614cb060008301856146e5565b614cbd6020830184614c8c565b9392505050565b6000614ccf8261423d565b9150614cda8361423d565b9250828201905080821115614cf257614cf1614a30565b5b92915050565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000600082015250565b6000614d2e601b8361427c565b9150614d3982614cf8565b602082019050919050565b60006020820190508181036000830152614d5d81614d21565b9050919050565b6000614d6f8261423d565b9150614d7a8361423d565b9250828203905081811115614d9257614d91614a30565b5b92915050565b7f7472616e73616374696f6e20776f756c6420657863656564206d61782077616c60008201527f6c65742073697a65000000000000000000000000000000000000000000000000602082015250565b6000614df460288361427c565b9150614dff82614d98565b604082019050919050565b60006020820190508181036000830152614e2381614de7565b9050919050565b7f74726164696e67206973206e6f7420656e61626c656420796574000000000000600082015250565b6000614e60601a8361427c565b9150614e6b82614e2a565b602082019050919050565b60006020820190508181036000830152614e8f81614e53565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050614f038161435a565b92915050565b600060208284031215614f1f57614f1e614323565b5b6000614f2d84828501614ef4565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b614f6b81614348565b82525050565b6000614f7d8383614f62565b60208301905092915050565b6000602082019050919050565b6000614fa182614f36565b614fab8185614f41565b9350614fb683614f52565b8060005b83811015614fe7578151614fce8882614f71565b9750614fd983614f89565b925050600181019050614fba565b5085935050505092915050565b600060a0820190506150096000830188614247565b6150166020830187614c8c565b81810360408301526150288186614f96565b905061503760608301856146e5565b6150446080830184614247565b9695505050505050565b60006080820190506150636000830187614c8c565b81810360208301526150758186614f96565b905061508460408301856146e5565b6150916060830184614247565b95945050505050565b50565b60006150aa600083614c0d565b91506150b58261509a565b600082019050919050565b60006150cb8261509d565b9150819050919050565b7f5574696c697479207472616e73666572206661696c6564000000000000000000600082015250565b600061510b60178361427c565b9150615116826150d5565b602082019050919050565b6000602082019050818103600083015261513a816150fe565b9050919050565b7f6275796261636b207472616e73666572206661696c6564000000000000000000600082015250565b600061517760178361427c565b915061518282615141565b602082019050919050565b600060208201905081810360008301526151a68161516a565b9050919050565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008201527f7700000000000000000000000000000000000000000000000000000000000000602082015250565b600061520960218361427c565b9150615214826151ad565b604082019050919050565b60006020820190508181036000830152615238816151fc565b905091905056fea2646970667358221220c2f673dd219d07b78ebd4ee097521bd6e37445a3b667d2fc4579877ddc6088df64736f6c6343000812003360806040527395ad61b0a150d79219dcf64e1e6cc01f0b64c4ce600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610e10600d55670de0b6b3a7640000600e556064600f553480156200007d57600080fd5b50604051620022a4380380620022a48339818101604052810190620000a39190620001e6565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603620000f357737a250d5630b4cf539739df2c5dacb4c659f2488d620000f5565b805b600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505062000218565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620001ae8262000181565b9050919050565b620001c081620001a1565b8114620001cc57600080fd5b50565b600081519050620001e081620001b5565b92915050565b600060208284031215620001ff57620001fe6200017c565b5b60006200020f84828501620001cf565b91505092915050565b61207c80620002286000396000f3fe6080604052600436106101235760003560e01c8063cb39c7f0116100a0578063efca2eed11610064578063efca2eed146103b1578063f0fc6bca146103dc578063f9d20e22146103f3578063ffb2c4791461041e578063ffd49c84146104475761012a565b8063cb39c7f0146102e7578063ce7c2ac214610312578063d0e30db014610351578063e2d2e2191461035b578063ecd0c0c3146103865761012a565b80632d48e896116100e75780632d48e896146102145780633a98ef391461023d5780634fab0ae81461026857806384ec884f14610293578063997664d7146102bc5761012a565b80630710fb451461012f57806311ce023d1461015857806314b6ca961461018357806326987b60146101ac57806328fd3198146101d75761012a565b3661012a57005b600080fd5b34801561013b57600080fd5b506101566004803603810190610151919061188c565b610472565b005b34801561016457600080fd5b5061016d61050e565b60405161017a91906118d2565b60405180910390f35b34801561018f57600080fd5b506101aa60048036038101906101a59190611919565b610521565b005b3480156101b857600080fd5b506101c16107e1565b6040516101ce91906118d2565b60405180910390f35b3480156101e357600080fd5b506101fe60048036038101906101f9919061188c565b6107e7565b60405161020b91906118d2565b60405180910390f35b34801561022057600080fd5b5061023b60048036038101906102369190611959565b610900565b005b34801561024957600080fd5b5061025261096a565b60405161025f91906118d2565b60405180910390f35b34801561027457600080fd5b5061027d610970565b60405161028a91906118d2565b60405180910390f35b34801561029f57600080fd5b506102ba60048036038101906102b59190611999565b610976565b005b3480156102c857600080fd5b506102d16109d8565b6040516102de91906118d2565b60405180910390f35b3480156102f357600080fd5b506102fc6109de565b60405161030991906118d2565b60405180910390f35b34801561031e57600080fd5b506103396004803603810190610334919061188c565b6109e4565b604051610348939291906119c6565b60405180910390f35b610359610a0e565b005b34801561036757600080fd5b50610370610e03565b60405161037d91906118d2565b60405180910390f35b34801561039257600080fd5b5061039b610e09565b6040516103a89190611a0c565b60405180910390f35b3480156103bd57600080fd5b506103c6610e2d565b6040516103d391906118d2565b60405180910390f35b3480156103e857600080fd5b506103f1610e33565b005b3480156103ff57600080fd5b50610408610e3e565b6040516104159190611a0c565b60405180910390f35b34801561042a57600080fd5b5061044560048036038101906104409190611999565b610e68565b005b34801561045357600080fd5b5061045c610ffb565b60405161046991906118d2565b60405180910390f35b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146104ca57600080fd5b80600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6ec097ce7bc90715b34b9f100000000081565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461057957600080fd5b600f54600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015411156105cf576105ce82611001565b5b60008111801561062157506000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154145b156106345761062f82611294565b610696565b60008114801561068657506000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154115b156106955761069482611343565b5b5b6106ff816106f1600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015460085461154a90919063ffffffff16565b61159490919063ffffffff16565b60088190555080600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000181905550610797600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001546115f2565b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101819055505050565b600c5481565b600080600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001540361083b57600090506108fb565b6000610888600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001546115f2565b90506000600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015490508082116108e3576000925050506108fb565b6108f6818361154a90919063ffffffff16565b925050505b919050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461095857600080fd5b81600d8190555080600e819055505050565b60085481565b600e5481565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146109ce57600080fd5b80600f8190555050565b60095481565b600f5481565b60076020528060005260406000206000915090508060000154908060010154908060020154905083565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610a6b9190611a0c565b602060405180830381865afa158015610a88573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aac9190611a3c565b90506000600267ffffffffffffffff811115610acb57610aca611a69565b5b604051908082528060200260200182016040528015610af95781602001602082028036833780820191505090505b509050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b69573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b8d9190611aad565b81600081518110610ba157610ba0611ada565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681600181518110610c1257610c11611ada565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b6f9de953460008430426040518663ffffffff1660e01b8152600401610caf9493929190611c0c565b6000604051808303818588803b158015610cc857600080fd5b505af1158015610cdc573d6000803e3d6000fd5b50505050506000610d9183600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610d429190611a0c565b602060405180830381865afa158015610d5f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d839190611a3c565b61154a90919063ffffffff16565b9050610da88160095461159490919063ffffffff16565b600981905550610df8610de7600854610dd9846ec097ce7bc90715b34b9f100000000061163190919063ffffffff16565b6116ab90919063ffffffff16565b600b5461159490919063ffffffff16565b600b81905550505050565b600b5481565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600a5481565b610e3c33611001565b565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610ec057600080fd5b6000600480549050905060008103610ed85750610ff8565b6000805a905060005b8483108015610eef57508381105b15610ff35783600c5410610f06576000600c819055505b610f4f6004600c5481548110610f1f57610f1e611ada565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166116f5565b15610f9e57610f9d6004600c5481548110610f6d57610f6c611ada565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16611001565b5b610fc3610fb45a8461154a90919063ffffffff16565b8461159490919063ffffffff16565b92505a9150600c6000815480929190610fdb90611c87565b91905055508080610feb90611c87565b915050610ee1565b505050505b50565b600d5481565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001540315611291576000611057826107e7565b9050600081111561128f5761107781600a5461159490919063ffffffff16565b600a81905550600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff1660e01b81526004016110da929190611ccf565b6020604051808303816000875af11580156110f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061111d9190611d30565b5042600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506111b781600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206002015461159490919063ffffffff16565b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020181905550611248600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001546115f2565b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101819055505b505b50565b600480549050600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506004819080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600460016004805490506113579190611d5d565b8154811061136857611367611ada565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166004600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054815481106113e6576113e5611ada565b5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600560008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460056000600460016004805490506114869190611d5d565b8154811061149757611496611ada565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600480548061151257611511611d91565b5b6001900381819060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055905550565b600061158c83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611762565b905092915050565b60008082846115a39190611dc0565b9050838110156115e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115df90611e51565b60405180910390fd5b8091505092915050565b600061162a6ec097ce7bc90715b34b9f100000000061161c600b548561163190919063ffffffff16565b6116ab90919063ffffffff16565b9050919050565b600080830361164357600090506116a5565b600082846116519190611e71565b90508284826116609190611ee2565b146116a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169790611f85565b60405180910390fd5b809150505b92915050565b60006116ed83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506117c6565b905092915050565b600042600d54600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546117459190611dc0565b10801561175b5750600e54611759836107e7565b115b9050919050565b60008383111582906117aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117a19190612024565b60405180910390fd5b50600083856117b99190611d5d565b9050809150509392505050565b6000808311829061180d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118049190612024565b60405180910390fd5b506000838561181c9190611ee2565b9050809150509392505050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006118598261182e565b9050919050565b6118698161184e565b811461187457600080fd5b50565b60008135905061188681611860565b92915050565b6000602082840312156118a2576118a1611829565b5b60006118b084828501611877565b91505092915050565b6000819050919050565b6118cc816118b9565b82525050565b60006020820190506118e760008301846118c3565b92915050565b6118f6816118b9565b811461190157600080fd5b50565b600081359050611913816118ed565b92915050565b600080604083850312156119305761192f611829565b5b600061193e85828601611877565b925050602061194f85828601611904565b9150509250929050565b600080604083850312156119705761196f611829565b5b600061197e85828601611904565b925050602061198f85828601611904565b9150509250929050565b6000602082840312156119af576119ae611829565b5b60006119bd84828501611904565b91505092915050565b60006060820190506119db60008301866118c3565b6119e860208301856118c3565b6119f560408301846118c3565b949350505050565b611a068161184e565b82525050565b6000602082019050611a2160008301846119fd565b92915050565b600081519050611a36816118ed565b92915050565b600060208284031215611a5257611a51611829565b5b6000611a6084828501611a27565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600081519050611aa781611860565b92915050565b600060208284031215611ac357611ac2611829565b5b6000611ad184828501611a98565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000819050919050565b6000819050919050565b6000611b38611b33611b2e84611b09565b611b13565b6118b9565b9050919050565b611b4881611b1d565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b611b838161184e565b82525050565b6000611b958383611b7a565b60208301905092915050565b6000602082019050919050565b6000611bb982611b4e565b611bc38185611b59565b9350611bce83611b6a565b8060005b83811015611bff578151611be68882611b89565b9750611bf183611ba1565b925050600181019050611bd2565b5085935050505092915050565b6000608082019050611c216000830187611b3f565b8181036020830152611c338186611bae565b9050611c4260408301856119fd565b611c4f60608301846118c3565b95945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000611c92826118b9565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611cc457611cc3611c58565b5b600182019050919050565b6000604082019050611ce460008301856119fd565b611cf160208301846118c3565b9392505050565b60008115159050919050565b611d0d81611cf8565b8114611d1857600080fd5b50565b600081519050611d2a81611d04565b92915050565b600060208284031215611d4657611d45611829565b5b6000611d5484828501611d1b565b91505092915050565b6000611d68826118b9565b9150611d73836118b9565b9250828203905081811115611d8b57611d8a611c58565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6000611dcb826118b9565b9150611dd6836118b9565b9250828201905080821115611dee57611ded611c58565b5b92915050565b600082825260208201905092915050565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000600082015250565b6000611e3b601b83611df4565b9150611e4682611e05565b602082019050919050565b60006020820190508181036000830152611e6a81611e2e565b9050919050565b6000611e7c826118b9565b9150611e87836118b9565b9250828202611e95816118b9565b91508282048414831517611eac57611eab611c58565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000611eed826118b9565b9150611ef8836118b9565b925082611f0857611f07611eb3565b5b828204905092915050565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008201527f7700000000000000000000000000000000000000000000000000000000000000602082015250565b6000611f6f602183611df4565b9150611f7a82611f13565b604082019050919050565b60006020820190508181036000830152611f9e81611f62565b9050919050565b600081519050919050565b60005b83811015611fce578082015181840152602081019050611fb3565b60008484015250505050565b6000601f19601f8301169050919050565b6000611ff682611fa5565b6120008185611df4565b9350612010818560208601611fb0565b61201981611fda565b840191505092915050565b6000602082019050818103600083015261203e8184611feb565b90509291505056fea2646970667358221220397dd1f0989f8cde92222d80a145364586dec6bcd4964e4fe96fed1da3d4da3c64736f6c63430008120033

Deployed Bytecode

0x60806040526004361061039b5760003560e01c806383b4ac68116101dc578063aefde9f211610102578063dd62ed3e116100a0578063f51d72e91161006f578063f51d72e914610d91578063f708a64f14610dbc578063f887ea4014610de5578063f8b45b0514610e10576103a2565b8063dd62ed3e14610cd5578063ecc0d7bf14610d12578063edfb997e14610d3d578063f2fde38b14610d68576103a2565b8063cb39c7f0116100dc578063cb39c7f014610c17578063cdadc8c714610c42578063ce25a73814610c6d578063d439979014610c98576103a2565b8063aefde9f214610b84578063b2b250ec14610baf578063bf8ebd8514610bda576103a2565b80639d9241ec1161017a578063a8aa1b3111610149578063a8aa1b3114610ada578063a9059cbb14610b05578063ac3a5ee314610b42578063acb7f0f114610b6d576103a2565b80639d9241ec14610a20578063a457c2d714610a4b578063a4b45c0014610a88578063a7ccabdf14610ab1576103a2565b80638da5cb5b116101b65780638da5cb5b146109765780638f32d59b146109a157806395d89b41146109cc5780639d1944f5146109f7576103a2565b806383b4ac68146108f957806384ec884f14610924578063854cff2f1461094d576103a2565b80633eaaf86b116102c15780635821d4a01161025f5780636c5b28551161022e5780636c5b28551461085157806370a082311461087a578063715018a6146108b75780637c0b8de2146108ce576103a2565b80635821d4a0146107a757806359b107b9146107d25780635d0044ca146107fd5780636630d47114610826576103a2565b8063441b1d301161029b578063441b1d30146106eb5780634707d000146107145780634a7e73d3146107515780634d709adf1461077c576103a2565b80633eaaf86b1461065a57806342966c68146106855780634355855a146106ae576103a2565b806318160ddd116103395780632e0f2625116103085780632e0f26251461059e5780632f34d282146105c9578063313ce567146105f2578063395093511461061d576103a2565b806318160ddd146104e25780631df59e2f1461050d57806323b872dd146105385780632d48e89614610575576103a2565b8063095ea7b311610375578063095ea7b31461042657806309afb3ce14610463578063178d9b8e1461048e578063180b0d7e146104b7576103a2565b80630345e353146103a757806306fdde03146103d25780630710fb45146103fd576103a2565b366103a257005b600080fd5b3480156103b357600080fd5b506103bc610e3b565b6040516103c99190614256565b60405180910390f35b3480156103de57600080fd5b506103e7610e41565b6040516103f49190614301565b60405180910390f35b34801561040957600080fd5b50610424600480360381019061041f9190614386565b610ed3565b005b34801561043257600080fd5b5061044d600480360381019061044891906143df565b610ff2565b60405161045a919061443a565b60405180910390f35b34801561046f57600080fd5b506104786110e4565b604051610485919061443a565b60405180910390f35b34801561049a57600080fd5b506104b560048036038101906104b09190614455565b6110f7565b005b3480156104c357600080fd5b506104cc6111de565b6040516104d99190614256565b60405180910390f35b3480156104ee57600080fd5b506104f76111e4565b6040516105049190614256565b60405180910390f35b34801561051957600080fd5b506105226111ee565b60405161052f91906144dd565b60405180910390f35b34801561054457600080fd5b5061055f600480360381019061055a91906144f8565b611214565b60405161056c919061443a565b60405180910390f35b34801561058157600080fd5b5061059c6004803603810190610597919061454b565b611409565b005b3480156105aa57600080fd5b506105b36114ad565b6040516105c09190614256565b60405180910390f35b3480156105d557600080fd5b506105f060048036038101906105eb9190614386565b6114b2565b005b3480156105fe57600080fd5b50610607611507565b60405161061491906145a7565b60405180910390f35b34801561062957600080fd5b50610644600480360381019061063f91906143df565b61151e565b604051610651919061443a565b60405180910390f35b34801561066657600080fd5b5061066f61171a565b60405161067c9190614256565b60405180910390f35b34801561069157600080fd5b506106ac60048036038101906106a791906145c2565b611720565b005b3480156106ba57600080fd5b506106d560048036038101906106d09190614386565b61172d565b6040516106e2919061443a565b60405180910390f35b3480156106f757600080fd5b50610712600480360381019061070d91906145c2565b61174d565b005b34801561072057600080fd5b5061073b600480360381019061073691906145ef565b6117a8565b604051610748919061443a565b60405180910390f35b34801561075d57600080fd5b506107666118c0565b6040516107739190614256565b60405180910390f35b34801561078857600080fd5b506107916118c6565b60405161079e919061468e565b60405180910390f35b3480156107b357600080fd5b506107bc6118ec565b6040516107c99190614256565b60405180910390f35b3480156107de57600080fd5b506107e76118f2565b6040516107f49190614256565b60405180910390f35b34801561080957600080fd5b50610824600480360381019061081f91906145c2565b6118f8565b005b34801561083257600080fd5b5061083b611971565b6040516108489190614256565b60405180910390f35b34801561085d57600080fd5b5061087860048036038101906108739190614455565b611977565b005b34801561088657600080fd5b506108a1600480360381019061089c9190614386565b611a72565b6040516108ae9190614256565b60405180910390f35b3480156108c357600080fd5b506108cc611abb565b005b3480156108da57600080fd5b506108e3611b75565b6040516108f091906146ca565b60405180910390f35b34801561090557600080fd5b5061090e611b9b565b60405161091b919061443a565b60405180910390f35b34801561093057600080fd5b5061094b600480360381019061094691906145c2565b611bb3565b005b34801561095957600080fd5b50610974600480360381019061096f9190614386565b611c05565b005b34801561098257600080fd5b5061098b611c71565b60405161099891906146f4565b60405180910390f35b3480156109ad57600080fd5b506109b6611c9b565b6040516109c3919061443a565b60405180910390f35b3480156109d857600080fd5b506109e1611cf3565b6040516109ee9190614301565b60405180910390f35b348015610a0357600080fd5b50610a1e6004803603810190610a1991906145c2565b611d85565b005b348015610a2c57600080fd5b50610a35611de5565b604051610a429190614256565b60405180910390f35b348015610a5757600080fd5b50610a726004803603810190610a6d91906143df565b611deb565b604051610a7f919061443a565b60405180910390f35b348015610a9457600080fd5b50610aaf6004803603810190610aaa91906145ef565b61207b565b005b348015610abd57600080fd5b50610ad86004803603810190610ad39190614386565b61214b565b005b348015610ae657600080fd5b50610aef6121ea565b604051610afc91906146f4565b60405180910390f35b348015610b1157600080fd5b50610b2c6004803603810190610b2791906143df565b612210565b604051610b39919061443a565b60405180910390f35b348015610b4e57600080fd5b50610b57612228565b604051610b649190614256565b60405180910390f35b348015610b7957600080fd5b50610b8261222e565b005b348015610b9057600080fd5b50610b996122a9565b604051610ba69190614256565b60405180910390f35b348015610bbb57600080fd5b50610bc46122af565b604051610bd19190614256565b60405180910390f35b348015610be657600080fd5b50610c016004803603810190610bfc9190614386565b6122b5565b604051610c0e919061443a565b60405180910390f35b348015610c2357600080fd5b50610c2c61247a565b604051610c399190614256565b60405180910390f35b348015610c4e57600080fd5b50610c57612480565b604051610c6491906146f4565b60405180910390f35b348015610c7957600080fd5b50610c826124a6565b604051610c8f91906144dd565b60405180910390f35b348015610ca457600080fd5b50610cbf6004803603810190610cba9190614386565b6124cc565b604051610ccc919061443a565b60405180910390f35b348015610ce157600080fd5b50610cfc6004803603810190610cf791906145ef565b612522565b604051610d099190614256565b60405180910390f35b348015610d1e57600080fd5b50610d276125a9565b604051610d349190614256565b60405180910390f35b348015610d4957600080fd5b50610d526125af565b604051610d5f9190614256565b60405180910390f35b348015610d7457600080fd5b50610d8f6004803603810190610d8a9190614386565b6125b5565b005b348015610d9d57600080fd5b50610da66125d2565b604051610db391906144dd565b60405180910390f35b348015610dc857600080fd5b50610de36004803603810190610dde919061473b565b6125f8565b005b348015610df157600080fd5b50610dfa61282a565b604051610e07919061479c565b60405180910390f35b348015610e1c57600080fd5b50610e2561284e565b604051610e329190614256565b60405180910390f35b60105481565b606060008054610e50906147e6565b80601f0160208091040260200160405190810160405280929190818152602001828054610e7c906147e6565b8015610ec95780601f10610e9e57610100808354040283529160200191610ec9565b820191906000526020600020905b815481529060010190602001808311610eac57829003601f168201915b5050505050905090565b610edb611c9b565b610ee457600080fd5b601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630710fb45826040518263ffffffff1660e01b8152600401610f3f91906146f4565b600060405180830381600087803b158015610f5957600080fd5b505af1158015610f6d573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff16601560009054906101000a905050506001600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600081601c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516110d29190614256565b60405180910390a36001905092915050565b601a60159054906101000a900460ff1681565b6110ff611c9b565b61110857600080fd5b83600c819055508260088190555081600a819055508060068190555061114f600a54611141600854600c5461285490919063ffffffff16565b61285490919063ffffffff16565b600e8190555060fa600e54111561119b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119290614863565b60405180910390fd5b7f7027e29faa2460f22e800d92db38d4795b668c7104da6b87afaeaf502a269ca5848484846040516111d09493929190614883565b60405180910390a150505050565b6103e881565b6000601154905090565b601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006fffffffffffffffffffffffffffffffff8016601c60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054146113f257611371826040518060400160405280601681526020017f496e73756666696369656e7420416c6c6f77616e636500000000000000000000815250601c60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546128b29092919063ffffffff16565b601c60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b6113fd848484612916565b50600190509392505050565b611411611c9b565b61141a57600080fd5b601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632d48e89683836040518363ffffffff1660e01b81526004016114779291906148c8565b600060405180830381600087803b15801561149157600080fd5b505af11580156114a5573d6000803e3d6000fd5b505050505050565b601281565b6114ba611c9b565b6114c357600080fd5b80600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600260009054906101000a900460ff16905090565b60006115af82601c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461285490919063ffffffff16565b601c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925601c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040516117089190614256565b60405180910390a36001905092915050565b60115481565b61172a3382612f90565b50565b601b6020528060005260406000206000915054906101000a900460ff1681565b611755611c9b565b61175e57600080fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156117a4573d6000803e3d6000fd5b5050565b60006117b2611c9b565b6117bb57600080fd5b60008373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016117f691906146f4565b602060405180830381865afa158015611813573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118379190614906565b90508373ffffffffffffffffffffffffffffffffffffffff1663a9059cbb84836040518363ffffffff1660e01b8152600401611874929190614933565b6020604051808303816000875af1158015611893573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118b79190614971565b91505092915050565b60075481565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60065481565b600e5481565b611900611c9b565b61190957600080fd5b600181101561194d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194490614a10565b60405180910390fd5b6127106011548261195e9190614a5f565b6119689190614ad0565b60128190555050565b600d5481565b61197f611c9b565b61198857600080fd5b83600d819055508260098190555081600b81905550806007819055506119e36007546119d5600b546119c7600954600d5461285490919063ffffffff16565b61285490919063ffffffff16565b61285490919063ffffffff16565b600f8190555060fa600f541115611a2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2690614863565b60405180910390fd5b7f5323944abff53387ebe7bd518eb0a3b0b79d3534d234a96e9877a33b6442eb1c84848484604051611a649493929190614883565b60405180910390a150505050565b6000601d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611ac3611c9b565b611acc57600080fd5b600260019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482060405160405180910390a26000600260016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000601a60149054906101000a900460ff1615905090565b611bbb611c9b565b611bc457600080fd5b806019819055507f724662b0107aa55ae3d489082ef31ea9f1ca77f7300160c5355db1b279dc387f81604051611bfa9190614256565b60405180910390a150565b611c0d611c9b565b611c1657600080fd5b6001600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6000600260019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600260019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614905090565b606060018054611d02906147e6565b80601f0160208091040260200160405190810160405280929190818152602001828054611d2e906147e6565b8015611d7b5780601f10611d5057610100808354040283529160200191611d7b565b820191906000526020600020905b815481529060010190602001808311611d5e57829003601f168201915b5050505050905090565b611d8d611c9b565b611d9657600080fd5b620b71b08110611ddb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd290614b4d565b60405180910390fd5b8060188190555050565b600f5481565b600080601c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050808310611efb576000601c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611f8f565b611f0e838261310390919063ffffffff16565b601c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b8373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925601c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040516120689190614256565b60405180910390a3600191505092915050565b612083611c9b565b61208c57600080fd5b81601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080601460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f71aa1fc168f4b314943f7510c82f58650f0fcdf4ec4bb48f62cf4d7ad0aeed35828260405161213f929190614b6d565b60405180910390a15050565b612153611c9b565b61215c57600080fd5b6000813b9050600081116121a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161219c90614be2565b60405180910390fd5b81600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600061221d338484612916565b506001905092915050565b60095481565b612236611c9b565b61223f57600080fd5b6001601a60156101000a81548160ff021916908315150217905550426010819055507fb9bbb15e341600c8d067a0cadeba219905d5ba6d422b193c9c32265d26fc51c8601a60159054906101000a900460ff1660405161229f919061443a565b60405180910390a1565b60085481565b600c5481565b60008073ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036123155760009050612475565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168460405160240161236291906146f4565b6040516020818303038152906040527f70a08231000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516123ec9190614c49565b600060405180830381855afa9150503d8060008114612427576040519150601f19603f3d011682016040523d82523d6000602084013e61242c565b606091505b50915091508161244157600092505050612475565b6000818060200190518101906124579190614906565b90506001811061246d5760019350505050612475565b600093505050505b919050565b60195481565b601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6000601c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600a5481565b600b5481565b6125bd611c9b565b6125c657600080fd5b6125cf8161314d565b50565b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b612600611c9b565b61260957600080fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141580156126935750601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b61269c57600080fd5b80601b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550801561278e57601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166314b6ca968360006040518363ffffffff1660e01b8152600401612757929190614c9b565b600060405180830381600087803b15801561277157600080fd5b505af1158015612785573d6000803e3d6000fd5b50505050612826565b601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166314b6ca96836127d685611a72565b6040518363ffffffff1660e01b81526004016127f3929190614933565b600060405180830381600087803b15801561280d57600080fd5b505af1158015612821573d6000803e3d6000fd5b505050505b5050565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b60125481565b60008082846128639190614cc4565b9050838110156128a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161289f90614d44565b60405180910390fd5b8091505092915050565b60008383111582906128fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128f19190614301565b60405180910390fd5b50600083856129099190614d64565b9050809150509392505050565b6000601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612a4f57600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612a4e5760125482601d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612a0c9190614cc4565b1115612a4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a4490614e0a565b60405180910390fd5b5b5b601a60159054906101000a900460ff16612b4457600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680612b045750600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b612b43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b3a90614e76565b60405180910390fd5b5b601a60149054906101000a900460ff1615612b6b57612b64848484613246565b9050612f89565b612b7361337d565b15612b8157612b806133ef565b5b612bd382601d60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461310390919063ffffffff16565b601d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000612c228585613cd2565b612c2c5782612c38565b612c37858585613e30565b5b9050612c8c81601d60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461285490919063ffffffff16565b601d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550601b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612db257601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166314b6ca9686612d6888611a72565b6040518363ffffffff1660e01b8152600401612d85929190614933565b600060405180830381600087803b158015612d9f57600080fd5b505af1925050508015612db0575060015b505b601b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612e9557601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166314b6ca9685612e4b87611a72565b6040518363ffffffff1660e01b8152600401612e68929190614933565b600060405180830381600087803b158015612e8257600080fd5b505af1925050508015612e93575060015b505b601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ffb2c4796018546040518263ffffffff1660e01b8152600401612ef29190614256565b600060405180830381600087803b158015612f0c57600080fd5b505af1925050508015612f1d575060015b508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051612f7b9190614256565b60405180910390a360019150505b9392505050565b60008103612f9d57600080fd5b601d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054811115612fe957600080fd5b612ffe8160115461310390919063ffffffff16565b60118190555061305681601d60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461310390919063ffffffff16565b601d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516130f79190614256565b60405180910390a35050565b600061314583836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506128b2565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361318657600080fd5b8073ffffffffffffffffffffffffffffffffffffffff16600260019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600260016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600061329a82601d60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461310390919063ffffffff16565b601d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061332f82601d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461285490919063ffffffff16565b601d60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600190509392505050565b6000601a60149054906101000a900460ff161580156133ea5750601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614155b905090565b6001601a60146101000a81548160ff0219169083151502179055506000613423600e54600f5461285490919063ffffffff16565b90506000810361343257600190505b6000601d60003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008103613485575050613cb5565b80601c60003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060007f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000600267ffffffffffffffff81111561354357613542614e96565b5b6040519080825280602002602001820160405280156135715781602001602082028036833780820191505090505b509050308160008151811061358957613588614ec5565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801561362e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136529190614f09565b8160018151811061366657613665614ec5565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060007f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663791ac9478460008530426040518663ffffffff1660e01b8152600401613704959493929190614ff4565b600060405180830381600087803b15801561371e57600080fd5b505af192505050801561372f575060015b1561373957600190505b6000479050600061375760095460085461285490919063ffffffff16565b90506000613772600b54600a5461285490919063ffffffff16565b9050600061378d600d54600c5461285490919063ffffffff16565b905060006137b6896137a8868861411690919063ffffffff16565b61419090919063ffffffff16565b905060006137df8a6137d1858961411690919063ffffffff16565b61419090919063ffffffff16565b905060006138088b6137fa878a61411690919063ffffffff16565b61419090919063ffffffff16565b905060006138438261383586613827878d61310390919063ffffffff16565b61310390919063ffffffff16565b61310390919063ffffffff16565b90506000600267ffffffffffffffff81111561386257613861614e96565b5b6040519080825280602002602001820160405280156138905781602001602082028036833780820191505090505b5090507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156138fe573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139229190614f09565b8160008151811061393657613935614ec5565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507395ad61b0a150d79219dcf64e1e6cc01f0b64c4ce8160018151811061399957613998614ec5565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060007f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663b6f9de958560008573dead000000000000000042069420694206942069426040518663ffffffff1660e01b8152600401613a4a949392919061504e565b6000604051808303818588803b158015613a6357600080fd5b505af193505050508015613a75575060015b15613a7f57600190505b6000601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d0e30db0886040518263ffffffff1660e01b81526004016000604051808303818588803b158015613aeb57600080fd5b505af193505050508015613afd575060015b15613b0757600190505b6000601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1685604051613b4f906150c0565b60006040518083038185875af1925050503d8060008114613b8c576040519150601f19603f3d011682016040523d82523d6000602084013e613b91565b606091505b5050905080613bd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613bcc90615121565b60405180910390fd5b6000601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1688604051613c1d906150c0565b60006040518083038185875af1925050503d8060008114613c5a576040519150601f19603f3d011682016040523d82523d6000602084013e613c5f565b606091505b5050905080613ca3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613c9a9061518d565b60405180910390fd5b50505050505050505050505050505050505b6000601a60146101000a81548160ff021916908315150217905550565b60008273ffffffffffffffffffffffffffffffffffffffff16601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161480613d7d57508173ffffffffffffffffffffffffffffffffffffffff16601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b8015613e285750600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161580613e275750600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b5b905092915050565b600080600e549050601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603613e9357600f5490505b60011515613ea0856122b5565b151503613f1e57601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603613f1d576000811115613f1c57613f19600a8261310390919063ffffffff16565b90505b5b5b6000613f476103e8613f39848761411690919063ffffffff16565b61419090919063ffffffff16565b9050600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680613fea5750600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b15613ff457600090505b61404681601d60003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461285490919063ffffffff16565b601d60003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060008111156140f8573073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516140ef9190614256565b60405180910390a35b61410b818561310390919063ffffffff16565b925050509392505050565b6000808303614128576000905061418a565b600082846141369190614a5f565b90508284826141459190614ad0565b14614185576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161417c9061521f565b60405180910390fd5b809150505b92915050565b60006141d283836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506141da565b905092915050565b60008083118290614221576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016142189190614301565b60405180910390fd5b50600083856142309190614ad0565b9050809150509392505050565b6000819050919050565b6142508161423d565b82525050565b600060208201905061426b6000830184614247565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156142ab578082015181840152602081019050614290565b60008484015250505050565b6000601f19601f8301169050919050565b60006142d382614271565b6142dd818561427c565b93506142ed81856020860161428d565b6142f6816142b7565b840191505092915050565b6000602082019050818103600083015261431b81846142c8565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061435382614328565b9050919050565b61436381614348565b811461436e57600080fd5b50565b6000813590506143808161435a565b92915050565b60006020828403121561439c5761439b614323565b5b60006143aa84828501614371565b91505092915050565b6143bc8161423d565b81146143c757600080fd5b50565b6000813590506143d9816143b3565b92915050565b600080604083850312156143f6576143f5614323565b5b600061440485828601614371565b9250506020614415858286016143ca565b9150509250929050565b60008115159050919050565b6144348161441f565b82525050565b600060208201905061444f600083018461442b565b92915050565b6000806000806080858703121561446f5761446e614323565b5b600061447d878288016143ca565b945050602061448e878288016143ca565b935050604061449f878288016143ca565b92505060606144b0878288016143ca565b91505092959194509250565b60006144c782614328565b9050919050565b6144d7816144bc565b82525050565b60006020820190506144f260008301846144ce565b92915050565b60008060006060848603121561451157614510614323565b5b600061451f86828701614371565b935050602061453086828701614371565b9250506040614541868287016143ca565b9150509250925092565b6000806040838503121561456257614561614323565b5b6000614570858286016143ca565b9250506020614581858286016143ca565b9150509250929050565b600060ff82169050919050565b6145a18161458b565b82525050565b60006020820190506145bc6000830184614598565b92915050565b6000602082840312156145d8576145d7614323565b5b60006145e6848285016143ca565b91505092915050565b6000806040838503121561460657614605614323565b5b600061461485828601614371565b925050602061462585828601614371565b9150509250929050565b6000819050919050565b600061465461464f61464a84614328565b61462f565b614328565b9050919050565b600061466682614639565b9050919050565b60006146788261465b565b9050919050565b6146888161466d565b82525050565b60006020820190506146a3600083018461467f565b92915050565b60006146b48261465b565b9050919050565b6146c4816146a9565b82525050565b60006020820190506146df60008301846146bb565b92915050565b6146ee81614348565b82525050565b600060208201905061470960008301846146e5565b92915050565b6147188161441f565b811461472357600080fd5b50565b6000813590506147358161470f565b92915050565b6000806040838503121561475257614751614323565b5b600061476085828601614371565b925050602061477185828601614726565b9150509250929050565b60006147868261465b565b9050919050565b6147968161477b565b82525050565b60006020820190506147b1600083018461478d565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806147fe57607f821691505b602082108103614811576148106147b7565b5b50919050565b7f4d757374206b656570206665657320617420323525206f72206c657373000000600082015250565b600061484d601d8361427c565b915061485882614817565b602082019050919050565b6000602082019050818103600083015261487c81614840565b9050919050565b60006080820190506148986000830187614247565b6148a56020830186614247565b6148b26040830185614247565b6148bf6060830184614247565b95945050505050565b60006040820190506148dd6000830185614247565b6148ea6020830184614247565b9392505050565b600081519050614900816143b3565b92915050565b60006020828403121561491c5761491b614323565b5b600061492a848285016148f1565b91505092915050565b600060408201905061494860008301856146e5565b6149556020830184614247565b9392505050565b60008151905061496b8161470f565b92915050565b60006020828403121561498757614986614323565b5b60006149958482850161495c565b91505092915050565b7f4d61782077616c6c6574206d7573742062652067726561746572207468616e2060008201527f302e303125206f6620546f74616c20537570706c790000000000000000000000602082015250565b60006149fa60358361427c565b9150614a058261499e565b604082019050919050565b60006020820190508181036000830152614a29816149ed565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614a6a8261423d565b9150614a758361423d565b9250828202614a838161423d565b91508282048414831517614a9a57614a99614a30565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614adb8261423d565b9150614ae68361423d565b925082614af657614af5614aa1565b5b828204905092915050565b7f476173206d757374206265206c6f776572207468616e20373530303030000000600082015250565b6000614b37601d8361427c565b9150614b4282614b01565b602082019050919050565b60006020820190508181036000830152614b6681614b2a565b9050919050565b6000604082019050614b8260008301856146e5565b614b8f60208301846146e5565b9392505050565b7f476976656e2061646472657373206973206e6f74206120636f6e747261637400600082015250565b6000614bcc601f8361427c565b9150614bd782614b96565b602082019050919050565b60006020820190508181036000830152614bfb81614bbf565b9050919050565b600081519050919050565b600081905092915050565b6000614c2382614c02565b614c2d8185614c0d565b9350614c3d81856020860161428d565b80840191505092915050565b6000614c558284614c18565b915081905092915050565b6000819050919050565b6000614c85614c80614c7b84614c60565b61462f565b61423d565b9050919050565b614c9581614c6a565b82525050565b6000604082019050614cb060008301856146e5565b614cbd6020830184614c8c565b9392505050565b6000614ccf8261423d565b9150614cda8361423d565b9250828201905080821115614cf257614cf1614a30565b5b92915050565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000600082015250565b6000614d2e601b8361427c565b9150614d3982614cf8565b602082019050919050565b60006020820190508181036000830152614d5d81614d21565b9050919050565b6000614d6f8261423d565b9150614d7a8361423d565b9250828203905081811115614d9257614d91614a30565b5b92915050565b7f7472616e73616374696f6e20776f756c6420657863656564206d61782077616c60008201527f6c65742073697a65000000000000000000000000000000000000000000000000602082015250565b6000614df460288361427c565b9150614dff82614d98565b604082019050919050565b60006020820190508181036000830152614e2381614de7565b9050919050565b7f74726164696e67206973206e6f7420656e61626c656420796574000000000000600082015250565b6000614e60601a8361427c565b9150614e6b82614e2a565b602082019050919050565b60006020820190508181036000830152614e8f81614e53565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050614f038161435a565b92915050565b600060208284031215614f1f57614f1e614323565b5b6000614f2d84828501614ef4565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b614f6b81614348565b82525050565b6000614f7d8383614f62565b60208301905092915050565b6000602082019050919050565b6000614fa182614f36565b614fab8185614f41565b9350614fb683614f52565b8060005b83811015614fe7578151614fce8882614f71565b9750614fd983614f89565b925050600181019050614fba565b5085935050505092915050565b600060a0820190506150096000830188614247565b6150166020830187614c8c565b81810360408301526150288186614f96565b905061503760608301856146e5565b6150446080830184614247565b9695505050505050565b60006080820190506150636000830187614c8c565b81810360208301526150758186614f96565b905061508460408301856146e5565b6150916060830184614247565b95945050505050565b50565b60006150aa600083614c0d565b91506150b58261509a565b600082019050919050565b60006150cb8261509d565b9150819050919050565b7f5574696c697479207472616e73666572206661696c6564000000000000000000600082015250565b600061510b60178361427c565b9150615116826150d5565b602082019050919050565b6000602082019050818103600083015261513a816150fe565b9050919050565b7f6275796261636b207472616e73666572206661696c6564000000000000000000600082015250565b600061517760178361427c565b915061518282615141565b602082019050919050565b600060208201905081810360008301526151a68161516a565b9050919050565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008201527f7700000000000000000000000000000000000000000000000000000000000000602082015250565b600061520960218361427c565b9150615214826151ad565b604082019050919050565b60006020820190508181036000830152615238816151fc565b905091905056fea2646970667358221220c2f673dd219d07b78ebd4ee097521bd6e37445a3b667d2fc4579877ddc6088df64736f6c63430008120033

Deployed Bytecode Sourcemap

19138:17486:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20240:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18856:85;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31931:231;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30728:245;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20982:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32971:574;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20188:45;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35045:102;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20580:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23558:434;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32396:182;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19566:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34596:110;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19046:85;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30332:388;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20278:54;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30981:83;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21038:48;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36480:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36169:267;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19651:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19262;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19612:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19953:108;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32170:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19912:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33553:601;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35158:117;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18063:128;;;;;;;;;;;;;:::i;:::-;;19485:70;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35404:85;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32762:199;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34487:101;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;17796:81;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17963:92;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18949:89;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32586:168;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20068:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29752:572;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34162:317;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34714:304;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20832:20;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23359:187;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19739:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31383:180;;;;;;;;;;;;;:::i;:::-;;19692:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19872:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35497:600;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20785:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20625:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20700:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35283:113;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29556:188;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19787:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19829:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18199:111;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20535:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31571:352;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19353:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20339:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20240:31;;;;:::o;18856:85::-;18895:13;18928:5;18921:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18856:85;:::o;31931:231::-;17925:9;:7;:9::i;:::-;17917:18;;;;;;32016:11:::1;;;;;;;;;;;:34;;;32051:13;32016:49;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;32094:13;32078:29;;:12;;;;;;;;::::0;;:29;32150:4:::1;32120:12;:27;32133:13;32120:27;;;;;;;;;;;;;;;;:34;;;;;;;;;;;;;;;;;;31931:231:::0;:::o;30728:245::-;30829:4;30886:5;30851:11;:23;30863:10;30851:23;;;;;;;;;;;;;;;:32;30875:7;30851:32;;;;;;;;;;;;;;;:40;;;;30928:7;30907:36;;30916:10;30907:36;;;30937:5;30907:36;;;;;;:::i;:::-;;;;;;;;30961:4;30954:11;;30728:245;;;;:::o;20982:32::-;;;;;;;;;;;;;:::o;32971:574::-;17925:9;:7;:9::i;:::-;17917:18;;;;;;33132:11:::1;33116:13;:27;;;;33177:17;33154:20;:40;;;;33223:16;33205:15;:34;;;;33276:11;33260:13;:27;;;;33314:60;33358:15;;33314:39;33332:20;;33314:13;;:17;;:39;;;;:::i;:::-;:43;;:60;;;;:::i;:::-;33300:11;:74;;;;33408:3;33393:11;;:18;;33385:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;33463:74;33475:11;33488:17;33507:16;33525:11;33463:74;;;;;;;;;:::i;:::-;;;;;;;;32971:574:::0;;;;:::o;20188:45::-;20229:4;20188:45;:::o;35045:102::-;35100:7;35127:12;;35120:19;;35045:102;:::o;20580:38::-;;;;;;;;;;;;;:::o;23558:434::-;23682:4;23746:17;23713:50;;:11;:17;23725:4;23713:17;;;;;;;;;;;;;;;:29;23731:10;23713:29;;;;;;;;;;;;;;;;:50;23709:213;;23812:98;23878:5;23812:98;;;;;;;;;;;;;;;;;:11;:17;23824:4;23812:17;;;;;;;;;;;;;;;:61;23848:10;23812:61;;;;;;;;;;;;;;;;:65;;:98;;;;;:::i;:::-;23780:11;:17;23792:4;23780:17;;;;;;;;;;;;;;;:29;23798:10;23780:29;;;;;;;;;;;;;;;:130;;;;23709:213;23932:30;23946:4;23952:2;23956:5;23932:13;:30::i;:::-;;23980:4;23973:11;;23558:434;;;;;:::o;32396:182::-;17925:9;:7;:9::i;:::-;17917:18;;;;;;32505:11:::1;;;;;;;;;;;:35;;;32541:10;32553:16;32505:65;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;32396:182:::0;;:::o;19566:37::-;19601:2;19566:37;:::o;34596:110::-;17925:9;:7;:9::i;:::-;17917:18;;;;;;34689:8:::1;34659:12;;:39;;;;;;;;;;;;;;;;;;34596:110:::0;:::o;19046:85::-;19089:5;19114:9;;;;;;;;;;;19107:16;;19046:85;:::o;30332:388::-;30432:4;30489:72;30550:10;30489:11;:23;30501:10;30489:23;;;;;;;;;;;;;;;:56;30527:7;30489:56;;;;;;;;;;;;;;;;:60;;:72;;;;:::i;:::-;30454:11;:23;30466:10;30454:23;;;;;;;;;;;;;;;:32;30478:7;30454:32;;;;;;;;;;;;;;;:107;;;;30625:7;30577:113;;30600:10;30577:113;;;30647:11;:23;30659:10;30647:23;;;;;;;;;;;;;;;:32;30671:7;30647:32;;;;;;;;;;;;;;;;30577:113;;;;;;:::i;:::-;;;;;;;;30708:4;30701:11;;30332:388;;;;:::o;20278:54::-;;;;:::o;30981:83::-;31031:25;31037:10;31049:6;31031:5;:25::i;:::-;30981:83;:::o;21038:48::-;;;;;;;;;;;;;;;;;;;;;;:::o;36480:104::-;17925:9;:7;:9::i;:::-;17917:18;;;;;;36548:10:::1;36540:28;;:36;36569:6;36540:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;36480:104:::0;:::o;36169:267::-;36252:12;17925:9;:7;:9::i;:::-;17917:18;;;;;;36277:24:::1;36311:12;36304:30;;;36343:4;36304:45;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36277:72;;36384:12;36377:29;;;36407:2;36411:16;36377:51;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36370:58;;;36169:267:::0;;;;:::o;19651:34::-;;;;:::o;19262:::-;;;;;;;;;;;;;:::o;19612:32::-;;;;:::o;19953:108::-;;;;:::o;32170:218::-;17925:9;:7;:9::i;:::-;17917:18;;;;;;32263:1:::1;32249:10;:15;;32241:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;32375:5;32359:12;;32346:10;:25;;;;:::i;:::-;32345:35;;;;:::i;:::-;32333:9;:47;;;;32170:218:::0;:::o;19912:34::-;;;;:::o;33553:601::-;17925:9;:7;:9::i;:::-;17917:18;;;;;;33717:11:::1;33700:14;:28;;;;33763:17;33739:21;:41;;;;33810:17;33791:16;:36;;;;33855:11;33838:14;:28;;;;33894:83;33962:14;;33894:63;33940:16;;33894:41;33913:21;;33894:14;;:18;;:41;;;;:::i;:::-;:45;;:63;;;;:::i;:::-;:67;;:83;;;;:::i;:::-;33879:12;:98;;;;34012:3;33996:12;;:19;;33988:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;34067:79;34083:11;34096:17;34115;34134:11;34067:79;;;;;;;;;:::i;:::-;;;;;;;;33553:601:::0;;;;:::o;35158:117::-;35224:7;35251;:16;35259:7;35251:16;;;;;;;;;;;;;;;;35244:23;;35158:117;;;:::o;18063:128::-;17925:9;:7;:9::i;:::-;17917:18;;;;;;18146:6:::1;;;;;;;;;;;18127:26;;;;;;;;;;;;18181:1;18164:6;;:19;;;;;;;;;;;;;;;;;;18063:128::o:0;19485:70::-;;;;;;;;;;;;;:::o;35404:85::-;35450:4;35475:6;;;;;;;;;;;35474:7;35467:14;;35404:85;:::o;32762:199::-;17925:9;:7;:9::i;:::-;17917:18;;;;;;32874::::1;32854:17;:38;;;;32910:43;32934:18;32910:43;;;;;;:::i;:::-;;;;;;;;32762:199:::0;:::o;34487:101::-;17925:9;:7;:9::i;:::-;17917:18;;;;;;34576:4:::1;34554:12;:19;34567:5;34554:19;;;;;;;;;;;;;;;;:26;;;;;;;;;;;;;;;;;;34487:101:::0;:::o;17796:81::-;17836:7;17863:6;;;;;;;;;;;17856:13;;17796:81;:::o;17963:92::-;18003:4;18041:6;;;;;;;;;;;18027:20;;:10;:20;;;18020:27;;17963:92;:::o;18949:89::-;18990:13;19023:7;19016:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18949:89;:::o;32586:168::-;17925:9;:7;:9::i;:::-;17917:18;;;;;;32675:6:::1;32669:3;:12;32661:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;32743:3;32726:14;:20;;;;32586:168:::0;:::o;20068:113::-;;;;:::o;29752:572::-;29857:4;29879:16;29898:11;:23;29910:10;29898:23;;;;;;;;;;;;;;;:32;29922:7;29898:32;;;;;;;;;;;;;;;;29879:51;;29964:8;29945:15;:27;29941:225;;30024:1;29989:11;:23;30001:10;29989:23;;;;;;;;;;;;;;;:32;30013:7;29989:32;;;;;;;;;;;;;;;:36;;;;29941:225;;;30093:61;30124:15;30093:8;:12;;:61;;;;:::i;:::-;30058:11;:23;30070:10;30058:23;;;;;;;;;;;;;;;:32;30082:7;30058:32;;;;;;;;;;;;;;;:96;;;;29941:225;30229:7;30181:113;;30204:10;30181:113;;;30251:11;:23;30263:10;30251:23;;;;;;;;;;;;;;;:32;30275:7;30251:32;;;;;;;;;;;;;;;;30181:113;;;;;;:::i;:::-;;;;;;;;30312:4;30305:11;;;29752:572;;;;:::o;34162:317::-;17925:9;:7;:9::i;:::-;17917:18;;;;;;34320:16:::1;34294:15;;:43;;;;;;;;;;;;;;;;;;34374:16;34348:15;;:43;;;;;;;;;;;;;;;;;;34409:56;34430:16;34448;34409:56;;;;;;;:::i;:::-;;;;;;;;34162:317:::0;;:::o;34714:304::-;17925:9;:7;:9::i;:::-;17917:18;;;;;;34782:16:::1;34857:4;34845:17;34833:29;;34942:1;34931:8;:12;34923:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;35005:4;34992:3;;:18;;;;;;;;;;;;;;;;;;34771:247;34714:304:::0;:::o;20832:20::-;;;;;;;;;;;;;:::o;23359:187::-;23458:4;23480:36;23494:10;23506:2;23510:5;23480:13;:36::i;:::-;;23534:4;23527:11;;23359:187;;;;:::o;19739:41::-;;;;:::o;31383:180::-;17925:9;:7;:9::i;:::-;17917:18;;;;;;31453:4:::1;31438:12;;:19;;;;;;;;;;;;;;;;;;31487:15;31468:16;:34;;;;31528:25;31540:12;;;;;;;;;;;31528:25;;;;;;:::i;:::-;;;;;;;;31383:180::o:0;19692:40::-;;;;:::o;19872:33::-;;;;:::o;35497:600::-;35558:4;35603:1;35579:26;;35587:3;;;;;;;;;;;35579:26;;;35575:119;;35629:5;35622:12;;;;35575:119;35707:12;35721:17;35750:3;;;;;;;;;;;35742:23;;35812:7;35766:54;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35742:79;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35706:115;;;;35843:7;35838:96;;35874:5;35867:12;;;;;;35838:96;35946:15;35975:4;35964:27;;;;;;;;;;;;:::i;:::-;35946:45;;36017:1;36006:7;:12;36002:56;;36042:4;36035:11;;;;;;;36002:56;36084:5;36077:12;;;;;35497:600;;;;:::o;20785:38::-;;;;:::o;20625:27::-;;;;;;;;;;;;;:::o;20700:40::-;;;;;;;;;;;;;:::o;35283:113::-;35345:4;35369:12;:19;35382:5;35369:19;;;;;;;;;;;;;;;;;;;;;;;;;35362:26;;35283:113;;;:::o;29556:188::-;29676:7;29708:11;:19;29720:6;29708:19;;;;;;;;;;;;;;;:28;29728:7;29708:28;;;;;;;;;;;;;;;;29701:35;;29556:188;;;;:::o;19787:35::-;;;;:::o;19829:36::-;;;;:::o;18199:111::-;17925:9;:7;:9::i;:::-;17917:18;;;;;;18274:28:::1;18293:8;18274:18;:28::i;:::-;18199:111:::0;:::o;20535:38::-;;;;;;;;;;;;;:::o;31571:352::-;17925:9;:7;:9::i;:::-;17917:18;;;;;;31685:4:::1;31667:23;;:6;:23;;;;:41;;;;;31704:4;;;;;;;;;;;31694:14;;:6;:14;;;;31667:41;31659:50;;;::::0;::::1;;31747:6;31720:16;:24;31737:6;31720:24;;;;;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;31770:6;31766:150;;;31793:11;;;;;;;;;;;:20;;;31814:6;31822:1;31793:31;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;31766:150;;;31857:11;;;;;;;;;;;:20;;;31878:6;31886:17;31896:6;31886:9;:17::i;:::-;31857:47;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;31766:150;31571:352:::0;;:::o;19353:42::-;;;:::o;20339:24::-;;;;:::o;1003:181::-;1061:7;1081:9;1097:1;1093;:5;;;;:::i;:::-;1081:17;;1122:1;1117;:6;;1109:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;1175:1;1168:8;;;1003:181;;;;:::o;1336:226::-;1456:7;1489:1;1484;:6;;1492:12;1476:29;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;1516:9;1532:1;1528;:5;;;;:::i;:::-;1516:17;;1553:1;1546:8;;;1336:226;;;;;:::o;24262:1376::-;24388:4;24421;;;;;;;;;;;24408:17;;:9;:17;;;24405:203;;24445:12;:23;24458:9;24445:23;;;;;;;;;;;;;;;;;;;;;;;;;24441:156;;24527:9;;24517:6;24496:7;:18;24504:9;24496:18;;;;;;;;;;;;;;;;:27;;;;:::i;:::-;:40;;24488:93;;;;;;;;;;;;:::i;:::-;;;;;;;;;24441:156;24405:203;24624:12;;;;;;;;;;;24620:130;;24660:12;:20;24673:6;24660:20;;;;;;;;;;;;;;;;;;;;;;;;;:47;;;;24684:12;:23;24697:9;24684:23;;;;;;;;;;;;;;;;;;;;;;;;;24660:47;24652:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;24620:130;24766:6;;;;;;;;;;;24762:87;;;24796:41;24811:6;24819:9;24830:6;24796:14;:41::i;:::-;24789:48;;;;24762:87;24865:16;:14;:16::i;:::-;24861:59;;;24898:10;:8;:10::i;:::-;24861:59;24950:27;24970:6;24950:7;:15;24958:6;24950:15;;;;;;;;;;;;;;;;:19;;:27;;;;:::i;:::-;24932:7;:15;24940:6;24932:15;;;;;;;;;;;;;;;:45;;;;24988:22;25013:32;25027:6;25035:9;25013:13;:32::i;:::-;:104;;25111:6;25013:104;;;25061:34;25069:6;25077:9;25088:6;25061:7;:34::i;:::-;25013:104;24988:129;;25149:62;25186:14;25149:7;:18;25157:9;25149:18;;;;;;;;;;;;;;;;:22;;:62;;;;:::i;:::-;25128:7;:18;25136:9;25128:18;;;;;;;;;;;;;;;:83;;;;25228:16;:24;25245:6;25228:24;;;;;;;;;;;;;;;;;;;;;;;;;25224:96;;25259:11;;;;;;;;;;;:20;;;25280:6;25288:17;25298:6;25288:9;:17::i;:::-;25259:47;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25255:63;25224:96;25334:16;:27;25351:9;25334:27;;;;;;;;;;;;;;;;;;;;;;;;;25330:105;;25368:11;;;;;;;;;;;:20;;;25389:9;25400:20;25410:9;25400;:20::i;:::-;25368:53;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25364:69;25330:105;25451:11;;;;;;;;;;;:19;;;25471:14;;25451:35;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25447:51;25559:9;25515:93;;25538:6;25515:93;;;25583:14;25515:93;;;;;;:::i;:::-;;;;;;;;25626:4;25619:11;;;24262:1376;;;;;;:::o;31072:303::-;31158:1;31148:6;:11;31140:20;;;;;;31189:7;:16;31197:7;31189:16;;;;;;;;;;;;;;;;31179:6;:26;;31171:35;;;;;;31232:24;31249:6;31232:12;;:16;;:24;;;;:::i;:::-;31217:12;:39;;;;31286:28;31307:6;31286:7;:16;31294:7;31286:16;;;;;;;;;;;;;;;;:20;;:28;;;;:::i;:::-;31267:7;:16;31275:7;31267:16;;;;;;;;;;;;;;;:47;;;;31356:1;31330:37;;31339:7;31330:37;;;31360:6;31330:37;;;;;;:::i;:::-;;;;;;;;31072:303;;:::o;1192:136::-;1250:7;1277:43;1281:1;1284;1277:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;1270:50;;1192:136;;;;:::o;18318:187::-;18412:1;18392:22;;:8;:22;;;18384:31;;;;;;18460:8;18431:38;;18452:6;;;;;;;;;;;18431:38;;;;;;;;;;;;18489:8;18480:6;;:17;;;;;;;;;;;;;;;;;;18318:187;:::o;24000:254::-;24118:4;24151:25;24169:6;24151:7;:13;24159:4;24151:13;;;;;;;;;;;;;;;;:17;;:25;;;;:::i;:::-;24135:7;:13;24143:4;24135:13;;;;;;;;;;;;;;;:41;;;;24201:23;24217:6;24201:7;:11;24209:2;24201:11;;;;;;;;;;;;;;;;:15;;:23;;;;:::i;:::-;24187:7;:11;24195:2;24187:11;;;;;;;;;;;;;;;:37;;;;24242:4;24235:11;;24000:254;;;;;:::o;29408:140::-;29457:4;29496:6;;;;;;;;;;;29495:7;:42;;;;;29533:4;;;;;;;;;;;29519:18;;:10;:18;;;;29495:42;29474:63;;29408:140;:::o;26663:2492::-;20925:4;20916:6;;:13;;;;;;;;;;;;;;;;;;26714:16:::1;26733:29;26750:11;;26733:12;;:16;;:29;;;;:::i;:::-;26714:48;;26790:1;26778:8;:13:::0;26775:57:::1;;26819:1;26808:12;;26775:57;26844:20;26867:7;:22;26883:4;26867:22;;;;;;;;;;;;;;;;26844:45;;26922:1;26906:12;:17:::0;26902:56:::1;;26940:7;;;;26902:56;27016:12;26970:11;:26;26990:4;26970:26;;;;;;;;;;;;;;;:43;27005:6;26970:43;;;;;;;;;;;;;;;:58;;;;27041:21;27079:1;27065:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27041:40;;27110:4;27092;27097:1;27092:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;::::0;::::1;27136:6;:11;;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27126:4;27131:1;27126:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;::::0;::::1;27170:28;27221:6;:57;;;27293:12;27320:1;27336:4;27363;27383:15;27221:188;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;27217:259:::0;::::1;;27451:4;27425:30;;27217:259;27488:21;27512;27488:45;;27546:22;27572:47;27597:21;;27572:20;;:24;;:47;;;;:::i;:::-;27546:74;;27633:25;27661:37;27681:16;;27661:15;;:19;;:37;;;;:::i;:::-;27633:65;;27711:23;27737:33;27755:14;;27737:13;;:17;;:33;;;;:::i;:::-;27711:59;;27783:28;27814:47;27852:8;27814:33;27832:14;27814:13;:17;;:33;;;;:::i;:::-;:37;;:47;;;;:::i;:::-;27783:78;;27874:24;27901:48;27940:8;27901:34;27919:15;27901:13;:17;;:34;;;;:::i;:::-;:38;;:48;;;;:::i;:::-;27874:75;;27962:26;27991:50;28032:8;27991:36;28009:17;27991:13;:17;;:36;;;;:::i;:::-;:40;;:50;;;;:::i;:::-;27962:79;;28054:24;28081:85;28147:18;28081:61;28121:20;28081:35;28099:16;28081:13;:17;;:35;;;;:::i;:::-;:39;;:61;;;;:::i;:::-;:65;;:85;;;;:::i;:::-;28054:112;;28179:26;28222:1;28208:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28179:45;;28250:6;:11;;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28235:9;28245:1;28235:12;;;;;;;;:::i;:::-;;;;;;;:28;;;;;;;;;::::0;::::1;19435:42;28274:9;28284:1;28274:12;;;;;;;;:::i;:::-;;;;;;;:29;;;;;;;;;::::0;::::1;28316:28;28367:6;:57;;;28432:18;28466:1;28482:9;20413:42;28525:15;28367:184;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;28363:255:::0;::::1;;28593:4;28567:30;;28363:255;28682:30;28735:11;;;;;;;;;;;:19;;;28762:20;28735:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;28731:123:::0;::::1;;28829:4;28801:32;;28731:123;28867:12;28885:15;;;;;;;;;;;:20;;28913:16;28885:49;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28866:68;;;28953:7;28945:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;29002:19;29027:15;;;;;;;;;;;:20;;29055:16;29027:49;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29001:75;;;29095:14;29087:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;26701:2454;;;;;;;;;;;;;;;;;20940:1;20961:5:::0;20952:6;;:14;;;;;;;;;;;;;;;;;;26663:2492::o;29163:237::-;29262:4;29314;29306:12;;:4;;;;;;;;;;;:12;;;:26;;;;29330:2;29322:10;;:4;;;;;;;;;;;:10;;;29306:26;29305:87;;;;;29352:12;:18;29365:4;29352:18;;;;;;;;;;;;;;;;;;;;;;;;;29351:19;:40;;;;29375:12;:16;29388:2;29375:16;;;;;;;;;;;;;;;;;;;;;;;;;29374:17;29351:40;29305:87;29284:108;;29163:237;;;;:::o;25646:1009::-;25767:7;25787:17;25807:11;;25787:31;;25848:4;;;;;;;;;;;25835:17;;:9;:17;;;25831:74;;25881:12;;25869:24;;25831:74;26001:4;25973:32;;:24;25987:9;25973:13;:24::i;:::-;:32;;;25969:272;;26105:4;;;;;;;;;;;26095:14;;:6;:14;;;26091:139;;26145:1;26133:9;:13;26130:85;;;26178:17;26192:2;26178:9;:13;;:17;;;;:::i;:::-;26166:29;;26130:85;26091:139;25969:272;26253:17;26273:41;20229:4;26273:21;26284:9;26273:6;:10;;:21;;;;:::i;:::-;:25;;:41;;;;:::i;:::-;26253:61;;26328:12;:20;26341:6;26328:20;;;;;;;;;;;;;;;;;;;;;;;;;:47;;;;26352:12;:23;26365:9;26352:23;;;;;;;;;;;;;;;;;;;;;;;;;26328:47;26325:91;;;26403:1;26391:13;;26325:91;26460:37;26487:9;26460:7;:22;26476:4;26460:22;;;;;;;;;;;;;;;;:26;;:37;;;;:::i;:::-;26435:7;:22;26451:4;26435:22;;;;;;;;;;;;;;;:62;;;;26533:1;26521:9;:13;26518:91;;;26580:4;26555:42;;26564:6;26555:42;;;26587:9;26555:42;;;;;;:::i;:::-;;;;;;;;26518:91;26626:21;26637:9;26626:6;:10;;:21;;;;:::i;:::-;26619:28;;;;25646:1009;;;;;:::o;1570:250::-;1628:7;1657:1;1652;:6;1648:47;;1682:1;1675:8;;;;1648:47;1707:9;1723:1;1719;:5;;;;:::i;:::-;1707:17;;1752:1;1747;1743;:5;;;;:::i;:::-;:10;1735:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;1811:1;1804:8;;;1570:250;;;;;:::o;1828:132::-;1886:7;1913:39;1917:1;1920;1913:39;;;;;;;;;;;;;;;;;:3;:39::i;:::-;1906:46;;1828:132;;;;:::o;1968:225::-;2088:7;2120:1;2116;:5;2123:12;2108:28;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;2147:9;2163:1;2159;:5;;;;:::i;:::-;2147:17;;2184:1;2177:8;;;1968:225;;;;;:::o;7:77:1:-;44:7;73:5;62:16;;7:77;;;:::o;90:118::-;177:24;195:5;177:24;:::i;:::-;172:3;165:37;90:118;;:::o;214:222::-;307:4;345:2;334:9;330:18;322:26;;358:71;426:1;415:9;411:17;402:6;358:71;:::i;:::-;214:222;;;;:::o;442:99::-;494:6;528:5;522:12;512:22;;442:99;;;:::o;547:169::-;631:11;665:6;660:3;653:19;705:4;700:3;696:14;681:29;;547:169;;;;:::o;722:246::-;803:1;813:113;827:6;824:1;821:13;813:113;;;912:1;907:3;903:11;897:18;893:1;888:3;884:11;877:39;849:2;846:1;842:10;837:15;;813:113;;;960:1;951:6;946:3;942:16;935:27;784:184;722:246;;;:::o;974:102::-;1015:6;1066:2;1062:7;1057:2;1050:5;1046:14;1042:28;1032:38;;974:102;;;:::o;1082:377::-;1170:3;1198:39;1231:5;1198:39;:::i;:::-;1253:71;1317:6;1312:3;1253:71;:::i;:::-;1246:78;;1333:65;1391:6;1386:3;1379:4;1372:5;1368:16;1333:65;:::i;:::-;1423:29;1445:6;1423:29;:::i;:::-;1418:3;1414:39;1407:46;;1174:285;1082:377;;;;:::o;1465:313::-;1578:4;1616:2;1605:9;1601:18;1593:26;;1665:9;1659:4;1655:20;1651:1;1640:9;1636:17;1629:47;1693:78;1766:4;1757:6;1693:78;:::i;:::-;1685:86;;1465:313;;;;:::o;1865:117::-;1974:1;1971;1964:12;2111:126;2148:7;2188:42;2181:5;2177:54;2166:65;;2111:126;;;:::o;2243:96::-;2280:7;2309:24;2327:5;2309:24;:::i;:::-;2298:35;;2243:96;;;:::o;2345:122::-;2418:24;2436:5;2418:24;:::i;:::-;2411:5;2408:35;2398:63;;2457:1;2454;2447:12;2398:63;2345:122;:::o;2473:139::-;2519:5;2557:6;2544:20;2535:29;;2573:33;2600:5;2573:33;:::i;:::-;2473:139;;;;:::o;2618:329::-;2677:6;2726:2;2714:9;2705:7;2701:23;2697:32;2694:119;;;2732:79;;:::i;:::-;2694:119;2852:1;2877:53;2922:7;2913:6;2902:9;2898:22;2877:53;:::i;:::-;2867:63;;2823:117;2618:329;;;;:::o;2953:122::-;3026:24;3044:5;3026:24;:::i;:::-;3019:5;3016:35;3006:63;;3065:1;3062;3055:12;3006:63;2953:122;:::o;3081:139::-;3127:5;3165:6;3152:20;3143:29;;3181:33;3208:5;3181:33;:::i;:::-;3081:139;;;;:::o;3226:474::-;3294:6;3302;3351:2;3339:9;3330:7;3326:23;3322:32;3319:119;;;3357:79;;:::i;:::-;3319:119;3477:1;3502:53;3547:7;3538:6;3527:9;3523:22;3502:53;:::i;:::-;3492:63;;3448:117;3604:2;3630:53;3675:7;3666:6;3655:9;3651:22;3630:53;:::i;:::-;3620:63;;3575:118;3226:474;;;;;:::o;3706:90::-;3740:7;3783:5;3776:13;3769:21;3758:32;;3706:90;;;:::o;3802:109::-;3883:21;3898:5;3883:21;:::i;:::-;3878:3;3871:34;3802:109;;:::o;3917:210::-;4004:4;4042:2;4031:9;4027:18;4019:26;;4055:65;4117:1;4106:9;4102:17;4093:6;4055:65;:::i;:::-;3917:210;;;;:::o;4133:765::-;4219:6;4227;4235;4243;4292:3;4280:9;4271:7;4267:23;4263:33;4260:120;;;4299:79;;:::i;:::-;4260:120;4419:1;4444:53;4489:7;4480:6;4469:9;4465:22;4444:53;:::i;:::-;4434:63;;4390:117;4546:2;4572:53;4617:7;4608:6;4597:9;4593:22;4572:53;:::i;:::-;4562:63;;4517:118;4674:2;4700:53;4745:7;4736:6;4725:9;4721:22;4700:53;:::i;:::-;4690:63;;4645:118;4802:2;4828:53;4873:7;4864:6;4853:9;4849:22;4828:53;:::i;:::-;4818:63;;4773:118;4133:765;;;;;;;:::o;4904:104::-;4949:7;4978:24;4996:5;4978:24;:::i;:::-;4967:35;;4904:104;;;:::o;5014:142::-;5117:32;5143:5;5117:32;:::i;:::-;5112:3;5105:45;5014:142;;:::o;5162:254::-;5271:4;5309:2;5298:9;5294:18;5286:26;;5322:87;5406:1;5395:9;5391:17;5382:6;5322:87;:::i;:::-;5162:254;;;;:::o;5422:619::-;5499:6;5507;5515;5564:2;5552:9;5543:7;5539:23;5535:32;5532:119;;;5570:79;;:::i;:::-;5532:119;5690:1;5715:53;5760:7;5751:6;5740:9;5736:22;5715:53;:::i;:::-;5705:63;;5661:117;5817:2;5843:53;5888:7;5879:6;5868:9;5864:22;5843:53;:::i;:::-;5833:63;;5788:118;5945:2;5971:53;6016:7;6007:6;5996:9;5992:22;5971:53;:::i;:::-;5961:63;;5916:118;5422:619;;;;;:::o;6047:474::-;6115:6;6123;6172:2;6160:9;6151:7;6147:23;6143:32;6140:119;;;6178:79;;:::i;:::-;6140:119;6298:1;6323:53;6368:7;6359:6;6348:9;6344:22;6323:53;:::i;:::-;6313:63;;6269:117;6425:2;6451:53;6496:7;6487:6;6476:9;6472:22;6451:53;:::i;:::-;6441:63;;6396:118;6047:474;;;;;:::o;6527:86::-;6562:7;6602:4;6595:5;6591:16;6580:27;;6527:86;;;:::o;6619:112::-;6702:22;6718:5;6702:22;:::i;:::-;6697:3;6690:35;6619:112;;:::o;6737:214::-;6826:4;6864:2;6853:9;6849:18;6841:26;;6877:67;6941:1;6930:9;6926:17;6917:6;6877:67;:::i;:::-;6737:214;;;;:::o;6957:329::-;7016:6;7065:2;7053:9;7044:7;7040:23;7036:32;7033:119;;;7071:79;;:::i;:::-;7033:119;7191:1;7216:53;7261:7;7252:6;7241:9;7237:22;7216:53;:::i;:::-;7206:63;;7162:117;6957:329;;;;:::o;7292:474::-;7360:6;7368;7417:2;7405:9;7396:7;7392:23;7388:32;7385:119;;;7423:79;;:::i;:::-;7385:119;7543:1;7568:53;7613:7;7604:6;7593:9;7589:22;7568:53;:::i;:::-;7558:63;;7514:117;7670:2;7696:53;7741:7;7732:6;7721:9;7717:22;7696:53;:::i;:::-;7686:63;;7641:118;7292:474;;;;;:::o;7772:60::-;7800:3;7821:5;7814:12;;7772:60;;;:::o;7838:142::-;7888:9;7921:53;7939:34;7948:24;7966:5;7948:24;:::i;:::-;7939:34;:::i;:::-;7921:53;:::i;:::-;7908:66;;7838:142;;;:::o;7986:126::-;8036:9;8069:37;8100:5;8069:37;:::i;:::-;8056:50;;7986:126;;;:::o;8118:148::-;8190:9;8223:37;8254:5;8223:37;:::i;:::-;8210:50;;8118:148;;;:::o;8272:175::-;8381:59;8434:5;8381:59;:::i;:::-;8376:3;8369:72;8272:175;;:::o;8453:266::-;8568:4;8606:2;8595:9;8591:18;8583:26;;8619:93;8709:1;8698:9;8694:17;8685:6;8619:93;:::i;:::-;8453:266;;;;:::o;8725:140::-;8789:9;8822:37;8853:5;8822:37;:::i;:::-;8809:50;;8725:140;;;:::o;8871:159::-;8972:51;9017:5;8972:51;:::i;:::-;8967:3;8960:64;8871:159;;:::o;9036:250::-;9143:4;9181:2;9170:9;9166:18;9158:26;;9194:85;9276:1;9265:9;9261:17;9252:6;9194:85;:::i;:::-;9036:250;;;;:::o;9292:118::-;9379:24;9397:5;9379:24;:::i;:::-;9374:3;9367:37;9292:118;;:::o;9416:222::-;9509:4;9547:2;9536:9;9532:18;9524:26;;9560:71;9628:1;9617:9;9613:17;9604:6;9560:71;:::i;:::-;9416:222;;;;:::o;9644:116::-;9714:21;9729:5;9714:21;:::i;:::-;9707:5;9704:32;9694:60;;9750:1;9747;9740:12;9694:60;9644:116;:::o;9766:133::-;9809:5;9847:6;9834:20;9825:29;;9863:30;9887:5;9863:30;:::i;:::-;9766:133;;;;:::o;9905:468::-;9970:6;9978;10027:2;10015:9;10006:7;10002:23;9998:32;9995:119;;;10033:79;;:::i;:::-;9995:119;10153:1;10178:53;10223:7;10214:6;10203:9;10199:22;10178:53;:::i;:::-;10168:63;;10124:117;10280:2;10306:50;10348:7;10339:6;10328:9;10324:22;10306:50;:::i;:::-;10296:60;;10251:115;9905:468;;;;;:::o;10379:153::-;10456:9;10489:37;10520:5;10489:37;:::i;:::-;10476:50;;10379:153;;;:::o;10538:185::-;10652:64;10710:5;10652:64;:::i;:::-;10647:3;10640:77;10538:185;;:::o;10729:276::-;10849:4;10887:2;10876:9;10872:18;10864:26;;10900:98;10995:1;10984:9;10980:17;10971:6;10900:98;:::i;:::-;10729:276;;;;:::o;11011:180::-;11059:77;11056:1;11049:88;11156:4;11153:1;11146:15;11180:4;11177:1;11170:15;11197:320;11241:6;11278:1;11272:4;11268:12;11258:22;;11325:1;11319:4;11315:12;11346:18;11336:81;;11402:4;11394:6;11390:17;11380:27;;11336:81;11464:2;11456:6;11453:14;11433:18;11430:38;11427:84;;11483:18;;:::i;:::-;11427:84;11248:269;11197:320;;;:::o;11523:179::-;11663:31;11659:1;11651:6;11647:14;11640:55;11523:179;:::o;11708:366::-;11850:3;11871:67;11935:2;11930:3;11871:67;:::i;:::-;11864:74;;11947:93;12036:3;11947:93;:::i;:::-;12065:2;12060:3;12056:12;12049:19;;11708:366;;;:::o;12080:419::-;12246:4;12284:2;12273:9;12269:18;12261:26;;12333:9;12327:4;12323:20;12319:1;12308:9;12304:17;12297:47;12361:131;12487:4;12361:131;:::i;:::-;12353:139;;12080:419;;;:::o;12505:553::-;12682:4;12720:3;12709:9;12705:19;12697:27;;12734:71;12802:1;12791:9;12787:17;12778:6;12734:71;:::i;:::-;12815:72;12883:2;12872:9;12868:18;12859:6;12815:72;:::i;:::-;12897;12965:2;12954:9;12950:18;12941:6;12897:72;:::i;:::-;12979;13047:2;13036:9;13032:18;13023:6;12979:72;:::i;:::-;12505:553;;;;;;;:::o;13064:332::-;13185:4;13223:2;13212:9;13208:18;13200:26;;13236:71;13304:1;13293:9;13289:17;13280:6;13236:71;:::i;:::-;13317:72;13385:2;13374:9;13370:18;13361:6;13317:72;:::i;:::-;13064:332;;;;;:::o;13402:143::-;13459:5;13490:6;13484:13;13475:22;;13506:33;13533:5;13506:33;:::i;:::-;13402:143;;;;:::o;13551:351::-;13621:6;13670:2;13658:9;13649:7;13645:23;13641:32;13638:119;;;13676:79;;:::i;:::-;13638:119;13796:1;13821:64;13877:7;13868:6;13857:9;13853:22;13821:64;:::i;:::-;13811:74;;13767:128;13551:351;;;;:::o;13908:332::-;14029:4;14067:2;14056:9;14052:18;14044:26;;14080:71;14148:1;14137:9;14133:17;14124:6;14080:71;:::i;:::-;14161:72;14229:2;14218:9;14214:18;14205:6;14161:72;:::i;:::-;13908:332;;;;;:::o;14246:137::-;14300:5;14331:6;14325:13;14316:22;;14347:30;14371:5;14347:30;:::i;:::-;14246:137;;;;:::o;14389:345::-;14456:6;14505:2;14493:9;14484:7;14480:23;14476:32;14473:119;;;14511:79;;:::i;:::-;14473:119;14631:1;14656:61;14709:7;14700:6;14689:9;14685:22;14656:61;:::i;:::-;14646:71;;14602:125;14389:345;;;;:::o;14740:240::-;14880:34;14876:1;14868:6;14864:14;14857:58;14949:23;14944:2;14936:6;14932:15;14925:48;14740:240;:::o;14986:366::-;15128:3;15149:67;15213:2;15208:3;15149:67;:::i;:::-;15142:74;;15225:93;15314:3;15225:93;:::i;:::-;15343:2;15338:3;15334:12;15327:19;;14986:366;;;:::o;15358:419::-;15524:4;15562:2;15551:9;15547:18;15539:26;;15611:9;15605:4;15601:20;15597:1;15586:9;15582:17;15575:47;15639:131;15765:4;15639:131;:::i;:::-;15631:139;;15358:419;;;:::o;15783:180::-;15831:77;15828:1;15821:88;15928:4;15925:1;15918:15;15952:4;15949:1;15942:15;15969:410;16009:7;16032:20;16050:1;16032:20;:::i;:::-;16027:25;;16066:20;16084:1;16066:20;:::i;:::-;16061:25;;16121:1;16118;16114:9;16143:30;16161:11;16143:30;:::i;:::-;16132:41;;16322:1;16313:7;16309:15;16306:1;16303:22;16283:1;16276:9;16256:83;16233:139;;16352:18;;:::i;:::-;16233:139;16017:362;15969:410;;;;:::o;16385:180::-;16433:77;16430:1;16423:88;16530:4;16527:1;16520:15;16554:4;16551:1;16544:15;16571:185;16611:1;16628:20;16646:1;16628:20;:::i;:::-;16623:25;;16662:20;16680:1;16662:20;:::i;:::-;16657:25;;16701:1;16691:35;;16706:18;;:::i;:::-;16691:35;16748:1;16745;16741:9;16736:14;;16571:185;;;;:::o;16762:179::-;16902:31;16898:1;16890:6;16886:14;16879:55;16762:179;:::o;16947:366::-;17089:3;17110:67;17174:2;17169:3;17110:67;:::i;:::-;17103:74;;17186:93;17275:3;17186:93;:::i;:::-;17304:2;17299:3;17295:12;17288:19;;16947:366;;;:::o;17319:419::-;17485:4;17523:2;17512:9;17508:18;17500:26;;17572:9;17566:4;17562:20;17558:1;17547:9;17543:17;17536:47;17600:131;17726:4;17600:131;:::i;:::-;17592:139;;17319:419;;;:::o;17744:332::-;17865:4;17903:2;17892:9;17888:18;17880:26;;17916:71;17984:1;17973:9;17969:17;17960:6;17916:71;:::i;:::-;17997:72;18065:2;18054:9;18050:18;18041:6;17997:72;:::i;:::-;17744:332;;;;;:::o;18082:181::-;18222:33;18218:1;18210:6;18206:14;18199:57;18082:181;:::o;18269:366::-;18411:3;18432:67;18496:2;18491:3;18432:67;:::i;:::-;18425:74;;18508:93;18597:3;18508:93;:::i;:::-;18626:2;18621:3;18617:12;18610:19;;18269:366;;;:::o;18641:419::-;18807:4;18845:2;18834:9;18830:18;18822:26;;18894:9;18888:4;18884:20;18880:1;18869:9;18865:17;18858:47;18922:131;19048:4;18922:131;:::i;:::-;18914:139;;18641:419;;;:::o;19066:98::-;19117:6;19151:5;19145:12;19135:22;;19066:98;;;:::o;19170:147::-;19271:11;19308:3;19293:18;;19170:147;;;;:::o;19323:386::-;19427:3;19455:38;19487:5;19455:38;:::i;:::-;19509:88;19590:6;19585:3;19509:88;:::i;:::-;19502:95;;19606:65;19664:6;19659:3;19652:4;19645:5;19641:16;19606:65;:::i;:::-;19696:6;19691:3;19687:16;19680:23;;19431:278;19323:386;;;;:::o;19715:271::-;19845:3;19867:93;19956:3;19947:6;19867:93;:::i;:::-;19860:100;;19977:3;19970:10;;19715:271;;;;:::o;19992:85::-;20037:7;20066:5;20055:16;;19992:85;;;:::o;20083:158::-;20141:9;20174:61;20192:42;20201:32;20227:5;20201:32;:::i;:::-;20192:42;:::i;:::-;20174:61;:::i;:::-;20161:74;;20083:158;;;:::o;20247:147::-;20342:45;20381:5;20342:45;:::i;:::-;20337:3;20330:58;20247:147;;:::o;20400:348::-;20529:4;20567:2;20556:9;20552:18;20544:26;;20580:71;20648:1;20637:9;20633:17;20624:6;20580:71;:::i;:::-;20661:80;20737:2;20726:9;20722:18;20713:6;20661:80;:::i;:::-;20400:348;;;;;:::o;20754:191::-;20794:3;20813:20;20831:1;20813:20;:::i;:::-;20808:25;;20847:20;20865:1;20847:20;:::i;:::-;20842:25;;20890:1;20887;20883:9;20876:16;;20911:3;20908:1;20905:10;20902:36;;;20918:18;;:::i;:::-;20902:36;20754:191;;;;:::o;20951:177::-;21091:29;21087:1;21079:6;21075:14;21068:53;20951:177;:::o;21134:366::-;21276:3;21297:67;21361:2;21356:3;21297:67;:::i;:::-;21290:74;;21373:93;21462:3;21373:93;:::i;:::-;21491:2;21486:3;21482:12;21475:19;;21134:366;;;:::o;21506:419::-;21672:4;21710:2;21699:9;21695:18;21687:26;;21759:9;21753:4;21749:20;21745:1;21734:9;21730:17;21723:47;21787:131;21913:4;21787:131;:::i;:::-;21779:139;;21506:419;;;:::o;21931:194::-;21971:4;21991:20;22009:1;21991:20;:::i;:::-;21986:25;;22025:20;22043:1;22025:20;:::i;:::-;22020:25;;22069:1;22066;22062:9;22054:17;;22093:1;22087:4;22084:11;22081:37;;;22098:18;;:::i;:::-;22081:37;21931:194;;;;:::o;22131:227::-;22271:34;22267:1;22259:6;22255:14;22248:58;22340:10;22335:2;22327:6;22323:15;22316:35;22131:227;:::o;22364:366::-;22506:3;22527:67;22591:2;22586:3;22527:67;:::i;:::-;22520:74;;22603:93;22692:3;22603:93;:::i;:::-;22721:2;22716:3;22712:12;22705:19;;22364:366;;;:::o;22736:419::-;22902:4;22940:2;22929:9;22925:18;22917:26;;22989:9;22983:4;22979:20;22975:1;22964:9;22960:17;22953:47;23017:131;23143:4;23017:131;:::i;:::-;23009:139;;22736:419;;;:::o;23161:176::-;23301:28;23297:1;23289:6;23285:14;23278:52;23161:176;:::o;23343:366::-;23485:3;23506:67;23570:2;23565:3;23506:67;:::i;:::-;23499:74;;23582:93;23671:3;23582:93;:::i;:::-;23700:2;23695:3;23691:12;23684:19;;23343:366;;;:::o;23715:419::-;23881:4;23919:2;23908:9;23904:18;23896:26;;23968:9;23962:4;23958:20;23954:1;23943:9;23939:17;23932:47;23996:131;24122:4;23996:131;:::i;:::-;23988:139;;23715:419;;;:::o;24140:180::-;24188:77;24185:1;24178:88;24285:4;24282:1;24275:15;24309:4;24306:1;24299:15;24326:180;24374:77;24371:1;24364:88;24471:4;24468:1;24461:15;24495:4;24492:1;24485:15;24512:143;24569:5;24600:6;24594:13;24585:22;;24616:33;24643:5;24616:33;:::i;:::-;24512:143;;;;:::o;24661:351::-;24731:6;24780:2;24768:9;24759:7;24755:23;24751:32;24748:119;;;24786:79;;:::i;:::-;24748:119;24906:1;24931:64;24987:7;24978:6;24967:9;24963:22;24931:64;:::i;:::-;24921:74;;24877:128;24661:351;;;;:::o;25018:114::-;25085:6;25119:5;25113:12;25103:22;;25018:114;;;:::o;25138:184::-;25237:11;25271:6;25266:3;25259:19;25311:4;25306:3;25302:14;25287:29;;25138:184;;;;:::o;25328:132::-;25395:4;25418:3;25410:11;;25448:4;25443:3;25439:14;25431:22;;25328:132;;;:::o;25466:108::-;25543:24;25561:5;25543:24;:::i;:::-;25538:3;25531:37;25466:108;;:::o;25580:179::-;25649:10;25670:46;25712:3;25704:6;25670:46;:::i;:::-;25748:4;25743:3;25739:14;25725:28;;25580:179;;;;:::o;25765:113::-;25835:4;25867;25862:3;25858:14;25850:22;;25765:113;;;:::o;25914:732::-;26033:3;26062:54;26110:5;26062:54;:::i;:::-;26132:86;26211:6;26206:3;26132:86;:::i;:::-;26125:93;;26242:56;26292:5;26242:56;:::i;:::-;26321:7;26352:1;26337:284;26362:6;26359:1;26356:13;26337:284;;;26438:6;26432:13;26465:63;26524:3;26509:13;26465:63;:::i;:::-;26458:70;;26551:60;26604:6;26551:60;:::i;:::-;26541:70;;26397:224;26384:1;26381;26377:9;26372:14;;26337:284;;;26341:14;26637:3;26630:10;;26038:608;;;25914:732;;;;:::o;26652:831::-;26915:4;26953:3;26942:9;26938:19;26930:27;;26967:71;27035:1;27024:9;27020:17;27011:6;26967:71;:::i;:::-;27048:80;27124:2;27113:9;27109:18;27100:6;27048:80;:::i;:::-;27175:9;27169:4;27165:20;27160:2;27149:9;27145:18;27138:48;27203:108;27306:4;27297:6;27203:108;:::i;:::-;27195:116;;27321:72;27389:2;27378:9;27374:18;27365:6;27321:72;:::i;:::-;27403:73;27471:3;27460:9;27456:19;27447:6;27403:73;:::i;:::-;26652:831;;;;;;;;:::o;27489:720::-;27724:4;27762:3;27751:9;27747:19;27739:27;;27776:79;27852:1;27841:9;27837:17;27828:6;27776:79;:::i;:::-;27902:9;27896:4;27892:20;27887:2;27876:9;27872:18;27865:48;27930:108;28033:4;28024:6;27930:108;:::i;:::-;27922:116;;28048:72;28116:2;28105:9;28101:18;28092:6;28048:72;:::i;:::-;28130;28198:2;28187:9;28183:18;28174:6;28130:72;:::i;:::-;27489:720;;;;;;;:::o;28215:114::-;;:::o;28335:398::-;28494:3;28515:83;28596:1;28591:3;28515:83;:::i;:::-;28508:90;;28607:93;28696:3;28607:93;:::i;:::-;28725:1;28720:3;28716:11;28709:18;;28335:398;;;:::o;28739:379::-;28923:3;28945:147;29088:3;28945:147;:::i;:::-;28938:154;;29109:3;29102:10;;28739:379;;;:::o;29124:173::-;29264:25;29260:1;29252:6;29248:14;29241:49;29124:173;:::o;29303:366::-;29445:3;29466:67;29530:2;29525:3;29466:67;:::i;:::-;29459:74;;29542:93;29631:3;29542:93;:::i;:::-;29660:2;29655:3;29651:12;29644:19;;29303:366;;;:::o;29675:419::-;29841:4;29879:2;29868:9;29864:18;29856:26;;29928:9;29922:4;29918:20;29914:1;29903:9;29899:17;29892:47;29956:131;30082:4;29956:131;:::i;:::-;29948:139;;29675:419;;;:::o;30100:173::-;30240:25;30236:1;30228:6;30224:14;30217:49;30100:173;:::o;30279:366::-;30421:3;30442:67;30506:2;30501:3;30442:67;:::i;:::-;30435:74;;30518:93;30607:3;30518:93;:::i;:::-;30636:2;30631:3;30627:12;30620:19;;30279:366;;;:::o;30651:419::-;30817:4;30855:2;30844:9;30840:18;30832:26;;30904:9;30898:4;30894:20;30890:1;30879:9;30875:17;30868:47;30932:131;31058:4;30932:131;:::i;:::-;30924:139;;30651:419;;;:::o;31076:220::-;31216:34;31212:1;31204:6;31200:14;31193:58;31285:3;31280:2;31272:6;31268:15;31261:28;31076:220;:::o;31302:366::-;31444:3;31465:67;31529:2;31524:3;31465:67;:::i;:::-;31458:74;;31541:93;31630:3;31541:93;:::i;:::-;31659:2;31654:3;31650:12;31643:19;;31302:366;;;:::o;31674:419::-;31840:4;31878:2;31867:9;31863:18;31855:26;;31927:9;31921:4;31917:20;31913:1;31902:9;31898:17;31891:47;31955:131;32081:4;31955:131;:::i;:::-;31947:139;;31674:419;;;:::o

Swarm Source

ipfs://397dd1f0989f8cde92222d80a145364586dec6bcd4964e4fe96fed1da3d4da3c
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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