ETH Price: $2,533.44 (+3.95%)

Token

ClashforStash.gg (STASH)
 

Overview

Max Total Supply

60,000,000,000 STASH

Holders

115

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
0.830683010148733012 STASH

Value
$0.00
0x66978c5a2d2b8d34b1b465bbfbfb6c75ca18e11f
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
ClashForStash

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

pragma solidity >=0.8.10 >=0.8.0 <0.9.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;
    }
}

abstract contract Ownable is Context {
    address private _owner;
    address private creator;
    event OwnershipTransferred(
        address indexed previousOwner,
        address indexed newOwner
    );

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(
            newOwner != address(0),
            "Ownable: new owner is the zero address"
        );
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount)
        external
        returns (bool);

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

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

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

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 value
    );
}

interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the symbol of the token.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the decimals places of the token.
     */
    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_;
    }

    /**
     * @dev Returns the name of the token.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

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

    /**
     * @dev See {IERC20-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account)
        public
        view
        virtual
        override
        returns (uint256)
    {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `recipient` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address recipient, uint256 amount)
        public
        virtual
        override
        returns (bool)
    {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender)
        public
        view
        virtual
        override
        returns (uint256)
    {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount)
        public
        virtual
        override
        returns (bool)
    {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);

        uint256 currentAllowance = _allowances[sender][_msgSender()];
        require(
            currentAllowance >= amount,
            "ERC20: transfer amount exceeds allowance"
        );
        unchecked {
            _approve(sender, _msgSender(), currentAllowance - amount);
        }

        return true;
    }

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

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

        return true;
    }

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

        _beforeTokenTransfer(sender, recipient, amount);

        uint256 senderBalance = _balances[sender];
        require(
            senderBalance >= amount,
            "ERC20: transfer amount exceeds balance"
        );
        unchecked {
            _balances[sender] = senderBalance - amount;
        }
        _balances[recipient] += amount;

        emit Transfer(sender, recipient, amount);

        _afterTokenTransfer(sender, recipient, amount);
    }

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

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

        _totalSupply += 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 _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}

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

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

////// src/IUniswapV2Factory.sol
/* pragma solidity 0.8.10; */
/* pragma experimental ABIEncoderV2; */

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

    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(uint256) external view returns (address pair);

    function allPairsLength() external view returns (uint256);

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

    function setFeeTo(address) external;

    function setFeeToSetter(address) external;
}

////// src/IUniswapV2Pair.sol
/* pragma solidity 0.8.10; */
/* pragma experimental ABIEncoderV2; */

interface IUniswapV2Pair {
    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 value
    );
    event Transfer(address indexed from, address indexed to, uint256 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 (uint256);

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

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

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

    function transfer(address to, uint256 value) external returns (bool);

    function transferFrom(
        address from,
        address to,
        uint256 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 (uint256);

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

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

    function MINIMUM_LIQUIDITY() external pure returns (uint256);

    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 (uint256);

    function price1CumulativeLast() external view returns (uint256);

    function kLast() external view returns (uint256);

    function mint(address to) external returns (uint256 liquidity);

    function burn(address to)
        external
        returns (uint256 amount0, uint256 amount1);

    function swap(
        uint256 amount0Out,
        uint256 amount1Out,
        address to,
        bytes calldata data
    ) external;

    function skim(address to) external;

    function sync() external;

    function initialize(address, address) external;
}

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

    function WETH() external pure returns (address);

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint256 amountADesired,
        uint256 amountBDesired,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    )
        external
        returns (
            uint256 amountA,
            uint256 amountB,
            uint256 liquidity
        );

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

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

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

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

