ETH Price: $3,402.74 (+2.42%)
Gas: 5 Gwei

Token

JigsawToken (JIGSAW)
 

Overview

Max Total Supply

1,000,000,000 JIGSAW

Holders

282

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
0.350000000001609113 JIGSAW

Value
$0.00
0x729aac9048dd6c07d30e589087360ef1934b3a2c
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.

Contract Source Code Verified (Exact Match)

Contract Name:
JigsawToken

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-07-14
*/

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

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 IterableMapping {
	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 JigsawToken is ERC20, Ownable {
	using IterableMapping for IterableMapping.Map;

	IRouter public uniswapV2Router;
	address public immutable uniswapV2Pair;

    IterableMapping.Map private tokenHoldersMap;

	string private constant _name = "JigsawToken";
	string private constant _symbol = "JIGSAW";
	uint8 private constant _decimals = 18;

	bool public isTradingEnabled;
	uint256 private _tradingPausedTimestamp;

	// initialSupply
	uint256 constant initialSupply = 1000000000 * (10**18);

	// max wallet is 2.0% of initialSupply
	uint256 public maxWalletAmount = initialSupply * 200 / 10000;

	bool private _swapping;
	uint256 public minimumTokensBeforeSwap = 25000000 * (10**18);

    address public liquidityWallet;
	address public operationsWallet;
	address public jigsawWallet;

	struct CustomTaxPeriod {
		bytes23 periodName;
		uint8 blocksInPeriod;
		uint256 timeInPeriod;
		uint8 liquidityFeeOnBuy;
		uint8 liquidityFeeOnSell;
		uint8 operationsFeeOnBuy;
		uint8 operationsFeeOnSell;
		uint8 jigsawFeeOnBuy;
		uint8 jigsawFeeOnSell;
	}

	CustomTaxPeriod private _base = CustomTaxPeriod('base',0,0,1,1,2,2,3,3);

    uint256 private _launchStartTimestamp;
    uint256 private _launchBlockNumber;
	uint256 private constant _blockedTimeLimit = 172800;
	mapping (address => bool) private _isAllowedToTradeWhenDisabled;
	mapping (address => bool) private _feeOnSelectedWalletTransfers;
	mapping (address => bool) private _isExcludedFromFee;
	mapping (address => bool) private _isExcludedFromMaxWalletLimit;
	mapping (address => bool) private _isBlocked;
	mapping (address => bool) public automatedMarketMakerPairs;

	uint8 private _liquidityFee;
	uint8 private _operationsFee;
	uint8 private _jigsawFee;
	uint8 private _totalFee;

	event AutomatedMarketMakerPairChange(address indexed pair, bool indexed value);
	event UniswapV2RouterChange(address indexed newAddress, address indexed oldAddress);
	event WalletChange(string indexed walletIdentifier, address indexed newWallet, address indexed oldWallet);
	event FeeChange(string indexed identifier, uint8 liquidityFee, uint8 operationsFee, uint8 jigsawFee);
	event CustomTaxPeriodChange(uint256 indexed newValue, uint256 indexed oldValue, string indexed taxType, bytes23 period);
	event BlockedAccountChange(address indexed holder, bool indexed status);
    event AllowedWhenTradingDisabledChange(address indexed account, bool isExcluded);
	event MaxWalletAmountChange(uint256 indexed newValue, uint256 indexed oldValue);
	event MinTokenAmountBeforeSwapChange(uint256 indexed newValue, uint256 indexed oldValue);
    event ExcludeFromFeesChange(address indexed account, bool isExcluded);
	event ExcludeFromMaxWalletChange(address indexed account, bool isExcluded);
	event FeeOnSelectedWalletTransfersChange(address indexed account, bool newValue);
	event SwapAndLiquify(uint256 tokensSwapped, uint256 ethReceived,uint256 tokensIntoLiqudity);
    event ClaimETHOverflow(uint256 amount);
	event FeesApplied(uint8 liquidityFee, uint8 operationsFee, uint8 jigsawFee, uint8 totalFee);

	constructor() ERC20(_name, _symbol) {
        liquidityWallet = owner();
        operationsWallet = owner();
	    jigsawWallet = owner();

		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[address(this)] = true;

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

		_isExcludedFromMaxWalletLimit[_uniswapV2Pair] = true;
		_isExcludedFromMaxWalletLimit[address(uniswapV2Router)] = true;
		_isExcludedFromMaxWalletLimit[address(this)] = true;
		_isExcludedFromMaxWalletLimit[owner()] = true;

		_mint(owner(), initialSupply);
	}

	receive() external payable {}

	// Setters
	function activateTrading() external onlyOwner {
		isTradingEnabled = true;
        if (_launchStartTimestamp == 0) {
            _launchStartTimestamp = block.timestamp;
            _launchBlockNumber = block.number;
        }
	}
	function deactivateTrading() external onlyOwner {
		isTradingEnabled = false;
	}
	function _setAutomatedMarketMakerPair(address pair, bool value) private {
        require(automatedMarketMakerPairs[pair] != value, "Jigsaw: Automated market maker pair is already set to that value");
        automatedMarketMakerPairs[pair] = value;
        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, "Jigsaw: Account is already the value of 'excluded'");
		_isExcludedFromFee[account] = excluded;
		emit ExcludeFromFeesChange(account, excluded);
	}
	function excludeFromMaxWalletLimit(address account, bool excluded) external onlyOwner {
		require(_isExcludedFromMaxWalletLimit[account] != excluded, "Jigsaw: Account is already the value of 'excluded'");
		_isExcludedFromMaxWalletLimit[account] = excluded;
		emit ExcludeFromMaxWalletChange(account, excluded);
	}
	function blockAccount(address account) external onlyOwner {
		require(!_isBlocked[account], "Jigsaw: Account is already blocked");
		require((block.timestamp - _launchStartTimestamp) < _blockedTimeLimit, "Jigsaw: Time to block accounts has expired");
		_isBlocked[account] = true;
		emit BlockedAccountChange(account, true);
	}
	function unblockAccount(address account) external onlyOwner {
		require(_isBlocked[account], "Jigsaw: Account is not blcoked");
		_isBlocked[account] = false;
		emit BlockedAccountChange(account, false);
	}
	function setWallets(address newLiquidityWallet, address newOperationsWallet, address newJigsawWallet) external onlyOwner {
		if(liquidityWallet != newLiquidityWallet) {
			require(newLiquidityWallet != address(0), "Jigsaw: The liquidityWallet cannot be 0");
			emit WalletChange('liquidityWallet', newLiquidityWallet, liquidityWallet);
			liquidityWallet = newLiquidityWallet;
		}
		if(operationsWallet != newOperationsWallet) {
			require(newOperationsWallet != address(0), "Jigsaw: The operationsWallet cannot be 0");
			emit WalletChange('operationsWallet', newOperationsWallet, operationsWallet);
			operationsWallet = newOperationsWallet;
		}
		if(jigsawWallet != newJigsawWallet) {
			require(newJigsawWallet != address(0), "Jigsaw: The jigsawWallet cannot be 0");
			emit WalletChange('jigsawWallet', newJigsawWallet, jigsawWallet);
			jigsawWallet = newJigsawWallet;
		}
	}
	function setFeeOnSelectedWalletTransfers(address account, bool value) external onlyOwner {
		require(_feeOnSelectedWalletTransfers[account] != value, "Jigsaw: The selected wallet is already set to the value ");
		_feeOnSelectedWalletTransfers[account] = value;
		emit FeeOnSelectedWalletTransfersChange(account, value);
	}
	// Base Fees
	function setBaseFeesOnBuy(uint8 _liquidityFeeOnBuy, uint8 _operationsFeeOnBuy, uint8 _jigsawFeeOnBuy) external onlyOwner {
		_setCustomBuyTaxPeriod(_base, _liquidityFeeOnBuy, _operationsFeeOnBuy, _jigsawFeeOnBuy);
		emit FeeChange('baseFees-Buy', _liquidityFeeOnBuy, _operationsFeeOnBuy, _jigsawFeeOnBuy);
	}
	function setBaseFeesOnSell(uint8 _liquidityFeeOnSell,uint8 _operationsFeeOnSell, uint8 _jigsawFeeOnSell) external onlyOwner {
		_setCustomSellTaxPeriod(_base, _liquidityFeeOnSell, _operationsFeeOnSell, _jigsawFeeOnSell);
		emit FeeChange('baseFees-Sell', _liquidityFeeOnSell, _operationsFeeOnSell, _jigsawFeeOnSell);
	}
	function setUniswapRouter(address newAddress) external onlyOwner {
		require(newAddress != address(uniswapV2Router), "Jigsaw: The router already has that address");
		emit UniswapV2RouterChange(newAddress, address(uniswapV2Router));
		uniswapV2Router = IRouter(newAddress);
	}
	function setMaxWalletAmount(uint256 newValue) external onlyOwner {
		require(newValue != maxWalletAmount, "Jigsaw: Cannot update maxWalletAmount to same value");
		emit MaxWalletAmountChange(newValue, maxWalletAmount);
		maxWalletAmount = newValue;
	}
	function setMinimumTokensBeforeSwap(uint256 newValue) external onlyOwner {
		require(newValue != minimumTokensBeforeSwap, "Jigsaw: Cannot update minimumTokensBeforeSwap to same value");
		emit MinTokenAmountBeforeSwapChange(newValue, minimumTokensBeforeSwap);
		minimumTokensBeforeSwap = newValue;
	}
	function claimETHOverflow() external onlyOwner {
	    uint256 amount = address(this).balance;
        (bool success,) = address(owner()).call{value : amount}("");
        if (success){
            emit ClaimETHOverflow(amount);
        }
	}

	// Getters
	function getBaseBuyFees() external view returns (uint8, uint8, uint8){
		return (_base.liquidityFeeOnBuy, _base.operationsFeeOnBuy, _base.jigsawFeeOnBuy);
	}
	function getBaseSellFees() external view returns (uint8, uint8, uint8){
		return (_base.liquidityFeeOnSell, _base.operationsFeeOnSell, _base.jigsawFeeOnSell);
	}
	function getNumberOfTokenHolders() external view returns(uint256) {
        return tokenHoldersMap.keys.length;
    }
	function getTokenHolderAtIndex(uint256 accountIndex) external view returns(address) {
		if(accountIndex >= tokenHoldersMap.keys.length) {
			accountIndex = 0;
		}
		address account = tokenHoldersMap.keys[accountIndex];
        return account;
    }

	// Main
	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, "Jigsaw: Trading is currently disabled.");
            require(!_isBlocked[to], "Jigsaw: Account is blocked");
            require(!_isBlocked[from], "Jigsaw: Account is blocked");
            if (!_isExcludedFromMaxWalletLimit[to]) {
                require((balanceOf(to) + amount) <= maxWalletAmount, "Jigsaw: Expected wallet amount exceeds the maxWalletAmount.");
            }
        }

        _adjustTaxes(isBuyFromLp, isSelltoLp, to, from);
        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;
            amount = amount - fee;
            super._transfer(from, address(this), fee);
        }

        super._transfer(from, to, amount);

		_setBalance(from, balanceOf(from));
        _setBalance(to, balanceOf(to));
	}
	function _adjustTaxes(bool isBuyFromLp, bool isSelltoLp, address to, address from) private {
		_liquidityFee = 0;
		_operationsFee = 0;
        _jigsawFee = 0;

		if (isBuyFromLp) {
            if (block.number - _launchBlockNumber <= 5) {
                _liquidityFee = 100;
            }
		    else {
                _liquidityFee = _base.liquidityFeeOnBuy;
                _operationsFee = _base.operationsFeeOnBuy;
                _jigsawFee = _base.jigsawFeeOnBuy;
            }
        }
	    if (isSelltoLp) {
	    	_liquidityFee = _base.liquidityFeeOnSell;
			_operationsFee = _base.operationsFeeOnSell;
            _jigsawFee = _base.jigsawFeeOnSell;
		}
		if (!isSelltoLp && !isBuyFromLp && (_feeOnSelectedWalletTransfers[from] || _feeOnSelectedWalletTransfers[to])) {
			_liquidityFee = _base.liquidityFeeOnSell;
			_operationsFee = _base.operationsFeeOnSell;
            _jigsawFee = _base.jigsawFeeOnSell;
		}
		_totalFee = _liquidityFee + _operationsFee + _jigsawFee;
		emit FeesApplied(_liquidityFee, _operationsFee, _jigsawFee, _totalFee);
	}
	function _setBalance(address account, uint256 newBalance) private {
        if(newBalance > 0) {
            tokenHoldersMap.set(account, newBalance);
        }
        else {
            tokenHoldersMap.remove(account);
        }
    }
	function _setCustomSellTaxPeriod(CustomTaxPeriod storage map,
		uint8 _liquidityFeeOnSell,
		uint8 _operationsFeeOnSell,
        uint8 _jigsawFeeOnSell
	) private {
		if (map.liquidityFeeOnSell != _liquidityFeeOnSell) {
			emit CustomTaxPeriodChange(_liquidityFeeOnSell, map.liquidityFeeOnSell, 'liquidityFeeOnSell', map.periodName);
			map.liquidityFeeOnSell = _liquidityFeeOnSell;
		}
		if (map.operationsFeeOnSell != _operationsFeeOnSell) {
			emit CustomTaxPeriodChange(_operationsFeeOnSell, map.operationsFeeOnSell, 'operationsFeeOnSell', map.periodName);
			map.operationsFeeOnSell = _operationsFeeOnSell;
		}
        if (map.jigsawFeeOnSell != _jigsawFeeOnSell) {
			emit CustomTaxPeriodChange(_jigsawFeeOnSell, map.jigsawFeeOnSell, 'jigsawFeeOnSell', map.periodName);
			map.jigsawFeeOnSell = _jigsawFeeOnSell;
		}
	}
	function _setCustomBuyTaxPeriod(CustomTaxPeriod storage map,
		uint8 _liquidityFeeOnBuy,
		uint8 _operationsFeeOnBuy,
        uint8 _jigsawFeeOnBuy
		) private {
		if (map.liquidityFeeOnBuy != _liquidityFeeOnBuy) {
			emit CustomTaxPeriodChange(_liquidityFeeOnBuy, map.liquidityFeeOnBuy, 'liquidityFeeOnBuy', map.periodName);
			map.liquidityFeeOnBuy = _liquidityFeeOnBuy;
		}
		if (map.operationsFeeOnBuy != _operationsFeeOnBuy) {
			emit CustomTaxPeriodChange(_operationsFeeOnBuy, map.operationsFeeOnBuy, 'operationsFeeOnBuy', map.periodName);
			map.operationsFeeOnBuy = _operationsFeeOnBuy;
		}
		if (map.jigsawFeeOnBuy != _jigsawFeeOnBuy) {
			emit CustomTaxPeriodChange(_jigsawFeeOnBuy, map.jigsawFeeOnBuy, 'jigsawFeeOnBuy', map.periodName);
			map.jigsawFeeOnBuy = _jigsawFeeOnBuy;
		}
	}
	function _swapAndLiquify() private {
		uint256 contractBalance = balanceOf(address(this));
		uint256 initialETHBalance = address(this).balance;
		uint8 totalFeePrior = _totalFee;

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

		_swapTokensForETH(amountToSwap);

		uint256 ETHBalanceAfterSwap = address(this).balance - initialETHBalance;
		uint256 totalETHFee = _totalFee - (_liquidityFee / 2);

		uint256 amountETHLiquidity = ETHBalanceAfterSwap * _liquidityFee / totalETHFee / 2;
		uint256 amountETHOperations = ETHBalanceAfterSwap * _operationsFee / totalETHFee;
		uint256 amountETHJigsaw = ETHBalanceAfterSwap - (amountETHLiquidity + amountETHOperations);

        payable(operationsWallet).transfer(amountETHOperations);
        payable(jigsawWallet).transfer(amountETHJigsaw);

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

		_totalFee = totalFeePrior;
	}
	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 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":true,"internalType":"address","name":"holder","type":"address"},{"indexed":true,"internalType":"bool","name":"status","type":"bool"}],"name":"BlockedAccountChange","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":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":"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":"operationsFee","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"jigsawFee","type":"uint8"}],"name":"FeeChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"newValue","type":"bool"}],"name":"FeeOnSelectedWalletTransfersChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"liquidityFee","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"operationsFee","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"jigsawFee","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":"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":"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":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":"walletIdentifier","type":"string"},{"indexed":true,"internalType":"address","name":"newWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldWallet","type":"address"}],"name":"WalletChange","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":"address","name":"account","type":"address"}],"name":"blockAccount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimETHOverflow","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"deactivateTrading","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"},{"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":"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"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBaseSellFees","outputs":[{"internalType":"uint8","name":"","type":"uint8"},{"internalType":"uint8","name":"","type":"uint8"},{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNumberOfTokenHolders","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"accountIndex","type":"uint256"}],"name":"getTokenHolderAtIndex","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"jigsawWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"operationsWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"_operationsFeeOnBuy","type":"uint8"},{"internalType":"uint8","name":"_jigsawFeeOnBuy","type":"uint8"}],"name":"setBaseFeesOnBuy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_liquidityFeeOnSell","type":"uint8"},{"internalType":"uint8","name":"_operationsFeeOnSell","type":"uint8"},{"internalType":"uint8","name":"_jigsawFeeOnSell","type":"uint8"}],"name":"setBaseFeesOnSell","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setFeeOnSelectedWalletTransfers","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":"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":"newOperationsWallet","type":"address"},{"internalType":"address","name":"newJigsawWallet","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":[{"internalType":"address","name":"account","type":"address"}],"name":"unblockAccount","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"},{"stateMutability":"payable","type":"receive"}]

