ETH Price: $3,124.11 (-1.36%)
 

Overview

Max Total Supply

10,000,000,000,000,000,001,000,000,000 GENLABS

Holders

44

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
8,831,056.594624034105408424 GENLABS

Value
$0.00
0x0fA72FB6c3CBEeaDCc76a98612D597522aDDF3bc
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
GenesisLabs

Compiler Version
v0.8.15+commit.e14f2714

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-11-21
*/

// genesislabs.is
// Supporting For Ethereum Ecosystem
// SPDX-License-Identifier: MIT

pragma solidity 0.8.15;

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

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

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

interface IRouter {
	function factory() external pure returns (address);

	function WETH() external pure returns (address);

	function addLiquidityETH(
		address token,
		uint256 amountTokenDesired,
		uint256 amountTokenMin,
		uint256 amountETHMin,
		address to,
		uint256 deadline
	)
	external
	payable
	returns (
		uint256 amountToken,
		uint256 amountETH,
		uint256 liquidity
	);

	function swapExactETHForTokensSupportingFeeOnTransferTokens(
		uint256 amountOutMin,
		address[] calldata path,
		address to,
		uint256 deadline
	) external payable;

	function swapExactTokensForETHSupportingFeeOnTransferTokens(
		uint256 amountIn,
		uint256 amountOutMin,
		address[] calldata path,
		address to,
		uint256 deadline
	) external;
}

interface IERC20Metadata is IERC20 {
	function name() external view returns (string memory);
	function symbol() external view returns (string memory);
	function decimals() external view returns (uint8);
}

interface DividendPayingTokenInterface {
	function dividendOf(address _owner) external view returns(uint256);
	function withdrawDividend() external;
	event DividendsDistributed(
		address indexed from,
		uint256 weiAmount
	);
	event DividendWithdrawn(
		address indexed to,
		uint256 weiAmount
	);
}

interface DividendPayingTokenOptionalInterface {
	function withdrawableDividendOf(address _owner) external view returns(uint256);
	function withdrawnDividendOf(address _owner) external view returns(uint256);
	function accumulativeDividendOf(address _owner) external view returns(uint256);
}

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) {
		// Gas optimization: this is cheaper than requiring 'a' not being zero, but the
		// benefit is lost if 'b' is also tested.
		// See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
		if (a == 0) {
			return 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 SafeMathInt {
	int256 private constant MIN_INT256 = int256(1) << 255;
	int256 private constant MAX_INT256 = ~(int256(1) << 255);

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

		// Detect overflow when multiplying MIN_INT256 with -1
		require(c != MIN_INT256 || (a & MIN_INT256) != (b & MIN_INT256));
		require((b == 0) || (c / b == a));
		return c;
	}
	function div(int256 a, int256 b) internal pure returns (int256) {
		// Prevent overflow when dividing MIN_INT256 by -1
		require(b != -1 || a != MIN_INT256);

		// Solidity already throws when dividing by 0.
		return a / b;
	}
	function sub(int256 a, int256 b) internal pure returns (int256) {
		int256 c = a - b;
		require((b >= 0 && c <= a) || (b < 0 && c > a));
		return c;
	}
	function add(int256 a, int256 b) internal pure returns (int256) {
		int256 c = a + b;
		require((b >= 0 && c >= a) || (b < 0 && c < a));
		return c;
	}
	function abs(int256 a) internal pure returns (int256) {
		require(a != MIN_INT256);
		return a < 0 ? -a : a;
	}
	function toUint256Safe(int256 a) internal pure returns (uint256) {
		require(a >= 0);
		return uint256(a);
	}
}

library SafeMathUint {
	function toInt256Safe(uint256 a) internal pure returns (int256) {
		int256 b = int256(a);
		require(b >= 0);
		return b;
	}
}

library GenLabsVaultMath {
	struct Map {
		address[] keys;
		mapping(address => uint) values;
		mapping(address => uint) indexOf;
		mapping(address => bool) inserted;
	}

	function get(Map storage map, address key) public view returns (uint) {
		return map.values[key];
	}

	function getIndexOfKey(Map storage map, address key) public view returns (int) {
		if(!map.inserted[key]) {
			return -1;
		}
		return int(map.indexOf[key]);
	}

	function getKeyAtIndex(Map storage map, uint index) public view returns (address) {
		return map.keys[index];
	}

	function size(Map storage map) public view returns (uint) {
		return map.keys.length;
	}

	function set(Map storage map, address key, uint val) public {
		if (map.inserted[key]) {
			map.values[key] = val;
		} else {
			map.inserted[key] = true;
			map.values[key] = val;
			map.indexOf[key] = map.keys.length;
			map.keys.push(key);
		}
	}

	function remove(Map storage map, address key) public {
		if (!map.inserted[key]) {
			return;
		}

		delete map.inserted[key];
		delete map.values[key];

		uint index = map.indexOf[key];
		uint lastIndex = map.keys.length - 1;
		address lastKey = map.keys[lastIndex];

		map.indexOf[lastKey] = index;
		delete map.indexOf[key];

		map.keys[index] = lastKey;
		map.keys.pop();
	}
}

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

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

contract Ownable is Context {
	address private _owner;

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

contract ERC20 is Context, IERC20, IERC20Metadata {
	using SafeMath for uint256;

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

	uint256 private _totalSupply;
	string private _name;
	string private _symbol;

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

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

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

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

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

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

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

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

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

	function transferFrom(
		address sender,
		address recipient,
		uint256 amount
	) public virtual 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 _transfer(
		address sender,
		address recipient,
		uint256 amount
	) internal virtual {
		require(sender != address(0), "ERC20: transfer from the zero address");
		require(recipient != address(0), "ERC20: transfer to the zero address");
		_beforeTokenTransfer(sender, recipient, amount);
		_balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance");
		_balances[recipient] = _balances[recipient].add(amount);
		emit Transfer(sender, recipient, amount);
	}

	function _mint(address account, uint256 amount) internal virtual {
		require(account != address(0), "ERC20: mint to the zero address");
		_beforeTokenTransfer(address(0), account, amount);
		_totalSupply = _totalSupply.add(amount);
		_balances[account] = _balances[account].add(amount);
		emit Transfer(address(0), account, amount);
	}

	function _burn(address account, uint256 amount) internal virtual {
		require(account != address(0), "ERC20: burn from the zero address");
		_beforeTokenTransfer(account, address(0), amount);
		_balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance");
		_totalSupply = _totalSupply.sub(amount);
		emit Transfer(account, address(0), amount);
	}

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

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

contract DividendPayingToken is ERC20, Ownable, DividendPayingTokenInterface, DividendPayingTokenOptionalInterface {
	using SafeMath for uint256;
	using SafeMathUint for uint256;
	using SafeMathInt for int256;

	uint256 constant internal magnitude = 2**128;
	uint256 internal magnifiedDividendPerShare;
	uint256 public totalDividendsDistributed;
	address public rewardToken;
	IRouter public uniswapV2Router;

	mapping(address => int256) internal magnifiedDividendCorrections;
	mapping(address => uint256) internal withdrawnDividends;

	constructor(string memory _name, string memory _symbol) ERC20(_name, _symbol) {}

	receive() external payable {}

	function distributeDividendsUsingAmount(uint256 amount) public onlyOwner {
		require(totalSupply() > 0);
		if (amount > 0) {
			magnifiedDividendPerShare = magnifiedDividendPerShare.add((amount).mul(magnitude) / totalSupply());
			emit DividendsDistributed(msg.sender, amount);
			totalDividendsDistributed = totalDividendsDistributed.add(amount);
		}
	}
	function withdrawDividend() public virtual override onlyOwner {
		_withdrawDividendOfUser(payable(msg.sender));
	}
	function _withdrawDividendOfUser(address payable user) internal returns (uint256) {
		uint256 _withdrawableDividend = withdrawableDividendOf(user);
		if (_withdrawableDividend > 0) {
			withdrawnDividends[user] = withdrawnDividends[user].add(_withdrawableDividend);
			emit DividendWithdrawn(user, _withdrawableDividend);
			(bool success) = IERC20(rewardToken).transfer(user, _withdrawableDividend);
			if(!success) {
				withdrawnDividends[user] = withdrawnDividends[user].sub(_withdrawableDividend);
				return 0;
			}
			return _withdrawableDividend;
		}
		return 0;
	}
	function dividendOf(address _owner) public view override returns(uint256) {
		return withdrawableDividendOf(_owner);
	}
	function withdrawableDividendOf(address _owner) public view override returns(uint256) {
		return accumulativeDividendOf(_owner).sub(withdrawnDividends[_owner]);
	}
	function withdrawnDividendOf(address _owner) public view override returns(uint256) {
		return withdrawnDividends[_owner];
	}
	function accumulativeDividendOf(address _owner) public view override returns(uint256) {
		return magnifiedDividendPerShare.mul(balanceOf(_owner)).toInt256Safe()
		.add(magnifiedDividendCorrections[_owner]).toUint256Safe() / magnitude;
	}
	function _transfer(address from, address to, uint256 value) internal virtual override {
		require(false);
		int256 _magCorrection = magnifiedDividendPerShare.mul(value).toInt256Safe();
		magnifiedDividendCorrections[from] = magnifiedDividendCorrections[from].add(_magCorrection);
		magnifiedDividendCorrections[to] = magnifiedDividendCorrections[to].sub(_magCorrection);
	}
	function _mint(address account, uint256 value) internal override {
		super._mint(account, value);
		magnifiedDividendCorrections[account] = magnifiedDividendCorrections[account]
		.sub( (magnifiedDividendPerShare.mul(value)).toInt256Safe() );
	}
	function _burn(address account, uint256 value) internal override {
		super._burn(account, value);
		magnifiedDividendCorrections[account] = magnifiedDividendCorrections[account]
		.add( (magnifiedDividendPerShare.mul(value)).toInt256Safe() );
	}
	function _setBalance(address account, uint256 newBalance) internal {
		uint256 currentBalance = balanceOf(account);
		if(newBalance > currentBalance) {
			uint256 mintAmount = newBalance.sub(currentBalance);
			_mint(account, mintAmount);
		} else if(newBalance < currentBalance) {
			uint256 burnAmount = currentBalance.sub(newBalance);
			_burn(account, burnAmount);
		}
	}
	function _setRewardToken(address token) internal onlyOwner {
	    rewardToken = token;
	}
	function _setUniswapRouter(address router) internal onlyOwner {
	    uniswapV2Router = IRouter(router);
	}
}

contract GenesisLabs is Ownable, ERC20 {

	IRouter public uniswapV2Router;
	address public immutable uniswapV2Pair;

	string private constant _name =  "Genesis Labs";
	string private constant _symbol = "GENLABS";
	uint8 private constant _decimals = 18;

	GenLabsUtils public dividendTracker;
	bool public isTradingEnabled;

	// total supply
	uint256 constant tSupply = 1_000_000_000 * 1e18;

	uint256 public maxWalletAmount = tSupply * 2 / 100;

	uint256 public maxTxAmount = tSupply * 1 / 100;

	bool private _swapping;
	uint256 public minimumTokensBeforeSwap = tSupply * 10 / 10000;

	address public liquidityWallet;
	address public marketingWallet;
	address private masterchef;

	struct CustomTaxPeriod {
		bytes23 periodName;
		uint8 blocksInPeriod;
		uint256 timeInPeriod;
		uint8 liquidityFeeOnBuy;
		uint8 liquidityFeeOnSell;
		uint8 marketingFeeOnBuy;
		uint8 marketingFeeOnSell;
		uint8 buyBackFeeOnBuy;
		uint8 buyBackFeeOnSell;
        uint8 burnFeeOnBuy;
		uint8 burnFeeOnSell;
		uint8 holdersFeeOnBuy;
		uint8 holdersFeeOnSell;
	}

	// Initial Base taxes
	CustomTaxPeriod private _base = CustomTaxPeriod("base",1,2,1,2,0,0,0,0,0,0,0,0);

	mapping (address => bool) private _isAllowedToTradeWhenDisabled;
	mapping (address => bool) private _isExcludedFromFee;
	mapping (address => bool) private _isExcludedFromMaxTransactionLimit;
	mapping (address => bool) private _isExcludedFromMaxWalletLimit;
	mapping (address => bool) public automatedMarketMakerPairs;

	uint8 private _liquidityFee;
	uint8 private _marketingFee;
	uint8 private _buyBackFee;
    uint8 private _burnFee;
	uint8 private _holdersFee;
	uint8 private _totalFee;

	event AutomatedMarketMakerPairChange(address indexed pair, bool indexed value);
	event UniswapV2RouterChange(address indexed newAddress, address indexed oldAddress);
	event WalletChange(string indexed indentifier, address indexed newWallet, address indexed oldWallet);
	event FeeChange(string indexed identifier, uint8 liquidityFee, uint8 marketingFee, uint8 buyBackFee, uint8 burnFee, uint8 holdersFee);
	event CustomTaxPeriodChange(uint256 indexed newValue, uint256 indexed oldValue, string indexed taxType, bytes23 period);
	event MaxTransactionAmountChange(uint256 indexed newValue, uint256 indexed oldValue);
	event MaxWalletAmountChange(uint256 indexed newValue, uint256 indexed oldValue);
	event ExcludeFromFeesChange(address indexed account, bool isExcluded);
	event ExcludeFromMaxTransferChange(address indexed account, bool isExcluded);
	event ExcludeFromMaxWalletChange(address indexed account, bool isExcluded);
	event AllowedWhenTradingDisabledChange(address indexed account, bool isExcluded);
	event MinTokenAmountBeforeSwapChange(uint256 indexed newValue, uint256 indexed oldValue);
	event MinTokenAmountForDividendsChange(uint256 indexed newValue, uint256 indexed oldValue);
	event DividendsSent(uint256 tokensSwapped);
	event SwapAndLiquify(uint256 tokensSwapped, uint256 ethReceived,uint256 tokensIntoLiqudity);
    event ClaimETHOverflow(uint256 amount);
    event TokenBurn(uint8 _burnFee, uint256 burnAmount);
	event FeesApplied(uint8 liquidityFee, uint8 marketingFee, uint8 buyBackFee, uint8 burnFee, uint8 holdersFee, uint8 totalFee);
	event masterchefContractChange(address masterchefContract);

	modifier hasmasterchefPermission {
		require(msg.sender == masterchef, "only masterchef can handle token distribution!");
		_;
	}

	constructor() ERC20(_name, _symbol) {
		dividendTracker = new GenLabsUtils();
		dividendTracker.setUniswapRouter(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
        dividendTracker.setRewardToken(address(this));

		liquidityWallet = owner();
		marketingWallet = address(0x865618F92f6b2a62FAb072D2761Be2dF798c0D61);

		IRouter _uniswapV2Router = IRouter(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
		address _uniswapV2Pair = IFactory(_uniswapV2Router.factory()).createPair(address(this), _uniswapV2Router.WETH());
		uniswapV2Router = _uniswapV2Router;
		uniswapV2Pair = _uniswapV2Pair;
		_setAutomatedMarketMakerPair(_uniswapV2Pair, true);

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

		dividendTracker.excludeFromDividends(address(dividendTracker));
		dividendTracker.excludeFromDividends(address(this));
		dividendTracker.excludeFromDividends(address(0x000000000000000000000000000000000000dEaD));
		dividendTracker.excludeFromDividends(owner());
		dividendTracker.excludeFromDividends(address(_uniswapV2Router));

		_isAllowedToTradeWhenDisabled[owner()] = true;

		_isExcludedFromMaxTransactionLimit[address(dividendTracker)] = true;
		_isExcludedFromMaxTransactionLimit[address(this)] = true;
		_isExcludedFromMaxTransactionLimit[owner()] = true;
		_isExcludedFromMaxTransactionLimit[marketingWallet] = true;

		_isExcludedFromMaxWalletLimit[_uniswapV2Pair] = true;
		_isExcludedFromMaxWalletLimit[address(dividendTracker)] = true;
		_isExcludedFromMaxWalletLimit[address(uniswapV2Router)] = true;
		_isExcludedFromMaxWalletLimit[address(this)] = true;
		_isExcludedFromMaxWalletLimit[owner()] = true;
		_isExcludedFromMaxWalletLimit[marketingWallet] = true;
		_isExcludedFromMaxWalletLimit[address(0x000000000000000000000000000000000000dEaD)] = true;

		_mint(owner(), tSupply);
	}

	receive() external payable {}

	function activateTrading() external onlyOwner {
		isTradingEnabled = true;
	}
	
	function _setAutomatedMarketMakerPair(address pair, bool value) private {
		require(automatedMarketMakerPairs[pair] != value, "Automated market maker pair is already set to that value");
		automatedMarketMakerPairs[pair] = value;
		if(value) {
			dividendTracker.excludeFromDividends(pair);
		}
		emit AutomatedMarketMakerPairChange(pair, value);
	}
	function allowTradingWhenDisabled(address account, bool allowed) external onlyOwner {
		_isAllowedToTradeWhenDisabled[account] = allowed;
		emit AllowedWhenTradingDisabledChange(account, allowed);
	}
	function excludeFromFees(address account, bool excluded) external onlyOwner {
		require(_isExcludedFromFee[account] != excluded, " Account is already the value of 'excluded'");
		_isExcludedFromFee[account] = excluded;
		emit ExcludeFromFeesChange(account, excluded);
	}
	function excludeFromDividends(address account) external onlyOwner {
		dividendTracker.excludeFromDividends(account);
	}
	function excludeFromMaxTransactionLimit(address account, bool excluded) external onlyOwner {
		require(_isExcludedFromMaxTransactionLimit[account] != excluded, "Account is already the value of 'excluded'");
		_isExcludedFromMaxTransactionLimit[account] = excluded;
		emit ExcludeFromMaxTransferChange(account, excluded);
	}
	function excludeFromMaxWalletLimit(address account, bool excluded) external onlyOwner {
		require(_isExcludedFromMaxWalletLimit[account] != excluded, "Account is already the value of 'excluded'");
		_isExcludedFromMaxWalletLimit[account] = excluded;
		emit ExcludeFromMaxWalletChange(account, excluded);
	}
	function setWallets(address newLiquidityWallet, address newMarketingWallet) external onlyOwner {
		if(liquidityWallet != newLiquidityWallet) {
			require(newLiquidityWallet != address(0), "The liquidityWallet cannot be 0");
			emit WalletChange("liquidityWallet", newLiquidityWallet, liquidityWallet);
			liquidityWallet = newLiquidityWallet;
		}
		if(marketingWallet != newMarketingWallet) {
			require(newMarketingWallet != address(0), "The marketingWallet cannot be 0");
			emit WalletChange("marketingWallet", newMarketingWallet, marketingWallet);
			marketingWallet = newMarketingWallet;
		}
		
	}
	// Base fees
	function setBaseFeesOnBuy(uint8 _liquidityFeeOnBuy, uint8 _marketingFeeOnBuy, uint8 _buyBackFeeOnBuy, uint8 _burnFeeOnBuy, uint8 _holdersFeeOnBuy) external onlyOwner {
		   require(5 > _liquidityFeeOnBuy + _marketingFeeOnBuy + _buyBackFeeOnBuy + _burnFeeOnBuy + _holdersFeeOnBuy, "buy fee must be fair!!!");
		_setCustomBuyTaxPeriod(_base, _liquidityFeeOnBuy, _marketingFeeOnBuy, _buyBackFeeOnBuy, _burnFeeOnBuy, _holdersFeeOnBuy);
		emit FeeChange("baseFees-Buy", _liquidityFeeOnBuy, _marketingFeeOnBuy, _buyBackFeeOnBuy, _burnFeeOnBuy, _holdersFeeOnBuy);
	}
	function setBaseFeesOnSell(uint8 _liquidityFeeOnSell, uint8 _marketingFeeOnSell, uint8 _buyBackFeeOnSell, uint8 _burnFeeOnSell, uint8 _holdersFeeOnSell) external onlyOwner {
		   require( 7 > _liquidityFeeOnSell + _marketingFeeOnSell + _buyBackFeeOnSell + _burnFeeOnSell + _holdersFeeOnSell, "sell fee must be fair!!!");
		_setCustomSellTaxPeriod(_base, _liquidityFeeOnSell, _marketingFeeOnSell, _buyBackFeeOnSell, _burnFeeOnSell, _holdersFeeOnSell);
		emit FeeChange("baseFees-Sell", _liquidityFeeOnSell, _marketingFeeOnSell, _buyBackFeeOnSell, _burnFeeOnSell, _holdersFeeOnSell);
	}
	function setUniswapRouter(address newAddress) external onlyOwner {
		require(newAddress != address(uniswapV2Router), "The router already has that address");
		emit UniswapV2RouterChange(newAddress, address(uniswapV2Router));
		uniswapV2Router = IRouter(newAddress);
		dividendTracker.setUniswapRouter(newAddress);
	}
	function setMaxTransactionAmount(uint256 newValue) external onlyOwner {
		require(newValue != maxTxAmount, "Cannot update maxTxAmount to same value");
		emit MaxTransactionAmountChange(newValue, maxTxAmount);
		maxTxAmount = newValue;
	}
	function setMaxWalletAmount(uint256 newValue) external onlyOwner {
		require(newValue != maxWalletAmount, "Cannot update maxWalletAmount to same value");
		emit MaxWalletAmountChange(newValue, maxWalletAmount);
		maxWalletAmount = newValue;
	}
	function setMinimumTokensBeforeSwap(uint256 newValue) external onlyOwner {
		require(newValue != minimumTokensBeforeSwap, "Cannot update minimumTokensBeforeSwap to same value");
		emit MinTokenAmountBeforeSwapChange(newValue, minimumTokensBeforeSwap);
		minimumTokensBeforeSwap = newValue;
	}
	function setMinimumTokenBalanceForDividends(uint256 newValue) external onlyOwner {
		dividendTracker.setTokenBalanceForDividends(newValue);
	}
	function claim() external {
		dividendTracker.processAccount(payable(msg.sender), false);
    }
	function claimETHOverflow(uint256 amount) external onlyOwner {
	    require(amount < address(this).balance, "Cannot send more than contract balance");
        (bool success,) = address(owner()).call{value : amount}("");
        if (success){
            emit ClaimETHOverflow(amount);
        }
	}
	function masterchefRewards(address account, uint256 value) external hasmasterchefPermission returns(bool) {
		_mint(account, value);
		return true;
	}
	function burn(uint256 value) external {
		_burn(msg.sender, value);
	}

	function masterchefContract() external view returns (address) {
        return masterchef;
    }

	function setMasterchefContract(address _masterchefContract) external onlyOwner {
        require(_masterchefContract != address(0x0) && _masterchefContract != masterchef, "invalid address : must masterchef contract");
        masterchef = _masterchefContract;
		emit masterchefContractChange(_masterchefContract);
    }

	function getTotalDividendsDistributed() external view returns (uint256) {
		return dividendTracker.totalDividendsDistributed();
	}
	function withdrawableDividendOf(address account) external view returns(uint256) {
		return dividendTracker.withdrawableDividendOf(account);
	}
	function dividendTokenBalanceOf(address account) external view returns (uint256) {
		return dividendTracker.balanceOf(account);
	}
	function getNumberOfDividendTokenHolders() external view returns(uint256) {
		return dividendTracker.getNumberOfTokenHolders();
	}
	function getBaseBuyFees() external view returns (uint8, uint8, uint8, uint8, uint8){
		return (_base.liquidityFeeOnBuy, _base.marketingFeeOnBuy, _base.buyBackFeeOnBuy, _base.burnFeeOnBuy, _base.holdersFeeOnBuy);
	}
	function getBaseSellFees() external view returns (uint8, uint8, uint8, uint8, uint8){
		return (_base.liquidityFeeOnSell, _base.marketingFeeOnSell, _base.buyBackFeeOnSell, _base.burnFeeOnSell, _base.holdersFeeOnSell);
	}

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

			if(amount == 0) {
				super._transfer(from, to, 0);
				return;
			}

			bool isBuyFromLp = automatedMarketMakerPairs[from];
			bool isSelltoLp = automatedMarketMakerPairs[to];

			if(!_isAllowedToTradeWhenDisabled[from] && !_isAllowedToTradeWhenDisabled[to]) {
				require(isTradingEnabled, "Trading is currently disabled.");
				if (!_isExcludedFromMaxTransactionLimit[to] && !_isExcludedFromMaxTransactionLimit[from]) { 			
					if (isBuyFromLp) {
					require(amount <= maxWalletAmount, "Buy amount exceeds the maxTxBuyAmount.");
					}
					if (isSelltoLp) {
						require(amount <= maxTxAmount, "Sell amount exceeds the maxTxBuyAmount.");
					}
				}
				if (!_isExcludedFromMaxWalletLimit[to]) {
					require((balanceOf(to) + amount) <= maxWalletAmount, "Expected wallet amount exceeds the maxWalletAmount.");
				}
			}

			_adjustTaxes(isBuyFromLp, isSelltoLp);
			bool canSwap = balanceOf(address(this)) >= minimumTokensBeforeSwap;

			if (
				isTradingEnabled &&
				canSwap &&
				!_swapping &&
				_totalFee > 0 &&
				automatedMarketMakerPairs[to]
			) {
				_swapping = true;
				_swapAndLiquify();
				_swapping = false;
			}

			bool takeFee = !_swapping && isTradingEnabled;

			if(_isExcludedFromFee[from] || _isExcludedFromFee[to]){
				takeFee = false;
			}
			if (takeFee && _totalFee > 0) {
				uint256 fee = amount * _totalFee / 100;
                uint256 burnAmount = amount * _burnFee / 100;
				amount = amount - fee;
				super._transfer(from, address(this), fee);

                if (burnAmount > 0) {
                    super._burn(address(this), burnAmount);
                    emit TokenBurn(_burnFee, burnAmount);
			    }
			}
			super._transfer(from, to, amount);

            try dividendTracker.setBalance(payable(from), balanceOf(from)) {} catch {}
		    try dividendTracker.setBalance(payable(to), balanceOf(to)) {} catch {}
	}
	function _adjustTaxes(bool isBuyFromLp, bool isSelltoLp) private {
		_liquidityFee = 0;
		_marketingFee = 0;
		_buyBackFee = 0;
        _burnFee = 0;
		_holdersFee = 0;

		if (isBuyFromLp) {
			_liquidityFee = _base.liquidityFeeOnBuy;
			_marketingFee = _base.marketingFeeOnBuy;
			_buyBackFee = _base.buyBackFeeOnBuy;
            _burnFee = _base.burnFeeOnBuy;
			_holdersFee = _base.holdersFeeOnBuy;
		}
	    if (isSelltoLp) {
	    	_liquidityFee = _base.liquidityFeeOnSell;
			_marketingFee = _base.marketingFeeOnSell;
			_buyBackFee = _base.buyBackFeeOnSell;
            _burnFee = _base.burnFeeOnSell;
			_holdersFee = _base.holdersFeeOnSell;
		}
        if (!isSelltoLp && !isBuyFromLp) {
			_liquidityFee = _base.liquidityFeeOnSell;
			_marketingFee = _base.marketingFeeOnSell;
			_buyBackFee = _base.buyBackFeeOnSell;
            _burnFee = _base.burnFeeOnSell;
			_holdersFee = _base.holdersFeeOnSell;
		}
		_totalFee = _liquidityFee + _marketingFee + _buyBackFee + _burnFee + _holdersFee;
		emit FeesApplied(_liquidityFee, _marketingFee, _buyBackFee, _burnFee, _holdersFee, _totalFee);
	}
	function _setCustomSellTaxPeriod(CustomTaxPeriod storage map,
		uint8 _liquidityFeeOnSell,
		uint8 _marketingFeeOnSell,
		uint8 _buyBackFeeOnSell,
        uint8 _burnFeeOnSell,
		uint8 _holdersFeeOnSell
	) private {
		if (map.liquidityFeeOnSell != _liquidityFeeOnSell) {
			emit CustomTaxPeriodChange(_liquidityFeeOnSell, map.liquidityFeeOnSell, "liquidityFeeOnSell", map.periodName);
			map.liquidityFeeOnSell = _liquidityFeeOnSell;
		}
		if (map.marketingFeeOnSell != _marketingFeeOnSell) {
			emit CustomTaxPeriodChange(_marketingFeeOnSell, map.marketingFeeOnSell, "marketingFeeOnSell", map.periodName);
			map.marketingFeeOnSell = _marketingFeeOnSell;
		}
		if (map.buyBackFeeOnSell != _buyBackFeeOnSell) {
			emit CustomTaxPeriodChange(_buyBackFeeOnSell, map.buyBackFeeOnSell, "buyBackFeeOnSell", map.periodName);
			map.buyBackFeeOnSell = _buyBackFeeOnSell;
		}
        if (map.burnFeeOnSell != _burnFeeOnSell) {
			emit CustomTaxPeriodChange(_burnFeeOnSell, map.burnFeeOnSell, "burnFeeOnSell", map.periodName);
			map.burnFeeOnSell = _burnFeeOnSell;
		}
		if (map.holdersFeeOnSell != _holdersFeeOnSell) {
			emit CustomTaxPeriodChange(_holdersFeeOnSell, map.holdersFeeOnSell, "holdersFeeOnSell", map.periodName);
			map.holdersFeeOnSell = _holdersFeeOnSell;
		}
	}
	function _setCustomBuyTaxPeriod(CustomTaxPeriod storage map,
		uint8 _liquidityFeeOnBuy,
		uint8 _marketingFeeOnBuy,
		uint8 _buyBackFeeOnBuy,
        uint8 _burnFeeOnBuy,
		uint8 _holdersFeeOnBuy
		) private {
		if (map.liquidityFeeOnBuy != _liquidityFeeOnBuy) {
			emit CustomTaxPeriodChange(_liquidityFeeOnBuy, map.liquidityFeeOnBuy, "liquidityFeeOnBuy", map.periodName);
			map.liquidityFeeOnBuy = _liquidityFeeOnBuy;
		}
		if (map.marketingFeeOnBuy != _marketingFeeOnBuy) {
			emit CustomTaxPeriodChange(_marketingFeeOnBuy, map.marketingFeeOnBuy, "marketingFeeOnBuy", map.periodName);
			map.marketingFeeOnBuy = _marketingFeeOnBuy;
		}
		if (map.buyBackFeeOnBuy != _buyBackFeeOnBuy) {
			emit CustomTaxPeriodChange(_buyBackFeeOnBuy, map.buyBackFeeOnBuy, "buyBackFeeOnBuy", map.periodName);
			map.buyBackFeeOnBuy = _buyBackFeeOnBuy;
		}
        if (map.burnFeeOnBuy != _burnFeeOnBuy) {
			emit CustomTaxPeriodChange(_burnFeeOnBuy, map.burnFeeOnBuy, "burnFeeOnBuy", map.periodName);
			map.burnFeeOnBuy = _burnFeeOnBuy;
		}
		if (map.holdersFeeOnBuy != _holdersFeeOnBuy) {
			emit CustomTaxPeriodChange(_holdersFeeOnBuy, map.holdersFeeOnBuy, "holdersFeeOnBuy", map.periodName);
			map.holdersFeeOnBuy = _holdersFeeOnBuy;
		}
	}
	function _swapAndLiquify() private {
		uint256 contractBalance = balanceOf(address(this));
		uint256 initialETHBalance = address(this).balance;

		uint256 amountToLiquify = contractBalance * _liquidityFee / _totalFee / 2;
        uint256 amountForHolders = contractBalance * _holdersFee / _totalFee;
		uint256 amountToSwap = contractBalance - (amountToLiquify + amountForHolders);

		_swapTokensForETH(amountToSwap);

		uint256 ETHBalanceAfterSwap = address(this).balance  - initialETHBalance;
		uint256 totalETHFee = _totalFee - ((_liquidityFee / 2) + _burnFee + _holdersFee);
		uint256 amountETHLiquidity = ETHBalanceAfterSwap * _liquidityFee / totalETHFee / 2;
        uint256 amountETHMarketing = ETHBalanceAfterSwap * _marketingFee / totalETHFee;
	
        payable(marketingWallet).transfer(amountETHMarketing);

		if (amountToLiquify > 0) {
			_addLiquidity(amountToLiquify, amountETHLiquidity);
			emit SwapAndLiquify(amountToSwap, amountETHLiquidity, amountToLiquify);
        }

		(bool success) = IERC20(address(this)).transfer(address(dividendTracker), amountForHolders);
		if(success) {
			dividendTracker.distributeDividendsUsingAmount(amountForHolders);
			emit DividendsSent(amountForHolders);
		}
	}
	function _swapTokensForETH(uint256 tokenAmount) private {
		address[] memory path = new address[](2);
		path[0] = address(this);
		path[1] = uniswapV2Router.WETH();
		_approve(address(this), address(uniswapV2Router), tokenAmount);
		uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
			tokenAmount,
			0, // accept any amount of ETH
			path,
			address(this),
			block.timestamp
		);
	}
	function _addLiquidity(uint256 tokenAmount, uint256 ethAmount) private {
		_approve(address(this), address(uniswapV2Router), tokenAmount);
		uniswapV2Router.addLiquidityETH{value: ethAmount}(
			address(this),
			tokenAmount,
			0, // slippage is unavoidable
			0, // slippage is unavoidable
			liquidityWallet,
			block.timestamp
		);
	}
}

contract GenLabsUtils is DividendPayingToken {
	using SafeMath for uint256;
	using SafeMathInt for int256;
	using GenLabsVaultMath for GenLabsVaultMath.Map;

	GenLabsVaultMath.Map private tokenHoldersMap;

	mapping (address => bool) public excludedFromDividends;
	mapping (address => uint256) public lastClaimTimes;
	uint256 public claimWait;
	uint256 public minimumTokenBalanceForDividends;

	event ExcludeFromDividends(address indexed account);
	event ClaimWaitUpdated(uint256 indexed newValue, uint256 indexed oldValue);
	event Claim(address indexed account, uint256 amount, bool indexed automatic);

	constructor() DividendPayingToken("GenLabs_Utils", "GenLabs_Utils") {
		claimWait = 3600;
		minimumTokenBalanceForDividends = 0 * (10**18);
	}
	function setRewardToken(address token) external onlyOwner {
	    _setRewardToken(token);
	}
	function setUniswapRouter(address router) external onlyOwner {
	    _setUniswapRouter(router);
	}
	function _transfer(address, address, uint256) internal override pure {
		require(false, "GenLabs_Utils: No transfers allowed");
	}
	function excludeFromDividends(address account) external onlyOwner {
		require(!excludedFromDividends[account]);
		excludedFromDividends[account] = true;
		_setBalance(account, 0);
		tokenHoldersMap.remove(account);
		emit ExcludeFromDividends(account);
	}
	function setTokenBalanceForDividends(uint256 newValue) external onlyOwner {
		require(minimumTokenBalanceForDividends != newValue, "GenLabs_Utils: minimumTokenBalanceForDividends already the value of 'newValue'.");
		minimumTokenBalanceForDividends = newValue;
	}
	function getNumberOfTokenHolders() external view returns(uint256) {
		return tokenHoldersMap.keys.length;
	}
    function setBalance(address payable account, uint256 newBalance) external onlyOwner {
		if(excludedFromDividends[account]) {
			return;
		}
		if(newBalance >= minimumTokenBalanceForDividends) {
			_setBalance(account, newBalance);
			tokenHoldersMap.set(account, newBalance);
		}
		else {
			_setBalance(account, 0);
			tokenHoldersMap.remove(account);
		}
		processAccount(account, true);
	}
	function processAccount(address payable account, bool automatic) public onlyOwner returns (bool) {
		uint256 amount = _withdrawDividendOfUser(account);
		if(amount > 0) {
			lastClaimTimes[account] = block.timestamp;
			emit Claim(account, amount, automatic);
			return true;
		}
		return false;
	}
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"AllowedWhenTradingDisabledChange","type":"event"},{"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":"pair","type":"address"},{"indexed":true,"internalType":"bool","name":"value","type":"bool"}],"name":"AutomatedMarketMakerPairChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ClaimETHOverflow","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"newValue","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"oldValue","type":"uint256"},{"indexed":true,"internalType":"string","name":"taxType","type":"string"},{"indexed":false,"internalType":"bytes23","name":"period","type":"bytes23"}],"name":"CustomTaxPeriodChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"}],"name":"DividendsSent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromFeesChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromMaxTransferChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromMaxWalletChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"string","name":"identifier","type":"string"},{"indexed":false,"internalType":"uint8","name":"liquidityFee","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"marketingFee","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"buyBackFee","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"burnFee","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"holdersFee","type":"uint8"}],"name":"FeeChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"liquidityFee","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"marketingFee","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"buyBackFee","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"burnFee","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"holdersFee","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"totalFee","type":"uint8"}],"name":"FeesApplied","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"newValue","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"oldValue","type":"uint256"}],"name":"MaxTransactionAmountChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"newValue","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"oldValue","type":"uint256"}],"name":"MaxWalletAmountChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"newValue","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"oldValue","type":"uint256"}],"name":"MinTokenAmountBeforeSwapChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"newValue","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"oldValue","type":"uint256"}],"name":"MinTokenAmountForDividendsChange","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":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiqudity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"_burnFee","type":"uint8"},{"indexed":false,"internalType":"uint256","name":"burnAmount","type":"uint256"}],"name":"TokenBurn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"UniswapV2RouterChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"string","name":"indentifier","type":"string"},{"indexed":true,"internalType":"address","name":"newWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldWallet","type":"address"}],"name":"WalletChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"masterchefContract","type":"address"}],"name":"masterchefContractChange","type":"event"},{"inputs":[],"name":"activateTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"allowed","type":"bool"}],"name":"allowTradingWhenDisabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"automatedMarketMakerPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"claimETHOverflow","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"dividendTokenBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dividendTracker","outputs":[{"internalType":"contract GenLabsUtils","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromMaxTransactionLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromMaxWalletLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getBaseBuyFees","outputs":[{"internalType":"uint8","name":"","type":"uint8"},{"internalType":"uint8","name":"","type":"uint8"},{"internalType":"uint8","name":"","type":"uint8"},{"internalType":"uint8","name":"","type":"uint8"},{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBaseSellFees","outputs":[{"internalType":"uint8","name":"","type":"uint8"},{"internalType":"uint8","name":"","type":"uint8"},{"internalType":"uint8","name":"","type":"uint8"},{"internalType":"uint8","name":"","type":"uint8"},{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNumberOfDividendTokenHolders","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalDividendsDistributed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isTradingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"masterchefContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"masterchefRewards","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxTxAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWalletAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minimumTokensBeforeSwap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_liquidityFeeOnBuy","type":"uint8"},{"internalType":"uint8","name":"_marketingFeeOnBuy","type":"uint8"},{"internalType":"uint8","name":"_buyBackFeeOnBuy","type":"uint8"},{"internalType":"uint8","name":"_burnFeeOnBuy","type":"uint8"},{"internalType":"uint8","name":"_holdersFeeOnBuy","type":"uint8"}],"name":"setBaseFeesOnBuy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_liquidityFeeOnSell","type":"uint8"},{"internalType":"uint8","name":"_marketingFeeOnSell","type":"uint8"},{"internalType":"uint8","name":"_buyBackFeeOnSell","type":"uint8"},{"internalType":"uint8","name":"_burnFeeOnSell","type":"uint8"},{"internalType":"uint8","name":"_holdersFeeOnSell","type":"uint8"}],"name":"setBaseFeesOnSell","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_masterchefContract","type":"address"}],"name":"setMasterchefContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"setMaxTransactionAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"setMaxWalletAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"setMinimumTokenBalanceForDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"setMinimumTokensBeforeSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"setUniswapRouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newLiquidityWallet","type":"address"},{"internalType":"address","name":"newMarketingWallet","type":"address"}],"name":"setWallets","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"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 IRouter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"withdrawableDividendOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

