GLMR Price: $0.021017 (-0.29%)

Contract

0x811429dd7184b3b198c3bF80765383ECa390B445

Overview

GLMR Balance

Moonbeam Chain LogoMoonbeam Chain LogoMoonbeam Chain Logo0 GLMR

GLMR Value

$0.00

Token Holdings

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Block
From
To
Approve110808272025-05-29 18:24:42241 days ago1748543082
Beefy: Strategy Stellaswap Multi Rewards LP V1
OUT0 GLMR00
Panic86143152024-12-05 1:28:30417 days ago1733362110IN
Beefy: Strategy Stellaswap Multi Rewards LP V1
0 GLMR0.310224150
Harvest33815142023-04-18 20:41:241013 days ago1681850484IN
Beefy: Strategy Stellaswap Multi Rewards LP V1
0 GLMR0.09656871105
Harvest33470512023-04-13 20:40:301018 days ago1681418430IN
Beefy: Strategy Stellaswap Multi Rewards LP V1
0 GLMR0.09656871105
Harvest32327962023-03-28 3:58:241035 days ago1679975904IN
Beefy: Strategy Stellaswap Multi Rewards LP V1
0 GLMR0.0979894100
Harvest29818662023-02-19 11:08:301071 days ago1676804910IN
Beefy: Strategy Stellaswap Multi Rewards LP V1
0 GLMR0.0952528100
Harvest29738972023-02-18 7:46:061073 days ago1676706366IN
Beefy: Strategy Stellaswap Multi Rewards LP V1
0 GLMR0.0952528100
Harvest29526262023-02-15 6:49:301076 days ago1676443770IN
Beefy: Strategy Stellaswap Multi Rewards LP V1
0 GLMR0.0943221100
Harvest29339402023-02-12 15:14:061078 days ago1676214846IN
Beefy: Strategy Stellaswap Multi Rewards LP V1
0 GLMR0.093933100
Harvest29055722023-02-08 14:39:421082 days ago1675867182IN
Beefy: Strategy Stellaswap Multi Rewards LP V1
0 GLMR0.1023198100
Harvest29038102023-02-08 8:38:061082 days ago1675845486IN
Beefy: Strategy Stellaswap Multi Rewards LP V1
0 GLMR0.1023198100
Harvest29030222023-02-08 5:57:241083 days ago1675835844IN
Beefy: Strategy Stellaswap Multi Rewards LP V1
0 GLMR0.1012714100
Harvest29007122023-02-07 22:05:241083 days ago1675807524IN
Beefy: Strategy Stellaswap Multi Rewards LP V1
0 GLMR0.1043098100
Harvest28993982023-02-07 17:38:241083 days ago1675791504IN
Beefy: Strategy Stellaswap Multi Rewards LP V1
0 GLMR0.1023198100
Harvest28984852023-02-07 14:32:181083 days ago1675780338IN
Beefy: Strategy Stellaswap Multi Rewards LP V1
0 GLMR0.1043098100
Harvest28961522023-02-07 6:39:301084 days ago1675751970IN
Beefy: Strategy Stellaswap Multi Rewards LP V1
0 GLMR0.100223100
Harvest28953312023-02-07 3:53:301084 days ago1675742010IN
Beefy: Strategy Stellaswap Multi Rewards LP V1
0 GLMR0.1043098100
Harvest28911222023-02-06 13:38:001084 days ago1675690680IN
Beefy: Strategy Stellaswap Multi Rewards LP V1
0 GLMR0.1021198100
Harvest28901472023-02-06 10:20:301084 days ago1675678830IN
Beefy: Strategy Stellaswap Multi Rewards LP V1
0 GLMR0.1023198100
Harvest28892832023-02-06 7:23:301085 days ago1675668210IN
Beefy: Strategy Stellaswap Multi Rewards LP V1
0 GLMR0.1040298100
Harvest28884062023-02-06 4:25:241085 days ago1675657524IN
Beefy: Strategy Stellaswap Multi Rewards LP V1
0 GLMR0.1021198100
Harvest28875222023-02-06 1:28:061085 days ago1675646886IN
Beefy: Strategy Stellaswap Multi Rewards LP V1
0 GLMR0.1043098100
Harvest28866362023-02-05 22:28:481085 days ago1675636128IN
Beefy: Strategy Stellaswap Multi Rewards LP V1
0 GLMR0.1023198100
Harvest28832322023-02-05 10:58:001085 days ago1675594680IN
Beefy: Strategy Stellaswap Multi Rewards LP V1
0 GLMR0.1021198100
Harvest28823562023-02-05 7:59:061086 days ago1675583946IN
Beefy: Strategy Stellaswap Multi Rewards LP V1
0 GLMR0.1043098100
View all transactions

Latest 25 internal transactions (View All)

Parent Transaction Hash Block From To
33395572023-04-12 18:55:061019 days ago1681325706
Beefy: Strategy Stellaswap Multi Rewards LP V1
20.75624396 GLMR
33395572023-04-12 18:55:061019 days ago1681325706
Beefy: Strategy Stellaswap Multi Rewards LP V1
3.59691842 GLMR
33374702023-04-12 11:43:421019 days ago1681299822
Beefy: Strategy Stellaswap Multi Rewards LP V1
0.00366726 GLMR
33374692023-04-12 11:43:301019 days ago1681299810
Beefy: Strategy Stellaswap Multi Rewards LP V1
17.15565826 GLMR
33329072023-04-11 20:08:241020 days ago1681243704
Beefy: Strategy Stellaswap Multi Rewards LP V1
27.91730357 GLMR
33329072023-04-11 20:08:241020 days ago1681243704
Beefy: Strategy Stellaswap Multi Rewards LP V1
1.67664442 GLMR
33324652023-04-11 18:37:001020 days ago1681238220
Beefy: Strategy Stellaswap Multi Rewards LP V1
0.97635067 GLMR
33322062023-04-11 17:43:481020 days ago1681235028
Beefy: Strategy Stellaswap Multi Rewards LP V1
12.32316844 GLMR
33289792023-04-11 6:32:421021 days ago1681194762
Beefy: Strategy Stellaswap Multi Rewards LP V1
1.95596373 GLMR
33284572023-04-11 4:46:121021 days ago1681188372
Beefy: Strategy Stellaswap Multi Rewards LP V1
1.5008151 GLMR
33280592023-04-11 3:24:301021 days ago1681183470
Beefy: Strategy Stellaswap Multi Rewards LP V1
9.48436119 GLMR
33255502023-04-10 18:48:181021 days ago1681152498
Beefy: Strategy Stellaswap Multi Rewards LP V1
3.74685515 GLMR
33255502023-04-10 18:48:181021 days ago1681152498
Beefy: Strategy Stellaswap Multi Rewards LP V1
3.74685515 GLMR
33245812023-04-10 15:24:181021 days ago1681140258
Beefy: Strategy Stellaswap Multi Rewards LP V1
27.8406225 GLMR
33245812023-04-10 15:24:181021 days ago1681140258
Beefy: Strategy Stellaswap Multi Rewards LP V1
26.17369236 GLMR
33176682023-04-09 15:39:481022 days ago1681054788
Beefy: Strategy Stellaswap Multi Rewards LP V1
1.66693013 GLMR
33172272023-04-09 14:09:121022 days ago1681049352
Beefy: Strategy Stellaswap Multi Rewards LP V1
9.10700358 GLMR
33172272023-04-09 14:09:121022 days ago1681049352
Beefy: Strategy Stellaswap Multi Rewards LP V1
1.44237425 GLMR
33168462023-04-09 12:50:481022 days ago1681044648
Beefy: Strategy Stellaswap Multi Rewards LP V1
7.66462932 GLMR
33148642023-04-09 5:59:061023 days ago1681019946
Beefy: Strategy Stellaswap Multi Rewards LP V1
4.0655425 GLMR
33148642023-04-09 5:59:061023 days ago1681019946
Beefy: Strategy Stellaswap Multi Rewards LP V1
4.0655425 GLMR
33137802023-04-09 2:17:481023 days ago1681006668
Beefy: Strategy Stellaswap Multi Rewards LP V1
2.24016639 GLMR
33137802023-04-09 2:17:481023 days ago1681006668
Beefy: Strategy Stellaswap Multi Rewards LP V1
2.24016639 GLMR
33131842023-04-09 0:15:541023 days ago1680999354
Beefy: Strategy Stellaswap Multi Rewards LP V1
27.24693511 GLMR
33131842023-04-09 0:15:541023 days ago1680999354
Beefy: Strategy Stellaswap Multi Rewards LP V1
7.55428707 GLMR
View All Internal Transactions
Cross-Chain Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
StrategyStellaswapMultiRewardsLP

Compiler Version
v0.8.15+commit.e14f2714

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at moonbeam.moonscan.io on 2022-10-26
*/

// SPDX-License-Identifier: MIT

// File @openzeppelin-4/contracts/token/ERC20/[email protected]

// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @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);

    /**
     * @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 `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, 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 `from` to `to` 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 from,
        address to,
        uint256 amount
    ) external returns (bool);
}


// File @openzeppelin-4/contracts/token/ERC20/extensions/[email protected]


// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.0;

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


// File @openzeppelin-4/contracts/utils/[email protected]


// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

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


// File @openzeppelin-4/contracts/token/ERC20/[email protected]


// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC20/ERC20.sol)

pragma solidity ^0.8.0;



/**
 * @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 Contracts guidelines: functions revert
 * instead 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}.
 */
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:
     *
     * - `to` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address to, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _transfer(owner, to, 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}.
     *
     * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on
     * `transferFrom`. This is semantically equivalent to an infinite approval.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _approve(owner, 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}.
     *
     * NOTE: Does not update the allowance if the current allowance
     * is the maximum `uint256`.
     *
     * Requirements:
     *
     * - `from` and `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public virtual override returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, amount);
        _transfer(from, to, amount);
        return true;
    }

    /**
     * @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) {
        address owner = _msgSender();
        _approve(owner, spender, allowance(owner, 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) {
        address owner = _msgSender();
        uint256 currentAllowance = allowance(owner, spender);
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(owner, spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    /**
     * @dev Moves `amount` of tokens from `from` to `to`.
     *
     * 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:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     */
    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(from, to, amount);

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

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, amount);
    }

    /** @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 Updates `owner` s allowance for `spender` based on spent `amount`.
     *
     * Does not update the allowance amount in case of infinite allowance.
     * Revert if not enough allowance is available.
     *
     * Might emit an {Approval} event.
     */
    function _spendAllowance(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance != type(uint256).max) {
            require(currentAllowance >= amount, "ERC20: insufficient allowance");
            unchecked {
                _approve(owner, spender, currentAllowance - amount);
            }
        }
    }

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


// File @openzeppelin-4/contracts/token/ERC20/extensions/[email protected]


// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in
 * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].
 *
 * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by
 * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't
 * need to send a transaction, and thus is not required to hold Ether at all.
 */
interface IERC20Permit {
    /**
     * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,
     * given ``owner``'s signed approval.
     *
     * IMPORTANT: The same issues {IERC20-approve} has related to transaction
     * ordering also apply here.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `deadline` must be a timestamp in the future.
     * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`
     * over the EIP712-formatted function arguments.
     * - the signature must use ``owner``'s current nonce (see {nonces}).
     *
     * For more information on the signature format, see the
     * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP
     * section].
     */
    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;

    /**
     * @dev Returns the current nonce for `owner`. This value must be
     * included whenever a signature is generated for {permit}.
     *
     * Every successful call to {permit} increases ``owner``'s nonce by one. This
     * prevents a signature from being used multiple times.
     */
    function nonces(address owner) external view returns (uint256);

    /**
     * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.
     */
    // solhint-disable-next-line func-name-mixedcase
    function DOMAIN_SEPARATOR() external view returns (bytes32);
}


// File @openzeppelin-4/contracts/utils/[email protected]


// OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @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
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 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);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal 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
                /// @solidity memory-safe-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}


// File @openzeppelin-4/contracts/token/ERC20/utils/[email protected]


// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC20/utils/SafeERC20.sol)

pragma solidity ^0.8.0;



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

    function safePermit(
        IERC20Permit token,
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal {
        uint256 nonceBefore = token.nonces(owner);
        token.permit(owner, spender, value, deadline, v, r, s);
        uint256 nonceAfter = token.nonces(owner);
        require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed");
    }

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


// File contracts/BIFI/interfaces/common/IUniswapRouterETH.sol



pragma solidity >=0.6.0 <0.9.0;

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

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

    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB);

    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountToken, uint amountETH);

    function swapExactTokensForTokens(
        uint amountIn, 
        uint amountOutMin, 
        address[] calldata path, 
        address to, 
        uint deadline
    ) external returns (uint[] memory amounts);

    function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);
    
    function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);

    function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
}


// File contracts/BIFI/interfaces/common/IUniswapV2Pair.sol



pragma solidity >=0.6.0 <0.9.0;

interface IUniswapV2Pair {
    function factory() external view returns (address);
    function token0() external view returns (address);
    function token1() external view returns (address);
    function burn(address to) external returns (uint amount0, uint amount1);
    function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
    function totalSupply() external view returns (uint256);
    function kLast() external view returns (uint256);
}


// File contracts/BIFI/interfaces/common/IWrappedNative.sol



pragma solidity >=0.6.0 <0.9.0;

interface IWrappedNative {
    function deposit() external payable;

    function withdraw(uint256 wad) external;
}


// File contracts/BIFI/interfaces/stellaswap/IMasterChefV8.sol



pragma solidity ^0.8.0;


interface IMasterChefV8 {
    function deposit(uint256 _pid, uint256 _amount) external;
    function withdraw(uint256 _pid, uint256 _amount) external;
    function userInfo(uint256 _pid, address _user) external view returns (uint256, uint256, uint256, uint256);
    function emergencyWithdraw(uint256 _pid) external;
    function pendingTokens(uint256 _pid, address _user) external view returns (
        address[] memory addresses,
        string[]  memory symbols,
        uint256[] memory decimals,
        uint256[] memory amounts
    );
}


// File @openzeppelin-4/contracts/access/[email protected]


// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

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

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

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

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

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


// File @openzeppelin-4/contracts/security/[email protected]


// OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol)

pragma solidity ^0.8.0;

/**
 * @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 Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        _requireNotPaused();
        _;
    }

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

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

    /**
     * @dev Throws if the contract is paused.
     */
    function _requireNotPaused() internal view virtual {
        require(!paused(), "Pausable: paused");
    }

    /**
     * @dev Throws if the contract is not paused.
     */
    function _requirePaused() internal view virtual {
        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());
    }
}


// File contracts/BIFI/interfaces/common/IFeeConfig.sol



pragma solidity ^0.8.0;

interface IFeeConfig {
    struct FeeCategory {
        uint256 total;
        uint256 beefy;
        uint256 call;
        uint256 strategist;
        string label;
        bool active;
    }
    function getFees(address strategy) external view returns (FeeCategory memory);
    function stratFeeId(address strategy) external view returns (uint256);
    function setStratFeeId(uint256 feeId) external;
}


// File contracts/BIFI/strategies/Common/StratFeeManager.sol



pragma solidity ^0.8.0;



contract StratFeeManager is Ownable, Pausable {

    struct CommonAddresses {
        address vault;
        address unirouter;
        address keeper;
        address strategist;
        address beefyFeeRecipient;
        address beefyFeeConfig;
    }

    // common addresses for the strategy
    address public vault;
    address public unirouter;
    address public keeper;
    address public strategist;
    address public beefyFeeRecipient;
    IFeeConfig public beefyFeeConfig;

    uint256 constant DIVISOR = 1 ether;
    uint256 constant public WITHDRAWAL_FEE_CAP = 50;
    uint256 constant public WITHDRAWAL_MAX = 10000;
    uint256 public withdrawalFee = 10;

    event SetStratFeeId(uint256 feeId);
    event SetWithdrawalFee(uint256 withdrawalFee);
    event SetVault(address vault);
    event SetUnirouter(address unirouter);
    event SetKeeper(address keeper);
    event SetStrategist(address strategist);
    event SetBeefyFeeRecipient(address beefyFeeRecipient);
    event SetBeefyFeeConfig(address beefyFeeConfig);

    constructor(
        CommonAddresses memory _commonAddresses
    ) {
        vault = _commonAddresses.vault;
        unirouter = _commonAddresses.unirouter;
        keeper = _commonAddresses.keeper;
        strategist = _commonAddresses.strategist;
        beefyFeeRecipient = _commonAddresses.beefyFeeRecipient;
        beefyFeeConfig = IFeeConfig(_commonAddresses.beefyFeeConfig);
    }

    // checks that caller is either owner or keeper.
    modifier onlyManager() {
        require(msg.sender == owner() || msg.sender == keeper, "!manager");
        _;
    }

    // fetch fees from config contract
    function getFees() public view returns (IFeeConfig.FeeCategory memory) {
        return beefyFeeConfig.getFees(address(this));
    }

    function getStratFeeId() external view returns (uint256) {
        return beefyFeeConfig.stratFeeId(address(this));
    }

    function setStratFeeId(uint256 _feeId) external onlyManager {
        beefyFeeConfig.setStratFeeId(_feeId);
        emit SetStratFeeId(_feeId);
    }

    // adjust withdrawal fee
    function setWithdrawalFee(uint256 _fee) public onlyManager {
        require(_fee <= WITHDRAWAL_FEE_CAP, "!cap");
        withdrawalFee = _fee;
        emit SetWithdrawalFee(_fee);
    }

    // set new vault (only for strategy upgrades)
    function setVault(address _vault) external onlyOwner {
        vault = _vault;
        emit SetVault(_vault);
    }

    // set new unirouter
    function setUnirouter(address _unirouter) external onlyOwner {
        unirouter = _unirouter;
        emit SetUnirouter(_unirouter);
    }

    // set new keeper to manage strat
    function setKeeper(address _keeper) external onlyManager {
        keeper = _keeper;
        emit SetKeeper(_keeper);
    }

    // set new strategist address to receive strat fees
    function setStrategist(address _strategist) external {
        require(msg.sender == strategist, "!strategist");
        strategist = _strategist;
        emit SetStrategist(_strategist);
    }

    // set new beefy fee address to receive beefy fees
    function setBeefyFeeRecipient(address _beefyFeeRecipient) external onlyOwner {
        beefyFeeRecipient = _beefyFeeRecipient;
        emit SetBeefyFeeRecipient(_beefyFeeRecipient);
    }

    // set new fee config address to fetch fees
    function setBeefyFeeConfig(address _beefyFeeConfig) external onlyOwner {
        beefyFeeConfig = IFeeConfig(_beefyFeeConfig);
        emit SetBeefyFeeConfig(_beefyFeeConfig);
    }

    function beforeDeposit() external virtual {}
}


// File contracts/BIFI/utils/IGasPrice.sol



pragma solidity >=0.6.0 <0.9.0;

interface IGasPrice {
    function maxGasPrice() external returns (uint);
}


// File contracts/BIFI/utils/GasFeeThrottler.sol



pragma solidity ^0.8.0;


contract GasFeeThrottler {

    bool public shouldGasThrottle = true;

    address public gasprice = address(0xA43509661141F254F54D9A326E8Ec851A0b95307);

    modifier gasThrottle() {
        if (shouldGasThrottle && Address.isContract(gasprice)) {
            require(tx.gasprice <= IGasPrice(gasprice).maxGasPrice(), "gas is too high!");
        }
        _;
    }
}


// File contracts/BIFI/strategies/Stellaswap/StrategyStellaswapMultiRewardsLP.sol



pragma solidity ^0.8.0;
//pragma experimental ABIEncoderV2;







/**
 * Used to compound StellaDistributorV2
 */
