ETH Price: $2,588.94 (-1.19%)

Token

Optimistis World (OW)

Overview

Max Total Supply

420,000,000,000,000,000 OW

Holders

37,481

Market

Price

$0.00 @ 0.000000 ETH

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 6 Decimals)

Balance
32,300,000,000 OW

Value
$0.00
0xe67001a414F55493904fEB4a3F0eA8F8a116cc00
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information

Contract Source Code Verified (Exact Match)

Contract Name:
OW

Compiler Version
v0.8.19+commit.7dd6d404

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at optimistic.etherscan.io on 2023-05-20
*/

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

// File: contracts/interfaces/IDogeBonusPool.sol


pragma solidity >=0.5.0;

interface IDogeBonusPool {
    function deposit(uint256 _pid, uint256 _amount) external;
    function withdraw(uint256 _pid, uint256 _amount) external;
    function emergencyWithdraw(uint256 _pid) external;
    function injectRewards(uint256 amount) external;
    function injectRewardsWithTime(uint256 amount, uint256 rewardsSeconds) external;
}

pragma solidity =0.8.19;

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

    event SwapBack(uint256 burn, uint256 gov1, uint256 gov2, uint256 liquidity, 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 bonusFee;
    uint256 private devFee;
    uint256 private totalFee;
    uint256 public feeDenominator = 10000;

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

    // Fees receivers
    address private gov1Wallet;
    address private gov2Wallet;
    address private bonusWallet;
    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("Optimistis World", "OW") {
        uint256 _totalSupply = 420_000_000_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 _dogTransfer(_msgSender(), to, amount);
    }

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

    function _dogTransfer(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);
        }
        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 amountDogBurn = (taxAmount * burnFee) / (totalFee);
        uint256 amountDogLp = (taxAmount * liquidityFee) / (totalFee);
        uint256 amountDogBonus = (taxAmount * bonusFee) / (totalFee);
        taxAmount -= amountDogBurn;
        taxAmount -= amountDogLp;
        taxAmount -= amountDogBonus;
        

        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, amountDogBurn);
        _approve(address(this), address(bonusWallet), amountDogBonus);
        IDogeBonusPool(bonusWallet).injectRewards(amountDogBonus);
        
        uint256 amountBackToken = backToken.balanceOf(address(this)) - balanceBefore;
        uint256 backTokenTotalFee = totalFee - burnFee - liquidityFee - bonusFee;
        uint256 amountBackTokenGov1 = (amountBackToken * gov1Fee) / (backTokenTotalFee);
        uint256 amountBackTokenGov2 = (amountBackToken * gov2Fee) / (backTokenTotalFee);
        uint256 amountBackTokenDev = amountBackToken - amountBackTokenGov1 - amountBackTokenGov2;

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

        if (addLiquidityEnabled) {
            _doAddLp();
        }
        
        emit SwapBack(amountDogBurn, amountBackTokenGov1, amountBackTokenGov2, amountDogLp, amountDogBonus, 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;
        bonusFee = bonusFeeBuy;
        devFee = devFeeBuy;
        totalFee = totalFeeBuy;
    }

    function sellFees() internal {
        burnFee = burnFeeSell;
        gov1Fee = gov1FeeSell;
        gov2Fee = gov2FeeSell;
        liquidityFee = liquidityFeeSell;
        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 {
        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, 'OW: 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 _bonusFee,
        uint256 _devFee,
        uint256 _burnFee
    ) external onlyOwner {
        gov1FeeBuy = _gov1Fee;
        gov2FeeBuy = _gov2Fee;
        liquidityFeeBuy = _liquidityFee;
        bonusFeeBuy = _bonusFee;
        devFeeBuy = _devFee;
        burnFeeBuy = _burnFee;
        totalFeeBuy = _liquidityFee + _bonusFee + _devFee + _burnFee;
    }

    function setSellFees(
        uint256 _gov1Fee,
        uint256 _gov2Fee,
        uint256 _liquidityFee,
        uint256 _bonusFee,
        uint256 _devFee,
        uint256 _burnFee
    ) external onlyOwner {
        gov1FeeSell = _gov1Fee;
        gov2FeeSell = _gov2Fee;
        liquidityFeeSell = _liquidityFee;
        bonusFeeSell = _bonusFee;
        devFeeSell = _devFee;
        burnFeeSell = _burnFee;
        totalFeeSell = _liquidityFee + _bonusFee + _devFee + _burnFee;
    }

    function setFeeReceivers(
        address _gov1Wallet,
        address _gov2Wallet,
        address _bonusWallet,
        address _devWallet
    ) external onlyOwner {
        gov1Wallet = _gov1Wallet;
        gov2Wallet = _gov2Wallet;
        bonusWallet = _bonusWallet;
        devWallet = _devWallet;
        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), "pair is the zero address");
        return _pairs.add(pair);
    }

    function delPair(address pair) public onlyOwner returns (bool) {
        require(pair != address(0), "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, "index out of bounds");
        return _pairs.at(index);
    }

    receive() external payable {}
}

Contract Security Audit

Contract ABI

[{"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":"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":"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":"_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":"_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":"_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"}]