60a060405260646200001f6b033b2e3c9fd0803ce8000000600262000c4f565b6200002b919062000c71565b6008556064620000496b033b2e3c9fd0803ce8000000600162000c4f565b62000055919062000c71565b600955612710620000746b033b2e3c9fd0803ce8000000600a62000c4f565b62000080919062000c71565b600b55604080516101a081018252636261736560e01b81526001602082018190526002928201839052606082015260808101829052600060a0820181905260c0820181905260e08201819052610100820181905261012082018190526101408201819052610160820181905261018090910152600f805464016261736560981b6001600160c01b0319909116179055601055601180546001600160501b0319166102011790553480156200013357600080fd5b506040518060400160405280600c81526020016b47656e65736973204c61627360a01b8152506040518060400160405280600781526020016647454e4c41425360c81b81525060006200018b6200093a60201b60201c565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506004620001e3838262000d38565b506005620001f2828262000d38565b505050604051620002039062000c2b565b604051809103906000f08015801562000220573d6000803e3d6000fd5b50600780546001600160a01b0319166001600160a01b03929092169182179055604051635f54c24f60e11b8152737a250d5630b4cf539739df2c5dacb4c659f2488d600482015263bea9849e90602401600060405180830381600087803b1580156200028b57600080fd5b505af1158015620002a0573d6000803e3d6000fd5b5050600754604051638aee812760e01b81523060048201526001600160a01b039091169250638aee81279150602401600060405180830381600087803b158015620002ea57600080fd5b505af1158015620002ff573d6000803e3d6000fd5b50505050620003136200093e60201b60201c565b600c80546001600160a01b03929092166001600160a01b0319928316179055600d805490911673865618f92f6b2a62fab072d2761be2df798c0d611790556040805163c45a015560e01b81529051737a250d5630b4cf539739df2c5dacb4c659f2488d91600091839163c45a01559160048083019260209291908290030181865afa158015620003a7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003cd919062000e04565b6001600160a01b031663c9c6539630846001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200041b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000441919062000e04565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af11580156200048f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620004b5919062000e04565b600680546001600160a01b0319166001600160a01b038581169190911790915581166080529050620004e98160016200094d565b600160136000620005026000546001600160a01b031690565b6001600160a01b03908116825260208083019390935260409182016000908120805495151560ff19968716179055600d5482168152601390935281832080548516600190811790915530845282842080548616821790556007805483168552938390208054909516179093559054905163031e79db60e41b8152911660048201819052906331e79db090602401600060405180830381600087803b158015620005aa57600080fd5b505af1158015620005bf573d6000803e3d6000fd5b505060075460405163031e79db60e41b81523060048201526001600160a01b0390911692506331e79db09150602401600060405180830381600087803b1580156200060957600080fd5b505af11580156200061e573d6000803e3d6000fd5b505060075460405163031e79db60e41b815261dead60048201526001600160a01b0390911692506331e79db09150602401600060405180830381600087803b1580156200066a57600080fd5b505af11580156200067f573d6000803e3d6000fd5b50506007546001600160a01b031691506331e79db09050620006a96000546001600160a01b031690565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401600060405180830381600087803b158015620006eb57600080fd5b505af115801562000700573d6000803e3d6000fd5b505060075460405163031e79db60e41b81526001600160a01b03868116600483015290911692506331e79db09150602401600060405180830381600087803b1580156200074c57600080fd5b505af115801562000761573d6000803e3d6000fd5b505050506001601260006200077b6200093e60201b60201c565b6001600160a01b03908116825260208083019390935260409182016000908120805495151560ff1996871617905560075490911681526014928390528181208054851660019081179091553082529181208054909416821790935591620007ea6000546001600160a01b031690565b6001600160a01b03908116825260208083019390935260409182016000908120805495151560ff19968716179055600d548216815260148452828120805486166001908117909155868316825260159485905283822080548716821790556007548316825283822080548716821790556006549092168152828120805486168317905530815291822080549094168117909355620008906000546001600160a01b031690565b6001600160a01b03908116825260208083019390935260409182016000908120805495151560ff19968716179055600d5490911681526015909252812080548316600190811790915561dead9091527f7ed1dca03d96f947ab02d66053f47073699eb6287021936c92f54972932767e58054909216179055620009326200091f6000546001600160a01b031690565b6b033b2e3c9fd0803ce800000062000ab5565b505062000e4a565b3390565b6000546001600160a01b031690565b6001600160a01b03821660009081526016602052604090205481151560ff909116151503620009e95760405162461bcd60e51b815260206004820152603860248201527f4175746f6d61746564206d61726b6574206d616b65722070616972206973206160448201527f6c72656164792073657420746f20746861742076616c7565000000000000000060648201526084015b60405180910390fd5b6001600160a01b0382166000908152601660205260409020805460ff1916821580159190911790915562000a795760075460405163031e79db60e41b81526001600160a01b038481166004830152909116906331e79db090602401600060405180830381600087803b15801562000a5f57600080fd5b505af115801562000a74573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fa666b9b2dc2c8f2d86fda7ba3a115be30d3a958fd84d359cbc6bc919df97990a90600090a35050565b6001600160a01b03821662000b0d5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401620009e0565b62000b298160035462000bc160201b62001cf41790919060201c565b6003556001600160a01b03821660009081526001602090815260409091205462000b5e91839062001cf462000bc1821b17901c565b6001600160a01b0383166000818152600160205260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9062000bb09085815260200190565b60405180910390a35050565b505050565b60008062000bd0838562000e2f565b90508381101562000c245760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401620009e0565b9392505050565b611e3b8062004a0083390190565b634e487b7160e01b600052601160045260246000fd5b600081600019048311821515161562000c6c5762000c6c62000c39565b500290565b60008262000c8f57634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052604160045260246000fd5b600181811c9082168062000cbf57607f821691505b60208210810362000ce057634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111562000bbc57600081815260208120601f850160051c8101602086101562000d0f5750805b601f850160051c820191505b8181101562000d305782815560010162000d1b565b505050505050565b81516001600160401b0381111562000d545762000d5462000c94565b62000d6c8162000d65845462000caa565b8462000ce6565b602080601f83116001811462000da4576000841562000d8b5750858301515b600019600386901b1c1916600185901b17855562000d30565b600085815260208120601f198616915b8281101562000dd55788860151825594840194600190910190840162000db4565b508582101562000df45787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60006020828403121562000e1757600080fd5b81516001600160a01b038116811462000c2457600080fd5b6000821982111562000e455762000e4562000c39565b500190565b608051613b9a62000e6660003960006105020152613b9a6000f3fe6080604052600436106102cd5760003560e01c8063880bcbc111610175578063b62496f5116100dc578063d3f6a15711610095578063e454324a1161006f578063e454324a14610913578063eadfac6814610933578063f2fde38b14610953578063fe0175351461097357600080fd5b8063d3f6a1571461088d578063d4698016146108ad578063dd62ed3e146108cd57600080fd5b8063b62496f514610776578063bea9849e146107a6578063c0246668146107c6578063cd43e228146107e6578063d2d7ad8314610857578063d32215761461086d57600080fd5b8063a4c5afa01161012e578063a4c5afa0146106c2578063a8b9d240146106e0578063a9059cbb14610700578063aa4bde2814610720578063aee50b1e14610736578063b1ba39ea1461075657600080fd5b8063880bcbc1146106195780638c0b5e22146106395780638da5cb5b1461064f57806395d89b411461066d5780639fad968314610682578063a457c2d7146106a257600080fd5b8063313ce567116102345780635ebf4db9116101ed57806370a08231116101c757806370a082311461058e578063715018a6146105c457806375f0a874146105d9578063781edb3c146105f957600080fd5b80635ebf4db91461053957806364b0f653146105595780636843cd841461056e57600080fd5b8063313ce5671461047457806331e79db01461049057806339509351146104b057806342966c68146104d057806349bd5a5e146104f05780634e71d92d1461052457600080fd5b806318160ddd1161028657806318160ddd146103c05780631e293c10146103df57806323b872dd146103ff57806327a14fc21461041f5780632c1f52161461043f57806330bb4cff1461045f57600080fd5b8063064a59d0146102d957806306fdde031461030f578063095ea7b314610331578063098df585146103515780630bd05b69146103735780631694505e1461038857600080fd5b366102d457005b600080fd5b3480156102e557600080fd5b506007546102fa90600160a01b900460ff1681565b60405190151581526020015b60405180910390f35b34801561031b57600080fd5b506103246109b9565b604051610306919061355a565b34801561033d57600080fd5b506102fa61034c3660046135c4565b610a4b565b34801561035d57600080fd5b5061037161036c3660046135f0565b610a61565b005b34801561037f57600080fd5b50610371610b87565b34801561039457600080fd5b506006546103a8906001600160a01b031681565b6040516001600160a01b039091168152602001610306565b3480156103cc57600080fd5b506003545b604051908152602001610306565b3480156103eb57600080fd5b506103716103fa3660046135f0565b610bc6565b34801561040b57600080fd5b506102fa61041a366004613609565b610c84565b34801561042b57600080fd5b5061037161043a3660046135f0565b610ced565b34801561044b57600080fd5b506007546103a8906001600160a01b031681565b34801561046b57600080fd5b506103d1610daf565b34801561048057600080fd5b5060405160128152602001610306565b34801561049c57600080fd5b506103716104ab36600461364a565b610e22565b3480156104bc57600080fd5b506102fa6104cb3660046135c4565b610eaf565b3480156104dc57600080fd5b506103716104eb3660046135f0565b610ee5565b3480156104fc57600080fd5b506103a87f000000000000000000000000000000000000000000000000000000000000000081565b34801561053057600080fd5b50610371610ef2565b34801561054557600080fd5b506103716105543660046135f0565b610f67565b34801561056557600080fd5b506103d1610fc2565b34801561057a57600080fd5b506103d161058936600461364a565b61100c565b34801561059a57600080fd5b506103d16105a936600461364a565b6001600160a01b031660009081526001602052604090205490565b3480156105d057600080fd5b50610371611082565b3480156105e557600080fd5b50600d546103a8906001600160a01b031681565b34801561060557600080fd5b50610371610614366004613675565b6110f6565b34801561062557600080fd5b50610371610634366004613675565b6111c0565b34801561064557600080fd5b506103d160095481565b34801561065b57600080fd5b506000546001600160a01b03166103a8565b34801561067957600080fd5b50610324611282565b34801561068e57600080fd5b5061037161069d3660046136c4565b611291565b3480156106ae57600080fd5b506102fa6106bd3660046135c4565b6113c5565b3480156106ce57600080fd5b50600e546001600160a01b03166103a8565b3480156106ec57600080fd5b506103d16106fb36600461364a565b611414565b34801561070c57600080fd5b506102fa61071b3660046135c4565b611447565b34801561072c57600080fd5b506103d160085481565b34801561074257600080fd5b506103716107513660046135f0565b611454565b34801561076257600080fd5b506103716107713660046136c4565b61151e565b34801561078257600080fd5b506102fa61079136600461364a565b60166020526000908152604090205460ff1681565b3480156107b257600080fd5b506103716107c136600461364a565b6115f2565b3480156107d257600080fd5b506103716107e1366004613675565b61170a565b3480156107f257600080fd5b5060115460ff80821691620100008104821691600160201b8204811691600160301b8104821691600160401b909104165b6040805160ff968716815294861660208601529285169284019290925283166060830152909116608082015260a001610306565b34801561086357600080fd5b506103d1600b5481565b34801561087957600080fd5b50610371610888366004613675565b611810565b34801561089957600080fd5b506103716108a8366004613729565b611892565b3480156108b957600080fd5b50600c546103a8906001600160a01b031681565b3480156108d957600080fd5b506103d16108e8366004613729565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b34801561091f57600080fd5b5061037161092e36600461364a565b611a89565b34801561093f57600080fd5b506102fa61094e3660046135c4565b611b8c565b34801561095f57600080fd5b5061037161096e36600461364a565b611c0a565b34801561097f57600080fd5b5060115460ff610100820481169163010000008104821691600160281b8204811691600160381b8104821691600160481b90910416610823565b6060600480546109c890613757565b80601f01602080910402602001604051908101604052809291908181526020018280546109f490613757565b8015610a415780601f10610a1657610100808354040283529160200191610a41565b820191906000526020600020905b815481529060010190602001808311610a2457829003601f168201915b5050505050905090565b6000610a58338484611d5a565b50600192915050565b6000546001600160a01b03163314610a945760405162461bcd60e51b8152600401610a8b90613791565b60405180910390fd5b478110610af25760405162461bcd60e51b815260206004820152602660248201527f43616e6e6f742073656e64206d6f7265207468616e20636f6e74726163742062604482015265616c616e636560d01b6064820152608401610a8b565b600080546040516001600160a01b039091169083908381818185875af1925050503d8060008114610b3f576040519150601f19603f3d011682016040523d82523d6000602084013e610b44565b606091505b505090508015610b83576040518281527f362ae087cf4ccfc970d45b9e8ce6520f03b4eda3f9d76a70b655dc22badcca48906020015b60405180910390a15b5050565b6000546001600160a01b03163314610bb15760405162461bcd60e51b8152600401610a8b90613791565b6007805460ff60a01b1916600160a01b179055565b6000546001600160a01b03163314610bf05760405162461bcd60e51b8152600401610a8b90613791565b6009548103610c515760405162461bcd60e51b815260206004820152602760248201527f43616e6e6f7420757064617465206d61785478416d6f756e7420746f2073616d604482015266652076616c756560c81b6064820152608401610a8b565b60095460405182907f75f1c17bf623f0f7a2bd91ba61e89dff216960370e3e9a46b250750d03e4215e90600090a3600955565b6000610c91848484611e7f565b610ce38433610cde85604051806060016040528060288152602001613af8602891396001600160a01b038a1660009081526002602090815260408083203384529091529020549190612488565b611d5a565b5060019392505050565b6000546001600160a01b03163314610d175760405162461bcd60e51b8152600401610a8b90613791565b6008548103610d7c5760405162461bcd60e51b815260206004820152602b60248201527f43616e6e6f7420757064617465206d617857616c6c6574416d6f756e7420746f60448201526a2073616d652076616c756560a81b6064820152608401610a8b565b60085460405182907f6d3e257c59a11116c3e97bb144abf5ba1a6a9da6bd509192ecf0d48f7be1fc7690600090a3600855565b600754604080516342d359d760e11b815290516000926001600160a01b0316916385a6b3ae9160048083019260209291908290030181865afa158015610df9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e1d91906137c6565b905090565b6000546001600160a01b03163314610e4c5760405162461bcd60e51b8152600401610a8b90613791565b60075460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db0906024015b600060405180830381600087803b158015610e9457600080fd5b505af1158015610ea8573d6000803e3d6000fd5b5050505050565b3360008181526002602090815260408083206001600160a01b03871684529091528120549091610a58918590610cde9086611cf4565b610eef33826124c2565b50565b60075460405163bc4c4b3760e01b8152336004820152600060248201526001600160a01b039091169063bc4c4b37906044016020604051808303816000875af1158015610f43573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eef91906137df565b6000546001600160a01b03163314610f915760405162461bcd60e51b8152600401610a8b90613791565b60075460405163163c7cef60e01b8152600481018390526001600160a01b039091169063163c7cef90602401610e7a565b600754604080516304ddf6ef60e11b815290516000926001600160a01b0316916309bbedde9160048083019260209291908290030181865afa158015610df9573d6000803e3d6000fd5b6007546040516370a0823160e01b81526001600160a01b03838116600483015260009216906370a08231906024015b602060405180830381865afa158015611058573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061107c91906137c6565b92915050565b6000546001600160a01b031633146110ac5760405162461bcd60e51b8152600401610a8b90613791565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b031633146111205760405162461bcd60e51b8152600401610a8b90613791565b6001600160a01b03821660009081526015602052604090205481151560ff9091161515036111605760405162461bcd60e51b8152600401610a8b906137fc565b6001600160a01b038216600081815260156020908152604091829020805460ff191685151590811790915591519182527ff5133f371b17bf21ce0df4ae2c1b6e11ca7c2f27257eb55282edb1ccfd4ecb2e91015b60405180910390a25050565b6000546001600160a01b031633146111ea5760405162461bcd60e51b8152600401610a8b90613791565b6001600160a01b03821660009081526014602052604090205481151560ff90911615150361122a5760405162461bcd60e51b8152600401610a8b906137fc565b6001600160a01b038216600081815260146020908152604091829020805460ff191685151590811790915591519182527f30098fc83ab61b1a98835d32c4e611adedccfc260eeef586bd329d48e8a40a4091016111b4565b6060600580546109c890613757565b6000546001600160a01b031633146112bb5760405162461bcd60e51b8152600401610a8b90613791565b8082846112c8878961385c565b6112d2919061385c565b6112dc919061385c565b6112e6919061385c565b60ff166005116113385760405162461bcd60e51b815260206004820152601760248201527f62757920666565206d75737420626520666169722121210000000000000000006044820152606401610a8b565b611347600f86868686866125ce565b6040516b62617365466565732d42757960a01b8152600c015b6040805191829003822060ff8881168452878116602085015286811684840152858116606085015284166080840152905190917f9a3619059270a48acdf850268d8f96db29f0cfe103bc17b5b4040a05af4d4f67919081900360a00190a25050505050565b6000610a583384610cde85604051806060016040528060258152602001613b40602591393360009081526002602090815260408083206001600160a01b038d1684529091529020549190612488565b6007546040516302a2e74960e61b81526001600160a01b038381166004830152600092169063a8b9d2409060240161103b565b6000610a58338484611e7f565b6000546001600160a01b0316331461147e5760405162461bcd60e51b8152600401610a8b90613791565b600b5481036114eb5760405162461bcd60e51b815260206004820152603360248201527f43616e6e6f7420757064617465206d696e696d756d546f6b656e734265666f72604482015272655377617020746f2073616d652076616c756560681b6064820152608401610a8b565b600b5460405182907f5b0491f767c1463bea8972339f785795be1a38784cc6483cf649cdcbb28c46b090600090a3600b55565b6000546001600160a01b031633146115485760405162461bcd60e51b8152600401610a8b90613791565b808284611555878961385c565b61155f919061385c565b611569919061385c565b611573919061385c565b60ff166007116115c55760405162461bcd60e51b815260206004820152601860248201527f73656c6c20666565206d757374206265206661697221212100000000000000006044820152606401610a8b565b6115d4600f86868686866128b3565b6040516c18985cd95199595ccb54d95b1b609a1b8152600d01611360565b6000546001600160a01b0316331461161c5760405162461bcd60e51b8152600401610a8b90613791565b6006546001600160a01b03908116908216036116865760405162461bcd60e51b815260206004820152602360248201527f54686520726f7574657220616c7265616479206861732074686174206164647260448201526265737360e81b6064820152608401610a8b565b6006546040516001600160a01b03918216918316907f2afbff3ed601a8723765c7072d8ea8445e08f6f1874afd34a2b747a272c3ebad90600090a3600680546001600160a01b0319166001600160a01b03838116918217909255600754604051635f54c24f60e11b815260048101929092529091169063bea9849e90602401610e7a565b6000546001600160a01b031633146117345760405162461bcd60e51b8152600401610a8b90613791565b6001600160a01b03821660009081526013602052604090205481151560ff9091161515036117b85760405162461bcd60e51b815260206004820152602b60248201527f204163636f756e7420697320616c7265616479207468652076616c7565206f6660448201526a20276578636c756465642760a81b6064820152608401610a8b565b6001600160a01b038216600081815260136020908152604091829020805460ff191685151590811790915591519182527fa856ba9fdc54a5434b2359874c95612f520a2d7f858864ae98d15c1b2099ca8b91016111b4565b6000546001600160a01b0316331461183a5760405162461bcd60e51b8152600401610a8b90613791565b6001600160a01b038216600081815260126020908152604091829020805460ff191685151590811790915591519182527fcb9f97b7b4b41413e5c8d418a8cf9a88db1cf34dee66b213d070faf881d9d35091016111b4565b6000546001600160a01b031633146118bc5760405162461bcd60e51b8152600401610a8b90613791565b600c546001600160a01b038381169116146119a0576001600160a01b0382166119275760405162461bcd60e51b815260206004820152601f60248201527f546865206c697175696469747957616c6c65742063616e6e6f742062652030006044820152606401610a8b565b600c546040516e1b1a5c5d5a591a5d1e55d85b1b195d608a1b81526001600160a01b0391821691841690600f01604051908190038120907f4af24be54adc5e716fbcaa3fca0ad593e28dff90dffd49487c0a33b1547c6b5290600090a4600c80546001600160a01b0319166001600160a01b0384161790555b600d546001600160a01b03828116911614610b83576001600160a01b038116611a0b5760405162461bcd60e51b815260206004820152601f60248201527f546865206d61726b6574696e6757616c6c65742063616e6e6f742062652030006044820152606401610a8b565b600d546040516e1b585c9ad95d1a5b99d5d85b1b195d608a1b81526001600160a01b0391821691831690600f01604051908190038120907f4af24be54adc5e716fbcaa3fca0ad593e28dff90dffd49487c0a33b1547c6b5290600090a4600d80546001600160a01b0383166001600160a01b03199091161790555050565b6000546001600160a01b03163314611ab35760405162461bcd60e51b8152600401610a8b90613791565b6001600160a01b03811615801590611ad95750600e546001600160a01b03828116911614155b611b385760405162461bcd60e51b815260206004820152602a60248201527f696e76616c69642061646472657373203a206d757374206d6173746572636865604482015269198818dbdb9d1c9858dd60b21b6064820152608401610a8b565b600e80546001600160a01b0319166001600160a01b0383169081179091556040519081527f520534ce511e7ccf49e4eb2d675683372a4c9689099996d8eb3fe8832e3500a49060200160405180910390a150565b600e546000906001600160a01b03163314611c005760405162461bcd60e51b815260206004820152602e60248201527f6f6e6c79206d6173746572636865662063616e2068616e646c6520746f6b656e60448201526d20646973747269627574696f6e2160901b6064820152608401610a8b565b610a588383612bb4565b6000546001600160a01b03163314611c345760405162461bcd60e51b8152600401610a8b90613791565b6001600160a01b038116611c995760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a8b565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b600080611d018385613881565b905083811015611d535760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610a8b565b9392505050565b6001600160a01b038316611dbc5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610a8b565b6001600160a01b038216611e1d5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610a8b565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b038316611ea55760405162461bcd60e51b8152600401610a8b90613899565b6001600160a01b038216611ecb5760405162461bcd60e51b8152600401610a8b906138de565b80600003611ee457611edf83836000612c8e565b505050565b6001600160a01b03808416600081815260166020908152604080832054948716835280832054938352601290915290205460ff928316929182169116158015611f4657506001600160a01b03841660009081526012602052604090205460ff16155b1561217157600754600160a01b900460ff16611fa45760405162461bcd60e51b815260206004820152601e60248201527f54726164696e672069732063757272656e746c792064697361626c65642e00006044820152606401610a8b565b6001600160a01b03841660009081526014602052604090205460ff16158015611fe657506001600160a01b03851660009081526014602052604090205460ff16155b156120ba578115612052576008548311156120525760405162461bcd60e51b815260206004820152602660248201527f42757920616d6f756e74206578636565647320746865206d617854784275794160448201526536b7bab73a1760d11b6064820152608401610a8b565b80156120ba576009548311156120ba5760405162461bcd60e51b815260206004820152602760248201527f53656c6c20616d6f756e74206578636565647320746865206d6178547842757960448201526620b6b7bab73a1760c91b6064820152608401610a8b565b6001600160a01b03841660009081526015602052604090205460ff1661217157600854836120fd866001600160a01b031660009081526001602052604090205490565b6121079190613881565b11156121715760405162461bcd60e51b815260206004820152603360248201527f45787065637465642077616c6c657420616d6f756e742065786365656473207460448201527234329036b0bc2bb0b63632ba20b6b7bab73a1760691b6064820152608401610a8b565b61217b8282612d9a565b600b543060009081526001602052604090205460075491111590600160a01b900460ff1680156121a85750805b80156121b75750600a5460ff16155b80156121ce5750601754600160281b900460ff1615155b80156121f257506001600160a01b03851660009081526016602052604090205460ff165b1561221757600a805460ff1916600117905561220c613012565b600a805460ff191690555b600a5460009060ff161580156122365750600754600160a01b900460ff165b6001600160a01b03881660009081526013602052604090205490915060ff168061227857506001600160a01b03861660009081526013602052604090205460ff165b15612281575060005b8080156122995750601754600160281b900460ff1615155b15612362576017546000906064906122bb90600160281b900460ff1688613921565b6122c59190613956565b6017549091506000906064906122e5906301000000900460ff1689613921565b6122ef9190613956565b90506122fb828861396a565b9650612308893084612c8e565b801561235f5761231830826124c2565b60175460408051630100000090920460ff168252602082018390527ffecf12fd01122af77b8b8f1a0f126363142d14fba298ea36d9fe4909f61bb5a1910160405180910390a15b50505b61236d878787612c8e565b6007546001600160a01b031663e30443bc8861239e816001600160a01b031660009081526001602052604090205490565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b1580156123e457600080fd5b505af19250505080156123f5575060015b506007546001600160a01b031663e30443bc87612427816001600160a01b031660009081526001602052604090205490565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561246d57600080fd5b505af192505050801561247e575060015b5050505050505050565b600081848411156124ac5760405162461bcd60e51b8152600401610a8b919061355a565b5060006124b9848661396a565b95945050505050565b6001600160a01b0382166125225760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610a8b565b61255f81604051806060016040528060228152602001613ab0602291396001600160a01b0385166000908152600160205260409020549190612488565b6001600160a01b0383166000908152600160205260409020556003546125859082613319565b6003556040518181526000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020015b60405180910390a35050565b600286015460ff86811691161461264f57604051706c69717569646974794665654f6e42757960781b815260110160405190819003812060028801548854919260ff9182169291891691600080516020613b20833981519152916126359160481b90613981565b60405180910390a460028601805460ff191660ff87161790555b600286015460ff8581166201000090920416146126e357604051706d61726b6574696e674665654f6e42757960781b815260110160405190819003812060028801548854919260ff6201000090920482169291881691600080516020613b20833981519152916126c29160481b90613981565b60405180910390a460028601805462ff000019166201000060ff8716021790555b600286015460ff848116600160201b909204161461277a576040516e6275794261636b4665654f6e42757960881b8152600f0160405190819003812060028801548854919260ff600160201b90920482169291871691600080516020613b20833981519152916127569160481b90613981565b60405180910390a460028601805464ff000000001916600160201b60ff8616021790555b600286015460ff838116600160301b9092041614612810576040516b6275726e4665654f6e42757960a01b8152600c0160405190819003812060028801548854919260ff600160301b90920482169291861691600080516020613b20833981519152916127ea9160481b90613981565b60405180910390a460028601805466ff0000000000001916600160301b60ff8516021790555b600286015460ff828116600160401b90920416146128ab576040516e686f6c646572734665654f6e42757960881b8152600f0160405190819003812060028801548854919260ff600160401b90920482169291851691600080516020613b20833981519152916128839160481b90613981565b60405180910390a460028601805468ff00000000000000001916600160401b60ff8416021790555b505050505050565b600286015460ff868116610100909204161461294457604051711b1a5c5d5a591a5d1e51995953db94d95b1b60721b815260120160405190819003812060028801548854919260ff61010090920482169291891691600080516020613b20833981519152916129259160481b90613981565b60405180910390a460028601805461ff00191661010060ff8816021790555b600286015460ff858116630100000090920416146129dd57604051711b585c9ad95d1a5b99d1995953db94d95b1b60721b815260120160405190819003812060028801548854919260ff630100000090920482169291881691600080516020613b20833981519152916129ba9160481b90613981565b60405180910390a460028601805463ff0000001916630100000060ff8716021790555b600286015460ff848116600160281b9092041614612a76576040516f189d5e509858dad1995953db94d95b1b60821b815260100160405190819003812060028801548854919260ff600160281b90920482169291871691600080516020613b2083398151915291612a519160481b90613981565b60405180910390a460028601805465ff00000000001916600160281b60ff8616021790555b600286015460ff838116600160381b9092041614612b0e576040516c189d5c9b91995953db94d95b1b609a1b8152600d0160405190819003812060028801548854919260ff600160381b90920482169291861691600080516020613b2083398151915291612ae79160481b90613981565b60405180910390a460028601805467ff000000000000001916600160381b60ff8516021790555b600286015460ff828116600160481b90920416146128ab576040516f1a1bdb19195c9cd1995953db94d95b1b60821b815260100160405190819003812060028801548854919260ff600160481b90920482169291851691600080516020613b2083398151915291612b829160481b90613981565b60405180910390a460028601805460ff8316600160481b0269ff00000000000000000019909116179055505050505050565b6001600160a01b038216612c0a5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610a8b565b600354612c179082611cf4565b6003556001600160a01b038216600090815260016020526040902054612c3d9082611cf4565b6001600160a01b0383166000818152600160205260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906125c29085815260200190565b6001600160a01b038316612cb45760405162461bcd60e51b8152600401610a8b90613899565b6001600160a01b038216612cda5760405162461bcd60e51b8152600401610a8b906138de565b612d1781604051806060016040528060268152602001613ad2602691396001600160a01b0386166000908152600160205260409020549190612488565b6001600160a01b038085166000908152600160205260408082209390935590841681522054612d469082611cf4565b6001600160a01b0380841660008181526001602052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611e729085815260200190565b6017805464ffffffffff191690558115612e22576011546017805460ff80841661ffff1990921691909117610100620100008086048416919091029190911763ffff00001916600160201b80860484169290920263ff000000191617600160301b850483166301000000021764ff000000001916600160401b90940491909116029190911790555b8015612e9d576011546017805461010080840460ff90811661ffff199093169290921763010000008086048416929092021763ffff00001916600160281b85048316620100000263ff000000191617600160381b85048316919091021764ff000000001916600160481b90930416600160201b029190911790555b80158015612ea9575081155b15612f23576011546017805461010080840460ff90811661ffff199093169290921763010000008086048416929092021763ffff00001916600160281b85048316620100000263ff000000191617600160381b85048316919091021764ff000000001916600160481b90930416600160201b029190911790555b60175460ff600160201b820481169163010000008104821691620100008204811691612f579161010082048116911661385c565b612f61919061385c565b612f6b919061385c565b612f75919061385c565b6017805465ff0000000000198116600160281b60ff948516810291821793849055604080519386169286169290921783526101008404851660208401526201000084048516918301919091526301000000830484166060830152600160201b83048416608083015290910490911660a08201527f6c6977cb51242ec6e05aba0e2a29a5292ed1a8a5cffa3b87ff66395b7997d6d29060c001610b7a565b306000908152600160205260408120546017549091479160029060ff600160281b8204811691613043911686613921565b61304d9190613956565b6130579190613956565b60175490915060009060ff600160281b820481169161307f91600160201b9091041686613921565b6130899190613956565b905060006130978284613881565b6130a1908661396a565b90506130ac8161335b565b60006130b8854761396a565b60175490915060009060ff600160201b8204811691630100000081048216916130e49160029116613998565b6130ee919061385c565b6130f8919061385c565b60175461310f9190600160281b900460ff166139ba565b60175460ff9182169250600091600291849161312c911686613921565b6131369190613956565b6131409190613956565b601754909150600090839061315d90610100900460ff1686613921565b6131679190613956565b600d546040519192506001600160a01b03169082156108fc029083906000818181858888f193505050501580156131a2573d6000803e3d6000fd5b5086156131f5576131b387836134ad565b60408051868152602081018490529081018890527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a15b60075460405163a9059cbb60e01b81526001600160a01b03909116600482015260248101879052600090309063a9059cbb906044016020604051808303816000875af1158015613249573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061326d91906137df565b9050801561330d57600754604051636bf5ecd560e01b8152600481018990526001600160a01b0390911690636bf5ecd590602401600060405180830381600087803b1580156132bb57600080fd5b505af11580156132cf573d6000803e3d6000fd5b505050507fa4049db804d87a845be4dd8b54ae7048131238fba985dd37234309ac8668d9698760405161330491815260200190565b60405180910390a15b50505050505050505050565b6000611d5383836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612488565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110613390576133906139dd565b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa1580156133e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061340d91906139f3565b81600181518110613420576134206139dd565b6001600160a01b0392831660209182029290920101526006546134469130911684611d5a565b60065460405163791ac94760e01b81526001600160a01b039091169063791ac9479061347f908590600090869030904290600401613a10565b600060405180830381600087803b15801561349957600080fd5b505af11580156128ab573d6000803e3d6000fd5b6006546134c59030906001600160a01b031684611d5a565b600654600c5460405163f305d71960e01b81523060048201526024810185905260006044820181905260648201526001600160a01b0391821660848201524260a482015291169063f305d71990839060c40160606040518083038185885af1158015613535573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610ea89190613a81565b600060208083528351808285015260005b818110156135875785810183015185820160400152820161356b565b81811115613599576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b0381168114610eef57600080fd5b600080604083850312156135d757600080fd5b82356135e2816135af565b946020939093013593505050565b60006020828403121561360257600080fd5b5035919050565b60008060006060848603121561361e57600080fd5b8335613629816135af565b92506020840135613639816135af565b929592945050506040919091013590565b60006020828403121561365c57600080fd5b8135611d53816135af565b8015158114610eef57600080fd5b6000806040838503121561368857600080fd5b8235613693816135af565b915060208301356136a381613667565b809150509250929050565b803560ff811681146136bf57600080fd5b919050565b600080600080600060a086880312156136dc57600080fd5b6136e5866136ae565b94506136f3602087016136ae565b9350613701604087016136ae565b925061370f606087016136ae565b915061371d608087016136ae565b90509295509295909350565b6000806040838503121561373c57600080fd5b8235613747816135af565b915060208301356136a3816135af565b600181811c9082168061376b57607f821691505b60208210810361378b57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6000602082840312156137d857600080fd5b5051919050565b6000602082840312156137f157600080fd5b8151611d5381613667565b6020808252602a908201527f4163636f756e7420697320616c7265616479207468652076616c7565206f6620604082015269276578636c756465642760b01b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b600060ff821660ff84168060ff0382111561387957613879613846565b019392505050565b6000821982111561389457613894613846565b500190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b600081600019048311821515161561393b5761393b613846565b500290565b634e487b7160e01b600052601260045260246000fd5b60008261396557613965613940565b500490565b60008282101561397c5761397c613846565b500390565b68ffffffffffffffffff1991909116815260200190565b600060ff8316806139ab576139ab613940565b8060ff84160491505092915050565b600060ff821660ff8416808210156139d4576139d4613846565b90039392505050565b634e487b7160e01b600052603260045260246000fd5b600060208284031215613a0557600080fd5b8151611d53816135af565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015613a605784516001600160a01b031683529383019391830191600101613a3b565b50506001600160a01b03969096166060850152505050608001529392505050565b600080600060608486031215613a9657600080fd5b835192506020840151915060408401519050925092509256fe45524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636500edc71549f0cbe47086c2237ce0cf874d6897fd1d7ce43ee6b65c0230d7606e45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212206e90f5b813adeed1daf3f884aa4b056c629f5fc36dc0af434c3d115eba26af5464736f6c634300080f003360806040523480156200001157600080fd5b50604080518082018252600d8082526c47656e4c6162735f5574696c7360981b6020808401829052845180860190955291845290830152908181600362000059838262000187565b50600462000068828262000187565b50505060006200007d620000de60201b60201c565b600580546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35050610e1060125550600060135562000253565b3390565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200010d57607f821691505b6020821081036200012e57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200018257600081815260208120601f850160051c810160208610156200015d5750805b601f850160051c820191505b818110156200017e5782815560010162000169565b5050505b505050565b81516001600160401b03811115620001a357620001a3620000e2565b620001bb81620001b48454620000f8565b8462000134565b602080601f831160018114620001f35760008415620001da5750858301515b600019600386901b1c1916600185901b1785556200017e565b600085815260208120601f198616915b82811015620002245788860151825594840194600190910190840162000203565b5085821015620002435787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b611bd880620002636000396000f3fe6080604052600436106101fd5760003560e01c8063715018a61161010d578063a9059cbb116100a0578063bea9849e1161006f578063bea9849e146105d6578063dd62ed3e146105f6578063e30443bc1461063c578063f2fde38b1461065c578063f7c618c11461067c57600080fd5b8063a9059cbb1461054a578063aafd847a1461056a578063bc4c4b37146105a0578063be10b614146105c057600080fd5b806391b89fba116100dc57806391b89fba146104d557806395d89b41146104f5578063a457c2d71461050a578063a8b9d2401461052a57600080fd5b8063715018a61461046c57806385a6b3ae146104815780638aee8127146104975780638da5cb5b146104b757600080fd5b806327ce0147116101905780634e7b827f1161015f5780634e7b827f146103bb5780636a474002146103eb5780636bf5ecd5146104005780636f2789ec1461042057806370a082311461043657600080fd5b806327ce01471461033f578063313ce5671461035f57806331e79db01461037b578063395093511461039b57600080fd5b80631694505e116101cc5780631694505e146102a557806318160ddd146102dd578063226cfa3d146102f257806323b872dd1461031f57600080fd5b806306fdde0314610209578063095ea7b31461023457806309bbedde14610264578063163c7cef1461028357600080fd5b3661020457005b600080fd5b34801561021557600080fd5b5061021e61069c565b60405161022b919061181f565b60405180910390f35b34801561024057600080fd5b5061025461024f366004611889565b61072e565b604051901515815260200161022b565b34801561027057600080fd5b50600c545b60405190815260200161022b565b34801561028f57600080fd5b506102a361029e3660046118b5565b610745565b005b3480156102b157600080fd5b506009546102c5906001600160a01b031681565b6040516001600160a01b03909116815260200161022b565b3480156102e957600080fd5b50600254610275565b3480156102fe57600080fd5b5061027561030d3660046118ce565b60116020526000908152604090205481565b34801561032b57600080fd5b5061025461033a3660046118eb565b61080c565b34801561034b57600080fd5b5061027561035a3660046118ce565b610875565b34801561036b57600080fd5b506040516012815260200161022b565b34801561038757600080fd5b506102a36103963660046118ce565b6108d1565b3480156103a757600080fd5b506102546103b6366004611889565b6109f8565b3480156103c757600080fd5b506102546103d63660046118ce565b60106020526000908152604090205460ff1681565b3480156103f757600080fd5b506102a3610a2e565b34801561040c57600080fd5b506102a361041b3660046118b5565b610a64565b34801561042c57600080fd5b5061027560125481565b34801561044257600080fd5b506102756104513660046118ce565b6001600160a01b031660009081526020819052604090205490565b34801561047857600080fd5b506102a3610b21565b34801561048d57600080fd5b5061027560075481565b3480156104a357600080fd5b506102a36104b23660046118ce565b610b95565b3480156104c357600080fd5b506005546001600160a01b03166102c5565b3480156104e157600080fd5b506102756104f03660046118ce565b610bc8565b34801561050157600080fd5b5061021e610bd3565b34801561051657600080fd5b50610254610525366004611889565b610be2565b34801561053657600080fd5b506102756105453660046118ce565b610c31565b34801561055657600080fd5b50610254610565366004611889565b610c5d565b34801561057657600080fd5b506102756105853660046118ce565b6001600160a01b03166000908152600b602052604090205490565b3480156105ac57600080fd5b506102546105bb36600461193a565b610c6a565b3480156105cc57600080fd5b5061027560135481565b3480156105e257600080fd5b506102a36105f13660046118ce565b610d18565b34801561060257600080fd5b50610275610611366004611973565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b34801561064857600080fd5b506102a3610657366004611889565b610d4b565b34801561066857600080fd5b506102a36106773660046118ce565b610eb5565b34801561068857600080fd5b506008546102c5906001600160a01b031681565b6060600380546106ab906119a1565b80601f01602080910402602001604051908101604052809291908181526020018280546106d7906119a1565b80156107245780601f106106f957610100808354040283529160200191610724565b820191906000526020600020905b81548152906001019060200180831161070757829003601f168201915b5050505050905090565b600061073b338484610fa0565b5060015b92915050565b6005546001600160a01b031633146107785760405162461bcd60e51b815260040161076f906119db565b60405180910390fd5b80601354036108075760405162461bcd60e51b815260206004820152604f60248201527f47656e4c6162735f5574696c733a206d696e696d756d546f6b656e42616c616e60448201527f6365466f724469766964656e647320616c7265616479207468652076616c756560648201526e1037b31013b732bbab30b63ab2939760891b608482015260a40161076f565b601355565b60006108198484846110c4565b61086b843361086685604051806060016040528060288152602001611b56602891396001600160a01b038a1660009081526001602090815260408083203384529091529020549190611118565b610fa0565b5060019392505050565b6001600160a01b0381166000908152600a602090815260408083205491839052822054600654600160801b926108c7926108c2926108bc916108b79190611152565b6111db565b906111eb565b611229565b61073f9190611a26565b6005546001600160a01b031633146108fb5760405162461bcd60e51b815260040161076f906119db565b6001600160a01b03811660009081526010602052604090205460ff161561092157600080fd5b6001600160a01b0381166000908152601060205260408120805460ff1916600117905561094f90829061123c565b6040516311b7d64d60e21b8152600c60048201526001600160a01b03821660248201527339d1b94c7fbc04552b879e3bc131c8308e7a2346906346df59349060440160006040518083038186803b1580156109a957600080fd5b505af41580156109bd573d6000803e3d6000fd5b50506040516001600160a01b03841692507fa878b31040b2e6d0a9a3d3361209db3908ba62014b0dca52adbaee451d128b259150600090a250565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909161073b91859061086690866112a1565b6005546001600160a01b03163314610a585760405162461bcd60e51b815260040161076f906119db565b610a6133611300565b50565b6005546001600160a01b03163314610a8e5760405162461bcd60e51b815260040161076f906119db565b6000610a9960025490565b11610aa357600080fd5b8015610a6157610ad6610ab560025490565b610ac383600160801b611152565b610acd9190611a26565b600654906112a1565b60065560405181815233907fa493a9229478c3fcd73f66d2cdeb7f94fd0f341da924d1054236d784541165119060200160405180910390a2600754610b1b90826112a1565b60075550565b6005546001600160a01b03163314610b4b5760405162461bcd60e51b815260040161076f906119db565b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b6005546001600160a01b03163314610bbf5760405162461bcd60e51b815260040161076f906119db565b610a6181611465565b600061073f82610c31565b6060600480546106ab906119a1565b600061073b338461086685604051806060016040528060258152602001611b7e602591393360009081526001602090815260408083206001600160a01b038d1684529091529020549190611118565b6001600160a01b0381166000908152600b602052604081205461073f90610c5784610875565b906114b1565b600061073b3384846110c4565b6005546000906001600160a01b03163314610c975760405162461bcd60e51b815260040161076f906119db565b6000610ca284611300565b90508015610d0e576001600160a01b038416600081815260116020526040908190204290555184151591907fa2c38e2d2fb7e3e1912d937fd1ca11ed6d51864dee4cfa7a7bf02becd7acf09290610cfc9085815260200190565b60405180910390a3600191505061073f565b5060009392505050565b6005546001600160a01b03163314610d425760405162461bcd60e51b815260040161076f906119db565b610a61816114f3565b6005546001600160a01b03163314610d755760405162461bcd60e51b815260040161076f906119db565b6001600160a01b03821660009081526010602052604090205460ff16610eb1576013548110610e2657610da8828261123c565b60405163f9d53fd960e01b8152600c60048201526001600160a01b0383166024820152604481018290527339d1b94c7fbc04552b879e3bc131c8308e7a23469063f9d53fd99060640160006040518083038186803b158015610e0957600080fd5b505af4158015610e1d573d6000803e3d6000fd5b50505050610ea4565b610e3182600061123c565b6040516311b7d64d60e21b8152600c60048201526001600160a01b03831660248201527339d1b94c7fbc04552b879e3bc131c8308e7a2346906346df59349060440160006040518083038186803b158015610e8b57600080fd5b505af4158015610e9f573d6000803e3d6000fd5b505050505b610eaf826001610c6a565b505b5050565b6005546001600160a01b03163314610edf5760405162461bcd60e51b815260040161076f906119db565b6001600160a01b038116610f445760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161076f565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0383166110025760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840161076f565b6001600160a01b0382166110635760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840161076f565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60405162461bcd60e51b815260206004820152602360248201527f47656e4c6162735f5574696c733a204e6f207472616e736665727320616c6c6f6044820152621dd95960ea1b606482015260840161076f565b6000818484111561113c5760405162461bcd60e51b815260040161076f919061181f565b5060006111498486611a48565b95945050505050565b6000826000036111645750600061073f565b60006111708385611a5f565b90508261117d8583611a26565b146111d45760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b606482015260840161076f565b9392505050565b6000818181121561073f57600080fd5b6000806111f88385611a7e565b90506000831215801561120b5750838112155b80611220575060008312801561122057508381125b6111d457600080fd5b60008082121561123857600080fd5b5090565b6001600160a01b0382166000908152602081905260409020548082111561127b57600061126983836114b1565b9050611275848261153f565b50610eaf565b80821015610eaf57600061128f82846114b1565b905061129b84826115a3565b50505050565b6000806112ae8385611abf565b9050838110156111d45760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015260640161076f565b60008061130c83610c31565b9050801561145c576001600160a01b0383166000908152600b602052604090205461133790826112a1565b6001600160a01b0384166000818152600b6020526040908190209290925590517fee503bee2bb6a87e57bc57db795f98137327401a0e7b7ce42e37926cc1a9ca4d906113869084815260200190565b60405180910390a260085460405163a9059cbb60e01b81526001600160a01b03858116600483015260248201849052600092169063a9059cbb906044016020604051808303816000875af11580156113e2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114069190611ad7565b905080611455576001600160a01b0384166000908152600b602052604090205461143090836114b1565b6001600160a01b039094166000908152600b6020526040812094909455509192915050565b5092915050565b50600092915050565b6005546001600160a01b0316331461148f5760405162461bcd60e51b815260040161076f906119db565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b60006111d483836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611118565b6005546001600160a01b0316331461151d5760405162461bcd60e51b815260040161076f906119db565b600980546001600160a01b0319166001600160a01b0392909216919091179055565b61154982826115e7565b6115836115646108b78360065461115290919063ffffffff16565b6001600160a01b0384166000908152600a6020526040902054906116d2565b6001600160a01b039092166000908152600a602052604090209190915550565b6115ad828261170f565b6115836115c86108b78360065461115290919063ffffffff16565b6001600160a01b0384166000908152600a6020526040902054906111eb565b6001600160a01b03821661163d5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640161076f565b61164960008383610eaf565b60025461165690826112a1565b6002556001600160a01b03821660009081526020819052604090205461167c90826112a1565b6001600160a01b038316600081815260208181526040808320949094559251848152919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91015b60405180910390a35050565b6000806116df8385611af4565b9050600083121580156116f25750838113155b80611220575060008312801561122057508381136111d457600080fd5b6001600160a01b03821661176f5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b606482015260840161076f565b61177b82600083610eaf565b6117b881604051806060016040528060228152602001611b34602291396001600160a01b0385166000908152602081905260409020549190611118565b6001600160a01b0383166000908152602081905260409020556002546117de90826114b1565b6002556040518181526000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020016116c6565b600060208083528351808285015260005b8181101561184c57858101830151858201604001528201611830565b8181111561185e576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b0381168114610a6157600080fd5b6000806040838503121561189c57600080fd5b82356118a781611874565b946020939093013593505050565b6000602082840312156118c757600080fd5b5035919050565b6000602082840312156118e057600080fd5b81356111d481611874565b60008060006060848603121561190057600080fd5b833561190b81611874565b9250602084013561191b81611874565b929592945050506040919091013590565b8015158114610a6157600080fd5b6000806040838503121561194d57600080fd5b823561195881611874565b915060208301356119688161192c565b809150509250929050565b6000806040838503121561198657600080fd5b823561199181611874565b9150602083013561196881611874565b600181811c908216806119b557607f821691505b6020821081036119d557634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600082611a4357634e487b7160e01b600052601260045260246000fd5b500490565b600082821015611a5a57611a5a611a10565b500390565b6000816000190483118215151615611a7957611a79611a10565b500290565b600080821280156001600160ff1b0384900385131615611aa057611aa0611a10565b600160ff1b8390038412811615611ab957611ab9611a10565b50500190565b60008219821115611ad257611ad2611a10565b500190565b600060208284031215611ae957600080fd5b81516111d48161192c565b60008083128015600160ff1b850184121615611b1257611b12611a10565b6001600160ff1b0384018313811615611b2d57611b2d611a10565b5050039056fe45524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220cc53c09e095c4d7d858d0c6480f096afb73cea96092dc7e7b04f969c4d233c7464736f6c634300080f0033

