ETH Price: $3,602.35 (+5.15%)

Token

OATH DAO (OATH)
 

Overview

Max Total Supply

4,253,520,616,828,560,691,385,581,067,209,847.559060592421370767 OATH

Holders

43

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
OATHDAO

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-02-23
*/

/**
 Decentralized Applications Built For Oath

 https://www.oathdao.io/

 https://t.me/OATHDAO

 https://twitter.com/oathdaoio
*/

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

interface IERC20 {
    function totalSupply() external view returns (uint256);
    function balanceOf(address account) external view returns (uint256);
    function transfer(address to, 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 from,
        address to,
        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 IERC20Metadata is IERC20 {
    function name() external view returns (string memory);
    function symbol() external view returns (string memory);
    function decimals() external view returns (uint8);
}

contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

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

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

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

    function decimals() public view virtual override returns (uint8) {
        return 18;
    }

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

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

    function transfer(address to, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _transfer(owner, to, amount);
        return true;
    }

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

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

    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public virtual override returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, amount);
        _transfer(from, to, amount);
        return true;
    }

    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, _allowances[owner][spender] + addedValue);
        return true;
    }

    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        address owner = _msgSender();
        uint256 currentAllowance = _allowances[owner][spender];
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(owner, spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(from, to, amount);

        uint256 fromBalance = _balances[from];
        require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[from] = fromBalance - amount;
        }
        _balances[to] += amount;

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, amount);
    }

    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _beforeTokenTransfer(address(0), account, amount);

        _totalSupply += amount;
        _balances[account] += amount;
        emit Transfer(address(0), account, amount);

        _afterTokenTransfer(address(0), account, amount);
    }

    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

        _beforeTokenTransfer(account, address(0), amount);

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
        }
        _totalSupply -= amount;

        emit Transfer(account, address(0), amount);

        _afterTokenTransfer(account, address(0), amount);
    }

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

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

    function _spendAllowance(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance != type(uint256).max) {
            require(currentAllowance >= amount, "ERC20: insufficient allowance");
            unchecked {
                _approve(owner, spender, currentAllowance - amount);
            }
        }
    }

    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}

    function _afterTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}
}