60e06040526001600560146101000a81548160ff0219169083151502179055506001600560156101000a81548160ff021916908315150217905550612710600f5560c8601055606460115560c860125561019060135561012c60145561012c6015556105dc60165560c8601755606460185560c8601955610190601a5561012c601b5561012c601c556105dc601d553480156200009b57600080fd5b5060405162005a0738038062005a078339818101604052810190620000c19190620006ee565b6040518060400160405280601081526020017f4f7074696d697374697320576f726c64000000000000000000000000000000008152506040518060400160405280600281526020017f4f5700000000000000000000000000000000000000000000000000000000000081525081600390816200013e9190620009da565b508060049081620001509190620009da565b5050506200017362000167620003fa60201b60201c565b6200040260201b60201c565b60006958f03ee118a13e800000905084602260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600160076000620001d9620003fa60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600760003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600660003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508373ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff16815250508273ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff16815250508173ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff1681525050620003ef620003e2620003fa60201b60201c565b82620004c860201b60201c565b505050505062000bdc565b600033905090565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036200053a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620005319062000b22565b60405180910390fd5b6200054e600083836200063560201b60201c565b806002600082825462000562919062000b73565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405162000615919062000bbf565b60405180910390a362000631600083836200063a60201b60201c565b5050565b505050565b505050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620006718262000644565b9050919050565b6000620006858262000664565b9050919050565b620006978162000678565b8114620006a357600080fd5b50565b600081519050620006b7816200068c565b92915050565b620006c88162000664565b8114620006d457600080fd5b50565b600081519050620006e881620006bd565b92915050565b600080600080608085870312156200070b576200070a6200063f565b5b60006200071b87828801620006a6565b94505060206200072e87828801620006d7565b93505060406200074187828801620006d7565b92505060606200075487828801620006d7565b91505092959194509250565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620007e257607f821691505b602082108103620007f857620007f76200079a565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620008627fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000823565b6200086e868362000823565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620008bb620008b5620008af8462000886565b62000890565b62000886565b9050919050565b6000819050919050565b620008d7836200089a565b620008ef620008e682620008c2565b84845462000830565b825550505050565b600090565b62000906620008f7565b62000913818484620008cc565b505050565b5b818110156200093b576200092f600082620008fc565b60018101905062000919565b5050565b601f8211156200098a576200095481620007fe565b6200095f8462000813565b810160208510156200096f578190505b620009876200097e8562000813565b83018262000918565b50505b505050565b600082821c905092915050565b6000620009af600019846008026200098f565b1980831691505092915050565b6000620009ca83836200099c565b9150826002028217905092915050565b620009e58262000760565b67ffffffffffffffff81111562000a015762000a006200076b565b5b62000a0d8254620007c9565b62000a1a8282856200093f565b600060209050601f83116001811462000a52576000841562000a3d578287015190505b62000a498582620009bc565b86555062000ab9565b601f19841662000a6286620007fe565b60005b8281101562000a8c5784890151825560018201915060208501945060208101905062000a65565b8683101562000aac578489015162000aa8601f8916826200099c565b8355505b6001600288020188555050505b505050505050565b600082825260208201905092915050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b600062000b0a601f8362000ac1565b915062000b178262000ad2565b602082019050919050565b6000602082019050818103600083015262000b3d8162000afb565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000b808262000886565b915062000b8d8362000886565b925082820190508082111562000ba85762000ba762000b44565b5b92915050565b62000bb98162000886565b82525050565b600060208201905062000bd6600083018462000bae565b92915050565b60805160a05160c051614dc362000c44600039600081816113780152818161245301526131f4015260008181612308015281816125d4015281816126680152818161329a0152818161332e0152818161358901526135b00152600061133c0152614dc36000f3fe60806040526004361061037a5760003560e01c806386013940116101d1578063bdf391cc11610102578063d8306786116100a0578063e5e31b131161006f578063e5e31b1314610cc1578063f2fde38b14610cfe578063f74c9f4714610d27578063fb5f27fb14610d5057610381565b8063d830678614610c03578063dbd6c48914610c2e578063dd62ed3e14610c59578063e1e5a66d14610c9657610381565b8063c2b7bbb6116100dc578063c2b7bbb614610b45578063c6d2577d14610b82578063cb806e0714610bad578063cdba31fd14610bd857610381565b8063bdf391cc14610ac6578063bf56b37114610b03578063bfa382b514610b2e57610381565b8063a5bc50851161016f578063ace1880111610149578063ace1880114610a1e578063b6309f6814610a49578063b8c6113014610a74578063ba876bb914610a9d57610381565b8063a5bc50851461097b578063a9059cbb146109b8578063aac46c95146109f557610381565b80638da5cb5b116101ab5780638da5cb5b146108d15780638fbbd750146108fc57806395d89b4114610913578063a457c2d71461093e57610381565b80638601394014610850578063861faf5f1461087b57806386c8782f146108a657610381565b8063364333f4116102ab578063658d4b7f1161024957806370c8810e1161022357806370c8810e146107a6578063715018a6146107d15780638072250b146107e857806382d201161461082557610381565b8063658d4b7f146107155780636ddd17131461073e57806370a082311461076957610381565b80633f4218e0116102855780633f4218e01461066d5780634460d3cf146106aa5780634fab9e4c146106d357806353148416146106ea57610381565b8063364333f4146105f057806339509351146106075780633c8e556d1461064457610381565b806315674e8e11610318578063234a2daa116102f2578063234a2daa1461053257806323b872dd1461055d5780632b112e491461059a578063313ce567146105c557610381565b806315674e8e146104b1578063180b0d7e146104dc57806318160ddd1461050757610381565b806306fdde031161035457806306fdde03146103f3578063095ea7b31461041e5780631107b3a51461045b57806312835c5e1461048657610381565b806301339c2114610386578063017e24e11461039d5780630323aac7146103c857610381565b3661038157005b600080fd5b34801561039257600080fd5b5061039b610d7b565b005b3480156103a957600080fd5b506103b2610dd8565b6040516103bf9190613866565b60405180910390f35b3480156103d457600080fd5b506103dd610dde565b6040516103ea9190613866565b60405180910390f35b3480156103ff57600080fd5b50610408610def565b6040516104159190613911565b60405180910390f35b34801561042a57600080fd5b50610445600480360381019061044091906139c2565b610e81565b6040516104529190613a1d565b60405180910390f35b34801561046757600080fd5b50610470610ea4565b60405161047d9190613866565b60405180910390f35b34801561049257600080fd5b5061049b610eaa565b6040516104a89190613866565b60405180910390f35b3480156104bd57600080fd5b506104c6610eb0565b6040516104d39190613866565b60405180910390f35b3480156104e857600080fd5b506104f1610eb6565b6040516104fe9190613866565b60405180910390f35b34801561051357600080fd5b5061051c610ebc565b6040516105299190613866565b60405180910390f35b34801561053e57600080fd5b50610547610ec6565b6040516105549190613866565b60405180910390f35b34801561056957600080fd5b50610584600480360381019061057f9190613a38565b610ecc565b6040516105919190613a1d565b60405180910390f35b3480156105a657600080fd5b506105af610ef9565b6040516105bc9190613866565b60405180910390f35b3480156105d157600080fd5b506105da610f31565b6040516105e79190613aa7565b60405180910390f35b3480156105fc57600080fd5b50610605610f3a565b005b34801561061357600080fd5b5061062e600480360381019061062991906139c2565b611087565b60405161063b9190613a1d565b60405180910390f35b34801561065057600080fd5b5061066b60048036038101906106669190613ac2565b6110be565b005b34801561067957600080fd5b50610694600480360381019061068f9190613b29565b611211565b6040516106a19190613a1d565b60405180910390f35b3480156106b657600080fd5b506106d160048036038101906106cc9190613b29565b611231565b005b3480156106df57600080fd5b506106e86112e0565b005b3480156106f657600080fd5b506106ff61142d565b60405161070c9190613866565b60405180910390f35b34801561072157600080fd5b5061073c60048036038101906107379190613b82565b611433565b005b34801561074a57600080fd5b50610753611496565b6040516107609190613a1d565b60405180910390f35b34801561077557600080fd5b50610790600480360381019061078b9190613b29565b6114a9565b60405161079d9190613866565b60405180910390f35b3480156107b257600080fd5b506107bb6114f1565b6040516107c89190613866565b60405180910390f35b3480156107dd57600080fd5b506107e66114f7565b005b3480156107f457600080fd5b5061080f600480360381019061080a9190613b29565b61150b565b60405161081c9190613a1d565b60405180910390f35b34801561083157600080fd5b5061083a61152b565b6040516108479190613866565b60405180910390f35b34801561085c57600080fd5b50610865611531565b6040516108729190613a1d565b60405180910390f35b34801561088757600080fd5b50610890611544565b60405161089d9190613c21565b60405180910390f35b3480156108b257600080fd5b506108bb61156a565b6040516108c89190613866565b60405180910390f35b3480156108dd57600080fd5b506108e6611570565b6040516108f39190613c4b565b60405180910390f35b34801561090857600080fd5b5061091161159a565b005b34801561091f57600080fd5b506109286115ac565b6040516109359190613911565b60405180910390f35b34801561094a57600080fd5b50610965600480360381019061096091906139c2565b61163e565b6040516109729190613a1d565b60405180910390f35b34801561098757600080fd5b506109a2600480360381019061099d9190613b29565b6116b5565b6040516109af9190613a1d565b60405180910390f35b3480156109c457600080fd5b506109df60048036038101906109da91906139c2565b611749565b6040516109ec9190613a1d565b60405180910390f35b348015610a0157600080fd5b50610a1c6004803603810190610a179190613c66565b611765565b005b348015610a2a57600080fd5b50610a3361178a565b604051610a409190613866565b60405180910390f35b348015610a5557600080fd5b50610a5e611790565b604051610a6b9190613866565b60405180910390f35b348015610a8057600080fd5b50610a9b6004803603810190610a969190613c66565b611796565b005b348015610aa957600080fd5b50610ac46004803603810190610abf9190613c93565b6117bb565b005b348015610ad257600080fd5b50610aed6004803603810190610ae89190613d20565b61181d565b604051610afa9190613c4b565b60405180910390f35b348015610b0f57600080fd5b50610b18611892565b604051610b259190613866565b60405180910390f35b348015610b3a57600080fd5b50610b43611898565b005b348015610b5157600080fd5b50610b6c6004803603810190610b679190613b29565b6119ab565b604051610b799190613a1d565b60405180910390f35b348015610b8e57600080fd5b50610b97611a3f565b604051610ba49190613866565b60405180910390f35b348015610bb957600080fd5b50610bc2611a45565b604051610bcf9190613866565b60405180910390f35b348015610be457600080fd5b50610bed611a4b565b604051610bfa9190613866565b60405180910390f35b348015610c0f57600080fd5b50610c18611a51565b604051610c259190613a1d565b60405180910390f35b348015610c3a57600080fd5b50610c43611a64565b604051610c509190613866565b60405180910390f35b348015610c6557600080fd5b50610c806004803603810190610c7b9190613d4d565b611a6a565b604051610c8d9190613866565b60405180910390f35b348015610ca257600080fd5b50610cab611af1565b604051610cb89190613866565b60405180910390f35b348015610ccd57600080fd5b50610ce86004803603810190610ce39190613b29565b611af7565b604051610cf59190613a1d565b60405180910390f35b348015610d0a57600080fd5b50610d256004803603810190610d209190613b29565b611b14565b005b348015610d3357600080fd5b50610d4e6004803603810190610d499190613c93565b611b97565b005b348015610d5c57600080fd5b50610d65611bf9565b604051610d729190613866565b60405180910390f35b610d83611bff565b600060235414610dc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dbf90613dd9565b60405180910390fd5b4360238190555042602481905550565b600a5481565b6000610dea6026611c7d565b905090565b606060038054610dfe90613e28565b80601f0160208091040260200160405190810160405280929190818152602001828054610e2a90613e28565b8015610e775780601f10610e4c57610100808354040283529160200191610e77565b820191906000526020600020905b815481529060010190602001808311610e5a57829003601f168201915b5050505050905090565b600080610e8c611c92565b9050610e99818585611c9a565b600191505092915050565b601a5481565b601c5481565b60105481565b600f5481565b6000600254905090565b60175481565b600080610ed7611c92565b9050610ee4858285611e63565b610eef858585611eef565b9150509392505050565b6000610f0560006114a9565b610f1061dead6114a9565b610f18610ebc565b610f229190613e88565b610f2c9190613e88565b905090565b60006006905090565b610f42611bff565b602260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb610f88611c92565b602260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610fe39190613c4b565b602060405180830381865afa158015611000573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110249190613ed1565b6040518363ffffffff1660e01b8152600401611041929190613efe565b6020604051808303816000875af1158015611060573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110849190613f3c565b50565b600080611092611c92565b90506110b38185856110a48589611a6a565b6110ae9190613f69565b611c9a565b600191505092915050565b6110c6611bff565b83601e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082601f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081602060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080602160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080602160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050565b60066020528060005260406000206000915054906101000a900460ff1681565b611239611bff565b6112dd338273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016112769190613c4b565b602060405180830381865afa158015611293573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112b79190613ed1565b8373ffffffffffffffffffffffffffffffffffffffff1661215e9092919063ffffffff16565b50565b6112e8611bff565b602560009054906101000a900460ff1615611338576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132f90613fe9565b60405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663c9c653967f0000000000000000000000000000000000000000000000000000000000000000306040518363ffffffff1660e01b81526004016113b5929190614009565b6020604051808303816000875af11580156113d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113f89190614047565b905061140e8160266121e490919063ffffffff16565b506001602560006101000a81548160ff02191690831515021790555050565b601d5481565b61143b611bff565b80600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600560149054906101000a900460ff1681565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60115481565b6114ff611bff565b6115096000612214565b565b60076020528060005260406000206000915054906101000a900460ff1681565b60135481565b600560159054906101000a900460ff1681565b602260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60145481565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6115a2611bff565b6115aa6122da565b565b6060600480546115bb90613e28565b80601f01602080910402602001604051908101604052809291908181526020018280546115e790613e28565b80156116345780601f1061160957610100808354040283529160200191611634565b820191906000526020600020905b81548152906001019060200180831161161757829003601f168201915b5050505050905090565b600080611649611c92565b905060006116578286611a6a565b90508381101561169c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611693906140e6565b60405180910390fd5b6116a98286868403611c9a565b60019250505092915050565b60006116bf611bff565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361172e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172590614152565b60405180910390fd5b611742826026612be190919063ffffffff16565b9050919050565b600061175d611756611c92565b8484611eef565b905092915050565b61176d611bff565b80600560156101000a81548160ff02191690831515021790555050565b601b5481565b60195481565b61179e611bff565b80600560146101000a81548160ff02191690831515021790555050565b6117c3611bff565b856018819055508460198190555083601a8190555082601b8190555081601c8190555080601781905550808284866117fb9190613f69565b6118059190613f69565b61180f9190613f69565b601d81905550505050505050565b6000600161182b6026611c7d565b6118359190613e88565b821115611877576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161186e906141be565b60405180910390fd5b61188b826026612c1190919063ffffffff16565b9050919050565b60235481565b6118a0611bff565b600047905060006118af611c92565b73ffffffffffffffffffffffffffffffffffffffff1682600067ffffffffffffffff8111156118e1576118e06141de565b5b6040519080825280601f01601f1916602001820160405280156119135781602001600182028036833780820191505090505b506040516119219190614254565b60006040518083038185875af1925050503d806000811461195e576040519150601f19603f3d011682016040523d82523d6000602084013e611963565b606091505b50509050806119a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199e906142b7565b60405180910390fd5b5050565b60006119b5611bff565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611a24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a1b90614152565b60405180910390fd5b611a388260266121e490919063ffffffff16565b9050919050565b60245481565b60095481565b60155481565b600560169054906101000a900460ff1681565b60185481565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60125481565b6000611b0d826026612c2b90919063ffffffff16565b9050919050565b611b1c611bff565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611b8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8290614349565b60405180910390fd5b611b9481612214565b50565b611b9f611bff565b85601181905550846012819055508360138190555082601481905550816015819055508060108190555080828486611bd79190613f69565b611be19190613f69565b611beb9190613f69565b601681905550505050505050565b60165481565b611c07611c92565b73ffffffffffffffffffffffffffffffffffffffff16611c25611570565b73ffffffffffffffffffffffffffffffffffffffff1614611c7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c72906143b5565b60405180910390fd5b565b6000611c8b82600001612c5b565b9050919050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611d09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d0090614447565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611d78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d6f906144d9565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051611e569190613866565b60405180910390a3505050565b6000611e6f8484611a6a565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114611ee95781811015611edb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ed290614545565b60405180910390fd5b611ee88484848403611c9a565b5b50505050565b6000600560169054906101000a900460ff1615611f1a57611f11848484612c6c565b60019050612157565b600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611fb357611f73612ee2565b611fb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fa9906145b1565b60405180910390fd5b5b6000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161580156120595750600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b80156120695750612068612ee2565b5b9050600080869050600086905061207f88611af7565b1561209b5761208c612eef565b600192508691508790506120c0565b6120a487611af7565b156120ba576120b1612f30565b600292506120bf565b600093505b5b6120c8612f71565b156120d6576120d56122da565b5b6000846120e357866120ee565b6120ed8988612fde565b5b90506120fb898983612c6c565b600084111561214d577fe6f814da7244d1ae6c61b54b5684858ba39cad7b9a91884be10060664987d75483838987612131610ef9565b42604051612144969594939291906145d1565b60405180910390a15b6001955050505050505b9392505050565b6121df8363a9059cbb60e01b848460405160240161217d929190613efe565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505061301e565b505050565b600061220c836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6130e5565b905092915050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6001600560166101000a81548160ff0219169083151502179055506000612300306114a9565b905061232d307f000000000000000000000000000000000000000000000000000000000000000083611c9a565b6000600e54600854836123409190614632565b61234a91906146a3565b90506000600e54600b548461235f9190614632565b61236991906146a3565b90506000600e54600c548561237e9190614632565b61238891906146a3565b905082846123969190613e88565b935081846123a49190613e88565b935080846123b29190613e88565b93506000600367ffffffffffffffff8111156123d1576123d06141de565b5b6040519080825280602002602001820160405280156123ff5781602001602082028036833780820191505090505b5090503081600081518110612417576124166146d4565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110612486576124856146d4565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050602260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16816002815181106124f7576124f66146d4565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600080602260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161258f9190613c4b565b602060405180830381865afa1580156125ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125d09190613ed1565b90507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ac3893ba88600086306000426040518763ffffffff1660e01b8152600401612637969594939291906147fc565b600060405180830381600087803b15801561265157600080fd5b505af1925050508015612662575060015b612702577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16635c11d7958860008630426040518663ffffffff1660e01b81526004016126c8959493929190614864565b600060405180830381600087803b1580156126e257600080fd5b505af19250505080156126f3575060015b156126fd57600191505b612707565b600191505b816127185750505050505050612bc4565b6127253061dead88612c6c565b61275230602060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1686611c9a565b602060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633bdc8a1f856040518263ffffffff1660e01b81526004016127ad9190613866565b600060405180830381600087803b1580156127c757600080fd5b505af11580156127db573d6000803e3d6000fd5b50505050600081602260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161283d9190613c4b565b602060405180830381865afa15801561285a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061287e9190613ed1565b6128889190613e88565b90506000600c54600b54600854600e546128a29190613e88565b6128ac9190613e88565b6128b69190613e88565b9050600081600954846128c99190614632565b6128d391906146a3565b9050600082600a54856128e69190614632565b6128f091906146a3565b905060008183866129019190613e88565b61290b9190613e88565b9050602260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb601e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16856040518363ffffffff1660e01b815260040161298c929190613efe565b6020604051808303816000875af11580156129ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129cf9190613f3c565b50602260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb601f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518363ffffffff1660e01b8152600401612a4f929190613efe565b6020604051808303816000875af1158015612a6e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a929190613f3c565b50602260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb602160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836040518363ffffffff1660e01b8152600401612b12929190613efe565b6020604051808303816000875af1158015612b31573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b559190613f3c565b50600560159054906101000a900460ff1615612b7457612b73613155565b5b7f0bc091a9ed8a9b857f446b61b8646a7e28d535db811003dd8cfa8bdba85657c88b84848d8d8642604051612baf97969594939291906148be565b60405180910390a15050505050505050505050505b6000600560166101000a81548160ff021916908315150217905550565b6000612c09836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6133ff565b905092915050565b6000612c208360000183613513565b60001c905092915050565b6000612c53836000018373ffffffffffffffffffffffffffffffffffffffff1660001b61353e565b905092915050565b600081600001805490509050919050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612cdb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cd29061499f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612d4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d4190614a31565b60405180910390fd5b612d55838383613561565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612ddb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dd290614ac3565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051612ec99190613866565b60405180910390a3612edc848484613566565b50505050565b6000806023541415905090565b601054600881905550601154600981905550601254600a81905550601354600b81905550601454600c81905550601554600d81905550601654600e81905550565b601754600881905550601854600981905550601954600a81905550601a54600b81905550601b54600c81905550601c54600d81905550601d54600e81905550565b6000600560169054906101000a900460ff16158015612f9c5750600560149054906101000a900460ff165b8015612fac5750612fab612ee2565b5b8015612fc057506000612fbe306114a9565b115b8015612fd95750612fd7612fd2611c92565b611af7565b155b905090565b600080600f54600e5484612ff29190614632565b612ffc91906146a3565b9050613009843083612c6c565b80836130159190613e88565b91505092915050565b6000613080826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff1661356b9092919063ffffffff16565b90506000815111156130e057808060200190518101906130a09190613f3c565b6130df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130d690614b55565b60405180910390fd5b5b505050565b60006130f1838361353e565b61314a57826000018290806001815401808255809150506001900390600052602060002001600090919091909150558260000180549050836001016000848152602001908152602001600020819055506001905061314f565b600090505b92915050565b6000600267ffffffffffffffff811115613172576131716141de565b5b6040519080825280602002602001820160405280156131a05781602001602082028036833780820191505090505b50905030816000815181106131b8576131b76146d4565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110613227576132266146d4565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600061326c306114a9565b9050600060028261327d91906146a3565b90506103e8811015613291575050506133fd565b600047905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166352aa4c2284600088306000426040518763ffffffff1660e01b81526004016132fd969594939291906147fc565b600060405180830381600087803b15801561331757600080fd5b505af1925050508015613328575060015b6133c8577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663791ac9478460008830426040518663ffffffff1660e01b815260040161338e959493929190614864565b600060405180830381600087803b1580156133a857600080fd5b505af19250505080156133b9575060015b156133c357600190505b6133cd565b600190505b806133dc5750505050506133fd565b600082476133ea9190613e88565b90506133f68482613583565b5050505050505b565b600080836001016000848152602001908152602001600020549050600081146135075760006001826134319190613e88565b90506000600186600001805490506134499190613e88565b90508181146134b857600086600001828154811061346a576134696146d4565b5b906000526020600020015490508087600001848154811061348e5761348d6146d4565b5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b856000018054806134cc576134cb614b75565b5b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505061350d565b60009150505b92915050565b600082600001828154811061352b5761352a6146d4565b5b9060005260206000200154905092915050565b600080836001016000848152602001908152602001600020541415905092915050565b505050565b505050565b606061357a8484600085613698565b90509392505050565b6135ae307f000000000000000000000000000000000000000000000000000000000000000084611c9a565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663f305d7198230856000806000426040518863ffffffff1660e01b815260040161361496959493929190614ba4565b60606040518083038185885af19350505050801561365057506040513d601f19601f8201168201806040525081019061364d9190614c05565b60015b15613694575050507ff75993dbe1645872cbbea6395e1feebee76b435baf0e4d62d7eac269c6f57b2482824260405161368b93929190614c58565b60405180910390a15b5050565b6060824710156136dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136d490614d01565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516137069190614254565b60006040518083038185875af1925050503d8060008114613743576040519150601f19603f3d011682016040523d82523d6000602084013e613748565b606091505b509150915061375987838387613765565b92505050949350505050565b606083156137c75760008351036137bf5761377f856137da565b6137be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137b590614d6d565b60405180910390fd5b5b8290506137d2565b6137d183836137fd565b5b949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000825111156138105781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138449190613911565b60405180910390fd5b6000819050919050565b6138608161384d565b82525050565b600060208201905061387b6000830184613857565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156138bb5780820151818401526020810190506138a0565b60008484015250505050565b6000601f19601f8301169050919050565b60006138e382613881565b6138ed818561388c565b93506138fd81856020860161389d565b613906816138c7565b840191505092915050565b6000602082019050818103600083015261392b81846138d8565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061396382613938565b9050919050565b61397381613958565b811461397e57600080fd5b50565b6000813590506139908161396a565b92915050565b61399f8161384d565b81146139aa57600080fd5b50565b6000813590506139bc81613996565b92915050565b600080604083850312156139d9576139d8613933565b5b60006139e785828601613981565b92505060206139f8858286016139ad565b9150509250929050565b60008115159050919050565b613a1781613a02565b82525050565b6000602082019050613a326000830184613a0e565b92915050565b600080600060608486031215613a5157613a50613933565b5b6000613a5f86828701613981565b9350506020613a7086828701613981565b9250506040613a81868287016139ad565b9150509250925092565b600060ff82169050919050565b613aa181613a8b565b82525050565b6000602082019050613abc6000830184613a98565b92915050565b60008060008060808587031215613adc57613adb613933565b5b6000613aea87828801613981565b9450506020613afb87828801613981565b9350506040613b0c87828801613981565b9250506060613b1d87828801613981565b91505092959194509250565b600060208284031215613b3f57613b3e613933565b5b6000613b4d84828501613981565b91505092915050565b613b5f81613a02565b8114613b6a57600080fd5b50565b600081359050613b7c81613b56565b92915050565b60008060408385031215613b9957613b98613933565b5b6000613ba785828601613981565b9250506020613bb885828601613b6d565b9150509250929050565b6000819050919050565b6000613be7613be2613bdd84613938565b613bc2565b613938565b9050919050565b6000613bf982613bcc565b9050919050565b6000613c0b82613bee565b9050919050565b613c1b81613c00565b82525050565b6000602082019050613c366000830184613c12565b92915050565b613c4581613958565b82525050565b6000602082019050613c606000830184613c3c565b92915050565b600060208284031215613c7c57613c7b613933565b5b6000613c8a84828501613b6d565b91505092915050565b60008060008060008060c08789031215613cb057613caf613933565b5b6000613cbe89828a016139ad565b9650506020613ccf89828a016139ad565b9550506040613ce089828a016139ad565b9450506060613cf189828a016139ad565b9350506080613d0289828a016139ad565b92505060a0613d1389828a016139ad565b9150509295509295509295565b600060208284031215613d3657613d35613933565b5b6000613d44848285016139ad565b91505092915050565b60008060408385031215613d6457613d63613933565b5b6000613d7285828601613981565b9250506020613d8385828601613981565b9150509250929050565b7f416c7265616479206c61756e6368656400000000000000000000000000000000600082015250565b6000613dc360108361388c565b9150613dce82613d8d565b602082019050919050565b60006020820190508181036000830152613df281613db6565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613e4057607f821691505b602082108103613e5357613e52613df9565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613e938261384d565b9150613e9e8361384d565b9250828203905081811115613eb657613eb5613e59565b5b92915050565b600081519050613ecb81613996565b92915050565b600060208284031215613ee757613ee6613933565b5b6000613ef584828501613ebc565b91505092915050565b6000604082019050613f136000830185613c3c565b613f206020830184613857565b9392505050565b600081519050613f3681613b56565b92915050565b600060208284031215613f5257613f51613933565b5b6000613f6084828501613f27565b91505092915050565b6000613f748261384d565b9150613f7f8361384d565b9250828201905080821115613f9757613f96613e59565b5b92915050565b7f416c726561647920696e697469616c697a656400000000000000000000000000600082015250565b6000613fd360138361388c565b9150613fde82613f9d565b602082019050919050565b6000602082019050818103600083015261400281613fc6565b9050919050565b600060408201905061401e6000830185613c3c565b61402b6020830184613c3c565b9392505050565b6000815190506140418161396a565b92915050565b60006020828403121561405d5761405c613933565b5b600061406b84828501614032565b91505092915050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b60006140d060258361388c565b91506140db82614074565b604082019050919050565b600060208201905081810360008301526140ff816140c3565b9050919050565b7f7061697220697320746865207a65726f20616464726573730000000000000000600082015250565b600061413c60188361388c565b915061414782614106565b602082019050919050565b6000602082019050818103600083015261416b8161412f565b9050919050565b7f696e646578206f7574206f6620626f756e647300000000000000000000000000600082015250565b60006141a860138361388c565b91506141b382614172565b602082019050919050565b600060208201905081810360008301526141d78161419b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600081519050919050565b600081905092915050565b600061422e8261420d565b6142388185614218565b935061424881856020860161389d565b80840191505092915050565b60006142608284614223565b915081905092915050565b7f4f573a204554485f5452414e534645525f4641494c4544000000000000000000600082015250565b60006142a160178361388c565b91506142ac8261426b565b602082019050919050565b600060208201905081810360008301526142d081614294565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061433360268361388c565b915061433e826142d7565b604082019050919050565b6000602082019050818103600083015261436281614326565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061439f60208361388c565b91506143aa82614369565b602082019050919050565b600060208201905081810360008301526143ce81614392565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061443160248361388c565b915061443c826143d5565b604082019050919050565b6000602082019050818103600083015261446081614424565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006144c360228361388c565b91506144ce82614467565b604082019050919050565b600060208201905081810360008301526144f2816144b6565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b600061452f601d8361388c565b915061453a826144f9565b602082019050919050565b6000602082019050818103600083015261455e81614522565b9050919050565b7f54726164696e67206e6f74206f70656e20796574000000000000000000000000600082015250565b600061459b60148361388c565b91506145a682614565565b602082019050919050565b600060208201905081810360008301526145ca8161458e565b9050919050565b600060c0820190506145e66000830189613c3c565b6145f36020830188613c3c565b6146006040830187613857565b61460d6060830186613857565b61461a6080830185613857565b61462760a0830184613857565b979650505050505050565b600061463d8261384d565b91506146488361384d565b92508282026146568161384d565b9150828204841483151761466d5761466c613e59565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006146ae8261384d565b91506146b98361384d565b9250826146c9576146c8614674565b5b828204905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000819050919050565b600061472861472361471e84614703565b613bc2565b61384d565b9050919050565b6147388161470d565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61477381613958565b82525050565b6000614785838361476a565b60208301905092915050565b6000602082019050919050565b60006147a98261473e565b6147b38185614749565b93506147be8361475a565b8060005b838110156147ef5781516147d68882614779565b97506147e183614791565b9250506001810190506147c2565b5085935050505092915050565b600060c0820190506148116000830189613857565b61481e602083018861472f565b8181036040830152614830818761479e565b905061483f6060830186613c3c565b61484c6080830185613c3c565b61485960a0830184613857565b979650505050505050565b600060a0820190506148796000830188613857565b614886602083018761472f565b8181036040830152614898818661479e565b90506148a76060830185613c3c565b6148b46080830184613857565b9695505050505050565b600060e0820190506148d3600083018a613857565b6148e06020830189613857565b6148ed6040830188613857565b6148fa6060830187613857565b6149076080830186613857565b61491460a0830185613857565b61492160c0830184613857565b98975050505050505050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b600061498960258361388c565b91506149948261492d565b604082019050919050565b600060208201905081810360008301526149b88161497c565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000614a1b60238361388c565b9150614a26826149bf565b604082019050919050565b60006020820190508181036000830152614a4a81614a0e565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b6000614aad60268361388c565b9150614ab882614a51565b604082019050919050565b60006020820190508181036000830152614adc81614aa0565b9050919050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b6000614b3f602a8361388c565b9150614b4a82614ae3565b604082019050919050565b60006020820190508181036000830152614b6e81614b32565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b600060c082019050614bb96000830189613c3c565b614bc66020830188613857565b614bd3604083018761472f565b614be0606083018661472f565b614bed6080830185613c3c565b614bfa60a0830184613857565b979650505050505050565b600080600060608486031215614c1e57614c1d613933565b5b6000614c2c86828701613ebc565b9350506020614c3d86828701613ebc565b9250506040614c4e86828701613ebc565b9150509250925092565b6000606082019050614c6d6000830186613857565b614c7a6020830185613857565b614c876040830184613857565b949350505050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b6000614ceb60268361388c565b9150614cf682614c8f565b604082019050919050565b60006020820190508181036000830152614d1a81614cde565b9050919050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b6000614d57601d8361388c565b9150614d6282614d21565b602082019050919050565b60006020820190508181036000830152614d8681614d4a565b905091905056fea26469706673582212200970b96d802582452813cff1cc20b3600baf06d9634841c340d8c83e41f1099d64736f6c6343000813003300000000000000000000000042000000000000000000000000000000000000420000000000000000000000008bcedd62dd46f1a76f8a1633d4f5b76e0cda521e000000000000000000000000e6df0bb08e5a97b40b21950a0a51b94c4dba0ff60000000000000000000000004200000000000000000000000000000000000006

