ETH Price: $3,331.42 (-1.28%)
 
Transaction Hash
Method
Block
From
To
Disassemble152591212022-08-01 21:37:57883 days ago1659389877IN
0x6Bc3F65F...e4B404752
0 ETH0.0340889119.35503156
Disassemble152236042022-07-27 9:04:13888 days ago1658912653IN
0x6Bc3F65F...e4B404752
0 ETH0.015087688.56649912
Disassemble143173092022-03-04 0:42:451034 days ago1646354565IN
0x6Bc3F65F...e4B404752
0 ETH0.0510745829.00521173
Disassemble143172852022-03-04 0:39:091034 days ago1646354349IN
0x6Bc3F65F...e4B404752
0 ETH0.056354632.00444377
Disassemble141728432022-02-09 16:01:181056 days ago1644422478IN
0x6Bc3F65F...e4B404752
0 ETH0.2794109158.67721576
Assemble141371612022-02-04 3:48:081062 days ago1643946488IN
0x6Bc3F65F...e4B404752
1.0588974 ETH0.1194372990.35766473
Assemble141370122022-02-04 3:15:201062 days ago1643944520IN
0x6Bc3F65F...e4B404752
1.05829321 ETH0.1097803381.99121961
Assemble139828252022-01-11 7:21:511086 days ago1641885711IN
0x6Bc3F65F...e4B404752
0.3018503 ETH0.17985751134.32948959
Disassemble139342982022-01-03 19:08:181093 days ago1641236898IN
0x6Bc3F65F...e4B404752
0 ETH0.00679853113.5
Disassemble138648902021-12-24 1:28:251104 days ago1640309305IN
0x6Bc3F65F...e4B404752
0 ETH0.139301279.26388395
Disassemble138648742021-12-24 1:25:041104 days ago1640309104IN
0x6Bc3F65F...e4B404752
0 ETH0.0219584583.14445576
Disassemble138648592021-12-24 1:21:541104 days ago1640308914IN
0x6Bc3F65F...e4B404752
0 ETH0.02840689107.50822638
Disassemble138648542021-12-24 1:19:381104 days ago1640308778IN
0x6Bc3F65F...e4B404752
0 ETH0.002358289.24818102
Disassemble138648492021-12-24 1:17:591104 days ago1640308679IN
0x6Bc3F65F...e4B404752
0 ETH0.0024635293.23410369
Assemble135678002021-11-07 6:24:301151 days ago1636266270IN
0x6Bc3F65F...e4B404752
1.00616504 ETH0.1057430578.97708458
Disassemble134789662021-10-24 7:55:391165 days ago1635062139IN
0x6Bc3F65F...e4B404752
0 ETH0.0813536246.29446187
Grant Role133969162021-10-11 11:05:371177 days ago1633950337IN
0x6Bc3F65F...e4B404752
0 ETH0.0039047176.00269177
Assemble133624272021-10-06 1:22:171183 days ago1633483337IN
0x6Bc3F65F...e4B404752
2.0124689 ETH0.1293662596.62071717
Disassemble132168422021-09-13 10:32:461205 days ago1631529166IN
0x6Bc3F65F...e4B404752
0 ETH0.0846868748.41294196
Assemble132166632021-09-13 9:53:021205 days ago1631526782IN
0x6Bc3F65F...e4B404752
4.02565057 ETH0.0698050252.1357471
Disassemble131722522021-09-06 12:47:011212 days ago1630932421IN
0x6Bc3F65F...e4B404752
0 ETH0.1410396979.55148552
Assemble131596412021-09-04 14:08:181214 days ago1630764498IN
0x6Bc3F65F...e4B404752
5.03255989 ETH0.16453053124.47376097
Assemble131596142021-09-04 14:00:341214 days ago1630764034IN
0x6Bc3F65F...e4B404752
2.01247333 ETH0.1236676393.08865845
Assemble131471172021-09-02 15:33:591216 days ago1630596839IN
0x6Bc3F65F...e4B404752
1.0061428 ETH0.00532657177.55234232
Assemble131158182021-08-28 19:29:111221 days ago1630178951IN
0x6Bc3F65F...e4B404752
0.41350251 ETH0.067032150.0647228
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block
From
To
152591212022-08-01 21:37:57883 days ago1659389877
0x6Bc3F65F...e4B404752
0.20749675 ETH
152591212022-08-01 21:37:57883 days ago1659389877
0x6Bc3F65F...e4B404752
0.00062436 ETH
152591212022-08-01 21:37:57883 days ago1659389877
0x6Bc3F65F...e4B404752
0.00904135 ETH
152591212022-08-01 21:37:57883 days ago1659389877
0x6Bc3F65F...e4B404752
0.04417832 ETH
152591212022-08-01 21:37:57883 days ago1659389877
0x6Bc3F65F...e4B404752
0.00887413 ETH
152591212022-08-01 21:37:57883 days ago1659389877
0x6Bc3F65F...e4B404752
0.01062706 ETH
152591212022-08-01 21:37:57883 days ago1659389877
0x6Bc3F65F...e4B404752
0.0541398 ETH
152591212022-08-01 21:37:57883 days ago1659389877
0x6Bc3F65F...e4B404752
0.03409965 ETH
152591212022-08-01 21:37:57883 days ago1659389877
0x6Bc3F65F...e4B404752
0.01952439 ETH
152591212022-08-01 21:37:57883 days ago1659389877
0x6Bc3F65F...e4B404752
0.02763637 ETH
152236042022-07-27 9:04:13888 days ago1658912653
0x6Bc3F65F...e4B404752
0.47263101 ETH
152236042022-07-27 9:04:13888 days ago1658912653
0x6Bc3F65F...e4B404752
0.00142215 ETH
152236042022-07-27 9:04:13888 days ago1658912653
0x6Bc3F65F...e4B404752
0.0202243 ETH
152236042022-07-27 9:04:13888 days ago1658912653
0x6Bc3F65F...e4B404752
0.09666272 ETH
152236042022-07-27 9:04:13888 days ago1658912653
0x6Bc3F65F...e4B404752
0.02164227 ETH
152236042022-07-27 9:04:13888 days ago1658912653
0x6Bc3F65F...e4B404752
0.02371943 ETH
152236042022-07-27 9:04:13888 days ago1658912653
0x6Bc3F65F...e4B404752
0.12182487 ETH
152236042022-07-27 9:04:13888 days ago1658912653
0x6Bc3F65F...e4B404752
0.0818123 ETH
152236042022-07-27 9:04:13888 days ago1658912653
0x6Bc3F65F...e4B404752
0.0443905 ETH
152236042022-07-27 9:04:13888 days ago1658912653
0x6Bc3F65F...e4B404752
0.06377675 ETH
143173092022-03-04 0:42:451034 days ago1646354565
0x6Bc3F65F...e4B404752
0.18630502 ETH
143173092022-03-04 0:42:451034 days ago1646354565
0x6Bc3F65F...e4B404752
0.00056059 ETH
143173092022-03-04 0:42:451034 days ago1646354565
0x6Bc3F65F...e4B404752
0.00918653 ETH
143173092022-03-04 0:42:451034 days ago1646354565
0x6Bc3F65F...e4B404752
0.02732984 ETH
143173092022-03-04 0:42:451034 days ago1646354565
0x6Bc3F65F...e4B404752
0.01105931 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
ClusterToken

Compiler Version
v0.8.6+commit.11564f7e

Optimization Enabled:
Yes with 99999 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-08-26
*/

// SPDX-License-Identifier: MIT
pragma solidity 0.8.6;

/*
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

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

/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * We have followed general OpenZeppelin guidelines: functions revert instead
 * of returning `false` on failure. This behavior is nonetheless conventional
 * and does not conflict with the expectations of ERC20 applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */

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

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

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

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

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

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

