Token Hydro

Overview ERC20

Price
$0.00 @ 0.000000 MOVR
Fully Diluted Market Cap
Total Supply:
997,657,521.121942 HYDRO

Holders:
144 addresses

Transfers:
-

Contract:
0x56cfe76545939afabc8bdba94192a96801d24d280x56cfe76545939AFAbc8BDbA94192A96801D24d28

Decimals:
18

Social Profiles:
Not Available, Update ?

Loading
[ Download CSV Export  ] 
Loading
[ Download CSV Export  ] 
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
H2Ov2

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 1000 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-01-26
*/

// Sources flattened with hardhat v2.7.0 https://hardhat.org

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

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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


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

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/contracts/utils/[email protected]



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/contracts/token/ERC20/[email protected]



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:
     *
     * - `recipient` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

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

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

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

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

        return true;
    }

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

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

        return true;
    }

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

        _beforeTokenTransfer(sender, recipient, amount);

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

        emit Transfer(sender, recipient, amount);

        _afterTokenTransfer(sender, recipient, amount);
    }

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

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

        _totalSupply += amount;
        _balances[account] += amount;
        emit Transfer(address(0), account, amount);

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

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

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

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

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

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

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

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

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


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



pragma solidity ^0.8.0;


/**
 * @dev Extension of {ERC20} that allows token holders to destroy both their own
 * tokens and those that they have an allowance for, in a way that can be
 * recognized off-chain (via event analysis).
 */