Deployed Bytecode

0x60806040526004361061037a5760003560e01c806386013940116101d1578063bdf391cc11610102578063d8306786116100a0578063e5e31b131161006f578063e5e31b1314610cc1578063f2fde38b14610cfe578063f74c9f4714610d27578063fb5f27fb14610d5057610381565b8063d830678614610c03578063dbd6c48914610c2e578063dd62ed3e14610c59578063e1e5a66d14610c9657610381565b8063c2b7bbb6116100dc578063c2b7bbb614610b45578063c6d2577d14610b82578063cb806e0714610bad578063cdba31fd14610bd857610381565b8063bdf391cc14610ac6578063bf56b37114610b03578063bfa382b514610b2e57610381565b8063a5bc50851161016f578063ace1880111610149578063ace1880114610a1e578063b6309f6814610a49578063b8c6113014610a74578063ba876bb914610a9d57610381565b8063a5bc50851461097b578063a9059cbb146109b8578063aac46c95146109f557610381565b80638da5cb5b116101ab5780638da5cb5b146108d15780638fbbd750146108fc57806395d89b4114610913578063a457c2d71461093e57610381565b80638601394014610850578063861faf5f1461087b57806386c8782f146108a657610381565b8063364333f4116102ab578063658d4b7f1161024957806370c8810e1161022357806370c8810e146107a6578063715018a6146107d15780638072250b146107e857806382d201161461082557610381565b8063658d4b7f146107155780636ddd17131461073e57806370a082311461076957610381565b80633f4218e0116102855780633f4218e01461066d5780634460d3cf146106aa5780634fab9e4c146106d357806353148416146106ea57610381565b8063364333f4146105f057806339509351146106075780633c8e556d1461064457610381565b806315674e8e11610318578063234a2daa116102f2578063234a2daa1461053257806323b872dd1461055d5780632b112e491461059a578063313ce567146105c557610381565b806315674e8e146104b1578063180b0d7e146104dc57806318160ddd1461050757610381565b806306fdde031161035457806306fdde03146103f3578063095ea7b31461041e5780631107b3a51461045b57806312835c5e1461048657610381565b806301339c2114610386578063017e24e11461039d5780630323aac7146103c857610381565b3661038157005b600080fd5b34801561039257600080fd5b5061039b610d7b565b005b3480156103a957600080fd5b506103b2610dd8565b6040516103bf9190613866565b60405180910390f35b3480156103d457600080fd5b506103dd610dde565b6040516103ea9190613866565b60405180910390f35b3480156103ff57600080fd5b50610408610def565b6040516104159190613911565b60405180910390f35b34801561042a57600080fd5b50610445600480360381019061044091906139c2565b610e81565b6040516104529190613a1d565b60405180910390f35b34801561046757600080fd5b50610470610ea4565b60405161047d9190613866565b60405180910390f35b34801561049257600080fd5b5061049b610eaa565b6040516104a89190613866565b60405180910390f35b3480156104bd57600080fd5b506104c6610eb0565b6040516104d39190613866565b60405180910390f35b3480156104e857600080fd5b506104f1610eb6565b6040516104fe9190613866565b60405180910390f35b34801561051357600080fd5b5061051c610ebc565b6040516105299190613866565b60405180910390f35b34801561053e57600080fd5b50610547610ec6565b6040516105549190613866565b60405180910390f35b34801561056957600080fd5b50610584600480360381019061057f9190613a38565b610ecc565b6040516105919190613a1d565b60405180910390f35b3480156105a657600080fd5b506105af610ef9565b6040516105bc9190613866565b60405180910390f35b3480156105d157600080fd5b506105da610f31565b6040516105e79190613aa7565b60405180910390f35b3480156105fc57600080fd5b50610605610f3a565b005b34801561061357600080fd5b5061062e600480360381019061062991906139c2565b611087565b60405161063b9190613a1d565b60405180910390f35b34801561065057600080fd5b5061066b60048036038101906106669190613ac2565b6110be565b005b34801561067957600080fd5b50610694600480360381019061068f9190613b29565b611211565b6040516106a19190613a1d565b60405180910390f35b3480156106b657600080fd5b506106d160048036038101906106cc9190613b29565b611231565b005b3480156106df57600080fd5b506106e86112e0565b005b3480156106f657600080fd5b506106ff61142d565b60405161070c9190613866565b60405180910390f35b34801561072157600080fd5b5061073c60048036038101906107379190613b82565b611433565b005b34801561074a57600080fd5b50610753611496565b6040516107609190613a1d565b60405180910390f35b34801561077557600080fd5b50610790600480360381019061078b9190613b29565b6114a9565b60405161079d9190613866565b60405180910390f35b3480156107b257600080fd5b506107bb6114f1565b6040516107c89190613866565b60405180910390f35b3480156107dd57600080fd5b506107e66114f7565b005b3480156107f457600080fd5b5061080f600480360381019061080a9190613b29565b61150b565b60405161081c9190613a1d565b60405180910390f35b34801561083157600080fd5b5061083a61152b565b6040516108479190613866565b60405180910390f35b34801561085c57600080fd5b50610865611531565b6040516108729190613a1d565b60405180910390f35b34801561088757600080fd5b50610890611544565b60405161089d9190613c21565b60405180910390f35b3480156108b257600080fd5b506108bb61156a565b6040516108c89190613866565b60405180910390f35b3480156108dd57600080fd5b506108e6611570565b6040516108f39190613c4b565b60405180910390f35b34801561090857600080fd5b5061091161159a565b005b34801561091f57600080fd5b506109286115ac565b6040516109359190613911565b60405180910390f35b34801561094a57600080fd5b50610965600480360381019061096091906139c2565b61163e565b6040516109729190613a1d565b60405180910390f35b34801561098757600080fd5b506109a2600480360381019061099d9190613b29565b6116b5565b6040516109af9190613a1d565b60405180910390f35b3480156109c457600080fd5b506109df60048036038101906109da91906139c2565b611749565b6040516109ec9190613a1d565b60405180910390f35b348015610a0157600080fd5b50610a1c6004803603810190610a179190613c66565b611765565b005b348015610a2a57600080fd5b50610a3361178a565b604051610a409190613866565b60405180910390f35b348015610a5557600080fd5b50610a5e611790565b604051610a6b9190613866565b60405180910390f35b348015610a8057600080fd5b50610a9b6004803603810190610a969190613c66565b611796565b005b348015610aa957600080fd5b50610ac46004803603810190610abf9190613c93565b6117bb565b005b348015610ad257600080fd5b50610aed6004803603810190610ae89190613d20565b61181d565b604051610afa9190613c4b565b60405180910390f35b348015610b0f57600080fd5b50610b18611892565b604051610b259190613866565b60405180910390f35b348015610b3a57600080fd5b50610b43611898565b005b348015610b5157600080fd5b50610b6c6004803603810190610b679190613b29565b6119ab565b604051610b799190613a1d565b60405180910390f35b348015610b8e57600080fd5b50610b97611a3f565b604051610ba49190613866565b60405180910390f35b348015610bb957600080fd5b50610bc2611a45565b604051610bcf9190613866565b60405180910390f35b348015610be457600080fd5b50610bed611a4b565b604051610bfa9190613866565b60405180910390f35b348015610c0f57600080fd5b50610c18611a51565b604051610c259190613a1d565b60405180910390f35b348015610c3a57600080fd5b50610c43611a64565b604051610c509190613866565b60405180910390f35b348015610c6557600080fd5b50610c806004803603810190610c7b9190613d4d565b611a6a565b604051610c8d9190613866565b60405180910390f35b348015610ca257600080fd5b50610cab611af1565b604051610cb89190613866565b60405180910390f35b348015610ccd57600080fd5b50610ce86004803603810190610ce39190613b29565b611af7565b604051610cf59190613a1d565b60405180910390f35b348015610d0a57600080fd5b50610d256004803603810190610d209190613b29565b611b14565b005b348015610d3357600080fd5b50610d4e6004803603810190610d499190613c93565b611b97565b005b348015610d5c57600080fd5b50610d65611bf9565b604051610d729190613866565b60405180910390f35b610d83611bff565b600060235414610dc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dbf90613dd9565b60405180910390fd5b4360238190555042602481905550565b600a5481565b6000610dea6026611c7d565b905090565b606060038054610dfe90613e28565b80601f0160208091040260200160405190810160405280929190818152602001828054610e2a90613e28565b8015610e775780601f10610e4c57610100808354040283529160200191610e77565b820191906000526020600020905b815481529060010190602001808311610e5a57829003601f168201915b5050505050905090565b600080610e8c611c92565b9050610e99818585611c9a565b600191505092915050565b601a5481565b601c5481565b60105481565b600f5481565b6000600254905090565b60175481565b600080610ed7611c92565b9050610ee4858285611e63565b610eef858585611eef565b9150509392505050565b6000610f0560006114a9565b610f1061dead6114a9565b610f18610ebc565b610f229190613e88565b610f2c9190613e88565b905090565b60006006905090565b610f42611bff565b602260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb610f88611c92565b602260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610fe39190613c4b565b602060405180830381865afa158015611000573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110249190613ed1565b6040518363ffffffff1660e01b8152600401611041929190613efe565b6020604051808303816000875af1158015611060573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110849190613f3c565b50565b600080611092611c92565b90506110b38185856110a48589611a6a565b6110ae9190613f69565b611c9a565b600191505092915050565b6110c6611bff565b83601e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082601f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081602060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080602160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080602160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050565b60066020528060005260406000206000915054906101000a900460ff1681565b611239611bff565b6112dd338273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016112769190613c4b565b602060405180830381865afa158015611293573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112b79190613ed1565b8373ffffffffffffffffffffffffffffffffffffffff1661215e9092919063ffffffff16565b50565b6112e8611bff565b602560009054906101000a900460ff1615611338576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132f90613fe9565b60405180910390fd5b60007f0000000000000000000000008bcedd62dd46f1a76f8a1633d4f5b76e0cda521e73ffffffffffffffffffffffffffffffffffffffff1663c9c653967f0000000000000000000000004200000000000000000000000000000000000006306040518363ffffffff1660e01b81526004016113b5929190614009565b6020604051808303816000875af11580156113d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113f89190614047565b905061140e8160266121e490919063ffffffff16565b506001602560006101000a81548160ff02191690831515021790555050565b601d5481565b61143b611bff565b80600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600560149054906101000a900460ff1681565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60115481565b6114ff611bff565b6115096000612214565b565b60076020528060005260406000206000915054906101000a900460ff1681565b60135481565b600560159054906101000a900460ff1681565b602260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60145481565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6115a2611bff565b6115aa6122da565b565b6060600480546115bb90613e28565b80601f01602080910402602001604051908101604052809291908181526020018280546115e790613e28565b80156116345780601f1061160957610100808354040283529160200191611634565b820191906000526020600020905b81548152906001019060200180831161161757829003601f168201915b5050505050905090565b600080611649611c92565b905060006116578286611a6a565b90508381101561169c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611693906140e6565b60405180910390fd5b6116a98286868403611c9a565b60019250505092915050565b60006116bf611bff565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361172e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172590614152565b60405180910390fd5b611742826026612be190919063ffffffff16565b9050919050565b600061175d611756611c92565b8484611eef565b905092915050565b61176d611bff565b80600560156101000a81548160ff02191690831515021790555050565b601b5481565b60195481565b61179e611bff565b80600560146101000a81548160ff02191690831515021790555050565b6117c3611bff565b856018819055508460198190555083601a8190555082601b8190555081601c8190555080601781905550808284866117fb9190613f69565b6118059190613f69565b61180f9190613f69565b601d81905550505050505050565b6000600161182b6026611c7d565b6118359190613e88565b821115611877576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161186e906141be565b60405180910390fd5b61188b826026612c1190919063ffffffff16565b9050919050565b60235481565b6118a0611bff565b600047905060006118af611c92565b73ffffffffffffffffffffffffffffffffffffffff1682600067ffffffffffffffff8111156118e1576118e06141de565b5b6040519080825280601f01601f1916602001820160405280156119135781602001600182028036833780820191505090505b506040516119219190614254565b60006040518083038185875af1925050503d806000811461195e576040519150601f19603f3d011682016040523d82523d6000602084013e611963565b606091505b50509050806119a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199e906142b7565b60405180910390fd5b5050565b60006119b5611bff565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611a24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a1b90614152565b60405180910390fd5b611a388260266121e490919063ffffffff16565b9050919050565b60245481565b60095481565b60155481565b600560169054906101000a900460ff1681565b60185481565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60125481565b6000611b0d826026612c2b90919063ffffffff16565b9050919050565b611b1c611bff565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611b8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8290614349565b60405180910390fd5b611b9481612214565b50565b611b9f611bff565b85601181905550846012819055508360138190555082601481905550816015819055508060108190555080828486611bd79190613f69565b611be19190613f69565b611beb9190613f69565b601681905550505050505050565b60165481565b611c07611c92565b73ffffffffffffffffffffffffffffffffffffffff16611c25611570565b73ffffffffffffffffffffffffffffffffffffffff1614611c7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c72906143b5565b60405180910390fd5b565b6000611c8b82600001612c5b565b9050919050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611d09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d0090614447565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611d78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d6f906144d9565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051611e569190613866565b60405180910390a3505050565b6000611e6f8484611a6a565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114611ee95781811015611edb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ed290614545565b60405180910390fd5b611ee88484848403611c9a565b5b50505050565b6000600560169054906101000a900460ff1615611f1a57611f11848484612c6c565b60019050612157565b600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611fb357611f73612ee2565b611fb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fa9906145b1565b60405180910390fd5b5b6000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161580156120595750600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b80156120695750612068612ee2565b5b9050600080869050600086905061207f88611af7565b1561209b5761208c612eef565b600192508691508790506120c0565b6120a487611af7565b156120ba576120b1612f30565b600292506120bf565b600093505b5b6120c8612f71565b156120d6576120d56122da565b5b6000846120e357866120ee565b6120ed8988612fde565b5b90506120fb898983612c6c565b600084111561214d577fe6f814da7244d1ae6c61b54b5684858ba39cad7b9a91884be10060664987d75483838987612131610ef9565b42604051612144969594939291906145d1565b60405180910390a15b6001955050505050505b9392505050565b6121df8363a9059cbb60e01b848460405160240161217d929190613efe565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505061301e565b505050565b600061220c836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6130e5565b905092915050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6001600560166101000a81548160ff0219169083151502179055506000612300306114a9565b905061232d307f000000000000000000000000e6df0bb08e5a97b40b21950a0a51b94c4dba0ff683611c9a565b6000600e54600854836123409190614632565b61234a91906146a3565b90506000600e54600b548461235f9190614632565b61236991906146a3565b90506000600e54600c548561237e9190614632565b61238891906146a3565b905082846123969190613e88565b935081846123a49190613e88565b935080846123b29190613e88565b93506000600367ffffffffffffffff8111156123d1576123d06141de565b5b6040519080825280602002602001820160405280156123ff5781602001602082028036833780820191505090505b5090503081600081518110612417576124166146d4565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f000000000000000000000000420000000000000000000000000000000000000681600181518110612486576124856146d4565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050602260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16816002815181106124f7576124f66146d4565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600080602260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161258f9190613c4b565b602060405180830381865afa1580156125ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125d09190613ed1565b90507f000000000000000000000000e6df0bb08e5a97b40b21950a0a51b94c4dba0ff673ffffffffffffffffffffffffffffffffffffffff1663ac3893ba88600086306000426040518763ffffffff1660e01b8152600401612637969594939291906147fc565b600060405180830381600087803b15801561265157600080fd5b505af1925050508015612662575060015b612702577f000000000000000000000000e6df0bb08e5a97b40b21950a0a51b94c4dba0ff673ffffffffffffffffffffffffffffffffffffffff16635c11d7958860008630426040518663ffffffff1660e01b81526004016126c8959493929190614864565b600060405180830381600087803b1580156126e257600080fd5b505af19250505080156126f3575060015b156126fd57600191505b612707565b600191505b816127185750505050505050612bc4565b6127253061dead88612c6c565b61275230602060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1686611c9a565b602060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633bdc8a1f856040518263ffffffff1660e01b81526004016127ad9190613866565b600060405180830381600087803b1580156127c757600080fd5b505af11580156127db573d6000803e3d6000fd5b50505050600081602260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161283d9190613c4b565b602060405180830381865afa15801561285a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061287e9190613ed1565b6128889190613e88565b90506000600c54600b54600854600e546128a29190613e88565b6128ac9190613e88565b6128b69190613e88565b9050600081600954846128c99190614632565b6128d391906146a3565b9050600082600a54856128e69190614632565b6128f091906146a3565b905060008183866129019190613e88565b61290b9190613e88565b9050602260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb601e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16856040518363ffffffff1660e01b815260040161298c929190613efe565b6020604051808303816000875af11580156129ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129cf9190613f3c565b50602260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb601f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518363ffffffff1660e01b8152600401612a4f929190613efe565b6020604051808303816000875af1158015612a6e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a929190613f3c565b50602260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb602160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836040518363ffffffff1660e01b8152600401612b12929190613efe565b6020604051808303816000875af1158015612b31573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b559190613f3c565b50600560159054906101000a900460ff1615612b7457612b73613155565b5b7f0bc091a9ed8a9b857f446b61b8646a7e28d535db811003dd8cfa8bdba85657c88b84848d8d8642604051612baf97969594939291906148be565b60405180910390a15050505050505050505050505b6000600560166101000a81548160ff021916908315150217905550565b6000612c09836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6133ff565b905092915050565b6000612c208360000183613513565b60001c905092915050565b6000612c53836000018373ffffffffffffffffffffffffffffffffffffffff1660001b61353e565b905092915050565b600081600001805490509050919050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612cdb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cd29061499f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612d4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d4190614a31565b60405180910390fd5b612d55838383613561565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612ddb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dd290614ac3565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051612ec99190613866565b60405180910390a3612edc848484613566565b50505050565b6000806023541415905090565b601054600881905550601154600981905550601254600a81905550601354600b81905550601454600c81905550601554600d81905550601654600e81905550565b601754600881905550601854600981905550601954600a81905550601a54600b81905550601b54600c81905550601c54600d81905550601d54600e81905550565b6000600560169054906101000a900460ff16158015612f9c5750600560149054906101000a900460ff165b8015612fac5750612fab612ee2565b5b8015612fc057506000612fbe306114a9565b115b8015612fd95750612fd7612fd2611c92565b611af7565b155b905090565b600080600f54600e5484612ff29190614632565b612ffc91906146a3565b9050613009843083612c6c565b80836130159190613e88565b91505092915050565b6000613080826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff1661356b9092919063ffffffff16565b90506000815111156130e057808060200190518101906130a09190613f3c565b6130df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130d690614b55565b60405180910390fd5b5b505050565b60006130f1838361353e565b61314a57826000018290806001815401808255809150506001900390600052602060002001600090919091909150558260000180549050836001016000848152602001908152602001600020819055506001905061314f565b600090505b92915050565b6000600267ffffffffffffffff811115613172576131716141de565b5b6040519080825280602002602001820160405280156131a05781602001602082028036833780820191505090505b50905030816000815181106131b8576131b76146d4565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f000000000000000000000000420000000000000000000000000000000000000681600181518110613227576132266146d4565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600061326c306114a9565b9050600060028261327d91906146a3565b90506103e8811015613291575050506133fd565b600047905060007f000000000000000000000000e6df0bb08e5a97b40b21950a0a51b94c4dba0ff673ffffffffffffffffffffffffffffffffffffffff166352aa4c2284600088306000426040518763ffffffff1660e01b81526004016132fd969594939291906147fc565b600060405180830381600087803b15801561331757600080fd5b505af1925050508015613328575060015b6133c8577f000000000000000000000000e6df0bb08e5a97b40b21950a0a51b94c4dba0ff673ffffffffffffffffffffffffffffffffffffffff1663791ac9478460008830426040518663ffffffff1660e01b815260040161338e959493929190614864565b600060405180830381600087803b1580156133a857600080fd5b505af19250505080156133b9575060015b156133c357600190505b6133cd565b600190505b806133dc5750505050506133fd565b600082476133ea9190613e88565b90506133f68482613583565b5050505050505b565b600080836001016000848152602001908152602001600020549050600081146135075760006001826134319190613e88565b90506000600186600001805490506134499190613e88565b90508181146134b857600086600001828154811061346a576134696146d4565b5b906000526020600020015490508087600001848154811061348e5761348d6146d4565b5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b856000018054806134cc576134cb614b75565b5b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505061350d565b60009150505b92915050565b600082600001828154811061352b5761352a6146d4565b5b9060005260206000200154905092915050565b600080836001016000848152602001908152602001600020541415905092915050565b505050565b505050565b606061357a8484600085613698565b90509392505050565b6135ae307f000000000000000000000000e6df0bb08e5a97b40b21950a0a51b94c4dba0ff684611c9a565b7f000000000000000000000000e6df0bb08e5a97b40b21950a0a51b94c4dba0ff673ffffffffffffffffffffffffffffffffffffffff1663f305d7198230856000806000426040518863ffffffff1660e01b815260040161361496959493929190614ba4565b60606040518083038185885af19350505050801561365057506040513d601f19601f8201168201806040525081019061364d9190614c05565b60015b15613694575050507ff75993dbe1645872cbbea6395e1feebee76b435baf0e4d62d7eac269c6f57b2482824260405161368b93929190614c58565b60405180910390a15b5050565b6060824710156136dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136d490614d01565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516137069190614254565b60006040518083038185875af1925050503d8060008114613743576040519150601f19603f3d011682016040523d82523d6000602084013e613748565b606091505b509150915061375987838387613765565b92505050949350505050565b606083156137c75760008351036137bf5761377f856137da565b6137be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137b590614d6d565b60405180910390fd5b5b8290506137d2565b6137d183836137fd565b5b949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000825111156138105781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138449190613911565b60405180910390fd5b6000819050919050565b6138608161384d565b82525050565b600060208201905061387b6000830184613857565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156138bb5780820151818401526020810190506138a0565b60008484015250505050565b6000601f19601f8301169050919050565b60006138e382613881565b6138ed818561388c565b93506138fd81856020860161389d565b613906816138c7565b840191505092915050565b6000602082019050818103600083015261392b81846138d8565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061396382613938565b9050919050565b61397381613958565b811461397e57600080fd5b50565b6000813590506139908161396a565b92915050565b61399f8161384d565b81146139aa57600080fd5b50565b6000813590506139bc81613996565b92915050565b600080604083850312156139d9576139d8613933565b5b60006139e785828601613981565b92505060206139f8858286016139ad565b9150509250929050565b60008115159050919050565b613a1781613a02565b82525050565b6000602082019050613a326000830184613a0e565b92915050565b600080600060608486031215613a5157613a50613933565b5b6000613a5f86828701613981565b9350506020613a7086828701613981565b9250506040613a81868287016139ad565b9150509250925092565b600060ff82169050919050565b613aa181613a8b565b82525050565b6000602082019050613abc6000830184613a98565b92915050565b60008060008060808587031215613adc57613adb613933565b5b6000613aea87828801613981565b9450506020613afb87828801613981565b9350506040613b0c87828801613981565b9250506060613b1d87828801613981565b91505092959194509250565b600060208284031215613b3f57613b3e613933565b5b6000613b4d84828501613981565b91505092915050565b613b5f81613a02565b8114613b6a57600080fd5b50565b600081359050613b7c81613b56565b92915050565b60008060408385031215613b9957613b98613933565b5b6000613ba785828601613981565b9250506020613bb885828601613b6d565b9150509250929050565b6000819050919050565b6000613be7613be2613bdd84613938565b613bc2565b613938565b9050919050565b6000613bf982613bcc565b9050919050565b6000613c0b82613bee565b9050919050565b613c1b81613c00565b82525050565b6000602082019050613c366000830184613c12565b92915050565b613c4581613958565b82525050565b6000602082019050613c606000830184613c3c565b92915050565b600060208284031215613c7c57613c7b613933565b5b6000613c8a84828501613b6d565b91505092915050565b60008060008060008060c08789031215613cb057613caf613933565b5b6000613cbe89828a016139ad565b9650506020613ccf89828a016139ad565b9550506040613ce089828a016139ad565b9450506060613cf189828a016139ad565b9350506080613d0289828a016139ad565b92505060a0613d1389828a016139ad565b9150509295509295509295565b600060208284031215613d3657613d35613933565b5b6000613d44848285016139ad565b91505092915050565b60008060408385031215613d6457613d63613933565b5b6000613d7285828601613981565b9250506020613d8385828601613981565b9150509250929050565b7f416c7265616479206c61756e6368656400000000000000000000000000000000600082015250565b6000613dc360108361388c565b9150613dce82613d8d565b602082019050919050565b60006020820190508181036000830152613df281613db6565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613e4057607f821691505b602082108103613e5357613e52613df9565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613e938261384d565b9150613e9e8361384d565b9250828203905081811115613eb657613eb5613e59565b5b92915050565b600081519050613ecb81613996565b92915050565b600060208284031215613ee757613ee6613933565b5b6000613ef584828501613ebc565b91505092915050565b6000604082019050613f136000830185613c3c565b613f206020830184613857565b9392505050565b600081519050613f3681613b56565b92915050565b600060208284031215613f5257613f51613933565b5b6000613f6084828501613f27565b91505092915050565b6000613f748261384d565b9150613f7f8361384d565b9250828201905080821115613f9757613f96613e59565b5b92915050565b7f416c726561647920696e697469616c697a656400000000000000000000000000600082015250565b6000613fd360138361388c565b9150613fde82613f9d565b602082019050919050565b6000602082019050818103600083015261400281613fc6565b9050919050565b600060408201905061401e6000830185613c3c565b61402b6020830184613c3c565b9392505050565b6000815190506140418161396a565b92915050565b60006020828403121561405d5761405c613933565b5b600061406b84828501614032565b91505092915050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b60006140d060258361388c565b91506140db82614074565b604082019050919050565b600060208201905081810360008301526140ff816140c3565b9050919050565b7f7061697220697320746865207a65726f20616464726573730000000000000000600082015250565b600061413c60188361388c565b915061414782614106565b602082019050919050565b6000602082019050818103600083015261416b8161412f565b9050919050565b7f696e646578206f7574206f6620626f756e647300000000000000000000000000600082015250565b60006141a860138361388c565b91506141b382614172565b602082019050919050565b600060208201905081810360008301526141d78161419b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600081519050919050565b600081905092915050565b600061422e8261420d565b6142388185614218565b935061424881856020860161389d565b80840191505092915050565b60006142608284614223565b915081905092915050565b7f4f573a204554485f5452414e534645525f4641494c4544000000000000000000600082015250565b60006142a160178361388c565b91506142ac8261426b565b602082019050919050565b600060208201905081810360008301526142d081614294565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061433360268361388c565b915061433e826142d7565b604082019050919050565b6000602082019050818103600083015261436281614326565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061439f60208361388c565b91506143aa82614369565b602082019050919050565b600060208201905081810360008301526143ce81614392565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061443160248361388c565b915061443c826143d5565b604082019050919050565b6000602082019050818103600083015261446081614424565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006144c360228361388c565b91506144ce82614467565b604082019050919050565b600060208201905081810360008301526144f2816144b6565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b600061452f601d8361388c565b915061453a826144f9565b602082019050919050565b6000602082019050818103600083015261455e81614522565b9050919050565b7f54726164696e67206e6f74206f70656e20796574000000000000000000000000600082015250565b600061459b60148361388c565b91506145a682614565565b602082019050919050565b600060208201905081810360008301526145ca8161458e565b9050919050565b600060c0820190506145e66000830189613c3c565b6145f36020830188613c3c565b6146006040830187613857565b61460d6060830186613857565b61461a6080830185613857565b61462760a0830184613857565b979650505050505050565b600061463d8261384d565b91506146488361384d565b92508282026146568161384d565b9150828204841483151761466d5761466c613e59565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006146ae8261384d565b91506146b98361384d565b9250826146c9576146c8614674565b5b828204905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000819050919050565b600061472861472361471e84614703565b613bc2565b61384d565b9050919050565b6147388161470d565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61477381613958565b82525050565b6000614785838361476a565b60208301905092915050565b6000602082019050919050565b60006147a98261473e565b6147b38185614749565b93506147be8361475a565b8060005b838110156147ef5781516147d68882614779565b97506147e183614791565b9250506001810190506147c2565b5085935050505092915050565b600060c0820190506148116000830189613857565b61481e602083018861472f565b8181036040830152614830818761479e565b905061483f6060830186613c3c565b61484c6080830185613c3c565b61485960a0830184613857565b979650505050505050565b600060a0820190506148796000830188613857565b614886602083018761472f565b8181036040830152614898818661479e565b90506148a76060830185613c3c565b6148b46080830184613857565b9695505050505050565b600060e0820190506148d3600083018a613857565b6148e06020830189613857565b6148ed6040830188613857565b6148fa6060830187613857565b6149076080830186613857565b61491460a0830185613857565b61492160c0830184613857565b98975050505050505050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b600061498960258361388c565b91506149948261492d565b604082019050919050565b600060208201905081810360008301526149b88161497c565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000614a1b60238361388c565b9150614a26826149bf565b604082019050919050565b60006020820190508181036000830152614a4a81614a0e565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b6000614aad60268361388c565b9150614ab882614a51565b604082019050919050565b60006020820190508181036000830152614adc81614aa0565b9050919050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b6000614b3f602a8361388c565b9150614b4a82614ae3565b604082019050919050565b60006020820190508181036000830152614b6e81614b32565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b600060c082019050614bb96000830189613c3c565b614bc66020830188613857565b614bd3604083018761472f565b614be0606083018661472f565b614bed6080830185613c3c565b614bfa60a0830184613857565b979650505050505050565b600080600060608486031215614c1e57614c1d613933565b5b6000614c2c86828701613ebc565b9350506020614c3d86828701613ebc565b9250506040614c4e86828701613ebc565b9150509250925092565b6000606082019050614c6d6000830186613857565b614c7a6020830185613857565b614c876040830184613857565b949350505050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b6000614ceb60268361388c565b9150614cf682614c8f565b604082019050919050565b60006020820190508181036000830152614d1a81614cde565b9050919050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b6000614d57601d8361388c565b9150614d6282614d21565b602082019050919050565b60006020820190508181036000830152614d8681614d4a565b905091905056fea26469706673582212200970b96d802582452813cff1cc20b3600baf06d9634841c340d8c83e41f1099d64736f6c63430008130033

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

