ETH Price: $3,449.19 (+0.81%)
Gas: 10 Gwei

Token

WagieBot (WagieBot)
 

Overview

Max Total Supply

10,000,000 WagieBot

Holders

1,743 (0.00%)

Market

Price

$0.04 @ 0.000013 ETH (+0.37%)

Onchain Market Cap

$442,034.60

Circulating Supply Market Cap

$420,132.00

Other Info

Token Contract (WITH 9 Decimals)

Balance
1,789.236840976 WagieBot

Value
$79.09 ( ~0.0229299951838459 Eth) [0.0179%]
0xd8923e0d92b43fcab9dc9b6ce7eac3c60a47e9b3
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

WagieBot is a chat-based bot that allows to trade, snipe, copy trade and more across multiple networks.

Market

Volume (24H):$271,526.00
Market Capitalization:$420,132.00
Circulating Supply:9,500,000.00 WagieBot
Market Data Source: Coinmarketcap

# Exchange Pair Price  24H Volume % Volume
1
CoinW
WAGIEBOT-USDT$0.0442
0.0000128 Eth
$271,132.00
6,133,963.680 WAGIEBOT
99.9285%
2
Uniswap V2 (Ethereum)
0XD2C869382C7AC9F87FF73548D029D67C0F9DEE31-0XC02AAA39B223FE8D0A0E5C4F27EAD9083C756CC2$0.0411
0.0000119 Eth
$180.02
4,388.450 0XD2C869382C7AC9F87FF73548D029D67C0F9DEE31
0.0715%

Contract Source Code Verified (Exact Match)

Contract Name:
WagieBot

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
Yes with 1000 runs

Other Settings:
default evmVersion, Unlicense license

Contract Source Code (Solidity)

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

/**

██╗    ██╗ █████╗  ██████╗ ██╗███████╗██████╗  ██████╗ ████████╗
██║    ██║██╔══██╗██╔════╝ ██║██╔════╝██╔══██╗██╔═══██╗╚══██╔══╝
██║ █╗ ██║███████║██║  ███╗██║█████╗  ██████╔╝██║   ██║   ██║   
██║███╗██║██╔══██║██║   ██║██║██╔══╝  ██╔══██╗██║   ██║   ██║   
╚███╔███╔╝██║  ██║╚██████╔╝██║███████╗██████╔╝╚██████╔╝   ██║   
 ╚══╝╚══╝ ╚═╝  ╚═╝ ╚═════╝ ╚═╝╚══════╝╚═════╝  ╚═════╝    ╚═╝   

Bringing Sniping, Tracking, Trading, Copy Trading and more directly to your Messaging Apps.

Bot: t.me/wagiebot
Website: wagiebot.com
Twitter: twitter.com/0xWagieBot
Portal: t.me/wagiebotportal

In active development since February 2023 and Stealth Launched on July 10th 2023. Full Development logs available.

*/

// SPDX-License-Identifier: Unlicensed

pragma solidity ^0.8.18;

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

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

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

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

    function transfer(
        address recipient,
        uint256 amount
    ) external returns (bool);

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

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

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

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

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

        return c;
    }

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

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

        return c;
    }

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

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

        return c;
    }

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

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

        return c;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// pragma solidity >=0.5.0;

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;
}

// pragma solidity >=0.5.0;

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 Burn(
        address indexed sender,
        uint amount0,
        uint amount1,
        address indexed to
    );
    event Swap(
        address indexed sender,
        uint amount0In,
        uint amount1In,
        uint amount0Out,
        uint amount1Out,
        address indexed to
    );
    event Sync(uint112 reserve0, uint112 reserve1);

    function MINIMUM_LIQUIDITY() external pure returns (uint);

    function factory() external view returns (address);

    function token0() external view returns (address);

    function token1() external view returns (address);

    function getReserves()
        external
        view
        returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);

    function price0CumulativeLast() external view returns (uint);

    function price1CumulativeLast() external view returns (uint);

    function kLast() external view returns (uint);

    function burn(address to) external returns (uint amount0, uint amount1);

    function swap(
        uint amount0Out,
        uint amount1Out,
        address to,
        bytes calldata data
    ) external;

    function skim(address to) external;

    function sync() external;

    function initialize(address, address) external;
}

// pragma solidity >=0.6.2;

interface 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);
}

// pragma solidity >=0.6.2;

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;
}

contract WagieBot is Context, IERC20, Ownable {
    using SafeMath for uint256;
    using Address for address;

    address payable public developmentAddress =
        payable(0xfEe18884A9ABd2CdDc4fe80310C306836B66C37F); // Development Address
    address public immutable deadAddress =
        0x000000000000000000000000000000000000dEaD;
    mapping(address => uint256) private _rOwned;
    mapping(address => uint256) private _tOwned;
    mapping(address => mapping(address => uint256)) private _allowances;
    mapping(address => bool) private _isSniper;
    address[] private _confirmedSnipers;

    mapping(address => bool) private _isExcludedFromFee;
    mapping(address => bool) private _isExcluded;
    address[] private _excluded;

    uint256 public constant MAX = ~uint256(0);
    uint256 private _tTotal = 10_000_000 * 10 ** 9;
    uint256 private _rTotal = (MAX - (MAX % _tTotal));
    uint256 private _tFeeTotal;

    string private _name = "WagieBot";
    string private _symbol = "WagieBot";
    uint8 private _decimals = 9;
    uint256 public maxWallet = 200_000 * 10 ** 9;
    uint256 public _taxFee;
    uint256 private _previousTaxFee = _taxFee;

    uint256 public _liquidityFee;
    uint256 private _previousLiquidityFee = _liquidityFee;

    uint256 public _developmentFee;
    uint256 private _previousDevelopmentFee = _developmentFee;

    uint256 private _feeRate = 2;
    uint256 launchTime;

    IUniswapV2Router02 public uniswapV2Router;
    address public uniswapV2Pair;

    bool inSwapAndLiquify;

    bool tradingOpen = false;

    event SwapETHForTokens(uint256 amountIn, address[] path);

    event SwapTokensForETH(uint256 amountIn, address[] path);

    modifier lockTheSwap() {
        inSwapAndLiquify = true;
        _;
        inSwapAndLiquify = false;
    }

    constructor() {
        _rOwned[_msgSender()] = _rTotal;
        emit Transfer(address(0), _msgSender(), _tTotal);
    }

    function initContract() external onlyOwner {
        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(
            0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D
        );
        uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory())
            .createPair(address(this), _uniswapV2Router.WETH());

        uniswapV2Router = _uniswapV2Router;

        _isExcludedFromFee[owner()] = true;
        _isExcludedFromFee[address(this)] = true;

        developmentAddress = payable(
            0xfEe18884A9ABd2CdDc4fe80310C306836B66C37F
        );
    }

    function openTrading() external onlyOwner {
        _liquidityFee = 0;
        _taxFee = 0;
        _developmentFee = 4;
        tradingOpen = true;
        launchTime = block.timestamp;
    }

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

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

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

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

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

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

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

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

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

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

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

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

    function totalFees() public view returns (uint256) {
        return _tFeeTotal;
    }

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

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

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

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

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

    function _approve(address owner, address spender, uint256 amount) private {
        require(owner != address(0), "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 _transfer(address from, address to, uint256 amount) private {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");
        require(amount > 0, "Transfer amount must be greater than zero");
        require(!_isSniper[to], "You have no power here!");
        require(!_isSniper[msg.sender], "You have no power here!");

        // buy
        if (
            from == uniswapV2Pair &&
            to != address(uniswapV2Router) &&
            !_isExcludedFromFee[to]
        ) {
            require(tradingOpen, "Trading not yet enabled.");

            //antibot
            if (block.timestamp == launchTime) {
                _isSniper[to] = true;
                _confirmedSnipers.push(to);
            }
        }

        uint256 contractTokenBalance = balanceOf(address(this));

        //sell

        if (!inSwapAndLiquify && tradingOpen && to == uniswapV2Pair) {
            if (contractTokenBalance > 0) {
                if (
                    contractTokenBalance >
                    balanceOf(uniswapV2Pair).mul(_feeRate).div(100)
                ) {
                    contractTokenBalance = balanceOf(uniswapV2Pair)
                        .mul(_feeRate)
                        .div(100);
                }
                swapTokens(contractTokenBalance);
            }
        }

        bool takeFee = false;

        //take fee only on swaps
        if (
            (from == uniswapV2Pair || to == uniswapV2Pair) &&
            !(_isExcludedFromFee[from] || _isExcludedFromFee[to])
        ) {
            takeFee = true;
        }

        _tokenTransfer(from, to, amount, takeFee);
    }

    function swapTokens(uint256 contractTokenBalance) private lockTheSwap {
        swapTokensForEth(contractTokenBalance);

        //Send to Development address
        uint256 contractETHBalance = address(this).balance;
        if (contractETHBalance > 0) {
            sendETHToFee(address(this).balance);
        }
    }

    function sendETHToFee(uint256 amount) private {
        developmentAddress.transfer(amount);
    }

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

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

        // make the swap
        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0, // accept any amount of ETH
            path,
            address(this), // The contract
            block.timestamp
        );

        emit SwapTokensForETH(tokenAmount, path);
    }

    function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private {
        // approve token transfer to cover all possible scenarios
        _approve(address(this), address(uniswapV2Router), tokenAmount);

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

    function _tokenTransfer(
        address sender,
        address recipient,
        uint256 amount,
        bool takeFee
    ) private {
        if (!takeFee) removeAllFee();

        if (_isExcluded[sender] && !_isExcluded[recipient]) {
            _transferFromExcluded(sender, recipient, amount);
        } else if (!_isExcluded[sender] && _isExcluded[recipient]) {
            _transferToExcluded(sender, recipient, amount);
        } else if (_isExcluded[sender] && _isExcluded[recipient]) {
            _transferBothExcluded(sender, recipient, amount);
        } else {
            _transferStandard(sender, recipient, amount);
        }

        if (!takeFee) restoreAllFee();
    }

    function _transferStandard(
        address sender,
        address recipient,
        uint256 tAmount
    ) private {
        (
            uint256 rAmount,
            uint256 rTransferAmount,
            uint256 rFee,
            uint256 tTransferAmount,
            uint256 tFee,
            uint256 tLiquidity,
            uint256 tDevelopment
        ) = _getValues(tAmount);

        uint256 currBalance = balanceOf(recipient);

        uint256 newBalance = currBalance.add(tTransferAmount);

        if (newBalance > maxWallet && recipient != address(uniswapV2Pair)) {
            revert("Transfer amount exceeds the Max Wallet amount.");
        }

        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);
        _takeLiquidity(tLiquidity);
        _reflectFee(rFee, tFee);
        _takeDevelopment(sender, tDevelopment);
        emit Transfer(sender, recipient, tTransferAmount);
    }

    function _transferToExcluded(
        address sender,
        address recipient,
        uint256 tAmount
    ) private {
        (
            uint256 rAmount,
            uint256 rTransferAmount,
            uint256 rFee,
            uint256 tTransferAmount,
            uint256 tFee,
            uint256 tLiquidity,
            uint256 tDevelopment
        ) = _getValues(tAmount);

        uint256 currBalance = balanceOf(recipient);

        uint256 newBalance = currBalance.add(tTransferAmount);

        if (newBalance > maxWallet && recipient != address(uniswapV2Pair)) {
            revert("Transfer amount exceeds the Max Wallet amount.");
        }

        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _tOwned[recipient] = _tOwned[recipient].add(tTransferAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);
        _takeLiquidity(tLiquidity);
        _reflectFee(rFee, tFee);
        _takeDevelopment(sender, tDevelopment);
        emit Transfer(sender, recipient, tTransferAmount);
    }

    function _transferFromExcluded(
        address sender,
        address recipient,
        uint256 tAmount
    ) private {
        (
            uint256 rAmount,
            uint256 rTransferAmount,
            uint256 rFee,
            uint256 tTransferAmount,
            uint256 tFee,
            uint256 tLiquidity,
            uint256 tDevelopment
        ) = _getValues(tAmount);

        uint256 currBalance = balanceOf(recipient);

        uint256 newBalance = currBalance.add(tTransferAmount);

        if (newBalance > maxWallet && recipient != address(uniswapV2Pair)) {
            revert("Transfer amount exceeds the Max Wallet amount.");
        }

        _tOwned[sender] = _tOwned[sender].sub(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);
        _takeLiquidity(tLiquidity);
        _reflectFee(rFee, tFee);
        _takeDevelopment(sender, tDevelopment);
        emit Transfer(sender, recipient, tTransferAmount);
    }

    function _transferBothExcluded(
        address sender,
        address recipient,
        uint256 tAmount
    ) private {
        (
            uint256 rAmount,
            uint256 rTransferAmount,
            uint256 rFee,
            uint256 tTransferAmount,
            uint256 tFee,
            uint256 tLiquidity,
            uint256 tDevelopment
        ) = _getValues(tAmount);

        uint256 currBalance = balanceOf(recipient);

        uint256 newBalance = currBalance.add(tTransferAmount);

        if (newBalance > maxWallet && recipient != address(uniswapV2Pair)) {
            revert("Transfer amount exceeds the Max Wallet amount.");
        }

        _tOwned[sender] = _tOwned[sender].sub(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _tOwned[recipient] = _tOwned[recipient].add(tTransferAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);
        _takeLiquidity(tLiquidity);
        _reflectFee(rFee, tFee);
        _takeDevelopment(sender, tDevelopment);
        emit Transfer(sender, recipient, tTransferAmount);
    }

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

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

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

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

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

    function _getCurrentSupply() private view returns (uint256, uint256) {
        uint256 rSupply = _rTotal;
        uint256 tSupply = _tTotal;
        for (uint256 i = 0; i < _excluded.length; i++) {
            if (
                _rOwned[_excluded[i]] > rSupply ||
                _tOwned[_excluded[i]] > tSupply
            ) return (_rTotal, _tTotal);
            rSupply = rSupply.sub(_rOwned[_excluded[i]]);
            tSupply = tSupply.sub(_tOwned[_excluded[i]]);
        }
        if (rSupply < _rTotal.div(_tTotal)) return (_rTotal, _tTotal);
        return (rSupply, tSupply);
    }

    function _takeLiquidity(uint256 tLiquidity) private {
        uint256 currentRate = _getRate();
        uint256 rLiquidity = tLiquidity.mul(currentRate);
        _rOwned[address(this)] = _rOwned[address(this)].add(rLiquidity);
        if (_isExcluded[address(this)])
            _tOwned[address(this)] = _tOwned[address(this)].add(tLiquidity);
    }

    function _takeDevelopment(address sender, uint256 tDevelopment) internal {
        uint256 currentRate = _getRate();
        uint256 rLiquidity = tDevelopment * currentRate;
        _rOwned[address(this)] = _rOwned[address(this)] + rLiquidity;
        if (_isExcluded[address(this)])
            _tOwned[address(this)] = _tOwned[address(this)] + tDevelopment;
        emit Transfer(sender, address(this), tDevelopment); // Transparency is the key to success.
    }

    function calculateTaxFee(uint256 _amount) private view returns (uint256) {
        return _amount.mul(_taxFee).div(10 ** 2);
    }

    function calculateLiquidityFee(
        uint256 _amount
    ) private view returns (uint256) {
        return _amount.mul(_liquidityFee).div(10 ** 2);
    }

    function calculateDevelopmentFee(
        uint256 _amount
    ) private view returns (uint256) {
        return _amount.mul(_developmentFee).div(10 ** 2);
    }

    function removeAllFee() private {
        if (_taxFee == 0 && _liquidityFee == 0 && _developmentFee == 0) return;

        _previousTaxFee = _taxFee;
        _previousLiquidityFee = _liquidityFee;
        _previousDevelopmentFee = _developmentFee;
        _taxFee = 0;
        _liquidityFee = 0;
        _developmentFee = 0;
    }

    function restoreAllFee() private {
        _taxFee = _previousTaxFee;
        _liquidityFee = _previousLiquidityFee;
        _developmentFee = _previousDevelopmentFee;
    }

    function isExcludedFromFee(address account) public view returns (bool) {
        return _isExcludedFromFee[account];
    }

    function excludeFromFee(address account) public onlyOwner {
        _isExcludedFromFee[account] = true;
    }

    function includeInFee(address account) public onlyOwner {
        _isExcludedFromFee[account] = false;
    }

    function setTaxFeePercent(uint256 taxFee) external onlyOwner {
        _taxFee = taxFee;
    }

    function setLiquidityFeePercent(uint256 liquidityFee) external onlyOwner {
        _liquidityFee = liquidityFee;
    }

    function setDevelopmentFeePercent(
        uint256 developmentFee
    ) external onlyOwner {
        _developmentFee = developmentFee;
    }

    function setDevelopmentAddress(
        address _developmentAddress
    ) external onlyOwner {
        developmentAddress = payable(_developmentAddress);
    }

    function transferToAddressETH(
        address payable recipient,
        uint256 amount
    ) private {
        recipient.transfer(amount);
    }

    function isRemovedSniper(address account) public view returns (bool) {
        return _isSniper[account];
    }

    function _removeSniper(address account) external onlyOwner {
        require(
            account != 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D,
            "We cannot blacklist Uniswap"
        );
        require(!_isSniper[account], "Account is already blacklisted");
        _isSniper[account] = true;
        _confirmedSnipers.push(account);
    }

    function _amnestySniper(address account) external onlyOwner {
        require(_isSniper[account], "Account is not blacklisted");
        for (uint256 i = 0; i < _confirmedSnipers.length; i++) {
            if (_confirmedSnipers[i] == account) {
                _confirmedSnipers[i] = _confirmedSnipers[
                    _confirmedSnipers.length - 1
                ];
                _isSniper[account] = false;
                _confirmedSnipers.pop();
                break;
            }
        }
    }

    function setFeeRate(uint256 rate) external onlyOwner {
        _feeRate = rate;
    }

    //to recieve ETH from uniswapV2Router when swaping
    receive() external payable {}
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amountIn","type":"uint256"},{"indexed":false,"internalType":"address[]","name":"path","type":"address[]"}],"name":"SwapETHForTokens","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amountIn","type":"uint256"},{"indexed":false,"internalType":"address[]","name":"path","type":"address[]"}],"name":"SwapTokensForETH","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"_amnestySniper","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"_developmentFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_liquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"_removeSniper","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"_taxFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deadAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tAmount","type":"uint256"}],"name":"deliver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"developmentAddress","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromReward","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isRemovedSniper","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"openTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tAmount","type":"uint256"},{"internalType":"bool","name":"deductTransferFee","type":"bool"}],"name":"reflectionFromToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_developmentAddress","type":"address"}],"name":"setDevelopmentAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"developmentFee","type":"uint256"}],"name":"setDevelopmentFeePercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"rate","type":"uint256"}],"name":"setFeeRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"liquidityFee","type":"uint256"}],"name":"setLiquidityFeePercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"taxFee","type":"uint256"}],"name":"setTaxFeePercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"rAmount","type":"uint256"}],"name":"tokenFromReflection","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

