ETH Price: $3,357.51 (-2.81%)
Gas: 1 Gwei

Token

Ethereum Hive (EHIVE)
 

Overview

Max Total Supply

1,015,682,158,474.059016818662384648 EHIVE

Holders

2,451

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
0.439516559813683231 EHIVE

Value
$0.00
0x678ab997d77b3730a2ff1bc77246bbd1fa3037bf
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Ethereum Hive token contract has migrated to a new address.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
EHIVE

Compiler Version
v0.8.15+commit.e14f2714

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-09-08
*/

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

interface IERC20 {
    function totalSupply() external view returns (uint256);
    function balanceOf(address account) external view returns (uint256);
    function transfer(address to, 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 from,
        address to,
        uint256 amount
    ) external returns (bool);

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

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

contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

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

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

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

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

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

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

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

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

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

    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public virtual override returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, amount);
        _transfer(from, to, amount);
        return true;
    }

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

    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        address owner = _msgSender();
        uint256 currentAllowance = _allowances[owner][spender];
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(owner, spender, currentAllowance - subtractedValue);
        }

        return true;
    }

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

        _beforeTokenTransfer(from, to, amount);

        uint256 fromBalance = _balances[from];
        require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[from] = fromBalance - amount;
        }
        _balances[to] += amount;

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, amount);
    }

    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _beforeTokenTransfer(address(0), account, amount);

        _totalSupply += amount;
        _balances[account] += amount;
        emit Transfer(address(0), account, amount);

        _afterTokenTransfer(address(0), account, amount);
    }

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

        _beforeTokenTransfer(account, address(0), amount);

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
        }
        _totalSupply -= amount;

        emit Transfer(account, address(0), amount);

        _afterTokenTransfer(account, address(0), amount);
    }

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

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

    function _spendAllowance(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance != type(uint256).max) {
            require(currentAllowance >= amount, "ERC20: insufficient allowance");
            unchecked {
                _approve(owner, spender, currentAllowance - amount);
            }
        }
    }

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

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

interface IUniswapV2Factory {
    event PairCreated(address indexed token0, address indexed token1, address pair, uint);

    function feeTo() external view returns (address);
    function feeToSetter() external view returns (address);

    function getPair(address tokenA, address tokenB) external view returns (address pair);
    function allPairs(uint) external view returns (address pair);
    function allPairsLength() external view returns (uint);

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

    function setFeeTo(address) external;
    function setFeeToSetter(address) external;
}

interface IUniswapV2Pair {
    event Approval(address indexed owner, address indexed spender, uint value);
    event Transfer(address indexed from, address indexed to, uint value);

    function name() external pure returns (string memory);
    function symbol() external pure returns (string memory);
    function decimals() external pure returns (uint8);
    function totalSupply() external view returns (uint);
    function balanceOf(address owner) external view returns (uint);
    function allowance(address owner, address spender) external view returns (uint);

    function approve(address spender, uint value) external returns (bool);
    function transfer(address to, uint value) external returns (bool);
    function transferFrom(address from, address to, uint value) external returns (bool);

    function DOMAIN_SEPARATOR() external view returns (bytes32);
    function PERMIT_TYPEHASH() external pure returns (bytes32);
    function nonces(address owner) external view returns (uint);

    function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;

    event Mint(address indexed sender, uint amount0, uint amount1);
    event Burn(address indexed sender, uint amount0, uint amount1, address indexed to);
    event Swap(
        address indexed sender,
        uint amount0In,
        uint amount1In,
        uint amount0Out,
        uint amount1Out,
        address indexed to
    );
    event Sync(uint112 reserve0, uint112 reserve1);

    function MINIMUM_LIQUIDITY() external pure returns (uint);
    function factory() external view returns (address);
    function token0() external view returns (address);
    function token1() external view returns (address);
    function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
    function price0CumulativeLast() external view returns (uint);
    function price1CumulativeLast() external view returns (uint);
    function kLast() external view returns (uint);

    function mint(address to) external returns (uint liquidity);
    function burn(address to) external returns (uint amount0, uint amount1);
    function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
    function skim(address to) external;
    function sync() external;

    function initialize(address, address) external;
}

interface IUniswapV2Router01 {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountToken, uint amountETH);
    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETHWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountToken, uint amountETH);
    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);
    function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);

    function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
    function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
    function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
    function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}

interface IUniswapV2Router02 is IUniswapV2Router01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountETH);
    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountETH);

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

