ETH Price: $2,592.86 (-1.00%)

Token

Beefy Velo (BeVELO)

Overview

Max Total Supply

26,948,728.46266806728323857 BeVELO

Holders

595

Market

Price

$0.00 @ 0.000000 ETH

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
1.797010193881047238 BeVELO

Value
$0.00
0x47a2468174cf7b3073b3024de6dd94424b4cf102
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information

Contract Source Code Verified (Exact Match)

Contract Name:
VeloStaker

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 optimistic.etherscan.io on 2022-09-15
*/

// SPDX-License-Identifier: MIT
// File: @openzeppelin-4/contracts/token/ERC20/IERC20.sol

// 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/IERC20Metadata.sol

// 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/Context.sol

// 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/ERC20.sol

// 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/draft-IERC20Permit.sol

// 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/Address.sol

// 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/SafeERC20.sol

// 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: @openzeppelin-4/contracts/token/ERC721/IERC721Receiver.sol

// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

// File: @openzeppelin-4/contracts/security/ReentrancyGuard.sol

// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

// File: @openzeppelin-4/contracts/access/Ownable.sol

// 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/Pausable.sol

// 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/strategies/BeSolid/BeSolidManager.sol


pragma solidity ^0.8.0;
contract BeSolidManager is Ownable, Pausable {
    using SafeERC20 for IERC20;

    /**
     * @dev Beefy Contracts:
     * {keeper} - Address to manage a few lower risk features of the strat..
     */
    address public keeper;
    address public voter;

    event NewKeeper(address oldKeeper, address newKeeper);
    event NewVoter(address newVoter);

    /**
     * @dev Initializes the base strategy.
     * @param _keeper address to use as alternative owner.
     */
   constructor(
        address _keeper,
        address _voter
    ) {

        keeper = _keeper;
        voter = _voter;
    }

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

    // Checks that caller is either owner or keeper.
    modifier onlyVoter() {
        require(msg.sender == voter, "!voter");
        _;
    }

    /**
     * @dev Updates address of the strat keeper.
     * @param _keeper new keeper address.
     */
    function setKeeper(address _keeper) external onlyManager {
        emit NewKeeper( keeper, _keeper);
        keeper = _keeper;
    }

     function setVoter(address _voter) external onlyManager {
        emit NewVoter(_voter);
        voter = _voter;
    }
    
}

// File: contracts/BIFI/strategies/BeSolid/IVoter.sol


pragma solidity ^0.8.0;

interface IVoter {
    function vote(uint256 tokenId, address[] calldata poolVote, uint256[] calldata weights) external;
    function whitelist(address token, uint256 tokenId) external;
    function reset(uint256 tokenId) external;
    function gauges(address lp) external view returns (address);
    function _ve() external view returns (address);
    function minter() external view returns (address);
    function external_bribes(address _lp) external view returns (address);
    function internal_bribes(address _lp) external view returns (address);
    function votes(uint256 id, address lp) external view returns (uint256);
    function poolVote(uint256 id, uint256 index) external view returns (address);
    function lastVoted(uint256 id) external view returns (uint256);
}

// File: contracts/BIFI/strategies/BeSolid/IVeDist.sol


pragma solidity ^0.8.0;

interface IVeDist {
    function claim(uint256 tokenId) external returns (uint);
}

// File: contracts/BIFI/strategies/BeSolid/IVeToken.sol


pragma solidity ^0.8.0;

interface IVeToken {
    function create_lock(uint256 _value, uint256 _lockDuration) external returns (uint256 _tokenId);
    function increase_amount(uint256 tokenId, uint256 value) external;
    function increase_unlock_time(uint256 tokenId, uint256 duration) external;
    function withdraw(uint256 tokenId) external;
    function balanceOfNFT(uint256 tokenId) external view returns (uint256 balance);
    function locked(uint256 tokenId) external view returns (uint256 amount, uint256 endTime);
    function token() external view returns (address);
}

// File: contracts/BIFI/strategies/BeSolid/BeSolidStaker.sol


pragma solidity ^0.8.0;
interface IMinter {
    function _rewards_distributor() external view returns (address);
}

contract BeSolidStaker is ERC20, BeSolidManager,  ReentrancyGuard {
    using SafeERC20 for IERC20;

    // Addresses used 
    IVoter public solidVoter;
    IVeToken public ve;
    IVeDist public veDist;

    // Want token and our NFT Token ID
    IERC20 public want;
    uint256 public tokenId;

    // Max Lock time, Max variable used for reserve split and the reserve rate. 
    uint16 public constant MAX = 10000;
    uint256 public constant MAX_LOCK = 365 days * 4;
    uint256 public reserveRate; 


    // Our on chain events.
    event CreateLock(address indexed user, uint256 veTokenId, uint256 amount, uint256 unlockTime);
    event Release(address indexed user, uint256 veTokenId, uint256 amount);
    event IncreaseTime(address indexed user, uint256 veTokenId, uint256 unlockTime);
    event DepositWant(uint256 amount);
    event Withdraw(uint256 amount);
    event ClaimVeEmissions(address indexed user, uint256 veTokenId, uint256 amount);
    event UpdatedReserveRate(uint256 newRate);

    constructor(
        string memory _name,
        string memory _symbol,
        uint256 _reserveRate,
        address _solidVoter,
        address _keeper,
        address _voter
    ) ERC20( _name, _symbol) BeSolidManager(_keeper, _voter){
        reserveRate = _reserveRate;
        solidVoter = IVoter(_solidVoter);
        ve = IVeToken(solidVoter._ve());
        want = IERC20(ve.token());
        IMinter _minter = IMinter(solidVoter.minter());
        veDist = IVeDist(_minter._rewards_distributor());

        want.safeApprove(address(ve), type(uint256).max);
    }

    // Deposit all want for a user.
    function depositAll() external {
        _deposit(want.balanceOf(msg.sender));
    }

    // Deposit an amount of want.
    function deposit(uint256 _amount) external {
        _deposit(_amount);
    }

     // Internal: Deposits Want and mint beWant, checks for ve increase opportunities first. 
    function _deposit(uint256 _amount) internal nonReentrant whenNotPaused {
        lock();
        uint256 _pool = balanceOfWant();
        want.safeTransferFrom(msg.sender, address(this), _amount);
        uint256 _after = balanceOfWant();
        _amount = _after - _pool; // Additional check for deflationary tokens.

        if (_amount > 0) {
            _mint(msg.sender, _amount);
            emit DepositWant(totalWant());
        }
    }

    // Deposit more in ve and up locktime.
    function lock() public { 
        if (totalWant() > 0) {
            (,, bool shouldIncreaseLock) = lockInfo();
            if (balanceOfWant() > requiredReserve()) {
                uint256 availableBalance = balanceOfWant() - requiredReserve();
                ve.increase_amount(tokenId, availableBalance);
                if (shouldIncreaseLock) {
                    ve.increase_unlock_time(tokenId, MAX_LOCK);
                }
            } else {
                // Extend max lock
                if (shouldIncreaseLock) {
                    ve.increase_unlock_time(tokenId, MAX_LOCK);
                }
            }
        }
    }

    // Withdraw capable if we have enough Want in the contract. 
    function withdraw(uint256 _amount) external {
        require(_amount <= withdrawableBalance(), "Not enough Want");
            _burn(msg.sender, _amount);
            want.safeTransfer(msg.sender, _amount);
            emit Withdraw(totalWant());
    }

    // Total Want in ve contract and beVe contract. 
    function totalWant() public view returns (uint256) {
        return balanceOfWant() + balanceOfWantInVe();
    }

    // Our required Want held in the contract to enable withdraw capabilities.
    function requiredReserve() public view returns (uint256 reqReserve) {
        // We calculate allocation for reserve of the total staked in Ve.
        reqReserve = balanceOfWantInVe() * reserveRate / MAX;
    }

    // Calculate how much 'want' is held by this contract
    function balanceOfWant() public view returns (uint256) {
        return want.balanceOf(address(this));
    }

    // What is our end lock and seconds remaining in lock? 
    function lockInfo() public view returns (uint256 endTime, uint256 secondsRemaining, bool shouldIncreaseLock) {
        (, endTime) = ve.locked(tokenId);
        uint256 unlockTime = (block.timestamp + MAX_LOCK) / 1 weeks * 1 weeks;
        secondsRemaining = endTime > block.timestamp ? endTime - block.timestamp : 0;
        shouldIncreaseLock = unlockTime > endTime ? true : false;
    }

    // Withdrawable Balance for users
    function withdrawableBalance() public view returns (uint256) {
        return balanceOfWant();
    }

    // How many want we got earning? 
    function balanceOfWantInVe() public view returns (uint256 wants) {
        (wants, ) = ve.locked(tokenId);
    }

    // Claim veToken emissions and increases locked amount in veToken
    function claimVeEmissions() public virtual {
        uint256 _amount = veDist.claim(tokenId);
        emit ClaimVeEmissions(msg.sender, tokenId, _amount);
    }

    // Reset current votes
    function resetVote() external onlyVoter {
        solidVoter.reset(tokenId);
    }

    // Create a new veToken if none is assigned to this address
    function createLock(uint256 _amount, uint256 _lock_duration) external onlyManager {
        require(tokenId == 0, "veToken > 0");
        require(_amount > 0, "amount == 0");

        want.safeTransferFrom(address(msg.sender), address(this), _amount);
        tokenId = ve.create_lock(_amount, _lock_duration);
        _mint(msg.sender, _amount);

        emit CreateLock(msg.sender, tokenId, _amount, _lock_duration);
    }

    // Release expired lock of a veToken owned by this address
    function release() external onlyOwner {
        (uint endTime,,) = lockInfo();
        require(endTime <= block.timestamp, "!Unlocked");
        ve.withdraw(tokenId);
      
        emit Release(msg.sender, tokenId, balanceOfWant());
    }

    // Whitelist new token
    function whitelist(address _token) external onlyManager {
        solidVoter.whitelist(_token, tokenId);
    }

     // Adjust reserve rate 
    function adjustReserve(uint256 _rate) external onlyOwner { 
        require(_rate <= MAX, "Higher than max");
        reserveRate = _rate;
        emit UpdatedReserveRate(_rate);
    }

    // Pause deposits
    function pause() public onlyManager {
        _pause();
        want.safeApprove(address(ve), 0);
    }

    // Unpause deposits
    function unpause() external onlyManager {
        _unpause();
        want.safeApprove(address(ve), type(uint256).max);
    }

    // Confirmation required for receiving veToken to smart contract
    function onERC721Received(
        address operator,
        address from,
        uint _tokenId,
        bytes calldata data
    ) external view returns (bytes4) {
        operator;
        from;
        _tokenId;
        data;
        require(msg.sender == address(ve), "!veToken");
        return bytes4(keccak256("onERC721Received(address,address,uint,bytes)"));
    }
}

// File: contracts/BIFI/interfaces/common/ISolidlyRouter.sol


pragma solidity >=0.6.0 <0.9.0;
pragma experimental ABIEncoderV2;
interface ISolidlyRouter {

    // Routes
    struct Routes {
        address from;
        address to;
        bool stable;
    }

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

    function addLiquidityETH(
        address token,
        bool stable, 
        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,
        bool stable, 
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB);

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

    function swapExactTokensForTokensSimple(
        uint amountIn, 
        uint amountOutMin, 
        address tokenFrom, 
        address tokenTo,
        bool stable, 
        address to, 
        uint deadline
    ) external returns (uint[] memory amounts);

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

    function getAmountOut(uint amountIn, address tokenIn, address tokenOut) external view returns (uint amount, bool stable);

    function getAmountsOut(uint amountIn, Routes[] memory routes) external view returns (uint[] memory amounts);
   
    function quoteAddLiquidity(
        address tokenA,
        address tokenB,
        bool stable,
        uint amountADesired,
        uint amountBDesired
    ) external view returns (uint amountA, uint amountB, uint liquidity);
}

// 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/Velodrome/VeloStaker.sol


pragma solidity ^0.8.0;
interface IRewardPool {
    function notifyRewardAmount() external;
}

interface ISolidlyGauge {
    function getReward(uint256 tokenId, address[] memory rewards) external;
}

interface IWrappedBribeFactory {
    function oldBribeToNew(address _gauge) external view returns (address);
}