/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
    using Address for address;

    function safeTransfer(
        IERC20 token,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(
        IERC20 token,
        address from,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    /**
     * @dev Deprecated. This function has issues similar to the ones found in
     * {IERC20-approve}, and its usage is discouraged.
     *
     * Whenever possible, use {safeIncreaseAllowance} and
     * {safeDecreaseAllowance} instead.
     */
    function safeApprove(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        require(
            (value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function safeIncreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        uint256 newAllowance = token.allowance(address(this), spender) + value;
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        unchecked {
            uint256 oldAllowance = token.allowance(address(this), spender);
            require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
            uint256 newAllowance = oldAllowance - value;
            _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
        }
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

        bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
        if (returndata.length > 0) {
            // Return data is optional
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}


/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 *
 * _Available since v4.1._
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

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

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}



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

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @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);

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

        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue);
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        uint256 currentAllowance = _allowances[_msgSender()][spender];
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(_msgSender(), spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    /**
     * @dev Moves `amount` of tokens from `sender` to `recipient`.
     *
     * This 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);

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

        emit Transfer(sender, recipient, amount);

        _afterTokenTransfer(sender, recipient, amount);
    }

    /** @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 += amount;
        _balances[account] += amount;
        emit Transfer(address(0), account, amount);

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

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

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

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

    /**
     * @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 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 {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * has been transferred to `to`.
     * - when `from` is zero, `amount` tokens have been minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens have been 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 _afterTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}
}

/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        require(!paused(), "Pausable: paused");
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        require(paused(), "Pausable: not paused");
        _;
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

/**
 * @dev External interface of AccessControl declared to support ERC165 detection.
 */
interface IAccessControl {
    function hasRole(bytes32 role, address account) external view returns (bool);

    function getRoleAdmin(bytes32 role) external view returns (bytes32);

    function grantRole(bytes32 role, address account) external;

    function revokeRole(bytes32 role, address account) external;

    function renounceRole(bytes32 role, address account) external;
}

/**
 * @dev Contract module that allows children to implement role-based access
 * control mechanisms. This is a lightweight version that doesn't allow enumerating role
 * members except through off-chain means by accessing the contract event logs. Some
 * applications may benefit from on-chain enumerability, for those cases see
 * {AccessControlEnumerable}.
 *
 * Roles are referred to by their `bytes32` identifier. These should be exposed
 * in the external API and be unique. The best way to achieve this is by
 * using `public constant` hash digests:
 *
 * ```
 * bytes32 public constant MY_ROLE = keccak256("MY_ROLE");
 * ```
 *
 * Roles can be used to represent a set of permissions. To restrict access to a
 * function call, use {hasRole}:
 *
 * ```
 * function foo() public {
 *     require(hasRole(MY_ROLE, msg.sender));
 *     ...
 * }
 * ```
 *
 * Roles can be granted and revoked dynamically via the {grantRole} and
 * {revokeRole} functions. Each role has an associated admin role, and only
 * accounts that have a role's admin role can call {grantRole} and {revokeRole}.
 *
 * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means
 * that only accounts with this role will be able to grant or revoke other
 * roles. More complex role relationships can be created by using
 * {_setRoleAdmin}.
 *
 * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to
 * grant and revoke this role. Extra precautions should be taken to secure
 * accounts that have been granted it.
 */
abstract contract AccessControl is Context, IAccessControl, ERC165 {
    struct RoleData {
        mapping(address => bool) members;
        bytes32 adminRole;
    }

    mapping(bytes32 => RoleData) private _roles;

    bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;

    /**
     * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`
     *
     * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite
     * {RoleAdminChanged} not being emitted signaling this.
     *
     * _Available since v3.1._
     */
    event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);

    /**
     * @dev Emitted when `account` is granted `role`.
     *
     * `sender` is the account that originated the contract call, an admin role
     * bearer except when using {_setupRole}.
     */
    event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Emitted when `account` is revoked `role`.
     *
     * `sender` is the account that originated the contract call:
     *   - if using `revokeRole`, it is the admin role bearer
     *   - if using `renounceRole`, it is the role bearer (i.e. `account`)
     */
    event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Modifier that checks that an account has a specific role. Reverts
     * with a standardized message including the required role.
     *
     * The format of the revert reason is given by the following regular expression:
     *
     *  /^AccessControl: account (0x[0-9a-f]{20}) is missing role (0x[0-9a-f]{32})$/
     *
     * _Available since v4.1._
     */
    modifier onlyRole(bytes32 role) {
        _checkRole(role, _msgSender());
        _;
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId);
    }

    /**
     * @dev Returns `true` if `account` has been granted `role`.
     */
    function hasRole(bytes32 role, address account) public view override returns (bool) {
        return _roles[role].members[account];
    }

    /**
     * @dev Revert with a standard message if `account` is missing `role`.
     *
     * The format of the revert reason is given by the following regular expression:
     *
     *  /^AccessControl: account (0x[0-9a-f]{20}) is missing role (0x[0-9a-f]{32})$/
     */
    function _checkRole(bytes32 role, address account) internal view {
        if (!hasRole(role, account)) {
            revert(
                string(
                    abi.encodePacked(
                        "AccessControl: account ",
                        Strings.toHexString(uint160(account), 20),
                        " is missing role ",
                        Strings.toHexString(uint256(role), 32)
                    )
                )
            );
        }
    }

    /**
     * @dev Returns the admin role that controls `role`. See {grantRole} and
     * {revokeRole}.
     *
     * To change a role's admin, use {_setRoleAdmin}.
     */
    function getRoleAdmin(bytes32 role) public view override returns (bytes32) {
        return _roles[role].adminRole;
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
        _grantRole(role, account);
    }

    /**
     * @dev Revokes `role` from `account`.
     *
     * If `account` had been granted `role`, emits a {RoleRevoked} event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
        _revokeRole(role, account);
    }

    /**
     * @dev Revokes `role` from the calling account.
     *
     * Roles are often managed via {grantRole} and {revokeRole}: this function's
     * purpose is to provide a mechanism for accounts to lose their privileges
     * if they are compromised (such as when a trusted device is misplaced).
     *
     * If the calling account had been granted `role`, emits a {RoleRevoked}
     * event.
     *
     * Requirements:
     *
     * - the caller must be `account`.
     */
    function renounceRole(bytes32 role, address account) public virtual override {
        require(account == _msgSender(), "AccessControl: can only renounce roles for self");

        _revokeRole(role, account);
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event. Note that unlike {grantRole}, this function doesn't perform any
     * checks on the calling account.
     *
     * [WARNING]
     * ====
     * This function should only be called from the constructor when setting
     * up the initial roles for the system.
     *
     * Using this function in any other way is effectively circumventing the admin
     * system imposed by {AccessControl}.
     * ====
     */
    function _setupRole(bytes32 role, address account) internal virtual {
        _grantRole(role, account);
    }

    /**
     * @dev Sets `adminRole` as ``role``'s admin role.
     *
     * Emits a {RoleAdminChanged} event.
     */
    function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {
        emit RoleAdminChanged(role, getRoleAdmin(role), adminRole);
        _roles[role].adminRole = adminRole;
    }

    function _grantRole(bytes32 role, address account) private {
        if (!hasRole(role, account)) {
            _roles[role].members[account] = true;
            emit RoleGranted(role, account, _msgSender());
        }
    }

    function _revokeRole(bytes32 role, address account) private {
        if (hasRole(role, account)) {
            _roles[role].members[account] = false;
            emit RoleRevoked(role, account, _msgSender());
        }
    }
}

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

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

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) private pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

interface IController {
    function getClusterAmountFromEth(uint256 _ethAmount, address _cluster) external view returns (uint256);

    function addClusterToRegister(address indexAddr) external;

    function getDHVPriceInETH(address _cluster) external view returns (uint256);

    function getUnderlyingsInfo(address _cluster, uint256 _ethAmount)
        external
        view
        returns (
            uint256[] memory,
            uint256[] memory,
            uint256,
            uint256
        );

    function getUnderlyingsAmountsFromClusterAmount(uint256 _clusterAmount, address _clusterAddress) external view returns (uint256[] memory);

    function getEthAmountFromUnderlyingsAmounts(uint256[] memory _underlyingsAmounts, address _cluster) external view returns (uint256);

    function adapters(address _cluster) external view returns (address);

    function dhvTokenInstance() external view returns (address);

    function getDepositComission(address _cluster, uint256 _ethValue) external view returns (uint256);

    function getRedeemComission(address _cluster, uint256 _ethValue) external view returns (uint256);

    function getClusterPrice(address _cluster) external view returns (uint256);
}

interface IDexAdapter {
    function swapETHToUnderlying(address underlying, uint256 underlyingAmount) external payable;

    function swapUnderlyingsToETH(uint256[] memory underlyingAmounts, address[] memory underlyings) external;

    function swapTokenToToken(
        uint256 _amountToSwap,
        address _tokenToSwap,
        address _tokenToReceive
    ) external returns (uint256);

    function getUnderlyingAmount(
        uint256 _amount,
        address _tokenToSwap,
        address _tokenToReceive
    ) external view returns (uint256);

    function getPath(address _tokenToSwap, address _tokenToReceive) external view returns (address[] memory);

    function getTokensPrices(address[] memory _tokens) external view returns (uint256[] memory);

    function getEthPrice() external view returns (uint256);

    function getDHVPriceInETH(address _dhvToken) external view returns (uint256);

    function WETH() external view returns (address);

    function getEthAmountWithSlippage(uint256 _amount, address _tokenToSwap) external view returns (uint256);
}

interface IClusterToken {
    function assemble(uint256 clusterAmount, bool coverDhvWithEth) external payable returns (uint256);

    function disassemble(uint256 indexAmount, bool coverDhvWithEth) external;

    function withdrawToAccumulation(uint256 _clusterAmount) external;

    function refundFromAccumulation(uint256 _clusterAmount) external;

    function returnDebtFromAccumulation(uint256[] calldata _amounts, uint256 _clusterAmount) external;

    function optimizeProportion(uint256[] memory updatedShares) external returns (uint256[] memory debt);

    function getUnderlyingInCluster() external view returns (uint256[] calldata);

    function getUnderlyings() external view returns (address[] calldata);

    function getUnderlyingBalance(address _underlying) external view returns (uint256);

    function getUnderlyingsAmountsFromClusterAmount(uint256 _clusterAmount) external view returns (uint256[] calldata);

    function clusterTokenLock() external view returns (uint256);

    function clusterLock(address _token) external view returns (uint256);

    function controllerChange(address) external;

    function assembleByAdapter(uint256 _clusterAmount) external;

    function disassembleByAdapter(uint256 _clusterAmount) external;
}

interface IClusterTokenEvents {
    /// @notice Event emitted on each successful deposit for cluster in ETH.
    /// @param clusterAddress Address of cluster deposited upon.
    /// @param buyer Address of user depositing (user who bought token).
    /// @param ethDeposited Amount of ETH deposited in exchange of cluster.
    /// @param clusterAmountBought Amount of cluster bought for given amount of ETH.
    event ClusterAssembledInETH(address indexed clusterAddress, address indexed buyer, uint256 ethDeposited, uint256 clusterAmountBought);
    /// @notice Event emitted on each successful cluster redeeming for ETH.
    /// @param clusterAddress Address of cluster redeemed.
    /// @param redeemer Address of user performing the redeem.
    /// @param clusterAmountRedeemed Amount of cluster redeemed by user.
    event ClusterDisassembledInETH(address indexed clusterAddress, address indexed redeemer, uint256 clusterAmountRedeemed);

    /// @notice Event emitted on each successful deposit for cluster in ETH.
    /// @param clusterAddress Address of cluster deposited upon.
    /// @param buyer Address of user depositing (user who bought token).
    /// @param clusterAmountBought Amount of cluster bought for given amount of ETH.
    event ClusterAssembled(address indexed clusterAddress, address indexed buyer, uint256 clusterAmountBought);
    /// @notice Event emitted on each successful cluster redeeming for ETH.
    /// @param clusterAddress Address of cluster redeemed.
    /// @param redeemer Address of user performing the redeem.
    /// @param clusterAmountRedeemed Amount of cluster redeemed by user.
    event ClusterDisassembled(address indexed clusterAddress, address indexed redeemer, uint256 clusterAmountRedeemed);

    /// @notice Event emitted when tokens are withdrawn to accumulation.
    /// @param clusterAddress Address of cluster, withdrawn from.
    /// @param farmer Address of authorized farmer.
    /// @param clusterAmount Amount of cluster tokens to lock for farming.
    /// @param underlyingsAmounts Amount of underlying tokens, sent to farm.
    /// @param tokens Addresses of underlying tokens, sent to farm.
    event ClusterWithdrawnToAcc(
        address indexed clusterAddress,
        address indexed farmer,
        uint256 clusterAmount,
        uint256[] underlyingsAmounts,
        address[] tokens
    );
    /// @notice Event emitted when tokens are refunded from accumulation.
    /// @param clusterAddress Address of cluster, refunded for.
    /// @param farmer Address of authorized farmer.
    /// @param clusterAmount Amount of cluster tokens to unlock from farming.
    /// @param underlyingsAmounts Amount of underlying tokens, unlocked from farm.
    /// @param tokens Addresses of underlying tokens, unlocked from farm.
    event ClusterRefundedFromAcc(
        address indexed clusterAddress,
        address indexed farmer,
        uint256 clusterAmount,
        uint256[] underlyingsAmounts,
        address[] tokens
    );
    /// @notice Event emitted on optimizing underlyings proportions.
    /// @param clusterAddress Address of cluster, proportions are optimized for.
    /// @param delegate Address of authorized delegate.
    /// @param updatedShares New shares.
    event ProportionsOptimized(address indexed clusterAddress, address indexed delegate, uint256[] updatedShares);
}

/// @title Cluster Token Contract
/// @author Blaize.tech team
/// @notice Cluster Token is a ERC-20 token representing a DeHive cluster of DeFi assets
contract ClusterToken is ERC20, Pausable, AccessControl, IClusterToken, IClusterTokenEvents {
    using SafeERC20 for IERC20;
    using Address for address;

    bytes32 public constant FARMER_ROLE = keccak256("FARMER_ROLE");
    bytes32 public constant DELEGATE_ROLE = keccak256("DELEGATE_ROLE");
    bytes32 public constant ADAPTER_ROLE = keccak256("ADAPTER_ROLE");

    /// @notice Coefficient decimal for underlyings proportion
    uint256 public constant ACCURACY_DECIMALS = 10**6;
    /// @notice cluster Tokens decimals
    uint256 public constant CLUSTER_TOKEN_DECIMALS = 10**18;

    uint256 public constant MAX_COOLDOWN = 2 days;

    /// @notice amount of ETH dust allowed to be sent to the user
    uint256 public constant DUST_AMOUNT = 10**12;

    /// @notice Address of Controller smart contract.
    address public clusterControllerAddress;
    /// @notice Address of treasury with token reserves and comissions storage.
    address internal treasuryAddress;
    /// @notice Instance of the DHV token
    IERC20 public dhvTokenInstance;
    /// @notice Hash id, serves as an additional identifier of the cluster.
    uint256 public clusterHashId;

    /// @notice lock period, during which user can't redeem or transfer cluster after assemble
    uint256 public cooldownPeriod;
    /// @notice List of tokens within the cluster, called underlyings.
    /// @dev Order of addresses is important, as it corresponds with the order in underlyingInCluster.
    address[] public underlyings;
    /// @notice List of shares, multiplied by 10 ** 6
    /// @dev Order of addresses is important, as it corresponds with the order of tokens in underlyings.
    uint256[] public underlyingInCluster;

    /// @notice Amount of cluster token activated (sent to farming)
    uint256 public override clusterTokenLock;
    /// @notice Amounts of underlyings activated (sent to farming)
    mapping(address => uint256) public override clusterLock;

    /// @notice timestamp, before which user can't redeem or transfer cluster.
    /// @dev userAddress => uint.
    mapping(address => uint256) public cooldownTimestamps;

    /// @notice amount of cluster which user can't redeem or transfer due to cooldown.
    /// @dev userAddress => cluster amount.
    mapping(address => uint256) public cooldownAmount;

    /// @notice Checks that lock period on redeeming or transfering cluster is over.
    modifier checkCooldownPeriod(address _from, uint256 _amount) {
        if (cooldownTimestamps[_from] > block.timestamp) {
            uint256 allowedAmount = IERC20(address(this)).balanceOf(_from) - cooldownAmount[_from];
            require(allowedAmount >= _amount, "Cooldown in progress");
        }
        _;
    }

    modifier checkBuyer() {
        require(!_msgSender().isContract(), "Not allowed for contracts");
        _;
    }

    /// @notice Performs initial setup.
    /// @param _clusterControllerAddress Address of the Controller SC.
    /// @param _underlyings List of tokens to be recorded in underlyings.
    /// @param _underlyingInCluster List of shares to be recorded in underlyingInCluster.
    /// @param _name Name of the ERC-20 token.
    /// @param _symbol Symbol of the ERC-20 token.
    /// @param _hashId cluster hash identifier.
    constructor(
        address _clusterControllerAddress,
        address _treasury,
        address[] memory _underlyings,
        uint256[] memory _underlyingInCluster,
        string memory _name,
        string memory _symbol,
        uint256 _hashId
    ) ERC20(_name, _symbol) {
        require(_clusterControllerAddress != address(0), "dev: Controller zero address");
        require(_treasury != address(0), "dev: Treasury zero address");
        require(_underlyings.length == _underlyingInCluster.length, "dev: Arrays' lengths must be equal");
        for (uint256 i = 0; i < _underlyings.length; i++) {
            require(_underlyings[i] != address(0), "dev: Underlying zero address");
            require(_underlyingInCluster[i] > 0, "dev: Share equals zero");
        }
        _setupRole(DEFAULT_ADMIN_ROLE, _msgSender());

        underlyings = _underlyings;
        underlyingInCluster = _underlyingInCluster;
        clusterHashId = _hashId;
        clusterControllerAddress = _clusterControllerAddress;
        treasuryAddress = _treasury;

        dhvTokenInstance = IERC20(IController(_clusterControllerAddress).dhvTokenInstance());
    }

    receive() external payable {}

    /**********
     * ADMIN INTERFACE
     **********/

    /// @notice Function that allows contract owner to update cooldown period on cluster redeeming and transfering.
    /// @param _cooldownPeriod New lock period.
    function setCooldownPeriod(uint256 _cooldownPeriod) external onlyRole(DEFAULT_ADMIN_ROLE) {
        require(_cooldownPeriod <= MAX_COOLDOWN, "Incorrect cooldown");
        cooldownPeriod = _cooldownPeriod;
    }

    /// @notice Function that allows contract owner to update treasury address;
    /// @param _newTreasury Address of new treasury.
    function setTreasuryAddress(address _newTreasury) external onlyRole(DEFAULT_ADMIN_ROLE) {
        require(_newTreasury != address(0), "Incorrect address");
        treasuryAddress = _newTreasury;
    }

    /// @notice withdraws all ETH stucked or kept as dust
    function withdrawDust() external onlyRole(DEFAULT_ADMIN_ROLE) {
        Address.sendValue(payable(_msgSender()), address(this).balance);
    }

    /// @notice Function pauses assemble, dissamble, transfers.
    function pause() external onlyRole(DEFAULT_ADMIN_ROLE) {
        _pause();
    }

    /// @notice Function unpauses assemble, dissamble, transfers.
    function unpause() external onlyRole(DEFAULT_ADMIN_ROLE) {
        _unpause();
    }

    /// @notice Controller ownership transfer.
    function controllerChange(address _controller) external override {
        require(_msgSender() == clusterControllerAddress, "Controller only");
        require(_controller != address(0), "dev: Controller zero address");
        clusterControllerAddress = _controller;
    }

    /**********
     * USER'S INTERFACE
     **********/

    /// @notice Function that allows depositing ETH and purchase respective amount of cluster.
    /// @dev Can only be called when token is not paused.
    /// @param coverDhvWithEth Should DHV to cover commission be purchased during the call,
    /// rather then transferred from the caller's address.
    /// @return Amount of cluster purchased.
    function assemble(uint256 clusterAmount, bool coverDhvWithEth) external payable override whenNotPaused checkBuyer returns (uint256) {
        uint256 balanceBefore = address(this).balance;
        _swapEthToUnderlyings(msg.value, clusterAmount);
        uint256 balanceAfter = address(this).balance;

        uint256 ethSpent = balanceBefore - balanceAfter;

        uint256 _ethCommission = IController(clusterControllerAddress).getDepositComission(address(this), ethSpent);
        uint256 ethAmount = msg.value - ethSpent - _coverCommission(_ethCommission, coverDhvWithEth);

        if (ethAmount > DUST_AMOUNT) {
            Address.sendValue(payable(_msgSender()), ethAmount);
        }

        if (cooldownPeriod > 0) {
            if (cooldownTimestamps[_msgSender()] > block.timestamp) {
                cooldownAmount[_msgSender()] += clusterAmount;
            } else {
                cooldownAmount[_msgSender()] = clusterAmount;
            }
            cooldownTimestamps[_msgSender()] = block.timestamp + cooldownPeriod;
        }

        _mint(_msgSender(), clusterAmount);
        emit ClusterAssembledInETH(address(this), _msgSender(), ethSpent, clusterAmount);

        return clusterAmount;
    }

    /// @notice Function that allows disassembling cluster and receiving respective amount of ETH.
    /// @dev Can only be called when token is not paused.
    /// @param _clusterAmount Amount of cluster to be redeemed, e.g. exchanged to ETH equivalent.
    /// @param coverDhvWithEth Should DHV to cover commission be purchased during the call,
    /// rather then transferred from the caller's address.
    function disassemble(uint256 _clusterAmount, bool coverDhvWithEth)
        external
        override
        whenNotPaused
        checkCooldownPeriod(_msgSender(), _clusterAmount)
        checkBuyer
    {
        require(_clusterAmount > 0 && _clusterAmount <= balanceOf(_msgSender()), "Not enough cluster");
        _burn(_msgSender(), _clusterAmount);

        uint256[] memory underlyingAmounts = getUnderlyingsAmountsFromClusterAmount(_clusterAmount);

        uint256 balanceBefore = address(this).balance;
        _swapUnderlyingsToEth(underlyingAmounts);
        uint256 balanceAfter = address(this).balance;

        uint256 ethEstimated = balanceAfter - balanceBefore;
        uint256 _ethCommission = IController(clusterControllerAddress).getRedeemComission(address(this), ethEstimated);
        uint256 ethAmount = ethEstimated - _coverCommission(_ethCommission, coverDhvWithEth);

        Address.sendValue(payable(_msgSender()), ethAmount);
        emit ClusterDisassembledInETH(address(this), _msgSender(), _clusterAmount);
    }

    /// @dev Standard ERC20 function override in order to check lock period.
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal override checkCooldownPeriod(from, amount) {}

    /**********
     * FARMER AND DELEGATE INTERFACE
     **********/

    /// @notice Mints tokens for the contract with minter role.
    /// @notice requires approved amounts of underlyings
    /// @param _clusterAmount Cluster token amount to be minted.
    function assembleByAdapter(uint256 _clusterAmount) external override onlyRole(ADAPTER_ROLE) {
        uint256[] memory underlyingAmounts = getUnderlyingsAmountsFromClusterAmount(_clusterAmount);

        for (uint256 i = 0; i < underlyingAmounts.length; i++) {
            IERC20(underlyings[i]).safeTransferFrom(_msgSender(), address(this), underlyingAmounts[i]);
        }

        _mint(_msgSender(), _clusterAmount);

        emit ClusterAssembled(address(this), _msgSender(), _clusterAmount);
    }

    /// @notice Burns cluster tokens after the trade.
    /// @notice requires underlyings to be present
    /// @param _clusterAmount Cluster token amount to be minted.
    function disassembleByAdapter(uint256 _clusterAmount) external override onlyRole(ADAPTER_ROLE) {
        uint256[] memory underlyingAmounts = getUnderlyingsAmountsFromClusterAmount(_clusterAmount);

        _burn(_msgSender(), _clusterAmount);

        for (uint256 i = 0; i < underlyingAmounts.length; i++) {
            IERC20(underlyings[i]).safeTransfer(_msgSender(), underlyingAmounts[i]);
        }

        emit ClusterDisassembled(address(this), _msgSender(), _clusterAmount);
    }

    /// @notice Withdraw tokens of cluster for staking.
    /// @param _clusterAmount Amounts of the cluster locked for farming.
    function withdrawToAccumulation(uint256 _clusterAmount) external override onlyRole(FARMER_ROLE) {
        uint256[] memory _amounts = getUnderlyingsAmountsFromClusterAmount(_clusterAmount);

        clusterTokenLock += _clusterAmount;
        for (uint256 i = 0; i < underlyings.length; i++) {
            clusterLock[underlyings[i]] += _amounts[i];
            IERC20(underlyings[i]).safeTransfer(_msgSender(), _amounts[i]);
        }

        emit ClusterWithdrawnToAcc(address(this), _msgSender(), _clusterAmount, _amounts, underlyings);
    }

    /// @notice Refund tokens of cluster from staking.
    /// @param _clusterAmount Amount of cluster unlocked from farming.
    function refundFromAccumulation(uint256 _clusterAmount) external override onlyRole(FARMER_ROLE) {
        uint256[] memory _amounts = getUnderlyingsAmountsFromClusterAmount(_clusterAmount);

        clusterTokenLock -= _clusterAmount;
        for (uint256 i = 0; i < underlyings.length; i++) {
            clusterLock[underlyings[i]] -= _amounts[i];
            IERC20(underlyings[i]).safeTransferFrom(_msgSender(), address(this), _amounts[i]);
        }

        emit ClusterRefundedFromAcc(address(this), _msgSender(), _clusterAmount, _amounts, underlyings);
    }

    /// @notice Extra method to return debt.
    /// @param _amounts Amount of underlyings to return.
    /// @param _clusterAmount Amount of cluster unlocked from farming.
    function returnDebtFromAccumulation(uint256[] memory _amounts, uint256 _clusterAmount) external override onlyRole(FARMER_ROLE) {
        clusterTokenLock -= _clusterAmount;

        for (uint256 i = 0; i < underlyings.length; i++) {
            clusterLock[underlyings[i]] -= _amounts[i];
            IERC20(underlyings[i]).safeTransferFrom(_msgSender(), address(this), _amounts[i]);
        }

        emit ClusterRefundedFromAcc(address(this), _msgSender(), _clusterAmount, _amounts, underlyings);
    }

    /// @notice Interface for optimizer for the correction of the underlyings proportion.
    /// @param updatedShares New weights.
    function optimizeProportion(uint256[] memory updatedShares) external override onlyRole(DELEGATE_ROLE) returns (uint256[] memory debt) {
        require(updatedShares.length == underlyingInCluster.length, "Wrong array");
        debt = new uint256[](underlyings.length);

        uint256 clusterTokenLockMemo = clusterTokenLock;
        uint256[] memory curSharesAmounts = IController(clusterControllerAddress).getUnderlyingsAmountsFromClusterAmount(
            totalSupply() - clusterTokenLockMemo,
            address(this)
        );
        underlyingInCluster = updatedShares;
        uint256[] memory newSharesAmounts = getUnderlyingsAmountsFromClusterAmount(totalSupply() - clusterTokenLockMemo);
        uint256[] memory newLock = getUnderlyingsAmountsFromClusterAmount(clusterTokenLockMemo);

        for (uint256 i = 0; i < underlyings.length; i++) {
            address tkn = underlyings[i];

            if (newLock[i] > clusterLock[tkn]) {
                debt[i] = newLock[i] - clusterLock[tkn];
            } else {
                debt[i] = 0;
            }
            clusterLock[tkn] = newLock[i];

            if (curSharesAmounts[i] > newSharesAmounts[i]) {
                IERC20(tkn).safeTransfer(_msgSender(), curSharesAmounts[i] - newSharesAmounts[i]);
            } else if (curSharesAmounts[i] < newSharesAmounts[i]) {
                IERC20(tkn).safeTransferFrom(_msgSender(), address(this), newSharesAmounts[i] - curSharesAmounts[i]);
            }
        }
        emit ProportionsOptimized(address(this), _msgSender(), updatedShares);
    }

    /**********
     * VIEW INTERFACE
     **********/

    /// @notice Get list of underlyings addresses for the cluster.
    /// @return underlyings array.
    function getUnderlyings() external view override returns (address[] memory) {
        return underlyings;
    }

    /// @notice Get list of amount of each underlying for 1 cluster.
    /// @return underlyingInCluster array.
    function getUnderlyingInCluster() external view override returns (uint256[] memory) {
        return underlyingInCluster;
    }

    /// @notice Calculates amounts of underlyings over the amount of cluster based on shares amounts.
    /// @param _clusterAmount Amount of cluster to calculate underlyings from.
    /// @return Array, which contains amounts of underlyings.
    function getUnderlyingsAmountsFromClusterAmount(uint256 _clusterAmount) public view override returns (uint256[] memory) {
        uint256[] memory underlyingAmounts = new uint256[](underlyings.length);
        for (uint256 i = 0; i < underlyings.length; i++) {
            underlyingAmounts[i] = (_clusterAmount * underlyingInCluster[i]) / ACCURACY_DECIMALS;
            uint8 decimals = IERC20Metadata(underlyings[i]).decimals();
            if (decimals < 18) {
                underlyingAmounts[i] /= 10**(18 - decimals);
            }
        }
        return underlyingAmounts;
    }

    /// @notice Calculates amount of underlying including locked assets.
    /// @param _underlyingAddress Underlying address.
    /// @return The amount of a certain underlying
    function getUnderlyingBalance(address _underlyingAddress) external view override returns (uint256) {
        return IERC20(_underlyingAddress).balanceOf(address(this)) + clusterLock[_underlyingAddress];
    }

    /**********
     * INTERNAL HELPERS AND PRICE CALCULATIONS
     **********/

    /// @notice Covers commission, necessary for cluster deposit or redeem.
    /// @param _ethCommission Commission in ETH to be covered.
    /// @param coverDhvWithEth Should DHV to cover commission be purchased during the call,
    /// rather then transferred from the caller's address.
    /// @return Amount of Ether, spent on commission.
    function _coverCommission(uint256 _ethCommission, bool coverDhvWithEth) internal returns (uint256) {
        if (_ethCommission != 0) {
            if (coverDhvWithEth) {
                Address.sendValue(payable(treasuryAddress), _ethCommission);
                return _ethCommission;
            } else {
                uint256 _dhvCommission = (_ethCommission * 10**18) / IController(clusterControllerAddress).getDHVPriceInETH(address(this));
                dhvTokenInstance.safeTransferFrom(_msgSender(), treasuryAddress, _dhvCommission);
                return 0;
            }
        }
        return 0;
    }

    /// @notice Allows to swap collected funds into underlyings through the appropriate adapter.
    function _swapEthToUnderlyings(uint256 _ethAmount, uint256 _clusterAmount) internal {
        address adapter = IController(clusterControllerAddress).adapters(address(this));

        (uint256[] memory underlyingAmounts, uint256[] memory ethPortion, , uint256 ethCalculated) = IController(clusterControllerAddress)
            .getUnderlyingsInfo(address(this), _clusterAmount);

        require(_ethAmount >= ethCalculated, "Not enough ether sent");

        for (uint256 i = 0; i < underlyings.length; i++) {
            if (
                IERC20(underlyings[i]).balanceOf(treasuryAddress) >= underlyingAmounts[i] &&
                IERC20(underlyings[i]).allowance(treasuryAddress, address(this)) >= underlyingAmounts[i]
            ) {
                IERC20(underlyings[i]).safeTransferFrom(treasuryAddress, address(this), underlyingAmounts[i]);
                Address.sendValue(payable(treasuryAddress), ethPortion[i]);
            } else {
                IDexAdapter(adapter).swapETHToUnderlying{value: ethPortion[i]}(underlyings[i], underlyingAmounts[i]);
            }
        }
    }

    /// @notice Swaps underlyings tokens into ETH.
    /// @param _underlyingAmounts Array of underlying tokens amounts.
    function _swapUnderlyingsToEth(uint256[] memory _underlyingAmounts) internal {
        address adapter = IController(clusterControllerAddress).adapters(address(this));
        for (uint256 i = 0; i < _underlyingAmounts.length; i++) {
            IERC20(underlyings[i]).safeApprove(adapter, 0);
            IERC20(underlyings[i]).safeApprove(adapter, _underlyingAmounts[i]);
        }

        IDexAdapter(adapter).swapUnderlyingsToETH(_underlyingAmounts, underlyings);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_clusterControllerAddress","type":"address"},{"internalType":"address","name":"_treasury","type":"address"},{"internalType":"address[]","name":"_underlyings","type":"address[]"},{"internalType":"uint256[]","name":"_underlyingInCluster","type":"uint256[]"},{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint256","name":"_hashId","type":"uint256"}],"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":"clusterAddress","type":"address"},{"indexed":true,"internalType":"address","name":"buyer","type":"address"},{"indexed":false,"internalType":"uint256","name":"clusterAmountBought","type":"uint256"}],"name":"ClusterAssembled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"clusterAddress","type":"address"},{"indexed":true,"internalType":"address","name":"buyer","type":"address"},{"indexed":false,"internalType":"uint256","name":"ethDeposited","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"clusterAmountBought","type":"uint256"}],"name":"ClusterAssembledInETH","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"clusterAddress","type":"address"},{"indexed":true,"internalType":"address","name":"redeemer","type":"address"},{"indexed":false,"internalType":"uint256","name":"clusterAmountRedeemed","type":"uint256"}],"name":"ClusterDisassembled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"clusterAddress","type":"address"},{"indexed":true,"internalType":"address","name":"redeemer","type":"address"},{"indexed":false,"internalType":"uint256","name":"clusterAmountRedeemed","type":"uint256"}],"name":"ClusterDisassembledInETH","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"clusterAddress","type":"address"},{"indexed":true,"internalType":"address","name":"farmer","type":"address"},{"indexed":false,"internalType":"uint256","name":"clusterAmount","type":"uint256"},{"indexed":false,"internalType":"uint256[]","name":"underlyingsAmounts","type":"uint256[]"},{"indexed":false,"internalType":"address[]","name":"tokens","type":"address[]"}],"name":"ClusterRefundedFromAcc","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"clusterAddress","type":"address"},{"indexed":true,"internalType":"address","name":"farmer","type":"address"},{"indexed":false,"internalType":"uint256","name":"clusterAmount","type":"uint256"},{"indexed":false,"internalType":"uint256[]","name":"underlyingsAmounts","type":"uint256[]"},{"indexed":false,"internalType":"address[]","name":"tokens","type":"address[]"}],"name":"ClusterWithdrawnToAcc","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"clusterAddress","type":"address"},{"indexed":true,"internalType":"address","name":"delegate","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"updatedShares","type":"uint256[]"}],"name":"ProportionsOptimized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"ACCURACY_DECIMALS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ADAPTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CLUSTER_TOKEN_DECIMALS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DELEGATE_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DUST_AMOUNT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FARMER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_COOLDOWN","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":"uint256","name":"clusterAmount","type":"uint256"},{"internalType":"bool","name":"coverDhvWithEth","type":"bool"}],"name":"assemble","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_clusterAmount","type":"uint256"}],"name":"assembleByAdapter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"clusterControllerAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"clusterHashId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"clusterLock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"clusterTokenLock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_controller","type":"address"}],"name":"controllerChange","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"cooldownAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cooldownPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"cooldownTimestamps","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":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"dhvTokenInstance","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_clusterAmount","type":"uint256"},{"internalType":"bool","name":"coverDhvWithEth","type":"bool"}],"name":"disassemble","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_clusterAmount","type":"uint256"}],"name":"disassembleByAdapter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_underlyingAddress","type":"address"}],"name":"getUnderlyingBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getUnderlyingInCluster","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getUnderlyings","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_clusterAmount","type":"uint256"}],"name":"getUnderlyingsAmountsFromClusterAmount","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"updatedShares","type":"uint256[]"}],"name":"optimizeProportion","outputs":[{"internalType":"uint256[]","name":"debt","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_clusterAmount","type":"uint256"}],"name":"refundFromAccumulation","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"},{"internalType":"uint256","name":"_clusterAmount","type":"uint256"}],"name":"returnDebtFromAccumulation","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cooldownPeriod","type":"uint256"}],"name":"setCooldownPeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newTreasury","type":"address"}],"name":"setTreasuryAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"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":"uint256","name":"","type":"uint256"}],"name":"underlyingInCluster","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"underlyings","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawDust","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_clusterAmount","type":"uint256"}],"name":"withdrawToAccumulation","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040523480156200001157600080fd5b50604051620059b6380380620059b6833981016040819052620000349162000750565b8251839083906200004d90600390602085019062000454565b5080516200006390600490602084019062000454565b50506005805460ff19169055506001600160a01b038716620000cc5760405162461bcd60e51b815260206004820152601c60248201527f6465763a20436f6e74726f6c6c6572207a65726f20616464726573730000000060448201526064015b60405180910390fd5b6001600160a01b038616620001245760405162461bcd60e51b815260206004820152601a60248201527f6465763a205472656173757279207a65726f20616464726573730000000000006044820152606401620000c3565b8351855114620001825760405162461bcd60e51b815260206004820152602260248201527f6465763a2041727261797327206c656e67746873206d75737420626520657175604482015261185b60f21b6064820152608401620000c3565b60005b8551811015620002935760006001600160a01b0316868281518110620001af57620001af620008f9565b60200260200101516001600160a01b03161415620002105760405162461bcd60e51b815260206004820152601c60248201527f6465763a20556e6465726c79696e67207a65726f2061646472657373000000006044820152606401620000c3565b6000858281518110620002275762000227620008f9565b6020026020010151116200027e5760405162461bcd60e51b815260206004820152601660248201527f6465763a20536861726520657175616c73207a65726f000000000000000000006044820152606401620000c3565b806200028a81620008cf565b91505062000185565b50620002a1600033620003a0565b8451620002b690600c906020880190620004e3565b508351620002cc90600d9060208701906200053b565b50600a819055600780546001600160a01b03808a166001600160a01b0319928316811790935560088054918a16919092161790556040805163583a0f9d60e11b8152905163b0741f3a91600480820192602092909190829003018186803b1580156200033757600080fd5b505afa1580156200034c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200037291906200072b565b600980546001600160a01b0319166001600160a01b0392909216919091179055506200092595505050505050565b620003ac8282620003b0565b5050565b60008281526006602090815260408083206001600160a01b038516845290915290205460ff16620003ac5760008281526006602090815260408083206001600160a01b03851684529091529020805460ff19166001179055620004103390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b828054620004629062000892565b90600052602060002090601f016020900481019282620004865760008555620004d1565b82601f10620004a157805160ff1916838001178555620004d1565b82800160010185558215620004d1579182015b82811115620004d1578251825591602001919060010190620004b4565b50620004df92915062000578565b5090565b828054828255906000526020600020908101928215620004d1579160200282015b82811115620004d157825182546001600160a01b0319166001600160a01b0390911617825560209092019160019091019062000504565b828054828255906000526020600020908101928215620004d15791602002820182811115620004d1578251825591602001919060010190620004b4565b5b80821115620004df576000815560010162000579565b80516001600160a01b0381168114620005a757600080fd5b919050565b600082601f830112620005be57600080fd5b81516020620005d7620005d1836200086c565b62000839565b80838252828201915082860187848660051b8901011115620005f857600080fd5b60005b8581101562000622576200060f826200058f565b84529284019290840190600101620005fb565b5090979650505050505050565b600082601f8301126200064157600080fd5b8151602062000654620005d1836200086c565b80838252828201915082860187848660051b89010111156200067557600080fd5b60005b85811015620006225781518452928401929084019060010162000678565b600082601f830112620006a857600080fd5b81516001600160401b03811115620006c457620006c46200090f565b6020620006da601f8301601f1916820162000839565b8281528582848701011115620006ef57600080fd5b60005b838110156200070f578581018301518282018401528201620006f2565b83811115620007215760008385840101525b5095945050505050565b6000602082840312156200073e57600080fd5b62000749826200058f565b9392505050565b600080600080600080600060e0888a0312156200076c57600080fd5b62000777886200058f565b965062000787602089016200058f565b60408901519096506001600160401b0380821115620007a557600080fd5b620007b38b838c01620005ac565b965060608a0151915080821115620007ca57600080fd5b620007d88b838c016200062f565b955060808a0151915080821115620007ef57600080fd5b620007fd8b838c0162000696565b945060a08a01519150808211156200081457600080fd5b50620008238a828b0162000696565b92505060c0880151905092959891949750929550565b604051601f8201601f191681016001600160401b03811182821017156200086457620008646200090f565b604052919050565b60006001600160401b038211156200088857620008886200090f565b5060051b60200190565b600181811c90821680620008a757607f821691505b60208210811415620008c957634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415620008f257634e487b7160e01b600052601160045260246000fd5b5060010190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b61508180620009356000396000f3fe6080604052600436106103585760003560e01c80638456cb59116101bb578063b0741f3a116100f7578063d547741f11610095578063f0d23e8f1161006f578063f0d23e8f14610a55578063f394397014610a75578063f48f30ac14610aa9578063f65baefa14610ad657600080fd5b8063d547741f146109c2578063dd62ed3e146109e2578063ebe3391314610a3557600080fd5b8063c0ba241b116100d1578063c0ba241b14610942578063cea0252e14610976578063cfb550f114610996578063d031b0be146109ab57600080fd5b8063b0741f3a146108ec578063b63ad23e14610919578063bd5a14ee1461092f57600080fd5b8063953a6b97116101645780639bb1bebb1161013e5780639bb1bebb14610877578063a217fddf14610897578063a457c2d7146108ac578063a9059cbb146108cc57600080fd5b8063953a6b971461082957806395d89b411461084957806397f641ab1461085e57600080fd5b80638e98a220116101955780638e98a2201461078957806390f5fe78146107a957806391d14854146107d657600080fd5b80638456cb59146107305780638973fcc8146107455780638b41d35f1461077257600080fd5b80632f3422ce116102955780636605bfda11610233578063731b383c1161020d578063731b383c1461067e5780637bba46d01461069e5780637eea3400146106be57806380ea3de11461071057600080fd5b80636605bfda146105fb5780636c91fefa1461061b57806370a082311461063b57600080fd5b806336aaa5fd1161026f57806336aaa5fd1461059857806339509351146105ae5780633f4ba83a146105ce5780635c975abb146105e357600080fd5b80632f3422ce14610540578063313ce5671461055c57806336568abe1461057857600080fd5b806317c424c21161030257806323b872dd116102dc57806323b872dd146104b0578063248a9ca3146104d05780632d2e8677146105005780632f2ff15d1461052057600080fd5b806317c424c21461045957806318160ddd1461047b5780631c29078c1461049057600080fd5b806304646a491161033357806304646a491461040157806306fdde0314610417578063095ea7b31461043957600080fd5b806270fd991461036457806301ffc9a71461038f57806302a882e6146103bf57600080fd5b3661035f57005b600080fd5b34801561037057600080fd5b50610379610af8565b6040516103869190614b72565b60405180910390f35b34801561039b57600080fd5b506103af6103aa366004614952565b610b50565b6040519015158152602001610386565b3480156103cb57600080fd5b506103f37fdbeb657137b1822b3d5418bea6fd641226d964b4c3871ef23546db262225887181565b604051908152602001610386565b34801561040d57600080fd5b506103f3600b5481565b34801561042357600080fd5b5061042c610be9565b6040516103869190614bb3565b34801561044557600080fd5b506103af6104543660046147a8565b610c72565b34801561046557600080fd5b50610479610474366004614914565b610c88565b005b34801561048757600080fd5b506002546103f3565b34801561049c57600080fd5b506103796104ab3660046147d4565b610d83565b3480156104bc57600080fd5b506103af6104cb366004614767565b61128c565b3480156104dc57600080fd5b506103f36104eb366004614914565b60009081526006602052604090206001015490565b34801561050c57600080fd5b506103f361051b366004614914565b611374565b34801561052c57600080fd5b5061047961053b36600461492d565b611395565b34801561054c57600080fd5b506103f3670de0b6b3a764000081565b34801561056857600080fd5b5060405160128152602001610386565b34801561058457600080fd5b5061047961059336600461492d565b6113c0565b3480156105a457600080fd5b506103f3600a5481565b3480156105ba57600080fd5b506103af6105c93660046147a8565b611473565b3480156105da57600080fd5b506104796114bc565b3480156105ef57600080fd5b5060055460ff166103af565b34801561060757600080fd5b506104796106163660046146f4565b6114d3565b34801561062757600080fd5b50610479610636366004614914565b6115a4565b34801561064757600080fd5b506103f36106563660046146f4565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b34801561068a57600080fd5b50610479610699366004614914565b6116ce565b3480156106aa57600080fd5b506104796106b9366004614914565b61184a565b3480156106ca57600080fd5b506007546106eb9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610386565b34801561071c57600080fd5b5061047961072b366004614914565b6118e8565b34801561073c57600080fd5b50610479611967565b34801561075157600080fd5b506103f36107603660046146f4565b60106020526000908152604090205481565b34801561077e57600080fd5b506103f36202a30081565b34801561079557600080fd5b506104796107a43660046146f4565b61197b565b3480156107b557600080fd5b506103f36107c43660046146f4565b60116020526000908152604090205481565b3480156107e257600080fd5b506103af6107f136600461492d565b600091825260066020908152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b34801561083557600080fd5b506104796108443660046148b2565b611ad6565b34801561085557600080fd5b5061042c611c01565b34801561086a57600080fd5b506103f364e8d4a5100081565b34801561088357600080fd5b50610379610892366004614914565b611c10565b3480156108a357600080fd5b506103f3600081565b3480156108b857600080fd5b506103af6108c73660046147a8565b611de3565b3480156108d857600080fd5b506103af6108e73660046147a8565b611ebb565b3480156108f857600080fd5b506009546106eb9073ffffffffffffffffffffffffffffffffffffffff1681565b34801561092557600080fd5b506103f3600e5481565b6103f361093d3660046149ad565b611ec8565b34801561094e57600080fd5b506103f37f1a82baf2b928242f69f7147fb92490c6288d044f7257b88817e6284f1eec0f1581565b34801561098257600080fd5b506106eb610991366004614914565b612194565b3480156109a257600080fd5b506104796121cb565b3480156109b757600080fd5b506103f3620f424081565b3480156109ce57600080fd5b506104796109dd36600461492d565b6121e1565b3480156109ee57600080fd5b506103f36109fd36600461472e565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b348015610a4157600080fd5b50610479610a503660046149ad565b612207565b348015610a6157600080fd5b506103f3610a703660046146f4565b6125e6565b348015610a8157600080fd5b506103f37f7c6181838a71a779e445600d4c6ecbe16bacf2b3c5bda69c29fada66d1b645d181565b348015610ab557600080fd5b506103f3610ac43660046146f4565b600f6020526000908152604090205481565b348015610ae257600080fd5b50610aeb61269f565b6040516103869190614b18565b6060600d805480602002602001604051908101604052809291908181526020018280548015610b4657602002820191906000526020600020905b815481526020019060010190808311610b32575b5050505050905090565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b000000000000000000000000000000000000000000000000000000001480610be357507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b606060038054610bf890614f01565b80601f0160208091040260200160405190810160405280929190818152602001828054610c2490614f01565b8015610b465780601f10610c4657610100808354040283529160200191610b46565b820191906000526020600020905b815481529060010190602001808311610c5457509395945050505050565b6000610c7f33848461270d565b50600192915050565b7fdbeb657137b1822b3d5418bea6fd641226d964b4c3871ef23546db2622258871610cb381336128b8565b6000610cbe83611c10565b905060005b8151811015610d3b57610d29335b30848481518110610ce457610ce4614fbd565b6020026020010151600c8581548110610cff57610cff614fbd565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff1692919061298a565b80610d3381614f55565b915050610cc3565b50610d463384612a6c565b604051838152339030907fdf882fbcb3ac2f616d4bab2db31dcedd61dd178b733bdaadc75d70525b2a1598906020015b60405180910390a3505050565b60607f1a82baf2b928242f69f7147fb92490c6288d044f7257b88817e6284f1eec0f15610db081336128b8565b600d54835114610e21576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f57726f6e6720617272617900000000000000000000000000000000000000000060448201526064015b60405180910390fd5b600c5467ffffffffffffffff811115610e3c57610e3c614fec565b604051908082528060200260200182016040528015610e65578160200160208202803683370190505b50600e546007549193509060009073ffffffffffffffffffffffffffffffffffffffff1663ffcf655e83610e9860025490565b610ea29190614e66565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b168152600481019190915230602482015260440160006040518083038186803b158015610ef757600080fd5b505afa158015610f0b573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052610f519190810190614809565b8551909150610f6790600d9060208801906145c2565b506000610f8183610f7760025490565b6108929190614e66565b90506000610f8e84611c10565b905060005b600c54811015611245576000600c8281548110610fb257610fb2614fbd565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff16808352600f909152604090912054845191925090849084908110610ffc57610ffc614fbd565b602002602001015111156110795773ffffffffffffffffffffffffffffffffffffffff81166000908152600f6020526040902054835184908490811061104457611044614fbd565b60200260200101516110569190614e66565b88838151811061106857611068614fbd565b60200260200101818152505061109a565b600088838151811061108d5761108d614fbd565b6020026020010181815250505b8282815181106110ac576110ac614fbd565b6020026020010151600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555083828151811061110957611109614fbd565b602002602001015185838151811061112357611123614fbd565b60200260200101511115611196576111913385848151811061114757611147614fbd565b602002602001015187858151811061116157611161614fbd565b60200260200101516111739190614e66565b73ffffffffffffffffffffffffffffffffffffffff84169190612b98565b611232565b8382815181106111a8576111a8614fbd565b60200260200101518583815181106111c2576111c2614fbd565b602002602001015110156112325761123233308785815181106111e7576111e7614fbd565b602002602001015187868151811061120157611201614fbd565b60200260200101516112139190614e66565b73ffffffffffffffffffffffffffffffffffffffff851692919061298a565b508061123d81614f55565b915050610f93565b50604051339030907f23430ac6054603925f82afae7cc6252190a47d0e5fa6b4ac67790c3b3e292eb89061127a908b90614b72565b60405180910390a35050505050919050565b6000611299848484612bee565b73ffffffffffffffffffffffffffffffffffffffff841660009081526001602090815260408083203384529091529020548281101561135a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206160448201527f6c6c6f77616e63650000000000000000000000000000000000000000000000006064820152608401610e18565b611367853385840361270d565b60019150505b9392505050565b600d818154811061138457600080fd5b600091825260209091200154905081565b6000828152600660205260409020600101546113b181336128b8565b6113bb8383612eac565b505050565b73ffffffffffffffffffffffffffffffffffffffff81163314611465576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c6600000000000000000000000000000000006064820152608401610e18565b61146f8282612fa0565b5050565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091610c7f9185906114b7908690614cac565b61270d565b60006114c881336128b8565b6114d061305b565b50565b60006114df81336128b8565b73ffffffffffffffffffffffffffffffffffffffff821661155c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f496e636f727265637420616464726573730000000000000000000000000000006044820152606401610e18565b50600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b7f7c6181838a71a779e445600d4c6ecbe16bacf2b3c5bda69c29fada66d1b645d16115cf81336128b8565b60006115da83611c10565b905082600e60008282546115ee9190614e66565b90915550600090505b600c548110156116945781818151811061161357611613614fbd565b6020026020010151600f6000600c848154811061163257611632614fbd565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff16835282019290925260400181208054909190611673908490614e66565b90915550611682905033610cd1565b8061168c81614f55565b9150506115f7565b50604051339030907fded8512602a42e2b340fdd5b806b1069a040da129f148c598f54cbe1eb64576190610d769087908690600c90614c04565b7f7c6181838a71a779e445600d4c6ecbe16bacf2b3c5bda69c29fada66d1b645d16116f981336128b8565b600061170483611c10565b905082600e60008282546117189190614cac565b90915550600090505b600c548110156118105781818151811061173d5761173d614fbd565b6020026020010151600f6000600c848154811061175c5761175c614fbd565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff1683528201929092526040018120805490919061179d908490614cac565b909155506117fe9050335b8383815181106117ba576117ba614fbd565b6020026020010151600c84815481106117d5576117d5614fbd565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff169190612b98565b8061180881614f55565b915050611721565b50604051339030907fc72d630122c8ed4fc97918baa82670432c4d36f10149924b98a8c410ad6b0a2b90610d769087908690600c90614c04565b7fdbeb657137b1822b3d5418bea6fd641226d964b4c3871ef23546db262225887161187581336128b8565b600061188083611c10565b905061188c338461313c565b60005b81518110156118b3576118a1336117a8565b806118ab81614f55565b91505061188f565b50604051838152339030907f0e519abb97b349157786738cedce344e2eabcd59b8b8c4990b1f4d0c035d9a3090602001610d76565b60006118f481336128b8565b6202a300821115611961576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f496e636f727265637420636f6f6c646f776e00000000000000000000000000006044820152606401610e18565b50600b55565b600061197381336128b8565b6114d0613335565b60075473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611a12576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f436f6e74726f6c6c6572206f6e6c7900000000000000000000000000000000006044820152606401610e18565b73ffffffffffffffffffffffffffffffffffffffff8116611a8f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f6465763a20436f6e74726f6c6c6572207a65726f2061646472657373000000006044820152606401610e18565b600780547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b7f7c6181838a71a779e445600d4c6ecbe16bacf2b3c5bda69c29fada66d1b645d1611b0181336128b8565b81600e6000828254611b139190614e66565b90915550600090505b600c54811015611bc757838181518110611b3857611b38614fbd565b6020026020010151600f6000600c8481548110611b5757611b57614fbd565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff16835282019290925260400181208054909190611b98908490614e66565b90915550611bb590503330868481518110610ce457610ce4614fbd565b80611bbf81614f55565b915050611b1c565b50604051339030907fded8512602a42e2b340fdd5b806b1069a040da129f148c598f54cbe1eb64576190610d769086908890600c90614c04565b606060048054610bf890614f01565b600c5460609060009067ffffffffffffffff811115611c3157611c31614fec565b604051908082528060200260200182016040528015611c5a578160200160208202803683370190505b50905060005b600c54811015611ddc57620f4240600d8281548110611c8157611c81614fbd565b906000526020600020015485611c979190614e29565b611ca19190614cc4565b828281518110611cb357611cb3614fbd565b6020026020010181815250506000600c8281548110611cd457611cd4614fbd565b60009182526020918290200154604080517f313ce567000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff9092169263313ce56792600480840193829003018186803b158015611d4357600080fd5b505afa158015611d57573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d7b91906149d2565b905060128160ff161015611dc957611d94816012614e7d565b611d9f90600a614d60565b838381518110611db157611db1614fbd565b60200260200101818151611dc59190614cc4565b9052505b5080611dd481614f55565b915050611c60565b5092915050565b33600090815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8616845290915281205482811015611ea4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610e18565b611eb1338585840361270d565b5060019392505050565b6000610c7f338484612bee565b6000611ed660055460ff1690565b15611f3d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610e18565b611f5e335b73ffffffffffffffffffffffffffffffffffffffff163b151590565b15611fc5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f4e6f7420616c6c6f77656420666f7220636f6e747261637473000000000000006044820152606401610e18565b47611fd034856133f5565b476000611fdd8284614e66565b6007546040517f01d5f4900000000000000000000000000000000000000000000000000000000081523060048201526024810183905291925060009173ffffffffffffffffffffffffffffffffffffffff909116906301d5f4909060440160206040518083038186803b15801561205357600080fd5b505afa158015612067573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061208b9190614994565b905060006120998288613948565b6120a38434614e66565b6120ad9190614e66565b905064e8d4a510008111156120c7576120c7335b82613a7e565b600b541561214157336000908152601060205260409020544210156121105733600090815260116020526040812080548a9290612105908490614cac565b909155506121239050565b3360009081526011602052604090208890555b600b546121309042614cac565b336000908152601060205260409020555b61214b3389612a6c565b60408051848152602081018a9052339130917f154f5ab3f8529ffdbb246fd1a63a2cce74c42c1b45bd6bbfad82bef2272be9c5910160405180910390a350959695505050505050565b600c81815481106121a457600080fd5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b60006121d781336128b8565b6114d03347613a7e565b6000828152600660205260409020600101546121fd81336128b8565b6113bb8383612fa0565b60055460ff1615612274576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610e18565b3360008181526010602052604090205483904210156123b65773ffffffffffffffffffffffffffffffffffffffff82166000818152601160205260408082205490517f70a082310000000000000000000000000000000000000000000000000000000081526004810193909352909130906370a082319060240160206040518083038186803b15801561230657600080fd5b505afa15801561231a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061233e9190614994565b6123489190614e66565b9050818110156123b4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f436f6f6c646f776e20696e2070726f67726573730000000000000000000000006044820152606401610e18565b505b6123bf33611f42565b15612426576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f4e6f7420616c6c6f77656420666f7220636f6e747261637473000000000000006044820152606401610e18565b60008411801561243e575061243a33610656565b8411155b6124a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f4e6f7420656e6f75676820636c757374657200000000000000000000000000006044820152606401610e18565b6124ae338561313c565b60006124b985611c10565b9050476124c582613bd8565b4760006124d28383614e66565b6007546040517f4c7ba3920000000000000000000000000000000000000000000000000000000081523060048201526024810183905291925060009173ffffffffffffffffffffffffffffffffffffffff90911690634c7ba3929060440160206040518083038186803b15801561254857600080fd5b505afa15801561255c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125809190614994565b9050600061258e828a613948565b6125989084614e66565b90506125a3336120c1565b6040518a8152339030907f2ced335a9d5d52c0e402f0cd99d473593830e0b3c1315c50a05c86c4afbd555f9060200160405180910390a350505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff81166000818152600f60205260408082205490517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152919290916370a082319060240160206040518083038186803b15801561265d57600080fd5b505afa158015612671573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126959190614994565b610be39190614cac565b6060600c805480602002602001604051908101604052809291908181526020018280548015610b4657602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff1681526001909101906020018083116126d9575050505050905090565b73ffffffffffffffffffffffffffffffffffffffff83166127af576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610e18565b73ffffffffffffffffffffffffffffffffffffffff8216612852576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610e18565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259101610d76565b600082815260066020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff1661146f576129108173ffffffffffffffffffffffffffffffffffffffff166014613d99565b61291b836020613d99565b60405160200161292c929190614a97565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f08c379a0000000000000000000000000000000000000000000000000000000008252610e1891600401614bb3565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052612a669085907f23b872dd00000000000000000000000000000000000000000000000000000000906084015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613fdc565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8216612ae9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610e18565b612af5600083836140e8565b8060026000828254612b079190614cac565b909155505073ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604081208054839290612b41908490614cac565b909155505060405181815273ffffffffffffffffffffffffffffffffffffffff8316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526113bb9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064016129e4565b73ffffffffffffffffffffffffffffffffffffffff8316612c91576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610e18565b73ffffffffffffffffffffffffffffffffffffffff8216612d34576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610e18565b612d3f8383836140e8565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015612df5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610e18565b73ffffffffffffffffffffffffffffffffffffffff808516600090815260208190526040808220858503905591851681529081208054849290612e39908490614cac565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051612e9f91815260200190565b60405180910390a3612a66565b600082815260066020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff1661146f57600082815260066020908152604080832073ffffffffffffffffffffffffffffffffffffffff85168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055612f423390565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b600082815260066020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff161561146f57600082815260066020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60055460ff166130c7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f5061757361626c653a206e6f74207061757365640000000000000000000000006044820152606401610e18565b600580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a1565b73ffffffffffffffffffffffffffffffffffffffff82166131df576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610e18565b6131eb826000836140e8565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260208190526040902054818110156132a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610e18565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604081208383039055600280548492906132dd908490614e66565b909155505060405182815260009073ffffffffffffffffffffffffffffffffffffffff8516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b60055460ff16156133a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610e18565b600580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586131123390565b6007546040517fe5711ffc00000000000000000000000000000000000000000000000000000000815230600482015260009173ffffffffffffffffffffffffffffffffffffffff169063e5711ffc9060240160206040518083038186803b15801561345f57600080fd5b505afa158015613473573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134979190614711565b6007546040517f60db72ef000000000000000000000000000000000000000000000000000000008152306004820152602481018590529192506000918291829173ffffffffffffffffffffffffffffffffffffffff909116906360db72ef9060440160006040518083038186803b15801561351157600080fd5b505afa158015613525573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261356b919081019061483e565b93505092509250808610156135dc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4e6f7420656e6f7567682065746865722073656e7400000000000000000000006044820152606401610e18565b60005b600c5481101561393f578381815181106135fb576135fb614fbd565b6020026020010151600c828154811061361657613616614fbd565b6000918252602090912001546008546040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff91821660048201529116906370a082319060240160206040518083038186803b15801561368c57600080fd5b505afa1580156136a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136c49190614994565b101580156137b157508381815181106136df576136df614fbd565b6020026020010151600c82815481106136fa576136fa614fbd565b6000918252602090912001546008546040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff918216600482015230602482015291169063dd62ed3e9060440160206040518083038186803b15801561377657600080fd5b505afa15801561378a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137ae9190614994565b10155b1561382e5760085484516137ea9173ffffffffffffffffffffffffffffffffffffffff16903090879085908110610ce457610ce4614fbd565b60085483516138299173ffffffffffffffffffffffffffffffffffffffff169085908490811061381c5761381c614fbd565b6020026020010151613a7e565b61392d565b8473ffffffffffffffffffffffffffffffffffffffff166337f324c984838151811061385c5761385c614fbd565b6020026020010151600c848154811061387757613877614fbd565b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168785815181106138b4576138b4614fbd565b60200260200101516040518463ffffffff1660e01b81526004016138fa92919073ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b6000604051808303818588803b15801561391357600080fd5b505af1158015613927573d6000803e3d6000fd5b50505050505b8061393781614f55565b9150506135df565b50505050505050565b60008215613a75578115613980576008546139799073ffffffffffffffffffffffffffffffffffffffff1684613a7e565b5081610be3565b6007546040517f4e4f30a200000000000000000000000000000000000000000000000000000000815230600482015260009173ffffffffffffffffffffffffffffffffffffffff1690634e4f30a29060240160206040518083038186803b1580156139ea57600080fd5b505afa1580156139fe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a229190614994565b613a3485670de0b6b3a7640000614e29565b613a3e9190614cc4565b9050613a6b3360085460095473ffffffffffffffffffffffffffffffffffffffff9081169291168461298a565b6000915050610be3565b50600092915050565b80471015613ae8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610e18565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114613b42576040519150601f19603f3d011682016040523d82523d6000602084013e613b47565b606091505b50509050806113bb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610e18565b6007546040517fe5711ffc00000000000000000000000000000000000000000000000000000000815230600482015260009173ffffffffffffffffffffffffffffffffffffffff169063e5711ffc9060240160206040518083038186803b158015613c4257600080fd5b505afa158015613c56573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c7a9190614711565b905060005b8251811015613d0d57613cca826000600c8481548110613ca157613ca1614fbd565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff169190614247565b613cfb82848381518110613ce057613ce0614fbd565b6020026020010151600c8481548110613ca157613ca1614fbd565b80613d0581614f55565b915050613c7f565b506040517f2457ff7300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff821690632457ff7390613d63908590600c90600401614b85565b600060405180830381600087803b158015613d7d57600080fd5b505af1158015613d91573d6000803e3d6000fd5b505050505050565b60606000613da8836002614e29565b613db3906002614cac565b67ffffffffffffffff811115613dcb57613dcb614fec565b6040519080825280601f01601f191660200182016040528015613df5576020820181803683370190505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110613e2c57613e2c614fbd565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110613e8f57613e8f614fbd565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506000613ecb846002614e29565b613ed6906001614cac565b90505b6001811115613f73577f303132333435363738396162636465660000000000000000000000000000000085600f1660108110613f1757613f17614fbd565b1a60f81b828281518110613f2d57613f2d614fbd565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060049490941c93613f6c81614ecc565b9050613ed9565b50831561136d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610e18565b600061403e826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166143d89092919063ffffffff16565b8051909150156113bb578080602001905181019061405c91906148f7565b6113bb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610e18565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260106020526040902054839082904210156142405773ffffffffffffffffffffffffffffffffffffffff82166000818152601160205260408082205490517f70a082310000000000000000000000000000000000000000000000000000000081526004810193909352909130906370a082319060240160206040518083038186803b15801561419257600080fd5b505afa1580156141a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906141ca9190614994565b6141d49190614e66565b905081811015613d91576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f436f6f6c646f776e20696e2070726f67726573730000000000000000000000006044820152606401610e18565b5050505050565b8015806142f657506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015284169063dd62ed3e9060440160206040518083038186803b1580156142bc57600080fd5b505afa1580156142d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906142f49190614994565b155b614382576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006064820152608401610e18565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526113bb9084907f095ea7b300000000000000000000000000000000000000000000000000000000906064016129e4565b60606143e784846000856143ef565b949350505050565b606082471015614481576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610e18565b843b6144e9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610e18565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516145129190614a7b565b60006040518083038185875af1925050503d806000811461454f576040519150601f19603f3d011682016040523d82523d6000602084013e614554565b606091505b509150915061456482828661456f565b979650505050505050565b6060831561457e57508161136d565b82511561458e5782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e189190614bb3565b8280548282559060005260206000209081019282156145fd579160200282015b828111156145fd5782518255916020019190600101906145e2565b5061460992915061460d565b5090565b5b80821115614609576000815560010161460e565b600082601f83011261463357600080fd5b8135602061464861464383614c88565b614c39565b80838252828201915082860187848660051b890101111561466857600080fd5b60005b858110156146875781358452928401929084019060010161466b565b5090979650505050505050565b600082601f8301126146a557600080fd5b815160206146b561464383614c88565b80838252828201915082860187848660051b89010111156146d557600080fd5b60005b85811015614687578151845292840192908401906001016146d8565b60006020828403121561470657600080fd5b813561136d8161501b565b60006020828403121561472357600080fd5b815161136d8161501b565b6000806040838503121561474157600080fd5b823561474c8161501b565b9150602083013561475c8161501b565b809150509250929050565b60008060006060848603121561477c57600080fd5b83356147878161501b565b925060208401356147978161501b565b929592945050506040919091013590565b600080604083850312156147bb57600080fd5b82356147c68161501b565b946020939093013593505050565b6000602082840312156147e657600080fd5b813567ffffffffffffffff8111156147fd57600080fd5b6143e784828501614622565b60006020828403121561481b57600080fd5b815167ffffffffffffffff81111561483257600080fd5b6143e784828501614694565b6000806000806080858703121561485457600080fd5b845167ffffffffffffffff8082111561486c57600080fd5b61487888838901614694565b9550602087015191508082111561488e57600080fd5b5061489b87828801614694565b604087015160609097015195989097509350505050565b600080604083850312156148c557600080fd5b823567ffffffffffffffff8111156148dc57600080fd5b6148e885828601614622565b95602094909401359450505050565b60006020828403121561490957600080fd5b815161136d8161503d565b60006020828403121561492657600080fd5b5035919050565b6000806040838503121561494057600080fd5b82359150602083013561475c8161501b565b60006020828403121561496457600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461136d57600080fd5b6000602082840312156149a657600080fd5b5051919050565b600080604083850312156149c057600080fd5b82359150602083013561475c8161503d565b6000602082840312156149e457600080fd5b815160ff8116811461136d57600080fd5b6000815480845260208085019450836000528060002060005b83811015614a4057815473ffffffffffffffffffffffffffffffffffffffff1687529582019560019182019101614a0e565b509495945050505050565b600081518084526020808501945080840160005b83811015614a4057815187529582019590820190600101614a5f565b60008251614a8d818460208701614ea0565b9190910192915050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351614acf816017850160208801614ea0565b7f206973206d697373696e6720726f6c65200000000000000000000000000000006017918401918201528351614b0c816028840160208801614ea0565b01602801949350505050565b6020808252825182820181905260009190848201906040850190845b81811015614b6657835173ffffffffffffffffffffffffffffffffffffffff1683529284019291840191600101614b34565b50909695505050505050565b60208152600061136d6020830184614a4b565b604081526000614b986040830185614a4b565b8281036020840152614baa81856149f5565b95945050505050565b6020815260008251806020840152614bd2816040850160208701614ea0565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b838152606060208201526000614c1d6060830185614a4b565b8281036040840152614c2f81856149f5565b9695505050505050565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715614c8057614c80614fec565b604052919050565b600067ffffffffffffffff821115614ca257614ca2614fec565b5060051b60200190565b60008219821115614cbf57614cbf614f8e565b500190565b600082614cfa577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b600181815b80851115614d5857817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115614d3e57614d3e614f8e565b80851615614d4b57918102915b93841c9390800290614d04565b509250929050565b600061136d60ff841683600082614d7957506001610be3565b81614d8657506000610be3565b8160018114614d9c5760028114614da657614dc2565b6001915050610be3565b60ff841115614db757614db7614f8e565b50506001821b610be3565b5060208310610133831016604e8410600b8410161715614de5575081810a610be3565b614def8383614cff565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115614e2157614e21614f8e565b029392505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614e6157614e61614f8e565b500290565b600082821015614e7857614e78614f8e565b500390565b600060ff821660ff841680821015614e9757614e97614f8e565b90039392505050565b60005b83811015614ebb578181015183820152602001614ea3565b83811115612a665750506000910152565b600081614edb57614edb614f8e565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b600181811c90821680614f1557607f821691505b60208210811415614f4f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614f8757614f87614f8e565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff811681146114d057600080fd5b80151581146114d057600080fdfea26469706673582212206b2bf8e126b17089260cb59bcfdd5b389dea1525b0558d0f9aa378589873611964736f6c63430008060033000000000000000000000000e806db0693788ec79d6c45a8934e0eaf94afa37e0000000000000000000000005bac8c443ebd0525364dc813005ab72956d3705d00000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000003200000000000000000000000000000000000000000000000000000000000000360ba45f90815b83f7defdd2f98edafb1c2fd8fe659d3ba865e735adb87c54636d600000000000000000000000000000000000000000000000000000000000000080000000000000000000000007fc66500c84a76ad7e9c93437bfc5ac33e2ddae9000000000000000000000000c00e94cb662c3520282e6f5717214004a7f26888000000000000000000000000d533a949740bb3306d119cc777fa900ba034cd52000000000000000000000000514910771af9ca656af840dff83e8264ecf986ca000000000000000000000000c011a73ee8576fb46f5e1c5751ca3b9fe0af2a6f0000000000000000000000006b3595068778dd592e39a122f4f5a5cf09c90fe20000000000000000000000001f9840a85d5af5bf1d1762f925bdaddc4201f984000000000000000000000000111111111117dc0aa78b770fa6a738034120c3020000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000007a120000000000000000000000000000000000000000000000000000000000008d9a00000000000000000000000000000000000000000000000000000000002afddc00000000000000000000000000000000000000000000000000000000000bd358000000000000000000000000000000000000000000000000000000000004e20000000000000000000000000000000000000000000000000000000000000a58ed000000000000000000000000000000000000000000000000000000000008d24d0000000000000000000000000000000000000000000000000000000000138ce2000000000000000000000000000000000000000000000000000000000000000084554482d436f726500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044445435200000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106103585760003560e01c80638456cb59116101bb578063b0741f3a116100f7578063d547741f11610095578063f0d23e8f1161006f578063f0d23e8f14610a55578063f394397014610a75578063f48f30ac14610aa9578063f65baefa14610ad657600080fd5b8063d547741f146109c2578063dd62ed3e146109e2578063ebe3391314610a3557600080fd5b8063c0ba241b116100d1578063c0ba241b14610942578063cea0252e14610976578063cfb550f114610996578063d031b0be146109ab57600080fd5b8063b0741f3a146108ec578063b63ad23e14610919578063bd5a14ee1461092f57600080fd5b8063953a6b97116101645780639bb1bebb1161013e5780639bb1bebb14610877578063a217fddf14610897578063a457c2d7146108ac578063a9059cbb146108cc57600080fd5b8063953a6b971461082957806395d89b411461084957806397f641ab1461085e57600080fd5b80638e98a220116101955780638e98a2201461078957806390f5fe78146107a957806391d14854146107d657600080fd5b80638456cb59146107305780638973fcc8146107455780638b41d35f1461077257600080fd5b80632f3422ce116102955780636605bfda11610233578063731b383c1161020d578063731b383c1461067e5780637bba46d01461069e5780637eea3400146106be57806380ea3de11461071057600080fd5b80636605bfda146105fb5780636c91fefa1461061b57806370a082311461063b57600080fd5b806336aaa5fd1161026f57806336aaa5fd1461059857806339509351146105ae5780633f4ba83a146105ce5780635c975abb146105e357600080fd5b80632f3422ce14610540578063313ce5671461055c57806336568abe1461057857600080fd5b806317c424c21161030257806323b872dd116102dc57806323b872dd146104b0578063248a9ca3146104d05780632d2e8677146105005780632f2ff15d1461052057600080fd5b806317c424c21461045957806318160ddd1461047b5780631c29078c1461049057600080fd5b806304646a491161033357806304646a491461040157806306fdde0314610417578063095ea7b31461043957600080fd5b806270fd991461036457806301ffc9a71461038f57806302a882e6146103bf57600080fd5b3661035f57005b600080fd5b34801561037057600080fd5b50610379610af8565b6040516103869190614b72565b60405180910390f35b34801561039b57600080fd5b506103af6103aa366004614952565b610b50565b6040519015158152602001610386565b3480156103cb57600080fd5b506103f37fdbeb657137b1822b3d5418bea6fd641226d964b4c3871ef23546db262225887181565b604051908152602001610386565b34801561040d57600080fd5b506103f3600b5481565b34801561042357600080fd5b5061042c610be9565b6040516103869190614bb3565b34801561044557600080fd5b506103af6104543660046147a8565b610c72565b34801561046557600080fd5b50610479610474366004614914565b610c88565b005b34801561048757600080fd5b506002546103f3565b34801561049c57600080fd5b506103796104ab3660046147d4565b610d83565b3480156104bc57600080fd5b506103af6104cb366004614767565b61128c565b3480156104dc57600080fd5b506103f36104eb366004614914565b60009081526006602052604090206001015490565b34801561050c57600080fd5b506103f361051b366004614914565b611374565b34801561052c57600080fd5b5061047961053b36600461492d565b611395565b34801561054c57600080fd5b506103f3670de0b6b3a764000081565b34801561056857600080fd5b5060405160128152602001610386565b34801561058457600080fd5b5061047961059336600461492d565b6113c0565b3480156105a457600080fd5b506103f3600a5481565b3480156105ba57600080fd5b506103af6105c93660046147a8565b611473565b3480156105da57600080fd5b506104796114bc565b3480156105ef57600080fd5b5060055460ff166103af565b34801561060757600080fd5b506104796106163660046146f4565b6114d3565b34801561062757600080fd5b50610479610636366004614914565b6115a4565b34801561064757600080fd5b506103f36106563660046146f4565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b34801561068a57600080fd5b50610479610699366004614914565b6116ce565b3480156106aa57600080fd5b506104796106b9366004614914565b61184a565b3480156106ca57600080fd5b506007546106eb9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610386565b34801561071c57600080fd5b5061047961072b366004614914565b6118e8565b34801561073c57600080fd5b50610479611967565b34801561075157600080fd5b506103f36107603660046146f4565b60106020526000908152604090205481565b34801561077e57600080fd5b506103f36202a30081565b34801561079557600080fd5b506104796107a43660046146f4565b61197b565b3480156107b557600080fd5b506103f36107c43660046146f4565b60116020526000908152604090205481565b3480156107e257600080fd5b506103af6107f136600461492d565b600091825260066020908152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b34801561083557600080fd5b506104796108443660046148b2565b611ad6565b34801561085557600080fd5b5061042c611c01565b34801561086a57600080fd5b506103f364e8d4a5100081565b34801561088357600080fd5b50610379610892366004614914565b611c10565b3480156108a357600080fd5b506103f3600081565b3480156108b857600080fd5b506103af6108c73660046147a8565b611de3565b3480156108d857600080fd5b506103af6108e73660046147a8565b611ebb565b3480156108f857600080fd5b506009546106eb9073ffffffffffffffffffffffffffffffffffffffff1681565b34801561092557600080fd5b506103f3600e5481565b6103f361093d3660046149ad565b611ec8565b34801561094e57600080fd5b506103f37f1a82baf2b928242f69f7147fb92490c6288d044f7257b88817e6284f1eec0f1581565b34801561098257600080fd5b506106eb610991366004614914565b612194565b3480156109a257600080fd5b506104796121cb565b3480156109b757600080fd5b506103f3620f424081565b3480156109ce57600080fd5b506104796109dd36600461492d565b6121e1565b3480156109ee57600080fd5b506103f36109fd36600461472e565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b348015610a4157600080fd5b50610479610a503660046149ad565b612207565b348015610a6157600080fd5b506103f3610a703660046146f4565b6125e6565b348015610a8157600080fd5b506103f37f7c6181838a71a779e445600d4c6ecbe16bacf2b3c5bda69c29fada66d1b645d181565b348015610ab557600080fd5b506103f3610ac43660046146f4565b600f6020526000908152604090205481565b348015610ae257600080fd5b50610aeb61269f565b6040516103869190614b18565b6060600d805480602002602001604051908101604052809291908181526020018280548015610b4657602002820191906000526020600020905b815481526020019060010190808311610b32575b5050505050905090565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b000000000000000000000000000000000000000000000000000000001480610be357507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b606060038054610bf890614f01565b80601f0160208091040260200160405190810160405280929190818152602001828054610c2490614f01565b8015610b465780601f10610c4657610100808354040283529160200191610b46565b820191906000526020600020905b815481529060010190602001808311610c5457509395945050505050565b6000610c7f33848461270d565b50600192915050565b7fdbeb657137b1822b3d5418bea6fd641226d964b4c3871ef23546db2622258871610cb381336128b8565b6000610cbe83611c10565b905060005b8151811015610d3b57610d29335b30848481518110610ce457610ce4614fbd565b6020026020010151600c8581548110610cff57610cff614fbd565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff1692919061298a565b80610d3381614f55565b915050610cc3565b50610d463384612a6c565b604051838152339030907fdf882fbcb3ac2f616d4bab2db31dcedd61dd178b733bdaadc75d70525b2a1598906020015b60405180910390a3505050565b60607f1a82baf2b928242f69f7147fb92490c6288d044f7257b88817e6284f1eec0f15610db081336128b8565b600d54835114610e21576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f57726f6e6720617272617900000000000000000000000000000000000000000060448201526064015b60405180910390fd5b600c5467ffffffffffffffff811115610e3c57610e3c614fec565b604051908082528060200260200182016040528015610e65578160200160208202803683370190505b50600e546007549193509060009073ffffffffffffffffffffffffffffffffffffffff1663ffcf655e83610e9860025490565b610ea29190614e66565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b168152600481019190915230602482015260440160006040518083038186803b158015610ef757600080fd5b505afa158015610f0b573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052610f519190810190614809565b8551909150610f6790600d9060208801906145c2565b506000610f8183610f7760025490565b6108929190614e66565b90506000610f8e84611c10565b905060005b600c54811015611245576000600c8281548110610fb257610fb2614fbd565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff16808352600f909152604090912054845191925090849084908110610ffc57610ffc614fbd565b602002602001015111156110795773ffffffffffffffffffffffffffffffffffffffff81166000908152600f6020526040902054835184908490811061104457611044614fbd565b60200260200101516110569190614e66565b88838151811061106857611068614fbd565b60200260200101818152505061109a565b600088838151811061108d5761108d614fbd565b6020026020010181815250505b8282815181106110ac576110ac614fbd565b6020026020010151600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555083828151811061110957611109614fbd565b602002602001015185838151811061112357611123614fbd565b60200260200101511115611196576111913385848151811061114757611147614fbd565b602002602001015187858151811061116157611161614fbd565b60200260200101516111739190614e66565b73ffffffffffffffffffffffffffffffffffffffff84169190612b98565b611232565b8382815181106111a8576111a8614fbd565b60200260200101518583815181106111c2576111c2614fbd565b602002602001015110156112325761123233308785815181106111e7576111e7614fbd565b602002602001015187868151811061120157611201614fbd565b60200260200101516112139190614e66565b73ffffffffffffffffffffffffffffffffffffffff851692919061298a565b508061123d81614f55565b915050610f93565b50604051339030907f23430ac6054603925f82afae7cc6252190a47d0e5fa6b4ac67790c3b3e292eb89061127a908b90614b72565b60405180910390a35050505050919050565b6000611299848484612bee565b73ffffffffffffffffffffffffffffffffffffffff841660009081526001602090815260408083203384529091529020548281101561135a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206160448201527f6c6c6f77616e63650000000000000000000000000000000000000000000000006064820152608401610e18565b611367853385840361270d565b60019150505b9392505050565b600d818154811061138457600080fd5b600091825260209091200154905081565b6000828152600660205260409020600101546113b181336128b8565b6113bb8383612eac565b505050565b73ffffffffffffffffffffffffffffffffffffffff81163314611465576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c6600000000000000000000000000000000006064820152608401610e18565b61146f8282612fa0565b5050565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091610c7f9185906114b7908690614cac565b61270d565b60006114c881336128b8565b6114d061305b565b50565b60006114df81336128b8565b73ffffffffffffffffffffffffffffffffffffffff821661155c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f496e636f727265637420616464726573730000000000000000000000000000006044820152606401610e18565b50600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b7f7c6181838a71a779e445600d4c6ecbe16bacf2b3c5bda69c29fada66d1b645d16115cf81336128b8565b60006115da83611c10565b905082600e60008282546115ee9190614e66565b90915550600090505b600c548110156116945781818151811061161357611613614fbd565b6020026020010151600f6000600c848154811061163257611632614fbd565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff16835282019290925260400181208054909190611673908490614e66565b90915550611682905033610cd1565b8061168c81614f55565b9150506115f7565b50604051339030907fded8512602a42e2b340fdd5b806b1069a040da129f148c598f54cbe1eb64576190610d769087908690600c90614c04565b7f7c6181838a71a779e445600d4c6ecbe16bacf2b3c5bda69c29fada66d1b645d16116f981336128b8565b600061170483611c10565b905082600e60008282546117189190614cac565b90915550600090505b600c548110156118105781818151811061173d5761173d614fbd565b6020026020010151600f6000600c848154811061175c5761175c614fbd565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff1683528201929092526040018120805490919061179d908490614cac565b909155506117fe9050335b8383815181106117ba576117ba614fbd565b6020026020010151600c84815481106117d5576117d5614fbd565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff169190612b98565b8061180881614f55565b915050611721565b50604051339030907fc72d630122c8ed4fc97918baa82670432c4d36f10149924b98a8c410ad6b0a2b90610d769087908690600c90614c04565b7fdbeb657137b1822b3d5418bea6fd641226d964b4c3871ef23546db262225887161187581336128b8565b600061188083611c10565b905061188c338461313c565b60005b81518110156118b3576118a1336117a8565b806118ab81614f55565b91505061188f565b50604051838152339030907f0e519abb97b349157786738cedce344e2eabcd59b8b8c4990b1f4d0c035d9a3090602001610d76565b60006118f481336128b8565b6202a300821115611961576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f496e636f727265637420636f6f6c646f776e00000000000000000000000000006044820152606401610e18565b50600b55565b600061197381336128b8565b6114d0613335565b60075473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611a12576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f436f6e74726f6c6c6572206f6e6c7900000000000000000000000000000000006044820152606401610e18565b73ffffffffffffffffffffffffffffffffffffffff8116611a8f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f6465763a20436f6e74726f6c6c6572207a65726f2061646472657373000000006044820152606401610e18565b600780547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b7f7c6181838a71a779e445600d4c6ecbe16bacf2b3c5bda69c29fada66d1b645d1611b0181336128b8565b81600e6000828254611b139190614e66565b90915550600090505b600c54811015611bc757838181518110611b3857611b38614fbd565b6020026020010151600f6000600c8481548110611b5757611b57614fbd565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff16835282019290925260400181208054909190611b98908490614e66565b90915550611bb590503330868481518110610ce457610ce4614fbd565b80611bbf81614f55565b915050611b1c565b50604051339030907fded8512602a42e2b340fdd5b806b1069a040da129f148c598f54cbe1eb64576190610d769086908890600c90614c04565b606060048054610bf890614f01565b600c5460609060009067ffffffffffffffff811115611c3157611c31614fec565b604051908082528060200260200182016040528015611c5a578160200160208202803683370190505b50905060005b600c54811015611ddc57620f4240600d8281548110611c8157611c81614fbd565b906000526020600020015485611c979190614e29565b611ca19190614cc4565b828281518110611cb357611cb3614fbd565b6020026020010181815250506000600c8281548110611cd457611cd4614fbd565b60009182526020918290200154604080517f313ce567000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff9092169263313ce56792600480840193829003018186803b158015611d4357600080fd5b505afa158015611d57573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d7b91906149d2565b905060128160ff161015611dc957611d94816012614e7d565b611d9f90600a614d60565b838381518110611db157611db1614fbd565b60200260200101818151611dc59190614cc4565b9052505b5080611dd481614f55565b915050611c60565b5092915050565b33600090815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8616845290915281205482811015611ea4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610e18565b611eb1338585840361270d565b5060019392505050565b6000610c7f338484612bee565b6000611ed660055460ff1690565b15611f3d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610e18565b611f5e335b73ffffffffffffffffffffffffffffffffffffffff163b151590565b15611fc5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f4e6f7420616c6c6f77656420666f7220636f6e747261637473000000000000006044820152606401610e18565b47611fd034856133f5565b476000611fdd8284614e66565b6007546040517f01d5f4900000000000000000000000000000000000000000000000000000000081523060048201526024810183905291925060009173ffffffffffffffffffffffffffffffffffffffff909116906301d5f4909060440160206040518083038186803b15801561205357600080fd5b505afa158015612067573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061208b9190614994565b905060006120998288613948565b6120a38434614e66565b6120ad9190614e66565b905064e8d4a510008111156120c7576120c7335b82613a7e565b600b541561214157336000908152601060205260409020544210156121105733600090815260116020526040812080548a9290612105908490614cac565b909155506121239050565b3360009081526011602052604090208890555b600b546121309042614cac565b336000908152601060205260409020555b61214b3389612a6c565b60408051848152602081018a9052339130917f154f5ab3f8529ffdbb246fd1a63a2cce74c42c1b45bd6bbfad82bef2272be9c5910160405180910390a350959695505050505050565b600c81815481106121a457600080fd5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b60006121d781336128b8565b6114d03347613a7e565b6000828152600660205260409020600101546121fd81336128b8565b6113bb8383612fa0565b60055460ff1615612274576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610e18565b3360008181526010602052604090205483904210156123b65773ffffffffffffffffffffffffffffffffffffffff82166000818152601160205260408082205490517f70a082310000000000000000000000000000000000000000000000000000000081526004810193909352909130906370a082319060240160206040518083038186803b15801561230657600080fd5b505afa15801561231a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061233e9190614994565b6123489190614e66565b9050818110156123b4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f436f6f6c646f776e20696e2070726f67726573730000000000000000000000006044820152606401610e18565b505b6123bf33611f42565b15612426576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f4e6f7420616c6c6f77656420666f7220636f6e747261637473000000000000006044820152606401610e18565b60008411801561243e575061243a33610656565b8411155b6124a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f4e6f7420656e6f75676820636c757374657200000000000000000000000000006044820152606401610e18565b6124ae338561313c565b60006124b985611c10565b9050476124c582613bd8565b4760006124d28383614e66565b6007546040517f4c7ba3920000000000000000000000000000000000000000000000000000000081523060048201526024810183905291925060009173ffffffffffffffffffffffffffffffffffffffff90911690634c7ba3929060440160206040518083038186803b15801561254857600080fd5b505afa15801561255c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125809190614994565b9050600061258e828a613948565b6125989084614e66565b90506125a3336120c1565b6040518a8152339030907f2ced335a9d5d52c0e402f0cd99d473593830e0b3c1315c50a05c86c4afbd555f9060200160405180910390a350505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff81166000818152600f60205260408082205490517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152919290916370a082319060240160206040518083038186803b15801561265d57600080fd5b505afa158015612671573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126959190614994565b610be39190614cac565b6060600c805480602002602001604051908101604052809291908181526020018280548015610b4657602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff1681526001909101906020018083116126d9575050505050905090565b73ffffffffffffffffffffffffffffffffffffffff83166127af576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610e18565b73ffffffffffffffffffffffffffffffffffffffff8216612852576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610e18565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259101610d76565b600082815260066020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff1661146f576129108173ffffffffffffffffffffffffffffffffffffffff166014613d99565b61291b836020613d99565b60405160200161292c929190614a97565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f08c379a0000000000000000000000000000000000000000000000000000000008252610e1891600401614bb3565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052612a669085907f23b872dd00000000000000000000000000000000000000000000000000000000906084015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613fdc565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8216612ae9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610e18565b612af5600083836140e8565b8060026000828254612b079190614cac565b909155505073ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604081208054839290612b41908490614cac565b909155505060405181815273ffffffffffffffffffffffffffffffffffffffff8316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526113bb9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064016129e4565b73ffffffffffffffffffffffffffffffffffffffff8316612c91576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610e18565b73ffffffffffffffffffffffffffffffffffffffff8216612d34576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610e18565b612d3f8383836140e8565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015612df5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610e18565b73ffffffffffffffffffffffffffffffffffffffff808516600090815260208190526040808220858503905591851681529081208054849290612e39908490614cac565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051612e9f91815260200190565b60405180910390a3612a66565b600082815260066020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff1661146f57600082815260066020908152604080832073ffffffffffffffffffffffffffffffffffffffff85168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055612f423390565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b600082815260066020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff161561146f57600082815260066020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60055460ff166130c7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f5061757361626c653a206e6f74207061757365640000000000000000000000006044820152606401610e18565b600580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a1565b73ffffffffffffffffffffffffffffffffffffffff82166131df576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610e18565b6131eb826000836140e8565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260208190526040902054818110156132a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610e18565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604081208383039055600280548492906132dd908490614e66565b909155505060405182815260009073ffffffffffffffffffffffffffffffffffffffff8516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b60055460ff16156133a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610e18565b600580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586131123390565b6007546040517fe5711ffc00000000000000000000000000000000000000000000000000000000815230600482015260009173ffffffffffffffffffffffffffffffffffffffff169063e5711ffc9060240160206040518083038186803b15801561345f57600080fd5b505afa158015613473573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134979190614711565b6007546040517f60db72ef000000000000000000000000000000000000000000000000000000008152306004820152602481018590529192506000918291829173ffffffffffffffffffffffffffffffffffffffff909116906360db72ef9060440160006040518083038186803b15801561351157600080fd5b505afa158015613525573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261356b919081019061483e565b93505092509250808610156135dc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4e6f7420656e6f7567682065746865722073656e7400000000000000000000006044820152606401610e18565b60005b600c5481101561393f578381815181106135fb576135fb614fbd565b6020026020010151600c828154811061361657613616614fbd565b6000918252602090912001546008546040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff91821660048201529116906370a082319060240160206040518083038186803b15801561368c57600080fd5b505afa1580156136a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136c49190614994565b101580156137b157508381815181106136df576136df614fbd565b6020026020010151600c82815481106136fa576136fa614fbd565b6000918252602090912001546008546040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff918216600482015230602482015291169063dd62ed3e9060440160206040518083038186803b15801561377657600080fd5b505afa15801561378a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137ae9190614994565b10155b1561382e5760085484516137ea9173ffffffffffffffffffffffffffffffffffffffff16903090879085908110610ce457610ce4614fbd565b60085483516138299173ffffffffffffffffffffffffffffffffffffffff169085908490811061381c5761381c614fbd565b6020026020010151613a7e565b61392d565b8473ffffffffffffffffffffffffffffffffffffffff166337f324c984838151811061385c5761385c614fbd565b6020026020010151600c848154811061387757613877614fbd565b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168785815181106138b4576138b4614fbd565b60200260200101516040518463ffffffff1660e01b81526004016138fa92919073ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b6000604051808303818588803b15801561391357600080fd5b505af1158015613927573d6000803e3d6000fd5b50505050505b8061393781614f55565b9150506135df565b50505050505050565b60008215613a75578115613980576008546139799073ffffffffffffffffffffffffffffffffffffffff1684613a7e565b5081610be3565b6007546040517f4e4f30a200000000000000000000000000000000000000000000000000000000815230600482015260009173ffffffffffffffffffffffffffffffffffffffff1690634e4f30a29060240160206040518083038186803b1580156139ea57600080fd5b505afa1580156139fe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a229190614994565b613a3485670de0b6b3a7640000614e29565b613a3e9190614cc4565b9050613a6b3360085460095473ffffffffffffffffffffffffffffffffffffffff9081169291168461298a565b6000915050610be3565b50600092915050565b80471015613ae8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610e18565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114613b42576040519150601f19603f3d011682016040523d82523d6000602084013e613b47565b606091505b50509050806113bb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610e18565b6007546040517fe5711ffc00000000000000000000000000000000000000000000000000000000815230600482015260009173ffffffffffffffffffffffffffffffffffffffff169063e5711ffc9060240160206040518083038186803b158015613c4257600080fd5b505afa158015613c56573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c7a9190614711565b905060005b8251811015613d0d57613cca826000600c8481548110613ca157613ca1614fbd565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff169190614247565b613cfb82848381518110613ce057613ce0614fbd565b6020026020010151600c8481548110613ca157613ca1614fbd565b80613d0581614f55565b915050613c7f565b506040517f2457ff7300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff821690632457ff7390613d63908590600c90600401614b85565b600060405180830381600087803b158015613d7d57600080fd5b505af1158015613d91573d6000803e3d6000fd5b505050505050565b60606000613da8836002614e29565b613db3906002614cac565b67ffffffffffffffff811115613dcb57613dcb614fec565b6040519080825280601f01601f191660200182016040528015613df5576020820181803683370190505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110613e2c57613e2c614fbd565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110613e8f57613e8f614fbd565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506000613ecb846002614e29565b613ed6906001614cac565b90505b6001811115613f73577f303132333435363738396162636465660000000000000000000000000000000085600f1660108110613f1757613f17614fbd565b1a60f81b828281518110613f2d57613f2d614fbd565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060049490941c93613f6c81614ecc565b9050613ed9565b50831561136d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610e18565b600061403e826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166143d89092919063ffffffff16565b8051909150156113bb578080602001905181019061405c91906148f7565b6113bb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610e18565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260106020526040902054839082904210156142405773ffffffffffffffffffffffffffffffffffffffff82166000818152601160205260408082205490517f70a082310000000000000000000000000000000000000000000000000000000081526004810193909352909130906370a082319060240160206040518083038186803b15801561419257600080fd5b505afa1580156141a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906141ca9190614994565b6141d49190614e66565b905081811015613d91576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f436f6f6c646f776e20696e2070726f67726573730000000000000000000000006044820152606401610e18565b5050505050565b8015806142f657506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015284169063dd62ed3e9060440160206040518083038186803b1580156142bc57600080fd5b505afa1580156142d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906142f49190614994565b155b614382576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006064820152608401610e18565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526113bb9084907f095ea7b300000000000000000000000000000000000000000000000000000000906064016129e4565b60606143e784846000856143ef565b949350505050565b606082471015614481576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610e18565b843b6144e9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610e18565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516145129190614a7b565b60006040518083038185875af1925050503d806000811461454f576040519150601f19603f3d011682016040523d82523d6000602084013e614554565b606091505b509150915061456482828661456f565b979650505050505050565b6060831561457e57508161136d565b82511561458e5782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e189190614bb3565b8280548282559060005260206000209081019282156145fd579160200282015b828111156145fd5782518255916020019190600101906145e2565b5061460992915061460d565b5090565b5b80821115614609576000815560010161460e565b600082601f83011261463357600080fd5b8135602061464861464383614c88565b614c39565b80838252828201915082860187848660051b890101111561466857600080fd5b60005b858110156146875781358452928401929084019060010161466b565b5090979650505050505050565b600082601f8301126146a557600080fd5b815160206146b561464383614c88565b80838252828201915082860187848660051b89010111156146d557600080fd5b60005b85811015614687578151845292840192908401906001016146d8565b60006020828403121561470657600080fd5b813561136d8161501b565b60006020828403121561472357600080fd5b815161136d8161501b565b6000806040838503121561474157600080fd5b823561474c8161501b565b9150602083013561475c8161501b565b809150509250929050565b60008060006060848603121561477c57600080fd5b83356147878161501b565b925060208401356147978161501b565b929592945050506040919091013590565b600080604083850312156147bb57600080fd5b82356147c68161501b565b946020939093013593505050565b6000602082840312156147e657600080fd5b813567ffffffffffffffff8111156147fd57600080fd5b6143e784828501614622565b60006020828403121561481b57600080fd5b815167ffffffffffffffff81111561483257600080fd5b6143e784828501614694565b6000806000806080858703121561485457600080fd5b845167ffffffffffffffff8082111561486c57600080fd5b61487888838901614694565b9550602087015191508082111561488e57600080fd5b5061489b87828801614694565b604087015160609097015195989097509350505050565b600080604083850312156148c557600080fd5b823567ffffffffffffffff8111156148dc57600080fd5b6148e885828601614622565b95602094909401359450505050565b60006020828403121561490957600080fd5b815161136d8161503d565b60006020828403121561492657600080fd5b5035919050565b6000806040838503121561494057600080fd5b82359150602083013561475c8161501b565b60006020828403121561496457600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461136d57600080fd5b6000602082840312156149a657600080fd5b5051919050565b600080604083850312156149c057600080fd5b82359150602083013561475c8161503d565b6000602082840312156149e457600080fd5b815160ff8116811461136d57600080fd5b6000815480845260208085019450836000528060002060005b83811015614a4057815473ffffffffffffffffffffffffffffffffffffffff1687529582019560019182019101614a0e565b509495945050505050565b600081518084526020808501945080840160005b83811015614a4057815187529582019590820190600101614a5f565b60008251614a8d818460208701614ea0565b9190910192915050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351614acf816017850160208801614ea0565b7f206973206d697373696e6720726f6c65200000000000000000000000000000006017918401918201528351614b0c816028840160208801614ea0565b01602801949350505050565b6020808252825182820181905260009190848201906040850190845b81811015614b6657835173ffffffffffffffffffffffffffffffffffffffff1683529284019291840191600101614b34565b50909695505050505050565b60208152600061136d6020830184614a4b565b604081526000614b986040830185614a4b565b8281036020840152614baa81856149f5565b95945050505050565b6020815260008251806020840152614bd2816040850160208701614ea0565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b838152606060208201526000614c1d6060830185614a4b565b8281036040840152614c2f81856149f5565b9695505050505050565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715614c8057614c80614fec565b604052919050565b600067ffffffffffffffff821115614ca257614ca2614fec565b5060051b60200190565b60008219821115614cbf57614cbf614f8e565b500190565b600082614cfa577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b600181815b80851115614d5857817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115614d3e57614d3e614f8e565b80851615614d4b57918102915b93841c9390800290614d04565b509250929050565b600061136d60ff841683600082614d7957506001610be3565b81614d8657506000610be3565b8160018114614d9c5760028114614da657614dc2565b6001915050610be3565b60ff841115614db757614db7614f8e565b50506001821b610be3565b5060208310610133831016604e8410600b8410161715614de5575081810a610be3565b614def8383614cff565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115614e2157614e21614f8e565b029392505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614e6157614e61614f8e565b500290565b600082821015614e7857614e78614f8e565b500390565b600060ff821660ff841680821015614e9757614e97614f8e565b90039392505050565b60005b83811015614ebb578181015183820152602001614ea3565b83811115612a665750506000910152565b600081614edb57614edb614f8e565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b600181811c90821680614f1557607f821691505b60208210811415614f4f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614f8757614f87614f8e565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff811681146114d057600080fd5b80151581146114d057600080fdfea26469706673582212206b2bf8e126b17089260cb59bcfdd5b389dea1525b0558d0f9aa378589873611964736f6c63430008060033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000e806db0693788ec79d6c45a8934e0eaf94afa37e0000000000000000000000005bac8c443ebd0525364dc813005ab72956d3705d00000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000003200000000000000000000000000000000000000000000000000000000000000360ba45f90815b83f7defdd2f98edafb1c2fd8fe659d3ba865e735adb87c54636d600000000000000000000000000000000000000000000000000000000000000080000000000000000000000007fc66500c84a76ad7e9c93437bfc5ac33e2ddae9000000000000000000000000c00e94cb662c3520282e6f5717214004a7f26888000000000000000000000000d533a949740bb3306d119cc777fa900ba034cd52000000000000000000000000514910771af9ca656af840dff83e8264ecf986ca000000000000000000000000c011a73ee8576fb46f5e1c5751ca3b9fe0af2a6f0000000000000000000000006b3595068778dd592e39a122f4f5a5cf09c90fe20000000000000000000000001f9840a85d5af5bf1d1762f925bdaddc4201f984000000000000000000000000111111111117dc0aa78b770fa6a738034120c3020000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000007a120000000000000000000000000000000000000000000000000000000000008d9a00000000000000000000000000000000000000000000000000000000002afddc00000000000000000000000000000000000000000000000000000000000bd358000000000000000000000000000000000000000000000000000000000004e20000000000000000000000000000000000000000000000000000000000000a58ed000000000000000000000000000000000000000000000000000000000008d24d0000000000000000000000000000000000000000000000000000000000138ce2000000000000000000000000000000000000000000000000000000000000000084554482d436f726500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044445435200000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _clusterControllerAddress (address): 0xE806Db0693788Ec79D6c45a8934E0EAF94AFA37E