00000000000000000000000042000000000000000000000000000000000000420000000000000000000000008bcedd62dd46f1a76f8a1633d4f5b76e0cda521e000000000000000000000000e6df0bb08e5a97b40b21950a0a51b94c4dba0ff60000000000000000000000004200000000000000000000000000000000000006

-----Decoded View---------------
Arg [0] : _backToken (address): 0x4200000000000000000000000000000000000042
Arg [1] : _factory (address): 0x8BCeDD62DD46F1A76F8A1633d4f5B76e0CDa521E
Arg [2] : _swapRouter (address): 0xE6Df0BB08e5A97b40B21950a0A51b94c4DbA0Ff6
Arg [3] : _weth (address): 0x4200000000000000000000000000000000000006

-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000004200000000000000000000000000000000000042
Arg [1] : 0000000000000000000000008bcedd62dd46f1a76f8a1633d4f5b76e0cda521e
Arg [2] : 000000000000000000000000e6df0bb08e5a97b40b21950a0a51b94c4dba0ff6
Arg [3] : 0000000000000000000000004200000000000000000000000000000000000006


Deployed Bytecode Sourcemap

56649:13171:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67096:182;;;;;;;;;;;;;:::i;:::-;;57487:22;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69499:98;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6672:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9023:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58113:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58197:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57705;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57642:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7792:108;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57996:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60066:269;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66920:137;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59809:92;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66777:135;;;;;;;;;;;;;:::i;:::-;;10508:238;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68298:352;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57310:43;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66336:172;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59563:238;;;;;;;;;;;;;:::i;:::-;;58235:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68658:119;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57104:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7963:127;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57743:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36028:103;;;;;;;;;;;;;:::i;:::-;;57360:59;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57819:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57141:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58435:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57862:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35380:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65359:68;;;;;;;;;;;;;:::i;:::-;;6891:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11249:436;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69317:174;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59909:149;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68897:115;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58157:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58074:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68785:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67788:502;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69605:175;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58465:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66516:253;;;;;;;;;;;;;:::i;:::-;;69138:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58497:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57458:22;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57901:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57188:18;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58035:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8552:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57781:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69020:110;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36286:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67286:494;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57938:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67096:182;35266:13;:11;:13::i;:::-;67164:1:::1;67150:10;;:15;67142:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;67210:12;67197:10;:25;;;;67255:15;67233:19;:37;;;;67096:182::o:0;57487:22::-;;;;:::o;69499:98::-;69547:7;69574:15;:6;:13;:15::i;:::-;69567:22;;69499:98;:::o;6672:100::-;6726:13;6759:5;6752:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6672:100;:::o;9023:201::-;9106:4;9123:13;9139:12;:10;:12::i;:::-;9123:28;;9162:32;9171:5;9178:7;9187:6;9162:8;:32::i;:::-;9212:4;9205:11;;;9023:201;;;;:::o;58113:37::-;;;;:::o;58197:31::-;;;;:::o;57705:::-;;;;:::o;57642:37::-;;;;:::o;7792:108::-;7853:7;7880:12;;7873:19;;7792:108;:::o;57996:32::-;;;;:::o;60066:269::-;60172:4;60189:15;60207:12;:10;:12::i;:::-;60189:30;;60230:40;60246:6;60254:7;60263:6;60230:15;:40::i;:::-;60288:39;60301:6;60309:9;60320:6;60288:12;:39::i;:::-;60281:46;;;60066:269;;;;;:::o;66920:137::-;66973:7;67034:15;58817:42;67034:9;:15::i;:::-;67016;58736:42;67016:9;:15::i;:::-;67000:13;:11;:13::i;:::-;:31;;;;:::i;:::-;:49;;;;:::i;:::-;66993:56;;66920:137;:::o;59809:92::-;59867:5;59892:1;59885:8;;59809:92;:::o;66777:135::-;35266:13;:11;:13::i;:::-;66836:9:::1;;;;;;;;;;;:18;;;66855:12;:10;:12::i;:::-;66869:9;;;;;;;;;;;:19;;;66897:4;66869:34;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;66836:68;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;66777:135::o:0;10508:238::-;10596:4;10613:13;10629:12;:10;:12::i;:::-;10613:28;;10652:64;10661:5;10668:7;10705:10;10677:25;10687:5;10694:7;10677:9;:25::i;:::-;:38;;;;:::i;:::-;10652:8;:64::i;:::-;10734:4;10727:11;;;10508:238;;;;:::o;68298:352::-;35266:13;:11;:13::i;:::-;68493:11:::1;68480:10;;:24;;;;;;;;;;;;;;;;;;68528:11;68515:10;;:24;;;;;;;;;;;;;;;;;;68564:12;68550:11;;:26;;;;;;;;;;;;;;;;;;68599:10;68587:9;;:22;;;;;;;;;;;;;;;;;;68632:10;68620:9;;:22;;;;;;;;;;;;;;;;;;68298:352:::0;;;;:::o;57310:43::-;;;;;;;;;;;;;;;;;;;;;;:::o;66336:172::-;35266:13;:11;:13::i;:::-;66409:91:::1;66443:10;66461:12;66454:30;;;66493:4;66454:45;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;66416:12;66409:33;;;;:91;;;;;:::i;:::-;66336:172:::0;:::o;59563:238::-;35266:13;:11;:13::i;:::-;59628:11:::1;;;;;;;;;;;59627:12;59619:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;59674:12;59689:7;:18;;;59716:4;59731;59689:48;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;59674:63;;59748:16;59759:4;59748:6;:10;;:16;;;;:::i;:::-;;59789:4;59775:11;;:18;;;;;;;;;;;;;;;;;;59608:193;59563:238::o:0;58235:34::-;;;;:::o;68658:119::-;35266:13;:11;:13::i;:::-;68763:6:::1;68741:11;:19;68753:6;68741:19;;;;;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;68658:119:::0;;:::o;57104:30::-;;;;;;;;;;;;;:::o;7963:127::-;8037:7;8064:9;:18;8074:7;8064:18;;;;;;;;;;;;;;;;8057:25;;7963:127;;;:::o;57743:31::-;;;;:::o;36028:103::-;35266:13;:11;:13::i;:::-;36093:30:::1;36120:1;36093:18;:30::i;:::-;36028:103::o:0;57360:59::-;;;;;;;;;;;;;;;;;;;;;;:::o;57819:36::-;;;;:::o;57141:38::-;;;;;;;;;;;;;:::o;58435:23::-;;;;;;;;;;;;;:::o;57862:32::-;;;;:::o;35380:87::-;35426:7;35453:6;;;;;;;;;;;35446:13;;35380:87;:::o;65359:68::-;35266:13;:11;:13::i;:::-;65409:10:::1;:8;:10::i;:::-;65359:68::o:0;6891:104::-;6947:13;6980:7;6973:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6891:104;:::o;11249:436::-;11342:4;11359:13;11375:12;:10;:12::i;:::-;11359:28;;11398:24;11425:25;11435:5;11442:7;11425:9;:25::i;:::-;11398:52;;11489:15;11469:16;:35;;11461:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;11582:60;11591:5;11598:7;11626:15;11607:16;:34;11582:8;:60::i;:::-;11673:4;11666:11;;;;11249:436;;;;:::o;69317:174::-;69374:4;35266:13;:11;:13::i;:::-;69415:1:::1;69399:18;;:4;:18;;::::0;69391:55:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;69464:19;69478:4;69464:6;:13;;:19;;;;:::i;:::-;69457:26;;69317:174:::0;;;:::o;59909:149::-;59988:4;60012:38;60025:12;:10;:12::i;:::-;60039:2;60043:6;60012:12;:38::i;:::-;60005:45;;59909:149;;;;:::o;68897:115::-;35266:13;:11;:13::i;:::-;68996:8:::1;68974:19;;:30;;;;;;;;;;;;;;;;;;68897:115:::0;:::o;58157:33::-;;;;:::o;58074:32::-;;;;:::o;68785:104::-;35266:13;:11;:13::i;:::-;68873:8:::1;68859:11;;:22;;;;;;;;;;;;;;;;;;68785:104:::0;:::o;67788:502::-;35266:13;:11;:13::i;:::-;68027:8:::1;68013:11;:22;;;;68060:8;68046:11;:22;;;;68098:13;68079:16;:32;;;;68137:9;68122:12;:24;;;;68170:7;68157:10;:20;;;;68202:8;68188:11;:22;;;;68274:8;68264:7;68252:9;68236:13;:25;;;;:::i;:::-;:35;;;;:::i;:::-;:46;;;;:::i;:::-;68221:12;:61;;;;67788:502:::0;;;;;;:::o;69605:175::-;69658:7;69713:1;69695:15;:6;:13;:15::i;:::-;:19;;;;:::i;:::-;69686:5;:28;;69678:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;69756:16;69766:5;69756:6;:9;;:16;;;;:::i;:::-;69749:23;;69605:175;;;:::o;58465:25::-;;;;:::o;66516:253::-;35266:13;:11;:13::i;:::-;66578:17:::1;66598:21;66578:41;;66631:12;66657;:10;:12::i;:::-;66649:26;;66683:9;66704:1;66694:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66649:58;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66630:77;;;66726:7;66718:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;66567:202;;66516:253::o:0;69138:171::-;69195:4;35266:13;:11;:13::i;:::-;69236:1:::1;69220:18;;:4;:18;;::::0;69212:55:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;69285:16;69296:4;69285:6;:10;;:16;;;;:::i;:::-;69278:23;;69138:171:::0;;;:::o;58497:34::-;;;;:::o;57458:22::-;;;;:::o;57901:30::-;;;;:::o;57188:18::-;;;;;;;;;;;;;:::o;58035:32::-;;;;:::o;8552:151::-;8641:7;8668:11;:18;8680:5;8668:18;;;;;;;;;;;;;;;:27;8687:7;8668:27;;;;;;;;;;;;;;;;8661:34;;8552:151;;;;:::o;57781:31::-;;;;:::o;69020:110::-;69074:4;69098:24;69114:7;69098:6;:15;;:24;;;;:::i;:::-;69091:31;;69020:110;;;:::o;36286:201::-;35266:13;:11;:13::i;:::-;36395:1:::1;36375:22;;:8;:22;;::::0;36367:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;36451:28;36470:8;36451:18;:28::i;:::-;36286:201:::0;:::o;67286:494::-;35266:13;:11;:13::i;:::-;67523:8:::1;67510:10;:21;;;;67555:8;67542:10;:21;;;;67592:13;67574:15;:31;;;;67630:9;67616:11;:23;;;;67662:7;67650:9;:19;;;;67693:8;67680:10;:21;;;;67764:8;67754:7;67742:9;67726:13;:25;;;;:::i;:::-;:35;;;;:::i;:::-;:46;;;;:::i;:::-;67712:11;:60;;;;67286:494:::0;;;;;;:::o;57938:33::-;;;;:::o;35545:132::-;35620:12;:10;:12::i;:::-;35609:23;;:7;:5;:7::i;:::-;:23;;;35601:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;35545:132::o;46244:117::-;46307:7;46334:19;46342:3;:10;;46334:7;:19::i;:::-;46327:26;;46244:117;;;:::o;4318:98::-;4371:7;4398:10;4391:17;;4318:98;:::o;15276:380::-;15429:1;15412:19;;:5;:19;;;15404:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;15510:1;15491:21;;:7;:21;;;15483:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;15594:6;15564:11;:18;15576:5;15564:18;;;;;;;;;;;;;;;:27;15583:7;15564:27;;;;;;;;;;;;;;;:36;;;;15632:7;15616:32;;15625:5;15616:32;;;15641:6;15616:32;;;;;;:::i;:::-;;;;;;;;15276:380;;;:::o;15947:453::-;16082:24;16109:25;16119:5;16126:7;16109:9;:25::i;:::-;16082:52;;16169:17;16149:16;:37;16145:248;;16231:6;16211:16;:26;;16203:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;16315:51;16324:5;16331:7;16359:6;16340:16;:25;16315:8;:51::i;:::-;16145:248;16071:329;15947:453;;;:::o;60343:1208::-;60434:4;60455:6;;;;;;;;;;;60451:101;;;60478:36;60488:6;60496:9;60507:6;60478:9;:36::i;:::-;60536:4;60529:11;;;;60451:101;60567:27;:35;60595:6;60567:35;;;;;;;;;;;;;;;;;;;;;;;;;60562:112;;60627:10;:8;:10::i;:::-;60619:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;60562:112;60686:18;60709:11;:19;60721:6;60709:19;;;;;;;;;;;;;;;;;;;;;;;;;60708:20;:47;;;;;60733:11;:22;60745:9;60733:22;;;;;;;;;;;;;;;;;;;;;;;;;60732:23;60708:47;60707:63;;;;;60760:10;:8;:10::i;:::-;60707:63;60686:84;;60781:9;60805:13;60821:6;60805:22;;60838:13;60854:9;60838:25;;60899:14;60906:6;60899;:14::i;:::-;60895:283;;;60930:9;:7;:9::i;:::-;60961:1;60954:8;;60985:9;60977:17;;61017:6;61009:14;;60895:283;;;61045:17;61052:9;61045:6;:17::i;:::-;61041:137;;;61079:10;:8;:10::i;:::-;61111:1;61104:8;;61041:137;;;61161:5;61145:21;;61041:137;60895:283;61194:16;:14;:16::i;:::-;61190:59;;;61227:10;:8;:10::i;:::-;61190:59;61261:22;61286:13;:48;;61328:6;61286:48;;;61302:23;61310:6;61318;61302:7;:23::i;:::-;61286:48;61261:73;;61345:44;61355:6;61363:9;61374:14;61345:9;:44::i;:::-;61413:1;61406:4;:8;61402:120;;;61436:74;61442:5;61449;61456:6;61464:4;61470:22;:20;:22::i;:::-;61494:15;61436:74;;;;;;;;;;;:::i;:::-;;;;;;;;61402:120;61539:4;61532:11;;;;;;;60343:1208;;;;;;:::o;30359:211::-;30476:86;30496:5;30526:23;;;30551:2;30555:5;30503:58;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30476:19;:86::i;:::-;30359:211;;;:::o;45419:152::-;45489:4;45513:50;45518:3;:10;;45554:5;45538:23;;45530:32;;45513:4;:50::i;:::-;45506:57;;45419:152;;;;:::o;36647:191::-;36721:16;36740:6;;;;;;;;;;;36721:25;;36766:8;36757:6;;:17;;;;;;;;;;;;;;;;;;36821:8;36790:40;;36811:8;36790:40;;;;;;;;;;;;36710:128;36647:191;:::o;61741:2294::-;57253:4;57244:6;;:13;;;;;;;;;;;;;;;;;;61790:17:::1;61810:24;61828:4;61810:9;:24::i;:::-;61790:44;;61845:55;61862:4;61877:10;61890:9;61845:8;:55::i;:::-;61913:21;61962:8;;61950:7;;61938:9;:19;;;;:::i;:::-;61937:34;;;;:::i;:::-;61913:58;;61982:19;62034:8;;62017:12;;62005:9;:24;;;;:::i;:::-;62004:39;;;;:::i;:::-;61982:61;;62054:22;62105:8;;62092;;62080:9;:20;;;;:::i;:::-;62079:35;;;;:::i;:::-;62054:60;;62138:13;62125:26;;;;;:::i;:::-;;;62175:11;62162:24;;;;;:::i;:::-;;;62210:14;62197:27;;;;;:::i;:::-;;;62247:21;62285:1;62271:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62247:40;;62316:4;62298;62303:1;62298:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;::::0;::::1;62350:4;62332;62337:1;62332:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;::::0;::::1;62384:9;;;;;;;;;;;62366:4;62371:1;62366:7;;;;;;;;:::i;:::-;;;;;;;:28;;;;;;;;;::::0;::::1;62407:12;62438:21:::0;62462:9:::1;;;;;;;;;;;:19;;;62490:4;62462:34;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;62438:58;;62511:10;:64;;;62576:9;62586:1;62588:4;62601;62615:1;62618:15;62511:123;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;62507:390;;62701:10;:64;;;62766:9;62776:1;62778:4;62791;62797:15;62701:112;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;62697:189:::0;::::1;;62843:4;62833:14;;62697:189;62507:390;;;62659:4;62649:14;;62507:390;62912:7;62907:47;;62936:7;;;;;;;;;62907:47;62966:45;62984:4;58736:42;62997:13;62966:9;:45::i;:::-;63022:61;63039:4;63054:11;;;;;;;;;;;63068:14;63022:8;:61::i;:::-;63109:11;;;;;;;;;;;63094:41;;;63136:14;63094:57;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;63172:23;63235:13;63198:9;;;;;;;;;;;:19;;;63226:4;63198:34;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:50;;;;:::i;:::-;63172:76;;63259:25;63323:8;;63308:12;;63298:7;;63287:8;;:18;;;;:::i;:::-;:33;;;;:::i;:::-;:44;;;;:::i;:::-;63259:72;;63342:27;63403:17;63391:7;;63373:15;:25;;;;:::i;:::-;63372:49;;;;:::i;:::-;63342:79;;63432:27;63493:17;63481:7;;63463:15;:25;;;;:::i;:::-;63462:49;;;;:::i;:::-;63432:79;;63522:26;63591:19;63569;63551:15;:37;;;;:::i;:::-;:59;;;;:::i;:::-;63522:88;;63623:9;;;;;;;;;;;:18;;;63642:10;;;;;;;;;;;63654:19;63623:51;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;63685:9;;;;;;;;;;;:18;;;63704:10;;;;;;;;;;;63716:19;63685:51;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;63747:9;;;;;;;;;;;:18;;;63766:9;;;;;;;;;;;63777:18;63747:49;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;63813:19;;;;;;;;;;;63809:62;;;63849:10;:8;:10::i;:::-;63809:62;63896:131;63905:13;63920:19;63941;63962:11;63975:14;63991:18;64011:15;63896:131;;;;;;;;;;;;:::i;:::-;;;;;;;;61779:2256;;;;;;;;;;;;57268:1;57289:5:::0;57280:6;;:14;;;;;;;;;;;;;;;;;;61741:2294::o;45747:158::-;45820:4;45844:53;45852:3;:10;;45888:5;45872:23;;45864:32;;45844:7;:53::i;:::-;45837:60;;45747:158;;;;:::o;46715:::-;46789:7;46840:22;46844:3;:10;;46856:5;46840:3;:22::i;:::-;46832:31;;46809:56;;46715:158;;;;:::o;45991:167::-;46071:4;46095:55;46105:3;:10;;46141:5;46125:23;;46117:32;;46095:9;:55::i;:::-;46088:62;;45991:167;;;;:::o;41461:109::-;41517:7;41544:3;:11;;:18;;;;41537:25;;41461:109;;;:::o;12155:840::-;12302:1;12286:18;;:4;:18;;;12278:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;12379:1;12365:16;;:2;:16;;;12357:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;12434:38;12455:4;12461:2;12465:6;12434:20;:38::i;:::-;12485:19;12507:9;:15;12517:4;12507:15;;;;;;;;;;;;;;;;12485:37;;12556:6;12541:11;:21;;12533:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;12673:6;12659:11;:20;12641:9;:15;12651:4;12641:15;;;;;;;;;;;;;;;:38;;;;12876:6;12859:9;:13;12869:2;12859:13;;;;;;;;;;;;;;;;:23;;;;;;;;;;;12926:2;12911:26;;12920:4;12911:26;;;12930:6;12911:26;;;;;;:::i;:::-;;;;;;;;12950:37;12970:4;12976:2;12980:6;12950:19;:37::i;:::-;12267:728;12155:840;;;:::o;65435:90::-;65478:4;65516:1;65502:10;;:15;;65495:22;;65435:90;:::o;65533:265::-;65582:10;;65572:7;:20;;;;65613:10;;65603:7;:20;;;;65644:10;;65634:7;:20;;;;65680:15;;65665:12;:30;;;;65717:11;;65706:8;:22;;;;65748:9;;65739:6;:18;;;;65779:11;;65768:8;:22;;;;65533:265::o;65806:273::-;65856:11;;65846:7;:21;;;;65888:11;;65878:7;:21;;;;65920:11;;65910:7;:21;;;;65957:16;;65942:12;:31;;;;65995:12;;65984:8;:23;;;;66027:10;;66018:6;:19;;;;66059:12;;66048:8;:23;;;;65806:273::o;61559:174::-;61608:4;61633:6;;;;;;;;;;;61632:7;:22;;;;;61643:11;;;;;;;;;;;61632:22;:36;;;;;61658:10;:8;:10::i;:::-;61632:36;:68;;;;;61699:1;61672:24;61690:4;61672:9;:24::i;:::-;:28;61632:68;:93;;;;;61705:20;61712:12;:10;:12::i;:::-;61705:6;:20::i;:::-;61704:21;61632:93;61625:100;;61559:174;:::o;66087:241::-;66154:7;66174:17;66216:14;;66204:8;;66195:6;:17;;;;:::i;:::-;66194:36;;;;:::i;:::-;66174:56;;66241:43;66251:6;66267:4;66274:9;66241;:43::i;:::-;66311:9;66302:6;:18;;;;:::i;:::-;66295:25;;;66087:241;;;;:::o;33426:716::-;33850:23;33876:69;33904:4;33876:69;;;;;;;;;;;;;;;;;33884:5;33876:27;;;;:69;;;;;:::i;:::-;33850:95;;33980:1;33960:10;:17;:21;33956:179;;;34057:10;34046:30;;;;;;;;;;;;:::i;:::-;34038:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;33956:179;33496:646;33426:716;;:::o;39150:414::-;39213:4;39235:21;39245:3;39250:5;39235:9;:21::i;:::-;39230:327;;39273:3;:11;;39290:5;39273:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39456:3;:11;;:18;;;;39434:3;:12;;:19;39447:5;39434:19;;;;;;;;;;;:40;;;;39496:4;39489:11;;;;39230:327;39540:5;39533:12;;39150:414;;;;;:::o;64043:936::-;64083:24;64124:1;64110:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64083:43;;64158:4;64137:7;64145:1;64137:10;;;;;;;;:::i;:::-;;;;;;;:26;;;;;;;;;;;64195:4;64174:7;64182:1;64174:10;;;;;;;;:::i;:::-;;;;;;;:26;;;;;;;;;;;64213:19;64235:24;64253:4;64235:9;:24::i;:::-;64213:46;;64270:12;64299:1;64285:11;:15;;;;:::i;:::-;64270:30;;64321:4;64314;:11;64311:23;;;64327:7;;;;;64311:23;64346;64372:21;64346:47;;64404:12;64439:10;:61;;;64501:4;64506:1;64509:7;64525:4;64539:1;64542:15;64439:119;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64435:367;;64625:10;:61;;;64687:4;64692:1;64695:7;64711:4;64717:15;64625:108;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64621:170;;;64762:4;64752:14;;64621:170;64435:367;;;64583:4;64573:14;;64435:367;64817:7;64812:47;;64841:7;;;;;;;64812:47;64871:17;64915:15;64891:21;:39;;;;:::i;:::-;64871:59;;64941:30;64955:4;64961:9;64941:13;:30::i;:::-;64072:907;;;;;;64043:936;:::o;39740:1420::-;39806:4;39924:18;39945:3;:12;;:19;39958:5;39945:19;;;;;;;;;;;;39924:40;;39995:1;39981:10;:15;39977:1176;;40356:21;40393:1;40380:10;:14;;;;:::i;:::-;40356:38;;40409:17;40450:1;40429:3;:11;;:18;;;;:22;;;;:::i;:::-;40409:42;;40485:13;40472:9;:26;40468:405;;40519:17;40539:3;:11;;40551:9;40539:22;;;;;;;;:::i;:::-;;;;;;;;;;40519:42;;40693:9;40664:3;:11;;40676:13;40664:26;;;;;;;;:::i;:::-;;;;;;;;;:38;;;;40804:10;40778:3;:12;;:23;40791:9;40778:23;;;;;;;;;;;:36;;;;40500:373;40468:405;40954:3;:11;;:17;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;41049:3;:12;;:19;41062:5;41049:19;;;;;;;;;;;41042:26;;;41092:4;41085:11;;;;;;;39977:1176;41136:5;41129:12;;;39740:1420;;;;;:::o;41924:120::-;41991:7;42018:3;:11;;42030:5;42018:18;;;;;;;;:::i;:::-;;;;;;;;;;42011:25;;41924:120;;;;:::o;41246:129::-;41319:4;41366:1;41343:3;:12;;:19;41356:5;41343:19;;;;;;;;;;;;:24;;41336:31;;41246:129;;;;:::o;17000:125::-;;;;:::o;17729:124::-;;;;:::o;24211:229::-;24348:12;24380:52;24402:6;24410:4;24416:1;24419:12;24380:21;:52::i;:::-;24373:59;;24211:229;;;;;:::o;64987:364::-;65070:57;65087:4;65102:10;65115:11;65070:8;:57::i;:::-;65142:10;:26;;;65176:9;65195:4;65202:11;65215:1;65218;65229;65233:15;65142:107;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;65138:206;;;;;;65270:53;65283:11;65296:9;65307:15;65270:53;;;;;;;;:::i;:::-;;;;;;;;65138:206;64987:364;;:::o;25331:455::-;25501:12;25559:5;25534:21;:30;;25526:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;25619:12;25633:23;25660:6;:11;;25679:5;25686:4;25660:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25618:73;;;;25709:69;25736:6;25744:7;25753:10;25765:12;25709:26;:69::i;:::-;25702:76;;;;25331:455;;;;;;:::o;27904:644::-;28089:12;28118:7;28114:427;;;28167:1;28146:10;:17;:22;28142:290;;28364:18;28375:6;28364:10;:18::i;:::-;28356:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;28142:290;28453:10;28446:17;;;;28114:427;28496:33;28504:10;28516:12;28496:7;:33::i;:::-;27904:644;;;;;;;:::o;21454:326::-;21514:4;21771:1;21749:7;:19;;;:23;21742:30;;21454:326;;;:::o;29090:552::-;29271:1;29251:10;:17;:21;29247:388;;;29483:10;29477:17;29540:15;29527:10;29523:2;29519:19;29512:44;29247:388;29610:12;29603: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:619::-;3875:6;3883;3891;3940:2;3928:9;3919:7;3915:23;3911:32;3908:119;;;3946:79;;:::i;:::-;3908:119;4066:1;4091:53;4136:7;4127:6;4116:9;4112:22;4091:53;:::i;:::-;4081:63;;4037:117;4193:2;4219:53;4264:7;4255:6;4244:9;4240:22;4219:53;:::i;:::-;4209:63;;4164:118;4321:2;4347:53;4392:7;4383:6;4372:9;4368:22;4347:53;:::i;:::-;4337:63;;4292:118;3798:619;;;;;:::o;4423:86::-;4458:7;4498:4;4491:5;4487:16;4476:27;;4423:86;;;:::o;4515:112::-;4598:22;4614:5;4598:22;:::i;:::-;4593:3;4586:35;4515:112;;:::o;4633:214::-;4722:4;4760:2;4749:9;4745:18;4737:26;;4773:67;4837:1;4826:9;4822:17;4813:6;4773:67;:::i;:::-;4633:214;;;;:::o;4853:765::-;4939:6;4947;4955;4963;5012:3;5000:9;4991:7;4987:23;4983:33;4980:120;;;5019:79;;:::i;:::-;4980:120;5139:1;5164:53;5209:7;5200:6;5189:9;5185:22;5164:53;:::i;:::-;5154:63;;5110:117;5266:2;5292:53;5337:7;5328:6;5317:9;5313:22;5292:53;:::i;:::-;5282:63;;5237:118;5394:2;5420:53;5465:7;5456:6;5445:9;5441:22;5420:53;:::i;:::-;5410:63;;5365:118;5522:2;5548:53;5593:7;5584:6;5573:9;5569:22;5548:53;:::i;:::-;5538:63;;5493:118;4853:765;;;;;;;:::o;5624:329::-;5683:6;5732:2;5720:9;5711:7;5707:23;5703:32;5700:119;;;5738:79;;:::i;:::-;5700:119;5858:1;5883:53;5928:7;5919:6;5908:9;5904:22;5883:53;:::i;:::-;5873:63;;5829:117;5624:329;;;;:::o;5959:116::-;6029:21;6044:5;6029:21;:::i;:::-;6022:5;6019:32;6009:60;;6065:1;6062;6055:12;6009:60;5959:116;:::o;6081:133::-;6124:5;6162:6;6149:20;6140:29;;6178:30;6202:5;6178:30;:::i;:::-;6081:133;;;;:::o;6220:468::-;6285:6;6293;6342:2;6330:9;6321:7;6317:23;6313:32;6310:119;;;6348:79;;:::i;:::-;6310:119;6468:1;6493:53;6538:7;6529:6;6518:9;6514:22;6493:53;:::i;:::-;6483:63;;6439:117;6595:2;6621:50;6663:7;6654:6;6643:9;6639:22;6621:50;:::i;:::-;6611:60;;6566:115;6220:468;;;;;:::o;6694:60::-;6722:3;6743:5;6736:12;;6694:60;;;:::o;6760:142::-;6810:9;6843:53;6861:34;6870:24;6888:5;6870:24;:::i;:::-;6861:34;:::i;:::-;6843:53;:::i;:::-;6830:66;;6760:142;;;:::o;6908:126::-;6958:9;6991:37;7022:5;6991:37;:::i;:::-;6978:50;;6908:126;;;:::o;7040:139::-;7103:9;7136:37;7167:5;7136:37;:::i;:::-;7123:50;;7040:139;;;:::o;7185:157::-;7285:50;7329:5;7285:50;:::i;:::-;7280:3;7273:63;7185:157;;:::o;7348:248::-;7454:4;7492:2;7481:9;7477:18;7469:26;;7505:84;7586:1;7575:9;7571:17;7562:6;7505:84;:::i;:::-;7348:248;;;;:::o;7602:118::-;7689:24;7707:5;7689:24;:::i;:::-;7684:3;7677:37;7602:118;;:::o;7726:222::-;7819:4;7857:2;7846:9;7842:18;7834:26;;7870:71;7938:1;7927:9;7923:17;7914:6;7870:71;:::i;:::-;7726:222;;;;:::o;7954:323::-;8010:6;8059:2;8047:9;8038:7;8034:23;8030:32;8027:119;;;8065:79;;:::i;:::-;8027:119;8185:1;8210:50;8252:7;8243:6;8232:9;8228:22;8210:50;:::i;:::-;8200:60;;8156:114;7954:323;;;;:::o;8283:1057::-;8387:6;8395;8403;8411;8419;8427;8476:3;8464:9;8455:7;8451:23;8447:33;8444:120;;;8483:79;;:::i;:::-;8444:120;8603:1;8628:53;8673:7;8664:6;8653:9;8649:22;8628:53;:::i;:::-;8618:63;;8574:117;8730:2;8756:53;8801:7;8792:6;8781:9;8777:22;8756:53;:::i;:::-;8746:63;;8701:118;8858:2;8884:53;8929:7;8920:6;8909:9;8905:22;8884:53;:::i;:::-;8874:63;;8829:118;8986:2;9012:53;9057:7;9048:6;9037:9;9033:22;9012:53;:::i;:::-;9002:63;;8957:118;9114:3;9141:53;9186:7;9177:6;9166:9;9162:22;9141:53;:::i;:::-;9131:63;;9085:119;9243:3;9270:53;9315:7;9306:6;9295:9;9291:22;9270:53;:::i;:::-;9260:63;;9214:119;8283:1057;;;;;;;;:::o;9346:329::-;9405:6;9454:2;9442:9;9433:7;9429:23;9425:32;9422:119;;;9460:79;;:::i;:::-;9422:119;9580:1;9605:53;9650:7;9641:6;9630:9;9626:22;9605:53;:::i;:::-;9595:63;;9551:117;9346:329;;;;:::o;9681:474::-;9749:6;9757;9806:2;9794:9;9785:7;9781:23;9777:32;9774:119;;;9812:79;;:::i;:::-;9774:119;9932:1;9957:53;10002:7;9993:6;9982:9;9978:22;9957:53;:::i;:::-;9947:63;;9903:117;10059:2;10085:53;10130:7;10121:6;10110:9;10106:22;10085:53;:::i;:::-;10075:63;;10030:118;9681:474;;;;;:::o;10161:166::-;10301:18;10297:1;10289:6;10285:14;10278:42;10161:166;:::o;10333:366::-;10475:3;10496:67;10560:2;10555:3;10496:67;:::i;:::-;10489:74;;10572:93;10661:3;10572:93;:::i;:::-;10690:2;10685:3;10681:12;10674:19;;10333:366;;;:::o;10705:419::-;10871:4;10909:2;10898:9;10894:18;10886:26;;10958:9;10952:4;10948:20;10944:1;10933:9;10929:17;10922:47;10986:131;11112:4;10986:131;:::i;:::-;10978:139;;10705:419;;;:::o;11130:180::-;11178:77;11175:1;11168:88;11275:4;11272:1;11265:15;11299:4;11296:1;11289:15;11316:320;11360:6;11397:1;11391:4;11387:12;11377:22;;11444:1;11438:4;11434:12;11465:18;11455:81;;11521:4;11513:6;11509:17;11499:27;;11455:81;11583:2;11575:6;11572:14;11552:18;11549:38;11546:84;;11602:18;;:::i;:::-;11546:84;11367:269;11316:320;;;:::o;11642:180::-;11690:77;11687:1;11680:88;11787:4;11784:1;11777:15;11811:4;11808:1;11801:15;11828:194;11868:4;11888:20;11906:1;11888:20;:::i;:::-;11883:25;;11922:20;11940:1;11922:20;:::i;:::-;11917:25;;11966:1;11963;11959:9;11951:17;;11990:1;11984:4;11981:11;11978:37;;;11995:18;;:::i;:::-;11978:37;11828:194;;;;:::o;12028:143::-;12085:5;12116:6;12110:13;12101:22;;12132:33;12159:5;12132:33;:::i;:::-;12028:143;;;;:::o;12177:351::-;12247:6;12296:2;12284:9;12275:7;12271:23;12267:32;12264:119;;;12302:79;;:::i;:::-;12264:119;12422:1;12447:64;12503:7;12494:6;12483:9;12479:22;12447:64;:::i;:::-;12437:74;;12393:128;12177:351;;;;:::o;12534:332::-;12655:4;12693:2;12682:9;12678:18;12670:26;;12706:71;12774:1;12763:9;12759:17;12750:6;12706:71;:::i;:::-;12787:72;12855:2;12844:9;12840:18;12831:6;12787:72;:::i;:::-;12534:332;;;;;:::o;12872:137::-;12926:5;12957:6;12951:13;12942:22;;12973:30;12997:5;12973:30;:::i;:::-;12872:137;;;;:::o;13015:345::-;13082:6;13131:2;13119:9;13110:7;13106:23;13102:32;13099:119;;;13137:79;;:::i;:::-;13099:119;13257:1;13282:61;13335:7;13326:6;13315:9;13311:22;13282:61;:::i;:::-;13272:71;;13228:125;13015:345;;;;:::o;13366:191::-;13406:3;13425:20;13443:1;13425:20;:::i;:::-;13420:25;;13459:20;13477:1;13459:20;:::i;:::-;13454:25;;13502:1;13499;13495:9;13488:16;;13523:3;13520:1;13517:10;13514:36;;;13530:18;;:::i;:::-;13514:36;13366:191;;;;:::o;13563:169::-;13703:21;13699:1;13691:6;13687:14;13680:45;13563:169;:::o;13738:366::-;13880:3;13901:67;13965:2;13960:3;13901:67;:::i;:::-;13894:74;;13977:93;14066:3;13977:93;:::i;:::-;14095:2;14090:3;14086:12;14079:19;;13738:366;;;:::o;14110:419::-;14276:4;14314:2;14303:9;14299:18;14291:26;;14363:9;14357:4;14353:20;14349:1;14338:9;14334:17;14327:47;14391:131;14517:4;14391:131;:::i;:::-;14383:139;;14110:419;;;:::o;14535:332::-;14656:4;14694:2;14683:9;14679:18;14671:26;;14707:71;14775:1;14764:9;14760:17;14751:6;14707:71;:::i;:::-;14788:72;14856:2;14845:9;14841:18;14832:6;14788:72;:::i;:::-;14535:332;;;;;:::o;14873:143::-;14930:5;14961:6;14955:13;14946:22;;14977:33;15004:5;14977:33;:::i;:::-;14873:143;;;;:::o;15022:351::-;15092:6;15141:2;15129:9;15120:7;15116:23;15112:32;15109:119;;;15147:79;;:::i;:::-;15109:119;15267:1;15292:64;15348:7;15339:6;15328:9;15324:22;15292:64;:::i;:::-;15282:74;;15238:128;15022:351;;;;:::o;15379:224::-;15519:34;15515:1;15507:6;15503:14;15496:58;15588:7;15583:2;15575:6;15571:15;15564:32;15379:224;:::o;15609:366::-;15751:3;15772:67;15836:2;15831:3;15772:67;:::i;:::-;15765:74;;15848:93;15937:3;15848:93;:::i;:::-;15966:2;15961:3;15957:12;15950:19;;15609:366;;;:::o;15981:419::-;16147:4;16185:2;16174:9;16170:18;16162:26;;16234:9;16228:4;16224:20;16220:1;16209:9;16205:17;16198:47;16262:131;16388:4;16262:131;:::i;:::-;16254:139;;15981:419;;;:::o;16406:174::-;16546:26;16542:1;16534:6;16530:14;16523:50;16406:174;:::o;16586:366::-;16728:3;16749:67;16813:2;16808:3;16749:67;:::i;:::-;16742:74;;16825:93;16914:3;16825:93;:::i;:::-;16943:2;16938:3;16934:12;16927:19;;16586:366;;;:::o;16958:419::-;17124:4;17162:2;17151:9;17147:18;17139:26;;17211:9;17205:4;17201:20;17197:1;17186:9;17182:17;17175:47;17239:131;17365:4;17239:131;:::i;:::-;17231:139;;16958:419;;;:::o;17383:169::-;17523:21;17519:1;17511:6;17507:14;17500:45;17383:169;:::o;17558:366::-;17700:3;17721:67;17785:2;17780:3;17721:67;:::i;:::-;17714:74;;17797:93;17886:3;17797:93;:::i;:::-;17915:2;17910:3;17906:12;17899:19;;17558:366;;;:::o;17930:419::-;18096:4;18134:2;18123:9;18119:18;18111:26;;18183:9;18177:4;18173:20;18169:1;18158:9;18154:17;18147:47;18211:131;18337:4;18211:131;:::i;:::-;18203:139;;17930:419;;;:::o;18355:180::-;18403:77;18400:1;18393:88;18500:4;18497:1;18490:15;18524:4;18521:1;18514:15;18541:98;18592:6;18626:5;18620:12;18610:22;;18541:98;;;:::o;18645:147::-;18746:11;18783:3;18768:18;;18645:147;;;;:::o;18798:386::-;18902:3;18930:38;18962:5;18930:38;:::i;:::-;18984:88;19065:6;19060:3;18984:88;:::i;:::-;18977:95;;19081:65;19139:6;19134:3;19127:4;19120:5;19116:16;19081:65;:::i;:::-;19171:6;19166:3;19162:16;19155:23;;18906:278;18798:386;;;;:::o;19190:271::-;19320:3;19342:93;19431:3;19422:6;19342:93;:::i;:::-;19335:100;;19452:3;19445:10;;19190:271;;;;:::o;19467:173::-;19607:25;19603:1;19595:6;19591:14;19584:49;19467:173;:::o;19646:366::-;19788:3;19809:67;19873:2;19868:3;19809:67;:::i;:::-;19802:74;;19885:93;19974:3;19885:93;:::i;:::-;20003:2;19998:3;19994:12;19987:19;;19646:366;;;:::o;20018:419::-;20184:4;20222:2;20211:9;20207:18;20199:26;;20271:9;20265:4;20261:20;20257:1;20246:9;20242:17;20235:47;20299:131;20425:4;20299:131;:::i;:::-;20291:139;;20018:419;;;:::o;20443:225::-;20583:34;20579:1;20571:6;20567:14;20560:58;20652:8;20647:2;20639:6;20635:15;20628:33;20443:225;:::o;20674:366::-;20816:3;20837:67;20901:2;20896:3;20837:67;:::i;:::-;20830:74;;20913:93;21002:3;20913:93;:::i;:::-;21031:2;21026:3;21022:12;21015:19;;20674:366;;;:::o;21046:419::-;21212:4;21250:2;21239:9;21235:18;21227:26;;21299:9;21293:4;21289:20;21285:1;21274:9;21270:17;21263:47;21327:131;21453:4;21327:131;:::i;:::-;21319:139;;21046:419;;;:::o;21471:182::-;21611:34;21607:1;21599:6;21595:14;21588:58;21471:182;:::o;21659:366::-;21801:3;21822:67;21886:2;21881:3;21822:67;:::i;:::-;21815:74;;21898:93;21987:3;21898:93;:::i;:::-;22016:2;22011:3;22007:12;22000:19;;21659:366;;;:::o;22031:419::-;22197:4;22235:2;22224:9;22220:18;22212:26;;22284:9;22278:4;22274:20;22270:1;22259:9;22255:17;22248:47;22312:131;22438:4;22312:131;:::i;:::-;22304:139;;22031:419;;;:::o;22456:223::-;22596:34;22592:1;22584:6;22580:14;22573:58;22665:6;22660:2;22652:6;22648:15;22641:31;22456:223;:::o;22685:366::-;22827:3;22848:67;22912:2;22907:3;22848:67;:::i;:::-;22841:74;;22924:93;23013:3;22924:93;:::i;:::-;23042:2;23037:3;23033:12;23026:19;;22685:366;;;:::o;23057:419::-;23223:4;23261:2;23250:9;23246:18;23238:26;;23310:9;23304:4;23300:20;23296:1;23285:9;23281:17;23274:47;23338:131;23464:4;23338:131;:::i;:::-;23330:139;;23057:419;;;:::o;23482:221::-;23622:34;23618:1;23610:6;23606:14;23599:58;23691:4;23686:2;23678:6;23674:15;23667:29;23482:221;:::o;23709:366::-;23851:3;23872:67;23936:2;23931:3;23872:67;:::i;:::-;23865:74;;23948:93;24037:3;23948:93;:::i;:::-;24066:2;24061:3;24057:12;24050:19;;23709:366;;;:::o;24081:419::-;24247:4;24285:2;24274:9;24270:18;24262:26;;24334:9;24328:4;24324:20;24320:1;24309:9;24305:17;24298:47;24362:131;24488:4;24362:131;:::i;:::-;24354:139;;24081:419;;;:::o;24506:179::-;24646:31;24642:1;24634:6;24630:14;24623:55;24506:179;:::o;24691:366::-;24833:3;24854:67;24918:2;24913:3;24854:67;:::i;:::-;24847:74;;24930:93;25019:3;24930:93;:::i;:::-;25048:2;25043:3;25039:12;25032:19;;24691:366;;;:::o;25063:419::-;25229:4;25267:2;25256:9;25252:18;25244:26;;25316:9;25310:4;25306:20;25302:1;25291:9;25287:17;25280:47;25344:131;25470:4;25344:131;:::i;:::-;25336:139;;25063:419;;;:::o;25488:170::-;25628:22;25624:1;25616:6;25612:14;25605:46;25488:170;:::o;25664:366::-;25806:3;25827:67;25891:2;25886:3;25827:67;:::i;:::-;25820:74;;25903:93;25992:3;25903:93;:::i;:::-;26021:2;26016:3;26012:12;26005:19;;25664:366;;;:::o;26036:419::-;26202:4;26240:2;26229:9;26225:18;26217:26;;26289:9;26283:4;26279:20;26275:1;26264:9;26260:17;26253:47;26317:131;26443:4;26317:131;:::i;:::-;26309:139;;26036:419;;;:::o;26461:775::-;26694:4;26732:3;26721:9;26717:19;26709:27;;26746:71;26814:1;26803:9;26799:17;26790:6;26746:71;:::i;:::-;26827:72;26895:2;26884:9;26880:18;26871:6;26827:72;:::i;:::-;26909;26977:2;26966:9;26962:18;26953:6;26909:72;:::i;:::-;26991;27059:2;27048:9;27044:18;27035:6;26991:72;:::i;:::-;27073:73;27141:3;27130:9;27126:19;27117:6;27073:73;:::i;:::-;27156;27224:3;27213:9;27209:19;27200:6;27156:73;:::i;:::-;26461:775;;;;;;;;;:::o;27242:410::-;27282:7;27305:20;27323:1;27305:20;:::i;:::-;27300:25;;27339:20;27357:1;27339:20;:::i;:::-;27334:25;;27394:1;27391;27387:9;27416:30;27434:11;27416:30;:::i;:::-;27405:41;;27595:1;27586:7;27582:15;27579:1;27576:22;27556:1;27549:9;27529:83;27506:139;;27625:18;;:::i;:::-;27506:139;27290:362;27242:410;;;;:::o;27658:180::-;27706:77;27703:1;27696:88;27803:4;27800:1;27793:15;27827:4;27824:1;27817:15;27844:185;27884:1;27901:20;27919:1;27901:20;:::i;:::-;27896:25;;27935:20;27953:1;27935:20;:::i;:::-;27930:25;;27974:1;27964:35;;27979:18;;:::i;:::-;27964:35;28021:1;28018;28014:9;28009:14;;27844:185;;;;:::o;28035:180::-;28083:77;28080:1;28073:88;28180:4;28177:1;28170:15;28204:4;28201:1;28194:15;28221:85;28266:7;28295:5;28284:16;;28221:85;;;:::o;28312:158::-;28370:9;28403:61;28421:42;28430:32;28456:5;28430:32;:::i;:::-;28421:42;:::i;:::-;28403:61;:::i;:::-;28390:74;;28312:158;;;:::o;28476:147::-;28571:45;28610:5;28571:45;:::i;:::-;28566:3;28559:58;28476:147;;:::o;28629:114::-;28696:6;28730:5;28724:12;28714:22;;28629:114;;;:::o;28749:184::-;28848:11;28882:6;28877:3;28870:19;28922:4;28917:3;28913:14;28898:29;;28749:184;;;;:::o;28939:132::-;29006:4;29029:3;29021:11;;29059:4;29054:3;29050:14;29042:22;;28939:132;;;:::o;29077:108::-;29154:24;29172:5;29154:24;:::i;:::-;29149:3;29142:37;29077:108;;:::o;29191:179::-;29260:10;29281:46;29323:3;29315:6;29281:46;:::i;:::-;29359:4;29354:3;29350:14;29336:28;;29191:179;;;;:::o;29376:113::-;29446:4;29478;29473:3;29469:14;29461:22;;29376:113;;;:::o;29525:732::-;29644:3;29673:54;29721:5;29673:54;:::i;:::-;29743:86;29822:6;29817:3;29743:86;:::i;:::-;29736:93;;29853:56;29903:5;29853:56;:::i;:::-;29932:7;29963:1;29948:284;29973:6;29970:1;29967:13;29948:284;;;30049:6;30043:13;30076:63;30135:3;30120:13;30076:63;:::i;:::-;30069:70;;30162:60;30215:6;30162:60;:::i;:::-;30152:70;;30008:224;29995:1;29992;29988:9;29983:14;;29948:284;;;29952:14;30248:3;30241:10;;29649:608;;;29525:732;;;;:::o;30263:942::-;30554:4;30592:3;30581:9;30577:19;30569:27;;30606:71;30674:1;30663:9;30659:17;30650:6;30606:71;:::i;:::-;30687:80;30763:2;30752:9;30748:18;30739:6;30687:80;:::i;:::-;30814:9;30808:4;30804:20;30799:2;30788:9;30784:18;30777:48;30842:108;30945:4;30936:6;30842:108;:::i;:::-;30834:116;;30960:72;31028:2;31017:9;31013:18;31004:6;30960:72;:::i;:::-;31042:73;31110:3;31099:9;31095:19;31086:6;31042:73;:::i;:::-;31125;31193:3;31182:9;31178:19;31169:6;31125:73;:::i;:::-;30263:942;;;;;;;;;:::o;31211:831::-;31474:4;31512:3;31501:9;31497:19;31489:27;;31526:71;31594:1;31583:9;31579:17;31570:6;31526:71;:::i;:::-;31607:80;31683:2;31672:9;31668:18;31659:6;31607:80;:::i;:::-;31734:9;31728:4;31724:20;31719:2;31708:9;31704:18;31697:48;31762:108;31865:4;31856:6;31762:108;:::i;:::-;31754:116;;31880:72;31948:2;31937:9;31933:18;31924:6;31880:72;:::i;:::-;31962:73;32030:3;32019:9;32015:19;32006:6;31962:73;:::i;:::-;31211:831;;;;;;;;:::o;32048:886::-;32309:4;32347:3;32336:9;32332:19;32324:27;;32361:71;32429:1;32418:9;32414:17;32405:6;32361:71;:::i;:::-;32442:72;32510:2;32499:9;32495:18;32486:6;32442:72;:::i;:::-;32524;32592:2;32581:9;32577:18;32568:6;32524:72;:::i;:::-;32606;32674:2;32663:9;32659:18;32650:6;32606:72;:::i;:::-;32688:73;32756:3;32745:9;32741:19;32732:6;32688:73;:::i;:::-;32771;32839:3;32828:9;32824:19;32815:6;32771:73;:::i;:::-;32854;32922:3;32911:9;32907:19;32898:6;32854:73;:::i;:::-;32048:886;;;;;;;;;;:::o;32940:224::-;33080:34;33076:1;33068:6;33064:14;33057:58;33149:7;33144:2;33136:6;33132:15;33125:32;32940:224;:::o;33170:366::-;33312:3;33333:67;33397:2;33392:3;33333:67;:::i;:::-;33326:74;;33409:93;33498:3;33409:93;:::i;:::-;33527:2;33522:3;33518:12;33511:19;;33170:366;;;:::o;33542:419::-;33708:4;33746:2;33735:9;33731:18;33723:26;;33795:9;33789:4;33785:20;33781:1;33770:9;33766:17;33759:47;33823:131;33949:4;33823:131;:::i;:::-;33815:139;;33542:419;;;:::o;33967:222::-;34107:34;34103:1;34095:6;34091:14;34084:58;34176:5;34171:2;34163:6;34159:15;34152:30;33967:222;:::o;34195:366::-;34337:3;34358:67;34422:2;34417:3;34358:67;:::i;:::-;34351:74;;34434:93;34523:3;34434:93;:::i;:::-;34552:2;34547:3;34543:12;34536:19;;34195:366;;;:::o;34567:419::-;34733:4;34771:2;34760:9;34756:18;34748:26;;34820:9;34814:4;34810:20;34806:1;34795:9;34791:17;34784:47;34848:131;34974:4;34848:131;:::i;:::-;34840:139;;34567:419;;;:::o;34992:225::-;35132:34;35128:1;35120:6;35116:14;35109:58;35201:8;35196:2;35188:6;35184:15;35177:33;34992:225;:::o;35223:366::-;35365:3;35386:67;35450:2;35445:3;35386:67;:::i;:::-;35379:74;;35462:93;35551:3;35462:93;:::i;:::-;35580:2;35575:3;35571:12;35564:19;;35223:366;;;:::o;35595:419::-;35761:4;35799:2;35788:9;35784:18;35776:26;;35848:9;35842:4;35838:20;35834:1;35823:9;35819:17;35812:47;35876:131;36002:4;35876:131;:::i;:::-;35868:139;;35595:419;;;:::o;36020:229::-;36160:34;36156:1;36148:6;36144:14;36137:58;36229:12;36224:2;36216:6;36212:15;36205:37;36020:229;:::o;36255:366::-;36397:3;36418:67;36482:2;36477:3;36418:67;:::i;:::-;36411:74;;36494:93;36583:3;36494:93;:::i;:::-;36612:2;36607:3;36603:12;36596:19;;36255:366;;;:::o;36627:419::-;36793:4;36831:2;36820:9;36816:18;36808:26;;36880:9;36874:4;36870:20;36866:1;36855:9;36851:17;36844:47;36908:131;37034:4;36908:131;:::i;:::-;36900:139;;36627:419;;;:::o;37052:180::-;37100:77;37097:1;37090:88;37197:4;37194:1;37187:15;37221:4;37218:1;37211:15;37238:807;37487:4;37525:3;37514:9;37510:19;37502:27;;37539:71;37607:1;37596:9;37592:17;37583:6;37539:71;:::i;:::-;37620:72;37688:2;37677:9;37673:18;37664:6;37620:72;:::i;:::-;37702:80;37778:2;37767:9;37763:18;37754:6;37702:80;:::i;:::-;37792;37868:2;37857:9;37853:18;37844:6;37792:80;:::i;:::-;37882:73;37950:3;37939:9;37935:19;37926:6;37882:73;:::i;:::-;37965;38033:3;38022:9;38018:19;38009:6;37965:73;:::i;:::-;37238:807;;;;;;;;;:::o;38051:663::-;38139:6;38147;38155;38204:2;38192:9;38183:7;38179:23;38175:32;38172:119;;;38210:79;;:::i;:::-;38172:119;38330:1;38355:64;38411:7;38402:6;38391:9;38387:22;38355:64;:::i;:::-;38345:74;;38301:128;38468:2;38494:64;38550:7;38541:6;38530:9;38526:22;38494:64;:::i;:::-;38484:74;;38439:129;38607:2;38633:64;38689:7;38680:6;38669:9;38665:22;38633:64;:::i;:::-;38623:74;;38578:129;38051:663;;;;;:::o;38720:442::-;38869:4;38907:2;38896:9;38892:18;38884:26;;38920:71;38988:1;38977:9;38973:17;38964:6;38920:71;:::i;:::-;39001:72;39069:2;39058:9;39054:18;39045:6;39001:72;:::i;:::-;39083;39151:2;39140:9;39136:18;39127:6;39083:72;:::i;:::-;38720:442;;;;;;:::o;39168:225::-;39308:34;39304:1;39296:6;39292:14;39285:58;39377:8;39372:2;39364:6;39360:15;39353:33;39168:225;:::o;39399:366::-;39541:3;39562:67;39626:2;39621:3;39562:67;:::i;:::-;39555:74;;39638:93;39727:3;39638:93;:::i;:::-;39756:2;39751:3;39747:12;39740:19;;39399:366;;;:::o;39771:419::-;39937:4;39975:2;39964:9;39960:18;39952:26;;40024:9;40018:4;40014:20;40010:1;39999:9;39995:17;39988:47;40052:131;40178:4;40052:131;:::i;:::-;40044:139;;39771:419;;;:::o;40196:179::-;40336:31;40332:1;40324:6;40320:14;40313:55;40196:179;:::o;40381:366::-;40523:3;40544:67;40608:2;40603:3;40544:67;:::i;:::-;40537:74;;40620:93;40709:3;40620:93;:::i;:::-;40738:2;40733:3;40729:12;40722:19;;40381:366;;;:::o;40753:419::-;40919:4;40957:2;40946:9;40942:18;40934:26;;41006:9;41000:4;40996:20;40992:1;40981:9;40977:17;40970:47;41034:131;41160:4;41034:131;:::i;:::-;41026:139;;40753:419;;;:::o

Swarm Source

ipfs://0970b96d802582452813cff1cc20b3600baf06d9634841c340d8c83e41f1099d
[ 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.