contract ClashForStash is ERC20, Ownable {
    event SwapBackSuccess(
        uint256 tokenAmount,
        uint256 ethAmountReceived,
        bool success
    );
    bool private swapping;
    address public marketingWallet =
        address(0x8395884B62d68b108eA932edAD98C8a51B10DB47);

    address public devWallet =
        address(0x8395884B62d68b108eA932edAD98C8a51B10DB47);

    uint256 _totalSupply = 60_000_000_000 * 1e18;
    uint256 public maxTransactionAmount = (_totalSupply * 10) / 1000; // 1% from total supply maxTransactionAmountTxn;
    uint256 public swapTokensAtAmount = (_totalSupply * 10) / 10000; // 0.1% swap tokens at this amount. (10_000_000 * 10) / 10000 = 0.1%(10000 tokens) of the total supply
    uint256 public maxWallet = (_totalSupply * 10) / 1000; // 1% from total supply maxWallet
    uint256 public currentFeesAmount = 0;

    // Define mapping to check if a signature has been used before.
    mapping(bytes => bool) public usedSignatures;

    // Define a trusted signer's address.
    address public trustedSigner = address(0);
    // Define events
    event Deposit(address indexed sender, uint256 amount);
    event Withdraw(address indexed sender, uint256 amount);

    // Define a variable for maximum deposit by owner
    uint256 public maxDeposit = 100_000 * 1e18; // set a value for maximum deposit
    uint256 public minDeposit = 1000 * 1e18;

    // Define a mapping to store balances of deposited tokens give access only to the owner
    mapping(address => uint256) private _deposits;

    bool public limitsInEffect = true;
    bool public tradingActive = false;
    bool public swapEnabled = false;

    uint256 public buyFees = 5;
    uint256 public sellFees = 5;

    uint256 public marketingAmount = 30; //
    uint256 public devAmount = 70; //

    using SafeMath for uint256;

    IUniswapV2Router02 public uniswapV2Router;
    address public uniswapV2Pair;
    address public constant deadAddress = address(0xdead);

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

    constructor() ERC20("ClashforStash.gg", "STASH") {
        // exclude from paying fees or having max transaction amount
        excludeFromFees(owner(), true);
        excludeFromFees(marketingWallet, true);
        excludeFromFees(devWallet, true);
        excludeFromFees(address(this), true);
        excludeFromFees(address(0xdead), true);
        excludeFromMaxTransaction(owner(), true);
        excludeFromMaxTransaction(marketingWallet, true);
        excludeFromMaxTransaction(devWallet, true);
        excludeFromMaxTransaction(address(this), true);
        excludeFromMaxTransaction(address(0xdead), true);
        marketingWallet = address(owner());
        devWallet = address(owner());
        _mint(owner(), _totalSupply);
    }

    receive() external payable {}

    // once enabled, can never be turned off
    function enableTrading() external onlyOwner {
        tradingActive = true;
        swapEnabled = true;
    }

    // remove limits after token is stable (sets sell fees to 5%)
    function removeLimits() external onlyOwner returns (bool) {
        limitsInEffect = false;
        return true;
    }

    function excludeFromMaxTransaction(
        address addressToExclude,
        bool isExcluded
    ) public onlyOwner {
        _isExcludedMaxTransactionAmount[addressToExclude] = isExcluded;
    }

    // only use to disable contract sales if absolutely necessary (emergency use only)
    function updateSwapEnabled(bool enabled) external onlyOwner {
        swapEnabled = enabled;
    }

    function excludeFromFees(address account, bool excluded) public onlyOwner {
        _isExcludedFromFees[account] = excluded;
    }

    function setAutomatedMarketMakerPair(address pair, bool value)
        public
        onlyOwner
    {
        require(
            pair != uniswapV2Pair,
            "The pair cannot be removed from automatedMarketMakerPairs"
        );
        _setAutomatedMarketMakerPair(pair, value);
    }

    function setBuyAndSellFees(uint256 _buyFee, uint256 _sellFee)
        public
        onlyOwner
    {
        sellFees = _sellFee;
        buyFees = _buyFee;
    }

    function setMaxDeposit(uint256 _maxDeposit) public onlyOwner {
        maxDeposit = _maxDeposit;
    }

    function setTrustedSigner(address _address) public onlyOwner {
        trustedSigner = _address;
    }


    function setDepositMinMax(uint256 _min, uint256 _max) public onlyOwner {
        minDeposit = _min;
        maxDeposit = _max;
    }

    function deposit(uint256 _amount) external {
        require(
            _amount >= minDeposit,
            "Deposit amount must be greater than the minimum"
        );
        require(_amount <= maxDeposit, "Deposit amount exceeds maximum limit");
        require(
            _deposits[msg.sender].add(_amount) < maxDeposit,
            "Total deposits cannot exceed maximum"
        );
        // Transfer tokens to this contract
        super._transfer(msg.sender, address(this), _amount);

        // Record the deposit
        _deposits[msg.sender] = _deposits[msg.sender].add(_amount); // add to the deposit of the user (msg.sender)

        emit Deposit(msg.sender, _amount);
    }

    function withdraw(uint256 _amount, bytes memory _signature) external {
        bytes32 message = keccak256(
            abi.encodePacked(msg.sender, trustedSigner, _amount)
        );

        //prepend "\x19Ethereum Signed Message:\n32" to the hash
        bytes32 prefixedMessage = keccak256(
            abi.encodePacked("\x19Ethereum Signed Message:\n32", message)
        );

        //recover the signer
        address signer = recover(prefixedMessage, _signature);

        // This checks if the signer is the trusted signer and the signature hasn't been used before.
        require(signer == trustedSigner, "Invalid signature");
        require(!usedSignatures[_signature], "Signature has already been used");
        require(_deposits[msg.sender] > 0, "Deposit must be greater than 0");

        // If the check passes, the signature is marked as used and the amount is transferred.
        usedSignatures[_signature] = true;

        // Check if contract has enough balance to make the transfer.
        require(
            balanceOf(address(this)) >= _amount,
            "Insufficient contract balance"
        );

        // Transfer tokens instead of adding to balance directly.
        super._transfer(address(this), msg.sender, _amount);

        _deposits[msg.sender] = 0;

        emit Withdraw(msg.sender, _amount);
    }

    // Helper method to recover the owner of a signed message.
    function recover(bytes32 _signedData, bytes memory _signature)
        public
        pure
        returns (address)
    {
        (bytes32 r, bytes32 s, uint8 v) = splitSignature(_signature);
        return ecrecover(_signedData, v, r, s);
    }

    // Helper method to split a signature into (r, s, v) components.
    function splitSignature(bytes memory sig)
        public
        pure
        returns (
            bytes32 r,
            bytes32 s,
            uint8 v
        )
    {
        require(sig.length == 65);

        assembly {
            // first 32 bytes, after the length prefix.
            r := mload(add(sig, 32))
            // second 32 bytes.
            s := mload(add(sig, 64))
            // final byte (first byte of the next 32 bytes).
            v := byte(0, mload(add(sig, 96)))
        }

        return (r, s, v);
    }

    function addLiquidity(address _routerAddress, uint256 supplyAmount)
        external
        payable
        onlyOwner
    {
        // approve token transfer to cover all possible scenarios
        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(
            _routerAddress
        );

        uniswapV2Router = _uniswapV2Router;

        excludeFromMaxTransaction(address(_uniswapV2Router), true);
        _approve(address(this), address(_uniswapV2Router), supplyAmount);
        // add the liquidity
        uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory())
            .createPair(address(this), _uniswapV2Router.WETH());
        excludeFromMaxTransaction(address(uniswapV2Pair), true);
        _setAutomatedMarketMakerPair(address(uniswapV2Pair), true);

        uniswapV2Router.addLiquidityETH{value: msg.value}(
            address(this), //token address
            supplyAmount, // liquidity amount
            0, // slippage is unavoidable
            0, // slippage is unavoidable
            owner(), // LP tokens are sent to the owner
            block.timestamp
        );
    }

    function _setAutomatedMarketMakerPair(address pair, bool value) private {
        automatedMarketMakerPairs[pair] = value;
    }

    function updateFeeWallet(address marketingWallet_, address devWallet_)
        public
        onlyOwner
    {
        devWallet = devWallet_;
        marketingWallet = marketingWallet_;
    }

    function isExcludedFromFees(address account) public 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");
        require(amount > 0, "Transfer amount must be greater than zero");
        if (limitsInEffect) {
            if (
                from != owner() &&
                to != owner() &&
                to != address(0) &&
                to != address(0xdead) &&
                !swapping
            ) {
                if (!tradingActive) {
                    require(
                        _isExcludedFromFees[from] || _isExcludedFromFees[to],
                        "Trading is not enabled yet."
                    );
                }

                //when buy
                if (
                    automatedMarketMakerPairs[from] &&
                    !_isExcludedMaxTransactionAmount[to]
                ) {
                    require(
                        amount <= maxTransactionAmount,
                        "Buy transfer amount exceeds the maxTransactionAmount."
                    );
                    require(
                        amount + balanceOf(to) <= maxWallet,
                        "Max wallet exceeded"
                    );
                }
                //when sell
                else if (
                    automatedMarketMakerPairs[to] &&
                    !_isExcludedMaxTransactionAmount[from]
                ) {
                    require(
                        amount <= maxTransactionAmount,
                        "Sell transfer amount exceeds the maxTransactionAmount."
                    );
                } else if (!_isExcludedMaxTransactionAmount[to]) {
                    require(
                        amount + balanceOf(to) <= maxWallet,
                        "Max wallet exceeded"
                    );
                }
            }
        }

        if (
            swapEnabled && //if this is true
            !swapping && //if this is false
            !automatedMarketMakerPairs[from] && //if this is false
            !_isExcludedFromFees[from] && //if this is false
            !_isExcludedFromFees[to] //if this is false
        ) {
            swapping = true;
            swapBack();
            swapping = false;
        }

        bool takeFee = !swapping;

        // if any account belongs to _isExcludedFromFee account then remove the fee
        if (_isExcludedFromFees[from] || _isExcludedFromFees[to]) {
            takeFee = false;
        }

        uint256 fees = 0;
        if (takeFee) {
            // on sell
            if (automatedMarketMakerPairs[to] && sellFees > 0) {
                fees = amount.mul(sellFees).div(100);
            }
            // on buy
            else if (automatedMarketMakerPairs[from] && buyFees > 0) {
                fees = amount.mul(buyFees).div(100);
            }

            if (fees > 0) {
                currentFeesAmount += fees; // update currentFeesAmount
                super._transfer(from, address(this), fees);
            }

            amount -= fees;
        }
        super._transfer(from, to, amount);
    }

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

    function swapBack() private {
        // use currentFeesAmount instead of contract balance to avoid discrepancy
        bool success;
        if (currentFeesAmount == 0) {
            return;
        }
        if (currentFeesAmount >= swapTokensAtAmount) {
            uint256 amountToSwapForETH = currentFeesAmount;
            swapTokensForEth(amountToSwapForETH);
            currentFeesAmount = 0; // reset currentFeesAmount
            uint256 amountEthToSend = address(this).balance;
            uint256 amountToMarketing = amountEthToSend
                .mul(marketingAmount)
                .div(100);
            uint256 amountToDev = amountEthToSend.sub(amountToMarketing);
            (success, ) = address(marketingWallet).call{
                value: amountToMarketing
            }("");
            (success, ) = address(devWallet).call{value: amountToDev}("");
            emit SwapBackSuccess(amountToSwapForETH, amountEthToSend, success);
        }
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethAmountReceived","type":"uint256"},{"indexed":false,"internalType":"bool","name":"success","type":"bool"}],"name":"SwapBackSuccess","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_isExcludedMaxTransactionAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_routerAddress","type":"address"},{"internalType":"uint256","name":"supplyAmount","type":"uint256"}],"name":"addLiquidity","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"automatedMarketMakerPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentFeesAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deadAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"devAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"devWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addressToExclude","type":"address"},{"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"excludeFromMaxTransaction","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":[],"name":"limitsInEffect","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxDeposit","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":"minDeposit","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":[{"internalType":"bytes32","name":"_signedData","type":"bytes32"},{"internalType":"bytes","name":"_signature","type":"bytes"}],"name":"recover","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"removeLimits","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_buyFee","type":"uint256"},{"internalType":"uint256","name":"_sellFee","type":"uint256"}],"name":"setBuyAndSellFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_min","type":"uint256"},{"internalType":"uint256","name":"_max","type":"uint256"}],"name":"setDepositMinMax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxDeposit","type":"uint256"}],"name":"setMaxDeposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"setTrustedSigner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"sig","type":"bytes"}],"name":"splitSignature","outputs":[{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"},{"internalType":"uint8","name":"v","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"swapEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapTokensAtAmount","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":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"trustedSigner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"marketingWallet_","type":"address"},{"internalType":"address","name":"devWallet_","type":"address"}],"name":"updateFeeWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"updateSwapEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"","type":"bytes"}],"name":"usedSignatures","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bytes","name":"_signature","type":"bytes"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

6080604052738395884b62d68b108ea932edad98c8a51b10db47600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550738395884b62d68b108ea932edad98c8a51b10db47600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506bc1ded63574de0e46600000006009556103e8600a600954620000d2919062000966565b620000de9190620009e0565b600a55612710600a600954620000f5919062000966565b620001019190620009e0565b600b556103e8600a60095462000118919062000966565b620001249190620009e0565b600c556000600d556000600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555069152d02c7e14af6800000601055683635c9adc5dea000006011556001601360006101000a81548160ff0219169083151502179055506000601360016101000a81548160ff0219169083151502179055506000601360026101000a81548160ff02191690831515021790555060056014556005601555601e6016556046601755348015620001fb57600080fd5b506040518060400160405280601081526020017f436c617368666f7253746173682e6767000000000000000000000000000000008152506040518060400160405280600581526020017f5354415348000000000000000000000000000000000000000000000000000000815250816003908162000279919062000c88565b5080600490816200028b919062000c88565b505050620002ae620002a2620004df60201b60201c565b620004e760201b60201c565b620002d0620002c2620005ad60201b60201c565b6001620005d760201b60201c565b62000305600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166001620005d760201b60201c565b6200033a600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166001620005d760201b60201c565b6200034d306001620005d760201b60201c565b6200036261dead6001620005d760201b60201c565b6200038462000376620005ad60201b60201c565b6001620006c160201b60201c565b620003b9600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166001620006c160201b60201c565b620003ee600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166001620006c160201b60201c565b62000401306001620006c160201b60201c565b6200041661dead6001620006c160201b60201c565b62000426620005ad60201b60201c565b600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062000476620005ad60201b60201c565b600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620004d9620004ca620005ad60201b60201c565b600954620007ab60201b60201c565b62000ecd565b600033905090565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b620005e7620004df60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff166200060d620005ad60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000666576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200065d9062000dd0565b60405180910390fd5b80601a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b620006d1620004df60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620006f7620005ad60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000750576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620007479062000dd0565b60405180910390fd5b80601b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036200081d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620008149062000e42565b60405180910390fd5b62000831600083836200092360201b60201c565b806002600082825462000845919062000e64565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546200089c919062000e64565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405162000903919062000eb0565b60405180910390a36200091f600083836200092860201b60201c565b5050565b505050565b505050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000973826200092d565b915062000980836200092d565b925082820262000990816200092d565b91508282048414831517620009aa57620009a962000937565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000620009ed826200092d565b9150620009fa836200092d565b92508262000a0d5762000a0c620009b1565b5b828204905092915050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000a9a57607f821691505b60208210810362000ab05762000aaf62000a52565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830262000b1a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000adb565b62000b26868362000adb565b95508019841693508086168417925050509392505050565b6000819050919050565b600062000b6962000b6362000b5d846200092d565b62000b3e565b6200092d565b9050919050565b6000819050919050565b62000b858362000b48565b62000b9d62000b948262000b70565b84845462000ae8565b825550505050565b600090565b62000bb462000ba5565b62000bc181848462000b7a565b505050565b5b8181101562000be95762000bdd60008262000baa565b60018101905062000bc7565b5050565b601f82111562000c385762000c028162000ab6565b62000c0d8462000acb565b8101602085101562000c1d578190505b62000c3562000c2c8562000acb565b83018262000bc6565b50505b505050565b600082821c905092915050565b600062000c5d6000198460080262000c3d565b1980831691505092915050565b600062000c78838362000c4a565b9150826002028217905092915050565b62000c938262000a18565b67ffffffffffffffff81111562000caf5762000cae62000a23565b5b62000cbb825462000a81565b62000cc882828562000bed565b600060209050601f83116001811462000d00576000841562000ceb578287015190505b62000cf7858262000c6a565b86555062000d67565b601f19841662000d108662000ab6565b60005b8281101562000d3a5784890151825560018201915060208501945060208101905062000d13565b8683101562000d5a578489015162000d56601f89168262000c4a565b8355505b6001600288020188555050505b505050505050565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600062000db860208362000d6f565b915062000dc58262000d80565b602082019050919050565b6000602082019050818103600083015262000deb8162000da9565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b600062000e2a601f8362000d6f565b915062000e378262000df2565b602082019050919050565b6000602082019050818103600083015262000e5d8162000e1b565b9050919050565b600062000e71826200092d565b915062000e7e836200092d565b925082820190508082111562000e995762000e9862000937565b5b92915050565b62000eaa816200092d565b82525050565b600060208201905062000ec7600083018462000e9f565b92915050565b6154078062000edd6000396000f3fe60806040526004361061031e5760003560e01c80637571336a116101ab578063b6b55f25116100f7578063e0f3ccf511610095578063e949580e1161006f578063e949580e14610bf2578063f2fde38b14610c2f578063f74d548014610c58578063f8b45b0514610c8357610325565b8063e0f3ccf514610b71578063e2f4560514610b9c578063e4748b9e14610bc757610325565b8063c0246668116100d1578063c024666814610ab5578063c362641214610ade578063c8c8ebe414610b09578063dd62ed3e14610b3457610325565b8063b6b55f2514610a38578063bb371fdd14610a61578063bbc0c74214610a8a57610325565b806395d89b4111610164578063a7ad6ef71161013e578063a7ad6ef714610956578063a7bb58031461097f578063a9059cbb146109be578063b62496f5146109fb57610325565b806395d89b41146108c55780639a7a23d6146108f0578063a457c2d71461091957610325565b80637571336a146107db57806375f0a874146108045780638a8c523c1461082f5780638da5cb5b146108465780638ea5220f14610871578063924de9b71461089c57610325565b8063360bfd541161026a57806356688700116102235780636ddd1713116101fd5780636ddd17131461073157806370a082311461075c578063715018a614610799578063751039fc146107b057610325565b806356688700146106c157806356a1c701146106dd5780636083e59a1461070657610325565b8063360bfd541461059b57806339509351146105c657806341b3d1851461060357806349bd5a5e1461062e5780634a62bb65146106595780634fbee1931461068457610325565b806318160ddd116102d757806325d92ee2116102b157806325d92ee2146104f157806327c8f8351461051a5780632b34596414610545578063313ce5671461057057610325565b806318160ddd1461044c57806319045a251461047757806323b872dd146104b457610325565b8063030ba25d1461032a57806306fdde0314610353578063095ea7b31461037e5780630a840713146103bb57806310d5de53146103e45780631694505e1461042157610325565b3661032557005b600080fd5b34801561033657600080fd5b50610351600480360381019061034c9190613bea565b610cae565b005b34801561035f57600080fd5b50610368610fdd565b6040516103759190613cc5565b60405180910390f35b34801561038a57600080fd5b506103a560048036038101906103a09190613d45565b61106f565b6040516103b29190613da0565b60405180910390f35b3480156103c757600080fd5b506103e260048036038101906103dd9190613dbb565b61108d565b005b3480156103f057600080fd5b5061040b60048036038101906104069190613dfb565b61111b565b6040516104189190613da0565b60405180910390f35b34801561042d57600080fd5b5061043661113b565b6040516104439190613e87565b60405180910390f35b34801561045857600080fd5b50610461611161565b60405161046e9190613eb1565b60405180910390f35b34801561048357600080fd5b5061049e60048036038101906104999190613f02565b61116b565b6040516104ab9190613f6d565b60405180910390f35b3480156104c057600080fd5b506104db60048036038101906104d69190613f88565b6111da565b6040516104e89190613da0565b60405180910390f35b3480156104fd57600080fd5b5061051860048036038101906105139190613fdb565b6112d2565b005b34801561052657600080fd5b5061052f6113d4565b60405161053c9190613f6d565b60405180910390f35b34801561055157600080fd5b5061055a6113da565b6040516105679190613eb1565b60405180910390f35b34801561057c57600080fd5b506105856113e0565b6040516105929190614037565b60405180910390f35b3480156105a757600080fd5b506105b06113e9565b6040516105bd9190613eb1565b60405180910390f35b3480156105d257600080fd5b506105ed60048036038101906105e89190613d45565b6113ef565b6040516105fa9190613da0565b60405180910390f35b34801561060f57600080fd5b5061061861149b565b6040516106259190613eb1565b60405180910390f35b34801561063a57600080fd5b506106436114a1565b6040516106509190613f6d565b60405180910390f35b34801561066557600080fd5b5061066e6114c7565b60405161067b9190613da0565b60405180910390f35b34801561069057600080fd5b506106ab60048036038101906106a69190613dfb565b6114da565b6040516106b89190613da0565b60405180910390f35b6106db60048036038101906106d69190613d45565b611530565b005b3480156106e957600080fd5b5061070460048036038101906106ff9190613dfb565b6118b5565b005b34801561071257600080fd5b5061071b611975565b6040516107289190613eb1565b60405180910390f35b34801561073d57600080fd5b5061074661197b565b6040516107539190613da0565b60405180910390f35b34801561076857600080fd5b50610783600480360381019061077e9190613dfb565b61198e565b6040516107909190613eb1565b60405180910390f35b3480156107a557600080fd5b506107ae6119d6565b005b3480156107bc57600080fd5b506107c5611a5e565b6040516107d29190613da0565b60405180910390f35b3480156107e757600080fd5b5061080260048036038101906107fd919061407e565b611afe565b005b34801561081057600080fd5b50610819611bd5565b6040516108269190613f6d565b60405180910390f35b34801561083b57600080fd5b50610844611bfb565b005b34801561085257600080fd5b5061085b611caf565b6040516108689190613f6d565b60405180910390f35b34801561087d57600080fd5b50610886611cd9565b6040516108939190613f6d565b60405180910390f35b3480156108a857600080fd5b506108c360048036038101906108be91906140be565b611cff565b005b3480156108d157600080fd5b506108da611d98565b6040516108e79190613cc5565b60405180910390f35b3480156108fc57600080fd5b506109176004803603810190610912919061407e565b611e2a565b005b34801561092557600080fd5b50610940600480360381019061093b9190613d45565b611f44565b60405161094d9190613da0565b60405180910390f35b34801561096257600080fd5b5061097d60048036038101906109789190613dbb565b61202f565b005b34801561098b57600080fd5b506109a660048036038101906109a191906140eb565b6120bd565b6040516109b593929190614143565b60405180910390f35b3480156109ca57600080fd5b506109e560048036038101906109e09190613d45565b6120ef565b6040516109f29190613da0565b60405180910390f35b348015610a0757600080fd5b50610a226004803603810190610a1d9190613dfb565b61210d565b604051610a2f9190613da0565b60405180910390f35b348015610a4457600080fd5b50610a5f6004803603810190610a5a919061417a565b61212d565b005b348015610a6d57600080fd5b50610a886004803603810190610a83919061417a565b61233d565b005b348015610a9657600080fd5b50610a9f6123c3565b604051610aac9190613da0565b60405180910390f35b348015610ac157600080fd5b50610adc6004803603810190610ad7919061407e565b6123d6565b005b348015610aea57600080fd5b50610af36124ad565b604051610b009190613eb1565b60405180910390f35b348015610b1557600080fd5b50610b1e6124b3565b604051610b2b9190613eb1565b60405180910390f35b348015610b4057600080fd5b50610b5b6004803603810190610b569190613fdb565b6124b9565b604051610b689190613eb1565b60405180910390f35b348015610b7d57600080fd5b50610b86612540565b604051610b939190613eb1565b60405180910390f35b348015610ba857600080fd5b50610bb1612546565b604051610bbe9190613eb1565b60405180910390f35b348015610bd357600080fd5b50610bdc61254c565b604051610be99190613eb1565b60405180910390f35b348015610bfe57600080fd5b50610c196004803603810190610c1491906140eb565b612552565b604051610c269190613da0565b60405180910390f35b348015610c3b57600080fd5b50610c566004803603810190610c519190613dfb565b612588565b005b348015610c6457600080fd5b50610c6d61267f565b604051610c7a9190613f6d565b60405180910390f35b348015610c8f57600080fd5b50610c986126a5565b604051610ca59190613eb1565b60405180910390f35b600033600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684604051602001610ce793929190614210565b604051602081830303815290604052805190602001209050600081604051602001610d1291906142c5565b6040516020818303038152906040528051906020012090506000610d36828561116b565b9050600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610dc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dbf90614337565b60405180910390fd5b600e84604051610dd8919061439e565b908152602001604051809103902060009054906101000a900460ff1615610e34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2b90614401565b60405180910390fd5b6000601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411610eb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ead9061446d565b60405180910390fd5b6001600e85604051610ec8919061439e565b908152602001604051809103902060006101000a81548160ff02191690831515021790555084610ef73061198e565b1015610f38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2f906144d9565b60405180910390fd5b610f433033876126ab565b6000601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055503373ffffffffffffffffffffffffffffffffffffffff167f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a942436486604051610fce9190613eb1565b60405180910390a25050505050565b606060038054610fec90614528565b80601f016020809104026020016040519081016040528092919081815260200182805461101890614528565b80156110655780601f1061103a57610100808354040283529160200191611065565b820191906000526020600020905b81548152906001019060200180831161104857829003601f168201915b5050505050905090565b600061108361107c61292a565b8484612932565b6001905092915050565b61109561292a565b73ffffffffffffffffffffffffffffffffffffffff166110b3611caf565b73ffffffffffffffffffffffffffffffffffffffff1614611109576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611100906145a5565b60405180910390fd5b80601581905550816014819055505050565b601b6020528060005260406000206000915054906101000a900460ff1681565b601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600254905090565b60008060008061117a856120bd565b925092509250600186828585604051600081526020016040526040516111a394939291906145c5565b6020604051602081039080840390855afa1580156111c5573d6000803e3d6000fd5b50505060206040510351935050505092915050565b60006111e7848484612afb565b6000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600061123261292a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050828110156112b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a99061467c565b60405180910390fd5b6112c6856112be61292a565b858403612932565b60019150509392505050565b6112da61292a565b73ffffffffffffffffffffffffffffffffffffffff166112f8611caf565b73ffffffffffffffffffffffffffffffffffffffff161461134e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611345906145a5565b60405180910390fd5b80600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b61dead81565b60175481565b60006012905090565b60165481565b60006114916113fc61292a565b84846001600061140a61292a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461148c91906146cb565b612932565b6001905092915050565b60115481565b601960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601360009054906101000a900460ff1681565b6000601a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b61153861292a565b73ffffffffffffffffffffffffffffffffffffffff16611556611caf565b73ffffffffffffffffffffffffffffffffffffffff16146115ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a3906145a5565b60405180910390fd5b600082905080601860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506115fd816001611afe565b611608308284612932565b8073ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015611653573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116779190614714565b73ffffffffffffffffffffffffffffffffffffffff1663c9c65396308373ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156116de573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117029190614714565b6040518363ffffffff1660e01b815260040161171f929190614741565b6020604051808303816000875af115801561173e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117629190614714565b601960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506117cf601960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166001611afe565b6117fc601960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660016134b8565b601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d719343085600080611848611caf565b426040518863ffffffff1660e01b815260040161186a969594939291906147a5565b60606040518083038185885af1158015611888573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906118ad919061481b565b505050505050565b6118bd61292a565b73ffffffffffffffffffffffffffffffffffffffff166118db611caf565b73ffffffffffffffffffffffffffffffffffffffff1614611931576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611928906145a5565b60405180910390fd5b80600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60105481565b601360029054906101000a900460ff1681565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6119de61292a565b73ffffffffffffffffffffffffffffffffffffffff166119fc611caf565b73ffffffffffffffffffffffffffffffffffffffff1614611a52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a49906145a5565b60405180910390fd5b611a5c6000613513565b565b6000611a6861292a565b73ffffffffffffffffffffffffffffffffffffffff16611a86611caf565b73ffffffffffffffffffffffffffffffffffffffff1614611adc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad3906145a5565b60405180910390fd5b6000601360006101000a81548160ff0219169083151502179055506001905090565b611b0661292a565b73ffffffffffffffffffffffffffffffffffffffff16611b24611caf565b73ffffffffffffffffffffffffffffffffffffffff1614611b7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b71906145a5565b60405180910390fd5b80601b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611c0361292a565b73ffffffffffffffffffffffffffffffffffffffff16611c21611caf565b73ffffffffffffffffffffffffffffffffffffffff1614611c77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6e906145a5565b60405180910390fd5b6001601360016101000a81548160ff0219169083151502179055506001601360026101000a81548160ff021916908315150217905550565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611d0761292a565b73ffffffffffffffffffffffffffffffffffffffff16611d25611caf565b73ffffffffffffffffffffffffffffffffffffffff1614611d7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d72906145a5565b60405180910390fd5b80601360026101000a81548160ff02191690831515021790555050565b606060048054611da790614528565b80601f0160208091040260200160405190810160405280929190818152602001828054611dd390614528565b8015611e205780601f10611df557610100808354040283529160200191611e20565b820191906000526020600020905b815481529060010190602001808311611e0357829003601f168201915b5050505050905090565b611e3261292a565b73ffffffffffffffffffffffffffffffffffffffff16611e50611caf565b73ffffffffffffffffffffffffffffffffffffffff1614611ea6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9d906145a5565b60405180910390fd5b601960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611f36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2d906148e0565b60405180910390fd5b611f4082826134b8565b5050565b60008060016000611f5361292a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015612010576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161200790614972565b60405180910390fd5b61202461201b61292a565b85858403612932565b600191505092915050565b61203761292a565b73ffffffffffffffffffffffffffffffffffffffff16612055611caf565b73ffffffffffffffffffffffffffffffffffffffff16146120ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120a2906145a5565b60405180910390fd5b81601181905550806010819055505050565b600080600060418451146120d057600080fd5b6020840151925060408401519150606084015160001a90509193909250565b60006121036120fc61292a565b8484612afb565b6001905092915050565b601c6020528060005260406000206000915054906101000a900460ff1681565b601154811015612172576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161216990614a04565b60405180910390fd5b6010548111156121b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121ae90614a96565b60405180910390fd5b60105461220c82601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546135d990919063ffffffff16565b1061224c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161224390614b28565b60405180910390fd5b6122573330836126ab565b6122a981601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546135d990919063ffffffff16565b601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055503373ffffffffffffffffffffffffffffffffffffffff167fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c826040516123329190613eb1565b60405180910390a250565b61234561292a565b73ffffffffffffffffffffffffffffffffffffffff16612363611caf565b73ffffffffffffffffffffffffffffffffffffffff16146123b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123b0906145a5565b60405180910390fd5b8060108190555050565b601360019054906101000a900460ff1681565b6123de61292a565b73ffffffffffffffffffffffffffffffffffffffff166123fc611caf565b73ffffffffffffffffffffffffffffffffffffffff1614612452576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612449906145a5565b60405180910390fd5b80601a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600d5481565b600a5481565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60155481565b600b5481565b60145481565b600e818051602081018201805184825260208301602085012081835280955050505050506000915054906101000a900460ff1681565b61259061292a565b73ffffffffffffffffffffffffffffffffffffffff166125ae611caf565b73ffffffffffffffffffffffffffffffffffffffff1614612604576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125fb906145a5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612673576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161266a90614bba565b60405180910390fd5b61267c81613513565b50565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600c5481565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361271a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161271190614c4c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612789576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161278090614cde565b60405180910390fd5b6127948383836135ef565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561281a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161281190614d70565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546128ad91906146cb565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516129119190613eb1565b60405180910390a36129248484846135f4565b50505050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036129a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161299890614e02565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612a10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a0790614e94565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051612aee9190613eb1565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612b6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b6190614c4c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612bd9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bd090614cde565b60405180910390fd5b60008111612c1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c1390614f26565b60405180910390fd5b601360009054906101000a900460ff161561311757612c39611caf565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015612ca75750612c77611caf565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b8015612ce05750600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b8015612d1a575061dead73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b8015612d335750600660149054906101000a900460ff16155b1561311657601360019054906101000a900460ff16612e2d57601a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680612ded5750601a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b612e2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e2390614f92565b60405180910390fd5b5b601c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168015612ed05750601b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15612f7757600a54811115612f1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f1190615024565b60405180910390fd5b600c54612f268361198e565b82612f3191906146cb565b1115612f72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f6990615090565b60405180910390fd5b613115565b601c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16801561301a5750601b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b1561306957600a54811115613064576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161305b90615122565b60405180910390fd5b613114565b601b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661311357600c546130c68361198e565b826130d191906146cb565b1115613112576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161310990615090565b60405180910390fd5b5b5b5b5b5b601360029054906101000a900460ff1680156131405750600660149054906101000a900460ff16155b80156131965750601c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b80156131ec5750601a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b80156132425750601a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15613286576001600660146101000a81548160ff02191690831515021790555061326a6135f9565b6000600660146101000a81548160ff0219169083151502179055505b6000600660149054906101000a900460ff16159050601a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168061333c5750601a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b1561334657600090505b600081156134a657601c60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680156133a957506000601554115b156133dd576133d660646133c8601554866137d590919063ffffffff16565b6137eb90919063ffffffff16565b9050613469565b601c60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16801561343857506000601454115b15613468576134656064613457601454866137d590919063ffffffff16565b6137eb90919063ffffffff16565b90505b5b60008111156134975780600d600082825461348491906146cb565b925050819055506134968530836126ab565b5b80836134a39190615142565b92505b6134b18585856126ab565b5050505050565b80601c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081836135e791906146cb565b905092915050565b505050565b505050565b600080600d540361360a57506137d3565b600b54600d54106137d1576000600d54905061362581613801565b6000600d819055506000479050600061365c606461364e601654856137d590919063ffffffff16565b6137eb90919063ffffffff16565b905060006136738284613a4490919063ffffffff16565b9050600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16826040516136bb9061519c565b60006040518083038185875af1925050503d80600081146136f8576040519150601f19603f3d011682016040523d82523d6000602084013e6136fd565b606091505b505080955050600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16816040516137499061519c565b60006040518083038185875af1925050503d8060008114613786576040519150601f19603f3d011682016040523d82523d6000602084013e61378b565b606091505b5050809550507fe9f689eb4d290dd3a40869ea626055ee4a55d40f20286208d04ef55f39254cff8484876040516137c4939291906151b1565b60405180910390a1505050505b505b565b600081836137e391906151e8565b905092915050565b600081836137f99190615259565b905092915050565b6000600267ffffffffffffffff81111561381e5761381d613abf565b5b60405190808252806020026020018201604052801561384c5781602001602082028036833780820191505090505b50905030816000815181106138645761386361528a565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801561390b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061392f9190614714565b816001815181106139435761394261528a565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506139aa30601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684612932565b601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b8152600401613a0e959493929190615377565b600060405180830381600087803b158015613a2857600080fd5b505af1158015613a3c573d6000803e3d6000fd5b505050505050565b60008183613a529190615142565b905092915050565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b613a8181613a6e565b8114613a8c57600080fd5b50565b600081359050613a9e81613a78565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613af782613aae565b810181811067ffffffffffffffff82111715613b1657613b15613abf565b5b80604052505050565b6000613b29613a5a565b9050613b358282613aee565b919050565b600067ffffffffffffffff821115613b5557613b54613abf565b5b613b5e82613aae565b9050602081019050919050565b82818337600083830152505050565b6000613b8d613b8884613b3a565b613b1f565b905082815260208101848484011115613ba957613ba8613aa9565b5b613bb4848285613b6b565b509392505050565b600082601f830112613bd157613bd0613aa4565b5b8135613be1848260208601613b7a565b91505092915050565b60008060408385031215613c0157613c00613a64565b5b6000613c0f85828601613a8f565b925050602083013567ffffffffffffffff811115613c3057613c2f613a69565b5b613c3c85828601613bbc565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613c80578082015181840152602081019050613c65565b60008484015250505050565b6000613c9782613c46565b613ca18185613c51565b9350613cb1818560208601613c62565b613cba81613aae565b840191505092915050565b60006020820190508181036000830152613cdf8184613c8c565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613d1282613ce7565b9050919050565b613d2281613d07565b8114613d2d57600080fd5b50565b600081359050613d3f81613d19565b92915050565b60008060408385031215613d5c57613d5b613a64565b5b6000613d6a85828601613d30565b9250506020613d7b85828601613a8f565b9150509250929050565b60008115159050919050565b613d9a81613d85565b82525050565b6000602082019050613db56000830184613d91565b92915050565b60008060408385031215613dd257613dd1613a64565b5b6000613de085828601613a8f565b9250506020613df185828601613a8f565b9150509250929050565b600060208284031215613e1157613e10613a64565b5b6000613e1f84828501613d30565b91505092915050565b6000819050919050565b6000613e4d613e48613e4384613ce7565b613e28565b613ce7565b9050919050565b6000613e5f82613e32565b9050919050565b6000613e7182613e54565b9050919050565b613e8181613e66565b82525050565b6000602082019050613e9c6000830184613e78565b92915050565b613eab81613a6e565b82525050565b6000602082019050613ec66000830184613ea2565b92915050565b6000819050919050565b613edf81613ecc565b8114613eea57600080fd5b50565b600081359050613efc81613ed6565b92915050565b60008060408385031215613f1957613f18613a64565b5b6000613f2785828601613eed565b925050602083013567ffffffffffffffff811115613f4857613f47613a69565b5b613f5485828601613bbc565b9150509250929050565b613f6781613d07565b82525050565b6000602082019050613f826000830184613f5e565b92915050565b600080600060608486031215613fa157613fa0613a64565b5b6000613faf86828701613d30565b9350506020613fc086828701613d30565b9250506040613fd186828701613a8f565b9150509250925092565b60008060408385031215613ff257613ff1613a64565b5b600061400085828601613d30565b925050602061401185828601613d30565b9150509250929050565b600060ff82169050919050565b6140318161401b565b82525050565b600060208201905061404c6000830184614028565b92915050565b61405b81613d85565b811461406657600080fd5b50565b60008135905061407881614052565b92915050565b6000806040838503121561409557614094613a64565b5b60006140a385828601613d30565b92505060206140b485828601614069565b9150509250929050565b6000602082840312156140d4576140d3613a64565b5b60006140e284828501614069565b91505092915050565b60006020828403121561410157614100613a64565b5b600082013567ffffffffffffffff81111561411f5761411e613a69565b5b61412b84828501613bbc565b91505092915050565b61413d81613ecc565b82525050565b60006060820190506141586000830186614134565b6141656020830185614134565b6141726040830184614028565b949350505050565b6000602082840312156141905761418f613a64565b5b600061419e84828501613a8f565b91505092915050565b60008160601b9050919050565b60006141bf826141a7565b9050919050565b60006141d1826141b4565b9050919050565b6141e96141e482613d07565b6141c6565b82525050565b6000819050919050565b61420a61420582613a6e565b6141ef565b82525050565b600061421c82866141d8565b60148201915061422c82856141d8565b60148201915061423c82846141f9565b602082019150819050949350505050565b600081905092915050565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b600061428e601c8361424d565b915061429982614258565b601c82019050919050565b6000819050919050565b6142bf6142ba82613ecc565b6142a4565b82525050565b60006142d082614281565b91506142dc82846142ae565b60208201915081905092915050565b7f496e76616c6964207369676e6174757265000000000000000000000000000000600082015250565b6000614321601183613c51565b915061432c826142eb565b602082019050919050565b6000602082019050818103600083015261435081614314565b9050919050565b600081519050919050565b600081905092915050565b600061437882614357565b6143828185614362565b9350614392818560208601613c62565b80840191505092915050565b60006143aa828461436d565b915081905092915050565b7f5369676e61747572652068617320616c7265616479206265656e207573656400600082015250565b60006143eb601f83613c51565b91506143f6826143b5565b602082019050919050565b6000602082019050818103600083015261441a816143de565b9050919050565b7f4465706f736974206d7573742062652067726561746572207468616e20300000600082015250565b6000614457601e83613c51565b915061446282614421565b602082019050919050565b600060208201905081810360008301526144868161444a565b9050919050565b7f496e73756666696369656e7420636f6e74726163742062616c616e6365000000600082015250565b60006144c3601d83613c51565b91506144ce8261448d565b602082019050919050565b600060208201905081810360008301526144f2816144b6565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061454057607f821691505b602082108103614553576145526144f9565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061458f602083613c51565b915061459a82614559565b602082019050919050565b600060208201905081810360008301526145be81614582565b9050919050565b60006080820190506145da6000830187614134565b6145e76020830186614028565b6145f46040830185614134565b6146016060830184614134565b95945050505050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206160008201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000602082015250565b6000614666602883613c51565b91506146718261460a565b604082019050919050565b6000602082019050818103600083015261469581614659565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006146d682613a6e565b91506146e183613a6e565b92508282019050808211156146f9576146f861469c565b5b92915050565b60008151905061470e81613d19565b92915050565b60006020828403121561472a57614729613a64565b5b6000614738848285016146ff565b91505092915050565b60006040820190506147566000830185613f5e565b6147636020830184613f5e565b9392505050565b6000819050919050565b600061478f61478a6147858461476a565b613e28565b613a6e565b9050919050565b61479f81614774565b82525050565b600060c0820190506147ba6000830189613f5e565b6147c76020830188613ea2565b6147d46040830187614796565b6147e16060830186614796565b6147ee6080830185613f5e565b6147fb60a0830184613ea2565b979650505050505050565b60008151905061481581613a78565b92915050565b60008060006060848603121561483457614833613a64565b5b600061484286828701614806565b935050602061485386828701614806565b925050604061486486828701614806565b9150509250925092565b7f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060008201527f6175746f6d617465644d61726b65744d616b6572506169727300000000000000602082015250565b60006148ca603983613c51565b91506148d58261486e565b604082019050919050565b600060208201905081810360008301526148f9816148bd565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b600061495c602583613c51565b915061496782614900565b604082019050919050565b6000602082019050818103600083015261498b8161494f565b9050919050565b7f4465706f73697420616d6f756e74206d7573742062652067726561746572207460008201527f68616e20746865206d696e696d756d0000000000000000000000000000000000602082015250565b60006149ee602f83613c51565b91506149f982614992565b604082019050919050565b60006020820190508181036000830152614a1d816149e1565b9050919050565b7f4465706f73697420616d6f756e742065786365656473206d6178696d756d206c60008201527f696d697400000000000000000000000000000000000000000000000000000000602082015250565b6000614a80602483613c51565b9150614a8b82614a24565b604082019050919050565b60006020820190508181036000830152614aaf81614a73565b9050919050565b7f546f74616c206465706f736974732063616e6e6f7420657863656564206d617860008201527f696d756d00000000000000000000000000000000000000000000000000000000602082015250565b6000614b12602483613c51565b9150614b1d82614ab6565b604082019050919050565b60006020820190508181036000830152614b4181614b05565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614ba4602683613c51565b9150614baf82614b48565b604082019050919050565b60006020820190508181036000830152614bd381614b97565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000614c36602583613c51565b9150614c4182614bda565b604082019050919050565b60006020820190508181036000830152614c6581614c29565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000614cc8602383613c51565b9150614cd382614c6c565b604082019050919050565b60006020820190508181036000830152614cf781614cbb565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b6000614d5a602683613c51565b9150614d6582614cfe565b604082019050919050565b60006020820190508181036000830152614d8981614d4d565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614dec602483613c51565b9150614df782614d90565b604082019050919050565b60006020820190508181036000830152614e1b81614ddf565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000614e7e602283613c51565b9150614e8982614e22565b604082019050919050565b60006020820190508181036000830152614ead81614e71565b9050919050565b7f5472616e7366657220616d6f756e74206d75737420626520677265617465722060008201527f7468616e207a65726f0000000000000000000000000000000000000000000000602082015250565b6000614f10602983613c51565b9150614f1b82614eb4565b604082019050919050565b60006020820190508181036000830152614f3f81614f03565b9050919050565b7f54726164696e67206973206e6f7420656e61626c6564207965742e0000000000600082015250565b6000614f7c601b83613c51565b9150614f8782614f46565b602082019050919050565b60006020820190508181036000830152614fab81614f6f565b9050919050565b7f427579207472616e7366657220616d6f756e742065786365656473207468652060008201527f6d61785472616e73616374696f6e416d6f756e742e0000000000000000000000602082015250565b600061500e603583613c51565b915061501982614fb2565b604082019050919050565b6000602082019050818103600083015261503d81615001565b9050919050565b7f4d61782077616c6c657420657863656564656400000000000000000000000000600082015250565b600061507a601383613c51565b915061508582615044565b602082019050919050565b600060208201905081810360008301526150a98161506d565b9050919050565b7f53656c6c207472616e7366657220616d6f756e7420657863656564732074686560008201527f206d61785472616e73616374696f6e416d6f756e742e00000000000000000000602082015250565b600061510c603683613c51565b9150615117826150b0565b604082019050919050565b6000602082019050818103600083015261513b816150ff565b9050919050565b600061514d82613a6e565b915061515883613a6e565b92508282039050818111156151705761516f61469c565b5b92915050565b50565b6000615186600083614362565b915061519182615176565b600082019050919050565b60006151a782615179565b9150819050919050565b60006060820190506151c66000830186613ea2565b6151d36020830185613ea2565b6151e06040830184613d91565b949350505050565b60006151f382613a6e565b91506151fe83613a6e565b925082820261520c81613a6e565b915082820484148315176152235761522261469c565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061526482613a6e565b915061526f83613a6e565b92508261527f5761527e61522a565b5b828204905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6152ee81613d07565b82525050565b600061530083836152e5565b60208301905092915050565b6000602082019050919050565b6000615324826152b9565b61532e81856152c4565b9350615339836152d5565b8060005b8381101561536a57815161535188826152f4565b975061535c8361530c565b92505060018101905061533d565b5085935050505092915050565b600060a08201905061538c6000830188613ea2565b6153996020830187614796565b81810360408301526153ab8186615319565b90506153ba6060830185613f5e565b6153c76080830184613ea2565b969550505050505056fea2646970667358221220546cda3f1bc03628d6dee15f12073c5659556964776824f6cbc2e4b4d9f59f9264736f6c63430008120033

Deployed Bytecode

0x60806040526004361061031e5760003560e01c80637571336a116101ab578063b6b55f25116100f7578063e0f3ccf511610095578063e949580e1161006f578063e949580e14610bf2578063f2fde38b14610c2f578063f74d548014610c58578063f8b45b0514610c8357610325565b8063e0f3ccf514610b71578063e2f4560514610b9c578063e4748b9e14610bc757610325565b8063c0246668116100d1578063c024666814610ab5578063c362641214610ade578063c8c8ebe414610b09578063dd62ed3e14610b3457610325565b8063b6b55f2514610a38578063bb371fdd14610a61578063bbc0c74214610a8a57610325565b806395d89b4111610164578063a7ad6ef71161013e578063a7ad6ef714610956578063a7bb58031461097f578063a9059cbb146109be578063b62496f5146109fb57610325565b806395d89b41146108c55780639a7a23d6146108f0578063a457c2d71461091957610325565b80637571336a146107db57806375f0a874146108045780638a8c523c1461082f5780638da5cb5b146108465780638ea5220f14610871578063924de9b71461089c57610325565b8063360bfd541161026a57806356688700116102235780636ddd1713116101fd5780636ddd17131461073157806370a082311461075c578063715018a614610799578063751039fc146107b057610325565b806356688700146106c157806356a1c701146106dd5780636083e59a1461070657610325565b8063360bfd541461059b57806339509351146105c657806341b3d1851461060357806349bd5a5e1461062e5780634a62bb65146106595780634fbee1931461068457610325565b806318160ddd116102d757806325d92ee2116102b157806325d92ee2146104f157806327c8f8351461051a5780632b34596414610545578063313ce5671461057057610325565b806318160ddd1461044c57806319045a251461047757806323b872dd146104b457610325565b8063030ba25d1461032a57806306fdde0314610353578063095ea7b31461037e5780630a840713146103bb57806310d5de53146103e45780631694505e1461042157610325565b3661032557005b600080fd5b34801561033657600080fd5b50610351600480360381019061034c9190613bea565b610cae565b005b34801561035f57600080fd5b50610368610fdd565b6040516103759190613cc5565b60405180910390f35b34801561038a57600080fd5b506103a560048036038101906103a09190613d45565b61106f565b6040516103b29190613da0565b60405180910390f35b3480156103c757600080fd5b506103e260048036038101906103dd9190613dbb565b61108d565b005b3480156103f057600080fd5b5061040b60048036038101906104069190613dfb565b61111b565b6040516104189190613da0565b60405180910390f35b34801561042d57600080fd5b5061043661113b565b6040516104439190613e87565b60405180910390f35b34801561045857600080fd5b50610461611161565b60405161046e9190613eb1565b60405180910390f35b34801561048357600080fd5b5061049e60048036038101906104999190613f02565b61116b565b6040516104ab9190613f6d565b60405180910390f35b3480156104c057600080fd5b506104db60048036038101906104d69190613f88565b6111da565b6040516104e89190613da0565b60405180910390f35b3480156104fd57600080fd5b5061051860048036038101906105139190613fdb565b6112d2565b005b34801561052657600080fd5b5061052f6113d4565b60405161053c9190613f6d565b60405180910390f35b34801561055157600080fd5b5061055a6113da565b6040516105679190613eb1565b60405180910390f35b34801561057c57600080fd5b506105856113e0565b6040516105929190614037565b60405180910390f35b3480156105a757600080fd5b506105b06113e9565b6040516105bd9190613eb1565b60405180910390f35b3480156105d257600080fd5b506105ed60048036038101906105e89190613d45565b6113ef565b6040516105fa9190613da0565b60405180910390f35b34801561060f57600080fd5b5061061861149b565b6040516106259190613eb1565b60405180910390f35b34801561063a57600080fd5b506106436114a1565b6040516106509190613f6d565b60405180910390f35b34801561066557600080fd5b5061066e6114c7565b60405161067b9190613da0565b60405180910390f35b34801561069057600080fd5b506106ab60048036038101906106a69190613dfb565b6114da565b6040516106b89190613da0565b60405180910390f35b6106db60048036038101906106d69190613d45565b611530565b005b3480156106e957600080fd5b5061070460048036038101906106ff9190613dfb565b6118b5565b005b34801561071257600080fd5b5061071b611975565b6040516107289190613eb1565b60405180910390f35b34801561073d57600080fd5b5061074661197b565b6040516107539190613da0565b60405180910390f35b34801561076857600080fd5b50610783600480360381019061077e9190613dfb565b61198e565b6040516107909190613eb1565b60405180910390f35b3480156107a557600080fd5b506107ae6119d6565b005b3480156107bc57600080fd5b506107c5611a5e565b6040516107d29190613da0565b60405180910390f35b3480156107e757600080fd5b5061080260048036038101906107fd919061407e565b611afe565b005b34801561081057600080fd5b50610819611bd5565b6040516108269190613f6d565b60405180910390f35b34801561083b57600080fd5b50610844611bfb565b005b34801561085257600080fd5b5061085b611caf565b6040516108689190613f6d565b60405180910390f35b34801561087d57600080fd5b50610886611cd9565b6040516108939190613f6d565b60405180910390f35b3480156108a857600080fd5b506108c360048036038101906108be91906140be565b611cff565b005b3480156108d157600080fd5b506108da611d98565b6040516108e79190613cc5565b60405180910390f35b3480156108fc57600080fd5b506109176004803603810190610912919061407e565b611e2a565b005b34801561092557600080fd5b50610940600480360381019061093b9190613d45565b611f44565b60405161094d9190613da0565b60405180910390f35b34801561096257600080fd5b5061097d60048036038101906109789190613dbb565b61202f565b005b34801561098b57600080fd5b506109a660048036038101906109a191906140eb565b6120bd565b6040516109b593929190614143565b60405180910390f35b3480156109ca57600080fd5b506109e560048036038101906109e09190613d45565b6120ef565b6040516109f29190613da0565b60405180910390f35b348015610a0757600080fd5b50610a226004803603810190610a1d9190613dfb565b61210d565b604051610a2f9190613da0565b60405180910390f35b348015610a4457600080fd5b50610a5f6004803603810190610a5a919061417a565b61212d565b005b348015610a6d57600080fd5b50610a886004803603810190610a83919061417a565b61233d565b005b348015610a9657600080fd5b50610a9f6123c3565b604051610aac9190613da0565b60405180910390f35b348015610ac157600080fd5b50610adc6004803603810190610ad7919061407e565b6123d6565b005b348015610aea57600080fd5b50610af36124ad565b604051610b009190613eb1565b60405180910390f35b348015610b1557600080fd5b50610b1e6124b3565b604051610b2b9190613eb1565b60405180910390f35b348015610b4057600080fd5b50610b5b6004803603810190610b569190613fdb565b6124b9565b604051610b689190613eb1565b60405180910390f35b348015610b7d57600080fd5b50610b86612540565b604051610b939190613eb1565b60405180910390f35b348015610ba857600080fd5b50610bb1612546565b604051610bbe9190613eb1565b60405180910390f35b348015610bd357600080fd5b50610bdc61254c565b604051610be99190613eb1565b60405180910390f35b348015610bfe57600080fd5b50610c196004803603810190610c1491906140eb565b612552565b604051610c269190613da0565b60405180910390f35b348015610c3b57600080fd5b50610c566004803603810190610c519190613dfb565b612588565b005b348015610c6457600080fd5b50610c6d61267f565b604051610c7a9190613f6d565b60405180910390f35b348015610c8f57600080fd5b50610c986126a5565b604051610ca59190613eb1565b60405180910390f35b600033600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684604051602001610ce793929190614210565b604051602081830303815290604052805190602001209050600081604051602001610d1291906142c5565b6040516020818303038152906040528051906020012090506000610d36828561116b565b9050600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610dc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dbf90614337565b60405180910390fd5b600e84604051610dd8919061439e565b908152602001604051809103902060009054906101000a900460ff1615610e34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2b90614401565b60405180910390fd5b6000601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411610eb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ead9061446d565b60405180910390fd5b6001600e85604051610ec8919061439e565b908152602001604051809103902060006101000a81548160ff02191690831515021790555084610ef73061198e565b1015610f38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2f906144d9565b60405180910390fd5b610f433033876126ab565b6000601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055503373ffffffffffffffffffffffffffffffffffffffff167f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a942436486604051610fce9190613eb1565b60405180910390a25050505050565b606060038054610fec90614528565b80601f016020809104026020016040519081016040528092919081815260200182805461101890614528565b80156110655780601f1061103a57610100808354040283529160200191611065565b820191906000526020600020905b81548152906001019060200180831161104857829003601f168201915b5050505050905090565b600061108361107c61292a565b8484612932565b6001905092915050565b61109561292a565b73ffffffffffffffffffffffffffffffffffffffff166110b3611caf565b73ffffffffffffffffffffffffffffffffffffffff1614611109576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611100906145a5565b60405180910390fd5b80601581905550816014819055505050565b601b6020528060005260406000206000915054906101000a900460ff1681565b601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600254905090565b60008060008061117a856120bd565b925092509250600186828585604051600081526020016040526040516111a394939291906145c5565b6020604051602081039080840390855afa1580156111c5573d6000803e3d6000fd5b50505060206040510351935050505092915050565b60006111e7848484612afb565b6000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600061123261292a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050828110156112b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a99061467c565b60405180910390fd5b6112c6856112be61292a565b858403612932565b60019150509392505050565b6112da61292a565b73ffffffffffffffffffffffffffffffffffffffff166112f8611caf565b73ffffffffffffffffffffffffffffffffffffffff161461134e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611345906145a5565b60405180910390fd5b80600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b61dead81565b60175481565b60006012905090565b60165481565b60006114916113fc61292a565b84846001600061140a61292a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461148c91906146cb565b612932565b6001905092915050565b60115481565b601960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601360009054906101000a900460ff1681565b6000601a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b61153861292a565b73ffffffffffffffffffffffffffffffffffffffff16611556611caf565b73ffffffffffffffffffffffffffffffffffffffff16146115ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a3906145a5565b60405180910390fd5b600082905080601860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506115fd816001611afe565b611608308284612932565b8073ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015611653573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116779190614714565b73ffffffffffffffffffffffffffffffffffffffff1663c9c65396308373ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156116de573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117029190614714565b6040518363ffffffff1660e01b815260040161171f929190614741565b6020604051808303816000875af115801561173e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117629190614714565b601960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506117cf601960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166001611afe565b6117fc601960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660016134b8565b601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d719343085600080611848611caf565b426040518863ffffffff1660e01b815260040161186a969594939291906147a5565b60606040518083038185885af1158015611888573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906118ad919061481b565b505050505050565b6118bd61292a565b73ffffffffffffffffffffffffffffffffffffffff166118db611caf565b73ffffffffffffffffffffffffffffffffffffffff1614611931576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611928906145a5565b60405180910390fd5b80600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60105481565b601360029054906101000a900460ff1681565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6119de61292a565b73ffffffffffffffffffffffffffffffffffffffff166119fc611caf565b73ffffffffffffffffffffffffffffffffffffffff1614611a52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a49906145a5565b60405180910390fd5b611a5c6000613513565b565b6000611a6861292a565b73ffffffffffffffffffffffffffffffffffffffff16611a86611caf565b73ffffffffffffffffffffffffffffffffffffffff1614611adc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad3906145a5565b60405180910390fd5b6000601360006101000a81548160ff0219169083151502179055506001905090565b611b0661292a565b73ffffffffffffffffffffffffffffffffffffffff16611b24611caf565b73ffffffffffffffffffffffffffffffffffffffff1614611b7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b71906145a5565b60405180910390fd5b80601b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611c0361292a565b73ffffffffffffffffffffffffffffffffffffffff16611c21611caf565b73ffffffffffffffffffffffffffffffffffffffff1614611c77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6e906145a5565b60405180910390fd5b6001601360016101000a81548160ff0219169083151502179055506001601360026101000a81548160ff021916908315150217905550565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611d0761292a565b73ffffffffffffffffffffffffffffffffffffffff16611d25611caf565b73ffffffffffffffffffffffffffffffffffffffff1614611d7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d72906145a5565b60405180910390fd5b80601360026101000a81548160ff02191690831515021790555050565b606060048054611da790614528565b80601f0160208091040260200160405190810160405280929190818152602001828054611dd390614528565b8015611e205780601f10611df557610100808354040283529160200191611e20565b820191906000526020600020905b815481529060010190602001808311611e0357829003601f168201915b5050505050905090565b611e3261292a565b73ffffffffffffffffffffffffffffffffffffffff16611e50611caf565b73ffffffffffffffffffffffffffffffffffffffff1614611ea6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9d906145a5565b60405180910390fd5b601960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611f36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2d906148e0565b60405180910390fd5b611f4082826134b8565b5050565b60008060016000611f5361292a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015612010576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161200790614972565b60405180910390fd5b61202461201b61292a565b85858403612932565b600191505092915050565b61203761292a565b73ffffffffffffffffffffffffffffffffffffffff16612055611caf565b73ffffffffffffffffffffffffffffffffffffffff16146120ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120a2906145a5565b60405180910390fd5b81601181905550806010819055505050565b600080600060418451146120d057600080fd5b6020840151925060408401519150606084015160001a90509193909250565b60006121036120fc61292a565b8484612afb565b6001905092915050565b601c6020528060005260406000206000915054906101000a900460ff1681565b601154811015612172576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161216990614a04565b60405180910390fd5b6010548111156121b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121ae90614a96565b60405180910390fd5b60105461220c82601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546135d990919063ffffffff16565b1061224c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161224390614b28565b60405180910390fd5b6122573330836126ab565b6122a981601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546135d990919063ffffffff16565b601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055503373ffffffffffffffffffffffffffffffffffffffff167fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c826040516123329190613eb1565b60405180910390a250565b61234561292a565b73ffffffffffffffffffffffffffffffffffffffff16612363611caf565b73ffffffffffffffffffffffffffffffffffffffff16146123b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123b0906145a5565b60405180910390fd5b8060108190555050565b601360019054906101000a900460ff1681565b6123de61292a565b73ffffffffffffffffffffffffffffffffffffffff166123fc611caf565b73ffffffffffffffffffffffffffffffffffffffff1614612452576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612449906145a5565b60405180910390fd5b80601a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600d5481565b600a5481565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60155481565b600b5481565b60145481565b600e818051602081018201805184825260208301602085012081835280955050505050506000915054906101000a900460ff1681565b61259061292a565b73ffffffffffffffffffffffffffffffffffffffff166125ae611caf565b73ffffffffffffffffffffffffffffffffffffffff1614612604576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125fb906145a5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612673576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161266a90614bba565b60405180910390fd5b61267c81613513565b50565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600c5481565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361271a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161271190614c4c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612789576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161278090614cde565b60405180910390fd5b6127948383836135ef565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561281a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161281190614d70565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546128ad91906146cb565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516129119190613eb1565b60405180910390a36129248484846135f4565b50505050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036129a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161299890614e02565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612a10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a0790614e94565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051612aee9190613eb1565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612b6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b6190614c4c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612bd9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bd090614cde565b60405180910390fd5b60008111612c1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c1390614f26565b60405180910390fd5b601360009054906101000a900460ff161561311757612c39611caf565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015612ca75750612c77611caf565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b8015612ce05750600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b8015612d1a575061dead73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b8015612d335750600660149054906101000a900460ff16155b1561311657601360019054906101000a900460ff16612e2d57601a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680612ded5750601a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b612e2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e2390614f92565b60405180910390fd5b5b601c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168015612ed05750601b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15612f7757600a54811115612f1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f1190615024565b60405180910390fd5b600c54612f268361198e565b82612f3191906146cb565b1115612f72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f6990615090565b60405180910390fd5b613115565b601c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16801561301a5750601b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b1561306957600a54811115613064576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161305b90615122565b60405180910390fd5b613114565b601b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661311357600c546130c68361198e565b826130d191906146cb565b1115613112576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161310990615090565b60405180910390fd5b5b5b5b5b5b601360029054906101000a900460ff1680156131405750600660149054906101000a900460ff16155b80156131965750601c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b80156131ec5750601a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b80156132425750601a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15613286576001600660146101000a81548160ff02191690831515021790555061326a6135f9565b6000600660146101000a81548160ff0219169083151502179055505b6000600660149054906101000a900460ff16159050601a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168061333c5750601a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b1561334657600090505b600081156134a657601c60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680156133a957506000601554115b156133dd576133d660646133c8601554866137d590919063ffffffff16565b6137eb90919063ffffffff16565b9050613469565b601c60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16801561343857506000601454115b15613468576134656064613457601454866137d590919063ffffffff16565b6137eb90919063ffffffff16565b90505b5b60008111156134975780600d600082825461348491906146cb565b925050819055506134968530836126ab565b5b80836134a39190615142565b92505b6134b18585856126ab565b5050505050565b80601c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081836135e791906146cb565b905092915050565b505050565b505050565b600080600d540361360a57506137d3565b600b54600d54106137d1576000600d54905061362581613801565b6000600d819055506000479050600061365c606461364e601654856137d590919063ffffffff16565b6137eb90919063ffffffff16565b905060006136738284613a4490919063ffffffff16565b9050600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16826040516136bb9061519c565b60006040518083038185875af1925050503d80600081146136f8576040519150601f19603f3d011682016040523d82523d6000602084013e6136fd565b606091505b505080955050600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16816040516137499061519c565b60006040518083038185875af1925050503d8060008114613786576040519150601f19603f3d011682016040523d82523d6000602084013e61378b565b606091505b5050809550507fe9f689eb4d290dd3a40869ea626055ee4a55d40f20286208d04ef55f39254cff8484876040516137c4939291906151b1565b60405180910390a1505050505b505b565b600081836137e391906151e8565b905092915050565b600081836137f99190615259565b905092915050565b6000600267ffffffffffffffff81111561381e5761381d613abf565b5b60405190808252806020026020018201604052801561384c5781602001602082028036833780820191505090505b50905030816000815181106138645761386361528a565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801561390b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061392f9190614714565b816001815181106139435761394261528a565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506139aa30601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684612932565b601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b8152600401613a0e959493929190615377565b600060405180830381600087803b158015613a2857600080fd5b505af1158015613a3c573d6000803e3d6000fd5b505050505050565b60008183613a529190615142565b905092915050565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b613a8181613a6e565b8114613a8c57600080fd5b50565b600081359050613a9e81613a78565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613af782613aae565b810181811067ffffffffffffffff82111715613b1657613b15613abf565b5b80604052505050565b6000613b29613a5a565b9050613b358282613aee565b919050565b600067ffffffffffffffff821115613b5557613b54613abf565b5b613b5e82613aae565b9050602081019050919050565b82818337600083830152505050565b6000613b8d613b8884613b3a565b613b1f565b905082815260208101848484011115613ba957613ba8613aa9565b5b613bb4848285613b6b565b509392505050565b600082601f830112613bd157613bd0613aa4565b5b8135613be1848260208601613b7a565b91505092915050565b60008060408385031215613c0157613c00613a64565b5b6000613c0f85828601613a8f565b925050602083013567ffffffffffffffff811115613c3057613c2f613a69565b5b613c3c85828601613bbc565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613c80578082015181840152602081019050613c65565b60008484015250505050565b6000613c9782613c46565b613ca18185613c51565b9350613cb1818560208601613c62565b613cba81613aae565b840191505092915050565b60006020820190508181036000830152613cdf8184613c8c565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613d1282613ce7565b9050919050565b613d2281613d07565b8114613d2d57600080fd5b50565b600081359050613d3f81613d19565b92915050565b60008060408385031215613d5c57613d5b613a64565b5b6000613d6a85828601613d30565b9250506020613d7b85828601613a8f565b9150509250929050565b60008115159050919050565b613d9a81613d85565b82525050565b6000602082019050613db56000830184613d91565b92915050565b60008060408385031215613dd257613dd1613a64565b5b6000613de085828601613a8f565b9250506020613df185828601613a8f565b9150509250929050565b600060208284031215613e1157613e10613a64565b5b6000613e1f84828501613d30565b91505092915050565b6000819050919050565b6000613e4d613e48613e4384613ce7565b613e28565b613ce7565b9050919050565b6000613e5f82613e32565b9050919050565b6000613e7182613e54565b9050919050565b613e8181613e66565b82525050565b6000602082019050613e9c6000830184613e78565b92915050565b613eab81613a6e565b82525050565b6000602082019050613ec66000830184613ea2565b92915050565b6000819050919050565b613edf81613ecc565b8114613eea57600080fd5b50565b600081359050613efc81613ed6565b92915050565b60008060408385031215613f1957613f18613a64565b5b6000613f2785828601613eed565b925050602083013567ffffffffffffffff811115613f4857613f47613a69565b5b613f5485828601613bbc565b9150509250929050565b613f6781613d07565b82525050565b6000602082019050613f826000830184613f5e565b92915050565b600080600060608486031215613fa157613fa0613a64565b5b6000613faf86828701613d30565b9350506020613fc086828701613d30565b9250506040613fd186828701613a8f565b9150509250925092565b60008060408385031215613ff257613ff1613a64565b5b600061400085828601613d30565b925050602061401185828601613d30565b9150509250929050565b600060ff82169050919050565b6140318161401b565b82525050565b600060208201905061404c6000830184614028565b92915050565b61405b81613d85565b811461406657600080fd5b50565b60008135905061407881614052565b92915050565b6000806040838503121561409557614094613a64565b5b60006140a385828601613d30565b92505060206140b485828601614069565b9150509250929050565b6000602082840312156140d4576140d3613a64565b5b60006140e284828501614069565b91505092915050565b60006020828403121561410157614100613a64565b5b600082013567ffffffffffffffff81111561411f5761411e613a69565b5b61412b84828501613bbc565b91505092915050565b61413d81613ecc565b82525050565b60006060820190506141586000830186614134565b6141656020830185614134565b6141726040830184614028565b949350505050565b6000602082840312156141905761418f613a64565b5b600061419e84828501613a8f565b91505092915050565b60008160601b9050919050565b60006141bf826141a7565b9050919050565b60006141d1826141b4565b9050919050565b6141e96141e482613d07565b6141c6565b82525050565b6000819050919050565b61420a61420582613a6e565b6141ef565b82525050565b600061421c82866141d8565b60148201915061422c82856141d8565b60148201915061423c82846141f9565b602082019150819050949350505050565b600081905092915050565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b600061428e601c8361424d565b915061429982614258565b601c82019050919050565b6000819050919050565b6142bf6142ba82613ecc565b6142a4565b82525050565b60006142d082614281565b91506142dc82846142ae565b60208201915081905092915050565b7f496e76616c6964207369676e6174757265000000000000000000000000000000600082015250565b6000614321601183613c51565b915061432c826142eb565b602082019050919050565b6000602082019050818103600083015261435081614314565b9050919050565b600081519050919050565b600081905092915050565b600061437882614357565b6143828185614362565b9350614392818560208601613c62565b80840191505092915050565b60006143aa828461436d565b915081905092915050565b7f5369676e61747572652068617320616c7265616479206265656e207573656400600082015250565b60006143eb601f83613c51565b91506143f6826143b5565b602082019050919050565b6000602082019050818103600083015261441a816143de565b9050919050565b7f4465706f736974206d7573742062652067726561746572207468616e20300000600082015250565b6000614457601e83613c51565b915061446282614421565b602082019050919050565b600060208201905081810360008301526144868161444a565b9050919050565b7f496e73756666696369656e7420636f6e74726163742062616c616e6365000000600082015250565b60006144c3601d83613c51565b91506144ce8261448d565b602082019050919050565b600060208201905081810360008301526144f2816144b6565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061454057607f821691505b602082108103614553576145526144f9565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061458f602083613c51565b915061459a82614559565b602082019050919050565b600060208201905081810360008301526145be81614582565b9050919050565b60006080820190506145da6000830187614134565b6145e76020830186614028565b6145f46040830185614134565b6146016060830184614134565b95945050505050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206160008201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000602082015250565b6000614666602883613c51565b91506146718261460a565b604082019050919050565b6000602082019050818103600083015261469581614659565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006146d682613a6e565b91506146e183613a6e565b92508282019050808211156146f9576146f861469c565b5b92915050565b60008151905061470e81613d19565b92915050565b60006020828403121561472a57614729613a64565b5b6000614738848285016146ff565b91505092915050565b60006040820190506147566000830185613f5e565b6147636020830184613f5e565b9392505050565b6000819050919050565b600061478f61478a6147858461476a565b613e28565b613a6e565b9050919050565b61479f81614774565b82525050565b600060c0820190506147ba6000830189613f5e565b6147c76020830188613ea2565b6147d46040830187614796565b6147e16060830186614796565b6147ee6080830185613f5e565b6147fb60a0830184613ea2565b979650505050505050565b60008151905061481581613a78565b92915050565b60008060006060848603121561483457614833613a64565b5b600061484286828701614806565b935050602061485386828701614806565b925050604061486486828701614806565b9150509250925092565b7f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060008201527f6175746f6d617465644d61726b65744d616b6572506169727300000000000000602082015250565b60006148ca603983613c51565b91506148d58261486e565b604082019050919050565b600060208201905081810360008301526148f9816148bd565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b600061495c602583613c51565b915061496782614900565b604082019050919050565b6000602082019050818103600083015261498b8161494f565b9050919050565b7f4465706f73697420616d6f756e74206d7573742062652067726561746572207460008201527f68616e20746865206d696e696d756d0000000000000000000000000000000000602082015250565b60006149ee602f83613c51565b91506149f982614992565b604082019050919050565b60006020820190508181036000830152614a1d816149e1565b9050919050565b7f4465706f73697420616d6f756e742065786365656473206d6178696d756d206c60008201527f696d697400000000000000000000000000000000000000000000000000000000602082015250565b6000614a80602483613c51565b9150614a8b82614a24565b604082019050919050565b60006020820190508181036000830152614aaf81614a73565b9050919050565b7f546f74616c206465706f736974732063616e6e6f7420657863656564206d617860008201527f696d756d00000000000000000000000000000000000000000000000000000000602082015250565b6000614b12602483613c51565b9150614b1d82614ab6565b604082019050919050565b60006020820190508181036000830152614b4181614b05565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614ba4602683613c51565b9150614baf82614b48565b604082019050919050565b60006020820190508181036000830152614bd381614b97565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000614c36602583613c51565b9150614c4182614bda565b604082019050919050565b60006020820190508181036000830152614c6581614c29565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000614cc8602383613c51565b9150614cd382614c6c565b604082019050919050565b60006020820190508181036000830152614cf781614cbb565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b6000614d5a602683613c51565b9150614d6582614cfe565b604082019050919050565b60006020820190508181036000830152614d8981614d4d565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614dec602483613c51565b9150614df782614d90565b604082019050919050565b60006020820190508181036000830152614e1b81614ddf565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000614e7e602283613c51565b9150614e8982614e22565b604082019050919050565b60006020820190508181036000830152614ead81614e71565b9050919050565b7f5472616e7366657220616d6f756e74206d75737420626520677265617465722060008201527f7468616e207a65726f0000000000000000000000000000000000000000000000602082015250565b6000614f10602983613c51565b9150614f1b82614eb4565b604082019050919050565b60006020820190508181036000830152614f3f81614f03565b9050919050565b7f54726164696e67206973206e6f7420656e61626c6564207965742e0000000000600082015250565b6000614f7c601b83613c51565b9150614f8782614f46565b602082019050919050565b60006020820190508181036000830152614fab81614f6f565b9050919050565b7f427579207472616e7366657220616d6f756e742065786365656473207468652060008201527f6d61785472616e73616374696f6e416d6f756e742e0000000000000000000000602082015250565b600061500e603583613c51565b915061501982614fb2565b604082019050919050565b6000602082019050818103600083015261503d81615001565b9050919050565b7f4d61782077616c6c657420657863656564656400000000000000000000000000600082015250565b600061507a601383613c51565b915061508582615044565b602082019050919050565b600060208201905081810360008301526150a98161506d565b9050919050565b7f53656c6c207472616e7366657220616d6f756e7420657863656564732074686560008201527f206d61785472616e73616374696f6e416d6f756e742e00000000000000000000602082015250565b600061510c603683613c51565b9150615117826150b0565b604082019050919050565b6000602082019050818103600083015261513b816150ff565b9050919050565b600061514d82613a6e565b915061515883613a6e565b92508282039050818111156151705761516f61469c565b5b92915050565b50565b6000615186600083614362565b915061519182615176565b600082019050919050565b60006151a782615179565b9150819050919050565b60006060820190506151c66000830186613ea2565b6151d36020830185613ea2565b6151e06040830184613d91565b949350505050565b60006151f382613a6e565b91506151fe83613a6e565b925082820261520c81613a6e565b915082820484148315176152235761522261469c565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061526482613a6e565b915061526f83613a6e565b92508261527f5761527e61522a565b5b828204905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6152ee81613d07565b82525050565b600061530083836152e5565b60208301905092915050565b6000602082019050919050565b6000615324826152b9565b61532e81856152c4565b9350615339836152d5565b8060005b8381101561536a57815161535188826152f4565b975061535c8361530c565b92505060018101905061533d565b5085935050505092915050565b600060a08201905061538c6000830188613ea2565b6153996020830187614796565b81810360408301526153ab8186615319565b90506153ba6060830185613f5e565b6153c76080830184613ea2565b969550505050505056fea2646970667358221220546cda3f1bc03628d6dee15f12073c5659556964776824f6cbc2e4b4d9f59f9264736f6c63430008120033

Deployed Bytecode Sourcemap

18590:14462:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24146:1376;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4654:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6331:210;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22886:168;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20730:63;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20473:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5143:108;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25594:253;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6549:529;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27777:197;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20556:53;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20397:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4985:93;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20352:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7086:297;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19968:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20521:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20163:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27982:126;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26490:1141;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23174:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19884:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20243:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5314:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1407:103;;;;;;;;;;;;;:::i;:::-;;21902:121;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22031:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18790:93;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21715:112;;;;;;;;;;;;;:::i;:::-;;756:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18892;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22328:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4873:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22576:302;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7391:482;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23288:135;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25925:557;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;5704:216;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20800:57;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23431:707;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23062:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20203:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22436:132;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19426:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19039:64;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5983:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20316:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19159:63;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20283:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19540:44;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1665:238;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19636:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19332:53;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24146:1376;24226:15;24285:10;24297:13;;;;;;;;;;;24312:7;24268:52;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;24244:87;;;;;;24226:105;;24410:23;24513:7;24460:61;;;;;;;;:::i;:::-;;;;;;;;;;;;;24436:96;;;;;;24410:122;;24575:14;24592:36;24600:15;24617:10;24592:7;:36::i;:::-;24575:53;;24762:13;;;;;;;;;;;24752:23;;:6;:23;;;24744:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;24817:14;24832:10;24817:26;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;24816:27;24808:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;24922:1;24898:9;:21;24908:10;24898:21;;;;;;;;;;;;;;;;:25;24890:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;25096:4;25067:14;25082:10;25067:26;;;;;;:::i;:::-;;;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;25234:7;25206:24;25224:4;25206:9;:24::i;:::-;:35;;25184:114;;;;;;;;;;;;:::i;:::-;;;;;;;;;25378:51;25402:4;25409:10;25421:7;25378:15;:51::i;:::-;25466:1;25442:9;:21;25452:10;25442:21;;;;;;;;;;;;;;;:25;;;;25494:10;25485:29;;;25506:7;25485:29;;;;;;:::i;:::-;;;;;;;;24215:1307;;;24146:1376;;:::o;4654:100::-;4708:13;4741:5;4734:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4654:100;:::o;6331:210::-;6450:4;6472:39;6481:12;:10;:12::i;:::-;6495:7;6504:6;6472:8;:39::i;:::-;6529:4;6522:11;;6331:210;;;;:::o;22886:168::-;987:12;:10;:12::i;:::-;976:23;;:7;:5;:7::i;:::-;:23;;;968:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;23010:8:::1;22999;:19;;;;23039:7;23029;:17;;;;22886:168:::0;;:::o;20730:63::-;;;;;;;;;;;;;;;;;;;;;;:::o;20473:41::-;;;;;;;;;;;;;:::o;5143:108::-;5204:7;5231:12;;5224:19;;5143:108;:::o;25594:253::-;25705:7;25731:9;25742;25753:7;25764:26;25779:10;25764:14;:26::i;:::-;25730:60;;;;;;25808:31;25818:11;25831:1;25834;25837;25808:31;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25801:38;;;;;25594:253;;;;:::o;6549:529::-;6689:4;6706:36;6716:6;6724:9;6735:6;6706:9;:36::i;:::-;6755:24;6782:11;:19;6794:6;6782:19;;;;;;;;;;;;;;;:33;6802:12;:10;:12::i;:::-;6782:33;;;;;;;;;;;;;;;;6755:60;;6868:6;6848:16;:26;;6826:116;;;;;;;;;;;;:::i;:::-;;;;;;;;;6978:57;6987:6;6995:12;:10;:12::i;:::-;7028:6;7009:16;:25;6978:8;:57::i;:::-;7066:4;7059:11;;;6549:529;;;;;:::o;27777:197::-;987:12;:10;:12::i;:::-;976:23;;:7;:5;:7::i;:::-;:23;;;968:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;27911:10:::1;27899:9;;:22;;;;;;;;;;;;;;;;;;27950:16;27932:15;;:34;;;;;;;;;;;;;;;;;;27777:197:::0;;:::o;20556:53::-;20602:6;20556:53;:::o;20397:29::-;;;;:::o;4985:93::-;5043:5;5068:2;5061:9;;4985:93;:::o;20352:35::-;;;;:::o;7086:297::-;7201:4;7223:130;7246:12;:10;:12::i;:::-;7273:7;7332:10;7295:11;:25;7307:12;:10;:12::i;:::-;7295:25;;;;;;;;;;;;;;;:34;7321:7;7295:34;;;;;;;;;;;;;;;;:47;;;;:::i;:::-;7223:8;:130::i;:::-;7371:4;7364:11;;7086:297;;;;:::o;19968:39::-;;;;:::o;20521:28::-;;;;;;;;;;;;;:::o;20163:33::-;;;;;;;;;;;;;:::o;27982:126::-;28048:4;28072:19;:28;28092:7;28072:28;;;;;;;;;;;;;;;;;;;;;;;;;28065:35;;27982:126;;;:::o;26490:1141::-;987:12;:10;:12::i;:::-;976:23;;:7;:5;:7::i;:::-;:23;;;968:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;26695:35:::1;26766:14;26695:96;;26822:16;26804:15;;:34;;;;;;;;;;;;;;;;;;26851:58;26885:16;26904:4;26851:25;:58::i;:::-;26920:64;26937:4;26952:16;26971:12;26920:8;:64::i;:::-;27059:16;:24;;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27041:70;;;27120:4;27127:16;:21;;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27041:110;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27025:13;;:126;;;;;;;;;;;;;;;;;;27162:55;27196:13;;;;;;;;;;;27212:4;27162:25;:55::i;:::-;27228:58;27265:13;;;;;;;;;;;27281:4;27228:28;:58::i;:::-;27299:15;;;;;;;;;;;:31;;;27338:9;27371:4;27407:12;27454:1;27497::::0;27540:7:::1;:5;:7::i;:::-;27597:15;27299:324;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;26617:1014;26490:1141:::0;;:::o;23174:104::-;987:12;:10;:12::i;:::-;976:23;;:7;:5;:7::i;:::-;:23;;;968:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;23262:8:::1;23246:13;;:24;;;;;;;;;;;;;;;;;;23174:104:::0;:::o;19884:42::-;;;;:::o;20243:31::-;;;;;;;;;;;;;:::o;5314:177::-;5433:7;5465:9;:18;5475:7;5465:18;;;;;;;;;;;;;;;;5458:25;;5314:177;;;:::o;1407:103::-;987:12;:10;:12::i;:::-;976:23;;:7;:5;:7::i;:::-;:23;;;968:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1472:30:::1;1499:1;1472:18;:30::i;:::-;1407:103::o:0;21902:121::-;21954:4;987:12;:10;:12::i;:::-;976:23;;:7;:5;:7::i;:::-;:23;;;968:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;21988:5:::1;21971:14;;:22;;;;;;;;;;;;;;;;;;22011:4;22004:11;;21902:121:::0;:::o;22031:201::-;987:12;:10;:12::i;:::-;976:23;;:7;:5;:7::i;:::-;:23;;;968:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;22214:10:::1;22162:31;:49;22194:16;22162:49;;;;;;;;;;;;;;;;:62;;;;;;;;;;;;;;;;;;22031:201:::0;;:::o;18790:93::-;;;;;;;;;;;;;:::o;21715:112::-;987:12;:10;:12::i;:::-;976:23;;:7;:5;:7::i;:::-;:23;;;968:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;21786:4:::1;21770:13;;:20;;;;;;;;;;;;;;;;;;21815:4;21801:11;;:18;;;;;;;;;;;;;;;;;;21715:112::o:0;756:87::-;802:7;829:6;;;;;;;;;;;822:13;;756:87;:::o;18892:::-;;;;;;;;;;;;;:::o;22328:100::-;987:12;:10;:12::i;:::-;976:23;;:7;:5;:7::i;:::-;:23;;;968:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;22413:7:::1;22399:11;;:21;;;;;;;;;;;;;;;;;;22328:100:::0;:::o;4873:104::-;4929:13;4962:7;4955:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4873:104;:::o;22576:302::-;987:12;:10;:12::i;:::-;976:23;;:7;:5;:7::i;:::-;:23;;;968:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;22720:13:::1;;;;;;;;;;;22712:21;;:4;:21;;::::0;22690:128:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;22829:41;22858:4;22864:5;22829:28;:41::i;:::-;22576:302:::0;;:::o;7391:482::-;7511:4;7533:24;7560:11;:25;7572:12;:10;:12::i;:::-;7560:25;;;;;;;;;;;;;;;:34;7586:7;7560:34;;;;;;;;;;;;;;;;7533:61;;7647:15;7627:16;:35;;7605:122;;;;;;;;;;;;:::i;:::-;;;;;;;;;7763:67;7772:12;:10;:12::i;:::-;7786:7;7814:15;7795:16;:34;7763:8;:67::i;:::-;7861:4;7854:11;;;7391:482;;;;:::o;23288:135::-;987:12;:10;:12::i;:::-;976:23;;:7;:5;:7::i;:::-;:23;;;968:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;23383:4:::1;23370:10;:17;;;;23411:4;23398:10;:17;;;;23288:135:::0;;:::o;25925:557::-;26029:9;26053;26077:7;26134:2;26120:3;:10;:16;26112:25;;;;;;26251:2;26246:3;26242:12;26236:19;26231:24;;26322:2;26317:3;26313:12;26307:19;26302:24;;26430:2;26425:3;26421:12;26415:19;26412:1;26407:28;26402:33;;25925:557;;;;;:::o;5704:216::-;5826:4;5848:42;5858:12;:10;:12::i;:::-;5872:9;5883:6;5848:9;:42::i;:::-;5908:4;5901:11;;5704:216;;;;:::o;20800:57::-;;;;;;;;;;;;;;;;;;;;;;:::o;23431:707::-;23518:10;;23507:7;:21;;23485:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;23633:10;;23622:7;:21;;23614:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;23754:10;;23717:34;23743:7;23717:9;:21;23727:10;23717:21;;;;;;;;;;;;;;;;:25;;:34;;;;:::i;:::-;:47;23695:133;;;;;;;;;;;;:::i;:::-;;;;;;;;;23884:51;23900:10;23920:4;23927:7;23884:15;:51::i;:::-;24003:34;24029:7;24003:9;:21;24013:10;24003:21;;;;;;;;;;;;;;;;:25;;:34;;;;:::i;:::-;23979:9;:21;23989:10;23979:21;;;;;;;;;;;;;;;:58;;;;24110:10;24102:28;;;24122:7;24102:28;;;;;;:::i;:::-;;;;;;;;23431:707;:::o;23062:104::-;987:12;:10;:12::i;:::-;976:23;;:7;:5;:7::i;:::-;:23;;;968:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;23147:11:::1;23134:10;:24;;;;23062:104:::0;:::o;20203:33::-;;;;;;;;;;;;;:::o;22436:132::-;987:12;:10;:12::i;:::-;976:23;;:7;:5;:7::i;:::-;:23;;;968:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;22552:8:::1;22521:19;:28;22541:7;22521:28;;;;;;;;;;;;;;;;:39;;;;;;;;;;;;;;;;;;22436:132:::0;;:::o;19426:36::-;;;;:::o;19039:64::-;;;;:::o;5983:201::-;6117:7;6149:11;:18;6161:5;6149:18;;;;;;;;;;;;;;;:27;6168:7;6149:27;;;;;;;;;;;;;;;;6142:34;;5983:201;;;;:::o;20316:27::-;;;;:::o;19159:63::-;;;;:::o;20283:26::-;;;;:::o;19540:44::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1665:238::-;987:12;:10;:12::i;:::-;976:23;;:7;:5;:7::i;:::-;:23;;;968:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1788:1:::1;1768:22;;:8;:22;;::::0;1746:110:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;1867:28;1886:8;1867:18;:28::i;:::-;1665:238:::0;:::o;19636:41::-;;;;;;;;;;;;;:::o;19332:53::-;;;;:::o;7881:770::-;8039:1;8021:20;;:6;:20;;;8013:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;8123:1;8102:23;;:9;:23;;;8094:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;8178:47;8199:6;8207:9;8218:6;8178:20;:47::i;:::-;8238:21;8262:9;:17;8272:6;8262:17;;;;;;;;;;;;;;;;8238:41;;8329:6;8312:13;:23;;8290:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;8473:6;8457:13;:22;8437:9;:17;8447:6;8437:17;;;;;;;;;;;;;;;:42;;;;8525:6;8501:9;:20;8511:9;8501:20;;;;;;;;;;;;;;;;:30;;;;;;;:::i;:::-;;;;;;;;8566:9;8549:35;;8558:6;8549:35;;;8577:6;8549:35;;;;;;:::i;:::-;;;;;;;;8597:46;8617:6;8625:9;8636:6;8597:19;:46::i;:::-;8002:649;7881:770;;;:::o;77:98::-;130:7;157:10;150:17;;77:98;:::o;9665:380::-;9818:1;9801:19;;:5;:19;;;9793:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;9899:1;9880:21;;:7;:21;;;9872:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;9983:6;9953:11;:18;9965:5;9953:18;;;;;;;;;;;;;;;:27;9972:7;9953:27;;;;;;;;;;;;;;;:36;;;;10021:7;10005:32;;10014:5;10005:32;;;10030:6;10005:32;;;;;;:::i;:::-;;;;;;;;9665:380;;;:::o;28116:3339::-;28264:1;28248:18;;:4;:18;;;28240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;28341:1;28327:16;;:2;:16;;;28319:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;28411:1;28402:6;:10;28394:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;28473:14;;;;;;;;;;;28469:1699;;;28534:7;:5;:7::i;:::-;28526:15;;:4;:15;;;;:49;;;;;28568:7;:5;:7::i;:::-;28562:13;;:2;:13;;;;28526:49;:86;;;;;28610:1;28596:16;;:2;:16;;;;28526:86;:128;;;;;28647:6;28633:21;;:2;:21;;;;28526:128;:158;;;;;28676:8;;;;;;;;;;;28675:9;28526:158;28504:1653;;;28724:13;;;;;;;;;;;28719:228;;28796:19;:25;28816:4;28796:25;;;;;;;;;;;;;;;;;;;;;;;;;:52;;;;28825:19;:23;28845:2;28825:23;;;;;;;;;;;;;;;;;;;;;;;;;28796:52;28762:165;;;;;;;;;;;;:::i;:::-;;;;;;;;;28719:228;29021:25;:31;29047:4;29021:31;;;;;;;;;;;;;;;;;;;;;;;;;:92;;;;;29078:31;:35;29110:2;29078:35;;;;;;;;;;;;;;;;;;;;;;;;;29077:36;29021:92;28995:1147;;;29200:20;;29190:6;:30;;29156:169;;;;;;;;;;;;:::i;:::-;;;;;;;;;29408:9;;29391:13;29401:2;29391:9;:13::i;:::-;29382:6;:22;;;;:::i;:::-;:35;;29348:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;28995:1147;;;29586:25;:29;29612:2;29586:29;;;;;;;;;;;;;;;;;;;;;;;;;:92;;;;;29641:31;:37;29673:4;29641:37;;;;;;;;;;;;;;;;;;;;;;;;;29640:38;29586:92;29560:582;;;29765:20;;29755:6;:30;;29721:170;;;;;;;;;;;;:::i;:::-;;;;;;;;;29560:582;;;29922:31;:35;29954:2;29922:35;;;;;;;;;;;;;;;;;;;;;;;;;29917:225;;30042:9;;30025:13;30035:2;30025:9;:13::i;:::-;30016:6;:22;;;;:::i;:::-;:35;;29982:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;29917:225;29560:582;28995:1147;28504:1653;28469:1699;30198:11;;;;;;;;;;;:55;;;;;30245:8;;;;;;;;;;;30244:9;30198:55;:123;;;;;30290:25;:31;30316:4;30290:31;;;;;;;;;;;;;;;;;;;;;;;;;30289:32;30198:123;:185;;;;;30358:19;:25;30378:4;30358:25;;;;;;;;;;;;;;;;;;;;;;;;;30357:26;30198:185;:245;;;;;30420:19;:23;30440:2;30420:23;;;;;;;;;;;;;;;;;;;;;;;;;30419:24;30198:245;30180:392;;;30500:4;30489:8;;:15;;;;;;;;;;;;;;;;;;30519:10;:8;:10::i;:::-;30555:5;30544:8;;:16;;;;;;;;;;;;;;;;;;30180:392;30584:12;30600:8;;;;;;;;;;;30599:9;30584:24;;30710:19;:25;30730:4;30710:25;;;;;;;;;;;;;;;;;;;;;;;;;:52;;;;30739:19;:23;30759:2;30739:23;;;;;;;;;;;;;;;;;;;;;;;;;30710:52;30706:100;;;30789:5;30779:15;;30706:100;30818:12;30849:7;30845:559;;;30901:25;:29;30927:2;30901:29;;;;;;;;;;;;;;;;;;;;;;;;;:45;;;;;30945:1;30934:8;;:12;30901:45;30897:286;;;30974:29;30999:3;30974:20;30985:8;;30974:6;:10;;:20;;;;:::i;:::-;:24;;:29;;;;:::i;:::-;30967:36;;30897:286;;;31065:25;:31;31091:4;31065:31;;;;;;;;;;;;;;;;;;;;;;;;;:46;;;;;31110:1;31100:7;;:11;31065:46;31061:122;;;31139:28;31163:3;31139:19;31150:7;;31139:6;:10;;:19;;;;:::i;:::-;:23;;:28;;;;:::i;:::-;31132:35;;31061:122;30897:286;31210:1;31203:4;:8;31199:163;;;31253:4;31232:17;;:25;;;;;;;:::i;:::-;;;;;;;;31304:42;31320:4;31334;31341;31304:15;:42::i;:::-;31199:163;31388:4;31378:14;;;;;:::i;:::-;;;30845:559;31414:33;31430:4;31436:2;31440:6;31414:15;:33::i;:::-;28229:3226;;28116:3339;;;:::o;27639:130::-;27756:5;27722:25;:31;27748:4;27722:31;;;;;;;;;;;;;;;;:39;;;;;;;;;;;;;;;;;;27639:130;;:::o;2063:191::-;2137:16;2156:6;;;;;;;;;;;2137:25;;2182:8;2173:6;;:17;;;;;;;;;;;;;;;;;;2237:8;2206:40;;2227:8;2206:40;;;;;;;;;;;;2126:128;2063:191;:::o;11850:98::-;11908:7;11939:1;11935;:5;;;;:::i;:::-;11928:12;;11850:98;;;;:::o;10053:125::-;;;;:::o;10186:124::-;;;;:::o;32056:993::-;32178:12;32226:1;32205:17;;:22;32201:61;;32244:7;;;32201:61;32297:18;;32276:17;;:39;32272:770;;32332:26;32361:17;;32332:46;;32393:36;32410:18;32393:16;:36::i;:::-;32464:1;32444:17;:21;;;;32507:23;32533:21;32507:47;;32569:25;32597:81;32674:3;32597:54;32635:15;;32597;:37;;:54;;;;:::i;:::-;:76;;:81;;;;:::i;:::-;32569:109;;32693:19;32715:38;32735:17;32715:15;:19;;:38;;;;:::i;:::-;32693:60;;32790:15;;;;;;;;;;;32782:29;;32837:17;32782:91;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32768:105;;;;;32910:9;;;;;;;;;;;32902:23;;32933:11;32902:47;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32888:61;;;;;32969;32985:18;33005:15;33022:7;32969:61;;;;;;;;:::i;:::-;;;;;;;;32317:725;;;;32272:770;32084:965;32056:993;:::o;12062:98::-;12120:7;12151:1;12147;:5;;;;:::i;:::-;12140:12;;12062:98;;;;:::o;12168:::-;12226:7;12257:1;12253;:5;;;;:::i;:::-;12246:12;;12168:98;;;;:::o;31463:585::-;31589:21;31627:1;31613:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31589:40;;31658:4;31640;31645:1;31640:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;;;31684:15;;;;;;;;;;;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31674:4;31679:1;31674:7;;;;;;;;:::i;:::-;;;;;;;:32;;;;;;;;;;;31717:62;31734:4;31749:15;;;;;;;;;;;31767:11;31717:8;:62::i;:::-;31816:15;;;;;;;;;;;:66;;;31897:11;31923:1;31967:4;31994;32014:15;31816:224;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31518:530;31463:585;:::o;11956:98::-;12014:7;12045:1;12041;:5;;;;:::i;:::-;12034:12;;11956:98;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:77;371:7;400:5;389:16;;334:77;;;:::o;417:122::-;490:24;508:5;490:24;:::i;:::-;483:5;480:35;470:63;;529:1;526;519:12;470:63;417:122;:::o;545:139::-;591:5;629:6;616:20;607:29;;645:33;672:5;645:33;:::i;:::-;545:139;;;;:::o;690:117::-;799:1;796;789:12;813:117;922:1;919;912:12;936:102;977:6;1028:2;1024:7;1019:2;1012:5;1008:14;1004:28;994:38;;936:102;;;:::o;1044:180::-;1092:77;1089:1;1082:88;1189:4;1186:1;1179:15;1213:4;1210:1;1203:15;1230:281;1313:27;1335:4;1313:27;:::i;:::-;1305:6;1301:40;1443:6;1431:10;1428:22;1407:18;1395:10;1392:34;1389:62;1386:88;;;1454:18;;:::i;:::-;1386:88;1494:10;1490:2;1483:22;1273:238;1230:281;;:::o;1517:129::-;1551:6;1578:20;;:::i;:::-;1568:30;;1607:33;1635:4;1627:6;1607:33;:::i;:::-;1517:129;;;:::o;1652:307::-;1713:4;1803:18;1795:6;1792:30;1789:56;;;1825:18;;:::i;:::-;1789:56;1863:29;1885:6;1863:29;:::i;:::-;1855:37;;1947:4;1941;1937:15;1929:23;;1652:307;;;:::o;1965:146::-;2062:6;2057:3;2052;2039:30;2103:1;2094:6;2089:3;2085:16;2078:27;1965:146;;;:::o;2117:423::-;2194:5;2219:65;2235:48;2276:6;2235:48;:::i;:::-;2219:65;:::i;:::-;2210:74;;2307:6;2300:5;2293:21;2345:4;2338:5;2334:16;2383:3;2374:6;2369:3;2365:16;2362:25;2359:112;;;2390:79;;:::i;:::-;2359:112;2480:54;2527:6;2522:3;2517;2480:54;:::i;:::-;2200:340;2117:423;;;;;:::o;2559:338::-;2614:5;2663:3;2656:4;2648:6;2644:17;2640:27;2630:122;;2671:79;;:::i;:::-;2630:122;2788:6;2775:20;2813:78;2887:3;2879:6;2872:4;2864:6;2860:17;2813:78;:::i;:::-;2804:87;;2620:277;2559:338;;;;:::o;2903:652::-;2980:6;2988;3037:2;3025:9;3016:7;3012:23;3008:32;3005:119;;;3043:79;;:::i;:::-;3005:119;3163:1;3188:53;3233:7;3224:6;3213:9;3209:22;3188:53;:::i;:::-;3178:63;;3134:117;3318:2;3307:9;3303:18;3290:32;3349:18;3341:6;3338:30;3335:117;;;3371:79;;:::i;:::-;3335:117;3476:62;3530:7;3521:6;3510:9;3506:22;3476:62;:::i;:::-;3466:72;;3261:287;2903:652;;;;;:::o;3561:99::-;3613:6;3647:5;3641:12;3631:22;;3561:99;;;:::o;3666:169::-;3750:11;3784:6;3779:3;3772:19;3824:4;3819:3;3815:14;3800:29;;3666:169;;;;:::o;3841:246::-;3922:1;3932:113;3946:6;3943:1;3940:13;3932:113;;;4031:1;4026:3;4022:11;4016:18;4012:1;4007:3;4003:11;3996:39;3968:2;3965:1;3961:10;3956:15;;3932:113;;;4079:1;4070:6;4065:3;4061:16;4054:27;3903:184;3841:246;;;:::o;4093:377::-;4181:3;4209:39;4242:5;4209:39;:::i;:::-;4264:71;4328:6;4323:3;4264:71;:::i;:::-;4257:78;;4344:65;4402:6;4397:3;4390:4;4383:5;4379:16;4344:65;:::i;:::-;4434:29;4456:6;4434:29;:::i;:::-;4429:3;4425:39;4418:46;;4185:285;4093:377;;;;:::o;4476:313::-;4589:4;4627:2;4616:9;4612:18;4604:26;;4676:9;4670:4;4666:20;4662:1;4651:9;4647:17;4640:47;4704:78;4777:4;4768:6;4704:78;:::i;:::-;4696:86;;4476:313;;;;:::o;4795:126::-;4832:7;4872:42;4865:5;4861:54;4850:65;;4795:126;;;:::o;4927:96::-;4964:7;4993:24;5011:5;4993:24;:::i;:::-;4982:35;;4927:96;;;:::o;5029:122::-;5102:24;5120:5;5102:24;:::i;:::-;5095:5;5092:35;5082:63;;5141:1;5138;5131:12;5082:63;5029:122;:::o;5157:139::-;5203:5;5241:6;5228:20;5219:29;;5257:33;5284:5;5257:33;:::i;:::-;5157:139;;;;:::o;5302:474::-;5370:6;5378;5427:2;5415:9;5406:7;5402:23;5398:32;5395:119;;;5433:79;;:::i;:::-;5395:119;5553:1;5578:53;5623:7;5614:6;5603:9;5599:22;5578:53;:::i;:::-;5568:63;;5524:117;5680:2;5706:53;5751:7;5742:6;5731:9;5727:22;5706:53;:::i;:::-;5696:63;;5651:118;5302:474;;;;;:::o;5782:90::-;5816:7;5859:5;5852:13;5845:21;5834:32;;5782:90;;;:::o;5878:109::-;5959:21;5974:5;5959:21;:::i;:::-;5954:3;5947:34;5878:109;;:::o;5993:210::-;6080:4;6118:2;6107:9;6103:18;6095:26;;6131:65;6193:1;6182:9;6178:17;6169:6;6131:65;:::i;:::-;5993:210;;;;:::o;6209:474::-;6277:6;6285;6334:2;6322:9;6313:7;6309:23;6305:32;6302:119;;;6340:79;;:::i;:::-;6302:119;6460:1;6485:53;6530:7;6521:6;6510:9;6506:22;6485:53;:::i;:::-;6475:63;;6431:117;6587:2;6613:53;6658:7;6649:6;6638:9;6634:22;6613:53;:::i;:::-;6603:63;;6558:118;6209:474;;;;;:::o;6689:329::-;6748:6;6797:2;6785:9;6776:7;6772:23;6768:32;6765:119;;;6803:79;;:::i;:::-;6765:119;6923:1;6948:53;6993:7;6984:6;6973:9;6969:22;6948:53;:::i;:::-;6938:63;;6894:117;6689:329;;;;:::o;7024:60::-;7052:3;7073:5;7066:12;;7024:60;;;:::o;7090:142::-;7140:9;7173:53;7191:34;7200:24;7218:5;7200:24;:::i;:::-;7191:34;:::i;:::-;7173:53;:::i;:::-;7160:66;;7090:142;;;:::o;7238:126::-;7288:9;7321:37;7352:5;7321:37;:::i;:::-;7308:50;;7238:126;;;:::o;7370:153::-;7447:9;7480:37;7511:5;7480:37;:::i;:::-;7467:50;;7370:153;;;:::o;7529:185::-;7643:64;7701:5;7643:64;:::i;:::-;7638:3;7631:77;7529:185;;:::o;7720:276::-;7840:4;7878:2;7867:9;7863:18;7855:26;;7891:98;7986:1;7975:9;7971:17;7962:6;7891:98;:::i;:::-;7720:276;;;;:::o;8002:118::-;8089:24;8107:5;8089:24;:::i;:::-;8084:3;8077:37;8002:118;;:::o;8126:222::-;8219:4;8257:2;8246:9;8242:18;8234:26;;8270:71;8338:1;8327:9;8323:17;8314:6;8270:71;:::i;:::-;8126:222;;;;:::o;8354:77::-;8391:7;8420:5;8409:16;;8354:77;;;:::o;8437:122::-;8510:24;8528:5;8510:24;:::i;:::-;8503:5;8500:35;8490:63;;8549:1;8546;8539:12;8490:63;8437:122;:::o;8565:139::-;8611:5;8649:6;8636:20;8627:29;;8665:33;8692:5;8665:33;:::i;:::-;8565:139;;;;:::o;8710:652::-;8787:6;8795;8844:2;8832:9;8823:7;8819:23;8815:32;8812:119;;;8850:79;;:::i;:::-;8812:119;8970:1;8995:53;9040:7;9031:6;9020:9;9016:22;8995:53;:::i;:::-;8985:63;;8941:117;9125:2;9114:9;9110:18;9097:32;9156:18;9148:6;9145:30;9142:117;;;9178:79;;:::i;:::-;9142:117;9283:62;9337:7;9328:6;9317:9;9313:22;9283:62;:::i;:::-;9273:72;;9068:287;8710:652;;;;;:::o;9368:118::-;9455:24;9473:5;9455:24;:::i;:::-;9450:3;9443:37;9368:118;;:::o;9492:222::-;9585:4;9623:2;9612:9;9608:18;9600:26;;9636:71;9704:1;9693:9;9689:17;9680:6;9636:71;:::i;:::-;9492:222;;;;:::o;9720:619::-;9797:6;9805;9813;9862:2;9850:9;9841:7;9837:23;9833:32;9830:119;;;9868:79;;:::i;:::-;9830:119;9988:1;10013:53;10058:7;10049:6;10038:9;10034:22;10013:53;:::i;:::-;10003:63;;9959:117;10115:2;10141:53;10186:7;10177:6;10166:9;10162:22;10141:53;:::i;:::-;10131:63;;10086:118;10243:2;10269:53;10314:7;10305:6;10294:9;10290:22;10269:53;:::i;:::-;10259:63;;10214:118;9720:619;;;;;:::o;10345:474::-;10413:6;10421;10470:2;10458:9;10449:7;10445:23;10441:32;10438:119;;;10476:79;;:::i;:::-;10438:119;10596:1;10621:53;10666:7;10657:6;10646:9;10642:22;10621:53;:::i;:::-;10611:63;;10567:117;10723:2;10749:53;10794:7;10785:6;10774:9;10770:22;10749:53;:::i;:::-;10739:63;;10694:118;10345:474;;;;;:::o;10825:86::-;10860:7;10900:4;10893:5;10889:16;10878:27;;10825:86;;;:::o;10917:112::-;11000:22;11016:5;11000:22;:::i;:::-;10995:3;10988:35;10917:112;;:::o;11035:214::-;11124:4;11162:2;11151:9;11147:18;11139:26;;11175:67;11239:1;11228:9;11224:17;11215:6;11175:67;:::i;:::-;11035:214;;;;:::o;11255:116::-;11325:21;11340:5;11325:21;:::i;:::-;11318:5;11315:32;11305:60;;11361:1;11358;11351:12;11305:60;11255:116;:::o;11377:133::-;11420:5;11458:6;11445:20;11436:29;;11474:30;11498:5;11474:30;:::i;:::-;11377:133;;;;:::o;11516:468::-;11581:6;11589;11638:2;11626:9;11617:7;11613:23;11609:32;11606:119;;;11644:79;;:::i;:::-;11606:119;11764:1;11789:53;11834:7;11825:6;11814:9;11810:22;11789:53;:::i;:::-;11779:63;;11735:117;11891:2;11917:50;11959:7;11950:6;11939:9;11935:22;11917:50;:::i;:::-;11907:60;;11862:115;11516:468;;;;;:::o;11990:323::-;12046:6;12095:2;12083:9;12074:7;12070:23;12066:32;12063:119;;;12101:79;;:::i;:::-;12063:119;12221:1;12246:50;12288:7;12279:6;12268:9;12264:22;12246:50;:::i;:::-;12236:60;;12192:114;11990:323;;;;:::o;12319:507::-;12387:6;12436:2;12424:9;12415:7;12411:23;12407:32;12404:119;;;12442:79;;:::i;:::-;12404:119;12590:1;12579:9;12575:17;12562:31;12620:18;12612:6;12609:30;12606:117;;;12642:79;;:::i;:::-;12606:117;12747:62;12801:7;12792:6;12781:9;12777:22;12747:62;:::i;:::-;12737:72;;12533:286;12319:507;;;;:::o;12832:118::-;12919:24;12937:5;12919:24;:::i;:::-;12914:3;12907:37;12832:118;;:::o;12956:434::-;13101:4;13139:2;13128:9;13124:18;13116:26;;13152:71;13220:1;13209:9;13205:17;13196:6;13152:71;:::i;:::-;13233:72;13301:2;13290:9;13286:18;13277:6;13233:72;:::i;:::-;13315:68;13379:2;13368:9;13364:18;13355:6;13315:68;:::i;:::-;12956:434;;;;;;:::o;13396:329::-;13455:6;13504:2;13492:9;13483:7;13479:23;13475:32;13472:119;;;13510:79;;:::i;:::-;13472:119;13630:1;13655:53;13700:7;13691:6;13680:9;13676:22;13655:53;:::i;:::-;13645:63;;13601:117;13396:329;;;;:::o;13731:94::-;13764:8;13812:5;13808:2;13804:14;13783:35;;13731:94;;;:::o;13831:::-;13870:7;13899:20;13913:5;13899:20;:::i;:::-;13888:31;;13831:94;;;:::o;13931:100::-;13970:7;13999:26;14019:5;13999:26;:::i;:::-;13988:37;;13931:100;;;:::o;14037:157::-;14142:45;14162:24;14180:5;14162:24;:::i;:::-;14142:45;:::i;:::-;14137:3;14130:58;14037:157;;:::o;14200:79::-;14239:7;14268:5;14257:16;;14200:79;;;:::o;14285:157::-;14390:45;14410:24;14428:5;14410:24;:::i;:::-;14390:45;:::i;:::-;14385:3;14378:58;14285:157;;:::o;14448:538::-;14616:3;14631:75;14702:3;14693:6;14631:75;:::i;:::-;14731:2;14726:3;14722:12;14715:19;;14744:75;14815:3;14806:6;14744:75;:::i;:::-;14844:2;14839:3;14835:12;14828:19;;14857:75;14928:3;14919:6;14857:75;:::i;:::-;14957:2;14952:3;14948:12;14941:19;;14977:3;14970:10;;14448:538;;;;;;:::o;14992:148::-;15094:11;15131:3;15116:18;;14992:148;;;;:::o;15146:214::-;15286:66;15282:1;15274:6;15270:14;15263:90;15146:214;:::o;15366:402::-;15526:3;15547:85;15629:2;15624:3;15547:85;:::i;:::-;15540:92;;15641:93;15730:3;15641:93;:::i;:::-;15759:2;15754:3;15750:12;15743:19;;15366:402;;;:::o;15774:79::-;15813:7;15842:5;15831:16;;15774:79;;;:::o;15859:157::-;15964:45;15984:24;16002:5;15984:24;:::i;:::-;15964:45;:::i;:::-;15959:3;15952:58;15859:157;;:::o;16022:522::-;16235:3;16257:148;16401:3;16257:148;:::i;:::-;16250:155;;16415:75;16486:3;16477:6;16415:75;:::i;:::-;16515:2;16510:3;16506:12;16499:19;;16535:3;16528:10;;16022:522;;;;:::o;16550:167::-;16690:19;16686:1;16678:6;16674:14;16667:43;16550:167;:::o;16723:366::-;16865:3;16886:67;16950:2;16945:3;16886:67;:::i;:::-;16879:74;;16962:93;17051:3;16962:93;:::i;:::-;17080:2;17075:3;17071:12;17064:19;;16723:366;;;:::o;17095:419::-;17261:4;17299:2;17288:9;17284:18;17276:26;;17348:9;17342:4;17338:20;17334:1;17323:9;17319:17;17312:47;17376:131;17502:4;17376:131;:::i;:::-;17368:139;;17095:419;;;:::o;17520:98::-;17571:6;17605:5;17599:12;17589:22;;17520:98;;;:::o;17624:147::-;17725:11;17762:3;17747:18;;17624:147;;;;:::o;17777:386::-;17881:3;17909:38;17941:5;17909:38;:::i;:::-;17963:88;18044:6;18039:3;17963:88;:::i;:::-;17956:95;;18060:65;18118:6;18113:3;18106:4;18099:5;18095:16;18060:65;:::i;:::-;18150:6;18145:3;18141:16;18134:23;;17885:278;17777:386;;;;:::o;18169:271::-;18299:3;18321:93;18410:3;18401:6;18321:93;:::i;:::-;18314:100;;18431:3;18424:10;;18169:271;;;;:::o;18446:181::-;18586:33;18582:1;18574:6;18570:14;18563:57;18446:181;:::o;18633:366::-;18775:3;18796:67;18860:2;18855:3;18796:67;:::i;:::-;18789:74;;18872:93;18961:3;18872:93;:::i;:::-;18990:2;18985:3;18981:12;18974:19;;18633:366;;;:::o;19005:419::-;19171:4;19209:2;19198:9;19194:18;19186:26;;19258:9;19252:4;19248:20;19244:1;19233:9;19229:17;19222:47;19286:131;19412:4;19286:131;:::i;:::-;19278:139;;19005:419;;;:::o;19430:180::-;19570:32;19566:1;19558:6;19554:14;19547:56;19430:180;:::o;19616:366::-;19758:3;19779:67;19843:2;19838:3;19779:67;:::i;:::-;19772:74;;19855:93;19944:3;19855:93;:::i;:::-;19973:2;19968:3;19964:12;19957:19;;19616:366;;;:::o;19988:419::-;20154:4;20192:2;20181:9;20177:18;20169:26;;20241:9;20235:4;20231:20;20227:1;20216:9;20212:17;20205:47;20269:131;20395:4;20269:131;:::i;:::-;20261:139;;19988:419;;;:::o;20413:179::-;20553:31;20549:1;20541:6;20537:14;20530:55;20413:179;:::o;20598:366::-;20740:3;20761:67;20825:2;20820:3;20761:67;:::i;:::-;20754:74;;20837:93;20926:3;20837:93;:::i;:::-;20955:2;20950:3;20946:12;20939:19;;20598:366;;;:::o;20970:419::-;21136:4;21174:2;21163:9;21159:18;21151:26;;21223:9;21217:4;21213:20;21209:1;21198:9;21194:17;21187:47;21251:131;21377:4;21251:131;:::i;:::-;21243:139;;20970:419;;;:::o;21395:180::-;21443:77;21440:1;21433:88;21540:4;21537:1;21530:15;21564:4;21561:1;21554:15;21581:320;21625:6;21662:1;21656:4;21652:12;21642:22;;21709:1;21703:4;21699:12;21730:18;21720:81;;21786:4;21778:6;21774:17;21764:27;;21720:81;21848:2;21840:6;21837:14;21817:18;21814:38;21811:84;;21867:18;;:::i;:::-;21811:84;21632:269;21581:320;;;:::o;21907:182::-;22047:34;22043:1;22035:6;22031:14;22024:58;21907:182;:::o;22095:366::-;22237:3;22258:67;22322:2;22317:3;22258:67;:::i;:::-;22251:74;;22334:93;22423:3;22334:93;:::i;:::-;22452:2;22447:3;22443:12;22436:19;;22095:366;;;:::o;22467:419::-;22633:4;22671:2;22660:9;22656:18;22648:26;;22720:9;22714:4;22710:20;22706:1;22695:9;22691:17;22684:47;22748:131;22874:4;22748:131;:::i;:::-;22740:139;;22467:419;;;:::o;22892:545::-;23065:4;23103:3;23092:9;23088:19;23080:27;;23117:71;23185:1;23174:9;23170:17;23161:6;23117:71;:::i;:::-;23198:68;23262:2;23251:9;23247:18;23238:6;23198:68;:::i;:::-;23276:72;23344:2;23333:9;23329:18;23320:6;23276:72;:::i;:::-;23358;23426:2;23415:9;23411:18;23402:6;23358:72;:::i;:::-;22892:545;;;;;;;:::o;23443:227::-;23583:34;23579:1;23571:6;23567:14;23560:58;23652:10;23647:2;23639:6;23635:15;23628:35;23443:227;:::o;23676:366::-;23818:3;23839:67;23903:2;23898:3;23839:67;:::i;:::-;23832:74;;23915:93;24004:3;23915:93;:::i;:::-;24033:2;24028:3;24024:12;24017:19;;23676:366;;;:::o;24048:419::-;24214:4;24252:2;24241:9;24237:18;24229:26;;24301:9;24295:4;24291:20;24287:1;24276:9;24272:17;24265:47;24329:131;24455:4;24329:131;:::i;:::-;24321:139;;24048:419;;;:::o;24473:180::-;24521:77;24518:1;24511:88;24618:4;24615:1;24608:15;24642:4;24639:1;24632:15;24659:191;24699:3;24718:20;24736:1;24718:20;:::i;:::-;24713:25;;24752:20;24770:1;24752:20;:::i;:::-;24747:25;;24795:1;24792;24788:9;24781:16;;24816:3;24813:1;24810:10;24807:36;;;24823:18;;:::i;:::-;24807:36;24659:191;;;;:::o;24856:143::-;24913:5;24944:6;24938:13;24929:22;;24960:33;24987:5;24960:33;:::i;:::-;24856:143;;;;:::o;25005:351::-;25075:6;25124:2;25112:9;25103:7;25099:23;25095:32;25092:119;;;25130:79;;:::i;:::-;25092:119;25250:1;25275:64;25331:7;25322:6;25311:9;25307:22;25275:64;:::i;:::-;25265:74;;25221:128;25005:351;;;;:::o;25362:332::-;25483:4;25521:2;25510:9;25506:18;25498:26;;25534:71;25602:1;25591:9;25587:17;25578:6;25534:71;:::i;:::-;25615:72;25683:2;25672:9;25668:18;25659:6;25615:72;:::i;:::-;25362:332;;;;;:::o;25700:85::-;25745:7;25774:5;25763:16;;25700:85;;;:::o;25791:158::-;25849:9;25882:61;25900:42;25909:32;25935:5;25909:32;:::i;:::-;25900:42;:::i;:::-;25882:61;:::i;:::-;25869:74;;25791:158;;;:::o;25955:147::-;26050:45;26089:5;26050:45;:::i;:::-;26045:3;26038:58;25955:147;;:::o;26108:807::-;26357:4;26395:3;26384:9;26380:19;26372:27;;26409:71;26477:1;26466:9;26462:17;26453:6;26409:71;:::i;:::-;26490:72;26558:2;26547:9;26543:18;26534:6;26490:72;:::i;:::-;26572:80;26648:2;26637:9;26633:18;26624:6;26572:80;:::i;:::-;26662;26738:2;26727:9;26723:18;26714:6;26662:80;:::i;:::-;26752:73;26820:3;26809:9;26805:19;26796:6;26752:73;:::i;:::-;26835;26903:3;26892:9;26888:19;26879:6;26835:73;:::i;:::-;26108:807;;;;;;;;;:::o;26921:143::-;26978:5;27009:6;27003:13;26994:22;;27025:33;27052:5;27025:33;:::i;:::-;26921:143;;;;:::o;27070:663::-;27158:6;27166;27174;27223:2;27211:9;27202:7;27198:23;27194:32;27191:119;;;27229:79;;:::i;:::-;27191:119;27349:1;27374:64;27430:7;27421:6;27410:9;27406:22;27374:64;:::i;:::-;27364:74;;27320:128;27487:2;27513:64;27569:7;27560:6;27549:9;27545:22;27513:64;:::i;:::-;27503:74;;27458:129;27626:2;27652:64;27708:7;27699:6;27688:9;27684:22;27652:64;:::i;:::-;27642:74;;27597:129;27070:663;;;;;:::o;27739:244::-;27879:34;27875:1;27867:6;27863:14;27856:58;27948:27;27943:2;27935:6;27931:15;27924:52;27739:244;:::o;27989:366::-;28131:3;28152:67;28216:2;28211:3;28152:67;:::i;:::-;28145:74;;28228:93;28317:3;28228:93;:::i;:::-;28346:2;28341:3;28337:12;28330:19;;27989:366;;;:::o;28361:419::-;28527:4;28565:2;28554:9;28550:18;28542:26;;28614:9;28608:4;28604:20;28600:1;28589:9;28585:17;28578:47;28642:131;28768:4;28642:131;:::i;:::-;28634:139;;28361:419;;;:::o;28786:224::-;28926:34;28922:1;28914:6;28910:14;28903:58;28995:7;28990:2;28982:6;28978:15;28971:32;28786:224;:::o;29016:366::-;29158:3;29179:67;29243:2;29238:3;29179:67;:::i;:::-;29172:74;;29255:93;29344:3;29255:93;:::i;:::-;29373:2;29368:3;29364:12;29357:19;;29016:366;;;:::o;29388:419::-;29554:4;29592:2;29581:9;29577:18;29569:26;;29641:9;29635:4;29631:20;29627:1;29616:9;29612:17;29605:47;29669:131;29795:4;29669:131;:::i;:::-;29661:139;;29388:419;;;:::o;29813:234::-;29953:34;29949:1;29941:6;29937:14;29930:58;30022:17;30017:2;30009:6;30005:15;29998:42;29813:234;:::o;30053:366::-;30195:3;30216:67;30280:2;30275:3;30216:67;:::i;:::-;30209:74;;30292:93;30381:3;30292:93;:::i;:::-;30410:2;30405:3;30401:12;30394:19;;30053:366;;;:::o;30425:419::-;30591:4;30629:2;30618:9;30614:18;30606:26;;30678:9;30672:4;30668:20;30664:1;30653:9;30649:17;30642:47;30706:131;30832:4;30706:131;:::i;:::-;30698:139;;30425:419;;;:::o;30850:223::-;30990:34;30986:1;30978:6;30974:14;30967:58;31059:6;31054:2;31046:6;31042:15;31035:31;30850:223;:::o;31079:366::-;31221:3;31242:67;31306:2;31301:3;31242:67;:::i;:::-;31235:74;;31318:93;31407:3;31318:93;:::i;:::-;31436:2;31431:3;31427:12;31420:19;;31079:366;;;:::o;31451:419::-;31617:4;31655:2;31644:9;31640:18;31632:26;;31704:9;31698:4;31694:20;31690:1;31679:9;31675:17;31668:47;31732:131;31858:4;31732:131;:::i;:::-;31724:139;;31451:419;;;:::o;31876:223::-;32016:34;32012:1;32004:6;32000:14;31993:58;32085:6;32080:2;32072:6;32068:15;32061:31;31876:223;:::o;32105:366::-;32247:3;32268:67;32332:2;32327:3;32268:67;:::i;:::-;32261:74;;32344:93;32433:3;32344:93;:::i;:::-;32462:2;32457:3;32453:12;32446:19;;32105:366;;;:::o;32477:419::-;32643:4;32681:2;32670:9;32666:18;32658:26;;32730:9;32724:4;32720:20;32716:1;32705:9;32701:17;32694:47;32758:131;32884:4;32758:131;:::i;:::-;32750:139;;32477:419;;;:::o;32902:225::-;33042:34;33038:1;33030:6;33026:14;33019:58;33111:8;33106:2;33098:6;33094:15;33087:33;32902:225;:::o;33133:366::-;33275:3;33296:67;33360:2;33355:3;33296:67;:::i;:::-;33289:74;;33372:93;33461:3;33372:93;:::i;:::-;33490:2;33485:3;33481:12;33474:19;;33133:366;;;:::o;33505:419::-;33671:4;33709:2;33698:9;33694:18;33686:26;;33758:9;33752:4;33748:20;33744:1;33733:9;33729:17;33722:47;33786:131;33912:4;33786:131;:::i;:::-;33778:139;;33505:419;;;:::o;33930:224::-;34070:34;34066:1;34058:6;34054:14;34047:58;34139:7;34134:2;34126:6;34122:15;34115:32;33930:224;:::o;34160:366::-;34302:3;34323:67;34387:2;34382:3;34323:67;:::i;:::-;34316:74;;34399:93;34488:3;34399:93;:::i;:::-;34517:2;34512:3;34508:12;34501:19;;34160:366;;;:::o;34532:419::-;34698:4;34736:2;34725:9;34721:18;34713:26;;34785:9;34779:4;34775:20;34771:1;34760:9;34756:17;34749:47;34813:131;34939:4;34813:131;:::i;:::-;34805:139;;34532:419;;;:::o;34957:222::-;35097:34;35093:1;35085:6;35081:14;35074:58;35166:5;35161:2;35153:6;35149:15;35142:30;34957:222;:::o;35185:366::-;35327:3;35348:67;35412:2;35407:3;35348:67;:::i;:::-;35341:74;;35424:93;35513:3;35424:93;:::i;:::-;35542:2;35537:3;35533:12;35526:19;;35185:366;;;:::o;35557:419::-;35723:4;35761:2;35750:9;35746:18;35738:26;;35810:9;35804:4;35800:20;35796:1;35785:9;35781:17;35774:47;35838:131;35964:4;35838:131;:::i;:::-;35830:139;;35557:419;;;:::o;35982:225::-;36122:34;36118:1;36110:6;36106:14;36099:58;36191:8;36186:2;36178:6;36174:15;36167:33;35982:225;:::o;36213:366::-;36355:3;36376:67;36440:2;36435:3;36376:67;:::i;:::-;36369:74;;36452:93;36541:3;36452:93;:::i;:::-;36570:2;36565:3;36561:12;36554:19;;36213:366;;;:::o;36585:419::-;36751:4;36789:2;36778:9;36774:18;36766:26;;36838:9;36832:4;36828:20;36824:1;36813:9;36809:17;36802:47;36866:131;36992:4;36866:131;:::i;:::-;36858:139;;36585:419;;;:::o;37010:223::-;37150:34;37146:1;37138:6;37134:14;37127:58;37219:6;37214:2;37206:6;37202:15;37195:31;37010:223;:::o;37239:366::-;37381:3;37402:67;37466:2;37461:3;37402:67;:::i;:::-;37395:74;;37478:93;37567:3;37478:93;:::i;:::-;37596:2;37591:3;37587:12;37580:19;;37239:366;;;:::o;37611:419::-;37777:4;37815:2;37804:9;37800:18;37792:26;;37864:9;37858:4;37854:20;37850:1;37839:9;37835:17;37828:47;37892:131;38018:4;37892:131;:::i;:::-;37884:139;;37611:419;;;:::o;38036:221::-;38176:34;38172:1;38164:6;38160:14;38153:58;38245:4;38240:2;38232:6;38228:15;38221:29;38036:221;:::o;38263:366::-;38405:3;38426:67;38490:2;38485:3;38426:67;:::i;:::-;38419:74;;38502:93;38591:3;38502:93;:::i;:::-;38620:2;38615:3;38611:12;38604:19;;38263:366;;;:::o;38635:419::-;38801:4;38839:2;38828:9;38824:18;38816:26;;38888:9;38882:4;38878:20;38874:1;38863:9;38859:17;38852:47;38916:131;39042:4;38916:131;:::i;:::-;38908:139;;38635:419;;;:::o;39060:228::-;39200:34;39196:1;39188:6;39184:14;39177:58;39269:11;39264:2;39256:6;39252:15;39245:36;39060:228;:::o;39294:366::-;39436:3;39457:67;39521:2;39516:3;39457:67;:::i;:::-;39450:74;;39533:93;39622:3;39533:93;:::i;:::-;39651:2;39646:3;39642:12;39635:19;;39294:366;;;:::o;39666:419::-;39832:4;39870:2;39859:9;39855:18;39847:26;;39919:9;39913:4;39909:20;39905:1;39894:9;39890:17;39883:47;39947:131;40073:4;39947:131;:::i;:::-;39939:139;;39666:419;;;:::o;40091:177::-;40231:29;40227:1;40219:6;40215:14;40208:53;40091:177;:::o;40274:366::-;40416:3;40437:67;40501:2;40496:3;40437:67;:::i;:::-;40430:74;;40513:93;40602:3;40513:93;:::i;:::-;40631:2;40626:3;40622:12;40615:19;;40274:366;;;:::o;40646:419::-;40812:4;40850:2;40839:9;40835:18;40827:26;;40899:9;40893:4;40889:20;40885:1;40874:9;40870:17;40863:47;40927:131;41053:4;40927:131;:::i;:::-;40919:139;;40646:419;;;:::o;41071:240::-;41211:34;41207:1;41199:6;41195:14;41188:58;41280:23;41275:2;41267:6;41263:15;41256:48;41071:240;:::o;41317:366::-;41459:3;41480:67;41544:2;41539:3;41480:67;:::i;:::-;41473:74;;41556:93;41645:3;41556:93;:::i;:::-;41674:2;41669:3;41665:12;41658:19;;41317:366;;;:::o;41689:419::-;41855:4;41893:2;41882:9;41878:18;41870:26;;41942:9;41936:4;41932:20;41928:1;41917:9;41913:17;41906:47;41970:131;42096:4;41970:131;:::i;:::-;41962:139;;41689:419;;;:::o;42114:169::-;42254:21;42250:1;42242:6;42238:14;42231:45;42114:169;:::o;42289:366::-;42431:3;42452:67;42516:2;42511:3;42452:67;:::i;:::-;42445:74;;42528:93;42617:3;42528:93;:::i;:::-;42646:2;42641:3;42637:12;42630:19;;42289:366;;;:::o;42661:419::-;42827:4;42865:2;42854:9;42850:18;42842:26;;42914:9;42908:4;42904:20;42900:1;42889:9;42885:17;42878:47;42942:131;43068:4;42942:131;:::i;:::-;42934:139;;42661:419;;;:::o;43086:241::-;43226:34;43222:1;43214:6;43210:14;43203:58;43295:24;43290:2;43282:6;43278:15;43271:49;43086:241;:::o;43333:366::-;43475:3;43496:67;43560:2;43555:3;43496:67;:::i;:::-;43489:74;;43572:93;43661:3;43572:93;:::i;:::-;43690:2;43685:3;43681:12;43674:19;;43333:366;;;:::o;43705:419::-;43871:4;43909:2;43898:9;43894:18;43886:26;;43958:9;43952:4;43948:20;43944:1;43933:9;43929:17;43922:47;43986:131;44112:4;43986:131;:::i;:::-;43978:139;;43705:419;;;:::o;44130:194::-;44170:4;44190:20;44208:1;44190:20;:::i;:::-;44185:25;;44224:20;44242:1;44224:20;:::i;:::-;44219:25;;44268:1;44265;44261:9;44253:17;;44292:1;44286:4;44283:11;44280:37;;;44297:18;;:::i;:::-;44280:37;44130:194;;;;:::o;44330:114::-;;:::o;44450:398::-;44609:3;44630:83;44711:1;44706:3;44630:83;:::i;:::-;44623:90;;44722:93;44811:3;44722:93;:::i;:::-;44840:1;44835:3;44831:11;44824:18;;44450:398;;;:::o;44854:379::-;45038:3;45060:147;45203:3;45060:147;:::i;:::-;45053:154;;45224:3;45217:10;;44854:379;;;:::o;45239:430::-;45382:4;45420:2;45409:9;45405:18;45397:26;;45433:71;45501:1;45490:9;45486:17;45477:6;45433:71;:::i;:::-;45514:72;45582:2;45571:9;45567:18;45558:6;45514:72;:::i;:::-;45596:66;45658:2;45647:9;45643:18;45634:6;45596:66;:::i;:::-;45239:430;;;;;;:::o;45675:410::-;45715:7;45738:20;45756:1;45738:20;:::i;:::-;45733:25;;45772:20;45790:1;45772:20;:::i;:::-;45767:25;;45827:1;45824;45820:9;45849:30;45867:11;45849:30;:::i;:::-;45838:41;;46028:1;46019:7;46015:15;46012:1;46009:22;45989:1;45982:9;45962:83;45939:139;;46058:18;;:::i;:::-;45939:139;45723:362;45675:410;;;;:::o;46091:180::-;46139:77;46136:1;46129:88;46236:4;46233:1;46226:15;46260:4;46257:1;46250:15;46277:185;46317:1;46334:20;46352:1;46334:20;:::i;:::-;46329:25;;46368:20;46386:1;46368:20;:::i;:::-;46363:25;;46407:1;46397:35;;46412:18;;:::i;:::-;46397:35;46454:1;46451;46447:9;46442:14;;46277:185;;;;:::o;46468:180::-;46516:77;46513:1;46506:88;46613:4;46610:1;46603:15;46637:4;46634:1;46627:15;46654:114;46721:6;46755:5;46749:12;46739:22;;46654:114;;;:::o;46774:184::-;46873:11;46907:6;46902:3;46895:19;46947:4;46942:3;46938:14;46923:29;;46774:184;;;;:::o;46964:132::-;47031:4;47054:3;47046:11;;47084:4;47079:3;47075:14;47067:22;;46964:132;;;:::o;47102:108::-;47179:24;47197:5;47179:24;:::i;:::-;47174:3;47167:37;47102:108;;:::o;47216:179::-;47285:10;47306:46;47348:3;47340:6;47306:46;:::i;:::-;47384:4;47379:3;47375:14;47361:28;;47216:179;;;;:::o;47401:113::-;47471:4;47503;47498:3;47494:14;47486:22;;47401:113;;;:::o;47550:732::-;47669:3;47698:54;47746:5;47698:54;:::i;:::-;47768:86;47847:6;47842:3;47768:86;:::i;:::-;47761:93;;47878:56;47928:5;47878:56;:::i;:::-;47957:7;47988:1;47973:284;47998:6;47995:1;47992:13;47973:284;;;48074:6;48068:13;48101:63;48160:3;48145:13;48101:63;:::i;:::-;48094:70;;48187:60;48240:6;48187:60;:::i;:::-;48177:70;;48033:224;48020:1;48017;48013:9;48008:14;;47973:284;;;47977:14;48273:3;48266:10;;47674:608;;;47550:732;;;;:::o;48288:831::-;48551:4;48589:3;48578:9;48574:19;48566:27;;48603:71;48671:1;48660:9;48656:17;48647:6;48603:71;:::i;:::-;48684:80;48760:2;48749:9;48745:18;48736:6;48684:80;:::i;:::-;48811:9;48805:4;48801:20;48796:2;48785:9;48781:18;48774:48;48839:108;48942:4;48933:6;48839:108;:::i;:::-;48831:116;;48957:72;49025:2;49014:9;49010:18;49001:6;48957:72;:::i;:::-;49039:73;49107:3;49096:9;49092:19;49083:6;49039:73;:::i;:::-;48288:831;;;;;;;;:::o

Swarm Source

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