abstract contract ERC20Burnable is Context, ERC20 {
    /**
     * @dev Destroys `amount` tokens from the caller.
     *
     * See {ERC20-_burn}.
     */
    function burn(uint256 amount) public virtual {
        _burn(_msgSender(), amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, deducting from the caller's
     * allowance.
     *
     * See {ERC20-_burn} and {ERC20-allowance}.
     *
     * Requirements:
     *
     * - the caller must have allowance for ``accounts``'s tokens of at least
     * `amount`.
     */
    function burnFrom(address account, uint256 amount) public virtual {
        uint256 currentAllowance = allowance(account, _msgSender());
        require(currentAllowance >= amount, "ERC20: burn amount exceeds allowance");
        unchecked {
            _approve(account, _msgSender(), currentAllowance - amount);
        }
        _burn(account, amount);
    }
}


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



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() {
        _setOwner(_msgSender());
    }

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

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

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _setOwner(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");
        _setOwner(newOwner);
    }

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


// File @openzeppelin/contracts/utils/math/[email protected]



pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

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

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

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

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

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

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

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}


// File contracts/interfaces/IH2OPlugin.sol



pragma solidity ^0.8.0;

interface IH2OPlugin {
    function retirePlugin() external;

    function h2oAddress() external view returns (address);
}


// File contracts/interfaces/IH2OLiquidityPlugin.sol



pragma solidity ^0.8.0;

interface IH2OLiquidityPlugin is IH2OPlugin {
    function pair() external returns (address);

    function addLiquidity(uint256 _tokenAmount) external;
}


// File contracts/interfaces/IDividendDistributor.sol



pragma solidity ^0.8.0;

interface IDividendDistributor {
    function setShare(address shareholder, uint256 amount) external;

    function deposit(uint256 amount) external;

    function process(uint256 gas) external returns (uint256 processedCount);

    function claimDividend(address shareholder) external;
}


// File contracts/interfaces/IH2ODistributorPlugin.sol



pragma solidity ^0.8.0;


interface IH2ODistributorPlugin is IH2OPlugin, IDividendDistributor {
    function processAtIndex(uint256 gas, uint256 distributorIndex)
        external
        returns (uint256 processedCount);
}


// File contracts/interfaces/IPairChange.sol



pragma solidity ^0.8.0;

interface IPairChange {
    function onPairChange() external;
}


// File contracts/utils/UtilsLibrary.sol



pragma solidity ^0.8.0;

library UtilsLibrary {
  event ErrorLog(bytes data);
}


// File contracts/plugins/H2OPluginManager.sol



pragma solidity ^0.8.0;




// import "hardhat/console.sol";

abstract contract H2OPluginManager is Ownable {
    using SafeMath for uint256;

    struct PluginCandidate {
        uint8 pluginId;
        address implementation;
        uint256 proposedTime;
    }

    uint8 internal constant LIQUIDITY_PLUGIN_ID = 1;
    uint8 internal constant DISTRIBUTOR_PLUGIN_ID = 2;

    uint256 private constant MIN_APPROVAL_DELAY = 1 days;

    mapping(uint8 => address) private _plugins;
    mapping(uint8 => PluginCandidate) public pluginCandidates;

    uint256 public approvalDelay;
    uint256 public proposedApprovalDelay;
    uint256 public proposedApprovalDelayTime;

    event NewPluginCandidate(uint8 indexed pluginId, address implementation);
    event PluginUpgraded(uint8 indexed pluginId, address implementation);

    event NewApprovalDelayCandidate(uint256 approvalDelay);
    event ApprovalDelayUpgraded(uint256 approvalDelay);

    constructor(uint256 _approvalDelay) {
        approvalDelay = _approvalDelay;
    }

    function setupPlugin(uint8 _pluginId, address _implementation)
        external
        onlyOwner
    {
        require(_plugins[_pluginId] == address(0), "Plugin already setup");
        require(
            address(this) == IH2OPlugin(_implementation).h2oAddress(),
            "Plugin not valid"
        );
        _plugins[_pluginId] = _implementation;
        onPluginUpgraded(_pluginId, false);
    }

    function proposePlugin(uint8 _pluginId, address _implementation)
        external
        onlyOwner
    {
        require(
            address(this) == IH2OPlugin(_implementation).h2oAddress(),
            "Plugin not valid"
        );
        pluginCandidates[_pluginId] = PluginCandidate({
            pluginId: _pluginId,
            implementation: _implementation,
            proposedTime: block.timestamp
        });

        emit NewPluginCandidate(_pluginId, _implementation);
    }

    function upgradePlugin(uint8 _pluginId) external onlyOwner {
        PluginCandidate storage candidate = pluginCandidates[_pluginId];

        require(
            candidate.implementation != address(0),
            "There is no candidate"
        );
        require(
            proposedApprovalDelay == 0,
            "Cannot upgrade plugin while changing approval delay"
        );
        require(
            candidate.proposedTime.add(approvalDelay) < block.timestamp,
            "Delay has not passed"
        );

        emit PluginUpgraded(_pluginId, candidate.implementation);

        if (_plugins[_pluginId] != address(0)) {
            try IH2OPlugin(_plugins[_pluginId]).retirePlugin() {} catch (
                bytes memory reason
            ) {
                emit UtilsLibrary.ErrorLog(reason);
            }
        }
        _plugins[_pluginId] = candidate.implementation;
        candidate.implementation = address(0);
        candidate.proposedTime = 5000000000;

        onPluginUpgraded(_pluginId, true);
    }

    function proposeApprovalDelay(uint256 _approvalDelay) external onlyOwner {
        require(_approvalDelay >= MIN_APPROVAL_DELAY, "Delay too small");
        proposedApprovalDelay = _approvalDelay;
        proposedApprovalDelayTime = block.timestamp;

        emit NewApprovalDelayCandidate(_approvalDelay);
    }

    function upgradeApprovalDelay() external onlyOwner {
        require(proposedApprovalDelay != 0, "There is no candidate");
        require(
            proposedApprovalDelayTime.add(approvalDelay) < block.timestamp,
            "Delay has not passed"
        );

        emit ApprovalDelayUpgraded(proposedApprovalDelay);

        approvalDelay = proposedApprovalDelay;
        proposedApprovalDelayTime = 5000000000;
        proposedApprovalDelay = 0;
    }

    function onPluginUpgraded(uint8, bool) internal virtual {}

    function plugin(uint8 _pluginId)
        public
        view
        returns (address pluginAddress)
    {
        pluginAddress = _plugins[_pluginId];
    }
}


// File contracts/H2Ov2.sol



pragma solidity ^0.8.0;









// import "hardhat/console.sol";

contract H2Ov2 is ERC20, ERC20Burnable, IPairChange, H2OPluginManager {
    using SafeMath for uint256;

    mapping(address => bool) public isFeeExempt;
    mapping(address => bool) public isWalletLimitExempt;
    mapping(address => bool) public isDividendExempt;

    address constant DEAD = 0x000000000000000000000000000000000000dEaD;
    address constant ZERO = 0x0000000000000000000000000000000000000000;

    address public pair;

    address public marketingFeeReceiver;

    uint256 public liquidityFeeOfTotal = 2000;
    uint256 public reflectionFeeOfTotal = 8000;
    uint256 public marketingFeeOfTotal = 0;
    uint256 public burnFeeOfTotal = 0;
    uint256 public buyTotalFee = 500;
    uint256 public sellTotalFee = 1000;
    uint256 public constant feeDenominator = 10000;

    uint256 public maxWalletSize;

    bool public dividendNeedToUpdateHolders = false;

    // 0 means that auto distribution is disabled
    uint256 public autoDistributorGas = 0;
    // 0 means that auto swap is disabled
    uint256 public autoSwapThreshold = 0;

    bool private isSwapping = false;
    bool private isSwappingBack = false;
    bool private isProcessing = false;

    constructor(uint256 _approvalDelay)
        ERC20("Hydro", "HYDRO")
        H2OPluginManager(_approvalDelay)
    {
        _mint(_msgSender(), 10**(9 + decimals()));
        maxWalletSize = (totalSupply() * 10) / 100;
        isFeeExempt[_msgSender()] = true;
        isWalletLimitExempt[_msgSender()] = true;
        isWalletLimitExempt[address(this)] = true;
        isDividendExempt[DEAD] = true;
        isDividendExempt[ZERO] = true;
        isDividendExempt[address(this)] = true;

        marketingFeeReceiver = _msgSender();
    }

    function onPluginUpgraded(uint8 pluginId, bool isUpgrade)
        internal
        override
    {
        address pluginAddress = plugin(pluginId);
        _approve(address(this), pluginAddress, type(uint256).max);
        isFeeExempt[pluginAddress] = true;
        isWalletLimitExempt[pluginAddress] = true;
        isDividendExempt[pluginAddress] = true;

        if (pluginId == LIQUIDITY_PLUGIN_ID) {
            onPairChange();
        } else if (pluginId == DISTRIBUTOR_PLUGIN_ID) {
            if (isUpgrade) {
                dividendNeedToUpdateHolders = true;
            }
        }
    }

    function onPairChange() public override {
        pair = _liquidityPlugin().pair();
        isWalletLimitExempt[pair] = true;
        isDividendExempt[pair] = true;
    }

    function setAutoDistributorSettings(uint256 gas) external onlyOwner {
        require(gas < 750000);
        autoDistributorGas = gas;
    }

    function setIsFeeExempt(address holder, bool exempt) external onlyOwner {
        isFeeExempt[holder] = exempt;
    }

    function setIsDividendExempt(address holder, bool exempt)
        external
        onlyOwner
    {
        _setIsDividendExempt(holder, exempt);
    }

    function setIsWalletLimitExempt(address holder, bool exempt)
        external
        onlyOwner
    {
        isWalletLimitExempt[holder] = exempt;
    }

    function setMaxWallet(uint256 numerator, uint256 divisor)
        external
        onlyOwner
    {
        require(numerator > 0 && divisor > 0 && divisor <= 10000);
        maxWalletSize = (totalSupply() * numerator) / divisor;
    }

    function setAutoSwapThreshold(uint256 _autoSwapThreshold)
        external
        onlyOwner
    {
        require(
            _autoSwapThreshold <= totalSupply(),
            "Invalid autoswap threshold"
        );
        autoSwapThreshold = _autoSwapThreshold;
    }

    function setMarketingFeeReceiver(address _marketingFeeReceiver)
        external
        onlyOwner
    {
        marketingFeeReceiver = _marketingFeeReceiver;
        isWalletLimitExempt[_marketingFeeReceiver] = true;
    }

    function swapBackAll() public {
        swapBack(balanceOf(address(this)));
    }

    function swapBack(uint256 amount) public {
        require(
            !dividendNeedToUpdateHolders,
            "Need to update holders to swapback"
        );
        if (amount == 0) {
            return;
        }
        isSwappingBack = true;

        uint256 amountToLiquify = amount.mul(liquidityFeeOfTotal).div(
            feeDenominator
        );
        uint256 amountToMarketing = amount.mul(marketingFeeOfTotal).div(
            feeDenominator
        );
        uint256 amountToBurn = amount.mul(burnFeeOfTotal).div(feeDenominator);
        uint256 amountToSwap = amount
            .sub(amountToLiquify)
            .sub(amountToMarketing)
            .sub(amountToBurn);

        if (amountToLiquify > 0) {
            try _liquidityPlugin().addLiquidity(amountToLiquify) {} catch (
                bytes memory reason
            ) {
                emit UtilsLibrary.ErrorLog(reason);
            }
        }
        if (amountToMarketing > 0) {
            _transfer(address(this), marketingFeeReceiver, amountToMarketing);
        }
        if (amountToBurn > 0) {
            _burn(address(this), amountToBurn);
        }
        if (amountToSwap > 0) {
            try _distributorPlugin().deposit(amountToSwap) {} catch (
                bytes memory reason
            ) {
                emit UtilsLibrary.ErrorLog(reason);
            }
        }

        isSwappingBack = false;
    }

    function configureDividendHolders(
        address[] memory holders,
        bool updatingFinished
    ) external onlyOwner {
        for (uint256 i = 0; i < holders.length; i++) {
            _setIsDividendExempt(holders[i], false);
        }
        if (updatingFinished) {
            dividendNeedToUpdateHolders = false;
        }
    }

    function setFees(
        uint256 _liquidityFeeOfTotal,
        uint256 _reflectionFeeOfTotal,
        uint256 _marketingFeeOfTotal,
        uint256 _burnFeeOfTotal,
        uint256 _buyTotalFee,
        uint256 _sellTotalFee
    ) external onlyOwner {
        require(
            _liquidityFeeOfTotal
                .add(_reflectionFeeOfTotal)
                .add(_marketingFeeOfTotal)
                .add(_burnFeeOfTotal) == feeDenominator,
            "Incorrect fees"
        );
        liquidityFeeOfTotal = _liquidityFeeOfTotal;
        reflectionFeeOfTotal = _reflectionFeeOfTotal;
        marketingFeeOfTotal = _marketingFeeOfTotal;
        burnFeeOfTotal = _burnFeeOfTotal;
        buyTotalFee = _buyTotalFee;
        sellTotalFee = _sellTotalFee;
        require(buyTotalFee < feeDenominator.div(5));
        require(sellTotalFee < feeDenominator.div(5));
    }

    function process(uint256 gas) public {
        isProcessing = true;
        try _distributorPlugin().process(gas) {
            isProcessing = false;
        } catch (bytes memory reason) {
            emit UtilsLibrary.ErrorLog(reason);
        }
    }

    function processAtIndex(uint256 gas, uint256 distributorIndex)
        public
        returns (uint256 processedCount)
    {
        isProcessing = true;
        try _distributorPlugin().processAtIndex(gas, distributorIndex) returns (
            uint256 _processedCount
        ) {
            isProcessing = false;
            return _processedCount;
        } catch (bytes memory reason) {
            emit UtilsLibrary.ErrorLog(reason);
            return 0;
        }
    }

    function claimDividend(address shareholder) external {
        isProcessing = true;
        _distributorPlugin().claimDividend(shareholder);
        isProcessing = false;
    }

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

        if (amount == 0 || isSwapping || isSwappingBack || isProcessing) {
            super._transfer(from, to, amount);
            _checkWalletLimit(to);
            return;
        }

        if (_shouldSwapBack(to)) {
            swapBackAll();
        }

        isSwapping = true;

        bool isSelling = to == pair;

        uint256 amountReceived = _shouldTakeFee(from, to)
            ? _takeFee(isSelling, from, amount)
            : amount;
        super._transfer(from, to, amountReceived);

        isSwapping = false;

        _checkWalletLimit(to);

        _setShares(from, to);

        if (_isAutoDistributing() && !dividendNeedToUpdateHolders) {
            process(autoDistributorGas);
        }
    }

    function _setShares(address from, address to) private {
        isProcessing = true;
        if (!isDividendExempt[from]) {
            try _distributorPlugin().setShare(from, balanceOf(from)) {} catch (
                bytes memory reason
            ) {
                emit UtilsLibrary.ErrorLog(reason);
            }
        }
        if (!isDividendExempt[to]) {
            try _distributorPlugin().setShare(to, balanceOf(to)) {} catch (
                bytes memory reason
            ) {
                emit UtilsLibrary.ErrorLog(reason);
            }
        }
        isProcessing = false;
    }

    function _shouldTakeFee(address from, address to)
        internal
        view
        returns (bool)
    {
        return !isFeeExempt[from] && !isFeeExempt[to];
    }

    function _takeFee(
        bool selling,
        address sender,
        uint256 amount
    ) internal returns (uint256) {
        uint256 totalFee = _getTotalFee(selling);
        if (totalFee == 0) {
            return amount;
        }
        uint256 feeAmount = (amount * totalFee) / feeDenominator;

        super._transfer(sender, address(this), feeAmount);

        return amount - feeAmount;
    }

    function _getTotalFee(bool selling) public view returns (uint256) {
        if (selling) {
            return sellTotalFee;
        } else {
            return buyTotalFee;
        }
    }

    function _liquidityPlugin()
        private
        view
        returns (IH2OLiquidityPlugin result)
    {
        result = IH2OLiquidityPlugin(plugin(LIQUIDITY_PLUGIN_ID));
    }

    function _distributorPlugin()
        private
        view
        returns (IH2ODistributorPlugin result)
    {
        result = IH2ODistributorPlugin(plugin(DISTRIBUTOR_PLUGIN_ID));
    }

    function _shouldSwapBack(address to) internal view returns (bool) {
        return
            _msgSender() != pair &&
            !isSwapping &&
            autoSwapThreshold > 0 &&
            to == pair &&
            balanceOf(address(this)) >= autoSwapThreshold;
    }

    function _checkWalletLimit(address _address) private view {
        if (
            isWalletLimitExempt[_address] ||
            _address == pair ||
            _address == DEAD
        ) {
            return;
        }

        require(
            balanceOf(_address) <= maxWalletSize,
            "Transfer amount exceeds the bag size."
        );
    }

    function _setIsDividendExempt(address holder, bool exempt) private {
        require(holder != address(this) && holder != pair);
        isDividendExempt[holder] = exempt;
        isProcessing = true;
        if (exempt) {
            _distributorPlugin().setShare(holder, 0);
        } else {
            _distributorPlugin().setShare(holder, balanceOf(holder));
        }
        isProcessing = false;
    }

    function _isAutoDistributing() private view returns (bool) {
        return autoDistributorGas > 0;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"uint256","name":"_approvalDelay","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"approvalDelay","type":"uint256"}],"name":"ApprovalDelayUpgraded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"approvalDelay","type":"uint256"}],"name":"NewApprovalDelayCandidate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint8","name":"pluginId","type":"uint8"},{"indexed":false,"internalType":"address","name":"implementation","type":"address"}],"name":"NewPluginCandidate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint8","name":"pluginId","type":"uint8"},{"indexed":false,"internalType":"address","name":"implementation","type":"address"}],"name":"PluginUpgraded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"bool","name":"selling","type":"bool"}],"name":"_getTotalFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"approvalDelay","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":[],"name":"autoDistributorGas","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"autoSwapThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"burnFeeOfTotal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"buyTotalFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"shareholder","type":"address"}],"name":"claimDividend","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"holders","type":"address[]"},{"internalType":"bool","name":"updatingFinished","type":"bool"}],"name":"configureDividendHolders","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":[],"name":"dividendNeedToUpdateHolders","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeDenominator","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isDividendExempt","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isFeeExempt","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isWalletLimitExempt","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityFeeOfTotal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingFeeOfTotal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingFeeReceiver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWalletSize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"onPairChange","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"_pluginId","type":"uint8"}],"name":"plugin","outputs":[{"internalType":"address","name":"pluginAddress","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"","type":"uint8"}],"name":"pluginCandidates","outputs":[{"internalType":"uint8","name":"pluginId","type":"uint8"},{"internalType":"address","name":"implementation","type":"address"},{"internalType":"uint256","name":"proposedTime","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"gas","type":"uint256"}],"name":"process","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"gas","type":"uint256"},{"internalType":"uint256","name":"distributorIndex","type":"uint256"}],"name":"processAtIndex","outputs":[{"internalType":"uint256","name":"processedCount","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_approvalDelay","type":"uint256"}],"name":"proposeApprovalDelay","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_pluginId","type":"uint8"},{"internalType":"address","name":"_implementation","type":"address"}],"name":"proposePlugin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"proposedApprovalDelay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proposedApprovalDelayTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reflectionFeeOfTotal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellTotalFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"gas","type":"uint256"}],"name":"setAutoDistributorSettings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_autoSwapThreshold","type":"uint256"}],"name":"setAutoSwapThreshold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_liquidityFeeOfTotal","type":"uint256"},{"internalType":"uint256","name":"_reflectionFeeOfTotal","type":"uint256"},{"internalType":"uint256","name":"_marketingFeeOfTotal","type":"uint256"},{"internalType":"uint256","name":"_burnFeeOfTotal","type":"uint256"},{"internalType":"uint256","name":"_buyTotalFee","type":"uint256"},{"internalType":"uint256","name":"_sellTotalFee","type":"uint256"}],"name":"setFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"},{"internalType":"bool","name":"exempt","type":"bool"}],"name":"setIsDividendExempt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"},{"internalType":"bool","name":"exempt","type":"bool"}],"name":"setIsFeeExempt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"},{"internalType":"bool","name":"exempt","type":"bool"}],"name":"setIsWalletLimitExempt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_marketingFeeReceiver","type":"address"}],"name":"setMarketingFeeReceiver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"numerator","type":"uint256"},{"internalType":"uint256","name":"divisor","type":"uint256"}],"name":"setMaxWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_pluginId","type":"uint8"},{"internalType":"address","name":"_implementation","type":"address"}],"name":"setupPlugin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"swapBack","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapBackAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"upgradeApprovalDelay","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_pluginId","type":"uint8"}],"name":"upgradePlugin","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526107d0601055611f406011556000601281905560138190556101f46014556103e86015556017805460ff191690556018819055601955601a805462ffffff191690553480156200005357600080fd5b5060405162003af038038062003af08339810160408190526200007691620003ee565b8060405180604001604052806005815260200164487964726f60d81b81525060405180604001604052806005815260200164485944524f60d81b8152508160039080519060200190620000cb92919062000348565b508051620000e190600490602084019062000348565b505050620000fe620000f86200020a60201b60201c565b6200020e565b6008556200012733620001146012600962000423565b6200012190600a620004b7565b62000260565b60646200013360025490565b6200014090600a62000585565b6200014c91906200044b565b60165550336000818152600b602090815260408083208054600160ff199182168117909255600c845282852080548216831790553085528285208054821683179055600d9093527fdc7fafdc41998a74ecacb8f8bd877011aba1f1d03a3a0d37a2e7879a393b1d6a80548416821790557f81955a0a11e65eac625c29e8882660bae4e165a75d72780094acae8ece9a29ee8054841682179055922080549091169091179055600f80546001600160a01b0319169091179055620005fa565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038216620002bb5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640160405180910390fd5b8060026000828254620002cf919062000408565b90915550506001600160a01b03821660009081526020819052604081208054839290620002fe90849062000408565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b8280546200035690620005a7565b90600052602060002090601f0160209004810192826200037a5760008555620003c5565b82601f106200039557805160ff1916838001178555620003c5565b82800160010185558215620003c5579182015b82811115620003c5578251825591602001919060010190620003a8565b50620003d3929150620003d7565b5090565b5b80821115620003d35760008155600101620003d8565b6000602082840312156200040157600080fd5b5051919050565b600082198211156200041e576200041e620005e4565b500190565b600060ff821660ff84168060ff03821115620004435762000443620005e4565b019392505050565b6000826200046957634e487b7160e01b600052601260045260246000fd5b500490565b600181815b80851115620004af578160001904821115620004935762000493620005e4565b80851615620004a157918102915b93841c939080029062000473565b509250929050565b6000620004c860ff841683620004cf565b9392505050565b600082620004e0575060016200057f565b81620004ef575060006200057f565b8160018114620005085760028114620005135762000533565b60019150506200057f565b60ff841115620005275762000527620005e4565b50506001821b6200057f565b5060208310610133831016604e8410600b841016171562000558575081810a6200057f565b6200056483836200046e565b80600019048211156200057b576200057b620005e4565b0290505b92915050565b6000816000190483118215151615620005a257620005a2620005e4565b500290565b600181811c90821680620005bc57607f821691505b60208210811415620005de57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b6134e6806200060a6000396000f3fe608060405234801561001057600080fd5b506004361061038d5760003560e01c806386f6c3c1116101de578063c867d60b1161010f578063edafd4ad116100ad578063f708a64f1161007c578063f708a64f146107de578063fa3853be146107f1578063fdcf45ab14610804578063ffb2c4791461080c57600080fd5b8063edafd4ad146107a6578063f2fde38b146107b9578063f44a5fb9146107cc578063f64fbd7b146107d557600080fd5b8063dd62ed3e116100e9578063dd62ed3e14610748578063e260d91114610781578063e2d1e75c1461078a578063e96fada21461079357600080fd5b8063c867d60b14610709578063d2060a331461072c578063d889e3cd1461073f57600080fd5b8063a9059cbb1161017c578063c210b78711610156578063c210b787146106be578063c257955b146106c7578063c272301d146106d0578063c7f267d1146106fc57600080fd5b8063a9059cbb14610685578063abe57e7014610698578063c1ebb47b146106ab57600080fd5b80638f3fa860116101b85780638f3fa8601461064e57806395d89b4114610657578063a457c2d71461065f578063a8aa1b311461067257600080fd5b806386f6c3c11461060e5780638b98f6ce146106215780638da5cb5b1461062957600080fd5b80633807a89b116102c35780636d9b1191116102615780637249001911610230578063724900191461057357806379cc6790146105865780637e7ae1f61461059957806385a270fd146105ac57600080fd5b80636d9b1191146105265780636ef948c51461053957806370a0823114610542578063715018a61461056b57600080fd5b806342966c681161029d57806342966c68146104d45780634355855a146104e75780635b2a7d681461050a578063658d4b7f1461051357600080fd5b80633807a89b1461048b578063395093511461049e5780633f4218e0146104b157600080fd5b806323b872dd116103305780633003b4f71161030a5780633003b4f71461044d578063313ce5671461046057806333f70a8c1461046f5780633705b3921461048257600080fd5b806323b872dd1461041f57806324a1d30e14610432578063254634a71461043a57600080fd5b806315f7e05e1161036c57806315f7e05e146103e6578063180b0d7e146103fb57806318160ddd146104045780632198cf6c1461040c57600080fd5b8062afb3251461039257806306fdde03146103ae578063095ea7b3146103c3575b600080fd5b61039b60155481565b6040519081526020015b60405180910390f35b6103b661081f565b6040516103a59190613360565b6103d66103d1366004613120565b6108b1565b60405190151581526020016103a5565b6103f96103f4366004613037565b6108c8565b005b61039b61271081565b60025461039b565b6103f961041a3660046130eb565b610999565b6103d661042d3660046130aa565b610a11565b6103f9610ad2565b6103f96104483660046132f7565b610bd2565b6103f961045b366004613245565b610da1565b604051601281526020016103a5565b61039b61047d366004613277565b610e7b565b61039b60145481565b6103f961049936600461314c565b610fe5565b6103d66104ac366004613120565b611085565b6103d66104bf366004613037565b600b6020526000908152604090205460ff1681565b6103f96104e2366004613245565b6110c1565b6103d66104f5366004613037565b600d6020526000908152604090205460ff1681565b61039b60105481565b6103f96105213660046130eb565b6110ce565b6103f96105343660046132f7565b611141565b61039b60115481565b61039b610550366004613037565b6001600160a01b031660009081526020819052604090205490565b6103f96112f9565b6103f9610581366004613245565b61134d565b6103f9610594366004613120565b6113a9565b61039b6105a736600461322a565b611448565b6105e76105ba3660046132dc565b6007602052600090815260409020805460019091015460ff82169161010090046001600160a01b03169083565b6040805160ff90941684526001600160a01b039092166020840152908201526060016103a5565b6103f961061c366004613299565b611465565b6103f961156d565b6005546001600160a01b03165b6040516001600160a01b0390911681526020016103a5565b61039b60165481565b6103b66116ba565b6103d661066d366004613120565b6116c9565b600e54610636906001600160a01b031681565b6103d6610693366004613120565b61177a565b6103f96106a6366004613277565b611787565b6103f96106b9366004613245565b61181c565b61039b60095481565b61039b600a5481565b6106366106de3660046132dc565b60ff166000908152600660205260409020546001600160a01b031690565b6017546103d69060ff1681565b6103d6610717366004613037565b600c6020526000908152604090205460ff1681565b6103f961073a366004613245565b611b7d565b61039b60125481565b61039b610756366004613071565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b61039b60185481565b61039b60085481565b600f54610636906001600160a01b031681565b6103f96107b4366004613037565b611c1c565b6103f96107c7366004613037565b611c9e565b61039b60195481565b61039b60135481565b6103f96107ec3660046130eb565b611d6b565b6103f96107ff3660046132dc565b611dbd565b6103f9612117565b6103f961081a366004613245565b612130565b60606003805461082e906133e3565b80601f016020809104026020016040519081016040528092919081815260200182805461085a906133e3565b80156108a75780601f1061087c576101008083540402835291602001916108a7565b820191906000526020600020905b81548152906001019060200180831161088a57829003601f168201915b5050505050905090565b60006108be338484612272565b5060015b92915050565b601a805462ff0000191662010000179055610914600260005260066020527f8819ef417987f8ae7a81f42cdfb18815282fe989326fbff903d13cf0e03ace29546001600160a01b031690565b6040517f15f7e05e0000000000000000000000000000000000000000000000000000000081526001600160a01b03838116600483015291909116906315f7e05e90602401600060405180830381600087803b15801561097257600080fd5b505af1158015610986573d6000803e3d6000fd5b5050601a805462ff000019169055505050565b6005546001600160a01b031633146109e65760405162461bcd60e51b8152602060048201819052602482015260008051602061349183398151915260448201526064015b60405180910390fd5b6001600160a01b03919091166000908152600c60205260409020805460ff1916911515919091179055565b6000610a1e8484846123ca565b6001600160a01b038416600090815260016020908152604080832033845290915290205482811015610ab85760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206160448201527f6c6c6f77616e636500000000000000000000000000000000000000000000000060648201526084016109dd565b610ac58533858403612272565b60019150505b9392505050565b600160005260066020527f3e5fec24aa4dc4e5aee2e025e51e1392c72a2500577559fae9665c6d52bd6a31546001600160a01b03166001600160a01b031663a8aa1b316040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610b4157600080fd5b505af1158015610b55573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b799190613054565b600e80546001600160a01b0319166001600160a01b0392831690811782556000908152600c60209081526040808320805460ff19908116600190811790925594549095168352600d909152902080549091169091179055565b6005546001600160a01b03163314610c1a5760405162461bcd60e51b8152602060048201819052602482015260008051602061349183398151915260448201526064016109dd565b806001600160a01b031663bb9b0e116040518163ffffffff1660e01b815260040160206040518083038186803b158015610c5357600080fd5b505afa158015610c67573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c8b9190613054565b6001600160a01b0316306001600160a01b031614610ceb5760405162461bcd60e51b815260206004820152601060248201527f506c7567696e206e6f742076616c69640000000000000000000000000000000060448201526064016109dd565b6040805160608101825260ff8481168083526001600160a01b03858116602080860182815242878901908152600086815260078452899020975188549251909516610100027fffffffffffffffffffffff0000000000000000000000000000000000000000009092169490961693909317929092178555925160019094019390935592519081527ff3e44d72134edbcfa291935b844c19d17f2d07d32e815e603f8541308e1b633c910160405180910390a25050565b6005546001600160a01b03163314610de95760405162461bcd60e51b8152602060048201819052602482015260008051602061349183398151915260448201526064016109dd565b62015180811015610e3c5760405162461bcd60e51b815260206004820152600f60248201527f44656c617920746f6f20736d616c6c000000000000000000000000000000000060448201526064016109dd565b600981905542600a556040518181527f881ed576bf5a6166a3eeb00d5e829eca45e717f655ca310912f35b6e438edb3c9060200160405180910390a150565b601a805462ff00001916620100001790556000610ec9600260005260066020527f8819ef417987f8ae7a81f42cdfb18815282fe989326fbff903d13cf0e03ace29546001600160a01b031690565b6040517f33f70a8c00000000000000000000000000000000000000000000000000000000815260048101859052602481018490526001600160a01b0391909116906333f70a8c90604401602060405180830381600087803b158015610f2d57600080fd5b505af1925050508015610f5d575060408051601f3d908101601f19168201909252610f5a9181019061325e565b60015b610fd2573d808015610f8b576040519150601f19603f3d011682016040523d82523d6000602084013e610f90565b606091505b507fb6733484919fe51c0ceef702fe2fbf8eb8fb1f594e8013d8e47055c55629938081604051610fc09190613360565b60405180910390a160009150506108c2565b601a805462ff00001916905590506108c2565b6005546001600160a01b0316331461102d5760405162461bcd60e51b8152602060048201819052602482015260008051602061349183398151915260448201526064016109dd565b60005b825181101561106f5761105d83828151811061104e5761104e61344f565b60200260200101516000612587565b806110678161341e565b915050611030565b508015611081576017805460ff191690555b5050565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916108be9185906110bc908690613373565b612272565b6110cb338261273b565b50565b6005546001600160a01b031633146111165760405162461bcd60e51b8152602060048201819052602482015260008051602061349183398151915260448201526064016109dd565b6001600160a01b03919091166000908152600b60205260409020805460ff1916911515919091179055565b6005546001600160a01b031633146111895760405162461bcd60e51b8152602060048201819052602482015260008051602061349183398151915260448201526064016109dd565b60ff82166000908152600660205260409020546001600160a01b0316156111f25760405162461bcd60e51b815260206004820152601460248201527f506c7567696e20616c726561647920736574757000000000000000000000000060448201526064016109dd565b806001600160a01b031663bb9b0e116040518163ffffffff1660e01b815260040160206040518083038186803b15801561122b57600080fd5b505afa15801561123f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112639190613054565b6001600160a01b0316306001600160a01b0316146112c35760405162461bcd60e51b815260206004820152601060248201527f506c7567696e206e6f742076616c69640000000000000000000000000000000060448201526064016109dd565b60ff8216600090815260066020526040812080546001600160a01b0319166001600160a01b0384161790556110819083906128c0565b6005546001600160a01b031633146113415760405162461bcd60e51b8152602060048201819052602482015260008051602061349183398151915260448201526064016109dd565b61134b6000612968565b565b6005546001600160a01b031633146113955760405162461bcd60e51b8152602060048201819052602482015260008051602061349183398151915260448201526064016109dd565b620b71b081106113a457600080fd5b601855565b60006113b58333610756565b90508181101561142c5760405162461bcd60e51b8152602060048201526024808201527f45524332303a206275726e20616d6f756e74206578636565647320616c6c6f7760448201527f616e63650000000000000000000000000000000000000000000000000000000060648201526084016109dd565b6114398333848403612272565b611443838361273b565b505050565b6000811561145857505060155490565b505060145490565b919050565b6005546001600160a01b031633146114ad5760405162461bcd60e51b8152602060048201819052602482015260008051602061349183398151915260448201526064016109dd565b6127106114c6846114c087818b8b6129ba565b906129ba565b146115135760405162461bcd60e51b815260206004820152600e60248201527f496e636f7272656374206665657300000000000000000000000000000000000060448201526064016109dd565b60108690556011859055601284905560138390556014829055601581905561153e61271060056129c6565b6014541061154b57600080fd5b61155861271060056129c6565b6015541061156557600080fd5b505050505050565b6005546001600160a01b031633146115b55760405162461bcd60e51b8152602060048201819052602482015260008051602061349183398151915260448201526064016109dd565b6009546116045760405162461bcd60e51b815260206004820152601560248201527f5468657265206973206e6f2063616e646964617465000000000000000000000060448201526064016109dd565b4261161c600854600a546129ba90919063ffffffff16565b106116695760405162461bcd60e51b815260206004820152601460248201527f44656c617920686173206e6f742070617373656400000000000000000000000060448201526064016109dd565b7fe2f8f6f8cfd1eb62b24aebcd6545714702eae4a2437111f497e023ae295cfe0e60095460405161169c91815260200190565b60405180910390a16009805460085564012a05f200600a5560009055565b60606004805461082e906133e3565b3360009081526001602090815260408083206001600160a01b0386168452909152812054828110156117635760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f00000000000000000000000000000000000000000000000000000060648201526084016109dd565b6117703385858403612272565b5060019392505050565b60006108be3384846123ca565b6005546001600160a01b031633146117cf5760405162461bcd60e51b8152602060048201819052602482015260008051602061349183398151915260448201526064016109dd565b6000821180156117df5750600081115b80156117ed57506127108111155b6117f657600080fd5b808261180160025490565b61180b91906133ad565b611815919061338b565b6016555050565b60175460ff16156118955760405162461bcd60e51b815260206004820152602260248201527f4e65656420746f2075706461746520686f6c6465727320746f2073776170626160448201527f636b00000000000000000000000000000000000000000000000000000000000060648201526084016109dd565b8061189d5750565b601a805461ff0019166101001790556010546000906118cb90612710906118c59085906129d2565b906129c6565b905060006118ea6127106118c5601254866129d290919063ffffffff16565b905060006119096127106118c5601354876129d290919063ffffffff16565b905060006119238261191d858189896129de565b906129de565b90508315611a3157600160005260066020527f3e5fec24aa4dc4e5aee2e025e51e1392c72a2500577559fae9665c6d52bd6a31546040517f51c6590a000000000000000000000000000000000000000000000000000000008152600481018690526001600160a01b03909116906351c6590a90602401600060405180830381600087803b1580156119b357600080fd5b505af19250505080156119c4575060015b611a31573d8080156119f2576040519150601f19603f3d011682016040523d82523d6000602084013e6119f7565b606091505b507fb6733484919fe51c0ceef702fe2fbf8eb8fb1f594e8013d8e47055c55629938081604051611a279190613360565b60405180910390a1505b8215611a4f57600f54611a4f9030906001600160a01b0316856123ca565b8115611a5f57611a5f308361273b565b8015611b6b57600260005260066020527f8819ef417987f8ae7a81f42cdfb18815282fe989326fbff903d13cf0e03ace29546040517fb6b55f25000000000000000000000000000000000000000000000000000000008152600481018390526001600160a01b039091169063b6b55f2590602401600060405180830381600087803b158015611aed57600080fd5b505af1925050508015611afe575060015b611b6b573d808015611b2c576040519150601f19603f3d011682016040523d82523d6000602084013e611b31565b606091505b507fb6733484919fe51c0ceef702fe2fbf8eb8fb1f594e8013d8e47055c55629938081604051611b619190613360565b60405180910390a1505b5050601a805461ff0019169055505050565b6005546001600160a01b03163314611bc55760405162461bcd60e51b8152602060048201819052602482015260008051602061349183398151915260448201526064016109dd565b600254811115611c175760405162461bcd60e51b815260206004820152601a60248201527f496e76616c6964206175746f73776170207468726573686f6c6400000000000060448201526064016109dd565b601955565b6005546001600160a01b03163314611c645760405162461bcd60e51b8152602060048201819052602482015260008051602061349183398151915260448201526064016109dd565b600f80546001600160a01b039092166001600160a01b0319909216821790556000908152600c60205260409020805460ff19166001179055565b6005546001600160a01b03163314611ce65760405162461bcd60e51b8152602060048201819052602482015260008051602061349183398151915260448201526064016109dd565b6001600160a01b038116611d625760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016109dd565b6110cb81612968565b6005546001600160a01b03163314611db35760405162461bcd60e51b8152602060048201819052602482015260008051602061349183398151915260448201526064016109dd565b6110818282612587565b6005546001600160a01b03163314611e055760405162461bcd60e51b8152602060048201819052602482015260008051602061349183398151915260448201526064016109dd565b60ff81166000908152600760205260409020805461010090046001600160a01b0316611e735760405162461bcd60e51b815260206004820152601560248201527f5468657265206973206e6f2063616e646964617465000000000000000000000060448201526064016109dd565b60095415611ee95760405162461bcd60e51b815260206004820152603360248201527f43616e6e6f74207570677261646520706c7567696e207768696c65206368616e60448201527f67696e6720617070726f76616c2064656c61790000000000000000000000000060648201526084016109dd565b42611f0360085483600101546129ba90919063ffffffff16565b10611f505760405162461bcd60e51b815260206004820152601460248201527f44656c617920686173206e6f742070617373656400000000000000000000000060448201526064016109dd565b80546040516101009091046001600160a01b0316815260ff8316907f278338c5ff3ee22e705a9ea3d286fe2b9f88068102ea404e42d45321d3226c179060200160405180910390a260ff82166000908152600660205260409020546001600160a01b0316156120a05760ff82166000908152600660205260408082205481517f09e137c300000000000000000000000000000000000000000000000000000000815291516001600160a01b03909116926309e137c3926004808201939182900301818387803b15801561202257600080fd5b505af1925050508015612033575060015b6120a0573d808015612061576040519150601f19603f3d011682016040523d82523d6000602084013e612066565b606091505b507fb6733484919fe51c0ceef702fe2fbf8eb8fb1f594e8013d8e47055c556299380816040516120969190613360565b60405180910390a1505b805460ff8316600090815260066020526040902080546101009092046001600160a01b03166001600160a01b031990921691909117905580547fffffffffffffffffffffff0000000000000000000000000000000000000000ff16815564012a05f2006001808301919091556110819083906128c0565b3060009081526020819052604090205461134b9061181c565b601a805462ff000019166201000017905561217c600260005260066020527f8819ef417987f8ae7a81f42cdfb18815282fe989326fbff903d13cf0e03ace29546001600160a01b031690565b6001600160a01b031663ffb2c479826040518263ffffffff1660e01b81526004016121a991815260200190565b602060405180830381600087803b1580156121c357600080fd5b505af19250505080156121f3575060408051601f3d908101601f191682019092526121f09181019061325e565b60015b612262573d808015612221576040519150601f19603f3d011682016040523d82523d6000602084013e612226565b606091505b507fb6733484919fe51c0ceef702fe2fbf8eb8fb1f594e8013d8e47055c556299380816040516122569190613360565b60405180910390a15050565b50601a805462ff00001916905550565b6001600160a01b0383166122ed5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f726573730000000000000000000000000000000000000000000000000000000060648201526084016109dd565b6001600160a01b0382166123695760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f737300000000000000000000000000000000000000000000000000000000000060648201526084016109dd565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b03831661242e5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016109dd565b6001600160a01b0382166124905760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016109dd565b80158061249f5750601a5460ff165b806124b15750601a54610100900460ff165b806124c45750601a5462010000900460ff165b156124dd576124d48383836129ea565b61144382612bd0565b6124e682612cb1565b156124f3576124f3612117565b601a805460ff19166001179055600e546001600160a01b03838116911614600061251d8585612d24565b6125275782612532565b612532828685612d6a565b905061253f8585836129ea565b601a805460ff1916905561255284612bd0565b61255c8585612dc0565b60185415158015612570575060175460ff16155b1561258057612580601854612130565b5050505050565b6001600160a01b03821630148015906125ae5750600e546001600160a01b03838116911614155b6125b757600080fd5b6001600160a01b0382166000908152600d6020526040902080548215801560ff1990921691909117909155601a805462ff000019166201000017905561269557600260005260066020527f8819ef417987f8ae7a81f42cdfb18815282fe989326fbff903d13cf0e03ace29546001600160a01b0316604051630a5b654b60e11b81526001600160a01b0384811660048301526000602483015291909116906314b6ca9690604401600060405180830381600087803b15801561267857600080fd5b505af115801561268c573d6000803e3d6000fd5b5050505061272b565b7f8819ef417987f8ae7a81f42cdfb18815282fe989326fbff903d13cf0e03ace29546001600160a01b03838116600081815260208190526040808220548151630a5b654b60e11b8152600481019490945260248401525192909316926314b6ca969260448084019382900301818387803b15801561271257600080fd5b505af1158015612726573d6000803e3d6000fd5b505050505b5050601a805462ff000019169055565b6001600160a01b0382166127b75760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f730000000000000000000000000000000000000000000000000000000000000060648201526084016109dd565b6001600160a01b038216600090815260208190526040902054818110156128465760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f636500000000000000000000000000000000000000000000000000000000000060648201526084016109dd565b6001600160a01b03831660009081526020819052604081208383039055600280548492906128759084906133cc565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b60ff82166000908152600660205260409020546001600160a01b03166128e93082600019612272565b6001600160a01b0381166000908152600b602090815260408083208054600160ff199182168117909255600c84528285208054821683179055600d909352922080549091168217905560ff8416141561294457611443610ad2565b60ff831660021415611443578115611443576017805460ff19166001179055505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000610acb8284613373565b6000610acb828461338b565b6000610acb82846133ad565b6000610acb82846133cc565b6001600160a01b038316612a4e5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016109dd565b6001600160a01b038216612ab05760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016109dd565b6001600160a01b03831660009081526020819052604090205481811015612b3f5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e6365000000000000000000000000000000000000000000000000000060648201526084016109dd565b6001600160a01b03808516600090815260208190526040808220858503905591851681529081208054849290612b76908490613373565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051612bc291815260200190565b60405180910390a350505050565b6001600160a01b0381166000908152600c602052604090205460ff1680612c045750600e546001600160a01b038281169116145b80612c1957506001600160a01b03811661dead145b15612c215750565b6016546001600160a01b03821660009081526020819052604090205411156110cb5760405162461bcd60e51b815260206004820152602560248201527f5472616e7366657220616d6f756e74206578636565647320746865206261672060448201527f73697a652e00000000000000000000000000000000000000000000000000000060648201526084016109dd565b600e546000906001600160a01b0316336001600160a01b031614158015612cdb5750601a5460ff16155b8015612ce957506000601954115b8015612d025750600e546001600160a01b038381169116145b80156108c2575060195430600090815260208190526040902054101592915050565b6001600160a01b0382166000908152600b602052604081205460ff16158015610acb5750506001600160a01b03166000908152600b602052604090205460ff1615919050565b600080612d7685611448565b905080612d865782915050610acb565b6000612710612d9583866133ad565b612d9f919061338b565b9050612dac8530836129ea565b612db681856133cc565b9695505050505050565b601a805462ff00001916620100001790556001600160a01b0382166000908152600d602052604090205460ff16612eec577f8819ef417987f8ae7a81f42cdfb18815282fe989326fbff903d13cf0e03ace29546001600160a01b03838116600081815260208190526040808220548151630a5b654b60e11b8152600481019490945260248401525192909316926314b6ca969260448084019382900301818387803b158015612e6e57600080fd5b505af1925050508015612e7f575060015b612eec573d808015612ead576040519150601f19603f3d011682016040523d82523d6000602084013e612eb2565b606091505b507fb6733484919fe51c0ceef702fe2fbf8eb8fb1f594e8013d8e47055c55629938081604051612ee29190613360565b60405180910390a1505b6001600160a01b0381166000908152600d602052604090205460ff1661272b577f8819ef417987f8ae7a81f42cdfb18815282fe989326fbff903d13cf0e03ace29546001600160a01b03828116600081815260208190526040808220548151630a5b654b60e11b8152600481019490945260248401525192909316926314b6ca969260448084019382900301818387803b158015612f8957600080fd5b505af1925050508015612f9a575060015b61272b573d808015612fc8576040519150601f19603f3d011682016040523d82523d6000602084013e612fcd565b606091505b507fb6733484919fe51c0ceef702fe2fbf8eb8fb1f594e8013d8e47055c55629938081604051612ffd9190613360565b60405180910390a15061272b565b80356114608161347b565b8035801515811461146057600080fd5b803560ff8116811461146057600080fd5b60006020828403121561304957600080fd5b8135610acb8161347b565b60006020828403121561306657600080fd5b8151610acb8161347b565b6000806040838503121561308457600080fd5b823561308f8161347b565b9150602083013561309f8161347b565b809150509250929050565b6000806000606084860312156130bf57600080fd5b83356130ca8161347b565b925060208401356130da8161347b565b929592945050506040919091013590565b600080604083850312156130fe57600080fd5b82356131098161347b565b915061311760208401613016565b90509250929050565b6000806040838503121561313357600080fd5b823561313e8161347b565b946020939093013593505050565b6000806040838503121561315f57600080fd5b823567ffffffffffffffff8082111561317757600080fd5b818501915085601f83011261318b57600080fd5b813560208282111561319f5761319f613465565b8160051b604051601f19603f830116810181811086821117156131c4576131c4613465565b604052838152828101945085830182870184018b10156131e357600080fd5b600096505b8487101561320d576131f98161300b565b8652600196909601959483019483016131e8565b50965061321d9050878201613016565b9450505050509250929050565b60006020828403121561323c57600080fd5b610acb82613016565b60006020828403121561325757600080fd5b5035919050565b60006020828403121561327057600080fd5b5051919050565b6000806040838503121561328a57600080fd5b50508035926020909101359150565b60008060008060008060c087890312156132b257600080fd5b505084359660208601359650604086013595606081013595506080810135945060a0013592509050565b6000602082840312156132ee57600080fd5b610acb82613026565b6000806040838503121561330a57600080fd5b61308f83613026565b6000815180845260005b818110156133395760208185018101518683018201520161331d565b8181111561334b576000602083870101525b50601f01601f19169290920160200192915050565b602081526000610acb6020830184613313565b6000821982111561338657613386613439565b500190565b6000826133a857634e487b7160e01b600052601260045260246000fd5b500490565b60008160001904831182151516156133c7576133c7613439565b500290565b6000828210156133de576133de613439565b500390565b600181811c908216806133f757607f821691505b6020821081141561341857634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561343257613432613439565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146110cb57600080fdfe4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a26469706673582212208abdfdd825a52a7ac13e23dccb0962595459b1127a0a02fcf1eb5bed8cf783f664736f6c634300080700330000000000000000000000000000000000000000000000000000000000003840

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

