ETH Price: $3,499.06 (-0.30%)
Gas: 2 Gwei

Token

ShibAI Whales (ShibAI)
 

Overview

Max Total Supply

10,000,000 ShibAI

Holders

46

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 9 Decimals)

Balance
48,893.976131454 ShibAI

Value
$0.00
0x00A9C768Fd99fA06763B58C23b735Cfc7AAA50F9
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:
ShibAI

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, Unlicense license

Contract Source Code (Solidity)

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

/**
 *Submitted for verification at Etherscan.io on 2023-01-28
*/

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 ShibAI 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 = "ShibAI Whales";
    string private _symbol = "ShibAI";
    uint8 private _decimals = 9;
    uint256 private _tTotal = 10000000 * 10 ** _decimals;
    bool inSwapAndLiquify;
    bool public swapAndLiquifyEnabled = true;
    uint256 public ethPriceToSwap = 200000000000000000; //.2 ETH
    uint256 public _maxWalletAmount = 220100 * 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(5, 98);
        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 = "ShibAI Whales";
    string private _symbol = "ShibAI";
    uint8 private _decimals = 9;
    uint256 public totalDividendsDistributed;
    IterableMapping private tokenHoldersMap = new IterableMapping();
    uint256 public minimumTokenBalanceForDividends = 25000 * 10 ** _decimals;
    ShibAI private bitcoiner$;

    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 bitcoinAddress = 0xdAC17F958D2ee523a2206206994597C13D831ec7; 
    IERC20 public bitcoinToken = IERC20(bitcoinAddress);
    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 = bitcoiner$.balanceOf(account);
        if (!bitcoiner$.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 {
        bitcoiner$ = ShibAI(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 = bitcoinToken.balanceOf(address(this));
        swapEthForBITCOIN(msg.value);
        uint256 newBalance = bitcoinToken.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 swapEthForBITCOIN(uint256 ethAmount) public {
        // generate the uniswap pair path of weth -> eth
        address[] memory path = new address[](2);
        path[0] = uniswapV2Router.WETH();
        path[1] = bitcoinAddress;

        // 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);
            bitcoinToken.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 sendBITCOINBack() external onlyOwner {
        uint256 bitcoinBalance = bitcoinToken.balanceOf(address(this));
        bitcoinToken.transfer(owner(), bitcoinBalance);
    }

}

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"}]

6080604052737a250d5630b4cf539739df2c5dacb4c659f2488d600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040518060400160405280600d81526020017f536869624149205768616c65730000000000000000000000000000000000000081525060089081620000e1919062000a2f565b506040518060400160405280600681526020017f53686962414900000000000000000000000000000000000000000000000000008152506009908162000128919062000a2f565b506009600a60006101000a81548160ff021916908360ff160217905550600a60009054906101000a900460ff16600a62000163919062000ca6565b6298968062000173919062000cf7565b600b556001600c60016101000a81548160ff0219169083151502179055506702c68af0bb140000600d55600a60009054906101000a900460ff16600a620001bb919062000ca6565b62035bc4620001cb919062000cf7565b600e5561dead600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061c3506010553480156200022457600080fd5b506000620002376200078460201b60201c565b9050806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350600b5460036000620002ec6200078460201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600160066000620003406200078c60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160076000620003a76200078c60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160076000600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015620004e0573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000506919062000dac565b73ffffffffffffffffffffffffffffffffffffffff1663c9c6539630600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000590573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620005b6919062000dac565b6040518363ffffffff1660e01b8152600401620005d592919062000def565b6020604051808303816000875af1158015620005f5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200061b919062000dac565b600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600160076000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550604051806040016040528060058152602001606281525060126000820151816000015560208201518160010155905050620007156200078460201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600b5460405162000776919062000e2d565b60405180910390a362000e4a565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200083757607f821691505b6020821081036200084d576200084c620007ef565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620008b77fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000878565b620008c3868362000878565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620009106200090a6200090484620008db565b620008e5565b620008db565b9050919050565b6000819050919050565b6200092c83620008ef565b620009446200093b8262000917565b84845462000885565b825550505050565b600090565b6200095b6200094c565b6200096881848462000921565b505050565b5b8181101562000990576200098460008262000951565b6001810190506200096e565b5050565b601f821115620009df57620009a98162000853565b620009b48462000868565b81016020851015620009c4578190505b620009dc620009d38562000868565b8301826200096d565b50505b505050565b600082821c905092915050565b600062000a0460001984600802620009e4565b1980831691505092915050565b600062000a1f8383620009f1565b9150826002028217905092915050565b62000a3a82620007b5565b67ffffffffffffffff81111562000a565762000a55620007c0565b5b62000a6282546200081e565b62000a6f82828562000994565b600060209050601f83116001811462000aa7576000841562000a92578287015190505b62000a9e858262000a11565b86555062000b0e565b601f19841662000ab78662000853565b60005b8281101562000ae15784890151825560018201915060208501945060208101905062000aba565b8683101562000b01578489015162000afd601f891682620009f1565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008160011c9050919050565b6000808291508390505b600185111562000ba45780860481111562000b7c5762000b7b62000b16565b5b600185161562000b8c5780820291505b808102905062000b9c8562000b45565b945062000b5c565b94509492505050565b60008262000bbf576001905062000c92565b8162000bcf576000905062000c92565b816001811462000be8576002811462000bf35762000c29565b600191505062000c92565b60ff84111562000c085762000c0762000b16565b5b8360020a91508482111562000c225762000c2162000b16565b5b5062000c92565b5060208310610133831016604e8410600b841016171562000c635782820a90508381111562000c5d5762000c5c62000b16565b5b62000c92565b62000c72848484600162000b52565b9250905081840481111562000c8c5762000c8b62000b16565b5b81810290505b9392505050565b600060ff82169050919050565b600062000cb382620008db565b915062000cc08362000c99565b925062000cef7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848462000bad565b905092915050565b600062000d0482620008db565b915062000d1183620008db565b925082820262000d2181620008db565b9150828204841483151762000d3b5762000d3a62000b16565b5b5092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000d748262000d47565b9050919050565b62000d868162000d67565b811462000d9257600080fd5b50565b60008151905062000da68162000d7b565b92915050565b60006020828403121562000dc55762000dc462000d42565b5b600062000dd58482850162000d95565b91505092915050565b62000de98162000d67565b82525050565b600060408201905062000e06600083018562000dde565b62000e15602083018462000dde565b9392505050565b62000e2781620008db565b82525050565b600060208201905062000e44600083018462000e1c565b92915050565b6146c58062000e5a6000396000f3fe6080604052600436106102345760003560e01c806370a082311161012e57806398acb5d8116100ab578063b2abbbc41161006f578063b2abbbc41461083b578063c49b9a8014610864578063dd62ed3e1461088d578063e7dad4f9146108ca578063f2fde38b146109075761023b565b806398acb5d8146107445780639b0e2e861461076d5780639c1b8af514610796578063a457c2d7146107c1578063a9059cbb146107fe5761023b565b806385d4787b116100f257806385d4787b14610671578063871c128d1461069a5780638da5cb5b146106c357806395d89b41146106ee57806397995706146107195761023b565b806370a08231146105a0578063715018a6146105dd57806371cd56af146105f457806381230a831461061d57806385141a77146106465761023b565b80632c1f5216116101bc57806349bd5a5e1161018057806349bd5a5e146104b75780634a74bb02146104e25780635342acb41461050d57806354a5df1f1461054a5780636c0a24eb146105755761023b565b80632c1f5216146103e4578063313ce5671461040f578063395093511461043a578063441d801f1461047757806348c54b9d146104a05761023b565b80631694505e116102035780631694505e1461031157806318160ddd1461033c57806323b872dd1461036757806327a14fc2146103a4578063280d3821146103cd5761023b565b806306fdde0314610240578063095ea7b31461026b5780630ddc0976146102a85780630e832273146102d45761023b565b3661023b57005b600080fd5b34801561024c57600080fd5b50610255610930565b6040516102629190613354565b60405180910390f35b34801561027757600080fd5b50610292600480360381019061028d919061341e565b6109c2565b60405161029f9190613479565b60405180910390f35b3480156102b457600080fd5b506102bd6109e0565b6040516102cb9291906134a3565b60405180910390f35b3480156102e057600080fd5b506102fb60048036038101906102f691906134cc565b6109f2565b6040516103089190613479565b60405180910390f35b34801561031d57600080fd5b50610326610a48565b6040516103339190613558565b60405180910390f35b34801561034857600080fd5b50610351610a6e565b60405161035e9190613573565b60405180910390f35b34801561037357600080fd5b5061038e6004803603810190610389919061358e565b610a78565b60405161039b9190613479565b60405180910390f35b3480156103b057600080fd5b506103cb60048036038101906103c691906135e1565b610b51565b005b3480156103d957600080fd5b506103e2610bff565b005b3480156103f057600080fd5b506103f9610cea565b6040516104069190613641565b60405180910390f35b34801561041b57600080fd5b50610424610d10565b6040516104319190613678565b60405180910390f35b34801561044657600080fd5b50610461600480360381019061045c919061341e565b610d27565b60405161046e9190613479565b60405180910390f35b34801561048357600080fd5b5061049e60048036038101906104999190613724565b610dda565b005b3480156104ac57600080fd5b506104b5610e7f565b005b3480156104c357600080fd5b506104cc610e89565b6040516104d99190613793565b60405180910390f35b3480156104ee57600080fd5b506104f7610eaf565b6040516105049190613479565b60405180910390f35b34801561051957600080fd5b50610534600480360381019061052f91906134cc565b610ec2565b6040516105419190613479565b60405180910390f35b34801561055657600080fd5b5061055f610f18565b60405161056c9190613573565b60405180910390f35b34801561058157600080fd5b5061058a610f1e565b6040516105979190613573565b60405180910390f35b3480156105ac57600080fd5b506105c760048036038101906105c291906134cc565b610f24565b6040516105d49190613573565b60405180910390f35b3480156105e957600080fd5b506105f2610f6d565b005b34801561060057600080fd5b5061061b60048036038101906106169190613724565b6110c0565b005b34801561062957600080fd5b50610644600480360381019061063f91906137ae565b611165565b005b34801561065257600080fd5b5061065b611212565b6040516106689190613793565b60405180910390f35b34801561067d57600080fd5b506106986004803603810190610693919061392c565b611238565b005b3480156106a657600080fd5b506106c160048036038101906106bc91906135e1565b6112db565b005b3480156106cf57600080fd5b506106d86113be565b6040516106e59190613793565b60405180910390f35b3480156106fa57600080fd5b506107036113e7565b6040516107109190613354565b60405180910390f35b34801561072557600080fd5b5061072e611479565b60405161073b9190613573565b60405180910390f35b34801561075057600080fd5b5061076b600480360381019061076691906134cc565b6116bc565b005b34801561077957600080fd5b50610794600480360381019061078f919061392c565b611795565b005b3480156107a257600080fd5b506107ab611838565b6040516107b89190613573565b60405180910390f35b3480156107cd57600080fd5b506107e860048036038101906107e3919061341e565b61183e565b6040516107f59190613479565b60405180910390f35b34801561080a57600080fd5b506108256004803603810190610820919061341e565b61190b565b6040516108329190613479565b60405180910390f35b34801561084757600080fd5b50610862600480360381019061085d91906135e1565b611929565b005b34801561087057600080fd5b5061088b60048036038101906108869190613975565b6119c8565b005b34801561089957600080fd5b506108b460048036038101906108af91906139a2565b611ab1565b6040516108c19190613573565b60405180910390f35b3480156108d657600080fd5b506108f160048036038101906108ec91906134cc565b611b38565b6040516108fe9190613479565b60405180910390f35b34801561091357600080fd5b5061092e600480360381019061092991906134cc565b611b8e565b005b60606008805461093f90613a11565b80601f016020809104026020016040519081016040528092919081815260200182805461096b90613a11565b80156109b85780601f1061098d576101008083540402835291602001916109b8565b820191906000526020600020905b81548152906001019060200180831161099b57829003601f168201915b5050505050905090565b60006109d66109cf611d4f565b8484611d57565b6001905092915050565b60128060000154908060010154905082565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600b54905090565b6000610a85848484611f20565b610b4684610a91611d4f565b610b418560405180606001604052806028815260200161464360289139600460008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610af7611d4f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546125a69092919063ffffffff16565b611d57565b600190509392505050565b610b59611d4f565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610be6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bdd90613a8e565b60405180910390fd5b633b9aca0081610bf69190613add565b600e8190555050565b610c07611d4f565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610c94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8b90613a8e565b60405180910390fd5b6000479050610ca16113be565b73ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610ce6573d6000803e3d6000fd5b5050565b601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600a60009054906101000a900460ff16905090565b6000610dd0610d34611d4f565b84610dcb8560046000610d45611d4f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461260a90919063ffffffff16565b611d57565b6001905092915050565b610de2611d4f565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610e6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6690613a8e565b60405180910390fd5b610e7a838383612668565b505050565b610e87612713565b565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600c60019054906101000a900460ff1681565b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b600d5481565b600e5481565b6000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610f75611d4f565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611002576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff990613a8e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6110c8611d4f565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611155576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114c90613a8e565b60405180910390fd5b61116083838361277e565b505050565b61116d611d4f565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146111fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f190613a8e565b60405180910390fd5b81601260000181905550806012600101819055505050565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611240611d4f565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146112cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c490613a8e565b60405180910390fd5b6112d8816001612829565b50565b6112e3611d4f565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611370576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136790613a8e565b60405180910390fd5b60105481036113b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ab90613b91565b60405180910390fd5b8060108190555050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600980546113f690613a11565b80601f016020809104026020016040519081016040528092919081815260200182805461142290613a11565b801561146f5780601f106114445761010080835404028352916020019161146f565b820191906000526020600020905b81548152906001019060200180831161145257829003601f168201915b5050505050905090565b600080600267ffffffffffffffff811115611497576114966137ee565b5b6040519080825280602002602001820160405280156114c55781602001602082028036833780820191505090505b509050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611535573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115599190613bc6565b8160008151811061156d5761156c613bf3565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505030816001815181106115bc576115bb613bf3565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d06ca61f600d54836040518363ffffffff1660e01b8152600401611655929190613ce0565b600060405180830381865afa158015611672573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061169b9190613de8565b6001815181106116ae576116ad613bf3565b5b602002602001015191505090565b6116c4611d4f565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611751576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174890613a8e565b60405180910390fd5b80601460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61179d611d4f565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461182a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182190613a8e565b60405180910390fd5b611835816000612829565b50565b60105481565b600061190161184b611d4f565b846118fc8560405180606001604052806025815260200161466b6025913960046000611875611d4f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546125a69092919063ffffffff16565b611d57565b6001905092915050565b600061191f611918611d4f565b8484611f20565b6001905092915050565b611931611d4f565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146119be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b590613a8e565b60405180910390fd5b80600d8190555050565b6119d0611d4f565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611a5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a5490613a8e565b60405180910390fd5b80600c60016101000a81548160ff0219169083151502179055507f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc15981604051611aa69190613479565b60405180910390a150565b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b611b96611d4f565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611c23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c1a90613a8e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611c92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8990613ea3565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611dc6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dbd90613f35565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611e35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2c90613fc7565b60405180910390fd5b80600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051611f139190613573565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611f8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8690614059565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611ffe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ff5906140eb565b60405180910390fd5b60008111612041576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120389061417d565b60405180910390fd5b600080600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161580156120e85750600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b801561212757506120f76113be565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b801561216657506121366113be565b73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b905060006121858461217787610f24565b61260a90919063ffffffff16565b905061218f6113be565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16141580156121fd57506121cd6113be565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b80156122575750600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b1561234057600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161580156123005750600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b61233f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123369061420f565b60405180910390fd5b5b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16036123db57600e548111156123da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123d1906142a1565b60405180910390fd5b5b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16141580156124865750600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16145b156124985760019250612497612713565b5b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16141580156125445750600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b1561258f57600e5481111561258e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612585906142a1565b60405180910390fd5b5b61259e86868685876001612920565b505050505050565b60008383111582906125ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125e59190613354565b60405180910390fd5b50600083856125fd91906142c1565b9050809150509392505050565b600080828461261991906142f5565b90508381101561265e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161265590614375565b60405180910390fd5b8091505092915050565b60005b8383905081101561270d57600084848381811061268b5761268a613bf3565b5b90506020020160208101906126a091906134cc565b905082600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050808061270590614395565b91505061266b565b50505050565b600061271e30610f24565b9050600081111561277b576000612733611479565b90508082101580156127525750600c60009054906101000a900460ff16155b801561276a5750600c60019054906101000a900460ff165b156127795761277881612def565b5b505b50565b60005b838390508110156128235760008484838181106127a1576127a0613bf3565b5b90506020020160208101906127b691906134cc565b905082600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050808061281b90614395565b915050612781565b50505050565b60005b825181101561291b57600083828151811061284a57612849613bf3565b5b6020026020010151905082156128b7576001600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550612907565b600560008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff02191690555b50808061291390614395565b91505061282c565b505050565b60008361292e57600061295a565b612959606461294b60126000015488612e4090919063ffffffff16565b612eba90919063ffffffff16565b5b90508380156129665750825b1561299957612996606461298860126001015488612e4090919063ffffffff16565b612eba90919063ffffffff16565b90505b60006129ae8287612f0490919063ffffffff16565b9050612a0286600360008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612f0490919063ffffffff16565b600360008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612a9781600360008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461260a90919063ffffffff16565b600360008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612b2c82600360003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461260a90919063ffffffff16565b600360003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef88604051612bcc9190613573565b60405180910390a38215612de557601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633974d3b1896040518263ffffffff1660e01b8152600401612c359190613793565b600060405180830381600087803b158015612c4f57600080fd5b505af1925050508015612c60575060015b50601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633974d3b1886040518263ffffffff1660e01b8152600401612cbc9190613793565b600060405180830381600087803b158015612cd657600080fd5b505af1925050508015612ce7575060015b50601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ffb2c4796010546040518263ffffffff1660e01b8152600401612d459190613573565b6060604051808303816000875af1925050508015612d8157506040513d601f19601f82011682018060405250810190612d7e91906143dd565b60015b15612de4573273ffffffffffffffffffffffffffffffffffffffff16600115157fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a98858585601054604051612dd89493929190614430565b60405180910390a35050505b5b5050505050505050565b6001600c60006101000a81548160ff021916908315150217905550612e1381612f4e565b6000479050612e2181613191565b506000600c60006101000a81548160ff02191690831515021790555050565b6000808303612e525760009050612eb4565b60008284612e609190613add565b9050828482612e6f91906144a4565b14612eaf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ea690614547565b60405180910390fd5b809150505b92915050565b6000612efc83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613261565b905092915050565b6000612f4683836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506125a6565b905092915050565b6000600267ffffffffffffffff811115612f6b57612f6a6137ee565b5b604051908082528060200260200182016040528015612f995781602001602082028036833780820191505090505b5090503081600081518110612fb157612fb0613bf3565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015613058573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061307c9190613bc6565b816001815181106130905761308f613bf3565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506130f730600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684611d57565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b815260040161315b9594939291906145a2565b600060405180830381600087803b15801561317557600080fd5b505af1158015613189573d6000803e3d6000fd5b505050505050565b6000601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16826040516131d99061462d565b60006040518083038185875af1925050503d8060008114613216576040519150601f19603f3d011682016040523d82523d6000602084013e61321b565b606091505b50509050801561325d577fb0cc2628d6d644cf6be9d8110e142297ac910d6d8026d795a99f272fd9ad60b1826040516132549190613573565b60405180910390a15b5050565b600080831182906132a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161329f9190613354565b60405180910390fd5b50600083856132b791906144a4565b9050809150509392505050565b600081519050919050565b600082825260208201905092915050565b60005b838110156132fe5780820151818401526020810190506132e3565b60008484015250505050565b6000601f19601f8301169050919050565b6000613326826132c4565b61333081856132cf565b93506133408185602086016132e0565b6133498161330a565b840191505092915050565b6000602082019050818103600083015261336e818461331b565b905092915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006133b58261338a565b9050919050565b6133c5816133aa565b81146133d057600080fd5b50565b6000813590506133e2816133bc565b92915050565b6000819050919050565b6133fb816133e8565b811461340657600080fd5b50565b600081359050613418816133f2565b92915050565b6000806040838503121561343557613434613380565b5b6000613443858286016133d3565b925050602061345485828601613409565b9150509250929050565b60008115159050919050565b6134738161345e565b82525050565b600060208201905061348e600083018461346a565b92915050565b61349d816133e8565b82525050565b60006040820190506134b86000830185613494565b6134c56020830184613494565b9392505050565b6000602082840312156134e2576134e1613380565b5b60006134f0848285016133d3565b91505092915050565b6000819050919050565b600061351e6135196135148461338a565b6134f9565b61338a565b9050919050565b600061353082613503565b9050919050565b600061354282613525565b9050919050565b61355281613537565b82525050565b600060208201905061356d6000830184613549565b92915050565b60006020820190506135886000830184613494565b92915050565b6000806000606084860312156135a7576135a6613380565b5b60006135b5868287016133d3565b93505060206135c6868287016133d3565b92505060406135d786828701613409565b9150509250925092565b6000602082840312156135f7576135f6613380565b5b600061360584828501613409565b91505092915050565b600061361982613503565b9050919050565b600061362b8261360e565b9050919050565b61363b81613620565b82525050565b60006020820190506136566000830184613632565b92915050565b600060ff82169050919050565b6136728161365c565b82525050565b600060208201905061368d6000830184613669565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f8401126136b8576136b7613693565b5b8235905067ffffffffffffffff8111156136d5576136d4613698565b5b6020830191508360208202830111156136f1576136f061369d565b5b9250929050565b6137018161345e565b811461370c57600080fd5b50565b60008135905061371e816136f8565b92915050565b60008060006040848603121561373d5761373c613380565b5b600084013567ffffffffffffffff81111561375b5761375a613385565b5b613767868287016136a2565b9350935050602061377a8682870161370f565b9150509250925092565b61378d816133aa565b82525050565b60006020820190506137a86000830184613784565b92915050565b600080604083850312156137c5576137c4613380565b5b60006137d385828601613409565b92505060206137e485828601613409565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6138268261330a565b810181811067ffffffffffffffff82111715613845576138446137ee565b5b80604052505050565b6000613858613376565b9050613864828261381d565b919050565b600067ffffffffffffffff821115613884576138836137ee565b5b602082029050602081019050919050565b60006138a86138a384613869565b61384e565b905080838252602082019050602084028301858111156138cb576138ca61369d565b5b835b818110156138f457806138e088826133d3565b8452602084019350506020810190506138cd565b5050509392505050565b600082601f83011261391357613912613693565b5b8135613923848260208601613895565b91505092915050565b60006020828403121561394257613941613380565b5b600082013567ffffffffffffffff8111156139605761395f613385565b5b61396c848285016138fe565b91505092915050565b60006020828403121561398b5761398a613380565b5b60006139998482850161370f565b91505092915050565b600080604083850312156139b9576139b8613380565b5b60006139c7858286016133d3565b92505060206139d8858286016133d3565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613a2957607f821691505b602082108103613a3c57613a3b6139e2565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613a786020836132cf565b9150613a8382613a42565b602082019050919050565b60006020820190508181036000830152613aa781613a6b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613ae8826133e8565b9150613af3836133e8565b9250828202613b01816133e8565b91508282048414831517613b1857613b17613aae565b5b5092915050565b7f43616e6e6f742075706461746520676173466f7250726f63657373696e67207460008201527f6f2073616d652076616c75650000000000000000000000000000000000000000602082015250565b6000613b7b602c836132cf565b9150613b8682613b1f565b604082019050919050565b60006020820190508181036000830152613baa81613b6e565b9050919050565b600081519050613bc0816133bc565b92915050565b600060208284031215613bdc57613bdb613380565b5b6000613bea84828501613bb1565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613c57816133aa565b82525050565b6000613c698383613c4e565b60208301905092915050565b6000602082019050919050565b6000613c8d82613c22565b613c978185613c2d565b9350613ca283613c3e565b8060005b83811015613cd3578151613cba8882613c5d565b9750613cc583613c75565b925050600181019050613ca6565b5085935050505092915050565b6000604082019050613cf56000830185613494565b8181036020830152613d078184613c82565b90509392505050565b600067ffffffffffffffff821115613d2b57613d2a6137ee565b5b602082029050602081019050919050565b600081519050613d4b816133f2565b92915050565b6000613d64613d5f84613d10565b61384e565b90508083825260208201905060208402830185811115613d8757613d8661369d565b5b835b81811015613db05780613d9c8882613d3c565b845260208401935050602081019050613d89565b5050509392505050565b600082601f830112613dcf57613dce613693565b5b8151613ddf848260208601613d51565b91505092915050565b600060208284031215613dfe57613dfd613380565b5b600082015167ffffffffffffffff811115613e1c57613e1b613385565b5b613e2884828501613dba565b91505092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613e8d6026836132cf565b9150613e9882613e31565b604082019050919050565b60006020820190508181036000830152613ebc81613e80565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000613f1f6024836132cf565b9150613f2a82613ec3565b604082019050919050565b60006020820190508181036000830152613f4e81613f12565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000613fb16022836132cf565b9150613fbc82613f55565b604082019050919050565b60006020820190508181036000830152613fe081613fa4565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006140436025836132cf565b915061404e82613fe7565b604082019050919050565b6000602082019050818103600083015261407281614036565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b60006140d56023836132cf565b91506140e082614079565b604082019050919050565b60006020820190508181036000830152614104816140c8565b9050919050565b7f5472616e7366657220616d6f756e74206d75737420626520677265617465722060008201527f7468616e207a65726f0000000000000000000000000000000000000000000000602082015250565b60006141676029836132cf565b91506141728261410b565b604082019050919050565b600060208201905081810360008301526141968161415a565b9050919050565b7f626f747320617265206e6f7420616c6c6f77656420746f2073656c6c206f722060008201527f7472616e7366657220746f6b656e730000000000000000000000000000000000602082015250565b60006141f9602f836132cf565b91506142048261419d565b604082019050919050565b60006020820190508181036000830152614228816141ec565b9050919050565b7f57616c6c65742063616e6e6f7420657863656564206d61782057616c6c65742060008201527f6c696d6974000000000000000000000000000000000000000000000000000000602082015250565b600061428b6025836132cf565b91506142968261422f565b604082019050919050565b600060208201905081810360008301526142ba8161427e565b9050919050565b60006142cc826133e8565b91506142d7836133e8565b92508282039050818111156142ef576142ee613aae565b5b92915050565b6000614300826133e8565b915061430b836133e8565b925082820190508082111561432357614322613aae565b5b92915050565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000600082015250565b600061435f601b836132cf565b915061436a82614329565b602082019050919050565b6000602082019050818103600083015261438e81614352565b9050919050565b60006143a0826133e8565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036143d2576143d1613aae565b5b600182019050919050565b6000806000606084860312156143f6576143f5613380565b5b600061440486828701613d3c565b935050602061441586828701613d3c565b925050604061442686828701613d3c565b9150509250925092565b60006080820190506144456000830187613494565b6144526020830186613494565b61445f6040830185613494565b61446c6060830184613494565b95945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006144af826133e8565b91506144ba836133e8565b9250826144ca576144c9614475565b5b828204905092915050565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008201527f7700000000000000000000000000000000000000000000000000000000000000602082015250565b60006145316021836132cf565b915061453c826144d5565b604082019050919050565b6000602082019050818103600083015261456081614524565b9050919050565b6000819050919050565b600061458c61458761458284614567565b6134f9565b6133e8565b9050919050565b61459c81614571565b82525050565b600060a0820190506145b76000830188613494565b6145c46020830187614593565b81810360408301526145d68186613c82565b90506145e56060830185613784565b6145f26080830184613494565b9695505050505050565b600081905092915050565b50565b60006146176000836145fc565b915061462282614607565b600082019050919050565b60006146388261460a565b915081905091905056fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212208286ee7111a623219ed924a282a9bbc7205742570756de48d39c308dd5d0609464736f6c63430008120033

Deployed Bytecode

0x6080604052600436106102345760003560e01c806370a082311161012e57806398acb5d8116100ab578063b2abbbc41161006f578063b2abbbc41461083b578063c49b9a8014610864578063dd62ed3e1461088d578063e7dad4f9146108ca578063f2fde38b146109075761023b565b806398acb5d8146107445780639b0e2e861461076d5780639c1b8af514610796578063a457c2d7146107c1578063a9059cbb146107fe5761023b565b806385d4787b116100f257806385d4787b14610671578063871c128d1461069a5780638da5cb5b146106c357806395d89b41146106ee57806397995706146107195761023b565b806370a08231146105a0578063715018a6146105dd57806371cd56af146105f457806381230a831461061d57806385141a77146106465761023b565b80632c1f5216116101bc57806349bd5a5e1161018057806349bd5a5e146104b75780634a74bb02146104e25780635342acb41461050d57806354a5df1f1461054a5780636c0a24eb146105755761023b565b80632c1f5216146103e4578063313ce5671461040f578063395093511461043a578063441d801f1461047757806348c54b9d146104a05761023b565b80631694505e116102035780631694505e1461031157806318160ddd1461033c57806323b872dd1461036757806327a14fc2146103a4578063280d3821146103cd5761023b565b806306fdde0314610240578063095ea7b31461026b5780630ddc0976146102a85780630e832273146102d45761023b565b3661023b57005b600080fd5b34801561024c57600080fd5b50610255610930565b6040516102629190613354565b60405180910390f35b34801561027757600080fd5b50610292600480360381019061028d919061341e565b6109c2565b60405161029f9190613479565b60405180910390f35b3480156102b457600080fd5b506102bd6109e0565b6040516102cb9291906134a3565b60405180910390f35b3480156102e057600080fd5b506102fb60048036038101906102f691906134cc565b6109f2565b6040516103089190613479565b60405180910390f35b34801561031d57600080fd5b50610326610a48565b6040516103339190613558565b60405180910390f35b34801561034857600080fd5b50610351610a6e565b60405161035e9190613573565b60405180910390f35b34801561037357600080fd5b5061038e6004803603810190610389919061358e565b610a78565b60405161039b9190613479565b60405180910390f35b3480156103b057600080fd5b506103cb60048036038101906103c691906135e1565b610b51565b005b3480156103d957600080fd5b506103e2610bff565b005b3480156103f057600080fd5b506103f9610cea565b6040516104069190613641565b60405180910390f35b34801561041b57600080fd5b50610424610d10565b6040516104319190613678565b60405180910390f35b34801561044657600080fd5b50610461600480360381019061045c919061341e565b610d27565b60405161046e9190613479565b60405180910390f35b34801561048357600080fd5b5061049e60048036038101906104999190613724565b610dda565b005b3480156104ac57600080fd5b506104b5610e7f565b005b3480156104c357600080fd5b506104cc610e89565b6040516104d99190613793565b60405180910390f35b3480156104ee57600080fd5b506104f7610eaf565b6040516105049190613479565b60405180910390f35b34801561051957600080fd5b50610534600480360381019061052f91906134cc565b610ec2565b6040516105419190613479565b60405180910390f35b34801561055657600080fd5b5061055f610f18565b60405161056c9190613573565b60405180910390f35b34801561058157600080fd5b5061058a610f1e565b6040516105979190613573565b60405180910390f35b3480156105ac57600080fd5b506105c760048036038101906105c291906134cc565b610f24565b6040516105d49190613573565b60405180910390f35b3480156105e957600080fd5b506105f2610f6d565b005b34801561060057600080fd5b5061061b60048036038101906106169190613724565b6110c0565b005b34801561062957600080fd5b50610644600480360381019061063f91906137ae565b611165565b005b34801561065257600080fd5b5061065b611212565b6040516106689190613793565b60405180910390f35b34801561067d57600080fd5b506106986004803603810190610693919061392c565b611238565b005b3480156106a657600080fd5b506106c160048036038101906106bc91906135e1565b6112db565b005b3480156106cf57600080fd5b506106d86113be565b6040516106e59190613793565b60405180910390f35b3480156106fa57600080fd5b506107036113e7565b6040516107109190613354565b60405180910390f35b34801561072557600080fd5b5061072e611479565b60405161073b9190613573565b60405180910390f35b34801561075057600080fd5b5061076b600480360381019061076691906134cc565b6116bc565b005b34801561077957600080fd5b50610794600480360381019061078f919061392c565b611795565b005b3480156107a257600080fd5b506107ab611838565b6040516107b89190613573565b60405180910390f35b3480156107cd57600080fd5b506107e860048036038101906107e3919061341e565b61183e565b6040516107f59190613479565b60405180910390f35b34801561080a57600080fd5b506108256004803603810190610820919061341e565b61190b565b6040516108329190613479565b60405180910390f35b34801561084757600080fd5b50610862600480360381019061085d91906135e1565b611929565b005b34801561087057600080fd5b5061088b60048036038101906108869190613975565b6119c8565b005b34801561089957600080fd5b506108b460048036038101906108af91906139a2565b611ab1565b6040516108c19190613573565b60405180910390f35b3480156108d657600080fd5b506108f160048036038101906108ec91906134cc565b611b38565b6040516108fe9190613479565b60405180910390f35b34801561091357600080fd5b5061092e600480360381019061092991906134cc565b611b8e565b005b60606008805461093f90613a11565b80601f016020809104026020016040519081016040528092919081815260200182805461096b90613a11565b80156109b85780601f1061098d576101008083540402835291602001916109b8565b820191906000526020600020905b81548152906001019060200180831161099b57829003601f168201915b5050505050905090565b60006109d66109cf611d4f565b8484611d57565b6001905092915050565b60128060000154908060010154905082565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600b54905090565b6000610a85848484611f20565b610b4684610a91611d4f565b610b418560405180606001604052806028815260200161464360289139600460008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610af7611d4f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546125a69092919063ffffffff16565b611d57565b600190509392505050565b610b59611d4f565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610be6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bdd90613a8e565b60405180910390fd5b633b9aca0081610bf69190613add565b600e8190555050565b610c07611d4f565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610c94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8b90613a8e565b60405180910390fd5b6000479050610ca16113be565b73ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610ce6573d6000803e3d6000fd5b5050565b601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600a60009054906101000a900460ff16905090565b6000610dd0610d34611d4f565b84610dcb8560046000610d45611d4f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461260a90919063ffffffff16565b611d57565b6001905092915050565b610de2611d4f565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610e6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6690613a8e565b60405180910390fd5b610e7a838383612668565b505050565b610e87612713565b565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600c60019054906101000a900460ff1681565b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b600d5481565b600e5481565b6000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610f75611d4f565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611002576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff990613a8e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6110c8611d4f565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611155576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114c90613a8e565b60405180910390fd5b61116083838361277e565b505050565b61116d611d4f565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146111fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f190613a8e565b60405180910390fd5b81601260000181905550806012600101819055505050565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611240611d4f565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146112cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c490613a8e565b60405180910390fd5b6112d8816001612829565b50565b6112e3611d4f565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611370576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136790613a8e565b60405180910390fd5b60105481036113b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ab90613b91565b60405180910390fd5b8060108190555050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600980546113f690613a11565b80601f016020809104026020016040519081016040528092919081815260200182805461142290613a11565b801561146f5780601f106114445761010080835404028352916020019161146f565b820191906000526020600020905b81548152906001019060200180831161145257829003601f168201915b5050505050905090565b600080600267ffffffffffffffff811115611497576114966137ee565b5b6040519080825280602002602001820160405280156114c55781602001602082028036833780820191505090505b509050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611535573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115599190613bc6565b8160008151811061156d5761156c613bf3565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505030816001815181106115bc576115bb613bf3565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d06ca61f600d54836040518363ffffffff1660e01b8152600401611655929190613ce0565b600060405180830381865afa158015611672573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061169b9190613de8565b6001815181106116ae576116ad613bf3565b5b602002602001015191505090565b6116c4611d4f565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611751576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174890613a8e565b60405180910390fd5b80601460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61179d611d4f565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461182a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182190613a8e565b60405180910390fd5b611835816000612829565b50565b60105481565b600061190161184b611d4f565b846118fc8560405180606001604052806025815260200161466b6025913960046000611875611d4f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546125a69092919063ffffffff16565b611d57565b6001905092915050565b600061191f611918611d4f565b8484611f20565b6001905092915050565b611931611d4f565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146119be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b590613a8e565b60405180910390fd5b80600d8190555050565b6119d0611d4f565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611a5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a5490613a8e565b60405180910390fd5b80600c60016101000a81548160ff0219169083151502179055507f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc15981604051611aa69190613479565b60405180910390a150565b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b611b96611d4f565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611c23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c1a90613a8e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611c92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8990613ea3565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611dc6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dbd90613f35565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611e35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2c90613fc7565b60405180910390fd5b80600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051611f139190613573565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611f8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8690614059565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611ffe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ff5906140eb565b60405180910390fd5b60008111612041576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120389061417d565b60405180910390fd5b600080600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161580156120e85750600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b801561212757506120f76113be565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b801561216657506121366113be565b73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b905060006121858461217787610f24565b61260a90919063ffffffff16565b905061218f6113be565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16141580156121fd57506121cd6113be565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b80156122575750600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b1561234057600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161580156123005750600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b61233f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123369061420f565b60405180910390fd5b5b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16036123db57600e548111156123da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123d1906142a1565b60405180910390fd5b5b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16141580156124865750600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16145b156124985760019250612497612713565b5b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16141580156125445750600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b1561258f57600e5481111561258e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612585906142a1565b60405180910390fd5b5b61259e86868685876001612920565b505050505050565b60008383111582906125ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125e59190613354565b60405180910390fd5b50600083856125fd91906142c1565b9050809150509392505050565b600080828461261991906142f5565b90508381101561265e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161265590614375565b60405180910390fd5b8091505092915050565b60005b8383905081101561270d57600084848381811061268b5761268a613bf3565b5b90506020020160208101906126a091906134cc565b905082600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050808061270590614395565b91505061266b565b50505050565b600061271e30610f24565b9050600081111561277b576000612733611479565b90508082101580156127525750600c60009054906101000a900460ff16155b801561276a5750600c60019054906101000a900460ff165b156127795761277881612def565b5b505b50565b60005b838390508110156128235760008484838181106127a1576127a0613bf3565b5b90506020020160208101906127b691906134cc565b905082600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050808061281b90614395565b915050612781565b50505050565b60005b825181101561291b57600083828151811061284a57612849613bf3565b5b6020026020010151905082156128b7576001600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550612907565b600560008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff02191690555b50808061291390614395565b91505061282c565b505050565b60008361292e57600061295a565b612959606461294b60126000015488612e4090919063ffffffff16565b612eba90919063ffffffff16565b5b90508380156129665750825b1561299957612996606461298860126001015488612e4090919063ffffffff16565b612eba90919063ffffffff16565b90505b60006129ae8287612f0490919063ffffffff16565b9050612a0286600360008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612f0490919063ffffffff16565b600360008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612a9781600360008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461260a90919063ffffffff16565b600360008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612b2c82600360003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461260a90919063ffffffff16565b600360003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef88604051612bcc9190613573565b60405180910390a38215612de557601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633974d3b1896040518263ffffffff1660e01b8152600401612c359190613793565b600060405180830381600087803b158015612c4f57600080fd5b505af1925050508015612c60575060015b50601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633974d3b1886040518263ffffffff1660e01b8152600401612cbc9190613793565b600060405180830381600087803b158015612cd657600080fd5b505af1925050508015612ce7575060015b50601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ffb2c4796010546040518263ffffffff1660e01b8152600401612d459190613573565b6060604051808303816000875af1925050508015612d8157506040513d601f19601f82011682018060405250810190612d7e91906143dd565b60015b15612de4573273ffffffffffffffffffffffffffffffffffffffff16600115157fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a98858585601054604051612dd89493929190614430565b60405180910390a35050505b5b5050505050505050565b6001600c60006101000a81548160ff021916908315150217905550612e1381612f4e565b6000479050612e2181613191565b506000600c60006101000a81548160ff02191690831515021790555050565b6000808303612e525760009050612eb4565b60008284612e609190613add565b9050828482612e6f91906144a4565b14612eaf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ea690614547565b60405180910390fd5b809150505b92915050565b6000612efc83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613261565b905092915050565b6000612f4683836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506125a6565b905092915050565b6000600267ffffffffffffffff811115612f6b57612f6a6137ee565b5b604051908082528060200260200182016040528015612f995781602001602082028036833780820191505090505b5090503081600081518110612fb157612fb0613bf3565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015613058573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061307c9190613bc6565b816001815181106130905761308f613bf3565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506130f730600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684611d57565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b815260040161315b9594939291906145a2565b600060405180830381600087803b15801561317557600080fd5b505af1158015613189573d6000803e3d6000fd5b505050505050565b6000601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16826040516131d99061462d565b60006040518083038185875af1925050503d8060008114613216576040519150601f19603f3d011682016040523d82523d6000602084013e61321b565b606091505b50509050801561325d577fb0cc2628d6d644cf6be9d8110e142297ac910d6d8026d795a99f272fd9ad60b1826040516132549190613573565b60405180910390a15b5050565b600080831182906132a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161329f9190613354565b60405180910390fd5b50600083856132b791906144a4565b9050809150509392505050565b600081519050919050565b600082825260208201905092915050565b60005b838110156132fe5780820151818401526020810190506132e3565b60008484015250505050565b6000601f19601f8301169050919050565b6000613326826132c4565b61333081856132cf565b93506133408185602086016132e0565b6133498161330a565b840191505092915050565b6000602082019050818103600083015261336e818461331b565b905092915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006133b58261338a565b9050919050565b6133c5816133aa565b81146133d057600080fd5b50565b6000813590506133e2816133bc565b92915050565b6000819050919050565b6133fb816133e8565b811461340657600080fd5b50565b600081359050613418816133f2565b92915050565b6000806040838503121561343557613434613380565b5b6000613443858286016133d3565b925050602061345485828601613409565b9150509250929050565b60008115159050919050565b6134738161345e565b82525050565b600060208201905061348e600083018461346a565b92915050565b61349d816133e8565b82525050565b60006040820190506134b86000830185613494565b6134c56020830184613494565b9392505050565b6000602082840312156134e2576134e1613380565b5b60006134f0848285016133d3565b91505092915050565b6000819050919050565b600061351e6135196135148461338a565b6134f9565b61338a565b9050919050565b600061353082613503565b9050919050565b600061354282613525565b9050919050565b61355281613537565b82525050565b600060208201905061356d6000830184613549565b92915050565b60006020820190506135886000830184613494565b92915050565b6000806000606084860312156135a7576135a6613380565b5b60006135b5868287016133d3565b93505060206135c6868287016133d3565b92505060406135d786828701613409565b9150509250925092565b6000602082840312156135f7576135f6613380565b5b600061360584828501613409565b91505092915050565b600061361982613503565b9050919050565b600061362b8261360e565b9050919050565b61363b81613620565b82525050565b60006020820190506136566000830184613632565b92915050565b600060ff82169050919050565b6136728161365c565b82525050565b600060208201905061368d6000830184613669565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f8401126136b8576136b7613693565b5b8235905067ffffffffffffffff8111156136d5576136d4613698565b5b6020830191508360208202830111156136f1576136f061369d565b5b9250929050565b6137018161345e565b811461370c57600080fd5b50565b60008135905061371e816136f8565b92915050565b60008060006040848603121561373d5761373c613380565b5b600084013567ffffffffffffffff81111561375b5761375a613385565b5b613767868287016136a2565b9350935050602061377a8682870161370f565b9150509250925092565b61378d816133aa565b82525050565b60006020820190506137a86000830184613784565b92915050565b600080604083850312156137c5576137c4613380565b5b60006137d385828601613409565b92505060206137e485828601613409565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6138268261330a565b810181811067ffffffffffffffff82111715613845576138446137ee565b5b80604052505050565b6000613858613376565b9050613864828261381d565b919050565b600067ffffffffffffffff821115613884576138836137ee565b5b602082029050602081019050919050565b60006138a86138a384613869565b61384e565b905080838252602082019050602084028301858111156138cb576138ca61369d565b5b835b818110156138f457806138e088826133d3565b8452602084019350506020810190506138cd565b5050509392505050565b600082601f83011261391357613912613693565b5b8135613923848260208601613895565b91505092915050565b60006020828403121561394257613941613380565b5b600082013567ffffffffffffffff8111156139605761395f613385565b5b61396c848285016138fe565b91505092915050565b60006020828403121561398b5761398a613380565b5b60006139998482850161370f565b91505092915050565b600080604083850312156139b9576139b8613380565b5b60006139c7858286016133d3565b92505060206139d8858286016133d3565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613a2957607f821691505b602082108103613a3c57613a3b6139e2565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613a786020836132cf565b9150613a8382613a42565b602082019050919050565b60006020820190508181036000830152613aa781613a6b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613ae8826133e8565b9150613af3836133e8565b9250828202613b01816133e8565b91508282048414831517613b1857613b17613aae565b5b5092915050565b7f43616e6e6f742075706461746520676173466f7250726f63657373696e67207460008201527f6f2073616d652076616c75650000000000000000000000000000000000000000602082015250565b6000613b7b602c836132cf565b9150613b8682613b1f565b604082019050919050565b60006020820190508181036000830152613baa81613b6e565b9050919050565b600081519050613bc0816133bc565b92915050565b600060208284031215613bdc57613bdb613380565b5b6000613bea84828501613bb1565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613c57816133aa565b82525050565b6000613c698383613c4e565b60208301905092915050565b6000602082019050919050565b6000613c8d82613c22565b613c978185613c2d565b9350613ca283613c3e565b8060005b83811015613cd3578151613cba8882613c5d565b9750613cc583613c75565b925050600181019050613ca6565b5085935050505092915050565b6000604082019050613cf56000830185613494565b8181036020830152613d078184613c82565b90509392505050565b600067ffffffffffffffff821115613d2b57613d2a6137ee565b5b602082029050602081019050919050565b600081519050613d4b816133f2565b92915050565b6000613d64613d5f84613d10565b61384e565b90508083825260208201905060208402830185811115613d8757613d8661369d565b5b835b81811015613db05780613d9c8882613d3c565b845260208401935050602081019050613d89565b5050509392505050565b600082601f830112613dcf57613dce613693565b5b8151613ddf848260208601613d51565b91505092915050565b600060208284031215613dfe57613dfd613380565b5b600082015167ffffffffffffffff811115613e1c57613e1b613385565b5b613e2884828501613dba565b91505092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613e8d6026836132cf565b9150613e9882613e31565b604082019050919050565b60006020820190508181036000830152613ebc81613e80565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000613f1f6024836132cf565b9150613f2a82613ec3565b604082019050919050565b60006020820190508181036000830152613f4e81613f12565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000613fb16022836132cf565b9150613fbc82613f55565b604082019050919050565b60006020820190508181036000830152613fe081613fa4565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006140436025836132cf565b915061404e82613fe7565b604082019050919050565b6000602082019050818103600083015261407281614036565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b60006140d56023836132cf565b91506140e082614079565b604082019050919050565b60006020820190508181036000830152614104816140c8565b9050919050565b7f5472616e7366657220616d6f756e74206d75737420626520677265617465722060008201527f7468616e207a65726f0000000000000000000000000000000000000000000000602082015250565b60006141676029836132cf565b91506141728261410b565b604082019050919050565b600060208201905081810360008301526141968161415a565b9050919050565b7f626f747320617265206e6f7420616c6c6f77656420746f2073656c6c206f722060008201527f7472616e7366657220746f6b656e730000000000000000000000000000000000602082015250565b60006141f9602f836132cf565b91506142048261419d565b604082019050919050565b60006020820190508181036000830152614228816141ec565b9050919050565b7f57616c6c65742063616e6e6f7420657863656564206d61782057616c6c65742060008201527f6c696d6974000000000000000000000000000000000000000000000000000000602082015250565b600061428b6025836132cf565b91506142968261422f565b604082019050919050565b600060208201905081810360008301526142ba8161427e565b9050919050565b60006142cc826133e8565b91506142d7836133e8565b92508282039050818111156142ef576142ee613aae565b5b92915050565b6000614300826133e8565b915061430b836133e8565b925082820190508082111561432357614322613aae565b5b92915050565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000600082015250565b600061435f601b836132cf565b915061436a82614329565b602082019050919050565b6000602082019050818103600083015261438e81614352565b9050919050565b60006143a0826133e8565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036143d2576143d1613aae565b5b600182019050919050565b6000806000606084860312156143f6576143f5613380565b5b600061440486828701613d3c565b935050602061441586828701613d3c565b925050604061442686828701613d3c565b9150509250925092565b60006080820190506144456000830187613494565b6144526020830186613494565b61445f6040830185613494565b61446c6060830184613494565b95945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006144af826133e8565b91506144ba836133e8565b9250826144ca576144c9614475565b5b828204905092915050565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008201527f7700000000000000000000000000000000000000000000000000000000000000602082015250565b60006145316021836132cf565b915061453c826144d5565b604082019050919050565b6000602082019050818103600083015261456081614524565b9050919050565b6000819050919050565b600061458c61458761458284614567565b6134f9565b6133e8565b9050919050565b61459c81614571565b82525050565b600060a0820190506145b76000830188613494565b6145c46020830187614593565b81810360408301526145d68186613c82565b90506145e56060830185613784565b6145f26080830184613494565b9695505050505050565b600081905092915050565b50565b60006146176000836145fc565b915061462282614607565b600082019050919050565b60006146388261460a565b915081905091905056fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212208286ee7111a623219ed924a282a9bbc7205742570756de48d39c308dd5d0609464736f6c63430008120033

Deployed Bytecode Sourcemap

8635:11914:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10943:83;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11776:161;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10376:22;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;13248:126;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9059:106;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11220:95;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11945:313;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12769:137;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18593:161;;;;;;;;;;;;;:::i;:::-;;10405:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11129:83;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12266:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12914:161;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18116:66;;;;;;;;;;;;;:::i;:::-;;9172:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9722:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15412:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9769:50;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9835:58;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11323:119;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7417:148;;;;;;;;;;;;;:::i;:::-;;13083:157;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;14008:150;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9900:70;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14283:128;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;17666:209;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7203:79;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11034:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15129:275;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18190:166;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;14419:131;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9977:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12492:269;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11450:167;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13634:122;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;14913:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;11625:143;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14166:109;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7573:244;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;10943:83;10980:13;11013:5;11006:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10943:83;:::o;11776:161::-;11851:4;11868:39;11877:12;:10;:12::i;:::-;11891:7;11900:6;11868:8;:39::i;:::-;11925:4;11918:11;;11776:161;;;;:::o;10376:22::-;;;;;;;;;;;;;;:::o;13248:126::-;13314:4;13338:22;:28;13361:4;13338:28;;;;;;;;;;;;;;;;;;;;;;;;;13331:35;;13248:126;;;:::o;9059:106::-;;;;;;;;;;;;;:::o;11220:95::-;11273:7;11300;;11293:14;;11220:95;:::o;11945:313::-;12043:4;12060:36;12070:6;12078:9;12089:6;12060:9;:36::i;:::-;12107:121;12116:6;12124:12;:10;:12::i;:::-;12138:89;12176:6;12138:89;;;;;;;;;;;;;;;;;:11;:19;12150:6;12138:19;;;;;;;;;;;;;;;:33;12158:12;:10;:12::i;:::-;12138:33;;;;;;;;;;;;;;;;:37;;:89;;;;;:::i;:::-;12107:8;:121::i;:::-;12246:4;12239:11;;11945:313;;;;;:::o;12769:137::-;7340:12;:10;:12::i;:::-;7330:22;;:6;;;;;;;;;;:22;;;7322:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;12891:7:::1;12873:15;:25;;;;:::i;:::-;12854:16;:44;;;;12769:137:::0;:::o;18593:161::-;7340:12;:10;:12::i;:::-;7330:22;;:6;;;;;;;;;;:22;;;7322:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;18656:18:::1;18677:21;18656:42;;18717:7;:5;:7::i;:::-;18709:25;;:37;18735:10;18709:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;18645:109;18593:161::o:0;10405:38::-;;;;;;;;;;;;;:::o;11129:83::-;11170:5;11195:9;;;;;;;;;;;11188:16;;11129:83;:::o;12266:218::-;12354:4;12371:83;12380:12;:10;:12::i;:::-;12394:7;12403:50;12442:10;12403:11;:25;12415:12;:10;:12::i;:::-;12403:25;;;;;;;;;;;;;;;:34;12429:7;12403:34;;;;;;;;;;;;;;;;:38;;:50;;;;:::i;:::-;12371:8;:83::i;:::-;12472:4;12465:11;;12266:218;;;;:::o;12914:161::-;7340:12;:10;:12::i;:::-;7330:22;;:6;;;;;;;;;;:22;;;7322:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;13026:41:::1;13039:9;;13050:16;13026:12;:41::i;:::-;12914:161:::0;;;:::o;18116:66::-;18159:15;:13;:15::i;:::-;18116:66::o;9172:41::-;;;;;;;;;;;;;:::o;9722:40::-;;;;;;;;;;;;;:::o;15412:124::-;15477:4;15501:18;:27;15520:7;15501:27;;;;;;;;;;;;;;;;;;;;;;;;;15494:34;;15412:124;;;:::o;9769:50::-;;;;:::o;9835:58::-;;;;:::o;11323:119::-;11389:7;11416:9;:18;11426:7;11416:18;;;;;;;;;;;;;;;;11409:25;;11323:119;;;:::o;7417:148::-;7340:12;:10;:12::i;:::-;7330:22;;:6;;;;;;;;;;:22;;;7322:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;7524:1:::1;7487:40;;7508:6;::::0;::::1;;;;;;;;7487:40;;;;;;;;;;;;7555:1;7538:6:::0;::::1;:19;;;;;;;;;;;;;;;;;;7417:148::o:0;13083:157::-;7340:12;:10;:12::i;:::-;7330:22;;:6;;;;;;;;;;:22;;;7322:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;13193:39:::1;13210:9;;13221:10;13193:16;:39::i;:::-;13083:157:::0;;;:::o;14008:150::-;7340:12;:10;:12::i;:::-;7330:22;;:6;;;;;;;;;;:22;;;7322:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;14108:6:::1;14091:7;:14;;:23;;;;14143:7;14125;:15;;:25;;;;14008:150:::0;;:::o;9900:70::-;;;;;;;;;;;;;:::o;14283:128::-;7340:12;:10;:12::i;:::-;7330:22;;:6;;;;;;;;;;:22;;;7322:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;14367:36:::1;14387:9;14398:4;14367:19;:36::i;:::-;14283:128:::0;:::o;17666:209::-;7340:12;:10;:12::i;:::-;7330:22;;:6;;;;;;;;;;:22;;;7322:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;17764:16:::1;;17752:8;:28:::0;17744:85:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;17859:8;17840:16;:27;;;;17666:209:::0;:::o;7203:79::-;7241:7;7268:6;;;;;;;;;;;7261:13;;7203:79;:::o;11034:87::-;11073:13;11106:7;11099:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11034:87;:::o;15129:275::-;15186:7;15207:21;15245:1;15231:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15207:40;;15268:15;;;;;;;;;;;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;15258:4;15263:1;15258:7;;;;;;;;:::i;:::-;;;;;;;:32;;;;;;;;;;;15319:4;15301;15306:1;15301:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;;;15342:15;;;;;;;;;;;:29;;;15372:14;;15388:4;15342:51;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;15394:1;15342:54;;;;;;;;:::i;:::-;;;;;;;;15335:61;;;15129:275;:::o;18190:166::-;7340:12;:10;:12::i;:::-;7330:22;;:6;;;;;;;;;;:22;;;7322:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;18323:23:::1;18281:15;;:67;;;;;;;;;;;;;;;;;;18190:166:::0;:::o;14419:131::-;7340:12;:10;:12::i;:::-;7330:22;;:6;;;;;;;;;;:22;;;7322:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;14505:37:::1;14525:9;14536:5;14505:19;:37::i;:::-;14419:131:::0;:::o;9977:39::-;;;;:::o;12492:269::-;12585:4;12602:129;12611:12;:10;:12::i;:::-;12625:7;12634:96;12673:15;12634:96;;;;;;;;;;;;;;;;;:11;:25;12646:12;:10;:12::i;:::-;12634:25;;;;;;;;;;;;;;;:34;12660:7;12634:34;;;;;;;;;;;;;;;;:38;;:96;;;;;:::i;:::-;12602:8;:129::i;:::-;12749:4;12742:11;;12492:269;;;;:::o;11450:167::-;11528:4;11545:42;11555:12;:10;:12::i;:::-;11569:9;11580:6;11545:9;:42::i;:::-;11605:4;11598:11;;11450:167;;;;:::o;13634:122::-;7340:12;:10;:12::i;:::-;7330:22;;:6;;;;;;;;;;:22;;;7322:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;13733:15:::1;13716:14;:32;;;;13634:122:::0;:::o;14913:171::-;7340:12;:10;:12::i;:::-;7330:22;;:6;;;;;;;;;;:22;;;7322:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;15014:8:::1;14990:21;;:32;;;;;;;;;;;;;;;;;;15038:38;15067:8;15038:38;;;;;;:::i;:::-;;;;;;;;14913:171:::0;:::o;11625:143::-;11706:7;11733:11;:18;11745:5;11733:18;;;;;;;;;;;;;;;:27;11752:7;11733:27;;;;;;;;;;;;;;;;11726:34;;11625:143;;;;:::o;14166:109::-;14227:4;14251:10;:16;14262:4;14251:16;;;;;;;;;;;;;;;;;;;;;;;;;14244:23;;14166:109;;;:::o;7573:244::-;7340:12;:10;:12::i;:::-;7330:22;;:6;;;;;;;;;;:22;;;7322:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;7682:1:::1;7662:22;;:8;:22;;::::0;7654:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;7772:8;7743:38;;7764:6;::::0;::::1;;;;;;;;7743:38;;;;;;;;;;;;7801:8;7792:6;::::0;:17:::1;;;;;;;;;;;;;;;;;;7573:244:::0;:::o;4211:98::-;4264:7;4291:10;4284:17;;4211:98;:::o;15544:337::-;15654:1;15637:19;;:5;:19;;;15629:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;15735:1;15716:21;;:7;:21;;;15708:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;15819:6;15789:11;:18;15801:5;15789:18;;;;;;;;;;;;;;;:27;15808:7;15789:27;;;;;;;;;;;;;;;:36;;;;15857:7;15841:32;;15850:5;15841:32;;;15866:6;15841:32;;;;;;:::i;:::-;;;;;;;;15544:337;;;:::o;15889:1374::-;15993:1;15977:18;;:4;:18;;;15969:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;16070:1;16056:16;;:2;:16;;;16048:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;16140:1;16131:6;:10;16123:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;16198:11;16228:13;16245:18;:24;16264:4;16245:24;;;;;;;;;;;;;;;;;;;;;;;;;16244:25;:52;;;;;16274:18;:22;16293:2;16274:22;;;;;;;;;;;;;;;;;;;;;;;;;16273:23;16244:52;:71;;;;;16308:7;:5;:7::i;:::-;16300:15;;:4;:15;;;;16244:71;:88;;;;;16325:7;:5;:7::i;:::-;16319:13;;:2;:13;;;;16244:88;16228:104;;16343:21;16367:25;16385:6;16367:13;16377:2;16367:9;:13::i;:::-;:17;;:25;;;;:::i;:::-;16343:49;;16504:7;:5;:7::i;:::-;16496:15;;:4;:15;;;;:32;;;;;16521:7;:5;:7::i;:::-;16515:13;;:2;:13;;;;16496:32;:52;;;;;16538:10;;;;;;;;;;;16532:16;;:2;:16;;;;16496:52;16492:181;;;16574:10;:16;16585:4;16574:16;;;;;;;;;;;;;;;;;;;;;;;;;16573:17;:36;;;;;16595:10;:14;16606:2;16595:14;;;;;;;;;;;;;;;;;;;;;;;;;16594:15;16573:36;16565:96;;;;;;;;;;;;:::i;:::-;;;;;;;;;16492:181;16695:13;;;;;;;;;;;16687:21;;:4;:21;;;16683:137;;16750:16;;16733:13;:33;;16725:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;16683:137;16842:13;;;;;;;;;;;16834:21;;:4;:21;;;;:44;;;;;16865:13;;;;;;;;;;;16859:19;;:2;:19;;;16834:44;16830:189;;;16973:4;16964:13;;16992:15;:13;:15::i;:::-;16830:189;17041:13;;;;;;;;;;;17033:21;;:4;:21;;;;:44;;;;;17064:13;;;;;;;;;;;17058:19;;:2;:19;;;;17033:44;17029:160;;;17119:16;;17102:13;:33;;17094:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;17029:160;17199:56;17214:4;17220:2;17224:6;17232:8;17242:6;17250:4;17199:14;:56::i;:::-;15958:1305;;;15889:1374;;;:::o;2683:192::-;2769:7;2802:1;2797;:6;;2805:12;2789:29;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;2829:9;2845:1;2841;:5;;;;:::i;:::-;2829:17;;2866:1;2859:8;;;2683:192;;;;;:::o;2350:181::-;2408:7;2428:9;2444:1;2440;:5;;;;:::i;:::-;2428:17;;2469:1;2464;:6;;2456:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;2522:1;2515:8;;;2350:181;;;;:::o;13764:236::-;13851:9;13846:147;13870:9;;:16;;13866:1;:20;13846:147;;;13908:12;13923:9;;13933:1;13923:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;13908:27;;13977:4;13950:18;:24;13969:4;13950:24;;;;;;;;;;;;;;;;:31;;;;;;;;;;;;;;;;;;13893:100;13888:3;;;;;:::i;:::-;;;;13846:147;;;;13764:236;;;:::o;17271:387::-;17315:28;17346:24;17364:4;17346:9;:24::i;:::-;17315:55;;17408:1;17385:20;:24;17381:270;;;17426:19;17448:26;:24;:26::i;:::-;17426:48;;17517:11;17493:20;:35;;:56;;;;;17533:16;;;;;;;;;;;17532:17;17493:56;:81;;;;;17553:21;;;;;;;;;;;17493:81;17489:151;;;17595:29;17612:11;17595:16;:29::i;:::-;17489:151;17411:240;17381:270;17304:354;17271:387::o;13382:244::-;13473:9;13468:151;13492:9;;:16;;13488:1;:20;13468:151;;;13530:12;13545:9;;13555:1;13545:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;13530:27;;13603:4;13572:22;:28;13595:4;13572:28;;;;;;;;;;;;;;;;:35;;;;;;;;;;;;;;;;;;13515:104;13510:3;;;;;:::i;:::-;;;;13468:151;;;;13382:244;;;:::o;14558:347::-;14653:9;14648:250;14672:9;:16;14668:1;:20;14648:250;;;14710:12;14725:9;14735:1;14725:12;;;;;;;;:::i;:::-;;;;;;;;14710:27;;14756:7;14752:135;;;14803:4;14784:10;:16;14795:4;14784:16;;;;;;;;;;;;;;;;:23;;;;;;;;;;;;;;;;;;14752:135;;;14855:10;:16;14866:4;14855:16;;;;;;;;;;;;;;;;14848:23;;;;;;;;;;;14752:135;14695:203;14690:3;;;;;:::i;:::-;;;;14648:250;;;;14558:347;;:::o;19428:1118::-;19574:17;19594:8;:50;;19643:1;19594:50;;;19605:35;19636:3;19605:26;19616:7;:14;;;19605:6;:10;;:26;;;;:::i;:::-;:30;;:35;;;;:::i;:::-;19594:50;19574:70;;19659:8;:18;;;;;19671:6;19659:18;19655:99;;;19706:36;19738:3;19706:27;19717:7;:15;;;19706:6;:10;;:27;;;;:::i;:::-;:31;;:36;;;;:::i;:::-;19694:48;;19655:99;19764:22;19789:21;19800:9;19789:6;:10;;:21;;;;:::i;:::-;19764:46;;19841:29;19863:6;19841:9;:17;19851:6;19841:17;;;;;;;;;;;;;;;;:21;;:29;;;;:::i;:::-;19821:9;:17;19831:6;19821:17;;;;;;;;;;;;;;;:49;;;;19904:40;19929:14;19904:9;:20;19914:9;19904:20;;;;;;;;;;;;;;;;:24;;:40;;;;:::i;:::-;19881:9;:20;19891:9;19881:20;;;;;;;;;;;;;;;:63;;;;19982:39;20011:9;19982;:24;20000:4;19982:24;;;;;;;;;;;;;;;;:28;;:39;;;;:::i;:::-;19955:9;:24;19973:4;19955:24;;;;;;;;;;;;;;;:66;;;;20054:9;20037:35;;20046:6;20037:35;;;20065:6;20037:35;;;;;;:::i;:::-;;;;;;;;20089:17;20085:454;;;20127:15;;;;;;;;;;;:31;;;20159:6;20127:39;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20123:54;20195:15;;;;;;;;;;;:31;;;20227:9;20195:42;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20191:57;20266:15;;;;;;;;;;;:23;;;20290:16;;20266:41;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;20262:266;;;20494:9;20405:99;;20470:4;20405:99;;;20430:10;20442:6;20450:18;20476:16;;20405:99;;;;;;;;;:::i;:::-;;;;;;;;20308:212;;;20262:266;20085:454;19563:983;;19428:1118;;;;;;:::o;17883:225::-;8994:4;8975:16;;:23;;;;;;;;;;;;;;;;;;17970:38:::1;17987:20;17970:16;:38::i;:::-;18019:18;18040:21;18019:42;;18072:28;18089:10;18072:16;:28::i;:::-;17959:149;9040:5:::0;9021:16;;:24;;;;;;;;;;;;;;;;;;17883:225;:::o;2883:471::-;2941:7;3191:1;3186;:6;3182:47;;3216:1;3209:8;;;;3182:47;3241:9;3257:1;3253;:5;;;;:::i;:::-;3241:17;;3286:1;3281;3277;:5;;;;:::i;:::-;:10;3269:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;3345:1;3338:8;;;2883:471;;;;;:::o;3362:132::-;3420:7;3447:39;3451:1;3454;3447:39;;;;;;;;;;;;;;;;;:3;:39::i;:::-;3440:46;;3362:132;;;;:::o;2539:136::-;2597:7;2624:43;2628:1;2631;2624:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;2617:50;;2539:136;;;;:::o;18762:585::-;18888:21;18926:1;18912:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18888:40;;18957:4;18939;18944:1;18939:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;;;18983:15;;;;;;;;;;;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;18973:4;18978:1;18973:7;;;;;;;;:::i;:::-;;;;;;;:32;;;;;;;;;;;19016:62;19033:4;19048:15;;;;;;;;;;;19066:11;19016:8;:62::i;:::-;19115:15;;;;;;;;;;;:66;;;19196:11;19222:1;19266:4;19293;19313:15;19115:224;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18817:530;18762:585;:::o;18364:221::-;18429:12;18454:15;;;;;;;;;;;18446:29;;18484:9;18446:52;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18428:70;;;18513:7;18509:69;;;18542:24;18556:9;18542:24;;;;;;:::i;:::-;;;;;;;;18509:69;18417:168;18364:221;:::o;3502:278::-;3588:7;3620:1;3616;:5;3623:12;3608:28;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;3647:9;3663:1;3659;:5;;;;:::i;:::-;3647:17;;3771:1;3764:8;;;3502:278;;;;;:::o;7:99:1:-;59:6;93:5;87:12;77:22;;7:99;;;:::o;112:169::-;196:11;230:6;225:3;218:19;270:4;265:3;261:14;246:29;;112:169;;;;:::o;287:246::-;368:1;378:113;392:6;389:1;386:13;378:113;;;477:1;472:3;468:11;462:18;458:1;453:3;449:11;442:39;414:2;411:1;407:10;402:15;;378:113;;;525:1;516:6;511:3;507:16;500:27;349:184;287:246;;;:::o;539:102::-;580:6;631:2;627:7;622:2;615:5;611:14;607:28;597:38;;539:102;;;:::o;647:377::-;735:3;763:39;796:5;763:39;:::i;:::-;818:71;882:6;877:3;818:71;:::i;:::-;811:78;;898:65;956:6;951:3;944:4;937:5;933:16;898:65;:::i;:::-;988:29;1010:6;988:29;:::i;:::-;983:3;979:39;972:46;;739:285;647:377;;;;:::o;1030:313::-;1143:4;1181:2;1170:9;1166:18;1158:26;;1230:9;1224:4;1220:20;1216:1;1205:9;1201:17;1194:47;1258:78;1331:4;1322:6;1258:78;:::i;:::-;1250:86;;1030:313;;;;:::o;1349:75::-;1382:6;1415:2;1409:9;1399:19;;1349:75;:::o;1430:117::-;1539:1;1536;1529:12;1553:117;1662:1;1659;1652:12;1676:126;1713:7;1753:42;1746:5;1742:54;1731:65;;1676:126;;;:::o;1808:96::-;1845:7;1874:24;1892:5;1874:24;:::i;:::-;1863:35;;1808:96;;;:::o;1910:122::-;1983:24;2001:5;1983:24;:::i;:::-;1976:5;1973:35;1963:63;;2022:1;2019;2012:12;1963:63;1910:122;:::o;2038:139::-;2084:5;2122:6;2109:20;2100:29;;2138:33;2165:5;2138:33;:::i;:::-;2038:139;;;;:::o;2183:77::-;2220:7;2249:5;2238:16;;2183:77;;;:::o;2266:122::-;2339:24;2357:5;2339:24;:::i;:::-;2332:5;2329:35;2319:63;;2378:1;2375;2368:12;2319:63;2266:122;:::o;2394:139::-;2440:5;2478:6;2465:20;2456:29;;2494:33;2521:5;2494:33;:::i;:::-;2394:139;;;;:::o;2539:474::-;2607:6;2615;2664:2;2652:9;2643:7;2639:23;2635:32;2632:119;;;2670:79;;:::i;:::-;2632:119;2790:1;2815:53;2860:7;2851:6;2840:9;2836:22;2815:53;:::i;:::-;2805:63;;2761:117;2917:2;2943:53;2988:7;2979:6;2968:9;2964:22;2943:53;:::i;:::-;2933:63;;2888:118;2539:474;;;;;:::o;3019:90::-;3053:7;3096:5;3089:13;3082:21;3071:32;;3019:90;;;:::o;3115:109::-;3196:21;3211:5;3196:21;:::i;:::-;3191:3;3184:34;3115:109;;:::o;3230:210::-;3317:4;3355:2;3344:9;3340:18;3332:26;;3368:65;3430:1;3419:9;3415:17;3406:6;3368:65;:::i;:::-;3230:210;;;;:::o;3446:118::-;3533:24;3551:5;3533:24;:::i;:::-;3528:3;3521:37;3446:118;;:::o;3570:332::-;3691:4;3729:2;3718:9;3714:18;3706:26;;3742:71;3810:1;3799:9;3795:17;3786:6;3742:71;:::i;:::-;3823:72;3891:2;3880:9;3876:18;3867:6;3823:72;:::i;:::-;3570:332;;;;;:::o;3908:329::-;3967:6;4016:2;4004:9;3995:7;3991:23;3987:32;3984:119;;;4022:79;;:::i;:::-;3984:119;4142:1;4167:53;4212:7;4203:6;4192:9;4188:22;4167:53;:::i;:::-;4157:63;;4113:117;3908:329;;;;:::o;4243:60::-;4271:3;4292:5;4285:12;;4243:60;;;:::o;4309:142::-;4359:9;4392:53;4410:34;4419:24;4437:5;4419:24;:::i;:::-;4410:34;:::i;:::-;4392:53;:::i;:::-;4379:66;;4309:142;;;:::o;4457:126::-;4507:9;4540:37;4571:5;4540:37;:::i;:::-;4527:50;;4457:126;;;:::o;4589:152::-;4665:9;4698:37;4729:5;4698:37;:::i;:::-;4685:50;;4589:152;;;:::o;4747:183::-;4860:63;4917:5;4860:63;:::i;:::-;4855:3;4848:76;4747:183;;:::o;4936:274::-;5055:4;5093:2;5082:9;5078:18;5070:26;;5106:97;5200:1;5189:9;5185:17;5176:6;5106:97;:::i;:::-;4936:274;;;;:::o;5216:222::-;5309:4;5347:2;5336:9;5332:18;5324:26;;5360:71;5428:1;5417:9;5413:17;5404:6;5360:71;:::i;:::-;5216:222;;;;:::o;5444:619::-;5521:6;5529;5537;5586:2;5574:9;5565:7;5561:23;5557:32;5554:119;;;5592:79;;:::i;:::-;5554:119;5712:1;5737:53;5782:7;5773:6;5762:9;5758:22;5737:53;:::i;:::-;5727:63;;5683:117;5839:2;5865:53;5910:7;5901:6;5890:9;5886:22;5865:53;:::i;:::-;5855:63;;5810:118;5967:2;5993:53;6038:7;6029:6;6018:9;6014:22;5993:53;:::i;:::-;5983:63;;5938:118;5444:619;;;;;:::o;6069:329::-;6128:6;6177:2;6165:9;6156:7;6152:23;6148:32;6145:119;;;6183:79;;:::i;:::-;6145:119;6303:1;6328:53;6373:7;6364:6;6353:9;6349:22;6328:53;:::i;:::-;6318:63;;6274:117;6069:329;;;;:::o;6404:134::-;6462:9;6495:37;6526:5;6495:37;:::i;:::-;6482:50;;6404:134;;;:::o;6544:166::-;6626:9;6659:45;6698:5;6659:45;:::i;:::-;6646:58;;6544:166;;;:::o;6716:195::-;6835:69;6898:5;6835:69;:::i;:::-;6830:3;6823:82;6716:195;;:::o;6917:286::-;7042:4;7080:2;7069:9;7065:18;7057:26;;7093:103;7193:1;7182:9;7178:17;7169:6;7093:103;:::i;:::-;6917:286;;;;:::o;7209:86::-;7244:7;7284:4;7277:5;7273:16;7262:27;;7209:86;;;:::o;7301:112::-;7384:22;7400:5;7384:22;:::i;:::-;7379:3;7372:35;7301:112;;:::o;7419:214::-;7508:4;7546:2;7535:9;7531:18;7523:26;;7559:67;7623:1;7612:9;7608:17;7599:6;7559:67;:::i;:::-;7419:214;;;;:::o;7639:117::-;7748:1;7745;7738:12;7762:117;7871:1;7868;7861:12;7885:117;7994:1;7991;7984:12;8025:568;8098:8;8108:6;8158:3;8151:4;8143:6;8139:17;8135:27;8125:122;;8166:79;;:::i;:::-;8125:122;8279:6;8266:20;8256:30;;8309:18;8301:6;8298:30;8295:117;;;8331:79;;:::i;:::-;8295:117;8445:4;8437:6;8433:17;8421:29;;8499:3;8491:4;8483:6;8479:17;8469:8;8465:32;8462:41;8459:128;;;8506:79;;:::i;:::-;8459:128;8025:568;;;;;:::o;8599:116::-;8669:21;8684:5;8669:21;:::i;:::-;8662:5;8659:32;8649:60;;8705:1;8702;8695:12;8649:60;8599:116;:::o;8721:133::-;8764:5;8802:6;8789:20;8780:29;;8818:30;8842:5;8818:30;:::i;:::-;8721:133;;;;:::o;8860:698::-;8952:6;8960;8968;9017:2;9005:9;8996:7;8992:23;8988:32;8985:119;;;9023:79;;:::i;:::-;8985:119;9171:1;9160:9;9156:17;9143:31;9201:18;9193:6;9190:30;9187:117;;;9223:79;;:::i;:::-;9187:117;9336:80;9408:7;9399:6;9388:9;9384:22;9336:80;:::i;:::-;9318:98;;;;9114:312;9465:2;9491:50;9533:7;9524:6;9513:9;9509:22;9491:50;:::i;:::-;9481:60;;9436:115;8860:698;;;;;:::o;9564:118::-;9651:24;9669:5;9651:24;:::i;:::-;9646:3;9639:37;9564:118;;:::o;9688:222::-;9781:4;9819:2;9808:9;9804:18;9796:26;;9832:71;9900:1;9889:9;9885:17;9876:6;9832:71;:::i;:::-;9688:222;;;;:::o;9916:474::-;9984:6;9992;10041:2;10029:9;10020:7;10016:23;10012:32;10009:119;;;10047:79;;:::i;:::-;10009:119;10167:1;10192:53;10237:7;10228:6;10217:9;10213:22;10192:53;:::i;:::-;10182:63;;10138:117;10294:2;10320:53;10365:7;10356:6;10345:9;10341:22;10320:53;:::i;:::-;10310:63;;10265:118;9916:474;;;;;:::o;10396:180::-;10444:77;10441:1;10434:88;10541:4;10538:1;10531:15;10565:4;10562:1;10555:15;10582:281;10665:27;10687:4;10665:27;:::i;:::-;10657:6;10653:40;10795:6;10783:10;10780:22;10759:18;10747:10;10744:34;10741:62;10738:88;;;10806:18;;:::i;:::-;10738:88;10846:10;10842:2;10835:22;10625:238;10582:281;;:::o;10869:129::-;10903:6;10930:20;;:::i;:::-;10920:30;;10959:33;10987:4;10979:6;10959:33;:::i;:::-;10869:129;;;:::o;11004:311::-;11081:4;11171:18;11163:6;11160:30;11157:56;;;11193:18;;:::i;:::-;11157:56;11243:4;11235:6;11231:17;11223:25;;11303:4;11297;11293:15;11285:23;;11004:311;;;:::o;11338:710::-;11434:5;11459:81;11475:64;11532:6;11475:64;:::i;:::-;11459:81;:::i;:::-;11450:90;;11560:5;11589:6;11582:5;11575:21;11623:4;11616:5;11612:16;11605:23;;11676:4;11668:6;11664:17;11656:6;11652:30;11705:3;11697:6;11694:15;11691:122;;;11724:79;;:::i;:::-;11691:122;11839:6;11822:220;11856:6;11851:3;11848:15;11822:220;;;11931:3;11960:37;11993:3;11981:10;11960:37;:::i;:::-;11955:3;11948:50;12027:4;12022:3;12018:14;12011:21;;11898:144;11882:4;11877:3;11873:14;11866:21;;11822:220;;;11826:21;11440:608;;11338:710;;;;;:::o;12071:370::-;12142:5;12191:3;12184:4;12176:6;12172:17;12168:27;12158:122;;12199:79;;:::i;:::-;12158:122;12316:6;12303:20;12341:94;12431:3;12423:6;12416:4;12408:6;12404:17;12341:94;:::i;:::-;12332:103;;12148:293;12071:370;;;;:::o;12447:539::-;12531:6;12580:2;12568:9;12559:7;12555:23;12551:32;12548:119;;;12586:79;;:::i;:::-;12548:119;12734:1;12723:9;12719:17;12706:31;12764:18;12756:6;12753:30;12750:117;;;12786:79;;:::i;:::-;12750:117;12891:78;12961:7;12952:6;12941:9;12937:22;12891:78;:::i;:::-;12881:88;;12677:302;12447:539;;;;:::o;12992:323::-;13048:6;13097:2;13085:9;13076:7;13072:23;13068:32;13065:119;;;13103:79;;:::i;:::-;13065:119;13223:1;13248:50;13290:7;13281:6;13270:9;13266:22;13248:50;:::i;:::-;13238:60;;13194:114;12992:323;;;;:::o;13321:474::-;13389:6;13397;13446:2;13434:9;13425:7;13421:23;13417:32;13414:119;;;13452:79;;:::i;:::-;13414:119;13572:1;13597:53;13642:7;13633:6;13622:9;13618:22;13597:53;:::i;:::-;13587:63;;13543:117;13699:2;13725:53;13770:7;13761:6;13750:9;13746:22;13725:53;:::i;:::-;13715:63;;13670:118;13321:474;;;;;:::o;13801:180::-;13849:77;13846:1;13839:88;13946:4;13943:1;13936:15;13970:4;13967:1;13960:15;13987:320;14031:6;14068:1;14062:4;14058:12;14048:22;;14115:1;14109:4;14105:12;14136:18;14126:81;;14192:4;14184:6;14180:17;14170:27;;14126:81;14254:2;14246:6;14243:14;14223:18;14220:38;14217:84;;14273:18;;:::i;:::-;14217:84;14038:269;13987:320;;;:::o;14313:182::-;14453:34;14449:1;14441:6;14437:14;14430:58;14313:182;:::o;14501:366::-;14643:3;14664:67;14728:2;14723:3;14664:67;:::i;:::-;14657:74;;14740:93;14829:3;14740:93;:::i;:::-;14858:2;14853:3;14849:12;14842:19;;14501:366;;;:::o;14873:419::-;15039:4;15077:2;15066:9;15062:18;15054:26;;15126:9;15120:4;15116:20;15112:1;15101:9;15097:17;15090:47;15154:131;15280:4;15154:131;:::i;:::-;15146:139;;14873:419;;;:::o;15298:180::-;15346:77;15343:1;15336:88;15443:4;15440:1;15433:15;15467:4;15464:1;15457:15;15484:410;15524:7;15547:20;15565:1;15547:20;:::i;:::-;15542:25;;15581:20;15599:1;15581:20;:::i;:::-;15576:25;;15636:1;15633;15629:9;15658:30;15676:11;15658:30;:::i;:::-;15647:41;;15837:1;15828:7;15824:15;15821:1;15818:22;15798:1;15791:9;15771:83;15748:139;;15867:18;;:::i;:::-;15748:139;15532:362;15484:410;;;;:::o;15900:231::-;16040:34;16036:1;16028:6;16024:14;16017:58;16109:14;16104:2;16096:6;16092:15;16085:39;15900:231;:::o;16137:366::-;16279:3;16300:67;16364:2;16359:3;16300:67;:::i;:::-;16293:74;;16376:93;16465:3;16376:93;:::i;:::-;16494:2;16489:3;16485:12;16478:19;;16137:366;;;:::o;16509:419::-;16675:4;16713:2;16702:9;16698:18;16690:26;;16762:9;16756:4;16752:20;16748:1;16737:9;16733:17;16726:47;16790:131;16916:4;16790:131;:::i;:::-;16782:139;;16509:419;;;:::o;16934:143::-;16991:5;17022:6;17016:13;17007:22;;17038:33;17065:5;17038:33;:::i;:::-;16934:143;;;;:::o;17083:351::-;17153:6;17202:2;17190:9;17181:7;17177:23;17173:32;17170:119;;;17208:79;;:::i;:::-;17170:119;17328:1;17353:64;17409:7;17400:6;17389:9;17385:22;17353:64;:::i;:::-;17343:74;;17299:128;17083:351;;;;:::o;17440:180::-;17488:77;17485:1;17478:88;17585:4;17582:1;17575:15;17609:4;17606:1;17599:15;17626:114;17693:6;17727:5;17721:12;17711:22;;17626:114;;;:::o;17746:184::-;17845:11;17879:6;17874:3;17867:19;17919:4;17914:3;17910:14;17895:29;;17746:184;;;;:::o;17936:132::-;18003:4;18026:3;18018:11;;18056:4;18051:3;18047:14;18039:22;;17936:132;;;:::o;18074:108::-;18151:24;18169:5;18151:24;:::i;:::-;18146:3;18139:37;18074:108;;:::o;18188:179::-;18257:10;18278:46;18320:3;18312:6;18278:46;:::i;:::-;18356:4;18351:3;18347:14;18333:28;;18188:179;;;;:::o;18373:113::-;18443:4;18475;18470:3;18466:14;18458:22;;18373:113;;;:::o;18522:732::-;18641:3;18670:54;18718:5;18670:54;:::i;:::-;18740:86;18819:6;18814:3;18740:86;:::i;:::-;18733:93;;18850:56;18900:5;18850:56;:::i;:::-;18929:7;18960:1;18945:284;18970:6;18967:1;18964:13;18945:284;;;19046:6;19040:13;19073:63;19132:3;19117:13;19073:63;:::i;:::-;19066:70;;19159:60;19212:6;19159:60;:::i;:::-;19149:70;;19005:224;18992:1;18989;18985:9;18980:14;;18945:284;;;18949:14;19245:3;19238:10;;18646:608;;;18522:732;;;;:::o;19260:483::-;19431:4;19469:2;19458:9;19454:18;19446:26;;19482:71;19550:1;19539:9;19535:17;19526:6;19482:71;:::i;:::-;19600:9;19594:4;19590:20;19585:2;19574:9;19570:18;19563:48;19628:108;19731:4;19722:6;19628:108;:::i;:::-;19620:116;;19260:483;;;;;:::o;19749:311::-;19826:4;19916:18;19908:6;19905:30;19902:56;;;19938:18;;:::i;:::-;19902:56;19988:4;19980:6;19976:17;19968:25;;20048:4;20042;20038:15;20030:23;;19749:311;;;:::o;20066:143::-;20123:5;20154:6;20148:13;20139:22;;20170:33;20197:5;20170:33;:::i;:::-;20066:143;;;;:::o;20232:732::-;20339:5;20364:81;20380:64;20437:6;20380:64;:::i;:::-;20364:81;:::i;:::-;20355:90;;20465:5;20494:6;20487:5;20480:21;20528:4;20521:5;20517:16;20510:23;;20581:4;20573:6;20569:17;20561:6;20557:30;20610:3;20602:6;20599:15;20596:122;;;20629:79;;:::i;:::-;20596:122;20744:6;20727:231;20761:6;20756:3;20753:15;20727:231;;;20836:3;20865:48;20909:3;20897:10;20865:48;:::i;:::-;20860:3;20853:61;20943:4;20938:3;20934:14;20927:21;;20803:155;20787:4;20782:3;20778:14;20771:21;;20727:231;;;20731:21;20345:619;;20232:732;;;;;:::o;20987:385::-;21069:5;21118:3;21111:4;21103:6;21099:17;21095:27;21085:122;;21126:79;;:::i;:::-;21085:122;21236:6;21230:13;21261:105;21362:3;21354:6;21347:4;21339:6;21335:17;21261:105;:::i;:::-;21252:114;;21075:297;20987:385;;;;:::o;21378:554::-;21473:6;21522:2;21510:9;21501:7;21497:23;21493:32;21490:119;;;21528:79;;:::i;:::-;21490:119;21669:1;21658:9;21654:17;21648:24;21699:18;21691:6;21688:30;21685:117;;;21721:79;;:::i;:::-;21685:117;21826:89;21907:7;21898:6;21887:9;21883:22;21826:89;:::i;:::-;21816:99;;21619:306;21378:554;;;;:::o;21938:225::-;22078:34;22074:1;22066:6;22062:14;22055:58;22147:8;22142:2;22134:6;22130:15;22123:33;21938:225;:::o;22169:366::-;22311:3;22332:67;22396:2;22391:3;22332:67;:::i;:::-;22325:74;;22408:93;22497:3;22408:93;:::i;:::-;22526:2;22521:3;22517:12;22510:19;;22169:366;;;:::o;22541:419::-;22707:4;22745:2;22734:9;22730:18;22722:26;;22794:9;22788:4;22784:20;22780:1;22769:9;22765:17;22758:47;22822:131;22948:4;22822:131;:::i;:::-;22814:139;;22541:419;;;:::o;22966:223::-;23106:34;23102:1;23094:6;23090:14;23083:58;23175:6;23170:2;23162:6;23158:15;23151:31;22966:223;:::o;23195:366::-;23337:3;23358:67;23422:2;23417:3;23358:67;:::i;:::-;23351:74;;23434:93;23523:3;23434:93;:::i;:::-;23552:2;23547:3;23543:12;23536:19;;23195:366;;;:::o;23567:419::-;23733:4;23771:2;23760:9;23756:18;23748:26;;23820:9;23814:4;23810:20;23806:1;23795:9;23791:17;23784:47;23848:131;23974:4;23848:131;:::i;:::-;23840:139;;23567:419;;;:::o;23992:221::-;24132:34;24128:1;24120:6;24116:14;24109:58;24201:4;24196:2;24188:6;24184:15;24177:29;23992:221;:::o;24219:366::-;24361:3;24382:67;24446:2;24441:3;24382:67;:::i;:::-;24375:74;;24458:93;24547:3;24458:93;:::i;:::-;24576:2;24571:3;24567:12;24560:19;;24219:366;;;:::o;24591:419::-;24757:4;24795:2;24784:9;24780:18;24772:26;;24844:9;24838:4;24834:20;24830:1;24819:9;24815:17;24808:47;24872:131;24998:4;24872:131;:::i;:::-;24864:139;;24591:419;;;:::o;25016:224::-;25156:34;25152:1;25144:6;25140:14;25133:58;25225:7;25220:2;25212:6;25208:15;25201:32;25016:224;:::o;25246:366::-;25388:3;25409:67;25473:2;25468:3;25409:67;:::i;:::-;25402:74;;25485:93;25574:3;25485:93;:::i;:::-;25603:2;25598:3;25594:12;25587:19;;25246:366;;;:::o;25618:419::-;25784:4;25822:2;25811:9;25807:18;25799:26;;25871:9;25865:4;25861:20;25857:1;25846:9;25842:17;25835:47;25899:131;26025:4;25899:131;:::i;:::-;25891:139;;25618:419;;;:::o;26043:222::-;26183:34;26179:1;26171:6;26167:14;26160:58;26252:5;26247:2;26239:6;26235:15;26228:30;26043:222;:::o;26271:366::-;26413:3;26434:67;26498:2;26493:3;26434:67;:::i;:::-;26427:74;;26510:93;26599:3;26510:93;:::i;:::-;26628:2;26623:3;26619:12;26612:19;;26271:366;;;:::o;26643:419::-;26809:4;26847:2;26836:9;26832:18;26824:26;;26896:9;26890:4;26886:20;26882:1;26871:9;26867:17;26860:47;26924:131;27050:4;26924:131;:::i;:::-;26916:139;;26643:419;;;:::o;27068:228::-;27208:34;27204:1;27196:6;27192:14;27185:58;27277:11;27272:2;27264:6;27260:15;27253:36;27068:228;:::o;27302:366::-;27444:3;27465:67;27529:2;27524:3;27465:67;:::i;:::-;27458:74;;27541:93;27630:3;27541:93;:::i;:::-;27659:2;27654:3;27650:12;27643:19;;27302:366;;;:::o;27674:419::-;27840:4;27878:2;27867:9;27863:18;27855:26;;27927:9;27921:4;27917:20;27913:1;27902:9;27898:17;27891:47;27955:131;28081:4;27955:131;:::i;:::-;27947:139;;27674:419;;;:::o;28099:234::-;28239:34;28235:1;28227:6;28223:14;28216:58;28308:17;28303:2;28295:6;28291:15;28284:42;28099:234;:::o;28339:366::-;28481:3;28502:67;28566:2;28561:3;28502:67;:::i;:::-;28495:74;;28578:93;28667:3;28578:93;:::i;:::-;28696:2;28691:3;28687:12;28680:19;;28339:366;;;:::o;28711:419::-;28877:4;28915:2;28904:9;28900:18;28892:26;;28964:9;28958:4;28954:20;28950:1;28939:9;28935:17;28928:47;28992:131;29118:4;28992:131;:::i;:::-;28984:139;;28711:419;;;:::o;29136:224::-;29276:34;29272:1;29264:6;29260:14;29253:58;29345:7;29340:2;29332:6;29328:15;29321:32;29136:224;:::o;29366:366::-;29508:3;29529:67;29593:2;29588:3;29529:67;:::i;:::-;29522:74;;29605:93;29694:3;29605:93;:::i;:::-;29723:2;29718:3;29714:12;29707:19;;29366:366;;;:::o;29738:419::-;29904:4;29942:2;29931:9;29927:18;29919:26;;29991:9;29985:4;29981:20;29977:1;29966:9;29962:17;29955:47;30019:131;30145:4;30019:131;:::i;:::-;30011:139;;29738:419;;;:::o;30163:194::-;30203:4;30223:20;30241:1;30223:20;:::i;:::-;30218:25;;30257:20;30275:1;30257:20;:::i;:::-;30252:25;;30301:1;30298;30294:9;30286:17;;30325:1;30319:4;30316:11;30313:37;;;30330:18;;:::i;:::-;30313:37;30163:194;;;;:::o;30363:191::-;30403:3;30422:20;30440:1;30422:20;:::i;:::-;30417:25;;30456:20;30474:1;30456:20;:::i;:::-;30451:25;;30499:1;30496;30492:9;30485:16;;30520:3;30517:1;30514:10;30511:36;;;30527:18;;:::i;:::-;30511:36;30363:191;;;;:::o;30560:177::-;30700:29;30696:1;30688:6;30684:14;30677:53;30560:177;:::o;30743:366::-;30885:3;30906:67;30970:2;30965:3;30906:67;:::i;:::-;30899:74;;30982:93;31071:3;30982:93;:::i;:::-;31100:2;31095:3;31091:12;31084:19;;30743:366;;;:::o;31115:419::-;31281:4;31319:2;31308:9;31304:18;31296:26;;31368:9;31362:4;31358:20;31354:1;31343:9;31339:17;31332:47;31396:131;31522:4;31396:131;:::i;:::-;31388:139;;31115:419;;;:::o;31540:233::-;31579:3;31602:24;31620:5;31602:24;:::i;:::-;31593:33;;31648:66;31641:5;31638:77;31635:103;;31718:18;;:::i;:::-;31635:103;31765:1;31758:5;31754:13;31747:20;;31540:233;;;:::o;31779:663::-;31867:6;31875;31883;31932:2;31920:9;31911:7;31907:23;31903:32;31900:119;;;31938:79;;:::i;:::-;31900:119;32058:1;32083:64;32139:7;32130:6;32119:9;32115:22;32083:64;:::i;:::-;32073:74;;32029:128;32196:2;32222:64;32278:7;32269:6;32258:9;32254:22;32222:64;:::i;:::-;32212:74;;32167:129;32335:2;32361:64;32417:7;32408:6;32397:9;32393:22;32361:64;:::i;:::-;32351:74;;32306:129;31779:663;;;;;:::o;32448:553::-;32625:4;32663:3;32652:9;32648:19;32640:27;;32677:71;32745:1;32734:9;32730:17;32721:6;32677:71;:::i;:::-;32758:72;32826:2;32815:9;32811:18;32802:6;32758:72;:::i;:::-;32840;32908:2;32897:9;32893:18;32884:6;32840:72;:::i;:::-;32922;32990:2;32979:9;32975:18;32966:6;32922:72;:::i;:::-;32448:553;;;;;;;:::o;33007:180::-;33055:77;33052:1;33045:88;33152:4;33149:1;33142:15;33176:4;33173:1;33166:15;33193:185;33233:1;33250:20;33268:1;33250:20;:::i;:::-;33245:25;;33284:20;33302:1;33284:20;:::i;:::-;33279:25;;33323:1;33313:35;;33328:18;;:::i;:::-;33313:35;33370:1;33367;33363:9;33358:14;;33193:185;;;;:::o;33384:220::-;33524:34;33520:1;33512:6;33508:14;33501:58;33593:3;33588:2;33580:6;33576:15;33569:28;33384:220;:::o;33610:366::-;33752:3;33773:67;33837:2;33832:3;33773:67;:::i;:::-;33766:74;;33849:93;33938:3;33849:93;:::i;:::-;33967:2;33962:3;33958:12;33951:19;;33610:366;;;:::o;33982:419::-;34148:4;34186:2;34175:9;34171:18;34163:26;;34235:9;34229:4;34225:20;34221:1;34210:9;34206:17;34199:47;34263:131;34389:4;34263:131;:::i;:::-;34255:139;;33982:419;;;:::o;34407:85::-;34452:7;34481:5;34470:16;;34407:85;;;:::o;34498:158::-;34556:9;34589:61;34607:42;34616:32;34642:5;34616:32;:::i;:::-;34607:42;:::i;:::-;34589:61;:::i;:::-;34576:74;;34498:158;;;:::o;34662:147::-;34757:45;34796:5;34757:45;:::i;:::-;34752:3;34745:58;34662:147;;:::o;34815:831::-;35078:4;35116:3;35105:9;35101:19;35093:27;;35130:71;35198:1;35187:9;35183:17;35174:6;35130:71;:::i;:::-;35211:80;35287:2;35276:9;35272:18;35263:6;35211:80;:::i;:::-;35338:9;35332:4;35328:20;35323:2;35312:9;35308:18;35301:48;35366:108;35469:4;35460:6;35366:108;:::i;:::-;35358:116;;35484:72;35552:2;35541:9;35537:18;35528:6;35484:72;:::i;:::-;35566:73;35634:3;35623:9;35619:19;35610:6;35566:73;:::i;:::-;34815:831;;;;;;;;:::o;35652:147::-;35753:11;35790:3;35775:18;;35652:147;;;;:::o;35805:114::-;;:::o;35925:398::-;36084:3;36105:83;36186:1;36181:3;36105:83;:::i;:::-;36098:90;;36197:93;36286:3;36197:93;:::i;:::-;36315:1;36310:3;36306:11;36299:18;;35925:398;;;:::o;36329:379::-;36513:3;36535:147;36678:3;36535:147;:::i;:::-;36528:154;;36699:3;36692:10;;36329:379;;;:::o

Swarm Source

ipfs://8286ee7111a623219ed924a282a9bbc7205742570756de48d39c308dd5d06094
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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