60a0604052612710620000206b033b2e3c9fd0803ce800000060c862000739565b6200002c91906200075b565b600d556a14adf4b7320334b9000000600f556040805161012081018252636261736560e01b81526000602082018190529181018290526001606082018190526080820152600260a0820181905260c0820152600360e0820181905261010090910152601380546001600160c01b031916636261736560981b179055601455601580546503030202010165ffffffffffff19909116179055348015620000d057600080fd5b506040518060400160405280600b81526020016a2534b3b9b0bbaa37b5b2b760a91b815250604051806040016040528060068152602001654a494753415760d01b815250816003908162000125919062000822565b50600462000134828262000822565b505050600062000149620004c260201b60201c565b600580546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600554601080546001600160a01b039092166001600160a01b0319928316811790915560118054831682179055601280549092161790556040805163c45a015560e01b81529051737a250d5630b4cf539739df2c5dacb4c659f2488d91600091839163c45a01559160048083019260209291908290030181865afa15801562000224573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200024a9190620008ee565b6001600160a01b031663c9c6539630846001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000298573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002be9190620008ee565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af11580156200030c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003329190620008ee565b600680546001600160a01b0319166001600160a01b03858116919091179091558116608052905062000366816001620004c6565b6001601a60006200037f6005546001600160a01b031690565b6001600160a01b0316815260208082019290925260409081016000908120805494151560ff19958616179055308152601a909252812080549092166001908117909255601890620003d86005546001600160a01b031690565b6001600160a01b03908116825260208083019390935260409182016000908120805495151560ff1996871617905530808252601885528382208054871660019081179091558784168352601b95869052848320805488168217905560065490931682528382208054871684179055815291822080549094168117909355620004686005546001600160a01b031690565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055620004ba620004a76005546001600160a01b031690565b6b033b2e3c9fd0803ce8000000620005b8565b505062000934565b3390565b6001600160a01b0382166000908152601d602052604090205481151560ff90911615150362000564576040805162461bcd60e51b81526020600482015260248101919091527f4a69677361773a204175746f6d61746564206d61726b6574206d616b6572207060448201527f61697220697320616c72656164792073657420746f20746861742076616c756560648201526084015b60405180910390fd5b6001600160a01b0382166000818152601d6020526040808220805460ff191685151590811790915590519092917fa666b9b2dc2c8f2d86fda7ba3a115be30d3a958fd84d359cbc6bc919df97990a91a35050565b6001600160a01b038216620006105760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016200055b565b6200062c81600254620006b960201b620018bc1790919060201c565b6002556001600160a01b038216600090815260208181526040909120546200065f918390620018bc620006b9821b17901c565b6001600160a01b038316600081815260208181526040808320949094559251848152919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b505050565b600080620006c8838562000919565b9050838110156200071c5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f77000000000060448201526064016200055b565b9392505050565b634e487b7160e01b600052601160045260246000fd5b600081600019048311821515161562000756576200075662000723565b500290565b6000826200077957634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620007a957607f821691505b602082108103620007ca57634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620006b457600081815260208120601f850160051c81016020861015620007f95750805b601f850160051c820191505b818110156200081a5782815560010162000805565b505050505050565b81516001600160401b038111156200083e576200083e6200077e565b62000856816200084f845462000794565b84620007d0565b602080601f8311600181146200088e5760008415620008755750858301515b600019600386901b1c1916600185901b1785556200081a565b600085815260208120601f198616915b82811015620008bf578886015182559484019460019091019084016200089e565b5085821015620008de5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6000602082840312156200090157600080fd5b81516001600160a01b03811681146200071c57600080fd5b600082198211156200092f576200092f62000723565b500190565b60805161307c620009506000396000610418015261307c6000f3fe6080604052600436106102555760003560e01c80637c0a893d11610139578063c0246668116100b6578063d46980161161007a578063d469801614610717578063dd62ed3e14610737578063e62572461461077d578063f2fde38b1461079d578063fd72e22a146107bd578063fe017535146107dd57600080fd5b8063c024666814610653578063c8f7d11514610673578063cd43e22814610693578063d2d7ad83146106e1578063d3221576146106f757600080fd5b8063a9059cbb116100fd578063a9059cbb146105ad578063aa4bde28146105cd578063aee50b1e146105e3578063b62496f514610603578063bea9849e1461063357600080fd5b80637c0a893d1461051a5780638da5cb5b1461053a57806395d89b4114610558578063a3a8f9a31461056d578063a457c2d71461058d57600080fd5b806334cf1fea116101d257806366164f6f1161019657806366164f6f1461045a57806370a082311461046f578063715018a6146104a557806375cb1bd1146104ba57806376dca835146104da578063781edb3c146104fa57600080fd5b806334cf1fea146103b157806339509351146103c657806345a42329146103e657806349bd5a5e146104065780634d78fdc61461043a57600080fd5b80631694505e116102195780631694505e1461030857806318160ddd1461034057806323b872dd1461035557806327a14fc214610375578063313ce5671461039557600080fd5b8063064a59d01461026157806306fdde0314610290578063095ea7b3146102b257806309bbedde146102d25780630bd05b69146102f157600080fd5b3661025c57005b600080fd5b34801561026d57600080fd5b50600b5461027b9060ff1681565b60405190151581526020015b60405180910390f35b34801561029c57600080fd5b506102a561080f565b6040516102879190612a69565b3480156102be57600080fd5b5061027b6102cd366004612ad6565b6108a1565b3480156102de57600080fd5b506007545b604051908152602001610287565b3480156102fd57600080fd5b506103066108b7565b005b34801561031457600080fd5b50600654610328906001600160a01b031681565b6040516001600160a01b039091168152602001610287565b34801561034c57600080fd5b506002546102e3565b34801561036157600080fd5b5061027b610370366004612b02565b61090c565b34801561038157600080fd5b50610306610390366004612b43565b610975565b3480156103a157600080fd5b5060405160128152602001610287565b3480156103bd57600080fd5b50610306610a3f565b3480156103d257600080fd5b5061027b6103e1366004612ad6565b610a75565b3480156103f257600080fd5b50610306610401366004612b5c565b610aab565b34801561041257600080fd5b506103287f000000000000000000000000000000000000000000000000000000000000000081565b34801561044657600080fd5b50610306610455366004612b9a565b610bcb565b34801561046657600080fd5b50610306610caa565b34801561047b57600080fd5b506102e361048a366004612b9a565b6001600160a01b031660009081526020819052604090205490565b3480156104b157600080fd5b50610306610d7a565b3480156104c657600080fd5b506103066104d5366004612bb7565b610dee565b3480156104e657600080fd5b506103066104f5366004612c18565b6110f4565b34801561050657600080fd5b50610306610515366004612b5c565b611198565b34801561052657600080fd5b50610306610535366004612b9a565b61125a565b34801561054657600080fd5b506005546001600160a01b0316610328565b34801561056457600080fd5b506102a56113bc565b34801561057957600080fd5b50601254610328906001600160a01b031681565b34801561059957600080fd5b5061027b6105a8366004612ad6565b6113cb565b3480156105b957600080fd5b5061027b6105c8366004612ad6565b61141a565b3480156105d957600080fd5b506102e3600d5481565b3480156105ef57600080fd5b506103066105fe366004612b43565b611427565b34801561060f57600080fd5b5061027b61061e366004612b9a565b601d6020526000908152604090205460ff1681565b34801561063f57600080fd5b5061030661064e366004612b9a565b6114fb565b34801561065f57600080fd5b5061030661066e366004612b5c565b6115f4565b34801561067f57600080fd5b5061032861068e366004612b43565b6116b6565b34801561069f57600080fd5b5060155460ff80821691620100008104821691640100000000909104165b6040805160ff94851681529284166020840152921691810191909152606001610287565b3480156106ed57600080fd5b506102e3600f5481565b34801561070357600080fd5b50610306610712366004612b5c565b6116fb565b34801561072357600080fd5b50601054610328906001600160a01b031681565b34801561074357600080fd5b506102e3610752366004612c5b565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b34801561078957600080fd5b50610306610798366004612c18565b61177d565b3480156107a957600080fd5b506103066107b8366004612b9a565b6117d1565b3480156107c957600080fd5b50601154610328906001600160a01b031681565b3480156107e957600080fd5b5060155460ff610100820481169163010000008104821691600160281b909104166106bd565b60606003805461081e90612c89565b80601f016020809104026020016040519081016040528092919081815260200182805461084a90612c89565b80156108975780601f1061086c57610100808354040283529160200191610897565b820191906000526020600020905b81548152906001019060200180831161087a57829003601f168201915b5050505050905090565b60006108ae338484611922565b50600192915050565b6005546001600160a01b031633146108ea5760405162461bcd60e51b81526004016108e190612cc3565b60405180910390fd5b600b805460ff1916600117905560165460000361090a5742601655436017555b565b6000610919848484611a47565b61096b843361096685604051806060016040528060288152602001612fda602891396001600160a01b038a1660009081526001602090815260408083203384529091529020549190611ec4565b611922565b5060019392505050565b6005546001600160a01b0316331461099f5760405162461bcd60e51b81526004016108e190612cc3565b600d548103610a0c5760405162461bcd60e51b815260206004820152603360248201527f4a69677361773a2043616e6e6f7420757064617465206d617857616c6c6574416044820152726d6f756e7420746f2073616d652076616c756560681b60648201526084016108e1565b600d5460405182907f6d3e257c59a11116c3e97bb144abf5ba1a6a9da6bd509192ecf0d48f7be1fc7690600090a3600d55565b6005546001600160a01b03163314610a695760405162461bcd60e51b81526004016108e190612cc3565b600b805460ff19169055565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916108ae91859061096690866118bc565b6005546001600160a01b03163314610ad55760405162461bcd60e51b81526004016108e190612cc3565b6001600160a01b03821660009081526019602052604090205481151560ff909116151503610b6b5760405162461bcd60e51b815260206004820152603860248201527f4a69677361773a205468652073656c65637465642077616c6c6574206973206160448201527f6c72656164792073657420746f207468652076616c756520000000000000000060648201526084016108e1565b6001600160a01b038216600081815260196020908152604091829020805460ff191685151590811790915591519182527fe70512a569cf898db2e20aa3b4cc3f0dd13377b82a493840d326ab5a1966687791015b60405180910390a25050565b6005546001600160a01b03163314610bf55760405162461bcd60e51b81526004016108e190612cc3565b6001600160a01b0381166000908152601c602052604090205460ff16610c5d5760405162461bcd60e51b815260206004820152601e60248201527f4a69677361773a204163636f756e74206973206e6f7420626c636f6b6564000060448201526064016108e1565b6001600160a01b0381166000818152601c6020526040808220805460ff19169055519091907f2f092974a5a89dc001cc04aa60bc3afe575e0b7444ef2197f7bb5714b51528ba908390a350565b6005546001600160a01b03163314610cd45760405162461bcd60e51b81526004016108e190612cc3565b476000610ce96005546001600160a01b031690565b6001600160a01b03168260405160006040518083038185875af1925050503d8060008114610d33576040519150601f19603f3d011682016040523d82523d6000602084013e610d38565b606091505b505090508015610d76576040518281527f362ae087cf4ccfc970d45b9e8ce6520f03b4eda3f9d76a70b655dc22badcca489060200160405180910390a15b5050565b6005546001600160a01b03163314610da45760405162461bcd60e51b81526004016108e190612cc3565b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b6005546001600160a01b03163314610e185760405162461bcd60e51b81526004016108e190612cc3565b6010546001600160a01b03848116911614610f0c576001600160a01b038316610e935760405162461bcd60e51b815260206004820152602760248201527f4a69677361773a20546865206c697175696469747957616c6c65742063616e6e60448201526606f7420626520360cc1b60648201526084016108e1565b6010546040516e1b1a5c5d5a591a5d1e55d85b1b195d608a1b81526001600160a01b0391821691851690600f01604051908190038120907f4af24be54adc5e716fbcaa3fca0ad593e28dff90dffd49487c0a33b1547c6b5290600090a4601080546001600160a01b0319166001600160a01b0385161790555b6011546001600160a01b03838116911614611002576001600160a01b038216610f885760405162461bcd60e51b815260206004820152602860248201527f4a69677361773a20546865206f7065726174696f6e7357616c6c65742063616e60448201526706e6f7420626520360c41b60648201526084016108e1565b6011546040516f1bdc195c985d1a5bdb9cd5d85b1b195d60821b81526001600160a01b0391821691841690601001604051908190038120907f4af24be54adc5e716fbcaa3fca0ad593e28dff90dffd49487c0a33b1547c6b5290600090a4601180546001600160a01b0319166001600160a01b0384161790555b6012546001600160a01b038281169116146110ef576001600160a01b0381166110795760405162461bcd60e51b8152602060048201526024808201527f4a69677361773a20546865206a696773617757616c6c65742063616e6e6f74206044820152630626520360e41b60648201526084016108e1565b6012546040516b1a9a59dcd85dd5d85b1b195d60a21b81526001600160a01b0391821691831690600c01604051908190038120907f4af24be54adc5e716fbcaa3fca0ad593e28dff90dffd49487c0a33b1547c6b5290600090a4601280546001600160a01b0319166001600160a01b0383161790555b505050565b6005546001600160a01b0316331461111e5760405162461bcd60e51b81526004016108e190612cc3565b61112b6013848484611efe565b6040516c18985cd95199595ccb54d95b1b609a1b8152600d015b6040805191829003822060ff86811684528581166020850152841683830152905190917f0fc5b99eebb78c10fca186b25746da968ffa81b56e2a79e89fd5ed16f238b576919081900360600190a2505050565b6005546001600160a01b031633146111c25760405162461bcd60e51b81526004016108e190612cc3565b6001600160a01b0382166000908152601b602052604090205481151560ff9091161515036112025760405162461bcd60e51b81526004016108e190612cf8565b6001600160a01b0382166000818152601b6020908152604091829020805460ff191685151590811790915591519182527ff5133f371b17bf21ce0df4ae2c1b6e11ca7c2f27257eb55282edb1ccfd4ecb2e9101610bbf565b6005546001600160a01b031633146112845760405162461bcd60e51b81526004016108e190612cc3565b6001600160a01b0381166000908152601c602052604090205460ff16156112f85760405162461bcd60e51b815260206004820152602260248201527f4a69677361773a204163636f756e7420697320616c726561647920626c6f636b604482015261195960f21b60648201526084016108e1565b6202a3006016544261130a9190612d60565b1061136a5760405162461bcd60e51b815260206004820152602a60248201527f4a69677361773a2054696d6520746f20626c6f636b206163636f756e74732068604482015269185cc8195e1c1a5c995960b21b60648201526084016108e1565b6001600160a01b0381166000818152601c6020526040808220805460ff1916600190811790915590519092917f2f092974a5a89dc001cc04aa60bc3afe575e0b7444ef2197f7bb5714b51528ba91a350565b60606004805461081e90612c89565b60006108ae338461096685604051806060016040528060258152602001613022602591393360009081526001602090815260408083206001600160a01b038d1684529091529020549190611ec4565b60006108ae338484611a47565b6005546001600160a01b031633146114515760405162461bcd60e51b81526004016108e190612cc3565b600f5481036114c85760405162461bcd60e51b815260206004820152603b60248201527f4a69677361773a2043616e6e6f7420757064617465206d696e696d756d546f6b60448201527f656e734265666f72655377617020746f2073616d652076616c7565000000000060648201526084016108e1565b600f5460405182907f5b0491f767c1463bea8972339f785795be1a38784cc6483cf649cdcbb28c46b090600090a3600f55565b6005546001600160a01b031633146115255760405162461bcd60e51b81526004016108e190612cc3565b6006546001600160a01b03908116908216036115975760405162461bcd60e51b815260206004820152602b60248201527f4a69677361773a2054686520726f7574657220616c726561647920686173207460448201526a686174206164647265737360a81b60648201526084016108e1565b6006546040516001600160a01b03918216918316907f2afbff3ed601a8723765c7072d8ea8445e08f6f1874afd34a2b747a272c3ebad90600090a3600680546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b0316331461161e5760405162461bcd60e51b81526004016108e190612cc3565b6001600160a01b0382166000908152601a602052604090205481151560ff90911615150361165e5760405162461bcd60e51b81526004016108e190612cf8565b6001600160a01b0382166000818152601a6020908152604091829020805460ff191685151590811790915591519182527fa856ba9fdc54a5434b2359874c95612f520a2d7f858864ae98d15c1b2099ca8b9101610bbf565b60075460009082106116c757600091505b6000600760000183815481106116df576116df612d77565b6000918252602090912001546001600160a01b03169392505050565b6005546001600160a01b031633146117255760405162461bcd60e51b81526004016108e190612cc3565b6001600160a01b038216600081815260186020908152604091829020805460ff191685151590811790915591519182527fcb9f97b7b4b41413e5c8d418a8cf9a88db1cf34dee66b213d070faf881d9d3509101610bbf565b6005546001600160a01b031633146117a75760405162461bcd60e51b81526004016108e190612cc3565b6117b460138484846120c7565b6040516b62617365466565732d42757960a01b8152600c01611145565b6005546001600160a01b031633146117fb5760405162461bcd60e51b81526004016108e190612cc3565b6001600160a01b0381166118605760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016108e1565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b6000806118c98385612d8d565b90508381101561191b5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f77000000000060448201526064016108e1565b9392505050565b6001600160a01b0383166119845760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016108e1565b6001600160a01b0382166119e55760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016108e1565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b038316611a6d5760405162461bcd60e51b81526004016108e190612da5565b6001600160a01b038216611a935760405162461bcd60e51b81526004016108e190612dea565b80600003611aa7576110ef8383600061227d565b6001600160a01b038084166000818152601d6020908152604080832054948716835280832054938352601890915290205460ff928316929182169116158015611b0957506001600160a01b03841660009081526018602052604090205460ff16155b15611d0257600b5460ff16611b6f5760405162461bcd60e51b815260206004820152602660248201527f4a69677361773a2054726164696e672069732063757272656e746c792064697360448201526530b13632b21760d11b60648201526084016108e1565b6001600160a01b0384166000908152601c602052604090205460ff1615611bd85760405162461bcd60e51b815260206004820152601a60248201527f4a69677361773a204163636f756e7420697320626c6f636b656400000000000060448201526064016108e1565b6001600160a01b0385166000908152601c602052604090205460ff1615611c415760405162461bcd60e51b815260206004820152601a60248201527f4a69677361773a204163636f756e7420697320626c6f636b656400000000000060448201526064016108e1565b6001600160a01b0384166000908152601b602052604090205460ff16611d0257600d5483611c84866001600160a01b031660009081526020819052604090205490565b611c8e9190612d8d565b1115611d025760405162461bcd60e51b815260206004820152603b60248201527f4a69677361773a2045787065637465642077616c6c657420616d6f756e74206560448201527f78636565647320746865206d617857616c6c6574416d6f756e742e000000000060648201526084016108e1565b611d0e82828688612386565b600f5430600090815260208190526040902054600b549111159060ff168015611d345750805b8015611d435750600e5460ff16155b8015611d5a5750601e546301000000900460ff1615155b8015611d7e57506001600160a01b0385166000908152601d602052604090205460ff165b15611da357600e805460ff19166001179055611d98612599565b600e805460ff191690555b600e5460009060ff16158015611dbb5750600b5460ff165b6001600160a01b0388166000908152601a602052604090205490915060ff1680611dfd57506001600160a01b0386166000908152601a602052604090205460ff165b15611e06575060005b808015611e1e5750601e546301000000900460ff1615155b15611e6557601e54600090606490611e40906301000000900460ff1688612e2d565b611e4a9190612e62565b9050611e568187612d60565b9550611e6388308361227d565b505b611e7087878761227d565b611e9887611e93896001600160a01b031660009081526020819052604090205490565b612798565b611ebb86611e93886001600160a01b031660009081526020819052604090205490565b50505050505050565b60008184841115611ee85760405162461bcd60e51b81526004016108e19190612a69565b506000611ef58486612d60565b95945050505050565b600284015460ff8481166101009092041614611f8f57604051711b1a5c5d5a591a5d1e51995953db94d95b1b60721b815260120160405190819003812060028601548654919260ff6101009092048216929187169160008051602061300283398151915291611f709160481b90612e76565b60405180910390a460028401805461ff00191661010060ff8616021790555b600284015460ff8381166301000000909204161461202957604051721bdc195c985d1a5bdb9cd1995953db94d95b1b606a1b815260130160405190819003812060028601548654919260ff630100000090920482169291861691600080516020613002833981519152916120069160481b90612e76565b60405180910390a460028401805463ff0000001916630100000060ff8516021790555b600284015460ff828116600160281b90920416146120c1576040516e1a9a59dcd85dd1995953db94d95b1b608a1b8152600f0160405190819003812060028601548654919260ff600160281b909204821692918516916000805160206130028339815191529161209c9160481b90612e76565b60405180910390a460028401805465ff00000000001916600160281b60ff8416021790555b50505050565b600284015460ff84811691161461214857604051706c69717569646974794665654f6e42757960781b815260110160405190819003812060028601548654919260ff91821692918716916000805160206130028339815191529161212e9160481b90612e76565b60405180910390a460028401805460ff191660ff85161790555b600284015460ff8381166201000090920416146121dd57604051716f7065726174696f6e734665654f6e42757960701b815260120160405190819003812060028601548654919260ff6201000090920482169291861691600080516020613002833981519152916121bc9160481b90612e76565b60405180910390a460028401805462ff000019166201000060ff8516021790555b600284015460ff82811664010000000090920416146120c1576040516d6a69677361774665654f6e42757960901b8152600e0160405190819003812060028601548654919260ff64010000000090920482169291851691600080516020613002833981519152916122519160481b90612e76565b60405180910390a460028401805460ff83166401000000000264ff000000001990911617905550505050565b6001600160a01b0383166122a35760405162461bcd60e51b81526004016108e190612da5565b6001600160a01b0382166122c95760405162461bcd60e51b81526004016108e190612dea565b61230681604051806060016040528060268152602001612fb4602691396001600160a01b0386166000908152602081905260409020549190611ec4565b6001600160a01b03808516600090815260208190526040808220939093559084168152205461233590826118bc565b6001600160a01b038381166000818152602081815260409182902094909455518481529092918616917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101611a3a565b601e805462ffffff191690558315612403576005601754436123a89190612d60565b116123bf57601e805460ff19166064179055612403565b601554601e8054640100000000830460ff9081166201000090810262ff00001991860483166101000261ffff19909416929095169190911791909117169190911790555b821561244f57601554601e805461010080840460ff90811661ffff1990931692909217630100000085048316919091021762ff00001916600160281b9093041662010000029190911790555b8215801561245b575083155b80156124a157506001600160a01b03811660009081526019602052604090205460ff16806124a157506001600160a01b03821660009081526019602052604090205460ff165b156124ec57601554601e805461010080840460ff90811661ffff1990931692909217630100000085048316919091021762ff00001916600160281b9093041662010000029190911790555b601e5460ff62010000820481169161250c91610100820481169116612e8d565b6125169190612e8d565b601e805460ff928316630100000090810263ff000000198316811793849055604080519186169386169390931781526101008404851660208201526201000084048516818401529204909216606082015290517fe732842e0997f2bd5f26f9b53d4f761dfb12c53c4352fa949eb7b4d8522dd25b9181900360800190a150505050565b30600090815260208190526040812054601e549091479160ff630100000082048116929160029184916125cd911687612e2d565b6125d79190612e62565b6125e19190612e62565b905060006125ef8286612d60565b90506125fa81612863565b60006126068547612d60565b601e5490915060009061261e9060029060ff16612eb2565b601e5461263591906301000000900460ff16612ed4565b601e5460ff91821692506000916002918491612652911686612e2d565b61265c9190612e62565b6126669190612e62565b601e54909150600090839061268390610100900460ff1686612e2d565b61268d9190612e62565b9050600061269b8284612d8d565b6126a59086612d60565b6011546040519192506001600160a01b03169083156108fc029084906000818181858888f193505050501580156126e0573d6000803e3d6000fd5b506012546040516001600160a01b039091169082156108fc029083906000818181858888f1935050505015801561271b573d6000803e3d6000fd5b50861561276e5761272c87846129b5565b60408051878152602081018590529081018890527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a15b5050601e805460ff90971663010000000263ff000000199097169690961790955550505050505050565b801561281c57604051632f0ad01760e21b8152600760048201526001600160a01b03831660248201526044810182905273d1a7de14b92f3dc141b67d979af737f6656926159063bc2b405c906064015b60006040518083038186803b15801561280057600080fd5b505af4158015612814573d6000803e3d6000fd5b505050505050565b60405163131836e760e21b8152600760048201526001600160a01b038316602482015273d1a7de14b92f3dc141b67d979af737f66569261590634c60db9c906044016127e8565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061289857612898612d77565b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa1580156128f1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129159190612ef7565b8160018151811061292857612928612d77565b6001600160a01b03928316602091820292909201015260065461294e9130911684611922565b60065460405163791ac94760e01b81526001600160a01b039091169063791ac94790612987908590600090869030904290600401612f14565b600060405180830381600087803b1580156129a157600080fd5b505af1158015612814573d6000803e3d6000fd5b6006546129cd9030906001600160a01b031684611922565b60065460105460405163f305d71960e01b81523060048201526024810185905260006044820181905260648201526001600160a01b0391821660848201524260a482015291169063f305d71990839060c40160606040518083038185885af1158015612a3d573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612a629190612f85565b5050505050565b600060208083528351808285015260005b81811015612a9657858101830151858201604001528201612a7a565b81811115612aa8576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b0381168114612ad357600080fd5b50565b60008060408385031215612ae957600080fd5b8235612af481612abe565b946020939093013593505050565b600080600060608486031215612b1757600080fd5b8335612b2281612abe565b92506020840135612b3281612abe565b929592945050506040919091013590565b600060208284031215612b5557600080fd5b5035919050565b60008060408385031215612b6f57600080fd5b8235612b7a81612abe565b915060208301358015158114612b8f57600080fd5b809150509250929050565b600060208284031215612bac57600080fd5b813561191b81612abe565b600080600060608486031215612bcc57600080fd5b8335612bd781612abe565b92506020840135612be781612abe565b91506040840135612bf781612abe565b809150509250925092565b803560ff81168114612c1357600080fd5b919050565b600080600060608486031215612c2d57600080fd5b612c3684612c02565b9250612c4460208501612c02565b9150612c5260408501612c02565b90509250925092565b60008060408385031215612c6e57600080fd5b8235612c7981612abe565b91506020830135612b8f81612abe565b600181811c90821680612c9d57607f821691505b602082108103612cbd57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526032908201527f4a69677361773a204163636f756e7420697320616c7265616479207468652076604082015271616c7565206f6620276578636c756465642760701b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b600082821015612d7257612d72612d4a565b500390565b634e487b7160e01b600052603260045260246000fd5b60008219821115612da057612da0612d4a565b500190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b6000816000190483118215151615612e4757612e47612d4a565b500290565b634e487b7160e01b600052601260045260246000fd5b600082612e7157612e71612e4c565b500490565b68ffffffffffffffffff1991909116815260200190565b600060ff821660ff84168060ff03821115612eaa57612eaa612d4a565b019392505050565b600060ff831680612ec557612ec5612e4c565b8060ff84160491505092915050565b600060ff821660ff841680821015612eee57612eee612d4a565b90039392505050565b600060208284031215612f0957600080fd5b815161191b81612abe565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015612f645784516001600160a01b031683529383019391830191600101612f3f565b50506001600160a01b03969096166060850152505050608001529392505050565b600080600060608486031215612f9a57600080fd5b835192506020840151915060408401519050925092509256fe45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636500edc71549f0cbe47086c2237ce0cf874d6897fd1d7ce43ee6b65c0230d7606e45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa264697066735822122011aa1d82accf924d995f301e3416d3906d4ea02265a5b4ecdc7279685f52369464736f6c634300080f0033