60a0604052600380546001600160a01b03191673fee18884a9abd2cddc4fe80310c306836b66c37f17905561dead608052662386f26fc10000600c8190556200004b906000196200019a565b6200005990600019620001bd565b600d5560408051808201909152600881526715d859da59509bdd60c21b6020820152600f906200008a90826200028a565b5060408051808201909152600881526715d859da59509bdd60c21b6020820152601090620000b990826200028a565b506011805460ff1916600917905565b5e620f480006012556013546014556015546016556017546018556002601955601c805460ff60a81b191690553480156200010257600080fd5b50600080546001600160a01b031916339081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600d5433600081815260046020908152604080832094909455600c549351938452919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a362000356565b600082620001b857634e487b7160e01b600052601260045260246000fd5b500690565b81810381811115620001df57634e487b7160e01b600052601160045260246000fd5b92915050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200021057607f821691505b6020821081036200023157634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200028557600081815260208120601f850160051c81016020861015620002605750805b601f850160051c820191505b8181101562000281578281556001016200026c565b5050505b505050565b81516001600160401b03811115620002a657620002a6620001e5565b620002be81620002b78454620001fb565b8462000237565b602080601f831160018114620002f65760008415620002dd5750858301515b600019600386901b1c1916600185901b17855562000281565b600085815260208120601f198616915b82811015620003275788860151825594840194600190910190840162000306565b5085821015620003465787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805161331462000372600039600061040701526133146000f3fe6080604052600436106102e05760003560e01c806352390c021161018457806395d89b41116100d6578063d49d51811161008a578063f2fde38b11610064578063f2fde38b14610846578063f375b25314610866578063f8b45b051461088657600080fd5b8063d49d5181146107ca578063dd62ed3e146107e0578063ea2f0b371461082657600080fd5b8063a9059cbb116100bb578063a9059cbb1461077f578063c9567bf91461079f578063d1475185146107b457600080fd5b806395d89b411461074a578063a457c2d71461075f57600080fd5b806370a082311161013857806388f820201161011257806388f82020146106d35780638da5cb5b1461070c5780638ee88c531461072a57600080fd5b806370a0823114610689578063715018a6146106a95780638203f5fe146106be57600080fd5b8063610d5b1911610169578063610d5b191461061a578063638b1b14146106535780636bc87c3a1461067357600080fd5b806352390c02146105c15780635342acb4146105e157600080fd5b8063313ce5671161023d5780633bd5d173116101f157806345596e2e116101cb57806345596e2e146105615780634680ff351461058157806349bd5a5e146105a157600080fd5b80633bd5d17314610501578063437823ec146105215780634549b0391461054157600080fd5b80633685d419116102225780633685d419146104ab57806339509351146104cb5780633b124fe7146104eb57600080fd5b8063313ce56714610469578063362a3c5d1461048b57600080fd5b806318160ddd1161029457806327c8f8351161027957806327c8f835146103f557806329b1c15c146104295780632d8381191461044957600080fd5b806318160ddd146103c057806323b872dd146103d557600080fd5b8063095ea7b3116102c5578063095ea7b31461033957806313114a9d146103695780631694505e1461038857600080fd5b8063061c82d0146102ec57806306fdde031461030e57600080fd5b366102e757005b600080fd5b3480156102f857600080fd5b5061030c610307366004612f53565b61089c565b005b34801561031a57600080fd5b506103236108ee565b6040516103309190612f6c565b60405180910390f35b34801561034557600080fd5b50610359610354366004612fd2565b610980565b6040519015158152602001610330565b34801561037557600080fd5b50600e545b604051908152602001610330565b34801561039457600080fd5b50601b546103a8906001600160a01b031681565b6040516001600160a01b039091168152602001610330565b3480156103cc57600080fd5b50600c5461037a565b3480156103e157600080fd5b506103596103f0366004612ffe565b610997565b34801561040157600080fd5b506103a87f000000000000000000000000000000000000000000000000000000000000000081565b34801561043557600080fd5b5061030c61044436600461303f565b610a00565b34801561045557600080fd5b5061037a610464366004612f53565b610a6a565b34801561047557600080fd5b5060115460405160ff9091168152602001610330565b34801561049757600080fd5b5061030c6104a636600461303f565b610b01565b3480156104b757600080fd5b5061030c6104c636600461303f565b610ccc565b3480156104d757600080fd5b506103596104e6366004612fd2565b610e76565b3480156104f757600080fd5b5061037a60135481565b34801561050d57600080fd5b5061030c61051c366004612f53565b610eac565b34801561052d57600080fd5b5061030c61053c36600461303f565b610fa9565b34801561054d57600080fd5b5061037a61055c36600461305c565b611015565b34801561056d57600080fd5b5061030c61057c366004612f53565b6110a4565b34801561058d57600080fd5b5061030c61059c366004612f53565b6110f1565b3480156105ad57600080fd5b50601c546103a8906001600160a01b031681565b3480156105cd57600080fd5b5061030c6105dc36600461303f565b61113e565b3480156105ed57600080fd5b506103596105fc36600461303f565b6001600160a01b031660009081526009602052604090205460ff1690565b34801561062657600080fd5b5061035961063536600461303f565b6001600160a01b031660009081526007602052604090205460ff1690565b34801561065f57600080fd5b506003546103a8906001600160a01b031681565b34801561067f57600080fd5b5061037a60155481565b34801561069557600080fd5b5061037a6106a436600461303f565b6112af565b3480156106b557600080fd5b5061030c61130e565b3480156106ca57600080fd5b5061030c6113a0565b3480156106df57600080fd5b506103596106ee36600461303f565b6001600160a01b03166000908152600a602052604090205460ff1690565b34801561071857600080fd5b506000546001600160a01b03166103a8565b34801561073657600080fd5b5061030c610745366004612f53565b6115e1565b34801561075657600080fd5b5061032361162e565b34801561076b57600080fd5b5061035961077a366004612fd2565b61163d565b34801561078b57600080fd5b5061035961079a366004612fd2565b61168c565b3480156107ab57600080fd5b5061030c611699565b3480156107c057600080fd5b5061037a60175481565b3480156107d657600080fd5b5061037a60001981565b3480156107ec57600080fd5b5061037a6107fb366004613091565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205490565b34801561083257600080fd5b5061030c61084136600461303f565b611724565b34801561085257600080fd5b5061030c61086136600461303f565b61178d565b34801561087257600080fd5b5061030c61088136600461303f565b6118ac565b34801561089257600080fd5b5061037a60125481565b6000546001600160a01b031633146108e95760405162461bcd60e51b8152602060048201819052602482015260008051602061329a83398151915260448201526064015b60405180910390fd5b601355565b6060600f80546108fd906130bf565b80601f0160208091040260200160405190810160405280929190818152602001828054610929906130bf565b80156109765780601f1061094b57610100808354040283529160200191610976565b820191906000526020600020905b81548152906001019060200180831161095957829003601f168201915b5050505050905090565b600061098d338484611a2f565b5060015b92915050565b60006109a4848484611b87565b6109f684336109f185604051806060016040528060288152602001613272602891396001600160a01b038a1660009081526006602090815260408083203384529091529020549190612027565b611a2f565b5060019392505050565b6000546001600160a01b03163314610a485760405162461bcd60e51b8152602060048201819052602482015260008051602061329a83398151915260448201526064016108e0565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b6000600d54821115610ae45760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201527f65666c656374696f6e730000000000000000000000000000000000000000000060648201526084016108e0565b6000610aee612061565b9050610afa8382612084565b9392505050565b6000546001600160a01b03163314610b495760405162461bcd60e51b8152602060048201819052602482015260008051602061329a83398151915260448201526064016108e0565b6001600160a01b03811660009081526007602052604090205460ff16610bb15760405162461bcd60e51b815260206004820152601a60248201527f4163636f756e74206973206e6f7420626c61636b6c697374656400000000000060448201526064016108e0565b60005b600854811015610cc857816001600160a01b031660088281548110610bdb57610bdb6130f9565b6000918252602090912001546001600160a01b031603610cb65760088054610c0590600190613125565b81548110610c1557610c156130f9565b600091825260209091200154600880546001600160a01b039092169183908110610c4157610c416130f9565b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559184168152600790915260409020805460ff191690556008805480610c9057610c90613138565b600082815260209020810160001990810180546001600160a01b03191690550190555050565b80610cc08161314e565b915050610bb4565b5050565b6000546001600160a01b03163314610d145760405162461bcd60e51b8152602060048201819052602482015260008051602061329a83398151915260448201526064016108e0565b6001600160a01b0381166000908152600a602052604090205460ff16610d7c5760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c75646564000000000060448201526064016108e0565b60005b600b54811015610cc857816001600160a01b0316600b8281548110610da657610da66130f9565b6000918252602090912001546001600160a01b031603610e6457600b8054610dd090600190613125565b81548110610de057610de06130f9565b600091825260209091200154600b80546001600160a01b039092169183908110610e0c57610e0c6130f9565b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559184168152600582526040808220829055600a90925220805460ff19169055600b805480610c9057610c90613138565b80610e6e8161314e565b915050610d7f565b3360008181526006602090815260408083206001600160a01b0387168452909152812054909161098d9185906109f190866120c6565b336000818152600a602052604090205460ff1615610f325760405162461bcd60e51b815260206004820152602c60248201527f4578636c75646564206164647265737365732063616e6e6f742063616c6c207460448201527f6869732066756e6374696f6e000000000000000000000000000000000000000060648201526084016108e0565b6000610f3d83612125565b5050506001600160a01b038616600090815260046020526040902054939450610f6b93925084915050612180565b6001600160a01b038316600090815260046020526040902055600d54610f919082612180565b600d55600e54610fa190846120c6565b600e55505050565b6000546001600160a01b03163314610ff15760405162461bcd60e51b8152602060048201819052602482015260008051602061329a83398151915260448201526064016108e0565b6001600160a01b03166000908152600960205260409020805460ff19166001179055565b6000600c548311156110695760405162461bcd60e51b815260206004820152601f60248201527f416d6f756e74206d757374206265206c657373207468616e20737570706c790060448201526064016108e0565b8161108957600061107984612125565b5094965061099195505050505050565b600061109484612125565b5093965061099195505050505050565b6000546001600160a01b031633146110ec5760405162461bcd60e51b8152602060048201819052602482015260008051602061329a83398151915260448201526064016108e0565b601955565b6000546001600160a01b031633146111395760405162461bcd60e51b8152602060048201819052602482015260008051602061329a83398151915260448201526064016108e0565b601755565b6000546001600160a01b031633146111865760405162461bcd60e51b8152602060048201819052602482015260008051602061329a83398151915260448201526064016108e0565b6001600160a01b0381166000908152600a602052604090205460ff16156111ef5760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c75646564000000000060448201526064016108e0565b6001600160a01b03811660009081526004602052604090205415611249576001600160a01b03811660009081526004602052604090205461122f90610a6a565b6001600160a01b0382166000908152600560205260409020555b6001600160a01b03166000818152600a60205260408120805460ff19166001908117909155600b805491820181559091527f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db90180546001600160a01b0319169091179055565b6001600160a01b0381166000908152600a602052604081205460ff16156112ec57506001600160a01b031660009081526005602052604090205490565b6001600160a01b03821660009081526004602052604090205461099190610a6a565b6000546001600160a01b031633146113565760405162461bcd60e51b8152602060048201819052602482015260008051602061329a83398151915260448201526064016108e0565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b031633146113e85760405162461bcd60e51b8152602060048201819052602482015260008051602061329a83398151915260448201526064016108e0565b6000737a250d5630b4cf539739df2c5dacb4c659f2488d9050806001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa15801561143f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114639190613167565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156114b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114d49190613167565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af1158015611539573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061155d9190613167565b601c80546001600160a01b03199081166001600160a01b0393841617909155601b805482169383169390931790925560008054909116815260096020526040808220805460ff19908116600190811790925530845291909220805490911690911790556003805490911673fee18884a9abd2cddc4fe80310c306836b66c37f179055565b6000546001600160a01b031633146116295760405162461bcd60e51b8152602060048201819052602482015260008051602061329a83398151915260448201526064016108e0565b601555565b6060601080546108fd906130bf565b600061098d33846109f1856040518060600160405280602581526020016132ba602591393360009081526006602090815260408083206001600160a01b038d1684529091529020549190612027565b600061098d338484611b87565b6000546001600160a01b031633146116e15760405162461bcd60e51b8152602060048201819052602482015260008051602061329a83398151915260448201526064016108e0565b600060158190556013556004601755601c80547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16600160a81b17905542601a55565b6000546001600160a01b0316331461176c5760405162461bcd60e51b8152602060048201819052602482015260008051602061329a83398151915260448201526064016108e0565b6001600160a01b03166000908152600960205260409020805460ff19169055565b6000546001600160a01b031633146117d55760405162461bcd60e51b8152602060048201819052602482015260008051602061329a83398151915260448201526064016108e0565b6001600160a01b0381166118515760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016108e0565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146118f45760405162461bcd60e51b8152602060048201819052602482015260008051602061329a83398151915260448201526064016108e0565b6001600160a01b038116737a250d5630b4cf539739df2c5dacb4c659f2488d036119605760405162461bcd60e51b815260206004820152601b60248201527f57652063616e6e6f7420626c61636b6c69737420556e6973776170000000000060448201526064016108e0565b6001600160a01b03811660009081526007602052604090205460ff16156119c95760405162461bcd60e51b815260206004820152601e60248201527f4163636f756e7420697320616c726561647920626c61636b6c6973746564000060448201526064016108e0565b6001600160a01b03166000818152600760205260408120805460ff191660019081179091556008805491820181559091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30180546001600160a01b0319169091179055565b6001600160a01b038316611aaa5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f726573730000000000000000000000000000000000000000000000000000000060648201526084016108e0565b6001600160a01b038216611b265760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f737300000000000000000000000000000000000000000000000000000000000060648201526084016108e0565b6001600160a01b0383811660008181526006602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b038316611c035760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f647265737300000000000000000000000000000000000000000000000000000060648201526084016108e0565b6001600160a01b038216611c7f5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f657373000000000000000000000000000000000000000000000000000000000060648201526084016108e0565b60008111611cf55760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d75737420626520677265617465722060448201527f7468616e207a65726f000000000000000000000000000000000000000000000060648201526084016108e0565b6001600160a01b03821660009081526007602052604090205460ff1615611d5e5760405162461bcd60e51b815260206004820152601760248201527f596f752068617665206e6f20706f77657220686572652100000000000000000060448201526064016108e0565b3360009081526007602052604090205460ff1615611dbe5760405162461bcd60e51b815260206004820152601760248201527f596f752068617665206e6f20706f77657220686572652100000000000000000060448201526064016108e0565b601c546001600160a01b038481169116148015611de95750601b546001600160a01b03838116911614155b8015611e0e57506001600160a01b03821660009081526009602052604090205460ff16155b15611edb57601c54600160a81b900460ff16611e6c5760405162461bcd60e51b815260206004820152601860248201527f54726164696e67206e6f742079657420656e61626c65642e000000000000000060448201526064016108e0565b601a544203611edb576001600160a01b0382166000818152600760205260408120805460ff191660019081179091556008805491820181559091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30180546001600160a01b03191690911790555b6000611ee6306112af565b601c54909150600160a01b900460ff16158015611f0c5750601c54600160a81b900460ff165b8015611f255750601c546001600160a01b038481169116145b15611f97578015611f9757601954601c54611f6091606491611f5a9190611f54906001600160a01b03166112af565b906121c2565b90612084565b811115611f8e57601954601c54611f8b91606491611f5a9190611f54906001600160a01b03166112af565b90505b611f9781612260565b601c546000906001600160a01b0386811691161480611fc35750601c546001600160a01b038581169116145b801561200b57506001600160a01b03851660009081526009602052604090205460ff168061200957506001600160a01b03841660009081526009602052604090205460ff165b155b15612014575060015b6120208585858461229d565b5050505050565b6000818484111561204b5760405162461bcd60e51b81526004016108e09190612f6c565b5060006120588486613125565b95945050505050565b600080600061206e6123ce565b909250905061207d8282612084565b9250505090565b6000610afa83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612550565b6000806120d38385613184565b905083811015610afa5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f77000000000060448201526064016108e0565b600080600080600080600080600080600061213f8c61257e565b935093509350935060008060006121608f87878761215b612061565b6125d1565b919f509d509b509599509397509195509350505050919395979092949650565b6000610afa83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612027565b6000826000036121d457506000610991565b60006121e08385613197565b9050826121ed85836131ae565b14610afa5760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60448201527f770000000000000000000000000000000000000000000000000000000000000060648201526084016108e0565b601c805460ff60a01b1916600160a01b17905561227c81612633565b47801561228c5761228c476127f8565b5050601c805460ff60a01b19169055565b806122aa576122aa612832565b6001600160a01b0384166000908152600a602052604090205460ff1680156122eb57506001600160a01b0383166000908152600a602052604090205460ff16155b15612300576122fb848484612877565b6123ac565b6001600160a01b0384166000908152600a602052604090205460ff1615801561234157506001600160a01b0383166000908152600a602052604090205460ff165b15612351576122fb848484612a49565b6001600160a01b0384166000908152600a602052604090205460ff16801561239157506001600160a01b0383166000908152600a602052604090205460ff165b156123a1576122fb848484612b91565b6123ac848484612ca3565b806123c8576123c8601454601355601654601555601854601755565b50505050565b600d54600c546000918291825b600b54811015612520578260046000600b84815481106123fd576123fd6130f9565b60009182526020808320909101546001600160a01b03168352820192909252604001902054118061246857508160056000600b8481548110612441576124416130f9565b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b1561247e57600d54600c54945094505050509091565b6124c460046000600b8481548110612498576124986130f9565b60009182526020808320909101546001600160a01b031683528201929092526040019020548490612180565b925061250c60056000600b84815481106124e0576124e06130f9565b60009182526020808320909101546001600160a01b031683528201929092526040019020548390612180565b9150806125188161314e565b9150506123db565b50600c54600d5461253091612084565b82101561254757600d54600c549350935050509091565b90939092509050565b600081836125715760405162461bcd60e51b81526004016108e09190612f6c565b50600061205884866131ae565b600080600080600061258f86612d86565b9050600061259c87612da2565b905060006125a988612dbe565b905060006125c1836125bb8b87612180565b90612180565b9993985091965094509092505050565b60008080806125e089866121c2565b905060006125ee89876121c2565b905060006125fc89886121c2565b9050600061260a89896121c2565b9050600061261e826125bb85818989612180565b949d949c50929a509298505050505050505050565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110612668576126686130f9565b6001600160a01b03928316602091820292909201810191909152601b54604080517fad5c46480000000000000000000000000000000000000000000000000000000081529051919093169263ad5c46489260048083019391928290030181865afa1580156126da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126fe9190613167565b81600181518110612711576127116130f9565b6001600160a01b039283166020918202929092010152601b546127379130911684611a2f565b601b546040517f791ac9470000000000000000000000000000000000000000000000000000000081526001600160a01b039091169063791ac94790612789908590600090869030904290600401613214565b600060405180830381600087803b1580156127a357600080fd5b505af11580156127b7573d6000803e3d6000fd5b505050507f32cde87eb454f3a0b875ab23547023107cfad454363ec88ba5695e2c24aa52a782826040516127ec929190613250565b60405180910390a15050565b6003546040516001600160a01b039091169082156108fc029083906000818181858888f19350505050158015610cc8573d6000803e3d6000fd5b6013541580156128425750601554155b801561284e5750601754155b1561285557565b6013805460145560158054601655601780546018556000928390559082905555565b600080600080600080600061288b88612125565b965096509650965096509650965060006128a48a6112af565b905060006128b282876120c6565b9050601254811180156128d35750601c546001600160a01b038c8116911614155b156129375760405162461bcd60e51b815260206004820152602e60248201527f5472616e7366657220616d6f756e74206578636565647320746865204d61782060448201526d2bb0b63632ba1030b6b7bab73a1760911b60648201526084016108e0565b6001600160a01b038c1660009081526005602052604090205461295a908b612180565b6001600160a01b038d16600090815260056020908152604080832093909355600490522054612989908a612180565b6001600160a01b03808e1660009081526004602052604080822093909355908d16815220546129b890896120c6565b6001600160a01b038c166000908152600460205260409020556129da84612dda565b6129e48786612e63565b6129ee8c84612e87565b8a6001600160a01b03168c6001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef88604051612a3391815260200190565b60405180910390a3505050505050505050505050565b6000806000806000806000612a5d88612125565b96509650965096509650965096506000612a768a6112af565b90506000612a8482876120c6565b905060125481118015612aa55750601c546001600160a01b038c8116911614155b15612b095760405162461bcd60e51b815260206004820152602e60248201527f5472616e7366657220616d6f756e74206578636565647320746865204d61782060448201526d2bb0b63632ba1030b6b7bab73a1760911b60648201526084016108e0565b6001600160a01b038c16600090815260046020526040902054612b2c908a612180565b6001600160a01b03808e16600090815260046020908152604080832094909455918e16815260059091522054612b6290876120c6565b6001600160a01b038c166000908152600560209081526040808320939093556004905220546129b890896120c6565b6000806000806000806000612ba588612125565b96509650965096509650965096506000612bbe8a6112af565b90506000612bcc82876120c6565b905060125481118015612bed5750601c546001600160a01b038c8116911614155b15612c515760405162461bcd60e51b815260206004820152602e60248201527f5472616e7366657220616d6f756e74206578636565647320746865204d61782060448201526d2bb0b63632ba1030b6b7bab73a1760911b60648201526084016108e0565b6001600160a01b038c16600090815260056020526040902054612c74908b612180565b6001600160a01b038d16600090815260056020908152604080832093909355600490522054612b2c908a612180565b6000806000806000806000612cb788612125565b96509650965096509650965096506000612cd08a6112af565b90506000612cde82876120c6565b905060125481118015612cff5750601c546001600160a01b038c8116911614155b15612d635760405162461bcd60e51b815260206004820152602e60248201527f5472616e7366657220616d6f756e74206578636565647320746865204d61782060448201526d2bb0b63632ba1030b6b7bab73a1760911b60648201526084016108e0565b6001600160a01b038c16600090815260046020526040902054612989908a612180565b60006109916064611f5a601354856121c290919063ffffffff16565b60006109916064611f5a601554856121c290919063ffffffff16565b60006109916064611f5a601754856121c290919063ffffffff16565b6000612de4612061565b90506000612df283836121c2565b30600090815260046020526040902054909150612e0f90826120c6565b30600090815260046020908152604080832093909355600a9052205460ff1615612e5e5730600090815260056020526040902054612e4d90846120c6565b306000908152600560205260409020555b505050565b600d54612e709083612180565b600d55600e54612e8090826120c6565b600e555050565b6000612e91612061565b90506000612e9f8284613197565b30600090815260046020526040902054909150612ebd908290613184565b30600090815260046020908152604080832093909355600a9052205460ff1615612f0d5730600090815260056020526040902054612efc908490613184565b306000908152600560205260409020555b60405183815230906001600160a01b038616907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a350505050565b600060208284031215612f6557600080fd5b5035919050565b600060208083528351808285015260005b81811015612f9957858101830151858201604001528201612f7d565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114612fcf57600080fd5b50565b60008060408385031215612fe557600080fd5b8235612ff081612fba565b946020939093013593505050565b60008060006060848603121561301357600080fd5b833561301e81612fba565b9250602084013561302e81612fba565b929592945050506040919091013590565b60006020828403121561305157600080fd5b8135610afa81612fba565b6000806040838503121561306f57600080fd5b823591506020830135801515811461308657600080fd5b809150509250929050565b600080604083850312156130a457600080fd5b82356130af81612fba565b9150602083013561308681612fba565b600181811c908216806130d357607f821691505b6020821081036130f357634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b818103818111156109915761099161310f565b634e487b7160e01b600052603160045260246000fd5b6000600182016131605761316061310f565b5060010190565b60006020828403121561317957600080fd5b8151610afa81612fba565b808201808211156109915761099161310f565b80820281158282048414176109915761099161310f565b6000826131cb57634e487b7160e01b600052601260045260246000fd5b500490565b600081518084526020808501945080840160005b838110156132095781516001600160a01b0316875295820195908201906001016131e4565b509495945050505050565b85815284602082015260a06040820152600061323360a08301866131d0565b6001600160a01b0394909416606083015250608001529392505050565b82815260406020820152600061326960408301846131d0565b94935050505056fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63654f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657245524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212204360283a64c941461971128f2292d3253f30947ec05ad7d24dd3b0889fd0637a64736f6c63430008120033