Deployed Bytecode

0x6080604052600436106102cd5760003560e01c8063880bcbc111610175578063b62496f5116100dc578063d3f6a15711610095578063e454324a1161006f578063e454324a14610913578063eadfac6814610933578063f2fde38b14610953578063fe0175351461097357600080fd5b8063d3f6a1571461088d578063d4698016146108ad578063dd62ed3e146108cd57600080fd5b8063b62496f514610776578063bea9849e146107a6578063c0246668146107c6578063cd43e228146107e6578063d2d7ad8314610857578063d32215761461086d57600080fd5b8063a4c5afa01161012e578063a4c5afa0146106c2578063a8b9d240146106e0578063a9059cbb14610700578063aa4bde2814610720578063aee50b1e14610736578063b1ba39ea1461075657600080fd5b8063880bcbc1146106195780638c0b5e22146106395780638da5cb5b1461064f57806395d89b411461066d5780639fad968314610682578063a457c2d7146106a257600080fd5b8063313ce567116102345780635ebf4db9116101ed57806370a08231116101c757806370a082311461058e578063715018a6146105c457806375f0a874146105d9578063781edb3c146105f957600080fd5b80635ebf4db91461053957806364b0f653146105595780636843cd841461056e57600080fd5b8063313ce5671461047457806331e79db01461049057806339509351146104b057806342966c68146104d057806349bd5a5e146104f05780634e71d92d1461052457600080fd5b806318160ddd1161028657806318160ddd146103c05780631e293c10146103df57806323b872dd146103ff57806327a14fc21461041f5780632c1f52161461043f57806330bb4cff1461045f57600080fd5b8063064a59d0146102d957806306fdde031461030f578063095ea7b314610331578063098df585146103515780630bd05b69146103735780631694505e1461038857600080fd5b366102d457005b600080fd5b3480156102e557600080fd5b506007546102fa90600160a01b900460ff1681565b60405190151581526020015b60405180910390f35b34801561031b57600080fd5b506103246109b9565b604051610306919061355a565b34801561033d57600080fd5b506102fa61034c3660046135c4565b610a4b565b34801561035d57600080fd5b5061037161036c3660046135f0565b610a61565b005b34801561037f57600080fd5b50610371610b87565b34801561039457600080fd5b506006546103a8906001600160a01b031681565b6040516001600160a01b039091168152602001610306565b3480156103cc57600080fd5b506003545b604051908152602001610306565b3480156103eb57600080fd5b506103716103fa3660046135f0565b610bc6565b34801561040b57600080fd5b506102fa61041a366004613609565b610c84565b34801561042b57600080fd5b5061037161043a3660046135f0565b610ced565b34801561044b57600080fd5b506007546103a8906001600160a01b031681565b34801561046b57600080fd5b506103d1610daf565b34801561048057600080fd5b5060405160128152602001610306565b34801561049c57600080fd5b506103716104ab36600461364a565b610e22565b3480156104bc57600080fd5b506102fa6104cb3660046135c4565b610eaf565b3480156104dc57600080fd5b506103716104eb3660046135f0565b610ee5565b3480156104fc57600080fd5b506103a87f00000000000000000000000089324cc2ac92faccf80541170d896a206c6454ac81565b34801561053057600080fd5b50610371610ef2565b34801561054557600080fd5b506103716105543660046135f0565b610f67565b34801561056557600080fd5b506103d1610fc2565b34801561057a57600080fd5b506103d161058936600461364a565b61100c565b34801561059a57600080fd5b506103d16105a936600461364a565b6001600160a01b031660009081526001602052604090205490565b3480156105d057600080fd5b50610371611082565b3480156105e557600080fd5b50600d546103a8906001600160a01b031681565b34801561060557600080fd5b50610371610614366004613675565b6110f6565b34801561062557600080fd5b50610371610634366004613675565b6111c0565b34801561064557600080fd5b506103d160095481565b34801561065b57600080fd5b506000546001600160a01b03166103a8565b34801561067957600080fd5b50610324611282565b34801561068e57600080fd5b5061037161069d3660046136c4565b611291565b3480156106ae57600080fd5b506102fa6106bd3660046135c4565b6113c5565b3480156106ce57600080fd5b50600e546001600160a01b03166103a8565b3480156106ec57600080fd5b506103d16106fb36600461364a565b611414565b34801561070c57600080fd5b506102fa61071b3660046135c4565b611447565b34801561072c57600080fd5b506103d160085481565b34801561074257600080fd5b506103716107513660046135f0565b611454565b34801561076257600080fd5b506103716107713660046136c4565b61151e565b34801561078257600080fd5b506102fa61079136600461364a565b60166020526000908152604090205460ff1681565b3480156107b257600080fd5b506103716107c136600461364a565b6115f2565b3480156107d257600080fd5b506103716107e1366004613675565b61170a565b3480156107f257600080fd5b5060115460ff80821691620100008104821691600160201b8204811691600160301b8104821691600160401b909104165b6040805160ff968716815294861660208601529285169284019290925283166060830152909116608082015260a001610306565b34801561086357600080fd5b506103d1600b5481565b34801561087957600080fd5b50610371610888366004613675565b611810565b34801561089957600080fd5b506103716108a8366004613729565b611892565b3480156108b957600080fd5b50600c546103a8906001600160a01b031681565b3480156108d957600080fd5b506103d16108e8366004613729565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b34801561091f57600080fd5b5061037161092e36600461364a565b611a89565b34801561093f57600080fd5b506102fa61094e3660046135c4565b611b8c565b34801561095f57600080fd5b5061037161096e36600461364a565b611c0a565b34801561097f57600080fd5b5060115460ff610100820481169163010000008104821691600160281b8204811691600160381b8104821691600160481b90910416610823565b6060600480546109c890613757565b80601f01602080910402602001604051908101604052809291908181526020018280546109f490613757565b8015610a415780601f10610a1657610100808354040283529160200191610a41565b820191906000526020600020905b815481529060010190602001808311610a2457829003601f168201915b5050505050905090565b6000610a58338484611d5a565b50600192915050565b6000546001600160a01b03163314610a945760405162461bcd60e51b8152600401610a8b90613791565b60405180910390fd5b478110610af25760405162461bcd60e51b815260206004820152602660248201527f43616e6e6f742073656e64206d6f7265207468616e20636f6e74726163742062604482015265616c616e636560d01b6064820152608401610a8b565b600080546040516001600160a01b039091169083908381818185875af1925050503d8060008114610b3f576040519150601f19603f3d011682016040523d82523d6000602084013e610b44565b606091505b505090508015610b83576040518281527f362ae087cf4ccfc970d45b9e8ce6520f03b4eda3f9d76a70b655dc22badcca48906020015b60405180910390a15b5050565b6000546001600160a01b03163314610bb15760405162461bcd60e51b8152600401610a8b90613791565b6007805460ff60a01b1916600160a01b179055565b6000546001600160a01b03163314610bf05760405162461bcd60e51b8152600401610a8b90613791565b6009548103610c515760405162461bcd60e51b815260206004820152602760248201527f43616e6e6f7420757064617465206d61785478416d6f756e7420746f2073616d604482015266652076616c756560c81b6064820152608401610a8b565b60095460405182907f75f1c17bf623f0f7a2bd91ba61e89dff216960370e3e9a46b250750d03e4215e90600090a3600955565b6000610c91848484611e7f565b610ce38433610cde85604051806060016040528060288152602001613af8602891396001600160a01b038a1660009081526002602090815260408083203384529091529020549190612488565b611d5a565b5060019392505050565b6000546001600160a01b03163314610d175760405162461bcd60e51b8152600401610a8b90613791565b6008548103610d7c5760405162461bcd60e51b815260206004820152602b60248201527f43616e6e6f7420757064617465206d617857616c6c6574416d6f756e7420746f60448201526a2073616d652076616c756560a81b6064820152608401610a8b565b60085460405182907f6d3e257c59a11116c3e97bb144abf5ba1a6a9da6bd509192ecf0d48f7be1fc7690600090a3600855565b600754604080516342d359d760e11b815290516000926001600160a01b0316916385a6b3ae9160048083019260209291908290030181865afa158015610df9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e1d91906137c6565b905090565b6000546001600160a01b03163314610e4c5760405162461bcd60e51b8152600401610a8b90613791565b60075460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db0906024015b600060405180830381600087803b158015610e9457600080fd5b505af1158015610ea8573d6000803e3d6000fd5b5050505050565b3360008181526002602090815260408083206001600160a01b03871684529091528120549091610a58918590610cde9086611cf4565b610eef33826124c2565b50565b60075460405163bc4c4b3760e01b8152336004820152600060248201526001600160a01b039091169063bc4c4b37906044016020604051808303816000875af1158015610f43573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eef91906137df565b6000546001600160a01b03163314610f915760405162461bcd60e51b8152600401610a8b90613791565b60075460405163163c7cef60e01b8152600481018390526001600160a01b039091169063163c7cef90602401610e7a565b600754604080516304ddf6ef60e11b815290516000926001600160a01b0316916309bbedde9160048083019260209291908290030181865afa158015610df9573d6000803e3d6000fd5b6007546040516370a0823160e01b81526001600160a01b03838116600483015260009216906370a08231906024015b602060405180830381865afa158015611058573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061107c91906137c6565b92915050565b6000546001600160a01b031633146110ac5760405162461bcd60e51b8152600401610a8b90613791565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b031633146111205760405162461bcd60e51b8152600401610a8b90613791565b6001600160a01b03821660009081526015602052604090205481151560ff9091161515036111605760405162461bcd60e51b8152600401610a8b906137fc565b6001600160a01b038216600081815260156020908152604091829020805460ff191685151590811790915591519182527ff5133f371b17bf21ce0df4ae2c1b6e11ca7c2f27257eb55282edb1ccfd4ecb2e91015b60405180910390a25050565b6000546001600160a01b031633146111ea5760405162461bcd60e51b8152600401610a8b90613791565b6001600160a01b03821660009081526014602052604090205481151560ff90911615150361122a5760405162461bcd60e51b8152600401610a8b906137fc565b6001600160a01b038216600081815260146020908152604091829020805460ff191685151590811790915591519182527f30098fc83ab61b1a98835d32c4e611adedccfc260eeef586bd329d48e8a40a4091016111b4565b6060600580546109c890613757565b6000546001600160a01b031633146112bb5760405162461bcd60e51b8152600401610a8b90613791565b8082846112c8878961385c565b6112d2919061385c565b6112dc919061385c565b6112e6919061385c565b60ff166005116113385760405162461bcd60e51b815260206004820152601760248201527f62757920666565206d75737420626520666169722121210000000000000000006044820152606401610a8b565b611347600f86868686866125ce565b6040516b62617365466565732d42757960a01b8152600c015b6040805191829003822060ff8881168452878116602085015286811684840152858116606085015284166080840152905190917f9a3619059270a48acdf850268d8f96db29f0cfe103bc17b5b4040a05af4d4f67919081900360a00190a25050505050565b6000610a583384610cde85604051806060016040528060258152602001613b40602591393360009081526002602090815260408083206001600160a01b038d1684529091529020549190612488565b6007546040516302a2e74960e61b81526001600160a01b038381166004830152600092169063a8b9d2409060240161103b565b6000610a58338484611e7f565b6000546001600160a01b0316331461147e5760405162461bcd60e51b8152600401610a8b90613791565b600b5481036114eb5760405162461bcd60e51b815260206004820152603360248201527f43616e6e6f7420757064617465206d696e696d756d546f6b656e734265666f72604482015272655377617020746f2073616d652076616c756560681b6064820152608401610a8b565b600b5460405182907f5b0491f767c1463bea8972339f785795be1a38784cc6483cf649cdcbb28c46b090600090a3600b55565b6000546001600160a01b031633146115485760405162461bcd60e51b8152600401610a8b90613791565b808284611555878961385c565b61155f919061385c565b611569919061385c565b611573919061385c565b60ff166007116115c55760405162461bcd60e51b815260206004820152601860248201527f73656c6c20666565206d757374206265206661697221212100000000000000006044820152606401610a8b565b6115d4600f86868686866128b3565b6040516c18985cd95199595ccb54d95b1b609a1b8152600d01611360565b6000546001600160a01b0316331461161c5760405162461bcd60e51b8152600401610a8b90613791565b6006546001600160a01b03908116908216036116865760405162461bcd60e51b815260206004820152602360248201527f54686520726f7574657220616c7265616479206861732074686174206164647260448201526265737360e81b6064820152608401610a8b565b6006546040516001600160a01b03918216918316907f2afbff3ed601a8723765c7072d8ea8445e08f6f1874afd34a2b747a272c3ebad90600090a3600680546001600160a01b0319166001600160a01b03838116918217909255600754604051635f54c24f60e11b815260048101929092529091169063bea9849e90602401610e7a565b6000546001600160a01b031633146117345760405162461bcd60e51b8152600401610a8b90613791565b6001600160a01b03821660009081526013602052604090205481151560ff9091161515036117b85760405162461bcd60e51b815260206004820152602b60248201527f204163636f756e7420697320616c7265616479207468652076616c7565206f6660448201526a20276578636c756465642760a81b6064820152608401610a8b565b6001600160a01b038216600081815260136020908152604091829020805460ff191685151590811790915591519182527fa856ba9fdc54a5434b2359874c95612f520a2d7f858864ae98d15c1b2099ca8b91016111b4565b6000546001600160a01b0316331461183a5760405162461bcd60e51b8152600401610a8b90613791565b6001600160a01b038216600081815260126020908152604091829020805460ff191685151590811790915591519182527fcb9f97b7b4b41413e5c8d418a8cf9a88db1cf34dee66b213d070faf881d9d35091016111b4565b6000546001600160a01b031633146118bc5760405162461bcd60e51b8152600401610a8b90613791565b600c546001600160a01b038381169116146119a0576001600160a01b0382166119275760405162461bcd60e51b815260206004820152601f60248201527f546865206c697175696469747957616c6c65742063616e6e6f742062652030006044820152606401610a8b565b600c546040516e1b1a5c5d5a591a5d1e55d85b1b195d608a1b81526001600160a01b0391821691841690600f01604051908190038120907f4af24be54adc5e716fbcaa3fca0ad593e28dff90dffd49487c0a33b1547c6b5290600090a4600c80546001600160a01b0319166001600160a01b0384161790555b600d546001600160a01b03828116911614610b83576001600160a01b038116611a0b5760405162461bcd60e51b815260206004820152601f60248201527f546865206d61726b6574696e6757616c6c65742063616e6e6f742062652030006044820152606401610a8b565b600d546040516e1b585c9ad95d1a5b99d5d85b1b195d608a1b81526001600160a01b0391821691831690600f01604051908190038120907f4af24be54adc5e716fbcaa3fca0ad593e28dff90dffd49487c0a33b1547c6b5290600090a4600d80546001600160a01b0383166001600160a01b03199091161790555050565b6000546001600160a01b03163314611ab35760405162461bcd60e51b8152600401610a8b90613791565b6001600160a01b03811615801590611ad95750600e546001600160a01b03828116911614155b611b385760405162461bcd60e51b815260206004820152602a60248201527f696e76616c69642061646472657373203a206d757374206d6173746572636865604482015269198818dbdb9d1c9858dd60b21b6064820152608401610a8b565b600e80546001600160a01b0319166001600160a01b0383169081179091556040519081527f520534ce511e7ccf49e4eb2d675683372a4c9689099996d8eb3fe8832e3500a49060200160405180910390a150565b600e546000906001600160a01b03163314611c005760405162461bcd60e51b815260206004820152602e60248201527f6f6e6c79206d6173746572636865662063616e2068616e646c6520746f6b656e60448201526d20646973747269627574696f6e2160901b6064820152608401610a8b565b610a588383612bb4565b6000546001600160a01b03163314611c345760405162461bcd60e51b8152600401610a8b90613791565b6001600160a01b038116611c995760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a8b565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b600080611d018385613881565b905083811015611d535760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610a8b565b9392505050565b6001600160a01b038316611dbc5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610a8b565b6001600160a01b038216611e1d5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610a8b565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b038316611ea55760405162461bcd60e51b8152600401610a8b90613899565b6001600160a01b038216611ecb5760405162461bcd60e51b8152600401610a8b906138de565b80600003611ee457611edf83836000612c8e565b505050565b6001600160a01b03808416600081815260166020908152604080832054948716835280832054938352601290915290205460ff928316929182169116158015611f4657506001600160a01b03841660009081526012602052604090205460ff16155b1561217157600754600160a01b900460ff16611fa45760405162461bcd60e51b815260206004820152601e60248201527f54726164696e672069732063757272656e746c792064697361626c65642e00006044820152606401610a8b565b6001600160a01b03841660009081526014602052604090205460ff16158015611fe657506001600160a01b03851660009081526014602052604090205460ff16155b156120ba578115612052576008548311156120525760405162461bcd60e51b815260206004820152602660248201527f42757920616d6f756e74206578636565647320746865206d617854784275794160448201526536b7bab73a1760d11b6064820152608401610a8b565b80156120ba576009548311156120ba5760405162461bcd60e51b815260206004820152602760248201527f53656c6c20616d6f756e74206578636565647320746865206d6178547842757960448201526620b6b7bab73a1760c91b6064820152608401610a8b565b6001600160a01b03841660009081526015602052604090205460ff1661217157600854836120fd866001600160a01b031660009081526001602052604090205490565b6121079190613881565b11156121715760405162461bcd60e51b815260206004820152603360248201527f45787065637465642077616c6c657420616d6f756e742065786365656473207460448201527234329036b0bc2bb0b63632ba20b6b7bab73a1760691b6064820152608401610a8b565b61217b8282612d9a565b600b543060009081526001602052604090205460075491111590600160a01b900460ff1680156121a85750805b80156121b75750600a5460ff16155b80156121ce5750601754600160281b900460ff1615155b80156121f257506001600160a01b03851660009081526016602052604090205460ff165b1561221757600a805460ff1916600117905561220c613012565b600a805460ff191690555b600a5460009060ff161580156122365750600754600160a01b900460ff165b6001600160a01b03881660009081526013602052604090205490915060ff168061227857506001600160a01b03861660009081526013602052604090205460ff165b15612281575060005b8080156122995750601754600160281b900460ff1615155b15612362576017546000906064906122bb90600160281b900460ff1688613921565b6122c59190613956565b6017549091506000906064906122e5906301000000900460ff1689613921565b6122ef9190613956565b90506122fb828861396a565b9650612308893084612c8e565b801561235f5761231830826124c2565b60175460408051630100000090920460ff168252602082018390527ffecf12fd01122af77b8b8f1a0f126363142d14fba298ea36d9fe4909f61bb5a1910160405180910390a15b50505b61236d878787612c8e565b6007546001600160a01b031663e30443bc8861239e816001600160a01b031660009081526001602052604090205490565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b1580156123e457600080fd5b505af19250505080156123f5575060015b506007546001600160a01b031663e30443bc87612427816001600160a01b031660009081526001602052604090205490565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561246d57600080fd5b505af192505050801561247e575060015b5050505050505050565b600081848411156124ac5760405162461bcd60e51b8152600401610a8b919061355a565b5060006124b9848661396a565b95945050505050565b6001600160a01b0382166125225760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610a8b565b61255f81604051806060016040528060228152602001613ab0602291396001600160a01b0385166000908152600160205260409020549190612488565b6001600160a01b0383166000908152600160205260409020556003546125859082613319565b6003556040518181526000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020015b60405180910390a35050565b600286015460ff86811691161461264f57604051706c69717569646974794665654f6e42757960781b815260110160405190819003812060028801548854919260ff9182169291891691600080516020613b20833981519152916126359160481b90613981565b60405180910390a460028601805460ff191660ff87161790555b600286015460ff8581166201000090920416146126e357604051706d61726b6574696e674665654f6e42757960781b815260110160405190819003812060028801548854919260ff6201000090920482169291881691600080516020613b20833981519152916126c29160481b90613981565b60405180910390a460028601805462ff000019166201000060ff8716021790555b600286015460ff848116600160201b909204161461277a576040516e6275794261636b4665654f6e42757960881b8152600f0160405190819003812060028801548854919260ff600160201b90920482169291871691600080516020613b20833981519152916127569160481b90613981565b60405180910390a460028601805464ff000000001916600160201b60ff8616021790555b600286015460ff838116600160301b9092041614612810576040516b6275726e4665654f6e42757960a01b8152600c0160405190819003812060028801548854919260ff600160301b90920482169291861691600080516020613b20833981519152916127ea9160481b90613981565b60405180910390a460028601805466ff0000000000001916600160301b60ff8516021790555b600286015460ff828116600160401b90920416146128ab576040516e686f6c646572734665654f6e42757960881b8152600f0160405190819003812060028801548854919260ff600160401b90920482169291851691600080516020613b20833981519152916128839160481b90613981565b60405180910390a460028601805468ff00000000000000001916600160401b60ff8416021790555b505050505050565b600286015460ff868116610100909204161461294457604051711b1a5c5d5a591a5d1e51995953db94d95b1b60721b815260120160405190819003812060028801548854919260ff61010090920482169291891691600080516020613b20833981519152916129259160481b90613981565b60405180910390a460028601805461ff00191661010060ff8816021790555b600286015460ff858116630100000090920416146129dd57604051711b585c9ad95d1a5b99d1995953db94d95b1b60721b815260120160405190819003812060028801548854919260ff630100000090920482169291881691600080516020613b20833981519152916129ba9160481b90613981565b60405180910390a460028601805463ff0000001916630100000060ff8716021790555b600286015460ff848116600160281b9092041614612a76576040516f189d5e509858dad1995953db94d95b1b60821b815260100160405190819003812060028801548854919260ff600160281b90920482169291871691600080516020613b2083398151915291612a519160481b90613981565b60405180910390a460028601805465ff00000000001916600160281b60ff8616021790555b600286015460ff838116600160381b9092041614612b0e576040516c189d5c9b91995953db94d95b1b609a1b8152600d0160405190819003812060028801548854919260ff600160381b90920482169291861691600080516020613b2083398151915291612ae79160481b90613981565b60405180910390a460028601805467ff000000000000001916600160381b60ff8516021790555b600286015460ff828116600160481b90920416146128ab576040516f1a1bdb19195c9cd1995953db94d95b1b60821b815260100160405190819003812060028801548854919260ff600160481b90920482169291851691600080516020613b2083398151915291612b829160481b90613981565b60405180910390a460028601805460ff8316600160481b0269ff00000000000000000019909116179055505050505050565b6001600160a01b038216612c0a5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610a8b565b600354612c179082611cf4565b6003556001600160a01b038216600090815260016020526040902054612c3d9082611cf4565b6001600160a01b0383166000818152600160205260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906125c29085815260200190565b6001600160a01b038316612cb45760405162461bcd60e51b8152600401610a8b90613899565b6001600160a01b038216612cda5760405162461bcd60e51b8152600401610a8b906138de565b612d1781604051806060016040528060268152602001613ad2602691396001600160a01b0386166000908152600160205260409020549190612488565b6001600160a01b038085166000908152600160205260408082209390935590841681522054612d469082611cf4565b6001600160a01b0380841660008181526001602052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611e729085815260200190565b6017805464ffffffffff191690558115612e22576011546017805460ff80841661ffff1990921691909117610100620100008086048416919091029190911763ffff00001916600160201b80860484169290920263ff000000191617600160301b850483166301000000021764ff000000001916600160401b90940491909116029190911790555b8015612e9d576011546017805461010080840460ff90811661ffff199093169290921763010000008086048416929092021763ffff00001916600160281b85048316620100000263ff000000191617600160381b85048316919091021764ff000000001916600160481b90930416600160201b029190911790555b80158015612ea9575081155b15612f23576011546017805461010080840460ff90811661ffff199093169290921763010000008086048416929092021763ffff00001916600160281b85048316620100000263ff000000191617600160381b85048316919091021764ff000000001916600160481b90930416600160201b029190911790555b60175460ff600160201b820481169163010000008104821691620100008204811691612f579161010082048116911661385c565b612f61919061385c565b612f6b919061385c565b612f75919061385c565b6017805465ff0000000000198116600160281b60ff948516810291821793849055604080519386169286169290921783526101008404851660208401526201000084048516918301919091526301000000830484166060830152600160201b83048416608083015290910490911660a08201527f6c6977cb51242ec6e05aba0e2a29a5292ed1a8a5cffa3b87ff66395b7997d6d29060c001610b7a565b306000908152600160205260408120546017549091479160029060ff600160281b8204811691613043911686613921565b61304d9190613956565b6130579190613956565b60175490915060009060ff600160281b820481169161307f91600160201b9091041686613921565b6130899190613956565b905060006130978284613881565b6130a1908661396a565b90506130ac8161335b565b60006130b8854761396a565b60175490915060009060ff600160201b8204811691630100000081048216916130e49160029116613998565b6130ee919061385c565b6130f8919061385c565b60175461310f9190600160281b900460ff166139ba565b60175460ff9182169250600091600291849161312c911686613921565b6131369190613956565b6131409190613956565b601754909150600090839061315d90610100900460ff1686613921565b6131679190613956565b600d546040519192506001600160a01b03169082156108fc029083906000818181858888f193505050501580156131a2573d6000803e3d6000fd5b5086156131f5576131b387836134ad565b60408051868152602081018490529081018890527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a15b60075460405163a9059cbb60e01b81526001600160a01b03909116600482015260248101879052600090309063a9059cbb906044016020604051808303816000875af1158015613249573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061326d91906137df565b9050801561330d57600754604051636bf5ecd560e01b8152600481018990526001600160a01b0390911690636bf5ecd590602401600060405180830381600087803b1580156132bb57600080fd5b505af11580156132cf573d6000803e3d6000fd5b505050507fa4049db804d87a845be4dd8b54ae7048131238fba985dd37234309ac8668d9698760405161330491815260200190565b60405180910390a15b50505050505050505050565b6000611d5383836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612488565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110613390576133906139dd565b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa1580156133e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061340d91906139f3565b81600181518110613420576134206139dd565b6001600160a01b0392831660209182029290920101526006546134469130911684611d5a565b60065460405163791ac94760e01b81526001600160a01b039091169063791ac9479061347f908590600090869030904290600401613a10565b600060405180830381600087803b15801561349957600080fd5b505af11580156128ab573d6000803e3d6000fd5b6006546134c59030906001600160a01b031684611d5a565b600654600c5460405163f305d71960e01b81523060048201526024810185905260006044820181905260648201526001600160a01b0391821660848201524260a482015291169063f305d71990839060c40160606040518083038185885af1158015613535573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610ea89190613a81565b600060208083528351808285015260005b818110156135875785810183015185820160400152820161356b565b81811115613599576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b0381168114610eef57600080fd5b600080604083850312156135d757600080fd5b82356135e2816135af565b946020939093013593505050565b60006020828403121561360257600080fd5b5035919050565b60008060006060848603121561361e57600080fd5b8335613629816135af565b92506020840135613639816135af565b929592945050506040919091013590565b60006020828403121561365c57600080fd5b8135611d53816135af565b8015158114610eef57600080fd5b6000806040838503121561368857600080fd5b8235613693816135af565b915060208301356136a381613667565b809150509250929050565b803560ff811681146136bf57600080fd5b919050565b600080600080600060a086880312156136dc57600080fd5b6136e5866136ae565b94506136f3602087016136ae565b9350613701604087016136ae565b925061370f606087016136ae565b915061371d608087016136ae565b90509295509295909350565b6000806040838503121561373c57600080fd5b8235613747816135af565b915060208301356136a3816135af565b600181811c9082168061376b57607f821691505b60208210810361378b57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6000602082840312156137d857600080fd5b5051919050565b6000602082840312156137f157600080fd5b8151611d5381613667565b6020808252602a908201527f4163636f756e7420697320616c7265616479207468652076616c7565206f6620604082015269276578636c756465642760b01b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b600060ff821660ff84168060ff0382111561387957613879613846565b019392505050565b6000821982111561389457613894613846565b500190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b600081600019048311821515161561393b5761393b613846565b500290565b634e487b7160e01b600052601260045260246000fd5b60008261396557613965613940565b500490565b60008282101561397c5761397c613846565b500390565b68ffffffffffffffffff1991909116815260200190565b600060ff8316806139ab576139ab613940565b8060ff84160491505092915050565b600060ff821660ff8416808210156139d4576139d4613846565b90039392505050565b634e487b7160e01b600052603260045260246000fd5b600060208284031215613a0557600080fd5b8151611d53816135af565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015613a605784516001600160a01b031683529383019391830191600101613a3b565b50506001600160a01b03969096166060850152505050608001529392505050565b600080600060608486031215613a9657600080fd5b835192506020840151915060408401519050925092509256fe45524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636500edc71549f0cbe47086c2237ce0cf874d6897fd1d7ce43ee6b65c0230d7606e45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212206e90f5b813adeed1daf3f884aa4b056c629f5fc36dc0af434c3d115eba26af5464736f6c634300080f0033