contract StrategyStellaswapMultiRewardsLP is StratFeeManager, GasFeeThrottler {
    using SafeERC20 for IERC20;

    // Tokens used
    address public native;
    address public output;
    address public want;
    address public lpToken0;
    address public lpToken1;

    // Third party contracts
    address public chef;
    uint256 public poolId;

    bool public harvestOnDeposit;
    uint256 public lastHarvest;

    // Routes
    address[] public outputToNativeRoute;
    address[] public nativeToLp0Route;
    address[] public nativeToLp1Route;
    address[][] public rewardToNativeRoute;

    event StratHarvest(address indexed harvester, uint256 wantHarvested, uint256 tvl);
    event Deposit(uint256 tvl);
    event Withdraw(uint256 tvl);
    event ChargedFees(uint256 callFees, uint256 beefyFees, uint256 strategistFees);

    constructor(
        address _want,
        uint256 _poolId,
        address _chef,
        CommonAddresses memory _commonAddresses,
        address[] memory _outputToNativeRoute,
        address[] memory _nativeToLp0Route,
        address[] memory _nativeToLp1Route
    ) StratFeeManager(_commonAddresses) {
        want = _want;
        poolId = _poolId;
        chef = _chef;

        output = _outputToNativeRoute[0];
        native = _outputToNativeRoute[_outputToNativeRoute.length - 1];
        outputToNativeRoute = _outputToNativeRoute;

        // setup lp routing
        lpToken0 = IUniswapV2Pair(want).token0();
        require(_nativeToLp0Route[0] == native, "nativeToLp0Route[0] != native");
        require(_nativeToLp0Route[_nativeToLp0Route.length - 1] == lpToken0, "nativeToLp0Route[last] != lpToken0");
        nativeToLp0Route = _nativeToLp0Route;

        lpToken1 = IUniswapV2Pair(want).token1();
        require(_nativeToLp1Route[0] == native, "nativeToLp1Route[0] != native");
        require(_nativeToLp1Route[_nativeToLp1Route.length - 1] == lpToken1, "nativeToLp1Route[last] != lpToken1");
        nativeToLp1Route = _nativeToLp1Route;

        _giveAllowances();
    }

    // puts the funds to work
    function deposit() public whenNotPaused {
        uint256 wantBal = IERC20(want).balanceOf(address(this));

        if (wantBal > 0) {
            IMasterChefV8(chef).deposit(poolId, wantBal);
            emit Deposit(balanceOf());
        }
    }

    function withdraw(uint256 _amount) external {
        require(msg.sender == vault, "!vault");

        uint256 wantBal = IERC20(want).balanceOf(address(this));

        if (wantBal < _amount) {
            IMasterChefV8(chef).withdraw(poolId, _amount - wantBal);
            wantBal = IERC20(want).balanceOf(address(this));
        }

        if (wantBal > _amount) {
            wantBal = _amount;
        }

        if (tx.origin != owner() && !paused()) {
            uint256 withdrawalFeeAmount = wantBal * withdrawalFee / WITHDRAWAL_MAX;
            wantBal = wantBal - withdrawalFeeAmount;
        }

        IERC20(want).safeTransfer(vault, wantBal);

        emit Withdraw(balanceOf());
    }

    function beforeDeposit() external override {
        if (harvestOnDeposit) {
            require(msg.sender == vault, "!vault");
            _harvest(tx.origin);
        }
    }

    function harvest() external gasThrottle virtual {
        _harvest(tx.origin);
    }

    function harvest(address callFeeRecipient) external gasThrottle virtual {
        _harvest(callFeeRecipient);
    }

    function managerHarvest() external onlyManager {
        _harvest(tx.origin);
    }

    // compounds earnings and charges performance fee
    function _harvest(address callFeeRecipient) internal whenNotPaused{
        IMasterChefV8(chef).deposit(poolId, 0);
        uint256 outputBal = IERC20(output).balanceOf(address(this));
        if (outputBal > 0) {
            _convertRewards();
            chargeFees(callFeeRecipient);
            addLiquidity();
            uint256 wantHarvested = balanceOfWant();
            deposit();

            lastHarvest = block.timestamp;
            emit StratHarvest(msg.sender, wantHarvested, balanceOf());
        }
    }

    // converts rewards to native
    function _convertRewards() internal {
        // unwrap any native
        uint256 nativeBal = address(this).balance;
        if (nativeBal > 0) {
            IWrappedNative(native).deposit{value: nativeBal}();
        }
        // convert any output to native
        uint256 outputBal = IERC20(output).balanceOf(address(this));
        IUniswapRouterETH(unirouter).swapExactTokensForTokens(outputBal, 0, outputToNativeRoute, address(this), block.timestamp);

        // convert additional rewards
        if (rewardToNativeRoute.length != 0) {
            for (uint i; i < rewardToNativeRoute.length; i++) {
                uint256 toNative = IERC20(rewardToNativeRoute[i][0]).balanceOf(address(this));
                if (toNative > 0) {
                    IUniswapRouterETH(unirouter).swapExactTokensForTokens(toNative, 0, rewardToNativeRoute[i], address(this), block.timestamp);
                }
            }
        }
    }

    // performance fees
    function chargeFees(address callFeeRecipient) internal {
        IFeeConfig.FeeCategory memory fees = getFees();
        uint256 nativeFeesOwed = IERC20(native).balanceOf(address(this)) * fees.total / DIVISOR;

        uint256 callFeeAmount = nativeFeesOwed * fees.call / DIVISOR;
        IERC20(native).safeTransfer(callFeeRecipient, callFeeAmount);

        uint256 beefyFeeAmount = nativeFeesOwed * fees.beefy / DIVISOR;
        IERC20(native).safeTransfer(beefyFeeRecipient, beefyFeeAmount);

        uint256 strategistFeeAmount = nativeFeesOwed * fees.strategist / DIVISOR;
        IERC20(native).safeTransfer(strategist, strategistFeeAmount);

        emit ChargedFees(callFeeAmount, beefyFeeAmount, strategistFeeAmount);
    }

    // Adds liquidity to AMM and gets more LP tokens.
    function addLiquidity() internal {
        uint256 nativeHalf = IERC20(native).balanceOf(address(this)) / 2;

        if (lpToken0 != native) {
            IUniswapRouterETH(unirouter).swapExactTokensForTokens(nativeHalf, 0, nativeToLp0Route, address(this), block.timestamp);
        }

        if (lpToken1 != native) {
            IUniswapRouterETH(unirouter).swapExactTokensForTokens(nativeHalf, 0, nativeToLp1Route, address(this), block.timestamp);
        }

        uint256 lp0Bal = IERC20(lpToken0).balanceOf(address(this));
        uint256 lp1Bal = IERC20(lpToken1).balanceOf(address(this));
        IUniswapRouterETH(unirouter).addLiquidity(lpToken0, lpToken1, lp0Bal, lp1Bal, 1, 1, address(this), block.timestamp);
    }

    // calculate the total underlaying 'want' held by the strat.
    function balanceOf() public view returns (uint256) {
        return balanceOfWant() + balanceOfPool();
    }

    // it calculates how much 'want' this contract holds.
    function balanceOfWant() public view returns (uint256) {
        return IERC20(want).balanceOf(address(this));
    }

    // it calculates how much 'want' the strategy has working in the farm.
    function balanceOfPool() public view returns (uint256) {
        (uint256 _amount,,,) = IMasterChefV8(chef).userInfo(poolId, address(this));
        return _amount;
    }

    function rewardsAvailable() public view returns (address[] memory, uint256[] memory) {
        (address[] memory addresses,,,uint256[] memory amounts) = IMasterChefV8(chef).pendingTokens(poolId, address(this));
        return (addresses, amounts);
    }

    function callReward() public view returns (uint256) {
        IFeeConfig.FeeCategory memory fees = getFees();
        (address[] memory rewardAdd, uint256[] memory rewardBal) = rewardsAvailable();
        uint256 nativeOut;
        try IUniswapRouterETH(unirouter).getAmountsOut(rewardBal[0], outputToNativeRoute)
        returns (uint256[] memory amountOut) {
            nativeOut = amountOut[amountOut.length - 1];
        } catch {}

        if (rewardToNativeRoute.length != 0) {
            for (uint i; i < rewardToNativeRoute.length; i++) {
                for (uint j = 1; j < rewardAdd.length; j++) {
                    if (rewardAdd[j] == rewardToNativeRoute[i][0]) {
                        try IUniswapRouterETH(unirouter).getAmountsOut(rewardBal[j], rewardToNativeRoute[i])
                        returns (uint256[] memory amountOut) {
                           nativeOut = nativeOut + amountOut[amountOut.length - 1];
                        } catch {}
                    }
                }
            }
        }

        return nativeOut * fees.total / DIVISOR * fees.call / DIVISOR;
    }

    function setHarvestOnDeposit(bool _harvestOnDeposit) external onlyManager {
        harvestOnDeposit = _harvestOnDeposit;

        if (harvestOnDeposit) {
            setWithdrawalFee(0);
        } else {
            setWithdrawalFee(10);
        }
    }

    function setShouldGasThrottle(bool _shouldGasThrottle) external onlyManager {
        shouldGasThrottle = _shouldGasThrottle;
    }

    // called as part of strat migration. Sends all the available funds back to the vault.
    function retireStrat() external {
        require(msg.sender == vault, "!vault");

        IMasterChefV8(chef).emergencyWithdraw(poolId);

        uint256 wantBal = IERC20(want).balanceOf(address(this));
        IERC20(want).transfer(vault, wantBal);
    }

    // pauses deposits and withdraws all funds from third party systems.
    function panic() public onlyManager {
        pause();
        IMasterChefV8(chef).emergencyWithdraw(poolId);
    }

    function pause() public onlyManager {
        _pause();

        _removeAllowances();
    }

    function unpause() external onlyManager {
        _unpause();

        _giveAllowances();

        deposit();
    }

    function _giveAllowances() internal {
        IERC20(want).safeApprove(chef, type(uint).max);
        IERC20(output).safeApprove(unirouter, type(uint).max);

        IERC20(native).safeApprove(unirouter, 0);
        IERC20(native).safeApprove(unirouter, type(uint).max);

        IERC20(lpToken0).safeApprove(unirouter, 0);
        IERC20(lpToken0).safeApprove(unirouter, type(uint).max);

        IERC20(lpToken1).safeApprove(unirouter, 0);
        IERC20(lpToken1).safeApprove(unirouter, type(uint).max);

        if (rewardToNativeRoute.length != 0) {
            for (uint i; i < rewardToNativeRoute.length; i++) {
                IERC20(rewardToNativeRoute[i][0]).safeApprove(unirouter, 0);
                IERC20(rewardToNativeRoute[i][0]).safeApprove(unirouter, type(uint).max);
            }
        }
    }

    function _removeAllowances() internal {
        IERC20(want).safeApprove(chef, 0);
        IERC20(output).safeApprove(unirouter, 0);

        IERC20(lpToken0).safeApprove(unirouter, 0);
        IERC20(lpToken1).safeApprove(unirouter, 0);

        if (rewardToNativeRoute.length != 0) {
            for (uint i; i < rewardToNativeRoute.length; i++) {
                IERC20(rewardToNativeRoute[i][0]).safeApprove(unirouter, 0);
            }
        }
    }

    function addRewardRoute(address[] memory _rewardToNativeRoute) external onlyOwner {
        IERC20(_rewardToNativeRoute[0]).safeApprove(unirouter, 0);
        IERC20(_rewardToNativeRoute[0]).safeApprove(unirouter, type(uint).max);
        rewardToNativeRoute.push(_rewardToNativeRoute);
    }

    function removeLastRewardRoute() external onlyManager {
        address reward = rewardToNativeRoute[rewardToNativeRoute.length - 1][0];
        if (reward != lpToken0 && reward != lpToken1) {
            IERC20(reward).safeApprove(unirouter, 0);
        }
        rewardToNativeRoute.pop();
    }

    function outputToNative() external view returns (address[] memory) {
        return outputToNativeRoute;
    }

    function nativeToLp0() external view returns (address[] memory) {
        return nativeToLp0Route;
    }

    function nativeToLp1() external view returns (address[] memory) {
        return nativeToLp1Route;
    }

    function rewardToNative() external view returns (address[][] memory) {
        return rewardToNativeRoute;
    }

    receive () external payable {}
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"address","name":"_want","type":"address"},{"internalType":"uint256","name":"_poolId","type":"uint256"},{"internalType":"address","name":"_chef","type":"address"},{"components":[{"internalType":"address","name":"vault","type":"address"},{"internalType":"address","name":"unirouter","type":"address"},{"internalType":"address","name":"keeper","type":"address"},{"internalType":"address","name":"strategist","type":"address"},{"internalType":"address","name":"beefyFeeRecipient","type":"address"},{"internalType":"address","name":"beefyFeeConfig","type":"address"}],"internalType":"struct StratFeeManager.CommonAddresses","name":"_commonAddresses","type":"tuple"},{"internalType":"address[]","name":"_outputToNativeRoute","type":"address[]"},{"internalType":"address[]","name":"_nativeToLp0Route","type":"address[]"},{"internalType":"address[]","name":"_nativeToLp1Route","type":"address[]"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"callFees","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"beefyFees","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"strategistFees","type":"uint256"}],"name":"ChargedFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tvl","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"beefyFeeConfig","type":"address"}],"name":"SetBeefyFeeConfig","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"beefyFeeRecipient","type":"address"}],"name":"SetBeefyFeeRecipient","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"keeper","type":"address"}],"name":"SetKeeper","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"feeId","type":"uint256"}],"name":"SetStratFeeId","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"strategist","type":"address"}],"name":"SetStrategist","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"unirouter","type":"address"}],"name":"SetUnirouter","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"vault","type":"address"}],"name":"SetVault","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"withdrawalFee","type":"uint256"}],"name":"SetWithdrawalFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"harvester","type":"address"},{"indexed":false,"internalType":"uint256","name":"wantHarvested","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tvl","type":"uint256"}],"name":"StratHarvest","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tvl","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"WITHDRAWAL_FEE_CAP","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WITHDRAWAL_MAX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_rewardToNativeRoute","type":"address[]"}],"name":"addRewardRoute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"balanceOfPool","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"balanceOfWant","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"beefyFeeConfig","outputs":[{"internalType":"contract IFeeConfig","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"beefyFeeRecipient","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"beforeDeposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"callReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"chef","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"gasprice","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getFees","outputs":[{"components":[{"internalType":"uint256","name":"total","type":"uint256"},{"internalType":"uint256","name":"beefy","type":"uint256"},{"internalType":"uint256","name":"call","type":"uint256"},{"internalType":"uint256","name":"strategist","type":"uint256"},{"internalType":"string","name":"label","type":"string"},{"internalType":"bool","name":"active","type":"bool"}],"internalType":"struct IFeeConfig.FeeCategory","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getStratFeeId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"callFeeRecipient","type":"address"}],"name":"harvest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"harvest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"harvestOnDeposit","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"keeper","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastHarvest","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpToken0","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpToken1","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"managerHarvest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"native","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nativeToLp0","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"nativeToLp0Route","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nativeToLp1","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"nativeToLp1Route","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"output","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"outputToNative","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"outputToNativeRoute","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"panic","outputs":[],"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":[],"name":"poolId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"removeLastRewardRoute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"retireStrat","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardToNative","outputs":[{"internalType":"address[][]","name":"","type":"address[][]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"rewardToNativeRoute","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardsAvailable","outputs":[{"internalType":"address[]","name":"","type":"address[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_beefyFeeConfig","type":"address"}],"name":"setBeefyFeeConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_beefyFeeRecipient","type":"address"}],"name":"setBeefyFeeRecipient","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_harvestOnDeposit","type":"bool"}],"name":"setHarvestOnDeposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_keeper","type":"address"}],"name":"setKeeper","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_shouldGasThrottle","type":"bool"}],"name":"setShouldGasThrottle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_feeId","type":"uint256"}],"name":"setStratFeeId","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_strategist","type":"address"}],"name":"setStrategist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_unirouter","type":"address"}],"name":"setUnirouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_vault","type":"address"}],"name":"setVault","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_fee","type":"uint256"}],"name":"setWithdrawalFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"shouldGasThrottle","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"strategist","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unirouter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"vault","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"want","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawalFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

6080604052600a600755600880546001600160a81b03191674a43509661141f254f54d9a326e8ec851a0b95307011790553480156200003d57600080fd5b5060405162004d3d38038062004d3d833981016040819052620000609162000d35565b836200006c336200056d565b6000805460ff60a01b191681558151600180546001600160a01b03199081166001600160a01b0393841617909155602084015160028054831691841691909117905560408401516003805483169184169190911790556060840151600480548316918416919091179055608084015160058054831691841691909117905560a090930151600680548516918316919091179055600b805484168b8316179055600f899055600e805490931690881617909155835184919062000132576200013262000e8e565b6020026020010151600a60006101000a8154816001600160a01b0302191690836001600160a01b03160217905550826001845162000171919062000eba565b8151811062000184576200018462000e8e565b602090810291909101810151600980546001600160a01b0319166001600160a01b039092169190911790558351620001c3916012919086019062000bb4565b50600b60009054906101000a90046001600160a01b03166001600160a01b0316630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000218573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200023e919062000ed4565b600c80546001600160a01b0319166001600160a01b039283161790556009548351911690839060009062000276576200027662000e8e565b60200260200101516001600160a01b031614620002da5760405162461bcd60e51b815260206004820152601d60248201527f6e6174697665546f4c7030526f7574655b305d20213d206e617469766500000060448201526064015b60405180910390fd5b600c5482516001600160a01b03909116908390620002fb9060019062000eba565b815181106200030e576200030e62000e8e565b60200260200101516001600160a01b031614620003795760405162461bcd60e51b815260206004820152602260248201527f6e6174697665546f4c7030526f7574655b6c6173745d20213d206c70546f6b6560448201526106e360f41b6064820152608401620002d1565b81516200038e90601390602085019062000bb4565b50600b60009054906101000a90046001600160a01b03166001600160a01b031663d21220a76040518163ffffffff1660e01b8152600401602060405180830381865afa158015620003e3573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000409919062000ed4565b600d80546001600160a01b0319166001600160a01b039283161790556009548251911690829060009062000441576200044162000e8e565b60200260200101516001600160a01b031614620004a15760405162461bcd60e51b815260206004820152601d60248201527f6e6174697665546f4c7031526f7574655b305d20213d206e61746976650000006044820152606401620002d1565b600d5481516001600160a01b03909116908290620004c29060019062000eba565b81518110620004d557620004d562000e8e565b60200260200101516001600160a01b031614620005405760405162461bcd60e51b815260206004820152602260248201527f6e6174697665546f4c7031526f7574655b6c6173745d20213d206c70546f6b656044820152616e3160f01b6064820152608401620002d1565b80516200055590601490602084019062000bb4565b5062000560620005bd565b5050505050505062000fd2565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600e54600b54620005ea916001600160a01b039182169116600019620007f2602090811b620021e317901c565b600254600a5462000617916001600160a01b039182169116600019620007f2602090811b620021e317901c565b60025460095462000643916001600160a01b0391821691166000620007f2602090811b620021e317901c565b60025460095462000670916001600160a01b039182169116600019620007f2602090811b620021e317901c565b600254600c546200069c916001600160a01b0391821691166000620007f2602090811b620021e317901c565b600254600c54620006c9916001600160a01b039182169116600019620007f2602090811b620021e317901c565b600254600d54620006f5916001600160a01b0391821691166000620007f2602090811b620021e317901c565b600254600d5462000722916001600160a01b039182169116600019620007f2602090811b620021e317901c565b60155415620007f05760005b601554811015620007ee5760025460158054620007ac926001600160a01b0316916000918590811062000765576200076562000e8e565b9060005260206000200160008154811062000784576200078462000e8e565b600091825260209182902001546001600160a01b0316929190620021e3620007f2821b17901c565b60025460158054620007d9926001600160a01b031691600019918590811062000765576200076562000e8e565b80620007e58162000ef2565b9150506200072e565b505b565b801580620008705750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e90604401602060405180830381865afa15801562000848573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200086e919062000f0e565b155b620008e45760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006064820152608401620002d1565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b179091526200093c9185916200094116565b505050565b60006200099d826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031662000a1f60201b62002330179092919060201c565b8051909150156200093c5780806020019051810190620009be919062000f28565b6200093c5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401620002d1565b606062000a30848460008562000a3a565b90505b9392505050565b60608247101562000a9d5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401620002d1565b6001600160a01b0385163b62000af65760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401620002d1565b600080866001600160a01b0316858760405162000b14919062000f7f565b60006040518083038185875af1925050503d806000811462000b53576040519150601f19603f3d011682016040523d82523d6000602084013e62000b58565b606091505b50909250905062000b6b82828662000b76565b979650505050505050565b6060831562000b8757508162000a33565b82511562000b985782518084602001fd5b8160405162461bcd60e51b8152600401620002d1919062000f9d565b82805482825590600052602060002090810192821562000c0c579160200282015b8281111562000c0c57825182546001600160a01b0319166001600160a01b0390911617825560209092019160019091019062000bd5565b5062000c1a92915062000c1e565b5090565b5b8082111562000c1a576000815560010162000c1f565b80516001600160a01b038116811462000c4d57600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60405160c081016001600160401b038111828210171562000c8d5762000c8d62000c52565b60405290565b600082601f83011262000ca557600080fd5b815160206001600160401b038083111562000cc45762000cc462000c52565b8260051b604051601f19603f8301168101818110848211171562000cec5762000cec62000c52565b60405293845285810183019383810192508785111562000d0b57600080fd5b83870191505b8482101562000b6b5762000d258262000c35565b8352918301919083019062000d11565b600080600080600080600087890361018081121562000d5357600080fd5b62000d5e8962000c35565b97506020890151965062000d7560408a0162000c35565b955060c0605f198201121562000d8a57600080fd5b5062000d9562000c68565b62000da360608a0162000c35565b815262000db360808a0162000c35565b602082015262000dc660a08a0162000c35565b604082015262000dd960c08a0162000c35565b606082015262000dec60e08a0162000c35565b608082015262000e006101008a0162000c35565b60a08201526101208901519094506001600160401b038082111562000e2457600080fd5b62000e328b838c0162000c93565b94506101408a015191508082111562000e4a57600080fd5b62000e588b838c0162000c93565b93506101608a015191508082111562000e7057600080fd5b5062000e7f8a828b0162000c93565b91505092959891949750929550565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60008282101562000ecf5762000ecf62000ea4565b500390565b60006020828403121562000ee757600080fd5b62000a338262000c35565b60006001820162000f075762000f0762000ea4565b5060010190565b60006020828403121562000f2157600080fd5b5051919050565b60006020828403121562000f3b57600080fd5b8151801515811462000a3357600080fd5b60005b8381101562000f6957818101518382015260200162000f4f565b8381111562000f79576000848401525b50505050565b6000825162000f9381846020870162000f4c565b9190910192915050565b602081526000825180602084015262000fbe81604085016020870162000f4c565b601f01601f19169190910160400192915050565b613d5b8062000fe26000396000f3fe6080604052600436106103a65760003560e01c80638912cb8b116101e7578063d0e30db01161010d578063e7a7250a116100a0578063f2fde38b1161006f578063f2fde38b14610a27578063fad4675e14610a47578063fb61778714610a67578063fbfa77cf14610a7c57600080fd5b8063e7a7250a146109b9578063ea82eb9e146109dc578063f1a392da146109f1578063f20eaeb814610a0757600080fd5b8063db8d55f1116100dc578063db8d55f114610942578063dc4987cc14610964578063dfbdc43714610984578063e270dbf31461099957600080fd5b8063d0e30db0146108d6578063d801d946146108eb578063d92f3d7314610900578063da512c341461092057600080fd5b8063a39219f911610185578063be12a97811610154578063be12a97814610861578063c1a3d44c14610881578063c7b9d53014610896578063cc289480146108b657600080fd5b8063a39219f9146107ec578063a68833e514610801578063ac1e502514610821578063aced16611461084157600080fd5b80638da5cb5b116101c15780638da5cb5b1461077f5780638e1454591461079d57806397fd323d146107bd5780639f8b5da1146107d257600080fd5b80638912cb8b1461073a5780638bc7e8c4146107545780638cfc02501461076a57600080fd5b80634641257d116102cc5780636817031b1161026a578063722713f711610239578063722713f7146106d0578063748747e6146106e55780638456cb5914610705578063877562b61461071a57600080fd5b80636817031b146106565780636ec232d31461067657806370672d501461069b578063715018a6146106bb57600080fd5b806354518b1a116102a657806354518b1a146105e0578063573fef0a146105f65780635c975abb1461060b5780635ee167c01461063657600080fd5b80634641257d146105965780634700d305146105ab5780634746fb55146105c057600080fd5b80631fc8bc5d1161034457806337bdd2041161031357806337bdd204146105365780633e0dc34e1461054b5780633e55f932146105615780633f4ba83a1461058157600080fd5b80631fc8bc5d146104b65780631fe4a686146104d6578063257ae0de146104f65780632e1a7d4d1461051657600080fd5b80631158808611610380578063115880861461041457806311b0b42d1461043c57806313e120b1146104745780631f1fcd511461049657600080fd5b80630e5c011e146103b25780630e8fbb5a146103d4578063106fdbd0146103f457600080fd5b366103ad57005b600080fd5b3480156103be57600080fd5b506103d26103cd3660046133db565b610a9c565b005b3480156103e057600080fd5b506103d26103ef366004613406565b610b8f565b34801561040057600080fd5b506103d261040f3660046133db565b610bfb565b34801561042057600080fd5b50610429610c58565b6040519081526020015b60405180910390f35b34801561044857600080fd5b5060095461045c906001600160a01b031681565b6040516001600160a01b039091168152602001610433565b34801561048057600080fd5b50610489610cde565b6040516104339190613467565b3480156104a257600080fd5b50600b5461045c906001600160a01b031681565b3480156104c257600080fd5b50600e5461045c906001600160a01b031681565b3480156104e257600080fd5b5060045461045c906001600160a01b031681565b34801561050257600080fd5b5060025461045c906001600160a01b031681565b34801561052257600080fd5b506103d261053136600461347a565b610d40565b34801561054257600080fd5b50610489610f85565b34801561055757600080fd5b50610429600f5481565b34801561056d57600080fd5b506103d261057c36600461347a565b610fe5565b34801561058d57600080fd5b506103d26110b3565b3480156105a257600080fd5b506103d261110c565b3480156105b757600080fd5b506103d26111f7565b3480156105cc57600080fd5b5060065461045c906001600160a01b031681565b3480156105ec57600080fd5b5061042961271081565b34801561060257600080fd5b506103d26112a7565b34801561061757600080fd5b50600054600160a01b900460ff165b6040519015158152602001610433565b34801561064257600080fd5b50600c5461045c906001600160a01b031681565b34801561066257600080fd5b506103d26106713660046133db565b6112dc565b34801561068257600080fd5b5060085461045c9061010090046001600160a01b031681565b3480156106a757600080fd5b5061045c6106b6366004613493565b611332565b3480156106c757600080fd5b506103d2611376565b3480156106dc57600080fd5b50610429611388565b3480156106f157600080fd5b506103d26107003660046133db565b6113a9565b34801561071157600080fd5b506103d2611436565b34801561072657600080fd5b50600d5461045c906001600160a01b031681565b34801561074657600080fd5b506010546106269060ff1681565b34801561076057600080fd5b5061042960075481565b34801561077657600080fd5b50610429611485565b34801561078b57600080fd5b506000546001600160a01b031661045c565b3480156107a957600080fd5b5060055461045c906001600160a01b031681565b3480156107c957600080fd5b506104296114f3565b3480156107de57600080fd5b506008546106269060ff1681565b3480156107f857600080fd5b506103d26117c8565b34801561080d57600080fd5b506103d261081c3660046133db565b6118d3565b34801561082d57600080fd5b506103d261083c36600461347a565b611929565b34801561084d57600080fd5b5060035461045c906001600160a01b031681565b34801561086d57600080fd5b5061045c61087c36600461347a565b6119d7565b34801561088d57600080fd5b50610429611a01565b3480156108a257600080fd5b506103d26108b13660046133db565b611a32565b3480156108c257600080fd5b506103d26108d1366004613549565b611ac8565b3480156108e257600080fd5b506103d2611b85565b3480156108f757600080fd5b506103d2611ca7565b34801561090c57600080fd5b506103d261091b3660046133db565b611ce6565b34801561092c57600080fd5b50610935611d3c565b60405161043391906135dd565b34801561094e57600080fd5b50610957611ddf565b60405161043391906136c8565b34801561097057600080fd5b5061045c61097f36600461347a565b611e8a565b34801561099057600080fd5b50610429603281565b3480156109a557600080fd5b5061045c6109b436600461347a565b611e9a565b3480156109c557600080fd5b506109ce611eaa565b604051610433929190613724565b3480156109e857600080fd5b50610489611f40565b3480156109fd57600080fd5b5061042960115481565b348015610a1357600080fd5b50600a5461045c906001600160a01b031681565b348015610a3357600080fd5b506103d2610a423660046133db565b611fa0565b348015610a5357600080fd5b506103d2610a62366004613406565b612016565b348015610a7357600080fd5b506103d2612068565b348015610a8857600080fd5b5060015461045c906001600160a01b031681565b60085460ff168015610abe575060085461010090046001600160a01b03163b15155b15610b8357600860019054906101000a90046001600160a01b03166001600160a01b0316633de39c116040518163ffffffff1660e01b81526004016020604051808303816000875af1158015610b18573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b3c919061377b565b3a1115610b835760405162461bcd60e51b815260206004820152601060248201526f67617320697320746f6f20686967682160801b60448201526064015b60405180910390fd5b610b8c81612349565b50565b6000546001600160a01b0316331480610bb257506003546001600160a01b031633145b610bce5760405162461bcd60e51b8152600401610b7a90613794565b6010805460ff191682151590811790915560ff1615610bf157610b8c6000611929565b610b8c600a611929565b610c036124aa565b600680546001600160a01b0319166001600160a01b0383169081179091556040519081527f91e28ce4210d103c13c5174847e463b836900f8dc63e9d9b42a4255169d19529906020015b60405180910390a150565b600e54600f546040516393f1a40b60e01b8152600481019190915230602482015260009182916001600160a01b03909116906393f1a40b90604401608060405180830381865afa158015610cb0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cd491906137b6565b5091949350505050565b60606012805480602002602001604051908101604052809291908181526020018280548015610d3657602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610d18575b5050505050905090565b6001546001600160a01b03163314610d6a5760405162461bcd60e51b8152600401610b7a906137ec565b600b546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015610db3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dd7919061377b565b905081811015610ec857600e54600f546001600160a01b039091169063441a3e7090610e038486613822565b6040516001600160e01b031960e085901b16815260048101929092526024820152604401600060405180830381600087803b158015610e4157600080fd5b505af1158015610e55573d6000803e3d6000fd5b5050600b546040516370a0823160e01b81523060048201526001600160a01b0390911692506370a082319150602401602060405180830381865afa158015610ea1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ec5919061377b565b90505b81811115610ed35750805b6000546001600160a01b03163214801590610ef85750600054600160a01b900460ff16155b15610f2a57600061271060075483610f109190613839565b610f1a9190613858565b9050610f268183613822565b9150505b600154600b54610f47916001600160a01b03918216911683612504565b7f5b6b431d4476a211bb7d41c20d1aab9ae2321deee0d20be3d9fc9b1093fa6e3d610f70611388565b60405190815260200160405180910390a15050565b60606014805480602002602001604051908101604052809291908181526020018280548015610d36576020028201919060005260206000209081546001600160a01b03168152600190910190602001808311610d18575050505050905090565b6000546001600160a01b031633148061100857506003546001600160a01b031633145b6110245760405162461bcd60e51b8152600401610b7a90613794565b600654604051631f2afc9960e11b8152600481018390526001600160a01b0390911690633e55f93290602401600060405180830381600087803b15801561106a57600080fd5b505af115801561107e573d6000803e3d6000fd5b505050507f9163810ee1e29168d4ce900e48a333fb8fbd3fd070d2bef67f6d4db0846a469f81604051610c4d91815260200190565b6000546001600160a01b03163314806110d657506003546001600160a01b031633145b6110f25760405162461bcd60e51b8152600401610b7a90613794565b6110fa612534565b611102612589565b61110a611b85565b565b60085460ff16801561112e575060085461010090046001600160a01b03163b15155b156111ee57600860019054906101000a90046001600160a01b03166001600160a01b0316633de39c116040518163ffffffff1660e01b81526004016020604051808303816000875af1158015611188573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111ac919061377b565b3a11156111ee5760405162461bcd60e51b815260206004820152601060248201526f67617320697320746f6f20686967682160801b6044820152606401610b7a565b61110a32612349565b6000546001600160a01b031633148061121a57506003546001600160a01b031633145b6112365760405162461bcd60e51b8152600401610b7a90613794565b61123e611436565b600e54600f54604051632989754760e11b81526001600160a01b0390921691635312ea8e916112739160040190815260200190565b600060405180830381600087803b15801561128d57600080fd5b505af11580156112a1573d6000803e3d6000fd5b50505050565b60105460ff161561110a576001546001600160a01b031633146111ee5760405162461bcd60e51b8152600401610b7a906137ec565b6112e46124aa565b600180546001600160a01b0319166001600160a01b0383169081179091556040519081527fd459c7242e23d490831b5676a611c4342d899d28f342d89ae80793e56a930f3090602001610c4d565b6015828154811061134257600080fd5b90600052602060002001818154811061135a57600080fd5b6000918252602090912001546001600160a01b03169150829050565b61137e6124aa565b61110a600061272e565b6000611392610c58565b61139a611a01565b6113a4919061387a565b905090565b6000546001600160a01b03163314806113cc57506003546001600160a01b031633145b6113e85760405162461bcd60e51b8152600401610b7a90613794565b600380546001600160a01b0319166001600160a01b0383169081179091556040519081527fefb5cfa1a8690c124332ab93324539c5c9c4be03f28aeb8be86f2d8a0c9fb99b90602001610c4d565b6000546001600160a01b031633148061145957506003546001600160a01b031633145b6114755760405162461bcd60e51b8152600401610b7a90613794565b61147d61277e565b61110a6127c1565b600654604051636788231160e11b81523060048201526000916001600160a01b03169063cf104622906024015b602060405180830381865afa1580156114cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113a4919061377b565b6000806114fe611ddf565b905060008061150b611eaa565b915091506000600260009054906101000a90046001600160a01b03166001600160a01b031663d06ca61f8360008151811061154857611548613892565b602002602001015160126040518363ffffffff1660e01b815260040161156f9291906138e6565b600060405180830381865afa9250505080156115ad57506040513d6000823e601f3d908101601f191682016040526115aa9190810190613965565b60015b156115dd5780600182516115c19190613822565b815181106115d1576115d1613892565b60200260200101519150505b6015541561177a5760005b6015548110156117785760015b8451811015611765576015828154811061161157611611613892565b9060005260206000200160008154811061162d5761162d613892565b60009182526020909120015485516001600160a01b039091169086908390811061165957611659613892565b60200260200101516001600160a01b0316036117535760025484516001600160a01b039091169063d06ca61f9086908490811061169857611698613892565b6020026020010151601585815481106116b3576116b3613892565b906000526020600020016040518363ffffffff1660e01b81526004016116da9291906138e6565b600060405180830381865afa92505050801561171857506040513d6000823e601f3d908101601f191682016040526117159190810190613965565b60015b1561175357806001825161172c9190613822565b8151811061173c5761173c613892565b60200260200101518461174f919061387a565b9350505b8061175d816139a2565b9150506115f5565b5080611770816139a2565b9150506115e8565b505b670de0b6b3a76400008460400151670de0b6b3a76400008660000151846117a19190613839565b6117ab9190613858565b6117b59190613839565b6117bf9190613858565b94505050505090565b6000546001600160a01b03163314806117eb57506003546001600160a01b031633145b6118075760405162461bcd60e51b8152600401610b7a90613794565b601580546000919061181b90600190613822565b8154811061182b5761182b613892565b9060005260206000200160008154811061184757611847613892565b600091825260209091200154600c546001600160a01b0391821692501681148015906118815750600d546001600160a01b03828116911614155b156118a1576002546118a1906001600160a01b03838116911660006121e3565b60158054806118b2576118b26139bb565b6001900381819060005260206000200160006118ce919061332e565b905550565b6118db6124aa565b600580546001600160a01b0319166001600160a01b0383169081179091556040519081527f8041329bf7057543a2c2ff4e4071d1d488a31f82ed44e169b5cd2f04f5e3ac8590602001610c4d565b6000546001600160a01b031633148061194c57506003546001600160a01b031633145b6119685760405162461bcd60e51b8152600401610b7a90613794565b60328111156119a25760405162461bcd60e51b8152600401610b7a906020808252600490820152630216361760e41b604082015260600190565b60078190556040518181527f3aa4413905e8f015896ec5880bdde24088ccb19b578f9fcf6800354d5320d4af90602001610c4d565b601281815481106119e757600080fd5b6000918252602090912001546001600160a01b0316905081565b600b546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a08231906024016114b2565b6004546001600160a01b03163314611a7a5760405162461bcd60e51b815260206004820152600b60248201526a085cdd1c985d1959da5cdd60aa1b6044820152606401610b7a565b600480546001600160a01b0319166001600160a01b0383169081179091556040519081527f46d58e3fa07bf19b1d27240f0e286b27e9f7c1b0d88933333fe833b60eec541290602001610c4d565b611ad06124aa565b6002548151611b16916001600160a01b03169060009084908290611af657611af6613892565b60200260200101516001600160a01b03166121e39092919063ffffffff16565b6002548151611b3e916001600160a01b031690600019908490600090611af657611af6613892565b601580546001810182556000919091528151611b81917f55f448fdea98c4d29eb340757ef0a66cd03dbb9538908a6a81d96026b71ec4750190602084019061334c565b5050565b611b8d612888565b600b546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015611bd6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bfa919061377b565b90508015610b8c57600e54600f54604051631c57762b60e31b81526001600160a01b039092169163e2bbb15891611c3e918590600401918252602082015260400190565b600060405180830381600087803b158015611c5857600080fd5b505af1158015611c6c573d6000803e3d6000fd5b505050507f4d6ce1e535dbade1c23defba91e23b8f791ce5edc0cc320257a2b364e4e38426611c99611388565b604051908152602001610c4d565b6000546001600160a01b0316331480611cca57506003546001600160a01b031633145b6111ee5760405162461bcd60e51b8152600401610b7a90613794565b611cee6124aa565b600280546001600160a01b0319166001600160a01b0383169081179091556040519081527f5ca6e64c4522e68e154aa9372f2c5969cd37d9640e59f66953dc472f54ee86fa90602001610c4d565b60606015805480602002602001604051908101604052809291908181526020016000905b82821015611dd657600084815260209081902083018054604080518285028101850190915281815292830182828015611dc257602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611da4575b505050505081526020019060010190611d60565b50505050905090565b611e1a6040518060c0016040528060008152602001600081526020016000815260200160008152602001606081526020016000151581525090565b600654604051639af608c960e01b81523060048201526001600160a01b0390911690639af608c990602401600060405180830381865afa158015611e62573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526113a49190810190613a35565b601481815481106119e757600080fd5b601381815481106119e757600080fd5b600e54600f5460405160016232bd9d60e01b031981526004810191909152306024820152606091829160009182916001600160a01b039091169063ffcd426390604401600060405180830381865afa158015611f0a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611f329190810190613b61565b929792965091945050505050565b60606013805480602002602001604051908101604052809291908181526020018280548015610d36576020028201919060005260206000209081546001600160a01b03168152600190910190602001808311610d18575050505050905090565b611fa86124aa565b6001600160a01b03811661200d5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b7a565b610b8c8161272e565b6000546001600160a01b031633148061203957506003546001600160a01b031633145b6120555760405162461bcd60e51b8152600401610b7a90613794565b6008805460ff1916911515919091179055565b6001546001600160a01b031633146120925760405162461bcd60e51b8152600401610b7a906137ec565b600e54600f54604051632989754760e11b81526001600160a01b0390921691635312ea8e916120c79160040190815260200190565b600060405180830381600087803b1580156120e157600080fd5b505af11580156120f5573d6000803e3d6000fd5b5050600b546040516370a0823160e01b8152306004820152600093506001600160a01b0390911691506370a0823190602401602060405180830381865afa158015612144573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612168919061377b565b600b5460015460405163a9059cbb60e01b81526001600160a01b03918216600482015260248101849052929350169063a9059cbb906044016020604051808303816000875af11580156121bf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b819190613c6f565b80158061225d5750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e90604401602060405180830381865afa158015612237573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061225b919061377b565b155b6122c85760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b6064820152608401610b7a565b6040516001600160a01b03831660248201526044810182905261232b90849063095ea7b360e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526128d5565b505050565b606061233f84846000856129a7565b90505b9392505050565b612351612888565b600e54600f54604051631c57762b60e31b81526004810191909152600060248201526001600160a01b039091169063e2bbb15890604401600060405180830381600087803b1580156123a257600080fd5b505af11580156123b6573d6000803e3d6000fd5b5050600a546040516370a0823160e01b8152306004820152600093506001600160a01b0390911691506370a0823190602401602060405180830381865afa158015612405573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612429919061377b565b90508015611b8157612439612ad8565b61244282612db3565b61244a612f62565b6000612454611a01565b905061245e611b85565b42601155337f9bc239f1724cacfb88cb1d66a2dc437467699b68a8c90d7b63110cf4b6f924108261248d611388565b6040805192835260208301919091520160405180910390a2505050565b6000546001600160a01b0316331461110a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b7a565b6040516001600160a01b03831660248201526044810182905261232b90849063a9059cbb60e01b906064016122f4565b61253c6132a5565b6000805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b600e54600b546125a8916001600160a01b0391821691166000196121e3565b600254600a546125c7916001600160a01b0391821691166000196121e3565b6002546009546125e5916001600160a01b03918216911660006121e3565b600254600954612604916001600160a01b0391821691166000196121e3565b600254600c54612622916001600160a01b03918216911660006121e3565b600254600c54612641916001600160a01b0391821691166000196121e3565b600254600d5461265f916001600160a01b03918216911660006121e3565b600254600d5461267e916001600160a01b0391821691166000196121e3565b6015541561110a5760005b601554811015610b8c57600254601580546126f3926001600160a01b031691600091859081106126bb576126bb613892565b906000526020600020016000815481106126d7576126d7613892565b6000918252602090912001546001600160a01b031691906121e3565b6002546015805461271c926001600160a01b03169160001991859081106126bb576126bb613892565b80612726816139a2565b915050612689565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b612786612888565b6000805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861256c3390565b600e54600b546127df916001600160a01b03918216911660006121e3565b600254600a546127fd916001600160a01b03918216911660006121e3565b600254600c5461281b916001600160a01b03918216911660006121e3565b600254600d54612839916001600160a01b03918216911660006121e3565b6015541561110a5760005b601554811015610b8c5760025460158054612876926001600160a01b031691600091859081106126bb576126bb613892565b80612880816139a2565b915050612844565b600054600160a01b900460ff161561110a5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610b7a565b600061292a826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166123309092919063ffffffff16565b80519091501561232b57808060200190518101906129489190613c6f565b61232b5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610b7a565b606082471015612a085760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610b7a565b6001600160a01b0385163b612a5f5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610b7a565b600080866001600160a01b03168587604051612a7b9190613c8c565b60006040518083038185875af1925050503d8060008114612ab8576040519150601f19603f3d011682016040523d82523d6000602084013e612abd565b606091505b5091509150612acd8282866132f5565b979650505050505050565b478015612b4957600960009054906101000a90046001600160a01b03166001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b158015612b2f57600080fd5b505af1158015612b43573d6000803e3d6000fd5b50505050505b600a546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015612b92573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bb6919061377b565b6002546040516338ed173960e01b81529192506001600160a01b0316906338ed173990612bf190849060009060129030904290600401613ca8565b6000604051808303816000875af1158015612c10573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612c389190810190613965565b5060155415611b815760005b60155481101561232b57600060158281548110612c6357612c63613892565b90600052602060002001600081548110612c7f57612c7f613892565b6000918252602090912001546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015612cd0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cf4919061377b565b90508015612da057600254601580546001600160a01b03909216916338ed17399184916000919087908110612d2b57612d2b613892565b9060005260206000200130426040518663ffffffff1660e01b8152600401612d57959493929190613ca8565b6000604051808303816000875af1158015612d76573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612d9e9190810190613965565b505b5080612dab816139a2565b915050612c44565b6000612dbd611ddf565b80516009546040516370a0823160e01b8152306004820152929350600092670de0b6b3a764000092916001600160a01b0316906370a0823190602401602060405180830381865afa158015612e16573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e3a919061377b565b612e449190613839565b612e4e9190613858565b90506000670de0b6b3a7640000836040015183612e6b9190613839565b612e759190613858565b600954909150612e8f906001600160a01b03168583612504565b6000670de0b6b3a7640000846020015184612eaa9190613839565b612eb49190613858565b600554600954919250612ed4916001600160a01b03908116911683612504565b6000670de0b6b3a7640000856060015185612eef9190613839565b612ef99190613858565b600454600954919250612f19916001600160a01b03908116911683612504565b60408051848152602081018490529081018290527fd255b592c7f268a73e534da5219a60ff911b4cf6daae21c7d20527dd657bd99a9060600160405180910390a1505050505050565b6009546040516370a0823160e01b81523060048201526000916002916001600160a01b03909116906370a0823190602401602060405180830381865afa158015612fb0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fd4919061377b565b612fde9190613858565b600954600c549192506001600160a01b0391821691161461307c576002546040516338ed173960e01b81526001600160a01b03909116906338ed17399061303390849060009060139030904290600401613ca8565b6000604051808303816000875af1158015613052573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261307a9190810190613965565b505b600954600d546001600160a01b03908116911614613117576002546040516338ed173960e01b81526001600160a01b03909116906338ed1739906130ce90849060009060149030904290600401613ca8565b6000604051808303816000875af11580156130ed573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526131159190810190613965565b505b600c546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015613160573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613184919061377b565b600d546040516370a0823160e01b81523060048201529192506000916001600160a01b03909116906370a0823190602401602060405180830381865afa1580156131d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131f6919061377b565b600254600c54600d5460405162e8e33760e81b81526001600160a01b0392831660048201529082166024820152604481018690526064810184905260016084820181905260a48201523060c48201524260e4820152929350169063e8e3370090610104016060604051808303816000875af1158015613279573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061329d9190613ce4565b505050505050565b600054600160a01b900460ff1661110a5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610b7a565b60608315613304575081612342565b8251156133145782518084602001fd5b8160405162461bcd60e51b8152600401610b7a9190613d12565b5080546000825590600052602060002090810190610b8c91906133b1565b8280548282559060005260206000209081019282156133a1579160200282015b828111156133a157825182546001600160a01b0319166001600160a01b0390911617825560209092019160019091019061336c565b506133ad9291506133b1565b5090565b5b808211156133ad57600081556001016133b2565b6001600160a01b0381168114610b8c57600080fd5b6000602082840312156133ed57600080fd5b8135612342816133c6565b8015158114610b8c57600080fd5b60006020828403121561341857600080fd5b8135612342816133f8565b600081518084526020808501945080840160005b8381101561345c5781516001600160a01b031687529582019590820190600101613437565b509495945050505050565b6020815260006123426020830184613423565b60006020828403121561348c57600080fd5b5035919050565b600080604083850312156134a657600080fd5b50508035926020909101359150565b634e487b7160e01b600052604160045260246000fd5b60405160c0810167ffffffffffffffff811182821017156134ee576134ee6134b5565b60405290565b604051601f8201601f1916810167ffffffffffffffff8111828210171561351d5761351d6134b5565b604052919050565b600067ffffffffffffffff82111561353f5761353f6134b5565b5060051b60200190565b6000602080838503121561355c57600080fd5b823567ffffffffffffffff81111561357357600080fd5b8301601f8101851361358457600080fd5b803561359761359282613525565b6134f4565b81815260059190911b820183019083810190878311156135b657600080fd5b928401925b82841015612acd5783356135ce816133c6565b825292840192908401906135bb565b6000602080830181845280855180835260408601915060408160051b87010192508387016000805b8381101561366257888603603f19018552825180518088529088019088880190845b8181101561364c5783516001600160a01b03168352928a0192918a0191600101613627565b5090975050509386019391860191600101613605565b509398975050505050505050565b60005b8381101561368b578181015183820152602001613673565b838111156112a15750506000910152565b600081518084526136b4816020860160208601613670565b601f01601f19169290920160200192915050565b60208152815160208201526020820151604082015260408201516060820152606082015160808201526000608083015160c060a084015261370c60e084018261369c565b905060a0840151151560c08401528091505092915050565b6040815260006137376040830185613423565b82810360208481019190915284518083528582019282019060005b8181101561376e57845183529383019391830191600101613752565b5090979650505050505050565b60006020828403121561378d57600080fd5b5051919050565b60208082526008908201526710b6b0b730b3b2b960c11b604082015260600190565b600080600080608085870312156137cc57600080fd5b505082516020840151604085015160609095015191969095509092509050565b602080825260069082015265085d985d5b1d60d21b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6000828210156138345761383461380c565b500390565b60008160001904831182151516156138535761385361380c565b500290565b60008261387557634e487b7160e01b600052601260045260246000fd5b500490565b6000821982111561388d5761388d61380c565b500190565b634e487b7160e01b600052603260045260246000fd5b6000815480845260208085019450836000528060002060005b8381101561345c5781546001600160a01b0316875295820195600191820191016138c1565b82815260406020820152600061233f60408301846138a8565b600082601f83011261391057600080fd5b8151602061392061359283613525565b82815260059290921b8401810191818101908684111561393f57600080fd5b8286015b8481101561395a5780518352918301918301613943565b509695505050505050565b60006020828403121561397757600080fd5b815167ffffffffffffffff81111561398e57600080fd5b61399a848285016138ff565b949350505050565b6000600182016139b4576139b461380c565b5060010190565b634e487b7160e01b600052603160045260246000fd5b600082601f8301126139e257600080fd5b815167ffffffffffffffff8111156139fc576139fc6134b5565b613a0f601f8201601f19166020016134f4565b818152846020838601011115613a2457600080fd5b61399a826020830160208701613670565b600060208284031215613a4757600080fd5b815167ffffffffffffffff80821115613a5f57600080fd5b9083019060c08286031215613a7357600080fd5b613a7b6134cb565b82518152602083015160208201526040830151604082015260608301516060820152608083015182811115613aaf57600080fd5b613abb878286016139d1565b60808301525060a08301519250613ad1836133f8565b60a0810192909252509392505050565b600082601f830112613af257600080fd5b81516020613b0261359283613525565b82815260059290921b84018101918181019086841115613b2157600080fd5b8286015b8481101561395a57805167ffffffffffffffff811115613b455760008081fd5b613b538986838b01016139d1565b845250918301918301613b25565b60008060008060808587031215613b7757600080fd5b845167ffffffffffffffff80821115613b8f57600080fd5b818701915087601f830112613ba357600080fd5b81516020613bb361359283613525565b82815260059290921b8401810191818101908b841115613bd257600080fd5b948201945b83861015613bf9578551613bea816133c6565b82529482019490820190613bd7565b918a0151919850909350505080821115613c1257600080fd5b613c1e88838901613ae1565b94506040870151915080821115613c3457600080fd5b613c40888389016138ff565b93506060870151915080821115613c5657600080fd5b50613c63878288016138ff565b91505092959194509250565b600060208284031215613c8157600080fd5b8151612342816133f8565b60008251613c9e818460208701613670565b9190910192915050565b85815284602082015260a060408201526000613cc760a08301866138a8565b6001600160a01b0394909416606083015250608001529392505050565b600080600060608486031215613cf957600080fd5b8351925060208401519150604084015190509250925092565b602081526000612342602083018461369c56fea2646970667358221220cc649f4fd344fae59bfe7aadea132c5eb8ad6cb365aa56635eac5781bf0c336964736f6c634300080f003300000000000000000000000061bf1b38930e37850d459f3cb926cd197f5f88c00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000f3a5454496e26ac57da879bf3285fa85debf03880000000000000000000000006ea8ad7228ebca6c686096269d60bb1c72d13fa800000000000000000000000070085a09d30d6f8c4ecf6ee10120d1847383bb570000000000000000000000004fed5491693007f0cd49f4614ffc38ab6a04b6190000000000000000000000001a2aff8453b211f1fcfe97718a0f23232a6a540300000000000000000000000000aec34489a7ade91a0507b6b9dbb0a50938b7c0000000000000000000000000eeaff5116c09ecc20ab72b53860a7cead97f0ab4000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000001e0000000000000000000000000000000000000000000000000000000000000026000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000e358838ce72d5e61e0018a2ffac4bec5f4c88d2000000000000000000000000acc15dc74880c9944775448304b263d191c6077f0000000000000000000000000000000000000000000000000000000000000003000000000000000000000000acc15dc74880c9944775448304b263d191c6077f000000000000000000000000ffffffff1fcacbd218edc0eba20fc2308c778080000000000000000000000000191cf2602ca2e534c5ccae7bcbf4c46a704bb9490000000000000000000000000000000000000000000000000000000000000002000000000000000000000000acc15dc74880c9944775448304b263d191c6077f000000000000000000000000ffffffff1fcacbd218edc0eba20fc2308c778080

Deployed Bytecode

0x6080604052600436106103a65760003560e01c80638912cb8b116101e7578063d0e30db01161010d578063e7a7250a116100a0578063f2fde38b1161006f578063f2fde38b14610a27578063fad4675e14610a47578063fb61778714610a67578063fbfa77cf14610a7c57600080fd5b8063e7a7250a146109b9578063ea82eb9e146109dc578063f1a392da146109f1578063f20eaeb814610a0757600080fd5b8063db8d55f1116100dc578063db8d55f114610942578063dc4987cc14610964578063dfbdc43714610984578063e270dbf31461099957600080fd5b8063d0e30db0146108d6578063d801d946146108eb578063d92f3d7314610900578063da512c341461092057600080fd5b8063a39219f911610185578063be12a97811610154578063be12a97814610861578063c1a3d44c14610881578063c7b9d53014610896578063cc289480146108b657600080fd5b8063a39219f9146107ec578063a68833e514610801578063ac1e502514610821578063aced16611461084157600080fd5b80638da5cb5b116101c15780638da5cb5b1461077f5780638e1454591461079d57806397fd323d146107bd5780639f8b5da1146107d257600080fd5b80638912cb8b1461073a5780638bc7e8c4146107545780638cfc02501461076a57600080fd5b80634641257d116102cc5780636817031b1161026a578063722713f711610239578063722713f7146106d0578063748747e6146106e55780638456cb5914610705578063877562b61461071a57600080fd5b80636817031b146106565780636ec232d31461067657806370672d501461069b578063715018a6146106bb57600080fd5b806354518b1a116102a657806354518b1a146105e0578063573fef0a146105f65780635c975abb1461060b5780635ee167c01461063657600080fd5b80634641257d146105965780634700d305146105ab5780634746fb55146105c057600080fd5b80631fc8bc5d1161034457806337bdd2041161031357806337bdd204146105365780633e0dc34e1461054b5780633e55f932146105615780633f4ba83a1461058157600080fd5b80631fc8bc5d146104b65780631fe4a686146104d6578063257ae0de146104f65780632e1a7d4d1461051657600080fd5b80631158808611610380578063115880861461041457806311b0b42d1461043c57806313e120b1146104745780631f1fcd511461049657600080fd5b80630e5c011e146103b25780630e8fbb5a146103d4578063106fdbd0146103f457600080fd5b366103ad57005b600080fd5b3480156103be57600080fd5b506103d26103cd3660046133db565b610a9c565b005b3480156103e057600080fd5b506103d26103ef366004613406565b610b8f565b34801561040057600080fd5b506103d261040f3660046133db565b610bfb565b34801561042057600080fd5b50610429610c58565b6040519081526020015b60405180910390f35b34801561044857600080fd5b5060095461045c906001600160a01b031681565b6040516001600160a01b039091168152602001610433565b34801561048057600080fd5b50610489610cde565b6040516104339190613467565b3480156104a257600080fd5b50600b5461045c906001600160a01b031681565b3480156104c257600080fd5b50600e5461045c906001600160a01b031681565b3480156104e257600080fd5b5060045461045c906001600160a01b031681565b34801561050257600080fd5b5060025461045c906001600160a01b031681565b34801561052257600080fd5b506103d261053136600461347a565b610d40565b34801561054257600080fd5b50610489610f85565b34801561055757600080fd5b50610429600f5481565b34801561056d57600080fd5b506103d261057c36600461347a565b610fe5565b34801561058d57600080fd5b506103d26110b3565b3480156105a257600080fd5b506103d261110c565b3480156105b757600080fd5b506103d26111f7565b3480156105cc57600080fd5b5060065461045c906001600160a01b031681565b3480156105ec57600080fd5b5061042961271081565b34801561060257600080fd5b506103d26112a7565b34801561061757600080fd5b50600054600160a01b900460ff165b6040519015158152602001610433565b34801561064257600080fd5b50600c5461045c906001600160a01b031681565b34801561066257600080fd5b506103d26106713660046133db565b6112dc565b34801561068257600080fd5b5060085461045c9061010090046001600160a01b031681565b3480156106a757600080fd5b5061045c6106b6366004613493565b611332565b3480156106c757600080fd5b506103d2611376565b3480156106dc57600080fd5b50610429611388565b3480156106f157600080fd5b506103d26107003660046133db565b6113a9565b34801561071157600080fd5b506103d2611436565b34801561072657600080fd5b50600d5461045c906001600160a01b031681565b34801561074657600080fd5b506010546106269060ff1681565b34801561076057600080fd5b5061042960075481565b34801561077657600080fd5b50610429611485565b34801561078b57600080fd5b506000546001600160a01b031661045c565b3480156107a957600080fd5b5060055461045c906001600160a01b031681565b3480156107c957600080fd5b506104296114f3565b3480156107de57600080fd5b506008546106269060ff1681565b3480156107f857600080fd5b506103d26117c8565b34801561080d57600080fd5b506103d261081c3660046133db565b6118d3565b34801561082d57600080fd5b506103d261083c36600461347a565b611929565b34801561084d57600080fd5b5060035461045c906001600160a01b031681565b34801561086d57600080fd5b5061045c61087c36600461347a565b6119d7565b34801561088d57600080fd5b50610429611a01565b3480156108a257600080fd5b506103d26108b13660046133db565b611a32565b3480156108c257600080fd5b506103d26108d1366004613549565b611ac8565b3480156108e257600080fd5b506103d2611b85565b3480156108f757600080fd5b506103d2611ca7565b34801561090c57600080fd5b506103d261091b3660046133db565b611ce6565b34801561092c57600080fd5b50610935611d3c565b60405161043391906135dd565b34801561094e57600080fd5b50610957611ddf565b60405161043391906136c8565b34801561097057600080fd5b5061045c61097f36600461347a565b611e8a565b34801561099057600080fd5b50610429603281565b3480156109a557600080fd5b5061045c6109b436600461347a565b611e9a565b3480156109c557600080fd5b506109ce611eaa565b604051610433929190613724565b3480156109e857600080fd5b50610489611f40565b3480156109fd57600080fd5b5061042960115481565b348015610a1357600080fd5b50600a5461045c906001600160a01b031681565b348015610a3357600080fd5b506103d2610a423660046133db565b611fa0565b348015610a5357600080fd5b506103d2610a62366004613406565b612016565b348015610a7357600080fd5b506103d2612068565b348015610a8857600080fd5b5060015461045c906001600160a01b031681565b60085460ff168015610abe575060085461010090046001600160a01b03163b15155b15610b8357600860019054906101000a90046001600160a01b03166001600160a01b0316633de39c116040518163ffffffff1660e01b81526004016020604051808303816000875af1158015610b18573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b3c919061377b565b3a1115610b835760405162461bcd60e51b815260206004820152601060248201526f67617320697320746f6f20686967682160801b60448201526064015b60405180910390fd5b610b8c81612349565b50565b6000546001600160a01b0316331480610bb257506003546001600160a01b031633145b610bce5760405162461bcd60e51b8152600401610b7a90613794565b6010805460ff191682151590811790915560ff1615610bf157610b8c6000611929565b610b8c600a611929565b610c036124aa565b600680546001600160a01b0319166001600160a01b0383169081179091556040519081527f91e28ce4210d103c13c5174847e463b836900f8dc63e9d9b42a4255169d19529906020015b60405180910390a150565b600e54600f546040516393f1a40b60e01b8152600481019190915230602482015260009182916001600160a01b03909116906393f1a40b90604401608060405180830381865afa158015610cb0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cd491906137b6565b5091949350505050565b60606012805480602002602001604051908101604052809291908181526020018280548015610d3657602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610d18575b5050505050905090565b6001546001600160a01b03163314610d6a5760405162461bcd60e51b8152600401610b7a906137ec565b600b546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015610db3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dd7919061377b565b905081811015610ec857600e54600f546001600160a01b039091169063441a3e7090610e038486613822565b6040516001600160e01b031960e085901b16815260048101929092526024820152604401600060405180830381600087803b158015610e4157600080fd5b505af1158015610e55573d6000803e3d6000fd5b5050600b546040516370a0823160e01b81523060048201526001600160a01b0390911692506370a082319150602401602060405180830381865afa158015610ea1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ec5919061377b565b90505b81811115610ed35750805b6000546001600160a01b03163214801590610ef85750600054600160a01b900460ff16155b15610f2a57600061271060075483610f109190613839565b610f1a9190613858565b9050610f268183613822565b9150505b600154600b54610f47916001600160a01b03918216911683612504565b7f5b6b431d4476a211bb7d41c20d1aab9ae2321deee0d20be3d9fc9b1093fa6e3d610f70611388565b60405190815260200160405180910390a15050565b60606014805480602002602001604051908101604052809291908181526020018280548015610d36576020028201919060005260206000209081546001600160a01b03168152600190910190602001808311610d18575050505050905090565b6000546001600160a01b031633148061100857506003546001600160a01b031633145b6110245760405162461bcd60e51b8152600401610b7a90613794565b600654604051631f2afc9960e11b8152600481018390526001600160a01b0390911690633e55f93290602401600060405180830381600087803b15801561106a57600080fd5b505af115801561107e573d6000803e3d6000fd5b505050507f9163810ee1e29168d4ce900e48a333fb8fbd3fd070d2bef67f6d4db0846a469f81604051610c4d91815260200190565b6000546001600160a01b03163314806110d657506003546001600160a01b031633145b6110f25760405162461bcd60e51b8152600401610b7a90613794565b6110fa612534565b611102612589565b61110a611b85565b565b60085460ff16801561112e575060085461010090046001600160a01b03163b15155b156111ee57600860019054906101000a90046001600160a01b03166001600160a01b0316633de39c116040518163ffffffff1660e01b81526004016020604051808303816000875af1158015611188573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111ac919061377b565b3a11156111ee5760405162461bcd60e51b815260206004820152601060248201526f67617320697320746f6f20686967682160801b6044820152606401610b7a565b61110a32612349565b6000546001600160a01b031633148061121a57506003546001600160a01b031633145b6112365760405162461bcd60e51b8152600401610b7a90613794565b61123e611436565b600e54600f54604051632989754760e11b81526001600160a01b0390921691635312ea8e916112739160040190815260200190565b600060405180830381600087803b15801561128d57600080fd5b505af11580156112a1573d6000803e3d6000fd5b50505050565b60105460ff161561110a576001546001600160a01b031633146111ee5760405162461bcd60e51b8152600401610b7a906137ec565b6112e46124aa565b600180546001600160a01b0319166001600160a01b0383169081179091556040519081527fd459c7242e23d490831b5676a611c4342d899d28f342d89ae80793e56a930f3090602001610c4d565b6015828154811061134257600080fd5b90600052602060002001818154811061135a57600080fd5b6000918252602090912001546001600160a01b03169150829050565b61137e6124aa565b61110a600061272e565b6000611392610c58565b61139a611a01565b6113a4919061387a565b905090565b6000546001600160a01b03163314806113cc57506003546001600160a01b031633145b6113e85760405162461bcd60e51b8152600401610b7a90613794565b600380546001600160a01b0319166001600160a01b0383169081179091556040519081527fefb5cfa1a8690c124332ab93324539c5c9c4be03f28aeb8be86f2d8a0c9fb99b90602001610c4d565b6000546001600160a01b031633148061145957506003546001600160a01b031633145b6114755760405162461bcd60e51b8152600401610b7a90613794565b61147d61277e565b61110a6127c1565b600654604051636788231160e11b81523060048201526000916001600160a01b03169063cf104622906024015b602060405180830381865afa1580156114cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113a4919061377b565b6000806114fe611ddf565b905060008061150b611eaa565b915091506000600260009054906101000a90046001600160a01b03166001600160a01b031663d06ca61f8360008151811061154857611548613892565b602002602001015160126040518363ffffffff1660e01b815260040161156f9291906138e6565b600060405180830381865afa9250505080156115ad57506040513d6000823e601f3d908101601f191682016040526115aa9190810190613965565b60015b156115dd5780600182516115c19190613822565b815181106115d1576115d1613892565b60200260200101519150505b6015541561177a5760005b6015548110156117785760015b8451811015611765576015828154811061161157611611613892565b9060005260206000200160008154811061162d5761162d613892565b60009182526020909120015485516001600160a01b039091169086908390811061165957611659613892565b60200260200101516001600160a01b0316036117535760025484516001600160a01b039091169063d06ca61f9086908490811061169857611698613892565b6020026020010151601585815481106116b3576116b3613892565b906000526020600020016040518363ffffffff1660e01b81526004016116da9291906138e6565b600060405180830381865afa92505050801561171857506040513d6000823e601f3d908101601f191682016040526117159190810190613965565b60015b1561175357806001825161172c9190613822565b8151811061173c5761173c613892565b60200260200101518461174f919061387a565b9350505b8061175d816139a2565b9150506115f5565b5080611770816139a2565b9150506115e8565b505b670de0b6b3a76400008460400151670de0b6b3a76400008660000151846117a19190613839565b6117ab9190613858565b6117b59190613839565b6117bf9190613858565b94505050505090565b6000546001600160a01b03163314806117eb57506003546001600160a01b031633145b6118075760405162461bcd60e51b8152600401610b7a90613794565b601580546000919061181b90600190613822565b8154811061182b5761182b613892565b9060005260206000200160008154811061184757611847613892565b600091825260209091200154600c546001600160a01b0391821692501681148015906118815750600d546001600160a01b03828116911614155b156118a1576002546118a1906001600160a01b03838116911660006121e3565b60158054806118b2576118b26139bb565b6001900381819060005260206000200160006118ce919061332e565b905550565b6118db6124aa565b600580546001600160a01b0319166001600160a01b0383169081179091556040519081527f8041329bf7057543a2c2ff4e4071d1d488a31f82ed44e169b5cd2f04f5e3ac8590602001610c4d565b6000546001600160a01b031633148061194c57506003546001600160a01b031633145b6119685760405162461bcd60e51b8152600401610b7a90613794565b60328111156119a25760405162461bcd60e51b8152600401610b7a906020808252600490820152630216361760e41b604082015260600190565b60078190556040518181527f3aa4413905e8f015896ec5880bdde24088ccb19b578f9fcf6800354d5320d4af90602001610c4d565b601281815481106119e757600080fd5b6000918252602090912001546001600160a01b0316905081565b600b546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a08231906024016114b2565b6004546001600160a01b03163314611a7a5760405162461bcd60e51b815260206004820152600b60248201526a085cdd1c985d1959da5cdd60aa1b6044820152606401610b7a565b600480546001600160a01b0319166001600160a01b0383169081179091556040519081527f46d58e3fa07bf19b1d27240f0e286b27e9f7c1b0d88933333fe833b60eec541290602001610c4d565b611ad06124aa565b6002548151611b16916001600160a01b03169060009084908290611af657611af6613892565b60200260200101516001600160a01b03166121e39092919063ffffffff16565b6002548151611b3e916001600160a01b031690600019908490600090611af657611af6613892565b601580546001810182556000919091528151611b81917f55f448fdea98c4d29eb340757ef0a66cd03dbb9538908a6a81d96026b71ec4750190602084019061334c565b5050565b611b8d612888565b600b546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015611bd6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bfa919061377b565b90508015610b8c57600e54600f54604051631c57762b60e31b81526001600160a01b039092169163e2bbb15891611c3e918590600401918252602082015260400190565b600060405180830381600087803b158015611c5857600080fd5b505af1158015611c6c573d6000803e3d6000fd5b505050507f4d6ce1e535dbade1c23defba91e23b8f791ce5edc0cc320257a2b364e4e38426611c99611388565b604051908152602001610c4d565b6000546001600160a01b0316331480611cca57506003546001600160a01b031633145b6111ee5760405162461bcd60e51b8152600401610b7a90613794565b611cee6124aa565b600280546001600160a01b0319166001600160a01b0383169081179091556040519081527f5ca6e64c4522e68e154aa9372f2c5969cd37d9640e59f66953dc472f54ee86fa90602001610c4d565b60606015805480602002602001604051908101604052809291908181526020016000905b82821015611dd657600084815260209081902083018054604080518285028101850190915281815292830182828015611dc257602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611da4575b505050505081526020019060010190611d60565b50505050905090565b611e1a6040518060c0016040528060008152602001600081526020016000815260200160008152602001606081526020016000151581525090565b600654604051639af608c960e01b81523060048201526001600160a01b0390911690639af608c990602401600060405180830381865afa158015611e62573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526113a49190810190613a35565b601481815481106119e757600080fd5b601381815481106119e757600080fd5b600e54600f5460405160016232bd9d60e01b031981526004810191909152306024820152606091829160009182916001600160a01b039091169063ffcd426390604401600060405180830381865afa158015611f0a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611f329190810190613b61565b929792965091945050505050565b60606013805480602002602001604051908101604052809291908181526020018280548015610d36576020028201919060005260206000209081546001600160a01b03168152600190910190602001808311610d18575050505050905090565b611fa86124aa565b6001600160a01b03811661200d5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b7a565b610b8c8161272e565b6000546001600160a01b031633148061203957506003546001600160a01b031633145b6120555760405162461bcd60e51b8152600401610b7a90613794565b6008805460ff1916911515919091179055565b6001546001600160a01b031633146120925760405162461bcd60e51b8152600401610b7a906137ec565b600e54600f54604051632989754760e11b81526001600160a01b0390921691635312ea8e916120c79160040190815260200190565b600060405180830381600087803b1580156120e157600080fd5b505af11580156120f5573d6000803e3d6000fd5b5050600b546040516370a0823160e01b8152306004820152600093506001600160a01b0390911691506370a0823190602401602060405180830381865afa158015612144573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612168919061377b565b600b5460015460405163a9059cbb60e01b81526001600160a01b03918216600482015260248101849052929350169063a9059cbb906044016020604051808303816000875af11580156121bf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b819190613c6f565b80158061225d5750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e90604401602060405180830381865afa158015612237573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061225b919061377b565b155b6122c85760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b6064820152608401610b7a565b6040516001600160a01b03831660248201526044810182905261232b90849063095ea7b360e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526128d5565b505050565b606061233f84846000856129a7565b90505b9392505050565b612351612888565b600e54600f54604051631c57762b60e31b81526004810191909152600060248201526001600160a01b039091169063e2bbb15890604401600060405180830381600087803b1580156123a257600080fd5b505af11580156123b6573d6000803e3d6000fd5b5050600a546040516370a0823160e01b8152306004820152600093506001600160a01b0390911691506370a0823190602401602060405180830381865afa158015612405573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612429919061377b565b90508015611b8157612439612ad8565b61244282612db3565b61244a612f62565b6000612454611a01565b905061245e611b85565b42601155337f9bc239f1724cacfb88cb1d66a2dc437467699b68a8c90d7b63110cf4b6f924108261248d611388565b6040805192835260208301919091520160405180910390a2505050565b6000546001600160a01b0316331461110a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b7a565b6040516001600160a01b03831660248201526044810182905261232b90849063a9059cbb60e01b906064016122f4565b61253c6132a5565b6000805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b600e54600b546125a8916001600160a01b0391821691166000196121e3565b600254600a546125c7916001600160a01b0391821691166000196121e3565b6002546009546125e5916001600160a01b03918216911660006121e3565b600254600954612604916001600160a01b0391821691166000196121e3565b600254600c54612622916001600160a01b03918216911660006121e3565b600254600c54612641916001600160a01b0391821691166000196121e3565b600254600d5461265f916001600160a01b03918216911660006121e3565b600254600d5461267e916001600160a01b0391821691166000196121e3565b6015541561110a5760005b601554811015610b8c57600254601580546126f3926001600160a01b031691600091859081106126bb576126bb613892565b906000526020600020016000815481106126d7576126d7613892565b6000918252602090912001546001600160a01b031691906121e3565b6002546015805461271c926001600160a01b03169160001991859081106126bb576126bb613892565b80612726816139a2565b915050612689565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b612786612888565b6000805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861256c3390565b600e54600b546127df916001600160a01b03918216911660006121e3565b600254600a546127fd916001600160a01b03918216911660006121e3565b600254600c5461281b916001600160a01b03918216911660006121e3565b600254600d54612839916001600160a01b03918216911660006121e3565b6015541561110a5760005b601554811015610b8c5760025460158054612876926001600160a01b031691600091859081106126bb576126bb613892565b80612880816139a2565b915050612844565b600054600160a01b900460ff161561110a5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610b7a565b600061292a826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166123309092919063ffffffff16565b80519091501561232b57808060200190518101906129489190613c6f565b61232b5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610b7a565b606082471015612a085760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610b7a565b6001600160a01b0385163b612a5f5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610b7a565b600080866001600160a01b03168587604051612a7b9190613c8c565b60006040518083038185875af1925050503d8060008114612ab8576040519150601f19603f3d011682016040523d82523d6000602084013e612abd565b606091505b5091509150612acd8282866132f5565b979650505050505050565b478015612b4957600960009054906101000a90046001600160a01b03166001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b158015612b2f57600080fd5b505af1158015612b43573d6000803e3d6000fd5b50505050505b600a546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015612b92573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bb6919061377b565b6002546040516338ed173960e01b81529192506001600160a01b0316906338ed173990612bf190849060009060129030904290600401613ca8565b6000604051808303816000875af1158015612c10573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612c389190810190613965565b5060155415611b815760005b60155481101561232b57600060158281548110612c6357612c63613892565b90600052602060002001600081548110612c7f57612c7f613892565b6000918252602090912001546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015612cd0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cf4919061377b565b90508015612da057600254601580546001600160a01b03909216916338ed17399184916000919087908110612d2b57612d2b613892565b9060005260206000200130426040518663ffffffff1660e01b8152600401612d57959493929190613ca8565b6000604051808303816000875af1158015612d76573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612d9e9190810190613965565b505b5080612dab816139a2565b915050612c44565b6000612dbd611ddf565b80516009546040516370a0823160e01b8152306004820152929350600092670de0b6b3a764000092916001600160a01b0316906370a0823190602401602060405180830381865afa158015612e16573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e3a919061377b565b612e449190613839565b612e4e9190613858565b90506000670de0b6b3a7640000836040015183612e6b9190613839565b612e759190613858565b600954909150612e8f906001600160a01b03168583612504565b6000670de0b6b3a7640000846020015184612eaa9190613839565b612eb49190613858565b600554600954919250612ed4916001600160a01b03908116911683612504565b6000670de0b6b3a7640000856060015185612eef9190613839565b612ef99190613858565b600454600954919250612f19916001600160a01b03908116911683612504565b60408051848152602081018490529081018290527fd255b592c7f268a73e534da5219a60ff911b4cf6daae21c7d20527dd657bd99a9060600160405180910390a1505050505050565b6009546040516370a0823160e01b81523060048201526000916002916001600160a01b03909116906370a0823190602401602060405180830381865afa158015612fb0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fd4919061377b565b612fde9190613858565b600954600c549192506001600160a01b0391821691161461307c576002546040516338ed173960e01b81526001600160a01b03909116906338ed17399061303390849060009060139030904290600401613ca8565b6000604051808303816000875af1158015613052573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261307a9190810190613965565b505b600954600d546001600160a01b03908116911614613117576002546040516338ed173960e01b81526001600160a01b03909116906338ed1739906130ce90849060009060149030904290600401613ca8565b6000604051808303816000875af11580156130ed573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526131159190810190613965565b505b600c546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015613160573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613184919061377b565b600d546040516370a0823160e01b81523060048201529192506000916001600160a01b03909116906370a0823190602401602060405180830381865afa1580156131d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131f6919061377b565b600254600c54600d5460405162e8e33760e81b81526001600160a01b0392831660048201529082166024820152604481018690526064810184905260016084820181905260a48201523060c48201524260e4820152929350169063e8e3370090610104016060604051808303816000875af1158015613279573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061329d9190613ce4565b505050505050565b600054600160a01b900460ff1661110a5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610b7a565b60608315613304575081612342565b8251156133145782518084602001fd5b8160405162461bcd60e51b8152600401610b7a9190613d12565b5080546000825590600052602060002090810190610b8c91906133b1565b8280548282559060005260206000209081019282156133a1579160200282015b828111156133a157825182546001600160a01b0319166001600160a01b0390911617825560209092019160019091019061336c565b506133ad9291506133b1565b5090565b5b808211156133ad57600081556001016133b2565b6001600160a01b0381168114610b8c57600080fd5b6000602082840312156133ed57600080fd5b8135612342816133c6565b8015158114610b8c57600080fd5b60006020828403121561341857600080fd5b8135612342816133f8565b600081518084526020808501945080840160005b8381101561345c5781516001600160a01b031687529582019590820190600101613437565b509495945050505050565b6020815260006123426020830184613423565b60006020828403121561348c57600080fd5b5035919050565b600080604083850312156134a657600080fd5b50508035926020909101359150565b634e487b7160e01b600052604160045260246000fd5b60405160c0810167ffffffffffffffff811182821017156134ee576134ee6134b5565b60405290565b604051601f8201601f1916810167ffffffffffffffff8111828210171561351d5761351d6134b5565b604052919050565b600067ffffffffffffffff82111561353f5761353f6134b5565b5060051b60200190565b6000602080838503121561355c57600080fd5b823567ffffffffffffffff81111561357357600080fd5b8301601f8101851361358457600080fd5b803561359761359282613525565b6134f4565b81815260059190911b820183019083810190878311156135b657600080fd5b928401925b82841015612acd5783356135ce816133c6565b825292840192908401906135bb565b6000602080830181845280855180835260408601915060408160051b87010192508387016000805b8381101561366257888603603f19018552825180518088529088019088880190845b8181101561364c5783516001600160a01b03168352928a0192918a0191600101613627565b5090975050509386019391860191600101613605565b509398975050505050505050565b60005b8381101561368b578181015183820152602001613673565b838111156112a15750506000910152565b600081518084526136b4816020860160208601613670565b601f01601f19169290920160200192915050565b60208152815160208201526020820151604082015260408201516060820152606082015160808201526000608083015160c060a084015261370c60e084018261369c565b905060a0840151151560c08401528091505092915050565b6040815260006137376040830185613423565b82810360208481019190915284518083528582019282019060005b8181101561376e57845183529383019391830191600101613752565b5090979650505050505050565b60006020828403121561378d57600080fd5b5051919050565b60208082526008908201526710b6b0b730b3b2b960c11b604082015260600190565b600080600080608085870312156137cc57600080fd5b505082516020840151604085015160609095015191969095509092509050565b602080825260069082015265085d985d5b1d60d21b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6000828210156138345761383461380c565b500390565b60008160001904831182151516156138535761385361380c565b500290565b60008261387557634e487b7160e01b600052601260045260246000fd5b500490565b6000821982111561388d5761388d61380c565b500190565b634e487b7160e01b600052603260045260246000fd5b6000815480845260208085019450836000528060002060005b8381101561345c5781546001600160a01b0316875295820195600191820191016138c1565b82815260406020820152600061233f60408301846138a8565b600082601f83011261391057600080fd5b8151602061392061359283613525565b82815260059290921b8401810191818101908684111561393f57600080fd5b8286015b8481101561395a5780518352918301918301613943565b509695505050505050565b60006020828403121561397757600080fd5b815167ffffffffffffffff81111561398e57600080fd5b61399a848285016138ff565b949350505050565b6000600182016139b4576139b461380c565b5060010190565b634e487b7160e01b600052603160045260246000fd5b600082601f8301126139e257600080fd5b815167ffffffffffffffff8111156139fc576139fc6134b5565b613a0f601f8201601f19166020016134f4565b818152846020838601011115613a2457600080fd5b61399a826020830160208701613670565b600060208284031215613a4757600080fd5b815167ffffffffffffffff80821115613a5f57600080fd5b9083019060c08286031215613a7357600080fd5b613a7b6134cb565b82518152602083015160208201526040830151604082015260608301516060820152608083015182811115613aaf57600080fd5b613abb878286016139d1565b60808301525060a08301519250613ad1836133f8565b60a0810192909252509392505050565b600082601f830112613af257600080fd5b81516020613b0261359283613525565b82815260059290921b84018101918181019086841115613b2157600080fd5b8286015b8481101561395a57805167ffffffffffffffff811115613b455760008081fd5b613b538986838b01016139d1565b845250918301918301613b25565b60008060008060808587031215613b7757600080fd5b845167ffffffffffffffff80821115613b8f57600080fd5b818701915087601f830112613ba357600080fd5b81516020613bb361359283613525565b82815260059290921b8401810191818101908b841115613bd257600080fd5b948201945b83861015613bf9578551613bea816133c6565b82529482019490820190613bd7565b918a0151919850909350505080821115613c1257600080fd5b613c1e88838901613ae1565b94506040870151915080821115613c3457600080fd5b613c40888389016138ff565b93506060870151915080821115613c5657600080fd5b50613c63878288016138ff565b91505092959194509250565b600060208284031215613c8157600080fd5b8151612342816133f8565b60008251613c9e818460208701613670565b9190910192915050565b85815284602082015260a060408201526000613cc760a08301866138a8565b6001600160a01b0394909416606083015250608001529392505050565b600080600060608486031215613cf957600080fd5b8351925060208401519150604084015190509250925092565b602081526000612342602083018461369c56fea2646970667358221220cc649f4fd344fae59bfe7aadea132c5eb8ad6cb365aa56635eac5781bf0c336964736f6c634300080f0033

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

00000000000000000000000061bf1b38930e37850d459f3cb926cd197f5f88c00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000f3a5454496e26ac57da879bf3285fa85debf03880000000000000000000000006ea8ad7228ebca6c686096269d60bb1c72d13fa800000000000000000000000070085a09d30d6f8c4ecf6ee10120d1847383bb570000000000000000000000004fed5491693007f0cd49f4614ffc38ab6a04b6190000000000000000000000001a2aff8453b211f1fcfe97718a0f23232a6a540300000000000000000000000000aec34489a7ade91a0507b6b9dbb0a50938b7c0000000000000000000000000eeaff5116c09ecc20ab72b53860a7cead97f0ab4000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000001e0000000000000000000000000000000000000000000000000000000000000026000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000e358838ce72d5e61e0018a2ffac4bec5f4c88d2000000000000000000000000acc15dc74880c9944775448304b263d191c6077f0000000000000000000000000000000000000000000000000000000000000003000000000000000000000000acc15dc74880c9944775448304b263d191c6077f000000000000000000000000ffffffff1fcacbd218edc0eba20fc2308c778080000000000000000000000000191cf2602ca2e534c5ccae7bcbf4c46a704bb9490000000000000000000000000000000000000000000000000000000000000002000000000000000000000000acc15dc74880c9944775448304b263d191c6077f000000000000000000000000ffffffff1fcacbd218edc0eba20fc2308c778080

-----Decoded View---------------
Arg [0] : _want (address): 0x61BF1b38930e37850D459f3CB926Cd197F5F88c0
Arg [1] : _poolId (uint256): 32
Arg [2] : _chef (address): 0xF3a5454496E26ac57da879bf3285Fa85DEBF0388
Arg [3] : _commonAddresses (tuple):
Arg [1] : vault (address): 0x6EA8ad7228eBcA6C686096269d60bb1C72D13fa8
Arg [2] : unirouter (address): 0x70085a09D30D6f8C4ecF6eE10120d1847383BB57
Arg [3] : keeper (address): 0x4fED5491693007f0CD49f4614FFC38Ab6A04B619
Arg [4] : strategist (address): 0x1A2aff8453b211F1fcFE97718A0f23232A6A5403
Arg [5] : beefyFeeRecipient (address): 0x00AeC34489A7ADE91A0507B6b9dBb0a50938B7c0
Arg [6] : beefyFeeConfig (address): 0xeEaFF5116C09ECc20Ab72b53860A7ceAd97F0Ab4

Arg [4] : _outputToNativeRoute (address[]): 0x0E358838ce72d5e61E0018a2ffaC4bEC5F4c88d2,0xAcc15dC74880C9944775448304B263D191c6077F
Arg [5] : _nativeToLp0Route (address[]): 0xAcc15dC74880C9944775448304B263D191c6077F,0xFfFFfFff1FcaCBd218EDc0EbA20Fc2308C778080,0x191cf2602Ca2e534c5Ccae7BCBF4C46a704bb949
Arg [6] : _nativeToLp1Route (address[]): 0xAcc15dC74880C9944775448304B263D191c6077F,0xFfFFfFff1FcaCBd218EDc0EbA20Fc2308C778080

-----Encoded View---------------
22 Constructor Arguments found :
Arg [0] : 00000000000000000000000061bf1b38930e37850d459f3cb926cd197f5f88c0
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [2] : 000000000000000000000000f3a5454496e26ac57da879bf3285fa85debf0388
Arg [3] : 0000000000000000000000006ea8ad7228ebca6c686096269d60bb1c72d13fa8
Arg [4] : 00000000000000000000000070085a09d30d6f8c4ecf6ee10120d1847383bb57
Arg [5] : 0000000000000000000000004fed5491693007f0cd49f4614ffc38ab6a04b619
Arg [6] : 0000000000000000000000001a2aff8453b211f1fcfe97718a0f23232a6a5403
Arg [7] : 00000000000000000000000000aec34489a7ade91a0507b6b9dbb0a50938b7c0
Arg [8] : 000000000000000000000000eeaff5116c09ecc20ab72b53860a7cead97f0ab4
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000180
Arg [10] : 00000000000000000000000000000000000000000000000000000000000001e0
Arg [11] : 0000000000000000000000000000000000000000000000000000000000000260
Arg [12] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [13] : 0000000000000000000000000e358838ce72d5e61e0018a2ffac4bec5f4c88d2
Arg [14] : 000000000000000000000000acc15dc74880c9944775448304b263d191c6077f
Arg [15] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [16] : 000000000000000000000000acc15dc74880c9944775448304b263d191c6077f
Arg [17] : 000000000000000000000000ffffffff1fcacbd218edc0eba20fc2308c778080
Arg [18] : 000000000000000000000000191cf2602ca2e534c5ccae7bcbf4c46a704bb949
Arg [19] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [20] : 000000000000000000000000acc15dc74880c9944775448304b263d191c6077f
Arg [21] : 000000000000000000000000ffffffff1fcacbd218edc0eba20fc2308c778080


Deployed Bytecode Sourcemap

46937:12479:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50345:117;;;;;;;;;;-1:-1:-1;50345:117:0;;;;;:::i;:::-;;:::i;:::-;;55774:262;;;;;;;;;;-1:-1:-1;55774:262:0;;;;;:::i;:::-;;:::i;45837:184::-;;;;;;;;;;-1:-1:-1;45837:184:0;;;;;:::i;:::-;;:::i;54186:173::-;;;;;;;;;;;;;:::i;:::-;;;917:25:1;;;905:2;890:18;54186:173:0;;;;;;;;47077:21;;;;;;;;;;-1:-1:-1;47077:21:0;;;;-1:-1:-1;;;;;47077:21:0;;;;;;-1:-1:-1;;;;;1117:32:1;;;1099:51;;1087:2;1072:18;47077:21:0;953:203:1;58913:112:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;47133:19::-;;;;;;;;;;-1:-1:-1;47133:19:0;;;;-1:-1:-1;;;;;47133:19:0;;;47251;;;;;;;;;;-1:-1:-1;47251:19:0;;;;-1:-1:-1;;;;;47251:19:0;;;42783:25;;;;;;;;;;-1:-1:-1;42783:25:0;;;;-1:-1:-1;;;;;42783:25:0;;;42724:24;;;;;;;;;;-1:-1:-1;42724:24:0;;;;-1:-1:-1;;;;;42724:24:0;;;49331:722;;;;;;;;;;-1:-1:-1;49331:722:0;;;;;:::i;:::-;;:::i;59147:106::-;;;;;;;;;;;;;:::i;47277:21::-;;;;;;;;;;;;;;;;44358:152;;;;;;;;;;-1:-1:-1;44358:152:0;;;;;:::i;:::-;;:::i;56851:121::-;;;;;;;;;;;;;:::i;50251:86::-;;;;;;;;;;;;;:::i;56622:118::-;;;;;;;;;;;;;:::i;42854:32::-;;;;;;;;;;-1:-1:-1;42854:32:0;;;;-1:-1:-1;;;;;42854:32:0;;;42990:46;;;;;;;;;;;;43031:5;42990:46;;50061:182;;;;;;;;;;;;;:::i;40791:86::-;;;;;;;;;;-1:-1:-1;40838:4:0;40862:7;-1:-1:-1;;;40862:7:0;;;;40791:86;;;2470:14:1;;2463:22;2445:41;;2433:2;2418:18;40791:86:0;2305:187:1;47159:23:0;;;;;;;;;;-1:-1:-1;47159:23:0;;;;-1:-1:-1;;;;;47159:23:0;;;44797:118;;;;;;;;;;-1:-1:-1;44797:118:0;;;;;:::i;:::-;;:::i;46414:77::-;;;;;;;;;;-1:-1:-1;46414:77:0;;;;;;;-1:-1:-1;;;;;46414:77:0;;;47515:38;;;;;;;;;;-1:-1:-1;47515:38:0;;;;;:::i;:::-;;:::i;38293:103::-;;;;;;;;;;;;;:::i;53807:110::-;;;;;;;;;;;;;:::i;45138:126::-;;;;;;;;;;-1:-1:-1;45138:126:0;;;;;:::i;:::-;;:::i;56748:95::-;;;;;;;;;;;;;:::i;47189:23::-;;;;;;;;;;-1:-1:-1;47189:23:0;;;;-1:-1:-1;;;;;47189:23:0;;;47307:28;;;;;;;;;;-1:-1:-1;47307:28:0;;;;;;;;43043:33;;;;;;;;;;;;;;;;44227:123;;;;;;;;;;;;;:::i;37645:87::-;;;;;;;;;;-1:-1:-1;37691:7:0;37718:6;-1:-1:-1;;;;;37718:6:0;37645:87;;42815:32;;;;;;;;;;-1:-1:-1;42815:32:0;;;;-1:-1:-1;;;;;42815:32:0;;;54631:1135;;;;;;;;;;;;;:::i;46369:36::-;;;;;;;;;;-1:-1:-1;46369:36:0;;;;;;;;58602:303;;;;;;;;;;;;;:::i;45590:190::-;;;;;;;;;;-1:-1:-1;45590:190:0;;;;;:::i;:::-;;:::i;44548:::-;;;;;;;;;;-1:-1:-1;44548:190:0;;;;;:::i;:::-;;:::i;42755:21::-;;;;;;;;;;-1:-1:-1;42755:21:0;;;;-1:-1:-1;;;;;42755:21:0;;;47392:36;;;;;;;;;;-1:-1:-1;47392:36:0;;;;;:::i;:::-;;:::i;53984:118::-;;;;;;;;;;;;;:::i;45329:197::-;;;;;;;;;;-1:-1:-1;45329:197:0;;;;;:::i;:::-;;:::i;58298:296::-;;;;;;;;;;-1:-1:-1;58298:296:0;;;;;:::i;:::-;;:::i;49069:254::-;;;;;;;;;;;;;:::i;50470:85::-;;;;;;;;;;;;;:::i;44949:142::-;;;;;;;;;;-1:-1:-1;44949:142:0;;;;;:::i;:::-;;:::i;59261:114::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;44085:134::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;47475:33::-;;;;;;;;;;-1:-1:-1;47475:33:0;;;;;:::i;:::-;;:::i;42936:47::-;;;;;;;;;;;;42981:2;42936:47;;47435:33;;;;;;;;;;-1:-1:-1;47435:33:0;;;;;:::i;:::-;;:::i;54367:256::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;59033:106::-;;;;;;;;;;;;;:::i;47342:26::-;;;;;;;;;;;;;;;;47105:21;;;;;;;;;;-1:-1:-1;47105:21:0;;;;-1:-1:-1;;;;;47105:21:0;;;38551:201;;;;;;;;;;-1:-1:-1;38551:201:0;;;;;:::i;:::-;;:::i;56044:133::-;;;;;;;;;;-1:-1:-1;56044:133:0;;;;;:::i;:::-;;:::i;56277:263::-;;;;;;;;;;;;;:::i;42697:20::-;;;;;;;;;;-1:-1:-1;42697:20:0;;;;-1:-1:-1;;;;;42697:20:0;;;50345:117;46538:17;;;;:49;;;;-1:-1:-1;46578:8:0;;;;;-1:-1:-1;;;;;46578:8:0;21419:19;:23;;46559:28;46534:159;;;46637:8;;;;;;;;;-1:-1:-1;;;;;46637:8:0;-1:-1:-1;;;;;46627:31:0;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46612:11;:48;;46604:77;;;;-1:-1:-1;;;46604:77:0;;8327:2:1;46604:77:0;;;8309:21:1;8366:2;8346:18;;;8339:30;-1:-1:-1;;;8385:18:1;;;8378:46;8441:18;;46604:77:0;;;;;;;;;50428:26:::1;50437:16;50428:8;:26::i;:::-;50345:117:::0;:::o;55774:262::-;37691:7;37718:6;-1:-1:-1;;;;;37718:6:0;43959:10;:21;;:45;;-1:-1:-1;43998:6:0;;-1:-1:-1;;;;;43998:6:0;43984:10;:20;43959:45;43951:66;;;;-1:-1:-1;;;43951:66:0;;;;;;;:::i;:::-;55859:16:::1;:36:::0;;-1:-1:-1;;55859:36:0::1;::::0;::::1;;::::0;;::::1;::::0;;;::::1;55912:16:::0;55908:121:::1;;;55945:19;55962:1;55945:16;:19::i;55908:121::-;55997:20;56014:2;55997:16;:20::i;45837:184::-:0;37531:13;:11;:13::i;:::-;45919:14:::1;:44:::0;;-1:-1:-1;;;;;;45919:44:0::1;-1:-1:-1::0;;;;;45919:44:0;::::1;::::0;;::::1;::::0;;;45979:34:::1;::::0;1099:51:1;;;45979:34:0::1;::::0;1087:2:1;1072:18;45979:34:0::1;;;;;;;;45837:184:::0;:::o;54186:173::-;54289:4;;54304:6;;54275:51;;-1:-1:-1;;;54275:51:0;;;;;8980:25:1;;;;54320:4:0;9021:18:1;;;9014:60;54232:7:0;;;;-1:-1:-1;;;;;54289:4:0;;;;54275:28;;8953:18:1;;54275:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;54252:74:0;;54186:173;-1:-1:-1;;;;54186:173:0:o;58913:112::-;58962:16;58998:19;58991:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;58991:26:0;;;;;;;;;;;;;;;;;;;;;;;58913:112;:::o;49331:722::-;49408:5;;-1:-1:-1;;;;;49408:5:0;49394:10;:19;49386:38;;;;-1:-1:-1;;;49386:38:0;;;;;;;:::i;:::-;49462:4;;49455:37;;-1:-1:-1;;;49455:37:0;;49486:4;49455:37;;;1099:51:1;49437:15:0;;-1:-1:-1;;;;;49462:4:0;;49455:22;;1072:18:1;;49455:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;49437:55;;49519:7;49509;:17;49505:167;;;49557:4;;49572:6;;-1:-1:-1;;;;;49557:4:0;;;;49543:28;;49580:17;49590:7;49580;:17;:::i;:::-;49543:55;;-1:-1:-1;;;;;;49543:55:0;;;;;;;;;;10228:25:1;;;;10269:18;;;10262:34;10201:18;;49543:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;49630:4:0;;49623:37;;-1:-1:-1;;;49623:37:0;;49654:4;49623:37;;;1099:51:1;-1:-1:-1;;;;;49630:4:0;;;;-1:-1:-1;49623:22:0;;-1:-1:-1;1072:18:1;;49623:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;49613:47;;49505:167;49698:7;49688;:17;49684:67;;;-1:-1:-1;49732:7:0;49684:67;37691:7;37718:6;-1:-1:-1;;;;;37718:6:0;49767:9;:20;;;;:33;;-1:-1:-1;40838:4:0;40862:7;-1:-1:-1;;;40862:7:0;;;;49791:9;49767:33;49763:190;;;49817:27;43031:5;49857:13;;49847:7;:23;;;;:::i;:::-;:40;;;;:::i;:::-;49817:70;-1:-1:-1;49912:29:0;49817:70;49912:7;:29;:::i;:::-;49902:39;;49802:151;49763:190;49991:5;;49972:4;;49965:41;;-1:-1:-1;;;;;49972:4:0;;;;49991:5;49998:7;49965:25;:41::i;:::-;50024:21;50033:11;:9;:11::i;:::-;50024:21;;917:25:1;;;905:2;890:18;50024:21:0;;;;;;;49375:678;49331:722;:::o;59147:106::-;59193:16;59229;59222:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;59222:23:0;;;;;;;;;;;;;;;;;;;;;;59147:106;:::o;44358:152::-;37691:7;37718:6;-1:-1:-1;;;;;37718:6:0;43959:10;:21;;:45;;-1:-1:-1;43998:6:0;;-1:-1:-1;;;;;43998:6:0;43984:10;:20;43959:45;43951:66;;;;-1:-1:-1;;;43951:66:0;;;;;;;:::i;:::-;44429:14:::1;::::0;:36:::1;::::0;-1:-1:-1;;;44429:36:0;;::::1;::::0;::::1;917:25:1::0;;;-1:-1:-1;;;;;44429:14:0;;::::1;::::0;:28:::1;::::0;890:18:1;;44429:36:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;44481:21;44495:6;44481:21;;;;917:25:1::0;;905:2;890:18;;771:177;56851:121:0;37691:7;37718:6;-1:-1:-1;;;;;37718:6:0;43959:10;:21;;:45;;-1:-1:-1;43998:6:0;;-1:-1:-1;;;;;43998:6:0;43984:10;:20;43959:45;43951:66;;;;-1:-1:-1;;;43951:66:0;;;;;;;:::i;:::-;56902:10:::1;:8;:10::i;:::-;56925:17;:15;:17::i;:::-;56955:9;:7;:9::i;:::-;56851:121::o:0;50251:86::-;46538:17;;;;:49;;;;-1:-1:-1;46578:8:0;;;;;-1:-1:-1;;;;;46578:8:0;21419:19;:23;;46559:28;46534:159;;;46637:8;;;;;;;;;-1:-1:-1;;;;;46637:8:0;-1:-1:-1;;;;;46627:31:0;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46612:11;:48;;46604:77;;;;-1:-1:-1;;;46604:77:0;;8327:2:1;46604:77:0;;;8309:21:1;8366:2;8346:18;;;8339:30;-1:-1:-1;;;8385:18:1;;;8378:46;8441:18;;46604:77:0;8125:340:1;46604:77:0;50310:19:::1;50319:9;50310:8;:19::i;56622:118::-:0;37691:7;37718:6;-1:-1:-1;;;;;37718:6:0;43959:10;:21;;:45;;-1:-1:-1;43998:6:0;;-1:-1:-1;;;;;43998:6:0;43984:10;:20;43959:45;43951:66;;;;-1:-1:-1;;;43951:66:0;;;;;;;:::i;:::-;56669:7:::1;:5;:7::i;:::-;56701:4;::::0;56725:6:::1;::::0;56687:45:::1;::::0;-1:-1:-1;;;56687:45:0;;-1:-1:-1;;;;;56701:4:0;;::::1;::::0;56687:37:::1;::::0;:45:::1;::::0;::::1;;917:25:1::0;;;905:2;890:18;;771:177;56687:45:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;56622:118::o:0;50061:182::-;50119:16;;;;50115:121;;;50174:5;;-1:-1:-1;;;;;50174:5:0;50160:10;:19;50152:38;;;;-1:-1:-1;;;50152:38:0;;;;;;;:::i;44797:118::-;37531:13;:11;:13::i;:::-;44861:5:::1;:14:::0;;-1:-1:-1;;;;;;44861:14:0::1;-1:-1:-1::0;;;;;44861:14:0;::::1;::::0;;::::1;::::0;;;44891:16:::1;::::0;1099:51:1;;;44891:16:0::1;::::0;1087:2:1;1072:18;44891:16:0::1;953:203:1::0;47515:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;47515:38:0;;-1:-1:-1;47515:38:0;;-1:-1:-1;47515:38:0:o;38293:103::-;37531:13;:11;:13::i;:::-;38358:30:::1;38385:1;38358:18;:30::i;53807:110::-:0;53849:7;53894:15;:13;:15::i;:::-;53876;:13;:15::i;:::-;:33;;;;:::i;:::-;53869:40;;53807:110;:::o;45138:126::-;37691:7;37718:6;-1:-1:-1;;;;;37718:6:0;43959:10;:21;;:45;;-1:-1:-1;43998:6:0;;-1:-1:-1;;;;;43998:6:0;43984:10;:20;43959:45;43951:66;;;;-1:-1:-1;;;43951:66:0;;;;;;;:::i;:::-;45206:6:::1;:16:::0;;-1:-1:-1;;;;;;45206:16:0::1;-1:-1:-1::0;;;;;45206:16:0;::::1;::::0;;::::1;::::0;;;45238:18:::1;::::0;1099:51:1;;;45238:18:0::1;::::0;1087:2:1;1072:18;45238::0::1;953:203:1::0;56748:95:0;37691:7;37718:6;-1:-1:-1;;;;;37718:6:0;43959:10;:21;;:45;;-1:-1:-1;43998:6:0;;-1:-1:-1;;;;;43998:6:0;43984:10;:20;43959:45;43951:66;;;;-1:-1:-1;;;43951:66:0;;;;;;;:::i;:::-;56795:8:::1;:6;:8::i;:::-;56816:19;:17;:19::i;44227:123::-:0;44302:14;;:40;;-1:-1:-1;;;44302:40:0;;44336:4;44302:40;;;1099:51:1;44275:7:0;;-1:-1:-1;;;;;44302:14:0;;:25;;1072:18:1;;44302:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;54631:1135::-;54674:7;54694:34;54731:9;:7;:9::i;:::-;54694:46;;54752:26;54780;54810:18;:16;:18::i;:::-;54751:77;;;;54839:17;54889:9;;;;;;;;;-1:-1:-1;;;;;54889:9:0;-1:-1:-1;;;;;54871:42:0;;54914:9;54924:1;54914:12;;;;;;;;:::i;:::-;;;;;;;54928:19;54871:77;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;54871:77:0;;;;;;;;;;;;:::i;:::-;;;54867:207;;;55022:9;55051:1;55032:9;:16;:20;;;;:::i;:::-;55022:31;;;;;;;;:::i;:::-;;;;;;;55010:43;;54958:107;54867:207;55090:19;:26;:31;55086:599;;55143:6;55138:536;55155:19;:26;55151:30;;55138:536;;;55221:1;55207:452;55228:9;:16;55224:1;:20;55207:452;;;55294:19;55314:1;55294:22;;;;;;;;:::i;:::-;;;;;;;;55317:1;55294:25;;;;;;;;:::i;:::-;;;;;;;;;;;55278:12;;-1:-1:-1;;;;;55294:25:0;;;;55278:9;;55288:1;;55278:12;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;55278:41:0;;55274:366;;55370:9;;55395:12;;-1:-1:-1;;;;;55370:9:0;;;;55352:42;;55395:9;;55405:1;;55395:12;;;;;;:::i;:::-;;;;;;;55409:19;55429:1;55409:22;;;;;;;;:::i;:::-;;;;;;;;55352:80;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;55352:80:0;;;;;;;;;;;;:::i;:::-;;;55348:269;;;55549:9;55578:1;55559:9;:16;:20;;;;:::i;:::-;55549:31;;;;;;;;:::i;:::-;;;;;;;55537:9;:43;;;;:::i;:::-;55525:55;;55458:150;55348:269;55246:3;;;;:::i;:::-;;;;55207:452;;;-1:-1:-1;55183:3:0;;;;:::i;:::-;;;;55138:536;;;;55086:599;42922:7;55739:4;:9;;;42922:7;55716:4;:10;;;55704:9;:22;;;;:::i;:::-;:32;;;;:::i;:::-;:44;;;;:::i;:::-;:54;;;;:::i;:::-;55697:61;;;;;;54631:1135;:::o;58602:303::-;37691:7;37718:6;-1:-1:-1;;;;;37718:6:0;43959:10;:21;;:45;;-1:-1:-1;43998:6:0;;-1:-1:-1;;;;;43998:6:0;43984:10;:20;43959:45;43951:66;;;;-1:-1:-1;;;43951:66:0;;;;;;;:::i;:::-;58684:19:::1;58704:26:::0;;58667:14:::1;::::0;58684:19;58704:30:::1;::::0;58733:1:::1;::::0;58704:30:::1;:::i;:::-;58684:51;;;;;;;;:::i;:::-;;;;;;;;58736:1;58684:54;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;58763:8:::1;::::0;-1:-1:-1;;;;;58684:54:0;;::::1;::::0;-1:-1:-1;58763:8:0::1;58753:18:::0;::::1;::::0;::::1;::::0;:40:::1;;-1:-1:-1::0;58785:8:0::1;::::0;-1:-1:-1;;;;;58775:18:0;;::::1;58785:8:::0;::::1;58775:18;;58753:40;58749:113;;;58837:9;::::0;58810:40:::1;::::0;-1:-1:-1;;;;;58810:26:0;;::::1;::::0;58837:9:::1;;58810:26;:40::i;:::-;58872:19;:25;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;58656:249;58602:303::o:0;45590:190::-;37531:13;:11;:13::i;:::-;45678:17:::1;:38:::0;;-1:-1:-1;;;;;;45678:38:0::1;-1:-1:-1::0;;;;;45678:38:0;::::1;::::0;;::::1;::::0;;;45732:40:::1;::::0;1099:51:1;;;45732:40:0::1;::::0;1087:2:1;1072:18;45732:40:0::1;953:203:1::0;44548:190:0;37691:7;37718:6;-1:-1:-1;;;;;37718:6:0;43959:10;:21;;:45;;-1:-1:-1;43998:6:0;;-1:-1:-1;;;;;43998:6:0;43984:10;:20;43959:45;43951:66;;;;-1:-1:-1;;;43951:66:0;;;;;;;:::i;:::-;42981:2:::1;44626:4;:26;;44618:43;;;;-1:-1:-1::0;;;44618:43:0::1;;;;;;13315:2:1::0;13297:21;;;13354:1;13334:18;;;13327:29;-1:-1:-1;;;13387:2:1;13372:18;;13365:34;13431:2;13416:18;;13113:327;44618:43:0::1;44672:13;:20:::0;;;44708:22:::1;::::0;917:25:1;;;44708:22:0::1;::::0;905:2:1;890:18;44708:22:0::1;771:177:1::0;47392:36:0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;47392:36:0;;-1:-1:-1;47392:36:0;:::o;53984:118::-;54064:4;;54057:37;;-1:-1:-1;;;54057:37:0;;54088:4;54057:37;;;1099:51:1;54030:7:0;;-1:-1:-1;;;;;54064:4:0;;54057:22;;1072:18:1;;54057:37:0;953:203:1;45329:197:0;45415:10;;-1:-1:-1;;;;;45415:10:0;45401;:24;45393:48;;;;-1:-1:-1;;;45393:48:0;;13647:2:1;45393:48:0;;;13629:21:1;13686:2;13666:18;;;13659:30;-1:-1:-1;;;13705:18:1;;;13698:41;13756:18;;45393:48:0;13445:335:1;45393:48:0;45452:10;:24;;-1:-1:-1;;;;;;45452:24:0;-1:-1:-1;;;;;45452:24:0;;;;;;;;45492:26;;1099:51:1;;;45492:26:0;;1087:2:1;1072:18;45492:26:0;953:203:1;58298:296:0;37531:13;:11;:13::i;:::-;58435:9:::1;::::0;58398:23;;58391:57:::1;::::0;-1:-1:-1;;;;;58435:9:0::1;::::0;::::1;::::0;58398:20;;58435:9;;58398:23:::1;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;58391:43:0::1;;;:57;;;;;:::i;:::-;58503:9;::::0;58466:23;;58459:70:::1;::::0;-1:-1:-1;;;;;58503:9:0::1;::::0;-1:-1:-1;;58514:14:0;58466:20;;58503:9:::1;::::0;58466:23:::1;;;;:::i;58459:70::-;58540:19;:46:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;58540:46:0;;;;;;::::1;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;:::i;:::-;;58298:296:::0;:::o;49069:254::-;40396:19;:17;:19::i;:::-;49145:4:::1;::::0;49138:37:::1;::::0;-1:-1:-1;;;49138:37:0;;49169:4:::1;49138:37;::::0;::::1;1099:51:1::0;49120:15:0::1;::::0;-1:-1:-1;;;;;49145:4:0::1;::::0;49138:22:::1;::::0;1072:18:1;;49138:37:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;49120:55:::0;-1:-1:-1;49192:11:0;;49188:128:::1;;49234:4;::::0;49248:6:::1;::::0;49220:44:::1;::::0;-1:-1:-1;;;49220:44:0;;-1:-1:-1;;;;;49234:4:0;;::::1;::::0;49220:27:::1;::::0;:44:::1;::::0;49256:7;;49220:44:::1;;10228:25:1::0;;;10284:2;10269:18;;10262:34;10216:2;10201:18;;10054:248;49220:44:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;49284:20;49292:11;:9;:11::i;:::-;49284:20;::::0;917:25:1;;;905:2;890:18;49284:20:0::1;771:177:1::0;50470:85:0;37691:7;37718:6;-1:-1:-1;;;;;37718:6:0;43959:10;:21;;:45;;-1:-1:-1;43998:6:0;;-1:-1:-1;;;;;43998:6:0;43984:10;:20;43959:45;43951:66;;;;-1:-1:-1;;;43951:66:0;;;;;;;:::i;44949:142::-;37531:13;:11;:13::i;:::-;45021:9:::1;:22:::0;;-1:-1:-1;;;;;;45021:22:0::1;-1:-1:-1::0;;;;;45021:22:0;::::1;::::0;;::::1;::::0;;;45059:24:::1;::::0;1099:51:1;;;45059:24:0::1;::::0;1087:2:1;1072:18;45059:24:0::1;953:203:1::0;59261:114:0;59310:18;59348:19;59341:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;59341:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59261:114;:::o;44085:134::-;44125:29;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44125:29:0;44174:14;;:37;;-1:-1:-1;;;44174:37:0;;44205:4;44174:37;;;1099:51:1;-1:-1:-1;;;;;44174:14:0;;;;:22;;1072:18:1;;44174:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;44174:37:0;;;;;;;;;;;;:::i;47475:33::-;;;;;;;;;;;;47435;;;;;;;;;;;;54367:256;54535:4;;54555:6;;54521:56;;-1:-1:-1;;;;;;54521:56:0;;;;;8980:25:1;;;;54571:4:0;9021:18:1;;;9014:60;54416:16:0;;;;54464:26;;;;-1:-1:-1;;;;;54535:4:0;;;;54521:33;;8953:18:1;;54521:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;54521:56:0;;;;;;;;;;;;:::i;:::-;54463:114;;;;-1:-1:-1;54367:256:0;;-1:-1:-1;;;;;54367:256:0:o;59033:106::-;59079:16;59115;59108:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;59108:23:0;;;;;;;;;;;;;;;;;;;;;;59033:106;:::o;38551:201::-;37531:13;:11;:13::i;:::-;-1:-1:-1;;;;;38640:22:0;::::1;38632:73;;;::::0;-1:-1:-1;;;38632:73:0;;18029:2:1;38632:73:0::1;::::0;::::1;18011:21:1::0;18068:2;18048:18;;;18041:30;18107:34;18087:18;;;18080:62;-1:-1:-1;;;18158:18:1;;;18151:36;18204:19;;38632:73:0::1;17827:402:1::0;38632:73:0::1;38716:28;38735:8;38716:18;:28::i;56044:133::-:0;37691:7;37718:6;-1:-1:-1;;;;;37718:6:0;43959:10;:21;;:45;;-1:-1:-1;43998:6:0;;-1:-1:-1;;;;;43998:6:0;43984:10;:20;43959:45;43951:66;;;;-1:-1:-1;;;43951:66:0;;;;;;;:::i;:::-;56131:17:::1;:38:::0;;-1:-1:-1;;56131:38:0::1;::::0;::::1;;::::0;;;::::1;::::0;;56044:133::o;56277:263::-;56342:5;;-1:-1:-1;;;;;56342:5:0;56328:10;:19;56320:38;;;;-1:-1:-1;;;56320:38:0;;;;;;;:::i;:::-;56385:4;;56409:6;;56371:45;;-1:-1:-1;;;56371:45:0;;-1:-1:-1;;;;;56385:4:0;;;;56371:37;;:45;;;;917:25:1;;;905:2;890:18;;771:177;56371:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;56454:4:0;;56447:37;;-1:-1:-1;;;56447:37:0;;56478:4;56447:37;;;1099:51:1;56429:15:0;;-1:-1:-1;;;;;;56454:4:0;;;;-1:-1:-1;56447:22:0;;1072:18:1;;56447:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;56502:4;;;56517:5;56495:37;;-1:-1:-1;;;56495:37:0;;-1:-1:-1;;;;;56517:5:0;;;56495:37;;;18408:51:1;18475:18;;;18468:34;;;56429:55:0;;-1:-1:-1;56502:4:0;;56495:21;;18381:18:1;;56495:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;29902:616::-;30266:10;;;30265:62;;-1:-1:-1;30282:39:0;;-1:-1:-1;;;30282:39:0;;30306:4;30282:39;;;18975:34:1;-1:-1:-1;;;;;19045:15:1;;;19025:18;;;19018:43;30282:15:0;;;;;18910:18:1;;30282:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:44;30265:62;30243:166;;;;-1:-1:-1;;;30243:166:0;;19274:2:1;30243:166:0;;;19256:21:1;19313:2;19293:18;;;19286:30;19352:34;19332:18;;;19325:62;-1:-1:-1;;;19403:18:1;;;19396:52;19465:19;;30243:166:0;19072:418:1;30243:166:0;30447:62;;-1:-1:-1;;;;;18426:32:1;;30447:62:0;;;18408:51:1;18475:18;;;18468:34;;;30420:90:0;;30440:5;;-1:-1:-1;;;30470:22:0;18381:18:1;;30447:62:0;;;;-1:-1:-1;;30447:62:0;;;;;;;;;;;;;;-1:-1:-1;;;;;30447:62:0;-1:-1:-1;;;;;;30447:62:0;;;;;;;;;;30420:19;:90::i;:::-;29902:616;;;:::o;23869:229::-;24006:12;24038:52;24060:6;24068:4;24074:1;24077:12;24038:21;:52::i;:::-;24031:59;;23869:229;;;;;;:::o;50618:534::-;40396:19;:17;:19::i;:::-;50709:4:::1;::::0;50723:6:::1;::::0;50695:38:::1;::::0;-1:-1:-1;;;50695:38:0;;::::1;::::0;::::1;10228:25:1::0;;;;50709:4:0::1;10269:18:1::0;;;10262:34;-1:-1:-1;;;;;50709:4:0;;::::1;::::0;50695:27:::1;::::0;10201:18:1;;50695:38:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;50771:6:0::1;::::0;50764:39:::1;::::0;-1:-1:-1;;;50764:39:0;;50797:4:::1;50764:39;::::0;::::1;1099:51:1::0;50744:17:0::1;::::0;-1:-1:-1;;;;;;50771:6:0;;::::1;::::0;-1:-1:-1;50764:24:0::1;::::0;1072:18:1;;50764:39:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50744:59:::0;-1:-1:-1;50818:13:0;;50814:331:::1;;50848:17;:15;:17::i;:::-;50880:28;50891:16;50880:10;:28::i;:::-;50923:14;:12;:14::i;:::-;50952:21;50976:15;:13;:15::i;:::-;50952:39;;51006:9;:7;:9::i;:::-;51046:15;51032:11;:29:::0;51094:10:::1;51081:52;51106:13:::0;51121:11:::1;:9;:11::i;:::-;51081:52;::::0;;10228:25:1;;;10284:2;10269:18;;10262:34;;;;10201:18;51081:52:0::1;;;;;;;50833:312;50684:468;50618:534:::0;:::o;37810:132::-;37691:7;37718:6;-1:-1:-1;;;;;37718:6:0;4432:10;37874:23;37866:68;;;;-1:-1:-1;;;37866:68:0;;19958:2:1;37866:68:0;;;19940:21:1;;;19977:18;;;19970:30;20036:34;20016:18;;;20009:62;20088:18;;37866:68:0;19756:356:1;29166:211:0;29310:58;;-1:-1:-1;;;;;18426:32:1;;29310:58:0;;;18408:51:1;18475:18;;;18468:34;;;29283:86:0;;29303:5;;-1:-1:-1;;;29333:23:0;18381:18:1;;29310:58:0;18234:274:1;41646:120:0;40655:16;:14;:16::i;:::-;41715:5:::1;41705:15:::0;;-1:-1:-1;;;;41705:15:0::1;::::0;;41736:22:::1;4432:10:::0;41745:12:::1;41736:22;::::0;-1:-1:-1;;;;;1117:32:1;;;1099:51;;1087:2;1072:18;41736:22:0::1;;;;;;;41646:120::o:0;56980:834::-;57052:4;;57034;;57027:46;;-1:-1:-1;;;;;57034:4:0;;;;57052;-1:-1:-1;;57027:24:0;:46::i;:::-;57111:9;;57091:6;;57084:53;;-1:-1:-1;;;;;57091:6:0;;;;57111:9;-1:-1:-1;;57084:26:0;:53::i;:::-;57177:9;;57157:6;;57150:40;;-1:-1:-1;;;;;57157:6:0;;;;57177:9;;57150:26;:40::i;:::-;57228:9;;57208:6;;57201:53;;-1:-1:-1;;;;;57208:6:0;;;;57228:9;-1:-1:-1;;57201:26:0;:53::i;:::-;57296:9;;57274:8;;57267:42;;-1:-1:-1;;;;;57274:8:0;;;;57296:9;;57267:28;:42::i;:::-;57349:9;;57327:8;;57320:55;;-1:-1:-1;;;;;57327:8:0;;;;57349:9;-1:-1:-1;;57320:28:0;:55::i;:::-;57417:9;;57395:8;;57388:42;;-1:-1:-1;;;;;57395:8:0;;;;57417:9;;57388:28;:42::i;:::-;57470:9;;57448:8;;57441:55;;-1:-1:-1;;;;;57448:8:0;;;;57470:9;-1:-1:-1;;57441:28:0;:55::i;:::-;57513:19;:26;:31;57509:298;;57566:6;57561:235;57578:19;:26;57574:30;;57561:235;;;57676:9;;57637:19;:22;;57630:59;;-1:-1:-1;;;;;57676:9:0;;;;57657:1;;57637:22;;;;;;:::i;:::-;;;;;;;;57660:1;57637:25;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;57637:25:0;;57630:59;:45;:59::i;:::-;57754:9;;57715:19;:22;;57708:72;;-1:-1:-1;;;;;57754:9:0;;-1:-1:-1;;57765:14:0;57735:1;;57715:22;;;;;;:::i;57708:72::-;57606:3;;;;:::i;:::-;;;;57561:235;;38912:191;38986:16;39005:6;;-1:-1:-1;;;;;39022:17:0;;;-1:-1:-1;;;;;;39022:17:0;;;;;;39055:40;;39005:6;;;;;;;39055:40;;38986:16;39055:40;38975:128;38912:191;:::o;41387:118::-;40396:19;:17;:19::i;:::-;41447:7:::1;:14:::0;;-1:-1:-1;;;;41447:14:0::1;-1:-1:-1::0;;;41447:14:0::1;::::0;;41477:20:::1;41484:12;4432:10:::0;;4352:98;57822:468;57896:4;;57878;;57871:33;;-1:-1:-1;;;;;57878:4:0;;;;57896;;57871:24;:33::i;:::-;57942:9;;57922:6;;57915:40;;-1:-1:-1;;;;;57922:6:0;;;;57942:9;;57915:26;:40::i;:::-;57997:9;;57975:8;;57968:42;;-1:-1:-1;;;;;57975:8:0;;;;57997:9;;57968:28;:42::i;:::-;58050:9;;58028:8;;58021:42;;-1:-1:-1;;;;;58028:8:0;;;;58050:9;;58021:28;:42::i;:::-;58080:19;:26;:31;58076:207;;58133:6;58128:144;58145:19;:26;58141:30;;58128:144;;;58243:9;;58204:19;:22;;58197:59;;-1:-1:-1;;;;;58243:9:0;;;;58224:1;;58204:22;;;;;;:::i;58197:59::-;58173:3;;;;:::i;:::-;;;;58128:144;;40950:108;40838:4;40862:7;-1:-1:-1;;;40862:7:0;;;;41020:9;41012:38;;;;-1:-1:-1;;;41012:38:0;;20319:2:1;41012:38:0;;;20301:21:1;20358:2;20338:18;;;20331:30;-1:-1:-1;;;20377:18:1;;;20370:46;20433:18;;41012:38:0;20117:340:1;32233:716:0;32657:23;32683:69;32711:4;32683:69;;;;;;;;;;;;;;;;;32691:5;-1:-1:-1;;;;;32683:27:0;;;:69;;;;;:::i;:::-;32767:17;;32657:95;;-1:-1:-1;32767:21:0;32763:179;;32864:10;32853:30;;;;;;;;;;;;:::i;:::-;32845:85;;;;-1:-1:-1;;;32845:85:0;;20664:2:1;32845:85:0;;;20646:21:1;20703:2;20683:18;;;20676:30;20742:34;20722:18;;;20715:62;-1:-1:-1;;;20793:18:1;;;20786:40;20843:19;;32845:85:0;20462:406:1;24989:510:0;25159:12;25217:5;25192:21;:30;;25184:81;;;;-1:-1:-1;;;25184:81:0;;21075:2:1;25184:81:0;;;21057:21:1;21114:2;21094:18;;;21087:30;21153:34;21133:18;;;21126:62;-1:-1:-1;;;21204:18:1;;;21197:36;21250:19;;25184:81:0;20873:402:1;25184:81:0;-1:-1:-1;;;;;21419:19:0;;;25276:60;;;;-1:-1:-1;;;25276:60:0;;21482:2:1;25276:60:0;;;21464:21:1;21521:2;21501:18;;;21494:30;21560:31;21540:18;;;21533:59;21609:18;;25276:60:0;21280:353:1;25276:60:0;25350:12;25364:23;25391:6;-1:-1:-1;;;;;25391:11:0;25410:5;25417:4;25391:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25349:73;;;;25440:51;25457:7;25466:10;25478:12;25440:16;:51::i;:::-;25433:58;24989:510;-1:-1:-1;;;;;;;24989:510:0:o;51195:951::-;51292:21;51328:13;;51324:96;;51373:6;;;;;;;;;-1:-1:-1;;;;;51373:6:0;-1:-1:-1;;;;;51358:30:0;;51396:9;51358:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51324:96;51498:6;;51491:39;;-1:-1:-1;;;51491:39:0;;51524:4;51491:39;;;1099:51:1;51471:17:0;;-1:-1:-1;;;;;51498:6:0;;51491:24;;1072:18:1;;51491:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51559:9;;51541:120;;-1:-1:-1;;;51541:120:0;;51471:59;;-1:-1:-1;;;;;;51559:9:0;;51541:53;;:120;;51471:59;;51559:9;;51609:19;;51638:4;;51645:15;;51541:120;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;51541:120:0;;;;;;;;;;;;:::i;:::-;-1:-1:-1;51717:19:0;:26;:31;51713:426;;51770:6;51765:363;51782:19;:26;51778:30;;51765:363;;;51834:16;51860:19;51880:1;51860:22;;;;;;;;:::i;:::-;;;;;;;;51883:1;51860:25;;;;;;;;:::i;:::-;;;;;;;;;;;51853:58;;-1:-1:-1;;;51853:58:0;;51905:4;51853:58;;;1099:51:1;-1:-1:-1;;;;;51860:25:0;;;;51853:43;;1072:18:1;;51853:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51834:77;-1:-1:-1;51934:12:0;;51930:183;;51989:9;;52038:19;:22;;-1:-1:-1;;;;;51989:9:0;;;;51971:53;;52025:8;;51989:9;;52038:19;52058:1;;52038:22;;;;;;:::i;:::-;;;;;;;;52070:4;52077:15;51971:122;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;51971:122:0;;;;;;;;;;;;:::i;:::-;;51930:183;-1:-1:-1;51810:3:0;;;;:::i;:::-;;;;51765:363;;52179:747;52245:34;52282:9;:7;:9::i;:::-;52369:10;;52334:6;;52327:39;;-1:-1:-1;;;52327:39:0;;52360:4;52327:39;;;1099:51:1;52369:10:0;;-1:-1:-1;52302:22:0;;42922:7;;52369:10;-1:-1:-1;;;;;52334:6:0;;52327:24;;1072:18:1;;52327:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:52;;;;:::i;:::-;:62;;;;:::i;:::-;52302:87;;52402:21;42922:7;52443:4;:9;;;52426:14;:26;;;;:::i;:::-;:36;;;;:::i;:::-;52480:6;;52402:60;;-1:-1:-1;52473:60:0;;-1:-1:-1;;;;;52480:6:0;52501:16;52402:60;52473:27;:60::i;:::-;52546:22;42922:7;52588:4;:10;;;52571:14;:27;;;;:::i;:::-;:37;;;;:::i;:::-;52647:17;;52626:6;;52546:62;;-1:-1:-1;52619:62:0;;-1:-1:-1;;;;;52626:6:0;;;;52647:17;52546:62;52619:27;:62::i;:::-;52694:27;42922:7;52741:4;:15;;;52724:14;:32;;;;:::i;:::-;:42;;;;:::i;:::-;52805:10;;52784:6;;52694:72;;-1:-1:-1;52777:60:0;;-1:-1:-1;;;;;52784:6:0;;;;52805:10;52694:72;52777:27;:60::i;:::-;52855:63;;;22711:25:1;;;22767:2;22752:18;;22745:34;;;22795:18;;;22788:34;;;52855:63:0;;22699:2:1;22684:18;52855:63:0;;;;;;;52234:692;;;;;52179:747;:::o;52989:744::-;53061:6;;53054:39;;-1:-1:-1;;;53054:39:0;;53087:4;53054:39;;;1099:51:1;53033:18:0;;53096:1;;-1:-1:-1;;;;;53061:6:0;;;;53054:24;;1072:18:1;;53054:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:43;;;;:::i;:::-;53126:6;;53114:8;;53033:64;;-1:-1:-1;;;;;;53114:8:0;;;53126:6;;53114:18;53110:169;;53167:9;;53149:118;;-1:-1:-1;;;53149:118:0;;-1:-1:-1;;;;;53167:9:0;;;;53149:53;;:118;;53203:10;;53167:9;;53218:16;;53244:4;;53251:15;;53149:118;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;53149:118:0;;;;;;;;;;;;:::i;:::-;;53110:169;53307:6;;53295:8;;-1:-1:-1;;;;;53295:8:0;;;53307:6;;53295:18;53291:169;;53348:9;;53330:118;;-1:-1:-1;;;53330:118:0;;-1:-1:-1;;;;;53348:9:0;;;;53330:53;;:118;;53384:10;;53348:9;;53399:16;;53425:4;;53432:15;;53330:118;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;53330:118:0;;;;;;;;;;;;:::i;:::-;;53291:169;53496:8;;53489:41;;-1:-1:-1;;;53489:41:0;;53524:4;53489:41;;;1099:51:1;53472:14:0;;-1:-1:-1;;;;;53496:8:0;;53489:26;;1072:18:1;;53489:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;53565:8;;53558:41;;-1:-1:-1;;;53558:41:0;;53593:4;53558:41;;;1099:51:1;53472:58:0;;-1:-1:-1;53541:14:0;;-1:-1:-1;;;;;53565:8:0;;;;53558:26;;1072:18:1;;53558:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;53628:9;;53652:8;;53662;;53610:115;;-1:-1:-1;;;53610:115:0;;-1:-1:-1;;;;;53652:8:0;;;53610:115;;;23230:34:1;53662:8:0;;;23280:18:1;;;23273:43;23332:18;;;23325:34;;;23375:18;;;23368:34;;;53628:9:0;23418:19:1;;;23411:35;;;23462:19;;;23455:35;53702:4:0;23506:19:1;;;23499:44;53709:15:0;23559:19:1;;;23552:35;53541:58:0;;-1:-1:-1;53628:9:0;;53610:41;;23164:19:1;;53610:115:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;53022:711;;;52989:744::o;41135:108::-;40838:4;40862:7;-1:-1:-1;;;40862:7:0;;;;41194:41;;;;-1:-1:-1;;;41194:41:0;;24111:2:1;41194:41:0;;;24093:21:1;24150:2;24130:18;;;24123:30;-1:-1:-1;;;24169:18:1;;;24162:50;24229:18;;41194:41:0;23909:344:1;27675:762:0;27825:12;27854:7;27850:580;;;-1:-1:-1;27885:10:0;27878:17;;27850:580;27999:17;;:21;27995:424;;28247:10;28241:17;28308:15;28295:10;28291:2;28287:19;28280:44;27995:424;28390:12;28383:20;;-1:-1:-1;;;28383:20:0;;;;;;;;:::i;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:131:1;-1:-1:-1;;;;;89:31:1;;79:42;;69:70;;135:1;132;125:12;150:247;209:6;262:2;250:9;241:7;237:23;233:32;230:52;;;278:1;275;268:12;230:52;317:9;304:23;336:31;361:5;336:31;:::i;402:118::-;488:5;481:13;474:21;467:5;464:32;454:60;;510:1;507;500:12;525:241;581:6;634:2;622:9;613:7;609:23;605:32;602:52;;;650:1;647;640:12;602:52;689:9;676:23;708:28;730:5;708:28;:::i;1161:461::-;1214:3;1252:5;1246:12;1279:6;1274:3;1267:19;1305:4;1334:2;1329:3;1325:12;1318:19;;1371:2;1364:5;1360:14;1392:1;1402:195;1416:6;1413:1;1410:13;1402:195;;;1481:13;;-1:-1:-1;;;;;1477:39:1;1465:52;;1537:12;;;;1572:15;;;;1513:1;1431:9;1402:195;;;-1:-1:-1;1613:3:1;;1161:461;-1:-1:-1;;;;;1161:461:1:o;1627:261::-;1806:2;1795:9;1788:21;1769:4;1826:56;1878:2;1867:9;1863:18;1855:6;1826:56;:::i;1893:180::-;1952:6;2005:2;1993:9;1984:7;1980:23;1976:32;1973:52;;;2021:1;2018;2011:12;1973:52;-1:-1:-1;2044:23:1;;1893:180;-1:-1:-1;1893:180:1:o;2497:248::-;2565:6;2573;2626:2;2614:9;2605:7;2601:23;2597:32;2594:52;;;2642:1;2639;2632:12;2594:52;-1:-1:-1;;2665:23:1;;;2735:2;2720:18;;;2707:32;;-1:-1:-1;2497:248:1:o;2750:127::-;2811:10;2806:3;2802:20;2799:1;2792:31;2842:4;2839:1;2832:15;2866:4;2863:1;2856:15;2882:253;2954:2;2948:9;2996:4;2984:17;;3031:18;3016:34;;3052:22;;;3013:62;3010:88;;;3078:18;;:::i;:::-;3114:2;3107:22;2882:253;:::o;3140:275::-;3211:2;3205:9;3276:2;3257:13;;-1:-1:-1;;3253:27:1;3241:40;;3311:18;3296:34;;3332:22;;;3293:62;3290:88;;;3358:18;;:::i;:::-;3394:2;3387:22;3140:275;;-1:-1:-1;3140:275:1:o;3420:183::-;3480:4;3513:18;3505:6;3502:30;3499:56;;;3535:18;;:::i;:::-;-1:-1:-1;3580:1:1;3576:14;3592:4;3572:25;;3420:183::o;3608:966::-;3692:6;3723:2;3766;3754:9;3745:7;3741:23;3737:32;3734:52;;;3782:1;3779;3772:12;3734:52;3822:9;3809:23;3855:18;3847:6;3844:30;3841:50;;;3887:1;3884;3877:12;3841:50;3910:22;;3963:4;3955:13;;3951:27;-1:-1:-1;3941:55:1;;3992:1;3989;3982:12;3941:55;4028:2;4015:16;4051:60;4067:43;4107:2;4067:43;:::i;:::-;4051:60;:::i;:::-;4145:15;;;4227:1;4223:10;;;;4215:19;;4211:28;;;4176:12;;;;4251:19;;;4248:39;;;4283:1;4280;4273:12;4248:39;4307:11;;;;4327:217;4343:6;4338:3;4335:15;4327:217;;;4423:3;4410:17;4440:31;4465:5;4440:31;:::i;:::-;4484:18;;4360:12;;;;4522;;;;4327:217;;4579:1318;4771:4;4800:2;4840;4829:9;4825:18;4870:2;4859:9;4852:21;4893:6;4928;4922:13;4959:6;4951;4944:22;4997:2;4986:9;4982:18;4975:25;;5059:2;5049:6;5046:1;5042:14;5031:9;5027:30;5023:39;5009:53;;5097:2;5089:6;5085:15;5118:1;5139;5149:719;5165:6;5160:3;5157:15;5149:719;;;5234:22;;;-1:-1:-1;;5230:36:1;5218:49;;5290:13;;5364:9;;5386:24;;;5476:11;;;;5432:15;;;;5511:1;5525:235;5541:8;5536:3;5533:17;5525:235;;;5622:15;;-1:-1:-1;;;;;5618:41:1;5604:56;;5729:17;;;;5686:14;;;;5656:1;5560:11;5525:235;;;-1:-1:-1;5783:5:1;;-1:-1:-1;;;5846:12:1;;;;5811:15;;;;5191:1;5182:11;5149:719;;;-1:-1:-1;5885:6:1;;4579:1318;-1:-1:-1;;;;;;;;4579:1318:1:o;5902:258::-;5974:1;5984:113;5998:6;5995:1;5992:13;5984:113;;;6074:11;;;6068:18;6055:11;;;6048:39;6020:2;6013:10;5984:113;;;6115:6;6112:1;6109:13;6106:48;;;-1:-1:-1;;6150:1:1;6132:16;;6125:27;5902:258::o;6165:::-;6207:3;6245:5;6239:12;6272:6;6267:3;6260:19;6288:63;6344:6;6337:4;6332:3;6328:14;6321:4;6314:5;6310:16;6288:63;:::i;:::-;6405:2;6384:15;-1:-1:-1;;6380:29:1;6371:39;;;;6412:4;6367:50;;6165:258;-1:-1:-1;;6165:258:1:o;6428:694::-;6615:2;6604:9;6597:21;6660:6;6654:13;6649:2;6638:9;6634:18;6627:41;6722:2;6714:6;6710:15;6704:22;6699:2;6688:9;6684:18;6677:50;6781:2;6773:6;6769:15;6763:22;6758:2;6747:9;6743:18;6736:50;6841:2;6833:6;6829:15;6823:22;6817:3;6806:9;6802:19;6795:51;6578:4;6893:3;6885:6;6881:16;6875:23;6935:4;6929:3;6918:9;6914:19;6907:33;6963:52;7010:3;6999:9;6995:19;6981:12;6963:52;:::i;:::-;6949:66;;7085:3;7077:6;7073:16;7067:23;7060:31;7053:39;7046:4;7035:9;7031:20;7024:69;7110:6;7102:14;;;6428:694;;;;:::o;7127:804::-;7384:2;7373:9;7366:21;7347:4;7410:56;7462:2;7451:9;7447:18;7439:6;7410:56;:::i;:::-;7523:22;;;7485:2;7503:18;;;7496:50;;;;7595:13;;7617:22;;;7693:15;;;;7655;;;7726:1;7736:169;7750:6;7747:1;7744:13;7736:169;;;7811:13;;7799:26;;7880:15;;;;7845:12;;;;7772:1;7765:9;7736:169;;;-1:-1:-1;7922:3:1;;7127:804;-1:-1:-1;;;;;;;7127:804:1:o;7936:184::-;8006:6;8059:2;8047:9;8038:7;8034:23;8030:32;8027:52;;;8075:1;8072;8065:12;8027:52;-1:-1:-1;8098:16:1;;7936:184;-1:-1:-1;7936:184:1:o;8470:331::-;8672:2;8654:21;;;8711:1;8691:18;;;8684:29;-1:-1:-1;;;8744:2:1;8729:18;;8722:38;8792:2;8777:18;;8470:331::o;9085:368::-;9182:6;9190;9198;9206;9259:3;9247:9;9238:7;9234:23;9230:33;9227:53;;;9276:1;9273;9266:12;9227:53;-1:-1:-1;;9299:16:1;;9355:2;9340:18;;9334:25;9399:2;9384:18;;9378:25;9443:2;9428:18;;;9422:25;9299:16;;9334:25;;-1:-1:-1;9422:25:1;;-1:-1:-1;9085:368:1;-1:-1:-1;9085:368:1:o;9458:329::-;9660:2;9642:21;;;9699:1;9679:18;;;9672:29;-1:-1:-1;;;9732:2:1;9717:18;;9710:36;9778:2;9763:18;;9458:329::o;9792:127::-;9853:10;9848:3;9844:20;9841:1;9834:31;9884:4;9881:1;9874:15;9908:4;9905:1;9898:15;9924:125;9964:4;9992:1;9989;9986:8;9983:34;;;9997:18;;:::i;:::-;-1:-1:-1;10034:9:1;;9924:125::o;10307:168::-;10347:7;10413:1;10409;10405:6;10401:14;10398:1;10395:21;10390:1;10383:9;10376:17;10372:45;10369:71;;;10420:18;;:::i;:::-;-1:-1:-1;10460:9:1;;10307:168::o;10480:217::-;10520:1;10546;10536:132;;10590:10;10585:3;10581:20;10578:1;10571:31;10625:4;10622:1;10615:15;10653:4;10650:1;10643:15;10536:132;-1:-1:-1;10682:9:1;;10480:217::o;10702:128::-;10742:3;10773:1;10769:6;10766:1;10763:13;10760:39;;;10779:18;;:::i;:::-;-1:-1:-1;10815:9:1;;10702:128::o;10835:127::-;10896:10;10891:3;10887:20;10884:1;10877:31;10927:4;10924:1;10917:15;10951:4;10948:1;10941:15;10967:495;11028:3;11066:5;11060:12;11093:6;11088:3;11081:19;11119:4;11148:2;11143:3;11139:12;11132:19;;11170:5;11167:1;11160:16;11212:2;11209:1;11199:16;11233:1;11243:194;11257:6;11254:1;11251:13;11243:194;;;11322:13;;-1:-1:-1;;;;;11318:39:1;11306:52;;11378:12;;;;11354:1;11413:14;;;;11272:9;11243:194;;11467:337;11671:6;11660:9;11653:25;11714:2;11709;11698:9;11694:18;11687:30;11634:4;11734:64;11794:2;11783:9;11779:18;11771:6;11734:64;:::i;11809:659::-;11874:5;11927:3;11920:4;11912:6;11908:17;11904:27;11894:55;;11945:1;11942;11935:12;11894:55;11974:6;11968:13;12000:4;12024:60;12040:43;12080:2;12040:43;:::i;12024:60::-;12118:15;;;12204:1;12200:10;;;;12188:23;;12184:32;;;12149:12;;;;12228:15;;;12225:35;;;12256:1;12253;12246:12;12225:35;12292:2;12284:6;12280:15;12304:135;12320:6;12315:3;12312:15;12304:135;;;12386:10;;12374:23;;12417:12;;;;12337;;12304:135;;;-1:-1:-1;12457:5:1;11809:659;-1:-1:-1;;;;;;11809:659:1:o;12473:363::-;12568:6;12621:2;12609:9;12600:7;12596:23;12592:32;12589:52;;;12637:1;12634;12627:12;12589:52;12670:9;12664:16;12703:18;12695:6;12692:30;12689:50;;;12735:1;12732;12725:12;12689:50;12758:72;12822:7;12813:6;12802:9;12798:22;12758:72;:::i;:::-;12748:82;12473:363;-1:-1:-1;;;;12473:363:1:o;12841:135::-;12880:3;12901:17;;;12898:43;;12921:18;;:::i;:::-;-1:-1:-1;12968:1:1;12957:13;;12841:135::o;12981:127::-;13042:10;13037:3;13033:20;13030:1;13023:31;13073:4;13070:1;13063:15;13097:4;13094:1;13087:15;13785:497;13839:5;13892:3;13885:4;13877:6;13873:17;13869:27;13859:55;;13910:1;13907;13900:12;13859:55;13939:6;13933:13;13965:18;13961:2;13958:26;13955:52;;;13987:18;;:::i;:::-;14031:55;14074:2;14055:13;;-1:-1:-1;;14051:27:1;14080:4;14047:38;14031:55;:::i;:::-;14111:2;14102:7;14095:19;14157:3;14150:4;14145:2;14137:6;14133:15;14129:26;14126:35;14123:55;;;14174:1;14171;14164:12;14123:55;14187:64;14248:2;14241:4;14232:7;14228:18;14221:4;14213:6;14209:17;14187:64;:::i;14287:950::-;14386:6;14439:2;14427:9;14418:7;14414:23;14410:32;14407:52;;;14455:1;14452;14445:12;14407:52;14488:9;14482:16;14517:18;14558:2;14550:6;14547:14;14544:34;;;14574:1;14571;14564:12;14544:34;14597:22;;;;14653:4;14635:16;;;14631:27;14628:47;;;14671:1;14668;14661:12;14628:47;14697:22;;:::i;:::-;14748:2;14742:9;14735:5;14728:24;14798:2;14794;14790:11;14784:18;14779:2;14772:5;14768:14;14761:42;14849:2;14845;14841:11;14835:18;14830:2;14823:5;14819:14;14812:42;14900:2;14896;14892:11;14886:18;14881:2;14874:5;14870:14;14863:42;14944:3;14940:2;14936:12;14930:19;14974:2;14964:8;14961:16;14958:36;;;14990:1;14987;14980:12;14958:36;15027:56;15075:7;15064:8;15060:2;15056:17;15027:56;:::i;:::-;15021:3;15014:5;15010:15;15003:81;;15122:3;15118:2;15114:12;15108:19;15093:34;;15136:30;15158:7;15136:30;:::i;:::-;15193:3;15182:15;;15175:32;;;;-1:-1:-1;15186:5:1;14287:950;-1:-1:-1;;;14287:950:1:o;15242:896::-;15306:5;15359:3;15352:4;15344:6;15340:17;15336:27;15326:55;;15377:1;15374;15367:12;15326:55;15406:6;15400:13;15432:4;15456:60;15472:43;15512:2;15472:43;:::i;15456:60::-;15550:15;;;15636:1;15632:10;;;;15620:23;;15616:32;;;15581:12;;;;15660:15;;;15657:35;;;15688:1;15685;15678:12;15657:35;15724:2;15716:6;15712:15;15736:373;15752:6;15747:3;15744:15;15736:373;;;15831:3;15825:10;15867:18;15854:11;15851:35;15848:125;;;15927:1;15956:2;15952;15945:14;15848:125;15998:68;16062:3;16057:2;16043:11;16035:6;16031:24;16027:33;15998:68;:::i;:::-;15986:81;;-1:-1:-1;16087:12:1;;;;15769;;15736:373;;16143:1679;16350:6;16358;16366;16374;16427:3;16415:9;16406:7;16402:23;16398:33;16395:53;;;16444:1;16441;16434:12;16395:53;16477:9;16471:16;16506:18;16547:2;16539:6;16536:14;16533:34;;;16563:1;16560;16553:12;16533:34;16601:6;16590:9;16586:22;16576:32;;16646:7;16639:4;16635:2;16631:13;16627:27;16617:55;;16668:1;16665;16658:12;16617:55;16697:2;16691:9;16719:4;16743:60;16759:43;16799:2;16759:43;:::i;16743:60::-;16837:15;;;16919:1;16915:10;;;;16907:19;;16903:28;;;16868:12;;;;16943:19;;;16940:39;;;16975:1;16972;16965:12;16940:39;16999:11;;;;17019:210;17035:6;17030:3;17027:15;17019:210;;;17108:3;17102:10;17125:31;17150:5;17125:31;:::i;:::-;17169:18;;17052:12;;;;17207;;;;17019:210;;;17284:18;;;17278:25;17248:5;;-1:-1:-1;17278:25:1;;-1:-1:-1;;;17315:16:1;;;17312:36;;;17344:1;17341;17334:12;17312:36;17367:73;17432:7;17421:8;17410:9;17406:24;17367:73;:::i;:::-;17357:83;;17486:2;17475:9;17471:18;17465:25;17449:41;;17515:2;17505:8;17502:16;17499:36;;;17531:1;17528;17521:12;17499:36;17554:74;17620:7;17609:8;17598:9;17594:24;17554:74;:::i;:::-;17544:84;;17674:2;17663:9;17659:18;17653:25;17637:41;;17703:2;17693:8;17690:16;17687:36;;;17719:1;17716;17709:12;17687:36;;17742:74;17808:7;17797:8;17786:9;17782:24;17742:74;:::i;:::-;17732:84;;;16143:1679;;;;;;;:::o;18513:245::-;18580:6;18633:2;18621:9;18612:7;18608:23;18604:32;18601:52;;;18649:1;18646;18639:12;18601:52;18681:9;18675:16;18700:28;18722:5;18700:28;:::i;21638:274::-;21767:3;21805:6;21799:13;21821:53;21867:6;21862:3;21855:4;21847:6;21843:17;21821:53;:::i;:::-;21890:16;;;;;21638:274;-1:-1:-1;;21638:274:1:o;21917:587::-;22213:6;22202:9;22195:25;22256:6;22251:2;22240:9;22236:18;22229:34;22299:3;22294:2;22283:9;22279:18;22272:31;22176:4;22320:65;22380:3;22369:9;22365:19;22357:6;22320:65;:::i;:::-;-1:-1:-1;;;;;22421:32:1;;;;22416:2;22401:18;;22394:60;-1:-1:-1;22485:3:1;22470:19;22463:35;22312:73;21917:587;-1:-1:-1;;;21917:587:1:o;23598:306::-;23686:6;23694;23702;23755:2;23743:9;23734:7;23730:23;23726:32;23723:52;;;23771:1;23768;23761:12;23723:52;23800:9;23794:16;23784:26;;23850:2;23839:9;23835:18;23829:25;23819:35;;23894:2;23883:9;23879:18;23873:25;23863:35;;23598:306;;;;;:::o;24258:220::-;24407:2;24396:9;24389:21;24370:4;24427:45;24468:2;24457:9;24453:18;24445:6;24427:45;:::i

Swarm Source

ipfs://cc649f4fd344fae59bfe7aadea132c5eb8ad6cb365aa56635eac5781bf0c3369

Block Transaction Gas Used Reward
view all blocks collator

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

OVERVIEW

Strategy for stellaswap-wstdot-xcdot

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.