0000000000000000000000000000000000000000000000000000000000003840

-----Decoded View---------------
Arg [0] : _approvalDelay (uint256): 14400

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000003840


Deployed ByteCode Sourcemap

32746:11811:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33464:34;;;;;;;;;16122:25:1;;;16110:2;16095:18;33464:34:0;;;;;;;;6523:100;;;:::i;:::-;;;;;;;:::i;8690:169::-;;;;;;:::i;:::-;;:::i;:::-;;;7021:14:1;;7014:22;6996:41;;6984:2;6969:18;8690:169:0;6856:187:1;40292:180:0;;;;;;:::i;:::-;;:::i;:::-;;33505:46;;33546:5;33505:46;;7643:108;7731:12;;7643:108;;35765:158;;;;;;:::i;:::-;;:::i;9341:492::-;;;;;;:::i;:::-;;:::i;35142:174::-;;;:::i;30001:506::-;;;;;;:::i;:::-;;:::i;31590:318::-;;;;;;:::i;:::-;;:::i;7485:93::-;;;7568:2;16553:36:1;;16541:2;16526:18;7485:93:0;16411:184:1;39792:492:0;;;;;;:::i;:::-;;:::i;33425:32::-;;;;;;38260:350;;;;;;:::i;:::-;;:::i;10242:215::-;;;;;;:::i;:::-;;:::i;32858:43::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;16981:91;;;;;;:::i;:::-;;:::i;32966:48::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;33243:41;;;;;;35475:119;;;;;;:::i;:::-;;:::i;29576:417::-;;;;;;:::i;:::-;;:::i;33291:42::-;;;;;;7814:127;;;;;;:::i;:::-;-1:-1:-1;;;;;7915:18:0;7888:7;7915:18;;;;;;;;;;;;7814:127;19421:94;;;:::i;35324:143::-;;;;;;:::i;:::-;;:::i;17391:368::-;;;;;;:::i;:::-;;:::i;42756:194::-;;;;;;:::i;:::-;;:::i;29014:57::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;29014:57:0;;;;;;;;16828:4:1;16816:17;;;16798:36;;-1:-1:-1;;;;;16870:55:1;;;16865:2;16850:18;;16843:83;16942:18;;;16935:34;16786:2;16771:18;29014:57:0;16600:375:1;38618:898:0;;;;;;:::i;:::-;;:::i;31916:470::-;;;:::i;18770:87::-;18843:6;;-1:-1:-1;;;;;18843:6:0;18770:87;;;-1:-1:-1;;;;;6177:55:1;;;6159:74;;6147:2;6132:18;18770:87:0;6013:226:1;33560:28:0;;;;;;6742:104;;;:::i;10960:413::-;;;;;;:::i;:::-;;:::i;33171:19::-;;;;;-1:-1:-1;;;;;33171:19:0;;;8154:175;;;;;;:::i;:::-;;:::i;35931:240::-;;;;;;:::i;:::-;;:::i;36794:1458::-;;;;;;:::i;:::-;;:::i;29115:36::-;;;;;;29158:40;;;;;;32460:163;;;;;;:::i;:::-;32596:19;;32541:21;32596:19;;;:8;:19;;;;;;-1:-1:-1;;;;;32596:19:0;;32460:163;33597:47;;;;;;;;;32908:51;;;;;;:::i;:::-;;;;;;;;;;;;;;;;36179:279;;;;;;:::i;:::-;;:::i;33340:38::-;;;;;;8392:151;;;;;;:::i;:::-;-1:-1:-1;;;;;8508:18:0;;;8481:7;8508:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;8392:151;33704:37;;;;;;29080:28;;;;;;33199:35;;;;;-1:-1:-1;;;;;33199:35:0;;;36466:229;;;;;;:::i;:::-;;:::i;19670:192::-;;;;;;:::i;:::-;;:::i;33791:36::-;;;;;;33385:33;;;;;;35602:155;;;;;;:::i;:::-;;:::i;30515:1067::-;;;;;;:::i;:::-;;:::i;36703:83::-;;;:::i;39524:260::-;;;;;;:::i;:::-;;:::i;6523:100::-;6577:13;6610:5;6603:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6523:100;:::o;8690:169::-;8773:4;8790:39;4310:10;8813:7;8822:6;8790:8;:39::i;:::-;-1:-1:-1;8847:4:0;8690:169;;;;;:::o;40292:180::-;40356:12;:19;;-1:-1:-1;;40356:19:0;;;;;40386:20;28894:1;43231:28;32596:19;:8;:19;;;;-1:-1:-1;;;;;32596:19:0;;43152:194;40386:20;:47;;;;;-1:-1:-1;;;;;6177:55:1;;;40386:47:0;;;6159:74:1;40386:34:0;;;;;;;6132:18:1;;40386:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;40444:12:0;:20;;-1:-1:-1;;40444:20:0;;;-1:-1:-1;;;40292:180:0:o;35765:158::-;18843:6;;-1:-1:-1;;;;;18843:6:0;4310:10;18990:23;18982:68;;;;-1:-1:-1;;;18982:68:0;;11974:2:1;18982:68:0;;;11956:21:1;;;11993:18;;;11986:30;-1:-1:-1;;;;;;;;;;;12032:18:1;;;12025:62;12104:18;;18982:68:0;;;;;;;;;-1:-1:-1;;;;;35879:27:0;;;::::1;;::::0;;;:19:::1;:27;::::0;;;;:36;;-1:-1:-1;;35879:36:0::1;::::0;::::1;;::::0;;;::::1;::::0;;35765:158::o;9341:492::-;9481:4;9498:36;9508:6;9516:9;9527:6;9498:9;:36::i;:::-;-1:-1:-1;;;;;9574:19:0;;9547:24;9574:19;;;:11;:19;;;;;;;;4310:10;9574:33;;;;;;;;9626:26;;;;9618:79;;;;-1:-1:-1;;;9618:79:0;;11565:2:1;9618:79:0;;;11547:21:1;11604:2;11584:18;;;11577:30;11643:34;11623:18;;;11616:62;11714:10;11694:18;;;11687:38;11742:19;;9618:79:0;11363:404:1;9618:79:0;9733:57;9742:6;4310:10;9783:6;9764:16;:25;9733:8;:57::i;:::-;9821:4;9814:11;;;9341:492;;;;;;:::o;35142:174::-;28838:1;43035:26;32596:19;:8;:19;;;;-1:-1:-1;;;;;32596:19:0;-1:-1:-1;;;;;35200:23:0;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35193:4;:32;;-1:-1:-1;;;;;;35193:32:0;-1:-1:-1;;;;;35193:32:0;;;;;;;;-1:-1:-1;35236:25:0;;;:19;:25;;;;;;;;:32;;-1:-1:-1;;35236:32:0;;;-1:-1:-1;35236:32:0;;;;;;35296:4;;;;;35279:22;;:16;:22;;;;;:29;;;;;;;;;;35142:174::o;30001:506::-;18843:6;;-1:-1:-1;;;;;18843:6:0;4310:10;18990:23;18982:68;;;;-1:-1:-1;;;18982:68:0;;11974:2:1;18982:68:0;;;11956:21:1;;;11993:18;;;11986:30;-1:-1:-1;;;;;;;;;;;12032:18:1;;;12025:62;12104:18;;18982:68:0;11772:356:1;18982:68:0;30169:15:::1;-1:-1:-1::0;;;;;30158:38:0::1;;:40;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;30141:57:0::1;30149:4;-1:-1:-1::0;;;;;30141:57:0::1;;30119:123;;;::::0;-1:-1:-1;;;30119:123:0;;15007:2:1;30119:123:0::1;::::0;::::1;14989:21:1::0;15046:2;15026:18;;;15019:30;15085:18;15065;;;15058:46;15121:18;;30119:123:0::1;14805:340:1::0;30119:123:0::1;30283:152;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;;::::1;::::0;;;-1:-1:-1;;;;;30283:152:0;;::::1;;::::0;;::::1;::::0;;;30408:15:::1;30283:152:::0;;;;;;-1:-1:-1;30253:27:0;;;:16:::1;:27:::0;;;;;:182;;;;;;;;::::1;;;::::0;;;;;;;::::1;::::0;;;;;;;::::1;::::0;;;;-1:-1:-1;30253:182:0;;::::1;::::0;;;;30453:46;;6159:74:1;;;30453:46:0::1;::::0;6132:18:1;30453:46:0::1;;;;;;;30001:506:::0;;:::o;31590:318::-;18843:6;;-1:-1:-1;;;;;18843:6:0;4310:10;18990:23;18982:68;;;;-1:-1:-1;;;18982:68:0;;11974:2:1;18982:68:0;;;11956:21:1;;;11993:18;;;11986:30;-1:-1:-1;;;;;;;;;;;12032:18:1;;;12025:62;12104:18;;18982:68:0;11772:356:1;18982:68:0;28950:6:::1;31682:14;:36;;31674:64;;;::::0;-1:-1:-1;;;31674:64:0;;10818:2:1;31674:64:0::1;::::0;::::1;10800:21:1::0;10857:2;10837:18;;;10830:30;10896:17;10876:18;;;10869:45;10931:18;;31674:64:0::1;10616:339:1::0;31674:64:0::1;31749:21;:38:::0;;;31826:15:::1;31798:25;:43:::0;31859:41:::1;::::0;16122:25:1;;;31859:41:0::1;::::0;16110:2:1;16095:18;31859:41:0::1;;;;;;;31590:318:::0;:::o;39792:492::-;39929:12;:19;;-1:-1:-1;;39929:19:0;;;;;39889:22;39963:20;28894:1;43231:28;32596:19;:8;:19;;;;-1:-1:-1;;;;;32596:19:0;;43152:194;39963:20;:58;;;;;;;;16332:25:1;;;16373:18;;;16366:34;;;-1:-1:-1;;;;;39963:35:0;;;;;;;16305:18:1;;39963:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39963:58:0;;;;;;;;-1:-1:-1;;39963:58:0;;;;;;;;;;;;:::i;:::-;;;39959:318;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40213:29;40235:6;40213:29;;;;;;:::i;:::-;;;;;;;;40264:1;40257:8;;;;;39959:318;40095:12;:20;;-1:-1:-1;;40095:20:0;;;40137:15;-1:-1:-1;40130:22:0;;38260:350;18843:6;;-1:-1:-1;;;;;18843:6:0;4310:10;18990:23;18982:68;;;;-1:-1:-1;;;18982:68:0;;11974:2:1;18982:68:0;;;11956:21:1;;;11993:18;;;11986:30;-1:-1:-1;;;;;;;;;;;12032:18:1;;;12025:62;12104:18;;18982:68:0;11772:356:1;18982:68:0;38403:9:::1;38398:111;38422:7;:14;38418:1;:18;38398:111;;;38458:39;38479:7;38487:1;38479:10;;;;;;;;:::i;:::-;;;;;;;38491:5;38458:20;:39::i;:::-;38438:3:::0;::::1;::::0;::::1;:::i;:::-;;;;38398:111;;;;38523:16;38519:84;;;38556:27;:35:::0;;-1:-1:-1;;38556:35:0::1;::::0;;38519:84:::1;38260:350:::0;;:::o;10242:215::-;4310:10;10330:4;10379:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;10379:34:0;;;;;;;;;;10330:4;;10347:80;;10370:7;;10379:47;;10416:10;;10379:47;:::i;:::-;10347:8;:80::i;16981:91::-;17037:27;4310:10;17057:6;17037:5;:27::i;:::-;16981:91;:::o;35475:119::-;18843:6;;-1:-1:-1;;;;;18843:6:0;4310:10;18990:23;18982:68;;;;-1:-1:-1;;;18982:68:0;;11974:2:1;18982:68:0;;;11956:21:1;;;11993:18;;;11986:30;-1:-1:-1;;;;;;;;;;;12032:18:1;;;12025:62;12104:18;;18982:68:0;11772:356:1;18982:68:0;-1:-1:-1;;;;;35558:19:0;;;::::1;;::::0;;;:11:::1;:19;::::0;;;;:28;;-1:-1:-1;;35558:28:0::1;::::0;::::1;;::::0;;;::::1;::::0;;35475:119::o;29576:417::-;18843:6;;-1:-1:-1;;;;;18843:6:0;4310:10;18990:23;18982:68;;;;-1:-1:-1;;;18982:68:0;;11974:2:1;18982:68:0;;;11956:21:1;;;11993:18;;;11986:30;-1:-1:-1;;;;;;;;;;;12032:18:1;;;12025:62;12104:18;;18982:68:0;11772:356:1;18982:68:0;29700:19:::1;::::0;::::1;29731:1;29700:19:::0;;;:8:::1;:19;::::0;;;;;-1:-1:-1;;;;;29700:19:0::1;:33:::0;29692:66:::1;;;::::0;-1:-1:-1;;;29692:66:0;;14658:2:1;29692:66:0::1;::::0;::::1;14640:21:1::0;14697:2;14677:18;;;14670:30;14736:22;14716:18;;;14709:50;14776:18;;29692:66:0::1;14456:344:1::0;29692:66:0::1;29819:15;-1:-1:-1::0;;;;;29808:38:0::1;;:40;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;29791:57:0::1;29799:4;-1:-1:-1::0;;;;;29791:57:0::1;;29769:123;;;::::0;-1:-1:-1;;;29769:123:0;;15007:2:1;29769:123:0::1;::::0;::::1;14989:21:1::0;15046:2;15026:18;;;15019:30;15085:18;15065;;;15058:46;15121:18;;29769:123:0::1;14805:340:1::0;29769:123:0::1;29903:19;::::0;::::1;;::::0;;;:8:::1;:19;::::0;;;;:37;;-1:-1:-1;;;;;;29903:37:0::1;-1:-1:-1::0;;;;;29903:37:0;::::1;;::::0;;29951:34:::1;::::0;29903:19;;29951:16:::1;:34::i;19421:94::-:0;18843:6;;-1:-1:-1;;;;;18843:6:0;4310:10;18990:23;18982:68;;;;-1:-1:-1;;;18982:68:0;;11974:2:1;18982:68:0;;;11956:21:1;;;11993:18;;;11986:30;-1:-1:-1;;;;;;;;;;;12032:18:1;;;12025:62;12104:18;;18982:68:0;11772:356:1;18982:68:0;19486:21:::1;19504:1;19486:9;:21::i;:::-;19421:94::o:0;35324:143::-;18843:6;;-1:-1:-1;;;;;18843:6:0;4310:10;18990:23;18982:68;;;;-1:-1:-1;;;18982:68:0;;11974:2:1;18982:68:0;;;11956:21:1;;;11993:18;;;11986:30;-1:-1:-1;;;;;;;;;;;12032:18:1;;;12025:62;12104:18;;18982:68:0;11772:356:1;18982:68:0;35417:6:::1;35411:3;:12;35403:21;;;::::0;::::1;;35435:18;:24:::0;35324:143::o;17391:368::-;17468:24;17495:32;17505:7;4310:10;8392:151;:::i;17495:32::-;17468:59;;17566:6;17546:16;:26;;17538:75;;;;-1:-1:-1;;;17538:75:0;;12335:2:1;17538:75:0;;;12317:21:1;12374:2;12354:18;;;12347:30;12413:34;12393:18;;;12386:62;12484:6;12464:18;;;12457:34;12508:19;;17538:75:0;12133:400:1;17538:75:0;17649:58;17658:7;4310:10;17700:6;17681:16;:25;17649:8;:58::i;:::-;17729:22;17735:7;17744:6;17729:5;:22::i;:::-;17457:302;17391:368;;:::o;42756:194::-;42813:7;42837;42833:110;;;-1:-1:-1;;42868:12:0;;;42756:194::o;42833:110::-;-1:-1:-1;;42920:11:0;;;42756:194::o;42833:110::-;42756:194;;;:::o;38618:898::-;18843:6;;-1:-1:-1;;;;;18843:6:0;4310:10;18990:23;18982:68;;;;-1:-1:-1;;;18982:68:0;;11974:2:1;18982:68:0;;;11956:21:1;;;11993:18;;;11986:30;-1:-1:-1;;;;;;;;;;;12032:18:1;;;12025:62;12104:18;;18982:68:0;11772:356:1;18982:68:0;33546:5:::1;38909:148;39041:15:::0;38909:109:::1;38997:20:::0;38909:109;:20;38952:21;38909:42:::1;:65::i;:::-;:87:::0;::::1;:109::i;:148::-;:166;38887:230;;;::::0;-1:-1:-1;;;38887:230:0;;10475:2:1;38887:230:0::1;::::0;::::1;10457:21:1::0;10514:2;10494:18;;;10487:30;10553:16;10533:18;;;10526:44;10587:18;;38887:230:0::1;10273:338:1::0;38887:230:0::1;39128:19;:42:::0;;;39181:20:::1;:44:::0;;;39236:19:::1;:42:::0;;;39289:14:::1;:32:::0;;;39332:11:::1;:26:::0;;;39369:12:::1;:28:::0;;;39430:21:::1;33546:5;39449:1;39430:18;:21::i;:::-;39416:11;;:35;39408:44;;;::::0;::::1;;39486:21;33546:5;39505:1;39486:18;:21::i;:::-;39471:12;;:36;39463:45;;;::::0;::::1;;38618:898:::0;;;;;;:::o;31916:470::-;18843:6;;-1:-1:-1;;;;;18843:6:0;4310:10;18990:23;18982:68;;;;-1:-1:-1;;;18982:68:0;;11974:2:1;18982:68:0;;;11956:21:1;;;11993:18;;;11986:30;-1:-1:-1;;;;;;;;;;;12032:18:1;;;12025:62;12104:18;;18982:68:0;11772:356:1;18982:68:0;31986:21:::1;::::0;31978:60:::1;;;::::0;-1:-1:-1;;;31978:60:0;;13548:2:1;31978:60:0::1;::::0;::::1;13530:21:1::0;13587:2;13567:18;;;13560:30;13626:23;13606:18;;;13599:51;13667:18;;31978:60:0::1;13346:345:1::0;31978:60:0::1;32118:15;32071:44;32101:13;;32071:25;;:29;;:44;;;;:::i;:::-;:62;32049:132;;;::::0;-1:-1:-1;;;32049:132:0;;10126:2:1;32049:132:0::1;::::0;::::1;10108:21:1::0;10165:2;10145:18;;;10138:30;10204:22;10184:18;;;10177:50;10244:18;;32049:132:0::1;9924:344:1::0;32049:132:0::1;32199:44;32221:21;;32199:44;;;;16122:25:1::0;;16110:2;16095:18;;15976:177;32199:44:0::1;;;;;;;;32272:21;::::0;;32256:13:::1;:37:::0;32332:10:::1;32304:25;:38:::0;-1:-1:-1;32353:25:0;;31916:470::o;6742:104::-;6798:13;6831:7;6824:14;;;;;:::i;10960:413::-;4310:10;11053:4;11097:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;11097:34:0;;;;;;;;;;11150:35;;;;11142:85;;;;-1:-1:-1;;;11142:85:0;;15352:2:1;11142:85:0;;;15334:21:1;15391:2;15371:18;;;15364:30;15430:34;15410:18;;;15403:62;15501:7;15481:18;;;15474:35;15526:19;;11142:85:0;15150:401:1;11142:85:0;11263:67;4310:10;11286:7;11314:15;11295:16;:34;11263:8;:67::i;:::-;-1:-1:-1;11361:4:0;;10960:413;-1:-1:-1;;;10960:413:0:o;8154:175::-;8240:4;8257:42;4310:10;8281:9;8292:6;8257:9;:42::i;35931:240::-;18843:6;;-1:-1:-1;;;;;18843:6:0;4310:10;18990:23;18982:68;;;;-1:-1:-1;;;18982:68:0;;11974:2:1;18982:68:0;;;11956:21:1;;;11993:18;;;11986:30;-1:-1:-1;;;;;;;;;;;12032:18:1;;;12025:62;12104:18;;18982:68:0;11772:356:1;18982:68:0;36062:1:::1;36050:9;:13;:28;;;;;36077:1;36067:7;:11;36050:28;:48;;;;;36093:5;36082:7;:16;;36050:48;36042:57;;;::::0;::::1;;36156:7;36143:9;36127:13;7731:12:::0;;;7643:108;36127:13:::1;:25;;;;:::i;:::-;36126:37;;;;:::i;:::-;36110:13;:53:::0;-1:-1:-1;;35931:240:0:o;36794:1458::-;36869:27;;;;36868:28;36846:112;;;;-1:-1:-1;;;36846:112:0;;11162:2:1;36846:112:0;;;11144:21:1;11201:2;11181:18;;;11174:30;11240:34;11220:18;;;11213:62;11311:4;11291:18;;;11284:32;11333:19;;36846:112:0;10960:398:1;36846:112:0;36973:11;36969:50;;36794:1458;:::o;36969:50::-;37029:14;:21;;-1:-1:-1;;37029:21:0;;;;;37100:19;;37029:21;;37089:75;;33546:5;;37089:31;;:6;;:10;:31::i;:::-;:35;;:75::i;:::-;37063:101;;37175:25;37203:75;33546:5;37203:31;37214:19;;37203:6;:10;;:31;;;;:::i;:75::-;37175:103;;37289:20;37312:46;33546:5;37312:26;37323:14;;37312:6;:10;;:26;;;;:::i;:46::-;37289:69;-1:-1:-1;37369:20:0;37392:110;37289:69;37392:78;37452:17;37392:78;:6;37417:15;37392:24;:41::i;:::-;:59;;:78::i;:110::-;37369:133;-1:-1:-1;37519:19:0;;37515:236;;28838:1;43035:26;32596:19;:8;:19;;;;37559:48;;;;;;;;16122:25:1;;;-1:-1:-1;;;;;32596:19:0;;;;37559:31;;16095:18:1;;37559:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37555:185;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37695:29;37717:6;37695:29;;;;;;:::i;:::-;;;;;;;;37611:129;37555:185;37765:21;;37761:119;;37828:20;;37803:65;;37821:4;;-1:-1:-1;;;;;37828:20:0;37850:17;37803:9;:65::i;:::-;37894:16;;37890:83;;37927:34;37941:4;37948:12;37927:5;:34::i;:::-;37987:16;;37983:227;;28894:1;43231:28;32596:19;:8;:19;;;;38024:42;;;;;;;;16122:25:1;;;-1:-1:-1;;;;;32596:19:0;;;;38024:28;;16095:18:1;;38024:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38020:179;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38154:29;38176:6;38154:29;;;;;;:::i;:::-;;;;;;;;38070:129;38020:179;-1:-1:-1;;38222:14:0;:22;;-1:-1:-1;;38222:22:0;;;-1:-1:-1;;;36794:1458:0:o;36179:279::-;18843:6;;-1:-1:-1;;;;;18843:6:0;4310:10;18990:23;18982:68;;;;-1:-1:-1;;;18982:68:0;;11974:2:1;18982:68:0;;;11956:21:1;;;11993:18;;;11986:30;-1:-1:-1;;;;;;;;;;;12032:18:1;;;12025:62;12104:18;;18982:68:0;11772:356:1;18982:68:0;7731:12;;36312:18:::1;:35;;36290:111;;;::::0;-1:-1:-1;;;36290:111:0;;13898:2:1;36290:111:0::1;::::0;::::1;13880:21:1::0;13937:2;13917:18;;;13910:30;13976:28;13956:18;;;13949:56;14022:18;;36290:111:0::1;13696:350:1::0;36290:111:0::1;36412:17;:38:::0;36179:279::o;36466:229::-;18843:6;;-1:-1:-1;;;;;18843:6:0;4310:10;18990:23;18982:68;;;;-1:-1:-1;;;18982:68:0;;11974:2:1;18982:68:0;;;11956:21:1;;;11993:18;;;11986:30;-1:-1:-1;;;;;;;;;;;12032:18:1;;;12025:62;12104:18;;18982:68:0;11772:356:1;18982:68:0;36583:20:::1;:44:::0;;-1:-1:-1;;;;;36583:44:0;;::::1;-1:-1:-1::0;;;;;;36583:44:0;;::::1;::::0;::::1;::::0;;:20:::1;36638:42:::0;;;:19:::1;:42;::::0;;;;:49;;-1:-1:-1;;36638:49:0::1;36583:44:::0;36638:49:::1;::::0;;36466:229::o;19670:192::-;18843:6;;-1:-1:-1;;;;;18843:6:0;4310:10;18990:23;18982:68;;;;-1:-1:-1;;;18982:68:0;;11974:2:1;18982:68:0;;;11956:21:1;;;11993:18;;;11986:30;-1:-1:-1;;;;;;;;;;;12032:18:1;;;12025:62;12104:18;;18982:68:0;11772:356:1;18982:68:0;-1:-1:-1;;;;;19759:22:0;::::1;19751:73;;;::::0;-1:-1:-1;;;19751:73:0;;8909:2:1;19751:73:0::1;::::0;::::1;8891:21:1::0;8948:2;8928:18;;;8921:30;8987:34;8967:18;;;8960:62;9058:8;9038:18;;;9031:36;9084:19;;19751:73:0::1;8707:402:1::0;19751:73:0::1;19835:19;19845:8;19835:9;:19::i;35602:155::-:0;18843:6;;-1:-1:-1;;;;;18843:6:0;4310:10;18990:23;18982:68;;;;-1:-1:-1;;;18982:68:0;;11974:2:1;18982:68:0;;;11956:21:1;;;11993:18;;;11986:30;-1:-1:-1;;;;;;;;;;;12032:18:1;;;12025:62;12104:18;;18982:68:0;11772:356:1;18982:68:0;35713:36:::1;35734:6;35742;35713:20;:36::i;30515:1067::-:0;18843:6;;-1:-1:-1;;;;;18843:6:0;4310:10;18990:23;18982:68;;;;-1:-1:-1;;;18982:68:0;;11974:2:1;18982:68:0;;;11956:21:1;;;11993:18;;;11986:30;-1:-1:-1;;;;;;;;;;;12032:18:1;;;12025:62;12104:18;;18982:68:0;11772:356:1;18982:68:0;30621:27:::1;::::0;::::1;30585:33;30621:27:::0;;;:16:::1;:27;::::0;;;;30683:24;;::::1;::::0;::::1;-1:-1:-1::0;;;;;30683:24:0::1;30661:109;;;::::0;-1:-1:-1;;;30661:109:0;;13548:2:1;30661:109:0::1;::::0;::::1;13530:21:1::0;13587:2;13567:18;;;13560:30;13626:23;13606:18;;;13599:51;13667:18;;30661:109:0::1;13346:345:1::0;30661:109:0::1;30803:21;::::0;:26;30781:127:::1;;;::::0;-1:-1:-1;;;30781:127:0;;15758:2:1;30781:127:0::1;::::0;::::1;15740:21:1::0;15797:2;15777:18;;;15770:30;15836:34;15816:18;;;15809:62;15907:21;15887:18;;;15880:49;15946:19;;30781:127:0::1;15556:415:1::0;30781:127:0::1;30985:15;30941:41;30968:13;;30941:9;:22;;;:26;;:41;;;;:::i;:::-;:59;30919:129;;;::::0;-1:-1:-1;;;30919:129:0;;10126:2:1;30919:129:0::1;::::0;::::1;10108:21:1::0;10165:2;10145:18;;;10138:30;10204:22;10184:18;;;10177:50;10244:18;;30919:129:0::1;9924:344:1::0;30919:129:0::1;31092:24:::0;;31066:51:::1;::::0;31092:24:::1;::::0;;::::1;-1:-1:-1::0;;;;;31092:24:0::1;6159:74:1::0;;31066:51:0::1;::::0;::::1;::::0;::::1;::::0;6147:2:1;6132:18;31066:51:0::1;;;;;;;31134:19;::::0;::::1;31165:1;31134:19:::0;;;:8:::1;:19;::::0;;;;;-1:-1:-1;;;;;31134:19:0::1;:33:::0;31130:248:::1;;31199:19;::::0;::::1;;::::0;;;:8:::1;:19;::::0;;;;;;31188:46;;;;;;;-1:-1:-1;;;;;31199:19:0;;::::1;::::0;31188:44:::1;::::0;:46:::1;::::0;;::::1;::::0;;;;;;;31199:19;;31188:46;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;;;;;31184:183;;;::::0;;;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31322:29;31344:6;31322:29;;;;;;:::i;:::-;;;;;;;;31238:129;31184:183;31410:24:::0;;31388:19:::1;::::0;::::1;31410:24;31388:19:::0;;;:8:::1;:19;::::0;;;;:46;;31410:24:::1;::::0;;::::1;-1:-1:-1::0;;;;;31410:24:0::1;-1:-1:-1::0;;;;;;31388:46:0;;::::1;::::0;;;::::1;::::0;;31445:37;;;::::1;::::0;;31518:10:::1;-1:-1:-1::0;31493:22:0;;::::1;:35:::0;;;;31541:33:::1;::::0;31388:19;;31541:16:::1;:33::i;36703:83::-:0;36771:4;7888:7;7915:18;;;;;;;;;;;36744:34;;36794:1458;:::i;39524:260::-;39572:12;:19;;-1:-1:-1;;39572:19:0;;;;;39606:20;28894:1;43231:28;32596:19;:8;:19;;;;-1:-1:-1;;;;;32596:19:0;;43152:194;39606:20;-1:-1:-1;;;;;39606:28:0;;39635:3;39606:33;;;;;;;;;;;;;16122:25:1;;16110:2;16095:18;;15976:177;39606:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39606:33:0;;;;;;;;-1:-1:-1;;39606:33:0;;;;;;;;;;;;:::i;:::-;;;39602:175;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39736:29;39758:6;39736:29;;;;;;:::i;:::-;;;;;;;;39688:89;16981:91;:::o;39602:175::-;-1:-1:-1;39655:12:0;:20;;-1:-1:-1;;39655:20:0;;;39524:260;:::o;14644:380::-;-1:-1:-1;;;;;14780:19:0;;14772:68;;;;-1:-1:-1;;;14772:68:0;;14253:2:1;14772:68:0;;;14235:21:1;14292:2;14272:18;;;14265:30;14331:34;14311:18;;;14304:62;14402:6;14382:18;;;14375:34;14426:19;;14772:68:0;14051:400:1;14772:68:0;-1:-1:-1;;;;;14859:21:0;;14851:68;;;;-1:-1:-1;;;14851:68:0;;9316:2:1;14851:68:0;;;9298:21:1;9355:2;9335:18;;;9328:30;9394:34;9374:18;;;9367:62;9465:4;9445:18;;;9438:32;9487:19;;14851:68:0;9114:398:1;14851:68:0;-1:-1:-1;;;;;14932:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;14984:32;;16122:25:1;;;14984:32:0;;16095:18:1;14984:32:0;;;;;;;14644:380;;;:::o;40480:1024::-;-1:-1:-1;;;;;40612:18:0;;40604:68;;;;-1:-1:-1;;;40604:68:0;;13142:2:1;40604:68:0;;;13124:21:1;13181:2;13161:18;;;13154:30;13220:34;13200:18;;;13193:62;-1:-1:-1;;;13271:18:1;;;13264:35;13316:19;;40604:68:0;12940:401:1;40604:68:0;-1:-1:-1;;;;;40691:16:0;;40683:64;;;;-1:-1:-1;;;40683:64:0;;7696:2:1;40683:64:0;;;7678:21:1;7735:2;7715:18;;;7708:30;7774:34;7754:18;;;7747:62;-1:-1:-1;;;7825:18:1;;;7818:33;7868:19;;40683:64:0;7494:399:1;40683:64:0;40764:11;;;:25;;-1:-1:-1;40779:10:0;;;;40764:25;:43;;;-1:-1:-1;40793:14:0;;;;;;;40764:43;:59;;;-1:-1:-1;40811:12:0;;;;;;;40764:59;40760:182;;;40840:33;40856:4;40862:2;40866:6;40840:15;:33::i;:::-;40888:21;40906:2;40888:17;:21::i;40760:182::-;40958:19;40974:2;40958:15;:19::i;:::-;40954:65;;;40994:13;:11;:13::i;:::-;41031:10;:17;;-1:-1:-1;;41031:17:0;41044:4;41031:17;;;41084:4;;-1:-1:-1;;;;;41078:10:0;;;41084:4;;41078:10;41031;41126:24;41141:4;41078:2;41126:14;:24::i;:::-;:95;;41215:6;41126:95;;;41166:33;41175:9;41186:4;41192:6;41166:8;:33::i;:::-;41101:120;;41232:41;41248:4;41254:2;41258:14;41232:15;:41::i;:::-;41286:10;:18;;-1:-1:-1;;41286:18:0;;;41317:21;41335:2;41317:17;:21::i;:::-;41351:20;41362:4;41368:2;41351:10;:20::i;:::-;44524:18;;:22;;41388:53;;;;-1:-1:-1;41414:27:0;;;;41413:28;41388:53;41384:113;;;41458:27;41466:18;;41458:7;:27::i;:::-;40593:911;;40480:1024;;;:::o;44020:419::-;-1:-1:-1;;;;;44106:23:0;;44124:4;44106:23;;;;:41;;-1:-1:-1;44143:4:0;;-1:-1:-1;;;;;44133:14:0;;;44143:4;;44133:14;;44106:41;44098:50;;;;;;-1:-1:-1;;;;;44159:24:0;;;;;;:16;:24;;;;;:33;;;;;;-1:-1:-1;;44159:33:0;;;;;;;;;;44203:12;:19;;-1:-1:-1;;44203:19:0;;;;;44233:168;;28894:1;43231:28;32596:19;:8;:19;;;;-1:-1:-1;;;;;32596:19:0;44260:40;;-1:-1:-1;;;44260:40:0;;-1:-1:-1;;;;;6444:55:1;;;44260:40:0;;;6426:74:1;44298:1:0;6516:18:1;;;6509:34;44260:29:0;;;;;;;6399:18:1;;44260:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44233:168;;;32596:19;;-1:-1:-1;;;;;7915:18:0;;;43231:28;7915:18;;;32596:19;7915:18;;;;;;;;44333:56;;-1:-1:-1;;;44333:56:0;;;;;6426:74:1;;;;6516:18;;;6509:34;44333:56:0;32596:19;;;;;44333:29;;6399:18:1;;;;;44333:56:0;;;;;43231:28;32596:19;44333:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44233:168;-1:-1:-1;;44411:12:0;:20;;-1:-1:-1;;44411:20:0;;;44020:419::o;13615:591::-;-1:-1:-1;;;;;13699:21:0;;13691:67;;;;-1:-1:-1;;;13691:67:0;;12740:2:1;13691:67:0;;;12722:21:1;12779:2;12759:18;;;12752:30;12818:34;12798:18;;;12791:62;12889:3;12869:18;;;12862:31;12910:19;;13691:67:0;12538:397:1;13691:67:0;-1:-1:-1;;;;;13858:18:0;;13833:22;13858:18;;;;;;;;;;;13895:24;;;;13887:71;;;;-1:-1:-1;;;13887:71:0;;8506:2:1;13887:71:0;;;8488:21:1;8545:2;8525:18;;;8518:30;8584:34;8564:18;;;8557:62;8655:4;8635:18;;;8628:32;8677:19;;13887:71:0;8304:398:1;13887:71:0;-1:-1:-1;;;;;13994:18:0;;:9;:18;;;;;;;;;;14015:23;;;13994:44;;14060:12;:22;;14032:6;;13994:9;14060:22;;14032:6;;14060:22;:::i;:::-;;;;-1:-1:-1;;14100:37:0;;16122:25:1;;;14126:1:0;;-1:-1:-1;;;;;14100:37:0;;;;;16110:2:1;16095:18;14100:37:0;;;;;;;17457:302;17391:368;;:::o;34518:616::-;32596:19;;;34628:21;32596:19;;;:8;:19;;;;;;-1:-1:-1;;;;;32596:19:0;34679:57;34696:4;32596:19;-1:-1:-1;;34679:8:0;:57::i;:::-;-1:-1:-1;;;;;34747:26:0;;;;;;:11;:26;;;;;;;;:33;;34776:4;-1:-1:-1;;34747:33:0;;;;;;;;34791:19;:34;;;;;:41;;;;;;;;34843:16;:31;;;;;:38;;;;;;;;;34747:33;34898:31;;;34894:233;;;34946:14;:12;:14::i;34894:233::-;34982:33;;;28894:1;34982:33;34978:149;;;35036:9;35032:84;;;35066:27;:34;;-1:-1:-1;;35066:34:0;35096:4;35066:34;;;34617:517;34518:616;;:::o;19870:173::-;19945:6;;;-1:-1:-1;;;;;19962:17:0;;;-1:-1:-1;;;;;;19962:17:0;;;;;;;19995:40;;19945:6;;;19962:17;19945:6;;19995:40;;19926:16;;19995:40;19915:128;19870:173;:::o;22850:98::-;22908:7;22935:5;22939:1;22935;:5;:::i;23987:98::-;24045:7;24072:5;24076:1;24072;:5;:::i;23588:98::-;23646:7;23673:5;23677:1;23673;:5;:::i;23231:98::-;23289:7;23316:5;23320:1;23316;:5;:::i;11863:733::-;-1:-1:-1;;;;;12003:20:0;;11995:70;;;;-1:-1:-1;;;11995:70:0;;13142:2:1;11995:70:0;;;13124:21:1;13181:2;13161:18;;;13154:30;13220:34;13200:18;;;13193:62;-1:-1:-1;;;13271:18:1;;;13264:35;13316:19;;11995:70:0;12940:401:1;11995:70:0;-1:-1:-1;;;;;12084:23:0;;12076:71;;;;-1:-1:-1;;;12076:71:0;;7696:2:1;12076:71:0;;;7678:21:1;7735:2;7715:18;;;7708:30;7774:34;7754:18;;;7747:62;-1:-1:-1;;;7825:18:1;;;7818:33;7868:19;;12076:71:0;7494:399:1;12076:71:0;-1:-1:-1;;;;;12244:17:0;;12220:21;12244:17;;;;;;;;;;;12280:23;;;;12272:74;;;;-1:-1:-1;;;12272:74:0;;9719:2:1;12272:74:0;;;9701:21:1;9758:2;9738:18;;;9731:30;9797:34;9777:18;;;9770:62;9868:8;9848:18;;;9841:36;9894:19;;12272:74:0;9517:402:1;12272:74:0;-1:-1:-1;;;;;12382:17:0;;;:9;:17;;;;;;;;;;;12402:22;;;12382:42;;12446:20;;;;;;;;:30;;12418:6;;12382:9;12446:30;;12418:6;;12446:30;:::i;:::-;;;;;;;;12511:9;-1:-1:-1;;;;;12494:35:0;12503:6;-1:-1:-1;;;;;12494:35:0;;12522:6;12494:35;;;;16122:25:1;;16110:2;16095:18;;15976:177;12494:35:0;;;;;;;;11984:612;11863:733;;;:::o;43642:370::-;-1:-1:-1;;;;;43729:29:0;;;;;;:19;:29;;;;;;;;;:62;;-1:-1:-1;43787:4:0;;-1:-1:-1;;;;;43775:16:0;;;43787:4;;43775:16;43729:62;:95;;;-1:-1:-1;;;;;;43808:16:0;;33047:42;43808:16;43729:95;43711:158;;;43642:370;:::o;43711:158::-;43926:13;;-1:-1:-1;;;;;7915:18:0;;7888:7;7915:18;;;;;;;;;;;43903:36;;43881:123;;;;-1:-1:-1;;;43881:123:0;;8100:2:1;43881:123:0;;;8082:21:1;8139:2;8119:18;;;8112:30;8178:34;8158:18;;;8151:62;8249:7;8229:18;;;8222:35;8274:19;;43881:123:0;7898:401:1;43354:280:0;43467:4;;43414;;-1:-1:-1;;;;;43467:4:0;4310:10;-1:-1:-1;;;;;43451:20:0;;;:48;;;;-1:-1:-1;43489:10:0;;;;43488:11;43451:48;:86;;;;;43536:1;43516:17;;:21;43451:86;:113;;;;-1:-1:-1;43560:4:0;;-1:-1:-1;;;;;43554:10:0;;;43560:4;;43554:10;43451:113;:175;;;;-1:-1:-1;43609:17:0;;43599:4;7888:7;7915:18;;;;;;;;;;;43581:45;;43431:195;43354:280;-1:-1:-1;;43354:280:0:o;42145:175::-;-1:-1:-1;;;;;42275:17:0;;42245:4;42275:17;;;:11;:17;;;;;;;;42274:18;:38;;;;-1:-1:-1;;;;;;;42297:15:0;;;;;:11;:15;;;;;;;;42296:16;;42145:175;-1:-1:-1;42145:175:0:o;42328:420::-;42444:7;42464:16;42483:21;42496:7;42483:12;:21::i;:::-;42464:40;-1:-1:-1;42519:13:0;42515:59;;42556:6;42549:13;;;;;42515:59;42584:17;33546:5;42605:17;42614:8;42605:6;:17;:::i;:::-;42604:36;;;;:::i;:::-;42584:56;;42653:49;42669:6;42685:4;42692:9;42653:15;:49::i;:::-;42722:18;42731:9;42722:6;:18;:::i;:::-;42715:25;42328:420;-1:-1:-1;;;;;;42328:420:0:o;41512:625::-;41577:12;:19;;-1:-1:-1;;41577:19:0;;;;;-1:-1:-1;;;;;41612:22:0;;41577:19;41612:22;;;:16;:22;;;;;;41577:19;41612:22;41607:244;;32596:19;;-1:-1:-1;;;;;7915:18:0;;;43231:28;7915:18;;;32596:19;7915:18;;;;;;;;41655:52;;-1:-1:-1;;;41655:52:0;;;;;6426:74:1;;;;6516:18;;;6509:34;41655:52:0;32596:19;;;;;41655:29;;6399:18:1;;;;;41655:52:0;;;;;43231:28;32596:19;41655:52;;;;;;;;;;;;;;;;;;;;;;;;;41651:189;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41795:29;41817:6;41795:29;;;;;;:::i;:::-;;;;;;;;41711:129;41651:189;-1:-1:-1;;;;;41866:20:0;;;;;;:16;:20;;;;;;;;41861:238;;32596:19;;-1:-1:-1;;;;;7915:18:0;;;43231:28;7915:18;;;32596:19;7915:18;;;;;;;;41907:48;;-1:-1:-1;;;41907:48:0;;;;;6426:74:1;;;;6516:18;;;6509:34;41907:48:0;32596:19;;;;;41907:29;;6399:18:1;;;;;41907:48:0;;;;;43231:28;32596:19;41907:48;;;;;;;;;;;;;;;;;;;;;;;;;41903:185;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42043:29;42065:6;42043:29;;;;;;:::i;:::-;;;;;;;;41959:129;41903:185;;14:134:1;82:20;;111:31;82:20;111:31;:::i;153:160::-;218:20;;274:13;;267:21;257:32;;247:60;;303:1;300;293:12;318:156;384:20;;444:4;433:16;;423:27;;413:55;;464:1;461;454:12;479:247;538:6;591:2;579:9;570:7;566:23;562:32;559:52;;;607:1;604;597:12;559:52;646:9;633:23;665:31;690:5;665:31;:::i;731:251::-;801:6;854:2;842:9;833:7;829:23;825:32;822:52;;;870:1;867;860:12;822:52;902:9;896:16;921:31;946:5;921:31;:::i;987:388::-;1055:6;1063;1116:2;1104:9;1095:7;1091:23;1087:32;1084:52;;;1132:1;1129;1122:12;1084:52;1171:9;1158:23;1190:31;1215:5;1190:31;:::i;:::-;1240:5;-1:-1:-1;1297:2:1;1282:18;;1269:32;1310:33;1269:32;1310:33;:::i;:::-;1362:7;1352:17;;;987:388;;;;;:::o;1380:456::-;1457:6;1465;1473;1526:2;1514:9;1505:7;1501:23;1497:32;1494:52;;;1542:1;1539;1532:12;1494:52;1581:9;1568:23;1600:31;1625:5;1600:31;:::i;:::-;1650:5;-1:-1:-1;1707:2:1;1692:18;;1679:32;1720:33;1679:32;1720:33;:::i;:::-;1380:456;;1772:7;;-1:-1:-1;;;1826:2:1;1811:18;;;;1798:32;;1380:456::o;1841:315::-;1906:6;1914;1967:2;1955:9;1946:7;1942:23;1938:32;1935:52;;;1983:1;1980;1973:12;1935:52;2022:9;2009:23;2041:31;2066:5;2041:31;:::i;:::-;2091:5;-1:-1:-1;2115:35:1;2146:2;2131:18;;2115:35;:::i;:::-;2105:45;;1841:315;;;;;:::o;2161:::-;2229:6;2237;2290:2;2278:9;2269:7;2265:23;2261:32;2258:52;;;2306:1;2303;2296:12;2258:52;2345:9;2332:23;2364:31;2389:5;2364:31;:::i;:::-;2414:5;2466:2;2451:18;;;;2438:32;;-1:-1:-1;;;2161:315:1:o;2481:1202::-;2571:6;2579;2632:2;2620:9;2611:7;2607:23;2603:32;2600:52;;;2648:1;2645;2638:12;2600:52;2688:9;2675:23;2717:18;2758:2;2750:6;2747:14;2744:34;;;2774:1;2771;2764:12;2744:34;2812:6;2801:9;2797:22;2787:32;;2857:7;2850:4;2846:2;2842:13;2838:27;2828:55;;2879:1;2876;2869:12;2828:55;2915:2;2902:16;2937:4;2960:2;2956;2953:10;2950:36;;;2966:18;;:::i;:::-;3012:2;3009:1;3005:10;3044:2;3038:9;3107:2;3103:7;3098:2;3094;3090:11;3086:25;3078:6;3074:38;3162:6;3150:10;3147:22;3142:2;3130:10;3127:18;3124:46;3121:72;;;3173:18;;:::i;:::-;3209:2;3202:22;3259:18;;;3293:15;;;;-1:-1:-1;3328:11:1;;;3358;;;3354:20;;3351:33;-1:-1:-1;3348:53:1;;;3397:1;3394;3387:12;3348:53;3419:1;3410:10;;3429:169;3443:2;3440:1;3437:9;3429:169;;;3500:23;3519:3;3500:23;:::i;:::-;3488:36;;3461:1;3454:9;;;;;3544:12;;;;3576;;3429:169;;;-1:-1:-1;3617:6:1;-1:-1:-1;3642:35:1;;-1:-1:-1;3658:18:1;;;3642:35;:::i;:::-;3632:45;;;;;;2481:1202;;;;;:::o;3688:180::-;3744:6;3797:2;3785:9;3776:7;3772:23;3768:32;3765:52;;;3813:1;3810;3803:12;3765:52;3836:26;3852:9;3836:26;:::i;3873:180::-;3932:6;3985:2;3973:9;3964:7;3960:23;3956:32;3953:52;;;4001:1;3998;3991:12;3953:52;-1:-1:-1;4024:23:1;;3873:180;-1:-1:-1;3873:180:1:o;4058:184::-;4128:6;4181:2;4169:9;4160:7;4156:23;4152:32;4149:52;;;4197:1;4194;4187:12;4149:52;-1:-1:-1;4220:16:1;;4058:184;-1:-1:-1;4058:184:1:o;4247:248::-;4315:6;4323;4376:2;4364:9;4355:7;4351:23;4347:32;4344:52;;;4392:1;4389;4382:12;4344:52;-1:-1:-1;;4415:23:1;;;4485:2;4470:18;;;4457:32;;-1:-1:-1;4247:248:1:o;4500:523::-;4604:6;4612;4620;4628;4636;4644;4697:3;4685:9;4676:7;4672:23;4668:33;4665:53;;;4714:1;4711;4704:12;4665:53;-1:-1:-1;;4737:23:1;;;4807:2;4792:18;;4779:32;;-1:-1:-1;4858:2:1;4843:18;;4830:32;;4909:2;4894:18;;4881:32;;-1:-1:-1;4960:3:1;4945:19;;4932:33;;-1:-1:-1;5012:3:1;4997:19;4984:33;;-1:-1:-1;4500:523:1;-1:-1:-1;4500:523:1:o;5028:182::-;5085:6;5138:2;5126:9;5117:7;5113:23;5109:32;5106:52;;;5154:1;5151;5144:12;5106:52;5177:27;5194:9;5177:27;:::i;5215:317::-;5281:6;5289;5342:2;5330:9;5321:7;5317:23;5313:32;5310:52;;;5358:1;5355;5348:12;5310:52;5381:27;5398:9;5381:27;:::i;5537:471::-;5578:3;5616:5;5610:12;5643:6;5638:3;5631:19;5668:1;5678:162;5692:6;5689:1;5686:13;5678:162;;;5754:4;5810:13;;;5806:22;;5800:29;5782:11;;;5778:20;;5771:59;5707:12;5678:162;;;5858:6;5855:1;5852:13;5849:87;;;5924:1;5917:4;5908:6;5903:3;5899:16;5895:27;5888:38;5849:87;-1:-1:-1;5990:2:1;5969:15;-1:-1:-1;;5965:29:1;5956:39;;;;5997:4;5952:50;;5537:471;-1:-1:-1;;5537:471:1:o;7048:217::-;7195:2;7184:9;7177:21;7158:4;7215:44;7255:2;7244:9;7240:18;7232:6;7215:44;:::i;16980:128::-;17020:3;17051:1;17047:6;17044:1;17041:13;17038:39;;;17057:18;;:::i;:::-;-1:-1:-1;17093:9:1;;16980:128::o;17113:274::-;17153:1;17179;17169:189;;-1:-1:-1;;;17211:1:1;17204:88;17315:4;17312:1;17305:15;17343:4;17340:1;17333:15;17169:189;-1:-1:-1;17372:9:1;;17113:274::o;17392:168::-;17432:7;17498:1;17494;17490:6;17486:14;17483:1;17480:21;17475:1;17468:9;17461:17;17457:45;17454:71;;;17505:18;;:::i;:::-;-1:-1:-1;17545:9:1;;17392:168::o;17565:125::-;17605:4;17633:1;17630;17627:8;17624:34;;;17638:18;;:::i;:::-;-1:-1:-1;17675:9:1;;17565:125::o;17695:437::-;17774:1;17770:12;;;;17817;;;17838:61;;17892:4;17884:6;17880:17;17870:27;;17838:61;17945:2;17937:6;17934:14;17914:18;17911:38;17908:218;;;-1:-1:-1;;;17979:1:1;17972:88;18083:4;18080:1;18073:15;18111:4;18108:1;18101:15;17908:218;;17695:437;;;:::o;18137:135::-;18176:3;-1:-1:-1;;18197:17:1;;18194:43;;;18217:18;;:::i;:::-;-1:-1:-1;18264:1:1;18253:13;;18137:135::o;18277:184::-;-1:-1:-1;;;18326:1:1;18319:88;18426:4;18423:1;18416:15;18450:4;18447:1;18440:15;18466:184;-1:-1:-1;;;18515:1:1;18508:88;18615:4;18612:1;18605:15;18639:4;18636:1;18629:15;18655:184;-1:-1:-1;;;18704:1:1;18697:88;18804:4;18801:1;18794:15;18828:4;18825:1;18818:15;18844:154;-1:-1:-1;;;;;18923:5:1;18919:54;18912:5;18909:65;18899:93;;18988:1;18985;18978:12

Swarm Source

ipfs://8abdfdd825a52a7ac13e23dccb0962595459b1127a0a02fcf1eb5bed8cf783f6
Loading