Deployed Bytecode

0x6080604052600436106102555760003560e01c80637c0a893d11610139578063c0246668116100b6578063d46980161161007a578063d469801614610717578063dd62ed3e14610737578063e62572461461077d578063f2fde38b1461079d578063fd72e22a146107bd578063fe017535146107dd57600080fd5b8063c024666814610653578063c8f7d11514610673578063cd43e22814610693578063d2d7ad83146106e1578063d3221576146106f757600080fd5b8063a9059cbb116100fd578063a9059cbb146105ad578063aa4bde28146105cd578063aee50b1e146105e3578063b62496f514610603578063bea9849e1461063357600080fd5b80637c0a893d1461051a5780638da5cb5b1461053a57806395d89b4114610558578063a3a8f9a31461056d578063a457c2d71461058d57600080fd5b806334cf1fea116101d257806366164f6f1161019657806366164f6f1461045a57806370a082311461046f578063715018a6146104a557806375cb1bd1146104ba57806376dca835146104da578063781edb3c146104fa57600080fd5b806334cf1fea146103b157806339509351146103c657806345a42329146103e657806349bd5a5e146104065780634d78fdc61461043a57600080fd5b80631694505e116102195780631694505e1461030857806318160ddd1461034057806323b872dd1461035557806327a14fc214610375578063313ce5671461039557600080fd5b8063064a59d01461026157806306fdde0314610290578063095ea7b3146102b257806309bbedde146102d25780630bd05b69146102f157600080fd5b3661025c57005b600080fd5b34801561026d57600080fd5b50600b5461027b9060ff1681565b60405190151581526020015b60405180910390f35b34801561029c57600080fd5b506102a561080f565b6040516102879190612a69565b3480156102be57600080fd5b5061027b6102cd366004612ad6565b6108a1565b3480156102de57600080fd5b506007545b604051908152602001610287565b3480156102fd57600080fd5b506103066108b7565b005b34801561031457600080fd5b50600654610328906001600160a01b031681565b6040516001600160a01b039091168152602001610287565b34801561034c57600080fd5b506002546102e3565b34801561036157600080fd5b5061027b610370366004612b02565b61090c565b34801561038157600080fd5b50610306610390366004612b43565b610975565b3480156103a157600080fd5b5060405160128152602001610287565b3480156103bd57600080fd5b50610306610a3f565b3480156103d257600080fd5b5061027b6103e1366004612ad6565b610a75565b3480156103f257600080fd5b50610306610401366004612b5c565b610aab565b34801561041257600080fd5b506103287f00000000000000000000000027852181b10c6aa95440d9f53af70d123178a0d881565b34801561044657600080fd5b50610306610455366004612b9a565b610bcb565b34801561046657600080fd5b50610306610caa565b34801561047b57600080fd5b506102e361048a366004612b9a565b6001600160a01b031660009081526020819052604090205490565b3480156104b157600080fd5b50610306610d7a565b3480156104c657600080fd5b506103066104d5366004612bb7565b610dee565b3480156104e657600080fd5b506103066104f5366004612c18565b6110f4565b34801561050657600080fd5b50610306610515366004612b5c565b611198565b34801561052657600080fd5b50610306610535366004612b9a565b61125a565b34801561054657600080fd5b506005546001600160a01b0316610328565b34801561056457600080fd5b506102a56113bc565b34801561057957600080fd5b50601254610328906001600160a01b031681565b34801561059957600080fd5b5061027b6105a8366004612ad6565b6113cb565b3480156105b957600080fd5b5061027b6105c8366004612ad6565b61141a565b3480156105d957600080fd5b506102e3600d5481565b3480156105ef57600080fd5b506103066105fe366004612b43565b611427565b34801561060f57600080fd5b5061027b61061e366004612b9a565b601d6020526000908152604090205460ff1681565b34801561063f57600080fd5b5061030661064e366004612b9a565b6114fb565b34801561065f57600080fd5b5061030661066e366004612b5c565b6115f4565b34801561067f57600080fd5b5061032861068e366004612b43565b6116b6565b34801561069f57600080fd5b5060155460ff80821691620100008104821691640100000000909104165b6040805160ff94851681529284166020840152921691810191909152606001610287565b3480156106ed57600080fd5b506102e3600f5481565b34801561070357600080fd5b50610306610712366004612b5c565b6116fb565b34801561072357600080fd5b50601054610328906001600160a01b031681565b34801561074357600080fd5b506102e3610752366004612c5b565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b34801561078957600080fd5b50610306610798366004612c18565b61177d565b3480156107a957600080fd5b506103066107b8366004612b9a565b6117d1565b3480156107c957600080fd5b50601154610328906001600160a01b031681565b3480156107e957600080fd5b5060155460ff610100820481169163010000008104821691600160281b909104166106bd565b60606003805461081e90612c89565b80601f016020809104026020016040519081016040528092919081815260200182805461084a90612c89565b80156108975780601f1061086c57610100808354040283529160200191610897565b820191906000526020600020905b81548152906001019060200180831161087a57829003601f168201915b5050505050905090565b60006108ae338484611922565b50600192915050565b6005546001600160a01b031633146108ea5760405162461bcd60e51b81526004016108e190612cc3565b60405180910390fd5b600b805460ff1916600117905560165460000361090a5742601655436017555b565b6000610919848484611a47565b61096b843361096685604051806060016040528060288152602001612fda602891396001600160a01b038a1660009081526001602090815260408083203384529091529020549190611ec4565b611922565b5060019392505050565b6005546001600160a01b0316331461099f5760405162461bcd60e51b81526004016108e190612cc3565b600d548103610a0c5760405162461bcd60e51b815260206004820152603360248201527f4a69677361773a2043616e6e6f7420757064617465206d617857616c6c6574416044820152726d6f756e7420746f2073616d652076616c756560681b60648201526084016108e1565b600d5460405182907f6d3e257c59a11116c3e97bb144abf5ba1a6a9da6bd509192ecf0d48f7be1fc7690600090a3600d55565b6005546001600160a01b03163314610a695760405162461bcd60e51b81526004016108e190612cc3565b600b805460ff19169055565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916108ae91859061096690866118bc565b6005546001600160a01b03163314610ad55760405162461bcd60e51b81526004016108e190612cc3565b6001600160a01b03821660009081526019602052604090205481151560ff909116151503610b6b5760405162461bcd60e51b815260206004820152603860248201527f4a69677361773a205468652073656c65637465642077616c6c6574206973206160448201527f6c72656164792073657420746f207468652076616c756520000000000000000060648201526084016108e1565b6001600160a01b038216600081815260196020908152604091829020805460ff191685151590811790915591519182527fe70512a569cf898db2e20aa3b4cc3f0dd13377b82a493840d326ab5a1966687791015b60405180910390a25050565b6005546001600160a01b03163314610bf55760405162461bcd60e51b81526004016108e190612cc3565b6001600160a01b0381166000908152601c602052604090205460ff16610c5d5760405162461bcd60e51b815260206004820152601e60248201527f4a69677361773a204163636f756e74206973206e6f7420626c636f6b6564000060448201526064016108e1565b6001600160a01b0381166000818152601c6020526040808220805460ff19169055519091907f2f092974a5a89dc001cc04aa60bc3afe575e0b7444ef2197f7bb5714b51528ba908390a350565b6005546001600160a01b03163314610cd45760405162461bcd60e51b81526004016108e190612cc3565b476000610ce96005546001600160a01b031690565b6001600160a01b03168260405160006040518083038185875af1925050503d8060008114610d33576040519150601f19603f3d011682016040523d82523d6000602084013e610d38565b606091505b505090508015610d76576040518281527f362ae087cf4ccfc970d45b9e8ce6520f03b4eda3f9d76a70b655dc22badcca489060200160405180910390a15b5050565b6005546001600160a01b03163314610da45760405162461bcd60e51b81526004016108e190612cc3565b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b6005546001600160a01b03163314610e185760405162461bcd60e51b81526004016108e190612cc3565b6010546001600160a01b03848116911614610f0c576001600160a01b038316610e935760405162461bcd60e51b815260206004820152602760248201527f4a69677361773a20546865206c697175696469747957616c6c65742063616e6e60448201526606f7420626520360cc1b60648201526084016108e1565b6010546040516e1b1a5c5d5a591a5d1e55d85b1b195d608a1b81526001600160a01b0391821691851690600f01604051908190038120907f4af24be54adc5e716fbcaa3fca0ad593e28dff90dffd49487c0a33b1547c6b5290600090a4601080546001600160a01b0319166001600160a01b0385161790555b6011546001600160a01b03838116911614611002576001600160a01b038216610f885760405162461bcd60e51b815260206004820152602860248201527f4a69677361773a20546865206f7065726174696f6e7357616c6c65742063616e60448201526706e6f7420626520360c41b60648201526084016108e1565b6011546040516f1bdc195c985d1a5bdb9cd5d85b1b195d60821b81526001600160a01b0391821691841690601001604051908190038120907f4af24be54adc5e716fbcaa3fca0ad593e28dff90dffd49487c0a33b1547c6b5290600090a4601180546001600160a01b0319166001600160a01b0384161790555b6012546001600160a01b038281169116146110ef576001600160a01b0381166110795760405162461bcd60e51b8152602060048201526024808201527f4a69677361773a20546865206a696773617757616c6c65742063616e6e6f74206044820152630626520360e41b60648201526084016108e1565b6012546040516b1a9a59dcd85dd5d85b1b195d60a21b81526001600160a01b0391821691831690600c01604051908190038120907f4af24be54adc5e716fbcaa3fca0ad593e28dff90dffd49487c0a33b1547c6b5290600090a4601280546001600160a01b0319166001600160a01b0383161790555b505050565b6005546001600160a01b0316331461111e5760405162461bcd60e51b81526004016108e190612cc3565b61112b6013848484611efe565b6040516c18985cd95199595ccb54d95b1b609a1b8152600d015b6040805191829003822060ff86811684528581166020850152841683830152905190917f0fc5b99eebb78c10fca186b25746da968ffa81b56e2a79e89fd5ed16f238b576919081900360600190a2505050565b6005546001600160a01b031633146111c25760405162461bcd60e51b81526004016108e190612cc3565b6001600160a01b0382166000908152601b602052604090205481151560ff9091161515036112025760405162461bcd60e51b81526004016108e190612cf8565b6001600160a01b0382166000818152601b6020908152604091829020805460ff191685151590811790915591519182527ff5133f371b17bf21ce0df4ae2c1b6e11ca7c2f27257eb55282edb1ccfd4ecb2e9101610bbf565b6005546001600160a01b031633146112845760405162461bcd60e51b81526004016108e190612cc3565b6001600160a01b0381166000908152601c602052604090205460ff16156112f85760405162461bcd60e51b815260206004820152602260248201527f4a69677361773a204163636f756e7420697320616c726561647920626c6f636b604482015261195960f21b60648201526084016108e1565b6202a3006016544261130a9190612d60565b1061136a5760405162461bcd60e51b815260206004820152602a60248201527f4a69677361773a2054696d6520746f20626c6f636b206163636f756e74732068604482015269185cc8195e1c1a5c995960b21b60648201526084016108e1565b6001600160a01b0381166000818152601c6020526040808220805460ff1916600190811790915590519092917f2f092974a5a89dc001cc04aa60bc3afe575e0b7444ef2197f7bb5714b51528ba91a350565b60606004805461081e90612c89565b60006108ae338461096685604051806060016040528060258152602001613022602591393360009081526001602090815260408083206001600160a01b038d1684529091529020549190611ec4565b60006108ae338484611a47565b6005546001600160a01b031633146114515760405162461bcd60e51b81526004016108e190612cc3565b600f5481036114c85760405162461bcd60e51b815260206004820152603b60248201527f4a69677361773a2043616e6e6f7420757064617465206d696e696d756d546f6b60448201527f656e734265666f72655377617020746f2073616d652076616c7565000000000060648201526084016108e1565b600f5460405182907f5b0491f767c1463bea8972339f785795be1a38784cc6483cf649cdcbb28c46b090600090a3600f55565b6005546001600160a01b031633146115255760405162461bcd60e51b81526004016108e190612cc3565b6006546001600160a01b03908116908216036115975760405162461bcd60e51b815260206004820152602b60248201527f4a69677361773a2054686520726f7574657220616c726561647920686173207460448201526a686174206164647265737360a81b60648201526084016108e1565b6006546040516001600160a01b03918216918316907f2afbff3ed601a8723765c7072d8ea8445e08f6f1874afd34a2b747a272c3ebad90600090a3600680546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b0316331461161e5760405162461bcd60e51b81526004016108e190612cc3565b6001600160a01b0382166000908152601a602052604090205481151560ff90911615150361165e5760405162461bcd60e51b81526004016108e190612cf8565b6001600160a01b0382166000818152601a6020908152604091829020805460ff191685151590811790915591519182527fa856ba9fdc54a5434b2359874c95612f520a2d7f858864ae98d15c1b2099ca8b9101610bbf565b60075460009082106116c757600091505b6000600760000183815481106116df576116df612d77565b6000918252602090912001546001600160a01b03169392505050565b6005546001600160a01b031633146117255760405162461bcd60e51b81526004016108e190612cc3565b6001600160a01b038216600081815260186020908152604091829020805460ff191685151590811790915591519182527fcb9f97b7b4b41413e5c8d418a8cf9a88db1cf34dee66b213d070faf881d9d3509101610bbf565b6005546001600160a01b031633146117a75760405162461bcd60e51b81526004016108e190612cc3565b6117b460138484846120c7565b6040516b62617365466565732d42757960a01b8152600c01611145565b6005546001600160a01b031633146117fb5760405162461bcd60e51b81526004016108e190612cc3565b6001600160a01b0381166118605760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016108e1565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b6000806118c98385612d8d565b90508381101561191b5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f77000000000060448201526064016108e1565b9392505050565b6001600160a01b0383166119845760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016108e1565b6001600160a01b0382166119e55760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016108e1565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b038316611a6d5760405162461bcd60e51b81526004016108e190612da5565b6001600160a01b038216611a935760405162461bcd60e51b81526004016108e190612dea565b80600003611aa7576110ef8383600061227d565b6001600160a01b038084166000818152601d6020908152604080832054948716835280832054938352601890915290205460ff928316929182169116158015611b0957506001600160a01b03841660009081526018602052604090205460ff16155b15611d0257600b5460ff16611b6f5760405162461bcd60e51b815260206004820152602660248201527f4a69677361773a2054726164696e672069732063757272656e746c792064697360448201526530b13632b21760d11b60648201526084016108e1565b6001600160a01b0384166000908152601c602052604090205460ff1615611bd85760405162461bcd60e51b815260206004820152601a60248201527f4a69677361773a204163636f756e7420697320626c6f636b656400000000000060448201526064016108e1565b6001600160a01b0385166000908152601c602052604090205460ff1615611c415760405162461bcd60e51b815260206004820152601a60248201527f4a69677361773a204163636f756e7420697320626c6f636b656400000000000060448201526064016108e1565b6001600160a01b0384166000908152601b602052604090205460ff16611d0257600d5483611c84866001600160a01b031660009081526020819052604090205490565b611c8e9190612d8d565b1115611d025760405162461bcd60e51b815260206004820152603b60248201527f4a69677361773a2045787065637465642077616c6c657420616d6f756e74206560448201527f78636565647320746865206d617857616c6c6574416d6f756e742e000000000060648201526084016108e1565b611d0e82828688612386565b600f5430600090815260208190526040902054600b549111159060ff168015611d345750805b8015611d435750600e5460ff16155b8015611d5a5750601e546301000000900460ff1615155b8015611d7e57506001600160a01b0385166000908152601d602052604090205460ff165b15611da357600e805460ff19166001179055611d98612599565b600e805460ff191690555b600e5460009060ff16158015611dbb5750600b5460ff165b6001600160a01b0388166000908152601a602052604090205490915060ff1680611dfd57506001600160a01b0386166000908152601a602052604090205460ff165b15611e06575060005b808015611e1e5750601e546301000000900460ff1615155b15611e6557601e54600090606490611e40906301000000900460ff1688612e2d565b611e4a9190612e62565b9050611e568187612d60565b9550611e6388308361227d565b505b611e7087878761227d565b611e9887611e93896001600160a01b031660009081526020819052604090205490565b612798565b611ebb86611e93886001600160a01b031660009081526020819052604090205490565b50505050505050565b60008184841115611ee85760405162461bcd60e51b81526004016108e19190612a69565b506000611ef58486612d60565b95945050505050565b600284015460ff8481166101009092041614611f8f57604051711b1a5c5d5a591a5d1e51995953db94d95b1b60721b815260120160405190819003812060028601548654919260ff6101009092048216929187169160008051602061300283398151915291611f709160481b90612e76565b60405180910390a460028401805461ff00191661010060ff8616021790555b600284015460ff8381166301000000909204161461202957604051721bdc195c985d1a5bdb9cd1995953db94d95b1b606a1b815260130160405190819003812060028601548654919260ff630100000090920482169291861691600080516020613002833981519152916120069160481b90612e76565b60405180910390a460028401805463ff0000001916630100000060ff8516021790555b600284015460ff828116600160281b90920416146120c1576040516e1a9a59dcd85dd1995953db94d95b1b608a1b8152600f0160405190819003812060028601548654919260ff600160281b909204821692918516916000805160206130028339815191529161209c9160481b90612e76565b60405180910390a460028401805465ff00000000001916600160281b60ff8416021790555b50505050565b600284015460ff84811691161461214857604051706c69717569646974794665654f6e42757960781b815260110160405190819003812060028601548654919260ff91821692918716916000805160206130028339815191529161212e9160481b90612e76565b60405180910390a460028401805460ff191660ff85161790555b600284015460ff8381166201000090920416146121dd57604051716f7065726174696f6e734665654f6e42757960701b815260120160405190819003812060028601548654919260ff6201000090920482169291861691600080516020613002833981519152916121bc9160481b90612e76565b60405180910390a460028401805462ff000019166201000060ff8516021790555b600284015460ff82811664010000000090920416146120c1576040516d6a69677361774665654f6e42757960901b8152600e0160405190819003812060028601548654919260ff64010000000090920482169291851691600080516020613002833981519152916122519160481b90612e76565b60405180910390a460028401805460ff83166401000000000264ff000000001990911617905550505050565b6001600160a01b0383166122a35760405162461bcd60e51b81526004016108e190612da5565b6001600160a01b0382166122c95760405162461bcd60e51b81526004016108e190612dea565b61230681604051806060016040528060268152602001612fb4602691396001600160a01b0386166000908152602081905260409020549190611ec4565b6001600160a01b03808516600090815260208190526040808220939093559084168152205461233590826118bc565b6001600160a01b038381166000818152602081815260409182902094909455518481529092918616917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101611a3a565b601e805462ffffff191690558315612403576005601754436123a89190612d60565b116123bf57601e805460ff19166064179055612403565b601554601e8054640100000000830460ff9081166201000090810262ff00001991860483166101000261ffff19909416929095169190911791909117169190911790555b821561244f57601554601e805461010080840460ff90811661ffff1990931692909217630100000085048316919091021762ff00001916600160281b9093041662010000029190911790555b8215801561245b575083155b80156124a157506001600160a01b03811660009081526019602052604090205460ff16806124a157506001600160a01b03821660009081526019602052604090205460ff165b156124ec57601554601e805461010080840460ff90811661ffff1990931692909217630100000085048316919091021762ff00001916600160281b9093041662010000029190911790555b601e5460ff62010000820481169161250c91610100820481169116612e8d565b6125169190612e8d565b601e805460ff928316630100000090810263ff000000198316811793849055604080519186169386169390931781526101008404851660208201526201000084048516818401529204909216606082015290517fe732842e0997f2bd5f26f9b53d4f761dfb12c53c4352fa949eb7b4d8522dd25b9181900360800190a150505050565b30600090815260208190526040812054601e549091479160ff630100000082048116929160029184916125cd911687612e2d565b6125d79190612e62565b6125e19190612e62565b905060006125ef8286612d60565b90506125fa81612863565b60006126068547612d60565b601e5490915060009061261e9060029060ff16612eb2565b601e5461263591906301000000900460ff16612ed4565b601e5460ff91821692506000916002918491612652911686612e2d565b61265c9190612e62565b6126669190612e62565b601e54909150600090839061268390610100900460ff1686612e2d565b61268d9190612e62565b9050600061269b8284612d8d565b6126a59086612d60565b6011546040519192506001600160a01b03169083156108fc029084906000818181858888f193505050501580156126e0573d6000803e3d6000fd5b506012546040516001600160a01b039091169082156108fc029083906000818181858888f1935050505015801561271b573d6000803e3d6000fd5b50861561276e5761272c87846129b5565b60408051878152602081018590529081018890527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a15b5050601e805460ff90971663010000000263ff000000199097169690961790955550505050505050565b801561281c57604051632f0ad01760e21b8152600760048201526001600160a01b03831660248201526044810182905273d1a7de14b92f3dc141b67d979af737f6656926159063bc2b405c906064015b60006040518083038186803b15801561280057600080fd5b505af4158015612814573d6000803e3d6000fd5b505050505050565b60405163131836e760e21b8152600760048201526001600160a01b038316602482015273d1a7de14b92f3dc141b67d979af737f66569261590634c60db9c906044016127e8565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061289857612898612d77565b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa1580156128f1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129159190612ef7565b8160018151811061292857612928612d77565b6001600160a01b03928316602091820292909201015260065461294e9130911684611922565b60065460405163791ac94760e01b81526001600160a01b039091169063791ac94790612987908590600090869030904290600401612f14565b600060405180830381600087803b1580156129a157600080fd5b505af1158015612814573d6000803e3d6000fd5b6006546129cd9030906001600160a01b031684611922565b60065460105460405163f305d71960e01b81523060048201526024810185905260006044820181905260648201526001600160a01b0391821660848201524260a482015291169063f305d71990839060c40160606040518083038185885af1158015612a3d573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612a629190612f85565b5050505050565b600060208083528351808285015260005b81811015612a9657858101830151858201604001528201612a7a565b81811115612aa8576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b0381168114612ad357600080fd5b50565b60008060408385031215612ae957600080fd5b8235612af481612abe565b946020939093013593505050565b600080600060608486031215612b1757600080fd5b8335612b2281612abe565b92506020840135612b3281612abe565b929592945050506040919091013590565b600060208284031215612b5557600080fd5b5035919050565b60008060408385031215612b6f57600080fd5b8235612b7a81612abe565b915060208301358015158114612b8f57600080fd5b809150509250929050565b600060208284031215612bac57600080fd5b813561191b81612abe565b600080600060608486031215612bcc57600080fd5b8335612bd781612abe565b92506020840135612be781612abe565b91506040840135612bf781612abe565b809150509250925092565b803560ff81168114612c1357600080fd5b919050565b600080600060608486031215612c2d57600080fd5b612c3684612c02565b9250612c4460208501612c02565b9150612c5260408501612c02565b90509250925092565b60008060408385031215612c6e57600080fd5b8235612c7981612abe565b91506020830135612b8f81612abe565b600181811c90821680612c9d57607f821691505b602082108103612cbd57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526032908201527f4a69677361773a204163636f756e7420697320616c7265616479207468652076604082015271616c7565206f6620276578636c756465642760701b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b600082821015612d7257612d72612d4a565b500390565b634e487b7160e01b600052603260045260246000fd5b60008219821115612da057612da0612d4a565b500190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b6000816000190483118215151615612e4757612e47612d4a565b500290565b634e487b7160e01b600052601260045260246000fd5b600082612e7157612e71612e4c565b500490565b68ffffffffffffffffff1991909116815260200190565b600060ff821660ff84168060ff03821115612eaa57612eaa612d4a565b019392505050565b600060ff831680612ec557612ec5612e4c565b8060ff84160491505092915050565b600060ff821660ff841680821015612eee57612eee612d4a565b90039392505050565b600060208284031215612f0957600080fd5b815161191b81612abe565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015612f645784516001600160a01b031683529383019391830191600101612f3f565b50506001600160a01b03969096166060850152505050608001529392505050565b600080600060608486031215612f9a57600080fd5b835192506020840151915060408401519050925092509256fe45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636500edc71549f0cbe47086c2237ce0cf874d6897fd1d7ce43ee6b65c0230d7606e45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa264697066735822122011aa1d82accf924d995f301e3416d3906d4ea02265a5b4ecdc7279685f52369464736f6c634300080f0033

