ETH Price: $3,268.43 (+0.10%)
Gas: 18 Gwei

Token

EverETH_Dividend_Tracker (EverETH_Dividend_Tracker)
 

Overview

Max Total Supply

138,227,937.516301917388447857 EverETH_Dividend_Tracker

Holders

84

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
0 EverETH_Dividend_Tracker

Value
$0.00
0x8a9d187e5dd46a07034bae9a72b18d00b4bd839d
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
EverETHDividendTracker

Compiler Version
v0.8.19+commit.7dd6d404

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2024-07-10
*/

pragma solidity 0.8.19;

// SPDX-License-Identifier: MIT

/**

███████ ███████ ████████ ██   ██ 
██      ██         ██    ██   ██ 
█████   █████      ██    ███████ 
██      ██         ██    ██   ██ 
███████ ███████    ██    ██   ██ 

Dividend Tracker.                         

*/

interface IERC20 {
    function totalSupply() external view returns (uint256);

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

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

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

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

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

    event Transfer(address indexed from, address indexed to, uint256 value);

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

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

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

abstract contract Ownable is Context {
    address private _owner;

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

    constructor() {
        _setOwner(_msgSender());
    }

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

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

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

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

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}



/**
 * @title SafeMathInt
 * @dev Math operations for int256 with overflow safety checks.
 */
library SafeMathInt {
    int256 private constant MIN_INT256 = int256(1) << 255;

    /**
     * @dev Multiplies two int256 variables and fails on overflow.
     */
    function mul(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a * b;

        // Detect overflow when multiplying MIN_INT256 with -1
        require(c != MIN_INT256 || (a & MIN_INT256) != (b & MIN_INT256));
        require((b == 0) || (c / b == a));
        return c;
    }

    /**
     * @dev Division of two int256 variables and fails on overflow.
     */
    function div(int256 a, int256 b) internal pure returns (int256) {
        // Prevent overflow when dividing MIN_INT256 by -1
        require(b != -1 || a != MIN_INT256);

        // Solidity already throws when dividing by 0.
        return a / b;
    }

    /**
     * @dev Subtracts two int256 variables and fails on overflow.
     */
    function sub(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a - b;
        require((b >= 0 && c <= a) || (b < 0 && c > a));
        return c;
    }

    /**
     * @dev Adds two int256 variables and fails on overflow.
     */
    function add(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a + b;
        require((b >= 0 && c >= a) || (b < 0 && c < a));
        return c;
    }

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

/**
 * @title SafeMathUint
 * @dev Math operations with safety checks that revert on error
 */
library SafeMathUint {
  function toInt256Safe(uint256 a) internal pure returns (int256) {
    int256 b = int256(a);
    require(b >= 0);
    return b;
  }
}

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 {
    using SafeMath for uint256;

    mapping(address => uint256) private _balances;

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * The default value of {decimals} is 18. To select a different value for
     * {decimals} you should overload it.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    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;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5,05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the value {ERC20} uses, unless this function is
     * overridden;
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    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;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * Requirements:
     *
     * - `sender` and `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     * - the caller must have allowance for ``sender``'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(
            sender,
            _msgSender(),
            _allowances[sender][_msgSender()].sub(
                amount,
                "ERC20: transfer amount exceeds allowance"
            )
        );
        return true;
    }


    /**
     * @dev Moves tokens `amount` from `sender` to `recipient`.
     *
     * This is internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `sender` cannot be the zero address.
     * - `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     */
    function _transfer(
        address sender,
        address recipient,
        uint256 amount
    ) internal virtual {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(sender, recipient, amount);

        _balances[sender] = _balances[sender].sub(
            amount,
            "ERC20: transfer amount exceeds balance"
        );
        _balances[recipient] = _balances[recipient].add(amount);
        emit Transfer(sender, recipient, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

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

        _totalSupply = _totalSupply.add(amount);
        _balances[account] = _balances[account].add(amount);
        emit Transfer(address(0), account, amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

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

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

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    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);
    }

    /**
     * @dev Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be to transferred to `to`.
     * - when `from` is zero, `amount` tokens will be minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}
}

interface DividendPayingTokenOptionalInterface {
    /// @notice View the amount of dividend in wei that an address can withdraw.
    /// @param _owner The address of a token holder.
    /// @return The amount of dividend in wei that `_owner` can withdraw.
    function withdrawableDividendOf(address _owner)
        external
        view
        returns (uint256);

    /// @notice View the amount of dividend in wei that an address has withdrawn.
    /// @param _owner The address of a token holder.
    /// @return The amount of dividend in wei that `_owner` has withdrawn.
    function withdrawnDividendOf(address _owner)
        external
        view
        returns (uint256);

    /// @notice View the amount of dividend in wei that an address has earned in total.
    /// @dev accumulativeDividendOf(_owner) = withdrawableDividendOf(_owner) + withdrawnDividendOf(_owner)
    /// @param _owner The address of a token holder.
    /// @return The amount of dividend in wei that `_owner` has earned in total.
    function accumulativeDividendOf(address _owner)
        external
        view
        returns (uint256);
}

interface DividendPayingTokenInterface {
    /// @notice View the amount of dividend in wei that an address can withdraw.
    /// @param _owner The address of a token holder.
    /// @return The amount of dividend in wei that `_owner` can withdraw.
    function dividendOf(address _owner) external view returns (uint256);


    /// @notice Withdraws the ether distributed to the sender.
    /// @dev SHOULD transfer `dividendOf(msg.sender)` wei to `msg.sender`, and `dividendOf(msg.sender)` SHOULD be 0 after the transfer.
    ///  MUST emit a `DividendWithdrawn` event if the amount of ether transferred is greater than 0.
    function withdrawDividend() external;

    /// @dev This event MUST emit when ether is distributed to token holders.
    /// @param from The address which sends ether to this contract.
    /// @param weiAmount The amount of distributed ether in wei.
    event DividendsDistributed(address indexed from, uint256 weiAmount);

    /// @dev This event MUST emit when an address withdraws their dividend.
    /// @param to The address which withdraws ether from this contract.
    /// @param weiAmount The amount of withdrawn ether in wei.
    event DividendWithdrawn(address indexed to, uint256 weiAmount);
}

contract DividendPayingToken is
    ERC20,
    DividendPayingTokenInterface,
    DividendPayingTokenOptionalInterface
{
    using SafeMath for uint256;
    using SafeMathUint for uint256;
    using SafeMathInt for int256;

    address public immutable EETH = address(0xe46a1D19962Ea120765D3139c588fFd617bE04A8); // EETH
    address public constant ADMIN = 0x11b0d3bbFC34D01B855B81Cc1Eb0f2750C9e65a0;

modifier onlyAdmin() {
        require(msg.sender == ADMIN, "Only admin can call this function");
        _;
    }

    // With `magnitude`, we can properly distribute dividends even if the amount of received ether is small.
    // For more discussion about choosing the value of `magnitude`,
    //  see https://github.com/ethereum/EIPs/issues/1726#issuecomment-472352728
    uint256 internal constant magnitude = 2**128;

    uint256 internal magnifiedDividendPerShare;

    // About dividendCorrection:
    // If the token balance of a `_user` is never changed, the dividend of `_user` can be computed with:
    //   `dividendOf(_user) = dividendPerShare * balanceOf(_user)`.
    // When `balanceOf(_user)` is changed (via minting/burning/transferring tokens),
    //   `dividendOf(_user)` should not be changed,
    //   but the computed value of `dividendPerShare * balanceOf(_user)` is changed.
    // To keep the `dividendOf(_user)` unchanged, we add a correction term:
    //   `dividendOf(_user) = dividendPerShare * balanceOf(_user) + dividendCorrectionOf(_user)`,
    //   where `dividendCorrectionOf(_user)` is updated whenever `balanceOf(_user)` is changed:
    //   `dividendCorrectionOf(_user) = dividendPerShare * (old balanceOf(_user)) - (new balanceOf(_user))`.
    // So now `dividendOf(_user)` returns the same value before and after `balanceOf(_user)` is changed.
    mapping(address => int256) internal magnifiedDividendCorrections;
    mapping(address => uint256) internal withdrawnDividends;

    uint256 public totalDividendsDistributed;

    constructor(string memory _name, string memory _symbol)
        ERC20(_name, _symbol)
    {}

    /// @notice Distributes ether to token holders as dividends.
    /// @dev It reverts if the total supply of tokens is 0.
    /// It emits the `DividendsDistributed` event if the amount of received ether is greater than 0.
    /// About undistributed ether:
    ///   In each distribution, there is a small amount of ether not distributed,
    ///     the magnified amount of which is
    ///     `(msg.value * magnitude) % totalSupply()`.
    ///   With a well-chosen `magnitude`, the amount of undistributed ether
    ///     (de-magnified) in a distribution can be less than 1 wei.
    ///   We can actually keep track of the undistributed ether in a distribution
    ///     and try to distribute it in the next distribution,
    ///     but keeping track of such data on-chain costs much more than
    ///     the saved ether, so we don't do that.

    function distributeEETHDividends(uint256 amount) public onlyAdmin {
        require(totalSupply() > 0);

        if (amount > 0) {
            magnifiedDividendPerShare = magnifiedDividendPerShare.add(
                (amount).mul(magnitude) / totalSupply()
            );
            emit DividendsDistributed(msg.sender, amount);

            totalDividendsDistributed = totalDividendsDistributed.add(amount);
        }
    }

    /// @notice Withdraws the ether distributed to the sender.
    /// @dev It emits a `DividendWithdrawn` event if the amount of withdrawn ether is greater than 0.
    function withdrawDividend() public virtual override {
        _withdrawDividendOfUser(payable(msg.sender));
    }

    /// @notice Withdraws the ether distributed to the sender.
    /// @dev It emits a `DividendWithdrawn` event if the amount of withdrawn ether is greater than 0.
    function _withdrawDividendOfUser(address payable user) internal returns (uint256) {
        uint256 _withdrawableDividend = withdrawableDividendOf(user);
        if (_withdrawableDividend > 0) {
        withdrawnDividends[user] = withdrawnDividends[user].add(_withdrawableDividend);
      emit DividendWithdrawn(user, _withdrawableDividend);
      bool success = IERC20(EETH).transfer(user, _withdrawableDividend);

      if(!success) {
        withdrawnDividends[user] = withdrawnDividends[user].sub(_withdrawableDividend);
        return 0;
      }

      return _withdrawableDividend;
    }

    return 0;
  }

    /// @notice View the amount of dividend in wei that an address can withdraw.
    /// @param _owner The address of a token holder.
    /// @return The amount of dividend in wei that `_owner` can withdraw.
    function dividendOf(address _owner) public view override returns (uint256) {
        return withdrawableDividendOf(_owner);
    }

    /// @notice View the amount of dividend in wei that an address can withdraw.
    /// @param _owner The address of a token holder.
    /// @return The amount of dividend in wei that `_owner` can withdraw.
    function withdrawableDividendOf(address _owner)
        public
        view
        override
        returns (uint256)
    {
        return accumulativeDividendOf(_owner).sub(withdrawnDividends[_owner]);
    }

    /// @notice View the amount of dividend in wei that an address has withdrawn.
    /// @param _owner The address of a token holder.
    /// @return The amount of dividend in wei that `_owner` has withdrawn.
    function withdrawnDividendOf(address _owner)
        public
        view
        override
        returns (uint256)
    {
        return withdrawnDividends[_owner];
    }

    /// @notice View the amount of dividend in wei that an address has earned in total.
    /// @dev accumulativeDividendOf(_owner) = withdrawableDividendOf(_owner) + withdrawnDividendOf(_owner)
    /// = (magnifiedDividendPerShare * balanceOf(_owner) + magnifiedDividendCorrections[_owner]) / magnitude
    /// @param _owner The address of a token holder.
    /// @return The amount of dividend in wei that `_owner` has earned in total.
    function accumulativeDividendOf(address _owner)
        public
        view
        override
        returns (uint256)
    {
        return
            magnifiedDividendPerShare
                .mul(balanceOf(_owner))
                .toInt256Safe()
                .add(magnifiedDividendCorrections[_owner])
                .toUint256Safe() / magnitude;
    }

    /// @dev Internal function that mints tokens to an account.
    /// Update magnifiedDividendCorrections to keep dividends unchanged.
    /// @param account The account that will receive the created tokens.
    /// @param value The amount that will be created.
    function _mint(address account, uint256 value) internal override {
        super._mint(account, value);

        magnifiedDividendCorrections[account] = magnifiedDividendCorrections[
            account
        ].sub((magnifiedDividendPerShare.mul(value)).toInt256Safe());
    }

    /// @dev Internal function that burns an amount of the token of a given account.
    /// Update magnifiedDividendCorrections to keep dividends unchanged.
    /// @param account The account whose tokens will be burnt.
    /// @param value The amount that will be burnt.
    function _burn(address account, uint256 value) internal override {
        super._burn(account, value);

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

    function _setBalance2(address account, uint256 newBalance) internal {
    
        uint256  currentBalance = balanceOf(account);

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

    function _setBalance(address account, uint256 newBalance) internal {
        newBalance = IERC20(EETH).balanceOf(account);
        uint256  currentBalance = balanceOf(account);

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


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

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

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

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



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

    function set(Map storage map, address key, uint val) public {
        if (map.inserted[key]) {
            map.values[key] = val;
        } else {
            map.inserted[key] = true;
            map.values[key] = val;
            map.indexOf[key] = map.keys.length;
            map.keys.push(key);
        }
    }

    function remove(Map storage map, address key) public {
        if (!map.inserted[key]) {
            return;
        }

        delete map.inserted[key];
        delete map.values[key];

        uint index = map.indexOf[key];
        uint lastIndex = map.keys.length - 1;
        address lastKey = map.keys[lastIndex];

        map.indexOf[lastKey] = index;
        delete map.indexOf[key];

        map.keys[index] = lastKey;
        map.keys.pop();
    }
}


library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts with custom message when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

contract EverETHDividendTracker is DividendPayingToken, Ownable {
    using SafeMath for uint256;
    using SafeMathInt for int256;
    using IterableMapping for IterableMapping.Map;

    IterableMapping.Map private tokenHoldersMap;

    mapping (address => uint256) public firstHoldTime;
    uint256 public minimumHoldPeriod;

    mapping (address => bool) public excludedFromDividends;

    mapping (address => uint256) public lastClaimTimes;

    uint256 public claimWait;
    uint256 public  minimumTokenBalanceForDividends;

    event MinimumHoldPeriodUpdated(uint256 indexed newValue, uint256 indexed oldValue);

    event ExcludeFromDividends(address indexed account);
    event ClaimWaitUpdated(uint256 indexed newValue, uint256 indexed oldValue);

    event Claim(address indexed account, uint256 amount, bool indexed automatic);

    constructor()  DividendPayingToken("EverETH_Dividend_Tracker", "EverETH_Dividend_Tracker") {
    	claimWait = 24 hours;
        minimumHoldPeriod = 30 days; // Default 30 day hold period for first-time claimers
        minimumTokenBalanceForDividends = 10000 * (10**18); //must hold 10000+ tokens
    }

    function _transfer(address, address, uint256) internal pure override {
        require(false, "EverETH_Dividend_Tracker: No transfers allowed");
    }
    
    function depositRewardEETH(uint256 tokenAmount) public onlyAdmin {
        bool success = IERC20(EETH).transferFrom(msg.sender, address(this), tokenAmount);
        if(success) distributeEETHDividends(tokenAmount);
    }

    function updateMinimumHoldPeriod(uint256 newMinimumHoldPeriod) external onlyAdmin {
    require(newMinimumHoldPeriod >= 1 hours && newMinimumHoldPeriod <= 365 days, "Hold period must be between 1 hour and 365 days");
    require(newMinimumHoldPeriod != minimumHoldPeriod, "Cannot update to the same value");
    
    emit MinimumHoldPeriodUpdated(newMinimumHoldPeriod, minimumHoldPeriod);
    minimumHoldPeriod = newMinimumHoldPeriod;
}

function canProcessAccount(address account) public view returns (bool) {
    return (firstHoldTime[account] > 0) &&
           (block.timestamp >= firstHoldTime[account].add(minimumHoldPeriod)) &&
           (block.timestamp >= lastClaimTimes[account].add(claimWait));
}

    function withdrawDividend() public pure override {
        require(false, "EverETH_Dividend_Tracker: withdrawDividend disabled. Use the 'claim' function on the main EverETH contract.");
    }

    function updateMinimumTokenBalanceForDividends(uint256 _newMinimumBalance) external onlyOwner {
        minimumTokenBalanceForDividends = _newMinimumBalance * (10**18);
    }

    /// @dev It will send all ETH to curent contracty owner
    function recoverETH() external onlyOwner {
    
        uint256 ETHbalance = address(this).balance;
        (bool success, ) = payable(owner()).call{value: ETHbalance}("");
        require(success);
        
    }

function recoverERC20(address tokenAddress, uint256 tokenAmount) external onlyOwner {
    require(tokenAddress != address(this), "Cannot recover the dividend tracker token");
    
    IERC20 token = IERC20(tokenAddress);
    uint256 balance = token.balanceOf(address(this));
    require(tokenAmount <= balance, "Cannot recover more than the token balance");

    bool success = token.transfer(owner(), tokenAmount);
    require(success, "Transfer failed");

    if (tokenAddress == EETH) {
        // If recovering EETH, update the total dividends distributed
        totalDividendsDistributed = totalDividendsDistributed.sub(tokenAmount);
    }

    emit ERC20Recovered(tokenAddress, tokenAmount, owner());
}

event ERC20Recovered(address tokenAddress, uint256 amount, address to);
    
    function excludeFromDividends(address account) external onlyOwner {
    	require(!excludedFromDividends[account]);
    	excludedFromDividends[account] = true;

    	_setBalance2(account, 0);
    	tokenHoldersMap.remove(account);

    	emit ExcludeFromDividends(account);
    }

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

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

    function getAccount(address _account)
        public view returns (
            address account,
            int256 index,
            uint256 withdrawableDividends,
            uint256 totalDividends,
            uint256 lastClaimTime,
            uint256 nextClaimTime,
            uint256 secondsUntilNextClaimAvailable) {
        account = _account;

        index = tokenHoldersMap.getIndexOfKey(account);

        withdrawableDividends = withdrawableDividendOf(account);
        totalDividends = accumulativeDividendOf(account);

        lastClaimTime = lastClaimTimes[account];

        nextClaimTime = lastClaimTime > 0 ?
                                    lastClaimTime.add(claimWait) :
                                    0;

        secondsUntilNextClaimAvailable = nextClaimTime > block.timestamp ?
                                                    nextClaimTime.sub(block.timestamp) :
                                                    0;
    }

    function getAccountAtIndex(uint256 index)
        public view returns (
            address,
            int256,
            uint256,
            uint256,
            uint256,
            uint256,
            uint256) {
    	if(index >= tokenHoldersMap.size()) {
            return (0x0000000000000000000000000000000000000000, -1, 0, 0, 0, 0, 0);
        }

        address account = tokenHoldersMap.getKeyAtIndex(index);

        return getAccount(account);
    }

    function setBalanceMultiple(address[] calldata  accounts, uint256[] calldata newBalance) external onlyOwner {
     for (uint256 i = 0; i < accounts.length; i++){
        if(excludedFromDividends[accounts[i]]) {
    		return;
    	}

    	if(newBalance[i] >= minimumTokenBalanceForDividends) {
            _setBalance(accounts[i], newBalance[i]);
    		tokenHoldersMap.set(accounts[i], newBalance[i]);
    	}
    	else {
            _setBalance(accounts[i], 0);
    		tokenHoldersMap.remove(accounts[i]);
    	}
     }
    }

function setBalance(address payable account, uint256 newBalance) external onlyOwner {
    if(excludedFromDividends[account]) {
        return;
    }

    if(newBalance >= minimumTokenBalanceForDividends) {
        _setBalance(account, newBalance);
        tokenHoldersMap.set(account, newBalance);
        
        if (firstHoldTime[account] == 0) {
            firstHoldTime[account] = block.timestamp;
        }
    }
    else {
        _setBalance(account, 0);
        tokenHoldersMap.remove(account);
        firstHoldTime[account] = 0; // Reset hold time if balance drops below minimum
    }
}

function isAccountEligibleForClaim(address account) public view returns (bool) {
    return canProcessAccount(account);
}

function timeUntilEligibleForClaim(address account) public view returns (uint256) {
    if (firstHoldTime[account] == 0) {
        return minimumHoldPeriod;
    }
    uint256 holdTimeElapsed = block.timestamp.sub(firstHoldTime[account]);
    if (holdTimeElapsed < minimumHoldPeriod) {
        return minimumHoldPeriod.sub(holdTimeElapsed);
    }
    uint256 timeSinceLastClaim = block.timestamp.sub(lastClaimTimes[account]);
    if (timeSinceLastClaim < claimWait) {
        return claimWait.sub(timeSinceLastClaim);
    }
    return 0;
}

function getTotalDividendsDistributedTo(address account) public view returns (uint256) {
    return withdrawnDividendOf(account).add(withdrawableDividendOf(account));
}

function getCurrentDividendYield() public view returns (uint256) {
    if (totalSupply() == 0) return 0;
    return totalDividendsDistributed.mul(100).div(totalSupply());
}

function getNextDividendPaymentEstimate(address account) public view returns (uint256) {
    if (totalSupply() == 0) return 0;
    return balanceOf(account).mul(totalDividendsDistributed).div(totalSupply()).sub(withdrawnDividendOf(account));
}

function getDividendAccountInfo(address account) public view returns (
    uint256 withdrawableDividends,
    uint256 totalDividends,
    uint256 lastClaimTime,
    uint256 nextClaimTime,
    uint256 secondsUntilNextClaimAvailable,
    bool isEligibleForClaim,
    uint256 timeUntilEligible
) {
    (,, withdrawableDividends, totalDividends, lastClaimTime, nextClaimTime, secondsUntilNextClaimAvailable) = getAccount(account);
    isEligibleForClaim = canProcessAccount(account);
    timeUntilEligible = timeUntilEligibleForClaim(account);
}


    function processAccount(address payable account, bool automatic) public onlyOwner returns (bool) {
    require(canProcessAccount(account), "Account is not eligible for processing");
    
    uint256 amount = _withdrawDividendOfUser(account);

    if(amount > 0) {
        lastClaimTimes[account] = block.timestamp;
        emit Claim(account, amount, automatic);
        return true;
    }

    return false;
}
}

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":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"bool","name":"automatic","type":"bool"}],"name":"Claim","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"newValue","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"oldValue","type":"uint256"}],"name":"ClaimWaitUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"weiAmount","type":"uint256"}],"name":"DividendWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"weiAmount","type":"uint256"}],"name":"DividendsDistributed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"to","type":"address"}],"name":"ERC20Recovered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"ExcludeFromDividends","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"newValue","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"oldValue","type":"uint256"}],"name":"MinimumHoldPeriodUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"ADMIN","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"EETH","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"accumulativeDividendOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"canProcessAccount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimWait","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"name":"depositRewardEETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"distributeEETHDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"dividendOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"excludedFromDividends","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"firstHoldTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"getAccount","outputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"int256","name":"index","type":"int256"},{"internalType":"uint256","name":"withdrawableDividends","type":"uint256"},{"internalType":"uint256","name":"totalDividends","type":"uint256"},{"internalType":"uint256","name":"lastClaimTime","type":"uint256"},{"internalType":"uint256","name":"nextClaimTime","type":"uint256"},{"internalType":"uint256","name":"secondsUntilNextClaimAvailable","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getAccountAtIndex","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentDividendYield","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getDividendAccountInfo","outputs":[{"internalType":"uint256","name":"withdrawableDividends","type":"uint256"},{"internalType":"uint256","name":"totalDividends","type":"uint256"},{"internalType":"uint256","name":"lastClaimTime","type":"uint256"},{"internalType":"uint256","name":"nextClaimTime","type":"uint256"},{"internalType":"uint256","name":"secondsUntilNextClaimAvailable","type":"uint256"},{"internalType":"bool","name":"isEligibleForClaim","type":"bool"},{"internalType":"uint256","name":"timeUntilEligible","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getNextDividendPaymentEstimate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNumberOfTokenHolders","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getTotalDividendsDistributedTo","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isAccountEligibleForClaim","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lastClaimTimes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minimumHoldPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minimumTokenBalanceForDividends","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":"address payable","name":"account","type":"address"},{"internalType":"bool","name":"automatic","type":"bool"}],"name":"processAccount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"name":"recoverERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"recoverETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"account","type":"address"},{"internalType":"uint256","name":"newBalance","type":"uint256"}],"name":"setBalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"newBalance","type":"uint256[]"}],"name":"setBalanceMultiple","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"timeUntilEligibleForClaim","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalDividendsDistributed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newClaimWait","type":"uint256"}],"name":"updateClaimWait","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMinimumHoldPeriod","type":"uint256"}],"name":"updateMinimumHoldPeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMinimumBalance","type":"uint256"}],"name":"updateMinimumTokenBalanceForDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawDividend","outputs":[],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"withdrawableDividendOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"withdrawnDividendOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]

60a060405273e46a1d19962ea120765d3139c588ffd617be04a873ffffffffffffffffffffffffffffffffffffffff1660809073ffffffffffffffffffffffffffffffffffffffff168152503480156200005857600080fd5b506040518060400160405280601881526020017f457665724554485f4469766964656e645f547261636b657200000000000000008152506040518060400160405280601881526020017f457665724554485f4469766964656e645f547261636b6572000000000000000081525081818160039081620000d8919062000482565b508060049081620000ea919062000482565b50505050506200010f620001036200013a60201b60201c565b6200014260201b60201c565b6201518060128190555062278d00600f8190555069021e19e0c9bab240000060138190555062000569565b600033905090565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200028a57607f821691505b602082108103620002a0576200029f62000242565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026200030a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620002cb565b620003168683620002cb565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620003636200035d62000357846200032e565b62000338565b6200032e565b9050919050565b6000819050919050565b6200037f8362000342565b620003976200038e826200036a565b848454620002d8565b825550505050565b600090565b620003ae6200039f565b620003bb81848462000374565b505050565b5b81811015620003e357620003d7600082620003a4565b600181019050620003c1565b5050565b601f8211156200043257620003fc81620002a6565b6200040784620002bb565b8101602085101562000417578190505b6200042f6200042685620002bb565b830182620003c0565b50505b505050565b600082821c905092915050565b6000620004576000198460080262000437565b1980831691505092915050565b600062000472838362000444565b9150826002028217905092915050565b6200048d8262000208565b67ffffffffffffffff811115620004a957620004a862000213565b5b620004b5825462000271565b620004c2828285620003e7565b600060209050601f831160018114620004fa5760008415620004e5578287015190505b620004f1858262000464565b86555062000561565b601f1984166200050a86620002a6565b60005b8281101562000534578489015182556001820191506020850194506020810190506200050d565b8683101562000554578489015162000550601f89168262000444565b8355505b6001600288020188555050505b505050505050565b608051615011620005a160003960008181611ada01528181611deb0152818161229401528181612e31015261319001526150116000f3fe608060405234801561001057600080fd5b50600436106102945760003560e01c806370a0823111610167578063a9059cbb116100ce578063c3449b9511610087578063c3449b9514610881578063dd62ed3e1461089d578063e30443bc146108cd578063e98030c7146108e9578063f2fde38b14610905578063fbcbc0f11461092157610294565b8063a9059cbb14610799578063aafd847a146107c9578063b64bcbc2146107f9578063bc4c4b3714610817578063bd36197714610847578063be10b6141461086357610294565b806391b89fba1161012057806391b89fba146106af57806395d89b41146106df5780639c001ac4146106fd578063a6b1a59e1461071b578063a846ffef1461074b578063a8b9d2401461076957610294565b806370a08231146105ed578063715018a61461061d57806385a6b3ae146106275780638980f11f146106455780638da5cb5b146106615780638fdfe22f1461067f57610294565b80632a0acc6a1161020b57806350414706116101c457806350414706146105275780635183d6fd146105435780635c4c677c146105795780636a474002146105955780636b4a27b91461059f5780636f2789ec146105cf57610294565b80632a0acc6a14610439578063313ce5671461045757806331e79db0146104755780633abb3fae146104915780634e7b827f146104c15780634ed162df146104f157610294565b80630dcb2e891161025d5780630dcb2e891461033f57806318160ddd1461035b5780631d3782c814610379578063226cfa3d146103a957806323b872dd146103d957806327ce01471461040957610294565b80625691fc146102995780630614117a146102c957806306fdde03146102d3578063095ea7b3146102f157806309bbedde14610321575b600080fd5b6102b360048036038101906102ae91906138c1565b610957565b6040516102c09190613907565b60405180910390f35b6102d161096f565b005b6102db610a71565b6040516102e891906139b2565b60405180910390f35b61030b60048036038101906103069190613a00565b610b03565b6040516103189190613a5b565b60405180910390f35b610329610b21565b6040516103369190613907565b60405180910390f35b61035960048036038101906103549190613a76565b610b31565b005b610363610bca565b6040516103709190613907565b60405180910390f35b610393600480360381019061038e91906138c1565b610bd4565b6040516103a09190613a5b565b60405180910390f35b6103c360048036038101906103be91906138c1565b610be6565b6040516103d09190613907565b60405180910390f35b6103f360048036038101906103ee9190613aa3565b610bfe565b6040516104009190613a5b565b60405180910390f35b610423600480360381019061041e91906138c1565b610cd7565b6040516104309190613907565b60405180910390f35b610441610d7a565b60405161044e9190613b05565b60405180910390f35b61045f610d92565b60405161046c9190613b3c565b60405180910390f35b61048f600480360381019061048a91906138c1565b610d9b565b005b6104ab60048036038101906104a691906138c1565b610f83565b6040516104b89190613a5b565b60405180910390f35b6104db60048036038101906104d691906138c1565b61108c565b6040516104e89190613a5b565b60405180910390f35b61050b600480360381019061050691906138c1565b6110ac565b60405161051e9796959493929190613b57565b60405180910390f35b610541600480360381019061053c9190613a76565b611102565b005b61055d60048036038101906105589190613a76565b611257565b6040516105709796959493929190613bdf565b60405180910390f35b610593600480360381019061058e9190613d09565b6113c6565b005b61059d6116cf565b005b6105b960048036038101906105b491906138c1565b611712565b6040516105c69190613907565b60405180910390f35b6105d7611783565b6040516105e49190613907565b60405180910390f35b610607600480360381019061060291906138c1565b611789565b6040516106149190613907565b60405180910390f35b6106256117d1565b005b61062f611859565b60405161063c9190613907565b60405180910390f35b61065f600480360381019061065a9190613a00565b61185f565b005b610669611b90565b6040516106769190613b05565b60405180910390f35b610699600480360381019061069491906138c1565b611bba565b6040516106a69190613907565b60405180910390f35b6106c960048036038101906106c491906138c1565b611d13565b6040516106d69190613907565b60405180910390f35b6106e7611d25565b6040516106f491906139b2565b60405180910390f35b610705611db7565b6040516107129190613907565b60405180910390f35b610735600480360381019061073091906138c1565b611dbd565b6040516107429190613907565b60405180910390f35b610753611de9565b6040516107609190613b05565b60405180910390f35b610783600480360381019061077e91906138c1565b611e0d565b6040516107909190613907565b60405180910390f35b6107b360048036038101906107ae9190613a00565b611e70565b6040516107c09190613a5b565b60405180910390f35b6107e360048036038101906107de91906138c1565b611e8e565b6040516107f09190613907565b60405180910390f35b610801611ed7565b60405161080e9190613907565b60405180910390f35b610831600480360381019061082c9190613df4565b611f25565b60405161083e9190613a5b565b60405180910390f35b610861600480360381019061085c9190613a76565b6120ac565b005b61086b612208565b6040516108789190613907565b60405180910390f35b61089b60048036038101906108969190613a76565b61220e565b005b6108b760048036038101906108b29190613e34565b612348565b6040516108c49190613907565b60405180910390f35b6108e760048036038101906108e29190613e74565b6123cf565b005b61090360048036038101906108fe9190613a76565b612670565b005b61091f600480360381019061091a91906138c1565b6127be565b005b61093b600480360381019061093691906138c1565b6128b5565b60405161094e9796959493929190613bdf565b60405180910390f35b600e6020528060005260406000206000915090505481565b6109776129f0565b73ffffffffffffffffffffffffffffffffffffffff16610995611b90565b73ffffffffffffffffffffffffffffffffffffffff16146109eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109e290613f00565b60405180910390fd5b600047905060006109fa611b90565b73ffffffffffffffffffffffffffffffffffffffff1682604051610a1d90613f51565b60006040518083038185875af1925050503d8060008114610a5a576040519150601f19603f3d011682016040523d82523d6000602084013e610a5f565b606091505b5050905080610a6d57600080fd5b5050565b606060038054610a8090613f95565b80601f0160208091040260200160405190810160405280929190818152602001828054610aac90613f95565b8015610af95780601f10610ace57610100808354040283529160200191610af9565b820191906000526020600020905b815481529060010190602001808311610adc57829003601f168201915b5050505050905090565b6000610b17610b106129f0565b84846129f8565b6001905092915050565b6000600a60000180549050905090565b610b396129f0565b73ffffffffffffffffffffffffffffffffffffffff16610b57611b90565b73ffffffffffffffffffffffffffffffffffffffff1614610bad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba490613f00565b60405180910390fd5b670de0b6b3a764000081610bc19190613ff5565b60138190555050565b6000600254905090565b6000610bdf82610f83565b9050919050565b60116020528060005260406000206000915090505481565b6000610c0b848484612bc1565b610ccc84610c176129f0565b610cc785604051806060016040528060288152602001614fb460289139600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610c7d6129f0565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612c079092919063ffffffff16565b6129f8565b600190509392505050565b6000700100000000000000000000000000000000610d69610d64600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610d56610d51610d4088611789565b600554612c6b90919063ffffffff16565b612ce5565b612d0290919063ffffffff16565b612d4d565b610d739190614066565b9050919050565b7311b0d3bbfc34d01b855b81cc1eb0f2750c9e65a081565b60006012905090565b610da36129f0565b73ffffffffffffffffffffffffffffffffffffffff16610dc1611b90565b73ffffffffffffffffffffffffffffffffffffffff1614610e17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0e90613f00565b60405180910390fd5b601060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610e6e57600080fd5b6001601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550610ed1816000612d64565b600a73a1999d211bbbe09bd3ebac08535e345eb8888f2c634c60db9c9091836040518363ffffffff1660e01b8152600401610f0d9291906140ad565b60006040518083038186803b158015610f2557600080fd5b505af4158015610f39573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff167fa878b31040b2e6d0a9a3d3361209db3908ba62014b0dca52adbaee451d128b2560405160405180910390a250565b600080600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541180156110265750611022600f54600e60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612dd190919063ffffffff16565b4210155b80156110855750611081601254601160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612dd190919063ffffffff16565b4210155b9050919050565b60106020528060005260406000206000915054906101000a900460ff1681565b60008060008060008060006110c0886128b5565b90919293949550909192939450809750819850829950839a50849b5050505050506110ea88610f83565b91506110f588611bba565b9050919395979092949650565b7311b0d3bbfc34d01b855b81cc1eb0f2750c9e65a073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611184576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117b90614148565b60405180910390fd5b610e10811015801561119a57506301e133808111155b6111d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d0906141da565b60405180910390fd5b600f54810361121d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121490614246565b60405180910390fd5b600f54817f45d0048090960e98b84cd507c263d185bfb640d30dad789292812918466bd65860405160405180910390a380600f8190555050565b6000806000806000806000600a73a1999d211bbbe09bd3ebac08535e345eb8888f2c63deb3d89690916040518263ffffffff1660e01b815260040161129c9190614266565b602060405180830381865af41580156112b9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112dd9190614296565b88106113215760007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600080600080600096509650965096509650965096506113bb565b6000600a73a1999d211bbbe09bd3ebac08535e345eb8888f2c63d1aa9e7e90918b6040518363ffffffff1660e01b815260040161135f9291906142d2565b602060405180830381865af415801561137c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113a09190614310565b90506113ab816128b5565b9750975097509750975097509750505b919395979092949650565b6113ce6129f0565b73ffffffffffffffffffffffffffffffffffffffff166113ec611b90565b73ffffffffffffffffffffffffffffffffffffffff1614611442576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143990613f00565b60405180910390fd5b60005b848490508110156116c757601060008686848181106114675761146661433d565b5b905060200201602081019061147c91906138c1565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156114cf57506116c9565b6013548383838181106114e5576114e461433d565b5b90506020020135106115ee5761153b8585838181106115075761150661433d565b5b905060200201602081019061151c91906138c1565b84848481811061152f5761152e61433d565b5b90506020020135612e2f565b600a73a1999d211bbbe09bd3ebac08535e345eb8888f2c63bc2b405c909187878581811061156c5761156b61433d565b5b905060200201602081019061158191906138c1565b8686868181106115945761159361433d565b5b905060200201356040518463ffffffff1660e01b81526004016115b99392919061436c565b60006040518083038186803b1580156115d157600080fd5b505af41580156115e5573d6000803e3d6000fd5b505050506116b4565b6116208585838181106116045761160361433d565b5b905060200201602081019061161991906138c1565b6000612e2f565b600a73a1999d211bbbe09bd3ebac08535e345eb8888f2c634c60db9c90918787858181106116515761165061433d565b5b905060200201602081019061166691906138c1565b6040518363ffffffff1660e01b81526004016116839291906140ad565b60006040518083038186803b15801561169b57600080fd5b505af41580156116af573d6000803e3d6000fd5b505050505b80806116bf906143a3565b915050611445565b505b50505050565b6000611710576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611707906144a9565b60405180910390fd5b565b60008061171d610bca565b0361172b576000905061177e565b61177b61173783611e8e565b61176d611742610bca565b61175f60085461175188611789565b612c6b90919063ffffffff16565b612f3890919063ffffffff16565b612f8290919063ffffffff16565b90505b919050565b60125481565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6117d96129f0565b73ffffffffffffffffffffffffffffffffffffffff166117f7611b90565b73ffffffffffffffffffffffffffffffffffffffff161461184d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184490613f00565b60405180910390fd5b6118576000612fcc565b565b60085481565b6118676129f0565b73ffffffffffffffffffffffffffffffffffffffff16611885611b90565b73ffffffffffffffffffffffffffffffffffffffff16146118db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118d290613f00565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611949576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119409061453b565b60405180910390fd5b600082905060008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016119899190613b05565b602060405180830381865afa1580156119a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119ca9190614296565b905080831115611a0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a06906145cd565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb611a35611b90565b866040518363ffffffff1660e01b8152600401611a539291906145ed565b6020604051808303816000875af1158015611a72573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a96919061462b565b905080611ad8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611acf906146a4565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603611b4757611b4084600854612f8290919063ffffffff16565b6008819055505b7f8619312ed4eff1cf9f0116e6db2f49d9570a86f0350d1c5ad1bd0f7b0cf9e1328585611b72611b90565b604051611b81939291906146c4565b60405180910390a15050505050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600080600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205403611c0c57600f549050611d0e565b6000611c60600e60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205442612f8290919063ffffffff16565b9050600f54811015611c8957611c8181600f54612f8290919063ffffffff16565b915050611d0e565b6000611cdd601160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205442612f8290919063ffffffff16565b9050601254811015611d0757611cfe81601254612f8290919063ffffffff16565b92505050611d0e565b6000925050505b919050565b6000611d1e82611e0d565b9050919050565b606060048054611d3490613f95565b80601f0160208091040260200160405190810160405280929190818152602001828054611d6090613f95565b8015611dad5780601f10611d8257610100808354040283529160200191611dad565b820191906000526020600020905b815481529060010190602001808311611d9057829003601f168201915b5050505050905090565b600f5481565b6000611de2611dcb83611e0d565b611dd484611e8e565b612dd190919063ffffffff16565b9050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000611e69600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611e5b84610cd7565b612f8290919063ffffffff16565b9050919050565b6000611e84611e7d6129f0565b8484612bc1565b6001905092915050565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600080611ee2610bca565b03611ef05760009050611f22565b611f1f611efb610bca565b611f116064600854612c6b90919063ffffffff16565b612f3890919063ffffffff16565b90505b90565b6000611f2f6129f0565b73ffffffffffffffffffffffffffffffffffffffff16611f4d611b90565b73ffffffffffffffffffffffffffffffffffffffff1614611fa3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9a90613f00565b60405180910390fd5b611fac83610f83565b611feb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe29061476d565b60405180910390fd5b6000611ff684613092565b905060008111156120a05742601160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508215158473ffffffffffffffffffffffffffffffffffffffff167fa2c38e2d2fb7e3e1912d937fd1ca11ed6d51864dee4cfa7a7bf02becd7acf0928360405161208e9190613907565b60405180910390a360019150506120a6565b60009150505b92915050565b7311b0d3bbfc34d01b855b81cc1eb0f2750c9e65a073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461212e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161212590614148565b60405180910390fd5b6000612138610bca565b1161214257600080fd5b600081111561220557612195612156610bca565b61217a70010000000000000000000000000000000084612c6b90919063ffffffff16565b6121849190614066565b600554612dd190919063ffffffff16565b6005819055503373ffffffffffffffffffffffffffffffffffffffff167fa493a9229478c3fcd73f66d2cdeb7f94fd0f341da924d1054236d78454116511826040516121e19190613907565b60405180910390a26121fe81600854612dd190919063ffffffff16565b6008819055505b50565b60135481565b7311b0d3bbfc34d01b855b81cc1eb0f2750c9e65a073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612290576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161228790614148565b60405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166323b872dd3330856040518463ffffffff1660e01b81526004016122ef9392919061478d565b6020604051808303816000875af115801561230e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612332919061462b565b9050801561234457612343826120ac565b5b5050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6123d76129f0565b73ffffffffffffffffffffffffffffffffffffffff166123f5611b90565b73ffffffffffffffffffffffffffffffffffffffff161461244b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161244290613f00565b60405180910390fd5b601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661266c5760135481106125ae576124af8282612e2f565b600a73a1999d211bbbe09bd3ebac08535e345eb8888f2c63bc2b405c909184846040518463ffffffff1660e01b81526004016124ed93929190614823565b60006040518083038186803b15801561250557600080fd5b505af4158015612519573d6000803e3d6000fd5b505050506000600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054036125a95742600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b61266b565b6125b9826000612e2f565b600a73a1999d211bbbe09bd3ebac08535e345eb8888f2c634c60db9c9091846040518363ffffffff1660e01b81526004016125f592919061485a565b60006040518083038186803b15801561260d57600080fd5b505af4158015612621573d6000803e3d6000fd5b505050506000600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b5b5050565b6126786129f0565b73ffffffffffffffffffffffffffffffffffffffff16612696611b90565b73ffffffffffffffffffffffffffffffffffffffff16146126ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126e390613f00565b60405180910390fd5b610e108110158015612701575062093a808111155b612740576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127379061491b565b60405180910390fd5b6012548103612784576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161277b906149ad565b60405180910390fd5b601254817f474ea64804364a1e29a4487ddb63c3342a2dd826ccd8acf48825e680a0e6f20f60405160405180910390a38060128190555050565b6127c66129f0565b73ffffffffffffffffffffffffffffffffffffffff166127e4611b90565b73ffffffffffffffffffffffffffffffffffffffff161461283a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161283190613f00565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036128a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128a090614a3f565b60405180910390fd5b6128b281612fcc565b50565b6000806000806000806000879650600a73a1999d211bbbe09bd3ebac08535e345eb8888f2c6317e142d19091896040518363ffffffff1660e01b81526004016128ff9291906140ad565b602060405180830381865af415801561291c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129409190614a8b565b955061294b87611e0d565b945061295687610cd7565b9350601160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549250600083116129a95760006129bf565b6129be60125484612dd190919063ffffffff16565b5b91504282116129cf5760006129e3565b6129e24283612f8290919063ffffffff16565b5b9050919395979092949650565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612a67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a5e90614b2a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612ad6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612acd90614bbc565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051612bb49190613907565b60405180910390a3505050565b6000612c02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bf990614c4e565b60405180910390fd5b505050565b6000838311158290612c4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c4691906139b2565b60405180910390fd5b5060008385612c5e9190614c6e565b9050809150509392505050565b6000808303612c7d5760009050612cdf565b60008284612c8b9190613ff5565b9050828482612c9a9190614066565b14612cda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cd190614d14565b60405180910390fd5b809150505b92915050565b6000808290506000811215612cf957600080fd5b80915050919050565b6000808284612d119190614d34565b905060008312158015612d245750838112155b80612d3a5750600083128015612d3957508381125b5b612d4357600080fd5b8091505092915050565b600080821215612d5c57600080fd5b819050919050565b6000612d6f83611789565b905080821115612da0576000612d8e8284612f8290919063ffffffff16565b9050612d9a84826132e8565b50612dcc565b80821015612dcb576000612dbd8383612f8290919063ffffffff16565b9050612dc984826133a7565b505b5b505050565b6000808284612de09190614d78565b905083811015612e25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e1c90614df8565b60405180910390fd5b8091505092915050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231836040518263ffffffff1660e01b8152600401612e889190613b05565b602060405180830381865afa158015612ea5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ec99190614296565b90506000612ed683611789565b905080821115612f07576000612ef58284612f8290919063ffffffff16565b9050612f0184826132e8565b50612f33565b80821015612f32576000612f248383612f8290919063ffffffff16565b9050612f3084826133a7565b505b5b505050565b6000612f7a83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613466565b905092915050565b6000612fc483836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612c07565b905092915050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008061309e83611e0d565b905060008111156132dd576130fb81600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612dd190919063ffffffff16565b600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff167fee503bee2bb6a87e57bc57db795f98137327401a0e7b7ce42e37926cc1a9ca4d826040516131849190613907565b60405180910390a260007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb85846040518363ffffffff1660e01b81526004016131e9929190614e27565b6020604051808303816000875af1158015613208573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061322c919061462b565b9050806132d35761328582600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612f8290919063ffffffff16565b600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000925050506132e3565b81925050506132e3565b60009150505b919050565b6132f282826134c9565b61336061331261330d83600554612c6b90919063ffffffff16565b612ce5565b600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461365c90919063ffffffff16565b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b6133b182826136a7565b61341f6133d16133cc83600554612c6b90919063ffffffff16565b612ce5565b600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612d0290919063ffffffff16565b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b600080831182906134ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134a491906139b2565b60405180910390fd5b50600083856134bc9190614066565b9050809150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603613538576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161352f90614e9c565b60405180910390fd5b61354460008383613854565b61355981600254612dd190919063ffffffff16565b6002819055506135b0816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612dd190919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516136509190613907565b60405180910390a35050565b600080828461366b9190614ebc565b90506000831215801561367e5750838113155b80613694575060008312801561369357508381135b5b61369d57600080fd5b8091505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603613716576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161370d90614f71565b60405180910390fd5b61372282600083613854565b61378d81604051806060016040528060228152602001614f92602291396000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612c079092919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506137e481600254612f8290919063ffffffff16565b600281905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516138489190613907565b60405180910390a35050565b505050565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061388e82613863565b9050919050565b61389e81613883565b81146138a957600080fd5b50565b6000813590506138bb81613895565b92915050565b6000602082840312156138d7576138d6613859565b5b60006138e5848285016138ac565b91505092915050565b6000819050919050565b613901816138ee565b82525050565b600060208201905061391c60008301846138f8565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561395c578082015181840152602081019050613941565b60008484015250505050565b6000601f19601f8301169050919050565b600061398482613922565b61398e818561392d565b935061399e81856020860161393e565b6139a781613968565b840191505092915050565b600060208201905081810360008301526139cc8184613979565b905092915050565b6139dd816138ee565b81146139e857600080fd5b50565b6000813590506139fa816139d4565b92915050565b60008060408385031215613a1757613a16613859565b5b6000613a25858286016138ac565b9250506020613a36858286016139eb565b9150509250929050565b60008115159050919050565b613a5581613a40565b82525050565b6000602082019050613a706000830184613a4c565b92915050565b600060208284031215613a8c57613a8b613859565b5b6000613a9a848285016139eb565b91505092915050565b600080600060608486031215613abc57613abb613859565b5b6000613aca868287016138ac565b9350506020613adb868287016138ac565b9250506040613aec868287016139eb565b9150509250925092565b613aff81613883565b82525050565b6000602082019050613b1a6000830184613af6565b92915050565b600060ff82169050919050565b613b3681613b20565b82525050565b6000602082019050613b516000830184613b2d565b92915050565b600060e082019050613b6c600083018a6138f8565b613b7960208301896138f8565b613b8660408301886138f8565b613b9360608301876138f8565b613ba060808301866138f8565b613bad60a0830185613a4c565b613bba60c08301846138f8565b98975050505050505050565b6000819050919050565b613bd981613bc6565b82525050565b600060e082019050613bf4600083018a613af6565b613c016020830189613bd0565b613c0e60408301886138f8565b613c1b60608301876138f8565b613c2860808301866138f8565b613c3560a08301856138f8565b613c4260c08301846138f8565b98975050505050505050565b600080fd5b600080fd5b600080fd5b60008083601f840112613c7357613c72613c4e565b5b8235905067ffffffffffffffff811115613c9057613c8f613c53565b5b602083019150836020820283011115613cac57613cab613c58565b5b9250929050565b60008083601f840112613cc957613cc8613c4e565b5b8235905067ffffffffffffffff811115613ce657613ce5613c53565b5b602083019150836020820283011115613d0257613d01613c58565b5b9250929050565b60008060008060408587031215613d2357613d22613859565b5b600085013567ffffffffffffffff811115613d4157613d4061385e565b5b613d4d87828801613c5d565b9450945050602085013567ffffffffffffffff811115613d7057613d6f61385e565b5b613d7c87828801613cb3565b925092505092959194509250565b6000613d9582613863565b9050919050565b613da581613d8a565b8114613db057600080fd5b50565b600081359050613dc281613d9c565b92915050565b613dd181613a40565b8114613ddc57600080fd5b50565b600081359050613dee81613dc8565b92915050565b60008060408385031215613e0b57613e0a613859565b5b6000613e1985828601613db3565b9250506020613e2a85828601613ddf565b9150509250929050565b60008060408385031215613e4b57613e4a613859565b5b6000613e59858286016138ac565b9250506020613e6a858286016138ac565b9150509250929050565b60008060408385031215613e8b57613e8a613859565b5b6000613e9985828601613db3565b9250506020613eaa858286016139eb565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613eea60208361392d565b9150613ef582613eb4565b602082019050919050565b60006020820190508181036000830152613f1981613edd565b9050919050565b600081905092915050565b50565b6000613f3b600083613f20565b9150613f4682613f2b565b600082019050919050565b6000613f5c82613f2e565b9150819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613fad57607f821691505b602082108103613fc057613fbf613f66565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614000826138ee565b915061400b836138ee565b9250828202614019816138ee565b915082820484148315176140305761402f613fc6565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614071826138ee565b915061407c836138ee565b92508261408c5761408b614037565b5b828204905092915050565b8082525050565b6140a781613883565b82525050565b60006040820190506140c26000830185614097565b6140cf602083018461409e565b9392505050565b7f4f6e6c792061646d696e2063616e2063616c6c20746869732066756e6374696f60008201527f6e00000000000000000000000000000000000000000000000000000000000000602082015250565b600061413260218361392d565b915061413d826140d6565b604082019050919050565b6000602082019050818103600083015261416181614125565b9050919050565b7f486f6c6420706572696f64206d757374206265206265747765656e203120686f60008201527f757220616e642033363520646179730000000000000000000000000000000000602082015250565b60006141c4602f8361392d565b91506141cf82614168565b604082019050919050565b600060208201905081810360008301526141f3816141b7565b9050919050565b7f43616e6e6f742075706461746520746f207468652073616d652076616c756500600082015250565b6000614230601f8361392d565b915061423b826141fa565b602082019050919050565b6000602082019050818103600083015261425f81614223565b9050919050565b600060208201905061427b6000830184614097565b92915050565b600081519050614290816139d4565b92915050565b6000602082840312156142ac576142ab613859565b5b60006142ba84828501614281565b91505092915050565b6142cc816138ee565b82525050565b60006040820190506142e76000830185614097565b6142f460208301846142c3565b9392505050565b60008151905061430a81613895565b92915050565b60006020828403121561432657614325613859565b5b6000614334848285016142fb565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006060820190506143816000830186614097565b61438e602083018561409e565b61439b60408301846142c3565b949350505050565b60006143ae826138ee565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036143e0576143df613fc6565b5b600182019050919050565b7f457665724554485f4469766964656e645f547261636b65723a2077697468647260008201527f61774469766964656e642064697361626c65642e20557365207468652027636c60208201527f61696d272066756e6374696f6e206f6e20746865206d61696e2045766572455460408201527f4820636f6e74726163742e000000000000000000000000000000000000000000606082015250565b6000614493606b8361392d565b915061449e826143eb565b608082019050919050565b600060208201905081810360008301526144c281614486565b9050919050565b7f43616e6e6f74207265636f76657220746865206469766964656e64207472616360008201527f6b657220746f6b656e0000000000000000000000000000000000000000000000602082015250565b600061452560298361392d565b9150614530826144c9565b604082019050919050565b6000602082019050818103600083015261455481614518565b9050919050565b7f43616e6e6f74207265636f766572206d6f7265207468616e2074686520746f6b60008201527f656e2062616c616e636500000000000000000000000000000000000000000000602082015250565b60006145b7602a8361392d565b91506145c28261455b565b604082019050919050565b600060208201905081810360008301526145e6816145aa565b9050919050565b60006040820190506146026000830185613af6565b61460f60208301846138f8565b9392505050565b60008151905061462581613dc8565b92915050565b60006020828403121561464157614640613859565b5b600061464f84828501614616565b91505092915050565b7f5472616e73666572206661696c65640000000000000000000000000000000000600082015250565b600061468e600f8361392d565b915061469982614658565b602082019050919050565b600060208201905081810360008301526146bd81614681565b9050919050565b60006060820190506146d96000830186613af6565b6146e660208301856138f8565b6146f36040830184613af6565b949350505050565b7f4163636f756e74206973206e6f7420656c696769626c6520666f722070726f6360008201527f657373696e670000000000000000000000000000000000000000000000000000602082015250565b600061475760268361392d565b9150614762826146fb565b604082019050919050565b600060208201905081810360008301526147868161474a565b9050919050565b60006060820190506147a26000830186613af6565b6147af6020830185613af6565b6147bc60408301846138f8565b949350505050565b6000819050919050565b60006147e96147e46147df84613863565b6147c4565b613863565b9050919050565b60006147fb826147ce565b9050919050565b600061480d826147f0565b9050919050565b61481d81614802565b82525050565b60006060820190506148386000830186614097565b6148456020830185614814565b61485260408301846142c3565b949350505050565b600060408201905061486f6000830185614097565b61487c6020830184614814565b9392505050565b7f457665724554485f4469766964656e645f547261636b65723a20636c61696d5760008201527f616974206d757374206265207570646174656420746f206265747765656e203160208201527f20686f75727320616e6420372064617973000000000000000000000000000000604082015250565b600061490560518361392d565b915061491082614883565b606082019050919050565b60006020820190508181036000830152614934816148f8565b9050919050565b7f457665724554485f4469766964656e645f547261636b65723a2043616e6e6f7460008201527f2075706461746520636c61696d5761697420746f2073616d652076616c756500602082015250565b6000614997603f8361392d565b91506149a28261493b565b604082019050919050565b600060208201905081810360008301526149c68161498a565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614a2960268361392d565b9150614a34826149cd565b604082019050919050565b60006020820190508181036000830152614a5881614a1c565b9050919050565b614a6881613bc6565b8114614a7357600080fd5b50565b600081519050614a8581614a5f565b92915050565b600060208284031215614aa157614aa0613859565b5b6000614aaf84828501614a76565b91505092915050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614b1460248361392d565b9150614b1f82614ab8565b604082019050919050565b60006020820190508181036000830152614b4381614b07565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000614ba660228361392d565b9150614bb182614b4a565b604082019050919050565b60006020820190508181036000830152614bd581614b99565b9050919050565b7f457665724554485f4469766964656e645f547261636b65723a204e6f2074726160008201527f6e736665727320616c6c6f776564000000000000000000000000000000000000602082015250565b6000614c38602e8361392d565b9150614c4382614bdc565b604082019050919050565b60006020820190508181036000830152614c6781614c2b565b9050919050565b6000614c79826138ee565b9150614c84836138ee565b9250828203905081811115614c9c57614c9b613fc6565b5b92915050565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008201527f7700000000000000000000000000000000000000000000000000000000000000602082015250565b6000614cfe60218361392d565b9150614d0982614ca2565b604082019050919050565b60006020820190508181036000830152614d2d81614cf1565b9050919050565b6000614d3f82613bc6565b9150614d4a83613bc6565b925082820190508281121560008312168382126000841215161715614d7257614d71613fc6565b5b92915050565b6000614d83826138ee565b9150614d8e836138ee565b9250828201905080821115614da657614da5613fc6565b5b92915050565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000600082015250565b6000614de2601b8361392d565b9150614ded82614dac565b602082019050919050565b60006020820190508181036000830152614e1181614dd5565b9050919050565b614e2181614802565b82525050565b6000604082019050614e3c6000830185614e18565b614e4960208301846138f8565b9392505050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b6000614e86601f8361392d565b9150614e9182614e50565b602082019050919050565b60006020820190508181036000830152614eb581614e79565b9050919050565b6000614ec782613bc6565b9150614ed283613bc6565b9250828203905081811260008412168282136000851215161715614ef957614ef8613fc6565b5b92915050565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000614f5b60218361392d565b9150614f6682614eff565b604082019050919050565b60006020820190508181036000830152614f8a81614f4e565b905091905056fe45524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365a264697066735822122056fc99cb7b4f910b206642754e4efb7a545d210d82197656e9c7a1bb0b6a769e64736f6c63430008130033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102945760003560e01c806370a0823111610167578063a9059cbb116100ce578063c3449b9511610087578063c3449b9514610881578063dd62ed3e1461089d578063e30443bc146108cd578063e98030c7146108e9578063f2fde38b14610905578063fbcbc0f11461092157610294565b8063a9059cbb14610799578063aafd847a146107c9578063b64bcbc2146107f9578063bc4c4b3714610817578063bd36197714610847578063be10b6141461086357610294565b806391b89fba1161012057806391b89fba146106af57806395d89b41146106df5780639c001ac4146106fd578063a6b1a59e1461071b578063a846ffef1461074b578063a8b9d2401461076957610294565b806370a08231146105ed578063715018a61461061d57806385a6b3ae146106275780638980f11f146106455780638da5cb5b146106615780638fdfe22f1461067f57610294565b80632a0acc6a1161020b57806350414706116101c457806350414706146105275780635183d6fd146105435780635c4c677c146105795780636a474002146105955780636b4a27b91461059f5780636f2789ec146105cf57610294565b80632a0acc6a14610439578063313ce5671461045757806331e79db0146104755780633abb3fae146104915780634e7b827f146104c15780634ed162df146104f157610294565b80630dcb2e891161025d5780630dcb2e891461033f57806318160ddd1461035b5780631d3782c814610379578063226cfa3d146103a957806323b872dd146103d957806327ce01471461040957610294565b80625691fc146102995780630614117a146102c957806306fdde03146102d3578063095ea7b3146102f157806309bbedde14610321575b600080fd5b6102b360048036038101906102ae91906138c1565b610957565b6040516102c09190613907565b60405180910390f35b6102d161096f565b005b6102db610a71565b6040516102e891906139b2565b60405180910390f35b61030b60048036038101906103069190613a00565b610b03565b6040516103189190613a5b565b60405180910390f35b610329610b21565b6040516103369190613907565b60405180910390f35b61035960048036038101906103549190613a76565b610b31565b005b610363610bca565b6040516103709190613907565b60405180910390f35b610393600480360381019061038e91906138c1565b610bd4565b6040516103a09190613a5b565b60405180910390f35b6103c360048036038101906103be91906138c1565b610be6565b6040516103d09190613907565b60405180910390f35b6103f360048036038101906103ee9190613aa3565b610bfe565b6040516104009190613a5b565b60405180910390f35b610423600480360381019061041e91906138c1565b610cd7565b6040516104309190613907565b60405180910390f35b610441610d7a565b60405161044e9190613b05565b60405180910390f35b61045f610d92565b60405161046c9190613b3c565b60405180910390f35b61048f600480360381019061048a91906138c1565b610d9b565b005b6104ab60048036038101906104a691906138c1565b610f83565b6040516104b89190613a5b565b60405180910390f35b6104db60048036038101906104d691906138c1565b61108c565b6040516104e89190613a5b565b60405180910390f35b61050b600480360381019061050691906138c1565b6110ac565b60405161051e9796959493929190613b57565b60405180910390f35b610541600480360381019061053c9190613a76565b611102565b005b61055d60048036038101906105589190613a76565b611257565b6040516105709796959493929190613bdf565b60405180910390f35b610593600480360381019061058e9190613d09565b6113c6565b005b61059d6116cf565b005b6105b960048036038101906105b491906138c1565b611712565b6040516105c69190613907565b60405180910390f35b6105d7611783565b6040516105e49190613907565b60405180910390f35b610607600480360381019061060291906138c1565b611789565b6040516106149190613907565b60405180910390f35b6106256117d1565b005b61062f611859565b60405161063c9190613907565b60405180910390f35b61065f600480360381019061065a9190613a00565b61185f565b005b610669611b90565b6040516106769190613b05565b60405180910390f35b610699600480360381019061069491906138c1565b611bba565b6040516106a69190613907565b60405180910390f35b6106c960048036038101906106c491906138c1565b611d13565b6040516106d69190613907565b60405180910390f35b6106e7611d25565b6040516106f491906139b2565b60405180910390f35b610705611db7565b6040516107129190613907565b60405180910390f35b610735600480360381019061073091906138c1565b611dbd565b6040516107429190613907565b60405180910390f35b610753611de9565b6040516107609190613b05565b60405180910390f35b610783600480360381019061077e91906138c1565b611e0d565b6040516107909190613907565b60405180910390f35b6107b360048036038101906107ae9190613a00565b611e70565b6040516107c09190613a5b565b60405180910390f35b6107e360048036038101906107de91906138c1565b611e8e565b6040516107f09190613907565b60405180910390f35b610801611ed7565b60405161080e9190613907565b60405180910390f35b610831600480360381019061082c9190613df4565b611f25565b60405161083e9190613a5b565b60405180910390f35b610861600480360381019061085c9190613a76565b6120ac565b005b61086b612208565b6040516108789190613907565b60405180910390f35b61089b60048036038101906108969190613a76565b61220e565b005b6108b760048036038101906108b29190613e34565b612348565b6040516108c49190613907565b60405180910390f35b6108e760048036038101906108e29190613e74565b6123cf565b005b61090360048036038101906108fe9190613a76565b612670565b005b61091f600480360381019061091a91906138c1565b6127be565b005b61093b600480360381019061093691906138c1565b6128b5565b60405161094e9796959493929190613bdf565b60405180910390f35b600e6020528060005260406000206000915090505481565b6109776129f0565b73ffffffffffffffffffffffffffffffffffffffff16610995611b90565b73ffffffffffffffffffffffffffffffffffffffff16146109eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109e290613f00565b60405180910390fd5b600047905060006109fa611b90565b73ffffffffffffffffffffffffffffffffffffffff1682604051610a1d90613f51565b60006040518083038185875af1925050503d8060008114610a5a576040519150601f19603f3d011682016040523d82523d6000602084013e610a5f565b606091505b5050905080610a6d57600080fd5b5050565b606060038054610a8090613f95565b80601f0160208091040260200160405190810160405280929190818152602001828054610aac90613f95565b8015610af95780601f10610ace57610100808354040283529160200191610af9565b820191906000526020600020905b815481529060010190602001808311610adc57829003601f168201915b5050505050905090565b6000610b17610b106129f0565b84846129f8565b6001905092915050565b6000600a60000180549050905090565b610b396129f0565b73ffffffffffffffffffffffffffffffffffffffff16610b57611b90565b73ffffffffffffffffffffffffffffffffffffffff1614610bad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba490613f00565b60405180910390fd5b670de0b6b3a764000081610bc19190613ff5565b60138190555050565b6000600254905090565b6000610bdf82610f83565b9050919050565b60116020528060005260406000206000915090505481565b6000610c0b848484612bc1565b610ccc84610c176129f0565b610cc785604051806060016040528060288152602001614fb460289139600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610c7d6129f0565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612c079092919063ffffffff16565b6129f8565b600190509392505050565b6000700100000000000000000000000000000000610d69610d64600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610d56610d51610d4088611789565b600554612c6b90919063ffffffff16565b612ce5565b612d0290919063ffffffff16565b612d4d565b610d739190614066565b9050919050565b7311b0d3bbfc34d01b855b81cc1eb0f2750c9e65a081565b60006012905090565b610da36129f0565b73ffffffffffffffffffffffffffffffffffffffff16610dc1611b90565b73ffffffffffffffffffffffffffffffffffffffff1614610e17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0e90613f00565b60405180910390fd5b601060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610e6e57600080fd5b6001601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550610ed1816000612d64565b600a73a1999d211bbbe09bd3ebac08535e345eb8888f2c634c60db9c9091836040518363ffffffff1660e01b8152600401610f0d9291906140ad565b60006040518083038186803b158015610f2557600080fd5b505af4158015610f39573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff167fa878b31040b2e6d0a9a3d3361209db3908ba62014b0dca52adbaee451d128b2560405160405180910390a250565b600080600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541180156110265750611022600f54600e60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612dd190919063ffffffff16565b4210155b80156110855750611081601254601160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612dd190919063ffffffff16565b4210155b9050919050565b60106020528060005260406000206000915054906101000a900460ff1681565b60008060008060008060006110c0886128b5565b90919293949550909192939450809750819850829950839a50849b5050505050506110ea88610f83565b91506110f588611bba565b9050919395979092949650565b7311b0d3bbfc34d01b855b81cc1eb0f2750c9e65a073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611184576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117b90614148565b60405180910390fd5b610e10811015801561119a57506301e133808111155b6111d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d0906141da565b60405180910390fd5b600f54810361121d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121490614246565b60405180910390fd5b600f54817f45d0048090960e98b84cd507c263d185bfb640d30dad789292812918466bd65860405160405180910390a380600f8190555050565b6000806000806000806000600a73a1999d211bbbe09bd3ebac08535e345eb8888f2c63deb3d89690916040518263ffffffff1660e01b815260040161129c9190614266565b602060405180830381865af41580156112b9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112dd9190614296565b88106113215760007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600080600080600096509650965096509650965096506113bb565b6000600a73a1999d211bbbe09bd3ebac08535e345eb8888f2c63d1aa9e7e90918b6040518363ffffffff1660e01b815260040161135f9291906142d2565b602060405180830381865af415801561137c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113a09190614310565b90506113ab816128b5565b9750975097509750975097509750505b919395979092949650565b6113ce6129f0565b73ffffffffffffffffffffffffffffffffffffffff166113ec611b90565b73ffffffffffffffffffffffffffffffffffffffff1614611442576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143990613f00565b60405180910390fd5b60005b848490508110156116c757601060008686848181106114675761146661433d565b5b905060200201602081019061147c91906138c1565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156114cf57506116c9565b6013548383838181106114e5576114e461433d565b5b90506020020135106115ee5761153b8585838181106115075761150661433d565b5b905060200201602081019061151c91906138c1565b84848481811061152f5761152e61433d565b5b90506020020135612e2f565b600a73a1999d211bbbe09bd3ebac08535e345eb8888f2c63bc2b405c909187878581811061156c5761156b61433d565b5b905060200201602081019061158191906138c1565b8686868181106115945761159361433d565b5b905060200201356040518463ffffffff1660e01b81526004016115b99392919061436c565b60006040518083038186803b1580156115d157600080fd5b505af41580156115e5573d6000803e3d6000fd5b505050506116b4565b6116208585838181106116045761160361433d565b5b905060200201602081019061161991906138c1565b6000612e2f565b600a73a1999d211bbbe09bd3ebac08535e345eb8888f2c634c60db9c90918787858181106116515761165061433d565b5b905060200201602081019061166691906138c1565b6040518363ffffffff1660e01b81526004016116839291906140ad565b60006040518083038186803b15801561169b57600080fd5b505af41580156116af573d6000803e3d6000fd5b505050505b80806116bf906143a3565b915050611445565b505b50505050565b6000611710576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611707906144a9565b60405180910390fd5b565b60008061171d610bca565b0361172b576000905061177e565b61177b61173783611e8e565b61176d611742610bca565b61175f60085461175188611789565b612c6b90919063ffffffff16565b612f3890919063ffffffff16565b612f8290919063ffffffff16565b90505b919050565b60125481565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6117d96129f0565b73ffffffffffffffffffffffffffffffffffffffff166117f7611b90565b73ffffffffffffffffffffffffffffffffffffffff161461184d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184490613f00565b60405180910390fd5b6118576000612fcc565b565b60085481565b6118676129f0565b73ffffffffffffffffffffffffffffffffffffffff16611885611b90565b73ffffffffffffffffffffffffffffffffffffffff16146118db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118d290613f00565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611949576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119409061453b565b60405180910390fd5b600082905060008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016119899190613b05565b602060405180830381865afa1580156119a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119ca9190614296565b905080831115611a0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a06906145cd565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb611a35611b90565b866040518363ffffffff1660e01b8152600401611a539291906145ed565b6020604051808303816000875af1158015611a72573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a96919061462b565b905080611ad8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611acf906146a4565b60405180910390fd5b7f000000000000000000000000e46a1d19962ea120765d3139c588ffd617be04a873ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603611b4757611b4084600854612f8290919063ffffffff16565b6008819055505b7f8619312ed4eff1cf9f0116e6db2f49d9570a86f0350d1c5ad1bd0f7b0cf9e1328585611b72611b90565b604051611b81939291906146c4565b60405180910390a15050505050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600080600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205403611c0c57600f549050611d0e565b6000611c60600e60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205442612f8290919063ffffffff16565b9050600f54811015611c8957611c8181600f54612f8290919063ffffffff16565b915050611d0e565b6000611cdd601160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205442612f8290919063ffffffff16565b9050601254811015611d0757611cfe81601254612f8290919063ffffffff16565b92505050611d0e565b6000925050505b919050565b6000611d1e82611e0d565b9050919050565b606060048054611d3490613f95565b80601f0160208091040260200160405190810160405280929190818152602001828054611d6090613f95565b8015611dad5780601f10611d8257610100808354040283529160200191611dad565b820191906000526020600020905b815481529060010190602001808311611d9057829003601f168201915b5050505050905090565b600f5481565b6000611de2611dcb83611e0d565b611dd484611e8e565b612dd190919063ffffffff16565b9050919050565b7f000000000000000000000000e46a1d19962ea120765d3139c588ffd617be04a881565b6000611e69600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611e5b84610cd7565b612f8290919063ffffffff16565b9050919050565b6000611e84611e7d6129f0565b8484612bc1565b6001905092915050565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600080611ee2610bca565b03611ef05760009050611f22565b611f1f611efb610bca565b611f116064600854612c6b90919063ffffffff16565b612f3890919063ffffffff16565b90505b90565b6000611f2f6129f0565b73ffffffffffffffffffffffffffffffffffffffff16611f4d611b90565b73ffffffffffffffffffffffffffffffffffffffff1614611fa3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9a90613f00565b60405180910390fd5b611fac83610f83565b611feb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe29061476d565b60405180910390fd5b6000611ff684613092565b905060008111156120a05742601160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508215158473ffffffffffffffffffffffffffffffffffffffff167fa2c38e2d2fb7e3e1912d937fd1ca11ed6d51864dee4cfa7a7bf02becd7acf0928360405161208e9190613907565b60405180910390a360019150506120a6565b60009150505b92915050565b7311b0d3bbfc34d01b855b81cc1eb0f2750c9e65a073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461212e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161212590614148565b60405180910390fd5b6000612138610bca565b1161214257600080fd5b600081111561220557612195612156610bca565b61217a70010000000000000000000000000000000084612c6b90919063ffffffff16565b6121849190614066565b600554612dd190919063ffffffff16565b6005819055503373ffffffffffffffffffffffffffffffffffffffff167fa493a9229478c3fcd73f66d2cdeb7f94fd0f341da924d1054236d78454116511826040516121e19190613907565b60405180910390a26121fe81600854612dd190919063ffffffff16565b6008819055505b50565b60135481565b7311b0d3bbfc34d01b855b81cc1eb0f2750c9e65a073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612290576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161228790614148565b60405180910390fd5b60007f000000000000000000000000e46a1d19962ea120765d3139c588ffd617be04a873ffffffffffffffffffffffffffffffffffffffff166323b872dd3330856040518463ffffffff1660e01b81526004016122ef9392919061478d565b6020604051808303816000875af115801561230e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612332919061462b565b9050801561234457612343826120ac565b5b5050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6123d76129f0565b73ffffffffffffffffffffffffffffffffffffffff166123f5611b90565b73ffffffffffffffffffffffffffffffffffffffff161461244b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161244290613f00565b60405180910390fd5b601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661266c5760135481106125ae576124af8282612e2f565b600a73a1999d211bbbe09bd3ebac08535e345eb8888f2c63bc2b405c909184846040518463ffffffff1660e01b81526004016124ed93929190614823565b60006040518083038186803b15801561250557600080fd5b505af4158015612519573d6000803e3d6000fd5b505050506000600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054036125a95742600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b61266b565b6125b9826000612e2f565b600a73a1999d211bbbe09bd3ebac08535e345eb8888f2c634c60db9c9091846040518363ffffffff1660e01b81526004016125f592919061485a565b60006040518083038186803b15801561260d57600080fd5b505af4158015612621573d6000803e3d6000fd5b505050506000600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b5b5050565b6126786129f0565b73ffffffffffffffffffffffffffffffffffffffff16612696611b90565b73ffffffffffffffffffffffffffffffffffffffff16146126ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126e390613f00565b60405180910390fd5b610e108110158015612701575062093a808111155b612740576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127379061491b565b60405180910390fd5b6012548103612784576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161277b906149ad565b60405180910390fd5b601254817f474ea64804364a1e29a4487ddb63c3342a2dd826ccd8acf48825e680a0e6f20f60405160405180910390a38060128190555050565b6127c66129f0565b73ffffffffffffffffffffffffffffffffffffffff166127e4611b90565b73ffffffffffffffffffffffffffffffffffffffff161461283a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161283190613f00565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036128a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128a090614a3f565b60405180910390fd5b6128b281612fcc565b50565b6000806000806000806000879650600a73a1999d211bbbe09bd3ebac08535e345eb8888f2c6317e142d19091896040518363ffffffff1660e01b81526004016128ff9291906140ad565b602060405180830381865af415801561291c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129409190614a8b565b955061294b87611e0d565b945061295687610cd7565b9350601160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549250600083116129a95760006129bf565b6129be60125484612dd190919063ffffffff16565b5b91504282116129cf5760006129e3565b6129e24283612f8290919063ffffffff16565b5b9050919395979092949650565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612a67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a5e90614b2a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612ad6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612acd90614bbc565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051612bb49190613907565b60405180910390a3505050565b6000612c02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bf990614c4e565b60405180910390fd5b505050565b6000838311158290612c4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c4691906139b2565b60405180910390fd5b5060008385612c5e9190614c6e565b9050809150509392505050565b6000808303612c7d5760009050612cdf565b60008284612c8b9190613ff5565b9050828482612c9a9190614066565b14612cda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cd190614d14565b60405180910390fd5b809150505b92915050565b6000808290506000811215612cf957600080fd5b80915050919050565b6000808284612d119190614d34565b905060008312158015612d245750838112155b80612d3a5750600083128015612d3957508381125b5b612d4357600080fd5b8091505092915050565b600080821215612d5c57600080fd5b819050919050565b6000612d6f83611789565b905080821115612da0576000612d8e8284612f8290919063ffffffff16565b9050612d9a84826132e8565b50612dcc565b80821015612dcb576000612dbd8383612f8290919063ffffffff16565b9050612dc984826133a7565b505b5b505050565b6000808284612de09190614d78565b905083811015612e25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e1c90614df8565b60405180910390fd5b8091505092915050565b7f000000000000000000000000e46a1d19962ea120765d3139c588ffd617be04a873ffffffffffffffffffffffffffffffffffffffff166370a08231836040518263ffffffff1660e01b8152600401612e889190613b05565b602060405180830381865afa158015612ea5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ec99190614296565b90506000612ed683611789565b905080821115612f07576000612ef58284612f8290919063ffffffff16565b9050612f0184826132e8565b50612f33565b80821015612f32576000612f248383612f8290919063ffffffff16565b9050612f3084826133a7565b505b5b505050565b6000612f7a83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613466565b905092915050565b6000612fc483836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612c07565b905092915050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008061309e83611e0d565b905060008111156132dd576130fb81600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612dd190919063ffffffff16565b600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff167fee503bee2bb6a87e57bc57db795f98137327401a0e7b7ce42e37926cc1a9ca4d826040516131849190613907565b60405180910390a260007f000000000000000000000000e46a1d19962ea120765d3139c588ffd617be04a873ffffffffffffffffffffffffffffffffffffffff1663a9059cbb85846040518363ffffffff1660e01b81526004016131e9929190614e27565b6020604051808303816000875af1158015613208573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061322c919061462b565b9050806132d35761328582600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612f8290919063ffffffff16565b600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000925050506132e3565b81925050506132e3565b60009150505b919050565b6132f282826134c9565b61336061331261330d83600554612c6b90919063ffffffff16565b612ce5565b600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461365c90919063ffffffff16565b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b6133b182826136a7565b61341f6133d16133cc83600554612c6b90919063ffffffff16565b612ce5565b600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612d0290919063ffffffff16565b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b600080831182906134ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134a491906139b2565b60405180910390fd5b50600083856134bc9190614066565b9050809150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603613538576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161352f90614e9c565b60405180910390fd5b61354460008383613854565b61355981600254612dd190919063ffffffff16565b6002819055506135b0816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612dd190919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516136509190613907565b60405180910390a35050565b600080828461366b9190614ebc565b90506000831215801561367e5750838113155b80613694575060008312801561369357508381135b5b61369d57600080fd5b8091505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603613716576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161370d90614f71565b60405180910390fd5b61372282600083613854565b61378d81604051806060016040528060228152602001614f92602291396000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612c079092919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506137e481600254612f8290919063ffffffff16565b600281905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516138489190613907565b60405180910390a35050565b505050565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061388e82613863565b9050919050565b61389e81613883565b81146138a957600080fd5b50565b6000813590506138bb81613895565b92915050565b6000602082840312156138d7576138d6613859565b5b60006138e5848285016138ac565b91505092915050565b6000819050919050565b613901816138ee565b82525050565b600060208201905061391c60008301846138f8565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561395c578082015181840152602081019050613941565b60008484015250505050565b6000601f19601f8301169050919050565b600061398482613922565b61398e818561392d565b935061399e81856020860161393e565b6139a781613968565b840191505092915050565b600060208201905081810360008301526139cc8184613979565b905092915050565b6139dd816138ee565b81146139e857600080fd5b50565b6000813590506139fa816139d4565b92915050565b60008060408385031215613a1757613a16613859565b5b6000613a25858286016138ac565b9250506020613a36858286016139eb565b9150509250929050565b60008115159050919050565b613a5581613a40565b82525050565b6000602082019050613a706000830184613a4c565b92915050565b600060208284031215613a8c57613a8b613859565b5b6000613a9a848285016139eb565b91505092915050565b600080600060608486031215613abc57613abb613859565b5b6000613aca868287016138ac565b9350506020613adb868287016138ac565b9250506040613aec868287016139eb565b9150509250925092565b613aff81613883565b82525050565b6000602082019050613b1a6000830184613af6565b92915050565b600060ff82169050919050565b613b3681613b20565b82525050565b6000602082019050613b516000830184613b2d565b92915050565b600060e082019050613b6c600083018a6138f8565b613b7960208301896138f8565b613b8660408301886138f8565b613b9360608301876138f8565b613ba060808301866138f8565b613bad60a0830185613a4c565b613bba60c08301846138f8565b98975050505050505050565b6000819050919050565b613bd981613bc6565b82525050565b600060e082019050613bf4600083018a613af6565b613c016020830189613bd0565b613c0e60408301886138f8565b613c1b60608301876138f8565b613c2860808301866138f8565b613c3560a08301856138f8565b613c4260c08301846138f8565b98975050505050505050565b600080fd5b600080fd5b600080fd5b60008083601f840112613c7357613c72613c4e565b5b8235905067ffffffffffffffff811115613c9057613c8f613c53565b5b602083019150836020820283011115613cac57613cab613c58565b5b9250929050565b60008083601f840112613cc957613cc8613c4e565b5b8235905067ffffffffffffffff811115613ce657613ce5613c53565b5b602083019150836020820283011115613d0257613d01613c58565b5b9250929050565b60008060008060408587031215613d2357613d22613859565b5b600085013567ffffffffffffffff811115613d4157613d4061385e565b5b613d4d87828801613c5d565b9450945050602085013567ffffffffffffffff811115613d7057613d6f61385e565b5b613d7c87828801613cb3565b925092505092959194509250565b6000613d9582613863565b9050919050565b613da581613d8a565b8114613db057600080fd5b50565b600081359050613dc281613d9c565b92915050565b613dd181613a40565b8114613ddc57600080fd5b50565b600081359050613dee81613dc8565b92915050565b60008060408385031215613e0b57613e0a613859565b5b6000613e1985828601613db3565b9250506020613e2a85828601613ddf565b9150509250929050565b60008060408385031215613e4b57613e4a613859565b5b6000613e59858286016138ac565b9250506020613e6a858286016138ac565b9150509250929050565b60008060408385031215613e8b57613e8a613859565b5b6000613e9985828601613db3565b9250506020613eaa858286016139eb565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613eea60208361392d565b9150613ef582613eb4565b602082019050919050565b60006020820190508181036000830152613f1981613edd565b9050919050565b600081905092915050565b50565b6000613f3b600083613f20565b9150613f4682613f2b565b600082019050919050565b6000613f5c82613f2e565b9150819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613fad57607f821691505b602082108103613fc057613fbf613f66565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614000826138ee565b915061400b836138ee565b9250828202614019816138ee565b915082820484148315176140305761402f613fc6565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614071826138ee565b915061407c836138ee565b92508261408c5761408b614037565b5b828204905092915050565b8082525050565b6140a781613883565b82525050565b60006040820190506140c26000830185614097565b6140cf602083018461409e565b9392505050565b7f4f6e6c792061646d696e2063616e2063616c6c20746869732066756e6374696f60008201527f6e00000000000000000000000000000000000000000000000000000000000000602082015250565b600061413260218361392d565b915061413d826140d6565b604082019050919050565b6000602082019050818103600083015261416181614125565b9050919050565b7f486f6c6420706572696f64206d757374206265206265747765656e203120686f60008201527f757220616e642033363520646179730000000000000000000000000000000000602082015250565b60006141c4602f8361392d565b91506141cf82614168565b604082019050919050565b600060208201905081810360008301526141f3816141b7565b9050919050565b7f43616e6e6f742075706461746520746f207468652073616d652076616c756500600082015250565b6000614230601f8361392d565b915061423b826141fa565b602082019050919050565b6000602082019050818103600083015261425f81614223565b9050919050565b600060208201905061427b6000830184614097565b92915050565b600081519050614290816139d4565b92915050565b6000602082840312156142ac576142ab613859565b5b60006142ba84828501614281565b91505092915050565b6142cc816138ee565b82525050565b60006040820190506142e76000830185614097565b6142f460208301846142c3565b9392505050565b60008151905061430a81613895565b92915050565b60006020828403121561432657614325613859565b5b6000614334848285016142fb565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006060820190506143816000830186614097565b61438e602083018561409e565b61439b60408301846142c3565b949350505050565b60006143ae826138ee565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036143e0576143df613fc6565b5b600182019050919050565b7f457665724554485f4469766964656e645f547261636b65723a2077697468647260008201527f61774469766964656e642064697361626c65642e20557365207468652027636c60208201527f61696d272066756e6374696f6e206f6e20746865206d61696e2045766572455460408201527f4820636f6e74726163742e000000000000000000000000000000000000000000606082015250565b6000614493606b8361392d565b915061449e826143eb565b608082019050919050565b600060208201905081810360008301526144c281614486565b9050919050565b7f43616e6e6f74207265636f76657220746865206469766964656e64207472616360008201527f6b657220746f6b656e0000000000000000000000000000000000000000000000602082015250565b600061452560298361392d565b9150614530826144c9565b604082019050919050565b6000602082019050818103600083015261455481614518565b9050919050565b7f43616e6e6f74207265636f766572206d6f7265207468616e2074686520746f6b60008201527f656e2062616c616e636500000000000000000000000000000000000000000000602082015250565b60006145b7602a8361392d565b91506145c28261455b565b604082019050919050565b600060208201905081810360008301526145e6816145aa565b9050919050565b60006040820190506146026000830185613af6565b61460f60208301846138f8565b9392505050565b60008151905061462581613dc8565b92915050565b60006020828403121561464157614640613859565b5b600061464f84828501614616565b91505092915050565b7f5472616e73666572206661696c65640000000000000000000000000000000000600082015250565b600061468e600f8361392d565b915061469982614658565b602082019050919050565b600060208201905081810360008301526146bd81614681565b9050919050565b60006060820190506146d96000830186613af6565b6146e660208301856138f8565b6146f36040830184613af6565b949350505050565b7f4163636f756e74206973206e6f7420656c696769626c6520666f722070726f6360008201527f657373696e670000000000000000000000000000000000000000000000000000602082015250565b600061475760268361392d565b9150614762826146fb565b604082019050919050565b600060208201905081810360008301526147868161474a565b9050919050565b60006060820190506147a26000830186613af6565b6147af6020830185613af6565b6147bc60408301846138f8565b949350505050565b6000819050919050565b60006147e96147e46147df84613863565b6147c4565b613863565b9050919050565b60006147fb826147ce565b9050919050565b600061480d826147f0565b9050919050565b61481d81614802565b82525050565b60006060820190506148386000830186614097565b6148456020830185614814565b61485260408301846142c3565b949350505050565b600060408201905061486f6000830185614097565b61487c6020830184614814565b9392505050565b7f457665724554485f4469766964656e645f547261636b65723a20636c61696d5760008201527f616974206d757374206265207570646174656420746f206265747765656e203160208201527f20686f75727320616e6420372064617973000000000000000000000000000000604082015250565b600061490560518361392d565b915061491082614883565b606082019050919050565b60006020820190508181036000830152614934816148f8565b9050919050565b7f457665724554485f4469766964656e645f547261636b65723a2043616e6e6f7460008201527f2075706461746520636c61696d5761697420746f2073616d652076616c756500602082015250565b6000614997603f8361392d565b91506149a28261493b565b604082019050919050565b600060208201905081810360008301526149c68161498a565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614a2960268361392d565b9150614a34826149cd565b604082019050919050565b60006020820190508181036000830152614a5881614a1c565b9050919050565b614a6881613bc6565b8114614a7357600080fd5b50565b600081519050614a8581614a5f565b92915050565b600060208284031215614aa157614aa0613859565b5b6000614aaf84828501614a76565b91505092915050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614b1460248361392d565b9150614b1f82614ab8565b604082019050919050565b60006020820190508181036000830152614b4381614b07565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000614ba660228361392d565b9150614bb182614b4a565b604082019050919050565b60006020820190508181036000830152614bd581614b99565b9050919050565b7f457665724554485f4469766964656e645f547261636b65723a204e6f2074726160008201527f6e736665727320616c6c6f776564000000000000000000000000000000000000602082015250565b6000614c38602e8361392d565b9150614c4382614bdc565b604082019050919050565b60006020820190508181036000830152614c6781614c2b565b9050919050565b6000614c79826138ee565b9150614c84836138ee565b9250828203905081811115614c9c57614c9b613fc6565b5b92915050565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008201527f7700000000000000000000000000000000000000000000000000000000000000602082015250565b6000614cfe60218361392d565b9150614d0982614ca2565b604082019050919050565b60006020820190508181036000830152614d2d81614cf1565b9050919050565b6000614d3f82613bc6565b9150614d4a83613bc6565b925082820190508281121560008312168382126000841215161715614d7257614d71613fc6565b5b92915050565b6000614d83826138ee565b9150614d8e836138ee565b9250828201905080821115614da657614da5613fc6565b5b92915050565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000600082015250565b6000614de2601b8361392d565b9150614ded82614dac565b602082019050919050565b60006020820190508181036000830152614e1181614dd5565b9050919050565b614e2181614802565b82525050565b6000604082019050614e3c6000830185614e18565b614e4960208301846138f8565b9392505050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b6000614e86601f8361392d565b9150614e9182614e50565b602082019050919050565b60006020820190508181036000830152614eb581614e79565b9050919050565b6000614ec782613bc6565b9150614ed283613bc6565b9250828203905081811260008412168282136000851215161715614ef957614ef8613fc6565b5b92915050565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000614f5b60218361392d565b9150614f6682614eff565b604082019050919050565b60006020820190508181036000830152614f8a81614f4e565b905091905056fe45524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365a264697066735822122056fc99cb7b4f910b206642754e4efb7a545d210d82197656e9c7a1bb0b6a769e64736f6c63430008130033

Libraries Used


Deployed Bytecode Sourcemap

30594:9562:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30839:49;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33345:219;;;:::i;:::-;;5624:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7932:210;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35112:119;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33100:176;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6744:108;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37883:123;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30999:50;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8624:454;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21742:372;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15929:74;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6586:93;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34380:284;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32617:274;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30936:54;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39168:553;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;32171:442;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36233:480;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;36721:538;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32899:193;;;:::i;:::-;;38918:246;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31058:24;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6915:177;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2028:94;;;:::i;:::-;;17555:40;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33568:725;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1805:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38010:551;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20327:131;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5843:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30895:32;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38565:170;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15831:83;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20677:216;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7305;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21114:177;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38739:175;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39731:422;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18577:438;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31089:47;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31940:223;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7584:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37263:616;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34672:432;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2130:192;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35239:986;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;30839:49;;;;;;;;;;;;;;;;;:::o;33345:219::-;1951:12;:10;:12::i;:::-;1940:23;;:7;:5;:7::i;:::-;:23;;;1932:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;33403:18:::1;33424:21;33403:42;;33457:12;33483:7;:5;:7::i;:::-;33475:21;;33504:10;33475:44;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33456:63;;;33538:7;33530:16;;;::::0;::::1;;33386:178;;33345:219::o:0;5624:100::-;5678:13;5711:5;5704:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5624:100;:::o;7932:210::-;8051:4;8073:39;8082:12;:10;:12::i;:::-;8096:7;8105:6;8073:8;:39::i;:::-;8130:4;8123:11;;7932:210;;;;:::o;35112:119::-;35169:7;35196:15;:20;;:27;;;;35189:34;;35112:119;:::o;33100:176::-;1951:12;:10;:12::i;:::-;1940:23;;:7;:5;:7::i;:::-;:23;;;1932:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;33261:6:::1;33239:18;:29;;;;:::i;:::-;33205:31;:63;;;;33100:176:::0;:::o;6744:108::-;6805:7;6832:12;;6825:19;;6744:108;:::o;37883:123::-;37956:4;37976:26;37994:7;37976:17;:26::i;:::-;37969:33;;37883:123;;;:::o;30999:50::-;;;;;;;;;;;;;;;;;:::o;8624:454::-;8764:4;8781:36;8791:6;8799:9;8810:6;8781:9;:36::i;:::-;8828:220;8851:6;8872:12;:10;:12::i;:::-;8899:138;8955:6;8899:138;;;;;;;;;;;;;;;;;:11;:19;8911:6;8899:19;;;;;;;;;;;;;;;:33;8919:12;:10;:12::i;:::-;8899:33;;;;;;;;;;;;;;;;:37;;:138;;;;;:::i;:::-;8828:8;:220::i;:::-;9066:4;9059:11;;8624:454;;;;;:::o;21742:372::-;21856:7;16431:6;21901:193;:159;22023:28;:36;22052:6;22023:36;;;;;;;;;;;;;;;;21901:99;:66;21949:17;21959:6;21949:9;:17::i;:::-;21901:25;;:47;;:66;;;;:::i;:::-;:97;:99::i;:::-;:121;;:159;;;;:::i;:::-;:191;:193::i;:::-;:205;;;;:::i;:::-;21881:225;;21742:372;;;:::o;15929:74::-;15961:42;15929:74;:::o;6586:93::-;6644:5;6669:2;6662:9;;6586:93;:::o;34380:284::-;1951:12;:10;:12::i;:::-;1940:23;;:7;:5;:7::i;:::-;:23;;;1932:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;34463:21:::1;:30;34485:7;34463:30;;;;;;;;;;;;;;;;;;;;;;;;;34462:31;34454:40;;;::::0;::::1;;34535:4;34502:21;:30;34524:7;34502:30;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;34549:24;34562:7;34571:1;34549:12;:24::i;:::-;34581:15;:22;;;;34604:7;34581:31;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;34648:7;34627:29;;;;;;;;;;;;34380:284:::0;:::o;32617:274::-;32682:4;32728:1;32703:13;:22;32717:7;32703:22;;;;;;;;;;;;;;;;:26;32702:110;;;;;32766:45;32793:17;;32766:13;:22;32780:7;32766:22;;;;;;;;;;;;;;;;:26;;:45;;;;:::i;:::-;32747:15;:64;;32702:110;:185;;;;;32848:38;32876:9;;32848:14;:23;32863:7;32848:23;;;;;;;;;;;;;;;;:27;;:38;;;;:::i;:::-;32829:15;:57;;32702:185;32695:192;;32617:274;;;:::o;30936:54::-;;;;;;;;;;;;;;;;;;;;;;:::o;39168:553::-;39244:29;39280:22;39309:21;39337;39365:38;39410:23;39440:25;39583:19;39594:7;39583:10;:19::i;:::-;39476:126;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39630:26;39648:7;39630:17;:26::i;:::-;39609:47;;39683:34;39709:7;39683:25;:34::i;:::-;39663:54;;39168:553;;;;;;;;;:::o;32171:442::-;15961:42;16048:19;;:10;:19;;;16040:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;32292:7:::1;32268:20;:31;;:67;;;;;32327:8;32303:20;:32;;32268:67;32260:127;;;;;;;;;;;;:::i;:::-;;;;;;;;;32426:17;;32402:20;:41:::0;32394:85:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;32544:17;;32522:20;32497:65;;;;;;;;;;32589:20;32569:17;:40;;;;32171:442:::0;:::o;36233:480::-;36319:7;36341:6;36362:7;36384;36406;36428;36450;36479:15;:20;;;;:22;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36470:5;:31;36467:133;;36526:42;36570:2;36574:1;36577;36580;36583;36586;36518:70;;;;;;;;;;;;;;;;36467:133;36612:15;36630;:29;;;;36660:5;36630:36;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36612:54;;36686:19;36697:7;36686:10;:19::i;:::-;36679:26;;;;;;;;;;;;;;;36233:480;;;;;;;;;;:::o;36721:538::-;1951:12;:10;:12::i;:::-;1940:23;;:7;:5;:7::i;:::-;:23;;;1932:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;36842:9:::1;36837:415;36861:8;;:15;;36857:1;:19;36837:415;;;36896:21;:34;36918:8;;36927:1;36918:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;36896:34;;;;;;;;;;;;;;;;;;;;;;;;;36893:63;;;36941:7;;;36893:63;36985:31;;36968:10;;36979:1;36968:13;;;;;;;:::i;:::-;;;;;;;;:48;36965:279;;37033:39;37045:8;;37054:1;37045:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;37058:10;;37069:1;37058:13;;;;;;;:::i;:::-;;;;;;;;37033:11;:39::i;:::-;37081:15;:19;;;;37101:8;;37110:1;37101:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;37114:10;;37125:1;37114:13;;;;;;;:::i;:::-;;;;;;;;37081:47;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;36965:279;;;37164:27;37176:8;;37185:1;37176:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;37189:1;37164:11;:27::i;:::-;37200:15;:22;;;;37223:8;;37232:1;37223:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;37200:35;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;36965:279;36878:3;;;;;:::i;:::-;;;;36837:415;;;;2011:1;36721:538:::0;;;;:::o;32899:193::-;32967:5;32959:125;;;;;;;;;;;;:::i;:::-;;;;;;;;;32899:193::o;38918:246::-;38996:7;39033:1;39016:13;:11;:13::i;:::-;:18;39012:32;;39043:1;39036:8;;;;39012:32;39058:102;39131:28;39151:7;39131:19;:28::i;:::-;39058:68;39112:13;:11;:13::i;:::-;39058:49;39081:25;;39058:18;39068:7;39058:9;:18::i;:::-;:22;;:49;;;;:::i;:::-;:53;;:68;;;;:::i;:::-;:72;;:102;;;;:::i;:::-;39051:109;;38918:246;;;;:::o;31058:24::-;;;;:::o;6915:177::-;7034:7;7066:9;:18;7076:7;7066:18;;;;;;;;;;;;;;;;7059:25;;6915:177;;;:::o;2028:94::-;1951:12;:10;:12::i;:::-;1940:23;;:7;:5;:7::i;:::-;:23;;;1932:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2093:21:::1;2111:1;2093:9;:21::i;:::-;2028:94::o:0;17555:40::-;;;;:::o;33568:725::-;1951:12;:10;:12::i;:::-;1940:23;;:7;:5;:7::i;:::-;:23;;;1932:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;33691:4:::1;33667:29;;:12;:29;;::::0;33659:83:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;33755:12;33777;33755:35;;33797:15;33815:5;:15;;;33839:4;33815:30;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33797:48;;33875:7;33860:11;:22;;33852:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;33938:12;33953:5;:14;;;33968:7;:5;:7::i;:::-;33977:11;33953:36;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33938:51;;34004:7;33996:35;;;;;;;;;;;;:::i;:::-;;;;;;;;;34060:4;34044:20;;:12;:20;;::::0;34040:186:::1;;34176:42;34206:11;34176:25;;:29;;:42;;;;:::i;:::-;34148:25;:70;;;;34040:186;34239:50;34254:12;34268:11;34281:7;:5;:7::i;:::-;34239:50;;;;;;;;:::i;:::-;;;;;;;;33652:641;;;33568:725:::0;;:::o;1805:87::-;1851:7;1878:6;;;;;;;;;;;1871:13;;1805:87;:::o;38010:551::-;38083:7;38129:1;38103:13;:22;38117:7;38103:22;;;;;;;;;;;;;;;;:27;38099:76;;38150:17;;38143:24;;;;38099:76;38181:23;38207:43;38227:13;:22;38241:7;38227:22;;;;;;;;;;;;;;;;38207:15;:19;;:43;;;;:::i;:::-;38181:69;;38279:17;;38261:15;:35;38257:105;;;38316:38;38338:15;38316:17;;:21;;:38;;;;:::i;:::-;38309:45;;;;;38257:105;38368:26;38397:44;38417:14;:23;38432:7;38417:23;;;;;;;;;;;;;;;;38397:15;:19;;:44;;;;:::i;:::-;38368:73;;38473:9;;38452:18;:30;38448:95;;;38502:33;38516:18;38502:9;;:13;;:33;;;;:::i;:::-;38495:40;;;;;;38448:95;38556:1;38549:8;;;;38010:551;;;;:::o;20327:131::-;20393:7;20420:30;20443:6;20420:22;:30::i;:::-;20413:37;;20327:131;;;:::o;5843:104::-;5899:13;5932:7;5925:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5843:104;:::o;30895:32::-;;;;:::o;38565:170::-;38643:7;38666:65;38699:31;38722:7;38699:22;:31::i;:::-;38666:28;38686:7;38666:19;:28::i;:::-;:32;;:65;;;;:::i;:::-;38659:72;;38565:170;;;:::o;15831:83::-;;;:::o;20677:216::-;20791:7;20823:62;20858:18;:26;20877:6;20858:26;;;;;;;;;;;;;;;;20823:30;20846:6;20823:22;:30::i;:::-;:34;;:62;;;;:::i;:::-;20816:69;;20677:216;;;:::o;7305:::-;7427:4;7449:42;7459:12;:10;:12::i;:::-;7473:9;7484:6;7449:9;:42::i;:::-;7509:4;7502:11;;7305:216;;;;:::o;21114:177::-;21225:7;21257:18;:26;21276:6;21257:26;;;;;;;;;;;;;;;;21250:33;;21114:177;;;:::o;38739:175::-;38795:7;38832:1;38815:13;:11;:13::i;:::-;:18;38811:32;;38842:1;38835:8;;;;38811:32;38857:53;38896:13;:11;:13::i;:::-;38857:34;38887:3;38857:25;;:29;;:34;;;;:::i;:::-;:38;;:53;;;;:::i;:::-;38850:60;;38739:175;;:::o;39731:422::-;39822:4;1951:12;:10;:12::i;:::-;1940:23;;:7;:5;:7::i;:::-;:23;;;1932:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;39843:26:::1;39861:7;39843:17;:26::i;:::-;39835:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;39925:14;39942:32;39966:7;39942:23;:32::i;:::-;39925:49;;39995:1;39986:6;:10;39983:146;;;40035:15;40009:14;:23;40024:7;40009:23;;;;;;;;;;;;;;;:41;;;;40089:9;40066:33;;40072:7;40066:33;;;40081:6;40066:33;;;;;;:::i;:::-;;;;;;;;40117:4;40110:11;;;;;39983:146;40144:5;40137:12;;;2011:1;39731:422:::0;;;;:::o;18577:438::-;15961:42;16048:19;;:10;:19;;;16040:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;18678:1:::1;18662:13;:11;:13::i;:::-;:17;18654:26;;;::::0;::::1;;18706:1;18697:6;:10;18693:315;;;18752:102;18826:13;:11;:13::i;:::-;18800:23;16431:6;18801;18800:12;;:23;;;;:::i;:::-;:39;;;;:::i;:::-;18752:25;;:29;;:102;;;;:::i;:::-;18724:25;:130;;;;18895:10;18874:40;;;18907:6;18874:40;;;;;;:::i;:::-;;;;;;;;18959:37;18989:6;18959:25;;:29;;:37;;;;:::i;:::-;18931:25;:65;;;;18693:315;18577:438:::0;:::o;31089:47::-;;;;:::o;31940:223::-;15961:42;16048:19;;:10;:19;;;16040:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;32016:12:::1;32038:4;32031:25;;;32057:10;32077:4;32084:11;32031:65;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32016:80;;32110:7;32107:48;;;32119:36;32143:11;32119:23;:36::i;:::-;32107:48;32005:158;31940:223:::0;:::o;7584:201::-;7718:7;7750:11;:18;7762:5;7750:18;;;;;;;;;;;;;;;:27;7769:7;7750:27;;;;;;;;;;;;;;;;7743:34;;7584:201;;;;:::o;37263:616::-;1951:12;:10;:12::i;:::-;1940:23;;:7;:5;:7::i;:::-;:23;;;1932:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;37357:21:::1;:30;37379:7;37357:30;;;;;;;;;;;;;;;;;;;;;;;;;37400:7;37354:60;37439:31;;37425:10;:45;37422:454;;37483:32;37495:7;37504:10;37483:11;:32::i;:::-;37526:15;:19;;;;37546:7;37555:10;37526:40;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;37617:1;37591:13;:22;37605:7;37591:22;;;;;;;;;;;;;;;;:27:::0;37587:100:::1;;37660:15;37635:13;:22;37649:7;37635:22;;;;;;;;;;;;;;;:40;;;;37587:100;37422:454;;;37716:23;37728:7;37737:1;37716:11;:23::i;:::-;37750:15;:22;;;;37773:7;37750:31;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;37817:1;37792:13;:22;37806:7;37792:22;;;;;;;;;;;;;;;:26;;;;37422:454;2011:1;37263:616:::0;;:::o;34672:432::-;1951:12;:10;:12::i;:::-;1940:23;;:7;:5;:7::i;:::-;:23;;;1932:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;34773:7:::1;34757:12;:23;;:49;;;;;34800:6;34784:12;:22;;34757:49;34749:143;;;;;;;;;;;;:::i;:::-;;;;;;;;;34927:9;;34911:12;:25:::0;34903:101:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;35051:9;;35037:12;35020:41;;;;;;;;;;35084:12;35072:9;:24;;;;34672:432:::0;:::o;2130:192::-;1951:12;:10;:12::i;:::-;1940:23;;:7;:5;:7::i;:::-;:23;;;1932:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2239:1:::1;2219:22;;:8;:22;;::::0;2211:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;2295:19;2305:8;2295:9;:19::i;:::-;2130:192:::0;:::o;35239:986::-;35321:15;35351:12;35378:29;35422:22;35459:21;35495;35531:38;35592:8;35582:18;;35621:15;:29;;;;35651:7;35621:38;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35613:46;;35696:31;35719:7;35696:22;:31::i;:::-;35672:55;;35755:31;35778:7;35755:22;:31::i;:::-;35738:48;;35815:14;:23;35830:7;35815:23;;;;;;;;;;;;;;;;35799:39;;35883:1;35867:13;:17;:126;;35992:1;35867:126;;;35924:28;35942:9;;35924:13;:17;;:28;;;;:::i;:::-;35867:126;35851:142;;36055:15;36039:13;:31;:178;;36216:1;36039:178;;;36126:34;36144:15;36126:13;:17;;:34;;;;:::i;:::-;36039:178;36006:211;;35239:986;;;;;;;;;:::o;1226:98::-;1279:7;1306:10;1299:17;;1226:98;:::o;12071:380::-;12224:1;12207:19;;:5;:19;;;12199:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;12305:1;12286:21;;:7;:21;;;12278:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;12389:6;12359:11;:18;12371:5;12359:18;;;;;;;;;;;;;;;:27;12378:7;12359:27;;;;;;;;;;;;;;;:36;;;;12427:7;12411:32;;12420:5;12411:32;;;12436:6;12411:32;;;;;;:::i;:::-;;;;;;;;12071:380;;;:::o;31776:152::-;31864:5;31856:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;31776:152;;;:::o;27037:192::-;27123:7;27156:1;27151;:6;;27159:12;27143:29;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;27183:9;27199:1;27195;:5;;;;:::i;:::-;27183:17;;27220:1;27213:8;;;27037:192;;;;;:::o;27488:471::-;27546:7;27796:1;27791;:6;27787:47;;27821:1;27814:8;;;;27787:47;27846:9;27862:1;27858;:5;;;;:::i;:::-;27846:17;;27891:1;27886;27882;:5;;;;:::i;:::-;:10;27874:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;27950:1;27943:8;;;27488:471;;;;;:::o;4244:134::-;4300:6;4315:8;4333:1;4315:20;;4355:1;4350;:6;;4342:15;;;;;;4371:1;4364:8;;;4244:134;;;:::o;3801:176::-;3857:6;3876:8;3891:1;3887;:5;;;;:::i;:::-;3876:16;;3917:1;3912;:6;;:16;;;;;3927:1;3922;:6;;3912:16;3911:38;;;;3938:1;3934;:5;:14;;;;;3947:1;3943;:5;3934:14;3911:38;3903:47;;;;;;3968:1;3961:8;;;3801:176;;;;:::o;3985:127::-;4041:7;4074:1;4069;:6;;4061:15;;;;;;4102:1;4087:17;;3985:127;;;:::o;23251:459::-;23336:23;23362:18;23372:7;23362:9;:18::i;:::-;23336:44;;23410:14;23397:10;:27;23393:310;;;23441:18;23462:30;23477:14;23462:10;:14;;:30;;;;:::i;:::-;23441:51;;23507:26;23513:7;23522:10;23507:5;:26::i;:::-;23426:119;23393:310;;;23568:14;23555:10;:27;23551:152;;;23599:18;23620:30;23639:10;23620:14;:18;;:30;;;;:::i;:::-;23599:51;;23665:26;23671:7;23680:10;23665:5;:26::i;:::-;23584:119;23551:152;23393:310;23319:391;23251:459;;:::o;26134:181::-;26192:7;26212:9;26228:1;26224;:5;;;;:::i;:::-;26212:17;;26253:1;26248;:6;;26240:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;26306:1;26299:8;;;26134:181;;;;:::o;23718:507::-;23816:4;23809:22;;;23832:7;23809:31;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;23796:44;;23851:23;23877:18;23887:7;23877:9;:18::i;:::-;23851:44;;23925:14;23912:10;:27;23908:310;;;23956:18;23977:30;23992:14;23977:10;:14;;:30;;;;:::i;:::-;23956:51;;24022:26;24028:7;24037:10;24022:5;:26::i;:::-;23941:119;23908:310;;;24083:14;24070:10;:27;24066:152;;;24114:18;24135:30;24154:10;24135:14;:18;;:30;;;;:::i;:::-;24114:51;;24180:26;24186:7;24195:10;24180:5;:26::i;:::-;24099:119;24066:152;23908:310;23785:440;23718:507;;:::o;28435:132::-;28493:7;28520:39;28524:1;28527;28520:39;;;;;;;;;;;;;;;;;:3;:39::i;:::-;28513:46;;28435:132;;;;:::o;26598:136::-;26656:7;26683:43;26687:1;26690;26683:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;26676:50;;26598:136;;;;:::o;2330:173::-;2386:16;2405:6;;;;;;;;;;;2386:25;;2431:8;2422:6;;:17;;;;;;;;;;;;;;;;;;2486:8;2455:40;;2476:8;2455:40;;;;;;;;;;;;2375:128;2330:173;:::o;19480:628::-;19553:7;19573:29;19605:28;19628:4;19605:22;:28::i;:::-;19573:60;;19672:1;19648:21;:25;19644:442;;;19713:51;19742:21;19713:18;:24;19732:4;19713:24;;;;;;;;;;;;;;;;:28;;:51;;;;:::i;:::-;19686:18;:24;19705:4;19686:24;;;;;;;;;;;;;;;:78;;;;19796:4;19778:46;;;19802:21;19778:46;;;;;;:::i;:::-;;;;;;;;19833:12;19855:4;19848:21;;;19870:4;19876:21;19848:50;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19833:65;;19913:7;19909:131;;19960:51;19989:21;19960:18;:24;19979:4;19960:24;;;;;;;;;;;;;;;;:28;;:51;;;;:::i;:::-;19933:18;:24;19952:4;19933:24;;;;;;;;;;;;;;;:78;;;;20029:1;20022:8;;;;;;19909:131;20057:21;20050:28;;;;;;19644:442;20101:1;20094:8;;;19480:628;;;;:::o;22390:284::-;22466:27;22478:7;22487:5;22466:11;:27::i;:::-;22546:120;22612:53;22613:36;22643:5;22613:25;;:29;;:36;;;;:::i;:::-;22612:51;:53::i;:::-;22546:28;:61;22589:7;22546:61;;;;;;;;;;;;;;;;:65;;:120;;;;:::i;:::-;22506:28;:37;22535:7;22506:37;;;;;;;;;;;;;;;:160;;;;22390:284;;:::o;22959:::-;23035:27;23047:7;23056:5;23035:11;:27::i;:::-;23115:120;23181:53;23182:36;23212:5;23182:25;;:29;;:36;;;;:::i;:::-;23181:51;:53::i;:::-;23115:28;:61;23158:7;23115:61;;;;;;;;;;;;;;;;:65;;:120;;;;:::i;:::-;23075:28;:37;23104:7;23075:37;;;;;;;;;;;;;;;:160;;;;22959:284;;:::o;29063:278::-;29149:7;29181:1;29177;:5;29184:12;29169:28;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;29208:9;29224:1;29220;:5;;;;:::i;:::-;29208:17;;29332:1;29325:8;;;29063:278;;;;;:::o;10467:378::-;10570:1;10551:21;;:7;:21;;;10543:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;10621:49;10650:1;10654:7;10663:6;10621:20;:49::i;:::-;10698:24;10715:6;10698:12;;:16;;:24;;;;:::i;:::-;10683:12;:39;;;;10754:30;10777:6;10754:9;:18;10764:7;10754:18;;;;;;;;;;;;;;;;:22;;:30;;;;:::i;:::-;10733:9;:18;10743:7;10733:18;;;;;;;;;;;;;;;:51;;;;10821:7;10800:37;;10817:1;10800:37;;;10830:6;10800:37;;;;;;:::i;:::-;;;;;;;;10467:378;;:::o;3537:176::-;3593:6;3612:8;3627:1;3623;:5;;;;:::i;:::-;3612:16;;3653:1;3648;:6;;:16;;;;;3663:1;3658;:6;;3648:16;3647:38;;;;3674:1;3670;:5;:14;;;;;3683:1;3679;:5;3670:14;3647:38;3639:47;;;;;;3704:1;3697:8;;;3537:176;;;;:::o;11178:455::-;11281:1;11262:21;;:7;:21;;;11254:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;11334:49;11355:7;11372:1;11376:6;11334:20;:49::i;:::-;11417:105;11454:6;11417:105;;;;;;;;;;;;;;;;;:9;:18;11427:7;11417:18;;;;;;;;;;;;;;;;:22;;:105;;;;;:::i;:::-;11396:9;:18;11406:7;11396:18;;;;;;;;;;;;;;;:126;;;;11548:24;11565:6;11548:12;;:16;;:24;;;;:::i;:::-;11533:12;:39;;;;11614:1;11588:37;;11597:7;11588:37;;;11618:6;11588:37;;;;;;:::i;:::-;;;;;;;;11178:455;;:::o;13054:125::-;;;;:::o;88:117:1:-;197:1;194;187:12;211:117;320:1;317;310:12;334:126;371:7;411:42;404:5;400:54;389:65;;334:126;;;:::o;466:96::-;503:7;532:24;550:5;532:24;:::i;:::-;521:35;;466:96;;;:::o;568:122::-;641:24;659:5;641:24;:::i;:::-;634:5;631:35;621:63;;680:1;677;670:12;621:63;568:122;:::o;696:139::-;742:5;780:6;767:20;758:29;;796:33;823:5;796:33;:::i;:::-;696:139;;;;:::o;841:329::-;900:6;949:2;937:9;928:7;924:23;920:32;917:119;;;955:79;;:::i;:::-;917:119;1075:1;1100:53;1145:7;1136:6;1125:9;1121:22;1100:53;:::i;:::-;1090:63;;1046:117;841:329;;;;:::o;1176:77::-;1213:7;1242:5;1231:16;;1176:77;;;:::o;1259:118::-;1346:24;1364:5;1346:24;:::i;:::-;1341:3;1334:37;1259:118;;:::o;1383:222::-;1476:4;1514:2;1503:9;1499:18;1491:26;;1527:71;1595:1;1584:9;1580:17;1571:6;1527:71;:::i;:::-;1383:222;;;;:::o;1611:99::-;1663:6;1697:5;1691:12;1681:22;;1611:99;;;:::o;1716:169::-;1800:11;1834:6;1829:3;1822:19;1874:4;1869:3;1865:14;1850:29;;1716:169;;;;:::o;1891:246::-;1972:1;1982:113;1996:6;1993:1;1990:13;1982:113;;;2081:1;2076:3;2072:11;2066:18;2062:1;2057:3;2053:11;2046:39;2018:2;2015:1;2011:10;2006:15;;1982:113;;;2129:1;2120:6;2115:3;2111:16;2104:27;1953:184;1891:246;;;:::o;2143:102::-;2184:6;2235:2;2231:7;2226:2;2219:5;2215:14;2211:28;2201:38;;2143:102;;;:::o;2251:377::-;2339:3;2367:39;2400:5;2367:39;:::i;:::-;2422:71;2486:6;2481:3;2422:71;:::i;:::-;2415:78;;2502:65;2560:6;2555:3;2548:4;2541:5;2537:16;2502:65;:::i;:::-;2592:29;2614:6;2592:29;:::i;:::-;2587:3;2583:39;2576:46;;2343:285;2251:377;;;;:::o;2634:313::-;2747:4;2785:2;2774:9;2770:18;2762:26;;2834:9;2828:4;2824:20;2820:1;2809:9;2805:17;2798:47;2862:78;2935:4;2926:6;2862:78;:::i;:::-;2854:86;;2634:313;;;;:::o;2953:122::-;3026:24;3044:5;3026:24;:::i;:::-;3019:5;3016:35;3006:63;;3065:1;3062;3055:12;3006:63;2953:122;:::o;3081:139::-;3127:5;3165:6;3152:20;3143:29;;3181:33;3208:5;3181:33;:::i;:::-;3081:139;;;;:::o;3226:474::-;3294:6;3302;3351:2;3339:9;3330:7;3326:23;3322:32;3319:119;;;3357:79;;:::i;:::-;3319:119;3477:1;3502:53;3547:7;3538:6;3527:9;3523:22;3502:53;:::i;:::-;3492:63;;3448:117;3604:2;3630:53;3675:7;3666:6;3655:9;3651:22;3630:53;:::i;:::-;3620:63;;3575:118;3226:474;;;;;:::o;3706:90::-;3740:7;3783:5;3776:13;3769:21;3758:32;;3706:90;;;:::o;3802:109::-;3883:21;3898:5;3883:21;:::i;:::-;3878:3;3871:34;3802:109;;:::o;3917:210::-;4004:4;4042:2;4031:9;4027:18;4019:26;;4055:65;4117:1;4106:9;4102:17;4093:6;4055:65;:::i;:::-;3917:210;;;;:::o;4133:329::-;4192:6;4241:2;4229:9;4220:7;4216:23;4212:32;4209:119;;;4247:79;;:::i;:::-;4209:119;4367:1;4392:53;4437:7;4428:6;4417:9;4413:22;4392:53;:::i;:::-;4382:63;;4338:117;4133:329;;;;:::o;4468:619::-;4545:6;4553;4561;4610:2;4598:9;4589:7;4585:23;4581:32;4578:119;;;4616:79;;:::i;:::-;4578:119;4736:1;4761:53;4806:7;4797:6;4786:9;4782:22;4761:53;:::i;:::-;4751:63;;4707:117;4863:2;4889:53;4934:7;4925:6;4914:9;4910:22;4889:53;:::i;:::-;4879:63;;4834:118;4991:2;5017:53;5062:7;5053:6;5042:9;5038:22;5017:53;:::i;:::-;5007:63;;4962:118;4468:619;;;;;:::o;5093:118::-;5180:24;5198:5;5180:24;:::i;:::-;5175:3;5168:37;5093:118;;:::o;5217:222::-;5310:4;5348:2;5337:9;5333:18;5325:26;;5361:71;5429:1;5418:9;5414:17;5405:6;5361:71;:::i;:::-;5217:222;;;;:::o;5445:86::-;5480:7;5520:4;5513:5;5509:16;5498:27;;5445:86;;;:::o;5537:112::-;5620:22;5636:5;5620:22;:::i;:::-;5615:3;5608:35;5537:112;;:::o;5655:214::-;5744:4;5782:2;5771:9;5767:18;5759:26;;5795:67;5859:1;5848:9;5844:17;5835:6;5795:67;:::i;:::-;5655:214;;;;:::o;5875:874::-;6130:4;6168:3;6157:9;6153:19;6145:27;;6182:71;6250:1;6239:9;6235:17;6226:6;6182:71;:::i;:::-;6263:72;6331:2;6320:9;6316:18;6307:6;6263:72;:::i;:::-;6345;6413:2;6402:9;6398:18;6389:6;6345:72;:::i;:::-;6427;6495:2;6484:9;6480:18;6471:6;6427:72;:::i;:::-;6509:73;6577:3;6566:9;6562:19;6553:6;6509:73;:::i;:::-;6592:67;6654:3;6643:9;6639:19;6630:6;6592:67;:::i;:::-;6669:73;6737:3;6726:9;6722:19;6713:6;6669:73;:::i;:::-;5875:874;;;;;;;;;;:::o;6755:76::-;6791:7;6820:5;6809:16;;6755:76;;;:::o;6837:115::-;6922:23;6939:5;6922:23;:::i;:::-;6917:3;6910:36;6837:115;;:::o;6958:882::-;7217:4;7255:3;7244:9;7240:19;7232:27;;7269:71;7337:1;7326:9;7322:17;7313:6;7269:71;:::i;:::-;7350:70;7416:2;7405:9;7401:18;7392:6;7350:70;:::i;:::-;7430:72;7498:2;7487:9;7483:18;7474:6;7430:72;:::i;:::-;7512;7580:2;7569:9;7565:18;7556:6;7512:72;:::i;:::-;7594:73;7662:3;7651:9;7647:19;7638:6;7594:73;:::i;:::-;7677;7745:3;7734:9;7730:19;7721:6;7677:73;:::i;:::-;7760;7828:3;7817:9;7813:19;7804:6;7760:73;:::i;:::-;6958:882;;;;;;;;;;:::o;7846:117::-;7955:1;7952;7945:12;7969:117;8078:1;8075;8068:12;8092:117;8201:1;8198;8191:12;8232:568;8305:8;8315:6;8365:3;8358:4;8350:6;8346:17;8342:27;8332:122;;8373:79;;:::i;:::-;8332:122;8486:6;8473:20;8463:30;;8516:18;8508:6;8505:30;8502:117;;;8538:79;;:::i;:::-;8502:117;8652:4;8644:6;8640:17;8628:29;;8706:3;8698:4;8690:6;8686:17;8676:8;8672:32;8669:41;8666:128;;;8713:79;;:::i;:::-;8666:128;8232:568;;;;;:::o;8823:::-;8896:8;8906:6;8956:3;8949:4;8941:6;8937:17;8933:27;8923:122;;8964:79;;:::i;:::-;8923:122;9077:6;9064:20;9054:30;;9107:18;9099:6;9096:30;9093:117;;;9129:79;;:::i;:::-;9093:117;9243:4;9235:6;9231:17;9219:29;;9297:3;9289:4;9281:6;9277:17;9267:8;9263:32;9260:41;9257:128;;;9304:79;;:::i;:::-;9257:128;8823:568;;;;;:::o;9397:934::-;9519:6;9527;9535;9543;9592:2;9580:9;9571:7;9567:23;9563:32;9560:119;;;9598:79;;:::i;:::-;9560:119;9746:1;9735:9;9731:17;9718:31;9776:18;9768:6;9765:30;9762:117;;;9798:79;;:::i;:::-;9762:117;9911:80;9983:7;9974:6;9963:9;9959:22;9911:80;:::i;:::-;9893:98;;;;9689:312;10068:2;10057:9;10053:18;10040:32;10099:18;10091:6;10088:30;10085:117;;;10121:79;;:::i;:::-;10085:117;10234:80;10306:7;10297:6;10286:9;10282:22;10234:80;:::i;:::-;10216:98;;;;10011:313;9397:934;;;;;;;:::o;10337:104::-;10382:7;10411:24;10429:5;10411:24;:::i;:::-;10400:35;;10337:104;;;:::o;10447:138::-;10528:32;10554:5;10528:32;:::i;:::-;10521:5;10518:43;10508:71;;10575:1;10572;10565:12;10508:71;10447:138;:::o;10591:155::-;10645:5;10683:6;10670:20;10661:29;;10699:41;10734:5;10699:41;:::i;:::-;10591:155;;;;:::o;10752:116::-;10822:21;10837:5;10822:21;:::i;:::-;10815:5;10812:32;10802:60;;10858:1;10855;10848:12;10802:60;10752:116;:::o;10874:133::-;10917:5;10955:6;10942:20;10933:29;;10971:30;10995:5;10971:30;:::i;:::-;10874:133;;;;:::o;11013:484::-;11086:6;11094;11143:2;11131:9;11122:7;11118:23;11114:32;11111:119;;;11149:79;;:::i;:::-;11111:119;11269:1;11294:61;11347:7;11338:6;11327:9;11323:22;11294:61;:::i;:::-;11284:71;;11240:125;11404:2;11430:50;11472:7;11463:6;11452:9;11448:22;11430:50;:::i;:::-;11420:60;;11375:115;11013:484;;;;;:::o;11503:474::-;11571:6;11579;11628:2;11616:9;11607:7;11603:23;11599:32;11596:119;;;11634:79;;:::i;:::-;11596:119;11754:1;11779:53;11824:7;11815:6;11804:9;11800:22;11779:53;:::i;:::-;11769:63;;11725:117;11881:2;11907:53;11952:7;11943:6;11932:9;11928:22;11907:53;:::i;:::-;11897:63;;11852:118;11503:474;;;;;:::o;11983:490::-;12059:6;12067;12116:2;12104:9;12095:7;12091:23;12087:32;12084:119;;;12122:79;;:::i;:::-;12084:119;12242:1;12267:61;12320:7;12311:6;12300:9;12296:22;12267:61;:::i;:::-;12257:71;;12213:125;12377:2;12403:53;12448:7;12439:6;12428:9;12424:22;12403:53;:::i;:::-;12393:63;;12348:118;11983:490;;;;;:::o;12479:182::-;12619:34;12615:1;12607:6;12603:14;12596:58;12479:182;:::o;12667:366::-;12809:3;12830:67;12894:2;12889:3;12830:67;:::i;:::-;12823:74;;12906:93;12995:3;12906:93;:::i;:::-;13024:2;13019:3;13015:12;13008:19;;12667:366;;;:::o;13039:419::-;13205:4;13243:2;13232:9;13228:18;13220:26;;13292:9;13286:4;13282:20;13278:1;13267:9;13263:17;13256:47;13320:131;13446:4;13320:131;:::i;:::-;13312:139;;13039:419;;;:::o;13464:147::-;13565:11;13602:3;13587:18;;13464:147;;;;:::o;13617:114::-;;:::o;13737:398::-;13896:3;13917:83;13998:1;13993:3;13917:83;:::i;:::-;13910:90;;14009:93;14098:3;14009:93;:::i;:::-;14127:1;14122:3;14118:11;14111:18;;13737:398;;;:::o;14141:379::-;14325:3;14347:147;14490:3;14347:147;:::i;:::-;14340:154;;14511:3;14504:10;;14141:379;;;:::o;14526:180::-;14574:77;14571:1;14564:88;14671:4;14668:1;14661:15;14695:4;14692:1;14685:15;14712:320;14756:6;14793:1;14787:4;14783:12;14773:22;;14840:1;14834:4;14830:12;14861:18;14851:81;;14917:4;14909:6;14905:17;14895:27;;14851:81;14979:2;14971:6;14968:14;14948:18;14945:38;14942:84;;14998:18;;:::i;:::-;14942:84;14763:269;14712:320;;;:::o;15038:180::-;15086:77;15083:1;15076:88;15183:4;15180:1;15173:15;15207:4;15204:1;15197:15;15224:410;15264:7;15287:20;15305:1;15287:20;:::i;:::-;15282:25;;15321:20;15339:1;15321:20;:::i;:::-;15316:25;;15376:1;15373;15369:9;15398:30;15416:11;15398:30;:::i;:::-;15387:41;;15577:1;15568:7;15564:15;15561:1;15558:22;15538:1;15531:9;15511:83;15488:139;;15607:18;;:::i;:::-;15488:139;15272:362;15224:410;;;;:::o;15640:180::-;15688:77;15685:1;15678:88;15785:4;15782:1;15775:15;15809:4;15806:1;15799:15;15826:185;15866:1;15883:20;15901:1;15883:20;:::i;:::-;15878:25;;15917:20;15935:1;15917:20;:::i;:::-;15912:25;;15956:1;15946:35;;15961:18;;:::i;:::-;15946:35;16003:1;16000;15996:9;15991:14;;15826:185;;;;:::o;16017:129::-;16134:5;16129:3;16122:18;16017:129;;:::o;16152:126::-;16247:24;16265:5;16247:24;:::i;:::-;16242:3;16235:37;16152:126;;:::o;16284:400::-;16435:4;16473:2;16462:9;16458:18;16450:26;;16486:101;16584:1;16573:9;16569:17;16560:6;16486:101;:::i;:::-;16597:80;16673:2;16662:9;16658:18;16649:6;16597:80;:::i;:::-;16284:400;;;;;:::o;16690:220::-;16830:34;16826:1;16818:6;16814:14;16807:58;16899:3;16894:2;16886:6;16882:15;16875:28;16690:220;:::o;16916:366::-;17058:3;17079:67;17143:2;17138:3;17079:67;:::i;:::-;17072:74;;17155:93;17244:3;17155:93;:::i;:::-;17273:2;17268:3;17264:12;17257:19;;16916:366;;;:::o;17288:419::-;17454:4;17492:2;17481:9;17477:18;17469:26;;17541:9;17535:4;17531:20;17527:1;17516:9;17512:17;17505:47;17569:131;17695:4;17569:131;:::i;:::-;17561:139;;17288:419;;;:::o;17713:234::-;17853:34;17849:1;17841:6;17837:14;17830:58;17922:17;17917:2;17909:6;17905:15;17898:42;17713:234;:::o;17953:366::-;18095:3;18116:67;18180:2;18175:3;18116:67;:::i;:::-;18109:74;;18192:93;18281:3;18192:93;:::i;:::-;18310:2;18305:3;18301:12;18294:19;;17953:366;;;:::o;18325:419::-;18491:4;18529:2;18518:9;18514:18;18506:26;;18578:9;18572:4;18568:20;18564:1;18553:9;18549:17;18542:47;18606:131;18732:4;18606:131;:::i;:::-;18598:139;;18325:419;;;:::o;18750:181::-;18890:33;18886:1;18878:6;18874:14;18867:57;18750:181;:::o;18937:366::-;19079:3;19100:67;19164:2;19159:3;19100:67;:::i;:::-;19093:74;;19176:93;19265:3;19176:93;:::i;:::-;19294:2;19289:3;19285:12;19278:19;;18937:366;;;:::o;19309:419::-;19475:4;19513:2;19502:9;19498:18;19490:26;;19562:9;19556:4;19552:20;19548:1;19537:9;19533:17;19526:47;19590:131;19716:4;19590:131;:::i;:::-;19582:139;;19309:419;;;:::o;19734:282::-;19857:4;19895:2;19884:9;19880:18;19872:26;;19908:101;20006:1;19995:9;19991:17;19982:6;19908:101;:::i;:::-;19734:282;;;;:::o;20022:143::-;20079:5;20110:6;20104:13;20095:22;;20126:33;20153:5;20126:33;:::i;:::-;20022:143;;;;:::o;20171:351::-;20241:6;20290:2;20278:9;20269:7;20265:23;20261:32;20258:119;;;20296:79;;:::i;:::-;20258:119;20416:1;20441:64;20497:7;20488:6;20477:9;20473:22;20441:64;:::i;:::-;20431:74;;20387:128;20171:351;;;;:::o;20528:126::-;20623:24;20641:5;20623:24;:::i;:::-;20618:3;20611:37;20528:126;;:::o;20660:400::-;20811:4;20849:2;20838:9;20834:18;20826:26;;20862:101;20960:1;20949:9;20945:17;20936:6;20862:101;:::i;:::-;20973:80;21049:2;21038:9;21034:18;21025:6;20973:80;:::i;:::-;20660:400;;;;;:::o;21066:143::-;21123:5;21154:6;21148:13;21139:22;;21170:33;21197:5;21170:33;:::i;:::-;21066:143;;;;:::o;21215:351::-;21285:6;21334:2;21322:9;21313:7;21309:23;21305:32;21302:119;;;21340:79;;:::i;:::-;21302:119;21460:1;21485:64;21541:7;21532:6;21521:9;21517:22;21485:64;:::i;:::-;21475:74;;21431:128;21215:351;;;;:::o;21572:180::-;21620:77;21617:1;21610:88;21717:4;21714:1;21707:15;21741:4;21738:1;21731:15;21758:518;21937:4;21975:2;21964:9;21960:18;21952:26;;21988:101;22086:1;22075:9;22071:17;22062:6;21988:101;:::i;:::-;22099:80;22175:2;22164:9;22160:18;22151:6;22099:80;:::i;:::-;22189;22265:2;22254:9;22250:18;22241:6;22189:80;:::i;:::-;21758:518;;;;;;:::o;22282:233::-;22321:3;22344:24;22362:5;22344:24;:::i;:::-;22335:33;;22390:66;22383:5;22380:77;22377:103;;22460:18;;:::i;:::-;22377:103;22507:1;22500:5;22496:13;22489:20;;22282:233;;;:::o;22521:368::-;22661:34;22657:1;22649:6;22645:14;22638:58;22730:34;22725:2;22717:6;22713:15;22706:59;22799:34;22794:2;22786:6;22782:15;22775:59;22868:13;22863:2;22855:6;22851:15;22844:38;22521:368;:::o;22895:::-;23037:3;23058:68;23122:3;23117;23058:68;:::i;:::-;23051:75;;23135:93;23224:3;23135:93;:::i;:::-;23253:3;23248;23244:13;23237:20;;22895:368;;;:::o;23269:419::-;23435:4;23473:2;23462:9;23458:18;23450:26;;23522:9;23516:4;23512:20;23508:1;23497:9;23493:17;23486:47;23550:131;23676:4;23550:131;:::i;:::-;23542:139;;23269:419;;;:::o;23694:228::-;23834:34;23830:1;23822:6;23818:14;23811:58;23903:11;23898:2;23890:6;23886:15;23879:36;23694:228;:::o;23928:366::-;24070:3;24091:67;24155:2;24150:3;24091:67;:::i;:::-;24084:74;;24167:93;24256:3;24167:93;:::i;:::-;24285:2;24280:3;24276:12;24269:19;;23928:366;;;:::o;24300:419::-;24466:4;24504:2;24493:9;24489:18;24481:26;;24553:9;24547:4;24543:20;24539:1;24528:9;24524:17;24517:47;24581:131;24707:4;24581:131;:::i;:::-;24573:139;;24300:419;;;:::o;24725:229::-;24865:34;24861:1;24853:6;24849:14;24842:58;24934:12;24929:2;24921:6;24917:15;24910:37;24725:229;:::o;24960:366::-;25102:3;25123:67;25187:2;25182:3;25123:67;:::i;:::-;25116:74;;25199:93;25288:3;25199:93;:::i;:::-;25317:2;25312:3;25308:12;25301:19;;24960:366;;;:::o;25332:419::-;25498:4;25536:2;25525:9;25521:18;25513:26;;25585:9;25579:4;25575:20;25571:1;25560:9;25556:17;25549:47;25613:131;25739:4;25613:131;:::i;:::-;25605:139;;25332:419;;;:::o;25757:332::-;25878:4;25916:2;25905:9;25901:18;25893:26;;25929:71;25997:1;25986:9;25982:17;25973:6;25929:71;:::i;:::-;26010:72;26078:2;26067:9;26063:18;26054:6;26010:72;:::i;:::-;25757:332;;;;;:::o;26095:137::-;26149:5;26180:6;26174:13;26165:22;;26196:30;26220:5;26196:30;:::i;:::-;26095:137;;;;:::o;26238:345::-;26305:6;26354:2;26342:9;26333:7;26329:23;26325:32;26322:119;;;26360:79;;:::i;:::-;26322:119;26480:1;26505:61;26558:7;26549:6;26538:9;26534:22;26505:61;:::i;:::-;26495:71;;26451:125;26238:345;;;;:::o;26589:165::-;26729:17;26725:1;26717:6;26713:14;26706:41;26589:165;:::o;26760:366::-;26902:3;26923:67;26987:2;26982:3;26923:67;:::i;:::-;26916:74;;26999:93;27088:3;26999:93;:::i;:::-;27117:2;27112:3;27108:12;27101:19;;26760:366;;;:::o;27132:419::-;27298:4;27336:2;27325:9;27321:18;27313:26;;27385:9;27379:4;27375:20;27371:1;27360:9;27356:17;27349:47;27413:131;27539:4;27413:131;:::i;:::-;27405:139;;27132:419;;;:::o;27557:442::-;27706:4;27744:2;27733:9;27729:18;27721:26;;27757:71;27825:1;27814:9;27810:17;27801:6;27757:71;:::i;:::-;27838:72;27906:2;27895:9;27891:18;27882:6;27838:72;:::i;:::-;27920;27988:2;27977:9;27973:18;27964:6;27920:72;:::i;:::-;27557:442;;;;;;:::o;28005:225::-;28145:34;28141:1;28133:6;28129:14;28122:58;28214:8;28209:2;28201:6;28197:15;28190:33;28005:225;:::o;28236:366::-;28378:3;28399:67;28463:2;28458:3;28399:67;:::i;:::-;28392:74;;28475:93;28564:3;28475:93;:::i;:::-;28593:2;28588:3;28584:12;28577:19;;28236:366;;;:::o;28608:419::-;28774:4;28812:2;28801:9;28797:18;28789:26;;28861:9;28855:4;28851:20;28847:1;28836:9;28832:17;28825:47;28889:131;29015:4;28889:131;:::i;:::-;28881:139;;28608:419;;;:::o;29033:442::-;29182:4;29220:2;29209:9;29205:18;29197:26;;29233:71;29301:1;29290:9;29286:17;29277:6;29233:71;:::i;:::-;29314:72;29382:2;29371:9;29367:18;29358:6;29314:72;:::i;:::-;29396;29464:2;29453:9;29449:18;29440:6;29396:72;:::i;:::-;29033:442;;;;;;:::o;29481:60::-;29509:3;29530:5;29523:12;;29481:60;;;:::o;29547:142::-;29597:9;29630:53;29648:34;29657:24;29675:5;29657:24;:::i;:::-;29648:34;:::i;:::-;29630:53;:::i;:::-;29617:66;;29547:142;;;:::o;29695:126::-;29745:9;29778:37;29809:5;29778:37;:::i;:::-;29765:50;;29695:126;;;:::o;29827:134::-;29885:9;29918:37;29949:5;29918:37;:::i;:::-;29905:50;;29827:134;;;:::o;29967:155::-;30070:45;30109:5;30070:45;:::i;:::-;30065:3;30058:58;29967:155;;:::o;30128:534::-;30315:4;30353:2;30342:9;30338:18;30330:26;;30366:101;30464:1;30453:9;30449:17;30440:6;30366:101;:::i;:::-;30477:88;30561:2;30550:9;30546:18;30537:6;30477:88;:::i;:::-;30575:80;30651:2;30640:9;30636:18;30627:6;30575:80;:::i;:::-;30128:534;;;;;;:::o;30668:416::-;30827:4;30865:2;30854:9;30850:18;30842:26;;30878:101;30976:1;30965:9;30961:17;30952:6;30878:101;:::i;:::-;30989:88;31073:2;31062:9;31058:18;31049:6;30989:88;:::i;:::-;30668:416;;;;;:::o;31090:305::-;31230:34;31226:1;31218:6;31214:14;31207:58;31299:34;31294:2;31286:6;31282:15;31275:59;31368:19;31363:2;31355:6;31351:15;31344:44;31090:305;:::o;31401:366::-;31543:3;31564:67;31628:2;31623:3;31564:67;:::i;:::-;31557:74;;31640:93;31729:3;31640:93;:::i;:::-;31758:2;31753:3;31749:12;31742:19;;31401:366;;;:::o;31773:419::-;31939:4;31977:2;31966:9;31962:18;31954:26;;32026:9;32020:4;32016:20;32012:1;32001:9;31997:17;31990:47;32054:131;32180:4;32054:131;:::i;:::-;32046:139;;31773:419;;;:::o;32198:250::-;32338:34;32334:1;32326:6;32322:14;32315:58;32407:33;32402:2;32394:6;32390:15;32383:58;32198:250;:::o;32454:366::-;32596:3;32617:67;32681:2;32676:3;32617:67;:::i;:::-;32610:74;;32693:93;32782:3;32693:93;:::i;:::-;32811:2;32806:3;32802:12;32795:19;;32454:366;;;:::o;32826:419::-;32992:4;33030:2;33019:9;33015:18;33007:26;;33079:9;33073:4;33069:20;33065:1;33054:9;33050:17;33043:47;33107:131;33233:4;33107:131;:::i;:::-;33099:139;;32826:419;;;:::o;33251:225::-;33391:34;33387:1;33379:6;33375:14;33368:58;33460:8;33455:2;33447:6;33443:15;33436:33;33251:225;:::o;33482:366::-;33624:3;33645:67;33709:2;33704:3;33645:67;:::i;:::-;33638:74;;33721:93;33810:3;33721:93;:::i;:::-;33839:2;33834:3;33830:12;33823:19;;33482:366;;;:::o;33854:419::-;34020:4;34058:2;34047:9;34043:18;34035:26;;34107:9;34101:4;34097:20;34093:1;34082:9;34078:17;34071:47;34135:131;34261:4;34135:131;:::i;:::-;34127:139;;33854:419;;;:::o;34279:120::-;34351:23;34368:5;34351:23;:::i;:::-;34344:5;34341:34;34331:62;;34389:1;34386;34379:12;34331:62;34279:120;:::o;34405:141::-;34461:5;34492:6;34486:13;34477:22;;34508:32;34534:5;34508:32;:::i;:::-;34405:141;;;;:::o;34552:349::-;34621:6;34670:2;34658:9;34649:7;34645:23;34641:32;34638:119;;;34676:79;;:::i;:::-;34638:119;34796:1;34821:63;34876:7;34867:6;34856:9;34852:22;34821:63;:::i;:::-;34811:73;;34767:127;34552:349;;;;:::o;34907:223::-;35047:34;35043:1;35035:6;35031:14;35024:58;35116:6;35111:2;35103:6;35099:15;35092:31;34907:223;:::o;35136:366::-;35278:3;35299:67;35363:2;35358:3;35299:67;:::i;:::-;35292:74;;35375:93;35464:3;35375:93;:::i;:::-;35493:2;35488:3;35484:12;35477:19;;35136:366;;;:::o;35508:419::-;35674:4;35712:2;35701:9;35697:18;35689:26;;35761:9;35755:4;35751:20;35747:1;35736:9;35732:17;35725:47;35789:131;35915:4;35789:131;:::i;:::-;35781:139;;35508:419;;;:::o;35933:221::-;36073:34;36069:1;36061:6;36057:14;36050:58;36142:4;36137:2;36129:6;36125:15;36118:29;35933:221;:::o;36160:366::-;36302:3;36323:67;36387:2;36382:3;36323:67;:::i;:::-;36316:74;;36399:93;36488:3;36399:93;:::i;:::-;36517:2;36512:3;36508:12;36501:19;;36160:366;;;:::o;36532:419::-;36698:4;36736:2;36725:9;36721:18;36713:26;;36785:9;36779:4;36775:20;36771:1;36760:9;36756:17;36749:47;36813:131;36939:4;36813:131;:::i;:::-;36805:139;;36532:419;;;:::o;36957:233::-;37097:34;37093:1;37085:6;37081:14;37074:58;37166:16;37161:2;37153:6;37149:15;37142:41;36957:233;:::o;37196:366::-;37338:3;37359:67;37423:2;37418:3;37359:67;:::i;:::-;37352:74;;37435:93;37524:3;37435:93;:::i;:::-;37553:2;37548:3;37544:12;37537:19;;37196:366;;;:::o;37568:419::-;37734:4;37772:2;37761:9;37757:18;37749:26;;37821:9;37815:4;37811:20;37807:1;37796:9;37792:17;37785:47;37849:131;37975:4;37849:131;:::i;:::-;37841:139;;37568:419;;;:::o;37993:194::-;38033:4;38053:20;38071:1;38053:20;:::i;:::-;38048:25;;38087:20;38105:1;38087:20;:::i;:::-;38082:25;;38131:1;38128;38124:9;38116:17;;38155:1;38149:4;38146:11;38143:37;;;38160:18;;:::i;:::-;38143:37;37993:194;;;;:::o;38193:220::-;38333:34;38329:1;38321:6;38317:14;38310:58;38402:3;38397:2;38389:6;38385:15;38378:28;38193:220;:::o;38419:366::-;38561:3;38582:67;38646:2;38641:3;38582:67;:::i;:::-;38575:74;;38658:93;38747:3;38658:93;:::i;:::-;38776:2;38771:3;38767:12;38760:19;;38419:366;;;:::o;38791:419::-;38957:4;38995:2;38984:9;38980:18;38972:26;;39044:9;39038:4;39034:20;39030:1;39019:9;39015:17;39008:47;39072:131;39198:4;39072:131;:::i;:::-;39064:139;;38791:419;;;:::o;39216:375::-;39255:3;39274:19;39291:1;39274:19;:::i;:::-;39269:24;;39307:19;39324:1;39307:19;:::i;:::-;39302:24;;39349:1;39346;39342:9;39335:16;;39547:1;39542:3;39538:11;39531:19;39527:1;39524;39520:9;39516:35;39499:1;39494:3;39490:11;39485:1;39482;39478:9;39471:17;39467:35;39451:110;39448:136;;;39564:18;;:::i;:::-;39448:136;39216:375;;;;:::o;39597:191::-;39637:3;39656:20;39674:1;39656:20;:::i;:::-;39651:25;;39690:20;39708:1;39690:20;:::i;:::-;39685:25;;39733:1;39730;39726:9;39719:16;;39754:3;39751:1;39748:10;39745:36;;;39761:18;;:::i;:::-;39745:36;39597:191;;;;:::o;39794:177::-;39934:29;39930:1;39922:6;39918:14;39911:53;39794:177;:::o;39977:366::-;40119:3;40140:67;40204:2;40199:3;40140:67;:::i;:::-;40133:74;;40216:93;40305:3;40216:93;:::i;:::-;40334:2;40329:3;40325:12;40318:19;;39977:366;;;:::o;40349:419::-;40515:4;40553:2;40542:9;40538:18;40530:26;;40602:9;40596:4;40592:20;40588:1;40577:9;40573:17;40566:47;40630:131;40756:4;40630:131;:::i;:::-;40622:139;;40349:419;;;:::o;40774:147::-;40869:45;40908:5;40869:45;:::i;:::-;40864:3;40857:58;40774:147;;:::o;40927:348::-;41056:4;41094:2;41083:9;41079:18;41071:26;;41107:79;41183:1;41172:9;41168:17;41159:6;41107:79;:::i;:::-;41196:72;41264:2;41253:9;41249:18;41240:6;41196:72;:::i;:::-;40927:348;;;;;:::o;41281:181::-;41421:33;41417:1;41409:6;41405:14;41398:57;41281:181;:::o;41468:366::-;41610:3;41631:67;41695:2;41690:3;41631:67;:::i;:::-;41624:74;;41707:93;41796:3;41707:93;:::i;:::-;41825:2;41820:3;41816:12;41809:19;;41468:366;;;:::o;41840:419::-;42006:4;42044:2;42033:9;42029:18;42021:26;;42093:9;42087:4;42083:20;42079:1;42068:9;42064:17;42057:47;42121:131;42247:4;42121:131;:::i;:::-;42113:139;;41840:419;;;:::o;42265:372::-;42304:4;42324:19;42341:1;42324:19;:::i;:::-;42319:24;;42357:19;42374:1;42357:19;:::i;:::-;42352:24;;42400:1;42397;42393:9;42385:17;;42594:1;42588:4;42584:12;42580:1;42577;42573:9;42569:28;42552:1;42546:4;42542:12;42537:1;42534;42530:9;42523:17;42519:36;42503:104;42500:130;;;42610:18;;:::i;:::-;42500:130;42265:372;;;;:::o;42643:220::-;42783:34;42779:1;42771:6;42767:14;42760:58;42852:3;42847:2;42839:6;42835:15;42828:28;42643:220;:::o;42869:366::-;43011:3;43032:67;43096:2;43091:3;43032:67;:::i;:::-;43025:74;;43108:93;43197:3;43108:93;:::i;:::-;43226:2;43221:3;43217:12;43210:19;;42869:366;;;:::o;43241:419::-;43407:4;43445:2;43434:9;43430:18;43422:26;;43494:9;43488:4;43484:20;43480:1;43469:9;43465:17;43458:47;43522:131;43648:4;43522:131;:::i;:::-;43514:139;;43241:419;;;:::o

Swarm Source

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