abstract contract Ownable is Context {
    address private _owner;

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

    constructor() {
        _transferOwnership(_msgSender());
    }

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

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

    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

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

    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

library SafeMath {
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // 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 (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

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

    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

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

contract EHIVE is ERC20, Ownable {
    using SafeMath for uint256;

    uint256 public maxSupply; // what the total supply can reach and not go beyond

    IUniswapV2Router02 private uniswapV2Router;
    address private uniswapV2Pair;

    bool private _swapping;

    address private _swapFeeReceiver;
    
    uint256 public maxTransactionAmount;
    uint256 public maxWallet;

    uint256 public swapTokensThreshold;
        
    bool public limitsInEffect = true;

    uint256 public totalFees;
    uint256 private _marketingFee;
    uint256 private _liquidityFee;
    uint256 private _validatorFee;
    
    uint256 private _tokensForMarketing;
    uint256 private _tokensForLiquidity;
    uint256 private _tokensForValidator;
    
    // staking vars
    uint256 public totalStaked;
    address public stakingToken;
    address public rewardToken;
    uint256 public apr;

    bool public stakingEnabled = false;
    uint256 public totalClaimed;

    struct Validator {
        uint256 creationTime;
        uint256 staked;
    }

    struct Staker {
        address staker;
        uint256 start;
        uint256 staked;
        uint256 earned;
    }

    struct ClaimHistory {
        uint256[] dates;
        uint256[] amounts;
    }

    // exlcude from fees and max transaction amount
    mapping (address => bool) private _isExcludedFromFees;
    mapping (address => bool) private _isExcludedMaxTransactionAmount;

    // store addresses that a automatic market maker pairs. Any transfer *to* these addresses
    // could be subject to a maximum transfer amount
    mapping (address => bool) private _automatedMarketMakerPairs;

    // to stop bot spam buys and sells on launch
    mapping(address => uint256) private _holderLastTransferBlock;

    // stake data
    mapping(address => mapping(uint256 => Staker)) private _stakers;
    mapping(address => ClaimHistory) private _claimHistory;
    Validator[] public validators;

    /**
     * @dev Throws if called by any account other than the _swapFeeReceiver
     */
    modifier teamOROwner() {
        require(_swapFeeReceiver == _msgSender() || owner() == _msgSender(), "Caller is not the _swapFeeReceiver address nor owner.");
        _;
    }

    modifier isStakingEnabled() {
        require(stakingEnabled, "Staking is not enabled.");
        _;
    }

    constructor() ERC20("Ethereum Hive", "EHIVE") payable {
        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
        
        _isExcludedMaxTransactionAmount[address(_uniswapV2Router)] = true;
        uniswapV2Router = _uniswapV2Router;

        uint256 marketingFee = 2;
        uint256 liquidityFee = 1;
        uint256 validatorFee = 3;

        uint256 totalSupply = 5e11 * 1e18;
        maxSupply = 1e12 * 1e18;

        maxTransactionAmount = totalSupply * 4 / 1000;
        maxWallet = totalSupply * 1 / 100;
        swapTokensThreshold = totalSupply * 1 / 1000;
        
        _marketingFee = marketingFee;
        _liquidityFee = liquidityFee;
        _validatorFee = validatorFee;
        totalFees = _marketingFee + _liquidityFee + _validatorFee;

        _swapFeeReceiver = owner();

        // exclude from paying fees or having max transaction amount
        excludeFromFees(owner(), true);
        excludeFromFees(address(this), true);
        excludeFromFees(address(0xdead), true);
        
        _isExcludedMaxTransactionAmount[owner()] = true;
        _isExcludedMaxTransactionAmount[address(this)] = true;
        _isExcludedMaxTransactionAmount[address(0xdead)] = true;
        
        stakingToken = address(this);
        rewardToken = address(this);
        apr = 50;

        _mint(address(this), totalSupply.sub(17e10 * 1e18));
        _mint(msg.sender, 17e10 * 1e18);
    }

    /**
    * @dev Once live, can never be switched off
    */
    function startTrading() external teamOROwner {
        uniswapV2Pair = IUniswapV2Factory(uniswapV2Router.factory()).createPair(address(this), uniswapV2Router.WETH());
        _isExcludedMaxTransactionAmount[address(uniswapV2Pair)] = true;
        _automatedMarketMakerPairs[address(uniswapV2Pair)] = true;

        _approve(address(this), address(uniswapV2Router), balanceOf(address(this)));
        uniswapV2Router.addLiquidityETH{value: address(this).balance} (
            address(this),
            balanceOf(address(this)),
            0,
            0,
            owner(),
            block.timestamp
        );
    }

    /**
    * @dev Remove limits after token is somewhat stable
    */
    function removeLimits() external teamOROwner {
        limitsInEffect = false;
    }

    /**
    * @dev Exclude from fee calculation
    */
    function excludeFromFees(address account, bool excluded) public teamOROwner {
        _isExcludedFromFees[account] = excluded;
    }
    
    /**
    * @dev Update token fees (max set to initial fee)
    */
    function updateFees(uint256 marketingFee, uint256 liquidityFee, uint256 validatorFee) external onlyOwner {
        _marketingFee = marketingFee;
        _liquidityFee = liquidityFee;
        _validatorFee = validatorFee;

        totalFees = _marketingFee + _liquidityFee + _validatorFee;

        require(totalFees <= 6, "Must keep fees at 6% or less");
    }

    /**
    * @dev Update wallet that receives fees and newly added LP
    */
    function updateFeeReceiver(address newWallet) external teamOROwner {
        _swapFeeReceiver = newWallet;
    }

    /**
    * @dev Very important function. 
    * Updates the threshold of how many tokens that must be in the contract calculation for fees to be taken
    */
    function updateSwapTokensThreshold(uint256 newThreshold) external teamOROwner returns (bool) {
  	    require(newThreshold >= totalSupply() * 1 / 100000, "Swap threshold cannot be lower than 0.001% total supply.");
  	    require(newThreshold <= totalSupply() * 5 / 1000, "Swap threshold cannot be higher than 0.5% total supply.");
  	    swapTokensThreshold = newThreshold;
  	    return true;
  	}

    /**
    * @dev Check if an address is excluded from the fee calculation
    */
    function isExcludedFromFees(address account) external view returns(bool) {
        return _isExcludedFromFees[account];
    }

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

        // all to secure a smooth launch
        if (limitsInEffect) {
            if (
                from != owner() &&
                to != owner() &&
                to != address(0xdead) &&
                !_swapping
            ) {
                if (to != owner() && to != address(uniswapV2Router) && to != address(uniswapV2Pair)){
                    require(_holderLastTransferBlock[tx.origin] < block.number, "_transfer:: Transfer Delay enabled.  Only one purchase per block allowed.");
                    _holderLastTransferBlock[tx.origin] = block.number;
                }

                // on buy
                if (_automatedMarketMakerPairs[from] && !_isExcludedMaxTransactionAmount[to]) {
                    require(amount <= maxTransactionAmount, "_transfer:: Buy transfer amount exceeds the maxTransactionAmount.");
                    require(amount + balanceOf(to) <= maxWallet, "_transfer:: Max wallet exceeded");
                }
                
                // on sell
                else if (_automatedMarketMakerPairs[to] && !_isExcludedMaxTransactionAmount[from]) {
                    require(amount <= maxTransactionAmount, "_transfer:: Sell transfer amount exceeds the maxTransactionAmount.");
                }
                else if (!_isExcludedMaxTransactionAmount[to]) {
                    require(amount + balanceOf(to) <= maxWallet, "_transfer:: Max wallet exceeded");
                }
            }
        }
        
		uint256 contractTokenBalance = balanceOf(address(this));
        bool canSwap = contractTokenBalance >= swapTokensThreshold;
        if (
            canSwap &&
            !_swapping &&
            !_automatedMarketMakerPairs[from] &&
            !_isExcludedFromFees[from] &&
            !_isExcludedFromFees[to]
        ) {
            _swapping = true;
            swapBack();
            _swapping = false;
        }

        bool takeFee = !_swapping;

        // if any addy belongs to _isExcludedFromFee or isn't a swap then remove the fee
        if (
            _isExcludedFromFees[from] || 
            _isExcludedFromFees[to] || 
            (!_automatedMarketMakerPairs[from] && !_automatedMarketMakerPairs[to])
        ) takeFee = false;
        
        uint256 fees = 0;
        if (takeFee) {
            fees = amount.mul(totalFees).div(100);
            _tokensForLiquidity += fees * _liquidityFee / totalFees;
            _tokensForValidator += fees * _validatorFee / totalFees;
            _tokensForMarketing += fees * _marketingFee / totalFees;
            
            if (fees > 0) {
                super._transfer(from, address(this), fees);
            }
        	
        	amount -= fees;
        }

        super._transfer(from, to, amount);
    }

    function _swapTokensForEth(uint256 tokenAmount) internal {
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();

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

        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0,
            path,
            address(this),
            block.timestamp
        );
    }

    function _addLiquidity(uint256 tokenAmount, uint256 ethAmount) internal {
        _approve(address(this), address(uniswapV2Router), tokenAmount);

        uniswapV2Router.addLiquidityETH{value: ethAmount}(
            address(this),
            tokenAmount,
            0,
            0,
            _swapFeeReceiver,
            block.timestamp
        );
    }

    function swapBack() internal {
        uint256 contractBalance = balanceOf(address(this));
        uint256 totalTokensToSwap = _tokensForLiquidity + _tokensForMarketing + _tokensForValidator;
        
        if (contractBalance == 0 || totalTokensToSwap == 0) return;
        if (contractBalance > swapTokensThreshold) contractBalance = swapTokensThreshold;
        
        
        // Halve the amount of liquidity tokens
        uint256 liquidityTokens = contractBalance * _tokensForLiquidity / totalTokensToSwap / 2;
        uint256 amountToSwapForETH = contractBalance.sub(liquidityTokens);
        
        uint256 initialETHBalance = address(this).balance;

        _swapTokensForEth(amountToSwapForETH);
        
        uint256 ethBalance = address(this).balance.sub(initialETHBalance);
        uint256 ethForMarketing = ethBalance.mul(_tokensForMarketing).div(totalTokensToSwap);
        uint256 ethForValidator = ethBalance.mul(_tokensForValidator).div(totalTokensToSwap);
        uint256 ethForLiquidity = ethBalance - ethForMarketing - ethForValidator;
        
        _tokensForLiquidity = 0;
        _tokensForMarketing = 0;
        _tokensForValidator = 0;

        payable(_swapFeeReceiver).transfer(ethForMarketing.add(ethForValidator));
                
        if (liquidityTokens > 0 && ethForLiquidity > 0) {
            _addLiquidity(liquidityTokens, ethForLiquidity);
        }
    }

    /**
    * @dev Transfer eth stuck in contract to _swapFeeReceiver
    */
    function withdrawContractETH() external {
        payable(_swapFeeReceiver).transfer(address(this).balance);
    }

    /**
    * @dev In case swap wont do it and sells/buys might be blocked
    */
    function forceSwap() external teamOROwner {
        _swapTokensForEth(balanceOf(address(this)));
    }

    /**
        *
        * @dev Staking part starts here
        *
    */

    /**
    * @dev Checks if holder is staking
    */
    function isStaking(address stakerAddr, uint256 validator) public view returns (bool) {
        return _stakers[stakerAddr][validator].staker == stakerAddr;
    }

    /**
    * @dev Returns how much staker is staking
    */
    function userStaked(address staker, uint256 validator) public view returns (uint256) {
        return _stakers[staker][validator].staked;
    }

    /**
    * @dev Returns how much staker has claimed over time
    */
    function userClaimHistory(address staker) public view returns (ClaimHistory memory) {
        return _claimHistory[staker];
    }

    /**
    * @dev Returns how much staker has earned
    */
    function userEarned(address staker, uint256 validator) public view returns (uint256) {
        uint256 currentlyEarned = _userEarned(staker, validator);
        uint256 previouslyEarned = _stakers[msg.sender][validator].earned;

        if (previouslyEarned > 0) return currentlyEarned.add(previouslyEarned);
        return currentlyEarned;
    }

    function _userEarned(address staker, uint256 validator) private view returns (uint256) {
        require(isStaking(staker, validator), "User is not staking.");

        uint256 staked = userStaked(staker, validator);
        uint256 stakersStartInSeconds = _stakers[staker][validator].start.div(1 seconds);
        uint256 blockTimestampInSeconds = block.timestamp.div(1 seconds);
        uint256 secondsStaked = blockTimestampInSeconds.sub(stakersStartInSeconds);

        uint256 earn = staked.mul(apr).div(100);
        uint256 rewardPerSec = earn.div(365).div(24).div(60).div(60);
        uint256 earned = rewardPerSec.mul(secondsStaked);

        return earned;
    }
 
    /**
    * @dev Stake tokens in validator
    */
    function stake(uint256 stakeAmount, uint256 validator) external isStakingEnabled {
        require(totalSupply() <= maxSupply, "There are no more rewards left to be claimed.");

        // Check user is registered as staker
        if (isStaking(msg.sender, validator)) {
            _stakers[msg.sender][validator].staked += stakeAmount;
            _stakers[msg.sender][validator].earned += _userEarned(msg.sender, validator);
            _stakers[msg.sender][validator].start = block.timestamp;
        } else {
            _stakers[msg.sender][validator] = Staker(msg.sender, block.timestamp, stakeAmount, 0);
        }

        validators[validator].staked += stakeAmount;
        totalStaked += stakeAmount;
        _burn(msg.sender, stakeAmount);
    }
    
    /**
    * @dev Claim earned tokens from stake in validator
    */
    function claim(uint256 validator) external isStakingEnabled {
        require(isStaking(msg.sender, validator), "You are not staking!?");
        require(totalSupply() <= maxSupply, "There are no more rewards left to be claimed.");

        uint256 reward = userEarned(msg.sender, validator);

        _claimHistory[msg.sender].dates.push(block.timestamp);
        _claimHistory[msg.sender].amounts.push(reward);
        totalClaimed += reward;

        _mint(msg.sender, reward);

        _stakers[msg.sender][validator].start = block.timestamp;
        _stakers[msg.sender][validator].earned = 0;
    }

    /**
    * @dev Claim earned and staked tokens from validator
    */
    function unstake(uint256 validator) external {
        require(isStaking(msg.sender, validator), "You are not staking!?");

        uint256 reward = userEarned(msg.sender, validator);

        if (totalSupply().add(reward) < maxSupply && stakingEnabled) {
            _claimHistory[msg.sender].dates.push(block.timestamp);
            _claimHistory[msg.sender].amounts.push(reward);
            totalClaimed += reward;

            _mint(msg.sender, _stakers[msg.sender][validator].staked.add(reward));
        } else {
            _mint(msg.sender, _stakers[msg.sender][validator].staked);
        }

        validators[validator].staked -= _stakers[msg.sender][validator].staked;
        totalStaked -= _stakers[msg.sender][validator].staked;

        delete _stakers[msg.sender][validator];
    }

    /**
    * @dev Creates validator 
    */
    function createValidator() external teamOROwner {
        Validator memory validator = Validator(block.timestamp, 0);
        validators.push(validator);
    }

    /**
    * @dev Returns amount of validators
    */
    function amountOfValidators() public view returns (uint256) {
        return validators.length;
    }

    /**
    * @dev Enables/disables staking
    */
    function setStakingState(bool onoff) external teamOROwner {
        stakingEnabled = onoff;
    }

    receive() external payable {}
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"payable","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":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":[{"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":[],"name":"amountOfValidators","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":[],"name":"apr","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"validator","type":"uint256"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"createValidator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"forceSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"stakerAddr","type":"address"},{"internalType":"uint256","name":"validator","type":"uint256"}],"name":"isStaking","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"limitsInEffect","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTransactionAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"removeLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"onoff","type":"bool"}],"name":"setStakingState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"stakeAmount","type":"uint256"},{"internalType":"uint256","name":"validator","type":"uint256"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakingToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapTokensThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalStaked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","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":"uint256","name":"validator","type":"uint256"}],"name":"unstake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newWallet","type":"address"}],"name":"updateFeeReceiver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"marketingFee","type":"uint256"},{"internalType":"uint256","name":"liquidityFee","type":"uint256"},{"internalType":"uint256","name":"validatorFee","type":"uint256"}],"name":"updateFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newThreshold","type":"uint256"}],"name":"updateSwapTokensThreshold","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"}],"name":"userClaimHistory","outputs":[{"components":[{"internalType":"uint256[]","name":"dates","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"internalType":"struct EHIVE.ClaimHistory","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"},{"internalType":"uint256","name":"validator","type":"uint256"}],"name":"userEarned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"},{"internalType":"uint256","name":"validator","type":"uint256"}],"name":"userStaked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"validators","outputs":[{"internalType":"uint256","name":"creationTime","type":"uint256"},{"internalType":"uint256","name":"staked","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawContractETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040526001600d60006101000a81548160ff0219169083151502179055506000601960006101000a81548160ff0219169083151502179055506040518060400160405280600d81526020017f457468657265756d2048697665000000000000000000000000000000000000008152506040518060400160405280600581526020017f45484956450000000000000000000000000000000000000000000000000000008152508160039081620000b7919062000b7a565b508060049081620000c9919062000b7a565b505050620000ec620000e06200051c60201b60201c565b6200052460201b60201c565b6000737a250d5630b4cf539739df2c5dacb4c659f2488d90506001601c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060006002905060006001905060006003905060006c064f964e68233a76f52000000090506c0c9f2c9cd04674edea400000006006819055506103e8600482620001e8919062000c90565b620001f4919062000d20565b600a8190555060646001826200020b919062000c90565b62000217919062000d20565b600b819055506103e86001826200022f919062000c90565b6200023b919062000d20565b600c8190555083600f819055508260108190555081601181905550601154601054600f546200026b919062000d58565b62000277919062000d58565b600e819055506200028d620005ea60201b60201c565b600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620002ef620002e1620005ea60201b60201c565b60016200061460201b60201c565b620003023060016200061460201b60201c565b6200031761dead60016200061460201b60201c565b6001601c60006200032d620005ea60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601c60003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601c600061dead73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555030601660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555030601760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506032601881905550620004f230620004e66c02254cb4422075287210000000846200076660201b62002c371790919060201c565b6200077e60201b60201c565b62000511336c02254cb44220752872100000006200077e60201b60201c565b505050505062000f39565b600033905090565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b620006246200051c60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161480620006c957506200068b6200051c60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620006b1620005ea60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16145b6200070b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620007029062000e3c565b60405180910390fd5b80601b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b6000818362000776919062000e5e565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603620007f0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620007e79062000ee9565b60405180910390fd5b6200080460008383620008f660201b60201c565b806002600082825462000818919062000d58565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546200086f919062000d58565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051620008d6919062000f1c565b60405180910390a3620008f260008383620008fb60201b60201c565b5050565b505050565b505050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200098257607f821691505b6020821081036200099857620009976200093a565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830262000a027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620009c3565b62000a0e8683620009c3565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000a5b62000a5562000a4f8462000a26565b62000a30565b62000a26565b9050919050565b6000819050919050565b62000a778362000a3a565b62000a8f62000a868262000a62565b848454620009d0565b825550505050565b600090565b62000aa662000a97565b62000ab381848462000a6c565b505050565b5b8181101562000adb5762000acf60008262000a9c565b60018101905062000ab9565b5050565b601f82111562000b2a5762000af4816200099e565b62000aff84620009b3565b8101602085101562000b0f578190505b62000b2762000b1e85620009b3565b83018262000ab8565b50505b505050565b600082821c905092915050565b600062000b4f6000198460080262000b2f565b1980831691505092915050565b600062000b6a838362000b3c565b9150826002028217905092915050565b62000b858262000900565b67ffffffffffffffff81111562000ba15762000ba06200090b565b5b62000bad825462000969565b62000bba82828562000adf565b600060209050601f83116001811462000bf2576000841562000bdd578287015190505b62000be9858262000b5c565b86555062000c59565b601f19841662000c02866200099e565b60005b8281101562000c2c5784890151825560018201915060208501945060208101905062000c05565b8683101562000c4c578489015162000c48601f89168262000b3c565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000c9d8262000a26565b915062000caa8362000a26565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161562000ce65762000ce562000c61565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600062000d2d8262000a26565b915062000d3a8362000a26565b92508262000d4d5762000d4c62000cf1565b5b828204905092915050565b600062000d658262000a26565b915062000d728362000a26565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562000daa5762000da962000c61565b5b828201905092915050565b600082825260208201905092915050565b7f43616c6c6572206973206e6f7420746865205f7377617046656552656365697660008201527f65722061646472657373206e6f72206f776e65722e0000000000000000000000602082015250565b600062000e2460358362000db5565b915062000e318262000dc6565b604082019050919050565b6000602082019050818103600083015262000e578162000e15565b9050919050565b600062000e6b8262000a26565b915062000e788362000a26565b92508282101562000e8e5762000e8d62000c61565b5b828203905092915050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b600062000ed1601f8362000db5565b915062000ede8262000e99565b602082019050919050565b6000602082019050818103600083015262000f048162000ec2565b9050919050565b62000f168162000a26565b82525050565b600060208201905062000f33600083018462000f0b565b92915050565b615e588062000f496000396000f3fe6080604052600436106102815760003560e01c8063715018a61161014f578063c0246668116100c1578063d5abeb011161007a578063d5abeb01146109be578063dd62ed3e146109e9578063df778d2614610a26578063f2fde38b14610a3d578063f7c618c114610a66578063f8b45b0514610a9157610288565b8063c0246668146108d4578063c69bebe4146108fd578063c8c8ebe414610926578063cef8513914610951578063d125ca181461097c578063d54ad2a11461099357610288565b80638baa63b2116101135780638baa63b21461078a5780638da5cb5b146107c757806395d89b41146107f2578063a39b21531461081d578063a457c2d71461085a578063a9059cbb1461089757610288565b8063715018a6146106dd57806372f702f3146106f4578063751039fc1461071f5780637b0472f014610736578063817b1cd21461075f57610288565b806335aa2e44116101f35780634a62bb65116101ac5780634a62bb65146105a55780634fbee193146105d057806357ded9c91461060d578063590654e9146106385780636ceb23a11461066357806370a08231146106a057610288565b806335aa2e4414610484578063379607f5146104c257806339509351146104eb5780633b51e5cf146105285780633dd5b2da146105515780634093e7d51461056857610288565b80632242908511610245578063224290851461037657806323b872dd1461039f578063245fc1ba146103dc578063293230b8146104195780632e17de7814610430578063313ce5671461045957610288565b806306fdde031461028d578063095ea7b3146102b857806313114a9d146102f557806318160ddd146103205780631cfff51b1461034b57610288565b3661028857005b600080fd5b34801561029957600080fd5b506102a2610abc565b6040516102af919061474c565b60405180910390f35b3480156102c457600080fd5b506102df60048036038101906102da9190614807565b610b4e565b6040516102ec9190614862565b60405180910390f35b34801561030157600080fd5b5061030a610b71565b604051610317919061488c565b60405180910390f35b34801561032c57600080fd5b50610335610b77565b604051610342919061488c565b60405180910390f35b34801561035757600080fd5b50610360610b81565b60405161036d9190614862565b60405180910390f35b34801561038257600080fd5b5061039d600480360381019061039891906148a7565b610b94565b005b3480156103ab57600080fd5b506103c660048036038101906103c191906148fa565b610c93565b6040516103d39190614862565b60405180910390f35b3480156103e857600080fd5b5061040360048036038101906103fe9190614807565b610cc2565b6040516104109190614862565b60405180910390f35b34801561042557600080fd5b5061042e610d6e565b005b34801561043c57600080fd5b506104576004803603810190610452919061494d565b61120e565b005b34801561046557600080fd5b5061046e6115ee565b60405161047b9190614996565b60405180910390f35b34801561049057600080fd5b506104ab60048036038101906104a6919061494d565b6115f7565b6040516104b99291906149b1565b60405180910390f35b3480156104ce57600080fd5b506104e960048036038101906104e4919061494d565b61162b565b005b3480156104f757600080fd5b50610512600480360381019061050d9190614807565b6118c7565b60405161051f9190614862565b60405180910390f35b34801561053457600080fd5b5061054f600480360381019061054a9190614a06565b611971565b005b34801561055d57600080fd5b50610566611a69565b005b34801561057457600080fd5b5061058f600480360381019061058a9190614807565b611ad4565b60405161059c919061488c565b60405180910390f35b3480156105b157600080fd5b506105ba611b6c565b6040516105c79190614862565b60405180910390f35b3480156105dc57600080fd5b506105f760048036038101906105f29190614a33565b611b7f565b6040516106049190614862565b60405180910390f35b34801561061957600080fd5b50610622611bd5565b60405161062f919061488c565b60405180910390f35b34801561064457600080fd5b5061064d611bdb565b60405161065a919061488c565b60405180910390f35b34801561066f57600080fd5b5061068a60048036038101906106859190614a33565b611be8565b6040516106979190614b62565b60405180910390f35b3480156106ac57600080fd5b506106c760048036038101906106c29190614a33565b611cf1565b6040516106d4919061488c565b60405180910390f35b3480156106e957600080fd5b506106f2611d39565b005b34801561070057600080fd5b50610709611dc1565b6040516107169190614b93565b60405180910390f35b34801561072b57600080fd5b50610734611de7565b005b34801561074257600080fd5b5061075d60048036038101906107589190614bae565b611edf565b005b34801561076b57600080fd5b50610774612217565b604051610781919061488c565b60405180910390f35b34801561079657600080fd5b506107b160048036038101906107ac919061494d565b61221d565b6040516107be9190614862565b60405180910390f35b3480156107d357600080fd5b506107dc6123d1565b6040516107e99190614b93565b60405180910390f35b3480156107fe57600080fd5b506108076123fb565b604051610814919061474c565b60405180910390f35b34801561082957600080fd5b50610844600480360381019061083f9190614807565b61248d565b604051610851919061488c565b60405180910390f35b34801561086657600080fd5b50610881600480360381019061087c9190614807565b6124eb565b60405161088e9190614862565b60405180910390f35b3480156108a357600080fd5b506108be60048036038101906108b99190614807565b6125d5565b6040516108cb9190614862565b60405180910390f35b3480156108e057600080fd5b506108fb60048036038101906108f69190614bee565b6125f8565b005b34801561090957600080fd5b50610924600480360381019061091f9190614a33565b61272e565b005b34801561093257600080fd5b5061093b61284d565b604051610948919061488c565b60405180910390f35b34801561095d57600080fd5b50610966612853565b604051610973919061488c565b60405180910390f35b34801561098857600080fd5b50610991612859565b005b34801561099f57600080fd5b506109a8612993565b6040516109b5919061488c565b60405180910390f35b3480156109ca57600080fd5b506109d3612999565b6040516109e0919061488c565b60405180910390f35b3480156109f557600080fd5b50610a106004803603810190610a0b9190614c2e565b61299f565b604051610a1d919061488c565b60405180910390f35b348015610a3257600080fd5b50610a3b612a26565b005b348015610a4957600080fd5b50610a646004803603810190610a5f9190614a33565b612b14565b005b348015610a7257600080fd5b50610a7b612c0b565b604051610a889190614b93565b60405180910390f35b348015610a9d57600080fd5b50610aa6612c31565b604051610ab3919061488c565b60405180910390f35b606060038054610acb90614c9d565b80601f0160208091040260200160405190810160405280929190818152602001828054610af790614c9d565b8015610b445780601f10610b1957610100808354040283529160200191610b44565b820191906000526020600020905b815481529060010190602001808311610b2757829003601f168201915b5050505050905090565b600080610b59612c4d565b9050610b66818585612c55565b600191505092915050565b600e5481565b6000600254905090565b601960009054906101000a900460ff1681565b610b9c612c4d565b73ffffffffffffffffffffffffffffffffffffffff16610bba6123d1565b73ffffffffffffffffffffffffffffffffffffffff1614610c10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0790614d1a565b60405180910390fd5b82600f819055508160108190555080601181905550601154601054600f54610c389190614d69565b610c429190614d69565b600e819055506006600e541115610c8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8590614e0b565b60405180910390fd5b505050565b600080610c9e612c4d565b9050610cab858285612e1e565b610cb6858585612eaa565b60019150509392505050565b60008273ffffffffffffffffffffffffffffffffffffffff16601f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b610d76612c4d565b73ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161480610e0a5750610dd4612c4d565b73ffffffffffffffffffffffffffffffffffffffff16610df26123d1565b73ffffffffffffffffffffffffffffffffffffffff16145b610e49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4090614e9d565b60405180910390fd5b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015610eb6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eda9190614ed2565b73ffffffffffffffffffffffffffffffffffffffff1663c9c6539630600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f63573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f879190614ed2565b6040518363ffffffff1660e01b8152600401610fa4929190614eff565b6020604051808303816000875af1158015610fc3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fe79190614ed2565b600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001601c6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601d6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061115030600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1661114b30611cf1565b612c55565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d719473061119930611cf1565b6000806111a46123d1565b426040518863ffffffff1660e01b81526004016111c696959493929190614f6d565b60606040518083038185885af11580156111e4573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906112099190614fe3565b505050565b6112183382610cc2565b611257576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124e90615082565b60405180910390fd5b60006112633383611ad4565b905060065461128282611274610b77565b61390a90919063ffffffff16565b10801561129b5750601960009054906101000a900460ff165b156113ff57602060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001429080600181540180825580915050600190039060005260206000200160009091909190915055602060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010181908060018154018082558091505060019003906000526020600020016000909190919091505580601a60008282546113849190614d69565b925050819055506113fa336113f583601f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008781526020019081526020016000206002015461390a90919063ffffffff16565b613920565b61145d565b61145c33601f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600085815260200190815260200160002060020154613920565b5b601f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002060020154602183815481106114c5576114c46150a2565b5b906000526020600020906002020160010160008282546114e591906150d1565b92505081905550601f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000838152602001908152602001600020600201546015600082825461155191906150d1565b92505081905550601f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000838152602001908152602001600020600080820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905560018201600090556002820160009055600382016000905550505050565b60006012905090565b6021818154811061160757600080fd5b90600052602060002090600202016000915090508060000154908060010154905082565b601960009054906101000a900460ff1661167a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167190615151565b60405180910390fd5b6116843382610cc2565b6116c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ba90615082565b60405180910390fd5b6006546116ce610b77565b111561170f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611706906151e3565b60405180910390fd5b600061171b3383611ad4565b9050602060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001429080600181540180825580915050600190039060005260206000200160009091909190915055602060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010181908060018154018082558091505060019003906000526020600020016000909190919091505580601a60008282546118019190614d69565b925050819055506118123382613920565b42601f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000848152602001908152602001600020600101819055506000601f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000848152602001908152602001600020600301819055505050565b6000806118d2612c4d565b9050611966818585600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546119619190614d69565b612c55565b600191505092915050565b611979612c4d565b73ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161480611a0d57506119d7612c4d565b73ffffffffffffffffffffffffffffffffffffffff166119f56123d1565b73ffffffffffffffffffffffffffffffffffffffff16145b611a4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4390614e9d565b60405180910390fd5b80601960006101000a81548160ff02191690831515021790555050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015611ad1573d6000803e3d6000fd5b50565b600080611ae18484613a7f565b90506000601f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008581526020019081526020016000206003015490506000811115611b6057611b57818361390a90919063ffffffff16565b92505050611b66565b81925050505b92915050565b600d60009054906101000a900460ff1681565b6000601b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60185481565b6000602180549050905090565b611bf0614699565b602060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060405180604001604052908160008201805480602002602001604051908101604052809291908181526020018280548015611c8957602002820191906000526020600020905b815481526020019060010190808311611c75575b5050505050815260200160018201805480602002602001604051908101604052809291908181526020018280548015611ce157602002820191906000526020600020905b815481526020019060010190808311611ccd575b5050505050815250509050919050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611d41612c4d565b73ffffffffffffffffffffffffffffffffffffffff16611d5f6123d1565b73ffffffffffffffffffffffffffffffffffffffff1614611db5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dac90614d1a565b60405180910390fd5b611dbf6000613c17565b565b601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611def612c4d565b73ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161480611e835750611e4d612c4d565b73ffffffffffffffffffffffffffffffffffffffff16611e6b6123d1565b73ffffffffffffffffffffffffffffffffffffffff16145b611ec2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eb990614e9d565b60405180910390fd5b6000600d60006101000a81548160ff021916908315150217905550565b601960009054906101000a900460ff16611f2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2590615151565b60405180910390fd5b600654611f39610b77565b1115611f7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f71906151e3565b60405180910390fd5b611f843382610cc2565b156120c35781601f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206002016000828254611fec9190614d69565b92505081905550611ffd3382613a7f565b601f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000838152602001908152602001600020600301600082825461205f9190614d69565b9250508190555042601f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000838152602001908152602001600020600101819055506121b4565b60405180608001604052803373ffffffffffffffffffffffffffffffffffffffff1681526020014281526020018381526020016000815250601f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015560408201518160020155606082015181600301559050505b81602182815481106121c9576121c86150a2565b5b906000526020600020906002020160010160008282546121e99190614d69565b9250508190555081601560008282546122029190614d69565b925050819055506122133383613cdd565b5050565b60155481565b6000612227612c4d565b73ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614806122bb5750612285612c4d565b73ffffffffffffffffffffffffffffffffffffffff166122a36123d1565b73ffffffffffffffffffffffffffffffffffffffff16145b6122fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122f190614e9d565b60405180910390fd5b620186a06001612308610b77565b6123129190615203565b61231c919061528c565b82101561235e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123559061532f565b60405180910390fd5b6103e8600561236b610b77565b6123759190615203565b61237f919061528c565b8211156123c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123b8906153c1565b60405180910390fd5b81600c8190555060019050919050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606004805461240a90614c9d565b80601f016020809104026020016040519081016040528092919081815260200182805461243690614c9d565b80156124835780601f1061245857610100808354040283529160200191612483565b820191906000526020600020905b81548152906001019060200180831161246657829003601f168201915b5050505050905090565b6000601f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002060020154905092915050565b6000806124f6612c4d565b90506000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050838110156125bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125b390615453565b60405180910390fd5b6125c98286868403612c55565b60019250505092915050565b6000806125e0612c4d565b90506125ed818585612eaa565b600191505092915050565b612600612c4d565b73ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161480612694575061265e612c4d565b73ffffffffffffffffffffffffffffffffffffffff1661267c6123d1565b73ffffffffffffffffffffffffffffffffffffffff16145b6126d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126ca90614e9d565b60405180910390fd5b80601b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b612736612c4d565b73ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614806127ca5750612794612c4d565b73ffffffffffffffffffffffffffffffffffffffff166127b26123d1565b73ffffffffffffffffffffffffffffffffffffffff16145b612809576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161280090614e9d565b60405180910390fd5b80600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600a5481565b600c5481565b612861612c4d565b73ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614806128f557506128bf612c4d565b73ffffffffffffffffffffffffffffffffffffffff166128dd6123d1565b73ffffffffffffffffffffffffffffffffffffffff16145b612934576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161292b90614e9d565b60405180910390fd5b600060405180604001604052804281526020016000815250905060218190806001815401808255809150506001900390600052602060002090600202016000909190919091506000820151816000015560208201518160010155505050565b601a5481565b60065481565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b612a2e612c4d565b73ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161480612ac25750612a8c612c4d565b73ffffffffffffffffffffffffffffffffffffffff16612aaa6123d1565b73ffffffffffffffffffffffffffffffffffffffff16145b612b01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612af890614e9d565b60405180910390fd5b612b12612b0d30611cf1565b613eb3565b565b612b1c612c4d565b73ffffffffffffffffffffffffffffffffffffffff16612b3a6123d1565b73ffffffffffffffffffffffffffffffffffffffff1614612b90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b8790614d1a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612bff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bf6906154e5565b60405180910390fd5b612c0881613c17565b50565b601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600b5481565b60008183612c4591906150d1565b905092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612cc4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cbb90615577565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612d33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d2a90615609565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051612e11919061488c565b60405180910390a3505050565b6000612e2a848461299f565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114612ea45781811015612e96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e8d90615675565b60405180910390fd5b612ea38484848403612c55565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612f19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f1090615707565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612f88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f7f90615799565b60405180910390fd5b60008103612fa157612f9c838360006140f6565b613905565b600d60009054906101000a900460ff161561352457612fbe6123d1565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415801561302c5750612ffc6123d1565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b8015613066575061dead73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b801561307f5750600860149054906101000a900460ff16155b156135235761308c6123d1565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141580156131155750600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b801561316f5750600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b1561323a5743601e60003273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054106131f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131ec90615851565b60405180910390fd5b43601e60003273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b601d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680156132dd5750601c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b1561338457600a54811115613327576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161331e90615909565b60405180910390fd5b600b5461333383611cf1565b8261333e9190614d69565b111561337f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161337690615975565b60405180910390fd5b613522565b601d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680156134275750601c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b1561347657600a54811115613471576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161346890615a2d565b60405180910390fd5b613521565b601c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661352057600b546134d383611cf1565b826134de9190614d69565b111561351f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161351690615975565b60405180910390fd5b5b5b5b5b5b600061352f30611cf1565b90506000600c5482101590508080156135555750600860149054906101000a900460ff16155b80156135ab5750601d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b80156136015750601b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b80156136575750601b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b1561369b576001600860146101000a81548160ff02191690831515021790555061367f614375565b6000600860146101000a81548160ff0219169083151502179055505b6000600860149054906101000a900460ff16159050601b60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806137515750601b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b806137fc5750601d60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161580156137fb5750601d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b5b1561380657600090505b600081156138f5576138366064613828600e548861456390919063ffffffff16565b61457990919063ffffffff16565b9050600e54601054826138499190615203565b613853919061528c565b601360008282546138649190614d69565b92505081905550600e546011548261387c9190615203565b613886919061528c565b601460008282546138979190614d69565b92505081905550600e54600f54826138af9190615203565b6138b9919061528c565b601260008282546138ca9190614d69565b9250508190555060008111156138e6576138e58730836140f6565b5b80856138f291906150d1565b94505b6139008787876140f6565b505050505b505050565b600081836139189190614d69565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361398f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161398690615a99565b60405180910390fd5b61399b6000838361458f565b80600260008282546139ad9190614d69565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613a029190614d69565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051613a67919061488c565b60405180910390a3613a7b60008383614594565b5050565b6000613a8b8383610cc2565b613aca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613ac190615b05565b60405180910390fd5b6000613ad6848461248d565b90506000613b416001601f60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008781526020019081526020016000206001015461457990919063ffffffff16565b90506000613b5960014261457990919063ffffffff16565b90506000613b708383612c3790919063ffffffff16565b90506000613b9c6064613b8e6018548861456390919063ffffffff16565b61457990919063ffffffff16565b90506000613bee603c613be0603c613bd26018613bc461016d8961457990919063ffffffff16565b61457990919063ffffffff16565b61457990919063ffffffff16565b61457990919063ffffffff16565b90506000613c05848361456390919063ffffffff16565b90508097505050505050505092915050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603613d4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613d4390615b97565b60405180910390fd5b613d588260008361458f565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015613dde576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613dd590615c29565b60405180910390fd5b8181036000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160026000828254613e3591906150d1565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051613e9a919061488c565b60405180910390a3613eae83600084614594565b505050565b6000600267ffffffffffffffff811115613ed057613ecf615c49565b5b604051908082528060200260200182016040528015613efe5781602001602082028036833780820191505090505b5090503081600081518110613f1657613f156150a2565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015613fbd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613fe19190614ed2565b81600181518110613ff557613ff46150a2565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505061405c30600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684612c55565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b81526004016140c0959493929190615d36565b600060405180830381600087803b1580156140da57600080fd5b505af11580156140ee573d6000803e3d6000fd5b505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603614165576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161415c90615707565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036141d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016141cb90615799565b60405180910390fd5b6141df83838361458f565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015614265576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161425c90615e02565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546142f89190614d69565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161435c919061488c565b60405180910390a361436f848484614594565b50505050565b600061438030611cf1565b905060006014546012546013546143979190614d69565b6143a19190614d69565b905060008214806143b25750600081145b156143be575050614561565b600c548211156143ce57600c5491505b6000600282601354856143e19190615203565b6143eb919061528c565b6143f5919061528c565b9050600061440c8285612c3790919063ffffffff16565b9050600047905061441c82613eb3565b60006144318247612c3790919063ffffffff16565b9050600061445c8661444e6012548561456390919063ffffffff16565b61457990919063ffffffff16565b90506000614487876144796014548661456390919063ffffffff16565b61457990919063ffffffff16565b9050600081838561449891906150d1565b6144a291906150d1565b9050600060138190555060006012819055506000601481905550600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc61450b848661390a90919063ffffffff16565b9081150290604051600060405180830381858888f19350505050158015614536573d6000803e3d6000fd5b506000871180156145475750600081115b15614557576145568782614599565b5b5050505050505050505b565b600081836145719190615203565b905092915050565b60008183614587919061528c565b905092915050565b505050565b505050565b6145c630600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684612c55565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d719823085600080600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16426040518863ffffffff1660e01b815260040161464f96959493929190614f6d565b60606040518083038185885af115801561466d573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906146929190614fe3565b5050505050565b604051806040016040528060608152602001606081525090565b600081519050919050565b600082825260208201905092915050565b60005b838110156146ed5780820151818401526020810190506146d2565b838111156146fc576000848401525b50505050565b6000601f19601f8301169050919050565b600061471e826146b3565b61472881856146be565b93506147388185602086016146cf565b61474181614702565b840191505092915050565b600060208201905081810360008301526147668184614713565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061479e82614773565b9050919050565b6147ae81614793565b81146147b957600080fd5b50565b6000813590506147cb816147a5565b92915050565b6000819050919050565b6147e4816147d1565b81146147ef57600080fd5b50565b600081359050614801816147db565b92915050565b6000806040838503121561481e5761481d61476e565b5b600061482c858286016147bc565b925050602061483d858286016147f2565b9150509250929050565b60008115159050919050565b61485c81614847565b82525050565b60006020820190506148776000830184614853565b92915050565b614886816147d1565b82525050565b60006020820190506148a1600083018461487d565b92915050565b6000806000606084860312156148c0576148bf61476e565b5b60006148ce868287016147f2565b93505060206148df868287016147f2565b92505060406148f0868287016147f2565b9150509250925092565b6000806000606084860312156149135761491261476e565b5b6000614921868287016147bc565b9350506020614932868287016147bc565b9250506040614943868287016147f2565b9150509250925092565b6000602082840312156149635761496261476e565b5b6000614971848285016147f2565b91505092915050565b600060ff82169050919050565b6149908161497a565b82525050565b60006020820190506149ab6000830184614987565b92915050565b60006040820190506149c6600083018561487d565b6149d3602083018461487d565b9392505050565b6149e381614847565b81146149ee57600080fd5b50565b600081359050614a00816149da565b92915050565b600060208284031215614a1c57614a1b61476e565b5b6000614a2a848285016149f1565b91505092915050565b600060208284031215614a4957614a4861476e565b5b6000614a57848285016147bc565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b614a95816147d1565b82525050565b6000614aa78383614a8c565b60208301905092915050565b6000602082019050919050565b6000614acb82614a60565b614ad58185614a6b565b9350614ae083614a7c565b8060005b83811015614b11578151614af88882614a9b565b9750614b0383614ab3565b925050600181019050614ae4565b5085935050505092915050565b60006040830160008301518482036000860152614b3b8282614ac0565b91505060208301518482036020860152614b558282614ac0565b9150508091505092915050565b60006020820190508181036000830152614b7c8184614b1e565b905092915050565b614b8d81614793565b82525050565b6000602082019050614ba86000830184614b84565b92915050565b60008060408385031215614bc557614bc461476e565b5b6000614bd3858286016147f2565b9250506020614be4858286016147f2565b9150509250929050565b60008060408385031215614c0557614c0461476e565b5b6000614c13858286016147bc565b9250506020614c24858286016149f1565b9150509250929050565b60008060408385031215614c4557614c4461476e565b5b6000614c53858286016147bc565b9250506020614c64858286016147bc565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680614cb557607f821691505b602082108103614cc857614cc7614c6e565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614d046020836146be565b9150614d0f82614cce565b602082019050919050565b60006020820190508181036000830152614d3381614cf7565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614d74826147d1565b9150614d7f836147d1565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614db457614db3614d3a565b5b828201905092915050565b7f4d757374206b6565702066656573206174203625206f72206c65737300000000600082015250565b6000614df5601c836146be565b9150614e0082614dbf565b602082019050919050565b60006020820190508181036000830152614e2481614de8565b9050919050565b7f43616c6c6572206973206e6f7420746865205f7377617046656552656365697660008201527f65722061646472657373206e6f72206f776e65722e0000000000000000000000602082015250565b6000614e876035836146be565b9150614e9282614e2b565b604082019050919050565b60006020820190508181036000830152614eb681614e7a565b9050919050565b600081519050614ecc816147a5565b92915050565b600060208284031215614ee857614ee761476e565b5b6000614ef684828501614ebd565b91505092915050565b6000604082019050614f146000830185614b84565b614f216020830184614b84565b9392505050565b6000819050919050565b6000819050919050565b6000614f57614f52614f4d84614f28565b614f32565b6147d1565b9050919050565b614f6781614f3c565b82525050565b600060c082019050614f826000830189614b84565b614f8f602083018861487d565b614f9c6040830187614f5e565b614fa96060830186614f5e565b614fb66080830185614b84565b614fc360a083018461487d565b979650505050505050565b600081519050614fdd816147db565b92915050565b600080600060608486031215614ffc57614ffb61476e565b5b600061500a86828701614fce565b935050602061501b86828701614fce565b925050604061502c86828701614fce565b9150509250925092565b7f596f7520617265206e6f74207374616b696e67213f0000000000000000000000600082015250565b600061506c6015836146be565b915061507782615036565b602082019050919050565b6000602082019050818103600083015261509b8161505f565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006150dc826147d1565b91506150e7836147d1565b9250828210156150fa576150f9614d3a565b5b828203905092915050565b7f5374616b696e67206973206e6f7420656e61626c65642e000000000000000000600082015250565b600061513b6017836146be565b915061514682615105565b602082019050919050565b6000602082019050818103600083015261516a8161512e565b9050919050565b7f546865726520617265206e6f206d6f72652072657761726473206c656674207460008201527f6f20626520636c61696d65642e00000000000000000000000000000000000000602082015250565b60006151cd602d836146be565b91506151d882615171565b604082019050919050565b600060208201905081810360008301526151fc816151c0565b9050919050565b600061520e826147d1565b9150615219836147d1565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561525257615251614d3a565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000615297826147d1565b91506152a2836147d1565b9250826152b2576152b161525d565b5b828204905092915050565b7f53776170207468726573686f6c642063616e6e6f74206265206c6f776572207460008201527f68616e20302e3030312520746f74616c20737570706c792e0000000000000000602082015250565b60006153196038836146be565b9150615324826152bd565b604082019050919050565b600060208201905081810360008301526153488161530c565b9050919050565b7f53776170207468726573686f6c642063616e6e6f74206265206869676865722060008201527f7468616e20302e352520746f74616c20737570706c792e000000000000000000602082015250565b60006153ab6037836146be565b91506153b68261534f565b604082019050919050565b600060208201905081810360008301526153da8161539e565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b600061543d6025836146be565b9150615448826153e1565b604082019050919050565b6000602082019050818103600083015261546c81615430565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006154cf6026836146be565b91506154da82615473565b604082019050919050565b600060208201905081810360008301526154fe816154c2565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006155616024836146be565b915061556c82615505565b604082019050919050565b6000602082019050818103600083015261559081615554565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006155f36022836146be565b91506155fe82615597565b604082019050919050565b60006020820190508181036000830152615622816155e6565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b600061565f601d836146be565b915061566a82615629565b602082019050919050565b6000602082019050818103600083015261568e81615652565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006156f16025836146be565b91506156fc82615695565b604082019050919050565b60006020820190508181036000830152615720816156e4565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b60006157836023836146be565b915061578e82615727565b604082019050919050565b600060208201905081810360008301526157b281615776565b9050919050565b7f5f7472616e736665723a3a205472616e736665722044656c617920656e61626c60008201527f65642e20204f6e6c79206f6e652070757263686173652070657220626c6f636b60208201527f20616c6c6f7765642e0000000000000000000000000000000000000000000000604082015250565b600061583b6049836146be565b9150615846826157b9565b606082019050919050565b6000602082019050818103600083015261586a8161582e565b9050919050565b7f5f7472616e736665723a3a20427579207472616e7366657220616d6f756e742060008201527f6578636565647320746865206d61785472616e73616374696f6e416d6f756e7460208201527f2e00000000000000000000000000000000000000000000000000000000000000604082015250565b60006158f36041836146be565b91506158fe82615871565b606082019050919050565b60006020820190508181036000830152615922816158e6565b9050919050565b7f5f7472616e736665723a3a204d61782077616c6c657420657863656564656400600082015250565b600061595f601f836146be565b915061596a82615929565b602082019050919050565b6000602082019050818103600083015261598e81615952565b9050919050565b7f5f7472616e736665723a3a2053656c6c207472616e7366657220616d6f756e7460008201527f206578636565647320746865206d61785472616e73616374696f6e416d6f756e60208201527f742e000000000000000000000000000000000000000000000000000000000000604082015250565b6000615a176042836146be565b9150615a2282615995565b606082019050919050565b60006020820190508181036000830152615a4681615a0a565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b6000615a83601f836146be565b9150615a8e82615a4d565b602082019050919050565b60006020820190508181036000830152615ab281615a76565b9050919050565b7f55736572206973206e6f74207374616b696e672e000000000000000000000000600082015250565b6000615aef6014836146be565b9150615afa82615ab9565b602082019050919050565b60006020820190508181036000830152615b1e81615ae2565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000615b816021836146be565b9150615b8c82615b25565b604082019050919050565b60006020820190508181036000830152615bb081615b74565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b6000615c136022836146be565b9150615c1e82615bb7565b604082019050919050565b60006020820190508181036000830152615c4281615c06565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b615cad81614793565b82525050565b6000615cbf8383615ca4565b60208301905092915050565b6000602082019050919050565b6000615ce382615c78565b615ced8185615c83565b9350615cf883615c94565b8060005b83811015615d29578151615d108882615cb3565b9750615d1b83615ccb565b925050600181019050615cfc565b5085935050505092915050565b600060a082019050615d4b600083018861487d565b615d586020830187614f5e565b8181036040830152615d6a8186615cd8565b9050615d796060830185614b84565b615d86608083018461487d565b9695505050505050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b6000615dec6026836146be565b9150615df782615d90565b604082019050919050565b60006020820190508181036000830152615e1b81615ddf565b905091905056fea2646970667358221220cc01fdcb1faa117219bcdfc2af65fa69310075a69fc5416d06165f38d6f1b7ec64736f6c634300080f0033

Deployed Bytecode

0x6080604052600436106102815760003560e01c8063715018a61161014f578063c0246668116100c1578063d5abeb011161007a578063d5abeb01146109be578063dd62ed3e146109e9578063df778d2614610a26578063f2fde38b14610a3d578063f7c618c114610a66578063f8b45b0514610a9157610288565b8063c0246668146108d4578063c69bebe4146108fd578063c8c8ebe414610926578063cef8513914610951578063d125ca181461097c578063d54ad2a11461099357610288565b80638baa63b2116101135780638baa63b21461078a5780638da5cb5b146107c757806395d89b41146107f2578063a39b21531461081d578063a457c2d71461085a578063a9059cbb1461089757610288565b8063715018a6146106dd57806372f702f3146106f4578063751039fc1461071f5780637b0472f014610736578063817b1cd21461075f57610288565b806335aa2e44116101f35780634a62bb65116101ac5780634a62bb65146105a55780634fbee193146105d057806357ded9c91461060d578063590654e9146106385780636ceb23a11461066357806370a08231146106a057610288565b806335aa2e4414610484578063379607f5146104c257806339509351146104eb5780633b51e5cf146105285780633dd5b2da146105515780634093e7d51461056857610288565b80632242908511610245578063224290851461037657806323b872dd1461039f578063245fc1ba146103dc578063293230b8146104195780632e17de7814610430578063313ce5671461045957610288565b806306fdde031461028d578063095ea7b3146102b857806313114a9d146102f557806318160ddd146103205780631cfff51b1461034b57610288565b3661028857005b600080fd5b34801561029957600080fd5b506102a2610abc565b6040516102af919061474c565b60405180910390f35b3480156102c457600080fd5b506102df60048036038101906102da9190614807565b610b4e565b6040516102ec9190614862565b60405180910390f35b34801561030157600080fd5b5061030a610b71565b604051610317919061488c565b60405180910390f35b34801561032c57600080fd5b50610335610b77565b604051610342919061488c565b60405180910390f35b34801561035757600080fd5b50610360610b81565b60405161036d9190614862565b60405180910390f35b34801561038257600080fd5b5061039d600480360381019061039891906148a7565b610b94565b005b3480156103ab57600080fd5b506103c660048036038101906103c191906148fa565b610c93565b6040516103d39190614862565b60405180910390f35b3480156103e857600080fd5b5061040360048036038101906103fe9190614807565b610cc2565b6040516104109190614862565b60405180910390f35b34801561042557600080fd5b5061042e610d6e565b005b34801561043c57600080fd5b506104576004803603810190610452919061494d565b61120e565b005b34801561046557600080fd5b5061046e6115ee565b60405161047b9190614996565b60405180910390f35b34801561049057600080fd5b506104ab60048036038101906104a6919061494d565b6115f7565b6040516104b99291906149b1565b60405180910390f35b3480156104ce57600080fd5b506104e960048036038101906104e4919061494d565b61162b565b005b3480156104f757600080fd5b50610512600480360381019061050d9190614807565b6118c7565b60405161051f9190614862565b60405180910390f35b34801561053457600080fd5b5061054f600480360381019061054a9190614a06565b611971565b005b34801561055d57600080fd5b50610566611a69565b005b34801561057457600080fd5b5061058f600480360381019061058a9190614807565b611ad4565b60405161059c919061488c565b60405180910390f35b3480156105b157600080fd5b506105ba611b6c565b6040516105c79190614862565b60405180910390f35b3480156105dc57600080fd5b506105f760048036038101906105f29190614a33565b611b7f565b6040516106049190614862565b60405180910390f35b34801561061957600080fd5b50610622611bd5565b60405161062f919061488c565b60405180910390f35b34801561064457600080fd5b5061064d611bdb565b60405161065a919061488c565b60405180910390f35b34801561066f57600080fd5b5061068a60048036038101906106859190614a33565b611be8565b6040516106979190614b62565b60405180910390f35b3480156106ac57600080fd5b506106c760048036038101906106c29190614a33565b611cf1565b6040516106d4919061488c565b60405180910390f35b3480156106e957600080fd5b506106f2611d39565b005b34801561070057600080fd5b50610709611dc1565b6040516107169190614b93565b60405180910390f35b34801561072b57600080fd5b50610734611de7565b005b34801561074257600080fd5b5061075d60048036038101906107589190614bae565b611edf565b005b34801561076b57600080fd5b50610774612217565b604051610781919061488c565b60405180910390f35b34801561079657600080fd5b506107b160048036038101906107ac919061494d565b61221d565b6040516107be9190614862565b60405180910390f35b3480156107d357600080fd5b506107dc6123d1565b6040516107e99190614b93565b60405180910390f35b3480156107fe57600080fd5b506108076123fb565b604051610814919061474c565b60405180910390f35b34801561082957600080fd5b50610844600480360381019061083f9190614807565b61248d565b604051610851919061488c565b60405180910390f35b34801561086657600080fd5b50610881600480360381019061087c9190614807565b6124eb565b60405161088e9190614862565b60405180910390f35b3480156108a357600080fd5b506108be60048036038101906108b99190614807565b6125d5565b6040516108cb9190614862565b60405180910390f35b3480156108e057600080fd5b506108fb60048036038101906108f69190614bee565b6125f8565b005b34801561090957600080fd5b50610924600480360381019061091f9190614a33565b61272e565b005b34801561093257600080fd5b5061093b61284d565b604051610948919061488c565b60405180910390f35b34801561095d57600080fd5b50610966612853565b604051610973919061488c565b60405180910390f35b34801561098857600080fd5b50610991612859565b005b34801561099f57600080fd5b506109a8612993565b6040516109b5919061488c565b60405180910390f35b3480156109ca57600080fd5b506109d3612999565b6040516109e0919061488c565b60405180910390f35b3480156109f557600080fd5b50610a106004803603810190610a0b9190614c2e565b61299f565b604051610a1d919061488c565b60405180910390f35b348015610a3257600080fd5b50610a3b612a26565b005b348015610a4957600080fd5b50610a646004803603810190610a5f9190614a33565b612b14565b005b348015610a7257600080fd5b50610a7b612c0b565b604051610a889190614b93565b60405180910390f35b348015610a9d57600080fd5b50610aa6612c31565b604051610ab3919061488c565b60405180910390f35b606060038054610acb90614c9d565b80601f0160208091040260200160405190810160405280929190818152602001828054610af790614c9d565b8015610b445780601f10610b1957610100808354040283529160200191610b44565b820191906000526020600020905b815481529060010190602001808311610b2757829003601f168201915b5050505050905090565b600080610b59612c4d565b9050610b66818585612c55565b600191505092915050565b600e5481565b6000600254905090565b601960009054906101000a900460ff1681565b610b9c612c4d565b73ffffffffffffffffffffffffffffffffffffffff16610bba6123d1565b73ffffffffffffffffffffffffffffffffffffffff1614610c10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0790614d1a565b60405180910390fd5b82600f819055508160108190555080601181905550601154601054600f54610c389190614d69565b610c429190614d69565b600e819055506006600e541115610c8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8590614e0b565b60405180910390fd5b505050565b600080610c9e612c4d565b9050610cab858285612e1e565b610cb6858585612eaa565b60019150509392505050565b60008273ffffffffffffffffffffffffffffffffffffffff16601f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b610d76612c4d565b73ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161480610e0a5750610dd4612c4d565b73ffffffffffffffffffffffffffffffffffffffff16610df26123d1565b73ffffffffffffffffffffffffffffffffffffffff16145b610e49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4090614e9d565b60405180910390fd5b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015610eb6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eda9190614ed2565b73ffffffffffffffffffffffffffffffffffffffff1663c9c6539630600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f63573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f879190614ed2565b6040518363ffffffff1660e01b8152600401610fa4929190614eff565b6020604051808303816000875af1158015610fc3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fe79190614ed2565b600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001601c6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601d6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061115030600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1661114b30611cf1565b612c55565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d719473061119930611cf1565b6000806111a46123d1565b426040518863ffffffff1660e01b81526004016111c696959493929190614f6d565b60606040518083038185885af11580156111e4573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906112099190614fe3565b505050565b6112183382610cc2565b611257576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124e90615082565b60405180910390fd5b60006112633383611ad4565b905060065461128282611274610b77565b61390a90919063ffffffff16565b10801561129b5750601960009054906101000a900460ff165b156113ff57602060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001429080600181540180825580915050600190039060005260206000200160009091909190915055602060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010181908060018154018082558091505060019003906000526020600020016000909190919091505580601a60008282546113849190614d69565b925050819055506113fa336113f583601f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008781526020019081526020016000206002015461390a90919063ffffffff16565b613920565b61145d565b61145c33601f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600085815260200190815260200160002060020154613920565b5b601f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002060020154602183815481106114c5576114c46150a2565b5b906000526020600020906002020160010160008282546114e591906150d1565b92505081905550601f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000838152602001908152602001600020600201546015600082825461155191906150d1565b92505081905550601f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000838152602001908152602001600020600080820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905560018201600090556002820160009055600382016000905550505050565b60006012905090565b6021818154811061160757600080fd5b90600052602060002090600202016000915090508060000154908060010154905082565b601960009054906101000a900460ff1661167a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167190615151565b60405180910390fd5b6116843382610cc2565b6116c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ba90615082565b60405180910390fd5b6006546116ce610b77565b111561170f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611706906151e3565b60405180910390fd5b600061171b3383611ad4565b9050602060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001429080600181540180825580915050600190039060005260206000200160009091909190915055602060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010181908060018154018082558091505060019003906000526020600020016000909190919091505580601a60008282546118019190614d69565b925050819055506118123382613920565b42601f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000848152602001908152602001600020600101819055506000601f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000848152602001908152602001600020600301819055505050565b6000806118d2612c4d565b9050611966818585600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546119619190614d69565b612c55565b600191505092915050565b611979612c4d565b73ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161480611a0d57506119d7612c4d565b73ffffffffffffffffffffffffffffffffffffffff166119f56123d1565b73ffffffffffffffffffffffffffffffffffffffff16145b611a4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4390614e9d565b60405180910390fd5b80601960006101000a81548160ff02191690831515021790555050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015611ad1573d6000803e3d6000fd5b50565b600080611ae18484613a7f565b90506000601f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008581526020019081526020016000206003015490506000811115611b6057611b57818361390a90919063ffffffff16565b92505050611b66565b81925050505b92915050565b600d60009054906101000a900460ff1681565b6000601b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60185481565b6000602180549050905090565b611bf0614699565b602060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060405180604001604052908160008201805480602002602001604051908101604052809291908181526020018280548015611c8957602002820191906000526020600020905b815481526020019060010190808311611c75575b5050505050815260200160018201805480602002602001604051908101604052809291908181526020018280548015611ce157602002820191906000526020600020905b815481526020019060010190808311611ccd575b5050505050815250509050919050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611d41612c4d565b73ffffffffffffffffffffffffffffffffffffffff16611d5f6123d1565b73ffffffffffffffffffffffffffffffffffffffff1614611db5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dac90614d1a565b60405180910390fd5b611dbf6000613c17565b565b601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611def612c4d565b73ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161480611e835750611e4d612c4d565b73ffffffffffffffffffffffffffffffffffffffff16611e6b6123d1565b73ffffffffffffffffffffffffffffffffffffffff16145b611ec2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eb990614e9d565b60405180910390fd5b6000600d60006101000a81548160ff021916908315150217905550565b601960009054906101000a900460ff16611f2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2590615151565b60405180910390fd5b600654611f39610b77565b1115611f7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f71906151e3565b60405180910390fd5b611f843382610cc2565b156120c35781601f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206002016000828254611fec9190614d69565b92505081905550611ffd3382613a7f565b601f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000838152602001908152602001600020600301600082825461205f9190614d69565b9250508190555042601f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000838152602001908152602001600020600101819055506121b4565b60405180608001604052803373ffffffffffffffffffffffffffffffffffffffff1681526020014281526020018381526020016000815250601f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015560408201518160020155606082015181600301559050505b81602182815481106121c9576121c86150a2565b5b906000526020600020906002020160010160008282546121e99190614d69565b9250508190555081601560008282546122029190614d69565b925050819055506122133383613cdd565b5050565b60155481565b6000612227612c4d565b73ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614806122bb5750612285612c4d565b73ffffffffffffffffffffffffffffffffffffffff166122a36123d1565b73ffffffffffffffffffffffffffffffffffffffff16145b6122fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122f190614e9d565b60405180910390fd5b620186a06001612308610b77565b6123129190615203565b61231c919061528c565b82101561235e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123559061532f565b60405180910390fd5b6103e8600561236b610b77565b6123759190615203565b61237f919061528c565b8211156123c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123b8906153c1565b60405180910390fd5b81600c8190555060019050919050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606004805461240a90614c9d565b80601f016020809104026020016040519081016040528092919081815260200182805461243690614c9d565b80156124835780601f1061245857610100808354040283529160200191612483565b820191906000526020600020905b81548152906001019060200180831161246657829003601f168201915b5050505050905090565b6000601f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002060020154905092915050565b6000806124f6612c4d565b90506000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050838110156125bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125b390615453565b60405180910390fd5b6125c98286868403612c55565b60019250505092915050565b6000806125e0612c4d565b90506125ed818585612eaa565b600191505092915050565b612600612c4d565b73ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161480612694575061265e612c4d565b73ffffffffffffffffffffffffffffffffffffffff1661267c6123d1565b73ffffffffffffffffffffffffffffffffffffffff16145b6126d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126ca90614e9d565b60405180910390fd5b80601b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b612736612c4d565b73ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614806127ca5750612794612c4d565b73ffffffffffffffffffffffffffffffffffffffff166127b26123d1565b73ffffffffffffffffffffffffffffffffffffffff16145b612809576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161280090614e9d565b60405180910390fd5b80600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600a5481565b600c5481565b612861612c4d565b73ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614806128f557506128bf612c4d565b73ffffffffffffffffffffffffffffffffffffffff166128dd6123d1565b73ffffffffffffffffffffffffffffffffffffffff16145b612934576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161292b90614e9d565b60405180910390fd5b600060405180604001604052804281526020016000815250905060218190806001815401808255809150506001900390600052602060002090600202016000909190919091506000820151816000015560208201518160010155505050565b601a5481565b60065481565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b612a2e612c4d565b73ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161480612ac25750612a8c612c4d565b73ffffffffffffffffffffffffffffffffffffffff16612aaa6123d1565b73ffffffffffffffffffffffffffffffffffffffff16145b612b01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612af890614e9d565b60405180910390fd5b612b12612b0d30611cf1565b613eb3565b565b612b1c612c4d565b73ffffffffffffffffffffffffffffffffffffffff16612b3a6123d1565b73ffffffffffffffffffffffffffffffffffffffff1614612b90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b8790614d1a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612bff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bf6906154e5565b60405180910390fd5b612c0881613c17565b50565b601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600b5481565b60008183612c4591906150d1565b905092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612cc4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cbb90615577565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612d33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d2a90615609565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051612e11919061488c565b60405180910390a3505050565b6000612e2a848461299f565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114612ea45781811015612e96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e8d90615675565b60405180910390fd5b612ea38484848403612c55565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612f19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f1090615707565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612f88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f7f90615799565b60405180910390fd5b60008103612fa157612f9c838360006140f6565b613905565b600d60009054906101000a900460ff161561352457612fbe6123d1565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415801561302c5750612ffc6123d1565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b8015613066575061dead73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b801561307f5750600860149054906101000a900460ff16155b156135235761308c6123d1565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141580156131155750600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b801561316f5750600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b1561323a5743601e60003273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054106131f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131ec90615851565b60405180910390fd5b43601e60003273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b601d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680156132dd5750601c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b1561338457600a54811115613327576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161331e90615909565b60405180910390fd5b600b5461333383611cf1565b8261333e9190614d69565b111561337f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161337690615975565b60405180910390fd5b613522565b601d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680156134275750601c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b1561347657600a54811115613471576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161346890615a2d565b60405180910390fd5b613521565b601c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661352057600b546134d383611cf1565b826134de9190614d69565b111561351f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161351690615975565b60405180910390fd5b5b5b5b5b5b600061352f30611cf1565b90506000600c5482101590508080156135555750600860149054906101000a900460ff16155b80156135ab5750601d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b80156136015750601b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b80156136575750601b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b1561369b576001600860146101000a81548160ff02191690831515021790555061367f614375565b6000600860146101000a81548160ff0219169083151502179055505b6000600860149054906101000a900460ff16159050601b60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806137515750601b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b806137fc5750601d60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161580156137fb5750601d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b5b1561380657600090505b600081156138f5576138366064613828600e548861456390919063ffffffff16565b61457990919063ffffffff16565b9050600e54601054826138499190615203565b613853919061528c565b601360008282546138649190614d69565b92505081905550600e546011548261387c9190615203565b613886919061528c565b601460008282546138979190614d69565b92505081905550600e54600f54826138af9190615203565b6138b9919061528c565b601260008282546138ca9190614d69565b9250508190555060008111156138e6576138e58730836140f6565b5b80856138f291906150d1565b94505b6139008787876140f6565b505050505b505050565b600081836139189190614d69565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361398f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161398690615a99565b60405180910390fd5b61399b6000838361458f565b80600260008282546139ad9190614d69565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613a029190614d69565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051613a67919061488c565b60405180910390a3613a7b60008383614594565b5050565b6000613a8b8383610cc2565b613aca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613ac190615b05565b60405180910390fd5b6000613ad6848461248d565b90506000613b416001601f60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008781526020019081526020016000206001015461457990919063ffffffff16565b90506000613b5960014261457990919063ffffffff16565b90506000613b708383612c3790919063ffffffff16565b90506000613b9c6064613b8e6018548861456390919063ffffffff16565b61457990919063ffffffff16565b90506000613bee603c613be0603c613bd26018613bc461016d8961457990919063ffffffff16565b61457990919063ffffffff16565b61457990919063ffffffff16565b61457990919063ffffffff16565b90506000613c05848361456390919063ffffffff16565b90508097505050505050505092915050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603613d4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613d4390615b97565b60405180910390fd5b613d588260008361458f565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015613dde576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613dd590615c29565b60405180910390fd5b8181036000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160026000828254613e3591906150d1565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051613e9a919061488c565b60405180910390a3613eae83600084614594565b505050565b6000600267ffffffffffffffff811115613ed057613ecf615c49565b5b604051908082528060200260200182016040528015613efe5781602001602082028036833780820191505090505b5090503081600081518110613f1657613f156150a2565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015613fbd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613fe19190614ed2565b81600181518110613ff557613ff46150a2565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505061405c30600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684612c55565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b81526004016140c0959493929190615d36565b600060405180830381600087803b1580156140da57600080fd5b505af11580156140ee573d6000803e3d6000fd5b505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603614165576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161415c90615707565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036141d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016141cb90615799565b60405180910390fd5b6141df83838361458f565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015614265576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161425c90615e02565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546142f89190614d69565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161435c919061488c565b60405180910390a361436f848484614594565b50505050565b600061438030611cf1565b905060006014546012546013546143979190614d69565b6143a19190614d69565b905060008214806143b25750600081145b156143be575050614561565b600c548211156143ce57600c5491505b6000600282601354856143e19190615203565b6143eb919061528c565b6143f5919061528c565b9050600061440c8285612c3790919063ffffffff16565b9050600047905061441c82613eb3565b60006144318247612c3790919063ffffffff16565b9050600061445c8661444e6012548561456390919063ffffffff16565b61457990919063ffffffff16565b90506000614487876144796014548661456390919063ffffffff16565b61457990919063ffffffff16565b9050600081838561449891906150d1565b6144a291906150d1565b9050600060138190555060006012819055506000601481905550600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc61450b848661390a90919063ffffffff16565b9081150290604051600060405180830381858888f19350505050158015614536573d6000803e3d6000fd5b506000871180156145475750600081115b15614557576145568782614599565b5b5050505050505050505b565b600081836145719190615203565b905092915050565b60008183614587919061528c565b905092915050565b505050565b505050565b6145c630600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684612c55565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d719823085600080600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16426040518863ffffffff1660e01b815260040161464f96959493929190614f6d565b60606040518083038185885af115801561466d573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906146929190614fe3565b5050505050565b604051806040016040528060608152602001606081525090565b600081519050919050565b600082825260208201905092915050565b60005b838110156146ed5780820151818401526020810190506146d2565b838111156146fc576000848401525b50505050565b6000601f19601f8301169050919050565b600061471e826146b3565b61472881856146be565b93506147388185602086016146cf565b61474181614702565b840191505092915050565b600060208201905081810360008301526147668184614713565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061479e82614773565b9050919050565b6147ae81614793565b81146147b957600080fd5b50565b6000813590506147cb816147a5565b92915050565b6000819050919050565b6147e4816147d1565b81146147ef57600080fd5b50565b600081359050614801816147db565b92915050565b6000806040838503121561481e5761481d61476e565b5b600061482c858286016147bc565b925050602061483d858286016147f2565b9150509250929050565b60008115159050919050565b61485c81614847565b82525050565b60006020820190506148776000830184614853565b92915050565b614886816147d1565b82525050565b60006020820190506148a1600083018461487d565b92915050565b6000806000606084860312156148c0576148bf61476e565b5b60006148ce868287016147f2565b93505060206148df868287016147f2565b92505060406148f0868287016147f2565b9150509250925092565b6000806000606084860312156149135761491261476e565b5b6000614921868287016147bc565b9350506020614932868287016147bc565b9250506040614943868287016147f2565b9150509250925092565b6000602082840312156149635761496261476e565b5b6000614971848285016147f2565b91505092915050565b600060ff82169050919050565b6149908161497a565b82525050565b60006020820190506149ab6000830184614987565b92915050565b60006040820190506149c6600083018561487d565b6149d3602083018461487d565b9392505050565b6149e381614847565b81146149ee57600080fd5b50565b600081359050614a00816149da565b92915050565b600060208284031215614a1c57614a1b61476e565b5b6000614a2a848285016149f1565b91505092915050565b600060208284031215614a4957614a4861476e565b5b6000614a57848285016147bc565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b614a95816147d1565b82525050565b6000614aa78383614a8c565b60208301905092915050565b6000602082019050919050565b6000614acb82614a60565b614ad58185614a6b565b9350614ae083614a7c565b8060005b83811015614b11578151614af88882614a9b565b9750614b0383614ab3565b925050600181019050614ae4565b5085935050505092915050565b60006040830160008301518482036000860152614b3b8282614ac0565b91505060208301518482036020860152614b558282614ac0565b9150508091505092915050565b60006020820190508181036000830152614b7c8184614b1e565b905092915050565b614b8d81614793565b82525050565b6000602082019050614ba86000830184614b84565b92915050565b60008060408385031215614bc557614bc461476e565b5b6000614bd3858286016147f2565b9250506020614be4858286016147f2565b9150509250929050565b60008060408385031215614c0557614c0461476e565b5b6000614c13858286016147bc565b9250506020614c24858286016149f1565b9150509250929050565b60008060408385031215614c4557614c4461476e565b5b6000614c53858286016147bc565b9250506020614c64858286016147bc565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680614cb557607f821691505b602082108103614cc857614cc7614c6e565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614d046020836146be565b9150614d0f82614cce565b602082019050919050565b60006020820190508181036000830152614d3381614cf7565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614d74826147d1565b9150614d7f836147d1565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614db457614db3614d3a565b5b828201905092915050565b7f4d757374206b6565702066656573206174203625206f72206c65737300000000600082015250565b6000614df5601c836146be565b9150614e0082614dbf565b602082019050919050565b60006020820190508181036000830152614e2481614de8565b9050919050565b7f43616c6c6572206973206e6f7420746865205f7377617046656552656365697660008201527f65722061646472657373206e6f72206f776e65722e0000000000000000000000602082015250565b6000614e876035836146be565b9150614e9282614e2b565b604082019050919050565b60006020820190508181036000830152614eb681614e7a565b9050919050565b600081519050614ecc816147a5565b92915050565b600060208284031215614ee857614ee761476e565b5b6000614ef684828501614ebd565b91505092915050565b6000604082019050614f146000830185614b84565b614f216020830184614b84565b9392505050565b6000819050919050565b6000819050919050565b6000614f57614f52614f4d84614f28565b614f32565b6147d1565b9050919050565b614f6781614f3c565b82525050565b600060c082019050614f826000830189614b84565b614f8f602083018861487d565b614f9c6040830187614f5e565b614fa96060830186614f5e565b614fb66080830185614b84565b614fc360a083018461487d565b979650505050505050565b600081519050614fdd816147db565b92915050565b600080600060608486031215614ffc57614ffb61476e565b5b600061500a86828701614fce565b935050602061501b86828701614fce565b925050604061502c86828701614fce565b9150509250925092565b7f596f7520617265206e6f74207374616b696e67213f0000000000000000000000600082015250565b600061506c6015836146be565b915061507782615036565b602082019050919050565b6000602082019050818103600083015261509b8161505f565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006150dc826147d1565b91506150e7836147d1565b9250828210156150fa576150f9614d3a565b5b828203905092915050565b7f5374616b696e67206973206e6f7420656e61626c65642e000000000000000000600082015250565b600061513b6017836146be565b915061514682615105565b602082019050919050565b6000602082019050818103600083015261516a8161512e565b9050919050565b7f546865726520617265206e6f206d6f72652072657761726473206c656674207460008201527f6f20626520636c61696d65642e00000000000000000000000000000000000000602082015250565b60006151cd602d836146be565b91506151d882615171565b604082019050919050565b600060208201905081810360008301526151fc816151c0565b9050919050565b600061520e826147d1565b9150615219836147d1565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561525257615251614d3a565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000615297826147d1565b91506152a2836147d1565b9250826152b2576152b161525d565b5b828204905092915050565b7f53776170207468726573686f6c642063616e6e6f74206265206c6f776572207460008201527f68616e20302e3030312520746f74616c20737570706c792e0000000000000000602082015250565b60006153196038836146be565b9150615324826152bd565b604082019050919050565b600060208201905081810360008301526153488161530c565b9050919050565b7f53776170207468726573686f6c642063616e6e6f74206265206869676865722060008201527f7468616e20302e352520746f74616c20737570706c792e000000000000000000602082015250565b60006153ab6037836146be565b91506153b68261534f565b604082019050919050565b600060208201905081810360008301526153da8161539e565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b600061543d6025836146be565b9150615448826153e1565b604082019050919050565b6000602082019050818103600083015261546c81615430565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006154cf6026836146be565b91506154da82615473565b604082019050919050565b600060208201905081810360008301526154fe816154c2565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006155616024836146be565b915061556c82615505565b604082019050919050565b6000602082019050818103600083015261559081615554565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006155f36022836146be565b91506155fe82615597565b604082019050919050565b60006020820190508181036000830152615622816155e6565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b600061565f601d836146be565b915061566a82615629565b602082019050919050565b6000602082019050818103600083015261568e81615652565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006156f16025836146be565b91506156fc82615695565b604082019050919050565b60006020820190508181036000830152615720816156e4565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b60006157836023836146be565b915061578e82615727565b604082019050919050565b600060208201905081810360008301526157b281615776565b9050919050565b7f5f7472616e736665723a3a205472616e736665722044656c617920656e61626c60008201527f65642e20204f6e6c79206f6e652070757263686173652070657220626c6f636b60208201527f20616c6c6f7765642e0000000000000000000000000000000000000000000000604082015250565b600061583b6049836146be565b9150615846826157b9565b606082019050919050565b6000602082019050818103600083015261586a8161582e565b9050919050565b7f5f7472616e736665723a3a20427579207472616e7366657220616d6f756e742060008201527f6578636565647320746865206d61785472616e73616374696f6e416d6f756e7460208201527f2e00000000000000000000000000000000000000000000000000000000000000604082015250565b60006158f36041836146be565b91506158fe82615871565b606082019050919050565b60006020820190508181036000830152615922816158e6565b9050919050565b7f5f7472616e736665723a3a204d61782077616c6c657420657863656564656400600082015250565b600061595f601f836146be565b915061596a82615929565b602082019050919050565b6000602082019050818103600083015261598e81615952565b9050919050565b7f5f7472616e736665723a3a2053656c6c207472616e7366657220616d6f756e7460008201527f206578636565647320746865206d61785472616e73616374696f6e416d6f756e60208201527f742e000000000000000000000000000000000000000000000000000000000000604082015250565b6000615a176042836146be565b9150615a2282615995565b606082019050919050565b60006020820190508181036000830152615a4681615a0a565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b6000615a83601f836146be565b9150615a8e82615a4d565b602082019050919050565b60006020820190508181036000830152615ab281615a76565b9050919050565b7f55736572206973206e6f74207374616b696e672e000000000000000000000000600082015250565b6000615aef6014836146be565b9150615afa82615ab9565b602082019050919050565b60006020820190508181036000830152615b1e81615ae2565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000615b816021836146be565b9150615b8c82615b25565b604082019050919050565b60006020820190508181036000830152615bb081615b74565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b6000615c136022836146be565b9150615c1e82615bb7565b604082019050919050565b60006020820190508181036000830152615c4281615c06565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b615cad81614793565b82525050565b6000615cbf8383615ca4565b60208301905092915050565b6000602082019050919050565b6000615ce382615c78565b615ced8185615c83565b9350615cf883615c94565b8060005b83811015615d29578151615d108882615cb3565b9750615d1b83615ccb565b925050600181019050615cfc565b5085935050505092915050565b600060a082019050615d4b600083018861487d565b615d586020830187614f5e565b8181036040830152615d6a8186615cd8565b9050615d796060830185614b84565b615d86608083018461487d565b9695505050505050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b6000615dec6026836146be565b9150615df782615d90565b604082019050919050565b60006020820190508181036000830152615e1b81615ddf565b905091905056fea2646970667358221220cc01fdcb1faa117219bcdfc2af65fa69310075a69fc5416d06165f38d6f1b7ec64736f6c634300080f0033

Deployed Bytecode Sourcemap

18157:17262:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1633:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2565:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18649:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1954:108;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19074:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23235:368;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2774:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30678:163;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22145:638;;;;;;;;;;;;;:::i;:::-;;34013:818;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1853:93;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20133:29;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;33312:618;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3077:240;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35280:99;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30218:116;;;;;;;;;;;;;:::i;:::-;;31344:352;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18607:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24477:127;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19047:18;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35115:103;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31141:131;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2070:127;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14995:103;;;;;;;;;;;;;:::i;:::-;;18980:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22865:86;;;;;;;;;;;;;:::i;:::-;;32453:774;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18947:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23979:404;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14772:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1741:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30913:145;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3325:438;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2205:193;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23017:134;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23692:114;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18481:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18556:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34887:162;;;;;;;;;;;;;:::i;:::-;;19115:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18232:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2406:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30427:104;;;;;;;;;;;;;:::i;:::-;;15106:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19014:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18523:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1633:100;1687:13;1720:5;1713:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1633:100;:::o;2565:201::-;2648:4;2665:13;2681:12;:10;:12::i;:::-;2665:28;;2704:32;2713:5;2720:7;2729:6;2704:8;:32::i;:::-;2754:4;2747:11;;;2565:201;;;;:::o;18649:24::-;;;;:::o;1954:108::-;2015:7;2042:12;;2035:19;;1954:108;:::o;19074:34::-;;;;;;;;;;;;;:::o;23235:368::-;14918:12;:10;:12::i;:::-;14907:23;;:7;:5;:7::i;:::-;:23;;;14899:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;23367:12:::1;23351:13;:28;;;;23406:12;23390:13;:28;;;;23445:12;23429:13;:28;;;;23514:13;;23498;;23482;;:29;;;;:::i;:::-;:45;;;;:::i;:::-;23470:9;:57;;;;23561:1;23548:9;;:14;;23540:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;23235:368:::0;;;:::o;2774:295::-;2905:4;2922:15;2940:12;:10;:12::i;:::-;2922:30;;2963:38;2979:4;2985:7;2994:6;2963:15;:38::i;:::-;3012:27;3022:4;3028:2;3032:6;3012:9;:27::i;:::-;3057:4;3050:11;;;2774:295;;;;;:::o;30678:163::-;30757:4;30823:10;30781:52;;:8;:20;30790:10;30781:20;;;;;;;;;;;;;;;:31;30802:9;30781:31;;;;;;;;;;;:38;;;;;;;;;;;;:52;;;30774:59;;30678:163;;;;:::o;22145:638::-;20328:12;:10;:12::i;:::-;20308:32;;:16;;;;;;;;;;;:32;;;:59;;;;20355:12;:10;:12::i;:::-;20344:23;;:7;:5;:7::i;:::-;:23;;;20308:59;20300:125;;;;;;;;;;;;:::i;:::-;;;;;;;;;22235:15:::1;;;;;;;;;;;:23;;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22217:55;;;22281:4;22288:15;;;;;;;;;;;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22217:94;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22201:13;;:110;;;;;;;;;;;;;;;;;;22380:4;22322:31;:55;22362:13;;;;;;;;;;;22322:55;;;;;;;;;;;;;;;;:62;;;;;;;;;;;;;;;;;;22448:4;22395:26;:50;22430:13;;;;;;;;;;;22395:50;;;;;;;;;;;;;;;;:57;;;;;;;;;;;;;;;;;;22465:75;22482:4;22497:15;;;;;;;;;;;22515:24;22533:4;22515:9;:24::i;:::-;22465:8;:75::i;:::-;22551:15;;;;;;;;;;;:31;;;22590:21;22636:4;22656:24;22674:4;22656:9;:24::i;:::-;22695:1;22711::::0;22727:7:::1;:5;:7::i;:::-;22749:15;22551:224;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;22145:638::o:0;34013:818::-;34077:32;34087:10;34099:9;34077;:32::i;:::-;34069:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;34148:14;34165:33;34176:10;34188:9;34165:10;:33::i;:::-;34148:50;;34243:9;;34215:25;34233:6;34215:13;:11;:13::i;:::-;:17;;:25;;;;:::i;:::-;:37;:55;;;;;34256:14;;;;;;;;;;;34215:55;34211:415;;;34287:13;:25;34301:10;34287:25;;;;;;;;;;;;;;;:31;;34324:15;34287:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34355:13;:25;34369:10;34355:25;;;;;;;;;;;;;;;:33;;34394:6;34355:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34432:6;34416:12;;:22;;;;;;;:::i;:::-;;;;;;;;34455:69;34461:10;34473:50;34516:6;34473:8;:20;34482:10;34473:20;;;;;;;;;;;;;;;:31;34494:9;34473:31;;;;;;;;;;;:38;;;:42;;:50;;;;:::i;:::-;34455:5;:69::i;:::-;34211:415;;;34557:57;34563:10;34575:8;:20;34584:10;34575:20;;;;;;;;;;;;;;;:31;34596:9;34575:31;;;;;;;;;;;:38;;;34557:5;:57::i;:::-;34211:415;34670:8;:20;34679:10;34670:20;;;;;;;;;;;;;;;:31;34691:9;34670:31;;;;;;;;;;;:38;;;34638:10;34649:9;34638:21;;;;;;;;:::i;:::-;;;;;;;;;;;;:28;;;:70;;;;;;;:::i;:::-;;;;;;;;34734:8;:20;34743:10;34734:20;;;;;;;;;;;;;;;:31;34755:9;34734:31;;;;;;;;;;;:38;;;34719:11;;:53;;;;;;;:::i;:::-;;;;;;;;34792:8;:20;34801:10;34792:20;;;;;;;;;;;;;;;:31;34813:9;34792:31;;;;;;;;;;;;34785:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34058:773;34013:818;:::o;1853:93::-;1911:5;1936:2;1929:9;;1853:93;:::o;20133:29::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;33312:618::-;20500:14;;;;;;;;;;;20492:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;33391:32:::1;33401:10;33413:9;33391;:32::i;:::-;33383:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;33485:9;;33468:13;:11;:13::i;:::-;:26;;33460:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;33557:14;33574:33;33585:10;33597:9;33574:10;:33::i;:::-;33557:50;;33620:13;:25;33634:10;33620:25;;;;;;;;;;;;;;;:31;;33657:15;33620:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33684:13;:25;33698:10;33684:25;;;;;;;;;;;;;;;:33;;33723:6;33684:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33757:6;33741:12;;:22;;;;;;;:::i;:::-;;;;;;;;33776:25;33782:10;33794:6;33776:5;:25::i;:::-;33854:15;33814:8;:20;33823:10;33814:20;;;;;;;;;;;;;;;:31;33835:9;33814:31;;;;;;;;;;;:37;;:55;;;;33921:1;33880:8;:20;33889:10;33880:20;;;;;;;;;;;;;;;:31;33901:9;33880:31;;;;;;;;;;;:38;;:42;;;;33372:558;33312:618:::0;:::o;3077:240::-;3165:4;3182:13;3198:12;:10;:12::i;:::-;3182:28;;3221:66;3230:5;3237:7;3276:10;3246:11;:18;3258:5;3246:18;;;;;;;;;;;;;;;:27;3265:7;3246:27;;;;;;;;;;;;;;;;:40;;;;:::i;:::-;3221:8;:66::i;:::-;3305:4;3298:11;;;3077:240;;;;:::o;35280:99::-;20328:12;:10;:12::i;:::-;20308:32;;:16;;;;;;;;;;;:32;;;:59;;;;20355:12;:10;:12::i;:::-;20344:23;;:7;:5;:7::i;:::-;:23;;;20308:59;20300:125;;;;;;;;;;;;:::i;:::-;;;;;;;;;35366:5:::1;35349:14;;:22;;;;;;;;;;;;;;;;;;35280:99:::0;:::o;30218:116::-;30277:16;;;;;;;;;;;30269:34;;:57;30304:21;30269:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30218:116::o;31344:352::-;31420:7;31440:23;31466:30;31478:6;31486:9;31466:11;:30::i;:::-;31440:56;;31507:24;31534:8;:20;31543:10;31534:20;;;;;;;;;;;;;;;:31;31555:9;31534:31;;;;;;;;;;;:38;;;31507:65;;31608:1;31589:16;:20;31585:70;;;31618:37;31638:16;31618:15;:19;;:37;;;;:::i;:::-;31611:44;;;;;;31585:70;31673:15;31666:22;;;;31344:352;;;;;:::o;18607:33::-;;;;;;;;;;;;;:::o;24477:127::-;24544:4;24568:19;:28;24588:7;24568:28;;;;;;;;;;;;;;;;;;;;;;;;;24561:35;;24477:127;;;:::o;19047:18::-;;;;:::o;35115:103::-;35166:7;35193:10;:17;;;;35186:24;;35115:103;:::o;31141:131::-;31204:19;;:::i;:::-;31243:13;:21;31257:6;31243:21;;;;;;;;;;;;;;;31236:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31141:131;;;:::o;2070:127::-;2144:7;2171:9;:18;2181:7;2171:18;;;;;;;;;;;;;;;;2164:25;;2070:127;;;:::o;14995:103::-;14918:12;:10;:12::i;:::-;14907:23;;:7;:5;:7::i;:::-;:23;;;14899:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;15060:30:::1;15087:1;15060:18;:30::i;:::-;14995:103::o:0;18980:27::-;;;;;;;;;;;;;:::o;22865:86::-;20328:12;:10;:12::i;:::-;20308:32;;:16;;;;;;;;;;;:32;;;:59;;;;20355:12;:10;:12::i;:::-;20344:23;;:7;:5;:7::i;:::-;:23;;;20308:59;20300:125;;;;;;;;;;;;:::i;:::-;;;;;;;;;22938:5:::1;22921:14;;:22;;;;;;;;;;;;;;;;;;22865:86::o:0;32453:774::-;20500:14;;;;;;;;;;;20492:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;32570:9:::1;;32553:13;:11;:13::i;:::-;:26;;32545:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;32693:32;32703:10;32715:9;32693;:32::i;:::-;32689:397;;;32784:11;32742:8;:20;32751:10;32742:20;;;;;;;;;;;;;;;:31;32763:9;32742:31;;;;;;;;;;;:38;;;:53;;;;;;;:::i;:::-;;;;;;;;32852:34;32864:10;32876:9;32852:11;:34::i;:::-;32810:8;:20;32819:10;32810:20;;;;;;;;;;;;;;;:31;32831:9;32810:31;;;;;;;;;;;:38;;;:76;;;;;;;:::i;:::-;;;;;;;;32941:15;32901:8;:20;32910:10;32901:20;;;;;;;;;;;;;;;:31;32922:9;32901:31;;;;;;;;;;;:37;;:55;;;;32689:397;;;33023:51;;;;;;;;33030:10;33023:51;;;;;;33042:15;33023:51;;;;33059:11;33023:51;;;;33072:1;33023:51;;::::0;32989:8:::1;:20;32998:10;32989:20;;;;;;;;;;;;;;;:31;33010:9;32989:31;;;;;;;;;;;:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32689:397;33130:11;33098:10;33109:9;33098:21;;;;;;;;:::i;:::-;;;;;;;;;;;;:28;;;:43;;;;;;;:::i;:::-;;;;;;;;33167:11;33152;;:26;;;;;;;:::i;:::-;;;;;;;;33189:30;33195:10;33207:11;33189:5;:30::i;:::-;32453:774:::0;;:::o;18947:26::-;;;;:::o;23979:404::-;24066:4;20328:12;:10;:12::i;:::-;20308:32;;:16;;;;;;;;;;;:32;;;:59;;;;20355:12;:10;:12::i;:::-;20344:23;;:7;:5;:7::i;:::-;:23;;;20308:59;20300:125;;;;;;;;;;;;:::i;:::-;;;;;;;;;24126:6:::1;24122:1;24106:13;:11;:13::i;:::-;:17;;;;:::i;:::-;:26;;;;:::i;:::-;24090:12;:42;;24082:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;24247:4;24243:1;24227:13;:11;:13::i;:::-;:17;;;;:::i;:::-;:24;;;;:::i;:::-;24211:12;:40;;24203:108;;;;;;;;;;;;:::i;:::-;;;;;;;;;24343:12;24321:19;:34;;;;24372:4;24365:11;;23979:404:::0;;;:::o;14772:87::-;14818:7;14845:6;;;;;;;;;;;14838:13;;14772:87;:::o;1741:104::-;1797:13;1830:7;1823:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1741:104;:::o;30913:145::-;30989:7;31016:8;:16;31025:6;31016:16;;;;;;;;;;;;;;;:27;31033:9;31016:27;;;;;;;;;;;:34;;;31009:41;;30913:145;;;;:::o;3325:438::-;3418:4;3435:13;3451:12;:10;:12::i;:::-;3435:28;;3474:24;3501:11;:18;3513:5;3501:18;;;;;;;;;;;;;;;:27;3520:7;3501:27;;;;;;;;;;;;;;;;3474:54;;3567:15;3547:16;:35;;3539:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;3660:60;3669:5;3676:7;3704:15;3685:16;:34;3660:8;:60::i;:::-;3751:4;3744:11;;;;3325:438;;;;:::o;2205:193::-;2284:4;2301:13;2317:12;:10;:12::i;:::-;2301:28;;2340;2350:5;2357:2;2361:6;2340:9;:28::i;:::-;2386:4;2379:11;;;2205:193;;;;:::o;23017:134::-;20328:12;:10;:12::i;:::-;20308:32;;:16;;;;;;;;;;;:32;;;:59;;;;20355:12;:10;:12::i;:::-;20344:23;;:7;:5;:7::i;:::-;:23;;;20308:59;20300:125;;;;;;;;;;;;:::i;:::-;;;;;;;;;23135:8:::1;23104:19;:28;23124:7;23104:28;;;;;;;;;;;;;;;;:39;;;;;;;;;;;;;;;;;;23017:134:::0;;:::o;23692:114::-;20328:12;:10;:12::i;:::-;20308:32;;:16;;;;;;;;;;;:32;;;:59;;;;20355:12;:10;:12::i;:::-;20344:23;;:7;:5;:7::i;:::-;:23;;;20308:59;20300:125;;;;;;;;;;;;:::i;:::-;;;;;;;;;23789:9:::1;23770:16;;:28;;;;;;;;;;;;;;;;;;23692:114:::0;:::o;18481:35::-;;;;:::o;18556:34::-;;;;:::o;34887:162::-;20328:12;:10;:12::i;:::-;20308:32;;:16;;;;;;;;;;;:32;;;:59;;;;20355:12;:10;:12::i;:::-;20344:23;;:7;:5;:7::i;:::-;:23;;;20308:59;20300:125;;;;;;;;;;;;:::i;:::-;;;;;;;;;34946:26:::1;34975:29;;;;;;;;34985:15;34975:29;;;;35002:1;34975:29;;::::0;34946:58:::1;;35015:10;35031:9;35015:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34935:114;34887:162::o:0;19115:27::-;;;;:::o;18232:24::-;;;;:::o;2406:151::-;2495:7;2522:11;:18;2534:5;2522:18;;;;;;;;;;;;;;;:27;2541:7;2522:27;;;;;;;;;;;;;;;;2515:34;;2406:151;;;;:::o;30427:104::-;20328:12;:10;:12::i;:::-;20308:32;;:16;;;;;;;;;;;:32;;;:59;;;;20355:12;:10;:12::i;:::-;20344:23;;:7;:5;:7::i;:::-;:23;;;20308:59;20300:125;;;;;;;;;;;;:::i;:::-;;;;;;;;;30480:43:::1;30498:24;30516:4;30498:9;:24::i;:::-;30480:17;:43::i;:::-;30427:104::o:0;15106:201::-;14918:12;:10;:12::i;:::-;14907:23;;:7;:5;:7::i;:::-;:23;;;14899:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;15215:1:::1;15195:22;;:8;:22;;::::0;15187:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;15271:28;15290:8;15271:18;:28::i;:::-;15106:201:::0;:::o;19014:26::-;;;;;;;;;;;;;:::o;18523:24::-;;;;:::o;16992:98::-;17050:7;17081:1;17077;:5;;;;:::i;:::-;17070:12;;16992:98;;;;:::o;95:::-;148:7;175:10;168:17;;95:98;:::o;5456:380::-;5609:1;5592:19;;:5;:19;;;5584:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5690:1;5671:21;;:7;:21;;;5663:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5774:6;5744:11;:18;5756:5;5744:18;;;;;;;;;;;;;;;:27;5763:7;5744:27;;;;;;;;;;;;;;;:36;;;;5812:7;5796:32;;5805:5;5796:32;;;5821:6;5796:32;;;;;;:::i;:::-;;;;;;;;5456:380;;;:::o;5844:453::-;5979:24;6006:25;6016:5;6023:7;6006:9;:25::i;:::-;5979:52;;6066:17;6046:16;:37;6042:248;;6128:6;6108:16;:26;;6100:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6212:51;6221:5;6228:7;6256:6;6237:16;:25;6212:8;:51::i;:::-;6042:248;5968:329;5844:453;;;:::o;24612:3205::-;24760:1;24744:18;;:4;:18;;;24736:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;24837:1;24823:16;;:2;:16;;;24815:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;24914:1;24904:6;:11;24900:93;;24932:28;24948:4;24954:2;24958:1;24932:15;:28::i;:::-;24975:7;;24900:93;25051:14;;;;;;;;;;;25047:1440;;;25112:7;:5;:7::i;:::-;25104:15;;:4;:15;;;;:49;;;;;25146:7;:5;:7::i;:::-;25140:13;;:2;:13;;;;25104:49;:91;;;;;25188:6;25174:21;;:2;:21;;;;25104:91;:122;;;;;25217:9;;;;;;;;;;;25216:10;25104:122;25082:1394;;;25271:7;:5;:7::i;:::-;25265:13;;:2;:13;;;;:47;;;;;25296:15;;;;;;;;;;;25282:30;;:2;:30;;;;25265:47;:79;;;;;25330:13;;;;;;;;;;;25316:28;;:2;:28;;;;25265:79;25261:336;;;25414:12;25376:24;:35;25401:9;25376:35;;;;;;;;;;;;;;;;:50;25368:136;;;;;;;;;;;;:::i;:::-;;;;;;;;;25565:12;25527:24;:35;25552:9;25527:35;;;;;;;;;;;;;;;:50;;;;25261:336;25648:26;:32;25675:4;25648:32;;;;;;;;;;;;;;;;;;;;;;;;;:72;;;;;25685:31;:35;25717:2;25685:35;;;;;;;;;;;;;;;;;;;;;;;;;25684:36;25648:72;25644:817;;;25763:20;;25753:6;:30;;25745:108;;;;;;;;;;;;:::i;:::-;;;;;;;;;25910:9;;25893:13;25903:2;25893:9;:13::i;:::-;25884:6;:22;;;;:::i;:::-;:35;;25876:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;25644:817;;;26048:26;:30;26075:2;26048:30;;;;;;;;;;;;;;;;;;;;;;;;;:72;;;;;26083:31;:37;26115:4;26083:37;;;;;;;;;;;;;;;;;;;;;;;;;26082:38;26048:72;26044:417;;;26163:20;;26153:6;:30;;26145:109;;;;;;;;;;;;:::i;:::-;;;;;;;;;26044:417;;;26302:31;:35;26334:2;26302:35;;;;;;;;;;;;;;;;;;;;;;;;;26297:164;;26396:9;;26379:13;26389:2;26379:9;:13::i;:::-;26370:6;:22;;;;:::i;:::-;:35;;26362:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;26297:164;26044:417;25644:817;25082:1394;25047:1440;26501:28;26532:24;26550:4;26532:9;:24::i;:::-;26501:55;;26567:12;26606:19;;26582:20;:43;;26567:58;;26654:7;:34;;;;;26679:9;;;;;;;;;;;26678:10;26654:34;:84;;;;;26706:26;:32;26733:4;26706:32;;;;;;;;;;;;;;;;;;;;;;;;;26705:33;26654:84;:127;;;;;26756:19;:25;26776:4;26756:25;;;;;;;;;;;;;;;;;;;;;;;;;26755:26;26654:127;:168;;;;;26799:19;:23;26819:2;26799:23;;;;;;;;;;;;;;;;;;;;;;;;;26798:24;26654:168;26636:298;;;26861:4;26849:9;;:16;;;;;;;;;;;;;;;;;;26880:10;:8;:10::i;:::-;26917:5;26905:9;;:17;;;;;;;;;;;;;;;;;;26636:298;26946:12;26962:9;;;;;;;;;;;26961:10;26946:25;;27092:19;:25;27112:4;27092:25;;;;;;;;;;;;;;;;;;;;;;;;;:66;;;;27135:19;:23;27155:2;27135:23;;;;;;;;;;;;;;;;;;;;;;;;;27092:66;:154;;;;27178:26;:32;27205:4;27178:32;;;;;;;;;;;;;;;;;;;;;;;;;27177:33;:68;;;;;27215:26;:30;27242:2;27215:30;;;;;;;;;;;;;;;;;;;;;;;;;27214:31;27177:68;27092:154;27074:199;;;27268:5;27258:15;;27074:199;27294:12;27325:7;27321:443;;;27356:30;27382:3;27356:21;27367:9;;27356:6;:10;;:21;;;;:::i;:::-;:25;;:30;;;;:::i;:::-;27349:37;;27447:9;;27431:13;;27424:4;:20;;;;:::i;:::-;:32;;;;:::i;:::-;27401:19;;:55;;;;;;;:::i;:::-;;;;;;;;27517:9;;27501:13;;27494:4;:20;;;;:::i;:::-;:32;;;;:::i;:::-;27471:19;;:55;;;;;;;:::i;:::-;;;;;;;;27587:9;;27571:13;;27564:4;:20;;;;:::i;:::-;:32;;;;:::i;:::-;27541:19;;:55;;;;;;;:::i;:::-;;;;;;;;27636:1;27629:4;:8;27625:91;;;27658:42;27674:4;27688;27695;27658:15;:42::i;:::-;27625:91;27748:4;27738:14;;;;;:::i;:::-;;;27321:443;27776:33;27792:4;27798:2;27802:6;27776:15;:33::i;:::-;24725:3092;;;;24612:3205;;;;:::o;16886:98::-;16944:7;16975:1;16971;:5;;;;:::i;:::-;16964:12;;16886:98;;;;:::o;4450:399::-;4553:1;4534:21;;:7;:21;;;4526:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;4604:49;4633:1;4637:7;4646:6;4604:20;:49::i;:::-;4682:6;4666:12;;:22;;;;;;;:::i;:::-;;;;;;;;4721:6;4699:9;:18;4709:7;4699:18;;;;;;;;;;;;;;;;:28;;;;;;;:::i;:::-;;;;;;;;4764:7;4743:37;;4760:1;4743:37;;;4773:6;4743:37;;;;;;:::i;:::-;;;;;;;;4793:48;4821:1;4825:7;4834:6;4793:19;:48::i;:::-;4450:399;;:::o;31704:685::-;31782:7;31810:28;31820:6;31828:9;31810;:28::i;:::-;31802:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;31876:14;31893:29;31904:6;31912:9;31893:10;:29::i;:::-;31876:46;;31933:29;31965:48;32003:9;31965:8;:16;31974:6;31965:16;;;;;;;;;;;;;;;:27;31982:9;31965:27;;;;;;;;;;;:33;;;:37;;:48;;;;:::i;:::-;31933:80;;32024:31;32058:30;32078:9;32058:15;:19;;:30;;;;:::i;:::-;32024:64;;32099:21;32123:50;32151:21;32123:23;:27;;:50;;;;:::i;:::-;32099:74;;32186:12;32201:24;32221:3;32201:15;32212:3;;32201:6;:10;;:15;;;;:::i;:::-;:19;;:24;;;;:::i;:::-;32186:39;;32236:20;32259:37;32293:2;32259:29;32285:2;32259:21;32277:2;32259:13;32268:3;32259:4;:8;;:13;;;;:::i;:::-;:17;;:21;;;;:::i;:::-;:25;;:29;;;;:::i;:::-;:33;;:37;;;;:::i;:::-;32236:60;;32307:14;32324:31;32341:13;32324:12;:16;;:31;;;;:::i;:::-;32307:48;;32375:6;32368:13;;;;;;;;;31704:685;;;;:::o;15315:191::-;15389:16;15408:6;;;;;;;;;;;15389:25;;15434:8;15425:6;;:17;;;;;;;;;;;;;;;;;;15489:8;15458:40;;15479:8;15458:40;;;;;;;;;;;;15378:128;15315:191;:::o;4857:591::-;4960:1;4941:21;;:7;:21;;;4933:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;5013:49;5034:7;5051:1;5055:6;5013:20;:49::i;:::-;5075:22;5100:9;:18;5110:7;5100:18;;;;;;;;;;;;;;;;5075:43;;5155:6;5137:14;:24;;5129:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;5274:6;5257:14;:23;5236:9;:18;5246:7;5236:18;;;;;;;;;;;;;;;:44;;;;5318:6;5302:12;;:22;;;;;;;:::i;:::-;;;;;;;;5368:1;5342:37;;5351:7;5342:37;;;5372:6;5342:37;;;;;;:::i;:::-;;;;;;;;5392:48;5412:7;5429:1;5433:6;5392:19;:48::i;:::-;4922:526;4857:591;;:::o;27825:477::-;27893:21;27931:1;27917:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27893:40;;27962:4;27944;27949:1;27944:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;;;27988:15;;;;;;;;;;;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27978:4;27983:1;27978:7;;;;;;;;:::i;:::-;;;;;;;:32;;;;;;;;;;;28023:62;28040:4;28055:15;;;;;;;;;;;28073:11;28023:8;:62::i;:::-;28098:15;;;;;;;;;;;:66;;;28179:11;28205:1;28221:4;28248;28268:15;28098:196;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27882:420;27825:477;:::o;3771:671::-;3918:1;3902:18;;:4;:18;;;3894:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3995:1;3981:16;;:2;:16;;;3973:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;4050:38;4071:4;4077:2;4081:6;4050:20;:38::i;:::-;4101:19;4123:9;:15;4133:4;4123:15;;;;;;;;;;;;;;;;4101:37;;4172:6;4157:11;:21;;4149:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;4289:6;4275:11;:20;4257:9;:15;4267:4;4257:15;;;;;;;;;;;;;;;:38;;;;4334:6;4317:9;:13;4327:2;4317:13;;;;;;;;;;;;;;;;:23;;;;;;;:::i;:::-;;;;;;;;4373:2;4358:26;;4367:4;4358:26;;;4377:6;4358:26;;;;;;:::i;:::-;;;;;;;;4397:37;4417:4;4423:2;4427:6;4397:19;:37::i;:::-;3883:559;3771:671;;;:::o;28691:1439::-;28731:23;28757:24;28775:4;28757:9;:24::i;:::-;28731:50;;28792:25;28864:19;;28842;;28820;;:41;;;;:::i;:::-;:63;;;;:::i;:::-;28792:91;;28927:1;28908:15;:20;:46;;;;28953:1;28932:17;:22;28908:46;28904:59;;;28956:7;;;;28904:59;28995:19;;28977:15;:37;28973:80;;;29034:19;;29016:37;;28973:80;29133:23;29219:1;29199:17;29177:19;;29159:15;:37;;;;:::i;:::-;:57;;;;:::i;:::-;:61;;;;:::i;:::-;29133:87;;29231:26;29260:36;29280:15;29260;:19;;:36;;;;:::i;:::-;29231:65;;29317:25;29345:21;29317:49;;29379:37;29397:18;29379:17;:37::i;:::-;29437:18;29458:44;29484:17;29458:21;:25;;:44;;;;:::i;:::-;29437:65;;29513:23;29539:58;29579:17;29539:35;29554:19;;29539:10;:14;;:35;;;;:::i;:::-;:39;;:58;;;;:::i;:::-;29513:84;;29608:23;29634:58;29674:17;29634:35;29649:19;;29634:10;:14;;:35;;;;:::i;:::-;:39;;:58;;;;:::i;:::-;29608:84;;29703:23;29760:15;29742;29729:10;:28;;;;:::i;:::-;:46;;;;:::i;:::-;29703:72;;29818:1;29796:19;:23;;;;29852:1;29830:19;:23;;;;29886:1;29864:19;:23;;;;29908:16;;;;;;;;;;;29900:34;;:72;29935:36;29955:15;29935;:19;;:36;;;;:::i;:::-;29900:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30023:1;30005:15;:19;:42;;;;;30046:1;30028:15;:19;30005:42;30001:122;;;30064:47;30078:15;30095;30064:13;:47::i;:::-;30001:122;28720:1410;;;;;;;;;28691:1439;:::o;17098:98::-;17156:7;17187:1;17183;:5;;;;:::i;:::-;17176:12;;17098:98;;;;:::o;17204:::-;17262:7;17293:1;17289;:5;;;;:::i;:::-;17282:12;;17204:98;;;;:::o;6305:125::-;;;;:::o;6438:124::-;;;;:::o;28310:373::-;28393:62;28410:4;28425:15;;;;;;;;;;;28443:11;28393:8;:62::i;:::-;28468:15;;;;;;;;;;;:31;;;28507:9;28540:4;28560:11;28586:1;28602;28618:16;;;;;;;;;;;28649:15;28468:207;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;28310:373;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;:::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:307::-;355:1;365:113;379:6;376:1;373:13;365:113;;;464:1;459:3;455:11;449:18;445:1;440:3;436:11;429:39;401:2;398:1;394:10;389:15;;365:113;;;496:6;493:1;490:13;487:101;;;576:1;567:6;562:3;558:16;551:27;487:101;336:258;287:307;;;:::o;600:102::-;641:6;692:2;688:7;683:2;676:5;672:14;668:28;658:38;;600:102;;;:::o;708:364::-;796:3;824:39;857:5;824:39;:::i;:::-;879:71;943:6;938:3;879:71;:::i;:::-;872:78;;959:52;1004:6;999:3;992:4;985:5;981:16;959:52;:::i;:::-;1036:29;1058:6;1036:29;:::i;:::-;1031:3;1027:39;1020:46;;800:272;708:364;;;;:::o;1078:313::-;1191:4;1229:2;1218:9;1214:18;1206:26;;1278:9;1272:4;1268:20;1264:1;1253:9;1249:17;1242:47;1306:78;1379:4;1370:6;1306:78;:::i;:::-;1298:86;;1078:313;;;;:::o;1478:117::-;1587:1;1584;1577:12;1724:126;1761:7;1801:42;1794:5;1790:54;1779:65;;1724:126;;;:::o;1856:96::-;1893:7;1922:24;1940:5;1922:24;:::i;:::-;1911:35;;1856:96;;;:::o;1958:122::-;2031:24;2049:5;2031:24;:::i;:::-;2024:5;2021:35;2011:63;;2070:1;2067;2060:12;2011:63;1958:122;:::o;2086:139::-;2132:5;2170:6;2157:20;2148:29;;2186:33;2213:5;2186:33;:::i;:::-;2086:139;;;;:::o;2231:77::-;2268:7;2297:5;2286:16;;2231:77;;;:::o;2314:122::-;2387:24;2405:5;2387:24;:::i;:::-;2380:5;2377:35;2367:63;;2426:1;2423;2416:12;2367:63;2314:122;:::o;2442:139::-;2488:5;2526:6;2513:20;2504:29;;2542:33;2569:5;2542:33;:::i;:::-;2442:139;;;;:::o;2587:474::-;2655:6;2663;2712:2;2700:9;2691:7;2687:23;2683:32;2680:119;;;2718:79;;:::i;:::-;2680:119;2838:1;2863:53;2908:7;2899:6;2888:9;2884:22;2863:53;:::i;:::-;2853:63;;2809:117;2965:2;2991:53;3036:7;3027:6;3016:9;3012:22;2991:53;:::i;:::-;2981:63;;2936:118;2587:474;;;;;:::o;3067:90::-;3101:7;3144:5;3137:13;3130:21;3119:32;;3067:90;;;:::o;3163:109::-;3244:21;3259:5;3244:21;:::i;:::-;3239:3;3232:34;3163:109;;:::o;3278:210::-;3365:4;3403:2;3392:9;3388:18;3380:26;;3416:65;3478:1;3467:9;3463:17;3454:6;3416:65;:::i;:::-;3278:210;;;;:::o;3494:118::-;3581:24;3599:5;3581:24;:::i;:::-;3576:3;3569:37;3494:118;;:::o;3618:222::-;3711:4;3749:2;3738:9;3734:18;3726:26;;3762:71;3830:1;3819:9;3815:17;3806:6;3762:71;:::i;:::-;3618:222;;;;:::o;3846:619::-;3923:6;3931;3939;3988:2;3976:9;3967:7;3963:23;3959:32;3956:119;;;3994:79;;:::i;:::-;3956:119;4114:1;4139:53;4184:7;4175:6;4164:9;4160:22;4139:53;:::i;:::-;4129:63;;4085:117;4241:2;4267:53;4312:7;4303:6;4292:9;4288:22;4267:53;:::i;:::-;4257:63;;4212:118;4369:2;4395:53;4440:7;4431:6;4420:9;4416:22;4395:53;:::i;:::-;4385:63;;4340:118;3846:619;;;;;:::o;4471:::-;4548:6;4556;4564;4613:2;4601:9;4592:7;4588:23;4584:32;4581:119;;;4619:79;;:::i;:::-;4581:119;4739:1;4764:53;4809:7;4800:6;4789:9;4785:22;4764:53;:::i;:::-;4754:63;;4710:117;4866:2;4892:53;4937:7;4928:6;4917:9;4913:22;4892:53;:::i;:::-;4882:63;;4837:118;4994:2;5020:53;5065:7;5056:6;5045:9;5041:22;5020:53;:::i;:::-;5010:63;;4965:118;4471:619;;;;;:::o;5096:329::-;5155:6;5204:2;5192:9;5183:7;5179:23;5175:32;5172:119;;;5210:79;;:::i;:::-;5172:119;5330:1;5355:53;5400:7;5391:6;5380:9;5376:22;5355:53;:::i;:::-;5345:63;;5301:117;5096:329;;;;:::o;5431:86::-;5466:7;5506:4;5499:5;5495:16;5484:27;;5431:86;;;:::o;5523:112::-;5606:22;5622:5;5606:22;:::i;:::-;5601:3;5594:35;5523:112;;:::o;5641:214::-;5730:4;5768:2;5757:9;5753:18;5745:26;;5781:67;5845:1;5834:9;5830:17;5821:6;5781:67;:::i;:::-;5641:214;;;;:::o;5861:332::-;5982:4;6020:2;6009:9;6005:18;5997:26;;6033:71;6101:1;6090:9;6086:17;6077:6;6033:71;:::i;:::-;6114:72;6182:2;6171:9;6167:18;6158:6;6114:72;:::i;:::-;5861:332;;;;;:::o;6199:116::-;6269:21;6284:5;6269:21;:::i;:::-;6262:5;6259:32;6249:60;;6305:1;6302;6295:12;6249:60;6199:116;:::o;6321:133::-;6364:5;6402:6;6389:20;6380:29;;6418:30;6442:5;6418:30;:::i;:::-;6321:133;;;;:::o;6460:323::-;6516:6;6565:2;6553:9;6544:7;6540:23;6536:32;6533:119;;;6571:79;;:::i;:::-;6533:119;6691:1;6716:50;6758:7;6749:6;6738:9;6734:22;6716:50;:::i;:::-;6706:60;;6662:114;6460:323;;;;:::o;6789:329::-;6848:6;6897:2;6885:9;6876:7;6872:23;6868:32;6865:119;;;6903:79;;:::i;:::-;6865:119;7023:1;7048:53;7093:7;7084:6;7073:9;7069:22;7048:53;:::i;:::-;7038:63;;6994:117;6789:329;;;;:::o;7124:114::-;7191:6;7225:5;7219:12;7209:22;;7124:114;;;:::o;7244:174::-;7333:11;7367:6;7362:3;7355:19;7407:4;7402:3;7398:14;7383:29;;7244:174;;;;:::o;7424:132::-;7491:4;7514:3;7506:11;;7544:4;7539:3;7535:14;7527:22;;7424:132;;;:::o;7562:108::-;7639:24;7657:5;7639:24;:::i;:::-;7634:3;7627:37;7562:108;;:::o;7676:179::-;7745:10;7766:46;7808:3;7800:6;7766:46;:::i;:::-;7844:4;7839:3;7835:14;7821:28;;7676:179;;;;:::o;7861:113::-;7931:4;7963;7958:3;7954:14;7946:22;;7861:113;;;:::o;8010:712::-;8119:3;8148:54;8196:5;8148:54;:::i;:::-;8218:76;8287:6;8282:3;8218:76;:::i;:::-;8211:83;;8318:56;8368:5;8318:56;:::i;:::-;8397:7;8428:1;8413:284;8438:6;8435:1;8432:13;8413:284;;;8514:6;8508:13;8541:63;8600:3;8585:13;8541:63;:::i;:::-;8534:70;;8627:60;8680:6;8627:60;:::i;:::-;8617:70;;8473:224;8460:1;8457;8453:9;8448:14;;8413:284;;;8417:14;8713:3;8706:10;;8124:598;;;8010:712;;;;:::o;8790:751::-;8919:3;8955:4;8950:3;8946:14;9043:4;9036:5;9032:16;9026:23;9096:3;9090:4;9086:14;9079:4;9074:3;9070:14;9063:38;9122:103;9220:4;9206:12;9122:103;:::i;:::-;9114:111;;8970:266;9321:4;9314:5;9310:16;9304:23;9374:3;9368:4;9364:14;9357:4;9352:3;9348:14;9341:38;9400:103;9498:4;9484:12;9400:103;:::i;:::-;9392:111;;9246:268;9531:4;9524:11;;8924:617;8790:751;;;;:::o;9547:393::-;9700:4;9738:2;9727:9;9723:18;9715:26;;9787:9;9781:4;9777:20;9773:1;9762:9;9758:17;9751:47;9815:118;9928:4;9919:6;9815:118;:::i;:::-;9807:126;;9547:393;;;;:::o;9946:118::-;10033:24;10051:5;10033:24;:::i;:::-;10028:3;10021:37;9946:118;;:::o;10070:222::-;10163:4;10201:2;10190:9;10186:18;10178:26;;10214:71;10282:1;10271:9;10267:17;10258:6;10214:71;:::i;:::-;10070:222;;;;:::o;10298:474::-;10366:6;10374;10423:2;10411:9;10402:7;10398:23;10394:32;10391:119;;;10429:79;;:::i;:::-;10391:119;10549:1;10574:53;10619:7;10610:6;10599:9;10595:22;10574:53;:::i;:::-;10564:63;;10520:117;10676:2;10702:53;10747:7;10738:6;10727:9;10723:22;10702:53;:::i;:::-;10692:63;;10647:118;10298:474;;;;;:::o;10778:468::-;10843:6;10851;10900:2;10888:9;10879:7;10875:23;10871:32;10868:119;;;10906:79;;:::i;:::-;10868:119;11026:1;11051:53;11096:7;11087:6;11076:9;11072:22;11051:53;:::i;:::-;11041:63;;10997:117;11153:2;11179:50;11221:7;11212:6;11201:9;11197:22;11179:50;:::i;:::-;11169:60;;11124:115;10778:468;;;;;:::o;11252:474::-;11320:6;11328;11377:2;11365:9;11356:7;11352:23;11348:32;11345:119;;;11383:79;;:::i;:::-;11345:119;11503:1;11528:53;11573:7;11564:6;11553:9;11549:22;11528:53;:::i;:::-;11518:63;;11474:117;11630:2;11656:53;11701:7;11692:6;11681:9;11677:22;11656:53;:::i;:::-;11646:63;;11601:118;11252:474;;;;;:::o;11732:180::-;11780:77;11777:1;11770:88;11877:4;11874:1;11867:15;11901:4;11898:1;11891:15;11918:320;11962:6;11999:1;11993:4;11989:12;11979:22;;12046:1;12040:4;12036:12;12067:18;12057:81;;12123:4;12115:6;12111:17;12101:27;;12057:81;12185:2;12177:6;12174:14;12154:18;12151:38;12148:84;;12204:18;;:::i;:::-;12148:84;11969:269;11918:320;;;:::o;12244:182::-;12384:34;12380:1;12372:6;12368:14;12361:58;12244:182;:::o;12432:366::-;12574:3;12595:67;12659:2;12654:3;12595:67;:::i;:::-;12588:74;;12671:93;12760:3;12671:93;:::i;:::-;12789:2;12784:3;12780:12;12773:19;;12432:366;;;:::o;12804:419::-;12970:4;13008:2;12997:9;12993:18;12985:26;;13057:9;13051:4;13047:20;13043:1;13032:9;13028:17;13021:47;13085:131;13211:4;13085:131;:::i;:::-;13077:139;;12804:419;;;:::o;13229:180::-;13277:77;13274:1;13267:88;13374:4;13371:1;13364:15;13398:4;13395:1;13388:15;13415:305;13455:3;13474:20;13492:1;13474:20;:::i;:::-;13469:25;;13508:20;13526:1;13508:20;:::i;:::-;13503:25;;13662:1;13594:66;13590:74;13587:1;13584:81;13581:107;;;13668:18;;:::i;:::-;13581:107;13712:1;13709;13705:9;13698:16;;13415:305;;;;:::o;13726:178::-;13866:30;13862:1;13854:6;13850:14;13843:54;13726:178;:::o;13910:366::-;14052:3;14073:67;14137:2;14132:3;14073:67;:::i;:::-;14066:74;;14149:93;14238:3;14149:93;:::i;:::-;14267:2;14262:3;14258:12;14251:19;;13910:366;;;:::o;14282:419::-;14448:4;14486:2;14475:9;14471:18;14463:26;;14535:9;14529:4;14525:20;14521:1;14510:9;14506:17;14499:47;14563:131;14689:4;14563:131;:::i;:::-;14555:139;;14282:419;;;:::o;14707:240::-;14847:34;14843:1;14835:6;14831:14;14824:58;14916:23;14911:2;14903:6;14899:15;14892:48;14707:240;:::o;14953:366::-;15095:3;15116:67;15180:2;15175:3;15116:67;:::i;:::-;15109:74;;15192:93;15281:3;15192:93;:::i;:::-;15310:2;15305:3;15301:12;15294:19;;14953:366;;;:::o;15325:419::-;15491:4;15529:2;15518:9;15514:18;15506:26;;15578:9;15572:4;15568:20;15564:1;15553:9;15549:17;15542:47;15606:131;15732:4;15606:131;:::i;:::-;15598:139;;15325:419;;;:::o;15750:143::-;15807:5;15838:6;15832:13;15823:22;;15854:33;15881:5;15854:33;:::i;:::-;15750:143;;;;:::o;15899:351::-;15969:6;16018:2;16006:9;15997:7;15993:23;15989:32;15986:119;;;16024:79;;:::i;:::-;15986:119;16144:1;16169:64;16225:7;16216:6;16205:9;16201:22;16169:64;:::i;:::-;16159:74;;16115:128;15899:351;;;;:::o;16256:332::-;16377:4;16415:2;16404:9;16400:18;16392:26;;16428:71;16496:1;16485:9;16481:17;16472:6;16428:71;:::i;:::-;16509:72;16577:2;16566:9;16562:18;16553:6;16509:72;:::i;:::-;16256:332;;;;;:::o;16594:85::-;16639:7;16668:5;16657:16;;16594:85;;;:::o;16685:60::-;16713:3;16734:5;16727:12;;16685:60;;;:::o;16751:158::-;16809:9;16842:61;16860:42;16869:32;16895:5;16869:32;:::i;:::-;16860:42;:::i;:::-;16842:61;:::i;:::-;16829:74;;16751:158;;;:::o;16915:147::-;17010:45;17049:5;17010:45;:::i;:::-;17005:3;16998:58;16915:147;;:::o;17068:807::-;17317:4;17355:3;17344:9;17340:19;17332:27;;17369:71;17437:1;17426:9;17422:17;17413:6;17369:71;:::i;:::-;17450:72;17518:2;17507:9;17503:18;17494:6;17450:72;:::i;:::-;17532:80;17608:2;17597:9;17593:18;17584:6;17532:80;:::i;:::-;17622;17698:2;17687:9;17683:18;17674:6;17622:80;:::i;:::-;17712:73;17780:3;17769:9;17765:19;17756:6;17712:73;:::i;:::-;17795;17863:3;17852:9;17848:19;17839:6;17795:73;:::i;:::-;17068:807;;;;;;;;;:::o;17881:143::-;17938:5;17969:6;17963:13;17954:22;;17985:33;18012:5;17985:33;:::i;:::-;17881:143;;;;:::o;18030:663::-;18118:6;18126;18134;18183:2;18171:9;18162:7;18158:23;18154:32;18151:119;;;18189:79;;:::i;:::-;18151:119;18309:1;18334:64;18390:7;18381:6;18370:9;18366:22;18334:64;:::i;:::-;18324:74;;18280:128;18447:2;18473:64;18529:7;18520:6;18509:9;18505:22;18473:64;:::i;:::-;18463:74;;18418:129;18586:2;18612:64;18668:7;18659:6;18648:9;18644:22;18612:64;:::i;:::-;18602:74;;18557:129;18030:663;;;;;:::o;18699:171::-;18839:23;18835:1;18827:6;18823:14;18816:47;18699:171;:::o;18876:366::-;19018:3;19039:67;19103:2;19098:3;19039:67;:::i;:::-;19032:74;;19115:93;19204:3;19115:93;:::i;:::-;19233:2;19228:3;19224:12;19217:19;;18876:366;;;:::o;19248:419::-;19414:4;19452:2;19441:9;19437:18;19429:26;;19501:9;19495:4;19491:20;19487:1;19476:9;19472:17;19465:47;19529:131;19655:4;19529:131;:::i;:::-;19521:139;;19248:419;;;:::o;19673:180::-;19721:77;19718:1;19711:88;19818:4;19815:1;19808:15;19842:4;19839:1;19832:15;19859:191;19899:4;19919:20;19937:1;19919:20;:::i;:::-;19914:25;;19953:20;19971:1;19953:20;:::i;:::-;19948:25;;19992:1;19989;19986:8;19983:34;;;19997:18;;:::i;:::-;19983:34;20042:1;20039;20035:9;20027:17;;19859:191;;;;:::o;20056:173::-;20196:25;20192:1;20184:6;20180:14;20173:49;20056:173;:::o;20235:366::-;20377:3;20398:67;20462:2;20457:3;20398:67;:::i;:::-;20391:74;;20474:93;20563:3;20474:93;:::i;:::-;20592:2;20587:3;20583:12;20576:19;;20235:366;;;:::o;20607:419::-;20773:4;20811:2;20800:9;20796:18;20788:26;;20860:9;20854:4;20850:20;20846:1;20835:9;20831:17;20824:47;20888:131;21014:4;20888:131;:::i;:::-;20880:139;;20607:419;;;:::o;21032:232::-;21172:34;21168:1;21160:6;21156:14;21149:58;21241:15;21236:2;21228:6;21224:15;21217:40;21032:232;:::o;21270:366::-;21412:3;21433:67;21497:2;21492:3;21433:67;:::i;:::-;21426:74;;21509:93;21598:3;21509:93;:::i;:::-;21627:2;21622:3;21618:12;21611:19;;21270:366;;;:::o;21642:419::-;21808:4;21846:2;21835:9;21831:18;21823:26;;21895:9;21889:4;21885:20;21881:1;21870:9;21866:17;21859:47;21923:131;22049:4;21923:131;:::i;:::-;21915:139;;21642:419;;;:::o;22067:348::-;22107:7;22130:20;22148:1;22130:20;:::i;:::-;22125:25;;22164:20;22182:1;22164:20;:::i;:::-;22159:25;;22352:1;22284:66;22280:74;22277:1;22274:81;22269:1;22262:9;22255:17;22251:105;22248:131;;;22359:18;;:::i;:::-;22248:131;22407:1;22404;22400:9;22389:20;;22067:348;;;;:::o;22421:180::-;22469:77;22466:1;22459:88;22566:4;22563:1;22556:15;22590:4;22587:1;22580:15;22607:185;22647:1;22664:20;22682:1;22664:20;:::i;:::-;22659:25;;22698:20;22716:1;22698:20;:::i;:::-;22693:25;;22737:1;22727:35;;22742:18;;:::i;:::-;22727:35;22784:1;22781;22777:9;22772:14;;22607:185;;;;:::o;22798:243::-;22938:34;22934:1;22926:6;22922:14;22915:58;23007:26;23002:2;22994:6;22990:15;22983:51;22798:243;:::o;23047:366::-;23189:3;23210:67;23274:2;23269:3;23210:67;:::i;:::-;23203:74;;23286:93;23375:3;23286:93;:::i;:::-;23404:2;23399:3;23395:12;23388:19;;23047:366;;;:::o;23419:419::-;23585:4;23623:2;23612:9;23608:18;23600:26;;23672:9;23666:4;23662:20;23658:1;23647:9;23643:17;23636:47;23700:131;23826:4;23700:131;:::i;:::-;23692:139;;23419:419;;;:::o;23844:242::-;23984:34;23980:1;23972:6;23968:14;23961:58;24053:25;24048:2;24040:6;24036:15;24029:50;23844:242;:::o;24092:366::-;24234:3;24255:67;24319:2;24314:3;24255:67;:::i;:::-;24248:74;;24331:93;24420:3;24331:93;:::i;:::-;24449:2;24444:3;24440:12;24433:19;;24092:366;;;:::o;24464:419::-;24630:4;24668:2;24657:9;24653:18;24645:26;;24717:9;24711:4;24707:20;24703:1;24692:9;24688:17;24681:47;24745:131;24871:4;24745:131;:::i;:::-;24737:139;;24464:419;;;:::o;24889:224::-;25029:34;25025:1;25017:6;25013:14;25006:58;25098:7;25093:2;25085:6;25081:15;25074:32;24889:224;:::o;25119:366::-;25261:3;25282:67;25346:2;25341:3;25282:67;:::i;:::-;25275:74;;25358:93;25447:3;25358:93;:::i;:::-;25476:2;25471:3;25467:12;25460:19;;25119:366;;;:::o;25491:419::-;25657:4;25695:2;25684:9;25680:18;25672:26;;25744:9;25738:4;25734:20;25730:1;25719:9;25715:17;25708:47;25772:131;25898:4;25772:131;:::i;:::-;25764:139;;25491:419;;;:::o;25916:225::-;26056:34;26052:1;26044:6;26040:14;26033:58;26125:8;26120:2;26112:6;26108:15;26101:33;25916:225;:::o;26147:366::-;26289:3;26310:67;26374:2;26369:3;26310:67;:::i;:::-;26303:74;;26386:93;26475:3;26386:93;:::i;:::-;26504:2;26499:3;26495:12;26488:19;;26147:366;;;:::o;26519:419::-;26685:4;26723:2;26712:9;26708:18;26700:26;;26772:9;26766:4;26762:20;26758:1;26747:9;26743:17;26736:47;26800:131;26926:4;26800:131;:::i;:::-;26792:139;;26519:419;;;:::o;26944:223::-;27084:34;27080:1;27072:6;27068:14;27061:58;27153:6;27148:2;27140:6;27136:15;27129:31;26944:223;:::o;27173:366::-;27315:3;27336:67;27400:2;27395:3;27336:67;:::i;:::-;27329:74;;27412:93;27501:3;27412:93;:::i;:::-;27530:2;27525:3;27521:12;27514:19;;27173:366;;;:::o;27545:419::-;27711:4;27749:2;27738:9;27734:18;27726:26;;27798:9;27792:4;27788:20;27784:1;27773:9;27769:17;27762:47;27826:131;27952:4;27826:131;:::i;:::-;27818:139;;27545:419;;;:::o;27970:221::-;28110:34;28106:1;28098:6;28094:14;28087:58;28179:4;28174:2;28166:6;28162:15;28155:29;27970:221;:::o;28197:366::-;28339:3;28360:67;28424:2;28419:3;28360:67;:::i;:::-;28353:74;;28436:93;28525:3;28436:93;:::i;:::-;28554:2;28549:3;28545:12;28538:19;;28197:366;;;:::o;28569:419::-;28735:4;28773:2;28762:9;28758:18;28750:26;;28822:9;28816:4;28812:20;28808:1;28797:9;28793:17;28786:47;28850:131;28976:4;28850:131;:::i;:::-;28842:139;;28569:419;;;:::o;28994:179::-;29134:31;29130:1;29122:6;29118:14;29111:55;28994:179;:::o;29179:366::-;29321:3;29342:67;29406:2;29401:3;29342:67;:::i;:::-;29335:74;;29418:93;29507:3;29418:93;:::i;:::-;29536:2;29531:3;29527:12;29520:19;;29179:366;;;:::o;29551:419::-;29717:4;29755:2;29744:9;29740:18;29732:26;;29804:9;29798:4;29794:20;29790:1;29779:9;29775:17;29768:47;29832:131;29958:4;29832:131;:::i;:::-;29824:139;;29551:419;;;:::o;29976:224::-;30116:34;30112:1;30104:6;30100:14;30093:58;30185:7;30180:2;30172:6;30168:15;30161:32;29976:224;:::o;30206:366::-;30348:3;30369:67;30433:2;30428:3;30369:67;:::i;:::-;30362:74;;30445:93;30534:3;30445:93;:::i;:::-;30563:2;30558:3;30554:12;30547:19;;30206:366;;;:::o;30578:419::-;30744:4;30782:2;30771:9;30767:18;30759:26;;30831:9;30825:4;30821:20;30817:1;30806:9;30802:17;30795:47;30859:131;30985:4;30859:131;:::i;:::-;30851:139;;30578:419;;;:::o;31003:222::-;31143:34;31139:1;31131:6;31127:14;31120:58;31212:5;31207:2;31199:6;31195:15;31188:30;31003:222;:::o;31231:366::-;31373:3;31394:67;31458:2;31453:3;31394:67;:::i;:::-;31387:74;;31470:93;31559:3;31470:93;:::i;:::-;31588:2;31583:3;31579:12;31572:19;;31231:366;;;:::o;31603:419::-;31769:4;31807:2;31796:9;31792:18;31784:26;;31856:9;31850:4;31846:20;31842:1;31831:9;31827:17;31820:47;31884:131;32010:4;31884:131;:::i;:::-;31876:139;;31603:419;;;:::o;32028:297::-;32168:34;32164:1;32156:6;32152:14;32145:58;32237:34;32232:2;32224:6;32220:15;32213:59;32306:11;32301:2;32293:6;32289:15;32282:36;32028:297;:::o;32331:366::-;32473:3;32494:67;32558:2;32553:3;32494:67;:::i;:::-;32487:74;;32570:93;32659:3;32570:93;:::i;:::-;32688:2;32683:3;32679:12;32672:19;;32331:366;;;:::o;32703:419::-;32869:4;32907:2;32896:9;32892:18;32884:26;;32956:9;32950:4;32946:20;32942:1;32931:9;32927:17;32920:47;32984:131;33110:4;32984:131;:::i;:::-;32976:139;;32703:419;;;:::o;33128:289::-;33268:34;33264:1;33256:6;33252:14;33245:58;33337:34;33332:2;33324:6;33320:15;33313:59;33406:3;33401:2;33393:6;33389:15;33382:28;33128:289;:::o;33423:366::-;33565:3;33586:67;33650:2;33645:3;33586:67;:::i;:::-;33579:74;;33662:93;33751:3;33662:93;:::i;:::-;33780:2;33775:3;33771:12;33764:19;;33423:366;;;:::o;33795:419::-;33961:4;33999:2;33988:9;33984:18;33976:26;;34048:9;34042:4;34038:20;34034:1;34023:9;34019:17;34012:47;34076:131;34202:4;34076:131;:::i;:::-;34068:139;;33795:419;;;:::o;34220:181::-;34360:33;34356:1;34348:6;34344:14;34337:57;34220:181;:::o;34407:366::-;34549:3;34570:67;34634:2;34629:3;34570:67;:::i;:::-;34563:74;;34646:93;34735:3;34646:93;:::i;:::-;34764:2;34759:3;34755:12;34748:19;;34407:366;;;:::o;34779:419::-;34945:4;34983:2;34972:9;34968:18;34960:26;;35032:9;35026:4;35022:20;35018:1;35007:9;35003:17;34996:47;35060:131;35186:4;35060:131;:::i;:::-;35052:139;;34779:419;;;:::o;35204:290::-;35344:34;35340:1;35332:6;35328:14;35321:58;35413:34;35408:2;35400:6;35396:15;35389:59;35482:4;35477:2;35469:6;35465:15;35458:29;35204:290;:::o;35500:366::-;35642:3;35663:67;35727:2;35722:3;35663:67;:::i;:::-;35656:74;;35739:93;35828:3;35739:93;:::i;:::-;35857:2;35852:3;35848:12;35841:19;;35500:366;;;:::o;35872:419::-;36038:4;36076:2;36065:9;36061:18;36053:26;;36125:9;36119:4;36115:20;36111:1;36100:9;36096:17;36089:47;36153:131;36279:4;36153:131;:::i;:::-;36145:139;;35872:419;;;:::o;36297:181::-;36437:33;36433:1;36425:6;36421:14;36414:57;36297:181;:::o;36484:366::-;36626:3;36647:67;36711:2;36706:3;36647:67;:::i;:::-;36640:74;;36723:93;36812:3;36723:93;:::i;:::-;36841:2;36836:3;36832:12;36825:19;;36484:366;;;:::o;36856:419::-;37022:4;37060:2;37049:9;37045:18;37037:26;;37109:9;37103:4;37099:20;37095:1;37084:9;37080:17;37073:47;37137:131;37263:4;37137:131;:::i;:::-;37129:139;;36856:419;;;:::o;37281:170::-;37421:22;37417:1;37409:6;37405:14;37398:46;37281:170;:::o;37457:366::-;37599:3;37620:67;37684:2;37679:3;37620:67;:::i;:::-;37613:74;;37696:93;37785:3;37696:93;:::i;:::-;37814:2;37809:3;37805:12;37798:19;;37457:366;;;:::o;37829:419::-;37995:4;38033:2;38022:9;38018:18;38010:26;;38082:9;38076:4;38072:20;38068:1;38057:9;38053:17;38046:47;38110:131;38236:4;38110:131;:::i;:::-;38102:139;;37829:419;;;:::o;38254:220::-;38394:34;38390:1;38382:6;38378:14;38371:58;38463:3;38458:2;38450:6;38446:15;38439:28;38254:220;:::o;38480:366::-;38622:3;38643:67;38707:2;38702:3;38643:67;:::i;:::-;38636:74;;38719:93;38808:3;38719:93;:::i;:::-;38837:2;38832:3;38828:12;38821:19;;38480:366;;;:::o;38852:419::-;39018:4;39056:2;39045:9;39041:18;39033:26;;39105:9;39099:4;39095:20;39091:1;39080:9;39076:17;39069:47;39133:131;39259:4;39133:131;:::i;:::-;39125:139;;38852:419;;;:::o;39277:221::-;39417:34;39413:1;39405:6;39401:14;39394:58;39486:4;39481:2;39473:6;39469:15;39462:29;39277:221;:::o;39504:366::-;39646:3;39667:67;39731:2;39726:3;39667:67;:::i;:::-;39660:74;;39743:93;39832:3;39743:93;:::i;:::-;39861:2;39856:3;39852:12;39845:19;;39504:366;;;:::o;39876:419::-;40042:4;40080:2;40069:9;40065:18;40057:26;;40129:9;40123:4;40119:20;40115:1;40104:9;40100:17;40093:47;40157:131;40283:4;40157:131;:::i;:::-;40149:139;;39876:419;;;:::o;40301:180::-;40349:77;40346:1;40339:88;40446:4;40443:1;40436:15;40470:4;40467:1;40460:15;40487:114;40554:6;40588:5;40582:12;40572:22;;40487:114;;;:::o;40607:184::-;40706:11;40740:6;40735:3;40728:19;40780:4;40775:3;40771:14;40756:29;;40607:184;;;;:::o;40797:132::-;40864:4;40887:3;40879:11;;40917:4;40912:3;40908:14;40900:22;;40797:132;;;:::o;40935:108::-;41012:24;41030:5;41012:24;:::i;:::-;41007:3;41000:37;40935:108;;:::o;41049:179::-;41118:10;41139:46;41181:3;41173:6;41139:46;:::i;:::-;41217:4;41212:3;41208:14;41194:28;;41049:179;;;;:::o;41234:113::-;41304:4;41336;41331:3;41327:14;41319:22;;41234:113;;;:::o;41383:732::-;41502:3;41531:54;41579:5;41531:54;:::i;:::-;41601:86;41680:6;41675:3;41601:86;:::i;:::-;41594:93;;41711:56;41761:5;41711:56;:::i;:::-;41790:7;41821:1;41806:284;41831:6;41828:1;41825:13;41806:284;;;41907:6;41901:13;41934:63;41993:3;41978:13;41934:63;:::i;:::-;41927:70;;42020:60;42073:6;42020:60;:::i;:::-;42010:70;;41866:224;41853:1;41850;41846:9;41841:14;;41806:284;;;41810:14;42106:3;42099:10;;41507:608;;;41383:732;;;;:::o;42121:831::-;42384:4;42422:3;42411:9;42407:19;42399:27;;42436:71;42504:1;42493:9;42489:17;42480:6;42436:71;:::i;:::-;42517:80;42593:2;42582:9;42578:18;42569:6;42517:80;:::i;:::-;42644:9;42638:4;42634:20;42629:2;42618:9;42614:18;42607:48;42672:108;42775:4;42766:6;42672:108;:::i;:::-;42664:116;;42790:72;42858:2;42847:9;42843:18;42834:6;42790:72;:::i;:::-;42872:73;42940:3;42929:9;42925:19;42916:6;42872:73;:::i;:::-;42121:831;;;;;;;;:::o;42958:225::-;43098:34;43094:1;43086:6;43082:14;43075:58;43167:8;43162:2;43154:6;43150:15;43143:33;42958:225;:::o;43189:366::-;43331:3;43352:67;43416:2;43411:3;43352:67;:::i;:::-;43345:74;;43428:93;43517:3;43428:93;:::i;:::-;43546:2;43541:3;43537:12;43530:19;;43189:366;;;:::o;43561:419::-;43727:4;43765:2;43754:9;43750:18;43742:26;;43814:9;43808:4;43804:20;43800:1;43789:9;43785:17;43778:47;43842:131;43968:4;43842:131;:::i;:::-;43834:139;;43561:419;;;:::o

Swarm Source

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