Deployed Bytecode

0x6080604052600436106102e05760003560e01c806352390c021161018457806395d89b41116100d6578063d49d51811161008a578063f2fde38b11610064578063f2fde38b14610846578063f375b25314610866578063f8b45b051461088657600080fd5b8063d49d5181146107ca578063dd62ed3e146107e0578063ea2f0b371461082657600080fd5b8063a9059cbb116100bb578063a9059cbb1461077f578063c9567bf91461079f578063d1475185146107b457600080fd5b806395d89b411461074a578063a457c2d71461075f57600080fd5b806370a082311161013857806388f820201161011257806388f82020146106d35780638da5cb5b1461070c5780638ee88c531461072a57600080fd5b806370a0823114610689578063715018a6146106a95780638203f5fe146106be57600080fd5b8063610d5b1911610169578063610d5b191461061a578063638b1b14146106535780636bc87c3a1461067357600080fd5b806352390c02146105c15780635342acb4146105e157600080fd5b8063313ce5671161023d5780633bd5d173116101f157806345596e2e116101cb57806345596e2e146105615780634680ff351461058157806349bd5a5e146105a157600080fd5b80633bd5d17314610501578063437823ec146105215780634549b0391461054157600080fd5b80633685d419116102225780633685d419146104ab57806339509351146104cb5780633b124fe7146104eb57600080fd5b8063313ce56714610469578063362a3c5d1461048b57600080fd5b806318160ddd1161029457806327c8f8351161027957806327c8f835146103f557806329b1c15c146104295780632d8381191461044957600080fd5b806318160ddd146103c057806323b872dd146103d557600080fd5b8063095ea7b3116102c5578063095ea7b31461033957806313114a9d146103695780631694505e1461038857600080fd5b8063061c82d0146102ec57806306fdde031461030e57600080fd5b366102e757005b600080fd5b3480156102f857600080fd5b5061030c610307366004612f53565b61089c565b005b34801561031a57600080fd5b506103236108ee565b6040516103309190612f6c565b60405180910390f35b34801561034557600080fd5b50610359610354366004612fd2565b610980565b6040519015158152602001610330565b34801561037557600080fd5b50600e545b604051908152602001610330565b34801561039457600080fd5b50601b546103a8906001600160a01b031681565b6040516001600160a01b039091168152602001610330565b3480156103cc57600080fd5b50600c5461037a565b3480156103e157600080fd5b506103596103f0366004612ffe565b610997565b34801561040157600080fd5b506103a87f000000000000000000000000000000000000000000000000000000000000dead81565b34801561043557600080fd5b5061030c61044436600461303f565b610a00565b34801561045557600080fd5b5061037a610464366004612f53565b610a6a565b34801561047557600080fd5b5060115460405160ff9091168152602001610330565b34801561049757600080fd5b5061030c6104a636600461303f565b610b01565b3480156104b757600080fd5b5061030c6104c636600461303f565b610ccc565b3480156104d757600080fd5b506103596104e6366004612fd2565b610e76565b3480156104f757600080fd5b5061037a60135481565b34801561050d57600080fd5b5061030c61051c366004612f53565b610eac565b34801561052d57600080fd5b5061030c61053c36600461303f565b610fa9565b34801561054d57600080fd5b5061037a61055c36600461305c565b611015565b34801561056d57600080fd5b5061030c61057c366004612f53565b6110a4565b34801561058d57600080fd5b5061030c61059c366004612f53565b6110f1565b3480156105ad57600080fd5b50601c546103a8906001600160a01b031681565b3480156105cd57600080fd5b5061030c6105dc36600461303f565b61113e565b3480156105ed57600080fd5b506103596105fc36600461303f565b6001600160a01b031660009081526009602052604090205460ff1690565b34801561062657600080fd5b5061035961063536600461303f565b6001600160a01b031660009081526007602052604090205460ff1690565b34801561065f57600080fd5b506003546103a8906001600160a01b031681565b34801561067f57600080fd5b5061037a60155481565b34801561069557600080fd5b5061037a6106a436600461303f565b6112af565b3480156106b557600080fd5b5061030c61130e565b3480156106ca57600080fd5b5061030c6113a0565b3480156106df57600080fd5b506103596106ee36600461303f565b6001600160a01b03166000908152600a602052604090205460ff1690565b34801561071857600080fd5b506000546001600160a01b03166103a8565b34801561073657600080fd5b5061030c610745366004612f53565b6115e1565b34801561075657600080fd5b5061032361162e565b34801561076b57600080fd5b5061035961077a366004612fd2565b61163d565b34801561078b57600080fd5b5061035961079a366004612fd2565b61168c565b3480156107ab57600080fd5b5061030c611699565b3480156107c057600080fd5b5061037a60175481565b3480156107d657600080fd5b5061037a60001981565b3480156107ec57600080fd5b5061037a6107fb366004613091565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205490565b34801561083257600080fd5b5061030c61084136600461303f565b611724565b34801561085257600080fd5b5061030c61086136600461303f565b61178d565b34801561087257600080fd5b5061030c61088136600461303f565b6118ac565b34801561089257600080fd5b5061037a60125481565b6000546001600160a01b031633146108e95760405162461bcd60e51b8152602060048201819052602482015260008051602061329a83398151915260448201526064015b60405180910390fd5b601355565b6060600f80546108fd906130bf565b80601f0160208091040260200160405190810160405280929190818152602001828054610929906130bf565b80156109765780601f1061094b57610100808354040283529160200191610976565b820191906000526020600020905b81548152906001019060200180831161095957829003601f168201915b5050505050905090565b600061098d338484611a2f565b5060015b92915050565b60006109a4848484611b87565b6109f684336109f185604051806060016040528060288152602001613272602891396001600160a01b038a1660009081526006602090815260408083203384529091529020549190612027565b611a2f565b5060019392505050565b6000546001600160a01b03163314610a485760405162461bcd60e51b8152602060048201819052602482015260008051602061329a83398151915260448201526064016108e0565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b6000600d54821115610ae45760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201527f65666c656374696f6e730000000000000000000000000000000000000000000060648201526084016108e0565b6000610aee612061565b9050610afa8382612084565b9392505050565b6000546001600160a01b03163314610b495760405162461bcd60e51b8152602060048201819052602482015260008051602061329a83398151915260448201526064016108e0565b6001600160a01b03811660009081526007602052604090205460ff16610bb15760405162461bcd60e51b815260206004820152601a60248201527f4163636f756e74206973206e6f7420626c61636b6c697374656400000000000060448201526064016108e0565b60005b600854811015610cc857816001600160a01b031660088281548110610bdb57610bdb6130f9565b6000918252602090912001546001600160a01b031603610cb65760088054610c0590600190613125565b81548110610c1557610c156130f9565b600091825260209091200154600880546001600160a01b039092169183908110610c4157610c416130f9565b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559184168152600790915260409020805460ff191690556008805480610c9057610c90613138565b600082815260209020810160001990810180546001600160a01b03191690550190555050565b80610cc08161314e565b915050610bb4565b5050565b6000546001600160a01b03163314610d145760405162461bcd60e51b8152602060048201819052602482015260008051602061329a83398151915260448201526064016108e0565b6001600160a01b0381166000908152600a602052604090205460ff16610d7c5760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c75646564000000000060448201526064016108e0565b60005b600b54811015610cc857816001600160a01b0316600b8281548110610da657610da66130f9565b6000918252602090912001546001600160a01b031603610e6457600b8054610dd090600190613125565b81548110610de057610de06130f9565b600091825260209091200154600b80546001600160a01b039092169183908110610e0c57610e0c6130f9565b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559184168152600582526040808220829055600a90925220805460ff19169055600b805480610c9057610c90613138565b80610e6e8161314e565b915050610d7f565b3360008181526006602090815260408083206001600160a01b0387168452909152812054909161098d9185906109f190866120c6565b336000818152600a602052604090205460ff1615610f325760405162461bcd60e51b815260206004820152602c60248201527f4578636c75646564206164647265737365732063616e6e6f742063616c6c207460448201527f6869732066756e6374696f6e000000000000000000000000000000000000000060648201526084016108e0565b6000610f3d83612125565b5050506001600160a01b038616600090815260046020526040902054939450610f6b93925084915050612180565b6001600160a01b038316600090815260046020526040902055600d54610f919082612180565b600d55600e54610fa190846120c6565b600e55505050565b6000546001600160a01b03163314610ff15760405162461bcd60e51b8152602060048201819052602482015260008051602061329a83398151915260448201526064016108e0565b6001600160a01b03166000908152600960205260409020805460ff19166001179055565b6000600c548311156110695760405162461bcd60e51b815260206004820152601f60248201527f416d6f756e74206d757374206265206c657373207468616e20737570706c790060448201526064016108e0565b8161108957600061107984612125565b5094965061099195505050505050565b600061109484612125565b5093965061099195505050505050565b6000546001600160a01b031633146110ec5760405162461bcd60e51b8152602060048201819052602482015260008051602061329a83398151915260448201526064016108e0565b601955565b6000546001600160a01b031633146111395760405162461bcd60e51b8152602060048201819052602482015260008051602061329a83398151915260448201526064016108e0565b601755565b6000546001600160a01b031633146111865760405162461bcd60e51b8152602060048201819052602482015260008051602061329a83398151915260448201526064016108e0565b6001600160a01b0381166000908152600a602052604090205460ff16156111ef5760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c75646564000000000060448201526064016108e0565b6001600160a01b03811660009081526004602052604090205415611249576001600160a01b03811660009081526004602052604090205461122f90610a6a565b6001600160a01b0382166000908152600560205260409020555b6001600160a01b03166000818152600a60205260408120805460ff19166001908117909155600b805491820181559091527f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db90180546001600160a01b0319169091179055565b6001600160a01b0381166000908152600a602052604081205460ff16156112ec57506001600160a01b031660009081526005602052604090205490565b6001600160a01b03821660009081526004602052604090205461099190610a6a565b6000546001600160a01b031633146113565760405162461bcd60e51b8152602060048201819052602482015260008051602061329a83398151915260448201526064016108e0565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b031633146113e85760405162461bcd60e51b8152602060048201819052602482015260008051602061329a83398151915260448201526064016108e0565b6000737a250d5630b4cf539739df2c5dacb4c659f2488d9050806001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa15801561143f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114639190613167565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156114b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114d49190613167565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af1158015611539573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061155d9190613167565b601c80546001600160a01b03199081166001600160a01b0393841617909155601b805482169383169390931790925560008054909116815260096020526040808220805460ff19908116600190811790925530845291909220805490911690911790556003805490911673fee18884a9abd2cddc4fe80310c306836b66c37f179055565b6000546001600160a01b031633146116295760405162461bcd60e51b8152602060048201819052602482015260008051602061329a83398151915260448201526064016108e0565b601555565b6060601080546108fd906130bf565b600061098d33846109f1856040518060600160405280602581526020016132ba602591393360009081526006602090815260408083206001600160a01b038d1684529091529020549190612027565b600061098d338484611b87565b6000546001600160a01b031633146116e15760405162461bcd60e51b8152602060048201819052602482015260008051602061329a83398151915260448201526064016108e0565b600060158190556013556004601755601c80547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16600160a81b17905542601a55565b6000546001600160a01b0316331461176c5760405162461bcd60e51b8152602060048201819052602482015260008051602061329a83398151915260448201526064016108e0565b6001600160a01b03166000908152600960205260409020805460ff19169055565b6000546001600160a01b031633146117d55760405162461bcd60e51b8152602060048201819052602482015260008051602061329a83398151915260448201526064016108e0565b6001600160a01b0381166118515760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016108e0565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146118f45760405162461bcd60e51b8152602060048201819052602482015260008051602061329a83398151915260448201526064016108e0565b6001600160a01b038116737a250d5630b4cf539739df2c5dacb4c659f2488d036119605760405162461bcd60e51b815260206004820152601b60248201527f57652063616e6e6f7420626c61636b6c69737420556e6973776170000000000060448201526064016108e0565b6001600160a01b03811660009081526007602052604090205460ff16156119c95760405162461bcd60e51b815260206004820152601e60248201527f4163636f756e7420697320616c726561647920626c61636b6c6973746564000060448201526064016108e0565b6001600160a01b03166000818152600760205260408120805460ff191660019081179091556008805491820181559091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30180546001600160a01b0319169091179055565b6001600160a01b038316611aaa5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f726573730000000000000000000000000000000000000000000000000000000060648201526084016108e0565b6001600160a01b038216611b265760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f737300000000000000000000000000000000000000000000000000000000000060648201526084016108e0565b6001600160a01b0383811660008181526006602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b038316611c035760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f647265737300000000000000000000000000000000000000000000000000000060648201526084016108e0565b6001600160a01b038216611c7f5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f657373000000000000000000000000000000000000000000000000000000000060648201526084016108e0565b60008111611cf55760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d75737420626520677265617465722060448201527f7468616e207a65726f000000000000000000000000000000000000000000000060648201526084016108e0565b6001600160a01b03821660009081526007602052604090205460ff1615611d5e5760405162461bcd60e51b815260206004820152601760248201527f596f752068617665206e6f20706f77657220686572652100000000000000000060448201526064016108e0565b3360009081526007602052604090205460ff1615611dbe5760405162461bcd60e51b815260206004820152601760248201527f596f752068617665206e6f20706f77657220686572652100000000000000000060448201526064016108e0565b601c546001600160a01b038481169116148015611de95750601b546001600160a01b03838116911614155b8015611e0e57506001600160a01b03821660009081526009602052604090205460ff16155b15611edb57601c54600160a81b900460ff16611e6c5760405162461bcd60e51b815260206004820152601860248201527f54726164696e67206e6f742079657420656e61626c65642e000000000000000060448201526064016108e0565b601a544203611edb576001600160a01b0382166000818152600760205260408120805460ff191660019081179091556008805491820181559091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30180546001600160a01b03191690911790555b6000611ee6306112af565b601c54909150600160a01b900460ff16158015611f0c5750601c54600160a81b900460ff165b8015611f255750601c546001600160a01b038481169116145b15611f97578015611f9757601954601c54611f6091606491611f5a9190611f54906001600160a01b03166112af565b906121c2565b90612084565b811115611f8e57601954601c54611f8b91606491611f5a9190611f54906001600160a01b03166112af565b90505b611f9781612260565b601c546000906001600160a01b0386811691161480611fc35750601c546001600160a01b038581169116145b801561200b57506001600160a01b03851660009081526009602052604090205460ff168061200957506001600160a01b03841660009081526009602052604090205460ff165b155b15612014575060015b6120208585858461229d565b5050505050565b6000818484111561204b5760405162461bcd60e51b81526004016108e09190612f6c565b5060006120588486613125565b95945050505050565b600080600061206e6123ce565b909250905061207d8282612084565b9250505090565b6000610afa83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612550565b6000806120d38385613184565b905083811015610afa5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f77000000000060448201526064016108e0565b600080600080600080600080600080600061213f8c61257e565b935093509350935060008060006121608f87878761215b612061565b6125d1565b919f509d509b509599509397509195509350505050919395979092949650565b6000610afa83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612027565b6000826000036121d457506000610991565b60006121e08385613197565b9050826121ed85836131ae565b14610afa5760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60448201527f770000000000000000000000000000000000000000000000000000000000000060648201526084016108e0565b601c805460ff60a01b1916600160a01b17905561227c81612633565b47801561228c5761228c476127f8565b5050601c805460ff60a01b19169055565b806122aa576122aa612832565b6001600160a01b0384166000908152600a602052604090205460ff1680156122eb57506001600160a01b0383166000908152600a602052604090205460ff16155b15612300576122fb848484612877565b6123ac565b6001600160a01b0384166000908152600a602052604090205460ff1615801561234157506001600160a01b0383166000908152600a602052604090205460ff165b15612351576122fb848484612a49565b6001600160a01b0384166000908152600a602052604090205460ff16801561239157506001600160a01b0383166000908152600a602052604090205460ff165b156123a1576122fb848484612b91565b6123ac848484612ca3565b806123c8576123c8601454601355601654601555601854601755565b50505050565b600d54600c546000918291825b600b54811015612520578260046000600b84815481106123fd576123fd6130f9565b60009182526020808320909101546001600160a01b03168352820192909252604001902054118061246857508160056000600b8481548110612441576124416130f9565b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b1561247e57600d54600c54945094505050509091565b6124c460046000600b8481548110612498576124986130f9565b60009182526020808320909101546001600160a01b031683528201929092526040019020548490612180565b925061250c60056000600b84815481106124e0576124e06130f9565b60009182526020808320909101546001600160a01b031683528201929092526040019020548390612180565b9150806125188161314e565b9150506123db565b50600c54600d5461253091612084565b82101561254757600d54600c549350935050509091565b90939092509050565b600081836125715760405162461bcd60e51b81526004016108e09190612f6c565b50600061205884866131ae565b600080600080600061258f86612d86565b9050600061259c87612da2565b905060006125a988612dbe565b905060006125c1836125bb8b87612180565b90612180565b9993985091965094509092505050565b60008080806125e089866121c2565b905060006125ee89876121c2565b905060006125fc89886121c2565b9050600061260a89896121c2565b9050600061261e826125bb85818989612180565b949d949c50929a509298505050505050505050565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110612668576126686130f9565b6001600160a01b03928316602091820292909201810191909152601b54604080517fad5c46480000000000000000000000000000000000000000000000000000000081529051919093169263ad5c46489260048083019391928290030181865afa1580156126da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126fe9190613167565b81600181518110612711576127116130f9565b6001600160a01b039283166020918202929092010152601b546127379130911684611a2f565b601b546040517f791ac9470000000000000000000000000000000000000000000000000000000081526001600160a01b039091169063791ac94790612789908590600090869030904290600401613214565b600060405180830381600087803b1580156127a357600080fd5b505af11580156127b7573d6000803e3d6000fd5b505050507f32cde87eb454f3a0b875ab23547023107cfad454363ec88ba5695e2c24aa52a782826040516127ec929190613250565b60405180910390a15050565b6003546040516001600160a01b039091169082156108fc029083906000818181858888f19350505050158015610cc8573d6000803e3d6000fd5b6013541580156128425750601554155b801561284e5750601754155b1561285557565b6013805460145560158054601655601780546018556000928390559082905555565b600080600080600080600061288b88612125565b965096509650965096509650965060006128a48a6112af565b905060006128b282876120c6565b9050601254811180156128d35750601c546001600160a01b038c8116911614155b156129375760405162461bcd60e51b815260206004820152602e60248201527f5472616e7366657220616d6f756e74206578636565647320746865204d61782060448201526d2bb0b63632ba1030b6b7bab73a1760911b60648201526084016108e0565b6001600160a01b038c1660009081526005602052604090205461295a908b612180565b6001600160a01b038d16600090815260056020908152604080832093909355600490522054612989908a612180565b6001600160a01b03808e1660009081526004602052604080822093909355908d16815220546129b890896120c6565b6001600160a01b038c166000908152600460205260409020556129da84612dda565b6129e48786612e63565b6129ee8c84612e87565b8a6001600160a01b03168c6001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef88604051612a3391815260200190565b60405180910390a3505050505050505050505050565b6000806000806000806000612a5d88612125565b96509650965096509650965096506000612a768a6112af565b90506000612a8482876120c6565b905060125481118015612aa55750601c546001600160a01b038c8116911614155b15612b095760405162461bcd60e51b815260206004820152602e60248201527f5472616e7366657220616d6f756e74206578636565647320746865204d61782060448201526d2bb0b63632ba1030b6b7bab73a1760911b60648201526084016108e0565b6001600160a01b038c16600090815260046020526040902054612b2c908a612180565b6001600160a01b03808e16600090815260046020908152604080832094909455918e16815260059091522054612b6290876120c6565b6001600160a01b038c166000908152600560209081526040808320939093556004905220546129b890896120c6565b6000806000806000806000612ba588612125565b96509650965096509650965096506000612bbe8a6112af565b90506000612bcc82876120c6565b905060125481118015612bed5750601c546001600160a01b038c8116911614155b15612c515760405162461bcd60e51b815260206004820152602e60248201527f5472616e7366657220616d6f756e74206578636565647320746865204d61782060448201526d2bb0b63632ba1030b6b7bab73a1760911b60648201526084016108e0565b6001600160a01b038c16600090815260056020526040902054612c74908b612180565b6001600160a01b038d16600090815260056020908152604080832093909355600490522054612b2c908a612180565b6000806000806000806000612cb788612125565b96509650965096509650965096506000612cd08a6112af565b90506000612cde82876120c6565b905060125481118015612cff5750601c546001600160a01b038c8116911614155b15612d635760405162461bcd60e51b815260206004820152602e60248201527f5472616e7366657220616d6f756e74206578636565647320746865204d61782060448201526d2bb0b63632ba1030b6b7bab73a1760911b60648201526084016108e0565b6001600160a01b038c16600090815260046020526040902054612989908a612180565b60006109916064611f5a601354856121c290919063ffffffff16565b60006109916064611f5a601554856121c290919063ffffffff16565b60006109916064611f5a601754856121c290919063ffffffff16565b6000612de4612061565b90506000612df283836121c2565b30600090815260046020526040902054909150612e0f90826120c6565b30600090815260046020908152604080832093909355600a9052205460ff1615612e5e5730600090815260056020526040902054612e4d90846120c6565b306000908152600560205260409020555b505050565b600d54612e709083612180565b600d55600e54612e8090826120c6565b600e555050565b6000612e91612061565b90506000612e9f8284613197565b30600090815260046020526040902054909150612ebd908290613184565b30600090815260046020908152604080832093909355600a9052205460ff1615612f0d5730600090815260056020526040902054612efc908490613184565b306000908152600560205260409020555b60405183815230906001600160a01b038616907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a350505050565b600060208284031215612f6557600080fd5b5035919050565b600060208083528351808285015260005b81811015612f9957858101830151858201604001528201612f7d565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114612fcf57600080fd5b50565b60008060408385031215612fe557600080fd5b8235612ff081612fba565b946020939093013593505050565b60008060006060848603121561301357600080fd5b833561301e81612fba565b9250602084013561302e81612fba565b929592945050506040919091013590565b60006020828403121561305157600080fd5b8135610afa81612fba565b6000806040838503121561306f57600080fd5b823591506020830135801515811461308657600080fd5b809150509250929050565b600080604083850312156130a457600080fd5b82356130af81612fba565b9150602083013561308681612fba565b600181811c908216806130d357607f821691505b6020821081036130f357634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b818103818111156109915761099161310f565b634e487b7160e01b600052603160045260246000fd5b6000600182016131605761316061310f565b5060010190565b60006020828403121561317957600080fd5b8151610afa81612fba565b808201808211156109915761099161310f565b80820281158282048414176109915761099161310f565b6000826131cb57634e487b7160e01b600052601260045260246000fd5b500490565b600081518084526020808501945080840160005b838110156132095781516001600160a01b0316875295820195908201906001016131e4565b509495945050505050565b85815284602082015260a06040820152600061323360a08301866131d0565b6001600160a01b0394909416606083015250608001529392505050565b82815260406020820152600061326960408301846131d0565b94935050505056fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63654f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657245524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212204360283a64c941461971128f2292d3253f30947ec05ad7d24dd3b0889fd0637a64736f6c63430008120033