interface IUniswapV2Factory {
    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 IUniswapV2Pair {
    event Approval(address indexed owner, address indexed spender, uint value);
    event Transfer(address indexed from, address indexed to, uint value);

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

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

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

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

    event Mint(address indexed sender, uint amount0, uint amount1);
    event Burn(address indexed sender, uint amount0, uint amount1, address indexed to);
    event Swap(
        address indexed sender,
        uint amount0In,
        uint amount1In,
        uint amount0Out,
        uint amount1Out,
        address indexed to
    );
    event Sync(uint112 reserve0, uint112 reserve1);

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

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

    function initialize(address, address) external;
}

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

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

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

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

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

abstract contract Ownable is Context {
    address private _owner;

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

    constructor() {
        _transferOwnership(_msgSender());
    }

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

    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

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

    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

library SafeMath {
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

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

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

    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

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

contract OATHDAO is ERC20, Ownable {
    using SafeMath for uint256;

    IUniswapV2Router02 private uniswapV2Router;
    address private uniswapV2Pair;

    bool private _swapping;

    address private _teamWallet;
    address private _treasuryWallet;
    
    uint256 public maxTransactionAmount;
    uint256 public maxWallet;

    uint256 public swapTokensThreshold;
        
    bool public limitsInEffect = true;

    uint256 public totalFees;
    uint256 private _marketingFee;
    uint256 private _liquidityFee;
    uint256 private _stakingFee;
    
    uint256 private _tokensForMarketing;
    uint256 private _tokensForLiquidity;
    uint256 private _tokensForStaking;
 
    uint256 public totalStaked;
    address public stakingToken;
    address public rewardToken;
    uint256 [] public stakingEmissionRate;

    bool public stakingEnabled = false;
    uint256 public totalClaimed;

    struct StakingPool {
        uint256 creationTime;
        uint256 staked;
    }

    struct Staker {
        address staker;
        uint256 start;
        uint256 staked;
        uint256 earned;
    }

    struct ClaimHistory {
        uint256[] dates;
        uint256[] amounts;
    }

    // exlcude from fees and max transaction amount
    mapping (address => bool) private _isExcludedFromFees;
    mapping (address => bool) private _isExcludedMaxTransactionAmount;

    // store addresses that a automatic market maker pairs. Any transfer *to* these addresses
    // could be subject to a maximum transfer amount
    mapping (address => bool) private _automatedMarketMakerPairs;

    // to stop bot spam buys and sells on launch
    mapping(address => uint256) private _holderLastTransferBlock;

    // stake data
    mapping(address => mapping(uint256 => Staker)) private _stakers;
    mapping(address => ClaimHistory) private _claimHistory;
    StakingPool[] public stakingPools;

    /**
     * @dev Throws if called by any account other than the _teamWallet
     */
    modifier teamOROwner() {
        require(_teamWallet == _msgSender() || 
        owner() == _msgSender(), "Caller is not the _teamWallet address nor owner.");
        _;
    }

    modifier isStakingEnabled() {
        require(stakingEnabled, "OATH DAO : Staking is not enabled.");
        _;
    }

    constructor() ERC20("OATH DAO", "OATH") payable {
        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
        
        _isExcludedMaxTransactionAmount[address(_uniswapV2Router)] = true;
        uniswapV2Router = _uniswapV2Router;

        uint256 marketingFee = 2;
        uint256 liquidityFee = 0;
        uint256 stakingFee = 2;
        uint256 totalSupply = 5e11 * 1e18;
        stakingEmissionRate.push(180);
        maxTransactionAmount = totalSupply * 2 / 100;
        maxWallet = totalSupply * 2 / 100;
        swapTokensThreshold = totalSupply * 1 / 1000;
        
        _marketingFee = marketingFee;
        _liquidityFee = liquidityFee;
        _stakingFee = stakingFee;
        totalFees = _marketingFee + _liquidityFee + _stakingFee;

        _treasuryWallet = 0xFEFa516D3799e018329004d32E4b3B97e497736a;
        _teamWallet = owner();

        // exclude from paying fees or having max transaction amount
        excludeFromFees(owner(), true);
        excludeFromFees(address(this), true);
        excludeFromFees(address(0xdead), true);
        
        _isExcludedMaxTransactionAmount[owner()] = true;
        _isExcludedMaxTransactionAmount[address(this)] = true;
        _isExcludedMaxTransactionAmount[address(0xdead)] = true;
        
        stakingToken = address(this);
        rewardToken = address(this);

        _mint(address(this), totalSupply);
    }

    /**
    * @dev Once live, can never be switched off
    */
    function liveTrading() external onlyOwner {
        uniswapV2Pair = IUniswapV2Factory(uniswapV2Router.factory()).createPair(address(this), uniswapV2Router.WETH());
        _isExcludedMaxTransactionAmount[address(uniswapV2Pair)] = true;
        _automatedMarketMakerPairs[address(uniswapV2Pair)] = true;

        _approve(address(this), address(uniswapV2Router), balanceOf(address(this)));
        uniswapV2Router.addLiquidityETH{value: address(this).balance} (
            address(this),
            balanceOf(address(this)),
            0,
            0,
            owner(),
            block.timestamp
        );
    }

    /**
    * @dev Remove limits after token is somewhat stable
    */
    function removeLimits() external onlyOwner {
        limitsInEffect = false;
    }

    /**
    * @dev Exclude from fee calculation
    */
    function excludeFromFees(address account, bool excluded) public onlyOwner {
        _isExcludedFromFees[account] = excluded;
    }
    
    /**
    * @dev Update token fees (max set to initial fee)
    */
    function updateFees(uint256 marketingFee, uint256 liquidityFee, uint256 stakingFee) external onlyOwner {
        _marketingFee = marketingFee;
        _liquidityFee = liquidityFee;
        _stakingFee = stakingFee;

        totalFees = _marketingFee + _liquidityFee + _stakingFee;

        require(totalFees <= 10, "OATH DAO  : Must keep fees at 10% or less");
    }

    function setupStakingRewardsRate(uint256 _stakingEmissionRate) external teamOROwner {
        require (_stakingEmissionRate != 0, "OATH DAO : can not update stakingEmissionRate to zero!");
        stakingEmissionRate.push(_stakingEmissionRate);
    }

    function decreaseStakingRewardsPool() external teamOROwner {
        stakingEmissionRate.pop();
    }

    function updateStakingRewardsRate (uint256 _stakingEmissionRate, uint256 _index) external teamOROwner {
        require (stakingEmissionRate[_index] != _stakingEmissionRate, "OATH DAO : can not update stakingEmissionRate to same value!");
        stakingEmissionRate[_index] = _stakingEmissionRate;
    }

    function updateSwapTokensThreshold(uint256 newThreshold) external teamOROwner returns (bool) {
  	    require(newThreshold >= totalSupply() * 1 / 100000, "Swap threshold cannot be lower than 0.001% total supply.");
  	    require(newThreshold <= totalSupply() * 5 / 1000, "Swap threshold cannot be higher than 0.5% total supply.");
  	    swapTokensThreshold = newThreshold;
  	    return true;
  	}

    /**
    * @dev Check if an address is excluded from the fee calculation
    */
    function isExcludedFromFees(address account) external view returns(bool) {
        return _isExcludedFromFees[account];
    }

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal override {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");
        
        if (amount == 0) {
            super._transfer(from, to, 0);
            return;
        }

        // all to secure a smooth launch
        if (limitsInEffect) {
            if (
                from != owner() &&
                to != owner() &&
                to != address(0xdead) &&
                !_swapping
            ) {
                if (to != owner() && to != address(uniswapV2Router) && to != address(uniswapV2Pair)){
                    require(_holderLastTransferBlock[tx.origin] < block.number, "_transfer:: Transfer Delay enabled.  Only one purchase per block allowed.");
                    _holderLastTransferBlock[tx.origin] = block.number;
                }

                // on buy
                if (_automatedMarketMakerPairs[from] && !_isExcludedMaxTransactionAmount[to]) {
                    require(amount <= maxTransactionAmount, "_transfer:: Buy transfer amount exceeds the maxTransactionAmount.");
                    require(amount + balanceOf(to) <= maxWallet, "_transfer:: Max wallet exceeded");
                }
                
                // on sell
                else if (_automatedMarketMakerPairs[to] && !_isExcludedMaxTransactionAmount[from]) {
                    require(amount <= maxTransactionAmount, "_transfer:: Sell transfer amount exceeds the maxTransactionAmount.");
                }
                else if (!_isExcludedMaxTransactionAmount[to]) {
                    require(amount + balanceOf(to) <= maxWallet, "_transfer:: Max wallet exceeded");
                }
            }
        }
        
		uint256 contractTokenBalance = balanceOf(address(this));
        bool canSwap = contractTokenBalance >= swapTokensThreshold;
        if (
            canSwap &&
            !_swapping &&
            !_automatedMarketMakerPairs[from] &&
            !_isExcludedFromFees[from] &&
            !_isExcludedFromFees[to]
        ) {
            _swapping = true;
            swapBack();
            _swapping = false;
        }

        bool takeFee = !_swapping;

        // if any addy belongs to _isExcludedFromFee or isn't a swap then remove the fee
        if (
            _isExcludedFromFees[from] || 
            _isExcludedFromFees[to] || 
            (!_automatedMarketMakerPairs[from] && !_automatedMarketMakerPairs[to])
        ) takeFee = false;
        
        uint256 fees = 0;
        if (takeFee) {
            fees = amount.mul(totalFees).div(100);
            _tokensForLiquidity += fees * _liquidityFee / totalFees;
            _tokensForStaking += fees * _stakingFee / totalFees;
            _tokensForMarketing += fees * _marketingFee / totalFees;
            
            if (fees > 0) {
                super._transfer(from, address(this), fees);
            }
        	
        	amount -= fees;
        }

        super._transfer(from, to, amount);
    }

    function _swapTokensForEth(uint256 tokenAmount) internal {
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();

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

        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0,
            path,
            address(this),
            block.timestamp
        );
    }

    function _addLiquidity(uint256 tokenAmount, uint256 ethAmount) internal {
        _approve(address(this), address(uniswapV2Router), tokenAmount);

        uniswapV2Router.addLiquidityETH{value: ethAmount}(
            address(this),
            tokenAmount,
            0,
            0,
            _teamWallet,
            block.timestamp
        );
    }

    function swapBack() internal {
        uint256 contractBalance = balanceOf(address(this));
        uint256 totalTokensToSwap = _tokensForLiquidity + _tokensForMarketing + _tokensForStaking;
        
        if (contractBalance == 0 || totalTokensToSwap == 0) return;
        if (contractBalance > swapTokensThreshold) contractBalance = swapTokensThreshold;
        
        
        // half of the amount of liquidity tokens
        uint256 liquidityTokens = contractBalance * _tokensForLiquidity / totalTokensToSwap / 2;
        uint256 amountToSwapForETH = contractBalance.sub(liquidityTokens);
        
        uint256 initialETHBalance = address(this).balance;

        _swapTokensForEth(amountToSwapForETH);
        
        uint256 ethBalance = address(this).balance.sub(initialETHBalance);
        uint256 ethForMarketing = ethBalance.mul(_tokensForMarketing).div(totalTokensToSwap);
        uint256 ethForStaking = ethBalance.mul(_tokensForStaking).div(totalTokensToSwap);
        uint256 ethForLiquidity = ethBalance - ethForMarketing - ethForStaking;
        
        _tokensForLiquidity = 0;
        _tokensForMarketing = 0;
        _tokensForStaking = 0;

        payable(_teamWallet).transfer(ethForMarketing.add(ethForStaking));
        payable(_treasuryWallet).transfer(ethForMarketing.add(ethForMarketing));
                
        if (liquidityTokens > 0 && ethForLiquidity > 0) {
            _addLiquidity(liquidityTokens, ethForLiquidity);
        }
    }

    /**
    * @dev Transfer eth stuck in contract to _teamWallet
    */
    function withdrawContractETH() external {
        payable(_teamWallet).transfer(address(this).balance);
    }

    /**
    * @dev In case swap wont do it and sells/buys might be blocked
    */
    function forceSwap() external teamOROwner {
        _swapTokensForEth(balanceOf(address(this)));
    }

    /**
        *
        * @dev Staking part starts here
        *
    */

    /**
    * @dev Checks if holder is staking
    */
    function isStaking(address stakerAddr, uint256 stakingpool) public view returns (bool) {
        return _stakers[stakerAddr][stakingpool].staker == stakerAddr;
    }

    /**
    * @dev Returns how much staker is staking
    */
    function userStaked(address staker, uint256 stakingpool) public view returns (uint256) {
        return _stakers[staker][stakingpool].staked;
    }

    /**
    * @dev Returns how much staker has claimed over time
    */
    function userClaimHistory(address staker) public view returns (ClaimHistory memory) {
        return _claimHistory[staker];
    }

    /**
    * @dev Returns how much staker has earned
    */
    function userEarned(address staker, uint256 stakingpool) public view returns (uint256) {
        uint256 currentlyEarned = _userEarned(staker, stakingpool);
        uint256 previouslyEarned = _stakers[msg.sender][stakingpool].earned;

        if (previouslyEarned > 0) return currentlyEarned.add(previouslyEarned);
        return currentlyEarned;
    }

    function _userEarned(address staker, uint256 stakingpool) private view returns (uint256) {
        require(isStaking(staker, stakingpool), "OATH DAO : User is not staking.");

        uint256 staked = userStaked(staker, stakingpool);
        uint256 stakersStartInSeconds = _stakers[staker][stakingpool].start.div(1 seconds);
        uint256 blockTimestampInSeconds = block.timestamp.div(1 seconds);
        uint256 secondsStaked = blockTimestampInSeconds.sub(stakersStartInSeconds);

        uint256 earn = staked.mul(stakingEmissionRate[stakingpool]).div(100);
        uint256 rewardPerSec = earn.div(365).div(24).div(60).div(60);
        uint256 earned = rewardPerSec.mul(secondsStaked);

        return earned;
    }
 
    /**
    * @dev Stake tokens in staking pool
    */
    function stake(uint256 stakeAmount, uint256 stakingpool) external isStakingEnabled {

        // Check user is registered as staker
        if (isStaking(msg.sender, stakingpool)) {
            _stakers[msg.sender][stakingpool].staked += stakeAmount;
            _stakers[msg.sender][stakingpool].earned += _userEarned(msg.sender, stakingpool);
            _stakers[msg.sender][stakingpool].start = block.timestamp;
        } else {
            _stakers[msg.sender][stakingpool] = Staker(msg.sender, block.timestamp, stakeAmount, 0);
        }

        stakingPools[stakingpool].staked += stakeAmount;
        totalStaked += stakeAmount;
        _burn(msg.sender, stakeAmount);
    }
    
    /**
    * @dev Claim earned tokens from stake in stakingpool
    */
    function claim(uint256 stakingpool) external isStakingEnabled {
        require(isStaking(msg.sender, stakingpool), "You are not staking!?");

        uint256 reward = userEarned(msg.sender, stakingpool);

        _claimHistory[msg.sender].dates.push(block.timestamp);
        _claimHistory[msg.sender].amounts.push(reward);
        totalClaimed += reward;

        _mint(msg.sender, reward);

        _stakers[msg.sender][stakingpool].start = block.timestamp;
        _stakers[msg.sender][stakingpool].earned = 0;
    }

    /**
    * @dev Claim earned and staked tokens from stakingpool
    */
    function unstake(uint256 stakingpool) external {
        require(isStaking(msg.sender, stakingpool), "You are not staking!?");

        uint256 reward = userEarned(msg.sender, stakingpool);

        if (stakingEnabled) {
            _claimHistory[msg.sender].dates.push(block.timestamp);
            _claimHistory[msg.sender].amounts.push(reward);
            totalClaimed += reward;

            _mint(msg.sender, _stakers[msg.sender][stakingpool].staked.add(reward));
        } else {
            _mint(msg.sender, _stakers[msg.sender][stakingpool].staked);
        }

        stakingPools[stakingpool].staked -= _stakers[msg.sender][stakingpool].staked;
        totalStaked -= _stakers[msg.sender][stakingpool].staked;

        delete _stakers[msg.sender][stakingpool];
    }

    function createStakingPool() external teamOROwner {
        StakingPool memory stakingpool = StakingPool(block.timestamp, 0);
        stakingPools.push(stakingpool);
    }

    function amountOfStakingPools() public view returns (uint256) {
        return stakingPools.length;
    }

    function setStakingState(bool onoff) external teamOROwner {
        stakingEnabled = onoff;
    }

    receive() external payable {}
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"payable","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":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"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":[],"name":"amountOfStakingPools","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":[{"internalType":"uint256","name":"stakingpool","type":"uint256"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"createStakingPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decreaseStakingRewardsPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"forceSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"stakerAddr","type":"address"},{"internalType":"uint256","name":"stakingpool","type":"uint256"}],"name":"isStaking","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"limitsInEffect","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liveTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxTransactionAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"removeLimits","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":[{"internalType":"bool","name":"onoff","type":"bool"}],"name":"setStakingState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stakingEmissionRate","type":"uint256"}],"name":"setupStakingRewardsRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"stakeAmount","type":"uint256"},{"internalType":"uint256","name":"stakingpool","type":"uint256"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"stakingEmissionRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"stakingPools","outputs":[{"internalType":"uint256","name":"creationTime","type":"uint256"},{"internalType":"uint256","name":"staked","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakingToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapTokensThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalStaked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"stakingpool","type":"uint256"}],"name":"unstake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"marketingFee","type":"uint256"},{"internalType":"uint256","name":"liquidityFee","type":"uint256"},{"internalType":"uint256","name":"stakingFee","type":"uint256"}],"name":"updateFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stakingEmissionRate","type":"uint256"},{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"updateStakingRewardsRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newThreshold","type":"uint256"}],"name":"updateSwapTokensThreshold","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"}],"name":"userClaimHistory","outputs":[{"components":[{"internalType":"uint256[]","name":"dates","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"internalType":"struct OATHDAO.ClaimHistory","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"},{"internalType":"uint256","name":"stakingpool","type":"uint256"}],"name":"userEarned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"},{"internalType":"uint256","name":"stakingpool","type":"uint256"}],"name":"userStaked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawContractETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

600d805460ff1990811660011790915560198054909116905560086080908152674f4154482044414f60c01b60a052610100604052600460c09081526309e82a8960e31b60e052600362000054838262000562565b50600462000063828262000562565b505050620000806200007a620002f360201b60201c565b620002f7565b601c6020527fb1e2e88b6a3e9d36c6d6d48756ca9ed8312cfcb5a15208f81170ade3bd2b4a95805460ff19166001908117909155600680546001600160a01b031916737a250d5630b4cf539739df2c5dacb4c659f2488d908117909155601880549283018155600090815260b47fb13d2d76d1f4b7be834882e410b3e3a8afaf69f83600ae24db354391d2378d2e9093019290925590600290816c064f964e68233a76f520000000606462000136828462000644565b62000142919062000664565b600a5560646200015482600262000644565b62000160919062000664565b600b556103e86200017382600162000644565b6200017f919062000664565b600c55600f84905560108390556011829055816200019e848662000687565b620001aa919062000687565b600e55600980546001600160a01b03191673fefa516d3799e018329004d32e4b3b97e497736a179055620001e66005546001600160a01b031690565b600880546001600160a01b0319166001600160a01b03928316179055600554620002139116600162000349565b6200022030600162000349565b6200022f61dead600162000349565b6001601c6000620002486005546001600160a01b031690565b6001600160a01b0316815260208082019290925260409081016000908120805494151560ff1995861617905530808252601c90935290812080548416600190811790915561dead9091527fa48bd8e7b1565515cde2859b6cc48308ba05b5325bcf90fb096b9ac0b8087dfc805490931617909155601680546001600160a01b031990811683179091556017805490911682179055620002e89082620003d4565b50505050506200069d565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6005546001600160a01b03163314620003a95760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b6001600160a01b03919091166000908152601b60205260409020805460ff1916911515919091179055565b6001600160a01b0382166200042c5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401620003a0565b806002600082825462000440919062000687565b90915550506001600160a01b038216600090815260208190526040812080548392906200046f90849062000687565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b505050565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620004e957607f821691505b6020821081036200050a57634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620004b957600081815260208120601f850160051c81016020861015620005395750805b601f850160051c820191505b818110156200055a5782815560010162000545565b505050505050565b81516001600160401b038111156200057e576200057e620004be565b62000596816200058f8454620004d4565b8462000510565b602080601f831160018114620005ce5760008415620005b55750858301515b600019600386901b1c1916600185901b1785556200055a565b600085815260208120601f198616915b82811015620005ff57888601518255948401946001909101908401620005de565b50858210156200061e5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b80820281158282048414176200065e576200065e6200062e565b92915050565b6000826200068257634e487b7160e01b600052601260045260246000fd5b500490565b808201808211156200065e576200065e6200062e565b61316380620006ad6000396000f3fe60806040526004361061028c5760003560e01c80636ceb23a11161015a578063a457c2d7116100c1578063dd62ed3e1161007a578063dd62ed3e146107b5578063df778d26146107fb578063ea5f802714610810578063f2fde38b14610830578063f7c618c114610850578063f8b45b051461087057600080fd5b8063a457c2d714610713578063a9059cbb14610733578063c024666814610753578063c8c8ebe414610773578063cef8513914610789578063d54ad2a11461079f57600080fd5b8063817b1cd211610113578063817b1cd21461064f57806381947063146106655780638baa63b21461067a5780638da5cb5b1461069a57806395d89b41146106b8578063a39b2153146106cd57600080fd5b80636ceb23a11461058057806370a08231146105ad578063715018a6146105cd57806372f702f3146105e2578063751039fc1461061a5780637b0472f01461062f57600080fd5b806339509351116101fe5780634af9548a116101b75780634af9548a146104a85780634fbee193146104c85780635aad6cf01461050157806363c02ff11461053657806366319a171461054b5780636cdbbfe01461056057600080fd5b806339509351146104045780633b51e5cf146104245780633dd5b2da146104445780634093e7d51461045957806344579b32146104795780634a62bb651461048e57600080fd5b80632242908511610250578063224290851461034657806323b872dd14610368578063245fc1ba146103885780632e17de78146103a8578063313ce567146103c8578063379607f5146103e457600080fd5b806306fdde0314610298578063095ea7b3146102c357806313114a9d146102f357806318160ddd146103175780631cfff51b1461032c57600080fd5b3661029357005b600080fd5b3480156102a457600080fd5b506102ad610886565b6040516102ba9190612ba2565b60405180910390f35b3480156102cf57600080fd5b506102e36102de366004612c05565b610918565b60405190151581526020016102ba565b3480156102ff57600080fd5b50610309600e5481565b6040519081526020016102ba565b34801561032357600080fd5b50600254610309565b34801561033857600080fd5b506019546102e39060ff1681565b34801561035257600080fd5b50610366610361366004612c31565b610932565b005b34801561037457600080fd5b506102e3610383366004612c5d565b6109f5565b34801561039457600080fd5b506102e36103a3366004612c05565b610a19565b3480156103b457600080fd5b506103666103c3366004612c9e565b610a47565b3480156103d457600080fd5b50604051601281526020016102ba565b3480156103f057600080fd5b506103666103ff366004612c9e565b610c2b565b34801561041057600080fd5b506102e361041f366004612c05565b610d2e565b34801561043057600080fd5b5061036661043f366004612cc7565b610d6d565b34801561045057600080fd5b50610366610dbf565b34801561046557600080fd5b50610309610474366004612c05565b610dfb565b34801561048557600080fd5b50610366610e4a565b34801561049a57600080fd5b50600d546102e39060ff1681565b3480156104b457600080fd5b506103666104c3366004612ce2565b6110e0565b3480156104d457600080fd5b506102e36104e3366004612d04565b6001600160a01b03166000908152601b602052604090205460ff1690565b34801561050d57600080fd5b5061052161051c366004612c9e565b6111d5565b604080519283526020830191909152016102ba565b34801561054257600080fd5b50602154610309565b34801561055757600080fd5b50610366611203565b34801561056c57600080fd5b5061036661057b366004612c9e565b61126b565b34801561058c57600080fd5b506105a061059b366004612d04565b61134e565b6040516102ba9190612d5c565b3480156105b957600080fd5b506103096105c8366004612d04565b61142c565b3480156105d957600080fd5b50610366611447565b3480156105ee57600080fd5b50601654610602906001600160a01b031681565b6040516001600160a01b0390911681526020016102ba565b34801561062657600080fd5b5061036661147d565b34801561063b57600080fd5b5061036661064a366004612ce2565b6114b3565b34801561065b57600080fd5b5061030960155481565b34801561067157600080fd5b50610366611645565b34801561068657600080fd5b506102e3610695366004612c9e565b6116fb565b3480156106a657600080fd5b506005546001600160a01b0316610602565b3480156106c457600080fd5b506102ad611878565b3480156106d957600080fd5b506103096106e8366004612c05565b6001600160a01b03919091166000908152601f60209081526040808320938352929052206002015490565b34801561071f57600080fd5b506102e361072e366004612c05565b611887565b34801561073f57600080fd5b506102e361074e366004612c05565b611919565b34801561075f57600080fd5b5061036661076e366004612d9e565b611927565b34801561077f57600080fd5b50610309600a5481565b34801561079557600080fd5b50610309600c5481565b3480156107ab57600080fd5b50610309601a5481565b3480156107c157600080fd5b506103096107d0366004612dd3565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b34801561080757600080fd5b5061036661197c565b34801561081c57600080fd5b5061030961082b366004612c9e565b6119cc565b34801561083c57600080fd5b5061036661084b366004612d04565b6119ed565b34801561085c57600080fd5b50601754610602906001600160a01b031681565b34801561087c57600080fd5b50610309600b5481565b60606003805461089590612e0c565b80601f01602080910402602001604051908101604052809291908181526020018280546108c190612e0c565b801561090e5780601f106108e35761010080835404028352916020019161090e565b820191906000526020600020905b8154815290600101906020018083116108f157829003601f168201915b5050505050905090565b600033610926818585611a85565b60019150505b92915050565b6005546001600160a01b031633146109655760405162461bcd60e51b815260040161095c90612e46565b60405180910390fd5b600f839055601082905560118190558061097f8385612e91565b6109899190612e91565b600e819055600a10156109f05760405162461bcd60e51b815260206004820152602960248201527f4f4154482044414f20203a204d757374206b656570206665657320617420313060448201526825206f72206c65737360b81b606482015260840161095c565b505050565b600033610a03858285611ba9565b610a0e858585611c3b565b506001949350505050565b6001600160a01b039182166000818152601f6020908152604080832094835293905291909120549091161490565b610a513382610a19565b610a955760405162461bcd60e51b8152602060048201526015602482015274596f7520617265206e6f74207374616b696e67213f60581b604482015260640161095c565b6000610aa13383610dfb565b60195490915060ff1615610b35573360009081526020808052604082208054600181810183558285528385204292019190915590810180549182018155835290822001829055601a8054839290610af9908490612e91565b9091555050336000818152601f60209081526040808320868452909152902060020154610b309190610b2b90846122cb565b6122de565b610b5d565b336000818152601f60209081526040808320868452909152902060020154610b5d91906122de565b336000908152601f602090815260408083208584529091529020600201546021805484908110610b8f57610b8f612ea4565b90600052602060002090600202016001016000828254610baf9190612eba565b9091555050336000908152601f602090815260408083208584529091528120600201546015805491929091610be5908490612eba565b9091555050336000908152601f6020908152604080832094835293905291822080546001600160a01b031916815560018101839055600281018390556003019190915550565b60195460ff16610c4d5760405162461bcd60e51b815260040161095c90612ecd565b610c573382610a19565b610c9b5760405162461bcd60e51b8152602060048201526015602482015274596f7520617265206e6f74207374616b696e67213f60581b604482015260640161095c565b6000610ca73383610dfb565b3360009081526020808052604082208054600181810183558285528385204292019190915590810180549182018155835290822001829055601a80549293508392909190610cf6908490612e91565b90915550610d06905033826122de565b50336000908152601f6020908152604080832093835292905290812042600182015560030155565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091906109269082908690610d68908790612e91565b611a85565b6008546001600160a01b0316331480610d9057506005546001600160a01b031633145b610dac5760405162461bcd60e51b815260040161095c90612f0f565b6019805460ff1916911515919091179055565b6008546040516001600160a01b03909116904780156108fc02916000818181858888f19350505050158015610df8573d6000803e3d6000fd5b50565b600080610e0884846123bd565b336000908152601f602090815260408083208784529091529020600301549091508015610e4257610e3982826122cb565b9250505061092c565b509392505050565b6005546001600160a01b03163314610e745760405162461bcd60e51b815260040161095c90612e46565b600660009054906101000a90046001600160a01b03166001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ec7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eeb9190612f5f565b6001600160a01b031663c9c6539630600660009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f4d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f719190612f5f565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af1158015610fbe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fe29190612f5f565b600780546001600160a01b0319166001600160a01b0392831690811782556000908152601c60209081526040808320805460ff199081166001908117909255945486168452601d909252909120805490921617905560065461104a91309116610d688261142c565b6006546001600160a01b031663f305d71947306110668161142c565b60008061107b6005546001600160a01b031690565b426040518863ffffffff1660e01b815260040161109d96959493929190612f7c565b60606040518083038185885af11580156110bb573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906109f09190612fb7565b6008546001600160a01b031633148061110357506005546001600160a01b031633145b61111f5760405162461bcd60e51b815260040161095c90612f0f565b816018828154811061113357611133612ea4565b9060005260206000200154036111b15760405162461bcd60e51b815260206004820152603c60248201527f4f4154482044414f203a2063616e206e6f7420757064617465207374616b696e60448201527f67456d697373696f6e5261746520746f2073616d652076616c75652100000000606482015260840161095c565b81601882815481106111c5576111c5612ea4565b6000918252602090912001555050565b602181815481106111e557600080fd5b60009182526020909120600290910201805460019091015490915082565b6008546001600160a01b031633148061122657506005546001600160a01b031633145b6112425760405162461bcd60e51b815260040161095c90612f0f565b601880548061125357611253612fe5565b60019003818190600052602060002001600090559055565b6008546001600160a01b031633148061128e57506005546001600160a01b031633145b6112aa5760405162461bcd60e51b815260040161095c90612f0f565b806000036113195760405162461bcd60e51b815260206004820152603660248201527f4f4154482044414f203a2063616e206e6f7420757064617465207374616b696e60448201527567456d697373696f6e5261746520746f207a65726f2160501b606482015260840161095c565b601880546001810182556000919091527fb13d2d76d1f4b7be834882e410b3e3a8afaf69f83600ae24db354391d2378d2e0155565b604080518082018252606080825260208083018290526001600160a01b0385166000908152818052849020845181549283028101840186529485018281529394939092849284918401828280156113c457602002820191906000526020600020905b8154815260200190600101908083116113b0575b505050505081526020016001820180548060200260200160405190810160405280929190818152602001828054801561141c57602002820191906000526020600020905b815481526020019060010190808311611408575b5050505050815250509050919050565b6001600160a01b031660009081526020819052604090205490565b6005546001600160a01b031633146114715760405162461bcd60e51b815260040161095c90612e46565b61147b60006124dc565b565b6005546001600160a01b031633146114a75760405162461bcd60e51b815260040161095c90612e46565b600d805460ff19169055565b60195460ff166114d55760405162461bcd60e51b815260040161095c90612ecd565b6114df3382610a19565b1561157957336000908152601f6020908152604080832084845290915281206002018054849290611511908490612e91565b90915550611521905033826123bd565b336000908152601f602090815260408083208584529091528120600301805490919061154e908490612e91565b9091555050336000908152601f602090815260408083208484529091529020426001909101556115e4565b6040805160808101825233808252426020808401918252838501878152600060608601818152948152601f8352868120888252909252949020925183546001600160a01b0319166001600160a01b039091161783555160018301559151600282015590516003909101555b81602182815481106115f8576115f8612ea4565b906000526020600020906002020160010160008282546116189190612e91565b9250508190555081601560008282546116319190612e91565b909155506116419050338361252e565b5050565b6008546001600160a01b031633148061166857506005546001600160a01b031633145b6116845760405162461bcd60e51b815260040161095c90612f0f565b6040805180820190915242815260006020820181815260218054600181018255925291517f3a6357012c1a3ae0a17d304c9920310382d968ebcc4b1771f41c6b304205b57060029092029182015590517f3a6357012c1a3ae0a17d304c9920310382d968ebcc4b1771f41c6b304205b57190910155565b6008546000906001600160a01b031633148061172157506005546001600160a01b031633145b61173d5760405162461bcd60e51b815260040161095c90612f0f565b620186a061174a60025490565b611755906001612ffb565b61175f9190613012565b8210156117d45760405162461bcd60e51b815260206004820152603860248201527f53776170207468726573686f6c642063616e6e6f74206265206c6f776572207460448201527f68616e20302e3030312520746f74616c20737570706c792e0000000000000000606482015260840161095c565b6103e86117e060025490565b6117eb906005612ffb565b6117f59190613012565b82111561186a5760405162461bcd60e51b815260206004820152603760248201527f53776170207468726573686f6c642063616e6e6f74206265206869676865722060448201527f7468616e20302e352520746f74616c20737570706c792e000000000000000000606482015260840161095c565b50600c81905560015b919050565b60606004805461089590612e0c565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091908381101561190c5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b606482015260840161095c565b610a0e8286868403611a85565b600033610926818585611c3b565b6005546001600160a01b031633146119515760405162461bcd60e51b815260040161095c90612e46565b6001600160a01b03919091166000908152601b60205260409020805460ff1916911515919091179055565b6008546001600160a01b031633148061199f57506005546001600160a01b031633145b6119bb5760405162461bcd60e51b815260040161095c90612f0f565b61147b6119c73061142c565b61267c565b601881815481106119dc57600080fd5b600091825260209091200154905081565b6005546001600160a01b03163314611a175760405162461bcd60e51b815260040161095c90612e46565b6001600160a01b038116611a7c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161095c565b610df8816124dc565b6001600160a01b038316611ae75760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840161095c565b6001600160a01b038216611b485760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840161095c565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b038381166000908152600160209081526040808320938616835292905220546000198114611c355781811015611c285760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000604482015260640161095c565b611c358484848403611a85565b50505050565b6001600160a01b038316611c615760405162461bcd60e51b815260040161095c90613034565b6001600160a01b038216611c875760405162461bcd60e51b815260040161095c90613079565b80600003611c9b576109f0838360006127d6565b600d5460ff1615612076576005546001600160a01b03848116911614801590611cd257506005546001600160a01b03838116911614155b8015611ce957506001600160a01b03821661dead14155b8015611cff5750600754600160a01b900460ff16155b15612076576005546001600160a01b03838116911614801590611d3057506006546001600160a01b03838116911614155b8015611d4a57506007546001600160a01b03838116911614155b15611df857326000908152601e60205260409020544311611de55760405162461bcd60e51b815260206004820152604960248201527f5f7472616e736665723a3a205472616e736665722044656c617920656e61626c60448201527f65642e20204f6e6c79206f6e652070757263686173652070657220626c6f636b6064820152681030b63637bbb2b21760b91b608482015260a40161095c565b326000908152601e602052604090204390555b6001600160a01b0383166000908152601d602052604090205460ff168015611e3957506001600160a01b0382166000908152601c602052604090205460ff16155b15611f2957600a54811115611ec05760405162461bcd60e51b815260206004820152604160248201527f5f7472616e736665723a3a20427579207472616e7366657220616d6f756e742060448201527f6578636565647320746865206d61785472616e73616374696f6e416d6f756e746064820152601760f91b608482015260a40161095c565b600b54611ecc8361142c565b611ed69083612e91565b1115611f245760405162461bcd60e51b815260206004820152601f60248201527f5f7472616e736665723a3a204d61782077616c6c657420657863656564656400604482015260640161095c565b612076565b6001600160a01b0382166000908152601d602052604090205460ff168015611f6a57506001600160a01b0383166000908152601c602052604090205460ff16155b15611ff257600a54811115611f245760405162461bcd60e51b815260206004820152604260248201527f5f7472616e736665723a3a2053656c6c207472616e7366657220616d6f756e7460448201527f206578636565647320746865206d61785472616e73616374696f6e416d6f756e6064820152613a1760f11b608482015260a40161095c565b6001600160a01b0382166000908152601c602052604090205460ff1661207657600b5461201e8361142c565b6120289083612e91565b11156120765760405162461bcd60e51b815260206004820152601f60248201527f5f7472616e736665723a3a204d61782077616c6c657420657863656564656400604482015260640161095c565b60006120813061142c565b600c54909150811080159081906120a25750600754600160a01b900460ff16155b80156120c757506001600160a01b0385166000908152601d602052604090205460ff16155b80156120ec57506001600160a01b0385166000908152601b602052604090205460ff16155b801561211157506001600160a01b0384166000908152601b602052604090205460ff16155b1561213f576007805460ff60a01b1916600160a01b17905561213161292a565b6007805460ff60a01b191690555b6007546001600160a01b0386166000908152601b602052604090205460ff600160a01b90920482161591168061218d57506001600160a01b0385166000908152601b602052604090205460ff165b806121d557506001600160a01b0386166000908152601d602052604090205460ff161580156121d557506001600160a01b0385166000908152601d602052604090205460ff16155b156121de575060005b600081156122b7576122066064612200600e5488612adc90919063ffffffff16565b90612ae8565b9050600e54601054826122199190612ffb565b6122239190613012565b601360008282546122349190612e91565b9091555050600e546011546122499083612ffb565b6122539190613012565b601460008282546122649190612e91565b9091555050600e54600f546122799083612ffb565b6122839190613012565b601260008282546122949190612e91565b909155505080156122aa576122aa8730836127d6565b6122b48186612eba565b94505b6122c28787876127d6565b50505050505050565b60006122d78284612e91565b9392505050565b6001600160a01b0382166123345760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640161095c565b80600260008282546123469190612e91565b90915550506001600160a01b03821660009081526020819052604081208054839290612373908490612e91565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b60006123c98383610a19565b6124155760405162461bcd60e51b815260206004820152601f60248201527f4f4154482044414f203a2055736572206973206e6f74207374616b696e672e00604482015260640161095c565b6001600160a01b0383166000908152601f60209081526040808320858452909152812060028101546001918201549092916124509190612ae8565b9050600061245f426001612ae8565b9050600061246d8284612af4565b905060006124a6606461220060188a8154811061248c5761248c612ea4565b906000526020600020015488612adc90919063ffffffff16565b905060006124c0603c61220081816018818861016d612ae8565b905060006124ce8285612adc565b9a9950505050505050505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b03821661258e5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b606482015260840161095c565b6001600160a01b038216600090815260208190526040902054818110156126025760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b606482015260840161095c565b6001600160a01b0383166000908152602081905260408120838303905560028054849290612631908490612eba565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b60408051600280825260608201835260009260208301908036833701905050905030816000815181106126b1576126b1612ea4565b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa15801561270a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061272e9190612f5f565b8160018151811061274157612741612ea4565b6001600160a01b0392831660209182029290920101526006546127679130911684611a85565b60065460405163791ac94760e01b81526001600160a01b039091169063791ac947906127a09085906000908690309042906004016130bc565b600060405180830381600087803b1580156127ba57600080fd5b505af11580156127ce573d6000803e3d6000fd5b505050505050565b6001600160a01b0383166127fc5760405162461bcd60e51b815260040161095c90613034565b6001600160a01b0382166128225760405162461bcd60e51b815260040161095c90613079565b6001600160a01b0383166000908152602081905260409020548181101561289a5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b606482015260840161095c565b6001600160a01b038085166000908152602081905260408082208585039055918516815290812080548492906128d1908490612e91565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161291d91815260200190565b60405180910390a3611c35565b60006129353061142c565b9050600060145460125460135461294c9190612e91565b6129569190612e91565b9050811580612963575080155b1561296c575050565b600c5482111561297c57600c5491505b60006002826013548561298f9190612ffb565b6129999190613012565b6129a39190613012565b905060006129b18483612af4565b9050476129bd8261267c565b60006129c94783612af4565b905060006129e68661220060125485612adc90919063ffffffff16565b90506000612a038761220060145486612adc90919063ffffffff16565b9050600081612a128486612eba565b612a1c9190612eba565b6000601381905560128190556014556008549091506001600160a01b03166108fc612a4785856122cb565b6040518115909202916000818181858888f19350505050158015612a6f573d6000803e3d6000fd5b506009546001600160a01b03166108fc612a8985806122cb565b6040518115909202916000818181858888f19350505050158015612ab1573d6000803e3d6000fd5b50600087118015612ac25750600081115b15612ad157612ad18782612b00565b505050505050505050565b60006122d78284612ffb565b60006122d78284613012565b60006122d78284612eba565b600654612b189030906001600160a01b031684611a85565b60065460085460405163f305d71960e01b81526001600160a01b039283169263f305d719928592612b589230928992600092839216904290600401612f7c565b60606040518083038185885af1158015612b76573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612b9b9190612fb7565b5050505050565b600060208083528351808285015260005b81811015612bcf57858101830151858201604001528201612bb3565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114610df857600080fd5b60008060408385031215612c1857600080fd5b8235612c2381612bf0565b946020939093013593505050565b600080600060608486031215612c4657600080fd5b505081359360208301359350604090920135919050565b600080600060608486031215612c7257600080fd5b8335612c7d81612bf0565b92506020840135612c8d81612bf0565b929592945050506040919091013590565b600060208284031215612cb057600080fd5b5035919050565b8035801515811461187357600080fd5b600060208284031215612cd957600080fd5b6122d782612cb7565b60008060408385031215612cf557600080fd5b50508035926020909101359150565b600060208284031215612d1657600080fd5b81356122d781612bf0565b600081518084526020808501945080840160005b83811015612d5157815187529582019590820190600101612d35565b509495945050505050565b602081526000825160406020840152612d786060840182612d21565b90506020840151601f19848303016040850152612d958282612d21565b95945050505050565b60008060408385031215612db157600080fd5b8235612dbc81612bf0565b9150612dca60208401612cb7565b90509250929050565b60008060408385031215612de657600080fd5b8235612df181612bf0565b91506020830135612e0181612bf0565b809150509250929050565b600181811c90821680612e2057607f821691505b602082108103612e4057634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b8082018082111561092c5761092c612e7b565b634e487b7160e01b600052603260045260246000fd5b8181038181111561092c5761092c612e7b565b60208082526022908201527f4f4154482044414f203a205374616b696e67206973206e6f7420656e61626c65604082015261321760f11b606082015260800190565b60208082526030908201527f43616c6c6572206973206e6f7420746865205f7465616d57616c6c657420616460408201526f323932b9b9903737b91037bbb732b91760811b606082015260800190565b600060208284031215612f7157600080fd5b81516122d781612bf0565b6001600160a01b039687168152602081019590955260408501939093526060840191909152909216608082015260a081019190915260c00190565b600080600060608486031215612fcc57600080fd5b8351925060208401519150604084015190509250925092565b634e487b7160e01b600052603160045260246000fd5b808202811582820484141761092c5761092c612e7b565b60008261302f57634e487b7160e01b600052601260045260246000fd5b500490565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b8181101561310c5784516001600160a01b0316835293830193918301916001016130e7565b50506001600160a01b0396909616606085015250505060800152939250505056fea2646970667358221220c0c24ed50e91673e40331183214352478bfb93f88b0b6b86414c0ee2395f033764736f6c63430008110033

Deployed Bytecode

0x60806040526004361061028c5760003560e01c80636ceb23a11161015a578063a457c2d7116100c1578063dd62ed3e1161007a578063dd62ed3e146107b5578063df778d26146107fb578063ea5f802714610810578063f2fde38b14610830578063f7c618c114610850578063f8b45b051461087057600080fd5b8063a457c2d714610713578063a9059cbb14610733578063c024666814610753578063c8c8ebe414610773578063cef8513914610789578063d54ad2a11461079f57600080fd5b8063817b1cd211610113578063817b1cd21461064f57806381947063146106655780638baa63b21461067a5780638da5cb5b1461069a57806395d89b41146106b8578063a39b2153146106cd57600080fd5b80636ceb23a11461058057806370a08231146105ad578063715018a6146105cd57806372f702f3146105e2578063751039fc1461061a5780637b0472f01461062f57600080fd5b806339509351116101fe5780634af9548a116101b75780634af9548a146104a85780634fbee193146104c85780635aad6cf01461050157806363c02ff11461053657806366319a171461054b5780636cdbbfe01461056057600080fd5b806339509351146104045780633b51e5cf146104245780633dd5b2da146104445780634093e7d51461045957806344579b32146104795780634a62bb651461048e57600080fd5b80632242908511610250578063224290851461034657806323b872dd14610368578063245fc1ba146103885780632e17de78146103a8578063313ce567146103c8578063379607f5146103e457600080fd5b806306fdde0314610298578063095ea7b3146102c357806313114a9d146102f357806318160ddd146103175780631cfff51b1461032c57600080fd5b3661029357005b600080fd5b3480156102a457600080fd5b506102ad610886565b6040516102ba9190612ba2565b60405180910390f35b3480156102cf57600080fd5b506102e36102de366004612c05565b610918565b60405190151581526020016102ba565b3480156102ff57600080fd5b50610309600e5481565b6040519081526020016102ba565b34801561032357600080fd5b50600254610309565b34801561033857600080fd5b506019546102e39060ff1681565b34801561035257600080fd5b50610366610361366004612c31565b610932565b005b34801561037457600080fd5b506102e3610383366004612c5d565b6109f5565b34801561039457600080fd5b506102e36103a3366004612c05565b610a19565b3480156103b457600080fd5b506103666103c3366004612c9e565b610a47565b3480156103d457600080fd5b50604051601281526020016102ba565b3480156103f057600080fd5b506103666103ff366004612c9e565b610c2b565b34801561041057600080fd5b506102e361041f366004612c05565b610d2e565b34801561043057600080fd5b5061036661043f366004612cc7565b610d6d565b34801561045057600080fd5b50610366610dbf565b34801561046557600080fd5b50610309610474366004612c05565b610dfb565b34801561048557600080fd5b50610366610e4a565b34801561049a57600080fd5b50600d546102e39060ff1681565b3480156104b457600080fd5b506103666104c3366004612ce2565b6110e0565b3480156104d457600080fd5b506102e36104e3366004612d04565b6001600160a01b03166000908152601b602052604090205460ff1690565b34801561050d57600080fd5b5061052161051c366004612c9e565b6111d5565b604080519283526020830191909152016102ba565b34801561054257600080fd5b50602154610309565b34801561055757600080fd5b50610366611203565b34801561056c57600080fd5b5061036661057b366004612c9e565b61126b565b34801561058c57600080fd5b506105a061059b366004612d04565b61134e565b6040516102ba9190612d5c565b3480156105b957600080fd5b506103096105c8366004612d04565b61142c565b3480156105d957600080fd5b50610366611447565b3480156105ee57600080fd5b50601654610602906001600160a01b031681565b6040516001600160a01b0390911681526020016102ba565b34801561062657600080fd5b5061036661147d565b34801561063b57600080fd5b5061036661064a366004612ce2565b6114b3565b34801561065b57600080fd5b5061030960155481565b34801561067157600080fd5b50610366611645565b34801561068657600080fd5b506102e3610695366004612c9e565b6116fb565b3480156106a657600080fd5b506005546001600160a01b0316610602565b3480156106c457600080fd5b506102ad611878565b3480156106d957600080fd5b506103096106e8366004612c05565b6001600160a01b03919091166000908152601f60209081526040808320938352929052206002015490565b34801561071f57600080fd5b506102e361072e366004612c05565b611887565b34801561073f57600080fd5b506102e361074e366004612c05565b611919565b34801561075f57600080fd5b5061036661076e366004612d9e565b611927565b34801561077f57600080fd5b50610309600a5481565b34801561079557600080fd5b50610309600c5481565b3480156107ab57600080fd5b50610309601a5481565b3480156107c157600080fd5b506103096107d0366004612dd3565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b34801561080757600080fd5b5061036661197c565b34801561081c57600080fd5b5061030961082b366004612c9e565b6119cc565b34801561083c57600080fd5b5061036661084b366004612d04565b6119ed565b34801561085c57600080fd5b50601754610602906001600160a01b031681565b34801561087c57600080fd5b50610309600b5481565b60606003805461089590612e0c565b80601f01602080910402602001604051908101604052809291908181526020018280546108c190612e0c565b801561090e5780601f106108e35761010080835404028352916020019161090e565b820191906000526020600020905b8154815290600101906020018083116108f157829003601f168201915b5050505050905090565b600033610926818585611a85565b60019150505b92915050565b6005546001600160a01b031633146109655760405162461bcd60e51b815260040161095c90612e46565b60405180910390fd5b600f839055601082905560118190558061097f8385612e91565b6109899190612e91565b600e819055600a10156109f05760405162461bcd60e51b815260206004820152602960248201527f4f4154482044414f20203a204d757374206b656570206665657320617420313060448201526825206f72206c65737360b81b606482015260840161095c565b505050565b600033610a03858285611ba9565b610a0e858585611c3b565b506001949350505050565b6001600160a01b039182166000818152601f6020908152604080832094835293905291909120549091161490565b610a513382610a19565b610a955760405162461bcd60e51b8152602060048201526015602482015274596f7520617265206e6f74207374616b696e67213f60581b604482015260640161095c565b6000610aa13383610dfb565b60195490915060ff1615610b35573360009081526020808052604082208054600181810183558285528385204292019190915590810180549182018155835290822001829055601a8054839290610af9908490612e91565b9091555050336000818152601f60209081526040808320868452909152902060020154610b309190610b2b90846122cb565b6122de565b610b5d565b336000818152601f60209081526040808320868452909152902060020154610b5d91906122de565b336000908152601f602090815260408083208584529091529020600201546021805484908110610b8f57610b8f612ea4565b90600052602060002090600202016001016000828254610baf9190612eba565b9091555050336000908152601f602090815260408083208584529091528120600201546015805491929091610be5908490612eba565b9091555050336000908152601f6020908152604080832094835293905291822080546001600160a01b031916815560018101839055600281018390556003019190915550565b60195460ff16610c4d5760405162461bcd60e51b815260040161095c90612ecd565b610c573382610a19565b610c9b5760405162461bcd60e51b8152602060048201526015602482015274596f7520617265206e6f74207374616b696e67213f60581b604482015260640161095c565b6000610ca73383610dfb565b3360009081526020808052604082208054600181810183558285528385204292019190915590810180549182018155835290822001829055601a80549293508392909190610cf6908490612e91565b90915550610d06905033826122de565b50336000908152601f6020908152604080832093835292905290812042600182015560030155565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091906109269082908690610d68908790612e91565b611a85565b6008546001600160a01b0316331480610d9057506005546001600160a01b031633145b610dac5760405162461bcd60e51b815260040161095c90612f0f565b6019805460ff1916911515919091179055565b6008546040516001600160a01b03909116904780156108fc02916000818181858888f19350505050158015610df8573d6000803e3d6000fd5b50565b600080610e0884846123bd565b336000908152601f602090815260408083208784529091529020600301549091508015610e4257610e3982826122cb565b9250505061092c565b509392505050565b6005546001600160a01b03163314610e745760405162461bcd60e51b815260040161095c90612e46565b600660009054906101000a90046001600160a01b03166001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ec7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eeb9190612f5f565b6001600160a01b031663c9c6539630600660009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f4d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f719190612f5f565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af1158015610fbe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fe29190612f5f565b600780546001600160a01b0319166001600160a01b0392831690811782556000908152601c60209081526040808320805460ff199081166001908117909255945486168452601d909252909120805490921617905560065461104a91309116610d688261142c565b6006546001600160a01b031663f305d71947306110668161142c565b60008061107b6005546001600160a01b031690565b426040518863ffffffff1660e01b815260040161109d96959493929190612f7c565b60606040518083038185885af11580156110bb573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906109f09190612fb7565b6008546001600160a01b031633148061110357506005546001600160a01b031633145b61111f5760405162461bcd60e51b815260040161095c90612f0f565b816018828154811061113357611133612ea4565b9060005260206000200154036111b15760405162461bcd60e51b815260206004820152603c60248201527f4f4154482044414f203a2063616e206e6f7420757064617465207374616b696e60448201527f67456d697373696f6e5261746520746f2073616d652076616c75652100000000606482015260840161095c565b81601882815481106111c5576111c5612ea4565b6000918252602090912001555050565b602181815481106111e557600080fd5b60009182526020909120600290910201805460019091015490915082565b6008546001600160a01b031633148061122657506005546001600160a01b031633145b6112425760405162461bcd60e51b815260040161095c90612f0f565b601880548061125357611253612fe5565b60019003818190600052602060002001600090559055565b6008546001600160a01b031633148061128e57506005546001600160a01b031633145b6112aa5760405162461bcd60e51b815260040161095c90612f0f565b806000036113195760405162461bcd60e51b815260206004820152603660248201527f4f4154482044414f203a2063616e206e6f7420757064617465207374616b696e60448201527567456d697373696f6e5261746520746f207a65726f2160501b606482015260840161095c565b601880546001810182556000919091527fb13d2d76d1f4b7be834882e410b3e3a8afaf69f83600ae24db354391d2378d2e0155565b604080518082018252606080825260208083018290526001600160a01b0385166000908152818052849020845181549283028101840186529485018281529394939092849284918401828280156113c457602002820191906000526020600020905b8154815260200190600101908083116113b0575b505050505081526020016001820180548060200260200160405190810160405280929190818152602001828054801561141c57602002820191906000526020600020905b815481526020019060010190808311611408575b5050505050815250509050919050565b6001600160a01b031660009081526020819052604090205490565b6005546001600160a01b031633146114715760405162461bcd60e51b815260040161095c90612e46565b61147b60006124dc565b565b6005546001600160a01b031633146114a75760405162461bcd60e51b815260040161095c90612e46565b600d805460ff19169055565b60195460ff166114d55760405162461bcd60e51b815260040161095c90612ecd565b6114df3382610a19565b1561157957336000908152601f6020908152604080832084845290915281206002018054849290611511908490612e91565b90915550611521905033826123bd565b336000908152601f602090815260408083208584529091528120600301805490919061154e908490612e91565b9091555050336000908152601f602090815260408083208484529091529020426001909101556115e4565b6040805160808101825233808252426020808401918252838501878152600060608601818152948152601f8352868120888252909252949020925183546001600160a01b0319166001600160a01b039091161783555160018301559151600282015590516003909101555b81602182815481106115f8576115f8612ea4565b906000526020600020906002020160010160008282546116189190612e91565b9250508190555081601560008282546116319190612e91565b909155506116419050338361252e565b5050565b6008546001600160a01b031633148061166857506005546001600160a01b031633145b6116845760405162461bcd60e51b815260040161095c90612f0f565b6040805180820190915242815260006020820181815260218054600181018255925291517f3a6357012c1a3ae0a17d304c9920310382d968ebcc4b1771f41c6b304205b57060029092029182015590517f3a6357012c1a3ae0a17d304c9920310382d968ebcc4b1771f41c6b304205b57190910155565b6008546000906001600160a01b031633148061172157506005546001600160a01b031633145b61173d5760405162461bcd60e51b815260040161095c90612f0f565b620186a061174a60025490565b611755906001612ffb565b61175f9190613012565b8210156117d45760405162461bcd60e51b815260206004820152603860248201527f53776170207468726573686f6c642063616e6e6f74206265206c6f776572207460448201527f68616e20302e3030312520746f74616c20737570706c792e0000000000000000606482015260840161095c565b6103e86117e060025490565b6117eb906005612ffb565b6117f59190613012565b82111561186a5760405162461bcd60e51b815260206004820152603760248201527f53776170207468726573686f6c642063616e6e6f74206265206869676865722060448201527f7468616e20302e352520746f74616c20737570706c792e000000000000000000606482015260840161095c565b50600c81905560015b919050565b60606004805461089590612e0c565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091908381101561190c5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b606482015260840161095c565b610a0e8286868403611a85565b600033610926818585611c3b565b6005546001600160a01b031633146119515760405162461bcd60e51b815260040161095c90612e46565b6001600160a01b03919091166000908152601b60205260409020805460ff1916911515919091179055565b6008546001600160a01b031633148061199f57506005546001600160a01b031633145b6119bb5760405162461bcd60e51b815260040161095c90612f0f565b61147b6119c73061142c565b61267c565b601881815481106119dc57600080fd5b600091825260209091200154905081565b6005546001600160a01b03163314611a175760405162461bcd60e51b815260040161095c90612e46565b6001600160a01b038116611a7c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161095c565b610df8816124dc565b6001600160a01b038316611ae75760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840161095c565b6001600160a01b038216611b485760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840161095c565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b038381166000908152600160209081526040808320938616835292905220546000198114611c355781811015611c285760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000604482015260640161095c565b611c358484848403611a85565b50505050565b6001600160a01b038316611c615760405162461bcd60e51b815260040161095c90613034565b6001600160a01b038216611c875760405162461bcd60e51b815260040161095c90613079565b80600003611c9b576109f0838360006127d6565b600d5460ff1615612076576005546001600160a01b03848116911614801590611cd257506005546001600160a01b03838116911614155b8015611ce957506001600160a01b03821661dead14155b8015611cff5750600754600160a01b900460ff16155b15612076576005546001600160a01b03838116911614801590611d3057506006546001600160a01b03838116911614155b8015611d4a57506007546001600160a01b03838116911614155b15611df857326000908152601e60205260409020544311611de55760405162461bcd60e51b815260206004820152604960248201527f5f7472616e736665723a3a205472616e736665722044656c617920656e61626c60448201527f65642e20204f6e6c79206f6e652070757263686173652070657220626c6f636b6064820152681030b63637bbb2b21760b91b608482015260a40161095c565b326000908152601e602052604090204390555b6001600160a01b0383166000908152601d602052604090205460ff168015611e3957506001600160a01b0382166000908152601c602052604090205460ff16155b15611f2957600a54811115611ec05760405162461bcd60e51b815260206004820152604160248201527f5f7472616e736665723a3a20427579207472616e7366657220616d6f756e742060448201527f6578636565647320746865206d61785472616e73616374696f6e416d6f756e746064820152601760f91b608482015260a40161095c565b600b54611ecc8361142c565b611ed69083612e91565b1115611f245760405162461bcd60e51b815260206004820152601f60248201527f5f7472616e736665723a3a204d61782077616c6c657420657863656564656400604482015260640161095c565b612076565b6001600160a01b0382166000908152601d602052604090205460ff168015611f6a57506001600160a01b0383166000908152601c602052604090205460ff16155b15611ff257600a54811115611f245760405162461bcd60e51b815260206004820152604260248201527f5f7472616e736665723a3a2053656c6c207472616e7366657220616d6f756e7460448201527f206578636565647320746865206d61785472616e73616374696f6e416d6f756e6064820152613a1760f11b608482015260a40161095c565b6001600160a01b0382166000908152601c602052604090205460ff1661207657600b5461201e8361142c565b6120289083612e91565b11156120765760405162461bcd60e51b815260206004820152601f60248201527f5f7472616e736665723a3a204d61782077616c6c657420657863656564656400604482015260640161095c565b60006120813061142c565b600c54909150811080159081906120a25750600754600160a01b900460ff16155b80156120c757506001600160a01b0385166000908152601d602052604090205460ff16155b80156120ec57506001600160a01b0385166000908152601b602052604090205460ff16155b801561211157506001600160a01b0384166000908152601b602052604090205460ff16155b1561213f576007805460ff60a01b1916600160a01b17905561213161292a565b6007805460ff60a01b191690555b6007546001600160a01b0386166000908152601b602052604090205460ff600160a01b90920482161591168061218d57506001600160a01b0385166000908152601b602052604090205460ff165b806121d557506001600160a01b0386166000908152601d602052604090205460ff161580156121d557506001600160a01b0385166000908152601d602052604090205460ff16155b156121de575060005b600081156122b7576122066064612200600e5488612adc90919063ffffffff16565b90612ae8565b9050600e54601054826122199190612ffb565b6122239190613012565b601360008282546122349190612e91565b9091555050600e546011546122499083612ffb565b6122539190613012565b601460008282546122649190612e91565b9091555050600e54600f546122799083612ffb565b6122839190613012565b601260008282546122949190612e91565b909155505080156122aa576122aa8730836127d6565b6122b48186612eba565b94505b6122c28787876127d6565b50505050505050565b60006122d78284612e91565b9392505050565b6001600160a01b0382166123345760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640161095c565b80600260008282546123469190612e91565b90915550506001600160a01b03821660009081526020819052604081208054839290612373908490612e91565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b60006123c98383610a19565b6124155760405162461bcd60e51b815260206004820152601f60248201527f4f4154482044414f203a2055736572206973206e6f74207374616b696e672e00604482015260640161095c565b6001600160a01b0383166000908152601f60209081526040808320858452909152812060028101546001918201549092916124509190612ae8565b9050600061245f426001612ae8565b9050600061246d8284612af4565b905060006124a6606461220060188a8154811061248c5761248c612ea4565b906000526020600020015488612adc90919063ffffffff16565b905060006124c0603c61220081816018818861016d612ae8565b905060006124ce8285612adc565b9a9950505050505050505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b03821661258e5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b606482015260840161095c565b6001600160a01b038216600090815260208190526040902054818110156126025760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b606482015260840161095c565b6001600160a01b0383166000908152602081905260408120838303905560028054849290612631908490612eba565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b60408051600280825260608201835260009260208301908036833701905050905030816000815181106126b1576126b1612ea4565b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa15801561270a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061272e9190612f5f565b8160018151811061274157612741612ea4565b6001600160a01b0392831660209182029290920101526006546127679130911684611a85565b60065460405163791ac94760e01b81526001600160a01b039091169063791ac947906127a09085906000908690309042906004016130bc565b600060405180830381600087803b1580156127ba57600080fd5b505af11580156127ce573d6000803e3d6000fd5b505050505050565b6001600160a01b0383166127fc5760405162461bcd60e51b815260040161095c90613034565b6001600160a01b0382166128225760405162461bcd60e51b815260040161095c90613079565b6001600160a01b0383166000908152602081905260409020548181101561289a5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b606482015260840161095c565b6001600160a01b038085166000908152602081905260408082208585039055918516815290812080548492906128d1908490612e91565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161291d91815260200190565b60405180910390a3611c35565b60006129353061142c565b9050600060145460125460135461294c9190612e91565b6129569190612e91565b9050811580612963575080155b1561296c575050565b600c5482111561297c57600c5491505b60006002826013548561298f9190612ffb565b6129999190613012565b6129a39190613012565b905060006129b18483612af4565b9050476129bd8261267c565b60006129c94783612af4565b905060006129e68661220060125485612adc90919063ffffffff16565b90506000612a038761220060145486612adc90919063ffffffff16565b9050600081612a128486612eba565b612a1c9190612eba565b6000601381905560128190556014556008549091506001600160a01b03166108fc612a4785856122cb565b6040518115909202916000818181858888f19350505050158015612a6f573d6000803e3d6000fd5b506009546001600160a01b03166108fc612a8985806122cb565b6040518115909202916000818181858888f19350505050158015612ab1573d6000803e3d6000fd5b50600087118015612ac25750600081115b15612ad157612ad18782612b00565b505050505050505050565b60006122d78284612ffb565b60006122d78284613012565b60006122d78284612eba565b600654612b189030906001600160a01b031684611a85565b60065460085460405163f305d71960e01b81526001600160a01b039283169263f305d719928592612b589230928992600092839216904290600401612f7c565b60606040518083038185885af1158015612b76573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612b9b9190612fb7565b5050505050565b600060208083528351808285015260005b81811015612bcf57858101830151858201604001528201612bb3565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114610df857600080fd5b60008060408385031215612c1857600080fd5b8235612c2381612bf0565b946020939093013593505050565b600080600060608486031215612c4657600080fd5b505081359360208301359350604090920135919050565b600080600060608486031215612c7257600080fd5b8335612c7d81612bf0565b92506020840135612c8d81612bf0565b929592945050506040919091013590565b600060208284031215612cb057600080fd5b5035919050565b8035801515811461187357600080fd5b600060208284031215612cd957600080fd5b6122d782612cb7565b60008060408385031215612cf557600080fd5b50508035926020909101359150565b600060208284031215612d1657600080fd5b81356122d781612bf0565b600081518084526020808501945080840160005b83811015612d5157815187529582019590820190600101612d35565b509495945050505050565b602081526000825160406020840152612d786060840182612d21565b90506020840151601f19848303016040850152612d958282612d21565b95945050505050565b60008060408385031215612db157600080fd5b8235612dbc81612bf0565b9150612dca60208401612cb7565b90509250929050565b60008060408385031215612de657600080fd5b8235612df181612bf0565b91506020830135612e0181612bf0565b809150509250929050565b600181811c90821680612e2057607f821691505b602082108103612e4057634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b8082018082111561092c5761092c612e7b565b634e487b7160e01b600052603260045260246000fd5b8181038181111561092c5761092c612e7b565b60208082526022908201527f4f4154482044414f203a205374616b696e67206973206e6f7420656e61626c65604082015261321760f11b606082015260800190565b60208082526030908201527f43616c6c6572206973206e6f7420746865205f7465616d57616c6c657420616460408201526f323932b9b9903737b91037bbb732b91760811b606082015260800190565b600060208284031215612f7157600080fd5b81516122d781612bf0565b6001600160a01b039687168152602081019590955260408501939093526060840191909152909216608082015260a081019190915260c00190565b600080600060608486031215612fcc57600080fd5b8351925060208401519150604084015190509250925092565b634e487b7160e01b600052603160045260246000fd5b808202811582820484141761092c5761092c612e7b565b60008261302f57634e487b7160e01b600052601260045260246000fd5b500490565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b8181101561310c5784516001600160a01b0316835293830193918301916001016130e7565b50506001600160a01b0396909616606085015250505060800152939250505056fea2646970667358221220c0c24ed50e91673e40331183214352478bfb93f88b0b6b86414c0ee2395f033764736f6c63430008110033

Deployed Bytecode Sourcemap

18299:17296:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1775:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2707:201;;;;;;;;;;-1:-1:-1;2707:201:0;;;;;:::i;:::-;;:::i;:::-;;;1188:14:1;;1181:22;1163:41;;1151:2;1136:18;2707:201:0;1023:187:1;18740:24:0;;;;;;;;;;;;;;;;;;;1361:25:1;;;1349:2;1334:18;18740:24:0;1215:177:1;2096:108:0;;;;;;;;;;-1:-1:-1;2184:12:0;;2096:108;;19156:34;;;;;;;;;;-1:-1:-1;19156:34:0;;;;;;;;23296:374;;;;;;;;;;-1:-1:-1;23296:374:0;;;;;:::i;:::-;;:::i;:::-;;2916:295;;;;;;;;;;-1:-1:-1;2916:295:0;;;;;:::i;:::-;;:::i;31112:167::-;;;;;;;;;;-1:-1:-1;31112:167:0;;;;;:::i;:::-;;:::i;34354:797::-;;;;;;;;;;-1:-1:-1;34354:797:0;;;;;:::i;:::-;;:::i;1995:93::-;;;;;;;;;;-1:-1:-1;1995:93:0;;2078:2;2506:36:1;;2494:2;2479:18;1995:93:0;2364:184:1;33736:533:0;;;;;;;;;;-1:-1:-1;33736:533:0;;;;;:::i;:::-;;:::i;3219:240::-;;;;;;;;;;-1:-1:-1;3219:240:0;;;;;:::i;:::-;;:::i;35456:99::-;;;;;;;;;;-1:-1:-1;35456:99:0;;;;;:::i;:::-;;:::i;30657:111::-;;;;;;;;;;;;;:::i;31786:358::-;;;;;;;;;;-1:-1:-1;31786:358:0;;;;;:::i;:::-;;:::i;22213:635::-;;;;;;;;;;;;;:::i;18698:33::-;;;;;;;;;;-1:-1:-1;18698:33:0;;;;;;;;24050:307;;;;;;;;;;-1:-1:-1;24050:307:0;;;;;:::i;:::-;;:::i;24863:127::-;;;;;;;;;;-1:-1:-1;24863:127:0;;;;;:::i;:::-;-1:-1:-1;;;;;24954:28:0;24930:4;24954:28;;;:19;:28;;;;;;;;;24863:127;20217:33;;;;;;;;;;-1:-1:-1;20217:33:0;;;;;:::i;:::-;;:::i;:::-;;;;3582:25:1;;;3638:2;3623:18;;3616:34;;;;3555:18;20217:33:0;3408:248:1;35341:107:0;;;;;;;;;;-1:-1:-1;35421:12:0;:19;35341:107;;23939:103;;;;;;;;;;;;;:::i;23678:253::-;;;;;;;;;;-1:-1:-1;23678:253:0;;;;;:::i;:::-;;:::i;31583:131::-;;;;;;;;;;-1:-1:-1;31583:131:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;2212:127::-;;;;;;;;;;-1:-1:-1;2212:127:0;;;;;:::i;:::-;;:::i;15137:103::-;;;;;;;;;;;;;:::i;19043:27::-;;;;;;;;;;-1:-1:-1;19043:27:0;;;;-1:-1:-1;;;;;19043:27:0;;;;;;-1:-1:-1;;;;;4833:32:1;;;4815:51;;4803:2;4788:18;19043:27:0;4669:203:1;22930:84:0;;;;;;;;;;;;;:::i;32952:697::-;;;;;;;;;;-1:-1:-1;32952:697:0;;;;;:::i;:::-;;:::i;19010:26::-;;;;;;;;;;;;;;;;35159:174;;;;;;;;;;;;;:::i;24365:404::-;;;;;;;;;;-1:-1:-1;24365:404:0;;;;;:::i;:::-;;:::i;14914:87::-;;;;;;;;;;-1:-1:-1;14987:6:0;;-1:-1:-1;;;;;14987:6:0;14914:87;;1883:104;;;;;;;;;;;;;:::i;31351:149::-;;;;;;;;;;-1:-1:-1;31351:149:0;;;;;:::i;:::-;-1:-1:-1;;;;;31456:16:0;;;;31429:7;31456:16;;;:8;:16;;;;;;;;:29;;;;;;;:36;;;;31351:149;3467:438;;;;;;;;;;-1:-1:-1;3467:438:0;;;;;:::i;:::-;;:::i;2347:193::-;;;;;;;;;;-1:-1:-1;2347:193:0;;;;;:::i;:::-;;:::i;23080:132::-;;;;;;;;;;-1:-1:-1;23080:132:0;;;;;:::i;:::-;;:::i;18572:35::-;;;;;;;;;;;;;;;;18647:34;;;;;;;;;;;;;;;;19197:27;;;;;;;;;;;;;;;;2548:151;;;;;;;;;;-1:-1:-1;2548:151:0;;;;;:::i;:::-;-1:-1:-1;;;;;2664:18:0;;;2637:7;2664:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;2548:151;30861:104;;;;;;;;;;;;;:::i;19110:37::-;;;;;;;;;;-1:-1:-1;19110:37:0;;;;;:::i;:::-;;:::i;15248:201::-;;;;;;;;;;-1:-1:-1;15248:201:0;;;;;:::i;:::-;;:::i;19077:26::-;;;;;;;;;;-1:-1:-1;19077:26:0;;;;-1:-1:-1;;;;;19077:26:0;;;18614:24;;;;;;;;;;;;;;;;1775:100;1829:13;1862:5;1855:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1775:100;:::o;2707:201::-;2790:4;317:10;2846:32;317:10;2862:7;2871:6;2846:8;:32::i;:::-;2896:4;2889:11;;;2707:201;;;;;:::o;23296:374::-;14987:6;;-1:-1:-1;;;;;14987:6:0;317:10;15049:23;15041:68;;;;-1:-1:-1;;;15041:68:0;;;;;;;:::i;:::-;;;;;;;;;23410:13:::1;:28:::0;;;23449:13:::1;:28:::0;;;23488:11:::1;:24:::0;;;23502:10;23537:29:::1;23465:12:::0;23426;23537:29:::1;:::i;:::-;:43;;;;:::i;:::-;23525:9;:55:::0;;;23614:2:::1;-1:-1:-1::0;23601:15:0::1;23593:69;;;::::0;-1:-1:-1;;;23593:69:0;;6800:2:1;23593:69:0::1;::::0;::::1;6782:21:1::0;6839:2;6819:18;;;6812:30;6878:34;6858:18;;;6851:62;-1:-1:-1;;;6929:18:1;;;6922:39;6978:19;;23593:69:0::1;6598:405:1::0;23593:69:0::1;23296:374:::0;;;:::o;2916:295::-;3047:4;317:10;3105:38;3121:4;317:10;3136:6;3105:15;:38::i;:::-;3154:27;3164:4;3170:2;3174:6;3154:9;:27::i;:::-;-1:-1:-1;3199:4:0;;2916:295;-1:-1:-1;;;;2916:295:0:o;31112:167::-;-1:-1:-1;;;;;31217:54:0;;;31193:4;31217:20;;;:8;:20;;;;;;;;:33;;;;;;;;;;:40;;;;:54;;31112:167::o;34354:797::-;34420:34;34430:10;34442:11;34420:9;:34::i;:::-;34412:68;;;;-1:-1:-1;;;34412:68:0;;7210:2:1;34412:68:0;;;7192:21:1;7249:2;7229:18;;;7222:30;-1:-1:-1;;;7268:18:1;;;7261:51;7329:18;;34412:68:0;7008:345:1;34412:68:0;34493:14;34510:35;34521:10;34533:11;34510:10;:35::i;:::-;34562:14;;34493:52;;-1:-1:-1;34562:14:0;;34558:378;;;34607:10;34593:25;;;;:13;:25;;;;;;:53;;;;;;;;;;;;;;34630:15;34593:53;;;;;;34661:33;;;:46;;;;;;;;;;;;;;;;34722:12;:22;;34700:6;;34593:25;34722:22;;34700:6;;34722:22;:::i;:::-;;;;-1:-1:-1;;34767:10:0;34779:20;;;;:8;:20;;;;;;;;:33;;;;;;;;:40;;;34761:71;;34767:10;34779:52;;34824:6;34779:44;:52::i;:::-;34761:5;:71::i;:::-;34558:378;;;34871:10;34883:20;;;;:8;:20;;;;;;;;:33;;;;;;;;:40;;;34865:59;;34871:10;34865:5;:59::i;:::-;34993:10;34984:20;;;;:8;:20;;;;;;;;:33;;;;;;;;:40;;;34948:12;:25;;35005:11;;34948:25;;;;;;:::i;:::-;;;;;;;;;;;:32;;;:76;;;;;;;:::i;:::-;;;;-1:-1:-1;;35059:10:0;35050:20;;;;:8;:20;;;;;;;;:33;;;;;;;;:40;;;35035:11;:55;;35050:40;;35035:11;;:55;;35050:40;;35035:55;:::i;:::-;;;;-1:-1:-1;;35119:10:0;35110:20;;;;:8;:20;;;;;;;;:33;;;;;;;;;35103:40;;-1:-1:-1;;;;;;35103:40:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34354:797:0:o;33736:533::-;20583:14;;;;20575:61;;;;-1:-1:-1;;;20575:61:0;;;;;;;:::i;:::-;33817:34:::1;33827:10;33839:11;33817:9;:34::i;:::-;33809:68;;;::::0;-1:-1:-1;;;33809:68:0;;7210:2:1;33809:68:0::1;::::0;::::1;7192:21:1::0;7249:2;7229:18;;;7222:30;-1:-1:-1;;;7268:18:1;;;7261:51;7329:18;;33809:68:0::1;7008:345:1::0;33809:68:0::1;33890:14;33907:35;33918:10;33930:11;33907:10;:35::i;:::-;33969:10;33955:25;::::0;;;:13:::1;:25:::0;;;;;;:53;;::::1;::::0;;::::1;::::0;;;;;;;;33992:15:::1;33955:53:::0;::::1;::::0;;;;34019:33;;::::1;:46:::0;;;;::::1;::::0;;;;;;;::::1;::::0;;;34076:12:::1;:22:::0;;33890:52;;-1:-1:-1;33890:52:0;;34076:12;;33955:25;34076:22:::1;::::0;33890:52;;34076:22:::1;:::i;:::-;::::0;;;-1:-1:-1;34111:25:0::1;::::0;-1:-1:-1;34117:10:0::1;34129:6:::0;34111:5:::1;:25::i;:::-;-1:-1:-1::0;34158:10:0::1;34149:20;::::0;;;:8:::1;:20;::::0;;;;;;;:33;;;;;;;;;34191:15:::1;34149:39;::::0;::::1;:57:::0;34217:40:::1;;:44:::0;33736:533::o;3219:240::-;317:10;3307:4;3388:18;;;:11;:18;;;;;;;;-1:-1:-1;;;;;3388:27:0;;;;;;;;;;3307:4;;317:10;3363:66;;317:10;;3388:27;;:40;;3418:10;;3388:40;:::i;:::-;3363:8;:66::i;35456:99::-;20391:11;;-1:-1:-1;;;;;20391:11:0;317:10;20391:27;;:64;;-1:-1:-1;14987:6:0;;-1:-1:-1;;;;;14987:6:0;317:10;20432:23;20391:64;20383:125;;;;-1:-1:-1;;;20383:125:0;;;;;;;:::i;:::-;35525:14:::1;:22:::0;;-1:-1:-1;;35525:22:0::1;::::0;::::1;;::::0;;;::::1;::::0;;35456:99::o;30657:111::-;30716:11;;30708:52;;-1:-1:-1;;;;;30716:11:0;;;;30738:21;30708:52;;;;;30716:11;30708:52;30716:11;30708:52;30738:21;30716:11;30708:52;;;;;;;;;;;;;;;;;;;;;30657:111::o;31786:358::-;31864:7;31884:23;31910:32;31922:6;31930:11;31910;:32::i;:::-;31989:10;31953:24;31980:20;;;:8;:20;;;;;;;;:33;;;;;;;;:40;;;31884:58;;-1:-1:-1;32037:20:0;;32033:70;;32066:37;:15;32086:16;32066:19;:37::i;:::-;32059:44;;;;;;32033:70;-1:-1:-1;32121:15:0;31786:358;-1:-1:-1;;;31786:358:0:o;22213:635::-;14987:6;;-1:-1:-1;;;;;14987:6:0;317:10;15049:23;15041:68;;;;-1:-1:-1;;;15041:68:0;;;;;;;:::i;:::-;22300:15:::1;;;;;;;;;-1:-1:-1::0;;;;;22300:15:0::1;-1:-1:-1::0;;;;;22300:23:0::1;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;22282:55:0::1;;22346:4;22353:15;;;;;;;;;-1:-1:-1::0;;;;;22353:15:0::1;-1:-1:-1::0;;;;;22353:20:0::1;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22282:94;::::0;-1:-1:-1;;;;;;22282:94:0::1;::::0;;;;;;-1:-1:-1;;;;;8929:15:1;;;22282:94:0::1;::::0;::::1;8911:34:1::0;8981:15;;8961:18;;;8954:43;8846:18;;22282:94:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22266:13;:110:::0;;-1:-1:-1;;;;;;22266:110:0::1;-1:-1:-1::0;;;;;22266:110:0;;::::1;::::0;;::::1;::::0;;-1:-1:-1;22387:55:0;;;:31:::1;:55;::::0;;;;;;;:62;;-1:-1:-1;;22387:62:0;;::::1;-1:-1:-1::0;22387:62:0;;::::1;::::0;;;22495:13;;;::::1;22460:50:::0;;:26:::1;:50:::0;;;;;;:57;;;;::::1;;::::0;;22562:15:::1;::::0;22530:75:::1;::::0;22547:4:::1;::::0;22562:15:::1;22580:24;22547:4:::0;22580:9:::1;:24::i;22530:75::-;22616:15;::::0;-1:-1:-1;;;;;22616:15:0::1;:31;22655:21;22701:4;22721:24;22701:4:::0;22721:9:::1;:24::i;:::-;22760:1;22776::::0;22792:7:::1;14987:6:::0;;-1:-1:-1;;;;;14987:6:0;;14914:87;22792:7:::1;22814:15;22616:224;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;24050:307::-:0;20391:11;;-1:-1:-1;;;;;20391:11:0;317:10;20391:27;;:64;;-1:-1:-1;14987:6:0;;-1:-1:-1;;;;;14987:6:0;317:10;20432:23;20391:64;20383:125;;;;-1:-1:-1;;;20383:125:0;;;;;;;:::i;:::-;24203:20:::1;24172:19;24192:6;24172:27;;;;;;;;:::i;:::-;;;;;;;;;:51:::0;24163:125:::1;;;::::0;-1:-1:-1;;;24163:125:0;;10133:2:1;24163:125:0::1;::::0;::::1;10115:21:1::0;10172:2;10152:18;;;10145:30;10211:34;10191:18;;;10184:62;10282:30;10262:18;;;10255:58;10330:19;;24163:125:0::1;9931:424:1::0;24163:125:0::1;24329:20;24299:19;24319:6;24299:27;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;:50:::0;-1:-1:-1;;24050:307:0:o;20217:33::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20217:33:0;:::o;23939:103::-;20391:11;;-1:-1:-1;;;;;20391:11:0;317:10;20391:27;;:64;;-1:-1:-1;14987:6:0;;-1:-1:-1;;;;;14987:6:0;317:10;20432:23;20391:64;20383:125;;;;-1:-1:-1;;;20383:125:0;;;;;;;:::i;:::-;24009:19:::1;:25;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;23939:103::o:0;23678:253::-;20391:11;;-1:-1:-1;;;;;20391:11:0;317:10;20391:27;;:64;;-1:-1:-1;14987:6:0;;-1:-1:-1;;;;;14987:6:0;317:10;20432:23;20391:64;20383:125;;;;-1:-1:-1;;;20383:125:0;;;;;;;:::i;:::-;23782:20:::1;23806:1;23782:25:::0;23773:93:::1;;;::::0;-1:-1:-1;;;23773:93:0;;10694:2:1;23773:93:0::1;::::0;::::1;10676:21:1::0;10733:2;10713:18;;;10706:30;10772:34;10752:18;;;10745:62;-1:-1:-1;;;10823:18:1;;;10816:52;10885:19;;23773:93:0::1;10492:418:1::0;23773:93:0::1;23877:19;:46:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;23877:46:0;;;;;::::1;::::0;23678:253::o;31583:131::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;31685:21:0;;-1:-1:-1;31685:21:0;;;;;;;;;31678:28;;;;;;;;;;;;;;;;;;;-1:-1:-1;;31678:28:0;31685:21;;31678:28;;31685:21;;31678:28;;31685:21;31678:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31583:131;;;:::o;2212:127::-;-1:-1:-1;;;;;2313:18:0;2286:7;2313:18;;;;;;;;;;;;2212:127::o;15137:103::-;14987:6;;-1:-1:-1;;;;;14987:6:0;317:10;15049:23;15041:68;;;;-1:-1:-1;;;15041:68:0;;;;;;;:::i;:::-;15202:30:::1;15229:1;15202:18;:30::i;:::-;15137:103::o:0;22930:84::-;14987:6;;-1:-1:-1;;;;;14987:6:0;317:10;15049:23;15041:68;;;;-1:-1:-1;;;15041:68:0;;;;;;;:::i;:::-;22984:14:::1;:22:::0;;-1:-1:-1;;22984:22:0::1;::::0;;22930:84::o;32952:697::-;20583:14;;;;20575:61;;;;-1:-1:-1;;;20575:61:0;;;;;;;:::i;:::-;33099:34:::1;33109:10;33121:11;33099:9;:34::i;:::-;33095:409;;;33159:10;33150:20;::::0;;;:8:::1;:20;::::0;;;;;;;:33;;;;;;;;:40:::1;;:55:::0;;33194:11;;33150:20;:55:::1;::::0;33194:11;;33150:55:::1;:::i;:::-;::::0;;;-1:-1:-1;33264:36:0::1;::::0;-1:-1:-1;33276:10:0::1;33288:11:::0;33264::::1;:36::i;:::-;33229:10;33220:20;::::0;;;:8:::1;:20;::::0;;;;;;;:33;;;;;;;;:40:::1;;:80:::0;;:40;;:20;:80:::1;::::0;;;::::1;:::i;:::-;::::0;;;-1:-1:-1;;33324:10:0::1;33315:20;::::0;;;:8:::1;:20;::::0;;;;;;;:33;;;;;;;;33357:15:::1;33315:39;::::0;;::::1;:57:::0;33095:409:::1;;;33441:51;::::0;;::::1;::::0;::::1;::::0;;33448:10:::1;33441:51:::0;;;33460:15:::1;33441:51;::::0;;::::1;::::0;;;;;;;;;-1:-1:-1;33441:51:0;;;;;;33405:20;;;:8:::1;:20:::0;;;;;:33;;;;;;;;;:87;;;;-1:-1:-1;;;;;;33405:87:0::1;-1:-1:-1::0;;;;;33405:87:0;;::::1;;::::0;;;-1:-1:-1;33405:87:0;::::1;::::0;;;::::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;33095:409:::1;33552:11;33516:12;33529:11;33516:25;;;;;;;;:::i;:::-;;;;;;;;;;;:32;;;:47;;;;;;;:::i;:::-;;;;;;;;33589:11;33574;;:26;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;33611:30:0::1;::::0;-1:-1:-1;33617:10:0::1;33629:11:::0;33611:5:::1;:30::i;:::-;32952:697:::0;;:::o;35159:174::-;20391:11;;-1:-1:-1;;;;;20391:11:0;317:10;20391:27;;:64;;-1:-1:-1;14987:6:0;;-1:-1:-1;;;;;14987:6:0;317:10;20432:23;20391:64;20383:125;;;;-1:-1:-1;;;20383:125:0;;;;;;;:::i;:::-;35253:31:::1;::::0;;;;::::1;::::0;;;35265:15:::1;35253:31:::0;;-1:-1:-1;35253:31:0::1;::::0;::::1;::::0;;;35295:12:::1;:30:::0;;::::1;::::0;::::1;::::0;;;;;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;35159:174::o;24365:404::-;20391:11;;24452:4;;-1:-1:-1;;;;;20391:11:0;317:10;20391:27;;:64;;-1:-1:-1;14987:6:0;;-1:-1:-1;;;;;14987:6:0;317:10;20432:23;20391:64;20383:125;;;;-1:-1:-1;;;20383:125:0;;;;;;;:::i;:::-;24512:6:::1;24492:13;2184:12:::0;;;2096:108;24492:13:::1;:17;::::0;24508:1:::1;24492:17;:::i;:::-;:26;;;;:::i;:::-;24476:12;:42;;24468:111;;;::::0;-1:-1:-1;;;24468:111:0;;11512:2:1;24468:111:0::1;::::0;::::1;11494:21:1::0;11551:2;11531:18;;;11524:30;11590:34;11570:18;;;11563:62;11661:26;11641:18;;;11634:54;11705:19;;24468:111:0::1;11310:420:1::0;24468:111:0::1;24633:4;24613:13;2184:12:::0;;;2096:108;24613:13:::1;:17;::::0;24629:1:::1;24613:17;:::i;:::-;:24;;;;:::i;:::-;24597:12;:40;;24589:108;;;::::0;-1:-1:-1;;;24589:108:0;;11937:2:1;24589:108:0::1;::::0;::::1;11919:21:1::0;11976:2;11956:18;;;11949:30;12015:34;11995:18;;;11988:62;12086:25;12066:18;;;12059:53;12129:19;;24589:108:0::1;11735:419:1::0;24589:108:0::1;-1:-1:-1::0;24707:19:0::1;:34:::0;;;24758:4:::1;20519:1;24365:404:::0;;;:::o;1883:104::-;1939:13;1972:7;1965:14;;;;;:::i;3467:438::-;317:10;3560:4;3643:18;;;:11;:18;;;;;;;;-1:-1:-1;;;;;3643:27:0;;;;;;;;;;3560:4;;317:10;3689:35;;;;3681:85;;;;-1:-1:-1;;;3681:85:0;;12361:2:1;3681:85:0;;;12343:21:1;12400:2;12380:18;;;12373:30;12439:34;12419:18;;;12412:62;-1:-1:-1;;;12490:18:1;;;12483:35;12535:19;;3681:85:0;12159:401:1;3681:85:0;3802:60;3811:5;3818:7;3846:15;3827:16;:34;3802:8;:60::i;2347:193::-;2426:4;317:10;2482:28;317:10;2499:2;2503:6;2482:9;:28::i;23080:132::-;14987:6;;-1:-1:-1;;;;;14987:6:0;317:10;15049:23;15041:68;;;;-1:-1:-1;;;15041:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;23165:28:0;;;::::1;;::::0;;;:19:::1;:28;::::0;;;;:39;;-1:-1:-1;;23165:39:0::1;::::0;::::1;;::::0;;;::::1;::::0;;23080:132::o;30861:104::-;20391:11;;-1:-1:-1;;;;;20391:11:0;317:10;20391:27;;:64;;-1:-1:-1;14987:6:0;;-1:-1:-1;;;;;14987:6:0;317:10;20432:23;20391:64;20383:125;;;;-1:-1:-1;;;20383:125:0;;;;;;;:::i;:::-;30914:43:::1;30932:24;30950:4;30932:9;:24::i;:::-;30914:17;:43::i;19110:37::-:0;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;19110:37:0;:::o;15248:201::-;14987:6;;-1:-1:-1;;;;;14987:6:0;317:10;15049:23;15041:68;;;;-1:-1:-1;;;15041:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;15337:22:0;::::1;15329:73;;;::::0;-1:-1:-1;;;15329:73:0;;12767:2:1;15329:73:0::1;::::0;::::1;12749:21:1::0;12806:2;12786:18;;;12779:30;12845:34;12825:18;;;12818:62;-1:-1:-1;;;12896:18:1;;;12889:36;12942:19;;15329:73:0::1;12565:402:1::0;15329:73:0::1;15413:28;15432:8;15413:18;:28::i;5598:380::-:0;-1:-1:-1;;;;;5734:19:0;;5726:68;;;;-1:-1:-1;;;5726:68:0;;13174:2:1;5726:68:0;;;13156:21:1;13213:2;13193:18;;;13186:30;13252:34;13232:18;;;13225:62;-1:-1:-1;;;13303:18:1;;;13296:34;13347:19;;5726:68:0;12972:400:1;5726:68:0;-1:-1:-1;;;;;5813:21:0;;5805:68;;;;-1:-1:-1;;;5805:68:0;;13579:2:1;5805:68:0;;;13561:21:1;13618:2;13598:18;;;13591:30;13657:34;13637:18;;;13630:62;-1:-1:-1;;;13708:18:1;;;13701:32;13750:19;;5805:68:0;13377:398:1;5805:68:0;-1:-1:-1;;;;;5886:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;5938:32;;1361:25:1;;;5938:32:0;;1334:18:1;5938:32:0;;;;;;;5598:380;;;:::o;5986:453::-;-1:-1:-1;;;;;2664:18:0;;;6121:24;2664:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;-1:-1:-1;;6188:37:0;;6184:248;;6270:6;6250:16;:26;;6242:68;;;;-1:-1:-1;;;6242:68:0;;13982:2:1;6242:68:0;;;13964:21:1;14021:2;14001:18;;;13994:30;14060:31;14040:18;;;14033:59;14109:18;;6242:68:0;13780:353:1;6242:68:0;6354:51;6363:5;6370:7;6398:6;6379:16;:25;6354:8;:51::i;:::-;6110:329;5986:453;;;:::o;24998:3201::-;-1:-1:-1;;;;;25130:18:0;;25122:68;;;;-1:-1:-1;;;25122:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;25209:16:0;;25201:64;;;;-1:-1:-1;;;25201:64:0;;;;;;;:::i;:::-;25290:6;25300:1;25290:11;25286:93;;25318:28;25334:4;25340:2;25344:1;25318:15;:28::i;25286:93::-;25437:14;;;;25433:1440;;;14987:6;;-1:-1:-1;;;;;25490:15:0;;;14987:6;;25490:15;;;;:49;;-1:-1:-1;14987:6:0;;-1:-1:-1;;;;;25526:13:0;;;14987:6;;25526:13;;25490:49;:91;;;;-1:-1:-1;;;;;;25560:21:0;;25574:6;25560:21;;25490:91;:122;;;;-1:-1:-1;25603:9:0;;-1:-1:-1;;;25603:9:0;;;;25602:10;25490:122;25468:1394;;;14987:6;;-1:-1:-1;;;;;25651:13:0;;;14987:6;;25651:13;;;;:47;;-1:-1:-1;25682:15:0;;-1:-1:-1;;;;;25668:30:0;;;25682:15;;25668:30;;25651:47;:79;;;;-1:-1:-1;25716:13:0;;-1:-1:-1;;;;;25702:28:0;;;25716:13;;25702:28;;25651:79;25647:336;;;25787:9;25762:35;;;;:24;:35;;;;;;25800:12;-1:-1:-1;25754:136:0;;;;-1:-1:-1;;;25754:136:0;;15150:2:1;25754:136:0;;;15132:21:1;15189:2;15169:18;;;15162:30;15228:34;15208:18;;;15201:62;15299:34;15279:18;;;15272:62;-1:-1:-1;;;15350:19:1;;;15343:40;15400:19;;25754:136:0;14948:477:1;25754:136:0;25938:9;25913:35;;;;:24;:35;;;;;25951:12;25913:50;;25647:336;-1:-1:-1;;;;;26034:32:0;;;;;;:26;:32;;;;;;;;:72;;;;-1:-1:-1;;;;;;26071:35:0;;;;;;:31;:35;;;;;;;;26070:36;26034:72;26030:817;;;26149:20;;26139:6;:30;;26131:108;;;;-1:-1:-1;;;26131:108:0;;15632:2:1;26131:108:0;;;15614:21:1;15671:2;15651:18;;;15644:30;15710:34;15690:18;;;15683:62;15781:34;15761:18;;;15754:62;-1:-1:-1;;;15832:19:1;;;15825:32;15874:19;;26131:108:0;15430:469:1;26131:108:0;26296:9;;26279:13;26289:2;26279:9;:13::i;:::-;26270:22;;:6;:22;:::i;:::-;:35;;26262:79;;;;-1:-1:-1;;;26262:79:0;;16106:2:1;26262:79:0;;;16088:21:1;16145:2;16125:18;;;16118:30;16184:33;16164:18;;;16157:61;16235:18;;26262:79:0;15904:355:1;26262:79:0;26030:817;;;-1:-1:-1;;;;;26434:30:0;;;;;;:26;:30;;;;;;;;:72;;;;-1:-1:-1;;;;;;26469:37:0;;;;;;:31;:37;;;;;;;;26468:38;26434:72;26430:417;;;26549:20;;26539:6;:30;;26531:109;;;;-1:-1:-1;;;26531:109:0;;16466:2:1;26531:109:0;;;16448:21:1;16505:2;16485:18;;;16478:30;16544:34;16524:18;;;16517:62;16615:34;16595:18;;;16588:62;-1:-1:-1;;;16666:19:1;;;16659:33;16709:19;;26531:109:0;16264:470:1;26430:417:0;-1:-1:-1;;;;;26688:35:0;;;;;;:31;:35;;;;;;;;26683:164;;26782:9;;26765:13;26775:2;26765:9;:13::i;:::-;26756:22;;:6;:22;:::i;:::-;:35;;26748:79;;;;-1:-1:-1;;;26748:79:0;;16106:2:1;26748:79:0;;;16088:21:1;16145:2;16125:18;;;16118:30;16184:33;16164:18;;;16157:61;16235:18;;26748:79:0;15904:355:1;26748:79:0;26887:28;26918:24;26936:4;26918:9;:24::i;:::-;26992:19;;26887:55;;-1:-1:-1;26968:43:0;;;;;;;27040:34;;-1:-1:-1;27065:9:0;;-1:-1:-1;;;27065:9:0;;;;27064:10;27040:34;:84;;;;-1:-1:-1;;;;;;27092:32:0;;;;;;:26;:32;;;;;;;;27091:33;27040:84;:127;;;;-1:-1:-1;;;;;;27142:25:0;;;;;;:19;:25;;;;;;;;27141:26;27040:127;:168;;;;-1:-1:-1;;;;;;27185:23:0;;;;;;:19;:23;;;;;;;;27184:24;27040:168;27022:298;;;27235:9;:16;;-1:-1:-1;;;;27235:16:0;-1:-1:-1;;;27235:16:0;;;27266:10;:8;:10::i;:::-;27291:9;:17;;-1:-1:-1;;;;27291:17:0;;;27022:298;27348:9;;-1:-1:-1;;;;;27478:25:0;;27332:12;27478:25;;;:19;:25;;;;;;27348:9;-1:-1:-1;;;27348:9:0;;;;;27347:10;;27478:25;;:66;;-1:-1:-1;;;;;;27521:23:0;;;;;;:19;:23;;;;;;;;27478:66;:154;;;-1:-1:-1;;;;;;27564:32:0;;;;;;:26;:32;;;;;;;;27563:33;:68;;;;-1:-1:-1;;;;;;27601:30:0;;;;;;:26;:30;;;;;;;;27600:31;27563:68;27460:199;;;-1:-1:-1;27654:5:0;27460:199;27680:12;27711:7;27707:439;;;27742:30;27768:3;27742:21;27753:9;;27742:6;:10;;:21;;;;:::i;:::-;:25;;:30::i;:::-;27735:37;;27833:9;;27817:13;;27810:4;:20;;;;:::i;:::-;:32;;;;:::i;:::-;27787:19;;:55;;;;;;;:::i;:::-;;;;-1:-1:-1;;27899:9:0;;27885:11;;27878:18;;:4;:18;:::i;:::-;:30;;;;:::i;:::-;27857:17;;:51;;;;;;;:::i;:::-;;;;-1:-1:-1;;27969:9:0;;27953:13;;27946:20;;:4;:20;:::i;:::-;:32;;;;:::i;:::-;27923:19;;:55;;;;;;;:::i;:::-;;;;-1:-1:-1;;28011:8:0;;28007:91;;28040:42;28056:4;28070;28077;28040:15;:42::i;:::-;28120:14;28130:4;28120:14;;:::i;:::-;;;27707:439;28158:33;28174:4;28180:2;28184:6;28158:15;:33::i;:::-;25111:3088;;;;24998:3201;;;:::o;17028:98::-;17086:7;17113:5;17117:1;17113;:5;:::i;:::-;17106:12;17028:98;-1:-1:-1;;;17028:98:0:o;4592:399::-;-1:-1:-1;;;;;4676:21:0;;4668:65;;;;-1:-1:-1;;;4668:65:0;;16941:2:1;4668:65:0;;;16923:21:1;16980:2;16960:18;;;16953:30;17019:33;16999:18;;;16992:61;17070:18;;4668:65:0;16739:355:1;4668:65:0;4824:6;4808:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;4841:18:0;;:9;:18;;;;;;;;;;:28;;4863:6;;4841:9;:28;;4863:6;;4841:28;:::i;:::-;;;;-1:-1:-1;;4885:37:0;;1361:25:1;;;-1:-1:-1;;;;;4885:37:0;;;4902:1;;4885:37;;1349:2:1;1334:18;4885:37:0;;;;;;;32952:697;;:::o;32152:733::-;32232:7;32260:30;32270:6;32278:11;32260:9;:30::i;:::-;32252:74;;;;-1:-1:-1;;;32252:74:0;;17301:2:1;32252:74:0;;;17283:21:1;17340:2;17320:18;;;17313:30;17379:33;17359:18;;;17352:61;17430:18;;32252:74:0;17099:355:1;32252:74:0;-1:-1:-1;;;;;31456:16:0;;32339:14;31456:16;;;:8;:16;;;;;;;;:29;;;;;;;;:36;;;;32470:9;32430:35;;;;31456:36;;32339:14;32430:50;;:35;:39;:50::i;:::-;32398:82;-1:-1:-1;32491:31:0;32525:30;:15;32545:9;32525:19;:30::i;:::-;32491:64;-1:-1:-1;32566:21:0;32590:50;32491:64;32618:21;32590:27;:50::i;:::-;32566:74;;32653:12;32668:53;32717:3;32668:44;32679:19;32699:11;32679:32;;;;;;;;:::i;:::-;;;;;;;;;32668:6;:10;;:44;;;;:::i;:53::-;32653:68;-1:-1:-1;32732:20:0;32755:37;32789:2;32755:29;32789:2;32755:29;32773:2;32755:29;32653:68;32764:3;32755:8;:13::i;:37::-;32732:60;-1:-1:-1;32803:14:0;32820:31;32732:60;32837:13;32820:16;:31::i;:::-;32803:48;32152:733;-1:-1:-1;;;;;;;;;;32152:733:0:o;15457:191::-;15550:6;;;-1:-1:-1;;;;;15567:17:0;;;-1:-1:-1;;;;;;15567:17:0;;;;;;;15600:40;;15550:6;;;15567:17;15550:6;;15600:40;;15531:16;;15600:40;15520:128;15457:191;:::o;4999:591::-;-1:-1:-1;;;;;5083:21:0;;5075:67;;;;-1:-1:-1;;;5075:67:0;;17661:2:1;5075:67:0;;;17643:21:1;17700:2;17680:18;;;17673:30;17739:34;17719:18;;;17712:62;-1:-1:-1;;;17790:18:1;;;17783:31;17831:19;;5075:67:0;17459:397:1;5075:67:0;-1:-1:-1;;;;;5242:18:0;;5217:22;5242:18;;;;;;;;;;;5279:24;;;;5271:71;;;;-1:-1:-1;;;5271:71:0;;18063:2:1;5271:71:0;;;18045:21:1;18102:2;18082:18;;;18075:30;18141:34;18121:18;;;18114:62;-1:-1:-1;;;18192:18:1;;;18185:32;18234:19;;5271:71:0;17861:398:1;5271:71:0;-1:-1:-1;;;;;5378:18:0;;:9;:18;;;;;;;;;;5399:23;;;5378:44;;5444:12;:22;;5416:6;;5378:9;5444:22;;5416:6;;5444:22;:::i;:::-;;;;-1:-1:-1;;5484:37:0;;1361:25:1;;;5510:1:0;;-1:-1:-1;;;;;5484:37:0;;;;;1349:2:1;1334:18;5484:37:0;;;;;;;23296:374;;;:::o;28207:477::-;28299:16;;;28313:1;28299:16;;;;;;;;28275:21;;28299:16;;;;;;;;;;-1:-1:-1;28299:16:0;28275:40;;28344:4;28326;28331:1;28326:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;28326:23:0;;;:7;;;;;;;;;;:23;;;;28370:15;;:22;;;-1:-1:-1;;;28370:22:0;;;;:15;;;;;:20;;:22;;;;;28326:7;;28370:22;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28360:4;28365:1;28360:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;28360:32:0;;;:7;;;;;;;;;:32;28437:15;;28405:62;;28422:4;;28437:15;28455:11;28405:8;:62::i;:::-;28480:15;;:196;;-1:-1:-1;;;28480:196:0;;-1:-1:-1;;;;;28480:15:0;;;;:66;;:196;;28561:11;;28480:15;;28603:4;;28630;;28650:15;;28480:196;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28264:420;28207:477;:::o;3913:671::-;-1:-1:-1;;;;;4044:18:0;;4036:68;;;;-1:-1:-1;;;4036:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;4123:16:0;;4115:64;;;;-1:-1:-1;;;4115:64:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;4265:15:0;;4243:19;4265:15;;;;;;;;;;;4299:21;;;;4291:72;;;;-1:-1:-1;;;4291:72:0;;19583:2:1;4291:72:0;;;19565:21:1;19622:2;19602:18;;;19595:30;19661:34;19641:18;;;19634:62;-1:-1:-1;;;19712:18:1;;;19705:36;19758:19;;4291:72:0;19381:402:1;4291:72:0;-1:-1:-1;;;;;4399:15:0;;;:9;:15;;;;;;;;;;;4417:20;;;4399:38;;4459:13;;;;;;;;:23;;4431:6;;4399:9;4459:23;;4431:6;;4459:23;:::i;:::-;;;;;;;;4515:2;-1:-1:-1;;;;;4500:26:0;4509:4;-1:-1:-1;;;;;4500:26:0;;4519:6;4500:26;;;;1361:25:1;;1349:2;1334:18;;1215:177;4500:26:0;;;;;;;;4539:37;23296:374;29068:1506;29108:23;29134:24;29152:4;29134:9;:24::i;:::-;29108:50;;29169:25;29241:17;;29219:19;;29197;;:41;;;;:::i;:::-;:61;;;;:::i;:::-;29169:89;-1:-1:-1;29283:20:0;;;:46;;-1:-1:-1;29307:22:0;;29283:46;29279:59;;;29331:7;;29068:1506::o;29279:59::-;29370:19;;29352:15;:37;29348:80;;;29409:19;;29391:37;;29348:80;29510:23;29596:1;29576:17;29554:19;;29536:15;:37;;;;:::i;:::-;:57;;;;:::i;:::-;:61;;;;:::i;:::-;29510:87;-1:-1:-1;29608:26:0;29637:36;:15;29510:87;29637:19;:36::i;:::-;29608:65;-1:-1:-1;29722:21:0;29756:37;29608:65;29756:17;:37::i;:::-;29814:18;29835:44;:21;29861:17;29835:25;:44::i;:::-;29814:65;;29890:23;29916:58;29956:17;29916:35;29931:19;;29916:10;:14;;:35;;;;:::i;:58::-;29890:84;;29985:21;30009:56;30047:17;30009:33;30024:17;;30009:10;:14;;:33;;;;:::i;:56::-;29985:80;-1:-1:-1;30076:23:0;29985:80;30102:28;30115:15;30102:10;:28;:::i;:::-;:44;;;;:::i;:::-;30189:1;30167:19;:23;;;30201:19;:23;;;30235:17;:21;30277:11;;30076:70;;-1:-1:-1;;;;;;30277:11:0;30269:65;30299:34;:15;30319:13;30299:19;:34::i;:::-;30269:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30353:15:0;;-1:-1:-1;;;;;30353:15:0;30345:71;30379:36;30399:15;;30379:19;:36::i;:::-;30345:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30467:1;30449:15;:19;:42;;;;;30490:1;30472:15;:19;30449:42;30445:122;;;30508:47;30522:15;30539;30508:13;:47::i;:::-;29097:1477;;;;;;;;;29068:1506::o;17240:98::-;17298:7;17325:5;17329:1;17325;:5;:::i;17346:98::-;17404:7;17431:5;17435:1;17431;:5;:::i;17134:98::-;17192:7;17219:5;17223:1;17219;:5;:::i;28692:368::-;28807:15;;28775:62;;28792:4;;-1:-1:-1;;;;;28807:15:0;28825:11;28775:8;:62::i;:::-;28850:15;;29000:11;;28850:202;;-1:-1:-1;;;28850:202:0;;-1:-1:-1;;;;;28850:15:0;;;;:31;;28889:9;;28850:202;;28922:4;;28942:11;;28850:15;;;;29000:11;;29026:15;;28850:202;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;28692:368;;:::o;14:548:1:-;126:4;155:2;184;173:9;166:21;216:6;210:13;259:6;254:2;243:9;239:18;232:34;284:1;294:140;308:6;305:1;302:13;294:140;;;403:14;;;399:23;;393:30;369:17;;;388:2;365:26;358:66;323:10;;294:140;;;298:3;483:1;478:2;469:6;458:9;454:22;450:31;443:42;553:2;546;542:7;537:2;529:6;525:15;521:29;510:9;506:45;502:54;494:62;;;;14:548;;;;:::o;567:131::-;-1:-1:-1;;;;;642:31:1;;632:42;;622:70;;688:1;685;678:12;703:315;771:6;779;832:2;820:9;811:7;807:23;803:32;800:52;;;848:1;845;838:12;800:52;887:9;874:23;906:31;931:5;906:31;:::i;:::-;956:5;1008:2;993:18;;;;980:32;;-1:-1:-1;;;703:315:1:o;1397:316::-;1474:6;1482;1490;1543:2;1531:9;1522:7;1518:23;1514:32;1511:52;;;1559:1;1556;1549:12;1511:52;-1:-1:-1;;1582:23:1;;;1652:2;1637:18;;1624:32;;-1:-1:-1;1703:2:1;1688:18;;;1675:32;;1397:316;-1:-1:-1;1397:316:1:o;1718:456::-;1795:6;1803;1811;1864:2;1852:9;1843:7;1839:23;1835:32;1832:52;;;1880:1;1877;1870:12;1832:52;1919:9;1906:23;1938:31;1963:5;1938:31;:::i;:::-;1988:5;-1:-1:-1;2045:2:1;2030:18;;2017:32;2058:33;2017:32;2058:33;:::i;:::-;1718:456;;2110:7;;-1:-1:-1;;;2164:2:1;2149:18;;;;2136:32;;1718:456::o;2179:180::-;2238:6;2291:2;2279:9;2270:7;2266:23;2262:32;2259:52;;;2307:1;2304;2297:12;2259:52;-1:-1:-1;2330:23:1;;2179:180;-1:-1:-1;2179:180:1:o;2553:160::-;2618:20;;2674:13;;2667:21;2657:32;;2647:60;;2703:1;2700;2693:12;2718:180;2774:6;2827:2;2815:9;2806:7;2802:23;2798:32;2795:52;;;2843:1;2840;2833:12;2795:52;2866:26;2882:9;2866:26;:::i;2903:248::-;2971:6;2979;3032:2;3020:9;3011:7;3007:23;3003:32;3000:52;;;3048:1;3045;3038:12;3000:52;-1:-1:-1;;3071:23:1;;;3141:2;3126:18;;;3113:32;;-1:-1:-1;2903:248:1:o;3156:247::-;3215:6;3268:2;3256:9;3247:7;3243:23;3239:32;3236:52;;;3284:1;3281;3274:12;3236:52;3323:9;3310:23;3342:31;3367:5;3342:31;:::i;3661:435::-;3714:3;3752:5;3746:12;3779:6;3774:3;3767:19;3805:4;3834:2;3829:3;3825:12;3818:19;;3871:2;3864:5;3860:14;3892:1;3902:169;3916:6;3913:1;3910:13;3902:169;;;3977:13;;3965:26;;4011:12;;;;4046:15;;;;3938:1;3931:9;3902:169;;;-1:-1:-1;4087:3:1;;3661:435;-1:-1:-1;;;;;3661:435:1:o;4101:563::-;4290:2;4279:9;4272:21;4253:4;4328:6;4322:13;4371:4;4366:2;4355:9;4351:18;4344:32;4399:62;4457:2;4446:9;4442:18;4428:12;4399:62;:::i;:::-;4385:76;;4510:2;4502:6;4498:15;4492:22;4584:2;4580:7;4568:9;4560:6;4556:22;4552:36;4545:4;4534:9;4530:20;4523:66;4606:52;4651:6;4635:14;4606:52;:::i;:::-;4598:60;4101:563;-1:-1:-1;;;;;4101:563:1:o;4877:315::-;4942:6;4950;5003:2;4991:9;4982:7;4978:23;4974:32;4971:52;;;5019:1;5016;5009:12;4971:52;5058:9;5045:23;5077:31;5102:5;5077:31;:::i;:::-;5127:5;-1:-1:-1;5151:35:1;5182:2;5167:18;;5151:35;:::i;:::-;5141:45;;4877:315;;;;;:::o;5197:388::-;5265:6;5273;5326:2;5314:9;5305:7;5301:23;5297:32;5294:52;;;5342:1;5339;5332:12;5294:52;5381:9;5368:23;5400:31;5425:5;5400:31;:::i;:::-;5450:5;-1:-1:-1;5507:2:1;5492:18;;5479:32;5520:33;5479:32;5520:33;:::i;:::-;5572:7;5562:17;;;5197:388;;;;;:::o;5590:380::-;5669:1;5665:12;;;;5712;;;5733:61;;5787:4;5779:6;5775:17;5765:27;;5733:61;5840:2;5832:6;5829:14;5809:18;5806:38;5803:161;;5886:10;5881:3;5877:20;5874:1;5867:31;5921:4;5918:1;5911:15;5949:4;5946:1;5939:15;5803:161;;5590:380;;;:::o;5975:356::-;6177:2;6159:21;;;6196:18;;;6189:30;6255:34;6250:2;6235:18;;6228:62;6322:2;6307:18;;5975:356::o;6336:127::-;6397:10;6392:3;6388:20;6385:1;6378:31;6428:4;6425:1;6418:15;6452:4;6449:1;6442:15;6468:125;6533:9;;;6554:10;;;6551:36;;;6567:18;;:::i;7358:127::-;7419:10;7414:3;7410:20;7407:1;7400:31;7450:4;7447:1;7440:15;7474:4;7471:1;7464:15;7490:128;7557:9;;;7578:11;;;7575:37;;;7592:18;;:::i;7623:398::-;7825:2;7807:21;;;7864:2;7844:18;;;7837:30;7903:34;7898:2;7883:18;;7876:62;-1:-1:-1;;;7969:2:1;7954:18;;7947:32;8011:3;7996:19;;7623:398::o;8026:412::-;8228:2;8210:21;;;8267:2;8247:18;;;8240:30;8306:34;8301:2;8286:18;;8279:62;-1:-1:-1;;;8372:2:1;8357:18;;8350:46;8428:3;8413:19;;8026:412::o;8443:251::-;8513:6;8566:2;8554:9;8545:7;8541:23;8537:32;8534:52;;;8582:1;8579;8572:12;8534:52;8614:9;8608:16;8633:31;8658:5;8633:31;:::i;9008:607::-;-1:-1:-1;;;;;9367:15:1;;;9349:34;;9414:2;9399:18;;9392:34;;;;9457:2;9442:18;;9435:34;;;;9500:2;9485:18;;9478:34;;;;9549:15;;;9543:3;9528:19;;9521:44;9329:3;9581:19;;9574:35;;;;9298:3;9283:19;;9008:607::o;9620:306::-;9708:6;9716;9724;9777:2;9765:9;9756:7;9752:23;9748:32;9745:52;;;9793:1;9790;9783:12;9745:52;9822:9;9816:16;9806:26;;9872:2;9861:9;9857:18;9851:25;9841:35;;9916:2;9905:9;9901:18;9895:25;9885:35;;9620:306;;;;;:::o;10360:127::-;10421:10;10416:3;10412:20;10409:1;10402:31;10452:4;10449:1;10442:15;10476:4;10473:1;10466:15;10915:168;10988:9;;;11019;;11036:15;;;11030:22;;11016:37;11006:71;;11057:18;;:::i;11088:217::-;11128:1;11154;11144:132;;11198:10;11193:3;11189:20;11186:1;11179:31;11233:4;11230:1;11223:15;11261:4;11258:1;11251:15;11144:132;-1:-1:-1;11290:9:1;;11088:217::o;14138:401::-;14340:2;14322:21;;;14379:2;14359:18;;;14352:30;14418:34;14413:2;14398:18;;14391:62;-1:-1:-1;;;14484:2:1;14469:18;;14462:35;14529:3;14514:19;;14138:401::o;14544:399::-;14746:2;14728:21;;;14785:2;14765:18;;;14758:30;14824:34;14819:2;14804:18;;14797:62;-1:-1:-1;;;14890:2:1;14875:18;;14868:33;14933:3;14918:19;;14544:399::o;18396:980::-;18658:4;18706:3;18695:9;18691:19;18737:6;18726:9;18719:25;18763:2;18801:6;18796:2;18785:9;18781:18;18774:34;18844:3;18839:2;18828:9;18824:18;18817:31;18868:6;18903;18897:13;18934:6;18926;18919:22;18972:3;18961:9;18957:19;18950:26;;19011:2;19003:6;18999:15;18985:29;;19032:1;19042:195;19056:6;19053:1;19050:13;19042:195;;;19121:13;;-1:-1:-1;;;;;19117:39:1;19105:52;;19212:15;;;;19177:12;;;;19153:1;19071:9;19042:195;;;-1:-1:-1;;;;;;;19293:32:1;;;;19288:2;19273:18;;19266:60;-1:-1:-1;;;19357:3:1;19342:19;19335:35;19254:3;18396:980;-1:-1:-1;;;18396:980:1:o

Swarm Source

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