ETH Price: $2,950.31 (+1.30%)

Token

ARBPANDA (AIPANDA)

Overview

Max Total Supply

100,000,000,000 AIPANDA

Holders

32,526

Market

Price

$0.00 @ 0.000000 ETH

Onchain Market Cap

-

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 6 Decimals)

Balance
30,000 AIPANDA

Value
$0.00
0x32622Cb41c18F2a9e63F205FF11d99620D654ebD
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information

Contract Source Code Verified (Exact Match)

Contract Name:
ARBPANDA

Compiler Version
v0.8.19+commit.7dd6d404

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Arbiscan.io on 2023-05-06
*/

/*

░██╗░░░░░░░██╗███████╗██╗░░░░░░█████╗░░█████╗░███╗░░░███╗███████╗  ████████╗░█████╗░
░██║░░██╗░░██║██╔════╝██║░░░░░██╔══██╗██╔══██╗████╗░████║██╔════╝  ╚══██╔══╝██╔══██╗
░╚██╗████╗██╔╝█████╗░░██║░░░░░██║░░╚═╝██║░░██║██╔████╔██║█████╗░░  ░░░██║░░░██║░░██║
░░████╔═████║░██╔══╝░░██║░░░░░██║░░██╗██║░░██║██║╚██╔╝██║██╔══╝░░  ░░░██║░░░██║░░██║
░░╚██╔╝░╚██╔╝░███████╗███████╗╚█████╔╝╚█████╔╝██║░╚═╝░██║███████╗  ░░░██║░░░╚█████╔╝
░░░╚═╝░░░╚═╝░░╚══════╝╚══════╝░╚════╝░░╚════╝░╚═╝░░░░░╚═╝╚══════╝  ░░░╚═╝░░░░╚════╝░

░█████╗░██████╗░██████╗░██████╗░░█████╗░███╗░░██╗██████╗░░█████╗░
██╔══██╗██╔══██╗██╔══██╗██╔══██╗██╔══██╗████╗░██║██╔══██╗██╔══██╗
███████║██████╔╝██████╦╝██████╔╝███████║██╔██╗██║██║░░██║███████║
██╔══██║██╔══██╗██╔══██╗██╔═══╝░██╔══██║██║╚████║██║░░██║██╔══██║
██║░░██║██║░░██║██████╦╝██║░░░░░██║░░██║██║░╚███║██████╔╝██║░░██║
╚═╝░░╚═╝╚═╝░░╚═╝╚═════╝░╚═╝░░░░░╚═╝░░╚═╝╚═╝░░╚══╝╚═════╝░╚═╝░░╚═╝

**100% UNRUGGABLE TOKEN (SAFU CONTRACT)
**DEV CANNOT MINT TOKENS
**DEV CANNOT SET FEES MORE THAN 15% FOR BUY
**DEV CANNOT SET FEES MORE THAN 15% FOR SELL
**DEV CANNOT RECOVER OWN TOKENS FROM CONTRACT
**ALL UNUSED $AISHIB TOKENS WILL BE LOCKED.
**ADDED LIQUIDITY LOCKED 1 YEAR.

Lets begin, shall we! :)


*/

// File: @openzeppelin/contracts/token/ERC20/IERC20.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

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

    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol

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

pragma solidity ^0.8.0;

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

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

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

// File: @openzeppelin/contracts/utils/Context.sol

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

pragma solidity ^0.8.0;

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

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

// File: @openzeppelin/contracts/token/ERC20/ERC20.sol

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