contract VeloStaker is ERC20, BeSolidStaker {
    using SafeERC20 for IERC20;

    // Needed addresses
    IRewardPool public beVeloRewardPool;
    IWrappedBribeFactory public bribeFactory = IWrappedBribeFactory(0x7955519E14fdF498E28831F4cC06af4B8e3086A8);
    address[] public activeVoteLps;
    ISolidlyRouter public router;
    address public beefyFeeRecipient;
    IFeeConfig public beefyFeeConfig;
    address public native;

    // Voted Gauges
    struct Gauges {
        address bribeGauge;
        address feeGauge;
        address[] bribeTokens;
        address[] feeTokens;
    }

    // Mapping our reward token to a route 
    ISolidlyRouter.Routes[] public veloToNativeRoute;
    mapping (address => ISolidlyRouter.Routes[]) public routes;
    mapping (address => bool) public lpIntialized;
    mapping (address => Gauges) public gauges;

    // Events
    event SetBeVeloRewardPool(address oldPool, address newPool);
    event SetRouter(address oldRouter, address newRouter);
    event SetBribeFactory(address oldFactory, address newFactory);
    event SetFeeRecipient(address oldRecipient, address newRecipient);
    event SetFeeId(uint256 id);
    event AddedGauge(address bribeGauge, address feeGauge, address[] bribeTokens, address[] feeTokens);
    event AddedRewardToken(address token);
    event RewardsHarvested(uint256 amount);
    event Voted(address[] votes, uint256[] weights);
    event ChargedFees(uint256 callFees, uint256 beefyFees, uint256 strategistFees);
    
    constructor(
        string memory _name,
        string memory _symbol,
        uint256 _reserveRate,
        address _solidVoter,
        address _keeper,
        address _voter,
        address _beVeloRewardPool,
        address _beefyFeeRecipient,
        address _beefyFeeConfig,
        address _router,
        ISolidlyRouter.Routes[] memory _veloToNativeRoute
    ) BeSolidStaker(
        _name,
        _symbol,
        _reserveRate,
        _solidVoter,
        _keeper,
        _voter
    ) {
       beVeloRewardPool = IRewardPool(_beVeloRewardPool);
       router = ISolidlyRouter(_router);
       beefyFeeRecipient = _beefyFeeRecipient;
       beefyFeeConfig = IFeeConfig(_beefyFeeConfig);
    
       native = _veloToNativeRoute[_veloToNativeRoute.length - 1].to; 
       for (uint i; i < _veloToNativeRoute.length;) {
            veloToNativeRoute.push(_veloToNativeRoute[i]);
            unchecked { ++i; }
        }
    }

    // Vote information 
    function voteInfo() external view returns (address[] memory lpsVoted, uint256[] memory votes, uint256 lastVoted) {
        uint256 len = activeVoteLps.length;
        lpsVoted = new address[](len);
        votes = new uint256[](len);
        for (uint i; i < len;) {
            lpsVoted[i] = solidVoter.poolVote(tokenId, i);
            votes[i] = solidVoter.votes(tokenId, lpsVoted[i]);
            unchecked { ++i; }
        }
        lastVoted = solidVoter.lastVoted(tokenId);
    }

    // Claim veToken emissions and increases locked amount in veToken
    function claimVeEmissions() public override {
        uint256 _amount = veDist.claim(tokenId);
        uint256 gap = totalWant() - totalSupply();
        if (gap > 0) {
            _mint(address(beVeloRewardPool), gap);
            beVeloRewardPool.notifyRewardAmount();
        }
        emit ClaimVeEmissions(msg.sender, tokenId, _amount);
    }

    // vote for emission weights
    function vote(address[] calldata _tokenVote, uint256[] calldata _weights, bool _withHarvest) external onlyVoter {
        // Check to make sure we set up our rewards
        for (uint i; i < _tokenVote.length;) {
            require(lpIntialized[_tokenVote[i]], "lp not lpIntialized");
            unchecked { ++i; }
        }

        if (_withHarvest) {
            harvest();
        }

        activeVoteLps = _tokenVote;
        // We claim first to maximize our voting power.
        claimVeEmissions();
        solidVoter.vote(tokenId, _tokenVote, _weights);
        emit Voted(_tokenVote, _weights);
    }

    // Add gauge
    function addGauge(address _lp, address[] calldata _bribeTokens, address[] calldata _feeTokens ) external onlyManager {
        address gauge = solidVoter.gauges(_lp);
        gauges[_lp] = Gauges(
            bribeFactory.oldBribeToNew(solidVoter.external_bribes(gauge)),
            solidVoter.internal_bribes(gauge),
            _bribeTokens,
            _feeTokens
            );
        lpIntialized[_lp] = true;
        emit AddedGauge(solidVoter.external_bribes(_lp), solidVoter.internal_bribes(_lp), _bribeTokens, _feeTokens);
    }

    // Delete a reward token 
    function deleteRewardToken(address _token) external onlyManager {
        delete routes[_token];
    }

    // Add multiple reward tokens
    function addMultipleRewardTokens(ISolidlyRouter.Routes[][] calldata _routes) external onlyManager {
        for (uint i; i < _routes.length;) {
            addRewardToken(_routes[i]);
            unchecked { ++i; }
        }
    }

     // Add a reward token
    function addRewardToken(ISolidlyRouter.Routes[] calldata _route) public onlyManager {
        require(_route[0].from != address(want), "from cant be want");
        require(_route[_route.length - 1].to == address(want), "to has to be want");
        for (uint i; i < _route.length;) {
            routes[_route[0].from].push(_route[i]);
            unchecked { ++i; }
        }
        
        IERC20(_route[0].from).safeApprove(address(router), 0);
        IERC20(_route[0].from).safeApprove(address(router), type(uint256).max);
        emit AddedRewardToken(_route[0].from);
    }

    function getRewards(address _gauge, address[] calldata _tokens, ISolidlyRouter.Routes[][] calldata _routes) external nonReentrant onlyManager {
        uint256 before = balanceOfWant();
        ISolidlyGauge(_gauge).getReward(tokenId, _tokens);
        for (uint i; i < _routes.length;) {
            require(_routes[i][_routes[i].length - 1].to == address(want), "to != Want");
            require(_routes[i][0].from != address(want), "Can't sell Want");
            uint256 tokenBal = IERC20(_routes[i][0].from).balanceOf(address(this));
            IERC20(_routes[i][0].from).safeApprove(address(router), 0);
            IERC20(_routes[i][0].from).safeApprove(address(router), type(uint256).max);
            router.swapExactTokensForTokens(tokenBal, 0, _routes[i], address(this), block.timestamp);
            unchecked { ++i; }
        }

        uint256 rewardBal = balanceOfWant() - before;

        _chargeFeesAndMint(rewardBal);
    }   

    // claim owner rewards such as trading fees and bribes from gauges swap to velo, notify reward pool
    function harvest() public {
        uint256 before = balanceOfWant();
        for (uint i; i < activeVoteLps.length;) {
            Gauges memory rewardsGauge = gauges[activeVoteLps[i]];
            ISolidlyGauge(rewardsGauge.bribeGauge).getReward(tokenId, rewardsGauge.bribeTokens);
            ISolidlyGauge(rewardsGauge.feeGauge).getReward(tokenId, rewardsGauge.feeTokens);
            
            for (uint j; j < rewardsGauge.bribeTokens.length;) {
                uint256 tokenBal = IERC20(rewardsGauge.bribeTokens[j]).balanceOf(address(this));
                if (tokenBal > 0 && rewardsGauge.bribeTokens[j] != address(want)) {
                    router.swapExactTokensForTokens(tokenBal, 0, routes[rewardsGauge.bribeTokens[j]], address(this), block.timestamp);
                }
                unchecked { ++j; }
            }

            for (uint k; k < rewardsGauge.feeTokens.length;) {
                uint256 tokenBal = IERC20(rewardsGauge.feeTokens[k]).balanceOf(address(this));
                if (tokenBal > 0 && rewardsGauge.feeTokens[k] != address(want)) {
                    router.swapExactTokensForTokens(tokenBal, 0, routes[rewardsGauge.feeTokens[k]], address(this), block.timestamp);
                }
                unchecked { ++k; }
            }
            unchecked { ++i; }
        }

        uint256 rewardBal = balanceOfWant() - before;
    
        _chargeFeesAndMint(rewardBal);
    }

    function _chargeFeesAndMint(uint256 _rewardBal) internal {
        // Charge our fees here since we send beVelo to reward pool
        IFeeConfig.FeeCategory memory fees = beefyFeeConfig.getFees(address(this));
        uint256 feeBal = _rewardBal * fees.total / 1e18;
        if (feeBal > 0) {
            IERC20(want).safeApprove(address(router), feeBal);
            uint256[] memory amounts = router.swapExactTokensForTokens(feeBal, 0, veloToNativeRoute, address(beefyFeeRecipient), block.timestamp);
            IERC20(want).safeApprove(address(router), 0);
            emit ChargedFees(0, amounts[amounts.length - 1], 0);
        }

        uint256 gap = totalWant() - totalSupply();
        if (gap > 0) {
            _mint(address(beVeloRewardPool), gap);
            beVeloRewardPool.notifyRewardAmount();
            emit RewardsHarvested(gap);
        }
    }

    // Set our reward Pool to send our earned beVelo
    function setbeVeloRewardPool(address _rewardPool) external onlyOwner {
        emit SetBeVeloRewardPool(address(beVeloRewardPool), _rewardPool);
        beVeloRewardPool = IRewardPool(_rewardPool);
    }

    // Set the wrapped bribe factory
    function setBribeFactory(address _bribeFactory) external onlyOwner {
        emit SetBribeFactory(address(bribeFactory), _bribeFactory);
        bribeFactory = IWrappedBribeFactory(_bribeFactory);
    }

    // Set fee id on fee config
    function setFeeId(uint256 id) external onlyManager {
        emit SetFeeId(id);
        beefyFeeConfig.setStratFeeId(id);
    }

    // Set fee recipient
    function setBeefyFeeRecipient(address _feeRecipient) external onlyOwner {
        emit SetFeeRecipient(address(beefyFeeRecipient), _feeRecipient);
        beefyFeeRecipient = _feeRecipient;
    }

    // Set our router to exchange our rewards, also update new veloToNative route. 
    function setRouterAndRoute(address _router, ISolidlyRouter.Routes[] calldata _route) external onlyOwner {
        emit SetRouter(address(router), _router);
        for (uint i; i < _route.length;) {
            veloToNativeRoute.push(_route[i]);
            unchecked { ++i; }
        }
        router = ISolidlyRouter(_router);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint256","name":"_reserveRate","type":"uint256"},{"internalType":"address","name":"_solidVoter","type":"address"},{"internalType":"address","name":"_keeper","type":"address"},{"internalType":"address","name":"_voter","type":"address"},{"internalType":"address","name":"_beVeloRewardPool","type":"address"},{"internalType":"address","name":"_beefyFeeRecipient","type":"address"},{"internalType":"address","name":"_beefyFeeConfig","type":"address"},{"internalType":"address","name":"_router","type":"address"},{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct ISolidlyRouter.Routes[]","name":"_veloToNativeRoute","type":"tuple[]"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"bribeGauge","type":"address"},{"indexed":false,"internalType":"address","name":"feeGauge","type":"address"},{"indexed":false,"internalType":"address[]","name":"bribeTokens","type":"address[]"},{"indexed":false,"internalType":"address[]","name":"feeTokens","type":"address[]"}],"name":"AddedGauge","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"}],"name":"AddedRewardToken","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":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":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"veTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ClaimVeEmissions","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"veTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"unlockTime","type":"uint256"}],"name":"CreateLock","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"DepositWant","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"veTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"unlockTime","type":"uint256"}],"name":"IncreaseTime","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldKeeper","type":"address"},{"indexed":false,"internalType":"address","name":"newKeeper","type":"address"}],"name":"NewKeeper","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newVoter","type":"address"}],"name":"NewVoter","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":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"veTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Release","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"RewardsHarvested","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldPool","type":"address"},{"indexed":false,"internalType":"address","name":"newPool","type":"address"}],"name":"SetBeVeloRewardPool","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldFactory","type":"address"},{"indexed":false,"internalType":"address","name":"newFactory","type":"address"}],"name":"SetBribeFactory","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"}],"name":"SetFeeId","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldRecipient","type":"address"},{"indexed":false,"internalType":"address","name":"newRecipient","type":"address"}],"name":"SetFeeRecipient","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldRouter","type":"address"},{"indexed":false,"internalType":"address","name":"newRouter","type":"address"}],"name":"SetRouter","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newRate","type":"uint256"}],"name":"UpdatedReserveRate","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address[]","name":"votes","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"weights","type":"uint256[]"}],"name":"Voted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"MAX","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_LOCK","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"activeVoteLps","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_lp","type":"address"},{"internalType":"address[]","name":"_bribeTokens","type":"address[]"},{"internalType":"address[]","name":"_feeTokens","type":"address[]"}],"name":"addGauge","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct ISolidlyRouter.Routes[][]","name":"_routes","type":"tuple[][]"}],"name":"addMultipleRewardTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct ISolidlyRouter.Routes[]","name":"_route","type":"tuple[]"}],"name":"addRewardToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rate","type":"uint256"}],"name":"adjustReserve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"balanceOfWant","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"balanceOfWantInVe","outputs":[{"internalType":"uint256","name":"wants","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"beVeloRewardPool","outputs":[{"internalType":"contract IRewardPool","name":"","type":"address"}],"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":"bribeFactory","outputs":[{"internalType":"contract IWrappedBribeFactory","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimVeEmissions","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_lock_duration","type":"uint256"}],"name":"createLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"deleteRewardToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"depositAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"gauges","outputs":[{"internalType":"address","name":"bribeGauge","type":"address"},{"internalType":"address","name":"feeGauge","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_gauge","type":"address"},{"internalType":"address[]","name":"_tokens","type":"address[]"},{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct ISolidlyRouter.Routes[][]","name":"_routes","type":"tuple[][]"}],"name":"getRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"harvest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"keeper","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lockInfo","outputs":[{"internalType":"uint256","name":"endTime","type":"uint256"},{"internalType":"uint256","name":"secondsRemaining","type":"uint256"},{"internalType":"bool","name":"shouldIncreaseLock","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lpIntialized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"native","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","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":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"requiredReserve","outputs":[{"internalType":"uint256","name":"reqReserve","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reserveRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"resetVote","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"router","outputs":[{"internalType":"contract ISolidlyRouter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"routes","outputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_feeRecipient","type":"address"}],"name":"setBeefyFeeRecipient","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_bribeFactory","type":"address"}],"name":"setBribeFactory","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"setFeeId","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_keeper","type":"address"}],"name":"setKeeper","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_router","type":"address"},{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct ISolidlyRouter.Routes[]","name":"_route","type":"tuple[]"}],"name":"setRouterAndRoute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_voter","type":"address"}],"name":"setVoter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_rewardPool","type":"address"}],"name":"setbeVeloRewardPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"solidVoter","outputs":[{"internalType":"contract IVoter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalWant","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"ve","outputs":[{"internalType":"contract IVeToken","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"veDist","outputs":[{"internalType":"contract IVeDist","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"veloToNativeRoute","outputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_tokenVote","type":"address[]"},{"internalType":"uint256[]","name":"_weights","type":"uint256[]"},{"internalType":"bool","name":"_withHarvest","type":"bool"}],"name":"vote","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"voteInfo","outputs":[{"internalType":"address[]","name":"lpsVoted","type":"address[]"},{"internalType":"uint256[]","name":"votes","type":"uint256[]"},{"internalType":"uint256","name":"lastVoted","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"voter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"want","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"whitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawableBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]

6080604052601080546001600160a01b031916737955519e14fdf498e28831f4cc06af4b8e3086a81790553480156200003757600080fd5b5060405162005d6438038062005d648339810160408190526200005a9162000a95565b8a8a8a8a8a8a81818787600362000072838262000c51565b50600462000081828262000c51565b5050506200009e620000986200045c60201b60201c565b62000460565b6005805460ff60a01b19169055600680546001600160a01b03199081166001600160a01b0394851617909155600780548216928416929092179091556001600855600e86905560098054909116918516918217905560408051638dd598fb60e01b81529051638dd598fb916004808201926020929091908290030181865afa1580156200012f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000155919062000d1d565b600a80546001600160a01b0319166001600160a01b0392909216918217905560408051637e062a3560e11b8152905163fc0c546a916004808201926020929091908290030181865afa158015620001b0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001d6919062000d1d565b600c80546001600160a01b0319166001600160a01b03928316179055600954604080516303aa30b960e11b8152905160009392909216916307546172916004808201926020929091908290030181865afa15801562000239573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200025f919062000d1d565b9050806001600160a01b0316634b1cd5da6040518163ffffffff1660e01b8152600401602060405180830381865afa158015620002a0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002c6919062000d1d565b600b80546001600160a01b0319166001600160a01b03928316179055600a54600c5462000307929081169116600019620004b2602090811b620032ba17901c565b5050600f80546001600160a01b03808d166001600160a01b031992831617909255601280548a8416908316179055601380548c841690831617905560148054928b1692909116919091179055505083518493506200036a92506001915062000d3b565b815181106200037d576200037d62000d61565b602002602001015160200151601560006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060005b81518110156200044a576016828281518110620003d357620003d362000d61565b602090810291909101810151825460018181018555600094855293839020825160029092020180546001600160a01b039283166001600160a01b03199091161781559282015192840180546040909301511515600160a01b026001600160a81b0319909316939091169290921717905501620003b2565b50505050505050505050505062000e02565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b801580620005305750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e90604401602060405180830381865afa15801562000508573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200052e919062000d77565b155b620005a85760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e63650000000000000000000060648201526084015b60405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b17909152620006009185916200060516565b505050565b600062000661826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620006e360201b62003402179092919060201c565b80519091501562000600578080602001905181019062000682919062000d91565b620006005760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016200059f565b6060620006f48484600085620006fe565b90505b9392505050565b606082471015620007615760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016200059f565b6001600160a01b0385163b620007ba5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016200059f565b600080866001600160a01b03168587604051620007d8919062000daf565b60006040518083038185875af1925050503d806000811462000817576040519150601f19603f3d011682016040523d82523d6000602084013e6200081c565b606091505b5090925090506200082f8282866200083a565b979650505050505050565b606083156200084b575081620006f7565b8251156200085c5782518084602001fd5b8160405162461bcd60e51b81526004016200059f919062000dcd565b634e487b7160e01b600052604160045260246000fd5b604051606081016001600160401b0381118282101715620008b357620008b362000878565b60405290565b604051601f8201601f191681016001600160401b0381118282101715620008e457620008e462000878565b604052919050565b60005b8381101562000909578181015183820152602001620008ef565b8381111562000919576000848401525b50505050565b600082601f8301126200093157600080fd5b81516001600160401b038111156200094d576200094d62000878565b62000962601f8201601f1916602001620008b9565b8181528460208386010111156200097857600080fd5b6200098b826020830160208701620008ec565b949350505050565b80516001600160a01b0381168114620009ab57600080fd5b919050565b80518015158114620009ab57600080fd5b600082601f830112620009d357600080fd5b815160206001600160401b03821115620009f157620009f162000878565b62000a01818360051b01620008b9565b8281526060928302850182019282820191908785111562000a2157600080fd5b8387015b8581101562000a885781818a03121562000a3f5760008081fd5b62000a496200088e565b62000a548262000993565b815262000a6386830162000993565b86820152604062000a76818401620009b0565b90820152845292840192810162000a25565b5090979650505050505050565b60008060008060008060008060008060006101608c8e03121562000ab857600080fd5b8b516001600160401b0381111562000acf57600080fd5b62000add8e828f016200091f565b60208e0151909c5090506001600160401b0381111562000afc57600080fd5b62000b0a8e828f016200091f565b9a505060408c0151985062000b2260608d0162000993565b975062000b3260808d0162000993565b965062000b4260a08d0162000993565b955062000b5260c08d0162000993565b945062000b6260e08d0162000993565b935062000b736101008d0162000993565b925062000b846101208d0162000993565b6101408d01519092506001600160401b0381111562000ba257600080fd5b62000bb08e828f01620009c1565b9150509295989b509295989b9093969950565b600181811c9082168062000bd857607f821691505b60208210810362000bf957634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200060057600081815260208120601f850160051c8101602086101562000c285750805b601f850160051c820191505b8181101562000c495782815560010162000c34565b505050505050565b81516001600160401b0381111562000c6d5762000c6d62000878565b62000c858162000c7e845462000bc3565b8462000bff565b602080601f83116001811462000cbd576000841562000ca45750858301515b600019600386901b1c1916600185901b17855562000c49565b600085815260208120601f198616915b8281101562000cee5788860151825594840194600190910190840162000ccd565b508582101562000d0d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60006020828403121562000d3057600080fd5b620006f78262000993565b60008282101562000d5c57634e487b7160e01b600052601160045260246000fd5b500390565b634e487b7160e01b600052603260045260246000fd5b60006020828403121562000d8a57600080fd5b5051919050565b60006020828403121562000da457600080fd5b620006f782620009b0565b6000825162000dc3818460208701620008ec565b9190910192915050565b602081526000825180602084015262000dee816040850160208701620008ec565b601f01601f19169190910160400192915050565b614f528062000e126000396000f3fe608060405234801561001057600080fd5b50600436106104125760003560e01c80638456cb5911610220578063c13270f111610130578063e612a81e116100b8578063f0216dc211610087578063f0216dc21461092c578063f2fde38b1461093f578063f83d08ba14610952578063f887ea401461095a578063fb251afd1461096d57600080fd5b8063e612a81e146108eb578063e62d64f6146108fe578063eb4a78e014610906578063ee85064b1461091957600080fd5b8063db762bc9116100ff578063db762bc914610890578063dd62ed3e146108b5578063de5f6268146108c8578063e069bef4146108d0578063e1256ec7146108d857600080fd5b8063c13270f114610836578063c1a3d44c14610849578063cfde8c6114610851578063d49d51811461087457600080fd5b8063a68833e5116101b3578063aced166111610182578063aced166114610796578063b1b81c9f146107a9578063b52c05fe146107bc578063b6b55f25146107cf578063b9a09fd5146107e257600080fd5b8063a68833e514610746578063a7eea98b14610759578063a9059cbb14610770578063a9b5aa7e1461078357600080fd5b806393b6b85e116101ef57806393b6b85e1461070557806395d89b41146107185780639b19251a14610720578063a457c2d71461073357600080fd5b80638456cb59146106d157806386d1a69f146106d95780638da5cb5b146106e15780638e145459146106f257600080fd5b8063387199581161032657806361358a7a116102ae5780637143a1061161027d5780637143a10614610655578063715018a61461066857806372d34a8c14610670578063730d8488146106ab578063748747e6146106be57600080fd5b806361358a7a146105fb57806365a5d5f01461060e57806368924ce01461061957806370a082311461062c57600080fd5b806346c96aac116102f557806346c96aac146105a75780634746fb55146105ba5780634bc2a657146105cd57806358d7bf80146105e05780635c975abb146105e957600080fd5b8063387199581461057157806339509351146105845780633f4ba83a146105975780634641257d1461059f57600080fd5b80631b7d870f116103a957806323b872dd1161037857806323b872dd1461052c5780632a0e37c21461053f5780632e1a7d4d14610547578063313ce5671461055a578063329a8cfa1461056957600080fd5b80631b7d870f146104f65780631f1fcd51146104fe5780631f85071614610511578063227bf4df1461052457600080fd5b8063150b7a02116103e5578063150b7a021461049657806317d70f7c146104c257806318160ddd146104d95780631a2eb66b146104e157600080fd5b806306fdde0314610417578063095ea7b3146104355780631046e82f1461045857806311b0b42d14610483575b600080fd5b61041f610980565b60405161042c9190614329565b60405180910390f35b610448610443366004614371565b610a12565b604051901515815260200161042c565b61046b61046636600461439d565b610a2a565b6040516001600160a01b03909116815260200161042c565b60155461046b906001600160a01b031681565b6104a96104a43660046143b6565b610a54565b6040516001600160e01b0319909116815260200161042c565b6104cb600d5481565b60405190815260200161042c565b6002546104cb565b6104f46104ef36600461449f565b610acc565b005b6104cb610f6e565b600c5461046b906001600160a01b031681565b600a5461046b906001600160a01b031681565b6104f4610f8f565b61044861053a366004614521565b6110ec565b6104cb611112565b6104f461055536600461439d565b61113a565b6040516012815260200161042c565b6104f46111e2565b6104f461057f36600461439d565b61128e565b610448610592366004614371565b611362565b6104f4611384565b6104f46113ec565b60075461046b906001600160a01b031681565b60145461046b906001600160a01b031681565b6104f46105db366004614562565b6119af565b6104cb600e5481565b600554600160a01b900460ff16610448565b6104f461060936600461457f565b611a4c565b6104cb630784ce0081565b6104f4610627366004614562565b611aca565b6104cb61063a366004614562565b6001600160a01b031660009081526020819052604090205490565b6104f4610663366004614604565b611b3b565b6104f4611dd3565b61068361067e36600461439d565b611de5565b604080516001600160a01b03948516815293909216602084015215159082015260600161042c565b60095461046b906001600160a01b031681565b6104f46106cc366004614562565b611e2b565b6104f4611ed3565b6104f4611f38565b6005546001600160a01b031661046b565b60135461046b906001600160a01b031681565b600f5461046b906001600160a01b031681565b61041f612042565b6104f461072e366004614562565b612051565b610448610741366004614371565b6120cc565b6104f4610754366004614562565b612152565b6107616121c3565b60405161042c9392919061467d565b61044861077e366004614371565b612447565b6104f4610791366004614562565b612455565b60065461046b906001600160a01b031681565b6104f46107b73660046146dd565b6124c6565b6104f46107ca366004614731565b612592565b6104f46107dd36600461439d565b61272a565b6108166107f0366004614562565b601960205260009081526040902080546001909101546001600160a01b03918216911682565b604080516001600160a01b0393841681529290911660208301520161042c565b600b5461046b906001600160a01b031681565b6104cb612736565b61044861085f366004614562565b60186020526000908152604090205460ff1681565b61087d61271081565b60405161ffff909116815260200161042c565b6108986127a3565b60408051938452602084019290925215159082015260600161042c565b6104cb6108c3366004614753565b61287b565b6104f46128a6565b6104cb612919565b6104f46108e6366004614562565b612990565b6104f46108f936600461439d565b6129f0565b6104cb612a71565b60105461046b906001600160a01b031681565b610683610927366004614371565b612a7b565b6104f461093a36600461449f565b612ace565b6104f461094d366004614562565b612f1c565b6104f4612f92565b60125461046b906001600160a01b031681565b6104f461097b36600461479a565b613107565b60606003805461098f9061481d565b80601f01602080910402602001604051908101604052809291908181526020018280546109bb9061481d565b8015610a085780601f106109dd57610100808354040283529160200191610a08565b820191906000526020600020905b8154815290600101906020018083116109eb57829003601f168201915b5050505050905090565b600033610a20818585613419565b5060019392505050565b60118181548110610a3a57600080fd5b6000918252602090912001546001600160a01b0316905081565b600a546000906001600160a01b03163314610aa15760405162461bcd60e51b815260206004820152600860248201526710bb32aa37b5b2b760c11b60448201526064015b60405180910390fd5b507f7f7579b984318bcc498f1f3a15446ad7e3d6945324c308204daaa2f366f8277b95945050505050565b600260085403610b1e5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610a98565b60026008556005546001600160a01b0316331480610b4657506006546001600160a01b031633145b610b625760405162461bcd60e51b8152600401610a9890614851565b6000610b6c612736565b600d5460405163f5f8d36560e01b81529192506001600160a01b0388169163f5f8d36591610ba091899089906004016148b1565b600060405180830381600087803b158015610bba57600080fd5b505af1158015610bce573d6000803e3d6000fd5b5050505060005b82811015610f3f57600c546001600160a01b0316848483818110610bfb57610bfb6148d4565b9050602002810190610c0d91906148ea565b6001878786818110610c2157610c216148d4565b9050602002810190610c3391906148ea565b610c3e929150614948565b818110610c4d57610c4d6148d4565b9050606002016020016020810190610c659190614562565b6001600160a01b031614610ca85760405162461bcd60e51b815260206004820152600a6024820152691d1bc8084f4815d85b9d60b21b6044820152606401610a98565b600c546001600160a01b0316848483818110610cc657610cc66148d4565b9050602002810190610cd891906148ea565b6000818110610ce957610ce96148d4565b610cff9260206060909202019081019150614562565b6001600160a01b031603610d475760405162461bcd60e51b815260206004820152600f60248201526e10d85b89dd081cd95b1b0815d85b9d608a1b6044820152606401610a98565b6000848483818110610d5b57610d5b6148d4565b9050602002810190610d6d91906148ea565b6000818110610d7e57610d7e6148d4565b610d949260206060909202019081019150614562565b6040516370a0823160e01b81523060048201526001600160a01b0391909116906370a0823190602401602060405180830381865afa158015610dda573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dfe919061495f565b601254909150610e6e906001600160a01b03166000878786818110610e2557610e256148d4565b9050602002810190610e3791906148ea565b6000818110610e4857610e486148d4565b610e5e9260206060909202019081019150614562565b6001600160a01b031691906132ba565b601254610e93906001600160a01b0316600019878786818110610e2557610e256148d4565b6012546001600160a01b031663f41766d8826000888887818110610eb957610eb96148d4565b9050602002810190610ecb91906148ea565b30426040518763ffffffff1660e01b8152600401610eee96959493929190614978565b6000604051808303816000875af1158015610f0d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610f359190810190614a92565b5050600101610bd5565b50600081610f4b612736565b610f559190614948565b9050610f608161353d565b505060016008555050505050565b6000610f78612919565b610f80612736565b610f8a9190614b37565b905090565b600b54600d5460405163379607f560e01b815260048101919091526000916001600160a01b03169063379607f5906024016020604051808303816000875af1158015610fdf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611003919061495f565b9050600061101060025490565b611018610f6e565b6110229190614948565b905080156110a957600f54611040906001600160a01b0316826137f1565b600f60009054906101000a90046001600160a01b03166001600160a01b0316630c51dde46040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561109057600080fd5b505af11580156110a4573d6000803e3d6000fd5b505050505b600d54604080519182526020820184905233917f9cee5abf510d8a97f0b70fbced3fe122b20e7c44741af9336920c8db80b5328d91015b60405180910390a25050565b6000336110fa8582856138d0565b611105858585613944565b60019150505b9392505050565b600061271061ffff16600e54611126612919565b6111309190614b4f565b610f8a9190614b6e565b611142612a71565b8111156111835760405162461bcd60e51b815260206004820152600f60248201526e139bdd08195b9bdd59da0815d85b9d608a1b6044820152606401610a98565b61118d3382613b12565b600c546111a4906001600160a01b03163383613c60565b7f5b6b431d4476a211bb7d41c20d1aab9ae2321deee0d20be3d9fc9b1093fa6e3d6111cd610f6e565b6040519081526020015b60405180910390a150565b6007546001600160a01b031633146112255760405162461bcd60e51b815260206004820152600660248201526510bb37ba32b960d11b6044820152606401610a98565b600954600d5460405163310bd74b60e01b81526001600160a01b039092169163310bd74b9161125a9160040190815260200190565b600060405180830381600087803b15801561127457600080fd5b505af1158015611288573d6000803e3d6000fd5b50505050565b6005546001600160a01b03163314806112b157506006546001600160a01b031633145b6112cd5760405162461bcd60e51b8152600401610a9890614851565b6040518181527fc0111aa768714f8eb541fe1a646c766518645454b2a7bddab27d973fb63c3ddc9060200160405180910390a1601454604051631f2afc9960e11b8152600481018390526001600160a01b0390911690633e55f932906024015b600060405180830381600087803b15801561134757600080fd5b505af115801561135b573d6000803e3d6000fd5b5050505050565b600033610a20818585611375838361287b565b61137f9190614b37565b613419565b6005546001600160a01b03163314806113a757506006546001600160a01b031633145b6113c35760405162461bcd60e51b8152600401610a9890614851565b6113cb613c90565b600a54600c546113ea916001600160a01b0391821691166000196132ba565b565b60006113f6612736565b905060005b60115481101561198a576000601960006011848154811061141e5761141e6148d4565b60009182526020808320909101546001600160a01b0390811684528382019490945260409283019091208251608081018452815485168152600182015490941684830152600281018054845181850281018501865281815292948601938301828280156114b457602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611496575b505050505081526020016003820180548060200260200160405190810160405280929190818152602001828054801561151657602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116114f8575b505050505081525050905080600001516001600160a01b031663f5f8d365600d5483604001516040518363ffffffff1660e01b8152600401611559929190614b90565b600060405180830381600087803b15801561157357600080fd5b505af1158015611587573d6000803e3d6000fd5b5050505080602001516001600160a01b031663f5f8d365600d5483606001516040518363ffffffff1660e01b81526004016115c3929190614b90565b600060405180830381600087803b1580156115dd57600080fd5b505af11580156115f1573d6000803e3d6000fd5b5050505060005b8160400151518110156117ba5760008260400151828151811061161d5761161d6148d4565b60209081029190910101516040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa15801561166d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611691919061495f565b90506000811180156116d85750600c54604084015180516001600160a01b0390921691849081106116c4576116c46148d4565b60200260200101516001600160a01b031614155b156117b157601260009054906101000a90046001600160a01b03166001600160a01b031663f41766d8826000601760008860400151888151811061171e5761171e6148d4565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002030426040518663ffffffff1660e01b8152600401611768959493929190614ba9565b6000604051808303816000875af1158015611787573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526117af9190810190614a92565b505b506001016115f8565b5060005b816060015151811015611980576000826060015182815181106117e3576117e36148d4565b60209081029190910101516040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015611833573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611857919061495f565b905060008111801561189e5750600c54606084015180516001600160a01b03909216918490811061188a5761188a6148d4565b60200260200101516001600160a01b031614155b1561197757601260009054906101000a90046001600160a01b03166001600160a01b031663f41766d882600060176000886060015188815181106118e4576118e46148d4565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002030426040518663ffffffff1660e01b815260040161192e959493929190614ba9565b6000604051808303816000875af115801561194d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526119759190810190614a92565b505b506001016117be565b50506001016113fb565b50600081611996612736565b6119a09190614948565b90506119ab8161353d565b5050565b6005546001600160a01b03163314806119d257506006546001600160a01b031633145b6119ee5760405162461bcd60e51b8152600401610a9890614851565b6040516001600160a01b03821681527f668b14b635e60c984edc522ab57ecf4f7df5f95e912da87692905dc5aa1114879060200160405180910390a1600780546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b0316331480611a6f57506006546001600160a01b031633145b611a8b5760405162461bcd60e51b8152600401610a9890614851565b60005b81811015611ac557611abd838383818110611aab57611aab6148d4565b905060200281019061066391906148ea565b600101611a8e565b505050565b611ad2613ce5565b600f54604080516001600160a01b03928316815291831660208301527fbdad5e5f5487a15bc28ec6eee591d8a6391251f3b3c1eb3596f519d97cfc8a07910160405180910390a1600f80546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b0316331480611b5e57506006546001600160a01b031633145b611b7a5760405162461bcd60e51b8152600401610a9890614851565b600c546001600160a01b03168282600081611b9757611b976148d4565b611bad9260206060909202019081019150614562565b6001600160a01b031603611bf75760405162461bcd60e51b8152602060048201526011602482015270199c9bdb4818d85b9d081899481dd85b9d607a1b6044820152606401610a98565b600c546001600160a01b03168282611c10600182614948565b818110611c1f57611c1f6148d4565b9050606002016020016020810190611c379190614562565b6001600160a01b031614611c815760405162461bcd60e51b81526020600482015260116024820152701d1bc81a185cc81d1bc81899481dd85b9d607a1b6044820152606401610a98565b60005b81811015611d23576017600084846000818110611ca357611ca36148d4565b611cb99260206060909202019081019150614562565b6001600160a01b03166001600160a01b03168152602001908152602001600020838383818110611ceb57611ceb6148d4565b835460018101855560009485526020909420606090910292909201926002029091019050611d198282614c69565b5050600101611c84565b50601254611d46906001600160a01b0316600084848281610e4857610e486148d4565b601254611d6a906001600160a01b03166000198484600081610e4857610e486148d4565b7f2b2d582e54aac71907666eaff5d9a22cc45356de8a30b193ff31606a90be67d382826000818110611d9e57611d9e6148d4565b611db49260206060909202019081019150614562565b6040516001600160a01b03909116815260200160405180910390a15050565b611ddb613ce5565b6113ea6000613d3f565b60168181548110611df557600080fd5b6000918252602090912060029091020180546001909101546001600160a01b03918216925090811690600160a01b900460ff1683565b6005546001600160a01b0316331480611e4e57506006546001600160a01b031633145b611e6a5760405162461bcd60e51b8152600401610a9890614851565b600654604080516001600160a01b03928316815291831660208301527f9d0a1d053755e10f981be1cd0eae0d9a256895b4f0684c32cafa2bd4da74db6d910160405180910390a1600680546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b0316331480611ef657506006546001600160a01b031633145b611f125760405162461bcd60e51b8152600401610a9890614851565b611f1a613d91565b600a54600c546113ea916001600160a01b03918216911660006132ba565b611f40613ce5565b6000611f4a6127a3565b5050905042811115611f8a5760405162461bcd60e51b815260206004820152600960248201526808555b9b1bd8dad95960ba1b6044820152606401610a98565b600a54600d54604051632e1a7d4d60e01b81526001600160a01b0390921691632e1a7d4d91611fbf9160040190815260200190565b600060405180830381600087803b158015611fd957600080fd5b505af1158015611fed573d6000803e3d6000fd5b50505050336001600160a01b03167f2c57dec1db0095a6b800c2698d5bbceef2c180c6ac43429769a719658983f677600d54612027612736565b6040805192835260208301919091520160405180910390a250565b60606004805461098f9061481d565b6005546001600160a01b031633148061207457506006546001600160a01b031633145b6120905760405162461bcd60e51b8152600401610a9890614851565b600954600d5460405163131f8abb60e31b81526001600160a01b03848116600483015260248201929092529116906398fc55d89060440161132d565b600033816120da828661287b565b90508381101561213a5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610a98565b6121478286868403613419565b506001949350505050565b61215a613ce5565b601354604080516001600160a01b03928316815291831660208301527fd9d6b85b6d670cd443496fc6d03390f739bbff47f96a8e33fb0cdd52ad26f5c2910160405180910390a1601380546001600160a01b0319166001600160a01b0392909216919091179055565b6011546060908190600090806001600160401b038111156121e6576121e6614a24565b60405190808252806020026020018201604052801561220f578160200160208202803683370190505b509350806001600160401b0381111561222a5761222a614a24565b604051908082528060200260200182016040528015612253578160200160208202803683370190505b50925060005b818110156123c857600954600d5460405163a86a366d60e01b81526001600160a01b039092169163a86a366d9161229d918590600401918252602082015260400190565b602060405180830381865afa1580156122ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122de9190614cc6565b8582815181106122f0576122f06148d4565b6001600160a01b039283166020918202929092010152600954600d548751919092169163d23254b49188908590811061232b5761232b6148d4565b60200260200101516040518363ffffffff1660e01b81526004016123629291909182526001600160a01b0316602082015260400190565b602060405180830381865afa15801561237f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123a3919061495f565b8482815181106123b5576123b56148d4565b6020908102919091010152600101612259565b50600954600d5460405163079aca5f60e51b81526001600160a01b039092169163f3594be0916123fe9160040190815260200190565b602060405180830381865afa15801561241b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061243f919061495f565b915050909192565b600033610a20818585613944565b61245d613ce5565b601054604080516001600160a01b03928316815291831660208301527f03ab94e51ce1ec8483c05c7425f6ebc27289fbd4a9c8b6ba0c2fe3b8b01765d4910160405180910390a1601080546001600160a01b0319166001600160a01b0392909216919091179055565b6124ce613ce5565b601254604080516001600160a01b03928316815291851660208301527f50bfd9c0b9815c386500292d8de123643c6c935ffd384a364381b3b11e281e5c910160405180910390a160005b8181101561256c576016838383818110612534576125346148d4565b8354600181018555600094855260209094206060909102929092019260020290910190506125628282614c69565b5050600101612518565b5050601280546001600160a01b0319166001600160a01b03939093169290921790915550565b6005546001600160a01b03163314806125b557506006546001600160a01b031633145b6125d15760405162461bcd60e51b8152600401610a9890614851565b600d541561260f5760405162461bcd60e51b815260206004820152600b60248201526a07665546f6b656e203e20360ac1b6044820152606401610a98565b6000821161264d5760405162461bcd60e51b815260206004820152600b60248201526a0616d6f756e74203d3d20360ac1b6044820152606401610a98565b600c54612665906001600160a01b0316333085613dd4565b600a546040516365fc387360e01b815260048101849052602481018390526001600160a01b03909116906365fc3873906044016020604051808303816000875af11580156126b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126db919061495f565b600d556126e833836137f1565b600d546040805191825260208201849052810182905233907f133e6f671a17d15981c6269ce9d49d721e64d359ebfd0787e56bbe73c15ba014906060016110e0565b61273381613e0c565b50565b600c546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa15801561277f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f8a919061495f565b600a54600d54604051635a2d1e0760e11b81526004810191909152600091829182916001600160a01b03169063b45a3c0e906024016040805180830381865afa1580156127f4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128189190614ce3565b93506000905062093a80612830630784ce0042614b37565b61283a9190614b6e565b6128479062093a80614b4f565b9050428411612857576000612861565b6128614285614948565b925083811161287157600061243f565b6001915050909192565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b600c546040516370a0823160e01b81523360048201526113ea916001600160a01b0316906370a0823190602401602060405180830381865afa1580156128f0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612914919061495f565b613e0c565b600a54600d54604051635a2d1e0760e11b815260048101919091526000916001600160a01b03169063b45a3c0e906024016040805180830381865afa158015612966573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061298a9190614ce3565b50919050565b6005546001600160a01b03163314806129b357506006546001600160a01b031633145b6129cf5760405162461bcd60e51b8152600401610a9890614851565b6001600160a01b0381166000908152601760205260408120612733916141de565b6129f8613ce5565b612710811115612a3c5760405162461bcd60e51b815260206004820152600f60248201526e090d2ced0cae440e8d0c2dc40dac2f608b1b6044820152606401610a98565b600e8190556040518181527f7f185f718ac615dca1b3b16420e410c6cad609a5be3fc66faa29cab784cab8be906020016111d7565b6000610f8a612736565b60176020528160005260406000208181548110612a9757600080fd5b6000918252602090912060029091020180546001909101546001600160a01b0391821693509081169150600160a01b900460ff1683565b6005546001600160a01b0316331480612af157506006546001600160a01b031633145b612b0d5760405162461bcd60e51b8152600401610a9890614851565b60095460405163b9a09fd560e01b81526001600160a01b038781166004830152600092169063b9a09fd590602401602060405180830381865afa158015612b58573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b7c9190614cc6565b60408051608081019182905260105460095463ae21c4cb60e01b9093526001600160a01b0380851660848401529394509092839291811691632fcd8f27911663ae21c4cb60a48501602060405180830381865afa158015612be1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c059190614cc6565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa158015612c49573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c6d9190614cc6565b6001600160a01b039081168252600954604051637572079360e11b8152858316600482015260209093019291169063eae40f2690602401602060405180830381865afa158015612cc1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ce59190614cc6565b6001600160a01b03168152602001868680806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250505090825250604080516020868102828101820190935286825292830192909187918791829185019084908082843760009201829052509390945250506001600160a01b03808a16825260196020908152604092839020855181549084166001600160a01b03199182161782558683015160018301805491909516911617909255918401518051919350612dbe9260028501929101906141ff565b5060608201518051612dda9160038401916020909101906141ff565b5050506001600160a01b0386811660008181526018602052604090819020805460ff19166001179055600954905163ae21c4cb60e01b815260048101929092527f5b17f9362b133f9a1d5b7952f85626f5de06b697ac9cf80c05474957fb0446a392169063ae21c4cb90602401602060405180830381865afa158015612e64573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e889190614cc6565b600954604051637572079360e11b81526001600160a01b038a811660048301529091169063eae40f2690602401602060405180830381865afa158015612ed2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ef69190614cc6565b87878787604051612f0c96959493929190614d07565b60405180910390a1505050505050565b612f24613ce5565b6001600160a01b038116612f895760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a98565b61273381613d3f565b6000612f9c610f6e565b11156113ea576000612fac6127a3565b92505050612fb8611112565b612fc0612736565b11156130c2576000612fd0611112565b612fd8612736565b612fe29190614948565b600a54600d546040516350c1d7a960e11b81526004810191909152602481018390529192506001600160a01b03169063a183af5290604401600060405180830381600087803b15801561303457600080fd5b505af1158015613048573d6000803e3d6000fd5b5050505081156119ab57600a54600d5460405163a4d855df60e01b81526004810191909152630784ce0060248201526001600160a01b039091169063a4d855df90604401600060405180830381600087803b1580156130a657600080fd5b505af11580156130ba573d6000803e3d6000fd5b505050505050565b801561273357600a54600d5460405163a4d855df60e01b81526004810191909152630784ce0060248201526001600160a01b039091169063a4d855df9060440161132d565b6007546001600160a01b0316331461314a5760405162461bcd60e51b815260206004820152600660248201526510bb37ba32b960d11b6044820152606401610a98565b60005b848110156131e7576018600087878481811061316b5761316b6148d4565b90506020020160208101906131809190614562565b6001600160a01b0316815260208101919091526040016000205460ff166131df5760405162461bcd60e51b81526020600482015260136024820152721b1c081b9bdd081b1c125b9d1a585b1a5e9959606a1b6044820152606401610a98565b60010161314d565b5080156131f6576131f66113ec565b61320260118686614264565b5061320b610f8f565b600954600d54604051637ac09bf760e01b81526001600160a01b0390921691637ac09bf791613244918990899089908990600401614d8a565b600060405180830381600087803b15801561325e57600080fd5b505af1158015613272573d6000803e3d6000fd5b505050507f30300490d150ce73d2395af2d19f5c91b1ec9ec8adb70f030d5e135b0095cb44858585856040516132ab9493929190614db7565b60405180910390a15050505050565b8015806133345750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e90604401602060405180830381865afa15801561330e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613332919061495f565b155b61339f5760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b6064820152608401610a98565b6040516001600160a01b038316602482015260448101829052611ac590849063095ea7b360e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152613f05565b60606134118484600085613fd7565b949350505050565b6001600160a01b03831661347b5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610a98565b6001600160a01b0382166134dc5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610a98565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b601454604051639af608c960e01b81523060048201526000916001600160a01b031690639af608c990602401600060405180830381865afa158015613586573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526135ae9190810190614dee565b90506000670de0b6b3a76400008260000151846135cb9190614b4f565b6135d59190614b6e565b9050801561370f57601254600c546135fa916001600160a01b039182169116836132ba565b601254601354604051631e82ecdb60e31b81526000926001600160a01b039081169263f41766d89261363b9287928792601692909116904290600401614ba9565b6000604051808303816000875af115801561365a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526136829190810190614a92565b601254600c549192506136a3916001600160a01b03908116911660006132ba565b7fd255b592c7f268a73e534da5219a60ff911b4cf6daae21c7d20527dd657bd99a600082600184516136d59190614948565b815181106136e5576136e56148d4565b602090810291909101810151604080519384529183015260009082015260600160405180910390a1505b600061371a60025490565b613722610f6e565b61372c9190614948565b9050801561128857600f5461374a906001600160a01b0316826137f1565b600f60009054906101000a90046001600160a01b03166001600160a01b0316630c51dde46040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561379a57600080fd5b505af11580156137ae573d6000803e3d6000fd5b505050507f302ece888b23f17e9addd0ad302c9b0d6619a5c38b718deb019638e29355c0fb816040516137e391815260200190565b60405180910390a150505050565b6001600160a01b0382166138475760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610a98565b80600260008282546138599190614b37565b90915550506001600160a01b03821660009081526020819052604081208054839290613886908490614b37565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b60006138dc848461287b565b9050600019811461128857818110156139375760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610a98565b6112888484848403613419565b6001600160a01b0383166139a85760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610a98565b6001600160a01b038216613a0a5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610a98565b6001600160a01b03831660009081526020819052604090205481811015613a825760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610a98565b6001600160a01b03808516600090815260208190526040808220858503905591851681529081208054849290613ab9908490614b37565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051613b0591815260200190565b60405180910390a3611288565b6001600160a01b038216613b725760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610a98565b6001600160a01b03821660009081526020819052604090205481811015613be65760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610a98565b6001600160a01b0383166000908152602081905260408120838303905560028054849290613c15908490614948565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b6040516001600160a01b038316602482015260448101829052611ac590849063a9059cbb60e01b906064016133cb565b613c98614108565b6005805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6005546001600160a01b031633146113ea5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a98565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b613d99614158565b6005805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258613cc83390565b6040516001600160a01b03808516602483015283166044820152606481018290526112889085906323b872dd60e01b906084016133cb565b600260085403613e5e5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610a98565b6002600855613e6b614158565b613e73612f92565b6000613e7d612736565b600c54909150613e98906001600160a01b0316333085613dd4565b6000613ea2612736565b9050613eae8282614948565b92508215613efb57613ec033846137f1565b7fcce81a73106b1f897e8c451074728c7499edae3022ffc7a29ad27f2c25b8f513613ee9610f6e565b60405190815260200160405180910390a15b5050600160085550565b6000613f5a826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166134029092919063ffffffff16565b805190915015611ac55780806020019051810190613f789190614ee3565b611ac55760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610a98565b6060824710156140385760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610a98565b6001600160a01b0385163b61408f5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610a98565b600080866001600160a01b031685876040516140ab9190614f00565b60006040518083038185875af1925050503d80600081146140e8576040519150601f19603f3d011682016040523d82523d6000602084013e6140ed565b606091505b50915091506140fd8282866141a5565b979650505050505050565b600554600160a01b900460ff166113ea5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610a98565b600554600160a01b900460ff16156113ea5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610a98565b606083156141b457508161110b565b8251156141c45782518084602001fd5b8160405162461bcd60e51b8152600401610a989190614329565b508054600082556002029060005260206000209081019061273391906142b7565b828054828255906000526020600020908101928215614254579160200282015b8281111561425457825182546001600160a01b0319166001600160a01b0390911617825560209092019160019091019061421f565b506142609291506142e8565b5090565b828054828255906000526020600020908101928215614254579160200282015b828111156142545781546001600160a01b0319166001600160a01b03843516178255602090920191600190910190614284565b5b808211156142605780546001600160a01b03191681556001810180546001600160a81b03191690556002016142b8565b5b8082111561426057600081556001016142e9565b60005b83811015614318578181015183820152602001614300565b838111156112885750506000910152565b60208152600082518060208401526143488160408501602087016142fd565b601f01601f19169190910160400192915050565b6001600160a01b038116811461273357600080fd5b6000806040838503121561438457600080fd5b823561438f8161435c565b946020939093013593505050565b6000602082840312156143af57600080fd5b5035919050565b6000806000806000608086880312156143ce57600080fd5b85356143d98161435c565b945060208601356143e98161435c565b93506040860135925060608601356001600160401b038082111561440c57600080fd5b818801915088601f83011261442057600080fd5b81358181111561442f57600080fd5b89602082850101111561444157600080fd5b9699959850939650602001949392505050565b60008083601f84011261446657600080fd5b5081356001600160401b0381111561447d57600080fd5b6020830191508360208260051b850101111561449857600080fd5b9250929050565b6000806000806000606086880312156144b757600080fd5b85356144c28161435c565b945060208601356001600160401b03808211156144de57600080fd5b6144ea89838a01614454565b9096509450604088013591508082111561450357600080fd5b5061451088828901614454565b969995985093965092949392505050565b60008060006060848603121561453657600080fd5b83356145418161435c565b925060208401356145518161435c565b929592945050506040919091013590565b60006020828403121561457457600080fd5b813561110b8161435c565b6000806020838503121561459257600080fd5b82356001600160401b038111156145a857600080fd5b6145b485828601614454565b90969095509350505050565b60008083601f8401126145d257600080fd5b5081356001600160401b038111156145e957600080fd5b60208301915083602060608302850101111561449857600080fd5b6000806020838503121561461757600080fd5b82356001600160401b0381111561462d57600080fd5b6145b4858286016145c0565b600081518084526020808501945080840160005b838110156146725781516001600160a01b03168752958201959082019060010161464d565b509495945050505050565b6060815260006146906060830186614639565b82810360208481019190915285518083528682019282019060005b818110156146c7578451835293830193918301916001016146ab565b5050809350505050826040830152949350505050565b6000806000604084860312156146f257600080fd5b83356146fd8161435c565b925060208401356001600160401b0381111561471857600080fd5b614724868287016145c0565b9497909650939450505050565b6000806040838503121561474457600080fd5b50508035926020909101359150565b6000806040838503121561476657600080fd5b82356147718161435c565b915060208301356147818161435c565b809150509250929050565b801515811461273357600080fd5b6000806000806000606086880312156147b257600080fd5b85356001600160401b03808211156147c957600080fd5b6147d589838a01614454565b909750955060208801359150808211156147ee57600080fd5b506147fb88828901614454565b909450925050604086013561480f8161478c565b809150509295509295909350565b600181811c9082168061483157607f821691505b60208210810361298a57634e487b7160e01b600052602260045260246000fd5b60208082526008908201526710b6b0b730b3b2b960c11b604082015260600190565b8183526000602080850194508260005b858110156146725781356148968161435c565b6001600160a01b031687529582019590820190600101614883565b8381526040602082015260006148cb604083018486614873565b95945050505050565b634e487b7160e01b600052603260045260246000fd5b6000808335601e1984360301811261490157600080fd5b8301803591506001600160401b0382111561491b57600080fd5b602001915060608102360382131561449857600080fd5b634e487b7160e01b600052601160045260246000fd5b60008282101561495a5761495a614932565b500390565b60006020828403121561497157600080fd5b5051919050565b600060a0820188835260208881850152604060a0818601528288845260c08601905089935060005b898110156149f85784356149b38161435c565b6001600160a01b03908116835285850135906149ce8261435c565b1682850152848301356149e08161478c565b151582840152606094850194909101906001016149a0565b506001600160a01b03881660608701529350614a1392505050565b826080830152979650505050505050565b634e487b7160e01b600052604160045260246000fd5b60405160c081016001600160401b0381118282101715614a5c57614a5c614a24565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614a8a57614a8a614a24565b604052919050565b60006020808385031215614aa557600080fd5b82516001600160401b0380821115614abc57600080fd5b818501915085601f830112614ad057600080fd5b815181811115614ae257614ae2614a24565b8060051b9150614af3848301614a62565b8181529183018401918481019088841115614b0d57600080fd5b938501935b83851015614b2b57845182529385019390850190614b12565b98975050505050505050565b60008219821115614b4a57614b4a614932565b500190565b6000816000190483118215151615614b6957614b69614932565b500290565b600082614b8b57634e487b7160e01b600052601260045260246000fd5b500490565b8281526040602082015260006134116040830184614639565b600060a0808301888452602088818601526040838187015282895480855260c0880191508a60005283600020945060005b81811015614c1c5785546001600160a01b0390811684526001878101549182168786015290881c60ff1615158585015260029096019560609093019201614bda565b50506001600160a01b03891660608801529450614c399350505050565b8260808301529695505050505050565b80546001600160a01b0319166001600160a01b0392909216919091179055565b8135614c748161435c565b614c7e8183614c49565b50600181016020830135614c918161435c565b614c9b8183614c49565b506040830135614caa8161478c565b815460ff60a01b191690151560a01b60ff60a01b161790555050565b600060208284031215614cd857600080fd5b815161110b8161435c565b60008060408385031215614cf657600080fd5b505080516020909101519092909150565b6001600160a01b03878116825286166020820152608060408201819052600090614d349083018688614873565b8281036060840152614d47818587614873565b9998505050505050505050565b81835260006001600160fb1b03831115614d6d57600080fd5b8260051b8083602087013760009401602001938452509192915050565b858152606060208201526000614da4606083018688614873565b8281036040840152614b2b818587614d54565b604081526000614dcb604083018688614873565b82810360208401526140fd818587614d54565b8051614de98161478c565b919050565b60006020808385031215614e0157600080fd5b82516001600160401b0380821115614e1857600080fd5b9084019060c08287031215614e2c57600080fd5b614e34614a3a565b8251815283830151848201526040830151604082015260608301516060820152608083015182811115614e6657600080fd5b8301601f81018813614e7757600080fd5b805183811115614e8957614e89614a24565b614e9b601f8201601f19168701614a62565b93508084528886828401011115614eb157600080fd5b614ec0818786018885016142fd565b5050816080820152614ed460a08401614dde565b60a08201529695505050505050565b600060208284031215614ef557600080fd5b815161110b8161478c565b60008251614f128184602087016142fd565b919091019291505056fea26469706673582212207cc3ece3cfac5d3569fb07875b15e61960544a8d0835e4d589b3e138d3d46adf64736f6c634300080f0033000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000007d000000000000000000000000009236cff45047dbee6b921e00704bed6d6b8cf7e0000000000000000000000004fed5491693007f0cd49f4614ffc38ab6a04b6190000000000000000000000005e1cac103f943cd84a1e92dade4145664ebf692a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000003cd5ae887ddf78c58c9c1a063eb343f942dbbce8000000000000000000000000216eee15d1e3faad34181f66dd0b665f556a638d000000000000000000000000a132dab612db5cb9fc9ac426a0cc215a3423f9c900000000000000000000000000000000000000000000000000000000000001e0000000000000000000000000000000000000000000000000000000000000000a42656566792056656c6f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006426556454c4f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000003c8b650257cfb5f272f799f5e2b4e65093a11a0500000000000000000000000042000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106104125760003560e01c80638456cb5911610220578063c13270f111610130578063e612a81e116100b8578063f0216dc211610087578063f0216dc21461092c578063f2fde38b1461093f578063f83d08ba14610952578063f887ea401461095a578063fb251afd1461096d57600080fd5b8063e612a81e146108eb578063e62d64f6146108fe578063eb4a78e014610906578063ee85064b1461091957600080fd5b8063db762bc9116100ff578063db762bc914610890578063dd62ed3e146108b5578063de5f6268146108c8578063e069bef4146108d0578063e1256ec7146108d857600080fd5b8063c13270f114610836578063c1a3d44c14610849578063cfde8c6114610851578063d49d51811461087457600080fd5b8063a68833e5116101b3578063aced166111610182578063aced166114610796578063b1b81c9f146107a9578063b52c05fe146107bc578063b6b55f25146107cf578063b9a09fd5146107e257600080fd5b8063a68833e514610746578063a7eea98b14610759578063a9059cbb14610770578063a9b5aa7e1461078357600080fd5b806393b6b85e116101ef57806393b6b85e1461070557806395d89b41146107185780639b19251a14610720578063a457c2d71461073357600080fd5b80638456cb59146106d157806386d1a69f146106d95780638da5cb5b146106e15780638e145459146106f257600080fd5b8063387199581161032657806361358a7a116102ae5780637143a1061161027d5780637143a10614610655578063715018a61461066857806372d34a8c14610670578063730d8488146106ab578063748747e6146106be57600080fd5b806361358a7a146105fb57806365a5d5f01461060e57806368924ce01461061957806370a082311461062c57600080fd5b806346c96aac116102f557806346c96aac146105a75780634746fb55146105ba5780634bc2a657146105cd57806358d7bf80146105e05780635c975abb146105e957600080fd5b8063387199581461057157806339509351146105845780633f4ba83a146105975780634641257d1461059f57600080fd5b80631b7d870f116103a957806323b872dd1161037857806323b872dd1461052c5780632a0e37c21461053f5780632e1a7d4d14610547578063313ce5671461055a578063329a8cfa1461056957600080fd5b80631b7d870f146104f65780631f1fcd51146104fe5780631f85071614610511578063227bf4df1461052457600080fd5b8063150b7a02116103e5578063150b7a021461049657806317d70f7c146104c257806318160ddd146104d95780631a2eb66b146104e157600080fd5b806306fdde0314610417578063095ea7b3146104355780631046e82f1461045857806311b0b42d14610483575b600080fd5b61041f610980565b60405161042c9190614329565b60405180910390f35b610448610443366004614371565b610a12565b604051901515815260200161042c565b61046b61046636600461439d565b610a2a565b6040516001600160a01b03909116815260200161042c565b60155461046b906001600160a01b031681565b6104a96104a43660046143b6565b610a54565b6040516001600160e01b0319909116815260200161042c565b6104cb600d5481565b60405190815260200161042c565b6002546104cb565b6104f46104ef36600461449f565b610acc565b005b6104cb610f6e565b600c5461046b906001600160a01b031681565b600a5461046b906001600160a01b031681565b6104f4610f8f565b61044861053a366004614521565b6110ec565b6104cb611112565b6104f461055536600461439d565b61113a565b6040516012815260200161042c565b6104f46111e2565b6104f461057f36600461439d565b61128e565b610448610592366004614371565b611362565b6104f4611384565b6104f46113ec565b60075461046b906001600160a01b031681565b60145461046b906001600160a01b031681565b6104f46105db366004614562565b6119af565b6104cb600e5481565b600554600160a01b900460ff16610448565b6104f461060936600461457f565b611a4c565b6104cb630784ce0081565b6104f4610627366004614562565b611aca565b6104cb61063a366004614562565b6001600160a01b031660009081526020819052604090205490565b6104f4610663366004614604565b611b3b565b6104f4611dd3565b61068361067e36600461439d565b611de5565b604080516001600160a01b03948516815293909216602084015215159082015260600161042c565b60095461046b906001600160a01b031681565b6104f46106cc366004614562565b611e2b565b6104f4611ed3565b6104f4611f38565b6005546001600160a01b031661046b565b60135461046b906001600160a01b031681565b600f5461046b906001600160a01b031681565b61041f612042565b6104f461072e366004614562565b612051565b610448610741366004614371565b6120cc565b6104f4610754366004614562565b612152565b6107616121c3565b60405161042c9392919061467d565b61044861077e366004614371565b612447565b6104f4610791366004614562565b612455565b60065461046b906001600160a01b031681565b6104f46107b73660046146dd565b6124c6565b6104f46107ca366004614731565b612592565b6104f46107dd36600461439d565b61272a565b6108166107f0366004614562565b601960205260009081526040902080546001909101546001600160a01b03918216911682565b604080516001600160a01b0393841681529290911660208301520161042c565b600b5461046b906001600160a01b031681565b6104cb612736565b61044861085f366004614562565b60186020526000908152604090205460ff1681565b61087d61271081565b60405161ffff909116815260200161042c565b6108986127a3565b60408051938452602084019290925215159082015260600161042c565b6104cb6108c3366004614753565b61287b565b6104f46128a6565b6104cb612919565b6104f46108e6366004614562565b612990565b6104f46108f936600461439d565b6129f0565b6104cb612a71565b60105461046b906001600160a01b031681565b610683610927366004614371565b612a7b565b6104f461093a36600461449f565b612ace565b6104f461094d366004614562565b612f1c565b6104f4612f92565b60125461046b906001600160a01b031681565b6104f461097b36600461479a565b613107565b60606003805461098f9061481d565b80601f01602080910402602001604051908101604052809291908181526020018280546109bb9061481d565b8015610a085780601f106109dd57610100808354040283529160200191610a08565b820191906000526020600020905b8154815290600101906020018083116109eb57829003601f168201915b5050505050905090565b600033610a20818585613419565b5060019392505050565b60118181548110610a3a57600080fd5b6000918252602090912001546001600160a01b0316905081565b600a546000906001600160a01b03163314610aa15760405162461bcd60e51b815260206004820152600860248201526710bb32aa37b5b2b760c11b60448201526064015b60405180910390fd5b507f7f7579b984318bcc498f1f3a15446ad7e3d6945324c308204daaa2f366f8277b95945050505050565b600260085403610b1e5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610a98565b60026008556005546001600160a01b0316331480610b4657506006546001600160a01b031633145b610b625760405162461bcd60e51b8152600401610a9890614851565b6000610b6c612736565b600d5460405163f5f8d36560e01b81529192506001600160a01b0388169163f5f8d36591610ba091899089906004016148b1565b600060405180830381600087803b158015610bba57600080fd5b505af1158015610bce573d6000803e3d6000fd5b5050505060005b82811015610f3f57600c546001600160a01b0316848483818110610bfb57610bfb6148d4565b9050602002810190610c0d91906148ea565b6001878786818110610c2157610c216148d4565b9050602002810190610c3391906148ea565b610c3e929150614948565b818110610c4d57610c4d6148d4565b9050606002016020016020810190610c659190614562565b6001600160a01b031614610ca85760405162461bcd60e51b815260206004820152600a6024820152691d1bc8084f4815d85b9d60b21b6044820152606401610a98565b600c546001600160a01b0316848483818110610cc657610cc66148d4565b9050602002810190610cd891906148ea565b6000818110610ce957610ce96148d4565b610cff9260206060909202019081019150614562565b6001600160a01b031603610d475760405162461bcd60e51b815260206004820152600f60248201526e10d85b89dd081cd95b1b0815d85b9d608a1b6044820152606401610a98565b6000848483818110610d5b57610d5b6148d4565b9050602002810190610d6d91906148ea565b6000818110610d7e57610d7e6148d4565b610d949260206060909202019081019150614562565b6040516370a0823160e01b81523060048201526001600160a01b0391909116906370a0823190602401602060405180830381865afa158015610dda573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dfe919061495f565b601254909150610e6e906001600160a01b03166000878786818110610e2557610e256148d4565b9050602002810190610e3791906148ea565b6000818110610e4857610e486148d4565b610e5e9260206060909202019081019150614562565b6001600160a01b031691906132ba565b601254610e93906001600160a01b0316600019878786818110610e2557610e256148d4565b6012546001600160a01b031663f41766d8826000888887818110610eb957610eb96148d4565b9050602002810190610ecb91906148ea565b30426040518763ffffffff1660e01b8152600401610eee96959493929190614978565b6000604051808303816000875af1158015610f0d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610f359190810190614a92565b5050600101610bd5565b50600081610f4b612736565b610f559190614948565b9050610f608161353d565b505060016008555050505050565b6000610f78612919565b610f80612736565b610f8a9190614b37565b905090565b600b54600d5460405163379607f560e01b815260048101919091526000916001600160a01b03169063379607f5906024016020604051808303816000875af1158015610fdf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611003919061495f565b9050600061101060025490565b611018610f6e565b6110229190614948565b905080156110a957600f54611040906001600160a01b0316826137f1565b600f60009054906101000a90046001600160a01b03166001600160a01b0316630c51dde46040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561109057600080fd5b505af11580156110a4573d6000803e3d6000fd5b505050505b600d54604080519182526020820184905233917f9cee5abf510d8a97f0b70fbced3fe122b20e7c44741af9336920c8db80b5328d91015b60405180910390a25050565b6000336110fa8582856138d0565b611105858585613944565b60019150505b9392505050565b600061271061ffff16600e54611126612919565b6111309190614b4f565b610f8a9190614b6e565b611142612a71565b8111156111835760405162461bcd60e51b815260206004820152600f60248201526e139bdd08195b9bdd59da0815d85b9d608a1b6044820152606401610a98565b61118d3382613b12565b600c546111a4906001600160a01b03163383613c60565b7f5b6b431d4476a211bb7d41c20d1aab9ae2321deee0d20be3d9fc9b1093fa6e3d6111cd610f6e565b6040519081526020015b60405180910390a150565b6007546001600160a01b031633146112255760405162461bcd60e51b815260206004820152600660248201526510bb37ba32b960d11b6044820152606401610a98565b600954600d5460405163310bd74b60e01b81526001600160a01b039092169163310bd74b9161125a9160040190815260200190565b600060405180830381600087803b15801561127457600080fd5b505af1158015611288573d6000803e3d6000fd5b50505050565b6005546001600160a01b03163314806112b157506006546001600160a01b031633145b6112cd5760405162461bcd60e51b8152600401610a9890614851565b6040518181527fc0111aa768714f8eb541fe1a646c766518645454b2a7bddab27d973fb63c3ddc9060200160405180910390a1601454604051631f2afc9960e11b8152600481018390526001600160a01b0390911690633e55f932906024015b600060405180830381600087803b15801561134757600080fd5b505af115801561135b573d6000803e3d6000fd5b5050505050565b600033610a20818585611375838361287b565b61137f9190614b37565b613419565b6005546001600160a01b03163314806113a757506006546001600160a01b031633145b6113c35760405162461bcd60e51b8152600401610a9890614851565b6113cb613c90565b600a54600c546113ea916001600160a01b0391821691166000196132ba565b565b60006113f6612736565b905060005b60115481101561198a576000601960006011848154811061141e5761141e6148d4565b60009182526020808320909101546001600160a01b0390811684528382019490945260409283019091208251608081018452815485168152600182015490941684830152600281018054845181850281018501865281815292948601938301828280156114b457602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611496575b505050505081526020016003820180548060200260200160405190810160405280929190818152602001828054801561151657602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116114f8575b505050505081525050905080600001516001600160a01b031663f5f8d365600d5483604001516040518363ffffffff1660e01b8152600401611559929190614b90565b600060405180830381600087803b15801561157357600080fd5b505af1158015611587573d6000803e3d6000fd5b5050505080602001516001600160a01b031663f5f8d365600d5483606001516040518363ffffffff1660e01b81526004016115c3929190614b90565b600060405180830381600087803b1580156115dd57600080fd5b505af11580156115f1573d6000803e3d6000fd5b5050505060005b8160400151518110156117ba5760008260400151828151811061161d5761161d6148d4565b60209081029190910101516040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa15801561166d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611691919061495f565b90506000811180156116d85750600c54604084015180516001600160a01b0390921691849081106116c4576116c46148d4565b60200260200101516001600160a01b031614155b156117b157601260009054906101000a90046001600160a01b03166001600160a01b031663f41766d8826000601760008860400151888151811061171e5761171e6148d4565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002030426040518663ffffffff1660e01b8152600401611768959493929190614ba9565b6000604051808303816000875af1158015611787573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526117af9190810190614a92565b505b506001016115f8565b5060005b816060015151811015611980576000826060015182815181106117e3576117e36148d4565b60209081029190910101516040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015611833573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611857919061495f565b905060008111801561189e5750600c54606084015180516001600160a01b03909216918490811061188a5761188a6148d4565b60200260200101516001600160a01b031614155b1561197757601260009054906101000a90046001600160a01b03166001600160a01b031663f41766d882600060176000886060015188815181106118e4576118e46148d4565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002030426040518663ffffffff1660e01b815260040161192e959493929190614ba9565b6000604051808303816000875af115801561194d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526119759190810190614a92565b505b506001016117be565b50506001016113fb565b50600081611996612736565b6119a09190614948565b90506119ab8161353d565b5050565b6005546001600160a01b03163314806119d257506006546001600160a01b031633145b6119ee5760405162461bcd60e51b8152600401610a9890614851565b6040516001600160a01b03821681527f668b14b635e60c984edc522ab57ecf4f7df5f95e912da87692905dc5aa1114879060200160405180910390a1600780546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b0316331480611a6f57506006546001600160a01b031633145b611a8b5760405162461bcd60e51b8152600401610a9890614851565b60005b81811015611ac557611abd838383818110611aab57611aab6148d4565b905060200281019061066391906148ea565b600101611a8e565b505050565b611ad2613ce5565b600f54604080516001600160a01b03928316815291831660208301527fbdad5e5f5487a15bc28ec6eee591d8a6391251f3b3c1eb3596f519d97cfc8a07910160405180910390a1600f80546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b0316331480611b5e57506006546001600160a01b031633145b611b7a5760405162461bcd60e51b8152600401610a9890614851565b600c546001600160a01b03168282600081611b9757611b976148d4565b611bad9260206060909202019081019150614562565b6001600160a01b031603611bf75760405162461bcd60e51b8152602060048201526011602482015270199c9bdb4818d85b9d081899481dd85b9d607a1b6044820152606401610a98565b600c546001600160a01b03168282611c10600182614948565b818110611c1f57611c1f6148d4565b9050606002016020016020810190611c379190614562565b6001600160a01b031614611c815760405162461bcd60e51b81526020600482015260116024820152701d1bc81a185cc81d1bc81899481dd85b9d607a1b6044820152606401610a98565b60005b81811015611d23576017600084846000818110611ca357611ca36148d4565b611cb99260206060909202019081019150614562565b6001600160a01b03166001600160a01b03168152602001908152602001600020838383818110611ceb57611ceb6148d4565b835460018101855560009485526020909420606090910292909201926002029091019050611d198282614c69565b5050600101611c84565b50601254611d46906001600160a01b0316600084848281610e4857610e486148d4565b601254611d6a906001600160a01b03166000198484600081610e4857610e486148d4565b7f2b2d582e54aac71907666eaff5d9a22cc45356de8a30b193ff31606a90be67d382826000818110611d9e57611d9e6148d4565b611db49260206060909202019081019150614562565b6040516001600160a01b03909116815260200160405180910390a15050565b611ddb613ce5565b6113ea6000613d3f565b60168181548110611df557600080fd5b6000918252602090912060029091020180546001909101546001600160a01b03918216925090811690600160a01b900460ff1683565b6005546001600160a01b0316331480611e4e57506006546001600160a01b031633145b611e6a5760405162461bcd60e51b8152600401610a9890614851565b600654604080516001600160a01b03928316815291831660208301527f9d0a1d053755e10f981be1cd0eae0d9a256895b4f0684c32cafa2bd4da74db6d910160405180910390a1600680546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b0316331480611ef657506006546001600160a01b031633145b611f125760405162461bcd60e51b8152600401610a9890614851565b611f1a613d91565b600a54600c546113ea916001600160a01b03918216911660006132ba565b611f40613ce5565b6000611f4a6127a3565b5050905042811115611f8a5760405162461bcd60e51b815260206004820152600960248201526808555b9b1bd8dad95960ba1b6044820152606401610a98565b600a54600d54604051632e1a7d4d60e01b81526001600160a01b0390921691632e1a7d4d91611fbf9160040190815260200190565b600060405180830381600087803b158015611fd957600080fd5b505af1158015611fed573d6000803e3d6000fd5b50505050336001600160a01b03167f2c57dec1db0095a6b800c2698d5bbceef2c180c6ac43429769a719658983f677600d54612027612736565b6040805192835260208301919091520160405180910390a250565b60606004805461098f9061481d565b6005546001600160a01b031633148061207457506006546001600160a01b031633145b6120905760405162461bcd60e51b8152600401610a9890614851565b600954600d5460405163131f8abb60e31b81526001600160a01b03848116600483015260248201929092529116906398fc55d89060440161132d565b600033816120da828661287b565b90508381101561213a5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610a98565b6121478286868403613419565b506001949350505050565b61215a613ce5565b601354604080516001600160a01b03928316815291831660208301527fd9d6b85b6d670cd443496fc6d03390f739bbff47f96a8e33fb0cdd52ad26f5c2910160405180910390a1601380546001600160a01b0319166001600160a01b0392909216919091179055565b6011546060908190600090806001600160401b038111156121e6576121e6614a24565b60405190808252806020026020018201604052801561220f578160200160208202803683370190505b509350806001600160401b0381111561222a5761222a614a24565b604051908082528060200260200182016040528015612253578160200160208202803683370190505b50925060005b818110156123c857600954600d5460405163a86a366d60e01b81526001600160a01b039092169163a86a366d9161229d918590600401918252602082015260400190565b602060405180830381865afa1580156122ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122de9190614cc6565b8582815181106122f0576122f06148d4565b6001600160a01b039283166020918202929092010152600954600d548751919092169163d23254b49188908590811061232b5761232b6148d4565b60200260200101516040518363ffffffff1660e01b81526004016123629291909182526001600160a01b0316602082015260400190565b602060405180830381865afa15801561237f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123a3919061495f565b8482815181106123b5576123b56148d4565b6020908102919091010152600101612259565b50600954600d5460405163079aca5f60e51b81526001600160a01b039092169163f3594be0916123fe9160040190815260200190565b602060405180830381865afa15801561241b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061243f919061495f565b915050909192565b600033610a20818585613944565b61245d613ce5565b601054604080516001600160a01b03928316815291831660208301527f03ab94e51ce1ec8483c05c7425f6ebc27289fbd4a9c8b6ba0c2fe3b8b01765d4910160405180910390a1601080546001600160a01b0319166001600160a01b0392909216919091179055565b6124ce613ce5565b601254604080516001600160a01b03928316815291851660208301527f50bfd9c0b9815c386500292d8de123643c6c935ffd384a364381b3b11e281e5c910160405180910390a160005b8181101561256c576016838383818110612534576125346148d4565b8354600181018555600094855260209094206060909102929092019260020290910190506125628282614c69565b5050600101612518565b5050601280546001600160a01b0319166001600160a01b03939093169290921790915550565b6005546001600160a01b03163314806125b557506006546001600160a01b031633145b6125d15760405162461bcd60e51b8152600401610a9890614851565b600d541561260f5760405162461bcd60e51b815260206004820152600b60248201526a07665546f6b656e203e20360ac1b6044820152606401610a98565b6000821161264d5760405162461bcd60e51b815260206004820152600b60248201526a0616d6f756e74203d3d20360ac1b6044820152606401610a98565b600c54612665906001600160a01b0316333085613dd4565b600a546040516365fc387360e01b815260048101849052602481018390526001600160a01b03909116906365fc3873906044016020604051808303816000875af11580156126b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126db919061495f565b600d556126e833836137f1565b600d546040805191825260208201849052810182905233907f133e6f671a17d15981c6269ce9d49d721e64d359ebfd0787e56bbe73c15ba014906060016110e0565b61273381613e0c565b50565b600c546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa15801561277f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f8a919061495f565b600a54600d54604051635a2d1e0760e11b81526004810191909152600091829182916001600160a01b03169063b45a3c0e906024016040805180830381865afa1580156127f4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128189190614ce3565b93506000905062093a80612830630784ce0042614b37565b61283a9190614b6e565b6128479062093a80614b4f565b9050428411612857576000612861565b6128614285614948565b925083811161287157600061243f565b6001915050909192565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b600c546040516370a0823160e01b81523360048201526113ea916001600160a01b0316906370a0823190602401602060405180830381865afa1580156128f0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612914919061495f565b613e0c565b600a54600d54604051635a2d1e0760e11b815260048101919091526000916001600160a01b03169063b45a3c0e906024016040805180830381865afa158015612966573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061298a9190614ce3565b50919050565b6005546001600160a01b03163314806129b357506006546001600160a01b031633145b6129cf5760405162461bcd60e51b8152600401610a9890614851565b6001600160a01b0381166000908152601760205260408120612733916141de565b6129f8613ce5565b612710811115612a3c5760405162461bcd60e51b815260206004820152600f60248201526e090d2ced0cae440e8d0c2dc40dac2f608b1b6044820152606401610a98565b600e8190556040518181527f7f185f718ac615dca1b3b16420e410c6cad609a5be3fc66faa29cab784cab8be906020016111d7565b6000610f8a612736565b60176020528160005260406000208181548110612a9757600080fd5b6000918252602090912060029091020180546001909101546001600160a01b0391821693509081169150600160a01b900460ff1683565b6005546001600160a01b0316331480612af157506006546001600160a01b031633145b612b0d5760405162461bcd60e51b8152600401610a9890614851565b60095460405163b9a09fd560e01b81526001600160a01b038781166004830152600092169063b9a09fd590602401602060405180830381865afa158015612b58573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b7c9190614cc6565b60408051608081019182905260105460095463ae21c4cb60e01b9093526001600160a01b0380851660848401529394509092839291811691632fcd8f27911663ae21c4cb60a48501602060405180830381865afa158015612be1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c059190614cc6565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa158015612c49573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c6d9190614cc6565b6001600160a01b039081168252600954604051637572079360e11b8152858316600482015260209093019291169063eae40f2690602401602060405180830381865afa158015612cc1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ce59190614cc6565b6001600160a01b03168152602001868680806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250505090825250604080516020868102828101820190935286825292830192909187918791829185019084908082843760009201829052509390945250506001600160a01b03808a16825260196020908152604092839020855181549084166001600160a01b03199182161782558683015160018301805491909516911617909255918401518051919350612dbe9260028501929101906141ff565b5060608201518051612dda9160038401916020909101906141ff565b5050506001600160a01b0386811660008181526018602052604090819020805460ff19166001179055600954905163ae21c4cb60e01b815260048101929092527f5b17f9362b133f9a1d5b7952f85626f5de06b697ac9cf80c05474957fb0446a392169063ae21c4cb90602401602060405180830381865afa158015612e64573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e889190614cc6565b600954604051637572079360e11b81526001600160a01b038a811660048301529091169063eae40f2690602401602060405180830381865afa158015612ed2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ef69190614cc6565b87878787604051612f0c96959493929190614d07565b60405180910390a1505050505050565b612f24613ce5565b6001600160a01b038116612f895760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a98565b61273381613d3f565b6000612f9c610f6e565b11156113ea576000612fac6127a3565b92505050612fb8611112565b612fc0612736565b11156130c2576000612fd0611112565b612fd8612736565b612fe29190614948565b600a54600d546040516350c1d7a960e11b81526004810191909152602481018390529192506001600160a01b03169063a183af5290604401600060405180830381600087803b15801561303457600080fd5b505af1158015613048573d6000803e3d6000fd5b5050505081156119ab57600a54600d5460405163a4d855df60e01b81526004810191909152630784ce0060248201526001600160a01b039091169063a4d855df90604401600060405180830381600087803b1580156130a657600080fd5b505af11580156130ba573d6000803e3d6000fd5b505050505050565b801561273357600a54600d5460405163a4d855df60e01b81526004810191909152630784ce0060248201526001600160a01b039091169063a4d855df9060440161132d565b6007546001600160a01b0316331461314a5760405162461bcd60e51b815260206004820152600660248201526510bb37ba32b960d11b6044820152606401610a98565b60005b848110156131e7576018600087878481811061316b5761316b6148d4565b90506020020160208101906131809190614562565b6001600160a01b0316815260208101919091526040016000205460ff166131df5760405162461bcd60e51b81526020600482015260136024820152721b1c081b9bdd081b1c125b9d1a585b1a5e9959606a1b6044820152606401610a98565b60010161314d565b5080156131f6576131f66113ec565b61320260118686614264565b5061320b610f8f565b600954600d54604051637ac09bf760e01b81526001600160a01b0390921691637ac09bf791613244918990899089908990600401614d8a565b600060405180830381600087803b15801561325e57600080fd5b505af1158015613272573d6000803e3d6000fd5b505050507f30300490d150ce73d2395af2d19f5c91b1ec9ec8adb70f030d5e135b0095cb44858585856040516132ab9493929190614db7565b60405180910390a15050505050565b8015806133345750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e90604401602060405180830381865afa15801561330e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613332919061495f565b155b61339f5760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b6064820152608401610a98565b6040516001600160a01b038316602482015260448101829052611ac590849063095ea7b360e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152613f05565b60606134118484600085613fd7565b949350505050565b6001600160a01b03831661347b5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610a98565b6001600160a01b0382166134dc5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610a98565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b601454604051639af608c960e01b81523060048201526000916001600160a01b031690639af608c990602401600060405180830381865afa158015613586573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526135ae9190810190614dee565b90506000670de0b6b3a76400008260000151846135cb9190614b4f565b6135d59190614b6e565b9050801561370f57601254600c546135fa916001600160a01b039182169116836132ba565b601254601354604051631e82ecdb60e31b81526000926001600160a01b039081169263f41766d89261363b9287928792601692909116904290600401614ba9565b6000604051808303816000875af115801561365a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526136829190810190614a92565b601254600c549192506136a3916001600160a01b03908116911660006132ba565b7fd255b592c7f268a73e534da5219a60ff911b4cf6daae21c7d20527dd657bd99a600082600184516136d59190614948565b815181106136e5576136e56148d4565b602090810291909101810151604080519384529183015260009082015260600160405180910390a1505b600061371a60025490565b613722610f6e565b61372c9190614948565b9050801561128857600f5461374a906001600160a01b0316826137f1565b600f60009054906101000a90046001600160a01b03166001600160a01b0316630c51dde46040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561379a57600080fd5b505af11580156137ae573d6000803e3d6000fd5b505050507f302ece888b23f17e9addd0ad302c9b0d6619a5c38b718deb019638e29355c0fb816040516137e391815260200190565b60405180910390a150505050565b6001600160a01b0382166138475760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610a98565b80600260008282546138599190614b37565b90915550506001600160a01b03821660009081526020819052604081208054839290613886908490614b37565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b60006138dc848461287b565b9050600019811461128857818110156139375760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610a98565b6112888484848403613419565b6001600160a01b0383166139a85760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610a98565b6001600160a01b038216613a0a5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610a98565b6001600160a01b03831660009081526020819052604090205481811015613a825760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610a98565b6001600160a01b03808516600090815260208190526040808220858503905591851681529081208054849290613ab9908490614b37565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051613b0591815260200190565b60405180910390a3611288565b6001600160a01b038216613b725760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610a98565b6001600160a01b03821660009081526020819052604090205481811015613be65760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610a98565b6001600160a01b0383166000908152602081905260408120838303905560028054849290613c15908490614948565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b6040516001600160a01b038316602482015260448101829052611ac590849063a9059cbb60e01b906064016133cb565b613c98614108565b6005805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6005546001600160a01b031633146113ea5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a98565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b613d99614158565b6005805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258613cc83390565b6040516001600160a01b03808516602483015283166044820152606481018290526112889085906323b872dd60e01b906084016133cb565b600260085403613e5e5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610a98565b6002600855613e6b614158565b613e73612f92565b6000613e7d612736565b600c54909150613e98906001600160a01b0316333085613dd4565b6000613ea2612736565b9050613eae8282614948565b92508215613efb57613ec033846137f1565b7fcce81a73106b1f897e8c451074728c7499edae3022ffc7a29ad27f2c25b8f513613ee9610f6e565b60405190815260200160405180910390a15b5050600160085550565b6000613f5a826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166134029092919063ffffffff16565b805190915015611ac55780806020019051810190613f789190614ee3565b611ac55760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610a98565b6060824710156140385760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610a98565b6001600160a01b0385163b61408f5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610a98565b600080866001600160a01b031685876040516140ab9190614f00565b60006040518083038185875af1925050503d80600081146140e8576040519150601f19603f3d011682016040523d82523d6000602084013e6140ed565b606091505b50915091506140fd8282866141a5565b979650505050505050565b600554600160a01b900460ff166113ea5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610a98565b600554600160a01b900460ff16156113ea5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610a98565b606083156141b457508161110b565b8251156141c45782518084602001fd5b8160405162461bcd60e51b8152600401610a989190614329565b508054600082556002029060005260206000209081019061273391906142b7565b828054828255906000526020600020908101928215614254579160200282015b8281111561425457825182546001600160a01b0319166001600160a01b0390911617825560209092019160019091019061421f565b506142609291506142e8565b5090565b828054828255906000526020600020908101928215614254579160200282015b828111156142545781546001600160a01b0319166001600160a01b03843516178255602090920191600190910190614284565b5b808211156142605780546001600160a01b03191681556001810180546001600160a81b03191690556002016142b8565b5b8082111561426057600081556001016142e9565b60005b83811015614318578181015183820152602001614300565b838111156112885750506000910152565b60208152600082518060208401526143488160408501602087016142fd565b601f01601f19169190910160400192915050565b6001600160a01b038116811461273357600080fd5b6000806040838503121561438457600080fd5b823561438f8161435c565b946020939093013593505050565b6000602082840312156143af57600080fd5b5035919050565b6000806000806000608086880312156143ce57600080fd5b85356143d98161435c565b945060208601356143e98161435c565b93506040860135925060608601356001600160401b038082111561440c57600080fd5b818801915088601f83011261442057600080fd5b81358181111561442f57600080fd5b89602082850101111561444157600080fd5b9699959850939650602001949392505050565b60008083601f84011261446657600080fd5b5081356001600160401b0381111561447d57600080fd5b6020830191508360208260051b850101111561449857600080fd5b9250929050565b6000806000806000606086880312156144b757600080fd5b85356144c28161435c565b945060208601356001600160401b03808211156144de57600080fd5b6144ea89838a01614454565b9096509450604088013591508082111561450357600080fd5b5061451088828901614454565b969995985093965092949392505050565b60008060006060848603121561453657600080fd5b83356145418161435c565b925060208401356145518161435c565b929592945050506040919091013590565b60006020828403121561457457600080fd5b813561110b8161435c565b6000806020838503121561459257600080fd5b82356001600160401b038111156145a857600080fd5b6145b485828601614454565b90969095509350505050565b60008083601f8401126145d257600080fd5b5081356001600160401b038111156145e957600080fd5b60208301915083602060608302850101111561449857600080fd5b6000806020838503121561461757600080fd5b82356001600160401b0381111561462d57600080fd5b6145b4858286016145c0565b600081518084526020808501945080840160005b838110156146725781516001600160a01b03168752958201959082019060010161464d565b509495945050505050565b6060815260006146906060830186614639565b82810360208481019190915285518083528682019282019060005b818110156146c7578451835293830193918301916001016146ab565b5050809350505050826040830152949350505050565b6000806000604084860312156146f257600080fd5b83356146fd8161435c565b925060208401356001600160401b0381111561471857600080fd5b614724868287016145c0565b9497909650939450505050565b6000806040838503121561474457600080fd5b50508035926020909101359150565b6000806040838503121561476657600080fd5b82356147718161435c565b915060208301356147818161435c565b809150509250929050565b801515811461273357600080fd5b6000806000806000606086880312156147b257600080fd5b85356001600160401b03808211156147c957600080fd5b6147d589838a01614454565b909750955060208801359150808211156147ee57600080fd5b506147fb88828901614454565b909450925050604086013561480f8161478c565b809150509295509295909350565b600181811c9082168061483157607f821691505b60208210810361298a57634e487b7160e01b600052602260045260246000fd5b60208082526008908201526710b6b0b730b3b2b960c11b604082015260600190565b8183526000602080850194508260005b858110156146725781356148968161435c565b6001600160a01b031687529582019590820190600101614883565b8381526040602082015260006148cb604083018486614873565b95945050505050565b634e487b7160e01b600052603260045260246000fd5b6000808335601e1984360301811261490157600080fd5b8301803591506001600160401b0382111561491b57600080fd5b602001915060608102360382131561449857600080fd5b634e487b7160e01b600052601160045260246000fd5b60008282101561495a5761495a614932565b500390565b60006020828403121561497157600080fd5b5051919050565b600060a0820188835260208881850152604060a0818601528288845260c08601905089935060005b898110156149f85784356149b38161435c565b6001600160a01b03908116835285850135906149ce8261435c565b1682850152848301356149e08161478c565b151582840152606094850194909101906001016149a0565b506001600160a01b03881660608701529350614a1392505050565b826080830152979650505050505050565b634e487b7160e01b600052604160045260246000fd5b60405160c081016001600160401b0381118282101715614a5c57614a5c614a24565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614a8a57614a8a614a24565b604052919050565b60006020808385031215614aa557600080fd5b82516001600160401b0380821115614abc57600080fd5b818501915085601f830112614ad057600080fd5b815181811115614ae257614ae2614a24565b8060051b9150614af3848301614a62565b8181529183018401918481019088841115614b0d57600080fd5b938501935b83851015614b2b57845182529385019390850190614b12565b98975050505050505050565b60008219821115614b4a57614b4a614932565b500190565b6000816000190483118215151615614b6957614b69614932565b500290565b600082614b8b57634e487b7160e01b600052601260045260246000fd5b500490565b8281526040602082015260006134116040830184614639565b600060a0808301888452602088818601526040838187015282895480855260c0880191508a60005283600020945060005b81811015614c1c5785546001600160a01b0390811684526001878101549182168786015290881c60ff1615158585015260029096019560609093019201614bda565b50506001600160a01b03891660608801529450614c399350505050565b8260808301529695505050505050565b80546001600160a01b0319166001600160a01b0392909216919091179055565b8135614c748161435c565b614c7e8183614c49565b50600181016020830135614c918161435c565b614c9b8183614c49565b506040830135614caa8161478c565b815460ff60a01b191690151560a01b60ff60a01b161790555050565b600060208284031215614cd857600080fd5b815161110b8161435c565b60008060408385031215614cf657600080fd5b505080516020909101519092909150565b6001600160a01b03878116825286166020820152608060408201819052600090614d349083018688614873565b8281036060840152614d47818587614873565b9998505050505050505050565b81835260006001600160fb1b03831115614d6d57600080fd5b8260051b8083602087013760009401602001938452509192915050565b858152606060208201526000614da4606083018688614873565b8281036040840152614b2b818587614d54565b604081526000614dcb604083018688614873565b82810360208401526140fd818587614d54565b8051614de98161478c565b919050565b60006020808385031215614e0157600080fd5b82516001600160401b0380821115614e1857600080fd5b9084019060c08287031215614e2c57600080fd5b614e34614a3a565b8251815283830151848201526040830151604082015260608301516060820152608083015182811115614e6657600080fd5b8301601f81018813614e7757600080fd5b805183811115614e8957614e89614a24565b614e9b601f8201601f19168701614a62565b93508084528886828401011115614eb157600080fd5b614ec0818786018885016142fd565b5050816080820152614ed460a08401614dde565b60a08201529695505050505050565b600060208284031215614ef557600080fd5b815161110b8161478c565b60008251614f128184602087016142fd565b919091019291505056fea26469706673582212207cc3ece3cfac5d3569fb07875b15e61960544a8d0835e4d589b3e138d3d46adf64736f6c634300080f0033

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

000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000007d000000000000000000000000009236cff45047dbee6b921e00704bed6d6b8cf7e0000000000000000000000004fed5491693007f0cd49f4614ffc38ab6a04b6190000000000000000000000005e1cac103f943cd84a1e92dade4145664ebf692a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000003cd5ae887ddf78c58c9c1a063eb343f942dbbce8000000000000000000000000216eee15d1e3faad34181f66dd0b665f556a638d000000000000000000000000a132dab612db5cb9fc9ac426a0cc215a3423f9c900000000000000000000000000000000000000000000000000000000000001e0000000000000000000000000000000000000000000000000000000000000000a42656566792056656c6f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006426556454c4f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000003c8b650257cfb5f272f799f5e2b4e65093a11a0500000000000000000000000042000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _name (string): Beefy Velo
Arg [1] : _symbol (string): BeVELO
Arg [2] : _reserveRate (uint256): 2000
Arg [3] : _solidVoter (address): 0x09236cfF45047DBee6B921e00704bed6D6B8Cf7e
Arg [4] : _keeper (address): 0x4fED5491693007f0CD49f4614FFC38Ab6A04B619
Arg [5] : _voter (address): 0x5e1caC103F943Cd84A1E92dAde4145664ebf692A
Arg [6] : _beVeloRewardPool (address): 0x0000000000000000000000000000000000000000
Arg [7] : _beefyFeeRecipient (address): 0x3Cd5Ae887Ddf78c58c9C1a063EB343F942DbbcE8
Arg [8] : _beefyFeeConfig (address): 0x216EEE15D1e3fAAD34181f66dd0B665f556a638d
Arg [9] : _router (address): 0xa132DAB612dB5cB9fC9Ac426A0Cc215A3423F9c9
Arg [10] : _veloToNativeRoute (tuple[]): System.Collections.Generic.List`1[Nethereum.ABI.FunctionEncoding.ParameterOutput]

-----Encoded View---------------
19 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000160
Arg [1] : 00000000000000000000000000000000000000000000000000000000000001a0
Arg [2] : 00000000000000000000000000000000000000000000000000000000000007d0
Arg [3] : 00000000000000000000000009236cff45047dbee6b921e00704bed6d6b8cf7e
Arg [4] : 0000000000000000000000004fed5491693007f0cd49f4614ffc38ab6a04b619
Arg [5] : 0000000000000000000000005e1cac103f943cd84a1e92dade4145664ebf692a
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [7] : 0000000000000000000000003cd5ae887ddf78c58c9c1a063eb343f942dbbce8
Arg [8] : 000000000000000000000000216eee15d1e3faad34181f66dd0b665f556a638d
Arg [9] : 000000000000000000000000a132dab612db5cb9fc9ac426a0cc215a3423f9c9
Arg [10] : 00000000000000000000000000000000000000000000000000000000000001e0
Arg [11] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [12] : 42656566792056656c6f00000000000000000000000000000000000000000000
Arg [13] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [14] : 426556454c4f0000000000000000000000000000000000000000000000000000
Arg [15] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [16] : 0000000000000000000000003c8b650257cfb5f272f799f5e2b4e65093a11a05
Arg [17] : 0000000000000000000000004200000000000000000000000000000000000006
Arg [18] : 0000000000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

55971:10553:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6682:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9033:201;;;;;;:::i;:::-;;:::i;:::-;;;1286:14:1;;1279:22;1261:41;;1249:2;1234:18;9033:201:0;1121:187:1;56238:30:0;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1771:32:1;;;1753:51;;1741:2;1726:18;56238:30:0;1607:203:1;56388:21:0;;;;;-1:-1:-1;;;;;56388:21:0;;;52238:384;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;;2918:33:1;;;2900:52;;2888:2;2873:18;52238:384:0;2756:202:1;45680:22:0;;;;;;;;;3109:25:1;;;3097:2;3082:18;45680:22:0;2963:177:1;7802:108:0;7890:12;;7802:108;;61744:959;;;;;;:::i;:::-;;:::i;:::-;;48937:114;;;:::i;45655:18::-;;;;;-1:-1:-1;;;;;45655:18:0;;;45560;;;;;-1:-1:-1;;;;;45560:18:0;;;59084:355;;;:::i;9814:295::-;;;;;;:::i;:::-;;:::i;49139:214::-;;;:::i;48617:258::-;;;;;;:::i;:::-;;:::i;7644:93::-;;;7727:2;5532:36:1;;5520:2;5505:18;7644:93:0;5390:184:1;50581:84:0;;;:::i;65725:130::-;;;;;;:::i;:::-;;:::i;10518:238::-;;;;;;:::i;:::-;;:::i;52032:128::-;;;:::i;62819:1452::-;;;:::i;42385:20::-;;;;;-1:-1:-1;;;;;42385:20:0;;;56349:32;;;;;-1:-1:-1;;;;;56349:32:0;;;43365:120;;;;;;:::i;:::-;;:::i;45888:26::-;;;;;;41070:86;41141:7;;-1:-1:-1;;;41141:7:0;;;;41070:86;;60871:235;;;;;;:::i;:::-;;:::i;45834:47::-;;45869:12;45834:47;;65227:206;;;;;;:::i;:::-;;:::i;7973:127::-;;;;;;:::i;:::-;-1:-1:-1;;;;;8074:18:0;8047:7;8074:18;;;;;;;;;;;;7973:127;61142:594;;;;;;:::i;:::-;;:::i;38582:103::-;;;:::i;56632:48::-;;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;7678:15:1;;;7660:34;;7730:15;;;;7725:2;7710:18;;7703:43;7789:14;7782:22;7762:18;;;7755:50;7610:2;7595:18;56632:48:0;7426:385:1;45529:24:0;;;;;-1:-1:-1;;;;;45529:24:0;;;43221:135;;;;;;:::i;:::-;;:::i;51893:106::-;;;:::i;51243:245::-;;;:::i;37934:87::-;38007:6;;-1:-1:-1;;;;;38007:6:0;37934:87;;56310:32;;;;;-1:-1:-1;;;;;56310:32:0;;;56082:35;;;;;-1:-1:-1;;;;;56082:35:0;;;6901:104;;;:::i;51524:112::-;;;;;;:::i;:::-;;:::i;11259:436::-;;;;;;:::i;:::-;;:::i;65889:198::-;;;;;;:::i;:::-;;:::i;58509:496::-;;;:::i;:::-;;;;;;;;;:::i;8306:193::-;;;;;;:::i;:::-;;:::i;65479:205::-;;;;;;:::i;:::-;;:::i;42357:21::-;;;;;-1:-1:-1;;;;;42357:21:0;;;66180:341;;;;;;:::i;:::-;;:::i;50738:433::-;;;;;;:::i;:::-;;:::i;47195:79::-;;;;;;:::i;:::-;;:::i;56804:41::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;56804:41:0;;;;;;;;;;;-1:-1:-1;;;;;10714:15:1;;;10696:34;;10766:15;;;;10761:2;10746:18;;10739:43;10631:18;56804:41:0;10484:304:1;45585:21:0;;;;;-1:-1:-1;;;;;45585:21:0;;;49420:110;;;:::i;56752:45::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;45793:34;;45822:5;45793:34;;;;;11191:6:1;11179:19;;;11161:38;;11149:2;11134:18;45793:34:0;11017:188:1;49599:394:0;;;:::i;:::-;;;;11406:25:1;;;11462:2;11447:18;;11440:34;;;;11517:14;11510:22;11490:18;;;11483:50;11394:2;11379:18;49599:394:0;11210:329:1;8562:151:0;;;;;;:::i;:::-;;:::i;47066:86::-;;;:::i;50189:114::-;;;:::i;60724:104::-;;;;;;:::i;:::-;;:::i;51674:188::-;;;;;;:::i;:::-;;:::i;50040:102::-;;;:::i;56124:107::-;;;;;-1:-1:-1;;;;;56124:107:0;;;56687:58;;;;;;:::i;:::-;;:::i;60136:549::-;;;;;;:::i;:::-;;:::i;38840:201::-;;;;;;:::i;:::-;;:::i;47884:659::-;;;:::i;56275:28::-;;;;;-1:-1:-1;;;;;56275:28:0;;;59481:629;;;;;;:::i;:::-;;:::i;6682:100::-;6736:13;6769:5;6762:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6682:100;:::o;9033:201::-;9116:4;4404:10;9172:32;4404:10;9188:7;9197:6;9172:8;:32::i;:::-;-1:-1:-1;9222:4:0;;9033:201;-1:-1:-1;;;9033:201:0:o;56238:30::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;56238:30:0;;-1:-1:-1;56238:30:0;:::o;52238:384::-;52515:2;;52398:6;;-1:-1:-1;;;;;52515:2:0;52493:10;:25;52485:46;;;;-1:-1:-1;;;52485:46:0;;14935:2:1;52485:46:0;;;14917:21:1;14974:1;14954:18;;;14947:29;-1:-1:-1;;;14992:18:1;;;14985:38;15040:18;;52485:46:0;;;;;;;;;-1:-1:-1;52556:57:0;52238:384;;;;;;;:::o;61744:959::-;35754:1;36352:7;;:19;36344:63;;;;-1:-1:-1;;;36344:63:0;;15271:2:1;36344:63:0;;;15253:21:1;15310:2;15290:18;;;15283:30;15349:33;15329:18;;;15322:61;15400:18;;36344:63:0;15069:355:1;36344:63:0;35754:1;36485:7;:18;38007:6;;-1:-1:-1;;;;;38007:6:0;42872:10:::1;:21;::::0;:45:::1;;-1:-1:-1::0;42911:6:0::1;::::0;-1:-1:-1;;;;;42911:6:0::1;42897:10;:20;42872:45;42864:66;;;;-1:-1:-1::0;;;42864:66:0::1;;;;;;;:::i;:::-;61897:14:::2;61914:15;:13;:15::i;:::-;61972:7;::::0;61940:49:::2;::::0;-1:-1:-1;;;61940:49:0;;61897:32;;-1:-1:-1;;;;;;61940:31:0;::::2;::::0;::::2;::::0;:49:::2;::::0;61981:7;;;;61940:49:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;62005:6;62000:597;62013:18:::0;;::::2;62000:597;;;62105:4;::::0;-1:-1:-1;;;;;62105:4:0::2;62057:7:::0;;62065:1;62057:10;;::::2;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;62088:1;62068:7;;62076:1;62068:10;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;:21;::::0;;-1:-1:-1;62068:21:0::2;:::i;:::-;62057:33;;;;;;;:::i;:::-;;;;;;:36;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;62057:53:0::2;;62049:76;;;::::0;-1:-1:-1;;;62049:76:0;;17831:2:1;62049:76:0::2;::::0;::::2;17813:21:1::0;17870:2;17850:18;;;17843:30;-1:-1:-1;;;17889:18:1;;;17882:40;17939:18;;62049:76:0::2;17629:334:1::0;62049:76:0::2;62178:4;::::0;-1:-1:-1;;;;;62178:4:0::2;62148:7:::0;;62156:1;62148:10;;::::2;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;62159:1;62148:13;;;;;;;:::i;:::-;:18;::::0;::::2;:13;::::0;;::::2;;:18:::0;;::::2;::::0;-1:-1:-1;62148:18:0::2;:::i;:::-;-1:-1:-1::0;;;;;62148:35:0::2;::::0;62140:63:::2;;;::::0;-1:-1:-1;;;62140:63:0;;18170:2:1;62140:63:0::2;::::0;::::2;18152:21:1::0;18209:2;18189:18;;;18182:30;-1:-1:-1;;;18228:18:1;;;18221:45;18283:18;;62140:63:0::2;17968:339:1::0;62140:63:0::2;62218:16;62244:7;;62252:1;62244:10;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;62255:1;62244:13;;;;;;;:::i;:::-;:18;::::0;::::2;:13;::::0;;::::2;;:18:::0;;::::2;::::0;-1:-1:-1;62244:18:0::2;:::i;:::-;62237:51;::::0;-1:-1:-1;;;62237:51:0;;62282:4:::2;62237:51;::::0;::::2;1753::1::0;-1:-1:-1;;;;;62237:36:0;;;::::2;::::0;::::2;::::0;1726:18:1;;62237:51:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;62350:6;::::0;62218:70;;-1:-1:-1;62303:58:0::2;::::0;-1:-1:-1;;;;;62350:6:0::2;;62310:7:::0;;62318:1;62310:10;;::::2;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;62321:1;62310:13;;;;;;;:::i;:::-;:18;::::0;::::2;:13;::::0;;::::2;;:18:::0;;::::2;::::0;-1:-1:-1;62310:18:0::2;:::i;:::-;-1:-1:-1::0;;;;;62303:38:0::2;::::0;:58;:38:::2;:58::i;:::-;62423:6;::::0;62376:74:::2;::::0;-1:-1:-1;;;;;62423:6:0::2;-1:-1:-1::0;;62383:7:0;;62391:1;62383:10;;::::2;;;;;:::i;62376:74::-;62465:6;::::0;-1:-1:-1;;;;;62465:6:0::2;:31;62497:8:::0;62465:6:::2;62510:7:::0;;62518:1;62510:10;;::::2;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;62530:4;62537:15;62465:88;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;::::0;;::::2;-1:-1:-1::0;;62465:88:0::2;::::0;::::2;;::::0;::::2;::::0;;;::::2;::::0;::::2;:::i;:::-;-1:-1:-1::0;;62580:3:0::2;;62000:597;;;;62609:17;62647:6;62629:15;:13;:15::i;:::-;:24;;;;:::i;:::-;62609:44;;62666:29;62685:9;62666:18;:29::i;:::-;-1:-1:-1::0;;35710:1:0;36664:7;:22;-1:-1:-1;;;;;61744:959:0:o;48937:114::-;48979:7;49024:19;:17;:19::i;:::-;49006:15;:13;:15::i;:::-;:37;;;;:::i;:::-;48999:44;;48937:114;:::o;59084:355::-;59157:6;;59170:7;;59157:21;;-1:-1:-1;;;59157:21:0;;;;;3109:25:1;;;;59139:15:0;;-1:-1:-1;;;;;59157:6:0;;:12;;3082:18:1;;59157:21:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;59139:39;;59189:11;59217:13;7890:12;;;7802:108;59217:13;59203:11;:9;:11::i;:::-;:27;;;;:::i;:::-;59189:41;-1:-1:-1;59245:7:0;;59241:129;;59283:16;;59269:37;;-1:-1:-1;;;;;59283:16:0;59302:3;59269:5;:37::i;:::-;59321:16;;;;;;;;;-1:-1:-1;;;;;59321:16:0;-1:-1:-1;;;;;59321:35:0;;:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59241:129;59414:7;;59385:46;;;21874:25:1;;;21930:2;21915:18;;21908:34;;;59402:10:0;;59385:46;;21847:18:1;59385:46:0;;;;;;;;59128:311;;59084:355::o;9814:295::-;9945:4;4404:10;10003:38;10019:4;4404:10;10034:6;10003:15;:38::i;:::-;10052:27;10062:4;10068:2;10072:6;10052:9;:27::i;:::-;10097:4;10090:11;;;9814:295;;;;;;:::o;49139:214::-;49187:18;45822:5;49306:39;;49328:11;;49306:19;:17;:19::i;:::-;:33;;;;:::i;:::-;:39;;;;:::i;48617:258::-;48691:21;:19;:21::i;:::-;48680:7;:32;;48672:60;;;;-1:-1:-1;;;48672:60:0;;22550:2:1;48672:60:0;;;22532:21:1;22589:2;22569:18;;;22562:30;-1:-1:-1;;;22608:18:1;;;22601:45;22663:18;;48672:60:0;22348:339:1;48672:60:0;48747:26;48753:10;48765:7;48747:5;:26::i;:::-;48788:4;;:38;;-1:-1:-1;;;;;48788:4:0;48806:10;48818:7;48788:17;:38::i;:::-;48846:21;48855:11;:9;:11::i;:::-;48846:21;;3109:25:1;;;3097:2;3082:18;48846:21:0;;;;;;;;48617:258;:::o;50581:84::-;43066:5;;-1:-1:-1;;;;;43066:5:0;43052:10;:19;43044:38;;;;-1:-1:-1;;;43044:38:0;;22894:2:1;43044:38:0;;;22876:21:1;22933:1;22913:18;;;22906:29;-1:-1:-1;;;22951:18:1;;;22944:36;22997:18;;43044:38:0;22692:329:1;43044:38:0;50632:10:::1;::::0;50649:7:::1;::::0;50632:25:::1;::::0;-1:-1:-1;;;50632:25:0;;-1:-1:-1;;;;;50632:10:0;;::::1;::::0;:16:::1;::::0;:25:::1;::::0;::::1;;3109::1::0;;;3097:2;3082:18;;2963:177;50632:25:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;50581:84::o:0;65725:130::-;38007:6;;-1:-1:-1;;;;;38007:6:0;42872:10;:21;;:45;;-1:-1:-1;42911:6:0;;-1:-1:-1;;;;;42911:6:0;42897:10;:20;42872:45;42864:66;;;;-1:-1:-1;;;42864:66:0;;;;;;;:::i;:::-;65792:12:::1;::::0;3109:25:1;;;65792:12:0::1;::::0;3097:2:1;3082:18;65792:12:0::1;;;;;;;65815:14;::::0;:32:::1;::::0;-1:-1:-1;;;65815:32:0;;::::1;::::0;::::1;3109:25:1::0;;;-1:-1:-1;;;;;65815:14:0;;::::1;::::0;:28:::1;::::0;3082:18:1;;65815:32:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;65725:130:::0;:::o;10518:238::-;10606:4;4404:10;10662:64;4404:10;10678:7;10715:10;10687:25;4404:10;10678:7;10687:9;:25::i;:::-;:38;;;;:::i;:::-;10662:8;:64::i;52032:128::-;38007:6;;-1:-1:-1;;;;;38007:6:0;42872:10;:21;;:45;;-1:-1:-1;42911:6:0;;-1:-1:-1;;;;;42911:6:0;42897:10;:20;42872:45;42864:66;;;;-1:-1:-1;;;42864:66:0;;;;;;;:::i;:::-;52083:10:::1;:8;:10::i;:::-;52129:2;::::0;52104:4:::1;::::0;:48:::1;::::0;-1:-1:-1;;;;;52104:4:0;;::::1;::::0;52129:2:::1;-1:-1:-1::0;;52104:16:0::1;:48::i;:::-;52032:128::o:0;62819:1452::-;62856:14;62873:15;:13;:15::i;:::-;62856:32;;62904:6;62899:1262;62916:13;:20;62912:24;;62899:1262;;;62954:26;62983:6;:24;62990:13;63004:1;62990:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;62990:16:0;;;62983:24;;;;;;;;;;;;;;;;62954:53;;;;;;;;;;;;;62990:16;62954:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62983:24;;62954:53;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;62954:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;62954:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;63036:12;:23;;;-1:-1:-1;;;;;63022:48:0;;63071:7;;63080:12;:24;;;63022:83;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63134:12;:21;;;-1:-1:-1;;;;;63120:46:0;;63167:7;;63176:12;:22;;;63120:79;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63233:6;63228:441;63245:12;:24;;;:31;63241:1;:35;63228:441;;;63298:16;63324:12;:24;;;63349:1;63324:27;;;;;;;;:::i;:::-;;;;;;;;;;;63317:60;;-1:-1:-1;;;63317:60:0;;63371:4;63317:60;;;1753:51:1;-1:-1:-1;;;;;63317:45:0;;;;;;1726:18:1;;63317:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;63298:79;;63411:1;63400:8;:12;:60;;;;-1:-1:-1;63455:4:0;;63416:24;;;;:27;;-1:-1:-1;;;;;63455:4:0;;;;63441:1;;63416:27;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;63416:44:0;;;63400:60;63396:222;;;63485:6;;;;;;;;;-1:-1:-1;;;;;63485:6:0;-1:-1:-1;;;;;63485:31:0;;63517:8;63527:1;63530:6;:35;63537:12;:24;;;63562:1;63537:27;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;63530:35:0;-1:-1:-1;;;;;63530:35:0;;;;;;;;;;;;63575:4;63582:15;63485:113;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;63485:113:0;;;;;;;;;;;;:::i;:::-;;63396:222;-1:-1:-1;63648:3:0;;63228:441;;;;63690:6;63685:433;63702:12;:22;;;:29;63698:1;:33;63685:433;;;63753:16;63779:12;:22;;;63802:1;63779:25;;;;;;;;:::i;:::-;;;;;;;;;;;63772:58;;-1:-1:-1;;;63772:58:0;;63824:4;63772:58;;;1753:51:1;-1:-1:-1;;;;;63772:43:0;;;;;;1726:18:1;;63772:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;63753:77;;63864:1;63853:8;:12;:58;;;;-1:-1:-1;63906:4:0;;63869:22;;;;:25;;-1:-1:-1;;;;;63906:4:0;;;;63892:1;;63869:25;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;63869:42:0;;;63853:58;63849:218;;;63936:6;;;;;;;;;-1:-1:-1;;;;;63936:6:0;-1:-1:-1;;;;;63936:31:0;;63968:8;63978:1;63981:6;:33;63988:12;:22;;;64011:1;63988:25;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;63981:33:0;-1:-1:-1;;;;;63981:33:0;;;;;;;;;;;;64024:4;64031:15;63936:111;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;63936:111:0;;;;;;;;;;;;:::i;:::-;;63849:218;-1:-1:-1;64097:3:0;;63685:433;;;-1:-1:-1;;64144:3:0;;62899:1262;;;;64173:17;64211:6;64193:15;:13;:15::i;:::-;:24;;;;:::i;:::-;64173:44;;64234:29;64253:9;64234:18;:29::i;:::-;62845:1426;;62819:1452::o;43365:120::-;38007:6;;-1:-1:-1;;;;;38007:6:0;42872:10;:21;;:45;;-1:-1:-1;42911:6:0;;-1:-1:-1;;;;;42911:6:0;42897:10;:20;42872:45;42864:66;;;;-1:-1:-1;;;42864:66:0;;;;;;;:::i;:::-;43436:16:::1;::::0;-1:-1:-1;;;;;1771:32:1;;1753:51;;43436:16:0::1;::::0;1741:2:1;1726:18;43436:16:0::1;;;;;;;43463:5;:14:::0;;-1:-1:-1;;;;;;43463:14:0::1;-1:-1:-1::0;;;;;43463:14:0;;;::::1;::::0;;;::::1;::::0;;43365:120::o;60871:235::-;38007:6;;-1:-1:-1;;;;;38007:6:0;42872:10;:21;;:45;;-1:-1:-1;42911:6:0;;-1:-1:-1;;;;;42911:6:0;42897:10;:20;42872:45;42864:66;;;;-1:-1:-1;;;42864:66:0;;;;;;;:::i;:::-;60985:6:::1;60980:119;60993:18:::0;;::::1;60980:119;;;61029:26;61044:7;;61052:1;61044:10;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;61029:26::-;61082:3;;60980:119;;;;60871:235:::0;;:::o;65227:206::-;37820:13;:11;:13::i;:::-;65340:16:::1;::::0;65312:59:::1;::::0;;-1:-1:-1;;;;;65340:16:0;;::::1;10696:34:1::0;;10766:15;;;10761:2;10746:18;;10739:43;65312:59:0::1;::::0;10631:18:1;65312:59:0::1;;;;;;;65382:16;:43:::0;;-1:-1:-1;;;;;;65382:43:0::1;-1:-1:-1::0;;;;;65382:43:0;;;::::1;::::0;;;::::1;::::0;;65227:206::o;61142:594::-;38007:6;;-1:-1:-1;;;;;38007:6:0;42872:10;:21;;:45;;-1:-1:-1;42911:6:0;;-1:-1:-1;;;;;42911:6:0;42897:10;:20;42872:45;42864:66;;;;-1:-1:-1;;;42864:66:0;;;;;;;:::i;:::-;61271:4:::1;::::0;-1:-1:-1;;;;;61271:4:0::1;61245:6:::0;;61271:4:::1;61245:9:::0;::::1;;;;:::i;:::-;:14;::::0;::::1;:9;::::0;;::::1;;:14:::0;;::::1;::::0;-1:-1:-1;61245:14:0::1;:::i;:::-;-1:-1:-1::0;;;;;61245:31:0::1;::::0;61237:61:::1;;;::::0;-1:-1:-1;;;61237:61:0;;24861:2:1;61237:61:0::1;::::0;::::1;24843:21:1::0;24900:2;24880:18;;;24873:30;-1:-1:-1;;;24919:18:1;;;24912:47;24976:18;;61237:61:0::1;24659:341:1::0;61237:61:0::1;61357:4;::::0;-1:-1:-1;;;;;61357:4:0::1;61317:6:::0;;61324:17:::1;61357:4:::0;61317:6;61324:17:::1;:::i;:::-;61317:25;;;;;;;:::i;:::-;;;;;;:28;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;61317:45:0::1;;61309:75;;;::::0;-1:-1:-1;;;61309:75:0;;25207:2:1;61309:75:0::1;::::0;::::1;25189:21:1::0;25246:2;25226:18;;;25219:30;-1:-1:-1;;;25265:18:1;;;25258:47;25322:18;;61309:75:0::1;25005:341:1::0;61309:75:0::1;61400:6;61395:130;61408:17:::0;;::::1;61395:130;;;61443:6;:22;61450:6;;61457:1;61450:9;;;;;;;:::i;:::-;:14;::::0;::::1;:9;::::0;;::::1;;:14:::0;;::::1;::::0;-1:-1:-1;61450:14:0::1;:::i;:::-;-1:-1:-1::0;;;;;61443:22:0::1;-1:-1:-1::0;;;;;61443:22:0::1;;;;;;;;;;;;61471:6;;61478:1;61471:9;;;;;;;:::i;:::-;61443:38:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;61443:38:0;;;::::1;::::0;;;61471:9:::1;::::0;;::::1;::::0;;;::::1;::::0;61443:38:::1;;::::0;;::::1;::::0;-1:-1:-1;61443:38:0::1;61471:9:::0;61443:38;::::1;:::i;:::-;-1:-1:-1::0;;61508:3:0::1;;61395:130;;;-1:-1:-1::0;61588:6:0::1;::::0;61545:54:::1;::::0;-1:-1:-1;;;;;61588:6:0::1;;61552::::0;;61588;61552:9;::::1;;;;:::i;61545:54::-;61653:6;::::0;61610:70:::1;::::0;-1:-1:-1;;;;;61653:6:0::1;-1:-1:-1::0;;61617:6:0;;61653::::1;61617:9:::0;::::1;;;;:::i;61610:70::-;61696:32;61713:6;;61720:1;61713:9;;;;;;;:::i;:::-;:14;::::0;::::1;:9;::::0;;::::1;;:14:::0;;::::1;::::0;-1:-1:-1;61713:14:0::1;:::i;:::-;61696:32;::::0;-1:-1:-1;;;;;1771:32:1;;;1753:51;;1741:2;1726:18;61696:32:0::1;;;;;;;61142:594:::0;;:::o;38582:103::-;37820:13;:11;:13::i;:::-;38647:30:::1;38674:1;38647:18;:30::i;56632:48::-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;56632:48:0;;;;-1:-1:-1;56632:48:0;;;;-1:-1:-1;;;56632:48:0;;;;;:::o;43221:135::-;38007:6;;-1:-1:-1;;;;;38007:6:0;42872:10;:21;;:45;;-1:-1:-1;42911:6:0;;-1:-1:-1;;;;;42911:6:0;42897:10;:20;42872:45;42864:66;;;;-1:-1:-1;;;42864:66:0;;;;;;;:::i;:::-;43305:6:::1;::::0;43294:27:::1;::::0;;-1:-1:-1;;;;;43305:6:0;;::::1;10696:34:1::0;;10766:15;;;10761:2;10746:18;;10739:43;43294:27:0::1;::::0;10631:18:1;43294:27:0::1;;;;;;;43332:6;:16:::0;;-1:-1:-1;;;;;;43332:16:0::1;-1:-1:-1::0;;;;;43332:16:0;;;::::1;::::0;;;::::1;::::0;;43221:135::o;51893:106::-;38007:6;;-1:-1:-1;;;;;38007:6:0;42872:10;:21;;:45;;-1:-1:-1;42911:6:0;;-1:-1:-1;;;;;42911:6:0;42897:10;:20;42872:45;42864:66;;;;-1:-1:-1;;;42864:66:0;;;;;;;:::i;:::-;51940:8:::1;:6;:8::i;:::-;51984:2;::::0;51959:4:::1;::::0;:32:::1;::::0;-1:-1:-1;;;;;51959:4:0;;::::1;::::0;51984:2:::1;;51959:16;:32::i;51243:245::-:0;37820:13;:11;:13::i;:::-;51293:12:::1;51311:10;:8;:10::i;:::-;51292:29;;;;51351:15;51340:7;:26;;51332:48;;;::::0;-1:-1:-1;;;51332:48:0;;26498:2:1;51332:48:0::1;::::0;::::1;26480:21:1::0;26537:1;26517:18;;;26510:29;-1:-1:-1;;;26555:18:1;;;26548:39;26604:18;;51332:48:0::1;26296:332:1::0;51332:48:0::1;51391:2;::::0;51403:7:::1;::::0;51391:20:::1;::::0;-1:-1:-1;;;51391:20:0;;-1:-1:-1;;;;;51391:2:0;;::::1;::::0;:11:::1;::::0;:20:::1;::::0;::::1;;3109:25:1::0;;;3097:2;3082:18;;2963:177;51391:20:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;51443:10;-1:-1:-1::0;;;;;51435:45:0::1;;51455:7;;51464:15;:13;:15::i;:::-;51435:45;::::0;;21874:25:1;;;21930:2;21915:18;;21908:34;;;;21847:18;51435:45:0::1;;;;;;;51281:207;51243:245::o:0;6901:104::-;6957:13;6990:7;6983:14;;;;;:::i;51524:112::-;38007:6;;-1:-1:-1;;;;;38007:6:0;42872:10;:21;;:45;;-1:-1:-1;42911:6:0;;-1:-1:-1;;;;;42911:6:0;42897:10;:20;42872:45;42864:66;;;;-1:-1:-1;;;42864:66:0;;;;;;;:::i;:::-;51591:10:::1;::::0;51620:7:::1;::::0;51591:37:::1;::::0;-1:-1:-1;;;51591:37:0;;-1:-1:-1;;;;;26825:32:1;;;51591:37:0::1;::::0;::::1;26807:51:1::0;26874:18;;;26867:34;;;;51591:10:0;::::1;::::0;:20:::1;::::0;26780:18:1;;51591:37:0::1;26633:274:1::0;11259:436:0;11352:4;4404:10;11352:4;11435:25;4404:10;11452:7;11435:9;:25::i;:::-;11408:52;;11499:15;11479:16;:35;;11471:85;;;;-1:-1:-1;;;11471:85:0;;27114:2:1;11471:85:0;;;27096:21:1;27153:2;27133:18;;;27126:30;27192:34;27172:18;;;27165:62;-1:-1:-1;;;27243:18:1;;;27236:35;27288:19;;11471:85:0;26912:401:1;11471:85:0;11592:60;11601:5;11608:7;11636:15;11617:16;:34;11592:8;:60::i;:::-;-1:-1:-1;11683:4:0;;11259:436;-1:-1:-1;;;;11259:436:0:o;65889:198::-;37820:13;:11;:13::i;:::-;66001:17:::1;::::0;65977:58:::1;::::0;;-1:-1:-1;;;;;66001:17:0;;::::1;10696:34:1::0;;10766:15;;;10761:2;10746:18;;10739:43;65977:58:0::1;::::0;10631:18:1;65977:58:0::1;;;;;;;66046:17;:33:::0;;-1:-1:-1;;;;;;66046:33:0::1;-1:-1:-1::0;;;;;66046:33:0;;;::::1;::::0;;;::::1;::::0;;65889:198::o;58509:496::-;58647:13;:20;58552:25;;;;58603:17;;58647:20;-1:-1:-1;;;;;58689:18:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;58689:18:0;;58678:29;;58740:3;-1:-1:-1;;;;;58726:18:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;58726:18:0;;58718:26;;58760:6;58755:191;58772:3;58768:1;:7;58755:191;;;58807:10;;58827:7;;58807:31;;-1:-1:-1;;;58807:31:0;;-1:-1:-1;;;;;58807:10:0;;;;:19;;:31;;58836:1;;58807:31;;21874:25:1;;;21930:2;21915:18;;21908:34;21862:2;21847:18;;21700:248;58807:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;58793:8;58802:1;58793:11;;;;;;;;:::i;:::-;-1:-1:-1;;;;;58793:45:0;;;:11;;;;;;;;;:45;58864:10;;58881:7;;58890:11;;58864:10;;;;;:16;;58890:8;;58899:1;;58890:11;;;;;;:::i;:::-;;;;;;;58864:38;;;;;;;;;;;;;;;27748:25:1;;;-1:-1:-1;;;;;27809:32:1;27804:2;27789:18;;27782:60;27736:2;27721:18;;27574:274;58864:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;58853:5;58859:1;58853:8;;;;;;;;:::i;:::-;;;;;;;;;;:49;58929:3;;58755:191;;;-1:-1:-1;58968:10:0;;58989:7;;58968:29;;-1:-1:-1;;;58968:29:0;;-1:-1:-1;;;;;58968:10:0;;;;:20;;:29;;;;3109:25:1;;;3097:2;3082:18;;2963:177;58968:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;58956:41;;58622:383;58509:496;;;:::o;8306:193::-;8385:4;4404:10;8441:28;4404:10;8458:2;8462:6;8441:9;:28::i;65479:205::-;37820:13;:11;:13::i;:::-;65586:12:::1;::::0;65562:53:::1;::::0;;-1:-1:-1;;;;;65586:12:0;;::::1;10696:34:1::0;;10766:15;;;10761:2;10746:18;;10739:43;65562:53:0::1;::::0;10631:18:1;65562:53:0::1;;;;;;;65626:12;:50:::0;;-1:-1:-1;;;;;;65626:50:0::1;-1:-1:-1::0;;;;;65626:50:0;;;::::1;::::0;;;::::1;::::0;;65479:205::o;66180:341::-;37820:13;:11;:13::i;:::-;66318:6:::1;::::0;66300:35:::1;::::0;;-1:-1:-1;;;;;66318:6:0;;::::1;10696:34:1::0;;10766:15;;;10761:2;10746:18;;10739:43;66300:35:0::1;::::0;10631:18:1;66300:35:0::1;;;;;;;66351:6;66346:125;66359:17:::0;;::::1;66346:125;;;66394:17;66417:6;;66424:1;66417:9;;;;;;;:::i;:::-;66394:33:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;66394:33:0;;;::::1;::::0;;;66417:9:::1;::::0;;::::1;::::0;;;::::1;::::0;66394:33:::1;;::::0;;::::1;::::0;-1:-1:-1;66394:33:0::1;66417:9:::0;66394:33;::::1;:::i;:::-;-1:-1:-1::0;;66454:3:0::1;;66346:125;;;-1:-1:-1::0;;66481:6:0::1;:32:::0;;-1:-1:-1;;;;;;66481:32:0::1;-1:-1:-1::0;;;;;66481:32:0;;;::::1;::::0;;;::::1;::::0;;;-1:-1:-1;66180:341:0:o;50738:433::-;38007:6;;-1:-1:-1;;;;;38007:6:0;42872:10;:21;;:45;;-1:-1:-1;42911:6:0;;-1:-1:-1;;;;;42911:6:0;42897:10;:20;42872:45;42864:66;;;;-1:-1:-1;;;42864:66:0;;;;;;;:::i;:::-;50839:7:::1;::::0;:12;50831:36:::1;;;::::0;-1:-1:-1;;;50831:36:0;;28055:2:1;50831:36:0::1;::::0;::::1;28037:21:1::0;28094:2;28074:18;;;28067:30;-1:-1:-1;;;28113:18:1;;;28106:41;28164:18;;50831:36:0::1;27853:335:1::0;50831:36:0::1;50896:1;50886:7;:11;50878:35;;;::::0;-1:-1:-1;;;50878:35:0;;28395:2:1;50878:35:0::1;::::0;::::1;28377:21:1::0;28434:2;28414:18;;;28407:30;-1:-1:-1;;;28453:18:1;;;28446:41;28504:18;;50878:35:0::1;28193:335:1::0;50878:35:0::1;50926:4;::::0;:66:::1;::::0;-1:-1:-1;;;;;50926:4:0::1;50956:10;50977:4;50984:7:::0;50926:21:::1;:66::i;:::-;51013:2;::::0;:39:::1;::::0;-1:-1:-1;;;51013:39:0;;::::1;::::0;::::1;21874:25:1::0;;;21915:18;;;21908:34;;;-1:-1:-1;;;;;51013:2:0;;::::1;::::0;:14:::1;::::0;21847:18:1;;51013:39:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51003:7;:49:::0;51063:26:::1;51069:10;51081:7:::0;51063:5:::1;:26::i;:::-;51130:7;::::0;51107:56:::1;::::0;;28735:25:1;;;28791:2;28776:18;;28769:34;;;28819:18;;28812:34;;;51118:10:0::1;::::0;51107:56:::1;::::0;28723:2:1;28708:18;51107:56:0::1;28533:319:1::0;47195:79:0;47249:17;47258:7;47249:8;:17::i;:::-;47195:79;:::o;49420:110::-;49493:4;;:29;;-1:-1:-1;;;49493:29:0;;49516:4;49493:29;;;1753:51:1;49466:7:0;;-1:-1:-1;;;;;49493:4:0;;:14;;1726:18:1;;49493:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;49599:394::-;49733:2;;49743:7;;49733:18;;-1:-1:-1;;;49733:18:0;;;;;3109:25:1;;;;49640:15:0;;;;;;-1:-1:-1;;;;;49733:2:0;;:9;;3082:18:1;;49733::0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;49719:32;-1:-1:-1;49762:18:0;;-1:-1:-1;49814:7:0;49784:26;45869:12;49784:15;:26;:::i;:::-;49783:38;;;;:::i;:::-;:48;;49824:7;49783:48;:::i;:::-;49762:69;;49871:15;49861:7;:25;:57;;49917:1;49861:57;;;49889:25;49899:15;49889:7;:25;:::i;:::-;49842:76;;49963:7;49950:10;:20;:35;;49980:5;49950:35;;;49973:4;49929:56;;49708:285;49599:394;;;:::o;8562:151::-;-1:-1:-1;;;;;8678:18:0;;;8651:7;8678:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;8562:151::o;47066:86::-;47117:4;;:26;;-1:-1:-1;;;47117:26:0;;47132:10;47117:26;;;1753:51:1;47108:36:0;;-1:-1:-1;;;;;47117:4:0;;:14;;1726:18:1;;47117:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47108:8;:36::i;50189:114::-;50277:2;;50287:7;;50277:18;;-1:-1:-1;;;50277:18:0;;;;;3109:25:1;;;;50239:13:0;;-1:-1:-1;;;;;50277:2:0;;:9;;3082:18:1;;50277::0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;50265:30:0;50189:114;-1:-1:-1;50189:114:0:o;60724:104::-;38007:6;;-1:-1:-1;;;;;38007:6:0;42872:10;:21;;:45;;-1:-1:-1;42911:6:0;;-1:-1:-1;;;;;42911:6:0;42897:10;:20;42872:45;42864:66;;;;-1:-1:-1;;;42864:66:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;60806:14:0;::::1;;::::0;;;:6:::1;:14;::::0;;;;60799:21:::1;::::0;::::1;:::i;51674:188::-:0;37820:13;:11;:13::i;:::-;45822:5:::1;51751:12:::0;::::1;;51743:40;;;::::0;-1:-1:-1;;;51743:40:0;;29309:2:1;51743:40:0::1;::::0;::::1;29291:21:1::0;29348:2;29328:18;;;29321:30;-1:-1:-1;;;29367:18:1;;;29360:45;29422:18;;51743:40:0::1;29107:339:1::0;51743:40:0::1;51794:11;:19:::0;;;51829:25:::1;::::0;3109::1;;;51829::0::1;::::0;3097:2:1;3082:18;51829:25:0::1;2963:177:1::0;50040:102:0;50092:7;50119:15;:13;:15::i;56687:58::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;56687:58:0;;;;-1:-1:-1;56687:58:0;;;;-1:-1:-1;;;;56687:58:0;;;;;:::o;60136:549::-;38007:6;;-1:-1:-1;;;;;38007:6:0;42872:10;:21;;:45;;-1:-1:-1;42911:6:0;;-1:-1:-1;;;;;42911:6:0;42897:10;:20;42872:45;42864:66;;;;-1:-1:-1;;;42864:66:0;;;;;;;:::i;:::-;60280:10:::1;::::0;:22:::1;::::0;-1:-1:-1;;;60280:22:0;;-1:-1:-1;;;;;1771:32:1;;;60280:22:0::1;::::0;::::1;1753:51:1::0;60264:13:0::1;::::0;60280:10:::1;::::0;:17:::1;::::0;1726:18:1;;60280:22:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;60327:197;::::0;;::::1;::::0;::::1;::::0;;;;60348:12:::1;::::0;60375:10:::1;::::0;-1:-1:-1;;;60375:33:0;;;-1:-1:-1;;;;;1771:32:1;;;60375:33:0;;;1753:51:1;60264:38:0;;-1:-1:-1;60327:197:0;;;;60348:12;;::::1;::::0;:26:::1;::::0;60375:10:::1;:26;1726:18:1::0;;;60375:33:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;60348:61;::::0;-1:-1:-1;;;;;;60348:61:0::1;::::0;;;;;;-1:-1:-1;;;;;1771:32:1;;;60348:61:0::1;::::0;::::1;1753:51:1::0;1726:18;;60348:61:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;60327:197:0;;::::1;::::0;;60424:10:::1;::::0;:33:::1;::::0;-1:-1:-1;;;60424:33:0;;1771:32:1;;;60424:33:0::1;::::0;::::1;1753:51:1::0;60327:197:0::1;::::0;;::::1;::::0;60424:10;::::1;::::0;:26:::1;::::0;1726:18:1;;60424:33:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;60327:197:0::1;;;;;60472:12;;60327:197;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;;60327:197:0;;;-1:-1:-1;60327:197:0::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;;;;;;::::1;::::0;;;60499:10;;;;;;60327:197;::::1;::::0;60499:10;;60327:197;60499:10;60327:197;::::1;;::::0;::::1;::::0;;;-1:-1:-1;60327:197:0;;;;-1:-1:-1;;;;;;;60313:11:0;;::::1;::::0;;:6:::1;:11;::::0;;;;;;;;:211;;;;;;::::1;-1:-1:-1::0;;;;;;60313:211:0;;::::1;;::::0;;;;::::1;::::0;;;::::1;::::0;;;;;::::1;::::0;::::1;;::::0;;;;;::::1;::::0;;;:11;;-1:-1:-1;60313:211:0::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;60313:211:0::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;;;;;;;;60535:17:0;;::::1;;::::0;;;:12:::1;:17;::::0;;;;;;:24;;-1:-1:-1;;60535:24:0::1;60555:4;60535:24;::::0;;60586:10:::1;::::0;:31;;-1:-1:-1;;;60586:31:0;;::::1;::::0;::::1;1753:51:1::0;;;;60575:102:0::1;::::0;60586:10:::1;::::0;:26:::1;::::0;1726:18:1;;60586:31:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;60619:10;::::0;:31:::1;::::0;-1:-1:-1;;;60619:31:0;;-1:-1:-1;;;;;1771:32:1;;;60619:31:0::1;::::0;::::1;1753:51:1::0;60619:10:0;;::::1;::::0;:26:::1;::::0;1726:18:1;;60619:31:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;60652:12;;60666:10;;60575:102;;;;;;;;;;;:::i;:::-;;;;;;;;60253:432;60136:549:::0;;;;;:::o;38840:201::-;37820:13;:11;:13::i;:::-;-1:-1:-1;;;;;38929:22:0;::::1;38921:73;;;::::0;-1:-1:-1;;;38921:73:0;;30377:2:1;38921:73:0::1;::::0;::::1;30359:21:1::0;30416:2;30396:18;;;30389:30;30455:34;30435:18;;;30428:62;-1:-1:-1;;;30506:18:1;;;30499:36;30552:19;;38921:73:0::1;30175:402:1::0;38921:73:0::1;39005:28;39024:8;39005:18;:28::i;47884:659::-:0;47937:1;47923:11;:9;:11::i;:::-;:15;47919:617;;;47959:23;47986:10;:8;:10::i;:::-;47955:41;;;;48033:17;:15;:17::i;:::-;48015:15;:13;:15::i;:::-;:35;48011:514;;;48071:24;48116:17;:15;:17::i;:::-;48098:15;:13;:15::i;:::-;:35;;;;:::i;:::-;48152:2;;48171:7;;48152:45;;-1:-1:-1;;;48152:45:0;;;;;21874:25:1;;;;21915:18;;;21908:34;;;48071:62:0;;-1:-1:-1;;;;;;48152:2:0;;:18;;21847::1;;48152:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48220:18;48216:109;;;48263:2;;48287:7;;48263:42;;-1:-1:-1;;;48263:42:0;;;;;21874:25:1;;;;45869:12:0;21915:18:1;;;21908:34;-1:-1:-1;;;;;48263:2:0;;;;:23;;21847:18:1;;48263:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48052:288;47195:79;:::o;48011:514::-;48405:18;48401:109;;;48448:2;;48472:7;;48448:42;;-1:-1:-1;;;48448:42:0;;;;;21874:25:1;;;;45869:12:0;21915:18:1;;;21908:34;-1:-1:-1;;;;;48448:2:0;;;;:23;;21847:18:1;;48448:42:0;21700:248:1;59481:629:0;43066:5;;-1:-1:-1;;;;;43066:5:0;43052:10;:19;43044:38;;;;-1:-1:-1;;;43044:38:0;;22894:2:1;43044:38:0;;;22876:21:1;22933:1;22913:18;;;22906:29;-1:-1:-1;;;22951:18:1;;;22944:36;22997:18;;43044:38:0;22692:329:1;43044:38:0;59662:6:::1;59657:155;59670:21:::0;;::::1;59657:155;;;59717:12;:27;59730:10;;59741:1;59730:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;59717:27:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;59717:27:0;;::::1;;59709:59;;;::::0;-1:-1:-1;;;59709:59:0;;30784:2:1;59709:59:0::1;::::0;::::1;30766:21:1::0;30823:2;30803:18;;;30796:30;-1:-1:-1;;;30842:18:1;;;30835:49;30901:18;;59709:59:0::1;30582:343:1::0;59709:59:0::1;59795:3;;59657:155;;;;59828:12;59824:54;;;59857:9;:7;:9::i;:::-;59890:26;:13;59906:10:::0;;59890:26:::1;:::i;:::-;;59984:18;:16;:18::i;:::-;60013:10;::::0;60029:7:::1;::::0;60013:46:::1;::::0;-1:-1:-1;;;60013:46:0;;-1:-1:-1;;;;;60013:10:0;;::::1;::::0;:15:::1;::::0;:46:::1;::::0;60038:10;;;;60050:8;;;;60013:46:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;60075:27;60081:10;;60093:8;;60075:27;;;;;;;;;:::i;:::-;;;;;;;;59481:629:::0;;;;;:::o;29834:616::-;30198:10;;;30197:62;;-1:-1:-1;30214:39:0;;-1:-1:-1;;;30214:39:0;;30238:4;30214:39;;;10696:34:1;-1:-1:-1;;;;;10766:15:1;;;10746:18;;;10739:43;30214:15:0;;;;;10631:18:1;;30214:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:44;30197:62;30175:166;;;;-1:-1:-1;;;30175:166:0;;32610:2:1;30175:166:0;;;32592:21:1;32649:2;32629:18;;;32622:30;32688:34;32668:18;;;32661:62;-1:-1:-1;;;32739:18:1;;;32732:52;32801:19;;30175:166:0;32408:418:1;30175:166:0;30379:62;;-1:-1:-1;;;;;26825:32:1;;30379:62:0;;;26807:51:1;26874:18;;;26867:34;;;30352:90:0;;30372:5;;-1:-1:-1;;;30402:22:0;26780:18:1;;30379:62:0;;;;-1:-1:-1;;30379:62:0;;;;;;;;;;;;;;-1:-1:-1;;;;;30379:62:0;-1:-1:-1;;;;;;30379:62:0;;;;;;;;;;30352:19;:90::i;23811:229::-;23948:12;23980:52;24002:6;24010:4;24016:1;24019:12;23980:21;:52::i;:::-;23973:59;23811:229;-1:-1:-1;;;;23811:229:0:o;14884:380::-;-1:-1:-1;;;;;15020:19:0;;15012:68;;;;-1:-1:-1;;;15012:68:0;;33033:2:1;15012:68:0;;;33015:21:1;33072:2;33052:18;;;33045:30;33111:34;33091:18;;;33084:62;-1:-1:-1;;;33162:18:1;;;33155:34;33206:19;;15012:68:0;32831:400:1;15012:68:0;-1:-1:-1;;;;;15099:21:0;;15091:68;;;;-1:-1:-1;;;15091:68:0;;33438:2:1;15091:68:0;;;33420:21:1;33477:2;33457:18;;;33450:30;33516:34;33496:18;;;33489:62;-1:-1:-1;;;33567:18:1;;;33560:32;33609:19;;15091:68:0;33236:398:1;15091:68:0;-1:-1:-1;;;;;15172:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;15224:32;;3109:25:1;;;15224:32:0;;3082:18:1;15224:32:0;;;;;;;14884:380;;;:::o;64279:886::-;64453:14;;:37;;-1:-1:-1;;;64453:37:0;;64484:4;64453:37;;;1753:51:1;64416:34:0;;-1:-1:-1;;;;;64453:14:0;;:22;;1726:18:1;;64453:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;64453:37:0;;;;;;;;;;;;:::i;:::-;64416:74;;64501:14;64544:4;64531;:10;;;64518;:23;;;;:::i;:::-;:30;;;;:::i;:::-;64501:47;-1:-1:-1;64563:10:0;;64559:365;;64623:6;;64597:4;;64590:49;;-1:-1:-1;;;;;64597:4:0;;;;64623:6;64632;64590:24;:49::i;:::-;64681:6;;64751:17;;64681:106;;-1:-1:-1;;;64681:106:0;;64654:24;;-1:-1:-1;;;;;64681:6:0;;;;:31;;:106;;64713:6;;64654:24;;64724:17;;64751;;;;64771:15;;64681:106;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;64681:106:0;;;;;;;;;;;;:::i;:::-;64835:6;;64809:4;;64654:133;;-1:-1:-1;64802:44:0;;-1:-1:-1;;;;;64809:4:0;;;;64835:6;;64802:24;:44::i;:::-;64866:46;64878:1;64881:7;64906:1;64889:7;:14;:18;;;;:::i;:::-;64881:27;;;;;;;;:::i;:::-;;;;;;;;;;;;64866:46;;;28735:25:1;;;28776:18;;;28769:34;64910:1:0;28819:18:1;;;28812:34;28723:2;28708:18;64866:46:0;;;;;;;64575:349;64559:365;64936:11;64964:13;7890:12;;;7802:108;64964:13;64950:11;:9;:11::i;:::-;:27;;;;:::i;:::-;64936:41;-1:-1:-1;64992:7:0;;64988:170;;65030:16;;65016:37;;-1:-1:-1;;;;;65030:16:0;65049:3;65016:5;:37::i;:::-;65068:16;;;;;;;;;-1:-1:-1;;;;;65068:16:0;-1:-1:-1;;;;;65068:35:0;;:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65125:21;65142:3;65125:21;;;;3109:25:1;;3097:2;3082:18;;2963:177;65125:21:0;;;;;;;;64336:829;;;64279:886;:::o;13123:399::-;-1:-1:-1;;;;;13207:21:0;;13199:65;;;;-1:-1:-1;;;13199:65:0;;35593:2:1;13199:65:0;;;35575:21:1;35632:2;35612:18;;;35605:30;35671:33;35651:18;;;35644:61;35722:18;;13199:65:0;35391:355:1;13199:65:0;13355:6;13339:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;13372:18:0;;:9;:18;;;;;;;;;;:28;;13394:6;;13372:9;:28;;13394:6;;13372:28;:::i;:::-;;;;-1:-1:-1;;13416:37:0;;3109:25:1;;;-1:-1:-1;;;;;13416:37:0;;;13433:1;;13416:37;;3097:2:1;3082:18;13416:37:0;;;;;;;62845:1426;;62819:1452::o;15555:453::-;15690:24;15717:25;15727:5;15734:7;15717:9;:25::i;:::-;15690:52;;-1:-1:-1;;15757:16:0;:37;15753:248;;15839:6;15819:16;:26;;15811:68;;;;-1:-1:-1;;;15811:68:0;;35953:2:1;15811:68:0;;;35935:21:1;35992:2;35972:18;;;35965:30;36031:31;36011:18;;;36004:59;36080:18;;15811:68:0;35751:353:1;15811:68:0;15923:51;15932:5;15939:7;15967:6;15948:16;:25;15923:8;:51::i;12165:671::-;-1:-1:-1;;;;;12296:18:0;;12288:68;;;;-1:-1:-1;;;12288:68:0;;36311:2:1;12288:68:0;;;36293:21:1;36350:2;36330:18;;;36323:30;36389:34;36369:18;;;36362:62;-1:-1:-1;;;36440:18:1;;;36433:35;36485:19;;12288:68:0;36109:401:1;12288:68:0;-1:-1:-1;;;;;12375:16:0;;12367:64;;;;-1:-1:-1;;;12367:64:0;;36717:2:1;12367:64:0;;;36699:21:1;36756:2;36736:18;;;36729:30;36795:34;36775:18;;;36768:62;-1:-1:-1;;;36846:18:1;;;36839:33;36889:19;;12367:64:0;36515:399:1;12367:64:0;-1:-1:-1;;;;;12517:15:0;;12495:19;12517:15;;;;;;;;;;;12551:21;;;;12543:72;;;;-1:-1:-1;;;12543:72:0;;37121:2:1;12543:72:0;;;37103:21:1;37160:2;37140:18;;;37133:30;37199:34;37179:18;;;37172:62;-1:-1:-1;;;37250:18:1;;;37243:36;37296:19;;12543:72:0;36919:402:1;12543:72:0;-1:-1:-1;;;;;12651:15:0;;;:9;:15;;;;;;;;;;;12669:20;;;12651:38;;12711:13;;;;;;;;:23;;12683:6;;12651:9;12711:23;;12683:6;;12711:23;:::i;:::-;;;;;;;;12767:2;-1:-1:-1;;;;;12752:26:0;12761:4;-1:-1:-1;;;;;12752:26:0;;12771:6;12752:26;;;;3109:25:1;;3097:2;3082:18;;2963:177;12752:26:0;;;;;;;;12791:37;60871:235;13855:591;-1:-1:-1;;;;;13939:21:0;;13931:67;;;;-1:-1:-1;;;13931:67:0;;37528:2:1;13931:67:0;;;37510:21:1;37567:2;37547:18;;;37540:30;37606:34;37586:18;;;37579:62;-1:-1:-1;;;37657:18:1;;;37650:31;37698:19;;13931:67:0;37326:397:1;13931:67:0;-1:-1:-1;;;;;14098:18:0;;14073:22;14098:18;;;;;;;;;;;14135:24;;;;14127:71;;;;-1:-1:-1;;;14127:71:0;;37930:2:1;14127:71:0;;;37912:21:1;37969:2;37949:18;;;37942:30;38008:34;37988:18;;;37981:62;-1:-1:-1;;;38059:18:1;;;38052:32;38101:19;;14127:71:0;37728:398:1;14127:71:0;-1:-1:-1;;;;;14234:18:0;;:9;:18;;;;;;;;;;14255:23;;;14234:44;;14300:12;:22;;14272:6;;14234:9;14300:22;;14272:6;;14300:22;:::i;:::-;;;;-1:-1:-1;;14340:37:0;;3109:25:1;;;14366:1:0;;-1:-1:-1;;;;;14340:37:0;;;;;3097:2:1;3082:18;14340:37:0;;;;;;;60980:119:::1;60871:235:::0;;:::o;29098:211::-;29242:58;;-1:-1:-1;;;;;26825:32:1;;29242:58:0;;;26807:51:1;26874:18;;;26867:34;;;29215:86:0;;29235:5;;-1:-1:-1;;;29265:23:0;26780:18:1;;29242:58:0;26633:274:1;41925:120:0;40934:16;:14;:16::i;:::-;41984:7:::1;:15:::0;;-1:-1:-1;;;;41984:15:0::1;::::0;;42015:22:::1;4404:10:::0;42024:12:::1;42015:22;::::0;-1:-1:-1;;;;;1771:32:1;;;1753:51;;1741:2;1726:18;42015:22:0::1;;;;;;;41925:120::o:0;38099:132::-;38007:6;;-1:-1:-1;;;;;38007:6:0;4404:10;38163:23;38155:68;;;;-1:-1:-1;;;38155:68:0;;38333:2:1;38155:68:0;;;38315:21:1;;;38352:18;;;38345:30;38411:34;38391:18;;;38384:62;38463:18;;38155:68:0;38131:356:1;39201:191:0;39294:6;;;-1:-1:-1;;;;;39311:17:0;;;-1:-1:-1;;;;;;39311:17:0;;;;;;;39344:40;;39294:6;;;39311:17;39294:6;;39344:40;;39275:16;;39344:40;39264:128;39201:191;:::o;41666:118::-;40675:19;:17;:19::i;:::-;41726:7:::1;:14:::0;;-1:-1:-1;;;;41726:14:0::1;-1:-1:-1::0;;;41726:14:0::1;::::0;;41756:20:::1;41763:12;4404:10:::0;;4324:98;29317:248;29488:68;;-1:-1:-1;;;;;38750:15:1;;;29488:68:0;;;38732:34:1;38802:15;;38782:18;;;38775:43;38834:18;;;38827:34;;;29461:96:0;;29481:5;;-1:-1:-1;;;29511:27:0;38667:18:1;;29488:68:0;38492:375:1;47377:455:0;35754:1;36352:7;;:19;36344:63;;;;-1:-1:-1;;;36344:63:0;;15271:2:1;36344:63:0;;;15253:21:1;15310:2;15290:18;;;15283:30;15349:33;15329:18;;;15322:61;15400:18;;36344:63:0;15069:355:1;36344:63:0;35754:1;36485:7;:18;40675:19:::1;:17;:19::i;:::-;47459:6:::2;:4;:6::i;:::-;47476:13;47492:15;:13;:15::i;:::-;47518:4;::::0;47476:31;;-1:-1:-1;47518:57:0::2;::::0;-1:-1:-1;;;;;47518:4:0::2;47540:10;47560:4;47567:7:::0;47518:21:::2;:57::i;:::-;47586:14;47603:15;:13;:15::i;:::-;47586:32:::0;-1:-1:-1;47639:14:0::2;47648:5:::0;47586:32;47639:14:::2;:::i;:::-;47629:24:::0;-1:-1:-1;47715:11:0;;47711:114:::2;;47743:26;47749:10;47761:7;47743:5;:26::i;:::-;47789:24;47801:11;:9;:11::i;:::-;47789:24;::::0;3109:25:1;;;3097:2;3082:18;47789:24:0::2;;;;;;;47711:114;-1:-1:-1::0;;35710:1:0;36664:7;:22;-1:-1:-1;47377:455:0:o;32165:716::-;32589:23;32615:69;32643:4;32615:69;;;;;;;;;;;;;;;;;32623:5;-1:-1:-1;;;;;32615:27:0;;;:69;;;;;:::i;:::-;32699:17;;32589:95;;-1:-1:-1;32699:21:0;32695:179;;32796:10;32785:30;;;;;;;;;;;;:::i;:::-;32777:85;;;;-1:-1:-1;;;32777:85:0;;39324:2:1;32777:85:0;;;39306:21:1;39363:2;39343:18;;;39336:30;39402:34;39382:18;;;39375:62;-1:-1:-1;;;39453:18:1;;;39446:40;39503:19;;32777:85:0;39122:406:1;24931:510:0;25101:12;25159:5;25134:21;:30;;25126:81;;;;-1:-1:-1;;;25126:81:0;;39735:2:1;25126:81:0;;;39717:21:1;39774:2;39754:18;;;39747:30;39813:34;39793:18;;;39786:62;-1:-1:-1;;;39864:18:1;;;39857:36;39910:19;;25126:81:0;39533:402:1;25126:81:0;-1:-1:-1;;;;;21361:19:0;;;25218:60;;;;-1:-1:-1;;;25218:60:0;;40142:2:1;25218:60:0;;;40124:21:1;40181:2;40161:18;;;40154:30;40220:31;40200:18;;;40193:59;40269:18;;25218:60:0;39940:353:1;25218:60:0;25292:12;25306:23;25333:6;-1:-1:-1;;;;;25333:11:0;25352:5;25359:4;25333:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25291:73;;;;25382:51;25399:7;25408:10;25420:12;25382:16;:51::i;:::-;25375:58;24931:510;-1:-1:-1;;;;;;;24931:510:0:o;41414:108::-;41141:7;;-1:-1:-1;;;41141:7:0;;;;41473:41;;;;-1:-1:-1;;;41473:41:0;;40779:2:1;41473:41:0;;;40761:21:1;40818:2;40798:18;;;40791:30;-1:-1:-1;;;40837:18:1;;;40830:50;40897:18;;41473:41:0;40577:344:1;41229:108:0;41141:7;;-1:-1:-1;;;41141:7:0;;;;41299:9;41291:38;;;;-1:-1:-1;;;41291:38:0;;41128:2:1;41291:38:0;;;41110:21:1;41167:2;41147:18;;;41140:30;-1:-1:-1;;;41186:18:1;;;41179:46;41242:18;;41291:38:0;40926:340:1;27617:762:0;27767:12;27796:7;27792:580;;;-1:-1:-1;27827:10:0;27820:17;;27792:580;27941:17;;:21;27937:424;;28189:10;28183:17;28250:15;28237:10;28233:2;28229:19;28222:44;27937:424;28332:12;28325:20;;-1:-1:-1;;;28325:20:0;;;;;;;;:::i;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:258:1;86:1;96:113;110:6;107:1;104:13;96:113;;;186:11;;;180:18;167:11;;;160:39;132:2;125:10;96:113;;;227:6;224:1;221:13;218:48;;;-1:-1:-1;;262:1:1;244:16;;237:27;14:258::o;277:383::-;426:2;415:9;408:21;389:4;458:6;452:13;501:6;496:2;485:9;481:18;474:34;517:66;576:6;571:2;560:9;556:18;551:2;543:6;539:15;517:66;:::i;:::-;644:2;623:15;-1:-1:-1;;619:29:1;604:45;;;;651:2;600:54;;277:383;-1:-1:-1;;277:383:1:o;665:131::-;-1:-1:-1;;;;;740:31:1;;730:42;;720:70;;786:1;783;776:12;801:315;869:6;877;930:2;918:9;909:7;905:23;901:32;898:52;;;946:1;943;936:12;898:52;985:9;972:23;1004:31;1029:5;1004:31;:::i;:::-;1054:5;1106:2;1091:18;;;;1078:32;;-1:-1:-1;;;801:315:1:o;1313:180::-;1372:6;1425:2;1413:9;1404:7;1400:23;1396:32;1393:52;;;1441:1;1438;1431:12;1393:52;-1:-1:-1;1464:23:1;;1313:180;-1:-1:-1;1313:180:1:o;1815:936::-;1912:6;1920;1928;1936;1944;1997:3;1985:9;1976:7;1972:23;1968:33;1965:53;;;2014:1;2011;2004:12;1965:53;2053:9;2040:23;2072:31;2097:5;2072:31;:::i;:::-;2122:5;-1:-1:-1;2179:2:1;2164:18;;2151:32;2192:33;2151:32;2192:33;:::i;:::-;2244:7;-1:-1:-1;2298:2:1;2283:18;;2270:32;;-1:-1:-1;2353:2:1;2338:18;;2325:32;-1:-1:-1;;;;;2406:14:1;;;2403:34;;;2433:1;2430;2423:12;2403:34;2471:6;2460:9;2456:22;2446:32;;2516:7;2509:4;2505:2;2501:13;2497:27;2487:55;;2538:1;2535;2528:12;2487:55;2578:2;2565:16;2604:2;2596:6;2593:14;2590:34;;;2620:1;2617;2610:12;2590:34;2665:7;2660:2;2651:6;2647:2;2643:15;2639:24;2636:37;2633:57;;;2686:1;2683;2676:12;2633:57;1815:936;;;;-1:-1:-1;1815:936:1;;-1:-1:-1;2717:2:1;2709:11;;2739:6;1815:936;-1:-1:-1;;;1815:936:1:o;3145:367::-;3208:8;3218:6;3272:3;3265:4;3257:6;3253:17;3249:27;3239:55;;3290:1;3287;3280:12;3239:55;-1:-1:-1;3313:20:1;;-1:-1:-1;;;;;3345:30:1;;3342:50;;;3388:1;3385;3378:12;3342:50;3425:4;3417:6;3413:17;3401:29;;3485:3;3478:4;3468:6;3465:1;3461:14;3453:6;3449:27;3445:38;3442:47;3439:67;;;3502:1;3499;3492:12;3439:67;3145:367;;;;;:::o;3517:961::-;3701:6;3709;3717;3725;3733;3786:2;3774:9;3765:7;3761:23;3757:32;3754:52;;;3802:1;3799;3792:12;3754:52;3841:9;3828:23;3860:31;3885:5;3860:31;:::i;:::-;3910:5;-1:-1:-1;3966:2:1;3951:18;;3938:32;-1:-1:-1;;;;;4019:14:1;;;4016:34;;;4046:1;4043;4036:12;4016:34;4085:70;4147:7;4138:6;4127:9;4123:22;4085:70;:::i;:::-;4174:8;;-1:-1:-1;4059:96:1;-1:-1:-1;4262:2:1;4247:18;;4234:32;;-1:-1:-1;4278:16:1;;;4275:36;;;4307:1;4304;4297:12;4275:36;;4346:72;4410:7;4399:8;4388:9;4384:24;4346:72;:::i;:::-;3517:961;;;;-1:-1:-1;3517:961:1;;-1:-1:-1;4437:8:1;;4320:98;3517:961;-1:-1:-1;;;3517:961:1:o;4929:456::-;5006:6;5014;5022;5075:2;5063:9;5054:7;5050:23;5046:32;5043:52;;;5091:1;5088;5081:12;5043:52;5130:9;5117:23;5149:31;5174:5;5149:31;:::i;:::-;5199:5;-1:-1:-1;5256:2:1;5241:18;;5228:32;5269:33;5228:32;5269:33;:::i;:::-;4929:456;;5321:7;;-1:-1:-1;;;5375:2:1;5360:18;;;;5347:32;;4929:456::o;5806:247::-;5865:6;5918:2;5906:9;5897:7;5893:23;5889:32;5886:52;;;5934:1;5931;5924:12;5886:52;5973:9;5960:23;5992:31;6017:5;5992:31;:::i;6058:490::-;6197:6;6205;6258:2;6246:9;6237:7;6233:23;6229:32;6226:52;;;6274:1;6271;6264:12;6226:52;6314:9;6301:23;-1:-1:-1;;;;;6339:6:1;6336:30;6333:50;;;6379:1;6376;6369:12;6333:50;6418:70;6480:7;6471:6;6460:9;6456:22;6418:70;:::i;:::-;6507:8;;6392:96;;-1:-1:-1;6058:490:1;-1:-1:-1;;;;6058:490:1:o;6553:385::-;6631:8;6641:6;6695:3;6688:4;6680:6;6676:17;6672:27;6662:55;;6713:1;6710;6703:12;6662:55;-1:-1:-1;6736:20:1;;-1:-1:-1;;;;;6768:30:1;;6765:50;;;6811:1;6808;6801:12;6765:50;6848:4;6840:6;6836:17;6824:29;;6911:3;6904:4;6896;6888:6;6884:17;6876:6;6872:30;6868:41;6865:50;6862:70;;;6928:1;6925;6918:12;6943:478;7055:6;7063;7116:2;7104:9;7095:7;7091:23;7087:32;7084:52;;;7132:1;7129;7122:12;7084:52;7172:9;7159:23;-1:-1:-1;;;;;7197:6:1;7194:30;7191:50;;;7237:1;7234;7227:12;7191:50;7276:85;7353:7;7344:6;7333:9;7329:22;7276:85;:::i;8267:461::-;8320:3;8358:5;8352:12;8385:6;8380:3;8373:19;8411:4;8440:2;8435:3;8431:12;8424:19;;8477:2;8470:5;8466:14;8498:1;8508:195;8522:6;8519:1;8516:13;8508:195;;;8587:13;;-1:-1:-1;;;;;8583:39:1;8571:52;;8643:12;;;;8678:15;;;;8619:1;8537:9;8508:195;;;-1:-1:-1;8719:3:1;;8267:461;-1:-1:-1;;;;;8267:461:1:o;8733:875::-;9018:2;9007:9;9000:21;8981:4;9044:56;9096:2;9085:9;9081:18;9073:6;9044:56;:::i;:::-;9157:22;;;9119:2;9137:18;;;9130:50;;;;9229:13;;9251:22;;;9327:15;;;;9289;;;9360:1;9370:169;9384:6;9381:1;9378:13;9370:169;;;9445:13;;9433:26;;9514:15;;;;9479:12;;;;9406:1;9399:9;9370:169;;;9374:3;;9556;9548:11;;;;;9595:6;9590:2;9579:9;9575:18;9568:34;8733:875;;;;;;:::o;9613:613::-;9734:6;9742;9750;9803:2;9791:9;9782:7;9778:23;9774:32;9771:52;;;9819:1;9816;9809:12;9771:52;9858:9;9845:23;9877:31;9902:5;9877:31;:::i;:::-;9927:5;-1:-1:-1;9983:2:1;9968:18;;9955:32;-1:-1:-1;;;;;9999:30:1;;9996:50;;;10042:1;10039;10032:12;9996:50;10081:85;10158:7;10149:6;10138:9;10134:22;10081:85;:::i;:::-;9613:613;;10185:8;;-1:-1:-1;10055:111:1;;-1:-1:-1;;;;9613:613:1:o;10231:248::-;10299:6;10307;10360:2;10348:9;10339:7;10335:23;10331:32;10328:52;;;10376:1;10373;10366:12;10328:52;-1:-1:-1;;10399:23:1;;;10469:2;10454:18;;;10441:32;;-1:-1:-1;10231:248:1:o;11544:388::-;11612:6;11620;11673:2;11661:9;11652:7;11648:23;11644:32;11641:52;;;11689:1;11686;11679:12;11641:52;11728:9;11715:23;11747:31;11772:5;11747:31;:::i;:::-;11797:5;-1:-1:-1;11854:2:1;11839:18;;11826:32;11867:33;11826:32;11867:33;:::i;:::-;11919:7;11909:17;;;11544:388;;;;;:::o;13318:118::-;13404:5;13397:13;13390:21;13383:5;13380:32;13370:60;;13426:1;13423;13416:12;13441:902;13569:6;13577;13585;13593;13601;13654:2;13642:9;13633:7;13629:23;13625:32;13622:52;;;13670:1;13667;13660:12;13622:52;13710:9;13697:23;-1:-1:-1;;;;;13780:2:1;13772:6;13769:14;13766:34;;;13796:1;13793;13786:12;13766:34;13835:70;13897:7;13888:6;13877:9;13873:22;13835:70;:::i;:::-;13924:8;;-1:-1:-1;13809:96:1;-1:-1:-1;14012:2:1;13997:18;;13984:32;;-1:-1:-1;14028:16:1;;;14025:36;;;14057:1;14054;14047:12;14025:36;;14096:72;14160:7;14149:8;14138:9;14134:24;14096:72;:::i;:::-;14187:8;;-1:-1:-1;14070:98:1;-1:-1:-1;;14272:2:1;14257:18;;14244:32;14285:28;14244:32;14285:28;:::i;:::-;14332:5;14322:15;;;13441:902;;;;;;;;:::o;14348:380::-;14427:1;14423:12;;;;14470;;;14491:61;;14545:4;14537:6;14533:17;14523:27;;14491:61;14598:2;14590:6;14587:14;14567:18;14564:38;14561:161;;14644:10;14639:3;14635:20;14632:1;14625:31;14679:4;14676:1;14669:15;14707:4;14704:1;14697:15;15429:331;15631:2;15613:21;;;15670:1;15650:18;;;15643:29;-1:-1:-1;;;15703:2:1;15688:18;;15681:38;15751:2;15736:18;;15429:331::o;15765:522::-;15865:6;15860:3;15853:19;15835:3;15891:4;15920:2;15915:3;15911:12;15904:19;;15946:5;15969:1;15979:283;15993:6;15990:1;15987:13;15979:283;;;16070:6;16057:20;16090:33;16115:7;16090:33;:::i;:::-;-1:-1:-1;;;;;16148:33:1;16136:46;;16202:12;;;;16237:15;;;;16178:1;16008:9;15979:283;;16292:359;16509:6;16498:9;16491:25;16552:2;16547;16536:9;16532:18;16525:30;16472:4;16572:73;16641:2;16630:9;16626:18;16618:6;16610;16572:73;:::i;:::-;16564:81;16292:359;-1:-1:-1;;;;;16292:359:1:o;16656:127::-;16717:10;16712:3;16708:20;16705:1;16698:31;16748:4;16745:1;16738:15;16772:4;16769:1;16762:15;16788:574;16907:4;16913:6;16973:11;16960:25;17067:2;17063:7;17052:8;17036:14;17032:29;17028:43;17008:18;17004:68;16994:96;;17086:1;17083;17076:12;16994:96;17113:33;;17165:20;;;-1:-1:-1;;;;;;17197:30:1;;17194:50;;;17240:1;17237;17230:12;17194:50;17273:4;17261:17;;-1:-1:-1;17332:4:1;17320:17;;17304:14;17300:38;17290:49;;17287:69;;;17352:1;17349;17342:12;17367:127;17428:10;17423:3;17419:20;17416:1;17409:31;17459:4;17456:1;17449:15;17483:4;17480:1;17473:15;17499:125;17539:4;17567:1;17564;17561:8;17558:34;;;17572:18;;:::i;:::-;-1:-1:-1;17609:9:1;;17499:125::o;18312:184::-;18382:6;18435:2;18423:9;18414:7;18410:23;18406:32;18403:52;;;18451:1;18448;18441:12;18403:52;-1:-1:-1;18474:16:1;;18312:184;-1:-1:-1;18312:184:1:o;18501:1450::-;18823:4;18871:3;18860:9;18856:19;18902:6;18891:9;18884:25;18928:2;18966:6;18961:2;18950:9;18946:18;18939:34;18992:2;19030:3;19025:2;19014:9;19010:18;19003:31;19054:6;19084;19076;19069:22;19122:3;19111:9;19107:19;19100:26;;19149:6;19135:20;;19173:1;19183:641;19197:6;19194:1;19191:13;19183:641;;;19272:6;19259:20;19292:31;19317:5;19292:31;:::i;:::-;-1:-1:-1;;;;;19390:14:1;;;19378:27;;19446:15;;;19433:29;;19475:33;19433:29;19475:33;:::i;:::-;19542:16;19528:12;;;19521:38;19600:15;;;19587:29;19629:30;19587:29;19629:30;:::i;:::-;19700:15;19693:23;19679:12;;;19672:45;19740:4;19799:15;;;;19764:12;;;;19219:1;19212:9;19183:641;;;-1:-1:-1;;;;;;1564:31:1;;19895:4;19880:20;;1552:44;19841:3;-1:-1:-1;19853:48:1;;-1:-1:-1;;;1498:104:1;19853:48;19938:6;19932:3;19921:9;19917:19;19910:35;18501:1450;;;;;;;;;:::o;19956:127::-;20017:10;20012:3;20008:20;20005:1;19998:31;20048:4;20045:1;20038:15;20072:4;20069:1;20062:15;20088:253;20160:2;20154:9;20202:4;20190:17;;-1:-1:-1;;;;;20222:34:1;;20258:22;;;20219:62;20216:88;;;20284:18;;:::i;:::-;20320:2;20313:22;20088:253;:::o;20346:275::-;20417:2;20411:9;20482:2;20463:13;;-1:-1:-1;;20459:27:1;20447:40;;-1:-1:-1;;;;;20502:34:1;;20538:22;;;20499:62;20496:88;;;20564:18;;:::i;:::-;20600:2;20593:22;20346:275;;-1:-1:-1;20346:275:1:o;20626:936::-;20721:6;20752:2;20795;20783:9;20774:7;20770:23;20766:32;20763:52;;;20811:1;20808;20801:12;20763:52;20844:9;20838:16;-1:-1:-1;;;;;20914:2:1;20906:6;20903:14;20900:34;;;20930:1;20927;20920:12;20900:34;20968:6;20957:9;20953:22;20943:32;;21013:7;21006:4;21002:2;20998:13;20994:27;20984:55;;21035:1;21032;21025:12;20984:55;21064:2;21058:9;21086:2;21082;21079:10;21076:36;;;21092:18;;:::i;:::-;21138:2;21135:1;21131:10;21121:20;;21161:28;21185:2;21181;21177:11;21161:28;:::i;:::-;21223:15;;;21293:11;;;21289:20;;;21254:12;;;;21321:19;;;21318:39;;;21353:1;21350;21343:12;21318:39;21377:11;;;;21397:135;21413:6;21408:3;21405:15;21397:135;;;21479:10;;21467:23;;21430:12;;;;21510;;;;21397:135;;;21551:5;20626:936;-1:-1:-1;;;;;;;;20626:936:1:o;21567:128::-;21607:3;21638:1;21634:6;21631:1;21628:13;21625:39;;;21644:18;;:::i;:::-;-1:-1:-1;21680:9:1;;21567:128::o;21953:168::-;21993:7;22059:1;22055;22051:6;22047:14;22044:1;22041:21;22036:1;22029:9;22022:17;22018:45;22015:71;;;22066:18;;:::i;:::-;-1:-1:-1;22106:9:1;;21953:168::o;22126:217::-;22166:1;22192;22182:132;;22236:10;22231:3;22227:20;22224:1;22217:31;22271:4;22268:1;22261:15;22299:4;22296:1;22289:15;22182:132;-1:-1:-1;22328:9:1;;22126:217::o;23026:332::-;23233:6;23222:9;23215:25;23276:2;23271;23260:9;23256:18;23249:30;23196:4;23296:56;23348:2;23337:9;23333:18;23325:6;23296:56;:::i;23363:1291::-;23667:4;23696:3;23737:2;23726:9;23722:18;23767:6;23756:9;23749:25;23793:2;23831:6;23826:2;23815:9;23811:18;23804:34;23857:2;23895;23890;23879:9;23875:18;23868:30;23918:6;23953;23947:13;23984:6;23976;23969:22;24022:3;24011:9;24007:19;24000:26;;24045:6;24042:1;24035:17;24088:2;24085:1;24075:16;24061:30;;24109:1;24119:408;24133:6;24130:1;24127:13;24119:408;;;24240:13;;-1:-1:-1;;;;;24236:22:1;;;24224:35;;24209:1;24295:14;;;24289:21;24344:18;;;24330:12;;;24323:40;24415:18;;;24435:4;24411:29;24404:37;24397:45;24383:12;;;24376:67;24512:4;24500:17;;;;24472:4;24463:14;;;;24148:9;24119:408;;;-1:-1:-1;;;;;;;1564:31:1;;24598:4;24583:20;;1552:44;24544:3;-1:-1:-1;24556:48:1;;-1:-1:-1;;;;1498:104:1;24556:48;24641:6;24635:3;24624:9;24620:19;24613:35;23363:1291;;;;;;;;:::o;25351:195::-;25455:11;;-1:-1:-1;;;;;;25451:54:1;-1:-1:-1;;;;;25507:31:1;;;;25448:91;;;;25435:105;;25351:195::o;25551:740::-;25714:5;25701:19;25729:33;25754:7;25729:33;:::i;:::-;25771:62;25825:7;25819:4;25771:62;:::i;:::-;;25870:1;25864:4;25860:12;25920:2;25913:5;25909:14;25896:28;25933:33;25958:7;25933:33;:::i;:::-;25975:68;26035:7;26023:10;25975:68;:::i;:::-;;26091:2;26084:5;26080:14;26067:28;26104:30;26126:7;26104:30;:::i;:::-;26153:17;;-1:-1:-1;;;;26201:27:1;26250:15;;26243:23;26273:3;26234:33;-1:-1:-1;;;26230:53:1;26198:86;26179:106;;-1:-1:-1;;25551:740:1:o;27318:251::-;27388:6;27441:2;27429:9;27420:7;27416:23;27412:32;27409:52;;;27457:1;27454;27447:12;27409:52;27489:9;27483:16;27508:31;27533:5;27508:31;:::i;28857:245::-;28936:6;28944;28997:2;28985:9;28976:7;28972:23;28968:32;28965:52;;;29013:1;29010;29003:12;28965:52;-1:-1:-1;;29036:16:1;;29092:2;29077:18;;;29071:25;29036:16;;29071:25;;-1:-1:-1;28857:245:1:o;29451:719::-;-1:-1:-1;;;;;29822:15:1;;;29804:34;;29874:15;;29869:2;29854:18;;29847:43;29926:3;29921:2;29906:18;;29899:31;;;29747:4;;29953:74;;30007:19;;29999:6;29991;29953:74;:::i;:::-;30075:9;30067:6;30063:22;30058:2;30047:9;30043:18;30036:50;30103:61;30157:6;30149;30141;30103:61;:::i;:::-;30095:69;29451:719;-1:-1:-1;;;;;;;;;29451:719:1:o;30930:354::-;31018:19;;;31000:3;-1:-1:-1;;;;;31049:31:1;;31046:51;;;31093:1;31090;31083:12;31046:51;31129:6;31126:1;31122:14;31181:8;31174:5;31167:4;31162:3;31158:14;31145:45;31258:1;31213:18;;31233:4;31209:29;31247:13;;;-1:-1:-1;31209:29:1;;30930:354;-1:-1:-1;;30930:354:1:o;31289:590::-;31594:6;31583:9;31576:25;31637:2;31632;31621:9;31617:18;31610:30;31557:4;31663:73;31732:2;31721:9;31717:18;31709:6;31701;31663:73;:::i;:::-;31784:9;31776:6;31772:22;31767:2;31756:9;31752:18;31745:50;31812:61;31866:6;31858;31850;31812:61;:::i;31884:519::-;32161:2;32150:9;32143:21;32124:4;32187:73;32256:2;32245:9;32241:18;32233:6;32225;32187:73;:::i;:::-;32308:9;32300:6;32296:22;32291:2;32280:9;32276:18;32269:50;32336:61;32390:6;32382;32374;32336:61;:::i;33639:132::-;33715:13;;33737:28;33715:13;33737:28;:::i;:::-;33639:132;;;:::o;33776:1270::-;33875:6;33906:2;33949;33937:9;33928:7;33924:23;33920:32;33917:52;;;33965:1;33962;33955:12;33917:52;33998:9;33992:16;-1:-1:-1;;;;;34068:2:1;34060:6;34057:14;34054:34;;;34084:1;34081;34074:12;34054:34;34107:22;;;;34163:4;34145:16;;;34141:27;34138:47;;;34181:1;34178;34171:12;34138:47;34207:22;;:::i;:::-;34258:2;34252:9;34245:5;34238:24;34308:2;34304;34300:11;34294:18;34289:2;34282:5;34278:14;34271:42;34359:2;34355;34351:11;34345:18;34340:2;34333:5;34329:14;34322:42;34410:2;34406;34402:11;34396:18;34391:2;34384:5;34380:14;34373:42;34454:3;34450:2;34446:12;34440:19;34484:2;34474:8;34471:16;34468:36;;;34500:1;34497;34490:12;34468:36;34523:17;;34571:4;34563:13;;34559:27;-1:-1:-1;34549:55:1;;34600:1;34597;34590:12;34549:55;34629:2;34623:9;34651:2;34647;34644:10;34641:36;;;34657:18;;:::i;:::-;34699:53;34742:2;34723:13;;-1:-1:-1;;34719:27:1;34715:36;;34699:53;:::i;:::-;34686:66;;34775:2;34768:5;34761:17;34815:7;34810:2;34805;34801;34797:11;34793:20;34790:33;34787:53;;;34836:1;34833;34826:12;34787:53;34849:54;34900:2;34895;34888:5;34884:14;34879:2;34875;34871:11;34849:54;:::i;:::-;;;34936:5;34930:3;34923:5;34919:15;34912:30;34975:40;35010:3;35006:2;35002:12;34975:40;:::i;:::-;34969:3;34958:15;;34951:65;34962:5;33776:1270;-1:-1:-1;;;;;;33776:1270:1:o;38872:245::-;38939:6;38992:2;38980:9;38971:7;38967:23;38963:32;38960:52;;;39008:1;39005;38998:12;38960:52;39040:9;39034:16;39059:28;39081:5;39059:28;:::i;40298:274::-;40427:3;40465:6;40459:13;40481:53;40527:6;40522:3;40515:4;40507:6;40503:17;40481:53;:::i;:::-;40550:16;;;;;40298:274;-1:-1:-1;;40298:274:1:o

Swarm Source

ipfs://7cc3ece3cfac5d3569fb07875b15e61960544a8d0835e4d589b3e138d3d46adf
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.