Arg [1] : _treasury (address): 0x5bAc8C443EBD0525364dc813005AB72956D3705d
Arg [2] : _underlyings (address[]): 0x7Fc66500c84A76Ad7e9c93437bFc5Ac33E2DDaE9,0xc00e94Cb662C3520282E6f5717214004A7f26888,0xD533a949740bb3306d119CC777fa900bA034cd52,0x514910771AF9Ca656af840dff83E8264EcF986CA,0xC011a73ee8576Fb46F5E1c5751cA3B9Fe0af2a6F,0x6B3595068778DD592e39A122f4f5a5cF09C90fE2,0x1f9840a85d5aF5bf1D1762F925BDADdC4201F984,0x111111111117dC0aa78b770fA6A738034120C302
Arg [3] : _underlyingInCluster (uint256[]): 500000,580000,45080000,12400000,5120000,10850000,9250000,20500000
Arg [4] : _name (string): ETH-Core
Arg [5] : _symbol (string): DECR
Arg [6] : _hashId (uint256): 84253821036764534306060160924012026141829460811678815914092579854188903020246

-----Encoded View---------------
29 Constructor Arguments found :
Arg [0] : 000000000000000000000000e806db0693788ec79d6c45a8934e0eaf94afa37e
Arg [1] : 0000000000000000000000005bac8c443ebd0525364dc813005ab72956d3705d
Arg [2] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000200
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000320
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000360
Arg [6] : ba45f90815b83f7defdd2f98edafb1c2fd8fe659d3ba865e735adb87c54636d6
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000008
Arg [8] : 0000000000000000000000007fc66500c84a76ad7e9c93437bfc5ac33e2ddae9
Arg [9] : 000000000000000000000000c00e94cb662c3520282e6f5717214004a7f26888
Arg [10] : 000000000000000000000000d533a949740bb3306d119cc777fa900ba034cd52
Arg [11] : 000000000000000000000000514910771af9ca656af840dff83e8264ecf986ca
Arg [12] : 000000000000000000000000c011a73ee8576fb46f5e1c5751ca3b9fe0af2a6f
Arg [13] : 0000000000000000000000006b3595068778dd592e39a122f4f5a5cf09c90fe2
Arg [14] : 0000000000000000000000001f9840a85d5af5bf1d1762f925bdaddc4201f984
Arg [15] : 000000000000000000000000111111111117dc0aa78b770fa6a738034120c302
Arg [16] : 0000000000000000000000000000000000000000000000000000000000000008
Arg [17] : 000000000000000000000000000000000000000000000000000000000007a120
Arg [18] : 000000000000000000000000000000000000000000000000000000000008d9a0
Arg [19] : 0000000000000000000000000000000000000000000000000000000002afddc0
Arg [20] : 0000000000000000000000000000000000000000000000000000000000bd3580
Arg [21] : 00000000000000000000000000000000000000000000000000000000004e2000
Arg [22] : 0000000000000000000000000000000000000000000000000000000000a58ed0
Arg [23] : 00000000000000000000000000000000000000000000000000000000008d24d0
Arg [24] : 000000000000000000000000000000000000000000000000000000000138ce20
Arg [25] : 0000000000000000000000000000000000000000000000000000000000000008
Arg [26] : 4554482d436f7265000000000000000000000000000000000000000000000000
Arg [27] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [28] : 4445435200000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