Libraries Used


Deployed Bytecode Sourcemap

9926:16651:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10288:28;;;;;;;;;;-1:-1:-1;10288:28:0;;;;;;;;;;;179:14:1;;172:22;154:41;;142:2;127:18;10288:28:0;;;;;;;;6466:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;7290:154::-;;;;;;;;;;-1:-1:-1;7290:154:0;;;;;:::i;:::-;;:::i;19385:119::-;;;;;;;;;;-1:-1:-1;19469:15:0;:27;19385:119;;;1410:25:1;;;1398:2;1383:18;19385:119:0;1264:177:1;14058:235:0;;;;;;;;;;;;;:::i;:::-;;10020:30;;;;;;;;;;-1:-1:-1;10020:30:0;;;;-1:-1:-1;;;;;10020:30:0;;;;;;-1:-1:-1;;;;;1625:32:1;;;1607:51;;1595:2;1580:18;10020:30:0;1446:218:1;6751:99:0;;;;;;;;;;-1:-1:-1;6833:12:0;;6751:99;;7449:313;;;;;;;;;;-1:-1:-1;7449:313:0;;;;;:::i;:::-;;:::i;18228:255::-;;;;;;;;;;-1:-1:-1;18228:255:0;;;;;:::i;:::-;;:::i;6662:84::-;;;;;;;;;;-1:-1:-1;6662:84:0;;6739:2;2457:36:1;;2445:2;2430:18;6662:84:0;2315:184:1;14296:82:0;;;;;;;;;;;;;:::i;7767:203::-;;;;;;;;;;-1:-1:-1;7767:203:0;;;;;:::i;:::-;;:::i;16962:326::-;;;;;;;;;;-1:-1:-1;16962:326:0;;;;;:::i;:::-;;:::i;10054:38::-;;;;;;;;;;;;;;;15849:210;;;;;;;;;;-1:-1:-1;15849:210:0;;;;;:::i;:::-;;:::i;18793:246::-;;;;;;;;;;;;;:::i;6855:118::-;;;;;;;;;;-1:-1:-1;6855:118:0;;;;;:::i;:::-;-1:-1:-1;;;;;6950:18:0;6929:7;6950:18;;;;;;;;;;;;6855:118;5700:133;;;;;;;;;;;;;:::i;16062:897::-;;;;;;;;;;-1:-1:-1;16062:897:0;;;;;:::i;:::-;;:::i;17620:322::-;;;;;;;;;;-1:-1:-1;17620:322:0;;;;;:::i;:::-;;:::i;15193:318::-;;;;;;;;;;-1:-1:-1;15193:318:0;;;;;:::i;:::-;;:::i;15514:332::-;;;;;;;;;;-1:-1:-1;15514:332:0;;;;;:::i;:::-;;:::i;5516:70::-;;;;;;;;;;-1:-1:-1;5575:6:0;;-1:-1:-1;;;;;5575:6:0;5516:70;;6562:95;;;;;;;;;;;;;:::i;10715:27::-;;;;;;;;;;-1:-1:-1;10715:27:0;;;;-1:-1:-1;;;;;10715:27:0;;;7975:254;;;;;;;;;;-1:-1:-1;7975:254:0;;;;;:::i;:::-;;:::i;6978:160::-;;;;;;;;;;-1:-1:-1;6978:160:0;;;;;:::i;:::-;;:::i;10485:60::-;;;;;;;;;;;;;;;;18486:304;;;;;;;;;;-1:-1:-1;18486:304:0;;;;;:::i;:::-;;:::i;11543:58::-;;;;;;;;;;-1:-1:-1;11543:58:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;17945:280;;;;;;;;;;-1:-1:-1;17945:280:0;;;;;:::i;:::-;;:::i;14909:281::-;;;;;;;;;;-1:-1:-1;14909:281:0;;;;;:::i;:::-;;:::i;19507:254::-;;;;;;;;;;-1:-1:-1;19507:254:0;;;;;:::i;:::-;;:::i;19057:159::-;;;;;;;;;;-1:-1:-1;19139:23:0;;;;;;;19164:24;;;;;;19190:20;;;;;19057:159;;;;4627:4:1;4615:17;;;4597:36;;4669:17;;;4664:2;4649:18;;4642:45;4723:17;;4703:18;;;4696:45;;;;4585:2;4570:18;19057:159:0;4407:340:1;10577:60:0;;;;;;;;;;;;;;;;14704:202;;;;;;;;;;-1:-1:-1;14704:202:0;;;;;:::i;:::-;;:::i;10646:30::-;;;;;;;;;;-1:-1:-1;10646:30:0;;;;-1:-1:-1;;;;;10646:30:0;;;7143:142;;;;;;;;;;-1:-1:-1;7143:142:0;;;;;:::i;:::-;-1:-1:-1;;;;;7253:18:0;;;7232:7;7253:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;7143:142;17306:311;;;;;;;;;;-1:-1:-1;17306:311:0;;;;;:::i;:::-;;:::i;5838:223::-;;;;;;;;;;-1:-1:-1;5838:223:0;;;;;:::i;:::-;;:::i;10680:31::-;;;;;;;;;;-1:-1:-1;10680:31:0;;;;-1:-1:-1;;;;;10680:31:0;;;19219:163;;;;;;;;;;-1:-1:-1;19302:24:0;;;;;;;;;19328:25;;;;;;-1:-1:-1;;;19355:21:0;;;;19219:163;;6466:91;6520:13;6547:5;6540:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6466:91;:::o;7290:154::-;7373:4;7384:39;4982:10;7407:7;7416:6;7384:8;:39::i;:::-;-1:-1:-1;7435:4:0;7290:154;;;;:::o;14058:235::-;5625:6;;-1:-1:-1;;;;;5625:6:0;4982:10;5625:22;5617:67;;;;-1:-1:-1;;;5617:67:0;;;;;;;:::i;:::-;;;;;;;;;14109:16:::1;:23:::0;;-1:-1:-1;;14109:23:0::1;14128:4;14109:23;::::0;;14147:21:::1;::::0;14109:16:::1;14147:26:::0;14143:146:::1;;14214:15;14190:21;:39:::0;14265:12:::1;14244:18;:33:::0;14143:146:::1;14058:235::o:0;7449:313::-;7568:4;7579:36;7589:6;7597:9;7608:6;7579:9;:36::i;:::-;7620:121;7629:6;4982:10;7651:89;7689:6;7651:89;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;7651:19:0;;;;;;:11;:19;;;;;;;;4982:10;7651:33;;;;;;;;;;:37;:89::i;:::-;7620:8;:121::i;:::-;-1:-1:-1;7753:4:0;7449:313;;;;;:::o;18228:255::-;5625:6;;-1:-1:-1;;;;;5625:6:0;4982:10;5625:22;5617:67;;;;-1:-1:-1;;;5617:67:0;;;;;;;:::i;:::-;18318:15:::1;;18306:8;:27:::0;18298:91:::1;;;::::0;-1:-1:-1;;;18298:91:0;;6093:2:1;18298:91:0::1;::::0;::::1;6075:21:1::0;6132:2;6112:18;;;6105:30;6171:34;6151:18;;;6144:62;-1:-1:-1;;;6222:18:1;;;6215:49;6281:19;;18298:91:0::1;5891:415:1::0;18298:91:0::1;18431:15;::::0;18399:48:::1;::::0;18421:8;;18399:48:::1;::::0;;;::::1;18452:15;:26:::0;18228:255::o;14296:82::-;5625:6;;-1:-1:-1;;;;;5625:6:0;4982:10;5625:22;5617:67;;;;-1:-1:-1;;;5617:67:0;;;;;;;:::i;:::-;14349:16:::1;:24:::0;;-1:-1:-1;;14349:24:0::1;::::0;;14296:82::o;7767:203::-;4982:10;7855:4;7898:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;7898:34:0;;;;;;;;;;7855:4;;7866:83;;7889:7;;7898:50;;7937:10;7898:38;:50::i;16962:326::-;5625:6;;-1:-1:-1;;;;;5625:6:0;4982:10;5625:22;5617:67;;;;-1:-1:-1;;;5617:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;17064:38:0;::::1;;::::0;;;:29:::1;:38;::::0;;;;;:47;::::1;;:38;::::0;;::::1;:47;;::::0;17056:116:::1;;;::::0;-1:-1:-1;;;17056:116:0;;6513:2:1;17056:116:0::1;::::0;::::1;6495:21:1::0;6552:2;6532:18;;;6525:30;6591:34;6571:18;;;6564:62;6662:26;6642:18;;;6635:54;6706:19;;17056:116:0::1;6311:420:1::0;17056:116:0::1;-1:-1:-1::0;;;;;17177:38:0;::::1;;::::0;;;:29:::1;:38;::::0;;;;;;;;:46;;-1:-1:-1;;17177:46:0::1;::::0;::::1;;::::0;;::::1;::::0;;;17233:50;;154:41:1;;;17233:50:0::1;::::0;127:18:1;17233:50:0::1;;;;;;;;16962:326:::0;;:::o;15849:210::-;5625:6;;-1:-1:-1;;;;;5625:6:0;4982:10;5625:22;5617:67;;;;-1:-1:-1;;;5617:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;15922:19:0;::::1;;::::0;;;:10:::1;:19;::::0;;;;;::::1;;15914:62;;;::::0;-1:-1:-1;;;15914:62:0;;6938:2:1;15914:62:0::1;::::0;::::1;6920:21:1::0;6977:2;6957:18;;;6950:30;7016:32;6996:18;;;6989:60;7066:18;;15914:62:0::1;6736:354:1::0;15914:62:0::1;-1:-1:-1::0;;;;;15981:19:0;::::1;16003:5;15981:19:::0;;;:10:::1;:19;::::0;;;;;:27;;-1:-1:-1;;15981:27:0::1;::::0;;16018:36;16003:5;;15981:19;16018:36:::1;::::0;16003:5;;16018:36:::1;15849:210:::0;:::o;18793:246::-;5625:6;;-1:-1:-1;;;;;5625:6:0;4982:10;5625:22;5617:67;;;;-1:-1:-1;;;5617:67:0;;;;;;;:::i;:::-;18865:21:::1;18848:14;18923:7;5575:6:::0;;-1:-1:-1;;;;;5575:6:0;;5516:70;18923:7:::1;-1:-1:-1::0;;;;;18915:21:0::1;18945:6;18915:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18897:59;;;18971:7;18967:68;;;18999:24;::::0;1410:25:1;;;18999:24:0::1;::::0;1398:2:1;1383:18;18999:24:0::1;;;;;;;18967:68;18840:199;;18793:246::o:0;5700:133::-;5625:6;;-1:-1:-1;;;;;5625:6:0;4982:10;5625:22;5617:67;;;;-1:-1:-1;;;5617:67:0;;;;;;;:::i;:::-;5785:6:::1;::::0;5764:40:::1;::::0;5801:1:::1;::::0;-1:-1:-1;;;;;5785:6:0::1;::::0;5764:40:::1;::::0;5801:1;;5764:40:::1;5809:6;:19:::0;;-1:-1:-1;;;;;;5809:19:0::1;::::0;;5700:133::o;16062:897::-;5625:6;;-1:-1:-1;;;;;5625:6:0;4982:10;5625:22;5617:67;;;;-1:-1:-1;;;5617:67:0;;;;;;;:::i;:::-;16191:15:::1;::::0;-1:-1:-1;;;;;16191:37:0;;::::1;:15:::0;::::1;:37;16188:259;;-1:-1:-1::0;;;;;16244:32:0;::::1;16236:84;;;::::0;-1:-1:-1;;;16236:84:0;;7507:2:1;16236:84:0::1;::::0;::::1;7489:21:1::0;7546:2;7526:18;;;7519:30;7585:34;7565:18;;;7558:62;-1:-1:-1;;;7636:18:1;;;7629:37;7683:19;;16236:84:0::1;7305:403:1::0;16236:84:0::1;16383:15;::::0;16331:68:::1;::::0;-1:-1:-1;;;7915:30:1;;-1:-1:-1;;;;;16383:15:0;;::::1;::::0;16331:68;::::1;::::0;7970:2:1;7961:12;16331:68:0::1;::::0;;;;::::1;::::0;;;::::1;::::0;;;::::1;16405:15;:36:::0;;-1:-1:-1;;;;;;16405:36:0::1;-1:-1:-1::0;;;;;16405:36:0;::::1;;::::0;;16188:259:::1;16454:16;::::0;-1:-1:-1;;;;;16454:39:0;;::::1;:16:::0;::::1;:39;16451:268;;-1:-1:-1::0;;;;;16509:33:0;::::1;16501:86;;;::::0;-1:-1:-1;;;16501:86:0;;8186:2:1;16501:86:0::1;::::0;::::1;8168:21:1::0;8225:2;8205:18;;;8198:30;8264:34;8244:18;;;8237:62;-1:-1:-1;;;8315:18:1;;;8308:38;8363:19;;16501:86:0::1;7984:404:1::0;16501:86:0::1;16652:16;::::0;16598:71:::1;::::0;-1:-1:-1;;;8595:31:1;;-1:-1:-1;;;;;16652:16:0;;::::1;::::0;16598:71;::::1;::::0;8651:2:1;8642:12;16598:71:0::1;::::0;;;;::::1;::::0;;;::::1;::::0;;;::::1;16675:16;:38:::0;;-1:-1:-1;;;;;;16675:38:0::1;-1:-1:-1::0;;;;;16675:38:0;::::1;;::::0;;16451:268:::1;16726:12;::::0;-1:-1:-1;;;;;16726:31:0;;::::1;:12:::0;::::1;:31;16723:232;;-1:-1:-1::0;;;;;16773:29:0;::::1;16765:78;;;::::0;-1:-1:-1;;;16765:78:0;;8867:2:1;16765:78:0::1;::::0;::::1;8849:21:1::0;8906:2;8886:18;;;8879:30;8945:34;8925:18;;;8918:62;-1:-1:-1;;;8996:18:1;;;8989:34;9040:19;;16765:78:0::1;8665:400:1::0;16765:78:0::1;16900:12;::::0;16854:59:::1;::::0;-1:-1:-1;;;9272:27:1;;-1:-1:-1;;;;;16900:12:0;;::::1;::::0;16854:59;::::1;::::0;9324:2:1;9315:12;16854:59:0::1;::::0;;;;::::1;::::0;;;::::1;::::0;;;::::1;16919:12;:30:::0;;-1:-1:-1;;;;;;16919:30:0::1;-1:-1:-1::0;;;;;16919:30:0;::::1;;::::0;;16723:232:::1;16062:897:::0;;;:::o;17620:322::-;5625:6;;-1:-1:-1;;;;;5625:6:0;4982:10;5625:22;5617:67;;;;-1:-1:-1;;;5617:67:0;;;;;;;:::i;:::-;17749:91:::1;17773:5;17780:19;17801:20;17823:16;17749:23;:91::i;:::-;17850:87;::::0;-1:-1:-1;;;9540:28:1;;9593:2;9584:12;17850:87:0::1;;::::0;;;;;::::1;::::0;;4627:4:1;4615:17;;;4597:36;;4669:17;;;4664:2;4649:18;;4642:45;4723:17;;4703:18;;;4696:45;17850:87:0;;;;::::1;::::0;;;;;4585:2:1;17850:87:0;;::::1;17620:322:::0;;;:::o;15193:318::-;5625:6;;-1:-1:-1;;;;;5625:6:0;4982:10;5625:22;5617:67;;;;-1:-1:-1;;;5617:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;15292:38:0;::::1;;::::0;;;:29:::1;:38;::::0;;;;;:50;::::1;;:38;::::0;;::::1;:50;;::::0;15284:113:::1;;;;-1:-1:-1::0;;;15284:113:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;15402:38:0;::::1;;::::0;;;:29:::1;:38;::::0;;;;;;;;:49;;-1:-1:-1;;15402:49:0::1;::::0;::::1;;::::0;;::::1;::::0;;;15461:45;;154:41:1;;;15461:45:0::1;::::0;127:18:1;15461:45:0::1;14:187:1::0;15514:332:0;5625:6;;-1:-1:-1;;;;;5625:6:0;4982:10;5625:22;5617:67;;;;-1:-1:-1;;;5617:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;15586:19:0;::::1;;::::0;;;:10:::1;:19;::::0;;;;;::::1;;15585:20;15577:67;;;::::0;-1:-1:-1;;;15577:67:0;;10228:2:1;15577:67:0::1;::::0;::::1;10210:21:1::0;10267:2;10247:18;;;10240:30;10306:34;10286:18;;;10279:62;-1:-1:-1;;;10357:18:1;;;10350:32;10399:19;;15577:67:0::1;10026:398:1::0;15577:67:0::1;11228:6;15676:21;;15658:15;:39;;;;:::i;:::-;15657:61;15649:116;;;::::0;-1:-1:-1;;;15649:116:0;;10893:2:1;15649:116:0::1;::::0;::::1;10875:21:1::0;10932:2;10912:18;;;10905:30;10971:34;10951:18;;;10944:62;-1:-1:-1;;;11022:18:1;;;11015:40;11072:19;;15649:116:0::1;10691:406:1::0;15649:116:0::1;-1:-1:-1::0;;;;;15770:19:0;::::1;;::::0;;;:10:::1;:19;::::0;;;;;:26;;-1:-1:-1;;15770:26:0::1;15792:4;15770:26:::0;;::::1;::::0;;;15806:35;;15792:4;;15770:19;15806:35:::1;::::0;::::1;15514:332:::0;:::o;6562:95::-;6618:13;6645:7;6638:14;;;;;:::i;7975:254::-;8068:4;8079:129;4982:10;8102:7;8111:96;8150:15;8111:96;;;;;;;;;;;;;;;;;4982:10;8111:25;;;;:11;:25;;;;;;;;-1:-1:-1;;;;;8111:34:0;;;;;;;;;;;;:38;:96::i;6978:160::-;7064:4;7075:42;4982:10;7099:9;7110:6;7075:9;:42::i;18486:304::-;5625:6;;-1:-1:-1;;;;;5625:6:0;4982:10;5625:22;5617:67;;;;-1:-1:-1;;;5617:67:0;;;;;;;:::i;:::-;18584:23:::1;;18572:8;:35:::0;18564:107:::1;;;::::0;-1:-1:-1;;;18564:107:0;;11304:2:1;18564:107:0::1;::::0;::::1;11286:21:1::0;11343:2;11323:18;;;11316:30;11382:34;11362:18;;;11355:62;11453:29;11433:18;;;11426:57;11500:19;;18564:107:0::1;11102:423:1::0;18564:107:0::1;18722:23;::::0;18681:65:::1;::::0;18712:8;;18681:65:::1;::::0;;;::::1;18751:23;:34:::0;18486:304::o;17945:280::-;5625:6;;-1:-1:-1;;;;;5625:6:0;4982:10;5625:22;5617:67;;;;-1:-1:-1;;;5617:67:0;;;;;;;:::i;:::-;18045:15:::1;::::0;-1:-1:-1;;;;;18045:15:0;;::::1;18023:38:::0;;::::1;::::0;18015:94:::1;;;::::0;-1:-1:-1;;;18015:94:0;;11732:2:1;18015:94:0::1;::::0;::::1;11714:21:1::0;11771:2;11751:18;;;11744:30;11810:34;11790:18;;;11783:62;-1:-1:-1;;;11861:18:1;;;11854:41;11912:19;;18015:94:0::1;11530:407:1::0;18015:94:0::1;18161:15;::::0;18119:59:::1;::::0;-1:-1:-1;;;;;18161:15:0;;::::1;::::0;18119:59;::::1;::::0;::::1;::::0;18161:15:::1;::::0;18119:59:::1;18183:15;:37:::0;;-1:-1:-1;;;;;;18183:37:0::1;-1:-1:-1::0;;;;;18183:37:0;;;::::1;::::0;;;::::1;::::0;;17945:280::o;14909:281::-;5625:6;;-1:-1:-1;;;;;5625:6:0;4982:10;5625:22;5617:67;;;;-1:-1:-1;;;5617:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;14998:27:0;::::1;;::::0;;;:18:::1;:27;::::0;;;;;:39;::::1;;:27;::::0;;::::1;:39;;::::0;14990:102:::1;;;;-1:-1:-1::0;;;14990:102:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;15097:27:0;::::1;;::::0;;;:18:::1;:27;::::0;;;;;;;;:38;;-1:-1:-1;;15097:38:0::1;::::0;::::1;;::::0;;::::1;::::0;;;15145:40;;154:41:1;;;15145:40:0::1;::::0;127:18:1;15145:40:0::1;14:187:1::0;19507:254:0;19615:15;:27;19582:7;;19599:43;;19596:76;;19665:1;19650:16;;19596:76;19676:15;19694;:20;;19715:12;19694:34;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;19694:34:0;;19507:254;-1:-1:-1;;;19507:254:0:o;14704:202::-;5625:6;;-1:-1:-1;;;;;5625:6:0;4982:10;5625:22;5617:67;;;;-1:-1:-1;;;5617:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;14793:38:0;::::1;;::::0;;;:29:::1;:38;::::0;;;;;;;;:48;;-1:-1:-1;;14793:48:0::1;::::0;::::1;;::::0;;::::1;::::0;;;14851:50;;154:41:1;;;14851:50:0::1;::::0;127:18:1;14851:50:0::1;14:187:1::0;17306:311:0;5625:6;;-1:-1:-1;;;;;5625:6:0;4982:10;5625:22;5617:67;;;;-1:-1:-1;;;5617:67:0;;;;;;;:::i;:::-;17432:87:::1;17455:5;17462:18;17482:19;17503:15;17432:22;:87::i;:::-;17529:83;::::0;-1:-1:-1;;;12276:27:1;;12328:2;12319:12;17529:83:0::1;12074:263:1::0;5838:223:0;5625:6;;-1:-1:-1;;;;;5625:6:0;4982:10;5625:22;5617:67;;;;-1:-1:-1;;;5617:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;5921:22:0;::::1;5913:73;;;::::0;-1:-1:-1;;;5913:73:0;;12544:2:1;5913:73:0::1;::::0;::::1;12526:21:1::0;12583:2;12563:18;;;12556:30;12622:34;12602:18;;;12595:62;-1:-1:-1;;;12673:18:1;;;12666:36;12719:19;;5913:73:0::1;12342:402:1::0;5913:73:0::1;6017:6;::::0;5996:38:::1;::::0;-1:-1:-1;;;;;5996:38:0;;::::1;::::0;6017:6:::1;::::0;5996:38:::1;::::0;6017:6:::1;::::0;5996:38:::1;6039:6;:17:::0;;-1:-1:-1;;;;;;6039:17:0::1;-1:-1:-1::0;;;;;6039:17:0;;;::::1;::::0;;;::::1;::::0;;5838:223::o;1986:160::-;2044:7;;2070:5;2074:1;2070;:5;:::i;:::-;2058:17;;2093:1;2088;:6;;2080:46;;;;-1:-1:-1;;;2080:46:0;;13084:2:1;2080:46:0;;;13066:21:1;13123:2;13103:18;;;13096:30;13162:29;13142:18;;;13135:57;13209:18;;2080:46:0;12882:351:1;2080:46:0;2140:1;1986:160;-1:-1:-1;;;1986:160:0:o;9480:330::-;-1:-1:-1;;;;;9589:19:0;;9581:68;;;;-1:-1:-1;;;9581:68:0;;13440:2:1;9581:68:0;;;13422:21:1;13479:2;13459:18;;;13452:30;13518:34;13498:18;;;13491:62;-1:-1:-1;;;13569:18:1;;;13562:34;13613:19;;9581:68:0;13238:400:1;9581:68:0;-1:-1:-1;;;;;9662:21:0;;9654:68;;;;-1:-1:-1;;;9654:68:0;;13845:2:1;9654:68:0;;;13827:21:1;13884:2;13864:18;;;13857:30;13923:34;13903:18;;;13896:62;-1:-1:-1;;;13974:18:1;;;13967:32;14016:19;;9654:68:0;13643:398:1;9654:68:0;-1:-1:-1;;;;;9727:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;9773:32;;1410:25:1;;;9773:32:0;;1383:18:1;9773:32:0;;;;;;;;9480:330;;;:::o;19776:1926::-;-1:-1:-1;;;;;19888:18:0;;19880:68;;;;-1:-1:-1;;;19880:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;19967:16:0;;19959:64;;;;-1:-1:-1;;;19959:64:0;;;;;;;:::i;:::-;20039:6;20049:1;20039:11;20036:92;;20067:28;20083:4;20089:2;20093:1;20067:15;:28::i;20036:92::-;-1:-1:-1;;;;;20159:31:0;;;20140:16;20159:31;;;:25;:31;;;;;;;;;20219:29;;;;;;;;;20265:35;;;:29;:35;;;;;;20159:31;;;;;20219:29;;;;20265:35;20264:36;:74;;;;-1:-1:-1;;;;;;20305:33:0;;;;;;:29;:33;;;;;;;;20304:34;20264:74;20261:517;;;20363:16;;;;20355:67;;;;-1:-1:-1;;;20355:67:0;;15058:2:1;20355:67:0;;;15040:21:1;15097:2;15077:18;;;15070:30;15136:34;15116:18;;;15109:62;-1:-1:-1;;;15187:18:1;;;15180:36;15233:19;;20355:67:0;14856:402:1;20355:67:0;-1:-1:-1;;;;;20446:14:0;;;;;;:10;:14;;;;;;;;20445:15;20437:54;;;;-1:-1:-1;;;20437:54:0;;15465:2:1;20437:54:0;;;15447:21:1;15504:2;15484:18;;;15477:30;15543:28;15523:18;;;15516:56;15589:18;;20437:54:0;15263:350:1;20437:54:0;-1:-1:-1;;;;;20515:16:0;;;;;;:10;:16;;;;;;;;20514:17;20506:56;;;;-1:-1:-1;;;20506:56:0;;15465:2:1;20506:56:0;;;15447:21:1;15504:2;15484:18;;;15477:30;15543:28;15523:18;;;15516:56;15589:18;;20506:56:0;15263:350:1;20506:56:0;-1:-1:-1;;;;;20582:33:0;;;;;;:29;:33;;;;;;;;20577:190;;20672:15;;20661:6;20645:13;20655:2;-1:-1:-1;;;;;6950:18:0;6929:7;6950:18;;;;;;;;;;;;6855:118;20645:13;:22;;;;:::i;:::-;20644:43;;20636:115;;;;-1:-1:-1;;;20636:115:0;;15820:2:1;20636:115:0;;;15802:21:1;15859:2;15839:18;;;15832:30;15898:34;15878:18;;;15871:62;15969:29;15949:18;;;15942:57;16016:19;;20636:115:0;15618:423:1;20636:115:0;20790:47;20803:11;20816:10;20828:2;20832:4;20790:12;:47::i;:::-;20891:23;;20881:4;20848:12;6950:18;;;;;;;;;;;20945:16;;-1:-1:-1;;20863:51:0;;20945:16;;:40;;;;;20978:7;20945:40;:67;;;;-1:-1:-1;21003:9:0;;;;21002:10;20945:67;:97;;;;-1:-1:-1;21029:9:0;;;;;;;:13;;20945:97;:143;;;;-1:-1:-1;;;;;;21059:29:0;;;;;;:25;:29;;;;;;;;20945:143;20927:280;;;21115:9;:16;;-1:-1:-1;;21115:16:0;21127:4;21115:16;;;21146:17;:15;:17::i;:::-;21178:9;:17;;-1:-1:-1;;21178:17:0;;;20927:280;21235:9;;21219:12;;21235:9;;21234:10;:30;;;;-1:-1:-1;21248:16:0;;;;21234:30;-1:-1:-1;;;;;21280:24:0;;;;;;:18;:24;;;;;;21219:45;;-1:-1:-1;21280:24:0;;;:50;;-1:-1:-1;;;;;;21308:22:0;;;;;;:18;:22;;;;;;;;21280:50;21277:96;;;-1:-1:-1;21356:5:0;21277:96;21387:7;:24;;;;-1:-1:-1;21398:9:0;;;;;;;:13;;21387:24;21383:187;;;21451:9;;21428:11;;21463:3;;21442:18;;21451:9;;;;;21442:6;:18;:::i;:::-;:24;;;;:::i;:::-;21428:38;-1:-1:-1;21490:12:0;21428:38;21490:6;:12;:::i;:::-;21481:21;;21517:41;21533:4;21547;21554:3;21517:15;:41::i;:::-;21413:157;21383:187;21582:33;21598:4;21604:2;21608:6;21582:15;:33::i;:::-;21622:34;21634:4;21640:15;21650:4;-1:-1:-1;;;;;6950:18:0;6929:7;6950:18;;;;;;;;;;;;6855:118;21640:15;21622:11;:34::i;:::-;21667:30;21679:2;21683:13;21693:2;-1:-1:-1;;;;;6950:18:0;6929:7;6950:18;;;;;;;;;;;;6855:118;21667:30;19869:1833;;;;19776:1926;;;:::o;2283:171::-;2369:7;2399:12;2391:6;;;;2383:29;;;;-1:-1:-1;;;2383:29:0;;;;;;;;:::i;:::-;-1:-1:-1;2417:9:0;2429:5;2433:1;2429;:5;:::i;:::-;2417:17;2283:171;-1:-1:-1;;;;;2283:171:0:o;23040:842::-;23216:22;;;;:45;;;;:22;;;;;:45;23212:222;;23274:104;;-1:-1:-1;;;16678:33:1;;16736:2;16727:12;23274:104:0;;;;;;;;23317:22;;;;23363:14;;23274:104;;23317:22;;;;;;;;23274:104;;;;-1:-1:-1;;;;;;;;;;;23274:104:0;;;23363:14;;;23274:104;:::i;:::-;;;;;;;;23384:22;;;:44;;-1:-1:-1;;23384:44:0;;;;;;;;;23212:222;23442:23;;;;:47;;;;:23;;;;;:47;23438:229;;23502:107;;-1:-1:-1;;;17166:34:1;;17225:2;17216:12;23502:107:0;;;;;;;;23546:23;;;;23594:14;;23502:107;;23546:23;;;;;;;;23502:107;;;;-1:-1:-1;;;;;;;;;;;23502:107:0;;;23594:14;;;23502:107;:::i;:::-;;;;;;;;23615:23;;;:46;;-1:-1:-1;;23615:46:0;;;;;;;;;23438:229;23681:19;;;;:39;;;;-1:-1:-1;;;23681:19:0;;;;:39;23677:201;;23733:95;;-1:-1:-1;;;17441:30:1;;17496:2;17487:12;23733:95:0;;;;;;;;23773:19;;;;23813:14;;23733:95;;23773:19;-1:-1:-1;;;23773:19:0;;;;;;23733:95;;;;-1:-1:-1;;;;;;;;;;;23733:95:0;;;23813:14;;;23733:95;:::i;:::-;;;;;;;;23834:19;;;:38;;-1:-1:-1;;23834:38:0;-1:-1:-1;;;23834:38:0;;;;;;;23677:201;23040:842;;;;:::o;23885:812::-;24058:21;;;;:43;;;;:21;;:43;24054:215;;24114:101;;-1:-1:-1;;;17712:32:1;;17769:2;17760:12;24114:101:0;;;;;;;;24156:21;;;;24200:14;;24114:101;;24156:21;;;;;24114:101;;;;-1:-1:-1;;;;;;;;;;;24114:101:0;;;24200:14;;;24114:101;:::i;:::-;;;;;;;;24221:21;;;:42;;-1:-1:-1;;24221:42:0;;;;;;;24054:215;24277:22;;;;:45;;;;:22;;;;;:45;24273:222;;24335:104;;-1:-1:-1;;;17985:33:1;;18043:2;18034:12;24335:104:0;;;;;;;;24378:22;;;;24424:14;;24335:104;;24378:22;;;;;;;;24335:104;;;;-1:-1:-1;;;;;;;;;;;24335:104:0;;;24424:14;;;24335:104;:::i;:::-;;;;;;;;24445:22;;;:44;;-1:-1:-1;;24445:44:0;;;;;;;;;24273:222;24503:18;;;;:37;;;;:18;;;;;:37;24499:194;;24553:92;;-1:-1:-1;;;18259:29:1;;18313:2;18304:12;24553:92:0;;;;;;;;24592:18;;;;24630:14;;24553:92;;24592:18;;;;;;;;24553:92;;;;-1:-1:-1;;;;;;;;;;;24553:92:0;;;24630:14;;;24553:92;:::i;:::-;;;;;;;;24651:18;;;:36;;;;;;;-1:-1:-1;;24651:36:0;;;;;;23885:812;;;;:::o;8234:509::-;-1:-1:-1;;;;;8347:20:0;;8339:70;;;;-1:-1:-1;;;8339:70:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;8422:23:0;;8414:71;;;;-1:-1:-1;;;8414:71:0;;;;;;;:::i;:::-;8562;8584:6;8562:71;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;8562:17:0;;:9;:17;;;;;;;;;;;;:71;:21;:71::i;:::-;-1:-1:-1;;;;;8542:17:0;;;:9;:17;;;;;;;;;;;:91;;;;8661:20;;;;;;;:32;;8686:6;8661:24;:32::i;:::-;-1:-1:-1;;;;;8638:20:0;;;:9;:20;;;;;;;;;;;;:55;;;;8703:35;1410:25:1;;;8638:20:0;;8703:35;;;;;;1383:18:1;8703:35:0;1264:177:1;21705:1086:0;21801:13;:17;;-1:-1:-1;;21852:14:0;;;21873:340;;;;21946:1;21924:18;;21909:12;:33;;;;:::i;:::-;:38;21905:297;;21968:13;:19;;-1:-1:-1;;21968:19:0;21984:3;21968:19;;;21905:297;;;22051:23;;22035:13;:39;;22166:20;;;22051:23;22166:20;;;22110:24;22153:33;;;-1:-1:-1;;22110:24:0;;;;;22051:23;22093:41;-1:-1:-1;;22093:41:0;;;22051:23;;;;22093:41;;;;;;;;22153:33;;;;;;;21905:297;22224:10;22220:168;;;22261:24;;22245:13;:40;;22261:24;;;;;;;;-1:-1:-1;;22291:42:0;;;;;;;22308:25;;;;;22291:42;;;;;-1:-1:-1;;22348:34:0;-1:-1:-1;;;22361:21:0;;;;22348:34;;;;;;;;22220:168;22397:10;22396:11;:27;;;;;22412:11;22411:12;22396:27;:105;;;;-1:-1:-1;;;;;;22428:35:0;;;;;;:29;:35;;;;;;;;;:72;;-1:-1:-1;;;;;;22467:33:0;;;;;;:29;:33;;;;;;;;22428:72;22392:260;;;22525:24;;22509:13;:40;;22525:24;;;;;;;;-1:-1:-1;;22555:42:0;;;;;;;22572:25;;;;;22555:42;;;;;-1:-1:-1;;22612:34:0;-1:-1:-1;;;22625:21:0;;;;22612:34;;;;;;;;22392:260;22701:10;;;;;;;;;22668:30;;22701:10;22684:14;;;;;22668:13;:30;:::i;:::-;:43;;;;:::i;:::-;22656:9;:55;;;;;;;;;;-1:-1:-1;;22656:55:0;;;;;;;;22721:65;;;22733:13;;;;;;;;;;18751:36:1;;22656:55:0;22748:14;;;;18818:2:1;18803:18;;18796:45;22764:10:0;;;;;18857:18:1;;;18850:45;22776:9:0;;;;;18926:2:1;18911:18;;18904:45;22721:65:0;;;;;;;18738:3:1;22721:65:0;;;21705:1086;;;;:::o;24700:1104::-;24784:4;24740:23;6950:18;;;;;;;;;;;24871:9;;6950:18;;24823:21;;24871:9;;;;;;;24740:23;24959:1;;24871:9;;24913:31;;24931:13;6950:18;24913:31;:::i;:::-;:43;;;;:::i;:::-;:47;;;;:::i;:::-;24887:73;-1:-1:-1;24965:20:0;24988:35;24887:73;24988:15;:35;:::i;:::-;24965:58;;25030:31;25048:12;25030:17;:31::i;:::-;25068:27;25098:41;25122:17;25098:21;:41;:::i;:::-;25179:13;;25068:71;;-1:-1:-1;25144:19:0;;25179:17;;25195:1;;25179:13;;:17;:::i;:::-;25166:9;;:31;;;:9;;;;;:31;:::i;:::-;25255:13;;25144:53;;;;;-1:-1:-1;25204:26:0;;25285:1;;25144:53;;25233:35;;25255:13;25233:19;:35;:::i;:::-;:49;;;;:::i;:::-;:53;;;;:::i;:::-;25343:14;;25204:82;;-1:-1:-1;25291:27:0;;25360:11;;25321:36;;25343:14;;;;;25321:19;:36;:::i;:::-;:50;;;;:::i;:::-;25291:80;-1:-1:-1;25376:23:0;25425:40;25291:80;25425:18;:40;:::i;:::-;25402:64;;:19;:64;:::i;:::-;25487:16;;25479:55;;25376:90;;-1:-1:-1;;;;;;25487:16:0;;25479:55;;;;;25514:19;;25487:16;25479:55;25487:16;25479:55;25514:19;25487:16;25479:55;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25553:12:0;;25545:47;;-1:-1:-1;;;;;25553:12:0;;;;25545:47;;;;;25576:15;;25553:12;25545:47;25553:12;25545:47;25576:15;25553:12;25545:47;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25609:19:0;;25605:163;;25636:50;25650:15;25667:18;25636:13;:50::i;:::-;25697:65;;;19532:25:1;;;19588:2;19573:18;;19566:34;;;19616:18;;;19609:34;;;25697:65:0;;19520:2:1;19505:18;25697:65:0;;;;;;;25605:163;-1:-1:-1;;25774:9:0;:25;;;;;;;;-1:-1:-1;;25774:25:0;;;;;;;;;;-1:-1:-1;;;;;;;24700:1104:0:o;22794:243::-;22874:14;;22871:159;;22905:40;;-1:-1:-1;;;22905:40:0;;:15;:40;;;19885:25:1;-1:-1:-1;;;;;19946:32:1;;19926:18;;;19919:60;19995:18;;;19988:34;;;22905:19:0;;;;19858:18:1;;22905:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18840:199:::1;;18793:246::o:0;22871:159::-;22987:31;;-1:-1:-1;;;22987:31:0;;:15;:31;;;20236:25:1;-1:-1:-1;;;;;20297:32:1;;20277:18;;;20270:60;22987:22:0;;;;20209:18:1;;22987:31:0;20033:303:1;25807:416:0;25892:16;;;25906:1;25892:16;;;;;;;;25868:21;;25892:16;;;;;;;;;;-1:-1:-1;25892:16:0;25868:40;;25931:4;25913;25918:1;25913:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;25913:23:0;;;:7;;;;;;;;;;:23;;;;25951:15;;:22;;;-1:-1:-1;;;25951:22:0;;;;:15;;;;;:20;;:22;;;;;25913:7;;25951:22;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25941:4;25946:1;25941:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;25941:32:0;;;:7;;;;;;;;;:32;26010:15;;25978:62;;25995:4;;26010:15;26028:11;25978:8;:62::i;:::-;26045:15;;:173;;-1:-1:-1;;;26045:173:0;;-1:-1:-1;;;;;26045:15:0;;;;:66;;:173;;26117:11;;26045:15;;26169:4;;26187;;26198:15;;26045:173;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26226:348;26334:15;;26302:62;;26319:4;;-1:-1:-1;;;;;26334:15:0;26352:11;26302:8;:62::i;:::-;26369:15;;26528;;26369:200;;-1:-1:-1;;;26369:200:0;;26432:4;26369:200;;;22055:34:1;22105:18;;;22098:34;;;26369:15:0;22148:18:1;;;22141:34;;;22191:18;;;22184:34;-1:-1:-1;;;;;26528:15:0;;;22234:19:1;;;22227:44;26549:15:0;22287:19:1;;;22280:35;26369:15:0;;;:31;;26408:9;;21989:19:1;;26369:200:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;26226:348;;:::o;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;863:70;808:131;:::o;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;1669:456::-;1746:6;1754;1762;1815:2;1803:9;1794:7;1790:23;1786:32;1783:52;;;1831:1;1828;1821:12;1783:52;1870:9;1857:23;1889:31;1914:5;1889:31;:::i;:::-;1939:5;-1:-1:-1;1996:2:1;1981:18;;1968:32;2009:33;1968:32;2009:33;:::i;:::-;1669:456;;2061:7;;-1:-1:-1;;;2115:2:1;2100:18;;;;2087:32;;1669:456::o;2130:180::-;2189:6;2242:2;2230:9;2221:7;2217:23;2213:32;2210:52;;;2258:1;2255;2248:12;2210:52;-1:-1:-1;2281:23:1;;2130:180;-1:-1:-1;2130:180:1:o;2504:416::-;2569:6;2577;2630:2;2618:9;2609:7;2605:23;2601:32;2598:52;;;2646:1;2643;2636:12;2598:52;2685:9;2672:23;2704:31;2729:5;2704:31;:::i;:::-;2754:5;-1:-1:-1;2811:2:1;2796:18;;2783:32;2853:15;;2846:23;2834:36;;2824:64;;2884:1;2881;2874:12;2824:64;2907:7;2897:17;;;2504:416;;;;;:::o;3133:247::-;3192:6;3245:2;3233:9;3224:7;3220:23;3216:32;3213:52;;;3261:1;3258;3251:12;3213:52;3300:9;3287:23;3319:31;3344:5;3319:31;:::i;3385:529::-;3462:6;3470;3478;3531:2;3519:9;3510:7;3506:23;3502:32;3499:52;;;3547:1;3544;3537:12;3499:52;3586:9;3573:23;3605:31;3630:5;3605:31;:::i;:::-;3655:5;-1:-1:-1;3712:2:1;3697:18;;3684:32;3725:33;3684:32;3725:33;:::i;:::-;3777:7;-1:-1:-1;3836:2:1;3821:18;;3808:32;3849:33;3808:32;3849:33;:::i;:::-;3901:7;3891:17;;;3385:529;;;;;:::o;3919:156::-;3985:20;;4045:4;4034:16;;4024:27;;4014:55;;4065:1;4062;4055:12;4014:55;3919:156;;;:::o;4080:322::-;4151:6;4159;4167;4220:2;4208:9;4199:7;4195:23;4191:32;4188:52;;;4236:1;4233;4226:12;4188:52;4259:27;4276:9;4259:27;:::i;:::-;4249:37;;4305:36;4337:2;4326:9;4322:18;4305:36;:::i;:::-;4295:46;;4360:36;4392:2;4381:9;4377:18;4360:36;:::i;:::-;4350:46;;4080:322;;;;;:::o;4752:388::-;4820:6;4828;4881:2;4869:9;4860:7;4856:23;4852:32;4849:52;;;4897:1;4894;4887:12;4849:52;4936:9;4923:23;4955:31;4980:5;4955:31;:::i;:::-;5005:5;-1:-1:-1;5062:2:1;5047:18;;5034:32;5075:33;5034:32;5075:33;:::i;5145:380::-;5224:1;5220:12;;;;5267;;;5288:61;;5342:4;5334:6;5330:17;5320:27;;5288:61;5395:2;5387:6;5384:14;5364:18;5361:38;5358:161;;5441:10;5436:3;5432:20;5429:1;5422:31;5476:4;5473:1;5466:15;5504:4;5501:1;5494:15;5358:161;;5145:380;;;:::o;5530:356::-;5732:2;5714:21;;;5751:18;;;5744:30;5810:34;5805:2;5790:18;;5783:62;5877:2;5862:18;;5530:356::o;9607:414::-;9809:2;9791:21;;;9848:2;9828:18;;;9821:30;9887:34;9882:2;9867:18;;9860:62;-1:-1:-1;;;9953:2:1;9938:18;;9931:48;10011:3;9996:19;;9607:414::o;10429:127::-;10490:10;10485:3;10481:20;10478:1;10471:31;10521:4;10518:1;10511:15;10545:4;10542:1;10535:15;10561:125;10601:4;10629:1;10626;10623:8;10620:34;;;10634:18;;:::i;:::-;-1:-1:-1;10671:9:1;;10561:125::o;11942:127::-;12003:10;11998:3;11994:20;11991:1;11984:31;12034:4;12031:1;12024:15;12058:4;12055:1;12048:15;12749:128;12789:3;12820:1;12816:6;12813:1;12810:13;12807:39;;;12826:18;;:::i;:::-;-1:-1:-1;12862:9:1;;12749:128::o;14046:401::-;14248:2;14230:21;;;14287:2;14267:18;;;14260:30;14326:34;14321:2;14306:18;;14299:62;-1:-1:-1;;;14392:2:1;14377:18;;14370:35;14437:3;14422:19;;14046:401::o;14452:399::-;14654:2;14636:21;;;14693:2;14673:18;;;14666:30;14732:34;14727:2;14712:18;;14705:62;-1:-1:-1;;;14798:2:1;14783:18;;14776:33;14841:3;14826:19;;14452:399::o;16046:168::-;16086:7;16152:1;16148;16144:6;16140:14;16137:1;16134:21;16129:1;16122:9;16115:17;16111:45;16108:71;;;16159:18;;:::i;:::-;-1:-1:-1;16199:9:1;;16046:168::o;16219:127::-;16280:10;16275:3;16271:20;16268:1;16261:31;16311:4;16308:1;16301:15;16335:4;16332:1;16325:15;16351:120;16391:1;16417;16407:35;;16422:18;;:::i;:::-;-1:-1:-1;16456:9:1;;16351:120::o;16750:209::-;-1:-1:-1;;16914:38:1;;;;16896:57;;16884:2;16869:18;;16750:209::o;18327:204::-;18365:3;18401:4;18398:1;18394:12;18433:4;18430:1;18426:12;18468:3;18462:4;18458:14;18453:3;18450:23;18447:49;;;18476:18;;:::i;:::-;18512:13;;18327:204;-1:-1:-1;;;18327:204:1:o;18960:165::-;18998:1;19032:4;19029:1;19025:12;19056:3;19046:37;;19063:18;;:::i;:::-;19115:3;19108:4;19105:1;19101:12;19097:22;19092:27;;;18960:165;;;;:::o;19130:195::-;19168:4;19205;19202:1;19198:12;19237:4;19234:1;19230:12;19262:3;19257;19254:12;19251:38;;;19269:18;;:::i;:::-;19306:13;;;19130:195;-1:-1:-1;;;19130:195:1:o;20473:251::-;20543:6;20596:2;20584:9;20575:7;20571:23;20567:32;20564:52;;;20612:1;20609;20602:12;20564:52;20644:9;20638:16;20663:31;20688:5;20663:31;:::i;20729:980::-;20991:4;21039:3;21028:9;21024:19;21070:6;21059:9;21052:25;21096:2;21134:6;21129:2;21118:9;21114:18;21107:34;21177:3;21172:2;21161:9;21157:18;21150:31;21201:6;21236;21230:13;21267:6;21259;21252:22;21305:3;21294:9;21290:19;21283:26;;21344:2;21336:6;21332:15;21318:29;;21365:1;21375:195;21389:6;21386:1;21383:13;21375:195;;;21454:13;;-1:-1:-1;;;;;21450:39:1;21438:52;;21545:15;;;;21510:12;;;;21486:1;21404:9;21375:195;;;-1:-1:-1;;;;;;;21626:32:1;;;;21621:2;21606:18;;21599:60;-1:-1:-1;;;21690:3:1;21675:19;21668:35;21587:3;20729:980;-1:-1:-1;;;20729:980:1:o;22326:306::-;22414:6;22422;22430;22483:2;22471:9;22462:7;22458:23;22454:32;22451:52;;;22499:1;22496;22489:12;22451:52;22528:9;22522:16;22512:26;;22578:2;22567:9;22563:18;22557:25;22547:35;;22622:2;22611:9;22607:18;22601:25;22591:35;;22326:306;;;;;:::o

Swarm Source

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