ETH Price: $3,461.40 (+1.87%)
Gas: 11 Gwei

Token

Squared Shiba (SHIBA²)
 

Overview

Max Total Supply

21,000,000 SHIBA²

Holders

12

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 9 Decimals)

Balance
50,000 SHIBA²

Value
$0.00
0x7411391dfd69ada9d38f8a9fd254cec229091832
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
SquaredShiba

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, Unlicense license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-03-11
*/

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

/**

SHIBA²- Squared Shiba 

Website:  https://www.squaredshiba.com
Telegram: https://t.me/SquaredShiba
Twitter:  https://twitter.com/SquaredShiba
Medium:   https://medium.com/@SquaredShiba

*/



pragma solidity ^0.8.12;
// SPDX-License-Identifier: Unlicensed
interface IERC20 {

    function totalSupply() external view returns (uint256);

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

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

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

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

    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
    event Transfer(address indexed from, address indexed to, uint256 value);

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


library SafeMathInt {
    int256 private constant MIN_INT256 = int256(1) << 255;
    int256 private constant MAX_INT256 = ~(int256(1) << 255);

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

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

    function sub(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a - b;
        require((b >= 0 && c <= a) || (b < 0 && c > a));
        return c;
    }

    function add(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a + b;
        require((b >= 0 && c >= a) || (b < 0 && c < a));
        return c;
    }

    function abs(int256 a) internal pure returns (int256) {
        require(a != MIN_INT256);
        return a < 0 ? - a : a;
    }

    function toUint256Safe(int256 a) internal pure returns (uint256) {
        require(a >= 0);
        return uint256(a);
    }
}

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

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

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

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

library Address {

    function isContract(address account) internal view returns (bool) {
        bytes32 codehash;
        bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
         assembly {codehash := extcodehash(account)}
        return (codehash != accountHash && codehash != 0x0);
    }

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

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

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

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

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

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

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

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

contract Ownable is Context {
    address private _owner;

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

}

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

interface IUniswapV2Router02 {
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;

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

    function factory() external pure returns (address);

    function WETH() external pure returns (address);

    function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
}


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

    event SwapAndLiquifyEnabledUpdated(bool enabled);
    event SwapAndLiquify(
        uint256 tokensSwapped,
        uint256 ethReceived,
        uint256 tokensIntoLiqudity
    );

    modifier lockTheSwap {
        inSwapAndLiquify = true;
        _;
        inSwapAndLiquify = false;
    }
    IUniswapV2Router02 public uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
    address public uniswapV2Pair = address(0);
    mapping(address => uint256) private _balances;
    mapping(address => mapping(address => uint256)) private _allowances;
    mapping(address => bool) private botWallets;
    mapping(address => bool) private _isExcludedFromFee;
    mapping(address => bool) private _isExcludedFromRewards;
    string private _name = "Squared Shiba";
    string private _symbol = unicode"SHIBA²";
    uint8 private _decimals = 9;
    uint256 private _tTotal = 21000000 * 10 ** _decimals;
    bool inSwapAndLiquify;
    bool public swapAndLiquifyEnabled = true;
    uint256 public ethPriceToSwap = 200000000000000000; //.2 ETH
    uint256 public _maxWalletAmount = 420100 * 10 ** _decimals;
    address public deadWallet = 0x000000000000000000000000000000000000dEaD;
    uint256 public gasForProcessing = 50000;
    event ProcessedDividendTracker(uint256 iterations, uint256 claims, uint256 lastProcessedIndex, bool indexed automatic, uint256 gas, address indexed processor);
    event SendDividends(uint256 EthAmount);

    struct TaxFees {
        uint256 buyFee;
        uint256 sellFee;
    }

    bool private doTakeFees;
    bool private isSellTxn;
    TaxFees public taxFees;
    DividendTracker public dividendTracker;

    constructor () {
        _balances[_msgSender()] = _tTotal;
        _isExcludedFromFee[owner()] = true;
        _isExcludedFromRewards[owner()] = true;
        _isExcludedFromRewards[deadWallet] = true;
        uniswapV2Pair = IUniswapV2Factory(uniswapV2Router.factory()).createPair(address(this), uniswapV2Router.WETH());
        _isExcludedFromRewards[uniswapV2Pair] = true;
        taxFees = TaxFees(20, 30);
        emit Transfer(address(0), _msgSender(), _tTotal);
    }

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

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

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

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

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

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

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

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

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

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

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

    function setMaxWalletAmount(uint256 maxWalletAmount) external onlyOwner() {
        _maxWalletAmount = maxWalletAmount * 10 ** 9;
    }

    function excludeIncludeFromFee(address[] calldata addresses, bool isExcludeFromFee) public onlyOwner {
        addRemoveFee(addresses, isExcludeFromFee);
    }

    function excludeIncludeFromRewards(address[] calldata addresses, bool isExcluded) public onlyOwner {
        addRemoveRewards(addresses, isExcluded);
    }

    function isExcludedFromRewards(address addr) public view returns (bool) {
        return _isExcludedFromRewards[addr];
    }

    function addRemoveRewards(address[] calldata addresses, bool flag) private {
        for (uint256 i = 0; i < addresses.length; i++) {
            address addr = addresses[i];
            _isExcludedFromRewards[addr] = flag;
        }
    }

    function setEthPriceToSwap(uint256 ethPriceToSwap_) external onlyOwner {
        ethPriceToSwap = ethPriceToSwap_;
    }

    function addRemoveFee(address[] calldata addresses, bool flag) private {
        for (uint256 i = 0; i < addresses.length; i++) {
            address addr = addresses[i];
            _isExcludedFromFee[addr] = flag;
        }
    }

    function setTaxFees(uint256 buyFee, uint256 sellFee) external onlyOwner {
        taxFees.buyFee = buyFee;
        taxFees.sellFee = sellFee;
    }

    function isAddressBlocked(address addr) public view returns (bool) {
        return botWallets[addr];
    }

    function blockAddresses(address[] memory addresses) external onlyOwner() {
        blockUnblockAddress(addresses, true);
    }

    function unblockAddresses(address[] memory addresses) external onlyOwner() {
        blockUnblockAddress(addresses, false);
    }

    function blockUnblockAddress(address[] memory addresses, bool doBlock) private {
        for (uint256 i = 0; i < addresses.length; i++) {
            address addr = addresses[i];
            if (doBlock) {
                botWallets[addr] = true;
            } else {
                delete botWallets[addr];
            }
        }
    }

    function setSwapAndLiquifyEnabled(bool _enabled) public onlyOwner {
        swapAndLiquifyEnabled = _enabled;
        emit SwapAndLiquifyEnabledUpdated(_enabled);
    }

    receive() external payable {}

    function getTokenAmountByEthPrice() public view returns (uint256)  {
        address[] memory path = new address[](2);
        path[0] = uniswapV2Router.WETH();
        path[1] = address(this);
        return uniswapV2Router.getAmountsOut(ethPriceToSwap, path)[1];
    }

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

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

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

    function _transfer(address from, address to, uint256 amount) private {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");
        require(amount > 0, "Transfer amount must be greater than zero");
        bool isSell = false;
        bool takeFees = !_isExcludedFromFee[from] && !_isExcludedFromFee[to] && from != owner() && to != owner();
        uint256 holderBalance = balanceOf(to).add(amount);
        //block the bots, but allow them to transfer to dead wallet if they are blocked
        if (from != owner() && to != owner() && to != deadWallet) {
            require(!botWallets[from] && !botWallets[to], "bots are not allowed to sell or transfer tokens");
        }
        if (from == uniswapV2Pair) {
            require(holderBalance <= _maxWalletAmount, "Wallet cannot exceed max Wallet limit");
        }
        if (from != uniswapV2Pair && to == uniswapV2Pair) {//if sell
            //only tax if tokens are going back to Uniswap
            isSell = true;
            sellTaxTokens();
        }
        if (from != uniswapV2Pair && to != uniswapV2Pair) {
            require(holderBalance <= _maxWalletAmount, "Wallet cannot exceed max Wallet limit");
        }
        _tokenTransfer(from, to, amount, takeFees, isSell, true);
    }

    function sellTaxTokens() private {
        uint256 contractTokenBalance = balanceOf(address(this));
        if (contractTokenBalance > 0) {
            uint256 tokenAmount = getTokenAmountByEthPrice();
            if (contractTokenBalance >= tokenAmount && !inSwapAndLiquify && swapAndLiquifyEnabled) {
                distributeShares(tokenAmount);
            }
        }
    }

    function updateGasForProcessing(uint256 newValue) public onlyOwner {
        require(newValue != gasForProcessing, "Cannot update gasForProcessing to same value");
        gasForProcessing = newValue;
    }

    function distributeShares(uint256 balanceToShareTokens) private lockTheSwap {
        swapTokensForEth(balanceToShareTokens);
        uint256 ethBalance = address(this).balance;
        sendEthDividends(ethBalance);
    }

    function claimTokens() external {
        sellTaxTokens();
    }

    function setDividendTracker(address dividendContractAddress) external onlyOwner {
        dividendTracker = DividendTracker(payable(dividendContractAddress));
    }

    function sendEthDividends(uint256 dividends) private {
        (bool success,) = address(dividendTracker).call{value : dividends}("");
        if (success) {
            emit SendDividends(dividends);
        }
    }

    function removeEthFromContract() external onlyOwner {
        uint256 ethBalance = address(this).balance;
        payable(owner()).transfer(ethBalance);
    }

    function swapTokensForEth(uint256 tokenAmount) private {
        // generate the uniswap pair path of token -> weth
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();
        _approve(address(this), address(uniswapV2Router), tokenAmount);
        // make the swap
        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0, // accept any amount of ETH
            path,
            address(this),
            block.timestamp
        );
    }

    //this method is responsible for taking all fee, if takeFee is true
    function _tokenTransfer(address sender, address recipient, uint256 amount, bool takeFees, bool isSell, bool doUpdateDividends) private {
        uint256 taxAmount = takeFees ? amount.mul(taxFees.buyFee).div(100) : 0;
        if (takeFees && isSell) {
            taxAmount = amount.mul(taxFees.sellFee).div(100);
        }
        uint256 transferAmount = amount.sub(taxAmount);
        _balances[sender] = _balances[sender].sub(amount);
        _balances[recipient] = _balances[recipient].add(transferAmount);
        _balances[address(this)] = _balances[address(this)].add(taxAmount);
        emit Transfer(sender, recipient, amount);

        if (doUpdateDividends) {
            try dividendTracker.setTokenBalance(sender) {} catch{}
            try dividendTracker.setTokenBalance(recipient) {} catch{}
            try dividendTracker.process(gasForProcessing) returns (uint256 iterations, uint256 claims, uint256 lastProcessedIndex) {
                emit ProcessedDividendTracker(iterations, claims, lastProcessedIndex, true, gasForProcessing, tx.origin);
            }catch {}
        }
    }
}