Deployed Bytecode Sourcemap

17219:23028:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38334:96;;;;;;;;;;-1:-1:-1;38334:96:0;;;;;:::i;:::-;;:::i;:::-;;20002:83;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20964:186;;;;;;;;;;-1:-1:-1;20964:186:0;;;;;:::i;:::-;;:::i;:::-;;;1396:14:1;;1389:22;1371:41;;1359:2;1344:18;20964:186:0;1231:187:1;22442:87:0;;;;;;;;;;-1:-1:-1;22511:10:0;;22442:87;;;1569:25:1;;;1557:2;1542:18;22442:87:0;1423:177:1;18682:41:0;;;;;;;;;;-1:-1:-1;18682:41:0;;;;-1:-1:-1;;;;;18682:41:0;;;;;;-1:-1:-1;;;;;1796:55:1;;;1778:74;;1766:2;1751:18;18682:41:0;1605:253:1;20279:95:0;;;;;;;;;;-1:-1:-1;20359:7:0;;20279:95;;21158:446;;;;;;;;;;-1:-1:-1;21158:446:0;;;;;:::i;:::-;;:::i;17473:90::-;;;;;;;;;;;;;;;38718:163;;;;;;;;;;-1:-1:-1;38718:163:0;;;;;:::i;:::-;;:::i;23450:306::-;;;;;;;;;;-1:-1:-1;23450:306:0;;;;;:::i;:::-;;:::i;20188:83::-;;;;;;;;;;-1:-1:-1;20254:9:0;;20188:83;;20254:9;;;;2949:36:1;;2937:2;2922:18;20188:83:0;2807:184:1;39536:520:0;;;;;;;;;;-1:-1:-1;39536:520:0;;;;;:::i;:::-;;:::i;24104:477::-;;;;;;;;;;-1:-1:-1;24104:477:0;;;;;:::i;:::-;;:::i;21612:293::-;;;;;;;;;;-1:-1:-1;21612:293:0;;;;;:::i;:::-;;:::i;18341:22::-;;;;;;;;;;;;;;;;22537:421;;;;;;;;;;-1:-1:-1;22537:421:0;;;;;:::i;:::-;;:::i;38097:111::-;;;;;;;;;;-1:-1:-1;38097:111:0;;;;;:::i;:::-;;:::i;22966:476::-;;;;;;;;;;-1:-1:-1;22966:476:0;;;;;:::i;:::-;;:::i;40064:87::-;;;;;;;;;;-1:-1:-1;40064:87:0;;;;;:::i;:::-;;:::i;38566:144::-;;;;;;;;;;-1:-1:-1;38566:144:0;;;;;:::i;:::-;;:::i;18730:28::-;;;;;;;;;;-1:-1:-1;18730:28:0;;;;-1:-1:-1;;;;;18730:28:0;;;23764:332;;;;;;;;;;-1:-1:-1;23764:332:0;;;;;:::i;:::-;;:::i;37965:124::-;;;;;;;;;;-1:-1:-1;37965:124:0;;;;;:::i;:::-;-1:-1:-1;;;;;38054:27:0;38030:4;38054:27;;;:18;:27;;;;;;;;;37965:124;39048:113;;;;;;;;;;-1:-1:-1;39048:113:0;;;;;:::i;:::-;-1:-1:-1;;;;;39135:18:0;39111:4;39135:18;;;:9;:18;;;;;;;;;39048:113;17339:104;;;;;;;;;;-1:-1:-1;17339:104:0;;;;-1:-1:-1;;;;;17339:104:0;;;18420:28;;;;;;;;;;;;;;;;20382:198;;;;;;;;;;-1:-1:-1;20382:198:0;;;;;:::i;:::-;;:::i;8044:148::-;;;;;;;;;;;;;:::i;19211:577::-;;;;;;;;;;;;;:::i;22314:120::-;;;;;;;;;;-1:-1:-1;22314:120:0;;;;;:::i;:::-;-1:-1:-1;;;;;22406:20:0;22382:4;22406:20;;;:11;:20;;;;;;;;;22314:120;7830:79;;;;;;;;;;-1:-1:-1;7868:7:0;7895:6;-1:-1:-1;;;;;7895:6:0;7830:79;;38438:120;;;;;;;;;;-1:-1:-1;38438:120:0;;;;;:::i;:::-;;:::i;20093:87::-;;;;;;;;;;;;;:::i;21913:393::-;;;;;;;;;;-1:-1:-1;21913:393:0;;;;;:::i;:::-;;:::i;20588:192::-;;;;;;;;;;-1:-1:-1;20588:192:0;;;;;:::i;:::-;;:::i;19796:198::-;;;;;;;;;;;;;:::i;18517:30::-;;;;;;;;;;;;;;;;17982:41;;;;;;;;;;-1:-1:-1;17982:41:0;-1:-1:-1;;17982:41:0;;20788:168;;;;;;;;;;-1:-1:-1;20788:168:0;;;;;:::i;:::-;-1:-1:-1;;;;;20921:18:0;;;20894:7;20921:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;20788:168;38216:110;;;;;;;;;;-1:-1:-1;38216:110:0;;;;;:::i;:::-;;:::i;8200:281::-;;;;;;;;;;-1:-1:-1;8200:281:0;;;;;:::i;:::-;;:::i;39169:359::-;;;;;;;;;;-1:-1:-1;39169:359:0;;;;;:::i;:::-;;:::i;18290:44::-;;;;;;;;;;;;;;;;38334:96;7957:6;;-1:-1:-1;;;;;7957:6:0;1562:10;7957:22;7949:67;;;;-1:-1:-1;;;7949:67:0;;4184:2:1;7949:67:0;;;4166:21:1;;;4203:18;;;4196:30;-1:-1:-1;;;;;;;;;;;4242:18:1;;;4235:62;4314:18;;7949:67:0;;;;;;;;;38406:7:::1;:16:::0;38334:96::o;20002:83::-;20039:13;20072:5;20065:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20002:83;:::o;20964:186::-;21064:4;21081:39;1562:10;21104:7;21113:6;21081:8;:39::i;:::-;-1:-1:-1;21138:4:0;20964:186;;;;;:::o;21158:446::-;21290:4;21307:36;21317:6;21325:9;21336:6;21307:9;:36::i;:::-;21354:220;21377:6;1562:10;21425:138;21481:6;21425:138;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;21425:19:0;;;;;;:11;:19;;;;;;;;1562:10;21425:33;;;;;;;;;;:37;:138::i;:::-;21354:8;:220::i;:::-;-1:-1:-1;21592:4:0;21158:446;;;;;:::o;38718:163::-;7957:6;;-1:-1:-1;;;;;7957:6:0;1562:10;7957:22;7949:67;;;;-1:-1:-1;;;7949:67:0;;4184:2:1;7949:67:0;;;4166:21:1;;;4203:18;;;4196:30;-1:-1:-1;;;;;;;;;;;4242:18:1;;;4235:62;4314:18;;7949:67:0;3982:356:1;7949:67:0;38824:18:::1;:49:::0;;-1:-1:-1;;;;;;38824:49:0::1;-1:-1:-1::0;;;;;38824:49:0;;;::::1;::::0;;;::::1;::::0;;38718:163::o;23450:306::-;23533:7;23586;;23575;:18;;23553:110;;;;-1:-1:-1;;;23553:110:0;;4987:2:1;23553:110:0;;;4969:21:1;5026:2;5006:18;;;4999:30;5065:34;5045:18;;;5038:62;5136:12;5116:18;;;5109:40;5166:19;;23553:110:0;4785:406:1;23553:110:0;23674:19;23696:10;:8;:10::i;:::-;23674:32;-1:-1:-1;23724:24:0;:7;23674:32;23724:11;:24::i;:::-;23717:31;23450:306;-1:-1:-1;;;23450:306:0:o;39536:520::-;7957:6;;-1:-1:-1;;;;;7957:6:0;1562:10;7957:22;7949:67;;;;-1:-1:-1;;;7949:67:0;;4184:2:1;7949:67:0;;;4166:21:1;;;4203:18;;;4196:30;-1:-1:-1;;;;;;;;;;;4242:18:1;;;4235:62;4314:18;;7949:67:0;3982:356:1;7949:67:0;-1:-1:-1;;;;;39615:18:0;::::1;;::::0;;;:9:::1;:18;::::0;;;;;::::1;;39607:57;;;::::0;-1:-1:-1;;;39607:57:0;;5398:2:1;39607:57:0::1;::::0;::::1;5380:21:1::0;5437:2;5417:18;;;5410:30;5476:28;5456:18;;;5449:56;5522:18;;39607:57:0::1;5196:350:1::0;39607:57:0::1;39680:9;39675:374;39699:17;:24:::0;39695:28;::::1;39675:374;;;39773:7;-1:-1:-1::0;;;;;39749:31:0::1;:17;39767:1;39749:20;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;39749:20:0::1;:31:::0;39745:293:::1;;39824:17;39864:24:::0;;:28:::1;::::0;39891:1:::1;::::0;39864:28:::1;:::i;:::-;39824:87;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;39801:17:::1;:20:::0;;-1:-1:-1;;;;;39824:87:0;;::::1;::::0;39819:1;;39801:20;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;;::::1;:110:::0;;-1:-1:-1;;;;;;39801:110:0::1;-1:-1:-1::0;;;;;39801:110:0;;::::1;;::::0;;39930:18;;::::1;::::0;;:9:::1;:18:::0;;;;;;:26;;-1:-1:-1;;39930:26:0::1;::::0;;39975:17:::1;:23:::0;;;::::1;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;-1:-1:-1;;39975:23:0;;;;;-1:-1:-1;;;;;;39975:23:0::1;::::0;;;;;39675:374:::1;39536:520:::0;:::o;39745:293::-:1;39725:3:::0;::::1;::::0;::::1;:::i;:::-;;;;39675:374;;;;39536:520:::0;:::o;24104:477::-;7957:6;;-1:-1:-1;;;;;7957:6:0;1562:10;7957:22;7949:67;;;;-1:-1:-1;;;7949:67:0;;4184:2:1;7949:67:0;;;4166:21:1;;;4203:18;;;4196:30;-1:-1:-1;;;;;;;;;;;4242:18:1;;;4235:62;4314:18;;7949:67:0;3982:356:1;7949:67:0;-1:-1:-1;;;;;24184:20:0;::::1;;::::0;;;:11:::1;:20;::::0;;;;;::::1;;24176:60;;;::::0;-1:-1:-1;;;24176:60:0;;6593:2:1;24176:60:0::1;::::0;::::1;6575:21:1::0;6632:2;6612:18;;;6605:30;6671:29;6651:18;;;6644:57;6718:18;;24176:60:0::1;6391:351:1::0;24176:60:0::1;24252:9;24247:327;24271:9;:16:::0;24267:20;::::1;24247:327;;;24329:7;-1:-1:-1::0;;;;;24313:23:0::1;:9;24323:1;24313:12;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;24313:12:0::1;:23:::0;24309:254:::1;;24372:9;24382:16:::0;;:20:::1;::::0;24401:1:::1;::::0;24382:20:::1;:::i;:::-;24372:31;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;24357:9:::1;:12:::0;;-1:-1:-1;;;;;24372:31:0;;::::1;::::0;24367:1;;24357:12;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;;::::1;:46:::0;;-1:-1:-1;;;;;;24357:46:0::1;-1:-1:-1::0;;;;;24357:46:0;;::::1;;::::0;;24422:16;;::::1;::::0;;:7:::1;:16:::0;;;;;;:20;;;24461:11:::1;:20:::0;;;;:28;;-1:-1:-1;;24461:28:0::1;::::0;;24508:9:::1;:15:::0;;;::::1;;;;:::i;24309:254::-;24289:3:::0;::::1;::::0;::::1;:::i;:::-;;;;24247:327;;21612:293:::0;1562:10;21725:4;21814:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;21814:34:0;;;;;;;;;;21725:4;;21742:133;;21792:7;;21814:50;;21853:10;21814:38;:50::i;22537:421::-;1562:10;22589:14;22652:19;;;:11;:19;;;;;;;;22651:20;22629:114;;;;-1:-1:-1;;;22629:114:0;;6949:2:1;22629:114:0;;;6931:21:1;6988:2;6968:18;;;6961:30;7027:34;7007:18;;;7000:62;7098:14;7078:18;;;7071:42;7130:19;;22629:114:0;6747:408:1;22629:114:0;22755:15;22786:19;22797:7;22786:10;:19::i;:::-;-1:-1:-1;;;;;;;;22834:15:0;;;;;;:7;:15;;;;;;22754:51;;-1:-1:-1;22834:28:0;;:15;-1:-1:-1;22754:51:0;;-1:-1:-1;;22834:19:0;:28::i;:::-;-1:-1:-1;;;;;22816:15:0;;;;;;:7;:15;;;;;:46;22883:7;;:20;;22895:7;22883:11;:20::i;:::-;22873:7;:30;22927:10;;:23;;22942:7;22927:14;:23::i;:::-;22914:10;:36;-1:-1:-1;;;22537:421:0:o;38097:111::-;7957:6;;-1:-1:-1;;;;;7957:6:0;1562:10;7957:22;7949:67;;;;-1:-1:-1;;;7949:67:0;;4184:2:1;7949:67:0;;;4166:21:1;;;4203:18;;;4196:30;-1:-1:-1;;;;;;;;;;;4242:18:1;;;4235:62;4314:18;;7949:67:0;3982:356:1;7949:67:0;-1:-1:-1;;;;;38166:27:0::1;;::::0;;;:18:::1;:27;::::0;;;;:34;;-1:-1:-1;;38166:34:0::1;38196:4;38166:34;::::0;;38097:111::o;22966:476::-;23082:7;23121;;23110;:18;;23102:62;;;;-1:-1:-1;;;23102:62:0;;7362:2:1;23102:62:0;;;7344:21:1;7401:2;7381:18;;;7374:30;7440:33;7420:18;;;7413:61;7491:18;;23102:62:0;7160:355:1;23102:62:0;23180:17;23175:260;;23215:15;23246:19;23257:7;23246:10;:19::i;:::-;-1:-1:-1;23214:51:0;;-1:-1:-1;23280:14:0;;-1:-1:-1;;;;;;23280:14:0;23175:260;23330:23;23367:19;23378:7;23367:10;:19::i;:::-;-1:-1:-1;23327:59:0;;-1:-1:-1;23401:22:0;;-1:-1:-1;;;;;;23401:22:0;40064:87;7957:6;;-1:-1:-1;;;;;7957:6:0;1562:10;7957:22;7949:67;;;;-1:-1:-1;;;7949:67:0;;4184:2:1;7949:67:0;;;4166:21:1;;;4203:18;;;4196:30;-1:-1:-1;;;;;;;;;;;4242:18:1;;;4235:62;4314:18;;7949:67:0;3982:356:1;7949:67:0;40128:8:::1;:15:::0;40064:87::o;38566:144::-;7957:6;;-1:-1:-1;;;;;7957:6:0;1562:10;7957:22;7949:67;;;;-1:-1:-1;;;7949:67:0;;4184:2:1;7949:67:0;;;4166:21:1;;;4203:18;;;4196:30;-1:-1:-1;;;;;;;;;;;4242:18:1;;;4235:62;4314:18;;7949:67:0;3982:356:1;7949:67:0;38670:15:::1;:32:::0;38566:144::o;23764:332::-;7957:6;;-1:-1:-1;;;;;7957:6:0;1562:10;7957:22;7949:67;;;;-1:-1:-1;;;7949:67:0;;4184:2:1;7949:67:0;;;4166:21:1;;;4203:18;;;4196:30;-1:-1:-1;;;;;;;;;;;4242:18:1;;;4235:62;4314:18;;7949:67:0;3982:356:1;7949:67:0;-1:-1:-1;;;;;23845:20:0;::::1;;::::0;;;:11:::1;:20;::::0;;;;;::::1;;23844:21;23836:61;;;::::0;-1:-1:-1;;;23836:61:0;;6593:2:1;23836:61:0::1;::::0;::::1;6575:21:1::0;6632:2;6612:18;;;6605:30;6671:29;6651:18;;;6644:57;6718:18;;23836:61:0::1;6391:351:1::0;23836:61:0::1;-1:-1:-1::0;;;;;23912:16:0;::::1;23931:1;23912:16:::0;;;:7:::1;:16;::::0;;;;;:20;23908:109:::1;;-1:-1:-1::0;;;;;23988:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;;23968:37:::1;::::0;:19:::1;:37::i;:::-;-1:-1:-1::0;;;;;23949:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;:56;23908:109:::1;-1:-1:-1::0;;;;;24027:20:0::1;;::::0;;;:11:::1;:20;::::0;;;;:27;;-1:-1:-1;;24027:27:0::1;24050:4;24027:27:::0;;::::1;::::0;;;24065:9:::1;:23:::0;;;;::::1;::::0;;;;;;::::1;::::0;;-1:-1:-1;;;;;;24065:23:0::1;::::0;;::::1;::::0;;23764:332::o;20382:198::-;-1:-1:-1;;;;;20472:20:0;;20448:7;20472:20;;;:11;:20;;;;;;;;20468:49;;;-1:-1:-1;;;;;;20501:16:0;;;;;:7;:16;;;;;;;20382:198::o;20468:49::-;-1:-1:-1;;;;;20555:16:0;;;;;;:7;:16;;;;;;20535:37;;:19;:37::i;8044:148::-;7957:6;;-1:-1:-1;;;;;7957:6:0;1562:10;7957:22;7949:67;;;;-1:-1:-1;;;7949:67:0;;4184:2:1;7949:67:0;;;4166:21:1;;;4203:18;;;4196:30;-1:-1:-1;;;;;;;;;;;4242:18:1;;;4235:62;4314:18;;7949:67:0;3982:356:1;7949:67:0;8151:1:::1;8135:6:::0;;8114:40:::1;::::0;-1:-1:-1;;;;;8135:6:0;;::::1;::::0;8114:40:::1;::::0;8151:1;;8114:40:::1;8182:1;8165:19:::0;;-1:-1:-1;;;;;;8165:19:0::1;::::0;;8044:148::o;19211:577::-;7957:6;;-1:-1:-1;;;;;7957:6:0;1562:10;7957:22;7949:67;;;;-1:-1:-1;;;7949:67:0;;4184:2:1;7949:67:0;;;4166:21:1;;;4203:18;;;4196:30;-1:-1:-1;;;;;;;;;;;4242:18:1;;;4235:62;4314:18;;7949:67:0;3982:356:1;7949:67:0;19265:35:::1;19336:42;19265:124;;19434:16;-1:-1:-1::0;;;;;19434:24:0::1;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;19416:70:0::1;;19495:4;19502:16;-1:-1:-1::0;;;;;19502:21:0::1;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19416:110;::::0;;::::1;::::0;;;;;;-1:-1:-1;;;;;8029:15:1;;;19416:110:0::1;::::0;::::1;8011:34:1::0;8081:15;;8061:18;;;8054:43;7923:18;;19416:110:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19400:13;:126:::0;;-1:-1:-1;;;;;;19400:126:0;;::::1;-1:-1:-1::0;;;;;19400:126:0;;::::1;;::::0;;;19539:15:::1;:34:::0;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;-1:-1:-1;7895:6:0;;;;;19586:27;;:18:::1;:27;::::0;;;;;:34;;-1:-1:-1;;19586:34:0;;::::1;-1:-1:-1::0;19586:34:0;;::::1;::::0;;;19658:4:::1;19631:33:::0;;;;;;:40;;;;::::1;::::0;;::::1;::::0;;19684:18:::1;:96:::0;;;;::::1;19727:42;19684:96;::::0;;19211:577::o;38438:120::-;7957:6;;-1:-1:-1;;;;;7957:6:0;1562:10;7957:22;7949:67;;;;-1:-1:-1;;;7949:67:0;;4184:2:1;7949:67:0;;;4166:21:1;;;4203:18;;;4196:30;-1:-1:-1;;;;;;;;;;;4242:18:1;;;4235:62;4314:18;;7949:67:0;3982:356:1;7949:67:0;38522:13:::1;:28:::0;38438:120::o;20093:87::-;20132:13;20165:7;20158:14;;;;;:::i;21913:393::-;22031:4;22048:228;1562:10;22098:7;22120:145;22177:15;22120:145;;;;;;;;;;;;;;;;;1562:10;22120:25;;;;:11;:25;;;;;;;;-1:-1:-1;;;;;22120:34:0;;;;;;;;;;;;:38;:145::i;20588:192::-;20691:4;20708:42;1562:10;20732:9;20743:6;20708:9;:42::i;19796:198::-;7957:6;;-1:-1:-1;;;;;7957:6:0;1562:10;7957:22;7949:67;;;;-1:-1:-1;;;7949:67:0;;4184:2:1;7949:67:0;;;4166:21:1;;;4203:18;;;4196:30;-1:-1:-1;;;;;;;;;;;4242:18:1;;;4235:62;4314:18;;7949:67:0;3982:356:1;7949:67:0;19865:1:::1;19849:13;:17:::0;;;19877:7:::1;:11:::0;19917:1:::1;19899:15;:19:::0;19929:11:::1;:18:::0;;;::::1;-1:-1:-1::0;;;19929:18:0::1;::::0;;19971:15:::1;19958:10;:28:::0;19796:198::o;38216:110::-;7957:6;;-1:-1:-1;;;;;7957:6:0;1562:10;7957:22;7949:67;;;;-1:-1:-1;;;7949:67:0;;4184:2:1;7949:67:0;;;4166:21:1;;;4203:18;;;4196:30;-1:-1:-1;;;;;;;;;;;4242:18:1;;;4235:62;4314:18;;7949:67:0;3982:356:1;7949:67:0;-1:-1:-1;;;;;38283:27:0::1;38313:5;38283:27:::0;;;:18:::1;:27;::::0;;;;:35;;-1:-1:-1;;38283:35:0::1;::::0;;38216:110::o;8200:281::-;7957:6;;-1:-1:-1;;;;;7957:6:0;1562:10;7957:22;7949:67;;;;-1:-1:-1;;;7949:67:0;;4184:2:1;7949:67:0;;;4166:21:1;;;4203:18;;;4196:30;-1:-1:-1;;;;;;;;;;;4242:18:1;;;4235:62;4314:18;;7949:67:0;3982:356:1;7949:67:0;-1:-1:-1;;;;;8303:22:0;::::1;8281:110;;;::::0;-1:-1:-1;;;8281:110:0;;8310:2:1;8281:110:0::1;::::0;::::1;8292:21:1::0;8349:2;8329:18;;;8322:30;8388:34;8368:18;;;8361:62;8459:8;8439:18;;;8432:36;8485:19;;8281:110:0::1;8108:402:1::0;8281:110:0::1;8428:6;::::0;;8407:38:::1;::::0;-1:-1:-1;;;;;8407:38:0;;::::1;::::0;8428:6;::::1;::::0;8407:38:::1;::::0;::::1;8456:6;:17:::0;;-1:-1:-1;;;;;;8456:17:0::1;-1:-1:-1::0;;;;;8456:17:0;;;::::1;::::0;;;::::1;::::0;;8200:281::o;39169:359::-;7957:6;;-1:-1:-1;;;;;7957:6:0;1562:10;7957:22;7949:67;;;;-1:-1:-1;;;7949:67:0;;4184:2:1;7949:67:0;;;4166:21:1;;;4203:18;;;4196:30;-1:-1:-1;;;;;;;;;;;4242:18:1;;;4235:62;4314:18;;7949:67:0;3982:356:1;7949:67:0;-1:-1:-1;;;;;39261:53:0;::::1;39272:42;39261:53:::0;39239:130:::1;;;::::0;-1:-1:-1;;;39239:130:0;;8717:2:1;39239:130:0::1;::::0;::::1;8699:21:1::0;8756:2;8736:18;;;8729:30;8795:29;8775:18;;;8768:57;8842:18;;39239:130:0::1;8515:351:1::0;39239:130:0::1;-1:-1:-1::0;;;;;39389:18:0;::::1;;::::0;;;:9:::1;:18;::::0;;;;;::::1;;39388:19;39380:62;;;::::0;-1:-1:-1;;;39380:62:0;;9073:2:1;39380:62:0::1;::::0;::::1;9055:21:1::0;9112:2;9092:18;;;9085:30;9151:32;9131:18;;;9124:60;9201:18;;39380:62:0::1;8871:354:1::0;39380:62:0::1;-1:-1:-1::0;;;;;39453:18:0::1;;::::0;;;:9:::1;:18;::::0;;;;:25;;-1:-1:-1;;39453:25:0::1;39474:4;39453:25:::0;;::::1;::::0;;;39489:17:::1;:31:::0;;;;::::1;::::0;;;;;;::::1;::::0;;-1:-1:-1;;;;;;39489:31:0::1;::::0;;::::1;::::0;;39169:359::o;24589:337::-;-1:-1:-1;;;;;24682:19:0;;24674:68;;;;-1:-1:-1;;;24674:68:0;;9432:2:1;24674:68:0;;;9414:21:1;9471:2;9451:18;;;9444:30;9510:34;9490:18;;;9483:62;9581:6;9561:18;;;9554:34;9605:19;;24674:68:0;9230:400:1;24674:68:0;-1:-1:-1;;;;;24761:21:0;;24753:68;;;;-1:-1:-1;;;24753:68:0;;9837:2:1;24753:68:0;;;9819:21:1;9876:2;9856:18;;;9849:30;9915:34;9895:18;;;9888:62;9986:4;9966:18;;;9959:32;10008:19;;24753:68:0;9635:398:1;24753:68:0;-1:-1:-1;;;;;24834:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;24886:32;;1569:25:1;;;24886:32:0;;1542:18:1;24886:32:0;;;;;;;24589:337;;;:::o;24934:1773::-;-1:-1:-1;;;;;25022:18:0;;25014:68;;;;-1:-1:-1;;;25014:68:0;;10240:2:1;25014:68:0;;;10222:21:1;10279:2;10259:18;;;10252:30;10318:34;10298:18;;;10291:62;10389:7;10369:18;;;10362:35;10414:19;;25014:68:0;10038:401:1;25014:68:0;-1:-1:-1;;;;;25101:16:0;;25093:64;;;;-1:-1:-1;;;25093:64:0;;10646:2:1;25093:64:0;;;10628:21:1;10685:2;10665:18;;;10658:30;10724:34;10704:18;;;10697:62;10795:5;10775:18;;;10768:33;10818:19;;25093:64:0;10444:399:1;25093:64:0;25185:1;25176:6;:10;25168:64;;;;-1:-1:-1;;;25168:64:0;;11050:2:1;25168:64:0;;;11032:21:1;11089:2;11069:18;;;11062:30;11128:34;11108:18;;;11101:62;11199:11;11179:18;;;11172:39;11228:19;;25168:64:0;10848:405:1;25168:64:0;-1:-1:-1;;;;;25252:13:0;;;;;;:9;:13;;;;;;;;25251:14;25243:50;;;;-1:-1:-1;;;25243:50:0;;11460:2:1;25243:50:0;;;11442:21:1;11499:2;11479:18;;;11472:30;11538:25;11518:18;;;11511:53;11581:18;;25243:50:0;11258:347:1;25243:50:0;25323:10;25313:21;;;;:9;:21;;;;;;;;25312:22;25304:58;;;;-1:-1:-1;;;25304:58:0;;11460:2:1;25304:58:0;;;11442:21:1;11499:2;11479:18;;;11472:30;11538:25;11518:18;;;11511:53;11581:18;;25304:58:0;11258:347:1;25304:58:0;25417:13;;-1:-1:-1;;;;;25409:21:0;;;25417:13;;25409:21;:68;;;;-1:-1:-1;25461:15:0;;-1:-1:-1;;;;;25447:30:0;;;25461:15;;25447:30;;25409:68;:108;;;;-1:-1:-1;;;;;;25495:22:0;;;;;;:18;:22;;;;;;;;25494:23;25409:108;25391:387;;;25552:11;;-1:-1:-1;;;25552:11:0;;;;25544:48;;;;-1:-1:-1;;;25544:48:0;;11812:2:1;25544:48:0;;;11794:21:1;11851:2;11831:18;;;11824:30;11890:26;11870:18;;;11863:54;11934:18;;25544:48:0;11610:348:1;25544:48:0;25655:10;;25636:15;:29;25632:135;;-1:-1:-1;;;;;25686:13:0;;;;;;:9;:13;;;;;:20;;-1:-1:-1;;25686:20:0;25702:4;25686:20;;;;;;25725:17;:26;;;;;;;;;;;;;;-1:-1:-1;;;;;;25725:26:0;;;;;;25632:135;25790:28;25821:24;25839:4;25821:9;:24::i;:::-;25881:16;;25790:55;;-1:-1:-1;;;;25881:16:0;;;;25880:17;:32;;;;-1:-1:-1;25901:11:0;;-1:-1:-1;;;25901:11:0;;;;25880:32;:55;;;;-1:-1:-1;25922:13:0;;-1:-1:-1;;;;;25916:19:0;;;25922:13;;25916:19;25880:55;25876:504;;;25956:24;;25952:417;;26100:8;;26081:13;;26071:47;;26114:3;;26071:38;;26100:8;26071:24;;-1:-1:-1;;;;;26081:13:0;26071:9;:24::i;:::-;:28;;:38::i;:::-;:42;;:47::i;:::-;26027:20;:91;26001:302;;;26239:8;;26194:13;;26184:99;;26279:3;;26184:64;;26239:8;26184:24;;-1:-1:-1;;;;;26194:13:0;26184:9;:24::i;:99::-;26161:122;;26001:302;26321:32;26332:20;26321:10;:32::i;:::-;26486:13;;26392:12;;-1:-1:-1;;;;;26478:21:0;;;26486:13;;26478:21;;:44;;-1:-1:-1;26509:13:0;;-1:-1:-1;;;;;26503:19:0;;;26509:13;;26503:19;26478:44;26477:116;;;;-1:-1:-1;;;;;;26542:24:0;;;;;;:18;:24;;;;;;;;;:50;;-1:-1:-1;;;;;;26570:22:0;;;;;;:18;:22;;;;;;;;26542:50;26540:53;26477:116;26459:187;;;-1:-1:-1;26630:4:0;26459:187;26658:41;26673:4;26679:2;26683:6;26691:7;26658:14;:41::i;:::-;25003:1704;;24934:1773;;;:::o;2993:226::-;3113:7;3149:12;3141:6;;;;3133:29;;;;-1:-1:-1;;;3133:29:0;;;;;;;;:::i;:::-;-1:-1:-1;3173:9:0;3185:5;3189:1;3185;:5;:::i;:::-;3173:17;2993:226;-1:-1:-1;;;;;2993:226:0:o;35326:164::-;35368:7;35389:15;35406;35425:19;:17;:19::i;:::-;35388:56;;-1:-1:-1;35388:56:0;-1:-1:-1;35462:20:0;35388:56;;35462:11;:20::i;:::-;35455:27;;;;35326:164;:::o;3485:132::-;3543:7;3570:39;3574:1;3577;3570:39;;;;;;;;;;;;;;;;;:3;:39::i;2660:181::-;2718:7;;2750:5;2754:1;2750;:5;:::i;:::-;2738:17;;2779:1;2774;:6;;2766:46;;;;-1:-1:-1;;;2766:46:0;;12295:2:1;2766:46:0;;;12277:21:1;12334:2;12314:18;;;12307:30;12373:29;12353:18;;;12346:57;12420:18;;2766:46:0;12093:351:1;33492:767:0;33594:7;33603;33612;33621;33630;33639;33648;33688:23;33726:12;33753:18;33786:20;33820;33832:7;33820:11;:20::i;:::-;33673:167;;;;;;;;33852:15;33869:23;33894:12;33910:140;33936:7;33958:4;33977:10;34002:12;34029:10;:8;:10::i;:::-;33910:11;:140::i;:::-;33851:199;;-1:-1:-1;33851:199:0;-1:-1:-1;33851:199:0;-1:-1:-1;34154:15:0;;-1:-1:-1;34184:4:0;;-1:-1:-1;34203:10:0;;-1:-1:-1;34228:12:0;-1:-1:-1;;;;33492:767:0;;;;;;;;;:::o;2849:136::-;2907:7;2934:43;2938:1;2941;2934:43;;;;;;;;;;;;;;;;;:3;:43::i;3227:250::-;3285:7;3309:1;3314;3309:6;3305:47;;-1:-1:-1;3339:1:0;3332:8;;3305:47;3364:9;3376:5;3380:1;3376;:5;:::i;:::-;3364:17;-1:-1:-1;3409:1:0;3400:5;3404:1;3364:17;3400:5;:::i;:::-;:10;3392:56;;;;-1:-1:-1;;;3392:56:0;;13103:2:1;3392:56:0;;;13085:21:1;13142:2;13122:18;;;13115:30;13181:34;13161:18;;;13154:62;13252:3;13232:18;;;13225:31;13273:19;;3392:56:0;12901:397:1;26715:329:0;18994:16;:23;;-1:-1:-1;;;;18994:23:0;-1:-1:-1;;;18994:23:0;;;26796:38:::1;26813:20:::0;26796:16:::1;:38::i;:::-;26915:21;26951:22:::0;;26947:90:::1;;26990:35;27003:21;26990:12;:35::i;:::-;-1:-1:-1::0;;19040:16:0;:24;;-1:-1:-1;;;;19040:24:0;;;26715:329::o;28347:708::-;28503:7;28498:28;;28512:14;:12;:14::i;:::-;-1:-1:-1;;;;;28543:19:0;;;;;;:11;:19;;;;;;;;:46;;;;-1:-1:-1;;;;;;28567:22:0;;;;;;:11;:22;;;;;;;;28566:23;28543:46;28539:467;;;28606:48;28628:6;28636:9;28647:6;28606:21;:48::i;:::-;28539:467;;;-1:-1:-1;;;;;28677:19:0;;;;;;:11;:19;;;;;;;;28676:20;:46;;;;-1:-1:-1;;;;;;28700:22:0;;;;;;:11;:22;;;;;;;;28676:46;28672:334;;;28739:46;28759:6;28767:9;28778:6;28739:19;:46::i;28672:334::-;-1:-1:-1;;;;;28807:19:0;;;;;;:11;:19;;;;;;;;:45;;;;-1:-1:-1;;;;;;28830:22:0;;;;;;:11;:22;;;;;;;;28807:45;28803:203;;;28869:48;28891:6;28899:9;28910:6;28869:21;:48::i;28803:203::-;28950:44;28968:6;28976:9;28987:6;28950:17;:44::i;:::-;29023:7;29018:29;;29032:15;37834;;37824:7;:25;37876:21;;37860:13;:37;37926:23;;37908:15;:41;37780:177;29032:15;28347:708;;;;:::o;35498:605::-;35596:7;;35632;;35549;;;;;35650:338;35674:9;:16;35670:20;;35650:338;;;35758:7;35734;:21;35742:9;35752:1;35742:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;35742:12:0;35734:21;;;;;;;;;;;;;:31;;:83;;;35810:7;35786;:21;35794:9;35804:1;35794:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;35794:12:0;35786:21;;;;;;;;;;;;;:31;35734:83;35712:146;;;35841:7;;35850;;35833:25;;;;;;;35498:605;;:::o;35712:146::-;35883:34;35895:7;:21;35903:9;35913:1;35903:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;35903:12:0;35895:21;;;;;;;;;;;;;35883:7;;:11;:34::i;:::-;35873:44;;35942:34;35954:7;:21;35962:9;35972:1;35962:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;35962:12:0;35954:21;;;;;;;;;;;;;35942:7;;:11;:34::i;:::-;35932:44;-1:-1:-1;35692:3:0;;;;:::i;:::-;;;;35650:338;;;-1:-1:-1;36024:7:0;;36012;;:20;;:11;:20::i;:::-;36002:7;:30;35998:61;;;36042:7;;36051;;36034:25;;;;;;35498:605;;:::o;35998:61::-;36078:7;;36087;;-1:-1:-1;35498:605:0;-1:-1:-1;35498:605:0:o;3625:312::-;3745:7;3780:12;3773:5;3765:28;;;;-1:-1:-1;;;3765:28:0;;;;;;;;:::i;:::-;-1:-1:-1;3804:9:0;3816:5;3820:1;3816;:5;:::i;34267:435::-;34343:7;34352;34361;34370;34390:12;34405:24;34421:7;34405:15;:24::i;:::-;34390:39;;34440:18;34461:30;34483:7;34461:21;:30::i;:::-;34440:51;;34502:20;34525:32;34549:7;34525:23;:32::i;:::-;34502:55;-1:-1:-1;34568:23:0;34594:33;34616:10;34594:17;:7;34606:4;34594:11;:17::i;:::-;:21;;:33::i;:::-;34568:59;34663:4;;-1:-1:-1;34669:10:0;;-1:-1:-1;34669:10:0;-1:-1:-1;34267:435:0;;-1:-1:-1;;;34267:435:0:o;34710:608::-;34899:7;;;;34955:24;:7;34967:11;34955;:24::i;:::-;34937:42;-1:-1:-1;34990:12:0;35005:21;:4;35014:11;35005:8;:21::i;:::-;34990:36;-1:-1:-1;35037:18:0;35058:27;:10;35073:11;35058:14;:27::i;:::-;35037:48;-1:-1:-1;35096:20:0;35119:29;:12;35136:11;35119:16;:29::i;:::-;35096:52;-1:-1:-1;35159:23:0;35185:75;35096:52;35185:33;35207:10;35185:33;:7;35197:4;35185:11;:17::i;:75::-;35279:7;;;;-1:-1:-1;35305:4:0;;-1:-1:-1;34710:608:0;;-1:-1:-1;;;;;;;;;34710:608:0:o;27160:658::-;27310:16;;;27324:1;27310:16;;;;;;;;27286:21;;27310:16;;;;;;;;;;-1:-1:-1;27310:16:0;27286:40;;27355:4;27337;27342:1;27337:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;27337:23:0;;;:7;;;;;;;;;;:23;;;;27381:15;;:22;;;;;;;;:15;;;;;:20;;:22;;;;;27337:7;;27381:22;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27371:4;27376:1;27371:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;27371:32:0;;;:7;;;;;;;;;:32;27448:15;;27416:62;;27433:4;;27448:15;27466:11;27416:8;:62::i;:::-;27517:15;;:240;;;;;-1:-1:-1;;;;;27517:15:0;;;;:66;;:240;;27598:11;;27517:15;;27668:4;;27695;;27731:15;;27517:240;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27775:35;27792:11;27805:4;27775:35;;;;;;;:::i;:::-;;;;;;;;27215:603;27160:658;:::o;27052:100::-;27109:18;;:35;;-1:-1:-1;;;;;27109:18:0;;;;:35;;;;;27137:6;;27109:18;:35;:18;:35;27137:6;27109:18;:35;;;;;;;;;;;;;;;;;;;37433:339;37480:7;;:12;:34;;;;-1:-1:-1;37496:13:0;;:18;37480:34;:58;;;;-1:-1:-1;37518:15:0;;:20;37480:58;37476:71;;;37433:339::o;37476:71::-;37577:7;;;37559:15;:25;37619:13;;;37595:21;:37;37669:15;;;37643:23;:41;-1:-1:-1;37695:11:0;;;;37717:17;;;;37745:19;37433:339::o;31140:1055::-;31291:15;31321:23;31359:12;31386:23;31424:12;31451:18;31484:20;31518:19;31529:7;31518:10;:19::i;:::-;31276:261;;;;;;;;;;;;;;31550:19;31572:20;31582:9;31572;:20::i;:::-;31550:42;-1:-1:-1;31605:18:0;31626:32;31550:42;31642:15;31626;:32::i;:::-;31605:53;;31688:9;;31675:10;:22;:61;;;;-1:-1:-1;31722:13:0;;-1:-1:-1;;;;;31701:35:0;;;31722:13;;31701:35;;31675:61;31671:150;;;31753:56;;-1:-1:-1;;;31753:56:0;;15130:2:1;31753:56:0;;;15112:21:1;15169:2;15149:18;;;15142:30;15208:34;15188:18;;;15181:62;-1:-1:-1;;;15259:18:1;;;15252:44;15313:19;;31753:56:0;14928:410:1;31671:150:0;-1:-1:-1;;;;;31851:15:0;;;;;;:7;:15;;;;;;:28;;31871:7;31851:19;:28::i;:::-;-1:-1:-1;;;;;31833:15:0;;;;;;:7;:15;;;;;;;;:46;;;;31908:7;:15;;;;:28;;31928:7;31908:19;:28::i;:::-;-1:-1:-1;;;;;31890:15:0;;;;;;;:7;:15;;;;;;:46;;;;31968:18;;;;;;;:39;;31991:15;31968:22;:39::i;:::-;-1:-1:-1;;;;;31947:18:0;;;;;;:7;:18;;;;;:60;32018:26;32033:10;32018:14;:26::i;:::-;32055:23;32067:4;32073;32055:11;:23::i;:::-;32089:38;32106:6;32114:12;32089:16;:38::i;:::-;32160:9;-1:-1:-1;;;;;32143:44:0;32152:6;-1:-1:-1;;;;;32143:44:0;;32171:15;32143:44;;;;1569:25:1;;1557:2;1542:18;;1423:177;32143:44:0;;;;;;;;31265:930;;;;;;;;;31140:1055;;;:::o;30065:1067::-;30214:15;30244:23;30282:12;30309:23;30347:12;30374:18;30407:20;30441:19;30452:7;30441:10;:19::i;:::-;30199:261;;;;;;;;;;;;;;30473:19;30495:20;30505:9;30495;:20::i;:::-;30473:42;-1:-1:-1;30528:18:0;30549:32;30473:42;30565:15;30549;:32::i;:::-;30528:53;;30611:9;;30598:10;:22;:61;;;;-1:-1:-1;30645:13:0;;-1:-1:-1;;;;;30624:35:0;;;30645:13;;30624:35;;30598:61;30594:150;;;30676:56;;-1:-1:-1;;;30676:56:0;;15130:2:1;30676:56:0;;;15112:21:1;15169:2;15149:18;;;15142:30;15208:34;15188:18;;;15181:62;-1:-1:-1;;;15259:18:1;;;15252:44;15313:19;;30676:56:0;14928:410:1;30594:150:0;-1:-1:-1;;;;;30774:15:0;;;;;;:7;:15;;;;;;:28;;30794:7;30774:19;:28::i;:::-;-1:-1:-1;;;;;30756:15:0;;;;;;;:7;:15;;;;;;;;:46;;;;30834:18;;;;;:7;:18;;;;;:39;;30857:15;30834:22;:39::i;:::-;-1:-1:-1;;;;;30813:18:0;;;;;;:7;:18;;;;;;;;:60;;;;30905:7;:18;;;;:39;;30928:15;30905:22;:39::i;32203:1126::-;32354:15;32384:23;32422:12;32449:23;32487:12;32514:18;32547:20;32581:19;32592:7;32581:10;:19::i;:::-;32339:261;;;;;;;;;;;;;;32613:19;32635:20;32645:9;32635;:20::i;:::-;32613:42;-1:-1:-1;32668:18:0;32689:32;32613:42;32705:15;32689;:32::i;:::-;32668:53;;32751:9;;32738:10;:22;:61;;;;-1:-1:-1;32785:13:0;;-1:-1:-1;;;;;32764:35:0;;;32785:13;;32764:35;;32738:61;32734:150;;;32816:56;;-1:-1:-1;;;32816:56:0;;15130:2:1;32816:56:0;;;15112:21:1;15169:2;15149:18;;;15142:30;15208:34;15188:18;;;15181:62;-1:-1:-1;;;15259:18:1;;;15252:44;15313:19;;32816:56:0;14928:410:1;32734:150:0;-1:-1:-1;;;;;32914:15:0;;;;;;:7;:15;;;;;;:28;;32934:7;32914:19;:28::i;:::-;-1:-1:-1;;;;;32896:15:0;;;;;;:7;:15;;;;;;;;:46;;;;32971:7;:15;;;;:28;;32991:7;32971:19;:28::i;29063:994::-;29210:15;29240:23;29278:12;29305:23;29343:12;29370:18;29403:20;29437:19;29448:7;29437:10;:19::i;:::-;29195:261;;;;;;;;;;;;;;29469:19;29491:20;29501:9;29491;:20::i;:::-;29469:42;-1:-1:-1;29524:18:0;29545:32;29469:42;29561:15;29545;:32::i;:::-;29524:53;;29607:9;;29594:10;:22;:61;;;;-1:-1:-1;29641:13:0;;-1:-1:-1;;;;;29620:35:0;;;29641:13;;29620:35;;29594:61;29590:150;;;29672:56;;-1:-1:-1;;;29672:56:0;;15130:2:1;29672:56:0;;;15112:21:1;15169:2;15149:18;;;15142:30;15208:34;15188:18;;;15181:62;-1:-1:-1;;;15259:18:1;;;15252:44;15313:19;;29672:56:0;14928:410:1;29590:150:0;-1:-1:-1;;;;;29770:15:0;;;;;;:7;:15;;;;;;:28;;29790:7;29770:19;:28::i;36953:132::-;37017:7;37044:33;37069:7;37044:20;37056:7;;37044;:11;;:20;;;;:::i;37093:160::-;37179:7;37206:39;37237:7;37206:26;37218:13;;37206:7;:11;;:26;;;;:::i;37261:164::-;37349:7;37376:41;37409:7;37376:28;37388:15;;37376:7;:11;;:28;;;;:::i;36111:355::-;36174:19;36196:10;:8;:10::i;:::-;36174:32;-1:-1:-1;36217:18:0;36238:27;:10;36174:32;36238:14;:27::i;:::-;36317:4;36301:22;;;;:7;:22;;;;;;36217:48;;-1:-1:-1;36301:38:0;;36217:48;36301:26;:38::i;:::-;36292:4;36276:22;;;;:7;:22;;;;;;;;:63;;;;36354:11;:26;;;;;;36350:108;;;36436:4;36420:22;;;;:7;:22;;;;;;:38;;36447:10;36420:26;:38::i;:::-;36411:4;36395:22;;;;:7;:22;;;;;:63;36350:108;36163:303;;36111:355;:::o;33337:147::-;33415:7;;:17;;33427:4;33415:11;:17::i;:::-;33405:7;:27;33456:10;;:20;;33471:4;33456:14;:20::i;:::-;33443:10;:33;-1:-1:-1;;33337:147:0:o;36474:471::-;36558:19;36580:10;:8;:10::i;:::-;36558:32;-1:-1:-1;36601:18:0;36622:26;36558:32;36622:12;:26;:::i;:::-;36700:4;36684:22;;;;:7;:22;;;;;;36601:47;;-1:-1:-1;36684:35:0;;36601:47;;36684:35;:::i;:::-;36675:4;36659:22;;;;:7;:22;;;;;;;;:60;;;;36734:11;:26;;;;;;36730:107;;;36816:4;36800:22;;;;:7;:22;;;;;;:37;;36825:12;;36800:37;:::i;:::-;36791:4;36775:22;;;;:7;:22;;;;;:62;36730:107;36853:45;;1569:25:1;;;36878:4:0;;-1:-1:-1;;;;;36853:45:0;;;;;1557:2:1;1542:18;36853:45:0;;;;;;;36547:398;;36474:471;;:::o;14:180:1:-;73:6;126:2;114:9;105:7;101:23;97:32;94:52;;;142:1;139;132:12;94:52;-1:-1:-1;165:23:1;;14:180;-1:-1:-1;14:180:1:o;199:548::-;311:4;340:2;369;358:9;351:21;401:6;395:13;444:6;439:2;428:9;424:18;417:34;469:1;479:140;493:6;490:1;487:13;479:140;;;588:14;;;584:23;;578:30;554:17;;;573:2;550:26;543:66;508:10;;479:140;;;483:3;668:1;663:2;654:6;643:9;639:22;635:31;628:42;738:2;731;727:7;722:2;714:6;710:15;706:29;695:9;691:45;687:54;679:62;;;;199:548;;;;:::o;752:154::-;-1:-1:-1;;;;;831:5:1;827:54;820:5;817:65;807:93;;896:1;893;886:12;807:93;752:154;:::o;911:315::-;979:6;987;1040:2;1028:9;1019:7;1015:23;1011:32;1008:52;;;1056:1;1053;1046:12;1008:52;1095:9;1082:23;1114:31;1139:5;1114:31;:::i;:::-;1164:5;1216:2;1201:18;;;;1188:32;;-1:-1:-1;;;911:315:1:o;1863:456::-;1940:6;1948;1956;2009:2;1997:9;1988:7;1984:23;1980:32;1977:52;;;2025:1;2022;2015:12;1977:52;2064:9;2051:23;2083:31;2108:5;2083:31;:::i;:::-;2133:5;-1:-1:-1;2190:2:1;2175:18;;2162:32;2203:33;2162:32;2203:33;:::i;:::-;1863:456;;2255:7;;-1:-1:-1;;;2309:2:1;2294:18;;;;2281:32;;1863:456::o;2555:247::-;2614:6;2667:2;2655:9;2646:7;2642:23;2638:32;2635:52;;;2683:1;2680;2673:12;2635:52;2722:9;2709:23;2741:31;2766:5;2741:31;:::i;2996:341::-;3061:6;3069;3122:2;3110:9;3101:7;3097:23;3093:32;3090:52;;;3138:1;3135;3128:12;3090:52;3174:9;3161:23;3151:33;;3234:2;3223:9;3219:18;3206:32;3281:5;3274:13;3267:21;3260:5;3257:32;3247:60;;3303:1;3300;3293:12;3247:60;3326:5;3316:15;;;2996:341;;;;;:::o;3589:388::-;3657:6;3665;3718:2;3706:9;3697:7;3693:23;3689:32;3686:52;;;3734:1;3731;3724:12;3686:52;3773:9;3760:23;3792:31;3817:5;3792:31;:::i;:::-;3842:5;-1:-1:-1;3899:2:1;3884:18;;3871:32;3912:33;3871:32;3912:33;:::i;4343:437::-;4422:1;4418:12;;;;4465;;;4486:61;;4540:4;4532:6;4528:17;4518:27;;4486:61;4593:2;4585:6;4582:14;4562:18;4559:38;4556:218;;-1:-1:-1;;;4627:1:1;4620:88;4731:4;4728:1;4721:15;4759:4;4756:1;4749:15;4556:218;;4343:437;;;:::o;5551:184::-;-1:-1:-1;;;5600:1:1;5593:88;5700:4;5697:1;5690:15;5724:4;5721:1;5714:15;5740:184;-1:-1:-1;;;5789:1:1;5782:88;5889:4;5886:1;5879:15;5913:4;5910:1;5903:15;5929:128;5996:9;;;6017:11;;;6014:37;;;6031:18;;:::i;6062:184::-;-1:-1:-1;;;6111:1:1;6104:88;6211:4;6208:1;6201:15;6235:4;6232:1;6225:15;6251:135;6290:3;6311:17;;;6308:43;;6331:18;;:::i;:::-;-1:-1:-1;6378:1:1;6367:13;;6251:135::o;7520:251::-;7590:6;7643:2;7631:9;7622:7;7618:23;7614:32;7611:52;;;7659:1;7656;7649:12;7611:52;7691:9;7685:16;7710:31;7735:5;7710:31;:::i;11963:125::-;12028:9;;;12049:10;;;12046:36;;;12062:18;;:::i;12449:168::-;12522:9;;;12553;;12570:15;;;12564:22;;12550:37;12540:71;;12591:18;;:::i;12622:274::-;12662:1;12688;12678:189;;-1:-1:-1;;;12720:1:1;12713:88;12824:4;12821:1;12814:15;12852:4;12849:1;12842:15;12678:189;-1:-1:-1;12881:9:1;;12622:274::o;13492:484::-;13545:3;13583:5;13577:12;13610:6;13605:3;13598:19;13636:4;13665:2;13660:3;13656:12;13649:19;;13702:2;13695:5;13691:14;13723:1;13733:218;13747:6;13744:1;13741:13;13733:218;;;13812:13;;-1:-1:-1;;;;;13808:62:1;13796:75;;13891:12;;;;13926:15;;;;13769:1;13762:9;13733:218;;;-1:-1:-1;13967:3:1;;13492:484;-1:-1:-1;;;;;13492:484:1:o;13981:605::-;14280:6;14269:9;14262:25;14323:6;14318:2;14307:9;14303:18;14296:34;14366:3;14361:2;14350:9;14346:18;14339:31;14243:4;14387:57;14439:3;14428:9;14424:19;14416:6;14387:57;:::i;:::-;-1:-1:-1;;;;;14480:55:1;;;;14475:2;14460:18;;14453:83;-1:-1:-1;14567:3:1;14552:19;14545:35;14379:65;13981:605;-1:-1:-1;;;13981:605:1:o;14591:332::-;14798:6;14787:9;14780:25;14841:2;14836;14825:9;14821:18;14814:30;14761:4;14861:56;14913:2;14902:9;14898:18;14890:6;14861:56;:::i;:::-;14853:64;14591:332;-1:-1:-1;;;;14591:332:1:o

Swarm Source

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