49229:19623:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64561:129;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29647:204;;;;;;;;;;-1:-1:-1;29647:204:0;;;;;:::i;:::-;;:::i;:::-;;;12094:14:1;;12087:22;12069:41;;12057:2;12042:18;29647:204:0;12024:92:1;49537:64:0;;;;;;;;;;;;49576:25;49537:64;;;;;12267:25:1;;;12255:2;12240:18;49537:64:0;12222:76:1;50520:29:0;;;;;;;;;;;;;;;;9902:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;12069:169::-;;;;;;;;;;-1:-1:-1;12069:169:0;;;;;:::i;:::-;;:::i;59111:513::-;;;;;;;;;;-1:-1:-1;59111:513:0;;;;;:::i;:::-;;:::i;:::-;;11022:108;;;;;;;;;;-1:-1:-1;11110:12:0;;11022:108;;62552:1602;;;;;;;;;;-1:-1:-1;62552:1602:0;;;;;:::i;:::-;;:::i;12720:492::-;;;;;;;;;;-1:-1:-1;12720:492:0;;;;;:::i;:::-;;:::i;31058:123::-;;;;;;;;;;-1:-1:-1;31058:123:0;;;;;:::i;:::-;31124:7;31151:12;;;:6;:12;;;;;:22;;;;31058:123;50928:36;;;;;;;;;;-1:-1:-1;50928:36:0;;;;;:::i;:::-;;:::i;31443:147::-;;;;;;;;;;-1:-1:-1;31443:147:0;;;;;:::i;:::-;;:::i;49771:55::-;;;;;;;;;;;;49820:6;49771:55;;10864:93;;;;;;;;;;-1:-1:-1;10864:93:0;;10947:2;25413:36:1;;25401:2;25386:18;10864:93:0;25368:87:1;32491:218:0;;;;;;;;;;-1:-1:-1;32491:218:0;;;;;:::i;:::-;;:::i;50387:28::-;;;;;;;;;;;;;;;;13621:215;;;;;;;;;;-1:-1:-1;13621:215:0;;;;;:::i;:::-;;:::i;55017:86::-;;;;;;;;;;;;;:::i;20846:::-;;;;;;;;;;-1:-1:-1;20917:7:0;;;;20846:86;;54372:204;;;;;;;;;;-1:-1:-1;54372:204:0;;;;;:::i;:::-;;:::i;61136:576::-;;;;;;;;;;-1:-1:-1;61136:576:0;;;;;:::i;:::-;;:::i;11193:127::-;;;;;;;;;;-1:-1:-1;11193:127:0;;;;;:::i;:::-;11294:18;;11267:7;11294:18;;;;;;;;;;;;11193:127;60444:556;;;;;;;;;;-1:-1:-1;60444:556:0;;;;;:::i;:::-;;:::i;59805:500::-;;;;;;;;;;-1:-1:-1;59805:500:0;;;;;:::i;:::-;;:::i;50064:39::-;;;;;;;;;;-1:-1:-1;50064:39:0;;;;;;;;;;;9410:42:1;9398:55;;;9380:74;;9368:2;9353:18;50064:39:0;9335:125:1;54015:214:0;;;;;;;;;;-1:-1:-1;54015:214:0;;;;;:::i;:::-;;:::i;54860:82::-;;;;;;;;;;;;;:::i;51336:53::-;;;;;;;;;;-1:-1:-1;51336:53:0;;;;;:::i;:::-;;;;;;;;;;;;;;49835:45;;;;;;;;;;;;49874:6;49835:45;;55159:278;;;;;;;;;;-1:-1:-1;55159:278:0;;;;;:::i;:::-;;:::i;51531:49::-;;;;;;;;;;-1:-1:-1;51531:49:0;;;;;:::i;:::-;;;;;;;;;;;;;;29943:139;;;;;;;;;;-1:-1:-1;29943:139:0;;;;;:::i;:::-;30021:4;30045:12;;;:6;:12;;;;;;;;:29;;;;;;;;;;;;;;;;29943:139;61896:514;;;;;;;;;;-1:-1:-1;61896:514:0;;;;;:::i;:::-;;:::i;10121:104::-;;;;;;;;;;;;;:::i;49956:44::-;;;;;;;;;;;;49994:6;49956:44;;64944:598;;;;;;;;;;-1:-1:-1;64944:598:0;;;;;:::i;:::-;;:::i;27921:49::-;;;;;;;;;;-1:-1:-1;27921:49:0;27966:4;27921:49;;14339:413;;;;;;;;;;-1:-1:-1;14339:413:0;;;;;:::i;:::-;;:::i;11533:175::-;;;;;;;;;;-1:-1:-1;11533:175:0;;;;;:::i;:::-;;:::i;50273:30::-;;;;;;;;;;-1:-1:-1;50273:30:0;;;;;;;;51042:40;;;;;;;;;;;;;;;;55861:1247;;;;;;:::i;:::-;;:::i;49464:66::-;;;;;;;;;;;;49504:26;49464:66;;50732:28;;;;;;;;;;-1:-1:-1;50732:28:0;;;;;:::i;:::-;;:::i;54643:144::-;;;;;;;;;;;;;:::i;49674:49::-;;;;;;;;;;;;49718:5;49674:49;;31835:149;;;;;;;;;;-1:-1:-1;31835:149:0;;;;;:::i;:::-;;:::i;11771:151::-;;;;;;;;;;-1:-1:-1;11771:151:0;;;;;:::i;:::-;11887:18;;;;11860:7;11887:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;11771:151;57527:1066;;;;;;;;;;-1:-1:-1;57527:1066:0;;;;;:::i;:::-;;:::i;65731:210::-;;;;;;;;;;-1:-1:-1;65731:210:0;;;;;:::i;:::-;;:::i;49395:62::-;;;;;;;;;;;;49433:24;49395:62;;51157:55;;;;;;;;;;-1:-1:-1;51157:55:0;;;;;:::i;:::-;;;;;;;;;;;;;;64326:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;64561:129::-;64627:16;64663:19;64656:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64561:129;:::o;29647:204::-;29732:4;29756:47;;;29771:32;29756:47;;:87;;-1:-1:-1;25589:25:0;25574:40;;;;29807:36;29749:94;29647:204;-1:-1:-1;;29647:204:0:o;9902:100::-;9956:13;9989:5;9982:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9982:12:0;;9902:100;-1:-1:-1;;;;;9902:100:0:o;12069:169::-;12152:4;12169:39;678:10;12192:7;12201:6;12169:8;:39::i;:::-;-1:-1:-1;12226:4:0;12069:169;;;;:::o;59111:513::-;49576:25;29525:30;49576:25;678:10;29525;:30::i;:::-;59214:34:::1;59251:54;59290:14;59251:38;:54::i;:::-;59214:91;;59323:9;59318:172;59342:17;:24;59338:1;:28;59318:172;;;59388:90;678:10:::0;59428:12:::1;59450:4;59457:17;59475:1;59457:20;;;;;;;;:::i;:::-;;;;;;;59395:11;59407:1;59395:14;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;::::1;;::::0;59388:90;;:39:::1;:90::i;:::-;59368:3:::0;::::1;::::0;::::1;:::i;:::-;;;;59318:172;;;-1:-1:-1::0;59502:35:0::1;678:10:::0;59522:14:::1;59502:5;:35::i;:::-;59555:61;::::0;12267:25:1;;;678:10:0;;59580:4:::1;::::0;59555:61:::1;::::0;12255:2:1;12240:18;59555:61:0::1;;;;;;;;59203:421;59111:513:::0;;:::o;62552:1602::-;62663:21;49504:26;29525:30;49504:26;678:10;29525;:30::i;:::-;62729:19:::1;:26:::0;62705:20;;:50:::1;62697:74;;;::::0;::::1;::::0;;22245:2:1;62697:74:0::1;::::0;::::1;22227:21:1::0;22284:2;22264:18;;;22257:30;22323:13;22303:18;;;22296:41;22354:18;;62697:74:0::1;;;;;;;;;62803:11;:18:::0;62789:33:::1;::::0;::::1;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;62789:33:0::1;-1:-1:-1::0;62866:16:0::1;::::0;62941:24:::1;::::0;62782:40;;-1:-1:-1;62866:16:0;62835:28:::1;::::0;62941:24:::1;;62929:76;62866:16:::0;63020:13:::1;11110:12:::0;;;11022:108;63020:13:::1;:36;;;;:::i;:::-;62929:166;::::0;;::::1;::::0;;;;;;::::1;::::0;::::1;24344:25:1::0;;;;63079:4:0::1;24385:18:1::0;;;24378:83;24317:18;;62929:166:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;::::0;;::::1;::::0;::::1;::::0;::::1;;::::0;::::1;::::0;;;::::1;::::0;::::1;:::i;:::-;63106:35:::0;;62893:202;;-1:-1:-1;63106:35:0::1;::::0;:19:::1;::::0;:35:::1;::::0;::::1;::::0;::::1;:::i;:::-;;63152:33;63188:76;63243:20;63227:13;11110:12:::0;;;11022:108;63227:13:::1;:36;;;;:::i;63188:76::-;63152:112;;63275:24;63302:60;63341:20;63302:38;:60::i;:::-;63275:87;;63380:9;63375:692;63399:11;:18:::0;63395:22;::::1;63375:692;;;63439:11;63453;63465:1;63453:14;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;::::1;::::0;::::1;;63501:16:::0;;;:11:::1;:16:::0;;;;;;;;63488:10;;63453:14;;-1:-1:-1;63501:16:0;63488:7;;63496:1;;63488:10;::::1;;;;;:::i;:::-;;;;;;;:29;63484:161;;;63561:16;::::0;::::1;;::::0;;;:11:::1;:16;::::0;;;;;63548:10;;:7;;63556:1;;63548:10;::::1;;;;;:::i;:::-;;;;;;;:29;;;;:::i;:::-;63538:4;63543:1;63538:7;;;;;;;;:::i;:::-;;;;;;:39;;;::::0;::::1;63484:161;;;63628:1;63618:4;63623:1;63618:7;;;;;;;;:::i;:::-;;;;;;:11;;;::::0;::::1;63484:161;63678:7;63686:1;63678:10;;;;;;;;:::i;:::-;;;;;;;63659:11;:16;63671:3;63659:16;;;;;;;;;;;;;;;:29;;;;63731:16;63748:1;63731:19;;;;;;;;:::i;:::-;;;;;;;63709:16;63726:1;63709:19;;;;;;;;:::i;:::-;;;;;;;:41;63705:351;;;63771:81;678:10:::0;63832:16:::1;63849:1;63832:19;;;;;;;;:::i;:::-;;;;;;;63810:16;63827:1;63810:19;;;;;;;;:::i;:::-;;;;;;;:41;;;;:::i;:::-;63771:24;::::0;::::1;::::0;:81;:24:::1;:81::i;:::-;63705:351;;;63900:16;63917:1;63900:19;;;;;;;;:::i;:::-;;;;;;;63878:16;63895:1;63878:19;;;;;;;;:::i;:::-;;;;;;;:41;63874:182;;;63940:100;678:10:::0;63991:4:::1;64020:16;64037:1;64020:19;;;;;;;;:::i;:::-;;;;;;;63998:16;64015:1;63998:19;;;;;;;;:::i;:::-;;;;;;;:41;;;;:::i;:::-;63940:28;::::0;::::1;::::0;:100;;:28:::1;:100::i;:::-;-1:-1:-1::0;63419:3:0;::::1;::::0;::::1;:::i;:::-;;;;63375:692;;;-1:-1:-1::0;64082:64:0::1;::::0;678:10;;64111:4:::1;::::0;64082:64:::1;::::0;::::1;::::0;64132:13;;64082:64:::1;:::i;:::-;;;;;;;;62686:1468;;;;62552:1602:::0;;;;:::o;12720:492::-;12860:4;12877:36;12887:6;12895:9;12906:6;12877:9;:36::i;:::-;12953:19;;;12926:24;12953:19;;;:11;:19;;;;;;;;678:10;12953:33;;;;;;;;13005:26;;;;12997:79;;;;;;;18800:2:1;12997:79:0;;;18782:21:1;18839:2;18819:18;;;18812:30;18878:34;18858:18;;;18851:62;18949:10;18929:18;;;18922:38;18977:19;;12997:79:0;18772:230:1;12997:79:0;13112:57;13121:6;678:10;13162:6;13143:16;:25;13112:8;:57::i;:::-;13200:4;13193:11;;;12720:492;;;;;;:::o;50928:36::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;50928:36:0;:::o;31443:147::-;31124:7;31151:12;;;:6;:12;;;;;:22;;;29525:30;29536:4;678:10;29525;:30::i;:::-;31557:25:::1;31568:4;31574:7;31557:10;:25::i;:::-;31443:147:::0;;;:::o;32491:218::-;32587:23;;;678:10;32587:23;32579:83;;;;;;;23414:2:1;32579:83:0;;;23396:21:1;23453:2;23433:18;;;23426:30;23492:34;23472:18;;;23465:62;23563:17;23543:18;;;23536:45;23598:19;;32579:83:0;23386:237:1;32579:83:0;32675:26;32687:4;32693:7;32675:11;:26::i;:::-;32491:218;;:::o;13621:215::-;678:10;13709:4;13758:25;;;:11;:25;;;;;;;;;:34;;;;;;;;;;13709:4;;13726:80;;13749:7;;13758:47;;13795:10;;13758:47;:::i;:::-;13726:8;:80::i;55017:86::-;27966:4;29525:30;27966:4;678:10;29525;:30::i;:::-;55085:10:::1;:8;:10::i;:::-;55017:86:::0;:::o;54372:204::-;27966:4;29525:30;27966:4;678:10;29525;:30::i;:::-;54479:26:::1;::::0;::::1;54471:56;;;::::0;::::1;::::0;;18454:2:1;54471:56:0::1;::::0;::::1;18436:21:1::0;18493:2;18473:18;;;18466:30;18532:19;18512:18;;;18505:47;18569:18;;54471:56:0::1;18426:167:1::0;54471:56:0::1;-1:-1:-1::0;54538:15:0::1;:30:::0;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;54372:204::o;61136:576::-;49433:24;29525:30;49433:24;678:10;29525;:30::i;:::-;61243:25:::1;61271:54;61310:14;61271:38;:54::i;:::-;61243:82;;61358:14;61338:16;;:34;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;61388:9:0::1;::::0;-1:-1:-1;61383:214:0::1;61407:11;:18:::0;61403:22;::::1;61383:214;;;61478:8;61487:1;61478:11;;;;;;;;:::i;:::-;;;;;;;61447;:27;61459:11;61471:1;61459:14;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;::::1;::::0;::::1;;61447:27:::0;;;::::1;::::0;;;;;;;;:42;;:27;;61459:14;61447:42:::1;::::0;;;::::1;:::i;:::-;::::0;;;-1:-1:-1;61504:81:0::1;::::0;-1:-1:-1;678:10:0;61544:12:::1;598:98:::0;61504:81:::1;61427:3:::0;::::1;::::0;::::1;:::i;:::-;;;;61383:214;;;-1:-1:-1::0;61614:90:0::1;::::0;678:10;;61645:4:::1;::::0;61614:90:::1;::::0;::::1;::::0;61666:14;;61682:8;;61692:11:::1;::::0;61614:90:::1;:::i;60444:556::-:0;49433:24;29525:30;49433:24;678:10;29525;:30::i;:::-;60551:25:::1;60579:54;60618:14;60579:38;:54::i;:::-;60551:82;;60666:14;60646:16;;:34;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;60696:9:0::1;::::0;-1:-1:-1;60691:195:0::1;60715:11;:18:::0;60711:22;::::1;60691:195;;;60786:8;60795:1;60786:11;;;;;;;;:::i;:::-;;;;;;;60755;:27;60767:11;60779:1;60767:14;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;::::1;::::0;::::1;;60755:27:::0;;;::::1;::::0;;;;;;;;:42;;:27;;60767:14;60755:42:::1;::::0;;;::::1;:::i;:::-;::::0;;;-1:-1:-1;60812:62:0::1;::::0;-1:-1:-1;678:10:0;60848:12:::1;60862:8;60871:1;60862:11;;;;;;;;:::i;:::-;;;;;;;60819;60831:1;60819:14;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;::::1;;::::0;60812:62;:35:::1;:62::i;:::-;60735:3:::0;::::1;::::0;::::1;:::i;:::-;;;;60691:195;;;-1:-1:-1::0;60903:89:0::1;::::0;678:10;;60933:4:::1;::::0;60903:89:::1;::::0;::::1;::::0;60954:14;;60970:8;;60980:11:::1;::::0;60903:89:::1;:::i;59805:500::-:0;49576:25;29525:30;49576:25;678:10;29525;:30::i;:::-;59911:34:::1;59948:54;59987:14;59948:38;:54::i;:::-;59911:91:::0;-1:-1:-1;60015:35:0::1;678:10:::0;60035:14:::1;60015:5;:35::i;:::-;60068:9;60063:153;60087:17;:24;60083:1;:28;60063:153;;;60133:71;678:10:::0;60169:12:::1;598:98:::0;60133:71:::1;60113:3:::0;::::1;::::0;::::1;:::i;:::-;;;;60063:153;;;-1:-1:-1::0;60233:64:0::1;::::0;12267:25:1;;;678:10:0;;60261:4:::1;::::0;60233:64:::1;::::0;12255:2:1;12240:18;60233:64:0::1;12222:76:1::0;54015:214:0;27966:4;29525:30;27966:4;678:10;29525;:30::i;:::-;49874:6:::1;54124:15;:31;;54116:62;;;::::0;::::1;::::0;;21898:2:1;54116:62:0::1;::::0;::::1;21880:21:1::0;21937:2;21917:18;;;21910:30;21976:20;21956:18;;;21949:48;22014:18;;54116:62:0::1;21870:168:1::0;54116:62:0::1;-1:-1:-1::0;54189:14:0::1;:32:::0;54015:214::o;54860:82::-;27966:4;29525:30;27966:4;678:10;29525;:30::i;:::-;54926:8:::1;:6;:8::i;55159:278::-:0;55259:24;;;;678:10;55243:40;;;55235:68;;;;;;;15414:2:1;55235:68:0;;;15396:21:1;15453:2;15433:18;;;15426:30;15492:17;15472:18;;;15465:45;15527:18;;55235:68:0;15386:165:1;55235:68:0;55322:25;;;55314:66;;;;;;;20017:2:1;55314:66:0;;;19999:21:1;20056:2;20036:18;;;20029:30;20095;20075:18;;;20068:58;20143:18;;55314:66:0;19989:178:1;55314:66:0;55391:24;:38;;;;;;;;;;;;;;;55159:278::o;61896:514::-;49433:24;29525:30;49433:24;678:10;29525;:30::i;:::-;62054:14:::1;62034:16;;:34;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;62086:9:0::1;::::0;-1:-1:-1;62081:214:0::1;62105:11;:18:::0;62101:22;::::1;62081:214;;;62176:8;62185:1;62176:11;;;;;;;;:::i;:::-;;;;;;;62145;:27;62157:11;62169:1;62157:14;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;::::1;::::0;::::1;;62145:27:::0;;;::::1;::::0;;;;;;;;:42;;:27;;62157:14;62145:42:::1;::::0;;;::::1;:::i;:::-;::::0;;;-1:-1:-1;62202:81:0::1;::::0;-1:-1:-1;678:10:0;62264:4:::1;62271:8;62280:1;62271:11;;;;;;;;:::i;62202:81::-;62125:3:::0;::::1;::::0;::::1;:::i;:::-;;;;62081:214;;;-1:-1:-1::0;62312:90:0::1;::::0;678:10;;62343:4:::1;::::0;62312:90:::1;::::0;::::1;::::0;62364:14;;62380:8;;62390:11:::1;::::0;62312:90:::1;:::i;10121:104::-:0;10177:13;10210:7;10203:14;;;;;:::i;64944:598::-;65126:11;:18;65046:16;;65075:34;;65112:33;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;65112:33:0;;65075:70;;65161:9;65156:344;65180:11;:18;65176:22;;65156:344;;;49718:5;65261:19;65281:1;65261:22;;;;;;;;:::i;:::-;;;;;;;;;65244:14;:39;;;;:::i;:::-;65243:61;;;;:::i;:::-;65220:17;65238:1;65220:20;;;;;;;;:::i;:::-;;;;;;:84;;;;;65319:14;65351:11;65363:1;65351:14;;;;;;;;:::i;:::-;;;;;;;;;;;;65336:41;;;;;;;;65351:14;;;;;65336:39;;:41;;;;;;;;;;65351:14;65336:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;65319:58;;65407:2;65396:8;:13;;;65392:97;;;65459:13;65464:8;65459:2;:13;:::i;:::-;65454:19;;:2;:19;:::i;:::-;65430:17;65448:1;65430:20;;;;;;;;:::i;:::-;;;;;;:43;;;;;;;:::i;:::-;;;-1:-1:-1;65392:97:0;-1:-1:-1;65200:3:0;;;;:::i;:::-;;;;65156:344;;;-1:-1:-1;65517:17:0;64944:598;-1:-1:-1;;64944:598:0:o;14339:413::-;678:10;14432:4;14476:25;;;:11;:25;;;;;;;;;:34;;;;;;;;;;14529:35;;;;14521:85;;;;;;;23008:2:1;14521:85:0;;;22990:21:1;23047:2;23027:18;;;23020:30;23086:34;23066:18;;;23059:62;23157:7;23137:18;;;23130:35;23182:19;;14521:85:0;22980:227:1;14521:85:0;14642:67;678:10;14665:7;14693:15;14674:16;:34;14642:8;:67::i;:::-;-1:-1:-1;14740:4:0;;14339:413;-1:-1:-1;;;14339:413:0:o;11533:175::-;11619:4;11636:42;678:10;11660:9;11671:6;11636:9;:42::i;55861:1247::-;55984:7;21172:8;20917:7;;;;;20846:86;21172:8;21171:9;21163:38;;;;;;;18109:2:1;21163:38:0;;;18091:21:1;18148:2;18128:18;;;18121:30;18187:18;18167;;;18160:46;18223:18;;21163:38:0;18081:166:1;21163:38:0;52050:25:::1;678:10:::0;52050:12:::1;:23;;35217:20:::0;35265:8;;;34894:387;52050:25:::1;52049:26;52041:64;;;::::0;::::1;::::0;;14657:2:1;52041:64:0::1;::::0;::::1;14639:21:1::0;14696:2;14676:18;;;14669:30;14735:27;14715:18;;;14708:55;14780:18;;52041:64:0::1;14629:175:1::0;52041:64:0::1;56028:21:::2;56060:47;56082:9;56093:13:::0;56060:21:::2;:47::i;:::-;56141:21;56118:20;56194:28;56141:21:::0;56194:13;:28:::2;:::i;:::-;56272:24;::::0;56260:82:::2;::::0;;;;56326:4:::2;56260:82;::::0;::::2;10374:74:1::0;10464:18;;;10457:34;;;56175:47:0;;-1:-1:-1;56235:22:0::2;::::0;56272:24:::2;::::0;;::::2;::::0;56260:57:::2;::::0;10347:18:1;;56260:82:0::2;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;56235:107;;56353:17;56396:49;56413:14;56429:15;56396:16;:49::i;:::-;56373:20;56385:8:::0;56373:9:::2;:20;:::i;:::-;:72;;;;:::i;:::-;56353:92;;49994:6;56462:9;:23;56458:107;;;56502:51;678:10:::0;56528:12:::2;56543:9;56502:17;:51::i;:::-;56581:14;::::0;:18;56577:353:::2;;678:10:::0;56620:32:::2;::::0;;;:18:::2;:32;::::0;;;;;56655:15:::2;-1:-1:-1::0;56616:221:0::2;;;678:10:::0;56691:28:::2;::::0;;;:14:::2;:28;::::0;;;;:45;;56723:13;;56691:28;:45:::2;::::0;56723:13;;56691:45:::2;:::i;:::-;::::0;;;-1:-1:-1;56616:221:0::2;::::0;-1:-1:-1;56616:221:0::2;;678:10:::0;56777:28:::2;::::0;;;:14:::2;:28;::::0;;;;:44;;;56616:221:::2;56904:14;::::0;56886:32:::2;::::0;:15:::2;:32;:::i;:::-;678:10:::0;56851:32:::2;::::0;;;:18:::2;:32;::::0;;;;:67;56577:353:::2;56942:34;678:10:::0;56962:13:::2;56942:5;:34::i;:::-;56992:75;::::0;;25192:25:1;;;25248:2;25233:18;;25226:34;;;678:10:0;;57022:4:::2;::::0;56992:75:::2;::::0;25165:18:1;56992:75:0::2;;;;;;;-1:-1:-1::0;57087:13:0;;55861:1247;-1:-1:-1;;;;;;55861:1247:0:o;50732:28::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;50732:28:0;:::o;54643:144::-;27966:4;29525:30;27966:4;678:10;29525;:30::i;:::-;54716:63:::1;678:10:::0;54757:21:::1;54716:17;:63::i;31835:149::-:0;31124:7;31151:12;;;:6;:12;;;;;:22;;;29525:30;29536:4;678:10;29525;:30::i;:::-;31950:26:::1;31962:4;31968:7;31950:11;:26::i;57527:1066::-:0;20917:7;;;;21171:9;21163:38;;;;;;;18109:2:1;21163:38:0;;;18091:21:1;18148:2;18128:18;;;18121:30;18187:18;18167;;;18160:46;18223:18;;21163:38:0;18081:166:1;21163:38:0;678:10;51751:25:::1;::::0;;;:18:::1;:25;::::0;;;;;57696:14;;51779:15:::1;-1:-1:-1::0;51747:234:0::1;;;51876:21;::::0;::::1;51811;51876::::0;;;:14:::1;:21;::::0;;;;;;51835:38;;;;;::::1;::::0;::::1;9380:74:1::0;;;;51811:21:0;;51850:4:::1;::::0;51835:31:::1;::::0;9353:18:1;;51835:38:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:62;;;;:::i;:::-;51811:86;;51937:7;51920:13;:24;;51912:57;;;::::0;::::1;::::0;;17760:2:1;51912:57:0::1;::::0;::::1;17742:21:1::0;17799:2;17779:18;;;17772:30;17838:22;17818:18;;;17811:50;17878:18;;51912:57:0::1;17732:170:1::0;51912:57:0::1;51796:185;51747:234;52050:25:::2;678:10:::0;52050:12:::2;598:98:::0;52050:25:::2;52049:26;52041:64;;;::::0;::::2;::::0;;14657:2:1;52041:64:0::2;::::0;::::2;14639:21:1::0;14696:2;14676:18;;;14669:30;14735:27;14715:18;;;14708:55;14780:18;;52041:64:0::2;14629:175:1::0;52041:64:0::2;57773:1:::3;57756:14;:18;:63;;;;-1:-1:-1::0;57796:23:0::3;678:10:::0;57806:12:::3;598:98:::0;57796:23:::3;57778:14;:41;;57756:63;57748:94;;;::::0;::::3;::::0;;13961:2:1;57748:94:0::3;::::0;::::3;13943:21:1::0;14000:2;13980:18;;;13973:30;14039:20;14019:18;;;14012:48;14077:18;;57748:94:0::3;13933:168:1::0;57748:94:0::3;57853:35;678:10:::0;57873:14:::3;57853:5;:35::i;:::-;57901:34;57938:54;57977:14;57938:38;:54::i;:::-;57901:91:::0;-1:-1:-1;58029:21:0::3;58061:40;57901:91:::0;58061:21:::3;:40::i;:::-;58135:21;58112:20;58192:28;58207:13:::0;58135:21;58192:28:::3;:::i;:::-;58268:24;::::0;58256:85:::3;::::0;;;;58321:4:::3;58256:85;::::0;::::3;10374:74:1::0;10464:18;;;10457:34;;;58169:51:0;;-1:-1:-1;58231:22:0::3;::::0;58268:24:::3;::::0;;::::3;::::0;58256:56:::3;::::0;10347:18:1;;58256:85:0::3;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;58231:110;;58352:17;58387:49;58404:14;58420:15;58387:16;:49::i;:::-;58372:64;::::0;:12;:64:::3;:::i;:::-;58352:84:::0;-1:-1:-1;58449:51:0::3;678:10:::0;58475:12:::3;598:98:::0;58449:51:::3;58516:69;::::0;12267:25:1;;;678:10:0;;58549:4:::3;::::0;58516:69:::3;::::0;12255:2:1;12240:18;58516:69:0::3;;;;;;;57737:856;;;;;;21212:1:::1;;57527:1066:::0;;:::o;65731:210::-;65902:31;;;65821:7;65902:31;;;:11;:31;;;;;;;65848:51;;;;;65893:4;65848:51;;;9380:74:1;65821:7:0;;65902:31;;65848:36;;9353:18:1;;65848:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:85;;;;:::i;64326:113::-;64384:16;64420:11;64413:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64326:113;:::o;18023:380::-;18159:19;;;18151:68;;;;;;;20374:2:1;18151:68:0;;;20356:21:1;20413:2;20393:18;;;20386:30;20452:34;20432:18;;;20425:62;20523:6;20503:18;;;20496:34;20547:19;;18151:68:0;20346:226:1;18151:68:0;18238:21;;;18230:68;;;;;;;15758:2:1;18230:68:0;;;15740:21:1;15797:2;15777:18;;;15770:30;15836:34;15816:18;;;15809:62;15907:4;15887:18;;;15880:32;15929:19;;18230:68:0;15730:224:1;18230:68:0;18311:18;;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;18363:32;;12267:25:1;;;18363:32:0;;12240:18:1;18363:32:0;12222:76:1;30372:497:0;30021:4;30045:12;;;:6;:12;;;;;;;;:29;;;;;;;;;;;;;30448:414;;30641:41;30669:7;30641:41;;30679:2;30641:19;:41::i;:::-;30755:38;30783:4;30790:2;30755:19;:38::i;:::-;30546:270;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;30492:358;;;;;;;;:::i;5493:248::-;5664:68;;10009:42:1;10078:15;;;5664:68:0;;;10060:34:1;10130:15;;10110:18;;;10103:43;10162:18;;;10155:34;;;5637:96:0;;5657:5;;5687:27;;9972:18:1;;5664:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5637:19;:96::i;:::-;5493:248;;;;:::o;16262:399::-;16346:21;;;16338:65;;;;;;;23830:2:1;16338:65:0;;;23812:21:1;23869:2;23849:18;;;23842:30;23908:33;23888:18;;;23881:61;23959:18;;16338:65:0;23802:181:1;16338:65:0;16416:49;16445:1;16449:7;16458:6;16416:20;:49::i;:::-;16494:6;16478:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;16511:18:0;;;:9;:18;;;;;;;;;;:28;;16533:6;;16511:9;:28;;16533:6;;16511:28;:::i;:::-;;;;-1:-1:-1;;16555:37:0;;12267:25:1;;;16555:37:0;;;;16572:1;;16555:37;;12255:2:1;12240:18;16555:37:0;;;;;;;32491:218;;:::o;5274:211::-;5418:58;;10404:42:1;10392:55;;5418:58:0;;;10374:74:1;10464:18;;;10457:34;;;5391:86:0;;5411:5;;5441:23;;10347:18:1;;5418:58:0;10329:168:1;15242:733:0;15382:20;;;15374:70;;;;;;;19611:2:1;15374:70:0;;;19593:21:1;19650:2;19630:18;;;19623:30;19689:34;19669:18;;;19662:62;19760:7;19740:18;;;19733:35;19785:19;;15374:70:0;19583:227:1;15374:70:0;15463:23;;;15455:71;;;;;;;13557:2:1;15455:71:0;;;13539:21:1;13596:2;13576:18;;;13569:30;13635:34;13615:18;;;13608:62;13706:5;13686:18;;;13679:33;13729:19;;15455:71:0;13529:225:1;15455:71:0;15539:47;15560:6;15568:9;15579:6;15539:20;:47::i;:::-;15623:17;;;15599:21;15623:17;;;;;;;;;;;15659:23;;;;15651:74;;;;;;;16161:2:1;15651:74:0;;;16143:21:1;16200:2;16180:18;;;16173:30;16239:34;16219:18;;;16212:62;16310:8;16290:18;;;16283:36;16336:19;;15651:74:0;16133:228:1;15651:74:0;15761:17;;;;:9;:17;;;;;;;;;;;15781:22;;;15761:42;;15825:20;;;;;;;;:30;;15797:6;;15761:9;15825:30;;15797:6;;15825:30;:::i;:::-;;;;;;;;15890:9;15873:35;;15882:6;15873:35;;;15901:6;15873:35;;;;12267:25:1;;12255:2;12240:18;;12222:76;15873:35:0;;;;;;;;15921:46;31443:147;33739:229;30021:4;30045:12;;;:6;:12;;;;;;;;:29;;;;;;;;;;;;;33809:152;;33853:12;;;;:6;:12;;;;;;;;:29;;;;;;;;;;:36;;;;33885:4;33853:36;;;33936:12;678:10;;598:98;33936:12;33909:40;;33927:7;33909:40;;33921:4;33909:40;;;;;;;;;;33739:229;;:::o;33976:230::-;30021:4;30045:12;;;:6;:12;;;;;;;;:29;;;;;;;;;;;;;34047:152;;;34122:5;34090:12;;;:6;:12;;;;;;;;:29;;;;;;;;;;;:37;;;;;;34147:40;678:10;;34090:12;;34147:40;;34122:5;34147:40;33976:230;;:::o;21905:120::-;20917:7;;;;21441:41;;;;;;;14308:2:1;21441:41:0;;;14290:21:1;14347:2;14327:18;;;14320:30;14386:22;14366:18;;;14359:50;14426:18;;21441:41:0;14280:170:1;21441:41:0;21964:7:::1;:15:::0;;;::::1;::::0;;21995:22:::1;678:10:::0;22004:12:::1;21995:22;::::0;9410:42:1;9398:55;;;9380:74;;9368:2;9353:18;21995:22:0::1;;;;;;;21905:120::o:0;16994:591::-;17078:21;;;17070:67;;;;;;;19209:2:1;17070:67:0;;;19191:21:1;19248:2;19228:18;;;19221:30;19287:34;19267:18;;;19260:62;19358:3;19338:18;;;19331:31;19379:19;;17070:67:0;19181:223:1;17070:67:0;17150:49;17171:7;17188:1;17192:6;17150:20;:49::i;:::-;17237:18;;;17212:22;17237:18;;;;;;;;;;;17274:24;;;;17266:71;;;;;;;15011:2:1;17266:71:0;;;14993:21:1;15050:2;15030:18;;;15023:30;15089:34;15069:18;;;15062:62;15160:4;15140:18;;;15133:32;15182:19;;17266:71:0;14983:224:1;17266:71:0;17373:18;;;:9;:18;;;;;;;;;;17394:23;;;17373:44;;17439:12;:22;;17411:6;;17373:9;17439:22;;17411:6;;17439:22;:::i;:::-;;;;-1:-1:-1;;17479:37:0;;12267:25:1;;;17505:1:0;;17479:37;;;;;;12255:2:1;12240:18;17479:37:0;;;;;;;31443:147;;;:::o;21646:118::-;20917:7;;;;21171:9;21163:38;;;;;;;18109:2:1;21163:38:0;;;18091:21:1;18148:2;18128:18;;;18121:30;18187:18;18167;;;18160:46;18223:18;;21163:38:0;18081:166:1;21163:38:0;21706:7:::1;:14:::0;;;::::1;21716:4;21706:14;::::0;;21736:20:::1;21743:12;678:10:::0;;598:98;67120:1116;67245:24;;67233:61;;;;;67288:4;67233:61;;;9380:74:1;67215:15:0;;67245:24;;;67233:46;;9353:18:1;;67233:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;67412:24;;67400:101;;;;;67479:4;67400:101;;;10374:74:1;10464:18;;;10457:34;;;67215:79:0;;-1:-1:-1;67308:34:0;;;;;;67412:24;;;;;67400:70;;10347:18:1;;67400:101:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;67307:194;;;;;;;67536:13;67522:10;:27;;67514:61;;;;;;;21137:2:1;67514:61:0;;;21119:21:1;21176:2;21156:18;;;21149:30;21215:23;21195:18;;;21188:51;21256:18;;67514:61:0;21109:171:1;67514:61:0;67593:9;67588:641;67612:11;:18;67608:22;;67588:641;;;67727:17;67745:1;67727:20;;;;;;;;:::i;:::-;;;;;;;67681:11;67693:1;67681:14;;;;;;;;:::i;:::-;;;;;;;;;;;67707:15;;67674:49;;;;;67681:14;67707:15;;;67674:49;;;9380:74:1;67681:14:0;;;67674:32;;9353:18:1;;67674:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:73;;:182;;;;;67836:17;67854:1;67836:20;;;;;;;;:::i;:::-;;;;;;;67775:11;67787:1;67775:14;;;;;;;;:::i;:::-;;;;;;;;;;;67801:15;;67768:64;;;;;67775:14;67801:15;;;67768:64;;;9700:34:1;67826:4:0;9750:18:1;;;9743:43;67775:14:0;;;67768:32;;9612:18:1;;67768:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:88;;67674:182;67652:566;;;67931:15;;67963:20;;67891:93;;67931:15;;;67956:4;;67963:17;;67981:1;;67963:20;;;;;;:::i;67891:93::-;68029:15;;68047:13;;68003:58;;68029:15;;;68047:10;;68058:1;;68047:13;;;;;;:::i;:::-;;;;;;;68003:17;:58::i;:::-;67652:566;;;68114:7;68102:40;;;68150:10;68161:1;68150:13;;;;;;;;:::i;:::-;;;;;;;68165:11;68177:1;68165:14;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;68181:17;68199:1;68181:20;;;;;;;;:::i;:::-;;;;;;;68102:100;;;;;;;;;;;;;;;10404:42:1;10392:55;;;;10374:74;;10479:2;10464:18;;10457:34;10362:2;10347:18;;10329:168;68102:100:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67652:566;67632:3;;;;:::i;:::-;;;;67588:641;;;;67204:1032;;;;67120:1116;;:::o;66383:631::-;66473:7;66497:19;;66493:495;;66537:15;66533:444;;;66599:15;;66573:59;;66599:15;;66617:14;66573:17;:59::i;:::-;-1:-1:-1;66658:14:0;66651:21;;66533:444;66778:24;;66766:69;;;;;66829:4;66766:69;;;9380:74:1;66713:22:0;;66778:24;;;66766:54;;9353:18:1;;66766:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;66739:23;:14;66756:6;66739:23;:::i;:::-;66738:97;;;;:::i;:::-;66713:122;-1:-1:-1;66854:80:0;678:10;66902:15;;66854:16;;66902:15;66854:16;;;;:80;66902:15;66919:14;66854:33;:80::i;:::-;66960:1;66953:8;;;;;66533:444;-1:-1:-1;67005:1:0;66383:631;;;;:::o;36216:317::-;36331:6;36306:21;:31;;36298:73;;;;;;;16995:2:1;36298:73:0;;;16977:21:1;17034:2;17014:18;;;17007:30;17073:31;17053:18;;;17046:59;17122:18;;36298:73:0;16967:179:1;36298:73:0;36385:12;36403:9;:14;;36425:6;36403:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36384:52;;;36455:7;36447:78;;;;;;;16568:2:1;36447:78:0;;;16550:21:1;16607:2;16587:18;;;16580:30;16646:34;16626:18;;;16619:62;16717:28;16697:18;;;16690:56;16763:19;;36447:78:0;16540:248:1;68367:482:0;68485:24;;68473:61;;;;;68528:4;68473:61;;;9380:74:1;68455:15:0;;68485:24;;;68473:46;;9353:18:1;;68473:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;68455:79;;68550:9;68545:210;68569:18;:25;68565:1;:29;68545:210;;;68616:46;68651:7;68660:1;68623:11;68635:1;68623:14;;;;;;;;:::i;:::-;;;;;;;;;;;;;;68616:46;:34;:46::i;:::-;68677:66;68712:7;68721:18;68740:1;68721:21;;;;;;;;:::i;:::-;;;;;;;68684:11;68696:1;68684:14;;;;;;;;:::i;68677:66::-;68596:3;;;;:::i;:::-;;;;68545:210;;;-1:-1:-1;68767:74:0;;;;;:41;;;;;;:74;;68809:18;;68829:11;;68767:74;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68444:405;68367:482;:::o;23559:451::-;23634:13;23660:19;23692:10;23696:6;23692:1;:10;:::i;:::-;:14;;23705:1;23692:14;:::i;:::-;23682:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23682:25:0;;23660:47;;23718:15;:6;23725:1;23718:9;;;;;;;;:::i;:::-;;;;:15;;;;;;;;;;;23744;:6;23751:1;23744:9;;;;;;;;:::i;:::-;;;;:15;;;;;;;;;;-1:-1:-1;23775:9:0;23787:10;23791:6;23787:1;:10;:::i;:::-;:14;;23800:1;23787:14;:::i;:::-;23775:26;;23770:135;23807:1;23803;:5;23770:135;;;23842:12;23855:5;23863:3;23855:11;23842:25;;;;;;;:::i;:::-;;;;23830:6;23837:1;23830:9;;;;;;;;:::i;:::-;;;;:37;;;;;;;;;;-1:-1:-1;23892:1:0;23882:11;;;;;23810:3;;;:::i;:::-;;;23770:135;;;-1:-1:-1;23923:10:0;;23915:55;;;;;;;13196:2:1;23915:55:0;;;13178:21:1;;;13215:18;;;13208:30;13274:34;13254:18;;;13247:62;13326:18;;23915:55:0;13168:182:1;7847:716:0;8271:23;8297:69;8325:4;8297:69;;;;;;;;;;;;;;;;;8305:5;8297:27;;;;:69;;;;;:::i;:::-;8381:17;;8271:95;;-1:-1:-1;8381:21:0;8377:179;;8478:10;8467:30;;;;;;;;;;;;:::i;:::-;8459:85;;;;;;;21487:2:1;8459:85:0;;;21469:21:1;21526:2;21506:18;;;21499:30;21565:34;21545:18;;;21538:62;21636:12;21616:18;;;21609:40;21666:19;;8459:85:0;21459:232:1;58679:160:0;51751:25;;;;;;;:18;:25;;;;;;58823:4;;58829:6;;51779:15;-1:-1:-1;51747:234:0;;;51876:21;;;51811;51876;;;:14;:21;;;;;;;51835:38;;;;;;;;9380:74:1;;;;51811:21:0;;51850:4;;51835:31;;9353:18:1;;51835:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:62;;;;:::i;:::-;51811:86;;51937:7;51920:13;:24;;51912:57;;;;;;;17760:2:1;51912:57:0;;;17742:21:1;17799:2;17779:18;;;17772:30;17838:22;17818:18;;;17811:50;17878:18;;51912:57:0;17732:170:1;51747:234:0;58679:160;;;;;:::o;6010:616::-;6374:10;;;6373:62;;-1:-1:-1;6390:39:0;;;;;6414:4;6390:39;;;9700:34:1;6390:15:0;9770::1;;;9750:18;;;9743:43;6390:15:0;;;;;9612:18:1;;6390:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:44;6373:62;6351:166;;;;;;;22585:2:1;6351:166:0;;;22567:21:1;22624:2;22604:18;;;22597:30;22663:34;22643:18;;;22636:62;22734:24;22714:18;;;22707:52;22776:19;;6351:166:0;22557:244:1;6351:166:0;6555:62;;10404:42:1;10392:55;;6555:62:0;;;10374:74:1;10464:18;;;10457:34;;;6528:90:0;;6548:5;;6578:22;;10347:18:1;;6555:62:0;10329:168:1;37700:229:0;37837:12;37869:52;37891:6;37899:4;37905:1;37908:12;37869:21;:52::i;:::-;37862:59;37700:229;-1:-1:-1;;;;37700:229:0:o;38820:511::-;38990:12;39048:5;39023:21;:30;;39015:81;;;;;;;17353:2:1;39015:81:0;;;17335:21:1;17392:2;17372:18;;;17365:30;17431:34;17411:18;;;17404:62;17502:8;17482:18;;;17475:36;17528:19;;39015:81:0;17325:228:1;39015:81:0;35217:20;;39107:60;;;;;;;20779:2:1;39107:60:0;;;20761:21:1;20818:2;20798:18;;;20791:30;20857:31;20837:18;;;20830:59;20906:18;;39107:60:0;20751:179:1;39107:60:0;39181:12;39195:23;39222:6;:11;;39241:5;39248:4;39222:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39180:73;;;;39271:52;39289:7;39298:10;39310:12;39271:17;:52::i;:::-;39264:59;38820:511;-1:-1:-1;;;;;;;38820:511:0:o;41289:712::-;41439:12;41468:7;41464:530;;;-1:-1:-1;41499:10:0;41492:17;;41464:530;41613:17;;:21;41609:374;;41811:10;41805:17;41872:15;41859:10;41855:2;41851:19;41844:44;41609:374;41954:12;41947:20;;;;;;;;;;;:::i;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:673:1;68:5;121:3;114:4;106:6;102:17;98:27;88:2;;139:1;136;129:12;88:2;175:6;162:20;201:4;225:60;241:43;281:2;241:43;:::i;:::-;225:60;:::i;:::-;307:3;331:2;326:3;319:15;359:2;354:3;350:12;343:19;;394:2;386:6;382:15;446:3;441:2;435;432:1;428:10;420:6;416:23;412:32;409:41;406:2;;;463:1;460;453:12;406:2;485:1;495:163;509:2;506:1;503:9;495:163;;;566:17;;554:30;;604:12;;;;636;;;;527:1;520:9;495:163;;;-1:-1:-1;676:5:1;;78:609;-1:-1:-1;;;;;;;78:609:1:o;692:670::-;757:5;810:3;803:4;795:6;791:17;787:27;777:2;;828:1;825;818:12;777:2;857:6;851:13;883:4;907:60;923:43;963:2;923:43;:::i;907:60::-;989:3;1013:2;1008:3;1001:15;1041:2;1036:3;1032:12;1025:19;;1076:2;1068:6;1064:15;1128:3;1123:2;1117;1114:1;1110:10;1102:6;1098:23;1094:32;1091:41;1088:2;;;1145:1;1142;1135:12;1088:2;1167:1;1177:156;1191:2;1188:1;1185:9;1177:156;;;1248:10;;1236:23;;1279:12;;;;1311;;;;1209:1;1202:9;1177:156;;1367:247;1426:6;1479:2;1467:9;1458:7;1454:23;1450:32;1447:2;;;1495:1;1492;1485:12;1447:2;1534:9;1521:23;1553:31;1578:5;1553:31;:::i;1619:251::-;1689:6;1742:2;1730:9;1721:7;1717:23;1713:32;1710:2;;;1758:1;1755;1748:12;1710:2;1790:9;1784:16;1809:31;1834:5;1809:31;:::i;1875:388::-;1943:6;1951;2004:2;1992:9;1983:7;1979:23;1975:32;1972:2;;;2020:1;2017;2010:12;1972:2;2059:9;2046:23;2078:31;2103:5;2078:31;:::i;:::-;2128:5;-1:-1:-1;2185:2:1;2170:18;;2157:32;2198:33;2157:32;2198:33;:::i;:::-;2250:7;2240:17;;;1962:301;;;;;:::o;2268:456::-;2345:6;2353;2361;2414:2;2402:9;2393:7;2389:23;2385:32;2382:2;;;2430:1;2427;2420:12;2382:2;2469:9;2456:23;2488:31;2513:5;2488:31;:::i;:::-;2538:5;-1:-1:-1;2595:2:1;2580:18;;2567:32;2608:33;2567:32;2608:33;:::i;:::-;2372:352;;2660:7;;-1:-1:-1;;;2714:2:1;2699:18;;;;2686:32;;2372:352::o;2729:315::-;2797:6;2805;2858:2;2846:9;2837:7;2833:23;2829:32;2826:2;;;2874:1;2871;2864:12;2826:2;2913:9;2900:23;2932:31;2957:5;2932:31;:::i;:::-;2982:5;3034:2;3019:18;;;;3006:32;;-1:-1:-1;;;2816:228:1:o;3049:348::-;3133:6;3186:2;3174:9;3165:7;3161:23;3157:32;3154:2;;;3202:1;3199;3192:12;3154:2;3242:9;3229:23;3275:18;3267:6;3264:30;3261:2;;;3307:1;3304;3297:12;3261:2;3330:61;3383:7;3374:6;3363:9;3359:22;3330:61;:::i;3402:363::-;3497:6;3550:2;3538:9;3529:7;3525:23;3521:32;3518:2;;;3566:1;3563;3556:12;3518:2;3599:9;3593:16;3632:18;3624:6;3621:30;3618:2;;;3664:1;3661;3654:12;3618:2;3687:72;3751:7;3742:6;3731:9;3727:22;3687:72;:::i;3770:737::-;3917:6;3925;3933;3941;3994:3;3982:9;3973:7;3969:23;3965:33;3962:2;;;4011:1;4008;4001:12;3962:2;4044:9;4038:16;4073:18;4114:2;4106:6;4103:14;4100:2;;;4130:1;4127;4120:12;4100:2;4153:72;4217:7;4208:6;4197:9;4193:22;4153:72;:::i;:::-;4143:82;;4271:2;4260:9;4256:18;4250:25;4234:41;;4300:2;4290:8;4287:16;4284:2;;;4316:1;4313;4306:12;4284:2;;4339:74;4405:7;4394:8;4383:9;4379:24;4339:74;:::i;:::-;4453:2;4438:18;;4432:25;4497:2;4482:18;;;4476:25;3952:555;;4329:84;;-1:-1:-1;3952:555:1;-1:-1:-1;;;;3952:555:1:o;4512:416::-;4605:6;4613;4666:2;4654:9;4645:7;4641:23;4637:32;4634:2;;;4682:1;4679;4672:12;4634:2;4722:9;4709:23;4755:18;4747:6;4744:30;4741:2;;;4787:1;4784;4777:12;4741:2;4810:61;4863:7;4854:6;4843:9;4839:22;4810:61;:::i;:::-;4800:71;4918:2;4903:18;;;;4890:32;;-1:-1:-1;;;;4624:304:1:o;4933:245::-;5000:6;5053:2;5041:9;5032:7;5028:23;5024:32;5021:2;;;5069:1;5066;5059:12;5021:2;5101:9;5095:16;5120:28;5142:5;5120:28;:::i;5183:180::-;5242:6;5295:2;5283:9;5274:7;5270:23;5266:32;5263:2;;;5311:1;5308;5301:12;5263:2;-1:-1:-1;5334:23:1;;5253:110;-1:-1:-1;5253:110:1:o;5368:315::-;5436:6;5444;5497:2;5485:9;5476:7;5472:23;5468:32;5465:2;;;5513:1;5510;5503:12;5465:2;5549:9;5536:23;5526:33;;5609:2;5598:9;5594:18;5581:32;5622:31;5647:5;5622:31;:::i;5688:332::-;5746:6;5799:2;5787:9;5778:7;5774:23;5770:32;5767:2;;;5815:1;5812;5805:12;5767:2;5854:9;5841:23;5904:66;5897:5;5893:78;5886:5;5883:89;5873:2;;5986:1;5983;5976:12;6210:184;6280:6;6333:2;6321:9;6312:7;6308:23;6304:32;6301:2;;;6349:1;6346;6339:12;6301:2;-1:-1:-1;6372:16:1;;6291:103;-1:-1:-1;6291:103:1:o;6399:309::-;6464:6;6472;6525:2;6513:9;6504:7;6500:23;6496:32;6493:2;;;6541:1;6538;6531:12;6493:2;6577:9;6564:23;6554:33;;6637:2;6626:9;6622:18;6609:32;6650:28;6672:5;6650:28;:::i;6713:273::-;6781:6;6834:2;6822:9;6813:7;6809:23;6805:32;6802:2;;;6850:1;6847;6840:12;6802:2;6882:9;6876:16;6932:4;6925:5;6921:16;6914:5;6911:27;6901:2;;6952:1;6949;6942:12;6991:518;7052:3;7090:5;7084:12;7117:6;7112:3;7105:19;7143:4;7172:2;7167:3;7163:12;7156:19;;7194:5;7191:1;7184:16;7236:2;7233:1;7223:16;7257:1;7267:217;7281:6;7278:1;7275:13;7267:217;;;7346:13;;7361:42;7342:62;7330:75;;7425:12;;;;7472:1;7460:14;;;;7296:9;7267:217;;;-1:-1:-1;7500:3:1;;7060:449;-1:-1:-1;;;;;7060:449:1:o;7514:435::-;7567:3;7605:5;7599:12;7632:6;7627:3;7620:19;7658:4;7687:2;7682:3;7678:12;7671:19;;7724:2;7717:5;7713:14;7745:1;7755:169;7769:6;7766:1;7763:13;7755:169;;;7830:13;;7818:26;;7864:12;;;;7899:15;;;;7791:1;7784:9;7755:169;;7954:274;8083:3;8121:6;8115:13;8137:53;8183:6;8178:3;8171:4;8163:6;8159:17;8137:53;:::i;:::-;8206:16;;;;;8091:137;-1:-1:-1;;8091:137:1:o;8443:786::-;8854:25;8849:3;8842:38;8824:3;8909:6;8903:13;8925:62;8980:6;8975:2;8970:3;8966:12;8959:4;8951:6;8947:17;8925:62;:::i;:::-;9051:19;9046:2;9006:16;;;9038:11;;;9031:40;9096:13;;9118:63;9096:13;9167:2;9159:11;;9152:4;9140:17;;9118:63;:::i;:::-;9201:17;9220:2;9197:26;;8832:397;-1:-1:-1;;;;8832:397:1:o;10502:681::-;10673:2;10725:21;;;10795:13;;10698:18;;;10817:22;;;10644:4;;10673:2;10896:15;;;;10870:2;10855:18;;;10644:4;10939:218;10953:6;10950:1;10947:13;10939:218;;;11018:13;;11033:42;11014:62;11002:75;;11132:15;;;;11097:12;;;;10975:1;10968:9;10939:218;;;-1:-1:-1;11174:3:1;;10653:530;-1:-1:-1;;;;;;10653:530:1:o;11188:261::-;11367:2;11356:9;11349:21;11330:4;11387:56;11439:2;11428:9;11424:18;11416:6;11387:56;:::i;11454:470::-;11708:2;11697:9;11690:21;11671:4;11734:56;11786:2;11775:9;11771:18;11763:6;11734:56;:::i;:::-;11838:9;11830:6;11826:22;11821:2;11810:9;11806:18;11799:50;11866:52;11911:6;11903;11866:52;:::i;:::-;11858:60;11680:244;-1:-1:-1;;;;;11680:244:1:o;12547:442::-;12696:2;12685:9;12678:21;12659:4;12728:6;12722:13;12771:6;12766:2;12755:9;12751:18;12744:34;12787:66;12846:6;12841:2;12830:9;12826:18;12821:2;12813:6;12809:15;12787:66;:::i;:::-;12905:2;12893:15;12910:66;12889:88;12874:104;;;;12980:2;12870:113;;12668:321;-1:-1:-1;;12668:321:1:o;24472:541::-;24754:6;24743:9;24736:25;24797:2;24792;24781:9;24777:18;24770:30;24717:4;24823:56;24875:2;24864:9;24860:18;24852:6;24823:56;:::i;:::-;24927:9;24919:6;24915:22;24910:2;24899:9;24895:18;24888:50;24955:52;25000:6;24992;24955:52;:::i;:::-;24947:60;24726:287;-1:-1:-1;;;;;;24726:287:1:o;25460:334::-;25531:2;25525:9;25587:2;25577:13;;25592:66;25573:86;25561:99;;25690:18;25675:34;;25711:22;;;25672:62;25669:2;;;25737:18;;:::i;:::-;25773:2;25766:22;25505:289;;-1:-1:-1;25505:289:1:o;25799:183::-;25859:4;25892:18;25884:6;25881:30;25878:2;;;25914:18;;:::i;:::-;-1:-1:-1;25959:1:1;25955:14;25971:4;25951:25;;25868:114::o;25987:128::-;26027:3;26058:1;26054:6;26051:1;26048:13;26045:2;;;26064:18;;:::i;:::-;-1:-1:-1;26100:9:1;;26035:80::o;26120:274::-;26160:1;26186;26176:2;;26221:77;26218:1;26211:88;26322:4;26319:1;26312:15;26350:4;26347:1;26340:15;26176:2;-1:-1:-1;26379:9:1;;26166:228::o;26399:482::-;26488:1;26531:5;26488:1;26545:330;26566:7;26556:8;26553:21;26545:330;;;26685:4;26617:66;26613:77;26607:4;26604:87;26601:2;;;26694:18;;:::i;:::-;26744:7;26734:8;26730:22;26727:2;;;26764:16;;;;26727:2;26843:22;;;;26803:15;;;;26545:330;;;26549:3;26463:418;;;;;:::o;26886:140::-;26944:5;26973:47;27014:4;27004:8;27000:19;26994:4;27080:5;27110:8;27100:2;;-1:-1:-1;27151:1:1;27165:5;;27100:2;27199:4;27189:2;;-1:-1:-1;27236:1:1;27250:5;;27189:2;27281:4;27299:1;27294:59;;;;27367:1;27362:130;;;;27274:218;;27294:59;27324:1;27315:10;;27338:5;;;27362:130;27399:3;27389:8;27386:17;27383:2;;;27406:18;;:::i;:::-;-1:-1:-1;;27462:1:1;27448:16;;27477:5;;27274:218;;27576:2;27566:8;27563:16;27557:3;27551:4;27548:13;27544:36;27538:2;27528:8;27525:16;27520:2;27514:4;27511:12;27507:35;27504:77;27501:2;;;-1:-1:-1;27613:19:1;;;27645:5;;27501:2;27692:34;27717:8;27711:4;27692:34;:::i;:::-;27822:6;27754:66;27750:79;27741:7;27738:92;27735:2;;;27833:18;;:::i;:::-;27871:20;;27090:807;-1:-1:-1;;;27090:807:1:o;27902:228::-;27942:7;28068:1;28000:66;27996:74;27993:1;27990:81;27985:1;27978:9;27971:17;27967:105;27964:2;;;28075:18;;:::i;:::-;-1:-1:-1;28115:9:1;;27954:176::o;28135:125::-;28175:4;28203:1;28200;28197:8;28194:2;;;28208:18;;:::i;:::-;-1:-1:-1;28245:9:1;;28184:76::o;28265:195::-;28303:4;28340;28337:1;28333:12;28372:4;28369:1;28365:12;28397:3;28392;28389:12;28386:2;;;28404:18;;:::i;:::-;28441:13;;;28312:148;-1:-1:-1;;;28312:148:1:o;28465:258::-;28537:1;28547:113;28561:6;28558:1;28555:13;28547:113;;;28637:11;;;28631:18;28618:11;;;28611:39;28583:2;28576:10;28547:113;;;28678:6;28675:1;28672:13;28669:2;;;-1:-1:-1;;28713:1:1;28695:16;;28688:27;28518:205::o;28728:196::-;28767:3;28795:5;28785:2;;28804:18;;:::i;:::-;-1:-1:-1;28851:66:1;28840:78;;28775:149::o;28929:437::-;29008:1;29004:12;;;;29051;;;29072:2;;29126:4;29118:6;29114:17;29104:27;;29072:2;29179;29171:6;29168:14;29148:18;29145:38;29142:2;;;29216:77;29213:1;29206:88;29317:4;29314:1;29307:15;29345:4;29342:1;29335:15;29142:2;;28984:382;;;:::o;29371:195::-;29410:3;29441:66;29434:5;29431:77;29428:2;;;29511:18;;:::i;:::-;-1:-1:-1;29558:1:1;29547:13;;29418:148::o;29571:184::-;29623:77;29620:1;29613:88;29720:4;29717:1;29710:15;29744:4;29741:1;29734:15;29760:184;29812:77;29809:1;29802:88;29909:4;29906:1;29899:15;29933:4;29930:1;29923:15;29949:184;30001:77;29998:1;29991:88;30098:4;30095:1;30088:15;30122:4;30119:1;30112:15;30138:154;30224:42;30217:5;30213:54;30206:5;30203:65;30193:2;;30282:1;30279;30272:12;30297:118;30383:5;30376:13;30369:21;30362:5;30359:32;30349:2;;30405:1;30402;30395:12

Swarm Source

ipfs://6b2bf8e126b17089260cb59bcfdd5b389dea1525b0558d0f9aa3785898736119

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.