pragma solidity ^0.8.0;



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

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * The default value of {decimals} is 18. To select a different value for
     * {decimals} you should overload it.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev Returns the name of the token.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

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

    /**
     * @dev See {IERC20-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view virtual override returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address to, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _transfer(owner, to, amount);
        return true;
    }

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

    /**
     * @dev See {IERC20-approve}.
     *
     * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on
     * `transferFrom`. This is semantically equivalent to an infinite approval.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * NOTE: Does not update the allowance if the current allowance
     * is the maximum `uint256`.
     *
     * Requirements:
     *
     * - `from` and `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public virtual override returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, amount);
        _transfer(from, to, amount);
        return true;
    }

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

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

        return true;
    }

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

        _beforeTokenTransfer(from, to, amount);

        uint256 fromBalance = _balances[from];
        require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[from] = fromBalance - amount;
            // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by
            // decrementing then incrementing.
            _balances[to] += amount;
        }

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, amount);
    }

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

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

        _totalSupply += amount;
        unchecked {
            // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above.
            _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;
            // Overflow not possible: amount <= accountBalance <= totalSupply.
            _totalSupply -= amount;
        }

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol

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

pragma solidity ^0.8.0;

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

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

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

// File: @openzeppelin/contracts/utils/Address.sol

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

pragma solidity ^0.8.1;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

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

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling
     * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.
     *
     * _Available since v4.8._
     */
    function verifyCallResultFromTarget(
        address target,
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        if (success) {
            if (returndata.length == 0) {
                // only check isContract if the call was successful and the return data is empty
                // otherwise we already know that it was a contract
                require(isContract(target), "Address: call to non-contract");
            }
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    /**
     * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason or using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    function _revert(bytes memory returndata, string memory errorMessage) private pure {
        // Look for revert reason and bubble it up if present
        if (returndata.length > 0) {
            // The easiest way to bubble the revert reason is using memory via assembly
            /// @solidity memory-safe-assembly
            assembly {
                let returndata_size := mload(returndata)
                revert(add(32, returndata), returndata_size)
            }
        } else {
            revert(errorMessage);
        }
    }
}

// File: @openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol

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

pragma solidity ^0.8.0;



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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/utils/structs/EnumerableSet.sol

// OpenZeppelin Contracts (last updated v4.8.0) (utils/structs/EnumerableSet.sol)
// This file was procedurally generated from scripts/generate/templates/EnumerableSet.js.

pragma solidity ^0.8.0;

/**
 * @dev Library for managing
 * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive
 * types.
 *
 * Sets have the following properties:
 *
 * - Elements are added, removed, and checked for existence in constant time
 * (O(1)).
 * - Elements are enumerated in O(n). No guarantees are made on the ordering.
 *
 * ```
 * contract Example {
 *     // Add the library methods
 *     using EnumerableSet for EnumerableSet.AddressSet;
 *
 *     // Declare a set state variable
 *     EnumerableSet.AddressSet private mySet;
 * }
 * ```
 *
 * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)
 * and `uint256` (`UintSet`) are supported.
 *
 * [WARNING]
 * ====
 * Trying to delete such a structure from storage will likely result in data corruption, rendering the structure
 * unusable.
 * See https://github.com/ethereum/solidity/pull/11843[ethereum/solidity#11843] for more info.
 *
 * In order to clean an EnumerableSet, you can either remove all elements one by one or create a fresh instance using an
 * array of EnumerableSet.
 * ====
 */
library EnumerableSet {
    // To implement this library for multiple types with as little code
    // repetition as possible, we write it in terms of a generic Set type with
    // bytes32 values.
    // The Set implementation uses private functions, and user-facing
    // implementations (such as AddressSet) are just wrappers around the
    // underlying Set.
    // This means that we can only create new EnumerableSets for types that fit
    // in bytes32.

    struct Set {
        // Storage of set values
        bytes32[] _values;
        // Position of the value in the `values` array, plus 1 because index 0
        // means a value is not in the set.
        mapping(bytes32 => uint256) _indexes;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function _add(Set storage set, bytes32 value) private returns (bool) {
        if (!_contains(set, value)) {
            set._values.push(value);
            // The value is stored at length-1, but we add 1 to all indexes
            // and use 0 as a sentinel value
            set._indexes[value] = set._values.length;
            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function _remove(Set storage set, bytes32 value) private returns (bool) {
        // We read and store the value's index to prevent multiple reads from the same storage slot
        uint256 valueIndex = set._indexes[value];

        if (valueIndex != 0) {
            // Equivalent to contains(set, value)
            // To delete an element from the _values array in O(1), we swap the element to delete with the last one in
            // the array, and then remove the last element (sometimes called as 'swap and pop').
            // This modifies the order of the array, as noted in {at}.

            uint256 toDeleteIndex = valueIndex - 1;
            uint256 lastIndex = set._values.length - 1;

            if (lastIndex != toDeleteIndex) {
                bytes32 lastValue = set._values[lastIndex];

                // Move the last value to the index where the value to delete is
                set._values[toDeleteIndex] = lastValue;
                // Update the index for the moved value
                set._indexes[lastValue] = valueIndex; // Replace lastValue's index to valueIndex
            }

            // Delete the slot where the moved value was stored
            set._values.pop();

            // Delete the index for the deleted slot
            delete set._indexes[value];

            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function _contains(Set storage set, bytes32 value) private view returns (bool) {
        return set._indexes[value] != 0;
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function _length(Set storage set) private view returns (uint256) {
        return set._values.length;
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function _at(Set storage set, uint256 index) private view returns (bytes32) {
        return set._values[index];
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function _values(Set storage set) private view returns (bytes32[] memory) {
        return set._values;
    }

    // Bytes32Set

    struct Bytes32Set {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _add(set._inner, value);
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _remove(set._inner, value);
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
        return _contains(set._inner, value);
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(Bytes32Set storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
        return _at(set._inner, index);
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(Bytes32Set storage set) internal view returns (bytes32[] memory) {
        bytes32[] memory store = _values(set._inner);
        bytes32[] memory result;

        /// @solidity memory-safe-assembly
        assembly {
            result := store
        }

        return result;
    }

    // AddressSet

    struct AddressSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(AddressSet storage set, address value) internal returns (bool) {
        return _add(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(AddressSet storage set, address value) internal returns (bool) {
        return _remove(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(AddressSet storage set, address value) internal view returns (bool) {
        return _contains(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(AddressSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(AddressSet storage set, uint256 index) internal view returns (address) {
        return address(uint160(uint256(_at(set._inner, index))));
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(AddressSet storage set) internal view returns (address[] memory) {
        bytes32[] memory store = _values(set._inner);
        address[] memory result;

        /// @solidity memory-safe-assembly
        assembly {
            result := store
        }

        return result;
    }

    // UintSet

    struct UintSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(UintSet storage set, uint256 value) internal returns (bool) {
        return _add(set._inner, bytes32(value));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(UintSet storage set, uint256 value) internal returns (bool) {
        return _remove(set._inner, bytes32(value));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(UintSet storage set, uint256 value) internal view returns (bool) {
        return _contains(set._inner, bytes32(value));
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(UintSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(UintSet storage set, uint256 index) internal view returns (uint256) {
        return uint256(_at(set._inner, index));
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(UintSet storage set) internal view returns (uint256[] memory) {
        bytes32[] memory store = _values(set._inner);
        uint256[] memory result;

        /// @solidity memory-safe-assembly
        assembly {
            result := store
        }

        return result;
    }
}

// File: contracts/interfaces/ICamelotFactory.sol


pragma solidity >=0.5.0;

interface ICamelotFactory {
    event PairCreated(
        address indexed token0,
        address indexed token1,
        address pair,
        uint256
    );

    function owner() external view returns (address);

    function feePercentOwner() external view returns (address);

    function setStableOwner() external view returns (address);

    function feeTo() external view returns (address);

    function ownerFeeShare() external view returns (uint256);

    function referrersFeeShare(address) external view returns (uint256);

    function getPair(
        address tokenA,
        address tokenB
    ) external view returns (address pair);

    function allPairs(uint256) external view returns (address pair);

    function allPairsLength() external view returns (uint256);

    function createPair(
        address tokenA,
        address tokenB
    ) external returns (address pair);

    function setFeeTo(address) external;

    function feeInfo()
        external
        view
        returns (uint _ownerFeeShare, address _feeTo);
}

// File: contracts/interfaces/IUniswapV2Router01.sol


pragma solidity >=0.6.2;

interface IUniswapV2Router01 {
    function factory() external pure returns (address);

    function WETH() external pure returns (address);

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

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

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

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

    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint amountA, uint amountB);

    function removeLiquidityETHWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint amountToken, uint amountETH);

    function quote(
        uint amountA,
        uint reserveA,
        uint reserveB
    ) external pure returns (uint amountB);

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external;

    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
}

// File: contracts/interfaces/ICamelotRouter.sol


pragma solidity >=0.6.2;

interface ICamelotRouter is IUniswapV2Router01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountETH);

    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint amountETH);

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        address referrer,
        uint deadline
    ) external;

    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        address referrer,
        uint deadline
    ) external payable;

    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        address referrer,
        uint deadline
    ) external;

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

// File: contracts/interfaces/IWETH.sol


pragma solidity >=0.5.0;

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

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

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

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

    function deposit() external payable;

    function transfer(address to, uint256 value) external returns (bool);

    function withdraw(uint256) external;
}




pragma solidity >=0.5.0;

interface IPandaBonusPool {
    function deposit(uint256 _pid, uint256 _amount) external;
    function withdraw(uint256 _pid, uint256 _amount) external;
    function emergencyWithdraw(uint256 _pid) external;
    function totalTokenPurchased(address buyer, uint256 amount) external;
}

// File: contracts/token/AIPANDA.sol

pragma solidity =0.8.19;

contract ARBPANDA is ERC20, Ownable {
    using SafeERC20 for IERC20;
    using EnumerableSet for EnumerableSet.AddressSet;

    event SwapBack(uint256 burn, uint256 gov1, uint256 gov2, uint256 liquidity, uint256 jackpot, uint256 bonus, uint256 dev, uint timestamp);
    event Trade(address user, address pair, uint256 amount, uint side, uint256 circulatingSupply, uint timestamp);
    event AddLiquidity(uint256 tokenAmount, uint256 ethAmount, uint256 timestamp);

    bool public swapEnabled = true;
    bool public addLiquidityEnabled = true;

    bool public inSwap;
    modifier swapping() {
        inSwap = true;
        _;
        inSwap = false;
    }

    mapping(address => bool) public isFeeExempt;
    mapping(address => bool) public canAddLiquidityBeforeLaunch;

    uint256 private burnFee;
    uint256 public gov1Fee;
    uint256 public gov2Fee;
    uint256 private liquidityFee;
    uint256 private jackpotFee;
    uint256 private bonusFee;
    uint256 private devFee;
    uint256 private totalFee;
    uint256 public feeDenominator = 10000;

    // Buy Fees
    uint256 public burnFeeBuy = 100;
    uint256 public gov1FeeBuy = 100;
    uint256 public gov2FeeBuy = 200;
    uint256 public liquidityFeeBuy = 200;
    uint256 public jackpotFeeBuy = 300;
    uint256 public bonusFeeBuy = 300;
    uint256 public devFeeBuy = 300;
    uint256 public totalFeeBuy = 1500;
    // Sell Fees
    uint256 public burnFeeSell = 100;
    uint256 public gov1FeeSell = 100;
    uint256 public gov2FeeSell = 200;
    uint256 public liquidityFeeSell = 200;
    uint256 public jackpotFeeSell = 300;
    uint256 public bonusFeeSell = 300;
    uint256 public devFeeSell = 300;
    uint256 public totalFeeSell = 1500;

    // Fees receivers
    address private gov1Wallet;
    address private gov2Wallet;
    address private bonusWallet;
    address public jackpotWallet;
    address private devWallet;

    IERC20 public backToken;
    uint256 public launchedAt;
    uint256 public launchedAtTimestamp;
    bool private initialized;

    ICamelotFactory private immutable factory;
    ICamelotRouter private immutable swapRouter;
    IWETH private immutable WETH;
    address private constant DEAD = 0x000000000000000000000000000000000000dEaD;
    address private constant ZERO = 0x0000000000000000000000000000000000000000;

    EnumerableSet.AddressSet private _pairs;

    constructor(
        IERC20 _backToken,
        address _factory,
        address _swapRouter,
        address _weth
    ) ERC20("ARBPANDA", "AIPANDA") {
        uint256 _totalSupply = 100_000_000_000 * 1e6;
        backToken = _backToken;
        canAddLiquidityBeforeLaunch[_msgSender()] = true;
        canAddLiquidityBeforeLaunch[address(this)] = true;
        isFeeExempt[msg.sender] = true;
        isFeeExempt[address(this)] = true;
        factory = ICamelotFactory(_factory);
        swapRouter = ICamelotRouter(_swapRouter);
        WETH = IWETH(_weth);
        _mint(_msgSender(), _totalSupply);
    }

    function initializePair() external onlyOwner {
        require(!initialized, "Already initialized");
        address pair = factory.createPair(address(WETH), address(this));
        _pairs.add(pair);
        initialized = true;
    }

    function decimals() public view virtual override returns (uint8) {
        return 6;
    }

    function transfer(address to, uint256 amount) public virtual override returns (bool) {
        return _pandaTransfer(_msgSender(), to, amount);
    }

    function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) {
        address spender = _msgSender();
        _spendAllowance(sender, spender, amount);
        return _pandaTransfer(sender, recipient, amount);
    }

    function _pandaTransfer(address sender, address recipient, uint256 amount) internal returns (bool) {
        if (inSwap) {
            _transfer(sender, recipient, amount);
            return true;
        }
        if (!canAddLiquidityBeforeLaunch[sender]) {
            require(launched(), "Trading not open yet");
        }

        bool shouldTakeFee = (!isFeeExempt[sender] && !isFeeExempt[recipient]) && launched();
        uint side = 0;
        address user_ = sender;
        address pair_ = recipient;
        // Set Fees
        if (isPair(sender)) {
            buyFees();
            side = 1;
            user_ = recipient;
            pair_ = sender;
        } else if (isPair(recipient)) {
            sellFees();
            side = 2;
        } else {
            shouldTakeFee = false;
        }

        if (shouldSwapBack()) {
            swapBack();
        }

        uint256 amountReceived = shouldTakeFee ? takeFee(sender, amount) : amount;
        _transfer(sender, recipient, amountReceived);

        if (side > 0) {
            emit Trade(user_, pair_, amount, side, getCirculatingSupply(), block.timestamp);
        }
        if (side == 1) {
            IPandaBonusPool(bonusWallet).totalTokenPurchased(user_, amount);
        }
        return true;
    }

    function shouldSwapBack() internal view returns (bool) {
        return !inSwap && swapEnabled && launched() && balanceOf(address(this)) > 0 && !isPair(_msgSender());
    }

    function swapBack() internal swapping {
        uint256 taxAmount = balanceOf(address(this));
        _approve(address(this), address(swapRouter), taxAmount);

        uint256 amountPandaBurn = (taxAmount * burnFee) / (totalFee);
        uint256 amountPandaLp = (taxAmount * liquidityFee) / (totalFee);
        uint256 amountPandaBonus = (taxAmount * bonusFee) / (totalFee);
        taxAmount -= amountPandaBurn;
        taxAmount -= amountPandaLp;
        taxAmount -= amountPandaBonus;
        

        address[] memory path = new address[](3);
        path[0] = address(this);
        path[1] = address(WETH);
        path[2] = address(backToken);

        bool success = false;
        uint256 balanceBefore = backToken.balanceOf(address(this));
        try swapRouter.swapExactTokensForTokensSupportingFeeOnTransferTokens(taxAmount,0,path,address(this),address(0),block.timestamp){
            success = true;
        } catch {
            try swapRouter.swapExactTokensForTokensSupportingFeeOnTransferTokens(taxAmount,0,path,address(this),block.timestamp) {
                success = true;
            } 
            catch {}
        }
        if (!success) {
            return;
        }

        _transfer(address(this), DEAD, amountPandaBurn);
        _approve(address(this), address(bonusWallet), amountPandaBonus);
        _transfer(address(this), bonusWallet, amountPandaBonus);
        
        
        uint256 amountBackToken = backToken.balanceOf(address(this)) - balanceBefore;
        uint256 backTokenTotalFee = totalFee - burnFee - liquidityFee - bonusFee;
        uint256 amountBackTokenGov1 = (amountBackToken * gov1Fee) / (backTokenTotalFee);
        uint256 amountBackTokenGov2 = (amountBackToken * gov2Fee) / (backTokenTotalFee);
        uint256 amountBackTokenJackpot = (amountBackToken * jackpotFee) / backTokenTotalFee;
        uint256 amountBackTokenDev = amountBackToken - amountBackTokenGov1 - amountBackTokenGov2 - amountBackTokenJackpot;

        backToken.transfer(gov1Wallet, amountBackTokenGov1);
        backToken.transfer(gov2Wallet, amountBackTokenGov2);
        backToken.transfer(address(jackpotWallet), amountBackTokenJackpot);
        backToken.transfer(devWallet, amountBackTokenDev);

        if (addLiquidityEnabled) {
            _doAddLp();
        }
        
        emit SwapBack(amountPandaBurn, amountBackTokenGov1, amountBackTokenGov2, amountPandaLp, amountBackTokenJackpot, amountPandaBonus, amountBackTokenDev, block.timestamp);
    }

    function _doAddLp() internal {
        address[] memory pathEth = new address[](2);
        pathEth[0] = address(this);
        pathEth[1] = address(WETH);

        uint256 tokenAmount = balanceOf(address(this));
        uint256 half = tokenAmount / 2;
        if(half < 1000) return;

        uint256 ethAmountBefore = address(this).balance;
        bool success = false;
        try swapRouter.swapExactTokensForETHSupportingFeeOnTransferTokens(half,0, pathEth,address(this),address(0),block.timestamp){
            success = true;
        } catch {
            try swapRouter.swapExactTokensForETHSupportingFeeOnTransferTokens(half,0, pathEth,address(this),block.timestamp){
                success = true;
            } catch {}
        }
        if (!success) {
            return;
        }

        uint256 ethAmount = address(this).balance - ethAmountBefore;
        _addLiquidity(half, ethAmount);
    }

    function _addLiquidity(uint256 tokenAmount, uint256 ethAmount) internal {
        _approve(address(this), address(swapRouter), tokenAmount);
        try swapRouter.addLiquidityETH{value: ethAmount}(address(this), tokenAmount, 0, 0, address(0), block.timestamp) {
            emit AddLiquidity(tokenAmount, ethAmount, block.timestamp);
        } catch {}
    }

    function doSwapBack() public onlyOwner {
        swapBack();
    }

    function launched() internal view returns (bool) {
        return launchedAt != 0;
    }

    function buyFees() internal {
        burnFee = burnFeeBuy;
        gov1Fee = gov1FeeBuy;
        gov2Fee = gov2FeeBuy;
        liquidityFee = liquidityFeeBuy;
        jackpotFee = jackpotFeeBuy;
        bonusFee = bonusFeeBuy;
        devFee = devFeeBuy;
        totalFee = totalFeeBuy;
    }

    function sellFees() internal {
        burnFee = burnFeeSell;
        gov1Fee = gov1FeeSell;
        gov2Fee = gov2FeeSell;
        liquidityFee = liquidityFeeSell;
        jackpotFee = jackpotFeeSell;
        bonusFee = bonusFeeSell;
        devFee = devFeeSell;
        totalFee = totalFeeSell;
    }

    function takeFee(address sender, uint256 amount) internal returns (uint256) {
        uint256 feeAmount = (amount * totalFee) / feeDenominator;
        _transfer(sender, address(this), feeAmount);
        return amount - feeAmount;
    }

    function rescueToken(address tokenAddress) external onlyOwner {
        require(tokenAddress != address(this), 'CANT RESQUE OWN TOKEN');
        IERC20(tokenAddress).safeTransfer(msg.sender,IERC20(tokenAddress).balanceOf(address(this)));
    }

    function clearStuckEthBalance() external onlyOwner {
        uint256 amountETH = address(this).balance;
        (bool success, ) = payable(_msgSender()).call{value: amountETH}(new bytes(0));
        require(success, 'ARBPANDA: ETH_TRANSFER_FAILED');
    }

    function clearStuckBalance() external onlyOwner {
        backToken.transfer(_msgSender(), backToken.balanceOf(address(this)));
    }

    function getCirculatingSupply() public view returns (uint256) {
        return totalSupply() - balanceOf(DEAD) - balanceOf(ZERO);
    }

    /*** ADMIN FUNCTIONS ***/
    function launch() public onlyOwner {
        require(launchedAt == 0, "Already launched");
        launchedAt = block.number;
        launchedAtTimestamp = block.timestamp;
    }

    function setBuyFees(
        uint256 _gov1Fee,
        uint256 _gov2Fee,
        uint256 _liquidityFee,
        uint256 _jackpotFee,
        uint256 _bonusFee,
        uint256 _devFee,
        uint256 _burnFee
    ) external onlyOwner {
        //DEV CANNOT SET TOTAL BUY FEES MORE THAN 15%
        require(_gov1Fee + _gov2Fee + _liquidityFee + _jackpotFee + _bonusFee + _devFee + _burnFee <= 1500, 'MAX BUY FEES EXCEED');
        gov1FeeBuy = _gov1Fee;
        gov2FeeBuy = _gov2Fee;
        liquidityFeeBuy = _liquidityFee;
        jackpotFeeBuy = _jackpotFee;
        bonusFeeBuy = _bonusFee;
        devFeeBuy = _devFee;
        burnFeeBuy = _burnFee;
        totalFeeBuy = _gov1Fee + _gov2Fee + _liquidityFee + _jackpotFee + _bonusFee + _devFee + _burnFee;
    }

    function setSellFees(
        uint256 _gov1Fee,
        uint256 _gov2Fee,
        uint256 _liquidityFee,
        uint256 _jackpotFee,
        uint256 _bonusFee,
        uint256 _devFee,
        uint256 _burnFee
    ) external onlyOwner {
        //DEV CANNOT SET TOTAL SELL FEES MORE THAN 15%
        require(_gov1Fee + _gov2Fee + _liquidityFee + _jackpotFee + _bonusFee + _devFee + _burnFee <= 1500, 'MAX SELL FEES EXCEED');
        gov1FeeSell = _gov1Fee;
        gov2FeeSell = _gov2Fee;
        liquidityFeeSell = _liquidityFee;
        jackpotFeeSell = _jackpotFee;
        bonusFeeSell = _bonusFee;
        devFeeSell = _devFee;
        burnFeeSell = _burnFee;
        totalFeeSell = _gov1Fee + _gov2Fee+ _liquidityFee + _jackpotFee + _bonusFee + _devFee + _burnFee;
    }

    function setFeeReceivers(
        address _gov1Wallet,
        address _gov2Wallet,
        address _bonusWallet,
        address _jackpotWallet,
        address _devWallet
    ) external onlyOwner {
        gov1Wallet = _gov1Wallet;
        gov2Wallet = _gov2Wallet;
        bonusWallet = _bonusWallet;
        jackpotWallet = _jackpotWallet;
        devWallet = _devWallet;
    }

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

    function setSwapBackSettings(bool _enabled) external onlyOwner {
        swapEnabled = _enabled;
    }

    function setAddLiquidityEnabled(bool _enabled) external onlyOwner {
        addLiquidityEnabled = _enabled;
    }

    function isPair(address account) public view returns (bool) {
        return _pairs.contains(account);
    }

    function addPair(address pair) public onlyOwner returns (bool) {
        require(pair != address(0), "ARBPANDA: pair is the zero address");
        return _pairs.add(pair);
    }

    function delPair(address pair) public onlyOwner returns (bool) {
        require(pair != address(0), "ARBPANDA: pair is the zero address");
        return _pairs.remove(pair);
    }

    function getMinterLength() public view returns (uint256) {
        return _pairs.length();
    }

    function getPair(uint256 index) public view returns (address) {
        require(index <= _pairs.length() - 1, "ARBPANDA: index out of bounds");
        return _pairs.at(index);
    }

    receive() external payable {}
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"contract IERC20","name":"_backToken","type":"address"},{"internalType":"address","name":"_factory","type":"address"},{"internalType":"address","name":"_swapRouter","type":"address"},{"internalType":"address","name":"_weth","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"AddLiquidity","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"burn","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"gov1","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"gov2","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"liquidity","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"jackpot","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"bonus","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"dev","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"SwapBack","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"address","name":"pair","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"side","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"circulatingSupply","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"Trade","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"addLiquidityEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"}],"name":"addPair","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"backToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bonusFeeBuy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bonusFeeSell","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burnFeeBuy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burnFeeSell","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"canAddLiquidityBeforeLaunch","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"clearStuckBalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"clearStuckEthBalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"}],"name":"delPair","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"devFeeBuy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"devFeeSell","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"doSwapBack","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feeDenominator","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCirculatingSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMinterLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getPair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gov1Fee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gov1FeeBuy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gov1FeeSell","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gov2Fee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gov2FeeBuy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gov2FeeSell","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"inSwap","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initializePair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isFeeExempt","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isPair","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"jackpotFeeBuy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"jackpotFeeSell","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"jackpotWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"launch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"launchedAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"launchedAtTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityFeeBuy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityFeeSell","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"}],"name":"rescueToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setAddLiquidityEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_gov1Fee","type":"uint256"},{"internalType":"uint256","name":"_gov2Fee","type":"uint256"},{"internalType":"uint256","name":"_liquidityFee","type":"uint256"},{"internalType":"uint256","name":"_jackpotFee","type":"uint256"},{"internalType":"uint256","name":"_bonusFee","type":"uint256"},{"internalType":"uint256","name":"_devFee","type":"uint256"},{"internalType":"uint256","name":"_burnFee","type":"uint256"}],"name":"setBuyFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_gov1Wallet","type":"address"},{"internalType":"address","name":"_gov2Wallet","type":"address"},{"internalType":"address","name":"_bonusWallet","type":"address"},{"internalType":"address","name":"_jackpotWallet","type":"address"},{"internalType":"address","name":"_devWallet","type":"address"}],"name":"setFeeReceivers","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":"uint256","name":"_gov1Fee","type":"uint256"},{"internalType":"uint256","name":"_gov2Fee","type":"uint256"},{"internalType":"uint256","name":"_liquidityFee","type":"uint256"},{"internalType":"uint256","name":"_jackpotFee","type":"uint256"},{"internalType":"uint256","name":"_bonusFee","type":"uint256"},{"internalType":"uint256","name":"_devFee","type":"uint256"},{"internalType":"uint256","name":"_burnFee","type":"uint256"}],"name":"setSellFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setSwapBackSettings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFeeBuy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFeeSell","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"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"},{"stateMutability":"payable","type":"receive"}]

60e06040526001600560146101000a81548160ff0219169083151502179055506001600560156101000a81548160ff0219169083151502179055506127106010556064601155606460125560c860135560c860145561012c60155561012c60165561012c6017556105dc60185560646019556064601a5560c8601b5560c8601c5561012c601d5561012c601e5561012c601f556105dc602055348015620000a557600080fd5b5060405162005f8c38038062005f8c8339818101604052810190620000cb9190620006f6565b6040518060400160405280600881526020017f41524250414e44410000000000000000000000000000000000000000000000008152506040518060400160405280600781526020017f414950414e4441000000000000000000000000000000000000000000000000008152508160039081620001489190620009e2565b5080600490816200015a9190620009e2565b5050506200017d620001716200040260201b60201c565b6200040a60201b60201c565b600067016345785d8a0000905084602660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600160076000620001e16200040260201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600760003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600660003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508373ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff16815250508273ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff16815250508173ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff1681525050620003f7620003ea6200040260201b60201c565b82620004d060201b60201c565b505050505062000be4565b600033905090565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160362000542576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620005399062000b2a565b60405180910390fd5b62000556600083836200063d60201b60201c565b80600260008282546200056a919062000b7b565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516200061d919062000bc7565b60405180910390a362000639600083836200064260201b60201c565b5050565b505050565b505050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000679826200064c565b9050919050565b60006200068d826200066c565b9050919050565b6200069f8162000680565b8114620006ab57600080fd5b50565b600081519050620006bf8162000694565b92915050565b620006d0816200066c565b8114620006dc57600080fd5b50565b600081519050620006f081620006c5565b92915050565b6000806000806080858703121562000713576200071262000647565b5b60006200072387828801620006ae565b94505060206200073687828801620006df565b93505060406200074987828801620006df565b92505060606200075c87828801620006df565b91505092959194509250565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620007ea57607f821691505b6020821081036200080057620007ff620007a2565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026200086a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200082b565b6200087686836200082b565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620008c3620008bd620008b7846200088e565b62000898565b6200088e565b9050919050565b6000819050919050565b620008df83620008a2565b620008f7620008ee82620008ca565b84845462000838565b825550505050565b600090565b6200090e620008ff565b6200091b818484620008d4565b505050565b5b8181101562000943576200093760008262000904565b60018101905062000921565b5050565b601f82111562000992576200095c8162000806565b62000967846200081b565b8101602085101562000977578190505b6200098f62000986856200081b565b83018262000920565b50505b505050565b600082821c905092915050565b6000620009b76000198460080262000997565b1980831691505092915050565b6000620009d28383620009a4565b9150826002028217905092915050565b620009ed8262000768565b67ffffffffffffffff81111562000a095762000a0862000773565b5b62000a158254620007d1565b62000a2282828562000947565b600060209050601f83116001811462000a5a576000841562000a45578287015190505b62000a518582620009c4565b86555062000ac1565b601f19841662000a6a8662000806565b60005b8281101562000a945784890151825560018201915060208501945060208101905062000a6d565b8683101562000ab4578489015162000ab0601f891682620009a4565b8355505b6001600288020188555050505b505050505050565b600082825260208201905092915050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b600062000b12601f8362000ac9565b915062000b1f8262000ada565b602082019050919050565b6000602082019050818103600083015262000b458162000b03565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000b88826200088e565b915062000b95836200088e565b925082820190508082111562000bb05762000baf62000b4c565b5b92915050565b62000bc1816200088e565b82525050565b600060208201905062000bde600083018462000bb6565b92915050565b60805160a05160c05161534062000c4c600039600081816115c10152818161278e01526135cf0152600081816126430152818161290f015281816129a3015281816136750152818161370901528181613964015261398b0152600061158501526153406000f3fe60806040526004361061039b5760003560e01c806382d20116116101dc578063b8c6113011610102578063cdba31fd116100a0578063e1e5a66d1161006f578063e1e5a66d14610d61578063e5e31b1314610d8c578063f2fde38b14610dc9578063fb5f27fb14610df2576103a2565b8063cdba31fd14610ca3578063d830678614610cce578063dbd6c48914610cf9578063dd62ed3e14610d24576103a2565b8063bfa382b5116100dc578063bfa382b514610bf9578063c2b7bbb614610c10578063c6d2577d14610c4d578063cb806e0714610c78576103a2565b8063b8c6113014610b68578063bdf391cc14610b91578063bf56b37114610bce576103a2565b806395d89b411161017a578063aac46c9511610149578063aac46c9514610abe578063ace1880114610ae7578063b6309f6814610b12578063b7eed4c414610b3d576103a2565b806395d89b41146109dc578063a457c2d714610a07578063a5bc508514610a44578063a9059cbb14610a81576103a2565b806386c8782f116101b657806386c8782f146109465780638da5cb5b146109715780638fbbd7501461099c5780639272293c146109b3576103a2565b806382d20116146108c557806386013940146108f0578063861faf5f1461091b576103a2565b80632d2f244b116102c1578063531484161161025f57806370a082311161022e57806370a082311461080957806370c8810e14610846578063715018a6146108715780638072250b14610888576103a2565b8063531484161461075f578063658d4b7f1461078a5780636c470595146107b35780636ddd1713146107de576103a2565b8063395093511161029b57806339509351146106a55780633f4218e0146106e25780634460d3cf1461071f5780634fab9e4c14610748576103a2565b80632d2f244b14610638578063313ce56714610663578063364333f41461068e576103a2565b806312835c5e1161033957806318abb6351161030857806318abb6351461057c578063234a2daa146105a557806323b872dd146105d05780632b112e491461060d576103a2565b806312835c5e146104d057806315674e8e146104fb578063180b0d7e1461052657806318160ddd14610551576103a2565b806306fdde031161037557806306fdde0314610414578063095ea7b31461043f5780630ca5979b1461047c5780631107b3a5146104a5576103a2565b806301339c21146103a7578063017e24e1146103be5780630323aac7146103e9576103a2565b366103a257005b600080fd5b3480156103b357600080fd5b506103bc610e1d565b005b3480156103ca57600080fd5b506103d3610e7a565b6040516103e09190613c41565b60405180910390f35b3480156103f557600080fd5b506103fe610e80565b60405161040b9190613c41565b60405180910390f35b34801561042057600080fd5b50610429610e91565b6040516104369190613cec565b60405180910390f35b34801561044b57600080fd5b5061046660048036038101906104619190613d9d565b610f23565b6040516104739190613df8565b60405180910390f35b34801561048857600080fd5b506104a3600480360381019061049e9190613e13565b610f46565b005b3480156104b157600080fd5b506104ba611058565b6040516104c79190613c41565b60405180910390f35b3480156104dc57600080fd5b506104e561105e565b6040516104f29190613c41565b60405180910390f35b34801561050757600080fd5b50610510611064565b60405161051d9190613c41565b60405180910390f35b34801561053257600080fd5b5061053b61106a565b6040516105489190613c41565b60405180910390f35b34801561055d57600080fd5b50610566611070565b6040516105739190613c41565b60405180910390f35b34801561058857600080fd5b506105a3600480360381019061059e9190613eb5565b61107a565b005b3480156105b157600080fd5b506105ba6111ce565b6040516105c79190613c41565b60405180910390f35b3480156105dc57600080fd5b506105f760048036038101906105f29190613f30565b6111d4565b6040516106049190613df8565b60405180910390f35b34801561061957600080fd5b50610622611201565b60405161062f9190613c41565b60405180910390f35b34801561064457600080fd5b5061064d611239565b60405161065a9190613f92565b60405180910390f35b34801561066f57600080fd5b5061067861125f565b6040516106859190613fc9565b60405180910390f35b34801561069a57600080fd5b506106a3611268565b005b3480156106b157600080fd5b506106cc60048036038101906106c79190613d9d565b6113b5565b6040516106d99190613df8565b60405180910390f35b3480156106ee57600080fd5b5061070960048036038101906107049190613fe4565b6113ec565b6040516107169190613df8565b60405180910390f35b34801561072b57600080fd5b5061074660048036038101906107419190613fe4565b61140c565b005b34801561075457600080fd5b5061075d611529565b005b34801561076b57600080fd5b50610774611676565b6040516107819190613c41565b60405180910390f35b34801561079657600080fd5b506107b160048036038101906107ac919061403d565b61167c565b005b3480156107bf57600080fd5b506107c86116df565b6040516107d59190613c41565b60405180910390f35b3480156107ea57600080fd5b506107f36116e5565b6040516108009190613df8565b60405180910390f35b34801561081557600080fd5b50610830600480360381019061082b9190613fe4565b6116f8565b60405161083d9190613c41565b60405180910390f35b34801561085257600080fd5b5061085b611740565b6040516108689190613c41565b60405180910390f35b34801561087d57600080fd5b50610886611746565b005b34801561089457600080fd5b506108af60048036038101906108aa9190613fe4565b61175a565b6040516108bc9190613df8565b60405180910390f35b3480156108d157600080fd5b506108da61177a565b6040516108e79190613c41565b60405180910390f35b3480156108fc57600080fd5b50610905611780565b6040516109129190613df8565b60405180910390f35b34801561092757600080fd5b50610930611793565b60405161093d91906140dc565b60405180910390f35b34801561095257600080fd5b5061095b6117b9565b6040516109689190613c41565b60405180910390f35b34801561097d57600080fd5b506109866117bf565b6040516109939190613f92565b60405180910390f35b3480156109a857600080fd5b506109b16117e9565b005b3480156109bf57600080fd5b506109da60048036038101906109d59190613e13565b6117fb565b005b3480156109e857600080fd5b506109f161190d565b6040516109fe9190613cec565b60405180910390f35b348015610a1357600080fd5b50610a2e6004803603810190610a299190613d9d565b61199f565b604051610a3b9190613df8565b60405180910390f35b348015610a5057600080fd5b50610a6b6004803603810190610a669190613fe4565b611a16565b604051610a789190613df8565b60405180910390f35b348015610a8d57600080fd5b50610aa86004803603810190610aa39190613d9d565b611aaa565b604051610ab59190613df8565b60405180910390f35b348015610aca57600080fd5b50610ae56004803603810190610ae091906140f7565b611ac6565b005b348015610af357600080fd5b50610afc611aeb565b604051610b099190613c41565b60405180910390f35b348015610b1e57600080fd5b50610b27611af1565b604051610b349190613c41565b60405180910390f35b348015610b4957600080fd5b50610b52611af7565b604051610b5f9190613c41565b60405180910390f35b348015610b7457600080fd5b50610b8f6004803603810190610b8a91906140f7565b611afd565b005b348015610b9d57600080fd5b50610bb86004803603810190610bb39190614124565b611b22565b604051610bc59190613f92565b60405180910390f35b348015610bda57600080fd5b50610be3611b97565b604051610bf09190613c41565b60405180910390f35b348015610c0557600080fd5b50610c0e611b9d565b005b348015610c1c57600080fd5b50610c376004803603810190610c329190613fe4565b611cb0565b604051610c449190613df8565b60405180910390f35b348015610c5957600080fd5b50610c62611d44565b604051610c6f9190613c41565b60405180910390f35b348015610c8457600080fd5b50610c8d611d4a565b604051610c9a9190613c41565b60405180910390f35b348015610caf57600080fd5b50610cb8611d50565b604051610cc59190613c41565b60405180910390f35b348015610cda57600080fd5b50610ce3611d56565b604051610cf09190613df8565b60405180910390f35b348015610d0557600080fd5b50610d0e611d69565b604051610d1b9190613c41565b60405180910390f35b348015610d3057600080fd5b50610d4b6004803603810190610d469190614151565b611d6f565b604051610d589190613c41565b60405180910390f35b348015610d6d57600080fd5b50610d76611df6565b604051610d839190613c41565b60405180910390f35b348015610d9857600080fd5b50610db36004803603810190610dae9190613fe4565b611dfc565b604051610dc09190613df8565b60405180910390f35b348015610dd557600080fd5b50610df06004803603810190610deb9190613fe4565b611e19565b005b348015610dfe57600080fd5b50610e07611e9c565b604051610e149190613c41565b60405180910390f35b610e25611ea2565b600060275414610e6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e61906141dd565b60405180910390fd5b4360278190555042602881905550565b600a5481565b6000610e8c602a611f20565b905090565b606060038054610ea09061422c565b80601f0160208091040260200160405190810160405280929190818152602001828054610ecc9061422c565b8015610f195780601f10610eee57610100808354040283529160200191610f19565b820191906000526020600020905b815481529060010190602001808311610efc57829003601f168201915b5050505050905090565b600080610f2e611f35565b9050610f3b818585611f3d565b600191505092915050565b610f4e611ea2565b6105dc81838587898b8d610f62919061428c565b610f6c919061428c565b610f76919061428c565b610f80919061428c565b610f8a919061428c565b610f94919061428c565b1115610fd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fcc9061430c565b60405180910390fd5b8660128190555085601381905550846014819055508360158190555082601681905550816017819055508060118190555080828486888a8c611017919061428c565b611021919061428c565b61102b919061428c565b611035919061428c565b61103f919061428c565b611049919061428c565b60188190555050505050505050565b601c5481565b601f5481565b60115481565b60105481565b6000600254905090565b611082611ea2565b84602160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555083602260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081602460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080602560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050505050565b60195481565b6000806111df611f35565b90506111ec858285612106565b6111f7858585612192565b9150509392505050565b600061120d60006116f8565b61121861dead6116f8565b611220611070565b61122a919061432c565b611234919061432c565b905090565b602460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006006905090565b611270611ea2565b602660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6112b6611f35565b602660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016113119190613f92565b602060405180830381865afa15801561132e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113529190614375565b6040518363ffffffff1660e01b815260040161136f9291906143a2565b6020604051808303816000875af115801561138e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113b291906143e0565b50565b6000806113c0611f35565b90506113e18185856113d28589611d6f565b6113dc919061428c565b611f3d565b600191505092915050565b60066020528060005260406000206000915054906101000a900460ff1681565b611414611ea2565b3073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611482576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147990614459565b60405180910390fd5b611526338273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016114bf9190613f92565b602060405180830381865afa1580156114dc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115009190614375565b8373ffffffffffffffffffffffffffffffffffffffff166124999092919063ffffffff16565b50565b611531611ea2565b602960009054906101000a900460ff1615611581576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611578906144c5565b60405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663c9c653967f0000000000000000000000000000000000000000000000000000000000000000306040518363ffffffff1660e01b81526004016115fe9291906144e5565b6020604051808303816000875af115801561161d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116419190614523565b905061165781602a61251f90919063ffffffff16565b506001602960006101000a81548160ff02191690831515021790555050565b60205481565b611684611ea2565b80600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b60155481565b600560149054906101000a900460ff1681565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60125481565b61174e611ea2565b611758600061254f565b565b60076020528060005260406000206000915054906101000a900460ff1681565b60145481565b600560159054906101000a900460ff1681565b602660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60165481565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6117f1611ea2565b6117f9612615565b565b611803611ea2565b6105dc81838587898b8d611817919061428c565b611821919061428c565b61182b919061428c565b611835919061428c565b61183f919061428c565b611849919061428c565b111561188a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118819061459c565b60405180910390fd5b86601a8190555085601b8190555084601c8190555083601d8190555082601e8190555081601f819055508060198190555080828486888a8c6118cc919061428c565b6118d6919061428c565b6118e0919061428c565b6118ea919061428c565b6118f4919061428c565b6118fe919061428c565b60208190555050505050505050565b60606004805461191c9061422c565b80601f01602080910402602001604051908101604052809291908181526020018280546119489061422c565b80156119955780601f1061196a57610100808354040283529160200191611995565b820191906000526020600020905b81548152906001019060200180831161197857829003601f168201915b5050505050905090565b6000806119aa611f35565b905060006119b88286611d6f565b9050838110156119fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f49061462e565b60405180910390fd5b611a0a8286868403611f3d565b60019250505092915050565b6000611a20611ea2565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611a8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a86906146c0565b60405180910390fd5b611aa382602a612faa90919063ffffffff16565b9050919050565b6000611abe611ab7611f35565b8484612192565b905092915050565b611ace611ea2565b80600560156101000a81548160ff02191690831515021790555050565b601e5481565b601b5481565b601d5481565b611b05611ea2565b80600560146101000a81548160ff02191690831515021790555050565b60006001611b30602a611f20565b611b3a919061432c565b821115611b7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b739061472c565b60405180910390fd5b611b9082602a612fda90919063ffffffff16565b9050919050565b60275481565b611ba5611ea2565b60004790506000611bb4611f35565b73ffffffffffffffffffffffffffffffffffffffff1682600067ffffffffffffffff811115611be657611be561474c565b5b6040519080825280601f01601f191660200182016040528015611c185781602001600182028036833780820191505090505b50604051611c2691906147c2565b60006040518083038185875af1925050503d8060008114611c63576040519150601f19603f3d011682016040523d82523d6000602084013e611c68565b606091505b5050905080611cac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ca390614825565b60405180910390fd5b5050565b6000611cba611ea2565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611d29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d20906146c0565b60405180910390fd5b611d3d82602a61251f90919063ffffffff16565b9050919050565b60285481565b60095481565b60175481565b600560169054906101000a900460ff1681565b601a5481565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60135481565b6000611e1282602a612ff490919063ffffffff16565b9050919050565b611e21611ea2565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611e90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e87906148b7565b60405180910390fd5b611e998161254f565b50565b60185481565b611eaa611f35565b73ffffffffffffffffffffffffffffffffffffffff16611ec86117bf565b73ffffffffffffffffffffffffffffffffffffffff1614611f1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1590614923565b60405180910390fd5b565b6000611f2e82600001613024565b9050919050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611fac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fa3906149b5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361201b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161201290614a47565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516120f99190613c41565b60405180910390a3505050565b60006121128484611d6f565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461218c578181101561217e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161217590614ab3565b60405180910390fd5b61218b8484848403611f3d565b5b50505050565b6000600560169054906101000a900460ff16156121bd576121b4848484613035565b60019050612492565b600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612256576122166132ab565b612255576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161224c90614b1f565b60405180910390fd5b5b6000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161580156122fc5750600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b801561230c575061230b6132ab565b5b9050600080869050600086905061232288611dfc565b1561233e5761232f6132b8565b60019250869150879050612363565b61234787611dfc565b1561235d57612354613302565b60029250612362565b600093505b5b61236b61334c565b1561237957612378612615565b5b6000846123865786612391565b61239089886133b9565b5b905061239e898983613035565b60008411156123f0577fe6f814da7244d1ae6c61b54b5684858ba39cad7b9a91884be10060664987d754838389876123d4611201565b426040516123e796959493929190614b3f565b60405180910390a15b6001840361248857602360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e8e0d2cd84896040518363ffffffff1660e01b81526004016124559291906143a2565b600060405180830381600087803b15801561246f57600080fd5b505af1158015612483573d6000803e3d6000fd5b505050505b6001955050505050505b9392505050565b61251a8363a9059cbb60e01b84846040516024016124b89291906143a2565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506133f9565b505050565b6000612547836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6134c0565b905092915050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6001600560166101000a81548160ff021916908315150217905550600061263b306116f8565b9050612668307f000000000000000000000000000000000000000000000000000000000000000083611f3d565b6000600f546008548361267b9190614ba0565b6126859190614c11565b90506000600f54600b548461269a9190614ba0565b6126a49190614c11565b90506000600f54600d54856126b99190614ba0565b6126c39190614c11565b905082846126d1919061432c565b935081846126df919061432c565b935080846126ed919061432c565b93506000600367ffffffffffffffff81111561270c5761270b61474c565b5b60405190808252806020026020018201604052801561273a5781602001602082028036833780820191505090505b509050308160008151811061275257612751614c42565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f0000000000000000000000000000000000000000000000000000000000000000816001815181106127c1576127c0614c42565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050602660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168160028151811061283257612831614c42565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600080602660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016128ca9190613f92565b602060405180830381865afa1580156128e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061290b9190614375565b90507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ac3893ba88600086306000426040518763ffffffff1660e01b815260040161297296959493929190614d6a565b600060405180830381600087803b15801561298c57600080fd5b505af192505050801561299d575060015b612a3d577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16635c11d7958860008630426040518663ffffffff1660e01b8152600401612a03959493929190614dd2565b600060405180830381600087803b158015612a1d57600080fd5b505af1925050508015612a2e575060015b15612a3857600191505b612a42565b600191505b81612a535750505050505050612f8d565b612a603061dead88613035565b612a8d30602360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1686611f3d565b612aba30602360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1686613035565b600081602660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401612b189190613f92565b602060405180830381865afa158015612b35573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b599190614375565b612b63919061432c565b90506000600d54600b54600854600f54612b7d919061432c565b612b87919061432c565b612b91919061432c565b905060008160095484612ba49190614ba0565b612bae9190614c11565b9050600082600a5485612bc19190614ba0565b612bcb9190614c11565b9050600083600c5486612bde9190614ba0565b612be89190614c11565b9050600081838588612bfa919061432c565b612c04919061432c565b612c0e919061432c565b9050602660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb602160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16866040518363ffffffff1660e01b8152600401612c8f9291906143a2565b6020604051808303816000875af1158015612cae573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cd291906143e0565b50602660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb602260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16856040518363ffffffff1660e01b8152600401612d529291906143a2565b6020604051808303816000875af1158015612d71573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d9591906143e0565b50602660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb602460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518363ffffffff1660e01b8152600401612e159291906143a2565b6020604051808303816000875af1158015612e34573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e5891906143e0565b50602660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb602560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836040518363ffffffff1660e01b8152600401612ed89291906143a2565b6020604051808303816000875af1158015612ef7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f1b91906143e0565b50600560159054906101000a900460ff1615612f3a57612f39613530565b5b7f310a031bae0df2b1a8ba6de615833770c757a404a7395cc0121c13975e67c0b08c85858e868f8742604051612f77989796959493929190614e2c565b60405180910390a1505050505050505050505050505b6000600560166101000a81548160ff021916908315150217905550565b6000612fd2836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6137da565b905092915050565b6000612fe983600001836138ee565b60001c905092915050565b600061301c836000018373ffffffffffffffffffffffffffffffffffffffff1660001b613919565b905092915050565b600081600001805490509050919050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036130a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161309b90614f1c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603613113576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161310a90614fae565b60405180910390fd5b61311e83838361393c565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156131a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161319b90615040565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516132929190613c41565b60405180910390a36132a5848484613941565b50505050565b6000806027541415905090565b601154600881905550601254600981905550601354600a81905550601454600b81905550601554600c81905550601654600d81905550601754600e81905550601854600f81905550565b601954600881905550601a54600981905550601b54600a81905550601c54600b81905550601d54600c81905550601e54600d81905550601f54600e81905550602054600f81905550565b6000600560169054906101000a900460ff161580156133775750600560149054906101000a900460ff165b801561338757506133866132ab565b5b801561339b57506000613399306116f8565b115b80156133b457506133b26133ad611f35565b611dfc565b155b905090565b600080601054600f54846133cd9190614ba0565b6133d79190614c11565b90506133e4843083613035565b80836133f0919061432c565b91505092915050565b600061345b826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166139469092919063ffffffff16565b90506000815111156134bb578080602001905181019061347b91906143e0565b6134ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134b1906150d2565b60405180910390fd5b5b505050565b60006134cc8383613919565b61352557826000018290806001815401808255809150506001900390600052602060002001600090919091909150558260000180549050836001016000848152602001908152602001600020819055506001905061352a565b600090505b92915050565b6000600267ffffffffffffffff81111561354d5761354c61474c565b5b60405190808252806020026020018201604052801561357b5781602001602082028036833780820191505090505b509050308160008151811061359357613592614c42565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f00000000000000000000000000000000000000000000000000000000000000008160018151811061360257613601614c42565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506000613647306116f8565b905060006002826136589190614c11565b90506103e881101561366c575050506137d8565b600047905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166352aa4c2284600088306000426040518763ffffffff1660e01b81526004016136d896959493929190614d6a565b600060405180830381600087803b1580156136f257600080fd5b505af1925050508015613703575060015b6137a3577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663791ac9478460008830426040518663ffffffff1660e01b8152600401613769959493929190614dd2565b600060405180830381600087803b15801561378357600080fd5b505af1925050508015613794575060015b1561379e57600190505b6137a8565b600190505b806137b75750505050506137d8565b600082476137c5919061432c565b90506137d1848261395e565b5050505050505b565b600080836001016000848152602001908152602001600020549050600081146138e257600060018261380c919061432c565b9050600060018660000180549050613824919061432c565b905081811461389357600086600001828154811061384557613844614c42565b5b906000526020600020015490508087600001848154811061386957613868614c42565b5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b856000018054806138a7576138a66150f2565b5b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506138e8565b60009150505b92915050565b600082600001828154811061390657613905614c42565b5b9060005260206000200154905092915050565b600080836001016000848152602001908152602001600020541415905092915050565b505050565b505050565b60606139558484600085613a73565b90509392505050565b613989307f000000000000000000000000000000000000000000000000000000000000000084611f3d565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663f305d7198230856000806000426040518863ffffffff1660e01b81526004016139ef96959493929190615121565b60606040518083038185885af193505050508015613a2b57506040513d601f19601f82011682018060405250810190613a289190615182565b60015b15613a6f575050507ff75993dbe1645872cbbea6395e1feebee76b435baf0e4d62d7eac269c6f57b24828242604051613a66939291906151d5565b60405180910390a15b5050565b606082471015613ab8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613aaf9061527e565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051613ae191906147c2565b60006040518083038185875af1925050503d8060008114613b1e576040519150601f19603f3d011682016040523d82523d6000602084013e613b23565b606091505b5091509150613b3487838387613b40565b92505050949350505050565b60608315613ba2576000835103613b9a57613b5a85613bb5565b613b99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b90906152ea565b60405180910390fd5b5b829050613bad565b613bac8383613bd8565b5b949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600082511115613beb5781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613c1f9190613cec565b60405180910390fd5b6000819050919050565b613c3b81613c28565b82525050565b6000602082019050613c566000830184613c32565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613c96578082015181840152602081019050613c7b565b60008484015250505050565b6000601f19601f8301169050919050565b6000613cbe82613c5c565b613cc88185613c67565b9350613cd8818560208601613c78565b613ce181613ca2565b840191505092915050565b60006020820190508181036000830152613d068184613cb3565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613d3e82613d13565b9050919050565b613d4e81613d33565b8114613d5957600080fd5b50565b600081359050613d6b81613d45565b92915050565b613d7a81613c28565b8114613d8557600080fd5b50565b600081359050613d9781613d71565b92915050565b60008060408385031215613db457613db3613d0e565b5b6000613dc285828601613d5c565b9250506020613dd385828601613d88565b9150509250929050565b60008115159050919050565b613df281613ddd565b82525050565b6000602082019050613e0d6000830184613de9565b92915050565b600080600080600080600060e0888a031215613e3257613e31613d0e565b5b6000613e408a828b01613d88565b9750506020613e518a828b01613d88565b9650506040613e628a828b01613d88565b9550506060613e738a828b01613d88565b9450506080613e848a828b01613d88565b93505060a0613e958a828b01613d88565b92505060c0613ea68a828b01613d88565b91505092959891949750929550565b600080600080600060a08688031215613ed157613ed0613d0e565b5b6000613edf88828901613d5c565b9550506020613ef088828901613d5c565b9450506040613f0188828901613d5c565b9350506060613f1288828901613d5c565b9250506080613f2388828901613d5c565b9150509295509295909350565b600080600060608486031215613f4957613f48613d0e565b5b6000613f5786828701613d5c565b9350506020613f6886828701613d5c565b9250506040613f7986828701613d88565b9150509250925092565b613f8c81613d33565b82525050565b6000602082019050613fa76000830184613f83565b92915050565b600060ff82169050919050565b613fc381613fad565b82525050565b6000602082019050613fde6000830184613fba565b92915050565b600060208284031215613ffa57613ff9613d0e565b5b600061400884828501613d5c565b91505092915050565b61401a81613ddd565b811461402557600080fd5b50565b60008135905061403781614011565b92915050565b6000806040838503121561405457614053613d0e565b5b600061406285828601613d5c565b925050602061407385828601614028565b9150509250929050565b6000819050919050565b60006140a261409d61409884613d13565b61407d565b613d13565b9050919050565b60006140b482614087565b9050919050565b60006140c6826140a9565b9050919050565b6140d6816140bb565b82525050565b60006020820190506140f160008301846140cd565b92915050565b60006020828403121561410d5761410c613d0e565b5b600061411b84828501614028565b91505092915050565b60006020828403121561413a57614139613d0e565b5b600061414884828501613d88565b91505092915050565b6000806040838503121561416857614167613d0e565b5b600061417685828601613d5c565b925050602061418785828601613d5c565b9150509250929050565b7f416c7265616479206c61756e6368656400000000000000000000000000000000600082015250565b60006141c7601083613c67565b91506141d282614191565b602082019050919050565b600060208201905081810360008301526141f6816141ba565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061424457607f821691505b602082108103614257576142566141fd565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061429782613c28565b91506142a283613c28565b92508282019050808211156142ba576142b961425d565b5b92915050565b7f4d41582042555920464545532045584345454400000000000000000000000000600082015250565b60006142f6601383613c67565b9150614301826142c0565b602082019050919050565b60006020820190508181036000830152614325816142e9565b9050919050565b600061433782613c28565b915061434283613c28565b925082820390508181111561435a5761435961425d565b5b92915050565b60008151905061436f81613d71565b92915050565b60006020828403121561438b5761438a613d0e565b5b600061439984828501614360565b91505092915050565b60006040820190506143b76000830185613f83565b6143c46020830184613c32565b9392505050565b6000815190506143da81614011565b92915050565b6000602082840312156143f6576143f5613d0e565b5b6000614404848285016143cb565b91505092915050565b7f43414e5420524553515545204f574e20544f4b454e0000000000000000000000600082015250565b6000614443601583613c67565b915061444e8261440d565b602082019050919050565b6000602082019050818103600083015261447281614436565b9050919050565b7f416c726561647920696e697469616c697a656400000000000000000000000000600082015250565b60006144af601383613c67565b91506144ba82614479565b602082019050919050565b600060208201905081810360008301526144de816144a2565b9050919050565b60006040820190506144fa6000830185613f83565b6145076020830184613f83565b9392505050565b60008151905061451d81613d45565b92915050565b60006020828403121561453957614538613d0e565b5b60006145478482850161450e565b91505092915050565b7f4d41582053454c4c204645455320455843454544000000000000000000000000600082015250565b6000614586601483613c67565b915061459182614550565b602082019050919050565b600060208201905081810360008301526145b581614579565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000614618602583613c67565b9150614623826145bc565b604082019050919050565b600060208201905081810360008301526146478161460b565b9050919050565b7f41524250414e44413a207061697220697320746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006146aa602283613c67565b91506146b58261464e565b604082019050919050565b600060208201905081810360008301526146d98161469d565b9050919050565b7f41524250414e44413a20696e646578206f7574206f6620626f756e6473000000600082015250565b6000614716601d83613c67565b9150614721826146e0565b602082019050919050565b6000602082019050818103600083015261474581614709565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600081519050919050565b600081905092915050565b600061479c8261477b565b6147a68185614786565b93506147b6818560208601613c78565b80840191505092915050565b60006147ce8284614791565b915081905092915050565b7f41524250414e44413a204554485f5452414e534645525f4641494c4544000000600082015250565b600061480f601d83613c67565b915061481a826147d9565b602082019050919050565b6000602082019050818103600083015261483e81614802565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006148a1602683613c67565b91506148ac82614845565b604082019050919050565b600060208201905081810360008301526148d081614894565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061490d602083613c67565b9150614918826148d7565b602082019050919050565b6000602082019050818103600083015261493c81614900565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061499f602483613c67565b91506149aa82614943565b604082019050919050565b600060208201905081810360008301526149ce81614992565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000614a31602283613c67565b9150614a3c826149d5565b604082019050919050565b60006020820190508181036000830152614a6081614a24565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b6000614a9d601d83613c67565b9150614aa882614a67565b602082019050919050565b60006020820190508181036000830152614acc81614a90565b9050919050565b7f54726164696e67206e6f74206f70656e20796574000000000000000000000000600082015250565b6000614b09601483613c67565b9150614b1482614ad3565b602082019050919050565b60006020820190508181036000830152614b3881614afc565b9050919050565b600060c082019050614b546000830189613f83565b614b616020830188613f83565b614b6e6040830187613c32565b614b7b6060830186613c32565b614b886080830185613c32565b614b9560a0830184613c32565b979650505050505050565b6000614bab82613c28565b9150614bb683613c28565b9250828202614bc481613c28565b91508282048414831517614bdb57614bda61425d565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614c1c82613c28565b9150614c2783613c28565b925082614c3757614c36614be2565b5b828204905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000819050919050565b6000614c96614c91614c8c84614c71565b61407d565b613c28565b9050919050565b614ca681614c7b565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b614ce181613d33565b82525050565b6000614cf38383614cd8565b60208301905092915050565b6000602082019050919050565b6000614d1782614cac565b614d218185614cb7565b9350614d2c83614cc8565b8060005b83811015614d5d578151614d448882614ce7565b9750614d4f83614cff565b925050600181019050614d30565b5085935050505092915050565b600060c082019050614d7f6000830189613c32565b614d8c6020830188614c9d565b8181036040830152614d9e8187614d0c565b9050614dad6060830186613f83565b614dba6080830185613f83565b614dc760a0830184613c32565b979650505050505050565b600060a082019050614de76000830188613c32565b614df46020830187614c9d565b8181036040830152614e068186614d0c565b9050614e156060830185613f83565b614e226080830184613c32565b9695505050505050565b600061010082019050614e42600083018b613c32565b614e4f602083018a613c32565b614e5c6040830189613c32565b614e696060830188613c32565b614e766080830187613c32565b614e8360a0830186613c32565b614e9060c0830185613c32565b614e9d60e0830184613c32565b9998505050505050505050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000614f06602583613c67565b9150614f1182614eaa565b604082019050919050565b60006020820190508181036000830152614f3581614ef9565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000614f98602383613c67565b9150614fa382614f3c565b604082019050919050565b60006020820190508181036000830152614fc781614f8b565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b600061502a602683613c67565b915061503582614fce565b604082019050919050565b600060208201905081810360008301526150598161501d565b9050919050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b60006150bc602a83613c67565b91506150c782615060565b604082019050919050565b600060208201905081810360008301526150eb816150af565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b600060c0820190506151366000830189613f83565b6151436020830188613c32565b6151506040830187614c9d565b61515d6060830186614c9d565b61516a6080830185613f83565b61517760a0830184613c32565b979650505050505050565b60008060006060848603121561519b5761519a613d0e565b5b60006151a986828701614360565b93505060206151ba86828701614360565b92505060406151cb86828701614360565b9150509250925092565b60006060820190506151ea6000830186613c32565b6151f76020830185613c32565b6152046040830184613c32565b949350505050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b6000615268602683613c67565b91506152738261520c565b604082019050919050565b600060208201905081810360008301526152978161525b565b9050919050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b60006152d4601d83613c67565b91506152df8261529e565b602082019050919050565b60006020820190508181036000830152615303816152c7565b905091905056fea26469706673582212206efde8ac7da21b87c638a01eb8797b6d76b75d9b3a5a9d0129853eaedd343f0164736f6c63430008130033000000000000000000000000912ce59144191c1204e64559fe8253a0e49e65480000000000000000000000006eccab422d763ac031210895c81787e87b43a652000000000000000000000000c873fecbd354f5a56e00e710b90ef4201db2448d00000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab1

Deployed Bytecode

0x60806040526004361061039b5760003560e01c806382d20116116101dc578063b8c6113011610102578063cdba31fd116100a0578063e1e5a66d1161006f578063e1e5a66d14610d61578063e5e31b1314610d8c578063f2fde38b14610dc9578063fb5f27fb14610df2576103a2565b8063cdba31fd14610ca3578063d830678614610cce578063dbd6c48914610cf9578063dd62ed3e14610d24576103a2565b8063bfa382b5116100dc578063bfa382b514610bf9578063c2b7bbb614610c10578063c6d2577d14610c4d578063cb806e0714610c78576103a2565b8063b8c6113014610b68578063bdf391cc14610b91578063bf56b37114610bce576103a2565b806395d89b411161017a578063aac46c9511610149578063aac46c9514610abe578063ace1880114610ae7578063b6309f6814610b12578063b7eed4c414610b3d576103a2565b806395d89b41146109dc578063a457c2d714610a07578063a5bc508514610a44578063a9059cbb14610a81576103a2565b806386c8782f116101b657806386c8782f146109465780638da5cb5b146109715780638fbbd7501461099c5780639272293c146109b3576103a2565b806382d20116146108c557806386013940146108f0578063861faf5f1461091b576103a2565b80632d2f244b116102c1578063531484161161025f57806370a082311161022e57806370a082311461080957806370c8810e14610846578063715018a6146108715780638072250b14610888576103a2565b8063531484161461075f578063658d4b7f1461078a5780636c470595146107b35780636ddd1713146107de576103a2565b8063395093511161029b57806339509351146106a55780633f4218e0146106e25780634460d3cf1461071f5780634fab9e4c14610748576103a2565b80632d2f244b14610638578063313ce56714610663578063364333f41461068e576103a2565b806312835c5e1161033957806318abb6351161030857806318abb6351461057c578063234a2daa146105a557806323b872dd146105d05780632b112e491461060d576103a2565b806312835c5e146104d057806315674e8e146104fb578063180b0d7e1461052657806318160ddd14610551576103a2565b806306fdde031161037557806306fdde0314610414578063095ea7b31461043f5780630ca5979b1461047c5780631107b3a5146104a5576103a2565b806301339c21146103a7578063017e24e1146103be5780630323aac7146103e9576103a2565b366103a257005b600080fd5b3480156103b357600080fd5b506103bc610e1d565b005b3480156103ca57600080fd5b506103d3610e7a565b6040516103e09190613c41565b60405180910390f35b3480156103f557600080fd5b506103fe610e80565b60405161040b9190613c41565b60405180910390f35b34801561042057600080fd5b50610429610e91565b6040516104369190613cec565b60405180910390f35b34801561044b57600080fd5b5061046660048036038101906104619190613d9d565b610f23565b6040516104739190613df8565b60405180910390f35b34801561048857600080fd5b506104a3600480360381019061049e9190613e13565b610f46565b005b3480156104b157600080fd5b506104ba611058565b6040516104c79190613c41565b60405180910390f35b3480156104dc57600080fd5b506104e561105e565b6040516104f29190613c41565b60405180910390f35b34801561050757600080fd5b50610510611064565b60405161051d9190613c41565b60405180910390f35b34801561053257600080fd5b5061053b61106a565b6040516105489190613c41565b60405180910390f35b34801561055d57600080fd5b50610566611070565b6040516105739190613c41565b60405180910390f35b34801561058857600080fd5b506105a3600480360381019061059e9190613eb5565b61107a565b005b3480156105b157600080fd5b506105ba6111ce565b6040516105c79190613c41565b60405180910390f35b3480156105dc57600080fd5b506105f760048036038101906105f29190613f30565b6111d4565b6040516106049190613df8565b60405180910390f35b34801561061957600080fd5b50610622611201565b60405161062f9190613c41565b60405180910390f35b34801561064457600080fd5b5061064d611239565b60405161065a9190613f92565b60405180910390f35b34801561066f57600080fd5b5061067861125f565b6040516106859190613fc9565b60405180910390f35b34801561069a57600080fd5b506106a3611268565b005b3480156106b157600080fd5b506106cc60048036038101906106c79190613d9d565b6113b5565b6040516106d99190613df8565b60405180910390f35b3480156106ee57600080fd5b5061070960048036038101906107049190613fe4565b6113ec565b6040516107169190613df8565b60405180910390f35b34801561072b57600080fd5b5061074660048036038101906107419190613fe4565b61140c565b005b34801561075457600080fd5b5061075d611529565b005b34801561076b57600080fd5b50610774611676565b6040516107819190613c41565b60405180910390f35b34801561079657600080fd5b506107b160048036038101906107ac919061403d565b61167c565b005b3480156107bf57600080fd5b506107c86116df565b6040516107d59190613c41565b60405180910390f35b3480156107ea57600080fd5b506107f36116e5565b6040516108009190613df8565b60405180910390f35b34801561081557600080fd5b50610830600480360381019061082b9190613fe4565b6116f8565b60405161083d9190613c41565b60405180910390f35b34801561085257600080fd5b5061085b611740565b6040516108689190613c41565b60405180910390f35b34801561087d57600080fd5b50610886611746565b005b34801561089457600080fd5b506108af60048036038101906108aa9190613fe4565b61175a565b6040516108bc9190613df8565b60405180910390f35b3480156108d157600080fd5b506108da61177a565b6040516108e79190613c41565b60405180910390f35b3480156108fc57600080fd5b50610905611780565b6040516109129190613df8565b60405180910390f35b34801561092757600080fd5b50610930611793565b60405161093d91906140dc565b60405180910390f35b34801561095257600080fd5b5061095b6117b9565b6040516109689190613c41565b60405180910390f35b34801561097d57600080fd5b506109866117bf565b6040516109939190613f92565b60405180910390f35b3480156109a857600080fd5b506109b16117e9565b005b3480156109bf57600080fd5b506109da60048036038101906109d59190613e13565b6117fb565b005b3480156109e857600080fd5b506109f161190d565b6040516109fe9190613cec565b60405180910390f35b348015610a1357600080fd5b50610a2e6004803603810190610a299190613d9d565b61199f565b604051610a3b9190613df8565b60405180910390f35b348015610a5057600080fd5b50610a6b6004803603810190610a669190613fe4565b611a16565b604051610a789190613df8565b60405180910390f35b348015610a8d57600080fd5b50610aa86004803603810190610aa39190613d9d565b611aaa565b604051610ab59190613df8565b60405180910390f35b348015610aca57600080fd5b50610ae56004803603810190610ae091906140f7565b611ac6565b005b348015610af357600080fd5b50610afc611aeb565b604051610b099190613c41565b60405180910390f35b348015610b1e57600080fd5b50610b27611af1565b604051610b349190613c41565b60405180910390f35b348015610b4957600080fd5b50610b52611af7565b604051610b5f9190613c41565b60405180910390f35b348015610b7457600080fd5b50610b8f6004803603810190610b8a91906140f7565b611afd565b005b348015610b9d57600080fd5b50610bb86004803603810190610bb39190614124565b611b22565b604051610bc59190613f92565b60405180910390f35b348015610bda57600080fd5b50610be3611b97565b604051610bf09190613c41565b60405180910390f35b348015610c0557600080fd5b50610c0e611b9d565b005b348015610c1c57600080fd5b50610c376004803603810190610c329190613fe4565b611cb0565b604051610c449190613df8565b60405180910390f35b348015610c5957600080fd5b50610c62611d44565b604051610c6f9190613c41565b60405180910390f35b348015610c8457600080fd5b50610c8d611d4a565b604051610c9a9190613c41565b60405180910390f35b348015610caf57600080fd5b50610cb8611d50565b604051610cc59190613c41565b60405180910390f35b348015610cda57600080fd5b50610ce3611d56565b604051610cf09190613df8565b60405180910390f35b348015610d0557600080fd5b50610d0e611d69565b604051610d1b9190613c41565b60405180910390f35b348015610d3057600080fd5b50610d4b6004803603810190610d469190614151565b611d6f565b604051610d589190613c41565b60405180910390f35b348015610d6d57600080fd5b50610d76611df6565b604051610d839190613c41565b60405180910390f35b348015610d9857600080fd5b50610db36004803603810190610dae9190613fe4565b611dfc565b604051610dc09190613df8565b60405180910390f35b348015610dd557600080fd5b50610df06004803603810190610deb9190613fe4565b611e19565b005b348015610dfe57600080fd5b50610e07611e9c565b604051610e149190613c41565b60405180910390f35b610e25611ea2565b600060275414610e6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e61906141dd565b60405180910390fd5b4360278190555042602881905550565b600a5481565b6000610e8c602a611f20565b905090565b606060038054610ea09061422c565b80601f0160208091040260200160405190810160405280929190818152602001828054610ecc9061422c565b8015610f195780601f10610eee57610100808354040283529160200191610f19565b820191906000526020600020905b815481529060010190602001808311610efc57829003601f168201915b5050505050905090565b600080610f2e611f35565b9050610f3b818585611f3d565b600191505092915050565b610f4e611ea2565b6105dc81838587898b8d610f62919061428c565b610f6c919061428c565b610f76919061428c565b610f80919061428c565b610f8a919061428c565b610f94919061428c565b1115610fd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fcc9061430c565b60405180910390fd5b8660128190555085601381905550846014819055508360158190555082601681905550816017819055508060118190555080828486888a8c611017919061428c565b611021919061428c565b61102b919061428c565b611035919061428c565b61103f919061428c565b611049919061428c565b60188190555050505050505050565b601c5481565b601f5481565b60115481565b60105481565b6000600254905090565b611082611ea2565b84602160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555083602260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081602460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080602560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050505050565b60195481565b6000806111df611f35565b90506111ec858285612106565b6111f7858585612192565b9150509392505050565b600061120d60006116f8565b61121861dead6116f8565b611220611070565b61122a919061432c565b611234919061432c565b905090565b602460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006006905090565b611270611ea2565b602660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6112b6611f35565b602660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016113119190613f92565b602060405180830381865afa15801561132e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113529190614375565b6040518363ffffffff1660e01b815260040161136f9291906143a2565b6020604051808303816000875af115801561138e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113b291906143e0565b50565b6000806113c0611f35565b90506113e18185856113d28589611d6f565b6113dc919061428c565b611f3d565b600191505092915050565b60066020528060005260406000206000915054906101000a900460ff1681565b611414611ea2565b3073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611482576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147990614459565b60405180910390fd5b611526338273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016114bf9190613f92565b602060405180830381865afa1580156114dc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115009190614375565b8373ffffffffffffffffffffffffffffffffffffffff166124999092919063ffffffff16565b50565b611531611ea2565b602960009054906101000a900460ff1615611581576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611578906144c5565b60405180910390fd5b60007f0000000000000000000000006eccab422d763ac031210895c81787e87b43a65273ffffffffffffffffffffffffffffffffffffffff1663c9c653967f00000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab1306040518363ffffffff1660e01b81526004016115fe9291906144e5565b6020604051808303816000875af115801561161d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116419190614523565b905061165781602a61251f90919063ffffffff16565b506001602960006101000a81548160ff02191690831515021790555050565b60205481565b611684611ea2565b80600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b60155481565b600560149054906101000a900460ff1681565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60125481565b61174e611ea2565b611758600061254f565b565b60076020528060005260406000206000915054906101000a900460ff1681565b60145481565b600560159054906101000a900460ff1681565b602660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60165481565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6117f1611ea2565b6117f9612615565b565b611803611ea2565b6105dc81838587898b8d611817919061428c565b611821919061428c565b61182b919061428c565b611835919061428c565b61183f919061428c565b611849919061428c565b111561188a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118819061459c565b60405180910390fd5b86601a8190555085601b8190555084601c8190555083601d8190555082601e8190555081601f819055508060198190555080828486888a8c6118cc919061428c565b6118d6919061428c565b6118e0919061428c565b6118ea919061428c565b6118f4919061428c565b6118fe919061428c565b60208190555050505050505050565b60606004805461191c9061422c565b80601f01602080910402602001604051908101604052809291908181526020018280546119489061422c565b80156119955780601f1061196a57610100808354040283529160200191611995565b820191906000526020600020905b81548152906001019060200180831161197857829003601f168201915b5050505050905090565b6000806119aa611f35565b905060006119b88286611d6f565b9050838110156119fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f49061462e565b60405180910390fd5b611a0a8286868403611f3d565b60019250505092915050565b6000611a20611ea2565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611a8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a86906146c0565b60405180910390fd5b611aa382602a612faa90919063ffffffff16565b9050919050565b6000611abe611ab7611f35565b8484612192565b905092915050565b611ace611ea2565b80600560156101000a81548160ff02191690831515021790555050565b601e5481565b601b5481565b601d5481565b611b05611ea2565b80600560146101000a81548160ff02191690831515021790555050565b60006001611b30602a611f20565b611b3a919061432c565b821115611b7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b739061472c565b60405180910390fd5b611b9082602a612fda90919063ffffffff16565b9050919050565b60275481565b611ba5611ea2565b60004790506000611bb4611f35565b73ffffffffffffffffffffffffffffffffffffffff1682600067ffffffffffffffff811115611be657611be561474c565b5b6040519080825280601f01601f191660200182016040528015611c185781602001600182028036833780820191505090505b50604051611c2691906147c2565b60006040518083038185875af1925050503d8060008114611c63576040519150601f19603f3d011682016040523d82523d6000602084013e611c68565b606091505b5050905080611cac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ca390614825565b60405180910390fd5b5050565b6000611cba611ea2565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611d29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d20906146c0565b60405180910390fd5b611d3d82602a61251f90919063ffffffff16565b9050919050565b60285481565b60095481565b60175481565b600560169054906101000a900460ff1681565b601a5481565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60135481565b6000611e1282602a612ff490919063ffffffff16565b9050919050565b611e21611ea2565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611e90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e87906148b7565b60405180910390fd5b611e998161254f565b50565b60185481565b611eaa611f35565b73ffffffffffffffffffffffffffffffffffffffff16611ec86117bf565b73ffffffffffffffffffffffffffffffffffffffff1614611f1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1590614923565b60405180910390fd5b565b6000611f2e82600001613024565b9050919050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611fac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fa3906149b5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361201b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161201290614a47565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516120f99190613c41565b60405180910390a3505050565b60006121128484611d6f565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461218c578181101561217e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161217590614ab3565b60405180910390fd5b61218b8484848403611f3d565b5b50505050565b6000600560169054906101000a900460ff16156121bd576121b4848484613035565b60019050612492565b600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612256576122166132ab565b612255576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161224c90614b1f565b60405180910390fd5b5b6000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161580156122fc5750600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b801561230c575061230b6132ab565b5b9050600080869050600086905061232288611dfc565b1561233e5761232f6132b8565b60019250869150879050612363565b61234787611dfc565b1561235d57612354613302565b60029250612362565b600093505b5b61236b61334c565b1561237957612378612615565b5b6000846123865786612391565b61239089886133b9565b5b905061239e898983613035565b60008411156123f0577fe6f814da7244d1ae6c61b54b5684858ba39cad7b9a91884be10060664987d754838389876123d4611201565b426040516123e796959493929190614b3f565b60405180910390a15b6001840361248857602360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e8e0d2cd84896040518363ffffffff1660e01b81526004016124559291906143a2565b600060405180830381600087803b15801561246f57600080fd5b505af1158015612483573d6000803e3d6000fd5b505050505b6001955050505050505b9392505050565b61251a8363a9059cbb60e01b84846040516024016124b89291906143a2565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506133f9565b505050565b6000612547836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6134c0565b905092915050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6001600560166101000a81548160ff021916908315150217905550600061263b306116f8565b9050612668307f000000000000000000000000c873fecbd354f5a56e00e710b90ef4201db2448d83611f3d565b6000600f546008548361267b9190614ba0565b6126859190614c11565b90506000600f54600b548461269a9190614ba0565b6126a49190614c11565b90506000600f54600d54856126b99190614ba0565b6126c39190614c11565b905082846126d1919061432c565b935081846126df919061432c565b935080846126ed919061432c565b93506000600367ffffffffffffffff81111561270c5761270b61474c565b5b60405190808252806020026020018201604052801561273a5781602001602082028036833780820191505090505b509050308160008151811061275257612751614c42565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f00000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab1816001815181106127c1576127c0614c42565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050602660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168160028151811061283257612831614c42565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600080602660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016128ca9190613f92565b602060405180830381865afa1580156128e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061290b9190614375565b90507f000000000000000000000000c873fecbd354f5a56e00e710b90ef4201db2448d73ffffffffffffffffffffffffffffffffffffffff1663ac3893ba88600086306000426040518763ffffffff1660e01b815260040161297296959493929190614d6a565b600060405180830381600087803b15801561298c57600080fd5b505af192505050801561299d575060015b612a3d577f000000000000000000000000c873fecbd354f5a56e00e710b90ef4201db2448d73ffffffffffffffffffffffffffffffffffffffff16635c11d7958860008630426040518663ffffffff1660e01b8152600401612a03959493929190614dd2565b600060405180830381600087803b158015612a1d57600080fd5b505af1925050508015612a2e575060015b15612a3857600191505b612a42565b600191505b81612a535750505050505050612f8d565b612a603061dead88613035565b612a8d30602360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1686611f3d565b612aba30602360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1686613035565b600081602660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401612b189190613f92565b602060405180830381865afa158015612b35573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b599190614375565b612b63919061432c565b90506000600d54600b54600854600f54612b7d919061432c565b612b87919061432c565b612b91919061432c565b905060008160095484612ba49190614ba0565b612bae9190614c11565b9050600082600a5485612bc19190614ba0565b612bcb9190614c11565b9050600083600c5486612bde9190614ba0565b612be89190614c11565b9050600081838588612bfa919061432c565b612c04919061432c565b612c0e919061432c565b9050602660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb602160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16866040518363ffffffff1660e01b8152600401612c8f9291906143a2565b6020604051808303816000875af1158015612cae573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cd291906143e0565b50602660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb602260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16856040518363ffffffff1660e01b8152600401612d529291906143a2565b6020604051808303816000875af1158015612d71573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d9591906143e0565b50602660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb602460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518363ffffffff1660e01b8152600401612e159291906143a2565b6020604051808303816000875af1158015612e34573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e5891906143e0565b50602660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb602560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836040518363ffffffff1660e01b8152600401612ed89291906143a2565b6020604051808303816000875af1158015612ef7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f1b91906143e0565b50600560159054906101000a900460ff1615612f3a57612f39613530565b5b7f310a031bae0df2b1a8ba6de615833770c757a404a7395cc0121c13975e67c0b08c85858e868f8742604051612f77989796959493929190614e2c565b60405180910390a1505050505050505050505050505b6000600560166101000a81548160ff021916908315150217905550565b6000612fd2836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6137da565b905092915050565b6000612fe983600001836138ee565b60001c905092915050565b600061301c836000018373ffffffffffffffffffffffffffffffffffffffff1660001b613919565b905092915050565b600081600001805490509050919050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036130a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161309b90614f1c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603613113576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161310a90614fae565b60405180910390fd5b61311e83838361393c565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156131a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161319b90615040565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516132929190613c41565b60405180910390a36132a5848484613941565b50505050565b6000806027541415905090565b601154600881905550601254600981905550601354600a81905550601454600b81905550601554600c81905550601654600d81905550601754600e81905550601854600f81905550565b601954600881905550601a54600981905550601b54600a81905550601c54600b81905550601d54600c81905550601e54600d81905550601f54600e81905550602054600f81905550565b6000600560169054906101000a900460ff161580156133775750600560149054906101000a900460ff165b801561338757506133866132ab565b5b801561339b57506000613399306116f8565b115b80156133b457506133b26133ad611f35565b611dfc565b155b905090565b600080601054600f54846133cd9190614ba0565b6133d79190614c11565b90506133e4843083613035565b80836133f0919061432c565b91505092915050565b600061345b826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166139469092919063ffffffff16565b90506000815111156134bb578080602001905181019061347b91906143e0565b6134ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134b1906150d2565b60405180910390fd5b5b505050565b60006134cc8383613919565b61352557826000018290806001815401808255809150506001900390600052602060002001600090919091909150558260000180549050836001016000848152602001908152602001600020819055506001905061352a565b600090505b92915050565b6000600267ffffffffffffffff81111561354d5761354c61474c565b5b60405190808252806020026020018201604052801561357b5781602001602082028036833780820191505090505b509050308160008151811061359357613592614c42565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f00000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab18160018151811061360257613601614c42565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506000613647306116f8565b905060006002826136589190614c11565b90506103e881101561366c575050506137d8565b600047905060007f000000000000000000000000c873fecbd354f5a56e00e710b90ef4201db2448d73ffffffffffffffffffffffffffffffffffffffff166352aa4c2284600088306000426040518763ffffffff1660e01b81526004016136d896959493929190614d6a565b600060405180830381600087803b1580156136f257600080fd5b505af1925050508015613703575060015b6137a3577f000000000000000000000000c873fecbd354f5a56e00e710b90ef4201db2448d73ffffffffffffffffffffffffffffffffffffffff1663791ac9478460008830426040518663ffffffff1660e01b8152600401613769959493929190614dd2565b600060405180830381600087803b15801561378357600080fd5b505af1925050508015613794575060015b1561379e57600190505b6137a8565b600190505b806137b75750505050506137d8565b600082476137c5919061432c565b90506137d1848261395e565b5050505050505b565b600080836001016000848152602001908152602001600020549050600081146138e257600060018261380c919061432c565b9050600060018660000180549050613824919061432c565b905081811461389357600086600001828154811061384557613844614c42565b5b906000526020600020015490508087600001848154811061386957613868614c42565b5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b856000018054806138a7576138a66150f2565b5b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506138e8565b60009150505b92915050565b600082600001828154811061390657613905614c42565b5b9060005260206000200154905092915050565b600080836001016000848152602001908152602001600020541415905092915050565b505050565b505050565b60606139558484600085613a73565b90509392505050565b613989307f000000000000000000000000c873fecbd354f5a56e00e710b90ef4201db2448d84611f3d565b7f000000000000000000000000c873fecbd354f5a56e00e710b90ef4201db2448d73ffffffffffffffffffffffffffffffffffffffff1663f305d7198230856000806000426040518863ffffffff1660e01b81526004016139ef96959493929190615121565b60606040518083038185885af193505050508015613a2b57506040513d601f19601f82011682018060405250810190613a289190615182565b60015b15613a6f575050507ff75993dbe1645872cbbea6395e1feebee76b435baf0e4d62d7eac269c6f57b24828242604051613a66939291906151d5565b60405180910390a15b5050565b606082471015613ab8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613aaf9061527e565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051613ae191906147c2565b60006040518083038185875af1925050503d8060008114613b1e576040519150601f19603f3d011682016040523d82523d6000602084013e613b23565b606091505b5091509150613b3487838387613b40565b92505050949350505050565b60608315613ba2576000835103613b9a57613b5a85613bb5565b613b99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b90906152ea565b60405180910390fd5b5b829050613bad565b613bac8383613bd8565b5b949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600082511115613beb5781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613c1f9190613cec565b60405180910390fd5b6000819050919050565b613c3b81613c28565b82525050565b6000602082019050613c566000830184613c32565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613c96578082015181840152602081019050613c7b565b60008484015250505050565b6000601f19601f8301169050919050565b6000613cbe82613c5c565b613cc88185613c67565b9350613cd8818560208601613c78565b613ce181613ca2565b840191505092915050565b60006020820190508181036000830152613d068184613cb3565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613d3e82613d13565b9050919050565b613d4e81613d33565b8114613d5957600080fd5b50565b600081359050613d6b81613d45565b92915050565b613d7a81613c28565b8114613d8557600080fd5b50565b600081359050613d9781613d71565b92915050565b60008060408385031215613db457613db3613d0e565b5b6000613dc285828601613d5c565b9250506020613dd385828601613d88565b9150509250929050565b60008115159050919050565b613df281613ddd565b82525050565b6000602082019050613e0d6000830184613de9565b92915050565b600080600080600080600060e0888a031215613e3257613e31613d0e565b5b6000613e408a828b01613d88565b9750506020613e518a828b01613d88565b9650506040613e628a828b01613d88565b9550506060613e738a828b01613d88565b9450506080613e848a828b01613d88565b93505060a0613e958a828b01613d88565b92505060c0613ea68a828b01613d88565b91505092959891949750929550565b600080600080600060a08688031215613ed157613ed0613d0e565b5b6000613edf88828901613d5c565b9550506020613ef088828901613d5c565b9450506040613f0188828901613d5c565b9350506060613f1288828901613d5c565b9250506080613f2388828901613d5c565b9150509295509295909350565b600080600060608486031215613f4957613f48613d0e565b5b6000613f5786828701613d5c565b9350506020613f6886828701613d5c565b9250506040613f7986828701613d88565b9150509250925092565b613f8c81613d33565b82525050565b6000602082019050613fa76000830184613f83565b92915050565b600060ff82169050919050565b613fc381613fad565b82525050565b6000602082019050613fde6000830184613fba565b92915050565b600060208284031215613ffa57613ff9613d0e565b5b600061400884828501613d5c565b91505092915050565b61401a81613ddd565b811461402557600080fd5b50565b60008135905061403781614011565b92915050565b6000806040838503121561405457614053613d0e565b5b600061406285828601613d5c565b925050602061407385828601614028565b9150509250929050565b6000819050919050565b60006140a261409d61409884613d13565b61407d565b613d13565b9050919050565b60006140b482614087565b9050919050565b60006140c6826140a9565b9050919050565b6140d6816140bb565b82525050565b60006020820190506140f160008301846140cd565b92915050565b60006020828403121561410d5761410c613d0e565b5b600061411b84828501614028565b91505092915050565b60006020828403121561413a57614139613d0e565b5b600061414884828501613d88565b91505092915050565b6000806040838503121561416857614167613d0e565b5b600061417685828601613d5c565b925050602061418785828601613d5c565b9150509250929050565b7f416c7265616479206c61756e6368656400000000000000000000000000000000600082015250565b60006141c7601083613c67565b91506141d282614191565b602082019050919050565b600060208201905081810360008301526141f6816141ba565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061424457607f821691505b602082108103614257576142566141fd565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061429782613c28565b91506142a283613c28565b92508282019050808211156142ba576142b961425d565b5b92915050565b7f4d41582042555920464545532045584345454400000000000000000000000000600082015250565b60006142f6601383613c67565b9150614301826142c0565b602082019050919050565b60006020820190508181036000830152614325816142e9565b9050919050565b600061433782613c28565b915061434283613c28565b925082820390508181111561435a5761435961425d565b5b92915050565b60008151905061436f81613d71565b92915050565b60006020828403121561438b5761438a613d0e565b5b600061439984828501614360565b91505092915050565b60006040820190506143b76000830185613f83565b6143c46020830184613c32565b9392505050565b6000815190506143da81614011565b92915050565b6000602082840312156143f6576143f5613d0e565b5b6000614404848285016143cb565b91505092915050565b7f43414e5420524553515545204f574e20544f4b454e0000000000000000000000600082015250565b6000614443601583613c67565b915061444e8261440d565b602082019050919050565b6000602082019050818103600083015261447281614436565b9050919050565b7f416c726561647920696e697469616c697a656400000000000000000000000000600082015250565b60006144af601383613c67565b91506144ba82614479565b602082019050919050565b600060208201905081810360008301526144de816144a2565b9050919050565b60006040820190506144fa6000830185613f83565b6145076020830184613f83565b9392505050565b60008151905061451d81613d45565b92915050565b60006020828403121561453957614538613d0e565b5b60006145478482850161450e565b91505092915050565b7f4d41582053454c4c204645455320455843454544000000000000000000000000600082015250565b6000614586601483613c67565b915061459182614550565b602082019050919050565b600060208201905081810360008301526145b581614579565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000614618602583613c67565b9150614623826145bc565b604082019050919050565b600060208201905081810360008301526146478161460b565b9050919050565b7f41524250414e44413a207061697220697320746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006146aa602283613c67565b91506146b58261464e565b604082019050919050565b600060208201905081810360008301526146d98161469d565b9050919050565b7f41524250414e44413a20696e646578206f7574206f6620626f756e6473000000600082015250565b6000614716601d83613c67565b9150614721826146e0565b602082019050919050565b6000602082019050818103600083015261474581614709565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600081519050919050565b600081905092915050565b600061479c8261477b565b6147a68185614786565b93506147b6818560208601613c78565b80840191505092915050565b60006147ce8284614791565b915081905092915050565b7f41524250414e44413a204554485f5452414e534645525f4641494c4544000000600082015250565b600061480f601d83613c67565b915061481a826147d9565b602082019050919050565b6000602082019050818103600083015261483e81614802565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006148a1602683613c67565b91506148ac82614845565b604082019050919050565b600060208201905081810360008301526148d081614894565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061490d602083613c67565b9150614918826148d7565b602082019050919050565b6000602082019050818103600083015261493c81614900565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061499f602483613c67565b91506149aa82614943565b604082019050919050565b600060208201905081810360008301526149ce81614992565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000614a31602283613c67565b9150614a3c826149d5565b604082019050919050565b60006020820190508181036000830152614a6081614a24565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b6000614a9d601d83613c67565b9150614aa882614a67565b602082019050919050565b60006020820190508181036000830152614acc81614a90565b9050919050565b7f54726164696e67206e6f74206f70656e20796574000000000000000000000000600082015250565b6000614b09601483613c67565b9150614b1482614ad3565b602082019050919050565b60006020820190508181036000830152614b3881614afc565b9050919050565b600060c082019050614b546000830189613f83565b614b616020830188613f83565b614b6e6040830187613c32565b614b7b6060830186613c32565b614b886080830185613c32565b614b9560a0830184613c32565b979650505050505050565b6000614bab82613c28565b9150614bb683613c28565b9250828202614bc481613c28565b91508282048414831517614bdb57614bda61425d565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614c1c82613c28565b9150614c2783613c28565b925082614c3757614c36614be2565b5b828204905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000819050919050565b6000614c96614c91614c8c84614c71565b61407d565b613c28565b9050919050565b614ca681614c7b565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b614ce181613d33565b82525050565b6000614cf38383614cd8565b60208301905092915050565b6000602082019050919050565b6000614d1782614cac565b614d218185614cb7565b9350614d2c83614cc8565b8060005b83811015614d5d578151614d448882614ce7565b9750614d4f83614cff565b925050600181019050614d30565b5085935050505092915050565b600060c082019050614d7f6000830189613c32565b614d8c6020830188614c9d565b8181036040830152614d9e8187614d0c565b9050614dad6060830186613f83565b614dba6080830185613f83565b614dc760a0830184613c32565b979650505050505050565b600060a082019050614de76000830188613c32565b614df46020830187614c9d565b8181036040830152614e068186614d0c565b9050614e156060830185613f83565b614e226080830184613c32565b9695505050505050565b600061010082019050614e42600083018b613c32565b614e4f602083018a613c32565b614e5c6040830189613c32565b614e696060830188613c32565b614e766080830187613c32565b614e8360a0830186613c32565b614e9060c0830185613c32565b614e9d60e0830184613c32565b9998505050505050505050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000614f06602583613c67565b9150614f1182614eaa565b604082019050919050565b60006020820190508181036000830152614f3581614ef9565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000614f98602383613c67565b9150614fa382614f3c565b604082019050919050565b60006020820190508181036000830152614fc781614f8b565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b600061502a602683613c67565b915061503582614fce565b604082019050919050565b600060208201905081810360008301526150598161501d565b9050919050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b60006150bc602a83613c67565b91506150c782615060565b604082019050919050565b600060208201905081810360008301526150eb816150af565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b600060c0820190506151366000830189613f83565b6151436020830188613c32565b6151506040830187614c9d565b61515d6060830186614c9d565b61516a6080830185613f83565b61517760a0830184613c32565b979650505050505050565b60008060006060848603121561519b5761519a613d0e565b5b60006151a986828701614360565b93505060206151ba86828701614360565b92505060406151cb86828701614360565b9150509250925092565b60006060820190506151ea6000830186613c32565b6151f76020830185613c32565b6152046040830184613c32565b949350505050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b6000615268602683613c67565b91506152738261520c565b604082019050919050565b600060208201905081810360008301526152978161525b565b9050919050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b60006152d4601d83613c67565b91506152df8261529e565b602082019050919050565b60006020820190508181036000830152615303816152c7565b905091905056fea26469706673582212206efde8ac7da21b87c638a01eb8797b6d76b75d9b3a5a9d0129853eaedd343f0164736f6c63430008130033

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

000000000000000000000000912ce59144191c1204e64559fe8253a0e49e65480000000000000000000000006eccab422d763ac031210895c81787e87b43a652000000000000000000000000c873fecbd354f5a56e00e710b90ef4201db2448d00000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab1

-----Decoded View---------------
Arg [0] : _backToken (address): 0x912CE59144191C1204E64559FE8253a0e49E6548
Arg [1] : _factory (address): 0x6EcCab422D763aC031210895C81787E87B43A652
Arg [2] : _swapRouter (address): 0xc873fEcbd354f5A56E00E710B90EF4201db2448d
Arg [3] : _weth (address): 0x82aF49447D8a07e3bd95BD0d56f35241523fBab1

-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 000000000000000000000000912ce59144191c1204e64559fe8253a0e49e6548
Arg [1] : 0000000000000000000000006eccab422d763ac031210895c81787e87b43a652
Arg [2] : 000000000000000000000000c873fecbd354f5a56e00e710b90ef4201db2448d
Arg [3] : 00000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab1


Deployed Bytecode Sourcemap

59615:14517:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70751:182;;;;;;;;;;;;;:::i;:::-;;60476:22;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73801:98;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9710:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12061:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70941:786;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61176:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61302:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60727;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60664:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10830:108;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72539:393;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61059:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63197:271;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70575:137;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61506:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62938:92;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70432:135;;;;;;;;;;;;;:::i;:::-;;13546:238;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60299:43;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69911:246;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62692:238;;;;;;;;;;;;;:::i;:::-;;61340:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72940:119;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60884:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60093:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11001:127;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60765:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39066:103;;;;;;;;;;;;;:::i;:::-;;60349:59;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60841:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60130:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61575:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60925:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38418:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68859:68;;;;;;;;;;;;;:::i;:::-;;71735:796;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9929:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14287:436;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73609:184;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63038:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73179:115;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61262:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61137:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61220:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73067:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;73907:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61605:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70165:259;;;;;;;;;;;;;:::i;:::-;;73420:181;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61637:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60447:22;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60964:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60177:18;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61098:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11590:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60803:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73302:110;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39324:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61001:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70751:182;38304:13;:11;:13::i;:::-;70819:1:::1;70805:10;;:15;70797:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;70865:12;70852:10;:25;;;;70910:15;70888:19;:37;;;;70751:182::o:0;60476:22::-;;;;:::o;73801:98::-;73849:7;73876:15;:6;:13;:15::i;:::-;73869:22;;73801:98;:::o;9710:100::-;9764:13;9797:5;9790:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9710:100;:::o;12061:201::-;12144:4;12161:13;12177:12;:10;:12::i;:::-;12161:28;;12200:32;12209:5;12216:7;12225:6;12200:8;:32::i;:::-;12250:4;12243:11;;;12061:201;;;;:::o;70941:786::-;38304:13;:11;:13::i;:::-;71344:4:::1;71332:8;71322:7;71310:9;71296:11;71280:13;71269:8;71258;:19;;;;:::i;:::-;:35;;;;:::i;:::-;:49;;;;:::i;:::-;:61;;;;:::i;:::-;:71;;;;:::i;:::-;:82;;;;:::i;:::-;:90;;71250:122;;;;;;;;;;;;:::i;:::-;;;;;;;;;71396:8;71383:10;:21;;;;71428:8;71415:10;:21;;;;71465:13;71447:15;:31;;;;71505:11;71489:13;:27;;;;71541:9;71527:11;:23;;;;71573:7;71561:9;:19;;;;71604:8;71591:10;:21;;;;71711:8;71701:7;71689:9;71675:11;71659:13;71648:8;71637;:19;;;;:::i;:::-;:35;;;;:::i;:::-;:49;;;;:::i;:::-;:61;;;;:::i;:::-;:71;;;;:::i;:::-;:82;;;;:::i;:::-;71623:11;:96;;;;70941:786:::0;;;;;;;:::o;61176:37::-;;;;:::o;61302:31::-;;;;:::o;60727:::-;;;;:::o;60664:37::-;;;;:::o;10830:108::-;10891:7;10918:12;;10911:19;;10830:108;:::o;72539:393::-;38304:13;:11;:13::i;:::-;72767:11:::1;72754:10;;:24;;;;;;;;;;;;;;;;;;72802:11;72789:10;;:24;;;;;;;;;;;;;;;;;;72838:12;72824:11;;:26;;;;;;;;;;;;;;;;;;72877:14;72861:13;;:30;;;;;;;;;;;;;;;;;;72914:10;72902:9;;:22;;;;;;;;;;;;;;;;;;72539:393:::0;;;;;:::o;61059:32::-;;;;:::o;63197:271::-;63303:4;63320:15;63338:12;:10;:12::i;:::-;63320:30;;63361:40;63377:6;63385:7;63394:6;63361:15;:40::i;:::-;63419:41;63434:6;63442:9;63453:6;63419:14;:41::i;:::-;63412:48;;;63197:271;;;;;:::o;70575:137::-;70628:7;70689:15;61957:42;70689:9;:15::i;:::-;70671;61876:42;70671:9;:15::i;:::-;70655:13;:11;:13::i;:::-;:31;;;;:::i;:::-;:49;;;;:::i;:::-;70648:56;;70575:137;:::o;61506:28::-;;;;;;;;;;;;;:::o;62938:92::-;62996:5;63021:1;63014:8;;62938:92;:::o;70432:135::-;38304:13;:11;:13::i;:::-;70491:9:::1;;;;;;;;;;;:18;;;70510:12;:10;:12::i;:::-;70524:9;;;;;;;;;;;:19;;;70552:4;70524:34;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;70491:68;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;70432:135::o:0;13546:238::-;13634:4;13651:13;13667:12;:10;:12::i;:::-;13651:28;;13690:64;13699:5;13706:7;13743:10;13715:25;13725:5;13732:7;13715:9;:25::i;:::-;:38;;;;:::i;:::-;13690:8;:64::i;:::-;13772:4;13765:11;;;13546:238;;;;:::o;60299:43::-;;;;;;;;;;;;;;;;;;;;;;:::o;69911:246::-;38304:13;:11;:13::i;:::-;70016:4:::1;69992:29;;:12;:29;;::::0;69984:63:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;70058:91;70092:10;70110:12;70103:30;;;70142:4;70103:45;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;70065:12;70058:33;;;;:91;;;;;:::i;:::-;69911:246:::0;:::o;62692:238::-;38304:13;:11;:13::i;:::-;62757:11:::1;;;;;;;;;;;62756:12;62748:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;62803:12;62818:7;:18;;;62845:4;62860;62818:48;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;62803:63;;62877:16;62888:4;62877:6;:10;;:16;;;;:::i;:::-;;62918:4;62904:11;;:18;;;;;;;;;;;;;;;;;;62737:193;62692:238::o:0;61340:34::-;;;;:::o;72940:119::-;38304:13;:11;:13::i;:::-;73045:6:::1;73023:11;:19;73035:6;73023:19;;;;;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;72940:119:::0;;:::o;60884:34::-;;;;:::o;60093:30::-;;;;;;;;;;;;;:::o;11001:127::-;11075:7;11102:9;:18;11112:7;11102:18;;;;;;;;;;;;;;;;11095:25;;11001:127;;;:::o;60765:31::-;;;;:::o;39066:103::-;38304:13;:11;:13::i;:::-;39131:30:::1;39158:1;39131:18;:30::i;:::-;39066:103::o:0;60349:59::-;;;;;;;;;;;;;;;;;;;;;;:::o;60841:36::-;;;;:::o;60130:38::-;;;;;;;;;;;;;:::o;61575:23::-;;;;;;;;;;;;;:::o;60925:32::-;;;;:::o;38418:87::-;38464:7;38491:6;;;;;;;;;;;38484:13;;38418:87;:::o;68859:68::-;38304:13;:11;:13::i;:::-;68909:10:::1;:8;:10::i;:::-;68859:68::o:0;71735:796::-;38304:13;:11;:13::i;:::-;72140:4:::1;72128:8;72118:7;72106:9;72092:11;72076:13;72065:8;72054;:19;;;;:::i;:::-;:35;;;;:::i;:::-;:49;;;;:::i;:::-;:61;;;;:::i;:::-;:71;;;;:::i;:::-;:82;;;;:::i;:::-;:90;;72046:123;;;;;;;;;;;;:::i;:::-;;;;;;;;;72194:8;72180:11;:22;;;;72227:8;72213:11;:22;;;;72265:13;72246:16;:32;;;;72306:11;72289:14;:28;;;;72343:9;72328:12;:24;;;;72376:7;72363:10;:20;;;;72408:8;72394:11;:22;;;;72515:8;72505:7;72493:9;72479:11;72463:13;72453:8;72442;:19;;;;:::i;:::-;:34;;;;:::i;:::-;:48;;;;:::i;:::-;:60;;;;:::i;:::-;:70;;;;:::i;:::-;:81;;;;:::i;:::-;72427:12;:96;;;;71735:796:::0;;;;;;;:::o;9929:104::-;9985:13;10018:7;10011:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9929:104;:::o;14287:436::-;14380:4;14397:13;14413:12;:10;:12::i;:::-;14397:28;;14436:24;14463:25;14473:5;14480:7;14463:9;:25::i;:::-;14436:52;;14527:15;14507:16;:35;;14499:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;14620:60;14629:5;14636:7;14664:15;14645:16;:34;14620:8;:60::i;:::-;14711:4;14704:11;;;;14287:436;;;;:::o;73609:184::-;73666:4;38304:13;:11;:13::i;:::-;73707:1:::1;73691:18;;:4;:18;;::::0;73683:65:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;73766:19;73780:4;73766:6;:13;;:19;;;;:::i;:::-;73759:26;;73609:184:::0;;;:::o;63038:151::-;63117:4;63141:40;63156:12;:10;:12::i;:::-;63170:2;63174:6;63141:14;:40::i;:::-;63134:47;;63038:151;;;;:::o;73179:115::-;38304:13;:11;:13::i;:::-;73278:8:::1;73256:19;;:30;;;;;;;;;;;;;;;;;;73179:115:::0;:::o;61262:33::-;;;;:::o;61137:32::-;;;;:::o;61220:35::-;;;;:::o;73067:104::-;38304:13;:11;:13::i;:::-;73155:8:::1;73141:11;;:22;;;;;;;;;;;;;;;;;;73067:104:::0;:::o;73907:185::-;73960:7;74015:1;73997:15;:6;:13;:15::i;:::-;:19;;;;:::i;:::-;73988:5;:28;;73980:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;74068:16;74078:5;74068:6;:9;;:16;;;;:::i;:::-;74061:23;;73907:185;;;:::o;61605:25::-;;;;:::o;70165:259::-;38304:13;:11;:13::i;:::-;70227:17:::1;70247:21;70227:41;;70280:12;70306;:10;:12::i;:::-;70298:26;;70332:9;70353:1;70343:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70298:58;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70279:77;;;70375:7;70367:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;70216:208;;70165:259::o:0;73420:181::-;73477:4;38304:13;:11;:13::i;:::-;73518:1:::1;73502:18;;:4;:18;;::::0;73494:65:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;73577:16;73588:4;73577:6;:10;;:16;;;;:::i;:::-;73570:23;;73420:181:::0;;;:::o;61637:34::-;;;;:::o;60447:22::-;;;;:::o;60964:30::-;;;;:::o;60177:18::-;;;;;;;;;;;;;:::o;61098:32::-;;;;:::o;11590:151::-;11679:7;11706:11;:18;11718:5;11706:18;;;;;;;;;;;;;;;:27;11725:7;11706:27;;;;;;;;;;;;;;;;11699:34;;11590:151;;;;:::o;60803:31::-;;;;:::o;73302:110::-;73356:4;73380:24;73396:7;73380:6;:15;;:24;;;;:::i;:::-;73373:31;;73302:110;;;:::o;39324:201::-;38304:13;:11;:13::i;:::-;39433:1:::1;39413:22;;:8;:22;;::::0;39405:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;39489:28;39508:8;39489:18;:28::i;:::-;39324:201:::0;:::o;61001:33::-;;;;:::o;38583:132::-;38658:12;:10;:12::i;:::-;38647:23;;:7;:5;:7::i;:::-;:23;;;38639:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;38583:132::o;49282:117::-;49345:7;49372:19;49380:3;:10;;49372:7;:19::i;:::-;49365:26;;49282:117;;;:::o;7356:98::-;7409:7;7436:10;7429:17;;7356:98;:::o;18314:380::-;18467:1;18450:19;;:5;:19;;;18442:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;18548:1;18529:21;;:7;:21;;;18521:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;18632:6;18602:11;:18;18614:5;18602:18;;;;;;;;;;;;;;;:27;18621:7;18602:27;;;;;;;;;;;;;;;:36;;;;18670:7;18654:32;;18663:5;18654:32;;;18679:6;18654:32;;;;;;:::i;:::-;;;;;;;;18314:380;;;:::o;18985:453::-;19120:24;19147:25;19157:5;19164:7;19147:9;:25::i;:::-;19120:52;;19207:17;19187:16;:37;19183:248;;19269:6;19249:16;:26;;19241:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;19353:51;19362:5;19369:7;19397:6;19378:16;:25;19353:8;:51::i;:::-;19183:248;19109:329;18985:453;;;:::o;63476:1325::-;63569:4;63590:6;;;;;;;;;;;63586:101;;;63613:36;63623:6;63631:9;63642:6;63613:9;:36::i;:::-;63671:4;63664:11;;;;63586:101;63702:27;:35;63730:6;63702:35;;;;;;;;;;;;;;;;;;;;;;;;;63697:112;;63762:10;:8;:10::i;:::-;63754:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;63697:112;63821:18;63844:11;:19;63856:6;63844:19;;;;;;;;;;;;;;;;;;;;;;;;;63843:20;:47;;;;;63868:11;:22;63880:9;63868:22;;;;;;;;;;;;;;;;;;;;;;;;;63867:23;63843:47;63842:63;;;;;63895:10;:8;:10::i;:::-;63842:63;63821:84;;63916:9;63940:13;63956:6;63940:22;;63973:13;63989:9;63973:25;;64034:14;64041:6;64034;:14::i;:::-;64030:283;;;64065:9;:7;:9::i;:::-;64096:1;64089:8;;64120:9;64112:17;;64152:6;64144:14;;64030:283;;;64180:17;64187:9;64180:6;:17::i;:::-;64176:137;;;64214:10;:8;:10::i;:::-;64246:1;64239:8;;64176:137;;;64296:5;64280:21;;64176:137;64030:283;64329:16;:14;:16::i;:::-;64325:59;;;64362:10;:8;:10::i;:::-;64325:59;64396:22;64421:13;:48;;64463:6;64421:48;;;64437:23;64445:6;64453;64437:7;:23::i;:::-;64421:48;64396:73;;64480:44;64490:6;64498:9;64509:14;64480:9;:44::i;:::-;64548:1;64541:4;:8;64537:120;;;64571:74;64577:5;64584;64591:6;64599:4;64605:22;:20;:22::i;:::-;64629:15;64571:74;;;;;;;;;;;:::i;:::-;;;;;;;;64537:120;64679:1;64671:4;:9;64667:105;;64713:11;;;;;;;;;;;64697:48;;;64746:5;64753:6;64697:63;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64667:105;64789:4;64782:11;;;;;;;63476:1325;;;;;;:::o;33397:211::-;33514:86;33534:5;33564:23;;;33589:2;33593:5;33541:58;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33514:19;:86::i;:::-;33397:211;;;:::o;48457:152::-;48527:4;48551:50;48556:3;:10;;48592:5;48576:23;;48568:32;;48551:4;:50::i;:::-;48544:57;;48457:152;;;;:::o;39685:191::-;39759:16;39778:6;;;;;;;;;;;39759:25;;39804:8;39795:6;;:17;;;;;;;;;;;;;;;;;;39859:8;39828:40;;39849:8;39828:40;;;;;;;;;;;;39748:128;39685:191;:::o;64991:2544::-;60242:4;60233:6;;:13;;;;;;;;;;;;;;;;;;65040:17:::1;65060:24;65078:4;65060:9;:24::i;:::-;65040:44;;65095:55;65112:4;65127:10;65140:9;65095:8;:55::i;:::-;65163:23;65214:8;;65202:7;;65190:9;:19;;;;:::i;:::-;65189:34;;;;:::i;:::-;65163:60;;65234:21;65288:8;;65271:12;;65259:9;:24;;;;:::i;:::-;65258:39;;;;:::i;:::-;65234:63;;65308:24;65361:8;;65348;;65336:9;:20;;;;:::i;:::-;65335:35;;;;:::i;:::-;65308:62;;65394:15;65381:28;;;;;:::i;:::-;;;65433:13;65420:26;;;;;:::i;:::-;;;65470:16;65457:29;;;;;:::i;:::-;;;65509:21;65547:1;65533:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65509:40;;65578:4;65560;65565:1;65560:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;::::0;::::1;65612:4;65594;65599:1;65594:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;::::0;::::1;65646:9;;;;;;;;;;;65628:4;65633:1;65628:7;;;;;;;;:::i;:::-;;;;;;;:28;;;;;;;;;::::0;::::1;65669:12;65700:21:::0;65724:9:::1;;;;;;;;;;;:19;;;65752:4;65724:34;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;65700:58;;65773:10;:64;;;65838:9;65848:1;65850:4;65863;65877:1;65880:15;65773:123;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;65769:390;;65963:10;:64;;;66028:9;66038:1;66040:4;66053;66059:15;65963:112;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;65959:189:::0;::::1;;66105:4;66095:14;;65959:189;65769:390;;;65921:4;65911:14;;65769:390;66174:7;66169:47;;66198:7;;;;;;;;;66169:47;66228;66246:4;61876:42;66259:15;66228:9;:47::i;:::-;66286:63;66303:4;66318:11;;;;;;;;;;;66332:16;66286:8;:63::i;:::-;66360:55;66378:4;66385:11;;;;;;;;;;;66398:16;66360:9;:55::i;:::-;66446:23;66509:13;66472:9;;;;;;;;;;;:19;;;66500:4;66472:34;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:50;;;;:::i;:::-;66446:76;;66533:25;66597:8;;66582:12;;66572:7;;66561:8;;:18;;;;:::i;:::-;:33;;;;:::i;:::-;:44;;;;:::i;:::-;66533:72;;66616:27;66677:17;66665:7;;66647:15;:25;;;;:::i;:::-;66646:49;;;;:::i;:::-;66616:79;;66706:27;66767:17;66755:7;;66737:15;:25;;;;:::i;:::-;66736:49;;;;:::i;:::-;66706:79;;66796:30;66862:17;66848:10;;66830:15;:28;;;;:::i;:::-;66829:50;;;;:::i;:::-;66796:83;;66890:26;66981:22;66959:19;66937;66919:15;:37;;;;:::i;:::-;:59;;;;:::i;:::-;:84;;;;:::i;:::-;66890:113;;67016:9;;;;;;;;;;;:18;;;67035:10;;;;;;;;;;;67047:19;67016:51;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;67078:9;;;;;;;;;;;:18;;;67097:10;;;;;;;;;;;67109:19;67078:51;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;67140:9;;;;;;;;;;;:18;;;67167:13;;;;;;;;;;;67183:22;67140:66;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;67217:9;;;;;;;;;;;:18;;;67236:9;;;;;;;;;;;67247:18;67217:49;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;67283:19;;;;;;;;;;;67279:62;;;67319:10;:8;:10::i;:::-;67279:62;67366:161;67375:15;67392:19;67413;67434:13;67449:22;67473:16;67491:18;67511:15;67366:161;;;;;;;;;;;;;:::i;:::-;;;;;;;;65029:2506;;;;;;;;;;;;;60257:1;60278:5:::0;60269:6;;:14;;;;;;;;;;;;;;;;;;64991:2544::o;48785:158::-;48858:4;48882:53;48890:3;:10;;48926:5;48910:23;;48902:32;;48882:7;:53::i;:::-;48875:60;;48785:158;;;;:::o;49753:::-;49827:7;49878:22;49882:3;:10;;49894:5;49878:3;:22::i;:::-;49870:31;;49847:56;;49753:158;;;;:::o;49029:167::-;49109:4;49133:55;49143:3;:10;;49179:5;49163:23;;49155:32;;49133:9;:55::i;:::-;49126:62;;49029:167;;;;:::o;44499:109::-;44555:7;44582:3;:11;;:18;;;;44575:25;;44499:109;;;:::o;15193:840::-;15340:1;15324:18;;:4;:18;;;15316:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;15417:1;15403:16;;:2;:16;;;15395:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;15472:38;15493:4;15499:2;15503:6;15472:20;:38::i;:::-;15523:19;15545:9;:15;15555:4;15545:15;;;;;;;;;;;;;;;;15523:37;;15594:6;15579:11;:21;;15571:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;15711:6;15697:11;:20;15679:9;:15;15689:4;15679:15;;;;;;;;;;;;;;;:38;;;;15914:6;15897:9;:13;15907:2;15897:13;;;;;;;;;;;;;;;;:23;;;;;;;;;;;15964:2;15949:26;;15958:4;15949:26;;;15968:6;15949:26;;;;;;:::i;:::-;;;;;;;;15988:37;16008:4;16014:2;16018:6;15988:19;:37::i;:::-;15305:728;15193:840;;;:::o;68935:90::-;68978:4;69016:1;69002:10;;:15;;68995:22;;68935:90;:::o;69033:302::-;69082:10;;69072:7;:20;;;;69113:10;;69103:7;:20;;;;69144:10;;69134:7;:20;;;;69180:15;;69165:12;:30;;;;69219:13;;69206:10;:26;;;;69254:11;;69243:8;:22;;;;69285:9;;69276:6;:18;;;;69316:11;;69305:8;:22;;;;69033:302::o;69343:311::-;69393:11;;69383:7;:21;;;;69425:11;;69415:7;:21;;;;69457:11;;69447:7;:21;;;;69494:16;;69479:12;:31;;;;69534:14;;69521:10;:27;;;;69570:12;;69559:8;:23;;;;69602:10;;69593:6;:19;;;;69634:12;;69623:8;:23;;;;69343:311::o;64809:174::-;64858:4;64883:6;;;;;;;;;;;64882:7;:22;;;;;64893:11;;;;;;;;;;;64882:22;:36;;;;;64908:10;:8;:10::i;:::-;64882:36;:68;;;;;64949:1;64922:24;64940:4;64922:9;:24::i;:::-;:28;64882:68;:93;;;;;64955:20;64962:12;:10;:12::i;:::-;64955:6;:20::i;:::-;64954:21;64882:93;64875:100;;64809:174;:::o;69662:241::-;69729:7;69749:17;69791:14;;69779:8;;69770:6;:17;;;;:::i;:::-;69769:36;;;;:::i;:::-;69749:56;;69816:43;69826:6;69842:4;69849:9;69816;:43::i;:::-;69886:9;69877:6;:18;;;;:::i;:::-;69870:25;;;69662:241;;;;:::o;36464:716::-;36888:23;36914:69;36942:4;36914:69;;;;;;;;;;;;;;;;;36922:5;36914:27;;;;:69;;;;;:::i;:::-;36888:95;;37018:1;36998:10;:17;:21;36994:179;;;37095:10;37084:30;;;;;;;;;;;;:::i;:::-;37076:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;36994:179;36534:646;36464:716;;:::o;42188:414::-;42251:4;42273:21;42283:3;42288:5;42273:9;:21::i;:::-;42268:327;;42311:3;:11;;42328:5;42311:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42494:3;:11;;:18;;;;42472:3;:12;;:19;42485:5;42472:19;;;;;;;;;;;:40;;;;42534:4;42527:11;;;;42268:327;42578:5;42571:12;;42188:414;;;;;:::o;67543:936::-;67583:24;67624:1;67610:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67583:43;;67658:4;67637:7;67645:1;67637:10;;;;;;;;:::i;:::-;;;;;;;:26;;;;;;;;;;;67695:4;67674:7;67682:1;67674:10;;;;;;;;:::i;:::-;;;;;;;:26;;;;;;;;;;;67713:19;67735:24;67753:4;67735:9;:24::i;:::-;67713:46;;67770:12;67799:1;67785:11;:15;;;;:::i;:::-;67770:30;;67821:4;67814;:11;67811:23;;;67827:7;;;;;67811:23;67846;67872:21;67846:47;;67904:12;67939:10;:61;;;68001:4;68006:1;68009:7;68025:4;68039:1;68042:15;67939:119;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67935:367;;68125:10;:61;;;68187:4;68192:1;68195:7;68211:4;68217:15;68125:108;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68121:170;;;68262:4;68252:14;;68121:170;67935:367;;;68083:4;68073:14;;67935:367;68317:7;68312:47;;68341:7;;;;;;;68312:47;68371:17;68415:15;68391:21;:39;;;;:::i;:::-;68371:59;;68441:30;68455:4;68461:9;68441:13;:30::i;:::-;67572:907;;;;;;67543:936;:::o;42778:1420::-;42844:4;42962:18;42983:3;:12;;:19;42996:5;42983:19;;;;;;;;;;;;42962:40;;43033:1;43019:10;:15;43015:1176;;43394:21;43431:1;43418:10;:14;;;;:::i;:::-;43394:38;;43447:17;43488:1;43467:3;:11;;:18;;;;:22;;;;:::i;:::-;43447:42;;43523:13;43510:9;:26;43506:405;;43557:17;43577:3;:11;;43589:9;43577:22;;;;;;;;:::i;:::-;;;;;;;;;;43557:42;;43731:9;43702:3;:11;;43714:13;43702:26;;;;;;;;:::i;:::-;;;;;;;;;:38;;;;43842:10;43816:3;:12;;:23;43829:9;43816:23;;;;;;;;;;;:36;;;;43538:373;43506:405;43992:3;:11;;:17;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;44087:3;:12;;:19;44100:5;44087:19;;;;;;;;;;;44080:26;;;44130:4;44123:11;;;;;;;43015:1176;44174:5;44167:12;;;42778:1420;;;;;:::o;44962:120::-;45029:7;45056:3;:11;;45068:5;45056:18;;;;;;;;:::i;:::-;;;;;;;;;;45049:25;;44962:120;;;;:::o;44284:129::-;44357:4;44404:1;44381:3;:12;;:19;44394:5;44381:19;;;;;;;;;;;;:24;;44374:31;;44284:129;;;;:::o;20038:125::-;;;;:::o;20767:124::-;;;;:::o;27249:229::-;27386:12;27418:52;27440:6;27448:4;27454:1;27457:12;27418:21;:52::i;:::-;27411:59;;27249:229;;;;;:::o;68487:364::-;68570:57;68587:4;68602:10;68615:11;68570:8;:57::i;:::-;68642:10;:26;;;68676:9;68695:4;68702:11;68715:1;68718;68729;68733:15;68642:107;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;68638:206;;;;;;68770:53;68783:11;68796:9;68807:15;68770:53;;;;;;;;:::i;:::-;;;;;;;;68638:206;68487:364;;:::o;28369:455::-;28539:12;28597:5;28572:21;:30;;28564:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;28657:12;28671:23;28698:6;:11;;28717:5;28724:4;28698:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28656:73;;;;28747:69;28774:6;28782:7;28791:10;28803:12;28747:26;:69::i;:::-;28740:76;;;;28369:455;;;;;;:::o;30942:644::-;31127:12;31156:7;31152:427;;;31205:1;31184:10;:17;:22;31180:290;;31402:18;31413:6;31402:10;:18::i;:::-;31394:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;31180:290;31491:10;31484:17;;;;31152:427;31534:33;31542:10;31554:12;31534:7;:33::i;:::-;30942:644;;;;;;;:::o;24492:326::-;24552:4;24809:1;24787:7;:19;;;:23;24780:30;;24492:326;;;:::o;32128:552::-;32309:1;32289:10;:17;:21;32285:388;;;32521:10;32515:17;32578:15;32565:10;32561:2;32557:19;32550:44;32285:388;32648:12;32641:20;;;;;;;;;;;:::i;:::-;;;;;;;;7:77:1;44:7;73:5;62:16;;7:77;;;:::o;90:118::-;177:24;195:5;177:24;:::i;:::-;172:3;165:37;90:118;;:::o;214:222::-;307:4;345:2;334:9;330:18;322:26;;358:71;426:1;415:9;411:17;402:6;358:71;:::i;:::-;214:222;;;;:::o;442:99::-;494:6;528:5;522:12;512:22;;442:99;;;:::o;547:169::-;631:11;665:6;660:3;653:19;705:4;700:3;696:14;681:29;;547:169;;;;:::o;722:246::-;803:1;813:113;827:6;824:1;821:13;813:113;;;912:1;907:3;903:11;897:18;893:1;888:3;884:11;877:39;849:2;846:1;842:10;837:15;;813:113;;;960:1;951:6;946:3;942:16;935:27;784:184;722:246;;;:::o;974:102::-;1015:6;1066:2;1062:7;1057:2;1050:5;1046:14;1042:28;1032:38;;974:102;;;:::o;1082:377::-;1170:3;1198:39;1231:5;1198:39;:::i;:::-;1253:71;1317:6;1312:3;1253:71;:::i;:::-;1246:78;;1333:65;1391:6;1386:3;1379:4;1372:5;1368:16;1333:65;:::i;:::-;1423:29;1445:6;1423:29;:::i;:::-;1418:3;1414:39;1407:46;;1174:285;1082:377;;;;:::o;1465:313::-;1578:4;1616:2;1605:9;1601:18;1593:26;;1665:9;1659:4;1655:20;1651:1;1640:9;1636:17;1629:47;1693:78;1766:4;1757:6;1693:78;:::i;:::-;1685:86;;1465:313;;;;:::o;1865:117::-;1974:1;1971;1964:12;2111:126;2148:7;2188:42;2181:5;2177:54;2166:65;;2111:126;;;:::o;2243:96::-;2280:7;2309:24;2327:5;2309:24;:::i;:::-;2298:35;;2243:96;;;:::o;2345:122::-;2418:24;2436:5;2418:24;:::i;:::-;2411:5;2408:35;2398:63;;2457:1;2454;2447:12;2398:63;2345:122;:::o;2473:139::-;2519:5;2557:6;2544:20;2535:29;;2573:33;2600:5;2573:33;:::i;:::-;2473:139;;;;:::o;2618:122::-;2691:24;2709:5;2691:24;:::i;:::-;2684:5;2681:35;2671:63;;2730:1;2727;2720:12;2671:63;2618:122;:::o;2746:139::-;2792:5;2830:6;2817:20;2808:29;;2846:33;2873:5;2846:33;:::i;:::-;2746:139;;;;:::o;2891:474::-;2959:6;2967;3016:2;3004:9;2995:7;2991:23;2987:32;2984:119;;;3022:79;;:::i;:::-;2984:119;3142:1;3167:53;3212:7;3203:6;3192:9;3188:22;3167:53;:::i;:::-;3157:63;;3113:117;3269:2;3295:53;3340:7;3331:6;3320:9;3316:22;3295:53;:::i;:::-;3285:63;;3240:118;2891:474;;;;;:::o;3371:90::-;3405:7;3448:5;3441:13;3434:21;3423:32;;3371:90;;;:::o;3467:109::-;3548:21;3563:5;3548:21;:::i;:::-;3543:3;3536:34;3467:109;;:::o;3582:210::-;3669:4;3707:2;3696:9;3692:18;3684:26;;3720:65;3782:1;3771:9;3767:17;3758:6;3720:65;:::i;:::-;3582:210;;;;:::o;3798:1203::-;3911:6;3919;3927;3935;3943;3951;3959;4008:3;3996:9;3987:7;3983:23;3979:33;3976:120;;;4015:79;;:::i;:::-;3976:120;4135:1;4160:53;4205:7;4196:6;4185:9;4181:22;4160:53;:::i;:::-;4150:63;;4106:117;4262:2;4288:53;4333:7;4324:6;4313:9;4309:22;4288:53;:::i;:::-;4278:63;;4233:118;4390:2;4416:53;4461:7;4452:6;4441:9;4437:22;4416:53;:::i;:::-;4406:63;;4361:118;4518:2;4544:53;4589:7;4580:6;4569:9;4565:22;4544:53;:::i;:::-;4534:63;;4489:118;4646:3;4673:53;4718:7;4709:6;4698:9;4694:22;4673:53;:::i;:::-;4663:63;;4617:119;4775:3;4802:53;4847:7;4838:6;4827:9;4823:22;4802:53;:::i;:::-;4792:63;;4746:119;4904:3;4931:53;4976:7;4967:6;4956:9;4952:22;4931:53;:::i;:::-;4921:63;;4875:119;3798:1203;;;;;;;;;;:::o;5007:911::-;5102:6;5110;5118;5126;5134;5183:3;5171:9;5162:7;5158:23;5154:33;5151:120;;;5190:79;;:::i;:::-;5151:120;5310:1;5335:53;5380:7;5371:6;5360:9;5356:22;5335:53;:::i;:::-;5325:63;;5281:117;5437:2;5463:53;5508:7;5499:6;5488:9;5484:22;5463:53;:::i;:::-;5453:63;;5408:118;5565:2;5591:53;5636:7;5627:6;5616:9;5612:22;5591:53;:::i;:::-;5581:63;;5536:118;5693:2;5719:53;5764:7;5755:6;5744:9;5740:22;5719:53;:::i;:::-;5709:63;;5664:118;5821:3;5848:53;5893:7;5884:6;5873:9;5869:22;5848:53;:::i;:::-;5838:63;;5792:119;5007:911;;;;;;;;:::o;5924:619::-;6001:6;6009;6017;6066:2;6054:9;6045:7;6041:23;6037:32;6034:119;;;6072:79;;:::i;:::-;6034:119;6192:1;6217:53;6262:7;6253:6;6242:9;6238:22;6217:53;:::i;:::-;6207:63;;6163:117;6319:2;6345:53;6390:7;6381:6;6370:9;6366:22;6345:53;:::i;:::-;6335:63;;6290:118;6447:2;6473:53;6518:7;6509:6;6498:9;6494:22;6473:53;:::i;:::-;6463:63;;6418:118;5924:619;;;;;:::o;6549:118::-;6636:24;6654:5;6636:24;:::i;:::-;6631:3;6624:37;6549:118;;:::o;6673:222::-;6766:4;6804:2;6793:9;6789:18;6781:26;;6817:71;6885:1;6874:9;6870:17;6861:6;6817:71;:::i;:::-;6673:222;;;;:::o;6901:86::-;6936:7;6976:4;6969:5;6965:16;6954:27;;6901:86;;;:::o;6993:112::-;7076:22;7092:5;7076:22;:::i;:::-;7071:3;7064:35;6993:112;;:::o;7111:214::-;7200:4;7238:2;7227:9;7223:18;7215:26;;7251:67;7315:1;7304:9;7300:17;7291:6;7251:67;:::i;:::-;7111:214;;;;:::o;7331:329::-;7390:6;7439:2;7427:9;7418:7;7414:23;7410:32;7407:119;;;7445:79;;:::i;:::-;7407:119;7565:1;7590:53;7635:7;7626:6;7615:9;7611:22;7590:53;:::i;:::-;7580:63;;7536:117;7331:329;;;;:::o;7666:116::-;7736:21;7751:5;7736:21;:::i;:::-;7729:5;7726:32;7716:60;;7772:1;7769;7762:12;7716:60;7666:116;:::o;7788:133::-;7831:5;7869:6;7856:20;7847:29;;7885:30;7909:5;7885:30;:::i;:::-;7788:133;;;;:::o;7927:468::-;7992:6;8000;8049:2;8037:9;8028:7;8024:23;8020:32;8017:119;;;8055:79;;:::i;:::-;8017:119;8175:1;8200:53;8245:7;8236:6;8225:9;8221:22;8200:53;:::i;:::-;8190:63;;8146:117;8302:2;8328:50;8370:7;8361:6;8350:9;8346:22;8328:50;:::i;:::-;8318:60;;8273:115;7927:468;;;;;:::o;8401:60::-;8429:3;8450:5;8443:12;;8401:60;;;:::o;8467:142::-;8517:9;8550:53;8568:34;8577:24;8595:5;8577:24;:::i;:::-;8568:34;:::i;:::-;8550:53;:::i;:::-;8537:66;;8467:142;;;:::o;8615:126::-;8665:9;8698:37;8729:5;8698:37;:::i;:::-;8685:50;;8615:126;;;:::o;8747:139::-;8810:9;8843:37;8874:5;8843:37;:::i;:::-;8830:50;;8747:139;;;:::o;8892:157::-;8992:50;9036:5;8992:50;:::i;:::-;8987:3;8980:63;8892:157;;:::o;9055:248::-;9161:4;9199:2;9188:9;9184:18;9176:26;;9212:84;9293:1;9282:9;9278:17;9269:6;9212:84;:::i;:::-;9055:248;;;;:::o;9309:323::-;9365:6;9414:2;9402:9;9393:7;9389:23;9385:32;9382:119;;;9420:79;;:::i;:::-;9382:119;9540:1;9565:50;9607:7;9598:6;9587:9;9583:22;9565:50;:::i;:::-;9555:60;;9511:114;9309:323;;;;:::o;9638:329::-;9697:6;9746:2;9734:9;9725:7;9721:23;9717:32;9714:119;;;9752:79;;:::i;:::-;9714:119;9872:1;9897:53;9942:7;9933:6;9922:9;9918:22;9897:53;:::i;:::-;9887:63;;9843:117;9638:329;;;;:::o;9973:474::-;10041:6;10049;10098:2;10086:9;10077:7;10073:23;10069:32;10066:119;;;10104:79;;:::i;:::-;10066:119;10224:1;10249:53;10294:7;10285:6;10274:9;10270:22;10249:53;:::i;:::-;10239:63;;10195:117;10351:2;10377:53;10422:7;10413:6;10402:9;10398:22;10377:53;:::i;:::-;10367:63;;10322:118;9973:474;;;;;:::o;10453:166::-;10593:18;10589:1;10581:6;10577:14;10570:42;10453:166;:::o;10625:366::-;10767:3;10788:67;10852:2;10847:3;10788:67;:::i;:::-;10781:74;;10864:93;10953:3;10864:93;:::i;:::-;10982:2;10977:3;10973:12;10966:19;;10625:366;;;:::o;10997:419::-;11163:4;11201:2;11190:9;11186:18;11178:26;;11250:9;11244:4;11240:20;11236:1;11225:9;11221:17;11214:47;11278:131;11404:4;11278:131;:::i;:::-;11270:139;;10997:419;;;:::o;11422:180::-;11470:77;11467:1;11460:88;11567:4;11564:1;11557:15;11591:4;11588:1;11581:15;11608:320;11652:6;11689:1;11683:4;11679:12;11669:22;;11736:1;11730:4;11726:12;11757:18;11747:81;;11813:4;11805:6;11801:17;11791:27;;11747:81;11875:2;11867:6;11864:14;11844:18;11841:38;11838:84;;11894:18;;:::i;:::-;11838:84;11659:269;11608:320;;;:::o;11934:180::-;11982:77;11979:1;11972:88;12079:4;12076:1;12069:15;12103:4;12100:1;12093:15;12120:191;12160:3;12179:20;12197:1;12179:20;:::i;:::-;12174:25;;12213:20;12231:1;12213:20;:::i;:::-;12208:25;;12256:1;12253;12249:9;12242:16;;12277:3;12274:1;12271:10;12268:36;;;12284:18;;:::i;:::-;12268:36;12120:191;;;;:::o;12317:169::-;12457:21;12453:1;12445:6;12441:14;12434:45;12317:169;:::o;12492:366::-;12634:3;12655:67;12719:2;12714:3;12655:67;:::i;:::-;12648:74;;12731:93;12820:3;12731:93;:::i;:::-;12849:2;12844:3;12840:12;12833:19;;12492:366;;;:::o;12864:419::-;13030:4;13068:2;13057:9;13053:18;13045:26;;13117:9;13111:4;13107:20;13103:1;13092:9;13088:17;13081:47;13145:131;13271:4;13145:131;:::i;:::-;13137:139;;12864:419;;;:::o;13289:194::-;13329:4;13349:20;13367:1;13349:20;:::i;:::-;13344:25;;13383:20;13401:1;13383:20;:::i;:::-;13378:25;;13427:1;13424;13420:9;13412:17;;13451:1;13445:4;13442:11;13439:37;;;13456:18;;:::i;:::-;13439:37;13289:194;;;;:::o;13489:143::-;13546:5;13577:6;13571:13;13562:22;;13593:33;13620:5;13593:33;:::i;:::-;13489:143;;;;:::o;13638:351::-;13708:6;13757:2;13745:9;13736:7;13732:23;13728:32;13725:119;;;13763:79;;:::i;:::-;13725:119;13883:1;13908:64;13964:7;13955:6;13944:9;13940:22;13908:64;:::i;:::-;13898:74;;13854:128;13638:351;;;;:::o;13995:332::-;14116:4;14154:2;14143:9;14139:18;14131:26;;14167:71;14235:1;14224:9;14220:17;14211:6;14167:71;:::i;:::-;14248:72;14316:2;14305:9;14301:18;14292:6;14248:72;:::i;:::-;13995:332;;;;;:::o;14333:137::-;14387:5;14418:6;14412:13;14403:22;;14434:30;14458:5;14434:30;:::i;:::-;14333:137;;;;:::o;14476:345::-;14543:6;14592:2;14580:9;14571:7;14567:23;14563:32;14560:119;;;14598:79;;:::i;:::-;14560:119;14718:1;14743:61;14796:7;14787:6;14776:9;14772:22;14743:61;:::i;:::-;14733:71;;14689:125;14476:345;;;;:::o;14827:171::-;14967:23;14963:1;14955:6;14951:14;14944:47;14827:171;:::o;15004:366::-;15146:3;15167:67;15231:2;15226:3;15167:67;:::i;:::-;15160:74;;15243:93;15332:3;15243:93;:::i;:::-;15361:2;15356:3;15352:12;15345:19;;15004:366;;;:::o;15376:419::-;15542:4;15580:2;15569:9;15565:18;15557:26;;15629:9;15623:4;15619:20;15615:1;15604:9;15600:17;15593:47;15657:131;15783:4;15657:131;:::i;:::-;15649:139;;15376:419;;;:::o;15801:169::-;15941:21;15937:1;15929:6;15925:14;15918:45;15801:169;:::o;15976:366::-;16118:3;16139:67;16203:2;16198:3;16139:67;:::i;:::-;16132:74;;16215:93;16304:3;16215:93;:::i;:::-;16333:2;16328:3;16324:12;16317:19;;15976:366;;;:::o;16348:419::-;16514:4;16552:2;16541:9;16537:18;16529:26;;16601:9;16595:4;16591:20;16587:1;16576:9;16572:17;16565:47;16629:131;16755:4;16629:131;:::i;:::-;16621:139;;16348:419;;;:::o;16773:332::-;16894:4;16932:2;16921:9;16917:18;16909:26;;16945:71;17013:1;17002:9;16998:17;16989:6;16945:71;:::i;:::-;17026:72;17094:2;17083:9;17079:18;17070:6;17026:72;:::i;:::-;16773:332;;;;;:::o;17111:143::-;17168:5;17199:6;17193:13;17184:22;;17215:33;17242:5;17215:33;:::i;:::-;17111:143;;;;:::o;17260:351::-;17330:6;17379:2;17367:9;17358:7;17354:23;17350:32;17347:119;;;17385:79;;:::i;:::-;17347:119;17505:1;17530:64;17586:7;17577:6;17566:9;17562:22;17530:64;:::i;:::-;17520:74;;17476:128;17260:351;;;;:::o;17617:170::-;17757:22;17753:1;17745:6;17741:14;17734:46;17617:170;:::o;17793:366::-;17935:3;17956:67;18020:2;18015:3;17956:67;:::i;:::-;17949:74;;18032:93;18121:3;18032:93;:::i;:::-;18150:2;18145:3;18141:12;18134:19;;17793:366;;;:::o;18165:419::-;18331:4;18369:2;18358:9;18354:18;18346:26;;18418:9;18412:4;18408:20;18404:1;18393:9;18389:17;18382:47;18446:131;18572:4;18446:131;:::i;:::-;18438:139;;18165:419;;;:::o;18590:224::-;18730:34;18726:1;18718:6;18714:14;18707:58;18799:7;18794:2;18786:6;18782:15;18775:32;18590:224;:::o;18820:366::-;18962:3;18983:67;19047:2;19042:3;18983:67;:::i;:::-;18976:74;;19059:93;19148:3;19059:93;:::i;:::-;19177:2;19172:3;19168:12;19161:19;;18820:366;;;:::o;19192:419::-;19358:4;19396:2;19385:9;19381:18;19373:26;;19445:9;19439:4;19435:20;19431:1;19420:9;19416:17;19409:47;19473:131;19599:4;19473:131;:::i;:::-;19465:139;;19192:419;;;:::o;19617:221::-;19757:34;19753:1;19745:6;19741:14;19734:58;19826:4;19821:2;19813:6;19809:15;19802:29;19617:221;:::o;19844:366::-;19986:3;20007:67;20071:2;20066:3;20007:67;:::i;:::-;20000:74;;20083:93;20172:3;20083:93;:::i;:::-;20201:2;20196:3;20192:12;20185:19;;19844:366;;;:::o;20216:419::-;20382:4;20420:2;20409:9;20405:18;20397:26;;20469:9;20463:4;20459:20;20455:1;20444:9;20440:17;20433:47;20497:131;20623:4;20497:131;:::i;:::-;20489:139;;20216:419;;;:::o;20641:179::-;20781:31;20777:1;20769:6;20765:14;20758:55;20641:179;:::o;20826:366::-;20968:3;20989:67;21053:2;21048:3;20989:67;:::i;:::-;20982:74;;21065:93;21154:3;21065:93;:::i;:::-;21183:2;21178:3;21174:12;21167:19;;20826:366;;;:::o;21198:419::-;21364:4;21402:2;21391:9;21387:18;21379:26;;21451:9;21445:4;21441:20;21437:1;21426:9;21422:17;21415:47;21479:131;21605:4;21479:131;:::i;:::-;21471:139;;21198:419;;;:::o;21623:180::-;21671:77;21668:1;21661:88;21768:4;21765:1;21758:15;21792:4;21789:1;21782:15;21809:98;21860:6;21894:5;21888:12;21878:22;;21809:98;;;:::o;21913:147::-;22014:11;22051:3;22036:18;;21913:147;;;;:::o;22066:386::-;22170:3;22198:38;22230:5;22198:38;:::i;:::-;22252:88;22333:6;22328:3;22252:88;:::i;:::-;22245:95;;22349:65;22407:6;22402:3;22395:4;22388:5;22384:16;22349:65;:::i;:::-;22439:6;22434:3;22430:16;22423:23;;22174:278;22066:386;;;;:::o;22458:271::-;22588:3;22610:93;22699:3;22690:6;22610:93;:::i;:::-;22603:100;;22720:3;22713:10;;22458:271;;;;:::o;22735:179::-;22875:31;22871:1;22863:6;22859:14;22852:55;22735:179;:::o;22920:366::-;23062:3;23083:67;23147:2;23142:3;23083:67;:::i;:::-;23076:74;;23159:93;23248:3;23159:93;:::i;:::-;23277:2;23272:3;23268:12;23261:19;;22920:366;;;:::o;23292:419::-;23458:4;23496:2;23485:9;23481:18;23473:26;;23545:9;23539:4;23535:20;23531:1;23520:9;23516:17;23509:47;23573:131;23699:4;23573:131;:::i;:::-;23565:139;;23292:419;;;:::o;23717:225::-;23857:34;23853:1;23845:6;23841:14;23834:58;23926:8;23921:2;23913:6;23909:15;23902:33;23717:225;:::o;23948:366::-;24090:3;24111:67;24175:2;24170:3;24111:67;:::i;:::-;24104:74;;24187:93;24276:3;24187:93;:::i;:::-;24305:2;24300:3;24296:12;24289:19;;23948:366;;;:::o;24320:419::-;24486:4;24524:2;24513:9;24509:18;24501:26;;24573:9;24567:4;24563:20;24559:1;24548:9;24544:17;24537:47;24601:131;24727:4;24601:131;:::i;:::-;24593:139;;24320:419;;;:::o;24745:182::-;24885:34;24881:1;24873:6;24869:14;24862:58;24745:182;:::o;24933:366::-;25075:3;25096:67;25160:2;25155:3;25096:67;:::i;:::-;25089:74;;25172:93;25261:3;25172:93;:::i;:::-;25290:2;25285:3;25281:12;25274:19;;24933:366;;;:::o;25305:419::-;25471:4;25509:2;25498:9;25494:18;25486:26;;25558:9;25552:4;25548:20;25544:1;25533:9;25529:17;25522:47;25586:131;25712:4;25586:131;:::i;:::-;25578:139;;25305:419;;;:::o;25730:223::-;25870:34;25866:1;25858:6;25854:14;25847:58;25939:6;25934:2;25926:6;25922:15;25915:31;25730:223;:::o;25959:366::-;26101:3;26122:67;26186:2;26181:3;26122:67;:::i;:::-;26115:74;;26198:93;26287:3;26198:93;:::i;:::-;26316:2;26311:3;26307:12;26300:19;;25959:366;;;:::o;26331:419::-;26497:4;26535:2;26524:9;26520:18;26512:26;;26584:9;26578:4;26574:20;26570:1;26559:9;26555:17;26548:47;26612:131;26738:4;26612:131;:::i;:::-;26604:139;;26331:419;;;:::o;26756:221::-;26896:34;26892:1;26884:6;26880:14;26873:58;26965:4;26960:2;26952:6;26948:15;26941:29;26756:221;:::o;26983:366::-;27125:3;27146:67;27210:2;27205:3;27146:67;:::i;:::-;27139:74;;27222:93;27311:3;27222:93;:::i;:::-;27340:2;27335:3;27331:12;27324:19;;26983:366;;;:::o;27355:419::-;27521:4;27559:2;27548:9;27544:18;27536:26;;27608:9;27602:4;27598:20;27594:1;27583:9;27579:17;27572:47;27636:131;27762:4;27636:131;:::i;:::-;27628:139;;27355:419;;;:::o;27780:179::-;27920:31;27916:1;27908:6;27904:14;27897:55;27780:179;:::o;27965:366::-;28107:3;28128:67;28192:2;28187:3;28128:67;:::i;:::-;28121:74;;28204:93;28293:3;28204:93;:::i;:::-;28322:2;28317:3;28313:12;28306:19;;27965:366;;;:::o;28337:419::-;28503:4;28541:2;28530:9;28526:18;28518:26;;28590:9;28584:4;28580:20;28576:1;28565:9;28561:17;28554:47;28618:131;28744:4;28618:131;:::i;:::-;28610:139;;28337:419;;;:::o;28762:170::-;28902:22;28898:1;28890:6;28886:14;28879:46;28762:170;:::o;28938:366::-;29080:3;29101:67;29165:2;29160:3;29101:67;:::i;:::-;29094:74;;29177:93;29266:3;29177:93;:::i;:::-;29295:2;29290:3;29286:12;29279:19;;28938:366;;;:::o;29310:419::-;29476:4;29514:2;29503:9;29499:18;29491:26;;29563:9;29557:4;29553:20;29549:1;29538:9;29534:17;29527:47;29591:131;29717:4;29591:131;:::i;:::-;29583:139;;29310:419;;;:::o;29735:775::-;29968:4;30006:3;29995:9;29991:19;29983:27;;30020:71;30088:1;30077:9;30073:17;30064:6;30020:71;:::i;:::-;30101:72;30169:2;30158:9;30154:18;30145:6;30101:72;:::i;:::-;30183;30251:2;30240:9;30236:18;30227:6;30183:72;:::i;:::-;30265;30333:2;30322:9;30318:18;30309:6;30265:72;:::i;:::-;30347:73;30415:3;30404:9;30400:19;30391:6;30347:73;:::i;:::-;30430;30498:3;30487:9;30483:19;30474:6;30430:73;:::i;:::-;29735:775;;;;;;;;;:::o;30516:410::-;30556:7;30579:20;30597:1;30579:20;:::i;:::-;30574:25;;30613:20;30631:1;30613:20;:::i;:::-;30608:25;;30668:1;30665;30661:9;30690:30;30708:11;30690:30;:::i;:::-;30679:41;;30869:1;30860:7;30856:15;30853:1;30850:22;30830:1;30823:9;30803:83;30780:139;;30899:18;;:::i;:::-;30780:139;30564:362;30516:410;;;;:::o;30932:180::-;30980:77;30977:1;30970:88;31077:4;31074:1;31067:15;31101:4;31098:1;31091:15;31118:185;31158:1;31175:20;31193:1;31175:20;:::i;:::-;31170:25;;31209:20;31227:1;31209:20;:::i;:::-;31204:25;;31248:1;31238:35;;31253:18;;:::i;:::-;31238:35;31295:1;31292;31288:9;31283:14;;31118:185;;;;:::o;31309:180::-;31357:77;31354:1;31347:88;31454:4;31451:1;31444:15;31478:4;31475:1;31468:15;31495:85;31540:7;31569:5;31558:16;;31495:85;;;:::o;31586:158::-;31644:9;31677:61;31695:42;31704:32;31730:5;31704:32;:::i;:::-;31695:42;:::i;:::-;31677:61;:::i;:::-;31664:74;;31586:158;;;:::o;31750:147::-;31845:45;31884:5;31845:45;:::i;:::-;31840:3;31833:58;31750:147;;:::o;31903:114::-;31970:6;32004:5;31998:12;31988:22;;31903:114;;;:::o;32023:184::-;32122:11;32156:6;32151:3;32144:19;32196:4;32191:3;32187:14;32172:29;;32023:184;;;;:::o;32213:132::-;32280:4;32303:3;32295:11;;32333:4;32328:3;32324:14;32316:22;;32213:132;;;:::o;32351:108::-;32428:24;32446:5;32428:24;:::i;:::-;32423:3;32416:37;32351:108;;:::o;32465:179::-;32534:10;32555:46;32597:3;32589:6;32555:46;:::i;:::-;32633:4;32628:3;32624:14;32610:28;;32465:179;;;;:::o;32650:113::-;32720:4;32752;32747:3;32743:14;32735:22;;32650:113;;;:::o;32799:732::-;32918:3;32947:54;32995:5;32947:54;:::i;:::-;33017:86;33096:6;33091:3;33017:86;:::i;:::-;33010:93;;33127:56;33177:5;33127:56;:::i;:::-;33206:7;33237:1;33222:284;33247:6;33244:1;33241:13;33222:284;;;33323:6;33317:13;33350:63;33409:3;33394:13;33350:63;:::i;:::-;33343:70;;33436:60;33489:6;33436:60;:::i;:::-;33426:70;;33282:224;33269:1;33266;33262:9;33257:14;;33222:284;;;33226:14;33522:3;33515:10;;32923:608;;;32799:732;;;;:::o;33537:942::-;33828:4;33866:3;33855:9;33851:19;33843:27;;33880:71;33948:1;33937:9;33933:17;33924:6;33880:71;:::i;:::-;33961:80;34037:2;34026:9;34022:18;34013:6;33961:80;:::i;:::-;34088:9;34082:4;34078:20;34073:2;34062:9;34058:18;34051:48;34116:108;34219:4;34210:6;34116:108;:::i;:::-;34108:116;;34234:72;34302:2;34291:9;34287:18;34278:6;34234:72;:::i;:::-;34316:73;34384:3;34373:9;34369:19;34360:6;34316:73;:::i;:::-;34399;34467:3;34456:9;34452:19;34443:6;34399:73;:::i;:::-;33537:942;;;;;;;;;:::o;34485:831::-;34748:4;34786:3;34775:9;34771:19;34763:27;;34800:71;34868:1;34857:9;34853:17;34844:6;34800:71;:::i;:::-;34881:80;34957:2;34946:9;34942:18;34933:6;34881:80;:::i;:::-;35008:9;35002:4;34998:20;34993:2;34982:9;34978:18;34971:48;35036:108;35139:4;35130:6;35036:108;:::i;:::-;35028:116;;35154:72;35222:2;35211:9;35207:18;35198:6;35154:72;:::i;:::-;35236:73;35304:3;35293:9;35289:19;35280:6;35236:73;:::i;:::-;34485:831;;;;;;;;:::o;35322:997::-;35611:4;35649:3;35638:9;35634:19;35626:27;;35663:71;35731:1;35720:9;35716:17;35707:6;35663:71;:::i;:::-;35744:72;35812:2;35801:9;35797:18;35788:6;35744:72;:::i;:::-;35826;35894:2;35883:9;35879:18;35870:6;35826:72;:::i;:::-;35908;35976:2;35965:9;35961:18;35952:6;35908:72;:::i;:::-;35990:73;36058:3;36047:9;36043:19;36034:6;35990:73;:::i;:::-;36073;36141:3;36130:9;36126:19;36117:6;36073:73;:::i;:::-;36156;36224:3;36213:9;36209:19;36200:6;36156:73;:::i;:::-;36239;36307:3;36296:9;36292:19;36283:6;36239:73;:::i;:::-;35322:997;;;;;;;;;;;:::o;36325:224::-;36465:34;36461:1;36453:6;36449:14;36442:58;36534:7;36529:2;36521:6;36517:15;36510:32;36325:224;:::o;36555:366::-;36697:3;36718:67;36782:2;36777:3;36718:67;:::i;:::-;36711:74;;36794:93;36883:3;36794:93;:::i;:::-;36912:2;36907:3;36903:12;36896:19;;36555:366;;;:::o;36927:419::-;37093:4;37131:2;37120:9;37116:18;37108:26;;37180:9;37174:4;37170:20;37166:1;37155:9;37151:17;37144:47;37208:131;37334:4;37208:131;:::i;:::-;37200:139;;36927:419;;;:::o;37352:222::-;37492:34;37488:1;37480:6;37476:14;37469:58;37561:5;37556:2;37548:6;37544:15;37537:30;37352:222;:::o;37580:366::-;37722:3;37743:67;37807:2;37802:3;37743:67;:::i;:::-;37736:74;;37819:93;37908:3;37819:93;:::i;:::-;37937:2;37932:3;37928:12;37921:19;;37580:366;;;:::o;37952:419::-;38118:4;38156:2;38145:9;38141:18;38133:26;;38205:9;38199:4;38195:20;38191:1;38180:9;38176:17;38169:47;38233:131;38359:4;38233:131;:::i;:::-;38225:139;;37952:419;;;:::o;38377:225::-;38517:34;38513:1;38505:6;38501:14;38494:58;38586:8;38581:2;38573:6;38569:15;38562:33;38377:225;:::o;38608:366::-;38750:3;38771:67;38835:2;38830:3;38771:67;:::i;:::-;38764:74;;38847:93;38936:3;38847:93;:::i;:::-;38965:2;38960:3;38956:12;38949:19;;38608:366;;;:::o;38980:419::-;39146:4;39184:2;39173:9;39169:18;39161:26;;39233:9;39227:4;39223:20;39219:1;39208:9;39204:17;39197:47;39261:131;39387:4;39261:131;:::i;:::-;39253:139;;38980:419;;;:::o;39405:229::-;39545:34;39541:1;39533:6;39529:14;39522:58;39614:12;39609:2;39601:6;39597:15;39590:37;39405:229;:::o;39640:366::-;39782:3;39803:67;39867:2;39862:3;39803:67;:::i;:::-;39796:74;;39879:93;39968:3;39879:93;:::i;:::-;39997:2;39992:3;39988:12;39981:19;;39640:366;;;:::o;40012:419::-;40178:4;40216:2;40205:9;40201:18;40193:26;;40265:9;40259:4;40255:20;40251:1;40240:9;40236:17;40229:47;40293:131;40419:4;40293:131;:::i;:::-;40285:139;;40012:419;;;:::o;40437:180::-;40485:77;40482:1;40475:88;40582:4;40579:1;40572:15;40606:4;40603:1;40596:15;40623:807;40872:4;40910:3;40899:9;40895:19;40887:27;;40924:71;40992:1;40981:9;40977:17;40968:6;40924:71;:::i;:::-;41005:72;41073:2;41062:9;41058:18;41049:6;41005:72;:::i;:::-;41087:80;41163:2;41152:9;41148:18;41139:6;41087:80;:::i;:::-;41177;41253:2;41242:9;41238:18;41229:6;41177:80;:::i;:::-;41267:73;41335:3;41324:9;41320:19;41311:6;41267:73;:::i;:::-;41350;41418:3;41407:9;41403:19;41394:6;41350:73;:::i;:::-;40623:807;;;;;;;;;:::o;41436:663::-;41524:6;41532;41540;41589:2;41577:9;41568:7;41564:23;41560:32;41557:119;;;41595:79;;:::i;:::-;41557:119;41715:1;41740:64;41796:7;41787:6;41776:9;41772:22;41740:64;:::i;:::-;41730:74;;41686:128;41853:2;41879:64;41935:7;41926:6;41915:9;41911:22;41879:64;:::i;:::-;41869:74;;41824:129;41992:2;42018:64;42074:7;42065:6;42054:9;42050:22;42018:64;:::i;:::-;42008:74;;41963:129;41436:663;;;;;:::o;42105:442::-;42254:4;42292:2;42281:9;42277:18;42269:26;;42305:71;42373:1;42362:9;42358:17;42349:6;42305:71;:::i;:::-;42386:72;42454:2;42443:9;42439:18;42430:6;42386:72;:::i;:::-;42468;42536:2;42525:9;42521:18;42512:6;42468:72;:::i;:::-;42105:442;;;;;;:::o;42553:225::-;42693:34;42689:1;42681:6;42677:14;42670:58;42762:8;42757:2;42749:6;42745:15;42738:33;42553:225;:::o;42784:366::-;42926:3;42947:67;43011:2;43006:3;42947:67;:::i;:::-;42940:74;;43023:93;43112:3;43023:93;:::i;:::-;43141:2;43136:3;43132:12;43125:19;;42784:366;;;:::o;43156:419::-;43322:4;43360:2;43349:9;43345:18;43337:26;;43409:9;43403:4;43399:20;43395:1;43384:9;43380:17;43373:47;43437:131;43563:4;43437:131;:::i;:::-;43429:139;;43156:419;;;:::o;43581:179::-;43721:31;43717:1;43709:6;43705:14;43698:55;43581:179;:::o;43766:366::-;43908:3;43929:67;43993:2;43988:3;43929:67;:::i;:::-;43922:74;;44005:93;44094:3;44005:93;:::i;:::-;44123:2;44118:3;44114:12;44107:19;;43766:366;;;:::o;44138:419::-;44304:4;44342:2;44331:9;44327:18;44319:26;;44391:9;44385:4;44381:20;44377:1;44366:9;44362:17;44355:47;44419:131;44545:4;44419:131;:::i;:::-;44411:139;;44138:419;;;:::o

Swarm Source

ipfs://6efde8ac7da21b87c638a01eb8797b6d76b75d9b3a5a9d0129853eaedd343f01
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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