Libraries Used


Deployed Bytecode Sourcemap

15844:20186:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16147:28;;;;;;;;;;-1:-1:-1;16147:28:0;;;;-1:-1:-1;;;16147:28:0;;;;;;;;;179:14:1;;172:22;154:41;;142:2;127:18;16147:28:0;;;;;;;;8498:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;9322:154::-;;;;;;;;;;-1:-1:-1;9322:154:0;;;;;:::i;:::-;;:::i;26176:303::-;;;;;;;;;;-1:-1:-1;26176:303:0;;;;;:::i;:::-;;:::i;:::-;;21330:79;;;;;;;;;;;;;:::i;15889:30::-;;;;;;;;;;-1:-1:-1;15889:30:0;;;;-1:-1:-1;;;;;15889:30:0;;;;;;-1:-1:-1;;;;;1628:32:1;;;1610:51;;1598:2;1583:18;15889:30:0;1449:218:1;8783:99:0;;;;;;;;;;-1:-1:-1;8865:12:0;;8783:99;;;1818:25:1;;;1806:2;1791:18;8783:99:0;1672:177:1;25136:241:0;;;;;;;;;;-1:-1:-1;25136:241:0;;;;;:::i;:::-;;:::i;9481:313::-;;;;;;;;;;-1:-1:-1;9481:313:0;;;;;:::i;:::-;;:::i;25380:247::-;;;;;;;;;;-1:-1:-1;25380:247:0;;;;;:::i;:::-;;:::i;16108:35::-;;;;;;;;;;-1:-1:-1;16108:35:0;;;;-1:-1:-1;;;;;16108:35:0;;;27146:132;;;;;;;;;;;;;:::i;8694:84::-;;;;;;;;;;-1:-1:-1;8694:84:0;;8771:2;2694:36:1;;2682:2;2667:18;8694:84:0;2552:184:1;22256:121:0;;;;;;;;;;-1:-1:-1;22256:121:0;;;;;:::i;:::-;;:::i;9799:203::-;;;;;;;;;;-1:-1:-1;9799:203:0;;;;;:::i;:::-;;:::i;26638:72::-;;;;;;;;;;-1:-1:-1;26638:72:0;;;;;:::i;:::-;;:::i;15923:38::-;;;;;;;;;;;;;;;26076:97;;;;;;;;;;;;;:::i;25929:144::-;;;;;;;;;;-1:-1:-1;25929:144:0;;;;;:::i;:::-;;:::i;27563:132::-;;;;;;;;;;;;;:::i;27428:::-;;;;;;;;;;-1:-1:-1;27428:132:0;;;;;:::i;:::-;;:::i;8887:118::-;;;;;;;;;;-1:-1:-1;8887:118:0;;;;;:::i;:::-;-1:-1:-1;;;;;8982:18:0;8961:7;8982:18;;;:9;:18;;;;;;;8887:118;7732:133;;;;;;;;;;;;;:::i;16487:30::-;;;;;;;;;;-1:-1:-1;16487:30:0;;;;-1:-1:-1;;;;;16487:30:0;;;22710:310;;;;;;;;;;-1:-1:-1;22710:310:0;;;;;:::i;:::-;;:::i;22380:327::-;;;;;;;;;;-1:-1:-1;22380:327:0;;;;;:::i;:::-;;:::i;16308:46::-;;;;;;;;;;;;;;;;7548:70;;;;;;;;;;-1:-1:-1;7586:7:0;7607:6;-1:-1:-1;;;;;7607:6:0;7548:70;;8594:95;;;;;;;;;;;;;:::i;23655:563::-;;;;;;;;;;-1:-1:-1;23655:563:0;;;;;:::i;:::-;;:::i;10007:254::-;;;;;;;;;;-1:-1:-1;10007:254:0;;;;;:::i;:::-;;:::i;26715:98::-;;;;;;;;;;-1:-1:-1;26795:10:0;;-1:-1:-1;;;;;26795:10:0;26715:98;;27281:144;;;;;;;;;;-1:-1:-1;27281:144:0;;;;;:::i;:::-;;:::i;9010:160::-;;;;;;;;;;-1:-1:-1;9010:160:0;;;;;:::i;:::-;;:::i;16252:50::-;;;;;;;;;;;;;;;;25630:296;;;;;;;;;;-1:-1:-1;25630:296:0;;;;;:::i;:::-;;:::i;24221:588::-;;;;;;;;;;-1:-1:-1;24221:588:0;;;;;:::i;:::-;;:::i;17303:58::-;;;;;;;;;;-1:-1:-1;17303:58:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;24812:321;;;;;;;;;;-1:-1:-1;24812:321:0;;;;;:::i;:::-;;:::i;21979:274::-;;;;;;;;;;-1:-1:-1;21979:274:0;;;;;:::i;:::-;;:::i;27698:216::-;;;;;;;;;;-1:-1:-1;27794:23:0;;;;;;;27819;;;;;;-1:-1:-1;;;27844:21:0;;;;;-1:-1:-1;;;27867:18:0;;;;;-1:-1:-1;;;27887:21:0;;;;27698:216;;;;4610:4:1;4598:17;;;4580:36;;4652:17;;;4647:2;4632:18;;4625:45;4706:17;;;4686:18;;;4679:45;;;;4760:17;;4755:2;4740:18;;4733:45;4815:17;;;4809:3;4794:19;;4787:46;4567:3;4552:19;27698:216:0;4341:498:1;16386:61:0;;;;;;;;;;;;;;;;21774:202;;;;;;;;;;-1:-1:-1;21774:202:0;;;;;:::i;:::-;;:::i;23023:614::-;;;;;;;;;;-1:-1:-1;23023:614:0;;;;;:::i;:::-;;:::i;16453:30::-;;;;;;;;;;-1:-1:-1;16453:30:0;;;;-1:-1:-1;;;;;16453:30:0;;;9175:142;;;;;;;;;;-1:-1:-1;9175:142:0;;;;;:::i;:::-;-1:-1:-1;;;;;9285:18:0;;;9264:7;9285:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;9175:142;26818:323;;;;;;;;;;-1:-1:-1;26818:323:0;;;;;:::i;:::-;;:::i;26482:153::-;;;;;;;;;;-1:-1:-1;26482:153:0;;;;;:::i;:::-;;:::i;7870:223::-;;;;;;;;;;-1:-1:-1;7870:223:0;;;;;:::i;:::-;;:::i;27917:222::-;;;;;;;;;;-1:-1:-1;28014:24:0;;;;;;;;;28040;;;;;;-1:-1:-1;;;28066:22:0;;;;;-1:-1:-1;;;28090:19:0;;;;;-1:-1:-1;;;28111:22:0;;;;27917:222;;8498:91;8552:13;8579:5;8572:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8498:91;:::o;9322:154::-;9405:4;9416:39;7014:10;9439:7;9448:6;9416:8;:39::i;:::-;-1:-1:-1;9467:4:0;9322:154;;;;:::o;26176:303::-;7657:6;;-1:-1:-1;;;;;7657:6:0;7014:10;7657:22;7649:67;;;;-1:-1:-1;;;7649:67:0;;;;;;;:::i;:::-;;;;;;;;;26262:21:::1;26253:6;:30;26245:81;;;::::0;-1:-1:-1;;;26245:81:0;;6185:2:1;26245:81:0::1;::::0;::::1;6167:21:1::0;6224:2;6204:18;;;6197:30;6263:34;6243:18;;;6236:62;-1:-1:-1;;;6314:18:1;;;6307:36;6360:19;;26245:81:0::1;5983:402:1::0;26245:81:0::1;26338:12;7607:6:::0;;26355:41:::1;::::0;-1:-1:-1;;;;;7607:6:0;;;;26385;;26338:12;26355:41;26338:12;26355:41;26385:6;7607;26355:41:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26337:59;;;26411:7;26407:68;;;26439:24;::::0;1818:25:1;;;26439:24:0::1;::::0;1806:2:1;1791:18;26439:24:0::1;;;;;;;;26407:68;26237:242;26176:303:::0;:::o;21330:79::-;7657:6;;-1:-1:-1;;;;;7657:6:0;7014:10;7657:22;7649:67;;;;-1:-1:-1;;;7649:67:0;;;;;;;:::i;:::-;21381:16:::1;:23:::0;;-1:-1:-1;;;;21381:23:0::1;-1:-1:-1::0;;;21381:23:0::1;::::0;;21330:79::o;25136:241::-;7657:6;;-1:-1:-1;;;;;7657:6:0;7014:10;7657:22;7649:67;;;;-1:-1:-1;;;7649:67:0;;;;;;;:::i;:::-;25231:11:::1;;25219:8;:23:::0;25211:75:::1;;;::::0;-1:-1:-1;;;25211:75:0;;6802:2:1;25211:75:0::1;::::0;::::1;6784:21:1::0;6841:2;6821:18;;;6814:30;6880:34;6860:18;;;6853:62;-1:-1:-1;;;6931:18:1;;;6924:37;6978:19;;25211:75:0::1;6600:403:1::0;25211:75:0::1;25333:11;::::0;25296:49:::1;::::0;25323:8;;25296:49:::1;::::0;;;::::1;25350:11;:22:::0;25136:241::o;9481:313::-;9600:4;9611:36;9621:6;9629:9;9640:6;9611:9;:36::i;:::-;9652:121;9661:6;7014:10;9683:89;9721:6;9683:89;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;9683:19:0;;;;;;:11;:19;;;;;;;;7014:10;9683:33;;;;;;;;;;:37;:89::i;:::-;9652:8;:121::i;:::-;-1:-1:-1;9785:4:0;9481:313;;;;;:::o;25380:247::-;7657:6;;-1:-1:-1;;;;;7657:6:0;7014:10;7657:22;7649:67;;;;-1:-1:-1;;;7649:67:0;;;;;;;:::i;:::-;25470:15:::1;;25458:8;:27:::0;25450:83:::1;;;::::0;-1:-1:-1;;;25450:83:0;;7210:2:1;25450:83:0::1;::::0;::::1;7192:21:1::0;7249:2;7229:18;;;7222:30;7288:34;7268:18;;;7261:62;-1:-1:-1;;;7339:18:1;;;7332:41;7390:19;;25450:83:0::1;7008:407:1::0;25450:83:0::1;25575:15;::::0;25543:48:::1;::::0;25565:8;;25543:48:::1;::::0;;;::::1;25596:15;:26:::0;25380:247::o;27146:132::-;27230:15;;:43;;;-1:-1:-1;;;27230:43:0;;;;27209:7;;-1:-1:-1;;;;;27230:15:0;;:41;;:43;;;;;;;;;;;;;;:15;:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27223:50;;27146:132;:::o;22256:121::-;7657:6;;-1:-1:-1;;;;;7657:6:0;7014:10;7657:22;7649:67;;;;-1:-1:-1;;;7649:67:0;;;;;;;:::i;:::-;22327:15:::1;::::0;:45:::1;::::0;-1:-1:-1;;;22327:45:0;;-1:-1:-1;;;;;1628:32:1;;;22327:45:0::1;::::0;::::1;1610:51:1::0;22327:15:0;;::::1;::::0;:36:::1;::::0;1583:18:1;;22327:45:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;22256:121:::0;:::o;9799:203::-;7014:10;9887:4;9930:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;9930:34:0;;;;;;;;;;9887:4;;9898:83;;9921:7;;9930:50;;9969:10;9930:38;:50::i;26638:72::-;26681:24;26687:10;26699:5;26681;:24::i;:::-;26638:72;:::o;26076:97::-;26107:15;;:58;;-1:-1:-1;;;26107:58:0;;26146:10;26107:58;;;7793:51:1;26107:15:0;7860:18:1;;;7853:50;-1:-1:-1;;;;;26107:15:0;;;;:30;;7766:18:1;;26107:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;25929:144::-;7657:6;;-1:-1:-1;;;;;7657:6:0;7014:10;7657:22;7649:67;;;;-1:-1:-1;;;7649:67:0;;;;;;;:::i;:::-;26015:15:::1;::::0;:53:::1;::::0;-1:-1:-1;;;26015:53:0;;::::1;::::0;::::1;1818:25:1::0;;;-1:-1:-1;;;;;26015:15:0;;::::1;::::0;:43:::1;::::0;1791:18:1;;26015:53:0::1;1672:177:1::0;27563:132:0;27649:15;;:41;;;-1:-1:-1;;;27649:41:0;;;;27628:7;;-1:-1:-1;;;;;27649:15:0;;:39;;:41;;;;;;;;;;;;;;:15;:41;;;;;;;;;;;;;;27428:132;27521:15;;:34;;-1:-1:-1;;;27521:34:0;;-1:-1:-1;;;;;1628:32:1;;;27521:34:0;;;1610:51:1;27500:7:0;;27521:15;;:25;;1583:18:1;;27521:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27514:41;27428:132;-1:-1:-1;;27428:132:0:o;7732:133::-;7657:6;;-1:-1:-1;;;;;7657:6:0;7014:10;7657:22;7649:67;;;;-1:-1:-1;;;7649:67:0;;;;;;;:::i;:::-;7833:1:::1;7817:6:::0;;7796:40:::1;::::0;-1:-1:-1;;;;;7817:6:0;;::::1;::::0;7796:40:::1;::::0;7833:1;;7796:40:::1;7858:1;7841:19:::0;;-1:-1:-1;;;;;;7841:19:0::1;::::0;;7732:133::o;22710:310::-;7657:6;;-1:-1:-1;;;;;7657:6:0;7014:10;7657:22;7649:67;;;;-1:-1:-1;;;7649:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;22809:38:0;::::1;;::::0;;;:29:::1;:38;::::0;;;;;:50;::::1;;:38;::::0;;::::1;:50;;::::0;22801:105:::1;;;;-1:-1:-1::0;;;22801:105:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;22911:38:0;::::1;;::::0;;;:29:::1;:38;::::0;;;;;;;;:49;;-1:-1:-1;;22911:49:0::1;::::0;::::1;;::::0;;::::1;::::0;;;22970:45;;154:41:1;;;22970:45:0::1;::::0;127:18:1;22970:45:0::1;;;;;;;;22710:310:::0;;:::o;22380:327::-;7657:6;;-1:-1:-1;;;;;7657:6:0;7014:10;7657:22;7649:67;;;;-1:-1:-1;;;7649:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;22484:43:0;::::1;;::::0;;;:34:::1;:43;::::0;;;;;:55;::::1;;:43;::::0;;::::1;:55;;::::0;22476:110:::1;;;;-1:-1:-1::0;;;22476:110:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;22591:43:0;::::1;;::::0;;;:34:::1;:43;::::0;;;;;;;;:54;;-1:-1:-1;;22591:54:0::1;::::0;::::1;;::::0;;::::1;::::0;;;22655:47;;154:41:1;;;22655:47:0::1;::::0;127:18:1;22655:47:0::1;14:187:1::0;8594:95:0;8650:13;8677:7;8670:14;;;;;:::i;23655:563::-;7657:6;;-1:-1:-1;;;;;7657:6:0;7014:10;7657:22;7649:67;;;;-1:-1:-1;;;7649:67:0;;;;;;;:::i;:::-;23918:16;23902:13;23883:16;23841:39:::1;23862:18:::0;23841;:39:::1;:::i;:::-;:58;;;;:::i;:::-;:74;;;;:::i;:::-;:93;;;;:::i;:::-;23837:97;;:1;:97;23829:133;;;::::0;-1:-1:-1;;;23829:133:0;;9118:2:1;23829:133:0::1;::::0;::::1;9100:21:1::0;9157:2;9137:18;;;9130:30;9196:25;9176:18;;;9169:53;9239:18;;23829:133:0::1;8916:347:1::0;23829:133:0::1;23967:120;23990:5;23997:18;24017;24037:16;24055:13;24070:16;23967:22;:120::i;:::-;24097:116;::::0;-1:-1:-1;;;9470:27:1;;9522:2;9513:12;24097:116:0::1;;::::0;;;;;::::1;::::0;;4610:4:1;4598:17;;;4580:36;;4652:17;;;4647:2;4632:18;;4625:45;4706:17;;;4686:18;;;4679:45;4760:17;;;4755:2;4740:18;;4733:45;4815:17;;4809:3;4794:19;;4787:46;24097:116:0;;;;::::1;::::0;;;;;4567:3:1;24097:116:0;;::::1;23655:563:::0;;;;;:::o;10007:254::-;10100:4;10111:129;7014:10;10134:7;10143:96;10182:15;10143:96;;;;;;;;;;;;;;;;;7014:10;10143:25;;;;:11;:25;;;;;;;;-1:-1:-1;;;;;10143:34:0;;;;;;;;;;;;:38;:96::i;27281:144::-;27373:15;;:47;;-1:-1:-1;;;27373:47:0;;-1:-1:-1;;;;;1628:32:1;;;27373:47:0;;;1610:51:1;27352:7:0;;27373:15;;:38;;1583:18:1;;27373:47:0;1449:218:1;9010:160:0;9096:4;9107:42;7014:10;9131:9;9142:6;9107:9;:42::i;25630:296::-;7657:6;;-1:-1:-1;;;;;7657:6:0;7014:10;7657:22;7649:67;;;;-1:-1:-1;;;7649:67:0;;;;;;;:::i;:::-;25728:23:::1;;25716:8;:35:::0;25708:99:::1;;;::::0;-1:-1:-1;;;25708:99:0;;9738:2:1;25708:99:0::1;::::0;::::1;9720:21:1::0;9777:2;9757:18;;;9750:30;9816:34;9796:18;;;9789:62;-1:-1:-1;;;9867:18:1;;;9860:49;9926:19;;25708:99:0::1;9536:415:1::0;25708:99:0::1;25858:23;::::0;25817:65:::1;::::0;25848:8;;25817:65:::1;::::0;;;::::1;25887:23;:34:::0;25630:296::o;24221:588::-;7657:6;;-1:-1:-1;;;;;7657:6:0;7014:10;7657:22;7649:67;;;;-1:-1:-1;;;7649:67:0;;;;;;;:::i;:::-;24495:17;24478:14;24458:17;24414:41:::1;24436:19:::0;24414;:41:::1;:::i;:::-;:61;;;;:::i;:::-;:78;;;;:::i;:::-;:98;;;;:::i;:::-;24410:102;;:1;:102;24401:140;;;::::0;-1:-1:-1;;;24401:140:0;;10158:2:1;24401:140:0::1;::::0;::::1;10140:21:1::0;10197:2;10177:18;;;10170:30;10236:26;10216:18;;;10209:54;10280:18;;24401:140:0::1;9956:348:1::0;24401:140:0::1;24546:126;24570:5;24577:19;24598;24619:17;24638:14;24654:17;24546:23;:126::i;:::-;24682:122;::::0;-1:-1:-1;;;10511:28:1;;10564:2;10555:12;24682:122:0::1;10309:264:1::0;24812:321:0;7657:6;;-1:-1:-1;;;;;7657:6:0;7014:10;7657:22;7649:67;;;;-1:-1:-1;;;7649:67:0;;;;;;;:::i;:::-;24912:15:::1;::::0;-1:-1:-1;;;;;24912:15:0;;::::1;24890:38:::0;;::::1;::::0;24882:86:::1;;;::::0;-1:-1:-1;;;24882:86:0;;10780:2:1;24882:86:0::1;::::0;::::1;10762:21:1::0;10819:2;10799:18;;;10792:30;10858:34;10838:18;;;10831:62;-1:-1:-1;;;10909:18:1;;;10902:33;10952:19;;24882:86:0::1;10578:399:1::0;24882:86:0::1;25020:15;::::0;24978:59:::1;::::0;-1:-1:-1;;;;;25020:15:0;;::::1;::::0;24978:59;::::1;::::0;::::1;::::0;25020:15:::1;::::0;24978:59:::1;25042:15;:37:::0;;-1:-1:-1;;;;;;25042:37:0::1;-1:-1:-1::0;;;;;25042:37:0;;::::1;::::0;;::::1;::::0;;;25084:15:::1;::::0;:44:::1;::::0;-1:-1:-1;;;25084:44:0;;::::1;::::0;::::1;1610:51:1::0;;;;25084:15:0;;::::1;::::0;:32:::1;::::0;1583:18:1;;25084:44:0::1;1449:218:1::0;21979:274:0;7657:6;;-1:-1:-1;;;;;7657:6:0;7014:10;7657:22;7649:67;;;;-1:-1:-1;;;7649:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;22068:27:0;::::1;;::::0;;;:18:::1;:27;::::0;;;;;:39;::::1;;:27;::::0;;::::1;:39;;::::0;22060:95:::1;;;::::0;-1:-1:-1;;;22060:95:0;;11184:2:1;22060:95:0::1;::::0;::::1;11166:21:1::0;11223:2;11203:18;;;11196:30;11262:34;11242:18;;;11235:62;-1:-1:-1;;;11313:18:1;;;11306:41;11364:19;;22060:95:0::1;10982:407:1::0;22060:95:0::1;-1:-1:-1::0;;;;;22160:27:0;::::1;;::::0;;;:18:::1;:27;::::0;;;;;;;;:38;;-1:-1:-1;;22160:38:0::1;::::0;::::1;;::::0;;::::1;::::0;;;22208:40;;154:41:1;;;22208:40:0::1;::::0;127:18:1;22208:40:0::1;14:187:1::0;21774:202:0;7657:6;;-1:-1:-1;;;;;7657:6:0;7014:10;7657:22;7649:67;;;;-1:-1:-1;;;7649:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;21863:38:0;::::1;;::::0;;;:29:::1;:38;::::0;;;;;;;;:48;;-1:-1:-1;;21863:48:0::1;::::0;::::1;;::::0;;::::1;::::0;;;21921:50;;154:41:1;;;21921:50:0::1;::::0;127:18:1;21921:50:0::1;14:187:1::0;23023:614:0;7657:6;;-1:-1:-1;;;;;7657:6:0;7014:10;7657:22;7649:67;;;;-1:-1:-1;;;7649:67:0;;;;;;;:::i;:::-;23126:15:::1;::::0;-1:-1:-1;;;;;23126:37:0;;::::1;:15:::0;::::1;:37;23123:251;;-1:-1:-1::0;;;;;23179:32:0;::::1;23171:76;;;::::0;-1:-1:-1;;;23171:76:0;;11596:2:1;23171:76:0::1;::::0;::::1;11578:21:1::0;11635:2;11615:18;;;11608:30;11674:33;11654:18;;;11647:61;11725:18;;23171:76:0::1;11394:355:1::0;23171:76:0::1;23310:15;::::0;23258:68:::1;::::0;-1:-1:-1;;;11956:30:1;;-1:-1:-1;;;;;23310:15:0;;::::1;::::0;23258:68;::::1;::::0;12011:2:1;12002:12;23258:68:0::1;::::0;;;;::::1;::::0;;;::::1;::::0;;;::::1;23332:15;:36:::0;;-1:-1:-1;;;;;;23332:36:0::1;-1:-1:-1::0;;;;;23332:36:0;::::1;;::::0;;23123:251:::1;23381:15;::::0;-1:-1:-1;;;;;23381:37:0;;::::1;:15:::0;::::1;:37;23378:251;;-1:-1:-1::0;;;;;23434:32:0;::::1;23426:76;;;::::0;-1:-1:-1;;;23426:76:0;;12227:2:1;23426:76:0::1;::::0;::::1;12209:21:1::0;12266:2;12246:18;;;12239:30;12305:33;12285:18;;;12278:61;12356:18;;23426:76:0::1;12025:355:1::0;23426:76:0::1;23565:15;::::0;23513:68:::1;::::0;-1:-1:-1;;;12587:30:1;;-1:-1:-1;;;;;23565:15:0;;::::1;::::0;23513:68;::::1;::::0;12642:2:1;12633:12;23513:68:0::1;::::0;;;;::::1;::::0;;;::::1;::::0;;;::::1;23587:15;:36:::0;;-1:-1:-1;;;;;23587:36:0;::::1;-1:-1:-1::0;;;;;;23587:36:0;;::::1;;::::0;;23023:614;;:::o;26818:323::-;7657:6;;-1:-1:-1;;;;;7657:6:0;7014:10;7657:22;7649:67;;;;-1:-1:-1;;;7649:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;26916:35:0;::::1;::::0;;::::1;::::0;:72:::1;;-1:-1:-1::0;26978:10:0::1;::::0;-1:-1:-1;;;;;26955:33:0;;::::1;26978:10:::0;::::1;26955:33;;26916:72;26908:127;;;::::0;-1:-1:-1;;;26908:127:0;;12858:2:1;26908:127:0::1;::::0;::::1;12840:21:1::0;12897:2;12877:18;;;12870:30;12936:34;12916:18;;;12909:62;-1:-1:-1;;;12987:18:1;;;12980:40;13037:19;;26908:127:0::1;12656:406:1::0;26908:127:0::1;27046:10;:32:::0;;-1:-1:-1;;;;;;27046:32:0::1;-1:-1:-1::0;;;;;27046:32:0;::::1;::::0;;::::1;::::0;;;27088:45:::1;::::0;1610:51:1;;;27088:45:0::1;::::0;1598:2:1;1583:18;27088:45:0::1;;;;;;;26818:323:::0;:::o;26482:153::-;19246:10;;26582:4;;-1:-1:-1;;;;;19246:10:0;19232;:24;19224:83;;;;-1:-1:-1;;;19224:83:0;;13269:2:1;19224:83:0;;;13251:21:1;13308:2;13288:18;;;13281:30;13347:34;13327:18;;;13320:62;-1:-1:-1;;;13398:18:1;;;13391:44;13452:19;;19224:83:0;13067:410:1;19224:83:0;26593:21:::1;26599:7;26608:5;26593;:21::i;7870:223::-:0;7657:6;;-1:-1:-1;;;;;7657:6:0;7014:10;7657:22;7649:67;;;;-1:-1:-1;;;7649:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;7953:22:0;::::1;7945:73;;;::::0;-1:-1:-1;;;7945:73:0;;13684:2:1;7945:73:0::1;::::0;::::1;13666:21:1::0;13723:2;13703:18;;;13696:30;13762:34;13742:18;;;13735:62;-1:-1:-1;;;13813:18:1;;;13806:36;13859:19;;7945:73:0::1;13482:402:1::0;7945:73:0::1;8049:6;::::0;;8028:38:::1;::::0;-1:-1:-1;;;;;8028:38:0;;::::1;::::0;8049:6;::::1;::::0;8028:38:::1;::::0;::::1;8071:6;:17:::0;;-1:-1:-1;;;;;;8071:17:0::1;-1:-1:-1::0;;;;;8071:17:0;;;::::1;::::0;;;::::1;::::0;;7870:223::o;2655:160::-;2713:7;;2739:5;2743:1;2739;:5;:::i;:::-;2727:17;;2762:1;2757;:6;;2749:46;;;;-1:-1:-1;;;2749:46:0;;14224:2:1;2749:46:0;;;14206:21:1;14263:2;14243:18;;;14236:30;14302:29;14282:18;;;14275:57;14349:18;;2749:46:0;14022:351:1;2749:46:0;2809:1;2655:160;-1:-1:-1;;;2655:160:0:o;11512:330::-;-1:-1:-1;;;;;11621:19:0;;11613:68;;;;-1:-1:-1;;;11613:68:0;;14580:2:1;11613:68:0;;;14562:21:1;14619:2;14599:18;;;14592:30;14658:34;14638:18;;;14631:62;-1:-1:-1;;;14709:18:1;;;14702:34;14753:19;;11613:68:0;14378:400:1;11613:68:0;-1:-1:-1;;;;;11694:21:0;;11686:68;;;;-1:-1:-1;;;11686:68:0;;14985:2:1;11686:68:0;;;14967:21:1;15024:2;15004:18;;;14997:30;15063:34;15043:18;;;15036:62;-1:-1:-1;;;15114:18:1;;;15107:32;15156:19;;11686:68:0;14783:398:1;11686:68:0;-1:-1:-1;;;;;11759:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;11805:32;;1818:25:1;;;11805:32:0;;1791:18:1;11805:32:0;;;;;;;;11512:330;;;:::o;28144:2175::-;-1:-1:-1;;;;;28251:18:0;;28243:68;;;;-1:-1:-1;;;28243:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;28325:16:0;;28317:64;;;;-1:-1:-1;;;28317:64:0;;;;;;;:::i;:::-;28392:6;28402:1;28392:11;28389:71;;28412:28;28428:4;28434:2;28438:1;28412:15;:28::i;:::-;28144:2175;;;:::o;28389:71::-;-1:-1:-1;;;;;28486:31:0;;;28467:16;28486:31;;;:25;:31;;;;;;;;;28541:29;;;;;;;;;28582:35;;;:29;:35;;;;;;28486:31;;;;;28541:29;;;;28582:35;28581:36;:74;;;;-1:-1:-1;;;;;;28622:33:0;;;;;;:29;:33;;;;;;;;28621:34;28581:74;28578:660;;;28672:16;;-1:-1:-1;;;28672:16:0;;;;28664:59;;;;-1:-1:-1;;;28664:59:0;;16198:2:1;28664:59:0;;;16180:21:1;16237:2;16217:18;;;16210:30;16276:32;16256:18;;;16249:60;16326:18;;28664:59:0;15996:354:1;28664:59:0;-1:-1:-1;;;;;28735:38:0;;;;;;:34;:38;;;;;;;;28734:39;:84;;;;-1:-1:-1;;;;;;28778:40:0;;;;;;:34;:40;;;;;;;;28777:41;28734:84;28730:333;;;28836:11;28832:110;;;28875:15;;28865:6;:25;;28857:76;;;;-1:-1:-1;;;28857:76:0;;16557:2:1;28857:76:0;;;16539:21:1;16596:2;16576:18;;;16569:30;16635:34;16615:18;;;16608:62;-1:-1:-1;;;16686:18:1;;;16679:36;16732:19;;28857:76:0;16355:402:1;28857:76:0;28953:10;28949:107;;;28992:11;;28982:6;:21;;28974:73;;;;-1:-1:-1;;;28974:73:0;;16964:2:1;28974:73:0;;;16946:21:1;17003:2;16983:18;;;16976:30;17042:34;17022:18;;;17015:62;-1:-1:-1;;;17093:18:1;;;17086:37;17140:19;;28974:73:0;16762:403:1;28974:73:0;-1:-1:-1;;;;;29074:33:0;;;;;;:29;:33;;;;;;;;29069:163;;29153:15;;29142:6;29126:13;29136:2;-1:-1:-1;;;;;8982:18:0;8961:7;8982:18;;;:9;:18;;;;;;;8887:118;29126:13;:22;;;;:::i;:::-;29125:43;;29117:107;;;;-1:-1:-1;;;29117:107:0;;17372:2:1;29117:107:0;;;17354:21:1;17411:2;17391:18;;;17384:30;17450:34;17430:18;;;17423:62;-1:-1:-1;;;17501:18:1;;;17494:49;17560:19;;29117:107:0;17170:415:1;29117:107:0;29245:37;29258:11;29271:10;29245:12;:37::i;:::-;29331:23;;29321:4;29288:12;8982:18;;;:9;:18;;;;;;29372:16;;-1:-1:-1;;29303:51:0;;-1:-1:-1;;;29372:16:0;;;;:32;;;;;29397:7;29372:32;:51;;;;-1:-1:-1;29414:9:0;;;;29413:10;29372:51;:73;;;;-1:-1:-1;29432:9:0;;-1:-1:-1;;;29432:9:0;;;;:13;;29372:73;:111;;;;-1:-1:-1;;;;;;29454:29:0;;;;;;:25;:29;;;;;;;;29372:111;29362:206;;;29497:9;:16;;-1:-1:-1;;29497:16:0;29509:4;29497:16;;;29520:17;:15;:17::i;:::-;29544:9;:17;;-1:-1:-1;;29544:17:0;;;29362:206;29591:9;;29575:12;;29591:9;;29590:10;:30;;;;-1:-1:-1;29604:16:0;;-1:-1:-1;;;29604:16:0;;;;29590:30;-1:-1:-1;;;;;29631:24:0;;;;;;:18;:24;;;;;;29575:45;;-1:-1:-1;29631:24:0;;;:50;;-1:-1:-1;;;;;;29659:22:0;;;;;;:18;:22;;;;;;;;29631:50;29628:83;;;-1:-1:-1;29699:5:0;29628:83;29720:7;:24;;;;-1:-1:-1;29731:9:0;;-1:-1:-1;;;29731:9:0;;;;:13;;29720:24;29716:392;;;29776:9;;29753:11;;29788:3;;29767:18;;-1:-1:-1;;;29776:9:0;;;;29767:6;:18;:::i;:::-;:24;;;;:::i;:::-;29840:8;;29753:38;;-1:-1:-1;29810:18:0;;29851:3;;29831:17;;29840:8;;;;;29831:6;:17;:::i;:::-;:23;;;;:::i;:::-;29810:44;-1:-1:-1;29870:12:0;29879:3;29870:6;:12;:::i;:::-;29861:21;;29889:41;29905:4;29919;29926:3;29889:15;:41::i;:::-;29955:14;;29951:151;;29994:38;30014:4;30021:10;29994:11;:38::i;:::-;30070:8;;30060:31;;;30070:8;;;;;;18320:36:1;;18387:2;18372:18;;18365:34;;;30060:31:0;;18293:18:1;30060:31:0;;;;;;;29951:151;29746:362;;29716:392;30113:33;30129:4;30135:2;30139:6;30113:15;:33::i;:::-;30167:15;;-1:-1:-1;;;;;30167:15:0;:26;30202:4;30209:15;30202:4;-1:-1:-1;;;;;8982:18:0;8961:7;8982:18;;;:9;:18;;;;;;;8887:118;30209:15;30167:58;;-1:-1:-1;;;;;;30167:58:0;;;;;;;-1:-1:-1;;;;;18618:32:1;;;30167:58:0;;;18600:51:1;18667:18;;;18660:34;18573:18;;30167:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30163:74;30249:15;;-1:-1:-1;;;;;30249:15:0;:26;30284:2;30289:13;30284:2;-1:-1:-1;;;;;8982:18:0;8961:7;8982:18;;;:9;:18;;;;;;;8887:118;30289:13;30249:54;;-1:-1:-1;;;;;;30249:54:0;;;;;;;-1:-1:-1;;;;;18618:32:1;;;30249:54:0;;;18600:51:1;18667:18;;;18660:34;18573:18;;30249:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30245:70;28237:2082;;;;28144:2175;;;:::o;2952:171::-;3038:7;3068:12;3060:6;;;;3052:29;;;;-1:-1:-1;;;3052:29:0;;;;;;;;:::i;:::-;-1:-1:-1;3086:9:0;3098:5;3102:1;3098;:5;:::i;:::-;3086:17;2952:171;-1:-1:-1;;;;;2952:171:0:o;11126:381::-;-1:-1:-1;;;;;11204:21:0;;11196:67;;;;-1:-1:-1;;;11196:67:0;;18907:2:1;11196:67:0;;;18889:21:1;18946:2;18926:18;;;18919:30;18985:34;18965:18;;;18958:62;-1:-1:-1;;;19036:18:1;;;19029:31;19077:19;;11196:67:0;18705:397:1;11196:67:0;11343:68;11366:6;11343:68;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;11343:18:0;;;;;;:9;:18;;;;;;;:68;:22;:68::i;:::-;-1:-1:-1;;;;;11322:18:0;;;;;;:9;:18;;;;;:89;11431:12;;:24;;11448:6;11431:16;:24::i;:::-;11416:12;:39;11465:37;;1818:25:1;;;11491:1:0;;-1:-1:-1;;;;;11465:37:0;;;;;1806:2:1;1791:18;11465:37:0;;;;;;;;11126:381;;:::o;32754:1258::-;32978:21;;;;:43;;;;:21;;:43;32974:215;;33034:101;;-1:-1:-1;;;19309:32:1;;19366:2;19357:12;33034:101:0;;;;;;;;33076:21;;;;33120:14;;33034:101;;33076:21;;;;;33034:101;;;;-1:-1:-1;;;;;;;;;;;33034:101:0;;;33120:14;;;33034:101;:::i;:::-;;;;;;;;33141:21;;;:42;;-1:-1:-1;;33141:42:0;;;;;;;32974:215;33197:21;;;;:43;;;;:21;;;;;:43;33193:215;;33253:101;;-1:-1:-1;;;19796:32:1;;19853:2;19844:12;33253:101:0;;;;;;;;33295:21;;;;33339:14;;33253:101;;33295:21;;;;;;;;33253:101;;;;-1:-1:-1;;;;;;;;;;;33253:101:0;;;33339:14;;;33253:101;:::i;:::-;;;;;;;;33360:21;;;:42;;-1:-1:-1;;33360:42:0;;;;;;;;;33193:215;33416:19;;;;:39;;;;-1:-1:-1;;;33416:19:0;;;;:39;33412:201;;33468:95;;-1:-1:-1;;;20069:30:1;;20124:2;20115:12;33468:95:0;;;;;;;;33508:19;;;;33548:14;;33468:95;;33508:19;-1:-1:-1;;;33508:19:0;;;;;;33468:95;;;;-1:-1:-1;;;;;;;;;;;33468:95:0;;;33548:14;;;33468:95;:::i;:::-;;;;;;;;33569:19;;;:38;;-1:-1:-1;;33569:38:0;-1:-1:-1;;;33569:38:0;;;;;;;33412:201;33627:16;;;;:33;;;;-1:-1:-1;;;33627:16:0;;;;:33;33623:180;;33673:86;;-1:-1:-1;;;20340:27:1;;20392:2;20383:12;33673:86:0;;;;;;;;33710:16;;;;33744:14;;33673:86;;33710:16;-1:-1:-1;;;33710:16:0;;;;;;33673:86;;;;-1:-1:-1;;;;;;;;;;;33673:86:0;;;33744:14;;;33673:86;:::i;:::-;;;;;;;;33765:16;;;:32;;-1:-1:-1;;33765:32:0;-1:-1:-1;;;33765:32:0;;;;;;;33623:180;33811:19;;;;:39;;;;-1:-1:-1;;;33811:19:0;;;;:39;33807:201;;33863:95;;-1:-1:-1;;;20608:30:1;;20663:2;20654:12;33863:95:0;;;;;;;;33903:19;;;;33943:14;;33863:95;;33903:19;-1:-1:-1;;;33903:19:0;;;;;;33863:95;;;;-1:-1:-1;;;;;;;;;;;33863:95:0;;;33943:14;;;33863:95;:::i;:::-;;;;;;;;33964:19;;;:38;;-1:-1:-1;;33964:38:0;-1:-1:-1;;;33964:38:0;;;;;;;33807:201;32754:1258;;;;;;:::o;31453:1298::-;31682:22;;;;:45;;;;:22;;;;;:45;31678:222;;31740:104;;-1:-1:-1;;;20879:33:1;;20937:2;20928:12;31740:104:0;;;;;;;;31783:22;;;;31829:14;;31740:104;;31783:22;;;;;;;;31740:104;;;;-1:-1:-1;;;;;;;;;;;31740:104:0;;;31829:14;;;31740:104;:::i;:::-;;;;;;;;31850:22;;;:44;;-1:-1:-1;;31850:44:0;;;;;;;;;31678:222;31908:22;;;;:45;;;;:22;;;;;:45;31904:222;;31966:104;;-1:-1:-1;;;21153:33:1;;21211:2;21202:12;31966:104:0;;;;;;;;32009:22;;;;32055:14;;31966:104;;32009:22;;;;;;;;31966:104;;;;-1:-1:-1;;;;;;;;;;;31966:104:0;;;32055:14;;;31966:104;:::i;:::-;;;;;;;;32076:22;;;:44;;-1:-1:-1;;32076:44:0;;;;;;;;;31904:222;32134:20;;;;:41;;;;-1:-1:-1;;;32134:20:0;;;;:41;32130:208;;32188:98;;-1:-1:-1;;;21427:31:1;;21483:2;21474:12;32188:98:0;;;;;;;;32229:20;;;;32271:14;;32188:98;;32229:20;-1:-1:-1;;;32229:20:0;;;;;;32188:98;;;;-1:-1:-1;;;;;;;;;;;32188:98:0;;;32271:14;;;32188:98;:::i;:::-;;;;;;;;32292:20;;;:40;;-1:-1:-1;;32292:40:0;-1:-1:-1;;;32292:40:0;;;;;;;32130:208;32352:17;;;;:35;;;;-1:-1:-1;;;32352:17:0;;;;:35;32348:187;;32400:89;;-1:-1:-1;;;21699:28:1;;21752:2;21743:12;32400:89:0;;;;;;;;32438:17;;;;32474:14;;32400:89;;32438:17;-1:-1:-1;;;32438:17:0;;;;;;32400:89;;;;-1:-1:-1;;;;;;;;;;;32400:89:0;;;32474:14;;;32400:89;:::i;:::-;;;;;;;;32495:17;;;:34;;-1:-1:-1;;32495:34:0;-1:-1:-1;;;32495:34:0;;;;;;;32348:187;32543:20;;;;:41;;;;-1:-1:-1;;;32543:20:0;;;;:41;32539:208;;32597:98;;-1:-1:-1;;;21968:31:1;;22024:2;22015:12;32597:98:0;;;;;;;;32638:20;;;;32680:14;;32597:98;;32638:20;-1:-1:-1;;;32638:20:0;;;;;;32597:98;;;;-1:-1:-1;;;;;;;;;;;32597:98:0;;;32680:14;;;32597:98;:::i;:::-;;;;;;;;32701:20;;;:40;;;;;-1:-1:-1;;;32701:40:0;-1:-1:-1;;32701:40:0;;;;;;31453:1298;;;;;;:::o;10780:341::-;-1:-1:-1;;;;;10858:21:0;;10850:65;;;;-1:-1:-1;;;10850:65:0;;22240:2:1;10850:65:0;;;22222:21:1;22279:2;22259:18;;;22252:30;22318:33;22298:18;;;22291:61;22369:18;;10850:65:0;22038:355:1;10850:65:0;10989:12;;:24;;11006:6;10989:16;:24::i;:::-;10974:12;:39;-1:-1:-1;;;;;11039:18:0;;;;;;:9;:18;;;;;;:30;;11062:6;11039:22;:30::i;:::-;-1:-1:-1;;;;;11018:18:0;;;;;;:9;:18;;;;;;:51;;;;11079:37;;11018:18;;;11079:37;;;;11109:6;1818:25:1;;1806:2;1791:18;;1672:177;10266:509:0;-1:-1:-1;;;;;10379:20:0;;10371:70;;;;-1:-1:-1;;;10371:70:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;10454:23:0;;10446:71;;;;-1:-1:-1;;;10446:71:0;;;;;;;:::i;:::-;10594;10616:6;10594:71;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;10594:17:0;;;;;;:9;:17;;;;;;;:71;:21;:71::i;:::-;-1:-1:-1;;;;;10574:17:0;;;;;;;:9;:17;;;;;;:91;;;;10693:20;;;;;;;:32;;10718:6;10693:24;:32::i;:::-;-1:-1:-1;;;;;10670:20:0;;;;;;;:9;:20;;;;;;;:55;;;;10735:35;;;;;;;;;;10763:6;1818:25:1;;1806:2;1791:18;;1672:177;30322:1128:0;30392:13;:17;;-1:-1:-1;;30479:15:0;;;30501:239;;;;30540:23;;30524:13;:39;;30540:23;;;;-1:-1:-1;;30569:39:0;;;;;;;30540:23;30585;;;;;;30569:39;;;;;;;;-1:-1:-1;;30664:29:0;-1:-1:-1;;;30628:21:0;;;;;30614:35;;;;-1:-1:-1;;30664:29:0;;-1:-1:-1;;;30675:18:0;;;;30664:29;;;-1:-1:-1;;30699:35:0;-1:-1:-1;;;30713:21:0;;;;;;;30699:35;;;;;;;30501:239;30751:10;30747:246;;;30788:24;;30772:13;:40;;30788:24;;;;;;;;-1:-1:-1;;30818:40:0;;;;;;;30834:24;;;;;;30818:40;;;;;-1:-1:-1;;30915:30:0;-1:-1:-1;;;30878:22:0;;;;30864:36;;-1:-1:-1;;30915:30:0;;-1:-1:-1;;;30926:19:0;;;;30915:30;;;;;-1:-1:-1;;30951:36:0;-1:-1:-1;;;30965:22:0;;;;-1:-1:-1;;;30951:36:0;;;;;;;30747:246;31008:10;31007:11;:27;;;;;31023:11;31022:12;31007:27;31003:260;;;31058:24;;31042:13;:40;;31058:24;;;;;;;;-1:-1:-1;;31088:40:0;;;;;;;31104:24;;;;;;31088:40;;;;;-1:-1:-1;;31185:30:0;-1:-1:-1;;;31148:22:0;;;;31134:36;;-1:-1:-1;;31185:30:0;;-1:-1:-1;;;31196:19:0;;;;31185:30;;;;;-1:-1:-1;;31221:36:0;-1:-1:-1;;;31235:22:0;;;;-1:-1:-1;;;31221:36:0;;;;;;;31003:260;31336:11;;;-1:-1:-1;;;31336:11:0;;;;;31325:8;;;;;;31311:11;;;;;;31279:29;;31336:11;31295:13;;;;;31279;:29;:::i;:::-;:43;;;;:::i;:::-;:54;;;;:::i;:::-;:68;;;;:::i;:::-;31267:9;:80;;-1:-1:-1;;31267:80:0;;-1:-1:-1;;;31267:80:0;;;;;;;;;;;;;31357:88;;;31369:13;;;;;;;;;;22684:34:1;;31267:80:0;31384:13;;;;22749:2:1;22734:18;;22727:43;31399:11:0;;;;;22786:18:1;;;22779:43;;;;31412:8:0;;;;;22853:2:1;22838:18;;22831:43;-1:-1:-1;;;31422:11:0;;;;22905:3:1;22890:19;;22883:44;31435:9:0;;;;;;22958:3:1;22943:19;;22936:44;31357:88:0;;22648:3:1;22633:19;31357:88:0;22398:588:1;34015:1242:0;34099:4;34055:23;8982:18;;;:9;:18;;;;;;34226:9;;8982:18;;34138:21;;34238:1;;34226:9;-1:-1:-1;;;34226:9:0;;;;;34192:31;;34210:13;8982:18;34192:31;:::i;:::-;:43;;;;:::i;:::-;:47;;;;:::i;:::-;34309:9;;34166:73;;-1:-1:-1;34250:24:0;;34309:9;-1:-1:-1;;;34309:9:0;;;;;34277:29;;-1:-1:-1;;;34295:11:0;;;;34277:15;:29;:::i;:::-;:41;;;;:::i;:::-;34250:68;-1:-1:-1;34323:20:0;34365:34;34250:68;34365:15;:34;:::i;:::-;34346:54;;:15;:54;:::i;:::-;34323:77;;34407:31;34425:12;34407:17;:31::i;:::-;34445:27;34475:42;34500:17;34475:21;:42;:::i;:::-;34590:11;;34445:72;;-1:-1:-1;34522:19:0;;34590:11;-1:-1:-1;;;34590:11:0;;;;;34579:8;;;;;;34558:17;;34574:1;;34558:13;:17;:::i;:::-;34557:30;;;;:::i;:::-;:44;;;;:::i;:::-;34544:9;;:58;;;-1:-1:-1;;;34544:9:0;;;;:58;:::i;:::-;34658:13;;34522:80;;;;;-1:-1:-1;34607:26:0;;34688:1;;34522:80;;34636:35;;34658:13;34636:19;:35;:::i;:::-;:49;;;;:::i;:::-;:53;;;;:::i;:::-;34751:13;;34607:82;;-1:-1:-1;34700:26:0;;34767:11;;34729:35;;34751:13;;;;;34729:19;:35;:::i;:::-;:49;;;;:::i;:::-;34800:15;;34792:53;;34700:78;;-1:-1:-1;;;;;;34800:15:0;;34792:53;;;;;34700:78;;34800:15;34792:53;34800:15;34792:53;34700:78;34800:15;34792:53;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34856:19:0;;34852:169;;34883:50;34897:15;34914:18;34883:13;:50::i;:::-;34944:65;;;23563:25:1;;;23619:2;23604:18;;23597:34;;;23647:18;;;23640:34;;;34944:65:0;;23551:2:1;23536:18;34944:65:0;;;;;;;34852:169;35083:15;;35044:74;;-1:-1:-1;;;35044:74:0;;-1:-1:-1;;;;;35083:15:0;;;35044:74;;;18600:51:1;18667:18;;;18660:34;;;35028:12:0;;35059:4;;35044:30;;18573:18:1;;35044:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35027:91;;35126:7;35123:130;;;35141:15;;:64;;-1:-1:-1;;;35141:64:0;;;;;1818:25:1;;;-1:-1:-1;;;;;35141:15:0;;;;:46;;1791:18:1;;35141:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35216:31;35230:16;35216:31;;;;1818:25:1;;1806:2;1791:18;;1672:177;35216:31:0;;;;;;;;35123:130;34050:1207;;;;;;;;;;34015:1242::o;2820:127::-;2878:7;2899:43;2903:1;2906;2899:43;;;;;;;;;;;;;;;;;:3;:43::i;35260:416::-;35345:16;;;35359:1;35345:16;;;;;;;;35321:21;;35345:16;;;;;;;;;;-1:-1:-1;35345:16:0;35321:40;;35384:4;35366;35371:1;35366:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;35366:23:0;;;:7;;;;;;;;;;:23;;;;35404:15;;:22;;;-1:-1:-1;;;35404:22:0;;;;:15;;;;;:20;;:22;;;;;35366:7;;35404:22;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35394:4;35399:1;35394:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;35394:32:0;;;:7;;;;;;;;;:32;35463:15;;35431:62;;35448:4;;35463:15;35481:11;35431:8;:62::i;:::-;35498:15;;:173;;-1:-1:-1;;;35498:173:0;;-1:-1:-1;;;;;35498:15:0;;;;:66;;:173;;35570:11;;35498:15;;35622:4;;35640;;35651:15;;35498:173;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35679:348;35787:15;;35755:62;;35772:4;;-1:-1:-1;;;;;35787:15:0;35805:11;35755:8;:62::i;:::-;35822:15;;35981;;35822:200;;-1:-1:-1;;;35822:200:0;;35885:4;35822:200;;;25810:34:1;25860:18;;;25853:34;;;35822:15:0;25903:18:1;;;25896:34;;;25946:18;;;25939:34;-1:-1:-1;;;;;35981:15:0;;;25989:19:1;;;25982:44;36002:15:0;26042:19:1;;;26035:35;35822:15:0;;;:31;;35861:9;;25744:19:1;;35822:200:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;206:597:1:-;318:4;347:2;376;365:9;358:21;408:6;402:13;451:6;446:2;435:9;431:18;424:34;476:1;486:140;500:6;497:1;494:13;486:140;;;595:14;;;591:23;;585:30;561:17;;;580:2;557:26;550:66;515:10;;486:140;;;644:6;641:1;638:13;635:91;;;714:1;709:2;700:6;689:9;685:22;681:31;674:42;635:91;-1:-1:-1;787:2:1;766:15;-1:-1:-1;;762:29:1;747:45;;;;794:2;743:54;;206:597;-1:-1:-1;;;206:597:1:o;808:131::-;-1:-1:-1;;;;;883:31:1;;873:42;;863:70;;929:1;926;919:12;944:315;1012:6;1020;1073:2;1061:9;1052:7;1048:23;1044:32;1041:52;;;1089:1;1086;1079:12;1041:52;1128:9;1115:23;1147:31;1172:5;1147:31;:::i;:::-;1197:5;1249:2;1234:18;;;;1221:32;;-1:-1:-1;;;944:315:1:o;1264:180::-;1323:6;1376:2;1364:9;1355:7;1351:23;1347:32;1344:52;;;1392:1;1389;1382:12;1344:52;-1:-1:-1;1415:23:1;;1264:180;-1:-1:-1;1264:180:1:o;1854:456::-;1931:6;1939;1947;2000:2;1988:9;1979:7;1975:23;1971:32;1968:52;;;2016:1;2013;2006:12;1968:52;2055:9;2042:23;2074:31;2099:5;2074:31;:::i;:::-;2124:5;-1:-1:-1;2181:2:1;2166:18;;2153:32;2194:33;2153:32;2194:33;:::i;:::-;1854:456;;2246:7;;-1:-1:-1;;;2300:2:1;2285:18;;;;2272:32;;1854:456::o;2741:247::-;2800:6;2853:2;2841:9;2832:7;2828:23;2824:32;2821:52;;;2869:1;2866;2859:12;2821:52;2908:9;2895:23;2927:31;2952:5;2927:31;:::i;3201:118::-;3287:5;3280:13;3273:21;3266:5;3263:32;3253:60;;3309:1;3306;3299:12;3324:382;3389:6;3397;3450:2;3438:9;3429:7;3425:23;3421:32;3418:52;;;3466:1;3463;3456:12;3418:52;3505:9;3492:23;3524:31;3549:5;3524:31;:::i;:::-;3574:5;-1:-1:-1;3631:2:1;3616:18;;3603:32;3644:30;3603:32;3644:30;:::i;:::-;3693:7;3683:17;;;3324:382;;;;;:::o;3711:156::-;3777:20;;3837:4;3826:16;;3816:27;;3806:55;;3857:1;3854;3847:12;3806:55;3711:156;;;:::o;3872:464::-;3957:6;3965;3973;3981;3989;4042:3;4030:9;4021:7;4017:23;4013:33;4010:53;;;4059:1;4056;4049:12;4010:53;4082:27;4099:9;4082:27;:::i;:::-;4072:37;;4128:36;4160:2;4149:9;4145:18;4128:36;:::i;:::-;4118:46;;4183:36;4215:2;4204:9;4200:18;4183:36;:::i;:::-;4173:46;;4238:36;4270:2;4259:9;4255:18;4238:36;:::i;:::-;4228:46;;4293:37;4325:3;4314:9;4310:19;4293:37;:::i;:::-;4283:47;;3872:464;;;;;;;;:::o;4844:388::-;4912:6;4920;4973:2;4961:9;4952:7;4948:23;4944:32;4941:52;;;4989:1;4986;4979:12;4941:52;5028:9;5015:23;5047:31;5072:5;5047:31;:::i;:::-;5097:5;-1:-1:-1;5154:2:1;5139:18;;5126:32;5167:33;5126:32;5167:33;:::i;5237:380::-;5316:1;5312:12;;;;5359;;;5380:61;;5434:4;5426:6;5422:17;5412:27;;5380:61;5487:2;5479:6;5476:14;5456:18;5453:38;5450:161;;5533:10;5528:3;5524:20;5521:1;5514:31;5568:4;5565:1;5558:15;5596:4;5593:1;5586:15;5450:161;;5237:380;;;:::o;5622:356::-;5824:2;5806:21;;;5843:18;;;5836:30;5902:34;5897:2;5882:18;;5875:62;5969:2;5954:18;;5622:356::o;7420:184::-;7490:6;7543:2;7531:9;7522:7;7518:23;7514:32;7511:52;;;7559:1;7556;7549:12;7511:52;-1:-1:-1;7582:16:1;;7420:184;-1:-1:-1;7420:184:1:o;7914:245::-;7981:6;8034:2;8022:9;8013:7;8009:23;8005:32;8002:52;;;8050:1;8047;8040:12;8002:52;8082:9;8076:16;8101:28;8123:5;8101:28;:::i;8164:406::-;8366:2;8348:21;;;8405:2;8385:18;;;8378:30;8444:34;8439:2;8424:18;;8417:62;-1:-1:-1;;;8510:2:1;8495:18;;8488:40;8560:3;8545:19;;8164:406::o;8575:127::-;8636:10;8631:3;8627:20;8624:1;8617:31;8667:4;8664:1;8657:15;8691:4;8688:1;8681:15;8707:204;8745:3;8781:4;8778:1;8774:12;8813:4;8810:1;8806:12;8848:3;8842:4;8838:14;8833:3;8830:23;8827:49;;;8856:18;;:::i;:::-;8892:13;;8707:204;-1:-1:-1;;;8707:204:1:o;13889:128::-;13929:3;13960:1;13956:6;13953:1;13950:13;13947:39;;;13966:18;;:::i;:::-;-1:-1:-1;14002:9:1;;13889:128::o;15186:401::-;15388:2;15370:21;;;15427:2;15407:18;;;15400:30;15466:34;15461:2;15446:18;;15439:62;-1:-1:-1;;;15532:2:1;15517:18;;15510:35;15577:3;15562:19;;15186:401::o;15592:399::-;15794:2;15776:21;;;15833:2;15813:18;;;15806:30;15872:34;15867:2;15852:18;;15845:62;-1:-1:-1;;;15938:2:1;15923:18;;15916:33;15981:3;15966:19;;15592:399::o;17590:168::-;17630:7;17696:1;17692;17688:6;17684:14;17681:1;17678:21;17673:1;17666:9;17659:17;17655:45;17652:71;;;17703:18;;:::i;:::-;-1:-1:-1;17743:9:1;;17590:168::o;17763:127::-;17824:10;17819:3;17815:20;17812:1;17805:31;17855:4;17852:1;17845:15;17879:4;17876:1;17869:15;17895:120;17935:1;17961;17951:35;;17966:18;;:::i;:::-;-1:-1:-1;18000:9:1;;17895:120::o;18020:125::-;18060:4;18088:1;18085;18082:8;18079:34;;;18093:18;;:::i;:::-;-1:-1:-1;18130:9:1;;18020:125::o;19380:209::-;-1:-1:-1;;19544:38:1;;;;19526:57;;19514:2;19499:18;;19380:209::o;22991:165::-;23029:1;23063:4;23060:1;23056:12;23087:3;23077:37;;23094:18;;:::i;:::-;23146:3;23139:4;23136:1;23132:12;23128:22;23123:27;;;22991:165;;;;:::o;23161:195::-;23199:4;23236;23233:1;23229:12;23268:4;23265:1;23261:12;23293:3;23288;23285:12;23282:38;;;23300:18;;:::i;:::-;23337:13;;;23161:195;-1:-1:-1;;;23161:195:1:o;24096:127::-;24157:10;24152:3;24148:20;24145:1;24138:31;24188:4;24185:1;24178:15;24212:4;24209:1;24202:15;24228:251;24298:6;24351:2;24339:9;24330:7;24326:23;24322:32;24319:52;;;24367:1;24364;24357:12;24319:52;24399:9;24393:16;24418:31;24443:5;24418:31;:::i;24484:980::-;24746:4;24794:3;24783:9;24779:19;24825:6;24814:9;24807:25;24851:2;24889:6;24884:2;24873:9;24869:18;24862:34;24932:3;24927:2;24916:9;24912:18;24905:31;24956:6;24991;24985:13;25022:6;25014;25007:22;25060:3;25049:9;25045:19;25038:26;;25099:2;25091:6;25087:15;25073:29;;25120:1;25130:195;25144:6;25141:1;25138:13;25130:195;;;25209:13;;-1:-1:-1;;;;;25205:39:1;25193:52;;25300:15;;;;25265:12;;;;25241:1;25159:9;25130:195;;;-1:-1:-1;;;;;;;25381:32:1;;;;25376:2;25361:18;;25354:60;-1:-1:-1;;;25445:3:1;25430:19;25423:35;25342:3;24484:980;-1:-1:-1;;;24484:980:1:o;26081:306::-;26169:6;26177;26185;26238:2;26226:9;26217:7;26213:23;26209:32;26206:52;;;26254:1;26251;26244:12;26206:52;26283:9;26277:16;26267:26;;26333:2;26322:9;26318:18;26312:25;26302:35;;26377:2;26366:9;26362:18;26356:25;26346:35;;26081:306;;;;;:::o

Swarm Source

ipfs://cc53c09e095c4d7d858d0c6480f096afb73cea96092dc7e7b04f969c4d233c74
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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