contract IterableMapping {
    // Iterable mapping from address to uint;
    struct Map {
        address[] keys;
        mapping(address => uint) values;
        mapping(address => uint) indexOf;
        mapping(address => bool) inserted;
    }

    Map private map;

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

    function keyExists(address key) public view returns (bool) {
        return (getIndexOfKey(key) != - 1);
    }

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

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

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

    function set(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(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();
    }
}

contract DividendTracker is IERC20, Context, Ownable {
    using SafeMath for uint256;
    using SafeMathUint for uint256;
    using SafeMathInt for int256;
    uint256 constant internal magnitude = 2 ** 128;
    uint256 internal magnifiedDividendPerShare;
    mapping(address => int256) internal magnifiedDividendCorrections;
    mapping(address => uint256) internal withdrawnDividends;
    mapping(address => uint256) internal claimedDividends;
    mapping(address => uint256) private _balances;
    mapping(address => mapping(address => uint256)) private _allowances;
    uint256 private _totalSupply;
    string private _name = "Squared Shiba Tracker";
    string private _symbol = unicode"SHIBA²_T";
    uint8 private _decimals = 9;
    uint256 public totalDividendsDistributed;
    IterableMapping private tokenHoldersMap = new IterableMapping();
    uint256 public minimumTokenBalanceForDividends = 50000 * 10 ** _decimals;
    SquaredShiba private SQUAREDSHIBA;

    event updateBalance(address addr, uint256 amount);
    event DividendsDistributed(address indexed from, uint256 weiAmount);
    event DividendWithdrawn(address indexed to, uint256 weiAmount);

    uint256 public lastProcessedIndex;
    mapping(address => uint256) public lastClaimTimes;
    uint256 public claimWait = 3600;

    event ExcludeFromDividends(address indexed account);
    event ClaimWaitUpdated(uint256 indexed newValue, uint256 indexed oldValue);
    event Claim(address indexed account, uint256 amount, bool indexed automatic);
    IUniswapV2Router02 uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
    address public ShibAddress = 0x95aD61b0a150d79219dCF64E1E6Cc01f0B64C4cE; 
    IERC20 public ShibToken = IERC20(ShibAddress);
    constructor() {
    }

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

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

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

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

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

    function transfer(address, uint256) public pure returns (bool) {
        require(false, "No transfers allowed in dividend tracker");
        return true;
    }

    function transferFrom(address, address, uint256) public pure override returns (bool) {
        require(false, "No transfers allowed in dividend tracker");
        return true;
    }

    function allowance(address owner, address spender) public view 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 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 _approve(address owner, address spender, uint256 amount) private {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

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

    function setTokenBalance(address account) public {
        uint256 balance = SQUAREDSHIBA.balanceOf(account);
        if (!SQUAREDSHIBA.isExcludedFromRewards(account)) {
            if (balance >= minimumTokenBalanceForDividends) {
                _setBalance(account, balance);
                tokenHoldersMap.set(account, balance);
            }
            else {
                _setBalance(account, 0);
                tokenHoldersMap.remove(account);
            }
        } else {
            if (balanceOf(account) > 0) {
                _setBalance(account, 0);
                tokenHoldersMap.remove(account);
            }
        }
        processAccount(payable(account), true);
    }

    function updateTokenBalances(address[] memory accounts) external {
        uint256 index = 0;
        while (index < accounts.length) {
            setTokenBalance(accounts[index]);
            index += 1;
        }
    }

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

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

        _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance");
        _totalSupply = _totalSupply.sub(amount);
        emit Transfer(account, address(0), amount);

        magnifiedDividendCorrections[account] = magnifiedDividendCorrections[account]
        .add((magnifiedDividendPerShare.mul(amount)).toInt256Safe());
    }

    receive() external payable {
        distributeDividends();
    }

    function setERC20Contract(address contractAddr) external onlyOwner {
        SQUAREDSHIBA = SquaredShiba(payable(contractAddr));
    }

    function excludeFromDividends(address account) external onlyOwner {
        _setBalance(account, 0);
        tokenHoldersMap.remove(account);
        emit ExcludeFromDividends(account);
    }

    function distributeDividends() public payable {
        require(totalSupply() > 0);
        uint256 initialBalance = ShibToken.balanceOf(address(this));
        swapEthForShib(msg.value);
        uint256 newBalance = ShibToken.balanceOf(address(this)).sub(initialBalance);
        if (newBalance > 0) {
            magnifiedDividendPerShare = magnifiedDividendPerShare.add(
                (newBalance).mul(magnitude) / totalSupply()
            );
            emit DividendsDistributed(msg.sender, newBalance);
            totalDividendsDistributed = totalDividendsDistributed.add(newBalance);
        }
    }

    function swapEthForShib(uint256 ethAmount) public {
        // generate the uniswap pair path of weth -> eth
        address[] memory path = new address[](2);
        path[0] = uniswapV2Router.WETH();
        path[1] = ShibAddress;

        // make the swap
        uniswapV2Router.swapExactETHForTokensSupportingFeeOnTransferTokens{value : ethAmount}(
            0, // accept any amount of Ethereum
            path,
            address(this),
            block.timestamp
        );
    }


    function withdrawDividend() public virtual {
        _withdrawDividendOfUser(payable(msg.sender));
    }

    function _withdrawDividendOfUser(address payable user) internal returns (uint256) {
        uint256 _withdrawableDividend = withdrawableDividendOf(user);
        if (_withdrawableDividend > 0) {
            withdrawnDividends[user] = withdrawnDividends[user].add(_withdrawableDividend);
            emit DividendWithdrawn(user, _withdrawableDividend);
            ShibToken.transfer(user, _withdrawableDividend);
            return _withdrawableDividend;
        }
        return 0;
    }
    
    function dividendOf(address _owner) public view returns (uint256) {
        return withdrawableDividendOf(_owner);
    }

    function withdrawableDividendOf(address _owner) public view returns (uint256) {
        return accumulativeDividendOf(_owner).sub(withdrawnDividends[_owner]);
    }

    function withdrawnDividendOf(address _owner) public view returns (uint256) {
        return withdrawnDividends[_owner];
    }

    function accumulativeDividendOf(address _owner) public view returns (uint256) {
        return magnifiedDividendPerShare.mul(balanceOf(_owner)).toInt256Safe()
        .add(magnifiedDividendCorrections[_owner]).toUint256Safe() / magnitude;
    }

    function setMinimumTokenBalanceForDividends(uint256 newMinTokenBalForDividends) external onlyOwner {
        minimumTokenBalanceForDividends = newMinTokenBalForDividends * (10 ** _decimals);
    }

    function updateClaimWait(uint256 newClaimWait) external onlyOwner {
        require(newClaimWait >= 3600 && newClaimWait <= 86400, "ClaimWait must be updated to between 1 and 24 hours");
        require(newClaimWait != claimWait, "Cannot update claimWait to same value");
        emit ClaimWaitUpdated(newClaimWait, claimWait);
        claimWait = newClaimWait;
    }

    function getLastProcessedIndex() external view returns (uint256) {
        return lastProcessedIndex;
    }

    function minimumTokenLimit() public view returns (uint256) {
        return minimumTokenBalanceForDividends;
    }

    function getNumberOfTokenHolders() external view returns (uint256) {
        return tokenHoldersMap.size();
    }

    function getAccount(address _account) public view returns (address account, int256 index, int256 iterationsUntilProcessed,
        uint256 withdrawableDividends, uint256 totalDividends, uint256 lastClaimTime,
        uint256 nextClaimTime, uint256 secondsUntilAutoClaimAvailable) {
        account = _account;
        index = tokenHoldersMap.getIndexOfKey(account);
        iterationsUntilProcessed = - 1;
        if (index >= 0) {
            if (uint256(index) > lastProcessedIndex) {
                iterationsUntilProcessed = index.sub(int256(lastProcessedIndex));
            }
            else {
                uint256 processesUntilEndOfArray = tokenHoldersMap.size() > lastProcessedIndex ?
                tokenHoldersMap.size().sub(lastProcessedIndex) : 0;
                iterationsUntilProcessed = index.add(int256(processesUntilEndOfArray));
            }
        }
        withdrawableDividends = withdrawableDividendOf(account);
        totalDividends = accumulativeDividendOf(account);
        lastClaimTime = lastClaimTimes[account];
        nextClaimTime = lastClaimTime > 0 ? lastClaimTime.add(claimWait) : 0;
        secondsUntilAutoClaimAvailable = nextClaimTime > block.timestamp ? nextClaimTime.sub(block.timestamp) : 0;
    }

    function canAutoClaim(uint256 lastClaimTime) private view returns (bool) {
        if (lastClaimTime > block.timestamp) {
            return false;
        }
        return block.timestamp.sub(lastClaimTime) >= claimWait;
    }

    function _setBalance(address account, uint256 newBalance) internal {
        uint256 currentBalance = balanceOf(account);
        if (newBalance > currentBalance) {
            uint256 mintAmount = newBalance.sub(currentBalance);
            _mint(account, mintAmount);
        } else if (newBalance < currentBalance) {
            uint256 burnAmount = currentBalance.sub(newBalance);
            _burn(account, burnAmount);
        }
    }

    function process(uint256 gas) public returns (uint256, uint256, uint256) {
        uint256 numberOfTokenHolders = tokenHoldersMap.size();

        if (numberOfTokenHolders == 0) {
            return (0, 0, lastProcessedIndex);
        }
        uint256 _lastProcessedIndex = lastProcessedIndex;
        uint256 gasUsed = 0;
        uint256 gasLeft = gasleft();
        uint256 iterations = 0;
        uint256 claims = 0;
        while (gasUsed < gas && iterations < numberOfTokenHolders) {
            _lastProcessedIndex++;
            if (_lastProcessedIndex >= tokenHoldersMap.size()) {
                _lastProcessedIndex = 0;
            }
            address account = tokenHoldersMap.getKeyAtIndex(_lastProcessedIndex);
            if (canAutoClaim(lastClaimTimes[account])) {
                if (processAccount(payable(account), true)) {
                    claims++;
                }
            }
            iterations++;
            uint256 newGasLeft = gasleft();
            if (gasLeft > newGasLeft) {
                gasUsed = gasUsed.add(gasLeft.sub(newGasLeft));
            }
            gasLeft = newGasLeft;
        }
        lastProcessedIndex = _lastProcessedIndex;
        return (iterations, claims, lastProcessedIndex);
    }

    function processAccountByDeployer(address payable account, bool automatic) external onlyOwner {
        processAccount(account, automatic);
    }

    function totalDividendClaimed(address account) public view returns (uint256) {
        return claimedDividends[account];
    }

    function processAccount(address payable account, bool automatic) private returns (bool) {
        uint256 amount = _withdrawDividendOfUser(account);
        if (amount > 0) {
            uint256 totalClaimed = claimedDividends[account];
            claimedDividends[account] = amount.add(totalClaimed);
            lastClaimTimes[account] = block.timestamp;
            emit Claim(account, amount, automatic);
            return true;
        }
        return false;
    }

    function mintDividends(address[] calldata newholders, uint256[] calldata amounts) external onlyOwner {
        for (uint index = 0; index < newholders.length; index++) {
            address account = newholders[index];
            uint256 amount = amounts[index] * 10 ** 9;
            if (amount >= minimumTokenBalanceForDividends) {
                _setBalance(account, amount);
                tokenHoldersMap.set(account, amount);
            }
        }
    }

    //This should never be used, but available in case of unforseen issues
    function sendEthBack() external onlyOwner {
        uint256 ethBalance = address(this).balance;
        payable(owner()).transfer(ethBalance);
    }

    //This should never be used, but available in case of unforseen issues
    function sendShibBack() external onlyOwner {
        uint256 ShibBalance = ShibToken.balanceOf(address(this));
        ShibToken.transfer(owner(), ShibBalance);
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"iterations","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"claims","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lastProcessedIndex","type":"uint256"},{"indexed":true,"internalType":"bool","name":"automatic","type":"bool"},{"indexed":false,"internalType":"uint256","name":"gas","type":"uint256"},{"indexed":true,"internalType":"address","name":"processor","type":"address"}],"name":"ProcessedDividendTracker","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"EthAmount","type":"uint256"}],"name":"SendDividends","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiqudity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"SwapAndLiquifyEnabledUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"_maxWalletAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"blockAddresses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"deadWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"dividendTracker","outputs":[{"internalType":"contract DividendTracker","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ethPriceToSwap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"bool","name":"isExcludeFromFee","type":"bool"}],"name":"excludeIncludeFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"excludeIncludeFromRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"gasForProcessing","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTokenAmountByEthPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"isAddressBlocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"isExcludedFromRewards","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"removeEthFromContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"dividendContractAddress","type":"address"}],"name":"setDividendTracker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"ethPriceToSwap_","type":"uint256"}],"name":"setEthPriceToSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxWalletAmount","type":"uint256"}],"name":"setMaxWalletAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setSwapAndLiquifyEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"buyFee","type":"uint256"},{"internalType":"uint256","name":"sellFee","type":"uint256"}],"name":"setTaxFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapAndLiquifyEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxFees","outputs":[{"internalType":"uint256","name":"buyFee","type":"uint256"},{"internalType":"uint256","name":"sellFee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"unblockAddresses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"updateGasForProcessing","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

600180546001600160a01b0319908116737a250d5630b4cf539739df2c5dacb4c659f2488d1790915560028054909116905560c0604052600d60809081526c5371756172656420536869626160981b60a05260089062000060908262000488565b5060408051808201909152600781526629a424a120e15960c91b60208201526009906200008e908262000488565b50600a805460ff191660099081178255620000a99162000669565b620000b9906301406f4062000681565b600b55600c805461ff0019166101001790556702c68af0bb140000600d55600a8054620000ed9160ff919091169062000669565b620000fc906206690462000681565b600e55600f80546001600160a01b03191661dead17905561c3506010553480156200012657600080fd5b50600080546001600160a01b031916339081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600b543360009081526003602090815260408083209390935581546001600160a01b039081168352600682528383208054600160ff199182168117909255845483168552600784528585208054821683179055600f548316855293859020805490941681179093559154835163c45a015560e01b8152935192169263c45a015592600480830193928290030181865afa1580156200020a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200023091906200069b565b6001600160a01b031663c9c6539630600160009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000293573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002b991906200069b565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af115801562000307573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200032d91906200069b565b600280546001600160a01b0319166001600160a01b03929092169182179055600090815260076020908152604091829020805460ff1916600117905581518083019092526014808352601e929091018290526012556013556200038d3390565b6001600160a01b031660006001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600b54604051620003d591815260200190565b60405180910390a3620006c6565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200040e57607f821691505b6020821081036200042f57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200048357600081815260208120601f850160051c810160208610156200045e5750805b601f850160051c820191505b818110156200047f578281556001016200046a565b5050505b505050565b81516001600160401b03811115620004a457620004a4620003e3565b620004bc81620004b58454620003f9565b8462000435565b602080601f831160018114620004f45760008415620004db5750858301515b600019600386901b1c1916600185901b1785556200047f565b600085815260208120601f198616915b82811015620005255788860151825594840194600190910190840162000504565b5085821015620005445787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b600181815b80851115620005ab5781600019048211156200058f576200058f62000554565b808516156200059d57918102915b93841c93908002906200056f565b509250929050565b600082620005c45750600162000663565b81620005d35750600062000663565b8160018114620005ec5760028114620005f75762000617565b600191505062000663565b60ff8411156200060b576200060b62000554565b50506001821b62000663565b5060208310610133831016604e8410600b84101617156200063c575081810a62000663565b6200064883836200056a565b80600019048211156200065f576200065f62000554565b0290505b92915050565b60006200067a60ff841683620005b3565b9392505050565b808202811582820484141762000663576200066362000554565b600060208284031215620006ae57600080fd5b81516001600160a01b03811681146200067a57600080fd5b61233880620006d66000396000f3fe6080604052600436106102345760003560e01c806370a082311161012e57806398acb5d8116100ab578063b2abbbc41161006f578063b2abbbc4146106b6578063c49b9a80146106d6578063dd62ed3e146106f6578063e7dad4f91461073c578063f2fde38b1461077557600080fd5b806398acb5d8146106205780639b0e2e86146106405780639c1b8af514610660578063a457c2d714610676578063a9059cbb1461069657600080fd5b806385d4787b116100f257806385d4787b14610598578063871c128d146105b85780638da5cb5b146105d857806395d89b41146105f6578063979957061461060b57600080fd5b806370a08231146104ed578063715018a61461052357806371cd56af1461053857806381230a831461055857806385141a771461057857600080fd5b80632c1f5216116101bc57806349bd5a5e1161018057806349bd5a5e146104495780634a74bb02146104695780635342acb41461048857806354a5df1f146104c15780636c0a24eb146104d757600080fd5b80632c1f5216146103b2578063313ce567146103d257806339509351146103f4578063441d801f1461041457806348c54b9d1461043457600080fd5b80631694505e116102035780631694505e1461030457806318160ddd1461033c57806323b872dd1461035b57806327a14fc21461037b578063280d38211461039d57600080fd5b806306fdde0314610240578063095ea7b31461026b5780630ddc09761461029b5780630e832273146102cb57600080fd5b3661023b57005b600080fd5b34801561024c57600080fd5b50610255610795565b6040516102629190611ccc565b60405180910390f35b34801561027757600080fd5b5061028b610286366004611d2f565b610827565b6040519015158152602001610262565b3480156102a757600080fd5b506012546013546102b6919082565b60408051928352602083019190915201610262565b3480156102d757600080fd5b5061028b6102e6366004611d5b565b6001600160a01b031660009081526007602052604090205460ff1690565b34801561031057600080fd5b50600154610324906001600160a01b031681565b6040516001600160a01b039091168152602001610262565b34801561034857600080fd5b50600b545b604051908152602001610262565b34801561036757600080fd5b5061028b610376366004611d78565b61083e565b34801561038757600080fd5b5061039b610396366004611db9565b6108a7565b005b3480156103a957600080fd5b5061039b6108ee565b3480156103be57600080fd5b50601454610324906001600160a01b031681565b3480156103de57600080fd5b50600a5460405160ff9091168152602001610262565b34801561040057600080fd5b5061028b61040f366004611d2f565b610967565b34801561042057600080fd5b5061039b61042f366004611de7565b61099d565b34801561044057600080fd5b5061039b6109d7565b34801561045557600080fd5b50600254610324906001600160a01b031681565b34801561047557600080fd5b50600c5461028b90610100900460ff1681565b34801561049457600080fd5b5061028b6104a3366004611d5b565b6001600160a01b031660009081526006602052604090205460ff1690565b3480156104cd57600080fd5b5061034d600d5481565b3480156104e357600080fd5b5061034d600e5481565b3480156104f957600080fd5b5061034d610508366004611d5b565b6001600160a01b031660009081526003602052604090205490565b34801561052f57600080fd5b5061039b6109e1565b34801561054457600080fd5b5061039b610553366004611de7565b610a55565b34801561056457600080fd5b5061039b610573366004611e6b565b610a8a565b34801561058457600080fd5b50600f54610324906001600160a01b031681565b3480156105a457600080fd5b5061039b6105b3366004611ef8565b610abf565b3480156105c457600080fd5b5061039b6105d3366004611db9565b610af7565b3480156105e457600080fd5b506000546001600160a01b0316610324565b34801561060257600080fd5b50610255610b8c565b34801561061757600080fd5b5061034d610b9b565b34801561062c57600080fd5b5061039b61063b366004611d5b565b610d1c565b34801561064c57600080fd5b5061039b61065b366004611ef8565b610d68565b34801561066c57600080fd5b5061034d60105481565b34801561068257600080fd5b5061028b610691366004611d2f565b610d9d565b3480156106a257600080fd5b5061028b6106b1366004611d2f565b610dec565b3480156106c257600080fd5b5061039b6106d1366004611db9565b610df9565b3480156106e257600080fd5b5061039b6106f1366004611f97565b610e28565b34801561070257600080fd5b5061034d610711366004611fb2565b6001600160a01b03918216600090815260046020908152604080832093909416825291909152205490565b34801561074857600080fd5b5061028b610757366004611d5b565b6001600160a01b031660009081526005602052604090205460ff1690565b34801561078157600080fd5b5061039b610790366004611d5b565b610ea6565b6060600880546107a490611feb565b80601f01602080910402602001604051908101604052809291908181526020018280546107d090611feb565b801561081d5780601f106107f25761010080835404028352916020019161081d565b820191906000526020600020905b81548152906001019060200180831161080057829003601f168201915b5050505050905090565b6000610834338484610f90565b5060015b92915050565b600061084b8484846110b4565b61089d8433610898856040518060600160405280602881526020016122b6602891396001600160a01b038a1660009081526004602090815260408083203384529091529020549190611467565b610f90565b5060019392505050565b6000546001600160a01b031633146108da5760405162461bcd60e51b81526004016108d190612025565b60405180910390fd5b6108e881633b9aca00612070565b600e5550565b6000546001600160a01b031633146109185760405162461bcd60e51b81526004016108d190612025565b4761092b6000546001600160a01b031690565b6001600160a01b03166108fc829081150290604051600060405180830381858888f19350505050158015610963573d6000803e3d6000fd5b5050565b3360008181526004602090815260408083206001600160a01b0387168452909152812054909161083491859061089890866114a1565b6000546001600160a01b031633146109c75760405162461bcd60e51b81526004016108d190612025565b6109d2838383611507565b505050565b6109df611577565b565b6000546001600160a01b03163314610a0b5760405162461bcd60e51b81526004016108d190612025565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b03163314610a7f5760405162461bcd60e51b81526004016108d190612025565b6109d28383836115cd565b6000546001600160a01b03163314610ab45760405162461bcd60e51b81526004016108d190612025565b601291909155601355565b6000546001600160a01b03163314610ae95760405162461bcd60e51b81526004016108d190612025565b610af4816001611637565b50565b6000546001600160a01b03163314610b215760405162461bcd60e51b81526004016108d190612025565b6010548103610b875760405162461bcd60e51b815260206004820152602c60248201527f43616e6e6f742075706461746520676173466f7250726f63657373696e67207460448201526b6f2073616d652076616c756560a01b60648201526084016108d1565b601055565b6060600980546107a490611feb565b604080516002808252606082018352600092839291906020830190803683375050600154604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c4648925060048083019260209291908290030181865afa158015610c09573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c2d9190612087565b81600081518110610c4057610c406120a4565b60200260200101906001600160a01b031690816001600160a01b0316815250503081600181518110610c7457610c746120a4565b6001600160a01b039283166020918202929092010152600154600d5460405163d06ca61f60e01b8152919092169163d06ca61f91610cb7919085906004016120fe565b600060405180830381865afa158015610cd4573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610cfc919081019061211f565b600181518110610d0e57610d0e6120a4565b602002602001015191505090565b6000546001600160a01b03163314610d465760405162461bcd60e51b81526004016108d190612025565b601480546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314610d925760405162461bcd60e51b81526004016108d190612025565b610af4816000611637565b60006108343384610898856040518060600160405280602581526020016122de602591393360009081526004602090815260408083206001600160a01b038d1684529091529020549190611467565b60006108343384846110b4565b6000546001600160a01b03163314610e235760405162461bcd60e51b81526004016108d190612025565b600d55565b6000546001600160a01b03163314610e525760405162461bcd60e51b81526004016108d190612025565b600c80548215156101000261ff00199091161790556040517f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc15990610e9b90831515815260200190565b60405180910390a150565b6000546001600160a01b03163314610ed05760405162461bcd60e51b81526004016108d190612025565b6001600160a01b038116610f355760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016108d1565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b038316610ff25760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016108d1565b6001600160a01b0382166110535760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016108d1565b6001600160a01b0383811660008181526004602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166111185760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016108d1565b6001600160a01b03821661117a5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016108d1565b600081116111dc5760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b60648201526084016108d1565b6001600160a01b038316600090815260066020526040812054819060ff1615801561122057506001600160a01b03841660009081526006602052604090205460ff16155b801561123a57506000546001600160a01b03868116911614155b801561125457506000546001600160a01b03858116911614155b905060006112818461127b876001600160a01b031660009081526003602052604090205490565b906114a1565b90506112956000546001600160a01b031690565b6001600160a01b0316866001600160a01b0316141580156112c457506000546001600160a01b03868116911614155b80156112de5750600f546001600160a01b03868116911614155b15611389576001600160a01b03861660009081526005602052604090205460ff1615801561132557506001600160a01b03851660009081526005602052604090205460ff16155b6113895760405162461bcd60e51b815260206004820152602f60248201527f626f747320617265206e6f7420616c6c6f77656420746f2073656c6c206f722060448201526e7472616e7366657220746f6b656e7360881b60648201526084016108d1565b6002546001600160a01b03908116908716036113c157600e548111156113c15760405162461bcd60e51b81526004016108d1906121a5565b6002546001600160a01b038781169116148015906113ec57506002546001600160a01b038681169116145b156113fd57600192506113fd611577565b6002546001600160a01b0387811691161480159061142957506002546001600160a01b03868116911614155b1561145057600e548111156114505760405162461bcd60e51b81526004016108d1906121a5565b61145f868686858760016116c3565b505050505050565b6000818484111561148b5760405162461bcd60e51b81526004016108d19190611ccc565b50600061149884866121ea565b95945050505050565b6000806114ae83856121fd565b9050838110156115005760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f77000000000060448201526064016108d1565b9392505050565b60005b82811015611571576000848483818110611526576115266120a4565b905060200201602081019061153b9190611d5b565b6001600160a01b03166000908152600660205260409020805460ff1916841515179055508061156981612210565b91505061150a565b50505050565b306000908152600360205260409020548015610af4576000611597610b9b565b90508082101580156115ac5750600c5460ff16155b80156115bf5750600c54610100900460ff165b156109635761096381611985565b60005b828110156115715760008484838181106115ec576115ec6120a4565b90506020020160208101906116019190611d5b565b6001600160a01b03166000908152600760205260409020805460ff1916841515179055508061162f81612210565b9150506115d0565b60005b82518110156109d2576000838281518110611657576116576120a4565b60200260200101519050821561168f576001600160a01b0381166000908152600560205260409020805460ff191660011790556116b0565b6001600160a01b0381166000908152600560205260409020805460ff191690555b50806116bb81612210565b91505061163a565b6000836116d15760006116ec565b6012546116ec906064906116e69088906119b3565b90611a35565b90508380156116f85750825b1561171557601354611712906064906116e69088906119b3565b90505b60006117218683611a77565b6001600160a01b0389166000908152600360205260409020549091506117479087611a77565b6001600160a01b03808a16600090815260036020526040808220939093559089168152205461177690826114a1565b6001600160a01b0388166000908152600360205260408082209290925530815220546117a290836114a1565b3060009081526003602090815260409182902092909255518781526001600160a01b0389811692908b16917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3821561197b57601454604051633974d3b160e01b81526001600160a01b038a8116600483015290911690633974d3b190602401600060405180830381600087803b15801561184557600080fd5b505af1925050508015611856575060015b50601454604051633974d3b160e01b81526001600160a01b03898116600483015290911690633974d3b190602401600060405180830381600087803b15801561189e57600080fd5b505af19250505080156118af575060015b506014546010546040516001624d3b8760e01b031981526001600160a01b039092169163ffb2c479916118e89160040190815260200190565b6060604051808303816000875af1925050508015611923575060408051601f3d908101601f1916820190925261192091810190612229565b60015b1561197b57601054604080518581526020810185905280820184905260608101929092525132916001917fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989181900360800190a35050505b5050505050505050565b600c805460ff1916600117905561199b81611ab9565b476119a581611c0b565b5050600c805460ff19169055565b6000826000036119c557506000610838565b60006119d18385612070565b9050826119de8583612257565b146115005760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b60648201526084016108d1565b600061150083836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611c9e565b600061150083836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611467565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110611aee57611aee6120a4565b6001600160a01b03928316602091820292909201810191909152600154604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015611b47573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b6b9190612087565b81600181518110611b7e57611b7e6120a4565b6001600160a01b039283166020918202929092010152600154611ba49130911684610f90565b60015460405163791ac94760e01b81526001600160a01b039091169063791ac94790611bdd908590600090869030904290600401612279565b600060405180830381600087803b158015611bf757600080fd5b505af115801561145f573d6000803e3d6000fd5b6014546040516000916001600160a01b03169083908381818185875af1925050503d8060008114611c58576040519150601f19603f3d011682016040523d82523d6000602084013e611c5d565b606091505b505090508015610963576040518281527fb0cc2628d6d644cf6be9d8110e142297ac910d6d8026d795a99f272fd9ad60b19060200160405180910390a15050565b60008183611cbf5760405162461bcd60e51b81526004016108d19190611ccc565b5060006114988486612257565b600060208083528351808285015260005b81811015611cf957858101830151858201604001528201611cdd565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114610af457600080fd5b60008060408385031215611d4257600080fd5b8235611d4d81611d1a565b946020939093013593505050565b600060208284031215611d6d57600080fd5b813561150081611d1a565b600080600060608486031215611d8d57600080fd5b8335611d9881611d1a565b92506020840135611da881611d1a565b929592945050506040919091013590565b600060208284031215611dcb57600080fd5b5035919050565b80358015158114611de257600080fd5b919050565b600080600060408486031215611dfc57600080fd5b833567ffffffffffffffff80821115611e1457600080fd5b818601915086601f830112611e2857600080fd5b813581811115611e3757600080fd5b8760208260051b8501011115611e4c57600080fd5b602092830195509350611e629186019050611dd2565b90509250925092565b60008060408385031215611e7e57600080fd5b50508035926020909101359150565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715611ecc57611ecc611e8d565b604052919050565b600067ffffffffffffffff821115611eee57611eee611e8d565b5060051b60200190565b60006020808385031215611f0b57600080fd5b823567ffffffffffffffff811115611f2257600080fd5b8301601f81018513611f3357600080fd5b8035611f46611f4182611ed4565b611ea3565b81815260059190911b82018301908381019087831115611f6557600080fd5b928401925b82841015611f8c578335611f7d81611d1a565b82529284019290840190611f6a565b979650505050505050565b600060208284031215611fa957600080fd5b61150082611dd2565b60008060408385031215611fc557600080fd5b8235611fd081611d1a565b91506020830135611fe081611d1a565b809150509250929050565b600181811c90821680611fff57607f821691505b60208210810361201f57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b80820281158282048414176108385761083861205a565b60006020828403121561209957600080fd5b815161150081611d1a565b634e487b7160e01b600052603260045260246000fd5b600081518084526020808501945080840160005b838110156120f35781516001600160a01b0316875295820195908201906001016120ce565b509495945050505050565b82815260406020820152600061211760408301846120ba565b949350505050565b6000602080838503121561213257600080fd5b825167ffffffffffffffff81111561214957600080fd5b8301601f8101851361215a57600080fd5b8051612168611f4182611ed4565b81815260059190911b8201830190838101908783111561218757600080fd5b928401925b82841015611f8c5783518252928401929084019061218c565b60208082526025908201527f57616c6c65742063616e6e6f7420657863656564206d61782057616c6c6574206040820152641b1a5b5a5d60da1b606082015260800190565b818103818111156108385761083861205a565b808201808211156108385761083861205a565b6000600182016122225761222261205a565b5060010190565b60008060006060848603121561223e57600080fd5b8351925060208401519150604084015190509250925092565b60008261227457634e487b7160e01b600052601260045260246000fd5b500490565b85815284602082015260a06040820152600061229860a08301866120ba565b6001600160a01b039490941660608301525060800152939250505056fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa264697066735822122000f08dc5fd3af99d99e4dc1a9a458f7122b7ff22b0f0ef3bb3cb8980fd0481d064736f6c63430008110033

Deployed Bytecode

0x6080604052600436106102345760003560e01c806370a082311161012e57806398acb5d8116100ab578063b2abbbc41161006f578063b2abbbc4146106b6578063c49b9a80146106d6578063dd62ed3e146106f6578063e7dad4f91461073c578063f2fde38b1461077557600080fd5b806398acb5d8146106205780639b0e2e86146106405780639c1b8af514610660578063a457c2d714610676578063a9059cbb1461069657600080fd5b806385d4787b116100f257806385d4787b14610598578063871c128d146105b85780638da5cb5b146105d857806395d89b41146105f6578063979957061461060b57600080fd5b806370a08231146104ed578063715018a61461052357806371cd56af1461053857806381230a831461055857806385141a771461057857600080fd5b80632c1f5216116101bc57806349bd5a5e1161018057806349bd5a5e146104495780634a74bb02146104695780635342acb41461048857806354a5df1f146104c15780636c0a24eb146104d757600080fd5b80632c1f5216146103b2578063313ce567146103d257806339509351146103f4578063441d801f1461041457806348c54b9d1461043457600080fd5b80631694505e116102035780631694505e1461030457806318160ddd1461033c57806323b872dd1461035b57806327a14fc21461037b578063280d38211461039d57600080fd5b806306fdde0314610240578063095ea7b31461026b5780630ddc09761461029b5780630e832273146102cb57600080fd5b3661023b57005b600080fd5b34801561024c57600080fd5b50610255610795565b6040516102629190611ccc565b60405180910390f35b34801561027757600080fd5b5061028b610286366004611d2f565b610827565b6040519015158152602001610262565b3480156102a757600080fd5b506012546013546102b6919082565b60408051928352602083019190915201610262565b3480156102d757600080fd5b5061028b6102e6366004611d5b565b6001600160a01b031660009081526007602052604090205460ff1690565b34801561031057600080fd5b50600154610324906001600160a01b031681565b6040516001600160a01b039091168152602001610262565b34801561034857600080fd5b50600b545b604051908152602001610262565b34801561036757600080fd5b5061028b610376366004611d78565b61083e565b34801561038757600080fd5b5061039b610396366004611db9565b6108a7565b005b3480156103a957600080fd5b5061039b6108ee565b3480156103be57600080fd5b50601454610324906001600160a01b031681565b3480156103de57600080fd5b50600a5460405160ff9091168152602001610262565b34801561040057600080fd5b5061028b61040f366004611d2f565b610967565b34801561042057600080fd5b5061039b61042f366004611de7565b61099d565b34801561044057600080fd5b5061039b6109d7565b34801561045557600080fd5b50600254610324906001600160a01b031681565b34801561047557600080fd5b50600c5461028b90610100900460ff1681565b34801561049457600080fd5b5061028b6104a3366004611d5b565b6001600160a01b031660009081526006602052604090205460ff1690565b3480156104cd57600080fd5b5061034d600d5481565b3480156104e357600080fd5b5061034d600e5481565b3480156104f957600080fd5b5061034d610508366004611d5b565b6001600160a01b031660009081526003602052604090205490565b34801561052f57600080fd5b5061039b6109e1565b34801561054457600080fd5b5061039b610553366004611de7565b610a55565b34801561056457600080fd5b5061039b610573366004611e6b565b610a8a565b34801561058457600080fd5b50600f54610324906001600160a01b031681565b3480156105a457600080fd5b5061039b6105b3366004611ef8565b610abf565b3480156105c457600080fd5b5061039b6105d3366004611db9565b610af7565b3480156105e457600080fd5b506000546001600160a01b0316610324565b34801561060257600080fd5b50610255610b8c565b34801561061757600080fd5b5061034d610b9b565b34801561062c57600080fd5b5061039b61063b366004611d5b565b610d1c565b34801561064c57600080fd5b5061039b61065b366004611ef8565b610d68565b34801561066c57600080fd5b5061034d60105481565b34801561068257600080fd5b5061028b610691366004611d2f565b610d9d565b3480156106a257600080fd5b5061028b6106b1366004611d2f565b610dec565b3480156106c257600080fd5b5061039b6106d1366004611db9565b610df9565b3480156106e257600080fd5b5061039b6106f1366004611f97565b610e28565b34801561070257600080fd5b5061034d610711366004611fb2565b6001600160a01b03918216600090815260046020908152604080832093909416825291909152205490565b34801561074857600080fd5b5061028b610757366004611d5b565b6001600160a01b031660009081526005602052604090205460ff1690565b34801561078157600080fd5b5061039b610790366004611d5b565b610ea6565b6060600880546107a490611feb565b80601f01602080910402602001604051908101604052809291908181526020018280546107d090611feb565b801561081d5780601f106107f25761010080835404028352916020019161081d565b820191906000526020600020905b81548152906001019060200180831161080057829003601f168201915b5050505050905090565b6000610834338484610f90565b5060015b92915050565b600061084b8484846110b4565b61089d8433610898856040518060600160405280602881526020016122b6602891396001600160a01b038a1660009081526004602090815260408083203384529091529020549190611467565b610f90565b5060019392505050565b6000546001600160a01b031633146108da5760405162461bcd60e51b81526004016108d190612025565b60405180910390fd5b6108e881633b9aca00612070565b600e5550565b6000546001600160a01b031633146109185760405162461bcd60e51b81526004016108d190612025565b4761092b6000546001600160a01b031690565b6001600160a01b03166108fc829081150290604051600060405180830381858888f19350505050158015610963573d6000803e3d6000fd5b5050565b3360008181526004602090815260408083206001600160a01b0387168452909152812054909161083491859061089890866114a1565b6000546001600160a01b031633146109c75760405162461bcd60e51b81526004016108d190612025565b6109d2838383611507565b505050565b6109df611577565b565b6000546001600160a01b03163314610a0b5760405162461bcd60e51b81526004016108d190612025565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b03163314610a7f5760405162461bcd60e51b81526004016108d190612025565b6109d28383836115cd565b6000546001600160a01b03163314610ab45760405162461bcd60e51b81526004016108d190612025565b601291909155601355565b6000546001600160a01b03163314610ae95760405162461bcd60e51b81526004016108d190612025565b610af4816001611637565b50565b6000546001600160a01b03163314610b215760405162461bcd60e51b81526004016108d190612025565b6010548103610b875760405162461bcd60e51b815260206004820152602c60248201527f43616e6e6f742075706461746520676173466f7250726f63657373696e67207460448201526b6f2073616d652076616c756560a01b60648201526084016108d1565b601055565b6060600980546107a490611feb565b604080516002808252606082018352600092839291906020830190803683375050600154604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c4648925060048083019260209291908290030181865afa158015610c09573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c2d9190612087565b81600081518110610c4057610c406120a4565b60200260200101906001600160a01b031690816001600160a01b0316815250503081600181518110610c7457610c746120a4565b6001600160a01b039283166020918202929092010152600154600d5460405163d06ca61f60e01b8152919092169163d06ca61f91610cb7919085906004016120fe565b600060405180830381865afa158015610cd4573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610cfc919081019061211f565b600181518110610d0e57610d0e6120a4565b602002602001015191505090565b6000546001600160a01b03163314610d465760405162461bcd60e51b81526004016108d190612025565b601480546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314610d925760405162461bcd60e51b81526004016108d190612025565b610af4816000611637565b60006108343384610898856040518060600160405280602581526020016122de602591393360009081526004602090815260408083206001600160a01b038d1684529091529020549190611467565b60006108343384846110b4565b6000546001600160a01b03163314610e235760405162461bcd60e51b81526004016108d190612025565b600d55565b6000546001600160a01b03163314610e525760405162461bcd60e51b81526004016108d190612025565b600c80548215156101000261ff00199091161790556040517f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc15990610e9b90831515815260200190565b60405180910390a150565b6000546001600160a01b03163314610ed05760405162461bcd60e51b81526004016108d190612025565b6001600160a01b038116610f355760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016108d1565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b038316610ff25760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016108d1565b6001600160a01b0382166110535760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016108d1565b6001600160a01b0383811660008181526004602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166111185760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016108d1565b6001600160a01b03821661117a5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016108d1565b600081116111dc5760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b60648201526084016108d1565b6001600160a01b038316600090815260066020526040812054819060ff1615801561122057506001600160a01b03841660009081526006602052604090205460ff16155b801561123a57506000546001600160a01b03868116911614155b801561125457506000546001600160a01b03858116911614155b905060006112818461127b876001600160a01b031660009081526003602052604090205490565b906114a1565b90506112956000546001600160a01b031690565b6001600160a01b0316866001600160a01b0316141580156112c457506000546001600160a01b03868116911614155b80156112de5750600f546001600160a01b03868116911614155b15611389576001600160a01b03861660009081526005602052604090205460ff1615801561132557506001600160a01b03851660009081526005602052604090205460ff16155b6113895760405162461bcd60e51b815260206004820152602f60248201527f626f747320617265206e6f7420616c6c6f77656420746f2073656c6c206f722060448201526e7472616e7366657220746f6b656e7360881b60648201526084016108d1565b6002546001600160a01b03908116908716036113c157600e548111156113c15760405162461bcd60e51b81526004016108d1906121a5565b6002546001600160a01b038781169116148015906113ec57506002546001600160a01b038681169116145b156113fd57600192506113fd611577565b6002546001600160a01b0387811691161480159061142957506002546001600160a01b03868116911614155b1561145057600e548111156114505760405162461bcd60e51b81526004016108d1906121a5565b61145f868686858760016116c3565b505050505050565b6000818484111561148b5760405162461bcd60e51b81526004016108d19190611ccc565b50600061149884866121ea565b95945050505050565b6000806114ae83856121fd565b9050838110156115005760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f77000000000060448201526064016108d1565b9392505050565b60005b82811015611571576000848483818110611526576115266120a4565b905060200201602081019061153b9190611d5b565b6001600160a01b03166000908152600660205260409020805460ff1916841515179055508061156981612210565b91505061150a565b50505050565b306000908152600360205260409020548015610af4576000611597610b9b565b90508082101580156115ac5750600c5460ff16155b80156115bf5750600c54610100900460ff165b156109635761096381611985565b60005b828110156115715760008484838181106115ec576115ec6120a4565b90506020020160208101906116019190611d5b565b6001600160a01b03166000908152600760205260409020805460ff1916841515179055508061162f81612210565b9150506115d0565b60005b82518110156109d2576000838281518110611657576116576120a4565b60200260200101519050821561168f576001600160a01b0381166000908152600560205260409020805460ff191660011790556116b0565b6001600160a01b0381166000908152600560205260409020805460ff191690555b50806116bb81612210565b91505061163a565b6000836116d15760006116ec565b6012546116ec906064906116e69088906119b3565b90611a35565b90508380156116f85750825b1561171557601354611712906064906116e69088906119b3565b90505b60006117218683611a77565b6001600160a01b0389166000908152600360205260409020549091506117479087611a77565b6001600160a01b03808a16600090815260036020526040808220939093559089168152205461177690826114a1565b6001600160a01b0388166000908152600360205260408082209290925530815220546117a290836114a1565b3060009081526003602090815260409182902092909255518781526001600160a01b0389811692908b16917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3821561197b57601454604051633974d3b160e01b81526001600160a01b038a8116600483015290911690633974d3b190602401600060405180830381600087803b15801561184557600080fd5b505af1925050508015611856575060015b50601454604051633974d3b160e01b81526001600160a01b03898116600483015290911690633974d3b190602401600060405180830381600087803b15801561189e57600080fd5b505af19250505080156118af575060015b506014546010546040516001624d3b8760e01b031981526001600160a01b039092169163ffb2c479916118e89160040190815260200190565b6060604051808303816000875af1925050508015611923575060408051601f3d908101601f1916820190925261192091810190612229565b60015b1561197b57601054604080518581526020810185905280820184905260608101929092525132916001917fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989181900360800190a35050505b5050505050505050565b600c805460ff1916600117905561199b81611ab9565b476119a581611c0b565b5050600c805460ff19169055565b6000826000036119c557506000610838565b60006119d18385612070565b9050826119de8583612257565b146115005760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b60648201526084016108d1565b600061150083836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611c9e565b600061150083836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611467565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110611aee57611aee6120a4565b6001600160a01b03928316602091820292909201810191909152600154604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015611b47573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b6b9190612087565b81600181518110611b7e57611b7e6120a4565b6001600160a01b039283166020918202929092010152600154611ba49130911684610f90565b60015460405163791ac94760e01b81526001600160a01b039091169063791ac94790611bdd908590600090869030904290600401612279565b600060405180830381600087803b158015611bf757600080fd5b505af115801561145f573d6000803e3d6000fd5b6014546040516000916001600160a01b03169083908381818185875af1925050503d8060008114611c58576040519150601f19603f3d011682016040523d82523d6000602084013e611c5d565b606091505b505090508015610963576040518281527fb0cc2628d6d644cf6be9d8110e142297ac910d6d8026d795a99f272fd9ad60b19060200160405180910390a15050565b60008183611cbf5760405162461bcd60e51b81526004016108d19190611ccc565b5060006114988486612257565b600060208083528351808285015260005b81811015611cf957858101830151858201604001528201611cdd565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114610af457600080fd5b60008060408385031215611d4257600080fd5b8235611d4d81611d1a565b946020939093013593505050565b600060208284031215611d6d57600080fd5b813561150081611d1a565b600080600060608486031215611d8d57600080fd5b8335611d9881611d1a565b92506020840135611da881611d1a565b929592945050506040919091013590565b600060208284031215611dcb57600080fd5b5035919050565b80358015158114611de257600080fd5b919050565b600080600060408486031215611dfc57600080fd5b833567ffffffffffffffff80821115611e1457600080fd5b818601915086601f830112611e2857600080fd5b813581811115611e3757600080fd5b8760208260051b8501011115611e4c57600080fd5b602092830195509350611e629186019050611dd2565b90509250925092565b60008060408385031215611e7e57600080fd5b50508035926020909101359150565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715611ecc57611ecc611e8d565b604052919050565b600067ffffffffffffffff821115611eee57611eee611e8d565b5060051b60200190565b60006020808385031215611f0b57600080fd5b823567ffffffffffffffff811115611f2257600080fd5b8301601f81018513611f3357600080fd5b8035611f46611f4182611ed4565b611ea3565b81815260059190911b82018301908381019087831115611f6557600080fd5b928401925b82841015611f8c578335611f7d81611d1a565b82529284019290840190611f6a565b979650505050505050565b600060208284031215611fa957600080fd5b61150082611dd2565b60008060408385031215611fc557600080fd5b8235611fd081611d1a565b91506020830135611fe081611d1a565b809150509250929050565b600181811c90821680611fff57607f821691505b60208210810361201f57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b80820281158282048414176108385761083861205a565b60006020828403121561209957600080fd5b815161150081611d1a565b634e487b7160e01b600052603260045260246000fd5b600081518084526020808501945080840160005b838110156120f35781516001600160a01b0316875295820195908201906001016120ce565b509495945050505050565b82815260406020820152600061211760408301846120ba565b949350505050565b6000602080838503121561213257600080fd5b825167ffffffffffffffff81111561214957600080fd5b8301601f8101851361215a57600080fd5b8051612168611f4182611ed4565b81815260059190911b8201830190838101908783111561218757600080fd5b928401925b82841015611f8c5783518252928401929084019061218c565b60208082526025908201527f57616c6c65742063616e6e6f7420657863656564206d61782057616c6c6574206040820152641b1a5b5a5d60da1b606082015260800190565b818103818111156108385761083861205a565b808201808211156108385761083861205a565b6000600182016122225761222261205a565b5060010190565b60008060006060848603121561223e57600080fd5b8351925060208401519150604084015190509250925092565b60008261227457634e487b7160e01b600052601260045260246000fd5b500490565b85815284602082015260a06040820152600061229860a08301866120ba565b6001600160a01b039490941660608301525060800152939250505056fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa264697066735822122000f08dc5fd3af99d99e4dc1a9a458f7122b7ff22b0f0ef3bb3cb8980fd0481d064736f6c63430008110033

Deployed Bytecode Sourcemap

8846:11929:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11169:83;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12002:161;;;;;;;;;;-1:-1:-1;12002:161:0;;;;;:::i;:::-;;:::i;:::-;;;1188:14:1;;1181:22;1163:41;;1151:2;1136:18;12002:161:0;1023:187:1;10601:22:0;;;;;;;;;;-1:-1:-1;10601:22:0;;;;;;;;;;;;;1389:25:1;;;1445:2;1430:18;;1423:34;;;;1362:18;10601:22:0;1215:248:1;13474:126:0;;;;;;;;;;-1:-1:-1;13474:126:0;;;;;:::i;:::-;-1:-1:-1;;;;;13564:28:0;13540:4;13564:28;;;:22;:28;;;;;;;;;13474:126;9276:106;;;;;;;;;;-1:-1:-1;9276:106:0;;;;-1:-1:-1;;;;;9276:106:0;;;;;;-1:-1:-1;;;;;1910:32:1;;;1892:51;;1880:2;1865:18;9276:106:0;1720:229:1;11446:95:0;;;;;;;;;;-1:-1:-1;11526:7:0;;11446:95;;;2100:25:1;;;2088:2;2073:18;11446:95:0;1954:177:1;12171:313:0;;;;;;;;;;-1:-1:-1;12171:313:0;;;;;:::i;:::-;;:::i;12995:137::-;;;;;;;;;;-1:-1:-1;12995:137:0;;;;;:::i;:::-;;:::i;:::-;;18819:161;;;;;;;;;;;;;:::i;10630:38::-;;;;;;;;;;-1:-1:-1;10630:38:0;;;;-1:-1:-1;;;;;10630:38:0;;;11355:83;;;;;;;;;;-1:-1:-1;11421:9:0;;11355:83;;11421:9;;;;3164:36:1;;3152:2;3137:18;11355:83:0;3022:184:1;12492:218:0;;;;;;;;;;-1:-1:-1;12492:218:0;;;;;:::i;:::-;;:::i;13140:161::-;;;;;;;;;;-1:-1:-1;13140:161:0;;;;;:::i;:::-;;:::i;18342:66::-;;;;;;;;;;;;;:::i;9389:41::-;;;;;;;;;;-1:-1:-1;9389:41:0;;;;-1:-1:-1;;;;;9389:41:0;;;9947:40;;;;;;;;;;-1:-1:-1;9947:40:0;;;;;;;;;;;15638:124;;;;;;;;;;-1:-1:-1;15638:124:0;;;;;:::i;:::-;-1:-1:-1;;;;;15727:27:0;15703:4;15727:27;;;:18;:27;;;;;;;;;15638:124;9994:50;;;;;;;;;;;;;;;;10060:58;;;;;;;;;;;;;;;;11549:119;;;;;;;;;;-1:-1:-1;11549:119:0;;;;;:::i;:::-;-1:-1:-1;;;;;11642:18:0;11615:7;11642:18;;;:9;:18;;;;;;;11549:119;7628:148;;;;;;;;;;;;;:::i;13309:157::-;;;;;;;;;;-1:-1:-1;13309:157:0;;;;;:::i;:::-;;:::i;14234:150::-;;;;;;;;;;-1:-1:-1;14234:150:0;;;;;:::i;:::-;;:::i;10125:70::-;;;;;;;;;;-1:-1:-1;10125:70:0;;;;-1:-1:-1;;;;;10125:70:0;;;14509:128;;;;;;;;;;-1:-1:-1;14509:128:0;;;;;:::i;:::-;;:::i;17892:209::-;;;;;;;;;;-1:-1:-1;17892:209:0;;;;;:::i;:::-;;:::i;7414:79::-;;;;;;;;;;-1:-1:-1;7452:7:0;7479:6;-1:-1:-1;;;;;7479:6:0;7414:79;;11260:87;;;;;;;;;;;;;:::i;15355:275::-;;;;;;;;;;;;;:::i;18416:166::-;;;;;;;;;;-1:-1:-1;18416:166:0;;;;;:::i;:::-;;:::i;14645:131::-;;;;;;;;;;-1:-1:-1;14645:131:0;;;;;:::i;:::-;;:::i;10202:39::-;;;;;;;;;;;;;;;;12718:269;;;;;;;;;;-1:-1:-1;12718:269:0;;;;;:::i;:::-;;:::i;11676:167::-;;;;;;;;;;-1:-1:-1;11676:167:0;;;;;:::i;:::-;;:::i;13860:122::-;;;;;;;;;;-1:-1:-1;13860:122:0;;;;;:::i;:::-;;:::i;15139:171::-;;;;;;;;;;-1:-1:-1;15139:171:0;;;;;:::i;:::-;;:::i;11851:143::-;;;;;;;;;;-1:-1:-1;11851:143:0;;;;;:::i;:::-;-1:-1:-1;;;;;11959:18:0;;;11932:7;11959:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;11851:143;14392:109;;;;;;;;;;-1:-1:-1;14392:109:0;;;;;:::i;:::-;-1:-1:-1;;;;;14477:16:0;14453:4;14477:16;;;:10;:16;;;;;;;;;14392:109;7784:244;;;;;;;;;;-1:-1:-1;7784:244:0;;;;;:::i;:::-;;:::i;11169:83::-;11206:13;11239:5;11232:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11169:83;:::o;12002:161::-;12077:4;12094:39;4502:10;12117:7;12126:6;12094:8;:39::i;:::-;-1:-1:-1;12151:4:0;12002:161;;;;;:::o;12171:313::-;12269:4;12286:36;12296:6;12304:9;12315:6;12286:9;:36::i;:::-;12333:121;12342:6;4502:10;12364:89;12402:6;12364:89;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;12364:19:0;;;;;;:11;:19;;;;;;;;4502:10;12364:33;;;;;;;;;;:37;:89::i;:::-;12333:8;:121::i;:::-;-1:-1:-1;12472:4:0;12171:313;;;;;:::o;12995:137::-;7541:6;;-1:-1:-1;;;;;7541:6:0;4502:10;7541:22;7533:67;;;;-1:-1:-1;;;7533:67:0;;;;;;;:::i;:::-;;;;;;;;;13099:25:::1;:15:::0;13117:7:::1;13099:25;:::i;:::-;13080:16;:44:::0;-1:-1:-1;12995:137:0:o;18819:161::-;7541:6;;-1:-1:-1;;;;;7541:6:0;4502:10;7541:22;7533:67;;;;-1:-1:-1;;;7533:67:0;;;;;;;:::i;:::-;18903:21:::1;18943:7;7452::::0;7479:6;-1:-1:-1;;;;;7479:6:0;;7414:79;18943:7:::1;-1:-1:-1::0;;;;;18935:25:0::1;:37;18961:10;18935:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;18871:109;18819:161::o:0;12492:218::-;4502:10;12580:4;12629:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;12629:34:0;;;;;;;;;;12580:4;;12597:83;;12620:7;;12629:50;;12668:10;12629:38;:50::i;13140:161::-;7541:6;;-1:-1:-1;;;;;7541:6:0;4502:10;7541:22;7533:67;;;;-1:-1:-1;;;7533:67:0;;;;;;;:::i;:::-;13252:41:::1;13265:9;;13276:16;13252:12;:41::i;:::-;13140:161:::0;;;:::o;18342:66::-;18385:15;:13;:15::i;:::-;18342:66::o;7628:148::-;7541:6;;-1:-1:-1;;;;;7541:6:0;4502:10;7541:22;7533:67;;;;-1:-1:-1;;;7533:67:0;;;;;;;:::i;:::-;7735:1:::1;7719:6:::0;;7698:40:::1;::::0;-1:-1:-1;;;;;7719:6:0;;::::1;::::0;7698:40:::1;::::0;7735:1;;7698:40:::1;7766:1;7749:19:::0;;-1:-1:-1;;;;;;7749:19:0::1;::::0;;7628:148::o;13309:157::-;7541:6;;-1:-1:-1;;;;;7541:6:0;4502:10;7541:22;7533:67;;;;-1:-1:-1;;;7533:67:0;;;;;;;:::i;:::-;13419:39:::1;13436:9;;13447:10;13419:16;:39::i;14234:150::-:0;7541:6;;-1:-1:-1;;;;;7541:6:0;4502:10;7541:22;7533:67;;;;-1:-1:-1;;;7533:67:0;;;;;;;:::i;:::-;14317:7:::1;:23:::0;;;;14351:15;:25;14234:150::o;14509:128::-;7541:6;;-1:-1:-1;;;;;7541:6:0;4502:10;7541:22;7533:67;;;;-1:-1:-1;;;7533:67:0;;;;;;;:::i;:::-;14593:36:::1;14613:9;14624:4;14593:19;:36::i;:::-;14509:128:::0;:::o;17892:209::-;7541:6;;-1:-1:-1;;;;;7541:6:0;4502:10;7541:22;7533:67;;;;-1:-1:-1;;;7533:67:0;;;;;;;:::i;:::-;17990:16:::1;;17978:8;:28:::0;17970:85:::1;;;::::0;-1:-1:-1;;;17970:85:0;;7933:2:1;17970:85:0::1;::::0;::::1;7915:21:1::0;7972:2;7952:18;;;7945:30;8011:34;7991:18;;;7984:62;-1:-1:-1;;;8062:18:1;;;8055:42;8114:19;;17970:85:0::1;7731:408:1::0;17970:85:0::1;18066:16;:27:::0;17892:209::o;11260:87::-;11299:13;11332:7;11325:14;;;;;:::i;15355:275::-;15457:16;;;15471:1;15457:16;;;;;;;;15412:7;;;;15457:16;15471:1;15457:16;;;;;;;;-1:-1:-1;;15494:15:0;;:22;;;-1:-1:-1;;;15494:22:0;;;;15433:40;;-1:-1:-1;;;;;;15494:15:0;;;;:20;;-1:-1:-1;15494:22:0;;;;;;;;;;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;15484:4;15489:1;15484:7;;;;;;;;:::i;:::-;;;;;;:32;-1:-1:-1;;;;;15484:32:0;;;-1:-1:-1;;;;;15484:32:0;;;;;15545:4;15527;15532:1;15527:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;15527:23:0;;;:7;;;;;;;;;:23;15568:15;;15598:14;;15568:51;;-1:-1:-1;;;15568:51:0;;:15;;;;;:29;;:51;;15598:14;15614:4;;15568:51;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;15568:51:0;;;;;;;;;;;;:::i;:::-;15620:1;15568:54;;;;;;;;:::i;:::-;;;;;;;15561:61;;;15355:275;:::o;18416:166::-;7541:6;;-1:-1:-1;;;;;7541:6:0;4502:10;7541:22;7533:67;;;;-1:-1:-1;;;7533:67:0;;;;;;;:::i;:::-;18507:15:::1;:67:::0;;-1:-1:-1;;;;;;18507:67:0::1;-1:-1:-1::0;;;;;18507:67:0;;;::::1;::::0;;;::::1;::::0;;18416:166::o;14645:131::-;7541:6;;-1:-1:-1;;;;;7541:6:0;4502:10;7541:22;7533:67;;;;-1:-1:-1;;;7533:67:0;;;;;;;:::i;:::-;14731:37:::1;14751:9;14762:5;14731:19;:37::i;12718:269::-:0;12811:4;12828:129;4502:10;12851:7;12860:96;12899:15;12860:96;;;;;;;;;;;;;;;;;4502:10;12860:25;;;;:11;:25;;;;;;;;-1:-1:-1;;;;;12860:34:0;;;;;;;;;;;;:38;:96::i;11676:167::-;11754:4;11771:42;4502:10;11795:9;11806:6;11771:9;:42::i;13860:122::-;7541:6;;-1:-1:-1;;;;;7541:6:0;4502:10;7541:22;7533:67;;;;-1:-1:-1;;;7533:67:0;;;;;;;:::i;:::-;13942:14:::1;:32:::0;13860:122::o;15139:171::-;7541:6;;-1:-1:-1;;;;;7541:6:0;4502:10;7541:22;7533:67;;;;-1:-1:-1;;;7533:67:0;;;;;;;:::i;:::-;15216:21:::1;:32:::0;;;::::1;;;;-1:-1:-1::0;;15216:32:0;;::::1;;::::0;;15264:38:::1;::::0;::::1;::::0;::::1;::::0;15240:8;1188:14:1;1181:22;1163:41;;1151:2;1136:18;;1023:187;15264:38:0::1;;;;;;;;15139:171:::0;:::o;7784:244::-;7541:6;;-1:-1:-1;;;;;7541:6:0;4502:10;7541:22;7533:67;;;;-1:-1:-1;;;7533:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;7873:22:0;::::1;7865:73;;;::::0;-1:-1:-1;;;7865:73:0;;10423:2:1;7865:73:0::1;::::0;::::1;10405:21:1::0;10462:2;10442:18;;;10435:30;10501:34;10481:18;;;10474:62;-1:-1:-1;;;10552:18:1;;;10545:36;10598:19;;7865:73:0::1;10221:402:1::0;7865:73:0::1;7975:6;::::0;;7954:38:::1;::::0;-1:-1:-1;;;;;7954:38:0;;::::1;::::0;7975:6;::::1;::::0;7954:38:::1;::::0;::::1;8003:6;:17:::0;;-1:-1:-1;;;;;;8003:17:0::1;-1:-1:-1::0;;;;;8003:17:0;;;::::1;::::0;;;::::1;::::0;;7784:244::o;15770:337::-;-1:-1:-1;;;;;15863:19:0;;15855:68;;;;-1:-1:-1;;;15855:68:0;;10830:2:1;15855:68:0;;;10812:21:1;10869:2;10849:18;;;10842:30;10908:34;10888:18;;;10881:62;-1:-1:-1;;;10959:18:1;;;10952:34;11003:19;;15855:68:0;10628:400:1;15855:68:0;-1:-1:-1;;;;;15942:21:0;;15934:68;;;;-1:-1:-1;;;15934:68:0;;11235:2:1;15934:68:0;;;11217:21:1;11274:2;11254:18;;;11247:30;11313:34;11293:18;;;11286:62;-1:-1:-1;;;11364:18:1;;;11357:32;11406:19;;15934:68:0;11033:398:1;15934:68:0;-1:-1:-1;;;;;16015:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;16067:32;;2100:25:1;;;16067:32:0;;2073:18:1;16067:32:0;;;;;;;15770:337;;;:::o;16115:1374::-;-1:-1:-1;;;;;16203:18:0;;16195:68;;;;-1:-1:-1;;;16195:68:0;;11638:2:1;16195:68:0;;;11620:21:1;11677:2;11657:18;;;11650:30;11716:34;11696:18;;;11689:62;-1:-1:-1;;;11767:18:1;;;11760:35;11812:19;;16195:68:0;11436:401:1;16195:68:0;-1:-1:-1;;;;;16282:16:0;;16274:64;;;;-1:-1:-1;;;16274:64:0;;12044:2:1;16274:64:0;;;12026:21:1;12083:2;12063:18;;;12056:30;12122:34;12102:18;;;12095:62;-1:-1:-1;;;12173:18:1;;;12166:33;12216:19;;16274:64:0;11842:399:1;16274:64:0;16366:1;16357:6;:10;16349:64;;;;-1:-1:-1;;;16349:64:0;;12448:2:1;16349:64:0;;;12430:21:1;12487:2;12467:18;;;12460:30;12526:34;12506:18;;;12499:62;-1:-1:-1;;;12577:18:1;;;12570:39;12626:19;;16349:64:0;12246:405:1;16349:64:0;-1:-1:-1;;;;;16471:24:0;;16424:11;16471:24;;;:18;:24;;;;;;16424:11;;16471:24;;16470:25;:52;;;;-1:-1:-1;;;;;;16500:22:0;;;;;;:18;:22;;;;;;;;16499:23;16470:52;:71;;;;-1:-1:-1;7452:7:0;7479:6;-1:-1:-1;;;;;16526:15:0;;;7479:6;;16526:15;;16470:71;:88;;;;-1:-1:-1;7452:7:0;7479:6;-1:-1:-1;;;;;16545:13:0;;;7479:6;;16545:13;;16470:88;16454:104;;16569:21;16593:25;16611:6;16593:13;16603:2;-1:-1:-1;;;;;11642:18:0;11615:7;11642:18;;;:9;:18;;;;;;;11549:119;16593:13;:17;;:25::i;:::-;16569:49;;16730:7;7452;7479:6;-1:-1:-1;;;;;7479:6:0;;7414:79;16730:7;-1:-1:-1;;;;;16722:15:0;:4;-1:-1:-1;;;;;16722:15:0;;;:32;;;;-1:-1:-1;7452:7:0;7479:6;-1:-1:-1;;;;;16741:13:0;;;7479:6;;16741:13;;16722:32;:52;;;;-1:-1:-1;16764:10:0;;-1:-1:-1;;;;;16758:16:0;;;16764:10;;16758:16;;16722:52;16718:181;;;-1:-1:-1;;;;;16800:16:0;;;;;;:10;:16;;;;;;;;16799:17;:36;;;;-1:-1:-1;;;;;;16821:14:0;;;;;;:10;:14;;;;;;;;16820:15;16799:36;16791:96;;;;-1:-1:-1;;;16791:96:0;;12858:2:1;16791:96:0;;;12840:21:1;12897:2;12877:18;;;12870:30;12936:34;12916:18;;;12909:62;-1:-1:-1;;;12987:18:1;;;12980:45;13042:19;;16791:96:0;12656:411:1;16791:96:0;16921:13;;-1:-1:-1;;;;;16921:13:0;;;16913:21;;;;16909:137;;16976:16;;16959:13;:33;;16951:83;;;;-1:-1:-1;;;16951:83:0;;;;;;;:::i;:::-;17068:13;;-1:-1:-1;;;;;17060:21:0;;;17068:13;;17060:21;;;;:44;;-1:-1:-1;17091:13:0;;-1:-1:-1;;;;;17085:19:0;;;17091:13;;17085:19;17060:44;17056:189;;;17199:4;17190:13;;17218:15;:13;:15::i;:::-;17267:13;;-1:-1:-1;;;;;17259:21:0;;;17267:13;;17259:21;;;;:44;;-1:-1:-1;17290:13:0;;-1:-1:-1;;;;;17284:19:0;;;17290:13;;17284:19;;17259:44;17255:160;;;17345:16;;17328:13;:33;;17320:83;;;;-1:-1:-1;;;17320:83:0;;;;;;;:::i;:::-;17425:56;17440:4;17446:2;17450:6;17458:8;17468:6;17476:4;17425:14;:56::i;:::-;16184:1305;;;16115:1374;;;:::o;2894:192::-;2980:7;3016:12;3008:6;;;;3000:29;;;;-1:-1:-1;;;3000:29:0;;;;;;;;:::i;:::-;-1:-1:-1;3040:9:0;3052:5;3056:1;3052;:5;:::i;:::-;3040:17;2894:192;-1:-1:-1;;;;;2894:192:0:o;2561:181::-;2619:7;;2651:5;2655:1;2651;:5;:::i;:::-;2639:17;;2680:1;2675;:6;;2667:46;;;;-1:-1:-1;;;2667:46:0;;13943:2:1;2667:46:0;;;13925:21:1;13982:2;13962:18;;;13955:30;14021:29;14001:18;;;13994:57;14068:18;;2667:46:0;13741:351:1;2667:46:0;2733:1;2561:181;-1:-1:-1;;;2561:181:0:o;13990:236::-;14077:9;14072:147;14092:20;;;14072:147;;;14134:12;14149:9;;14159:1;14149:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;14176:24:0;;;;;:18;:24;;;;;:31;;-1:-1:-1;;14176:31:0;;;;;;;-1:-1:-1;14114:3:0;;;;:::i;:::-;;;;14072:147;;;;13990:236;;;:::o;17497:387::-;17590:4;17541:28;11642:18;;;:9;:18;;;;;;17611:24;;17607:270;;17652:19;17674:26;:24;:26::i;:::-;17652:48;;17743:11;17719:20;:35;;:56;;;;-1:-1:-1;17759:16:0;;;;17758:17;17719:56;:81;;;;-1:-1:-1;17779:21:0;;;;;;;17719:81;17715:151;;;17821:29;17838:11;17821:16;:29::i;13608:244::-;13699:9;13694:151;13714:20;;;13694:151;;;13756:12;13771:9;;13781:1;13771:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;13798:28:0;;;;;:22;:28;;;;;:35;;-1:-1:-1;;13798:35:0;;;;;;;-1:-1:-1;13736:3:0;;;;:::i;:::-;;;;13694:151;;14784:347;14879:9;14874:250;14898:9;:16;14894:1;:20;14874:250;;;14936:12;14951:9;14961:1;14951:12;;;;;;;;:::i;:::-;;;;;;;14936:27;;14982:7;14978:135;;;-1:-1:-1;;;;;15010:16:0;;;;;;:10;:16;;;;;:23;;-1:-1:-1;;15010:23:0;15029:4;15010:23;;;14978:135;;;-1:-1:-1;;;;;15081:16:0;;;;;;:10;:16;;;;;15074:23;;-1:-1:-1;;15074:23:0;;;14978:135;-1:-1:-1;14916:3:0;;;;:::i;:::-;;;;14874:250;;19654:1118;19800:17;19820:8;:50;;19869:1;19820:50;;;19842:7;:14;19831:35;;19862:3;;19831:26;;:6;;:10;:26::i;:::-;:30;;:35::i;:::-;19800:70;;19885:8;:18;;;;;19897:6;19885:18;19881:99;;;19943:15;;19932:36;;19964:3;;19932:27;;:6;;:10;:27::i;:36::-;19920:48;;19881:99;19990:22;20015:21;:6;20026:9;20015:10;:21::i;:::-;-1:-1:-1;;;;;20067:17:0;;;;;;:9;:17;;;;;;19990:46;;-1:-1:-1;20067:29:0;;20089:6;20067:21;:29::i;:::-;-1:-1:-1;;;;;20047:17:0;;;;;;;:9;:17;;;;;;:49;;;;20130:20;;;;;;;:40;;20155:14;20130:24;:40::i;:::-;-1:-1:-1;;;;;20107:20:0;;;;;;:9;:20;;;;;;:63;;;;20226:4;20208:24;;;;:39;;20237:9;20208:28;:39::i;:::-;20199:4;20181:24;;;;:9;:24;;;;;;;;;:66;;;;20263:35;2100:25:1;;;-1:-1:-1;;;;;20263:35:0;;;;;;;;;;2073:18:1;20263:35:0;;;;;;;20315:17;20311:454;;;20353:15;;:39;;-1:-1:-1;;;20353:39:0;;-1:-1:-1;;;;;1910:32:1;;;20353:39:0;;;1892:51:1;20353:15:0;;;;:31;;1865:18:1;;20353:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20349:54;20421:15;;:42;;-1:-1:-1;;;20421:42:0;;-1:-1:-1;;;;;1910:32:1;;;20421:42:0;;;1892:51:1;20421:15:0;;;;:31;;1865:18:1;;20421:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20417:57;20492:15;;20516:16;;20492:41;;-1:-1:-1;;;;;;20492:41:0;;-1:-1:-1;;;;;20492:15:0;;;;:23;;:41;;;;2100:25:1;;;2088:2;2073:18;;1954:177;20492:41:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20492:41:0;;;;;;;;-1:-1:-1;;20492:41:0;;;;;;;;;;;;:::i;:::-;;;20488:266;;;20702:16;;20631:99;;;14779:25:1;;;14835:2;14820:18;;14813:34;;;14863:18;;;14856:34;;;14921:2;14906:18;;14899:34;;;;20631:99:0;20720:9;;20696:4;;20631:99;;;;;14766:3:1;20631:99:0;;;20534:212;;;20488:266;19789:983;;19654:1118;;;;;;:::o;18109:225::-;9192:16;:23;;-1:-1:-1;;9192:23:0;9211:4;9192:23;;;18196:38:::1;18213:20:::0;18196:16:::1;:38::i;:::-;18266:21;18298:28;18266:21:::0;18298:16:::1;:28::i;:::-;-1:-1:-1::0;;9238:16:0;:24;;-1:-1:-1;;9238:24:0;;;18109:225::o;3094:471::-;3152:7;3397:1;3402;3397:6;3393:47;;-1:-1:-1;3427:1:0;3420:8;;3393:47;3452:9;3464:5;3468:1;3464;:5;:::i;:::-;3452:17;-1:-1:-1;3497:1:0;3488:5;3492:1;3452:17;3488:5;:::i;:::-;:10;3480:56;;;;-1:-1:-1;;;3480:56:0;;15368:2:1;3480:56:0;;;15350:21:1;15407:2;15387:18;;;15380:30;15446:34;15426:18;;;15419:62;-1:-1:-1;;;15497:18:1;;;15490:31;15538:19;;3480:56:0;15166:397:1;3573:132:0;3631:7;3658:39;3662:1;3665;3658:39;;;;;;;;;;;;;;;;;:3;:39::i;2750:136::-;2808:7;2835:43;2839:1;2842;2835:43;;;;;;;;;;;;;;;;;:3;:43::i;18988:585::-;19138:16;;;19152:1;19138:16;;;;;;;;19114:21;;19138:16;;;;;;;;;;-1:-1:-1;19138:16:0;19114:40;;19183:4;19165;19170:1;19165:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;19165:23:0;;;:7;;;;;;;;;;:23;;;;19209:15;;:22;;;-1:-1:-1;;;19209:22:0;;;;:15;;;;;:20;;:22;;;;;19165:7;;19209:22;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19199:4;19204:1;19199:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;19199:32:0;;;:7;;;;;;;;;:32;19274:15;;19242:62;;19259:4;;19274:15;19292:11;19242:8;:62::i;:::-;19341:15;;:224;;-1:-1:-1;;;19341:224:0;;-1:-1:-1;;;;;19341:15:0;;;;:66;;:224;;19422:11;;19341:15;;19492:4;;19519;;19539:15;;19341:224;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18590:221;18680:15;;18672:52;;18655:12;;-1:-1:-1;;;;;18680:15:0;;18710:9;;18655:12;18672:52;18655:12;18672:52;18710:9;18680:15;18672:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18654:70;;;18739:7;18735:69;;;18768:24;;2100:25:1;;;18768:24:0;;2088:2:1;2073:18;18768:24:0;;;;;;;18643:168;18590:221;:::o;3713:278::-;3799:7;3834:12;3827:5;3819:28;;;;-1:-1:-1;;;3819:28:0;;;;;;;;:::i;:::-;-1:-1:-1;3858:9:0;3870:5;3874:1;3870;:5;:::i;14:548:1:-;126:4;155:2;184;173:9;166:21;216:6;210:13;259:6;254:2;243:9;239:18;232:34;284:1;294:140;308:6;305:1;302:13;294:140;;;403:14;;;399:23;;393:30;369:17;;;388:2;365:26;358:66;323:10;;294:140;;;298:3;483:1;478:2;469:6;458:9;454:22;450:31;443:42;553:2;546;542:7;537:2;529:6;525:15;521:29;510:9;506:45;502:54;494:62;;;;14:548;;;;:::o;567:131::-;-1:-1:-1;;;;;642:31:1;;632:42;;622:70;;688:1;685;678:12;703:315;771:6;779;832:2;820:9;811:7;807:23;803:32;800:52;;;848:1;845;838:12;800:52;887:9;874:23;906:31;931:5;906:31;:::i;:::-;956:5;1008:2;993:18;;;;980:32;;-1:-1:-1;;;703:315:1:o;1468:247::-;1527:6;1580:2;1568:9;1559:7;1555:23;1551:32;1548:52;;;1596:1;1593;1586:12;1548:52;1635:9;1622:23;1654:31;1679:5;1654:31;:::i;2136:456::-;2213:6;2221;2229;2282:2;2270:9;2261:7;2257:23;2253:32;2250:52;;;2298:1;2295;2288:12;2250:52;2337:9;2324:23;2356:31;2381:5;2356:31;:::i;:::-;2406:5;-1:-1:-1;2463:2:1;2448:18;;2435:32;2476:33;2435:32;2476:33;:::i;:::-;2136:456;;2528:7;;-1:-1:-1;;;2582:2:1;2567:18;;;;2554:32;;2136:456::o;2597:180::-;2656:6;2709:2;2697:9;2688:7;2684:23;2680:32;2677:52;;;2725:1;2722;2715:12;2677:52;-1:-1:-1;2748:23:1;;2597:180;-1:-1:-1;2597:180:1:o;3211:160::-;3276:20;;3332:13;;3325:21;3315:32;;3305:60;;3361:1;3358;3351:12;3305:60;3211:160;;;:::o;3376:689::-;3468:6;3476;3484;3537:2;3525:9;3516:7;3512:23;3508:32;3505:52;;;3553:1;3550;3543:12;3505:52;3593:9;3580:23;3622:18;3663:2;3655:6;3652:14;3649:34;;;3679:1;3676;3669:12;3649:34;3717:6;3706:9;3702:22;3692:32;;3762:7;3755:4;3751:2;3747:13;3743:27;3733:55;;3784:1;3781;3774:12;3733:55;3824:2;3811:16;3850:2;3842:6;3839:14;3836:34;;;3866:1;3863;3856:12;3836:34;3921:7;3914:4;3904:6;3901:1;3897:14;3893:2;3889:23;3885:34;3882:47;3879:67;;;3942:1;3939;3932:12;3879:67;3973:4;3965:13;;;;-1:-1:-1;3997:6:1;-1:-1:-1;4022:37:1;;4038:20;;;-1:-1:-1;4022:37:1;:::i;:::-;4012:47;;3376:689;;;;;:::o;4278:248::-;4346:6;4354;4407:2;4395:9;4386:7;4382:23;4378:32;4375:52;;;4423:1;4420;4413:12;4375:52;-1:-1:-1;;4446:23:1;;;4516:2;4501:18;;;4488:32;;-1:-1:-1;4278:248:1:o;4531:127::-;4592:10;4587:3;4583:20;4580:1;4573:31;4623:4;4620:1;4613:15;4647:4;4644:1;4637:15;4663:275;4734:2;4728:9;4799:2;4780:13;;-1:-1:-1;;4776:27:1;4764:40;;4834:18;4819:34;;4855:22;;;4816:62;4813:88;;;4881:18;;:::i;:::-;4917:2;4910:22;4663:275;;-1:-1:-1;4663:275:1:o;4943:183::-;5003:4;5036:18;5028:6;5025:30;5022:56;;;5058:18;;:::i;:::-;-1:-1:-1;5103:1:1;5099:14;5115:4;5095:25;;4943:183::o;5131:966::-;5215:6;5246:2;5289;5277:9;5268:7;5264:23;5260:32;5257:52;;;5305:1;5302;5295:12;5257:52;5345:9;5332:23;5378:18;5370:6;5367:30;5364:50;;;5410:1;5407;5400:12;5364:50;5433:22;;5486:4;5478:13;;5474:27;-1:-1:-1;5464:55:1;;5515:1;5512;5505:12;5464:55;5551:2;5538:16;5574:60;5590:43;5630:2;5590:43;:::i;:::-;5574:60;:::i;:::-;5668:15;;;5750:1;5746:10;;;;5738:19;;5734:28;;;5699:12;;;;5774:19;;;5771:39;;;5806:1;5803;5796:12;5771:39;5830:11;;;;5850:217;5866:6;5861:3;5858:15;5850:217;;;5946:3;5933:17;5963:31;5988:5;5963:31;:::i;:::-;6007:18;;5883:12;;;;6045;;;;5850:217;;;6086:5;5131:966;-1:-1:-1;;;;;;;5131:966:1:o;6102:180::-;6158:6;6211:2;6199:9;6190:7;6186:23;6182:32;6179:52;;;6227:1;6224;6217:12;6179:52;6250:26;6266:9;6250:26;:::i;6287:388::-;6355:6;6363;6416:2;6404:9;6395:7;6391:23;6387:32;6384:52;;;6432:1;6429;6422:12;6384:52;6471:9;6458:23;6490:31;6515:5;6490:31;:::i;:::-;6540:5;-1:-1:-1;6597:2:1;6582:18;;6569:32;6610:33;6569:32;6610:33;:::i;:::-;6662:7;6652:17;;;6287:388;;;;;:::o;6680:380::-;6759:1;6755:12;;;;6802;;;6823:61;;6877:4;6869:6;6865:17;6855:27;;6823:61;6930:2;6922:6;6919:14;6899:18;6896:38;6893:161;;6976:10;6971:3;6967:20;6964:1;6957:31;7011:4;7008:1;7001:15;7039:4;7036:1;7029:15;6893:161;;6680:380;;;:::o;7065:356::-;7267:2;7249:21;;;7286:18;;;7279:30;7345:34;7340:2;7325:18;;7318:62;7412:2;7397:18;;7065:356::o;7426:127::-;7487:10;7482:3;7478:20;7475:1;7468:31;7518:4;7515:1;7508:15;7542:4;7539:1;7532:15;7558:168;7631:9;;;7662;;7679:15;;;7673:22;;7659:37;7649:71;;7700:18;;:::i;8144:251::-;8214:6;8267:2;8255:9;8246:7;8242:23;8238:32;8235:52;;;8283:1;8280;8273:12;8235:52;8315:9;8309:16;8334:31;8359:5;8334:31;:::i;8400:127::-;8461:10;8456:3;8452:20;8449:1;8442:31;8492:4;8489:1;8482:15;8516:4;8513:1;8506:15;8532:461;8585:3;8623:5;8617:12;8650:6;8645:3;8638:19;8676:4;8705:2;8700:3;8696:12;8689:19;;8742:2;8735:5;8731:14;8763:1;8773:195;8787:6;8784:1;8781:13;8773:195;;;8852:13;;-1:-1:-1;;;;;8848:39:1;8836:52;;8908:12;;;;8943:15;;;;8884:1;8802:9;8773:195;;;-1:-1:-1;8984:3:1;;8532:461;-1:-1:-1;;;;;8532:461:1:o;8998:332::-;9205:6;9194:9;9187:25;9248:2;9243;9232:9;9228:18;9221:30;9168:4;9268:56;9320:2;9309:9;9305:18;9297:6;9268:56;:::i;:::-;9260:64;8998:332;-1:-1:-1;;;;8998:332:1:o;9335:881::-;9430:6;9461:2;9504;9492:9;9483:7;9479:23;9475:32;9472:52;;;9520:1;9517;9510:12;9472:52;9553:9;9547:16;9586:18;9578:6;9575:30;9572:50;;;9618:1;9615;9608:12;9572:50;9641:22;;9694:4;9686:13;;9682:27;-1:-1:-1;9672:55:1;;9723:1;9720;9713:12;9672:55;9752:2;9746:9;9775:60;9791:43;9831:2;9791:43;:::i;9775:60::-;9869:15;;;9951:1;9947:10;;;;9939:19;;9935:28;;;9900:12;;;;9975:19;;;9972:39;;;10007:1;10004;9997:12;9972:39;10031:11;;;;10051:135;10067:6;10062:3;10059:15;10051:135;;;10133:10;;10121:23;;10084:12;;;;10164;;;;10051:135;;13072:401;13274:2;13256:21;;;13313:2;13293:18;;;13286:30;13352:34;13347:2;13332:18;;13325:62;-1:-1:-1;;;13418:2:1;13403:18;;13396:35;13463:3;13448:19;;13072:401::o;13478:128::-;13545:9;;;13566:11;;;13563:37;;;13580:18;;:::i;13611:125::-;13676:9;;;13697:10;;;13694:36;;;13710:18;;:::i;14097:135::-;14136:3;14157:17;;;14154:43;;14177:18;;:::i;:::-;-1:-1:-1;14224:1:1;14213:13;;14097:135::o;14237:306::-;14325:6;14333;14341;14394:2;14382:9;14373:7;14369:23;14365:32;14362:52;;;14410:1;14407;14400:12;14362:52;14439:9;14433:16;14423:26;;14489:2;14478:9;14474:18;14468:25;14458:35;;14533:2;14522:9;14518:18;14512:25;14502:35;;14237:306;;;;;:::o;14944:217::-;14984:1;15010;15000:132;;15054:10;15049:3;15045:20;15042:1;15035:31;15089:4;15086:1;15079:15;15117:4;15114:1;15107:15;15000:132;-1:-1:-1;15146:9:1;;14944:217::o;15568:582::-;15867:6;15856:9;15849:25;15910:6;15905:2;15894:9;15890:18;15883:34;15953:3;15948:2;15937:9;15933:18;15926:31;15830:4;15974:57;16026:3;16015:9;16011:19;16003:6;15974:57;:::i;:::-;-1:-1:-1;;;;;16067:32:1;;;;16062:2;16047:18;;16040:60;-1:-1:-1;16131:3:1;16116:19;16109:35;15966:65;15568:582;-1:-1:-1;;;15568:582:1:o

Swarm Source

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