ETH Price: $2,358.41 (-3.92%)

Token

MoonApes (MoonApes)
 

Overview

Max Total Supply

9,930,507.599596009 MoonApes

Holders

23

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 9 Decimals)

Balance
5,245.060309305 MoonApes

Value
$0.00
0xD0Fd45c3E06A2560cCF01d1cCA3d8eFE8d7B1938
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
MoonApes

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, Unlicense license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-10-04
*/

//SPDX-License-Identifier: Unlicensed
pragma solidity >=0.7.0 <0.9.0;
abstract contract Context {
    function _msgSender() internal view returns (address payable) {
        return payable(msg.sender);
    }

    function _msgData() internal view returns (bytes memory) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

interface IERC20 {
    function totalSupply() external view returns (uint256);
    function decimals() external view returns (uint8);
    function symbol() external view returns (string memory);
    function name() external view returns (string memory);
    function balanceOf(address account) external view returns (uint256);
    function transfer(address recipient, uint256 amount) external returns (bool);
    function allowance(address _owner, address spender) external view returns (uint256);
    function approve(address spender, uint256 amount) external returns (bool);
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

/**
 * @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 {
    mapping(address => uint256) public _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 {}
}

interface IUniswapV2Factory {
    event PairCreated(address indexed token0, address indexed token1, address pair, uint);

    function feeTo() external view returns (address);
    function feeToSetter() external view returns (address);

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

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

    function setFeeTo(address) external;
    function setFeeToSetter(address) external;
}

interface IUniswapV2Pair {
    event Approval(address indexed owner, address indexed spender, uint value);
    event Transfer(address indexed from, address indexed to, uint value);

    function name() external pure returns (string memory);
    function symbol() external pure returns (string memory);
    function decimals() external pure returns (uint8);
    function totalSupply() external view returns (uint);
    function balanceOf(address owner) external view returns (uint);
    function allowance(address owner, address spender) external view returns (uint);

    function approve(address spender, uint value) external returns (bool);
    function transfer(address to, uint value) external returns (bool);
    function transferFrom(address from, address to, uint value) external returns (bool);

    function DOMAIN_SEPARATOR() external view returns (bytes32);
    function PERMIT_TYPEHASH() external pure returns (bytes32);
    function nonces(address owner) external view returns (uint);

    function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;

    event Burn(address indexed sender, uint amount0, uint amount1, address indexed to);
    event Swap(
        address indexed sender,
        uint amount0In,
        uint amount1In,
        uint amount0Out,
        uint amount1Out,
        address indexed to
    );
    event Sync(uint112 reserve0, uint112 reserve1);

    function MINIMUM_LIQUIDITY() external pure returns (uint);
    function factory() external view returns (address);
    function token0() external view returns (address);
    function token1() external view returns (address);
    function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
    function price0CumulativeLast() external view returns (uint);
    function price1CumulativeLast() external view returns (uint);
    function kLast() external view returns (uint);

    function burn(address to) external returns (uint amount0, uint amount1);
    function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
    function skim(address to) external;
    function sync() external;

    function initialize(address, address) external;
}

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 swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);
    function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);

    function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
    function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
    function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
    function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}

interface IUniswapV2Router02 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,
        uint deadline
    ) external;
    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable;
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
}

contract MoonApes is ERC20 {
    using Address for address;
    using Address for address payable;

    mapping(address => bool) public banned;
    mapping(address => uint256) cooldown;
    mapping(address => bool) isCooldownExempt;
    mapping(address => bool) isFeeExempt;
    mapping(address => bool) isMaxWalletExempt;
    mapping(address => bool) lpHolder;
    mapping(address => bool) lpPair;

    address public owner;
    address public devFeeReceiver;
    address public treasuryFeeReceiver;
    address public liquidityFeeReceiver;
    address public pair;

    uint256 _totalSupply = 10_000_000 * (10**9); // total supply amount
    uint256 totalFee;
    uint256 feeAmount;
    uint256 burnAmount;
    uint256 burnedTokens;
    uint feeDenominator = 100;

    struct IFees {
        uint16 liquidityFee;
        uint16 burnFee;
        uint16 treasuryFee;
        uint16 devFee;
        uint16 totalFee;
    }
    struct ICooldown {
        bool buycooldownEnabled;
        bool sellcooldownEnabled;
        uint8 cooldownLimit;
        uint8 cooldownTime;
    }
    struct ITransactionSettings {
        uint256 maxTxAmount;
        uint256 maxWalletAmount;
        bool txLimits;
    }        
    struct ILaunch {
        uint256 launchBlock;
        uint8 sniperBlocks;
        uint snipersCaught;
        bool tradingOpen;
        bool launchProtection;
    }
    struct ILiquiditySettings {
        uint256 liquidityFeeAccumalator;
        uint256 treasuryFees;
        uint256 numTokensToSwap;
        uint256 lastSwap;
        uint8 swapInterval;
        bool inSwap;
        bool autoLiquifyEnabled;
        bool swapEnabled;
        bool feesEnabled;
    }
    ICooldown public cooldownInfo;
    IFees public BuyFees;
    IFees public SellFees;
    IFees public TransferFees;
    IFees public MaxFees;
    ILaunch public Launch;
    ILiquiditySettings public LiquiditySettings;
    IUniswapV2Router02 router;
    ITransactionSettings TransactionSettings;
    modifier onlyOwner() {
        require(isOwner(msg.sender), "You are not the owner");
        _;
    }
    modifier swapping() {
        LiquiditySettings.inSwap = true;
        _;
        LiquiditySettings.inSwap = false;
    }
    constructor(string memory name, string memory symbol, address liquidity, address dev, address treasury) ERC20(name, symbol) {
        owner = _msgSender();
        liquidityFeeReceiver = liquidity;
        treasuryFeeReceiver = treasury;
        devFeeReceiver = dev;
        router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
        pair = IUniswapV2Factory(router.factory()).createPair(router.WETH(), address(this));
        lpPair[pair] = true;
        lpHolder[_msgSender()] = true;

        _approve(address(this), address(router), type(uint256).max);
        _approve(_msgSender(), address(router), type(uint256).max);

        isMaxWalletExempt[_msgSender()] = true;
        isMaxWalletExempt[address(this)] = true;
        isMaxWalletExempt[pair] = true;

        isCooldownExempt[_msgSender()] = true;
        isCooldownExempt[pair] = true;
        isCooldownExempt[address(this)] = true;
        isCooldownExempt[address(router)] = true;

        isFeeExempt[_msgSender()] = true;
        isFeeExempt[address(this)] = true;


        cooldownInfo.buycooldownEnabled = true;
        cooldownInfo.sellcooldownEnabled = true;
        cooldownInfo.cooldownTime = 30;
        cooldownInfo.cooldownLimit = 60; // cooldown cannot go over 60 seconds

        TransactionSettings.txLimits = true;
        TransactionSettings.maxTxAmount = (_totalSupply * 1) / (100);
        TransactionSettings.maxWalletAmount = (_totalSupply * 2) / 100;

        BuyFees = IFees({
            liquidityFee: 1,
            burnFee: 1,
            treasuryFee: 2,
            devFee: 1,
            totalFee: 5
        });
        SellFees = IFees({
            liquidityFee: 1,
            burnFee: 1,
            treasuryFee: 2,
            devFee: 1,
            totalFee: 5
        });
        MaxFees.totalFee = 10;

        LiquiditySettings.swapEnabled = true;
        LiquiditySettings.autoLiquifyEnabled = true;
        LiquiditySettings.feesEnabled = true;
        LiquiditySettings.numTokensToSwap = (_totalSupply * 1) / 1000;
        LiquiditySettings.swapInterval = 5;


        _mint(_msgSender(), _totalSupply);
    }
    
    receive() external payable {}
    // =================== Ownership ===============

    /**
     * @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 onlyOwner {
        emit OwnershipRenounced();
        setExemptions(owner, false, false, false, false);
        owner = 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 onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address, use renounceOwnership Function");
        emit OwnershipTransferred(owner, newOwner);
        uint256 balance = balanceOf(owner);
        if(balanceOf(owner) > 0) _basicTransfer(owner, newOwner, balance);
        setExemptions(owner, false, false, false, false);
        setExemptions(newOwner, true, true, true, true);

        owner = newOwner;
    }

    // =================== Owner Only ===============

    function clearStuckBalance() public {
        uint256 balance = address(this).balance;
        payable(treasuryFeeReceiver).sendValue(balance);
        LiquiditySettings.treasuryFees += balance;
    }

    function setCooldownEnabled(bool buy, bool sell, uint8 _cooldown) external onlyOwner() {
        require(_cooldown <= cooldownInfo.cooldownLimit, "Cooldown time must be below cooldown limit");
        cooldownInfo.cooldownTime = _cooldown;
        cooldownInfo.buycooldownEnabled = buy;
        cooldownInfo.sellcooldownEnabled = sell;
    }

    function setExemptions(address holder, bool lpHolders, bool maxWalletExempt, bool CooldownExempt, bool feeExempt) public onlyOwner(){
        isMaxWalletExempt[holder] = maxWalletExempt;
        isCooldownExempt[holder] = CooldownExempt;
        lpHolder[holder] = lpHolders;
        isFeeExempt[holder] = feeExempt;
    }

    function setFeeReceivers(address liquidity, address treasury, address dev) external onlyOwner() {
        liquidityFeeReceiver = liquidity;
        treasuryFeeReceiver = treasury;
        devFeeReceiver = dev;
    }

    function setLimitsInEffect(bool inEffect) external onlyOwner() {
        TransactionSettings.txLimits = inEffect;
    }

    function setLiquiditySettings(uint8 _swapInterval, uint256 numPercent, uint256 numDivisor, bool fees, bool swaps, bool liquify) external onlyOwner() {
        LiquiditySettings.swapInterval = _swapInterval;
        LiquiditySettings.numTokensToSwap = (_totalSupply * numPercent) / numDivisor;
        LiquiditySettings.feesEnabled = fees;
        LiquiditySettings.swapEnabled = swaps;
        LiquiditySettings.autoLiquifyEnabled = liquify;
    }

    function setPair(address addr, bool lpPairs) external onlyOwner() {
        lpPair[addr] = lpPairs;
    }

    function setWalletLimits(uint256 percent, uint256 divisor, bool txOrWallet) external onlyOwner() {
        if(txOrWallet){
            require(percent >= 1 && divisor <= 1000, "Max Transaction must be set above .1%");
            TransactionSettings.maxTxAmount = (_totalSupply * percent) / (divisor);
            emit TxLimitUpdated(TransactionSettings.maxTxAmount);
        } else {
            require(percent >= 1 && divisor <= 100, "Max Wallet must be set above 1%");
            TransactionSettings.maxWalletAmount = (_totalSupply * percent) / divisor;
            emit WalletLimitUpdated(TransactionSettings.maxWalletAmount);
        }
    }

    // =================== Fees Only ===============

    function setBuyFees(uint16 _liquidityFee, uint16 _devFee, uint16 _treasuryFee, uint16 _burnFee) external onlyOwner() {
        require(_liquidityFee + _devFee + _treasuryFee + _burnFee <= MaxFees.totalFee);
        BuyFees = IFees({
            liquidityFee: _liquidityFee,
            devFee: _devFee,
            treasuryFee: _treasuryFee,
            burnFee: _burnFee,
            totalFee: _liquidityFee + _devFee + _treasuryFee + _burnFee
        });
    }    

    function setFeesEnabled(bool enabled) external onlyOwner() {
        LiquiditySettings.feesEnabled = enabled;
    }

    function setSellFees(uint16 _liquidityFee, uint16 _devFee, uint16 _treasuryFee, uint16 _burnFee) external onlyOwner() {
        require(_liquidityFee + _devFee + _treasuryFee + _burnFee <= MaxFees.totalFee);
        SellFees = IFees({
            liquidityFee: _liquidityFee,
            devFee: _devFee,
            treasuryFee: _treasuryFee,
            burnFee: _burnFee,
            totalFee: _liquidityFee + _devFee + _treasuryFee + _burnFee
        });
    }    

    function setTransferFees(uint16 _liquidityFee, uint16 _devFee, uint16 _treasuryFee, uint16 _burnFee) external onlyOwner() {
        require(_liquidityFee + _devFee + _treasuryFee + _burnFee <= MaxFees.totalFee);
        TransferFees = IFees({
            liquidityFee: _liquidityFee,
            devFee: _devFee,
            treasuryFee: _treasuryFee,
            burnFee: _burnFee,
            totalFee: _liquidityFee + _devFee + _treasuryFee + _burnFee
        });
    }

    function setMaxFees(uint16 _totalFee) external onlyOwner() {
        require(_totalFee <= MaxFees.totalFee);
        MaxFees.totalFee = _totalFee;
    }


    // =================== Internal ===============

    function launch(uint8 sniperBlocks) internal {
        Launch.tradingOpen = true;
        Launch.launchBlock = block.number;
        Launch.sniperBlocks = sniperBlocks;
        Launch.launchProtection = true;
        emit Launched();
    }

    function limits(address from, address to) private view returns (bool) {
        return !isOwner(from)
            && !isOwner(to)
            && tx.origin != owner
            && !lpHolder[from]
            && !lpHolder[to]
            && to != address(0xdead)
            && from != address(this);
    }

    function unblacklist(address account) external onlyOwner() {
        banned[account] = false;
    }

    function setBlacklistStatus(address account) internal {
        Launch.launchBlock + Launch.sniperBlocks > block.number 
        ? _setBlacklistStatus(account, true)
        : turnOff();
        if(Launch.launchProtection) Launch.snipersCaught++;
    }

    function turnOff() internal {
        Launch.launchProtection = false;
    }

    function _setBlacklistStatus(address account, bool blacklisted) internal {
        if (!lpPair[account]) {
            banned[account] = blacklisted;
        }      
    }

    function _transfer(address from, address to, uint256 amount ) internal override {
        require(!banned[from], "Blacklisted sender");
        require(!banned[to], "Blacklisted recipient");
        if(Launch.tradingOpen && Launch.launchProtection){
            setBlacklistStatus(to);
        }
        if(limits(from, to) && Launch.tradingOpen && TransactionSettings.txLimits){
            if(!isMaxWalletExempt[to]){
                require(amount <= TransactionSettings.maxTxAmount && balanceOf(to) + amount <= TransactionSettings.maxWalletAmount, "TOKEN: Amount exceeds Transaction size");
            } else if(to == pair){
                require(amount <= TransactionSettings.maxTxAmount, "TOKEN: Amount exceeds Transaction size");
            }
            if (from == pair && !isCooldownExempt[to] && cooldownInfo.buycooldownEnabled) {
                require(cooldown[to] < block.timestamp, "Recipient must wait until cooldown is over");
                cooldown[to] = block.timestamp + (cooldownInfo.cooldownTime);
            } else if (!isCooldownExempt[from] && cooldownInfo.sellcooldownEnabled){
                require(cooldown[from] <= block.timestamp, "Sender must wait until cooldown is over");
                cooldown[from] = block.timestamp + (cooldownInfo.cooldownTime);
            } 
        }
        if(!Launch.tradingOpen) {
            require(isOwner(from), "Pre-Launch Protection");                
            if(to == pair) launch(2);
        }

        if(shouldSwap()) {
            swap();
        }

        uint256 amountReceived = shouldTakeFees(from) ? distributeFees(from, to, amount) : amount;

        _basicTransfer(from, to, amountReceived);
    }

    function _basicTransfer(address from, address to, uint256 amount) internal {
        super._transfer(from, to, amount);
    }

    function shouldSwap() internal view returns(bool) {
        return !lpPair[_msgSender()] &&
        !LiquiditySettings.inSwap &&
        LiquiditySettings.swapEnabled &&
        block.timestamp >= LiquiditySettings.lastSwap + LiquiditySettings.swapInterval &&
        balanceOf(address(this)) >= LiquiditySettings.numTokensToSwap;
    }

    function swapToken(uint256 amount) internal {
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = router.WETH();

        router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            amount,
            0,
            path,
            address(this),
            block.timestamp
        );
    }

    function swap() internal swapping() {
        LiquiditySettings.lastSwap = block.timestamp;
        if(LiquiditySettings.liquidityFeeAccumalator >= LiquiditySettings.numTokensToSwap && LiquiditySettings.autoLiquifyEnabled){
            LiquiditySettings.liquidityFeeAccumalator >= LiquiditySettings.numTokensToSwap;
            uint256 amount = LiquiditySettings.liquidityFeeAccumalator / 2;
            swapToken(amount);
            uint256 ethAmount = address(this).balance;

            router.addLiquidityETH{value: ethAmount}(
                address(this),
                amount,
                0,
                0,
                liquidityFeeReceiver,
                block.timestamp
            );
       } else {
            swapToken(LiquiditySettings.numTokensToSwap);
            uint256 balance = address(this).balance;

            uint256 devAmount = (balance * (BuyFees.devFee + SellFees.devFee)) / (BuyFees.totalFee + SellFees.totalFee);
            payable(devFeeReceiver).sendValue(devAmount);
            clearStuckBalance();
        }
    }

    function shouldTakeFees(address from) internal view returns(bool) {
        return LiquiditySettings.feesEnabled && !isFeeExempt[from];
    }

    function distributeFees(address from, address to, uint256 amount) internal returns(uint256) {
        if(isFeeExempt[to]){
            return amount;
        }

        if(lpPair[to]){
            totalFee = SellFees.totalFee;
        } else if(lpPair[from]){
            totalFee = BuyFees.totalFee;
        } else {
            totalFee = TransferFees.totalFee;
        }

        feeAmount = (amount * totalFee) / feeDenominator;
        burnAmount = (feeAmount * (BuyFees.burnFee + SellFees.burnFee)) / (BuyFees.totalFee + SellFees.totalFee);
        if(burnAmount > 0){
            _burn(from, burnAmount);
            burnedTokens += burnAmount;
            feeAmount -= burnAmount;
        }

        if(LiquiditySettings.autoLiquifyEnabled) {
            LiquiditySettings.liquidityFeeAccumalator += (feeAmount * (BuyFees.liquidityFee + SellFees.liquidityFee)) / (BuyFees.totalFee + SellFees.totalFee) + (BuyFees.liquidityFee + SellFees.liquidityFee);
        }

        _basicTransfer(from, address(this), feeAmount);
        return amount - (feeAmount + burnAmount);
    }

    // =================== Public ===============

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

    function getTransactionAmounts() external view returns(uint maxTransaction, uint maxWallet, bool transactionLimits){
        if(TransactionSettings.txLimits){
            maxTransaction = TransactionSettings.maxTxAmount / 10**9;
            maxWallet = TransactionSettings.maxWalletAmount / 10**9;
            transactionLimits = TransactionSettings.txLimits;
        } else {
            maxTransaction = totalSupply();
            maxWallet = totalSupply();
            transactionLimits = false;
        }
    }

    function getBurnedTokens() external view returns (uint256 _burnedTokens) {
        _burnedTokens = burnedTokens;
    }

    function isOwner(address account) public view returns (bool) {
        return account == owner;
    }

    function burn(uint256 amount) external {
        _burn(_msgSender(), amount);
        burnedTokens = _totalSupply - totalSupply();
    }

    function airDropTokens(address[] memory addresses, uint256[] memory amounts) external {
        require(addresses.length == amounts.length, "Lengths do not match.");
        for (uint8 i = 0; i < addresses.length; i++) {
            require(balanceOf(_msgSender()) >= amounts[i]);
            _basicTransfer(_msgSender(), addresses[i], amounts[i]*10**9);
        }
    }

    event Launched();
    event WalletLimitUpdated(uint256 amount);
    event TxLimitUpdated(uint256 amount);
    event LimitsLifted();
    event OwnershipRenounced();
    event OwnershipTransferred(address oldOwner, address newOwner);
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"address","name":"liquidity","type":"address"},{"internalType":"address","name":"dev","type":"address"},{"internalType":"address","name":"treasury","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[],"name":"Launched","type":"event"},{"anonymous":false,"inputs":[],"name":"LimitsLifted","type":"event"},{"anonymous":false,"inputs":[],"name":"OwnershipRenounced","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldOwner","type":"address"},{"indexed":false,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TxLimitUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"WalletLimitUpdated","type":"event"},{"inputs":[],"name":"BuyFees","outputs":[{"internalType":"uint16","name":"liquidityFee","type":"uint16"},{"internalType":"uint16","name":"burnFee","type":"uint16"},{"internalType":"uint16","name":"treasuryFee","type":"uint16"},{"internalType":"uint16","name":"devFee","type":"uint16"},{"internalType":"uint16","name":"totalFee","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"Launch","outputs":[{"internalType":"uint256","name":"launchBlock","type":"uint256"},{"internalType":"uint8","name":"sniperBlocks","type":"uint8"},{"internalType":"uint256","name":"snipersCaught","type":"uint256"},{"internalType":"bool","name":"tradingOpen","type":"bool"},{"internalType":"bool","name":"launchProtection","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LiquiditySettings","outputs":[{"internalType":"uint256","name":"liquidityFeeAccumalator","type":"uint256"},{"internalType":"uint256","name":"treasuryFees","type":"uint256"},{"internalType":"uint256","name":"numTokensToSwap","type":"uint256"},{"internalType":"uint256","name":"lastSwap","type":"uint256"},{"internalType":"uint8","name":"swapInterval","type":"uint8"},{"internalType":"bool","name":"inSwap","type":"bool"},{"internalType":"bool","name":"autoLiquifyEnabled","type":"bool"},{"internalType":"bool","name":"swapEnabled","type":"bool"},{"internalType":"bool","name":"feesEnabled","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MaxFees","outputs":[{"internalType":"uint16","name":"liquidityFee","type":"uint16"},{"internalType":"uint16","name":"burnFee","type":"uint16"},{"internalType":"uint16","name":"treasuryFee","type":"uint16"},{"internalType":"uint16","name":"devFee","type":"uint16"},{"internalType":"uint16","name":"totalFee","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SellFees","outputs":[{"internalType":"uint16","name":"liquidityFee","type":"uint16"},{"internalType":"uint16","name":"burnFee","type":"uint16"},{"internalType":"uint16","name":"treasuryFee","type":"uint16"},{"internalType":"uint16","name":"devFee","type":"uint16"},{"internalType":"uint16","name":"totalFee","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TransferFees","outputs":[{"internalType":"uint16","name":"liquidityFee","type":"uint16"},{"internalType":"uint16","name":"burnFee","type":"uint16"},{"internalType":"uint16","name":"treasuryFee","type":"uint16"},{"internalType":"uint16","name":"devFee","type":"uint16"},{"internalType":"uint16","name":"totalFee","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_balances","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"airDropTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"banned","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"clearStuckBalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"cooldownInfo","outputs":[{"internalType":"bool","name":"buycooldownEnabled","type":"bool"},{"internalType":"bool","name":"sellcooldownEnabled","type":"bool"},{"internalType":"uint8","name":"cooldownLimit","type":"uint8"},{"internalType":"uint8","name":"cooldownTime","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"devFeeReceiver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBurnedTokens","outputs":[{"internalType":"uint256","name":"_burnedTokens","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTransactionAmounts","outputs":[{"internalType":"uint256","name":"maxTransaction","type":"uint256"},{"internalType":"uint256","name":"maxWallet","type":"uint256"},{"internalType":"bool","name":"transactionLimits","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":[{"internalType":"address","name":"account","type":"address"}],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityFeeReceiver","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_liquidityFee","type":"uint16"},{"internalType":"uint16","name":"_devFee","type":"uint16"},{"internalType":"uint16","name":"_treasuryFee","type":"uint16"},{"internalType":"uint16","name":"_burnFee","type":"uint16"}],"name":"setBuyFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"buy","type":"bool"},{"internalType":"bool","name":"sell","type":"bool"},{"internalType":"uint8","name":"_cooldown","type":"uint8"}],"name":"setCooldownEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"},{"internalType":"bool","name":"lpHolders","type":"bool"},{"internalType":"bool","name":"maxWalletExempt","type":"bool"},{"internalType":"bool","name":"CooldownExempt","type":"bool"},{"internalType":"bool","name":"feeExempt","type":"bool"}],"name":"setExemptions","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"liquidity","type":"address"},{"internalType":"address","name":"treasury","type":"address"},{"internalType":"address","name":"dev","type":"address"}],"name":"setFeeReceivers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setFeesEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"inEffect","type":"bool"}],"name":"setLimitsInEffect","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_swapInterval","type":"uint8"},{"internalType":"uint256","name":"numPercent","type":"uint256"},{"internalType":"uint256","name":"numDivisor","type":"uint256"},{"internalType":"bool","name":"fees","type":"bool"},{"internalType":"bool","name":"swaps","type":"bool"},{"internalType":"bool","name":"liquify","type":"bool"}],"name":"setLiquiditySettings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_totalFee","type":"uint16"}],"name":"setMaxFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"bool","name":"lpPairs","type":"bool"}],"name":"setPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_liquidityFee","type":"uint16"},{"internalType":"uint16","name":"_devFee","type":"uint16"},{"internalType":"uint16","name":"_treasuryFee","type":"uint16"},{"internalType":"uint16","name":"_burnFee","type":"uint16"}],"name":"setSellFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_liquidityFee","type":"uint16"},{"internalType":"uint16","name":"_devFee","type":"uint16"},{"internalType":"uint16","name":"_treasuryFee","type":"uint16"},{"internalType":"uint16","name":"_burnFee","type":"uint16"}],"name":"setTransferFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"percent","type":"uint256"},{"internalType":"uint256","name":"divisor","type":"uint256"},{"internalType":"bool","name":"txOrWallet","type":"bool"}],"name":"setWalletLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasuryFeeReceiver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"unblacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

6080604052662386f26fc1000060115560646016553480156200002157600080fd5b50604051620075b9380380620075b98339818101604052810190620000479190620011ce565b848481600390805190602001906200006192919062001057565b5080600490805190602001906200007a92919062001057565b5050506200008d62000d0460201b60201c565b600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550737a250d5630b4cf539739df2c5dacb4c659f2488d602560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550602560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b1580156200024e57600080fd5b505afa15801562000263573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200028991906200119c565b73ffffffffffffffffffffffffffffffffffffffff1663c9c65396602560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156200030d57600080fd5b505afa15801562000322573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200034891906200119c565b306040518363ffffffff1660e01b8152600401620003689291906200132b565b602060405180830381600087803b1580156200038357600080fd5b505af115801562000398573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003be91906200119c565b601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600b6000601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600a60006200048e62000d0460201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506200053430602560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff62000d0c60201b60201c565b620005986200054862000d0460201b60201c565b602560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff62000d0c60201b60201c565b600160096000620005ae62000d0460201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600960003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160096000601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160076000620006e762000d0460201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160076000601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600760003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160076000602560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600860006200089a62000d0460201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600860003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601760000160006101000a81548160ff0219169083151502179055506001601760000160016101000a81548160ff021916908315150217905550601e601760000160036101000a81548160ff021916908360ff160217905550603c601760000160026101000a81548160ff021916908360ff1602179055506001602660020160006101000a81548160ff02191690831515021790555060646001601154620009ee9190620014e0565b620009fa9190620014a8565b6026600001819055506064600260115462000a169190620014e0565b62000a229190620014a8565b6026600101819055506040518060a00160405280600161ffff168152602001600161ffff168152602001600261ffff168152602001600161ffff168152602001600561ffff16815250601860008201518160000160006101000a81548161ffff021916908361ffff16021790555060208201518160000160026101000a81548161ffff021916908361ffff16021790555060408201518160000160046101000a81548161ffff021916908361ffff16021790555060608201518160000160066101000a81548161ffff021916908361ffff16021790555060808201518160000160086101000a81548161ffff021916908361ffff1602179055509050506040518060a00160405280600161ffff168152602001600161ffff168152602001600261ffff168152602001600161ffff168152602001600561ffff16815250601960008201518160000160006101000a81548161ffff021916908361ffff16021790555060208201518160000160026101000a81548161ffff021916908361ffff16021790555060408201518160000160046101000a81548161ffff021916908361ffff16021790555060608201518160000160066101000a81548161ffff021916908361ffff16021790555060808201518160000160086101000a81548161ffff021916908361ffff160217905550905050600a601b60000160086101000a81548161ffff021916908361ffff1602179055506001602060040160036101000a81548160ff0219169083151502179055506001602060040160026101000a81548160ff0219169083151502179055506001602060040160046101000a81548160ff0219169083151502179055506103e8600160115462000ca29190620014e0565b62000cae9190620014a8565b6020600201819055506005602060040160006101000a81548160ff021916908360ff16021790555062000cf962000cea62000d0460201b60201c565b60115462000edf60201b60201c565b5050505050620017e3565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141562000d7f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000d76906200137a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562000df2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000de99062001358565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405162000ed29190620013be565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562000f52576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000f49906200139c565b60405180910390fd5b62000f66600083836200104d60201b60201c565b806002600082825462000f7a91906200144b565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516200102d9190620013be565b60405180910390a362001049600083836200105260201b60201c565b5050565b505050565b505050565b8280546200106590620015b5565b90600052602060002090601f016020900481019282620010895760008555620010d5565b82601f10620010a457805160ff1916838001178555620010d5565b82800160010185558215620010d5579182015b82811115620010d4578251825591602001919060010190620010b7565b5b509050620010e49190620010e8565b5090565b5b8082111562001103576000816000905550600101620010e9565b5090565b60006200111e620011188462001404565b620013db565b9050828152602081018484840111156200113d576200113c620016e2565b5b6200114a8482856200157f565b509392505050565b6000815190506200116381620017c9565b92915050565b600082601f830112620011815762001180620016dd565b5b81516200119384826020860162001107565b91505092915050565b600060208284031215620011b557620011b4620016ec565b5b6000620011c58482850162001152565b91505092915050565b600080600080600060a08688031215620011ed57620011ec620016ec565b5b600086015167ffffffffffffffff8111156200120e576200120d620016e7565b5b6200121c8882890162001169565b955050602086015167ffffffffffffffff81111562001240576200123f620016e7565b5b6200124e8882890162001169565b9450506040620012618882890162001152565b9350506060620012748882890162001152565b9250506080620012878882890162001152565b9150509295509295909350565b6200129f8162001541565b82525050565b6000620012b46022836200143a565b9150620012c18262001702565b604082019050919050565b6000620012db6024836200143a565b9150620012e88262001751565b604082019050919050565b600062001302601f836200143a565b91506200130f82620017a0565b602082019050919050565b620013258162001575565b82525050565b600060408201905062001342600083018562001294565b62001351602083018462001294565b9392505050565b600060208201905081810360008301526200137381620012a5565b9050919050565b600060208201905081810360008301526200139581620012cc565b9050919050565b60006020820190508181036000830152620013b781620012f3565b9050919050565b6000602082019050620013d560008301846200131a565b92915050565b6000620013e7620013fa565b9050620013f58282620015eb565b919050565b6000604051905090565b600067ffffffffffffffff821115620014225762001421620016ae565b5b6200142d82620016f1565b9050602081019050919050565b600082825260208201905092915050565b6000620014588262001575565b9150620014658362001575565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156200149d576200149c62001621565b5b828201905092915050565b6000620014b58262001575565b9150620014c28362001575565b925082620014d557620014d462001650565b5b828204905092915050565b6000620014ed8262001575565b9150620014fa8362001575565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161562001536576200153562001621565b5b828202905092915050565b60006200154e8262001555565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b838110156200159f57808201518184015260208101905062001582565b83811115620015af576000848401525b50505050565b60006002820490506001821680620015ce57607f821691505b60208210811415620015e557620015e46200167f565b5b50919050565b620015f682620016f1565b810181811067ffffffffffffffff82111715620016185762001617620016ae565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b620017d48162001541565b8114620017e057600080fd5b50565b615dc680620017f36000396000f3fe6080604052600436106102805760003560e01c806386a22eff1161014f578063bfa21d6a116100c1578063dc7703671161007a578063dc770367146109bd578063dd62ed3e146109ec578063ed2a50cd14610a29578063f2421d2c14610a52578063f2fde38b14610a81578063ff787dc614610aaa57610287565b8063bfa21d6a146108c1578063c3f4f54f146108ec578063ccd7213114610917578063d7c0103214610940578063dab84ee714610969578063db32e8f61461099457610287565b8063a457c2d711610113578063a457c2d714610797578063a8aa1b31146107d4578063a901dd92146107ff578063a9059cbb14610828578063b2c57fff14610865578063b40c82321461089857610287565b806386a22eff146106ad5780638da5cb5b146106d657806395d89b411461070157806395f93d481461072c5780639c8d83bb1461075a57610287565b806342966c68116101f3578063679ca6e9116101ac578063679ca6e91461059b5780636ebcf607146105c457806370a0823114610601578063715018a61461063e5780637303df9a1461065557806375e3661e1461068457610287565b806342966c68146104a1578063461a4450146104ca5780634c57f8d2146104f357806355fb28e41461051c5780635f7fcce914610545578063674a29cb1461056e57610287565b806323b872dd1161024557806323b872dd1461037d5780632af10fac146103ba5780632f54bf6e146103e5578063313ce56714610422578063364333f41461044d578063395093511461046457610287565b8062167e931461028c57806302ac8168146102bb57806306fdde03146102ea578063095ea7b31461031557806318160ddd1461035257610287565b3661028757005b600080fd5b34801561029857600080fd5b506102a1610ad3565b6040516102b2959493929190615059565b60405180910390f35b3480156102c757600080fd5b506102d0610b3d565b6040516102e19594939291906151e5565b60405180910390f35b3480156102f657600080fd5b506102ff610b88565b60405161030c9190614d57565b60405180910390f35b34801561032157600080fd5b5061033c600480360381019061033791906144b1565b610c1a565b6040516103499190614cf7565b60405180910390f35b34801561035e57600080fd5b50610367610c3d565b60405161037491906150ac565b60405180910390f35b34801561038957600080fd5b506103a4600480360381019061039f91906143a3565b610c47565b6040516103b19190614cf7565b60405180910390f35b3480156103c657600080fd5b506103cf610c76565b6040516103dc9190614c52565b60405180910390f35b3480156103f157600080fd5b5061040c600480360381019061040791906142b6565b610c9c565b6040516104199190614cf7565b60405180910390f35b34801561042e57600080fd5b50610437610cf6565b6040516104449190615238565b60405180910390f35b34801561045957600080fd5b50610462610cff565b005b34801561047057600080fd5b5061048b600480360381019061048691906144b1565b610d6e565b6040516104989190614cf7565b60405180910390f35b3480156104ad57600080fd5b506104c860048036038101906104c3919061467d565b610da5565b005b3480156104d657600080fd5b506104f160048036038101906104ec9190614596565b610dd4565b005b3480156104ff57600080fd5b5061051a600480360381019061051591906144f1565b610ed4565b005b34801561052857600080fd5b50610543600480360381019061053e9190614436565b610fd3565b005b34801561055157600080fd5b5061056c60048036038101906105679190614616565b61117e565b005b34801561057a57600080fd5b50610583611325565b60405161059293929190615121565b60405180910390f35b3480156105a757600080fd5b506105c260048036038101906105bd9190614569565b6113a8565b005b3480156105d057600080fd5b506105eb60048036038101906105e691906142b6565b611410565b6040516105f891906150ac565b60405180910390f35b34801561060d57600080fd5b50610628600480360381019061062391906142b6565b611428565b60405161063591906150ac565b60405180910390f35b34801561064a57600080fd5b50610653611470565b005b34801561066157600080fd5b5061066a611559565b60405161067b959493929190615059565b60405180910390f35b34801561069057600080fd5b506106ab60048036038101906106a691906142b6565b6115c3565b005b3480156106b957600080fd5b506106d460048036038101906106cf91906143f6565b611666565b005b3480156106e257600080fd5b506106eb611709565b6040516106f89190614c52565b60405180910390f35b34801561070d57600080fd5b5061071661172f565b6040516107239190614d57565b60405180910390f35b34801561073857600080fd5b506107416117c1565b6040516107519493929190614d12565b60405180910390f35b34801561076657600080fd5b50610781600480360381019061077c91906142b6565b611813565b60405161078e9190614cf7565b60405180910390f35b3480156107a357600080fd5b506107be60048036038101906107b991906144b1565b611833565b6040516107cb9190614cf7565b60405180910390f35b3480156107e057600080fd5b506107e96118aa565b6040516107f69190614c52565b60405180910390f35b34801561080b57600080fd5b5061082660048036038101906108219190614569565b6118d0565b005b34801561083457600080fd5b5061084f600480360381019061084a91906144b1565b611938565b60405161085c9190614cf7565b60405180910390f35b34801561087157600080fd5b5061087a61195b565b60405161088f99989796959493929190615158565b60405180910390f35b3480156108a457600080fd5b506108bf60048036038101906108ba9190614616565b6119d8565b005b3480156108cd57600080fd5b506108d6611b7f565b6040516108e39190614c52565b60405180910390f35b3480156108f857600080fd5b50610901611ba5565b60405161090e91906150ac565b60405180910390f35b34801561092357600080fd5b5061093e600480360381019061093991906146aa565b611baf565b005b34801561094c57600080fd5b5061096760048036038101906109629190614350565b611d67565b005b34801561097557600080fd5b5061097e611e77565b60405161098b9190614c52565b60405180910390f35b3480156109a057600080fd5b506109bb60048036038101906109b69190614616565b611e9d565b005b3480156109c957600080fd5b506109d2612044565b6040516109e3959493929190615059565b60405180910390f35b3480156109f857600080fd5b50610a136004803603810190610a0e9190614310565b6120ae565b604051610a2091906150ac565b60405180910390f35b348015610a3557600080fd5b50610a506004803603810190610a4b9190614750565b612135565b005b348015610a5e57600080fd5b50610a6761221c565b604051610a78959493929190615059565b60405180910390f35b348015610a8d57600080fd5b50610aa86004803603810190610aa391906142b6565b612286565b005b348015610ab657600080fd5b50610ad16004803603810190610acc91906145e9565b6124ae565b005b601a8060000160009054906101000a900461ffff16908060000160029054906101000a900461ffff16908060000160049054906101000a900461ffff16908060000160069054906101000a900461ffff16908060000160089054906101000a900461ffff16905085565b601c8060000154908060010160009054906101000a900460ff16908060020154908060030160009054906101000a900460ff16908060030160019054906101000a900460ff16905085565b606060038054610b9790615525565b80601f0160208091040260200160405190810160405280929190818152602001828054610bc390615525565b8015610c105780601f10610be557610100808354040283529160200191610c10565b820191906000526020600020905b815481529060010190602001808311610bf357829003601f168201915b5050505050905090565b600080610c25612541565b9050610c32818585612549565b600191505092915050565b6000600254905090565b600080610c52612541565b9050610c5f858285612714565b610c6a8585856127a0565b60019150509392505050565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16149050919050565b60006009905090565b6000479050610d4f81600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612eb190919063ffffffff16565b8060206001016000828254610d649190615368565b9250508190555050565b600080610d79612541565b9050610d9a818585610d8b85896120ae565b610d959190615368565b612549565b600191505092915050565b610db6610db0612541565b82612fa5565b610dbe610c3d565b601154610dcb9190615449565b60158190555050565b610ddd33610c9c565b610e1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1390614eb9565b60405180910390fd5b601760000160029054906101000a900460ff1660ff168160ff161115610e77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6e90614e39565b60405180910390fd5b80601760000160036101000a81548160ff021916908360ff16021790555082601760000160006101000a81548160ff02191690831515021790555081601760000160016101000a81548160ff021916908315150217905550505050565b8051825114610f18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0f90614f99565b60405180910390fd5b60005b82518160ff161015610fce57818160ff1681518110610f3d57610f3c615688565b5b6020026020010151610f55610f50612541565b611428565b1015610f6057600080fd5b610fbb610f6b612541565b848360ff1681518110610f8157610f80615688565b5b6020026020010151633b9aca00858560ff1681518110610fa457610fa3615688565b5b6020026020010151610fb691906153ef565b613173565b8080610fc6906155d1565b915050610f1b565b505050565b610fdc33610c9c565b61101b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101290614eb9565b60405180910390fd5b82600960008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555081600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555083600a60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050505050565b61118733610c9c565b6111c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111bd90614eb9565b60405180910390fd5b601b60000160089054906101000a900461ffff1661ffff16818385876111ec9190615330565b6111f69190615330565b6112009190615330565b61ffff16111561120f57600080fd5b6040518060a001604052808561ffff1681526020018261ffff1681526020018361ffff1681526020018461ffff168152602001828486886112509190615330565b61125a9190615330565b6112649190615330565b61ffff16815250601a60008201518160000160006101000a81548161ffff021916908361ffff16021790555060208201518160000160026101000a81548161ffff021916908361ffff16021790555060408201518160000160046101000a81548161ffff021916908361ffff16021790555060608201518160000160066101000a81548161ffff021916908361ffff16021790555060808201518160000160086101000a81548161ffff021916908361ffff16021790555090505050505050565b6000806000602660020160009054906101000a900460ff161561138a57633b9aca0060266000015461135791906153be565b9250633b9aca0060266001015461136e91906153be565b9150602660020160009054906101000a900460ff1690506113a3565b611392610c3d565b925061139c610c3d565b9150600090505b909192565b6113b133610c9c565b6113f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e790614eb9565b60405180910390fd5b80602660020160006101000a81548160ff02191690831515021790555050565b60006020528060005260406000206000915090505481565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61147933610c9c565b6114b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114af90614eb9565b60405180910390fd5b7fd1f66c3d2bc1993a86be5e3d33709d98f0442381befcedd29f578b9b2506b1ce60405160405180910390a1611515600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600080600080610fd3565b6000600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b601b8060000160009054906101000a900461ffff16908060000160029054906101000a900461ffff16908060000160049054906101000a900461ffff16908060000160069054906101000a900461ffff16908060000160089054906101000a900461ffff16905085565b6115cc33610c9c565b61160b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160290614eb9565b60405180910390fd5b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b61166f33610c9c565b6116ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a590614eb9565b60405180910390fd5b80600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60606004805461173e90615525565b80601f016020809104026020016040519081016040528092919081815260200182805461176a90615525565b80156117b75780601f1061178c576101008083540402835291602001916117b7565b820191906000526020600020905b81548152906001019060200180831161179a57829003601f168201915b5050505050905090565b60178060000160009054906101000a900460ff16908060000160019054906101000a900460ff16908060000160029054906101000a900460ff16908060000160039054906101000a900460ff16905084565b60056020528060005260406000206000915054906101000a900460ff1681565b60008061183e612541565b9050600061184c82866120ae565b905083811015611891576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188890615039565b60405180910390fd5b61189e8286868403612549565b60019250505092915050565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6118d933610c9c565b611918576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190f90614eb9565b60405180910390fd5b80602060040160046101000a81548160ff02191690831515021790555050565b600080611943612541565b90506119508185856127a0565b600191505092915050565b60208060000154908060010154908060020154908060030154908060040160009054906101000a900460ff16908060040160019054906101000a900460ff16908060040160029054906101000a900460ff16908060040160039054906101000a900460ff16908060040160049054906101000a900460ff16905089565b6119e133610c9c565b611a20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a1790614eb9565b60405180910390fd5b601b60000160089054906101000a900461ffff1661ffff1681838587611a469190615330565b611a509190615330565b611a5a9190615330565b61ffff161115611a6957600080fd5b6040518060a001604052808561ffff1681526020018261ffff1681526020018361ffff1681526020018461ffff16815260200182848688611aaa9190615330565b611ab49190615330565b611abe9190615330565b61ffff16815250601860008201518160000160006101000a81548161ffff021916908361ffff16021790555060208201518160000160026101000a81548161ffff021916908361ffff16021790555060408201518160000160046101000a81548161ffff021916908361ffff16021790555060608201518160000160066101000a81548161ffff021916908361ffff16021790555060808201518160000160086101000a81548161ffff021916908361ffff16021790555090505050505050565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000601554905090565b611bb833610c9c565b611bf7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bee90614eb9565b60405180910390fd5b8015611cb25760018310158015611c1057506103e88211155b611c4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4690614ef9565b60405180910390fd5b8183601154611c5e91906153ef565b611c6891906153be565b6026600001819055507fa53407ff336a78b145e1a297adce2a5d7a54e6c31d13b4e69e04aad80b07b44b602660000154604051611ca591906150ac565b60405180910390a1611d62565b60018310158015611cc4575060648211155b611d03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cfa90614f39565b60405180910390fd5b8183601154611d1291906153ef565b611d1c91906153be565b6026600101819055507f199db6b3f784dbaaa5df3981a282a84eb13409a543eaaeb8e8f309c467b45e18602660010154604051611d5991906150ac565b60405180910390a15b505050565b611d7033610c9c565b611daf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611da690614eb9565b60405180910390fd5b82600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611ea633610c9c565b611ee5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611edc90614eb9565b60405180910390fd5b601b60000160089054906101000a900461ffff1661ffff1681838587611f0b9190615330565b611f159190615330565b611f1f9190615330565b61ffff161115611f2e57600080fd5b6040518060a001604052808561ffff1681526020018261ffff1681526020018361ffff1681526020018461ffff16815260200182848688611f6f9190615330565b611f799190615330565b611f839190615330565b61ffff16815250601960008201518160000160006101000a81548161ffff021916908361ffff16021790555060208201518160000160026101000a81548161ffff021916908361ffff16021790555060408201518160000160046101000a81548161ffff021916908361ffff16021790555060608201518160000160066101000a81548161ffff021916908361ffff16021790555060808201518160000160086101000a81548161ffff021916908361ffff16021790555090505050505050565b60188060000160009054906101000a900461ffff16908060000160029054906101000a900461ffff16908060000160049054906101000a900461ffff16908060000160069054906101000a900461ffff16908060000160089054906101000a900461ffff16905085565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b61213e33610c9c565b61217d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161217490614eb9565b60405180910390fd5b85602060040160006101000a81548160ff021916908360ff16021790555083856011546121aa91906153ef565b6121b491906153be565b60206002018190555082602060040160046101000a81548160ff02191690831515021790555081602060040160036101000a81548160ff02191690831515021790555080602060040160026101000a81548160ff021916908315150217905550505050505050565b60198060000160009054906101000a900461ffff16908060000160029054906101000a900461ffff16908060000160049054906101000a900461ffff16908060000160069054906101000a900461ffff16908060000160089054906101000a900461ffff16905085565b61228f33610c9c565b6122ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122c590614eb9565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561233e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161233590614db9565b60405180910390fd5b7f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682604051612391929190614c6d565b60405180910390a160006123c6600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16611428565b905060006123f5600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16611428565b111561242957612428600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168383613173565b5b61245a600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600080600080610fd3565b61246982600180600180610fd3565b81600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6124b733610c9c565b6124f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124ed90614eb9565b60405180910390fd5b601b60000160089054906101000a900461ffff1661ffff168161ffff16111561251e57600080fd5b80601b60000160086101000a81548161ffff021916908361ffff16021790555050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156125b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125b090614ff9565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612629576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161262090614df9565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161270791906150ac565b60405180910390a3505050565b600061272084846120ae565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461279a578181101561278c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161278390614e19565b60405180910390fd5b6127998484848403612549565b5b50505050565b600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561282d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161282490614f59565b60405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156128ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128b190614f79565b60405180910390fd5b601c60030160009054906101000a900460ff1680156128e85750601c60030160019054906101000a900460ff165b156128f7576128f682613183565b5b61290183836131ff565b801561291c5750601c60030160009054906101000a900460ff165b80156129375750602660020160009054906101000a900460ff165b15612da657600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166129fe5760266000015481111580156129ba5750602660010154816129ad84611428565b6129b79190615368565b11155b6129f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129f090614e79565b60405180910390fd5b612a9e565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612a9d57602660000154811115612a9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a9390614e79565b60405180910390fd5b5b5b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16148015612b455750600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b8015612b605750601760000160009054906101000a900460ff165b15612c4f5742600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410612be6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bdd90614d99565b60405180910390fd5b601760000160039054906101000a900460ff1660ff1642612c079190615368565b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612da5565b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16158015612cb85750601760000160019054906101000a900460ff165b15612da45742600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115612d3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d3690615019565b60405180910390fd5b601760000160039054906101000a900460ff1660ff1642612d609190615368565b600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b5b5b601c60030160009054906101000a900460ff16612e6757612dc683610c9c565b612e05576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dfc90614f19565b60405180910390fd5b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612e6657612e65600261339d565b5b5b612e6f613430565b15612e7d57612e7c61350d565b5b6000612e888461377a565b612e925781612e9e565b612e9d8484846137ec565b5b9050612eab848483613173565b50505050565b80471015612ef4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612eeb90614ed9565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff1682604051612f1a90614c3d565b60006040518083038185875af1925050503d8060008114612f57576040519150601f19603f3d011682016040523d82523d6000602084013e612f5c565b606091505b5050905080612fa0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f9790614e99565b60405180910390fd5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613015576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161300c90614fb9565b60405180910390fd5b61302182600083613b73565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156130a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161309e90614dd9565b60405180910390fd5b8181036000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600260008282540392505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161315a91906150ac565b60405180910390a361316e83600084613b78565b505050565b61317e838383613b7d565b505050565b43601c60010160009054906101000a900460ff1660ff16601c600001546131aa9190615368565b116131bc576131b7613df5565b6131c8565b6131c7816001613e15565b5b601c60030160019054906101000a900460ff16156131fc57601c60020160008154809291906131f690615588565b91905055505b50565b600061320a83610c9c565b15801561321d575061321b82610c9c565b155b80156132775750600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614155b80156132cd5750600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b80156133235750600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b801561335d575061dead73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b801561339557503073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b905092915050565b6001601c60030160006101000a81548160ff02191690831515021790555043601c6000018190555080601c60010160006101000a81548160ff021916908360ff1602179055506001601c60030160016101000a81548160ff0219169083151502179055507fba61a96074b3d636edeee92caddc86293c917d5b6818b7d3698bb52e02ec86c860405160405180910390a150565b6000600b600061343e612541565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161580156134a35750602060040160019054906101000a900460ff16155b80156134be5750602060040160039054906101000a900460ff165b80156134ef5750602060040160009054906101000a900460ff1660ff166020600301546134eb9190615368565b4210155b8015613508575060206002015461350530611428565b10155b905090565b6001602060040160016101000a81548160ff021916908315150217905550426020600301819055506020600201546020600001541015801561355e5750602060040160029054906101000a900460ff165b1561366c576000600260206000015461357791906153be565b905061358281613ec2565b6000479050602560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d719823085600080600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16426040518863ffffffff1660e01b815260040161361096959493929190614c96565b6060604051808303818588803b15801561362957600080fd5b505af115801561363d573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061366291906146fd565b505050505061375a565b61367a602060020154613ec2565b60004790506000601960000160089054906101000a900461ffff16601860000160089054906101000a900461ffff166136b39190615330565b61ffff16601960000160069054906101000a900461ffff16601860000160069054906101000a900461ffff166136e99190615330565b61ffff16836136f891906153ef565b61370291906153be565b905061374f81600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612eb190919063ffffffff16565b613757610cff565b50505b6000602060040160016101000a81548160ff021916908315150217905550565b6000602060040160049054906101000a900460ff1680156137e55750600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b9050919050565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561384857819050613b6c565b600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156138bd57601960000160089054906101000a900461ffff1661ffff16601281905550613952565b600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561393257601860000160089054906101000a900461ffff1661ffff16601281905550613951565b601a60000160089054906101000a900461ffff1661ffff166012819055505b5b6016546012548361396391906153ef565b61396d91906153be565b601381905550601960000160089054906101000a900461ffff16601860000160089054906101000a900461ffff166139a59190615330565b61ffff16601960000160029054906101000a900461ffff16601860000160029054906101000a900461ffff166139db9190615330565b61ffff166013546139ec91906153ef565b6139f691906153be565b60148190555060006014541115613a4a57613a1384601454612fa5565b60145460156000828254613a279190615368565b9250508190555060145460136000828254613a429190615449565b925050819055505b602060040160029054906101000a900460ff1615613b4157601960000160009054906101000a900461ffff16601860000160009054906101000a900461ffff16613a949190615330565b61ffff16601960000160089054906101000a900461ffff16601860000160089054906101000a900461ffff16613aca9190615330565b61ffff16601960000160009054906101000a900461ffff16601860000160009054906101000a900461ffff16613b009190615330565b61ffff16601354613b1191906153ef565b613b1b91906153be565b613b259190615368565b60206000016000828254613b399190615368565b925050819055505b613b4e8430601354613173565b601454601354613b5e9190615368565b82613b699190615449565b90505b9392505050565b505050565b505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613bed576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613be490614fd9565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613c5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613c5490614d79565b60405180910390fd5b613c68838383613b73565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015613cee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613ce590614e59565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051613ddc91906150ac565b60405180910390a3613def848484613b78565b50505050565b6000601c60030160016101000a81548160ff021916908315150217905550565b600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16613ebe5780600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b5050565b6000600267ffffffffffffffff811115613edf57613ede6156b7565b5b604051908082528060200260200182016040528015613f0d5781602001602082028036833780820191505090505b5090503081600081518110613f2557613f24615688565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050602560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015613fc757600080fd5b505afa158015613fdb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613fff91906142e3565b8160018151811061401357614012615688565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050602560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b81526004016140b19594939291906150c7565b600060405180830381600087803b1580156140cb57600080fd5b505af11580156140df573d6000803e3d6000fd5b505050505050565b60006140fa6140f584615278565b615253565b9050808382526020820190508285602086028201111561411d5761411c6156eb565b5b60005b8581101561414d578161413388826141c7565b845260208401935060208301925050600181019050614120565b5050509392505050565b600061416a614165846152a4565b615253565b9050808382526020820190508285602086028201111561418d5761418c6156eb565b5b60005b858110156141bd57816141a38882614277565b845260208401935060208301925050600181019050614190565b5050509392505050565b6000813590506141d681615d1d565b92915050565b6000815190506141eb81615d1d565b92915050565b600082601f830112614206576142056156e6565b5b81356142168482602086016140e7565b91505092915050565b600082601f830112614234576142336156e6565b5b8135614244848260208601614157565b91505092915050565b60008135905061425c81615d34565b92915050565b60008135905061427181615d4b565b92915050565b60008135905061428681615d62565b92915050565b60008151905061429b81615d62565b92915050565b6000813590506142b081615d79565b92915050565b6000602082840312156142cc576142cb6156f5565b5b60006142da848285016141c7565b91505092915050565b6000602082840312156142f9576142f86156f5565b5b6000614307848285016141dc565b91505092915050565b60008060408385031215614327576143266156f5565b5b6000614335858286016141c7565b9250506020614346858286016141c7565b9150509250929050565b600080600060608486031215614369576143686156f5565b5b6000614377868287016141c7565b9350506020614388868287016141c7565b9250506040614399868287016141c7565b9150509250925092565b6000806000606084860312156143bc576143bb6156f5565b5b60006143ca868287016141c7565b93505060206143db868287016141c7565b92505060406143ec86828701614277565b9150509250925092565b6000806040838503121561440d5761440c6156f5565b5b600061441b858286016141c7565b925050602061442c8582860161424d565b9150509250929050565b600080600080600060a08688031215614452576144516156f5565b5b6000614460888289016141c7565b95505060206144718882890161424d565b94505060406144828882890161424d565b93505060606144938882890161424d565b92505060806144a48882890161424d565b9150509295509295909350565b600080604083850312156144c8576144c76156f5565b5b60006144d6858286016141c7565b92505060206144e785828601614277565b9150509250929050565b60008060408385031215614508576145076156f5565b5b600083013567ffffffffffffffff811115614526576145256156f0565b5b614532858286016141f1565b925050602083013567ffffffffffffffff811115614553576145526156f0565b5b61455f8582860161421f565b9150509250929050565b60006020828403121561457f5761457e6156f5565b5b600061458d8482850161424d565b91505092915050565b6000806000606084860312156145af576145ae6156f5565b5b60006145bd8682870161424d565b93505060206145ce8682870161424d565b92505060406145df868287016142a1565b9150509250925092565b6000602082840312156145ff576145fe6156f5565b5b600061460d84828501614262565b91505092915050565b600080600080608085870312156146305761462f6156f5565b5b600061463e87828801614262565b945050602061464f87828801614262565b935050604061466087828801614262565b925050606061467187828801614262565b91505092959194509250565b600060208284031215614693576146926156f5565b5b60006146a184828501614277565b91505092915050565b6000806000606084860312156146c3576146c26156f5565b5b60006146d186828701614277565b93505060206146e286828701614277565b92505060406146f38682870161424d565b9150509250925092565b600080600060608486031215614716576147156156f5565b5b60006147248682870161428c565b93505060206147358682870161428c565b92505060406147468682870161428c565b9150509250925092565b60008060008060008060c0878903121561476d5761476c6156f5565b5b600061477b89828a016142a1565b965050602061478c89828a01614277565b955050604061479d89828a01614277565b94505060606147ae89828a0161424d565b93505060806147bf89828a0161424d565b92505060a06147d089828a0161424d565b9150509295509295509295565b60006147e983836147f5565b60208301905092915050565b6147fe8161547d565b82525050565b61480d8161547d565b82525050565b600061481e826152e0565b6148288185615303565b9350614833836152d0565b8060005b8381101561486457815161484b88826147dd565b9750614856836152f6565b925050600181019050614837565b5085935050505092915050565b61487a8161548f565b82525050565b614889816154e0565b82525050565b600061489a826152eb565b6148a4818561531f565b93506148b48185602086016154f2565b6148bd816156fa565b840191505092915050565b60006148d560238361531f565b91506148e08261570b565b604082019050919050565b60006148f8602a8361531f565b91506149038261575a565b604082019050919050565b600061491b60468361531f565b9150614926826157a9565b606082019050919050565b600061493e60228361531f565b91506149498261581e565b604082019050919050565b600061496160228361531f565b915061496c8261586d565b604082019050919050565b6000614984601d8361531f565b915061498f826158bc565b602082019050919050565b60006149a7602a8361531f565b91506149b2826158e5565b604082019050919050565b60006149ca60268361531f565b91506149d582615934565b604082019050919050565b60006149ed60268361531f565b91506149f882615983565b604082019050919050565b6000614a10603a8361531f565b9150614a1b826159d2565b604082019050919050565b6000614a3360158361531f565b9150614a3e82615a21565b602082019050919050565b6000614a56601d8361531f565b9150614a6182615a4a565b602082019050919050565b6000614a7960258361531f565b9150614a8482615a73565b604082019050919050565b6000614a9c60158361531f565b9150614aa782615ac2565b602082019050919050565b6000614abf601f8361531f565b9150614aca82615aeb565b602082019050919050565b6000614ae260128361531f565b9150614aed82615b14565b602082019050919050565b6000614b0560158361531f565b9150614b1082615b3d565b602082019050919050565b6000614b2860158361531f565b9150614b3382615b66565b602082019050919050565b6000614b4b60218361531f565b9150614b5682615b8f565b604082019050919050565b6000614b6e60258361531f565b9150614b7982615bde565b604082019050919050565b6000614b91600083615314565b9150614b9c82615c2d565b600082019050919050565b6000614bb460248361531f565b9150614bbf82615c30565b604082019050919050565b6000614bd760278361531f565b9150614be282615c7f565b604082019050919050565b6000614bfa60258361531f565b9150614c0582615cce565b604082019050919050565b614c198161549b565b82525050565b614c28816154c9565b82525050565b614c37816154d3565b82525050565b6000614c4882614b84565b9150819050919050565b6000602082019050614c676000830184614804565b92915050565b6000604082019050614c826000830185614804565b614c8f6020830184614804565b9392505050565b600060c082019050614cab6000830189614804565b614cb86020830188614c1f565b614cc56040830187614880565b614cd26060830186614880565b614cdf6080830185614804565b614cec60a0830184614c1f565b979650505050505050565b6000602082019050614d0c6000830184614871565b92915050565b6000608082019050614d276000830187614871565b614d346020830186614871565b614d416040830185614c2e565b614d4e6060830184614c2e565b95945050505050565b60006020820190508181036000830152614d71818461488f565b905092915050565b60006020820190508181036000830152614d92816148c8565b9050919050565b60006020820190508181036000830152614db2816148eb565b9050919050565b60006020820190508181036000830152614dd28161490e565b9050919050565b60006020820190508181036000830152614df281614931565b9050919050565b60006020820190508181036000830152614e1281614954565b9050919050565b60006020820190508181036000830152614e3281614977565b9050919050565b60006020820190508181036000830152614e528161499a565b9050919050565b60006020820190508181036000830152614e72816149bd565b9050919050565b60006020820190508181036000830152614e92816149e0565b9050919050565b60006020820190508181036000830152614eb281614a03565b9050919050565b60006020820190508181036000830152614ed281614a26565b9050919050565b60006020820190508181036000830152614ef281614a49565b9050919050565b60006020820190508181036000830152614f1281614a6c565b9050919050565b60006020820190508181036000830152614f3281614a8f565b9050919050565b60006020820190508181036000830152614f5281614ab2565b9050919050565b60006020820190508181036000830152614f7281614ad5565b9050919050565b60006020820190508181036000830152614f9281614af8565b9050919050565b60006020820190508181036000830152614fb281614b1b565b9050919050565b60006020820190508181036000830152614fd281614b3e565b9050919050565b60006020820190508181036000830152614ff281614b61565b9050919050565b6000602082019050818103600083015261501281614ba7565b9050919050565b6000602082019050818103600083015261503281614bca565b9050919050565b6000602082019050818103600083015261505281614bed565b9050919050565b600060a08201905061506e6000830188614c10565b61507b6020830187614c10565b6150886040830186614c10565b6150956060830185614c10565b6150a26080830184614c10565b9695505050505050565b60006020820190506150c16000830184614c1f565b92915050565b600060a0820190506150dc6000830188614c1f565b6150e96020830187614880565b81810360408301526150fb8186614813565b905061510a6060830185614804565b6151176080830184614c1f565b9695505050505050565b60006060820190506151366000830186614c1f565b6151436020830185614c1f565b6151506040830184614871565b949350505050565b60006101208201905061516e600083018c614c1f565b61517b602083018b614c1f565b615188604083018a614c1f565b6151956060830189614c1f565b6151a26080830188614c2e565b6151af60a0830187614871565b6151bc60c0830186614871565b6151c960e0830185614871565b6151d7610100830184614871565b9a9950505050505050505050565b600060a0820190506151fa6000830188614c1f565b6152076020830187614c2e565b6152146040830186614c1f565b6152216060830185614871565b61522e6080830184614871565b9695505050505050565b600060208201905061524d6000830184614c2e565b92915050565b600061525d61526e565b90506152698282615557565b919050565b6000604051905090565b600067ffffffffffffffff821115615293576152926156b7565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156152bf576152be6156b7565b5b602082029050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600061533b8261549b565b91506153468361549b565b92508261ffff0382111561535d5761535c6155fb565b5b828201905092915050565b6000615373826154c9565b915061537e836154c9565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156153b3576153b26155fb565b5b828201905092915050565b60006153c9826154c9565b91506153d4836154c9565b9250826153e4576153e361562a565b5b828204905092915050565b60006153fa826154c9565b9150615405836154c9565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561543e5761543d6155fb565b5b828202905092915050565b6000615454826154c9565b915061545f836154c9565b925082821015615472576154716155fb565b5b828203905092915050565b6000615488826154a9565b9050919050565b60008115159050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60006154eb826154c9565b9050919050565b60005b838110156155105780820151818401526020810190506154f5565b8381111561551f576000848401525b50505050565b6000600282049050600182168061553d57607f821691505b6020821081141561555157615550615659565b5b50919050565b615560826156fa565b810181811067ffffffffffffffff8211171561557f5761557e6156b7565b5b80604052505050565b6000615593826154c9565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156155c6576155c56155fb565b5b600182019050919050565b60006155dc826154d3565b915060ff8214156155f0576155ef6155fb565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b7f526563697069656e74206d757374207761697420756e74696c20636f6f6c646f60008201527f776e206973206f76657200000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573732c207573652072656e6f756e63654f776e65727368697020467560208201527f6e6374696f6e0000000000000000000000000000000000000000000000000000604082015250565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b7f436f6f6c646f776e2074696d65206d7573742062652062656c6f7720636f6f6c60008201527f646f776e206c696d697400000000000000000000000000000000000000000000602082015250565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b7f544f4b454e3a20416d6f756e742065786365656473205472616e73616374696f60008201527f6e2073697a650000000000000000000000000000000000000000000000000000602082015250565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b7f596f7520617265206e6f7420746865206f776e65720000000000000000000000600082015250565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b7f4d6178205472616e73616374696f6e206d757374206265207365742061626f7660008201527f65202e3125000000000000000000000000000000000000000000000000000000602082015250565b7f5072652d4c61756e63682050726f74656374696f6e0000000000000000000000600082015250565b7f4d61782057616c6c6574206d757374206265207365742061626f766520312500600082015250565b7f426c61636b6c69737465642073656e6465720000000000000000000000000000600082015250565b7f426c61636b6c697374656420726563697069656e740000000000000000000000600082015250565b7f4c656e6774687320646f206e6f74206d617463682e0000000000000000000000600082015250565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b50565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f53656e646572206d757374207761697420756e74696c20636f6f6c646f776e2060008201527f6973206f76657200000000000000000000000000000000000000000000000000602082015250565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b615d268161547d565b8114615d3157600080fd5b50565b615d3d8161548f565b8114615d4857600080fd5b50565b615d548161549b565b8114615d5f57600080fd5b50565b615d6b816154c9565b8114615d7657600080fd5b50565b615d82816154d3565b8114615d8d57600080fd5b5056fea2646970667358221220358f203e0f3d59f4ce162bd8e30fa6f91becc6ac18a6a73f7ceb75b4eaced53064736f6c6343000807003300000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000009ced2f51b6b679105d8ae9d24ba83853a28018640000000000000000000000000eec3c2ad60fb500374b531c4864041387562749000000000000000000000000df16f734005668ca6b686c595fd7fe727fe29d7100000000000000000000000000000000000000000000000000000000000000084d6f6f6e4170657300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000084d6f6f6e41706573000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106102805760003560e01c806386a22eff1161014f578063bfa21d6a116100c1578063dc7703671161007a578063dc770367146109bd578063dd62ed3e146109ec578063ed2a50cd14610a29578063f2421d2c14610a52578063f2fde38b14610a81578063ff787dc614610aaa57610287565b8063bfa21d6a146108c1578063c3f4f54f146108ec578063ccd7213114610917578063d7c0103214610940578063dab84ee714610969578063db32e8f61461099457610287565b8063a457c2d711610113578063a457c2d714610797578063a8aa1b31146107d4578063a901dd92146107ff578063a9059cbb14610828578063b2c57fff14610865578063b40c82321461089857610287565b806386a22eff146106ad5780638da5cb5b146106d657806395d89b411461070157806395f93d481461072c5780639c8d83bb1461075a57610287565b806342966c68116101f3578063679ca6e9116101ac578063679ca6e91461059b5780636ebcf607146105c457806370a0823114610601578063715018a61461063e5780637303df9a1461065557806375e3661e1461068457610287565b806342966c68146104a1578063461a4450146104ca5780634c57f8d2146104f357806355fb28e41461051c5780635f7fcce914610545578063674a29cb1461056e57610287565b806323b872dd1161024557806323b872dd1461037d5780632af10fac146103ba5780632f54bf6e146103e5578063313ce56714610422578063364333f41461044d578063395093511461046457610287565b8062167e931461028c57806302ac8168146102bb57806306fdde03146102ea578063095ea7b31461031557806318160ddd1461035257610287565b3661028757005b600080fd5b34801561029857600080fd5b506102a1610ad3565b6040516102b2959493929190615059565b60405180910390f35b3480156102c757600080fd5b506102d0610b3d565b6040516102e19594939291906151e5565b60405180910390f35b3480156102f657600080fd5b506102ff610b88565b60405161030c9190614d57565b60405180910390f35b34801561032157600080fd5b5061033c600480360381019061033791906144b1565b610c1a565b6040516103499190614cf7565b60405180910390f35b34801561035e57600080fd5b50610367610c3d565b60405161037491906150ac565b60405180910390f35b34801561038957600080fd5b506103a4600480360381019061039f91906143a3565b610c47565b6040516103b19190614cf7565b60405180910390f35b3480156103c657600080fd5b506103cf610c76565b6040516103dc9190614c52565b60405180910390f35b3480156103f157600080fd5b5061040c600480360381019061040791906142b6565b610c9c565b6040516104199190614cf7565b60405180910390f35b34801561042e57600080fd5b50610437610cf6565b6040516104449190615238565b60405180910390f35b34801561045957600080fd5b50610462610cff565b005b34801561047057600080fd5b5061048b600480360381019061048691906144b1565b610d6e565b6040516104989190614cf7565b60405180910390f35b3480156104ad57600080fd5b506104c860048036038101906104c3919061467d565b610da5565b005b3480156104d657600080fd5b506104f160048036038101906104ec9190614596565b610dd4565b005b3480156104ff57600080fd5b5061051a600480360381019061051591906144f1565b610ed4565b005b34801561052857600080fd5b50610543600480360381019061053e9190614436565b610fd3565b005b34801561055157600080fd5b5061056c60048036038101906105679190614616565b61117e565b005b34801561057a57600080fd5b50610583611325565b60405161059293929190615121565b60405180910390f35b3480156105a757600080fd5b506105c260048036038101906105bd9190614569565b6113a8565b005b3480156105d057600080fd5b506105eb60048036038101906105e691906142b6565b611410565b6040516105f891906150ac565b60405180910390f35b34801561060d57600080fd5b50610628600480360381019061062391906142b6565b611428565b60405161063591906150ac565b60405180910390f35b34801561064a57600080fd5b50610653611470565b005b34801561066157600080fd5b5061066a611559565b60405161067b959493929190615059565b60405180910390f35b34801561069057600080fd5b506106ab60048036038101906106a691906142b6565b6115c3565b005b3480156106b957600080fd5b506106d460048036038101906106cf91906143f6565b611666565b005b3480156106e257600080fd5b506106eb611709565b6040516106f89190614c52565b60405180910390f35b34801561070d57600080fd5b5061071661172f565b6040516107239190614d57565b60405180910390f35b34801561073857600080fd5b506107416117c1565b6040516107519493929190614d12565b60405180910390f35b34801561076657600080fd5b50610781600480360381019061077c91906142b6565b611813565b60405161078e9190614cf7565b60405180910390f35b3480156107a357600080fd5b506107be60048036038101906107b991906144b1565b611833565b6040516107cb9190614cf7565b60405180910390f35b3480156107e057600080fd5b506107e96118aa565b6040516107f69190614c52565b60405180910390f35b34801561080b57600080fd5b5061082660048036038101906108219190614569565b6118d0565b005b34801561083457600080fd5b5061084f600480360381019061084a91906144b1565b611938565b60405161085c9190614cf7565b60405180910390f35b34801561087157600080fd5b5061087a61195b565b60405161088f99989796959493929190615158565b60405180910390f35b3480156108a457600080fd5b506108bf60048036038101906108ba9190614616565b6119d8565b005b3480156108cd57600080fd5b506108d6611b7f565b6040516108e39190614c52565b60405180910390f35b3480156108f857600080fd5b50610901611ba5565b60405161090e91906150ac565b60405180910390f35b34801561092357600080fd5b5061093e600480360381019061093991906146aa565b611baf565b005b34801561094c57600080fd5b5061096760048036038101906109629190614350565b611d67565b005b34801561097557600080fd5b5061097e611e77565b60405161098b9190614c52565b60405180910390f35b3480156109a057600080fd5b506109bb60048036038101906109b69190614616565b611e9d565b005b3480156109c957600080fd5b506109d2612044565b6040516109e3959493929190615059565b60405180910390f35b3480156109f857600080fd5b50610a136004803603810190610a0e9190614310565b6120ae565b604051610a2091906150ac565b60405180910390f35b348015610a3557600080fd5b50610a506004803603810190610a4b9190614750565b612135565b005b348015610a5e57600080fd5b50610a6761221c565b604051610a78959493929190615059565b60405180910390f35b348015610a8d57600080fd5b50610aa86004803603810190610aa391906142b6565b612286565b005b348015610ab657600080fd5b50610ad16004803603810190610acc91906145e9565b6124ae565b005b601a8060000160009054906101000a900461ffff16908060000160029054906101000a900461ffff16908060000160049054906101000a900461ffff16908060000160069054906101000a900461ffff16908060000160089054906101000a900461ffff16905085565b601c8060000154908060010160009054906101000a900460ff16908060020154908060030160009054906101000a900460ff16908060030160019054906101000a900460ff16905085565b606060038054610b9790615525565b80601f0160208091040260200160405190810160405280929190818152602001828054610bc390615525565b8015610c105780601f10610be557610100808354040283529160200191610c10565b820191906000526020600020905b815481529060010190602001808311610bf357829003601f168201915b5050505050905090565b600080610c25612541565b9050610c32818585612549565b600191505092915050565b6000600254905090565b600080610c52612541565b9050610c5f858285612714565b610c6a8585856127a0565b60019150509392505050565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16149050919050565b60006009905090565b6000479050610d4f81600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612eb190919063ffffffff16565b8060206001016000828254610d649190615368565b9250508190555050565b600080610d79612541565b9050610d9a818585610d8b85896120ae565b610d959190615368565b612549565b600191505092915050565b610db6610db0612541565b82612fa5565b610dbe610c3d565b601154610dcb9190615449565b60158190555050565b610ddd33610c9c565b610e1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1390614eb9565b60405180910390fd5b601760000160029054906101000a900460ff1660ff168160ff161115610e77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6e90614e39565b60405180910390fd5b80601760000160036101000a81548160ff021916908360ff16021790555082601760000160006101000a81548160ff02191690831515021790555081601760000160016101000a81548160ff021916908315150217905550505050565b8051825114610f18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0f90614f99565b60405180910390fd5b60005b82518160ff161015610fce57818160ff1681518110610f3d57610f3c615688565b5b6020026020010151610f55610f50612541565b611428565b1015610f6057600080fd5b610fbb610f6b612541565b848360ff1681518110610f8157610f80615688565b5b6020026020010151633b9aca00858560ff1681518110610fa457610fa3615688565b5b6020026020010151610fb691906153ef565b613173565b8080610fc6906155d1565b915050610f1b565b505050565b610fdc33610c9c565b61101b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101290614eb9565b60405180910390fd5b82600960008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555081600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555083600a60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050505050565b61118733610c9c565b6111c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111bd90614eb9565b60405180910390fd5b601b60000160089054906101000a900461ffff1661ffff16818385876111ec9190615330565b6111f69190615330565b6112009190615330565b61ffff16111561120f57600080fd5b6040518060a001604052808561ffff1681526020018261ffff1681526020018361ffff1681526020018461ffff168152602001828486886112509190615330565b61125a9190615330565b6112649190615330565b61ffff16815250601a60008201518160000160006101000a81548161ffff021916908361ffff16021790555060208201518160000160026101000a81548161ffff021916908361ffff16021790555060408201518160000160046101000a81548161ffff021916908361ffff16021790555060608201518160000160066101000a81548161ffff021916908361ffff16021790555060808201518160000160086101000a81548161ffff021916908361ffff16021790555090505050505050565b6000806000602660020160009054906101000a900460ff161561138a57633b9aca0060266000015461135791906153be565b9250633b9aca0060266001015461136e91906153be565b9150602660020160009054906101000a900460ff1690506113a3565b611392610c3d565b925061139c610c3d565b9150600090505b909192565b6113b133610c9c565b6113f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e790614eb9565b60405180910390fd5b80602660020160006101000a81548160ff02191690831515021790555050565b60006020528060005260406000206000915090505481565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61147933610c9c565b6114b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114af90614eb9565b60405180910390fd5b7fd1f66c3d2bc1993a86be5e3d33709d98f0442381befcedd29f578b9b2506b1ce60405160405180910390a1611515600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600080600080610fd3565b6000600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b601b8060000160009054906101000a900461ffff16908060000160029054906101000a900461ffff16908060000160049054906101000a900461ffff16908060000160069054906101000a900461ffff16908060000160089054906101000a900461ffff16905085565b6115cc33610c9c565b61160b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160290614eb9565b60405180910390fd5b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b61166f33610c9c565b6116ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a590614eb9565b60405180910390fd5b80600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60606004805461173e90615525565b80601f016020809104026020016040519081016040528092919081815260200182805461176a90615525565b80156117b75780601f1061178c576101008083540402835291602001916117b7565b820191906000526020600020905b81548152906001019060200180831161179a57829003601f168201915b5050505050905090565b60178060000160009054906101000a900460ff16908060000160019054906101000a900460ff16908060000160029054906101000a900460ff16908060000160039054906101000a900460ff16905084565b60056020528060005260406000206000915054906101000a900460ff1681565b60008061183e612541565b9050600061184c82866120ae565b905083811015611891576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188890615039565b60405180910390fd5b61189e8286868403612549565b60019250505092915050565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6118d933610c9c565b611918576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190f90614eb9565b60405180910390fd5b80602060040160046101000a81548160ff02191690831515021790555050565b600080611943612541565b90506119508185856127a0565b600191505092915050565b60208060000154908060010154908060020154908060030154908060040160009054906101000a900460ff16908060040160019054906101000a900460ff16908060040160029054906101000a900460ff16908060040160039054906101000a900460ff16908060040160049054906101000a900460ff16905089565b6119e133610c9c565b611a20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a1790614eb9565b60405180910390fd5b601b60000160089054906101000a900461ffff1661ffff1681838587611a469190615330565b611a509190615330565b611a5a9190615330565b61ffff161115611a6957600080fd5b6040518060a001604052808561ffff1681526020018261ffff1681526020018361ffff1681526020018461ffff16815260200182848688611aaa9190615330565b611ab49190615330565b611abe9190615330565b61ffff16815250601860008201518160000160006101000a81548161ffff021916908361ffff16021790555060208201518160000160026101000a81548161ffff021916908361ffff16021790555060408201518160000160046101000a81548161ffff021916908361ffff16021790555060608201518160000160066101000a81548161ffff021916908361ffff16021790555060808201518160000160086101000a81548161ffff021916908361ffff16021790555090505050505050565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000601554905090565b611bb833610c9c565b611bf7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bee90614eb9565b60405180910390fd5b8015611cb25760018310158015611c1057506103e88211155b611c4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4690614ef9565b60405180910390fd5b8183601154611c5e91906153ef565b611c6891906153be565b6026600001819055507fa53407ff336a78b145e1a297adce2a5d7a54e6c31d13b4e69e04aad80b07b44b602660000154604051611ca591906150ac565b60405180910390a1611d62565b60018310158015611cc4575060648211155b611d03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cfa90614f39565b60405180910390fd5b8183601154611d1291906153ef565b611d1c91906153be565b6026600101819055507f199db6b3f784dbaaa5df3981a282a84eb13409a543eaaeb8e8f309c467b45e18602660010154604051611d5991906150ac565b60405180910390a15b505050565b611d7033610c9c565b611daf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611da690614eb9565b60405180910390fd5b82600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611ea633610c9c565b611ee5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611edc90614eb9565b60405180910390fd5b601b60000160089054906101000a900461ffff1661ffff1681838587611f0b9190615330565b611f159190615330565b611f1f9190615330565b61ffff161115611f2e57600080fd5b6040518060a001604052808561ffff1681526020018261ffff1681526020018361ffff1681526020018461ffff16815260200182848688611f6f9190615330565b611f799190615330565b611f839190615330565b61ffff16815250601960008201518160000160006101000a81548161ffff021916908361ffff16021790555060208201518160000160026101000a81548161ffff021916908361ffff16021790555060408201518160000160046101000a81548161ffff021916908361ffff16021790555060608201518160000160066101000a81548161ffff021916908361ffff16021790555060808201518160000160086101000a81548161ffff021916908361ffff16021790555090505050505050565b60188060000160009054906101000a900461ffff16908060000160029054906101000a900461ffff16908060000160049054906101000a900461ffff16908060000160069054906101000a900461ffff16908060000160089054906101000a900461ffff16905085565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b61213e33610c9c565b61217d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161217490614eb9565b60405180910390fd5b85602060040160006101000a81548160ff021916908360ff16021790555083856011546121aa91906153ef565b6121b491906153be565b60206002018190555082602060040160046101000a81548160ff02191690831515021790555081602060040160036101000a81548160ff02191690831515021790555080602060040160026101000a81548160ff021916908315150217905550505050505050565b60198060000160009054906101000a900461ffff16908060000160029054906101000a900461ffff16908060000160049054906101000a900461ffff16908060000160069054906101000a900461ffff16908060000160089054906101000a900461ffff16905085565b61228f33610c9c565b6122ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122c590614eb9565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561233e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161233590614db9565b60405180910390fd5b7f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682604051612391929190614c6d565b60405180910390a160006123c6600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16611428565b905060006123f5600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16611428565b111561242957612428600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168383613173565b5b61245a600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600080600080610fd3565b61246982600180600180610fd3565b81600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6124b733610c9c565b6124f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124ed90614eb9565b60405180910390fd5b601b60000160089054906101000a900461ffff1661ffff168161ffff16111561251e57600080fd5b80601b60000160086101000a81548161ffff021916908361ffff16021790555050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156125b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125b090614ff9565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612629576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161262090614df9565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161270791906150ac565b60405180910390a3505050565b600061272084846120ae565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461279a578181101561278c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161278390614e19565b60405180910390fd5b6127998484848403612549565b5b50505050565b600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561282d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161282490614f59565b60405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156128ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128b190614f79565b60405180910390fd5b601c60030160009054906101000a900460ff1680156128e85750601c60030160019054906101000a900460ff165b156128f7576128f682613183565b5b61290183836131ff565b801561291c5750601c60030160009054906101000a900460ff165b80156129375750602660020160009054906101000a900460ff165b15612da657600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166129fe5760266000015481111580156129ba5750602660010154816129ad84611428565b6129b79190615368565b11155b6129f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129f090614e79565b60405180910390fd5b612a9e565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612a9d57602660000154811115612a9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a9390614e79565b60405180910390fd5b5b5b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16148015612b455750600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b8015612b605750601760000160009054906101000a900460ff165b15612c4f5742600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410612be6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bdd90614d99565b60405180910390fd5b601760000160039054906101000a900460ff1660ff1642612c079190615368565b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612da5565b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16158015612cb85750601760000160019054906101000a900460ff165b15612da45742600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115612d3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d3690615019565b60405180910390fd5b601760000160039054906101000a900460ff1660ff1642612d609190615368565b600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b5b5b601c60030160009054906101000a900460ff16612e6757612dc683610c9c565b612e05576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dfc90614f19565b60405180910390fd5b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612e6657612e65600261339d565b5b5b612e6f613430565b15612e7d57612e7c61350d565b5b6000612e888461377a565b612e925781612e9e565b612e9d8484846137ec565b5b9050612eab848483613173565b50505050565b80471015612ef4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612eeb90614ed9565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff1682604051612f1a90614c3d565b60006040518083038185875af1925050503d8060008114612f57576040519150601f19603f3d011682016040523d82523d6000602084013e612f5c565b606091505b5050905080612fa0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f9790614e99565b60405180910390fd5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613015576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161300c90614fb9565b60405180910390fd5b61302182600083613b73565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156130a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161309e90614dd9565b60405180910390fd5b8181036000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600260008282540392505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161315a91906150ac565b60405180910390a361316e83600084613b78565b505050565b61317e838383613b7d565b505050565b43601c60010160009054906101000a900460ff1660ff16601c600001546131aa9190615368565b116131bc576131b7613df5565b6131c8565b6131c7816001613e15565b5b601c60030160019054906101000a900460ff16156131fc57601c60020160008154809291906131f690615588565b91905055505b50565b600061320a83610c9c565b15801561321d575061321b82610c9c565b155b80156132775750600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614155b80156132cd5750600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b80156133235750600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b801561335d575061dead73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b801561339557503073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b905092915050565b6001601c60030160006101000a81548160ff02191690831515021790555043601c6000018190555080601c60010160006101000a81548160ff021916908360ff1602179055506001601c60030160016101000a81548160ff0219169083151502179055507fba61a96074b3d636edeee92caddc86293c917d5b6818b7d3698bb52e02ec86c860405160405180910390a150565b6000600b600061343e612541565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161580156134a35750602060040160019054906101000a900460ff16155b80156134be5750602060040160039054906101000a900460ff165b80156134ef5750602060040160009054906101000a900460ff1660ff166020600301546134eb9190615368565b4210155b8015613508575060206002015461350530611428565b10155b905090565b6001602060040160016101000a81548160ff021916908315150217905550426020600301819055506020600201546020600001541015801561355e5750602060040160029054906101000a900460ff165b1561366c576000600260206000015461357791906153be565b905061358281613ec2565b6000479050602560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d719823085600080600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16426040518863ffffffff1660e01b815260040161361096959493929190614c96565b6060604051808303818588803b15801561362957600080fd5b505af115801561363d573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061366291906146fd565b505050505061375a565b61367a602060020154613ec2565b60004790506000601960000160089054906101000a900461ffff16601860000160089054906101000a900461ffff166136b39190615330565b61ffff16601960000160069054906101000a900461ffff16601860000160069054906101000a900461ffff166136e99190615330565b61ffff16836136f891906153ef565b61370291906153be565b905061374f81600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612eb190919063ffffffff16565b613757610cff565b50505b6000602060040160016101000a81548160ff021916908315150217905550565b6000602060040160049054906101000a900460ff1680156137e55750600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b9050919050565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561384857819050613b6c565b600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156138bd57601960000160089054906101000a900461ffff1661ffff16601281905550613952565b600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561393257601860000160089054906101000a900461ffff1661ffff16601281905550613951565b601a60000160089054906101000a900461ffff1661ffff166012819055505b5b6016546012548361396391906153ef565b61396d91906153be565b601381905550601960000160089054906101000a900461ffff16601860000160089054906101000a900461ffff166139a59190615330565b61ffff16601960000160029054906101000a900461ffff16601860000160029054906101000a900461ffff166139db9190615330565b61ffff166013546139ec91906153ef565b6139f691906153be565b60148190555060006014541115613a4a57613a1384601454612fa5565b60145460156000828254613a279190615368565b9250508190555060145460136000828254613a429190615449565b925050819055505b602060040160029054906101000a900460ff1615613b4157601960000160009054906101000a900461ffff16601860000160009054906101000a900461ffff16613a949190615330565b61ffff16601960000160089054906101000a900461ffff16601860000160089054906101000a900461ffff16613aca9190615330565b61ffff16601960000160009054906101000a900461ffff16601860000160009054906101000a900461ffff16613b009190615330565b61ffff16601354613b1191906153ef565b613b1b91906153be565b613b259190615368565b60206000016000828254613b399190615368565b925050819055505b613b4e8430601354613173565b601454601354613b5e9190615368565b82613b699190615449565b90505b9392505050565b505050565b505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613bed576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613be490614fd9565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613c5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613c5490614d79565b60405180910390fd5b613c68838383613b73565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015613cee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613ce590614e59565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051613ddc91906150ac565b60405180910390a3613def848484613b78565b50505050565b6000601c60030160016101000a81548160ff021916908315150217905550565b600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16613ebe5780600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b5050565b6000600267ffffffffffffffff811115613edf57613ede6156b7565b5b604051908082528060200260200182016040528015613f0d5781602001602082028036833780820191505090505b5090503081600081518110613f2557613f24615688565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050602560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015613fc757600080fd5b505afa158015613fdb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613fff91906142e3565b8160018151811061401357614012615688565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050602560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b81526004016140b19594939291906150c7565b600060405180830381600087803b1580156140cb57600080fd5b505af11580156140df573d6000803e3d6000fd5b505050505050565b60006140fa6140f584615278565b615253565b9050808382526020820190508285602086028201111561411d5761411c6156eb565b5b60005b8581101561414d578161413388826141c7565b845260208401935060208301925050600181019050614120565b5050509392505050565b600061416a614165846152a4565b615253565b9050808382526020820190508285602086028201111561418d5761418c6156eb565b5b60005b858110156141bd57816141a38882614277565b845260208401935060208301925050600181019050614190565b5050509392505050565b6000813590506141d681615d1d565b92915050565b6000815190506141eb81615d1d565b92915050565b600082601f830112614206576142056156e6565b5b81356142168482602086016140e7565b91505092915050565b600082601f830112614234576142336156e6565b5b8135614244848260208601614157565b91505092915050565b60008135905061425c81615d34565b92915050565b60008135905061427181615d4b565b92915050565b60008135905061428681615d62565b92915050565b60008151905061429b81615d62565b92915050565b6000813590506142b081615d79565b92915050565b6000602082840312156142cc576142cb6156f5565b5b60006142da848285016141c7565b91505092915050565b6000602082840312156142f9576142f86156f5565b5b6000614307848285016141dc565b91505092915050565b60008060408385031215614327576143266156f5565b5b6000614335858286016141c7565b9250506020614346858286016141c7565b9150509250929050565b600080600060608486031215614369576143686156f5565b5b6000614377868287016141c7565b9350506020614388868287016141c7565b9250506040614399868287016141c7565b9150509250925092565b6000806000606084860312156143bc576143bb6156f5565b5b60006143ca868287016141c7565b93505060206143db868287016141c7565b92505060406143ec86828701614277565b9150509250925092565b6000806040838503121561440d5761440c6156f5565b5b600061441b858286016141c7565b925050602061442c8582860161424d565b9150509250929050565b600080600080600060a08688031215614452576144516156f5565b5b6000614460888289016141c7565b95505060206144718882890161424d565b94505060406144828882890161424d565b93505060606144938882890161424d565b92505060806144a48882890161424d565b9150509295509295909350565b600080604083850312156144c8576144c76156f5565b5b60006144d6858286016141c7565b92505060206144e785828601614277565b9150509250929050565b60008060408385031215614508576145076156f5565b5b600083013567ffffffffffffffff811115614526576145256156f0565b5b614532858286016141f1565b925050602083013567ffffffffffffffff811115614553576145526156f0565b5b61455f8582860161421f565b9150509250929050565b60006020828403121561457f5761457e6156f5565b5b600061458d8482850161424d565b91505092915050565b6000806000606084860312156145af576145ae6156f5565b5b60006145bd8682870161424d565b93505060206145ce8682870161424d565b92505060406145df868287016142a1565b9150509250925092565b6000602082840312156145ff576145fe6156f5565b5b600061460d84828501614262565b91505092915050565b600080600080608085870312156146305761462f6156f5565b5b600061463e87828801614262565b945050602061464f87828801614262565b935050604061466087828801614262565b925050606061467187828801614262565b91505092959194509250565b600060208284031215614693576146926156f5565b5b60006146a184828501614277565b91505092915050565b6000806000606084860312156146c3576146c26156f5565b5b60006146d186828701614277565b93505060206146e286828701614277565b92505060406146f38682870161424d565b9150509250925092565b600080600060608486031215614716576147156156f5565b5b60006147248682870161428c565b93505060206147358682870161428c565b92505060406147468682870161428c565b9150509250925092565b60008060008060008060c0878903121561476d5761476c6156f5565b5b600061477b89828a016142a1565b965050602061478c89828a01614277565b955050604061479d89828a01614277565b94505060606147ae89828a0161424d565b93505060806147bf89828a0161424d565b92505060a06147d089828a0161424d565b9150509295509295509295565b60006147e983836147f5565b60208301905092915050565b6147fe8161547d565b82525050565b61480d8161547d565b82525050565b600061481e826152e0565b6148288185615303565b9350614833836152d0565b8060005b8381101561486457815161484b88826147dd565b9750614856836152f6565b925050600181019050614837565b5085935050505092915050565b61487a8161548f565b82525050565b614889816154e0565b82525050565b600061489a826152eb565b6148a4818561531f565b93506148b48185602086016154f2565b6148bd816156fa565b840191505092915050565b60006148d560238361531f565b91506148e08261570b565b604082019050919050565b60006148f8602a8361531f565b91506149038261575a565b604082019050919050565b600061491b60468361531f565b9150614926826157a9565b606082019050919050565b600061493e60228361531f565b91506149498261581e565b604082019050919050565b600061496160228361531f565b915061496c8261586d565b604082019050919050565b6000614984601d8361531f565b915061498f826158bc565b602082019050919050565b60006149a7602a8361531f565b91506149b2826158e5565b604082019050919050565b60006149ca60268361531f565b91506149d582615934565b604082019050919050565b60006149ed60268361531f565b91506149f882615983565b604082019050919050565b6000614a10603a8361531f565b9150614a1b826159d2565b604082019050919050565b6000614a3360158361531f565b9150614a3e82615a21565b602082019050919050565b6000614a56601d8361531f565b9150614a6182615a4a565b602082019050919050565b6000614a7960258361531f565b9150614a8482615a73565b604082019050919050565b6000614a9c60158361531f565b9150614aa782615ac2565b602082019050919050565b6000614abf601f8361531f565b9150614aca82615aeb565b602082019050919050565b6000614ae260128361531f565b9150614aed82615b14565b602082019050919050565b6000614b0560158361531f565b9150614b1082615b3d565b602082019050919050565b6000614b2860158361531f565b9150614b3382615b66565b602082019050919050565b6000614b4b60218361531f565b9150614b5682615b8f565b604082019050919050565b6000614b6e60258361531f565b9150614b7982615bde565b604082019050919050565b6000614b91600083615314565b9150614b9c82615c2d565b600082019050919050565b6000614bb460248361531f565b9150614bbf82615c30565b604082019050919050565b6000614bd760278361531f565b9150614be282615c7f565b604082019050919050565b6000614bfa60258361531f565b9150614c0582615cce565b604082019050919050565b614c198161549b565b82525050565b614c28816154c9565b82525050565b614c37816154d3565b82525050565b6000614c4882614b84565b9150819050919050565b6000602082019050614c676000830184614804565b92915050565b6000604082019050614c826000830185614804565b614c8f6020830184614804565b9392505050565b600060c082019050614cab6000830189614804565b614cb86020830188614c1f565b614cc56040830187614880565b614cd26060830186614880565b614cdf6080830185614804565b614cec60a0830184614c1f565b979650505050505050565b6000602082019050614d0c6000830184614871565b92915050565b6000608082019050614d276000830187614871565b614d346020830186614871565b614d416040830185614c2e565b614d4e6060830184614c2e565b95945050505050565b60006020820190508181036000830152614d71818461488f565b905092915050565b60006020820190508181036000830152614d92816148c8565b9050919050565b60006020820190508181036000830152614db2816148eb565b9050919050565b60006020820190508181036000830152614dd28161490e565b9050919050565b60006020820190508181036000830152614df281614931565b9050919050565b60006020820190508181036000830152614e1281614954565b9050919050565b60006020820190508181036000830152614e3281614977565b9050919050565b60006020820190508181036000830152614e528161499a565b9050919050565b60006020820190508181036000830152614e72816149bd565b9050919050565b60006020820190508181036000830152614e92816149e0565b9050919050565b60006020820190508181036000830152614eb281614a03565b9050919050565b60006020820190508181036000830152614ed281614a26565b9050919050565b60006020820190508181036000830152614ef281614a49565b9050919050565b60006020820190508181036000830152614f1281614a6c565b9050919050565b60006020820190508181036000830152614f3281614a8f565b9050919050565b60006020820190508181036000830152614f5281614ab2565b9050919050565b60006020820190508181036000830152614f7281614ad5565b9050919050565b60006020820190508181036000830152614f9281614af8565b9050919050565b60006020820190508181036000830152614fb281614b1b565b9050919050565b60006020820190508181036000830152614fd281614b3e565b9050919050565b60006020820190508181036000830152614ff281614b61565b9050919050565b6000602082019050818103600083015261501281614ba7565b9050919050565b6000602082019050818103600083015261503281614bca565b9050919050565b6000602082019050818103600083015261505281614bed565b9050919050565b600060a08201905061506e6000830188614c10565b61507b6020830187614c10565b6150886040830186614c10565b6150956060830185614c10565b6150a26080830184614c10565b9695505050505050565b60006020820190506150c16000830184614c1f565b92915050565b600060a0820190506150dc6000830188614c1f565b6150e96020830187614880565b81810360408301526150fb8186614813565b905061510a6060830185614804565b6151176080830184614c1f565b9695505050505050565b60006060820190506151366000830186614c1f565b6151436020830185614c1f565b6151506040830184614871565b949350505050565b60006101208201905061516e600083018c614c1f565b61517b602083018b614c1f565b615188604083018a614c1f565b6151956060830189614c1f565b6151a26080830188614c2e565b6151af60a0830187614871565b6151bc60c0830186614871565b6151c960e0830185614871565b6151d7610100830184614871565b9a9950505050505050505050565b600060a0820190506151fa6000830188614c1f565b6152076020830187614c2e565b6152146040830186614c1f565b6152216060830185614871565b61522e6080830184614871565b9695505050505050565b600060208201905061524d6000830184614c2e565b92915050565b600061525d61526e565b90506152698282615557565b919050565b6000604051905090565b600067ffffffffffffffff821115615293576152926156b7565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156152bf576152be6156b7565b5b602082029050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600061533b8261549b565b91506153468361549b565b92508261ffff0382111561535d5761535c6155fb565b5b828201905092915050565b6000615373826154c9565b915061537e836154c9565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156153b3576153b26155fb565b5b828201905092915050565b60006153c9826154c9565b91506153d4836154c9565b9250826153e4576153e361562a565b5b828204905092915050565b60006153fa826154c9565b9150615405836154c9565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561543e5761543d6155fb565b5b828202905092915050565b6000615454826154c9565b915061545f836154c9565b925082821015615472576154716155fb565b5b828203905092915050565b6000615488826154a9565b9050919050565b60008115159050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60006154eb826154c9565b9050919050565b60005b838110156155105780820151818401526020810190506154f5565b8381111561551f576000848401525b50505050565b6000600282049050600182168061553d57607f821691505b6020821081141561555157615550615659565b5b50919050565b615560826156fa565b810181811067ffffffffffffffff8211171561557f5761557e6156b7565b5b80604052505050565b6000615593826154c9565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156155c6576155c56155fb565b5b600182019050919050565b60006155dc826154d3565b915060ff8214156155f0576155ef6155fb565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b7f526563697069656e74206d757374207761697420756e74696c20636f6f6c646f60008201527f776e206973206f76657200000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573732c207573652072656e6f756e63654f776e65727368697020467560208201527f6e6374696f6e0000000000000000000000000000000000000000000000000000604082015250565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b7f436f6f6c646f776e2074696d65206d7573742062652062656c6f7720636f6f6c60008201527f646f776e206c696d697400000000000000000000000000000000000000000000602082015250565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b7f544f4b454e3a20416d6f756e742065786365656473205472616e73616374696f60008201527f6e2073697a650000000000000000000000000000000000000000000000000000602082015250565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b7f596f7520617265206e6f7420746865206f776e65720000000000000000000000600082015250565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b7f4d6178205472616e73616374696f6e206d757374206265207365742061626f7660008201527f65202e3125000000000000000000000000000000000000000000000000000000602082015250565b7f5072652d4c61756e63682050726f74656374696f6e0000000000000000000000600082015250565b7f4d61782057616c6c6574206d757374206265207365742061626f766520312500600082015250565b7f426c61636b6c69737465642073656e6465720000000000000000000000000000600082015250565b7f426c61636b6c697374656420726563697069656e740000000000000000000000600082015250565b7f4c656e6774687320646f206e6f74206d617463682e0000000000000000000000600082015250565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b50565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f53656e646572206d757374207761697420756e74696c20636f6f6c646f776e2060008201527f6973206f76657200000000000000000000000000000000000000000000000000602082015250565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b615d268161547d565b8114615d3157600080fd5b50565b615d3d8161548f565b8114615d4857600080fd5b50565b615d548161549b565b8114615d5f57600080fd5b50565b615d6b816154c9565b8114615d7657600080fd5b50565b615d82816154d3565b8114615d8d57600080fd5b5056fea2646970667358221220358f203e0f3d59f4ce162bd8e30fa6f91becc6ac18a6a73f7ceb75b4eaced53064736f6c63430008070033

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

00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000009ced2f51b6b679105d8ae9d24ba83853a28018640000000000000000000000000eec3c2ad60fb500374b531c4864041387562749000000000000000000000000df16f734005668ca6b686c595fd7fe727fe29d7100000000000000000000000000000000000000000000000000000000000000084d6f6f6e4170657300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000084d6f6f6e41706573000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : name (string): MoonApes
Arg [1] : symbol (string): MoonApes
Arg [2] : liquidity (address): 0x9CeD2f51b6b679105d8AE9D24BA83853a2801864
Arg [3] : dev (address): 0x0Eec3C2AD60fb500374b531C4864041387562749
Arg [4] : treasury (address): 0xdf16f734005668CA6B686c595fD7fE727fe29d71

-----Encoded View---------------
9 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [2] : 0000000000000000000000009ced2f51b6b679105d8ae9d24ba83853a2801864
Arg [3] : 0000000000000000000000000eec3c2ad60fb500374b531c4864041387562749
Arg [4] : 000000000000000000000000df16f734005668ca6b686c595fd7fe727fe29d71
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000008
Arg [6] : 4d6f6f6e41706573000000000000000000000000000000000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000008
Arg [8] : 4d6f6f6e41706573000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

38432:18065:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40266:25;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;:::i;:::-;;;;;;;;40325:21;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;:::i;:::-;;;;;;;;19416:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21767:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20536:108;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22548:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38911:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55616:103;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54856:92;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44272:204;;;;;;;;;;;;;:::i;:::-;;23252:238;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55727:139;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44484:346;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55874:376;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44838:327;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47920:481;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54956:524;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;45400:121;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18694:44;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20707:127;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43368:178;;;;;;;;;;;;;:::i;:::-;;40298:20;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;:::i;:::-;;;;;;;;49202:101;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45990:107;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38848:20;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19635:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40175:29;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;38540:38;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23993:436;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38994:19;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47310:117;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21040:193;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40353:43;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;46827:471;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38952:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55488:120;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46105:658;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45173:219;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38875:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47435:473;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40211:20;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;:::i;:::-;;;;;;;;21296:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45529:453;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40238:21;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;:::i;:::-;;;;;;;;43701:506;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48409:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40266:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;40325:21::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;19416:100::-;19470:13;19503:5;19496:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19416:100;:::o;21767:201::-;21850:4;21867:13;21883:12;:10;:12::i;:::-;21867:28;;21906:32;21915:5;21922:7;21931:6;21906:8;:32::i;:::-;21956:4;21949:11;;;21767:201;;;;:::o;20536:108::-;20597:7;20624:12;;20617:19;;20536:108;:::o;22548:295::-;22679:4;22696:15;22714:12;:10;:12::i;:::-;22696:30;;22737:38;22753:4;22759:7;22768:6;22737:15;:38::i;:::-;22786:27;22796:4;22802:2;22806:6;22786:9;:27::i;:::-;22831:4;22824:11;;;22548:295;;;;;:::o;38911:34::-;;;;;;;;;;;;;:::o;55616:103::-;55671:4;55706:5;;;;;;;;;;;55695:16;;:7;:16;;;55688:23;;55616:103;;;:::o;54856:92::-;54914:5;54939:1;54932:8;;54856:92;:::o;44272:204::-;44319:15;44337:21;44319:39;;44369:47;44408:7;44377:19;;;;;;;;;;;44369:38;;;;:47;;;;:::i;:::-;44461:7;44427:17;:30;;;:41;;;;;;;:::i;:::-;;;;;;;;44308:168;44272:204::o;23252:238::-;23340:4;23357:13;23373:12;:10;:12::i;:::-;23357:28;;23396:64;23405:5;23412:7;23449:10;23421:25;23431:5;23438:7;23421:9;:25::i;:::-;:38;;;;:::i;:::-;23396:8;:64::i;:::-;23478:4;23471:11;;;23252:238;;;;:::o;55727:139::-;55777:27;55783:12;:10;:12::i;:::-;55797:6;55777:5;:27::i;:::-;55845:13;:11;:13::i;:::-;55830:12;;:28;;;;:::i;:::-;55815:12;:43;;;;55727:139;:::o;44484:346::-;40522:19;40530:10;40522:7;:19::i;:::-;40514:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;44603:12:::1;:26;;;;;;;;;;;;44590:39;;:9;:39;;;;44582:94;;;;;;;;;;;;:::i;:::-;;;;;;;;;44715:9;44687:12;:25;;;:37;;;;;;;;;;;;;;;;;;44769:3;44735:12;:31;;;:37;;;;;;;;;;;;;;;;;;44818:4;44783:12;:32;;;:39;;;;;;;;;;;;;;;;;;44484:346:::0;;;:::o;55874:376::-;55999:7;:14;55979:9;:16;:34;55971:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56055:7;56050:193;56072:9;:16;56068:1;:20;;;56050:193;;;56145:7;56153:1;56145:10;;;;;;;;;;:::i;:::-;;;;;;;;56118:23;56128:12;:10;:12::i;:::-;56118:9;:23::i;:::-;:37;;56110:46;;;;;;56171:60;56186:12;:10;:12::i;:::-;56200:9;56210:1;56200:12;;;;;;;;;;:::i;:::-;;;;;;;;56225:5;56214:7;56222:1;56214:10;;;;;;;;;;:::i;:::-;;;;;;;;:16;;;;:::i;:::-;56171:14;:60::i;:::-;56090:3;;;;;:::i;:::-;;;;56050:193;;;;55874:376;;:::o;44838:327::-;40522:19;40530:10;40522:7;:19::i;:::-;40514:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;45009:15:::1;44981:17;:25;44999:6;44981:25;;;;;;;;;;;;;;;;:43;;;;;;;;;;;;;;;;;;45062:14;45035:16;:24;45052:6;45035:24;;;;;;;;;;;;;;;;:41;;;;;;;;;;;;;;;;;;45106:9;45087:8;:16;45096:6;45087:16;;;;;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;45148:9;45126:11;:19;45138:6;45126:19;;;;;;;;;;;;;;;;:31;;;;;;;;;;;;;;;;;;44838:327:::0;;;;;:::o;47920:481::-;40522:19;40530:10;40522:7;:19::i;:::-;40514:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;48114:7:::1;:16;;;;;;;;;;;;48061:69;;48102:8;48087:12;48077:7;48061:13;:23;;;;:::i;:::-;:38;;;;:::i;:::-;:49;;;;:::i;:::-;:69;;;;48053:78;;;::::0;::::1;;48157:236;;;;;;;;48192:13;48157:236;;;;;;48299:8;48157:236;;;;;;48263:12;48157:236;;;;;;48228:7;48157:236;;;;;;48373:8;48358:12;48348:7;48332:13;:23;;;;:::i;:::-;:38;;;;:::i;:::-;:49;;;;:::i;:::-;48157:236;;;;::::0;48142:12:::1;:251;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47920:481:::0;;;;:::o;54956:524::-;55011:19;55032:14;55048:22;55085:19;:28;;;;;;;;;;;;55082:391;;;55180:5;55146:19;:31;;;:39;;;;:::i;:::-;55129:56;;55250:5;55212:19;:35;;;:43;;;;:::i;:::-;55200:55;;55290:19;:28;;;;;;;;;;;;55270:48;;55082:391;;;55368:13;:11;:13::i;:::-;55351:30;;55408:13;:11;:13::i;:::-;55396:25;;55456:5;55436:25;;55082:391;54956:524;;;:::o;45400:121::-;40522:19;40530:10;40522:7;:19::i;:::-;40514:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;45505:8:::1;45474:19;:28;;;:39;;;;;;;;;;;;;;;;;;45400:121:::0;:::o;18694:44::-;;;;;;;;;;;;;;;;;:::o;20707:127::-;20781:7;20808:9;:18;20818:7;20808:18;;;;;;;;;;;;;;;;20801:25;;20707:127;;;:::o;43368:178::-;40522:19;40530:10;40522:7;:19::i;:::-;40514:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;43430:20:::1;;;;;;;;;;43461:48;43475:5;;;;;;;;;;;43482;43489::::0;43496::::1;43503::::0;43461:13:::1;:48::i;:::-;43536:1;43520:5;;:18;;;;;;;;;;;;;;;;;;43368:178::o:0;40298:20::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;49202:101::-;40522:19;40530:10;40522:7;:19::i;:::-;40514:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;49290:5:::1;49272:6;:15;49279:7;49272:15;;;;;;;;;;;;;;;;:23;;;;;;;;;;;;;;;;;;49202:101:::0;:::o;45990:107::-;40522:19;40530:10;40522:7;:19::i;:::-;40514:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;46082:7:::1;46067:6;:12;46074:4;46067:12;;;;;;;;;;;;;;;;:22;;;;;;;;;;;;;;;;;;45990:107:::0;;:::o;38848:20::-;;;;;;;;;;;;;:::o;19635:104::-;19691:13;19724:7;19717:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19635:104;:::o;40175:29::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;38540:38::-;;;;;;;;;;;;;;;;;;;;;;:::o;23993:436::-;24086:4;24103:13;24119:12;:10;:12::i;:::-;24103:28;;24142:24;24169:25;24179:5;24186:7;24169:9;:25::i;:::-;24142:52;;24233:15;24213:16;:35;;24205:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;24326:60;24335:5;24342:7;24370:15;24351:16;:34;24326:8;:60::i;:::-;24417:4;24410:11;;;;23993:436;;;;:::o;38994:19::-;;;;;;;;;;;;;:::o;47310:117::-;40522:19;40530:10;40522:7;:19::i;:::-;40514:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;47412:7:::1;47380:17;:29;;;:39;;;;;;;;;;;;;;;;;;47310:117:::0;:::o;21040:193::-;21119:4;21136:13;21152:12;:10;:12::i;:::-;21136:28;;21175;21185:5;21192:2;21196:6;21175:9;:28::i;:::-;21221:4;21214:11;;;21040:193;;;;:::o;40353:43::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;46827:471::-;40522:19;40530:10;40522:7;:19::i;:::-;40514:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;47016:7:::1;:16;;;;;;;;;;;;46963:69;;47004:8;46989:12;46979:7;46963:13;:23;;;;:::i;:::-;:38;;;;:::i;:::-;:49;;;;:::i;:::-;:69;;;;46955:78;;;::::0;::::1;;47054:236;;;;;;;;47089:13;47054:236;;;;;;47196:8;47054:236;;;;;;47160:12;47054:236;;;;;;47125:7;47054:236;;;;;;47270:8;47255:12;47245:7;47229:13;:23;;;;:::i;:::-;:38;;;;:::i;:::-;:49;;;;:::i;:::-;47054:236;;;;::::0;47044:7:::1;:246;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46827:471:::0;;;;:::o;38952:35::-;;;;;;;;;;;;;:::o;55488:120::-;55538:21;55588:12;;55572:28;;55488:120;:::o;46105:658::-;40522:19;40530:10;40522:7;:19::i;:::-;40514:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;46216:10:::1;46213:543;;;46261:1;46250:7;:12;;:31;;;;;46277:4;46266:7;:15;;46250:31;46242:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;46400:7;46388;46373:12;;:22;;;;:::i;:::-;46372:36;;;;:::i;:::-;46338:19;:31;;:70;;;;46428:47;46443:19;:31;;;46428:47;;;;;;:::i;:::-;;;;;;;;46213:543;;;46527:1;46516:7;:12;;:30;;;;;46543:3;46532:7;:14;;46516:30;46508:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;46662:7;46651;46636:12;;:22;;;;:::i;:::-;46635:34;;;;:::i;:::-;46597:19;:35;;:72;;;;46689:55;46708:19;:35;;;46689:55;;;;;;:::i;:::-;;;;;;;;46213:543;46105:658:::0;;;:::o;45173:219::-;40522:19;40530:10;40522:7;:19::i;:::-;40514:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;45303:9:::1;45280:20;;:32;;;;;;;;;;;;;;;;;;45345:8;45323:19;;:30;;;;;;;;;;;;;;;;;;45381:3;45364:14;;:20;;;;;;;;;;;;;;;;;;45173:219:::0;;;:::o;38875:29::-;;;;;;;;;;;;;:::o;47435:473::-;40522:19;40530:10;40522:7;:19::i;:::-;40514:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;47625:7:::1;:16;;;;;;;;;;;;47572:69;;47613:8;47598:12;47588:7;47572:13;:23;;;;:::i;:::-;:38;;;;:::i;:::-;:49;;;;:::i;:::-;:69;;;;47564:78;;;::::0;::::1;;47664:236;;;;;;;;47699:13;47664:236;;;;;;47806:8;47664:236;;;;;;47770:12;47664:236;;;;;;47735:7;47664:236;;;;;;47880:8;47865:12;47855:7;47839:13;:23;;;;:::i;:::-;:38;;;;:::i;:::-;:49;;;;:::i;:::-;47664:236;;;;::::0;47653:8:::1;:247;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47435:473:::0;;;;:::o;40211:20::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;21296:151::-;21385:7;21412:11;:18;21424:5;21412:18;;;;;;;;;;;;;;;:27;21431:7;21412:27;;;;;;;;;;;;;;;;21405:34;;21296:151;;;;:::o;45529:453::-;40522:19;40530:10;40522:7;:19::i;:::-;40514:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;45722:13:::1;45689:17;:30;;;:46;;;;;;;;;;;;;;;;;;45812:10;45798;45783:12;;:25;;;;:::i;:::-;45782:40;;;;:::i;:::-;45746:17;:33;;:76;;;;45865:4;45833:17;:29;;;:36;;;;;;;;;;;;;;;;;;45912:5;45880:17;:29;;;:37;;;;;;;;;;;;;;;;;;45967:7;45928:17;:36;;;:46;;;;;;;;;;;;;;;;;;45529:453:::0;;;;;;:::o;40238:21::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;43701:506::-;40522:19;40530:10;40522:7;:19::i;:::-;40514:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;43802:1:::1;43782:22;;:8;:22;;;;43774:105;;;;;;;;;;;;:::i;:::-;;;;;;;;;43895:37;43916:5;;;;;;;;;;;43923:8;43895:37;;;;;;;:::i;:::-;;;;;;;;43943:15;43961:16;43971:5;;;;;;;;;;;43961:9;:16::i;:::-;43943:34;;44010:1;43991:16;44001:5;;;;;;;;;;;43991:9;:16::i;:::-;:20;43988:65;;;44013:40;44028:5;;;;;;;;;;;44035:8;44045:7;44013:14;:40::i;:::-;43988:65;44064:48;44078:5;;;;;;;;;;;44085;44092::::0;44099::::1;44106::::0;44064:13:::1;:48::i;:::-;44123:47;44137:8;44147:4;44153::::0;44159::::1;44165::::0;44123:13:::1;:47::i;:::-;44191:8;44183:5;;:16;;;;;;;;;;;;;;;;;;43763:444;43701:506:::0;:::o;48409:155::-;40522:19;40530:10;40522:7;:19::i;:::-;40514:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;48500:7:::1;:16;;;;;;;;;;;;48487:29;;:9;:29;;;;48479:38;;;::::0;::::1;;48547:9;48528:7;:16;;;:28;;;;;;;;;;;;;;;;;;48409:155:::0;:::o;105:107::-;150:15;193:10;178:26;;105:107;:::o;28020:380::-;28173:1;28156:19;;:5;:19;;;;28148:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;28254:1;28235:21;;:7;:21;;;;28227:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;28338:6;28308:11;:18;28320:5;28308:18;;;;;;;;;;;;;;;:27;28327:7;28308:27;;;;;;;;;;;;;;;:36;;;;28376:7;28360:32;;28369:5;28360:32;;;28385:6;28360:32;;;;;;:::i;:::-;;;;;;;;28020:380;;;:::o;28691:453::-;28826:24;28853:25;28863:5;28870:7;28853:9;:25::i;:::-;28826:52;;28913:17;28893:16;:37;28889:248;;28975:6;28955:16;:26;;28947:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;29059:51;29068:5;29075:7;29103:6;29084:16;:25;29059:8;:51::i;:::-;28889:248;28815:329;28691:453;;;:::o;49845:1725::-;49945:6;:12;49952:4;49945:12;;;;;;;;;;;;;;;;;;;;;;;;;49944:13;49936:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;50000:6;:10;50007:2;50000:10;;;;;;;;;;;;;;;;;;;;;;;;;49999:11;49991:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;50050:6;:18;;;;;;;;;;;;:45;;;;;50072:6;:23;;;;;;;;;;;;50050:45;50047:98;;;50111:22;50130:2;50111:18;:22::i;:::-;50047:98;50158:16;50165:4;50171:2;50158:6;:16::i;:::-;:38;;;;;50178:6;:18;;;;;;;;;;;;50158:38;:70;;;;;50200:19;:28;;;;;;;;;;;;50158:70;50155:1028;;;50248:17;:21;50266:2;50248:21;;;;;;;;;;;;;;;;;;;;;;;;;50244:365;;50307:19;:31;;;50297:6;:41;;:106;;;;;50368:19;:35;;;50358:6;50342:13;50352:2;50342:9;:13::i;:::-;:22;;;;:::i;:::-;:61;;50297:106;50289:157;;;;;;;;;;;;:::i;:::-;;;;;;;;;50244:365;;;50477:4;;;;;;;;;;;50471:10;;:2;:10;;;50468:141;;;50519:19;:31;;;50509:6;:41;;50501:92;;;;;;;;;;;;:::i;:::-;;;;;;;;;50468:141;50244:365;50635:4;;;;;;;;;;;50627:12;;:4;:12;;;:37;;;;;50644:16;:20;50661:2;50644:20;;;;;;;;;;;;;;;;;;;;;;;;;50643:21;50627:37;:72;;;;;50668:12;:31;;;;;;;;;;;;50627:72;50623:548;;;50743:15;50728:8;:12;50737:2;50728:12;;;;;;;;;;;;;;;;:30;50720:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;50858:12;:25;;;;;;;;;;;;50839:45;;:15;:45;;;;:::i;:::-;50824:8;:12;50833:2;50824:12;;;;;;;;;;;;;;;:60;;;;50623:548;;;50911:16;:22;50928:4;50911:22;;;;;;;;;;;;;;;;;;;;;;;;;50910:23;:59;;;;;50937:12;:32;;;;;;;;;;;;50910:59;50906:265;;;51015:15;50997:8;:14;51006:4;50997:14;;;;;;;;;;;;;;;;:33;;50989:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;51129:12;:25;;;;;;;;;;;;51110:45;;:15;:45;;;;:::i;:::-;51093:8;:14;51102:4;51093:14;;;;;;;;;;;;;;;:62;;;;50906:265;50623:548;50155:1028;51197:6;:18;;;;;;;;;;;;51193:153;;51240:13;51248:4;51240:7;:13::i;:::-;51232:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;51319:4;;;;;;;;;;;51313:10;;:2;:10;;;51310:24;;;51325:9;51332:1;51325:6;:9::i;:::-;51310:24;51193:153;51361:12;:10;:12::i;:::-;51358:50;;;51390:6;:4;:6::i;:::-;51358:50;51420:22;51445:20;51460:4;51445:14;:20::i;:::-;:64;;51503:6;51445:64;;;51468:32;51483:4;51489:2;51493:6;51468:14;:32::i;:::-;51445:64;51420:89;;51522:40;51537:4;51543:2;51547:14;51522;:40::i;:::-;49925:1645;49845:1725;;;:::o;2792:317::-;2907:6;2882:21;:31;;2874:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2961:12;2979:9;:14;;3001:6;2979:33;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2960:52;;;3031:7;3023:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;2863:246;2792:317;;:::o;26907:675::-;27010:1;26991:21;;:7;:21;;;;26983:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;27063:49;27084:7;27101:1;27105:6;27063:20;:49::i;:::-;27125:22;27150:9;:18;27160:7;27150:18;;;;;;;;;;;;;;;;27125:43;;27205:6;27187:14;:24;;27179:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;27324:6;27307:14;:23;27286:9;:18;27296:7;27286:18;;;;;;;;;;;;;;;:44;;;;27441:6;27425:12;;:22;;;;;;;;;;;27502:1;27476:37;;27485:7;27476:37;;;27506:6;27476:37;;;;;;:::i;:::-;;;;;;;;27526:48;27546:7;27563:1;27567:6;27526:19;:48::i;:::-;26972:610;26907:675;;:::o;51578:127::-;51664:33;51680:4;51686:2;51690:6;51664:15;:33::i;:::-;51578:127;;;:::o;49311:257::-;49419:12;49397:6;:19;;;;;;;;;;;;49376:40;;:6;:18;;;:40;;;;:::i;:::-;:55;:123;;49490:9;:7;:9::i;:::-;49376:123;;;49444:34;49464:7;49473:4;49444:19;:34::i;:::-;49376:123;49513:6;:23;;;;;;;;;;;;49510:50;;;49538:6;:20;;;:22;;;;;;;;;:::i;:::-;;;;;;49510:50;49311:257;:::o;48882:312::-;48946:4;48971:13;48979:4;48971:7;:13::i;:::-;48970:14;:43;;;;;49002:11;49010:2;49002:7;:11::i;:::-;49001:12;48970:43;:78;;;;;49043:5;;;;;;;;;;;49030:18;;:9;:18;;;;48970:78;:110;;;;;49066:8;:14;49075:4;49066:14;;;;;;;;;;;;;;;;;;;;;;;;;49065:15;48970:110;:140;;;;;49098:8;:12;49107:2;49098:12;;;;;;;;;;;;;;;;;;;;;;;;;49097:13;48970:140;:178;;;;;49141:6;49127:21;;:2;:21;;;;48970:178;:216;;;;;49181:4;49165:21;;:4;:21;;;;48970:216;48963:223;;48882:312;;;;:::o;48629:245::-;48706:4;48685:6;:18;;;:25;;;;;;;;;;;;;;;;;;48742:12;48721:6;:18;;:33;;;;48787:12;48765:6;:19;;;:34;;;;;;;;;;;;;;;;;;48836:4;48810:6;:23;;;:30;;;;;;;;;;;;;;;;;;48856:10;;;;;;;;;;48629:245;:::o;51713:342::-;51757:4;51782:6;:20;51789:12;:10;:12::i;:::-;51782:20;;;;;;;;;;;;;;;;;;;;;;;;;51781:21;:59;;;;;51816:17;:24;;;;;;;;;;;;51815:25;51781:59;:101;;;;;51853:17;:29;;;;;;;;;;;;51781:101;:192;;;;;51943:17;:30;;;;;;;;;;;;51914:59;;:17;:26;;;:59;;;;:::i;:::-;51895:15;:78;;51781:192;:266;;;;;52014:17;:33;;;51986:24;52004:4;51986:9;:24::i;:::-;:61;;51781:266;51774:273;;51713:342;:::o;52437:1090::-;40651:4;40624:17;:24;;;:31;;;;;;;;;;;;;;;;;;52513:15:::1;52484:17;:26;;:44;;;;52587:17;:33;;;52542:17;:41;;;:78;;:118;;;;;52624:17;:36;;;;;;;;;;;;52542:118;52539:981;;;52769:14;52830:1;52786:17;:41;;;:45;;;;:::i;:::-;52769:62;;52846:17;52856:6;52846:9;:17::i;:::-;52878;52898:21;52878:41;;52936:6;;;;;;;;;;;:22;;;52966:9;53003:4;53027:6;53052:1;53072::::0;53092:20:::1;;;;;;;;;;;53131:15;52936:225;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;52661:511;;52539:981;;;53193:44;53203:17;:33;;;53193:9;:44::i;:::-;53252:15;53270:21;53252:39;;53308:17;53397:8;:17;;;;;;;;;;;;53378:7;:16;;;;;;;;;;;;:36;;;;:::i;:::-;53328:87;;53357:8;:15;;;;;;;;;;;;53340:7;:14;;;;;;;;;;;;:32;;;;:::i;:::-;53329:44;;:7;:44;;;;:::i;:::-;53328:87;;;;:::i;:::-;53308:107;;53430:44;53464:9;53438:14;;;;;;;;;;;53430:33;;;;:44;;;;:::i;:::-;53489:19;:17;:19::i;:::-;53178:342;;52539:981;40705:5:::0;40678:17;:24;;;:32;;;;;;;;;;;;;;;;;;52437:1090::o;53535:143::-;53595:4;53619:17;:29;;;;;;;;;;;;:51;;;;;53653:11;:17;53665:4;53653:17;;;;;;;;;;;;;;;;;;;;;;;;;53652:18;53619:51;53612:58;;53535:143;;;:::o;53686:1109::-;53769:7;53792:11;:15;53804:2;53792:15;;;;;;;;;;;;;;;;;;;;;;;;;53789:59;;;53830:6;53823:13;;;;53789:59;53863:6;:10;53870:2;53863:10;;;;;;;;;;;;;;;;;;;;;;;;;53860:210;;;53900:8;:17;;;;;;;;;;;;53889:28;;:8;:28;;;;53860:210;;;53938:6;:12;53945:4;53938:12;;;;;;;;;;;;;;;;;;;;;;;;;53935:135;;;53977:7;:16;;;;;;;;;;;;53966:27;;:8;:27;;;;53935:135;;;54037:12;:21;;;;;;;;;;;;54026:32;;:8;:32;;;;53935:135;53860:210;54116:14;;54104:8;;54095:6;:17;;;;:::i;:::-;54094:36;;;;:::i;:::-;54082:9;:48;;;;54227:8;:17;;;;;;;;;;;;54208:7;:16;;;;;;;;;;;;:36;;;;:::i;:::-;54154:91;;54186:8;:16;;;;;;;;;;;;54168:7;:15;;;;;;;;;;;;:34;;;;:::i;:::-;54155:48;;:9;;:48;;;;:::i;:::-;54154:91;;;;:::i;:::-;54141:10;:104;;;;54272:1;54259:10;;:14;54256:147;;;54289:23;54295:4;54301:10;;54289:5;:23::i;:::-;54343:10;;54327:12;;:26;;;;;;;:::i;:::-;;;;;;;;54381:10;;54368:9;;:23;;;;;;;:::i;:::-;;;;;;;;54256:147;54418:17;:36;;;;;;;;;;;;54415:263;;;54644:8;:21;;;;;;;;;;;;54621:7;:20;;;;;;;;;;;;:44;;;;:::i;:::-;54516:150;;54599:8;:17;;;;;;;;;;;;54580:7;:16;;;;;;;;;;;;:36;;;;:::i;:::-;54516:101;;54553:8;:21;;;;;;;;;;;;54530:7;:20;;;;;;;;;;;;:44;;;;:::i;:::-;54517:58;;:9;;:58;;;;:::i;:::-;54516:101;;;;:::i;:::-;:150;;;;:::i;:::-;54471:17;:41;;;:195;;;;;;;:::i;:::-;;;;;;;;54415:263;54690:46;54705:4;54719;54726:9;;54690:14;:46::i;:::-;54776:10;;54764:9;;:22;;;;:::i;:::-;54754:6;:33;;;;:::i;:::-;54747:40;;53686:1109;;;;;;:::o;29744:125::-;;;;:::o;30473:124::-;;;;:::o;24899:840::-;25046:1;25030:18;;:4;:18;;;;25022:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;25123:1;25109:16;;:2;:16;;;;25101:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;25178:38;25199:4;25205:2;25209:6;25178:20;:38::i;:::-;25229:19;25251:9;:15;25261:4;25251:15;;;;;;;;;;;;;;;;25229:37;;25300:6;25285:11;:21;;25277:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;25417:6;25403:11;:20;25385:9;:15;25395:4;25385:15;;;;;;;;;;;;;;;:38;;;;25620:6;25603:9;:13;25613:2;25603:13;;;;;;;;;;;;;;;;:23;;;;;;;;;;;25670:2;25655:26;;25664:4;25655:26;;;25674:6;25655:26;;;;;;:::i;:::-;;;;;;;;25694:37;25714:4;25720:2;25724:6;25694:19;:37::i;:::-;25011:728;24899:840;;;:::o;49576:78::-;49641:5;49615:6;:23;;;:31;;;;;;;;;;;;;;;;;;49576:78::o;49662:175::-;49751:6;:15;49758:7;49751:15;;;;;;;;;;;;;;;;;;;;;;;;;49746:78;;49801:11;49783:6;:15;49790:7;49783:15;;;;;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;49746:78;49662:175;;:::o;52063:366::-;52118:21;52156:1;52142:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52118:40;;52187:4;52169;52174:1;52169:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;;;52213:6;;;;;;;;;;;:11;;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52203:4;52208:1;52203:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;;;52239:6;;;;;;;;;;;:57;;;52311:6;52332:1;52348:4;52375;52395:15;52239:182;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52107:322;52063:366;:::o;24:722:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;769:::-;865:5;890:81;906:64;963:6;906:64;:::i;:::-;890:81;:::i;:::-;881:90;;991:5;1020:6;1013:5;1006:21;1054:4;1047:5;1043:16;1036:23;;1080:6;1130:3;1122:4;1114:6;1110:17;1105:3;1101:27;1098:36;1095:143;;;1149:79;;:::i;:::-;1095:143;1262:1;1247:238;1272:6;1269:1;1266:13;1247:238;;;1340:3;1369:37;1402:3;1390:10;1369:37;:::i;:::-;1364:3;1357:50;1436:4;1431:3;1427:14;1420:21;;1470:4;1465:3;1461:14;1454:21;;1307:178;1294:1;1291;1287:9;1282:14;;1247:238;;;1251:14;871:620;;769:722;;;;;:::o;1497:139::-;1543:5;1581:6;1568:20;1559:29;;1597:33;1624:5;1597:33;:::i;:::-;1497:139;;;;:::o;1642:143::-;1699:5;1730:6;1724:13;1715:22;;1746:33;1773:5;1746:33;:::i;:::-;1642:143;;;;:::o;1808:370::-;1879:5;1928:3;1921:4;1913:6;1909:17;1905:27;1895:122;;1936:79;;:::i;:::-;1895:122;2053:6;2040:20;2078:94;2168:3;2160:6;2153:4;2145:6;2141:17;2078:94;:::i;:::-;2069:103;;1885:293;1808:370;;;;:::o;2201:::-;2272:5;2321:3;2314:4;2306:6;2302:17;2298:27;2288:122;;2329:79;;:::i;:::-;2288:122;2446:6;2433:20;2471:94;2561:3;2553:6;2546:4;2538:6;2534:17;2471:94;:::i;:::-;2462:103;;2278:293;2201:370;;;;:::o;2577:133::-;2620:5;2658:6;2645:20;2636:29;;2674:30;2698:5;2674:30;:::i;:::-;2577:133;;;;:::o;2716:137::-;2761:5;2799:6;2786:20;2777:29;;2815:32;2841:5;2815:32;:::i;:::-;2716:137;;;;:::o;2859:139::-;2905:5;2943:6;2930:20;2921:29;;2959:33;2986:5;2959:33;:::i;:::-;2859:139;;;;:::o;3004:143::-;3061:5;3092:6;3086:13;3077:22;;3108:33;3135:5;3108:33;:::i;:::-;3004:143;;;;:::o;3153:135::-;3197:5;3235:6;3222:20;3213:29;;3251:31;3276:5;3251:31;:::i;:::-;3153:135;;;;:::o;3294:329::-;3353:6;3402:2;3390:9;3381:7;3377:23;3373:32;3370:119;;;3408:79;;:::i;:::-;3370:119;3528:1;3553:53;3598:7;3589:6;3578:9;3574:22;3553:53;:::i;:::-;3543:63;;3499:117;3294:329;;;;:::o;3629:351::-;3699:6;3748:2;3736:9;3727:7;3723:23;3719:32;3716:119;;;3754:79;;:::i;:::-;3716:119;3874:1;3899:64;3955:7;3946:6;3935:9;3931:22;3899:64;:::i;:::-;3889:74;;3845:128;3629:351;;;;:::o;3986:474::-;4054:6;4062;4111:2;4099:9;4090:7;4086:23;4082:32;4079:119;;;4117:79;;:::i;:::-;4079:119;4237:1;4262:53;4307:7;4298:6;4287:9;4283:22;4262:53;:::i;:::-;4252:63;;4208:117;4364:2;4390:53;4435:7;4426:6;4415:9;4411:22;4390:53;:::i;:::-;4380:63;;4335:118;3986:474;;;;;:::o;4466:619::-;4543:6;4551;4559;4608:2;4596:9;4587:7;4583:23;4579:32;4576:119;;;4614:79;;:::i;:::-;4576:119;4734:1;4759:53;4804:7;4795:6;4784:9;4780:22;4759:53;:::i;:::-;4749:63;;4705:117;4861:2;4887:53;4932:7;4923:6;4912:9;4908:22;4887:53;:::i;:::-;4877:63;;4832:118;4989:2;5015:53;5060:7;5051:6;5040:9;5036:22;5015:53;:::i;:::-;5005:63;;4960:118;4466:619;;;;;:::o;5091:::-;5168:6;5176;5184;5233:2;5221:9;5212:7;5208:23;5204:32;5201:119;;;5239:79;;:::i;:::-;5201:119;5359:1;5384:53;5429:7;5420:6;5409:9;5405:22;5384:53;:::i;:::-;5374:63;;5330:117;5486:2;5512:53;5557:7;5548:6;5537:9;5533:22;5512:53;:::i;:::-;5502:63;;5457:118;5614:2;5640:53;5685:7;5676:6;5665:9;5661:22;5640:53;:::i;:::-;5630:63;;5585:118;5091:619;;;;;:::o;5716:468::-;5781:6;5789;5838:2;5826:9;5817:7;5813:23;5809:32;5806:119;;;5844:79;;:::i;:::-;5806:119;5964:1;5989:53;6034:7;6025:6;6014:9;6010:22;5989:53;:::i;:::-;5979:63;;5935:117;6091:2;6117:50;6159:7;6150:6;6139:9;6135:22;6117:50;:::i;:::-;6107:60;;6062:115;5716:468;;;;;:::o;6190:887::-;6273:6;6281;6289;6297;6305;6354:3;6342:9;6333:7;6329:23;6325:33;6322:120;;;6361:79;;:::i;:::-;6322:120;6481:1;6506:53;6551:7;6542:6;6531:9;6527:22;6506:53;:::i;:::-;6496:63;;6452:117;6608:2;6634:50;6676:7;6667:6;6656:9;6652:22;6634:50;:::i;:::-;6624:60;;6579:115;6733:2;6759:50;6801:7;6792:6;6781:9;6777:22;6759:50;:::i;:::-;6749:60;;6704:115;6858:2;6884:50;6926:7;6917:6;6906:9;6902:22;6884:50;:::i;:::-;6874:60;;6829:115;6983:3;7010:50;7052:7;7043:6;7032:9;7028:22;7010:50;:::i;:::-;7000:60;;6954:116;6190:887;;;;;;;;:::o;7083:474::-;7151:6;7159;7208:2;7196:9;7187:7;7183:23;7179:32;7176:119;;;7214:79;;:::i;:::-;7176:119;7334:1;7359:53;7404:7;7395:6;7384:9;7380:22;7359:53;:::i;:::-;7349:63;;7305:117;7461:2;7487:53;7532:7;7523:6;7512:9;7508:22;7487:53;:::i;:::-;7477:63;;7432:118;7083:474;;;;;:::o;7563:894::-;7681:6;7689;7738:2;7726:9;7717:7;7713:23;7709:32;7706:119;;;7744:79;;:::i;:::-;7706:119;7892:1;7881:9;7877:17;7864:31;7922:18;7914:6;7911:30;7908:117;;;7944:79;;:::i;:::-;7908:117;8049:78;8119:7;8110:6;8099:9;8095:22;8049:78;:::i;:::-;8039:88;;7835:302;8204:2;8193:9;8189:18;8176:32;8235:18;8227:6;8224:30;8221:117;;;8257:79;;:::i;:::-;8221:117;8362:78;8432:7;8423:6;8412:9;8408:22;8362:78;:::i;:::-;8352:88;;8147:303;7563:894;;;;;:::o;8463:323::-;8519:6;8568:2;8556:9;8547:7;8543:23;8539:32;8536:119;;;8574:79;;:::i;:::-;8536:119;8694:1;8719:50;8761:7;8752:6;8741:9;8737:22;8719:50;:::i;:::-;8709:60;;8665:114;8463:323;;;;:::o;8792:603::-;8861:6;8869;8877;8926:2;8914:9;8905:7;8901:23;8897:32;8894:119;;;8932:79;;:::i;:::-;8894:119;9052:1;9077:50;9119:7;9110:6;9099:9;9095:22;9077:50;:::i;:::-;9067:60;;9023:114;9176:2;9202:50;9244:7;9235:6;9224:9;9220:22;9202:50;:::i;:::-;9192:60;;9147:115;9301:2;9327:51;9370:7;9361:6;9350:9;9346:22;9327:51;:::i;:::-;9317:61;;9272:116;8792:603;;;;;:::o;9401:327::-;9459:6;9508:2;9496:9;9487:7;9483:23;9479:32;9476:119;;;9514:79;;:::i;:::-;9476:119;9634:1;9659:52;9703:7;9694:6;9683:9;9679:22;9659:52;:::i;:::-;9649:62;;9605:116;9401:327;;;;:::o;9734:757::-;9816:6;9824;9832;9840;9889:3;9877:9;9868:7;9864:23;9860:33;9857:120;;;9896:79;;:::i;:::-;9857:120;10016:1;10041:52;10085:7;10076:6;10065:9;10061:22;10041:52;:::i;:::-;10031:62;;9987:116;10142:2;10168:52;10212:7;10203:6;10192:9;10188:22;10168:52;:::i;:::-;10158:62;;10113:117;10269:2;10295:52;10339:7;10330:6;10319:9;10315:22;10295:52;:::i;:::-;10285:62;;10240:117;10396:2;10422:52;10466:7;10457:6;10446:9;10442:22;10422:52;:::i;:::-;10412:62;;10367:117;9734:757;;;;;;;:::o;10497:329::-;10556:6;10605:2;10593:9;10584:7;10580:23;10576:32;10573:119;;;10611:79;;:::i;:::-;10573:119;10731:1;10756:53;10801:7;10792:6;10781:9;10777:22;10756:53;:::i;:::-;10746:63;;10702:117;10497:329;;;;:::o;10832:613::-;10906:6;10914;10922;10971:2;10959:9;10950:7;10946:23;10942:32;10939:119;;;10977:79;;:::i;:::-;10939:119;11097:1;11122:53;11167:7;11158:6;11147:9;11143:22;11122:53;:::i;:::-;11112:63;;11068:117;11224:2;11250:53;11295:7;11286:6;11275:9;11271:22;11250:53;:::i;:::-;11240:63;;11195:118;11352:2;11378:50;11420:7;11411:6;11400:9;11396:22;11378:50;:::i;:::-;11368:60;;11323:115;10832:613;;;;;:::o;11451:663::-;11539:6;11547;11555;11604:2;11592:9;11583:7;11579:23;11575:32;11572:119;;;11610:79;;:::i;:::-;11572:119;11730:1;11755:64;11811:7;11802:6;11791:9;11787:22;11755:64;:::i;:::-;11745:74;;11701:128;11868:2;11894:64;11950:7;11941:6;11930:9;11926:22;11894:64;:::i;:::-;11884:74;;11839:129;12007:2;12033:64;12089:7;12080:6;12069:9;12065:22;12033:64;:::i;:::-;12023:74;;11978:129;11451:663;;;;;:::o;12120:1035::-;12213:6;12221;12229;12237;12245;12253;12302:3;12290:9;12281:7;12277:23;12273:33;12270:120;;;12309:79;;:::i;:::-;12270:120;12429:1;12454:51;12497:7;12488:6;12477:9;12473:22;12454:51;:::i;:::-;12444:61;;12400:115;12554:2;12580:53;12625:7;12616:6;12605:9;12601:22;12580:53;:::i;:::-;12570:63;;12525:118;12682:2;12708:53;12753:7;12744:6;12733:9;12729:22;12708:53;:::i;:::-;12698:63;;12653:118;12810:2;12836:50;12878:7;12869:6;12858:9;12854:22;12836:50;:::i;:::-;12826:60;;12781:115;12935:3;12962:50;13004:7;12995:6;12984:9;12980:22;12962:50;:::i;:::-;12952:60;;12906:116;13061:3;13088:50;13130:7;13121:6;13110:9;13106:22;13088:50;:::i;:::-;13078:60;;13032:116;12120:1035;;;;;;;;:::o;13161:179::-;13230:10;13251:46;13293:3;13285:6;13251:46;:::i;:::-;13329:4;13324:3;13320:14;13306:28;;13161:179;;;;:::o;13346:108::-;13423:24;13441:5;13423:24;:::i;:::-;13418:3;13411:37;13346:108;;:::o;13460:118::-;13547:24;13565:5;13547:24;:::i;:::-;13542:3;13535:37;13460:118;;:::o;13614:732::-;13733:3;13762:54;13810:5;13762:54;:::i;:::-;13832:86;13911:6;13906:3;13832:86;:::i;:::-;13825:93;;13942:56;13992:5;13942:56;:::i;:::-;14021:7;14052:1;14037:284;14062:6;14059:1;14056:13;14037:284;;;14138:6;14132:13;14165:63;14224:3;14209:13;14165:63;:::i;:::-;14158:70;;14251:60;14304:6;14251:60;:::i;:::-;14241:70;;14097:224;14084:1;14081;14077:9;14072:14;;14037:284;;;14041:14;14337:3;14330:10;;13738:608;;;13614:732;;;;:::o;14352:109::-;14433:21;14448:5;14433:21;:::i;:::-;14428:3;14421:34;14352:109;;:::o;14467:147::-;14562:45;14601:5;14562:45;:::i;:::-;14557:3;14550:58;14467:147;;:::o;14620:364::-;14708:3;14736:39;14769:5;14736:39;:::i;:::-;14791:71;14855:6;14850:3;14791:71;:::i;:::-;14784:78;;14871:52;14916:6;14911:3;14904:4;14897:5;14893:16;14871:52;:::i;:::-;14948:29;14970:6;14948:29;:::i;:::-;14943:3;14939:39;14932:46;;14712:272;14620:364;;;;:::o;14990:366::-;15132:3;15153:67;15217:2;15212:3;15153:67;:::i;:::-;15146:74;;15229:93;15318:3;15229:93;:::i;:::-;15347:2;15342:3;15338:12;15331:19;;14990:366;;;:::o;15362:::-;15504:3;15525:67;15589:2;15584:3;15525:67;:::i;:::-;15518:74;;15601:93;15690:3;15601:93;:::i;:::-;15719:2;15714:3;15710:12;15703:19;;15362:366;;;:::o;15734:::-;15876:3;15897:67;15961:2;15956:3;15897:67;:::i;:::-;15890:74;;15973:93;16062:3;15973:93;:::i;:::-;16091:2;16086:3;16082:12;16075:19;;15734:366;;;:::o;16106:::-;16248:3;16269:67;16333:2;16328:3;16269:67;:::i;:::-;16262:74;;16345:93;16434:3;16345:93;:::i;:::-;16463:2;16458:3;16454:12;16447:19;;16106:366;;;:::o;16478:::-;16620:3;16641:67;16705:2;16700:3;16641:67;:::i;:::-;16634:74;;16717:93;16806:3;16717:93;:::i;:::-;16835:2;16830:3;16826:12;16819:19;;16478:366;;;:::o;16850:::-;16992:3;17013:67;17077:2;17072:3;17013:67;:::i;:::-;17006:74;;17089:93;17178:3;17089:93;:::i;:::-;17207:2;17202:3;17198:12;17191:19;;16850:366;;;:::o;17222:::-;17364:3;17385:67;17449:2;17444:3;17385:67;:::i;:::-;17378:74;;17461:93;17550:3;17461:93;:::i;:::-;17579:2;17574:3;17570:12;17563:19;;17222:366;;;:::o;17594:::-;17736:3;17757:67;17821:2;17816:3;17757:67;:::i;:::-;17750:74;;17833:93;17922:3;17833:93;:::i;:::-;17951:2;17946:3;17942:12;17935:19;;17594:366;;;:::o;17966:::-;18108:3;18129:67;18193:2;18188:3;18129:67;:::i;:::-;18122:74;;18205:93;18294:3;18205:93;:::i;:::-;18323:2;18318:3;18314:12;18307:19;;17966:366;;;:::o;18338:::-;18480:3;18501:67;18565:2;18560:3;18501:67;:::i;:::-;18494:74;;18577:93;18666:3;18577:93;:::i;:::-;18695:2;18690:3;18686:12;18679:19;;18338:366;;;:::o;18710:::-;18852:3;18873:67;18937:2;18932:3;18873:67;:::i;:::-;18866:74;;18949:93;19038:3;18949:93;:::i;:::-;19067:2;19062:3;19058:12;19051:19;;18710:366;;;:::o;19082:::-;19224:3;19245:67;19309:2;19304:3;19245:67;:::i;:::-;19238:74;;19321:93;19410:3;19321:93;:::i;:::-;19439:2;19434:3;19430:12;19423:19;;19082:366;;;:::o;19454:::-;19596:3;19617:67;19681:2;19676:3;19617:67;:::i;:::-;19610:74;;19693:93;19782:3;19693:93;:::i;:::-;19811:2;19806:3;19802:12;19795:19;;19454:366;;;:::o;19826:::-;19968:3;19989:67;20053:2;20048:3;19989:67;:::i;:::-;19982:74;;20065:93;20154:3;20065:93;:::i;:::-;20183:2;20178:3;20174:12;20167:19;;19826:366;;;:::o;20198:::-;20340:3;20361:67;20425:2;20420:3;20361:67;:::i;:::-;20354:74;;20437:93;20526:3;20437:93;:::i;:::-;20555:2;20550:3;20546:12;20539:19;;20198:366;;;:::o;20570:::-;20712:3;20733:67;20797:2;20792:3;20733:67;:::i;:::-;20726:74;;20809:93;20898:3;20809:93;:::i;:::-;20927:2;20922:3;20918:12;20911:19;;20570:366;;;:::o;20942:::-;21084:3;21105:67;21169:2;21164:3;21105:67;:::i;:::-;21098:74;;21181:93;21270:3;21181:93;:::i;:::-;21299:2;21294:3;21290:12;21283:19;;20942:366;;;:::o;21314:::-;21456:3;21477:67;21541:2;21536:3;21477:67;:::i;:::-;21470:74;;21553:93;21642:3;21553:93;:::i;:::-;21671:2;21666:3;21662:12;21655:19;;21314:366;;;:::o;21686:::-;21828:3;21849:67;21913:2;21908:3;21849:67;:::i;:::-;21842:74;;21925:93;22014:3;21925:93;:::i;:::-;22043:2;22038:3;22034:12;22027:19;;21686:366;;;:::o;22058:::-;22200:3;22221:67;22285:2;22280:3;22221:67;:::i;:::-;22214:74;;22297:93;22386:3;22297:93;:::i;:::-;22415:2;22410:3;22406:12;22399:19;;22058:366;;;:::o;22430:398::-;22589:3;22610:83;22691:1;22686:3;22610:83;:::i;:::-;22603:90;;22702:93;22791:3;22702:93;:::i;:::-;22820:1;22815:3;22811:11;22804:18;;22430:398;;;:::o;22834:366::-;22976:3;22997:67;23061:2;23056:3;22997:67;:::i;:::-;22990:74;;23073:93;23162:3;23073:93;:::i;:::-;23191:2;23186:3;23182:12;23175:19;;22834:366;;;:::o;23206:::-;23348:3;23369:67;23433:2;23428:3;23369:67;:::i;:::-;23362:74;;23445:93;23534:3;23445:93;:::i;:::-;23563:2;23558:3;23554:12;23547:19;;23206:366;;;:::o;23578:::-;23720:3;23741:67;23805:2;23800:3;23741:67;:::i;:::-;23734:74;;23817:93;23906:3;23817:93;:::i;:::-;23935:2;23930:3;23926:12;23919:19;;23578:366;;;:::o;23950:115::-;24035:23;24052:5;24035:23;:::i;:::-;24030:3;24023:36;23950:115;;:::o;24071:118::-;24158:24;24176:5;24158:24;:::i;:::-;24153:3;24146:37;24071:118;;:::o;24195:112::-;24278:22;24294:5;24278:22;:::i;:::-;24273:3;24266:35;24195:112;;:::o;24313:379::-;24497:3;24519:147;24662:3;24519:147;:::i;:::-;24512:154;;24683:3;24676:10;;24313:379;;;:::o;24698:222::-;24791:4;24829:2;24818:9;24814:18;24806:26;;24842:71;24910:1;24899:9;24895:17;24886:6;24842:71;:::i;:::-;24698:222;;;;:::o;24926:332::-;25047:4;25085:2;25074:9;25070:18;25062:26;;25098:71;25166:1;25155:9;25151:17;25142:6;25098:71;:::i;:::-;25179:72;25247:2;25236:9;25232:18;25223:6;25179:72;:::i;:::-;24926:332;;;;;:::o;25264:807::-;25513:4;25551:3;25540:9;25536:19;25528:27;;25565:71;25633:1;25622:9;25618:17;25609:6;25565:71;:::i;:::-;25646:72;25714:2;25703:9;25699:18;25690:6;25646:72;:::i;:::-;25728:80;25804:2;25793:9;25789:18;25780:6;25728:80;:::i;:::-;25818;25894:2;25883:9;25879:18;25870:6;25818:80;:::i;:::-;25908:73;25976:3;25965:9;25961:19;25952:6;25908:73;:::i;:::-;25991;26059:3;26048:9;26044:19;26035:6;25991:73;:::i;:::-;25264:807;;;;;;;;;:::o;26077:210::-;26164:4;26202:2;26191:9;26187:18;26179:26;;26215:65;26277:1;26266:9;26262:17;26253:6;26215:65;:::i;:::-;26077:210;;;;:::o;26293:513::-;26450:4;26488:3;26477:9;26473:19;26465:27;;26502:65;26564:1;26553:9;26549:17;26540:6;26502:65;:::i;:::-;26577:66;26639:2;26628:9;26624:18;26615:6;26577:66;:::i;:::-;26653:68;26717:2;26706:9;26702:18;26693:6;26653:68;:::i;:::-;26731;26795:2;26784:9;26780:18;26771:6;26731:68;:::i;:::-;26293:513;;;;;;;:::o;26812:313::-;26925:4;26963:2;26952:9;26948:18;26940:26;;27012:9;27006:4;27002:20;26998:1;26987:9;26983:17;26976:47;27040:78;27113:4;27104:6;27040:78;:::i;:::-;27032:86;;26812:313;;;;:::o;27131:419::-;27297:4;27335:2;27324:9;27320:18;27312:26;;27384:9;27378:4;27374:20;27370:1;27359:9;27355:17;27348:47;27412:131;27538:4;27412:131;:::i;:::-;27404:139;;27131:419;;;:::o;27556:::-;27722:4;27760:2;27749:9;27745:18;27737:26;;27809:9;27803:4;27799:20;27795:1;27784:9;27780:17;27773:47;27837:131;27963:4;27837:131;:::i;:::-;27829:139;;27556:419;;;:::o;27981:::-;28147:4;28185:2;28174:9;28170:18;28162:26;;28234:9;28228:4;28224:20;28220:1;28209:9;28205:17;28198:47;28262:131;28388:4;28262:131;:::i;:::-;28254:139;;27981:419;;;:::o;28406:::-;28572:4;28610:2;28599:9;28595:18;28587:26;;28659:9;28653:4;28649:20;28645:1;28634:9;28630:17;28623:47;28687:131;28813:4;28687:131;:::i;:::-;28679:139;;28406:419;;;:::o;28831:::-;28997:4;29035:2;29024:9;29020:18;29012:26;;29084:9;29078:4;29074:20;29070:1;29059:9;29055:17;29048:47;29112:131;29238:4;29112:131;:::i;:::-;29104:139;;28831:419;;;:::o;29256:::-;29422:4;29460:2;29449:9;29445:18;29437:26;;29509:9;29503:4;29499:20;29495:1;29484:9;29480:17;29473:47;29537:131;29663:4;29537:131;:::i;:::-;29529:139;;29256:419;;;:::o;29681:::-;29847:4;29885:2;29874:9;29870:18;29862:26;;29934:9;29928:4;29924:20;29920:1;29909:9;29905:17;29898:47;29962:131;30088:4;29962:131;:::i;:::-;29954:139;;29681:419;;;:::o;30106:::-;30272:4;30310:2;30299:9;30295:18;30287:26;;30359:9;30353:4;30349:20;30345:1;30334:9;30330:17;30323:47;30387:131;30513:4;30387:131;:::i;:::-;30379:139;;30106:419;;;:::o;30531:::-;30697:4;30735:2;30724:9;30720:18;30712:26;;30784:9;30778:4;30774:20;30770:1;30759:9;30755:17;30748:47;30812:131;30938:4;30812:131;:::i;:::-;30804:139;;30531:419;;;:::o;30956:::-;31122:4;31160:2;31149:9;31145:18;31137:26;;31209:9;31203:4;31199:20;31195:1;31184:9;31180:17;31173:47;31237:131;31363:4;31237:131;:::i;:::-;31229:139;;30956:419;;;:::o;31381:::-;31547:4;31585:2;31574:9;31570:18;31562:26;;31634:9;31628:4;31624:20;31620:1;31609:9;31605:17;31598:47;31662:131;31788:4;31662:131;:::i;:::-;31654:139;;31381:419;;;:::o;31806:::-;31972:4;32010:2;31999:9;31995:18;31987:26;;32059:9;32053:4;32049:20;32045:1;32034:9;32030:17;32023:47;32087:131;32213:4;32087:131;:::i;:::-;32079:139;;31806:419;;;:::o;32231:::-;32397:4;32435:2;32424:9;32420:18;32412:26;;32484:9;32478:4;32474:20;32470:1;32459:9;32455:17;32448:47;32512:131;32638:4;32512:131;:::i;:::-;32504:139;;32231:419;;;:::o;32656:::-;32822:4;32860:2;32849:9;32845:18;32837:26;;32909:9;32903:4;32899:20;32895:1;32884:9;32880:17;32873:47;32937:131;33063:4;32937:131;:::i;:::-;32929:139;;32656:419;;;:::o;33081:::-;33247:4;33285:2;33274:9;33270:18;33262:26;;33334:9;33328:4;33324:20;33320:1;33309:9;33305:17;33298:47;33362:131;33488:4;33362:131;:::i;:::-;33354:139;;33081:419;;;:::o;33506:::-;33672:4;33710:2;33699:9;33695:18;33687:26;;33759:9;33753:4;33749:20;33745:1;33734:9;33730:17;33723:47;33787:131;33913:4;33787:131;:::i;:::-;33779:139;;33506:419;;;:::o;33931:::-;34097:4;34135:2;34124:9;34120:18;34112:26;;34184:9;34178:4;34174:20;34170:1;34159:9;34155:17;34148:47;34212:131;34338:4;34212:131;:::i;:::-;34204:139;;33931:419;;;:::o;34356:::-;34522:4;34560:2;34549:9;34545:18;34537:26;;34609:9;34603:4;34599:20;34595:1;34584:9;34580:17;34573:47;34637:131;34763:4;34637:131;:::i;:::-;34629:139;;34356:419;;;:::o;34781:::-;34947:4;34985:2;34974:9;34970:18;34962:26;;35034:9;35028:4;35024:20;35020:1;35009:9;35005:17;34998:47;35062:131;35188:4;35062:131;:::i;:::-;35054:139;;34781:419;;;:::o;35206:::-;35372:4;35410:2;35399:9;35395:18;35387:26;;35459:9;35453:4;35449:20;35445:1;35434:9;35430:17;35423:47;35487:131;35613:4;35487:131;:::i;:::-;35479:139;;35206:419;;;:::o;35631:::-;35797:4;35835:2;35824:9;35820:18;35812:26;;35884:9;35878:4;35874:20;35870:1;35859:9;35855:17;35848:47;35912:131;36038:4;35912:131;:::i;:::-;35904:139;;35631:419;;;:::o;36056:::-;36222:4;36260:2;36249:9;36245:18;36237:26;;36309:9;36303:4;36299:20;36295:1;36284:9;36280:17;36273:47;36337:131;36463:4;36337:131;:::i;:::-;36329:139;;36056:419;;;:::o;36481:::-;36647:4;36685:2;36674:9;36670:18;36662:26;;36734:9;36728:4;36724:20;36720:1;36709:9;36705:17;36698:47;36762:131;36888:4;36762:131;:::i;:::-;36754:139;;36481:419;;;:::o;36906:644::-;37101:4;37139:3;37128:9;37124:19;37116:27;;37153:69;37219:1;37208:9;37204:17;37195:6;37153:69;:::i;:::-;37232:70;37298:2;37287:9;37283:18;37274:6;37232:70;:::i;:::-;37312;37378:2;37367:9;37363:18;37354:6;37312:70;:::i;:::-;37392;37458:2;37447:9;37443:18;37434:6;37392:70;:::i;:::-;37472:71;37538:3;37527:9;37523:19;37514:6;37472:71;:::i;:::-;36906:644;;;;;;;;:::o;37556:222::-;37649:4;37687:2;37676:9;37672:18;37664:26;;37700:71;37768:1;37757:9;37753:17;37744:6;37700:71;:::i;:::-;37556:222;;;;:::o;37784:831::-;38047:4;38085:3;38074:9;38070:19;38062:27;;38099:71;38167:1;38156:9;38152:17;38143:6;38099:71;:::i;:::-;38180:80;38256:2;38245:9;38241:18;38232:6;38180:80;:::i;:::-;38307:9;38301:4;38297:20;38292:2;38281:9;38277:18;38270:48;38335:108;38438:4;38429:6;38335:108;:::i;:::-;38327:116;;38453:72;38521:2;38510:9;38506:18;38497:6;38453:72;:::i;:::-;38535:73;38603:3;38592:9;38588:19;38579:6;38535:73;:::i;:::-;37784:831;;;;;;;;:::o;38621:430::-;38764:4;38802:2;38791:9;38787:18;38779:26;;38815:71;38883:1;38872:9;38868:17;38859:6;38815:71;:::i;:::-;38896:72;38964:2;38953:9;38949:18;38940:6;38896:72;:::i;:::-;38978:66;39040:2;39029:9;39025:18;39016:6;38978:66;:::i;:::-;38621:430;;;;;;:::o;39057:1052::-;39346:4;39384:3;39373:9;39369:19;39361:27;;39398:71;39466:1;39455:9;39451:17;39442:6;39398:71;:::i;:::-;39479:72;39547:2;39536:9;39532:18;39523:6;39479:72;:::i;:::-;39561;39629:2;39618:9;39614:18;39605:6;39561:72;:::i;:::-;39643;39711:2;39700:9;39696:18;39687:6;39643:72;:::i;:::-;39725:69;39789:3;39778:9;39774:19;39765:6;39725:69;:::i;:::-;39804:67;39866:3;39855:9;39851:19;39842:6;39804:67;:::i;:::-;39881;39943:3;39932:9;39928:19;39919:6;39881:67;:::i;:::-;39958;40020:3;40009:9;40005:19;39996:6;39958:67;:::i;:::-;40035;40097:3;40086:9;40082:19;40073:6;40035:67;:::i;:::-;39057:1052;;;;;;;;;;;;:::o;40115:632::-;40304:4;40342:3;40331:9;40327:19;40319:27;;40356:71;40424:1;40413:9;40409:17;40400:6;40356:71;:::i;:::-;40437:68;40501:2;40490:9;40486:18;40477:6;40437:68;:::i;:::-;40515:72;40583:2;40572:9;40568:18;40559:6;40515:72;:::i;:::-;40597:66;40659:2;40648:9;40644:18;40635:6;40597:66;:::i;:::-;40673:67;40735:3;40724:9;40720:19;40711:6;40673:67;:::i;:::-;40115:632;;;;;;;;:::o;40753:214::-;40842:4;40880:2;40869:9;40865:18;40857:26;;40893:67;40957:1;40946:9;40942:17;40933:6;40893:67;:::i;:::-;40753:214;;;;:::o;40973:129::-;41007:6;41034:20;;:::i;:::-;41024:30;;41063:33;41091:4;41083:6;41063:33;:::i;:::-;40973:129;;;:::o;41108:75::-;41141:6;41174:2;41168:9;41158:19;;41108:75;:::o;41189:311::-;41266:4;41356:18;41348:6;41345:30;41342:56;;;41378:18;;:::i;:::-;41342:56;41428:4;41420:6;41416:17;41408:25;;41488:4;41482;41478:15;41470:23;;41189:311;;;:::o;41506:::-;41583:4;41673:18;41665:6;41662:30;41659:56;;;41695:18;;:::i;:::-;41659:56;41745:4;41737:6;41733:17;41725:25;;41805:4;41799;41795:15;41787:23;;41506:311;;;:::o;41823:132::-;41890:4;41913:3;41905:11;;41943:4;41938:3;41934:14;41926:22;;41823:132;;;:::o;41961:114::-;42028:6;42062:5;42056:12;42046:22;;41961:114;;;:::o;42081:99::-;42133:6;42167:5;42161:12;42151:22;;42081:99;;;:::o;42186:113::-;42256:4;42288;42283:3;42279:14;42271:22;;42186:113;;;:::o;42305:184::-;42404:11;42438:6;42433:3;42426:19;42478:4;42473:3;42469:14;42454:29;;42305:184;;;;:::o;42495:147::-;42596:11;42633:3;42618:18;;42495:147;;;;:::o;42648:169::-;42732:11;42766:6;42761:3;42754:19;42806:4;42801:3;42797:14;42782:29;;42648:169;;;;:::o;42823:242::-;42862:3;42881:19;42898:1;42881:19;:::i;:::-;42876:24;;42914:19;42931:1;42914:19;:::i;:::-;42909:24;;43007:1;42999:6;42995:14;42992:1;42989:21;42986:47;;;43013:18;;:::i;:::-;42986:47;43057:1;43054;43050:9;43043:16;;42823:242;;;;:::o;43071:305::-;43111:3;43130:20;43148:1;43130:20;:::i;:::-;43125:25;;43164:20;43182:1;43164:20;:::i;:::-;43159:25;;43318:1;43250:66;43246:74;43243:1;43240:81;43237:107;;;43324:18;;:::i;:::-;43237:107;43368:1;43365;43361:9;43354:16;;43071:305;;;;:::o;43382:185::-;43422:1;43439:20;43457:1;43439:20;:::i;:::-;43434:25;;43473:20;43491:1;43473:20;:::i;:::-;43468:25;;43512:1;43502:35;;43517:18;;:::i;:::-;43502:35;43559:1;43556;43552:9;43547:14;;43382:185;;;;:::o;43573:348::-;43613:7;43636:20;43654:1;43636:20;:::i;:::-;43631:25;;43670:20;43688:1;43670:20;:::i;:::-;43665:25;;43858:1;43790:66;43786:74;43783:1;43780:81;43775:1;43768:9;43761:17;43757:105;43754:131;;;43865:18;;:::i;:::-;43754:131;43913:1;43910;43906:9;43895:20;;43573:348;;;;:::o;43927:191::-;43967:4;43987:20;44005:1;43987:20;:::i;:::-;43982:25;;44021:20;44039:1;44021:20;:::i;:::-;44016:25;;44060:1;44057;44054:8;44051:34;;;44065:18;;:::i;:::-;44051:34;44110:1;44107;44103:9;44095:17;;43927:191;;;;:::o;44124:96::-;44161:7;44190:24;44208:5;44190:24;:::i;:::-;44179:35;;44124:96;;;:::o;44226:90::-;44260:7;44303:5;44296:13;44289:21;44278:32;;44226:90;;;:::o;44322:89::-;44358:7;44398:6;44391:5;44387:18;44376:29;;44322:89;;;:::o;44417:126::-;44454:7;44494:42;44487:5;44483:54;44472:65;;44417:126;;;:::o;44549:77::-;44586:7;44615:5;44604:16;;44549:77;;;:::o;44632:86::-;44667:7;44707:4;44700:5;44696:16;44685:27;;44632:86;;;:::o;44724:121::-;44782:9;44815:24;44833:5;44815:24;:::i;:::-;44802:37;;44724:121;;;:::o;44851:307::-;44919:1;44929:113;44943:6;44940:1;44937:13;44929:113;;;45028:1;45023:3;45019:11;45013:18;45009:1;45004:3;45000:11;44993:39;44965:2;44962:1;44958:10;44953:15;;44929:113;;;45060:6;45057:1;45054:13;45051:101;;;45140:1;45131:6;45126:3;45122:16;45115:27;45051:101;44900:258;44851:307;;;:::o;45164:320::-;45208:6;45245:1;45239:4;45235:12;45225:22;;45292:1;45286:4;45282:12;45313:18;45303:81;;45369:4;45361:6;45357:17;45347:27;;45303:81;45431:2;45423:6;45420:14;45400:18;45397:38;45394:84;;;45450:18;;:::i;:::-;45394:84;45215:269;45164:320;;;:::o;45490:281::-;45573:27;45595:4;45573:27;:::i;:::-;45565:6;45561:40;45703:6;45691:10;45688:22;45667:18;45655:10;45652:34;45649:62;45646:88;;;45714:18;;:::i;:::-;45646:88;45754:10;45750:2;45743:22;45533:238;45490:281;;:::o;45777:233::-;45816:3;45839:24;45857:5;45839:24;:::i;:::-;45830:33;;45885:66;45878:5;45875:77;45872:103;;;45955:18;;:::i;:::-;45872:103;46002:1;45995:5;45991:13;45984:20;;45777:233;;;:::o;46016:167::-;46053:3;46076:22;46092:5;46076:22;:::i;:::-;46067:31;;46120:4;46113:5;46110:15;46107:41;;;46128:18;;:::i;:::-;46107:41;46175:1;46168:5;46164:13;46157:20;;46016:167;;;:::o;46189:180::-;46237:77;46234:1;46227:88;46334:4;46331:1;46324:15;46358:4;46355:1;46348:15;46375:180;46423:77;46420:1;46413:88;46520:4;46517:1;46510:15;46544:4;46541:1;46534:15;46561:180;46609:77;46606:1;46599:88;46706:4;46703:1;46696:15;46730:4;46727:1;46720:15;46747:180;46795:77;46792:1;46785:88;46892:4;46889:1;46882:15;46916:4;46913:1;46906:15;46933:180;46981:77;46978:1;46971:88;47078:4;47075:1;47068:15;47102:4;47099:1;47092:15;47119:117;47228:1;47225;47218:12;47242:117;47351:1;47348;47341:12;47365:117;47474:1;47471;47464:12;47488:117;47597:1;47594;47587:12;47611:102;47652:6;47703:2;47699:7;47694:2;47687:5;47683:14;47679:28;47669:38;;47611:102;;;:::o;47719:222::-;47859:34;47855:1;47847:6;47843:14;47836:58;47928:5;47923:2;47915:6;47911:15;47904:30;47719:222;:::o;47947:229::-;48087:34;48083:1;48075:6;48071:14;48064:58;48156:12;48151:2;48143:6;48139:15;48132:37;47947:229;:::o;48182:294::-;48322:34;48318:1;48310:6;48306:14;48299:58;48391:34;48386:2;48378:6;48374:15;48367:59;48460:8;48455:2;48447:6;48443:15;48436:33;48182:294;:::o;48482:221::-;48622:34;48618:1;48610:6;48606:14;48599:58;48691:4;48686:2;48678:6;48674:15;48667:29;48482:221;:::o;48709:::-;48849:34;48845:1;48837:6;48833:14;48826:58;48918:4;48913:2;48905:6;48901:15;48894:29;48709:221;:::o;48936:179::-;49076:31;49072:1;49064:6;49060:14;49053:55;48936:179;:::o;49121:229::-;49261:34;49257:1;49249:6;49245:14;49238:58;49330:12;49325:2;49317:6;49313:15;49306:37;49121:229;:::o;49356:225::-;49496:34;49492:1;49484:6;49480:14;49473:58;49565:8;49560:2;49552:6;49548:15;49541:33;49356:225;:::o;49587:::-;49727:34;49723:1;49715:6;49711:14;49704:58;49796:8;49791:2;49783:6;49779:15;49772:33;49587:225;:::o;49818:245::-;49958:34;49954:1;49946:6;49942:14;49935:58;50027:28;50022:2;50014:6;50010:15;50003:53;49818:245;:::o;50069:171::-;50209:23;50205:1;50197:6;50193:14;50186:47;50069:171;:::o;50246:179::-;50386:31;50382:1;50374:6;50370:14;50363:55;50246:179;:::o;50431:224::-;50571:34;50567:1;50559:6;50555:14;50548:58;50640:7;50635:2;50627:6;50623:15;50616:32;50431:224;:::o;50661:171::-;50801:23;50797:1;50789:6;50785:14;50778:47;50661:171;:::o;50838:181::-;50978:33;50974:1;50966:6;50962:14;50955:57;50838:181;:::o;51025:168::-;51165:20;51161:1;51153:6;51149:14;51142:44;51025:168;:::o;51199:171::-;51339:23;51335:1;51327:6;51323:14;51316:47;51199:171;:::o;51376:::-;51516:23;51512:1;51504:6;51500:14;51493:47;51376:171;:::o;51553:220::-;51693:34;51689:1;51681:6;51677:14;51670:58;51762:3;51757:2;51749:6;51745:15;51738:28;51553:220;:::o;51779:224::-;51919:34;51915:1;51907:6;51903:14;51896:58;51988:7;51983:2;51975:6;51971:15;51964:32;51779:224;:::o;52009:114::-;;:::o;52129:223::-;52269:34;52265:1;52257:6;52253:14;52246:58;52338:6;52333:2;52325:6;52321:15;52314:31;52129:223;:::o;52358:226::-;52498:34;52494:1;52486:6;52482:14;52475:58;52567:9;52562:2;52554:6;52550:15;52543:34;52358:226;:::o;52590:224::-;52730:34;52726:1;52718:6;52714:14;52707:58;52799:7;52794:2;52786:6;52782:15;52775:32;52590:224;:::o;52820:122::-;52893:24;52911:5;52893:24;:::i;:::-;52886:5;52883:35;52873:63;;52932:1;52929;52922:12;52873:63;52820:122;:::o;52948:116::-;53018:21;53033:5;53018:21;:::i;:::-;53011:5;53008:32;52998:60;;53054:1;53051;53044:12;52998:60;52948:116;:::o;53070:120::-;53142:23;53159:5;53142:23;:::i;:::-;53135:5;53132:34;53122:62;;53180:1;53177;53170:12;53122:62;53070:120;:::o;53196:122::-;53269:24;53287:5;53269:24;:::i;:::-;53262:5;53259:35;53249:63;;53308:1;53305;53298:12;53249:63;53196:122;:::o;53324:118::-;53395:22;53411:5;53395:22;:::i;:::-;53388:5;53385:33;53375:61;;53432:1;53429;53422:12;53375:61;53324:118;:::o

Swarm Source

ipfs://358f203e0f3d59f4ce162bd8e30fa6f91becc6ac18a6a73f7ceb75b4eaced530
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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