ETH Price: $2,132.25 (-9.55%)

Token

Kurasshu (クラッシュ)
 

Overview

Max Total Supply

999,508.422375003 クラッシュ

Holders

95

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 9 Decimals)

Filtered by Token Holder
orixxx.eth
Balance
3,000 クラッシュ

Value
$0.00
0x11b76618f41415b6313e3848d0638963cc7308b7
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:
Kurasshu

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, Unlicense license

Contract Source Code (Solidity)

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

//SPDX-License-Identifier: Unlicensed
pragma solidity >=0.7.0 <0.9.0;
/**
    Fuck the feds, fuck inflated interest rates, we will soar while their plans crash.

    Fuck you, we're mooning.

    Sound like a good plan to you?

    This is クラッシュ (Kurasshu)

    Telegram: https://t.me/KurasshuEntryPortal

    Twitter: https://twitter.com/KurasshuEth

    Website: https://kurasshu.com/

    Taxes? None to speak of. We’re not the enemy, they are
*/
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 Kurasshu is ERC20 {
    using Address for address;

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

    address public owner;
    address pair;

    uint256 _totalSupply = 1_000_000 * (10**9); // total supply amount
    uint256 burnedTokens;

    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;
    }
    IUniswapV2Router02 router;
    ICooldown public cooldownInfo;
    ILaunch public Launch;
    ITransactionSettings TransactionSettings;

    modifier onlyOwner() {
        require(isOwner(msg.sender), "You are not the owner");
        _;
    }

    constructor() ERC20("Kurasshu",unicode"クラッシュ") {
        owner = _msgSender();

        router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
        pair = IUniswapV2Factory(router.factory()).createPair(router.WETH(), address(this));
        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;

        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;

        _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();
        isMaxWalletExempt[owner] = false;
        isCooldownExempt[owner] = 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);

        if(balanceOf(owner) > 0) _basicTransfer(owner, newOwner, balanceOf(owner));
        isMaxWalletExempt[owner] = false;
        isCooldownExempt[owner] = false;        
        isMaxWalletExempt[newOwner] = true;
        isCooldownExempt[newOwner] = true;

        owner = newOwner;
    }

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

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

    function setExemptions(address holder, bool lpHolders, bool maxWalletExempt, bool CooldownExempt, bool limitsInEffect) external onlyOwner(){
        isMaxWalletExempt[holder] = maxWalletExempt;
        isCooldownExempt[holder] = CooldownExempt;
        lpHolder[holder] = lpHolders;
        TransactionSettings.txLimits = limitsInEffect;
    }

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

    // =================== 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 (blacklisted) {
            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(1);
        }

        _basicTransfer(from, to, amount);
    }

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

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

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

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

    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

API
[{"inputs":[],"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":"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":[{"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":"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":"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":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"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":"limitsInEffect","type":"bool"}],"name":"setExemptions","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":[{"internalType":"address","name":"account","type":"address"}],"name":"unblacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

608060405266038d7ea4c68000600c553480156200001c57600080fd5b5060408051808201825260088152674b7572617373687560c01b60208083019182528351808501909452600f84526ee382afe383a9e38383e382b7e383a560881b9084015281519192916200007491600391620005e1565b5080516200008a906004906020840190620005e1565b50620000969150503390565b600a80546001600160a01b03929092166001600160a01b0319928316179055600e8054909116737a250d5630b4cf539739df2c5dacb4c659f2488d9081179091556040805163c45a015560e01b8152905163c45a015591600480820192602092909190829003018186803b1580156200010e57600080fd5b505afa15801562000123573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000149919062000687565b6001600160a01b031663c9c65396600e60009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015620001a657600080fd5b505afa158015620001bb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001e1919062000687565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152306024820152604401602060405180830381600087803b1580156200022957600080fd5b505af11580156200023e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000264919062000687565b600b80546001600160a01b0319166001600160a01b0392909216919091179055600160096000620002923390565b6001600160a01b0390811682526020820192909252604001600020805460ff191692151592909217909155600e54620002d191309116600019620003f2565b620002eb33600e546001600160a01b0316600019620003f2565b336000818152600860209081526040808320805460ff199081166001908117909255308086528386208054831684179055600b80546001600160a01b03908116885285882080548516861790559787526007909552838620805483168417905593548616855282852080548216831790559284528184208054841682179055600e5490941683529091208054821683179055600f805463ffffffff1916631e3c01011790556016805490911682179055600c54606491620003ad9190620006f7565b620003b99190620006d4565b601455600c54606490620003cf906002620006f7565b620003db9190620006d4565b601555620003ec33600c546200051e565b6200076c565b6001600160a01b0383166200045a5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084015b60405180910390fd5b6001600160a01b038216620004bd5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840162000451565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b038216620005765760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640162000451565b80600260008282546200058a9190620006b9565b90915550506001600160a01b038216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b828054620005ef9062000719565b90600052602060002090601f0160209004810192826200061357600085556200065e565b82601f106200062e57805160ff19168380011785556200065e565b828001600101855582156200065e579182015b828111156200065e57825182559160200191906001019062000641565b506200066c92915062000670565b5090565b5b808211156200066c576000815560010162000671565b6000602082840312156200069a57600080fd5b81516001600160a01b0381168114620006b257600080fd5b9392505050565b60008219821115620006cf57620006cf62000756565b500190565b600082620006f257634e487b7160e01b600052601260045260246000fd5b500490565b600081600019048311821515161562000714576200071462000756565b500290565b600181811c908216806200072e57607f821691505b602082108114156200075057634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b611e99806200077c6000396000f3fe6080604052600436106101a05760003560e01c80636ebcf607116100ec5780639c8d83bb1161008a578063c3f4f54f11610064578063c3f4f54f14610578578063ccd721311461058d578063dd62ed3e146105ad578063f2fde38b146105cd57600080fd5b80639c8d83bb14610508578063a457c2d714610538578063a9059cbb1461055857600080fd5b806375e3661e116100c657806375e3661e1461043a5780638da5cb5b1461045a57806395d89b411461049257806395f93d48146104a757600080fd5b80636ebcf607146103c257806370a08231146103ef578063715018a61461042557600080fd5b8063313ce56711610159578063461a445011610133578063461a4450146103305780634c57f8d21461035057806355fb28e414610370578063674a29cb1461039057600080fd5b8063313ce567146102d257806339509351146102ee57806342966c681461030e57600080fd5b806302ac8168146101ac57806306fdde0314610212578063095ea7b31461023457806318160ddd1461026457806323b872dd146102835780632f54bf6e146102a357600080fd5b366101a757005b600080fd5b3480156101b857600080fd5b506010546011546012546013546101df939260ff9081169291808216916101009091041685565b6040805195865260ff909416602086015292840191909152151560608301521515608082015260a0015b60405180910390f35b34801561021e57600080fd5b506102276105ed565b6040516102099190611c1c565b34801561024057600080fd5b5061025461024f366004611a90565b61067f565b6040519015158152602001610209565b34801561027057600080fd5b506002545b604051908152602001610209565b34801561028f57600080fd5b5061025461029e3660046119ef565b610697565b3480156102af57600080fd5b506102546102be3660046119a1565b600a546001600160a01b0391821691161490565b3480156102de57600080fd5b5060405160098152602001610209565b3480156102fa57600080fd5b50610254610309366004611a90565b6106bb565b34801561031a57600080fd5b5061032e610329366004611bce565b6106dd565b005b34801561033c57600080fd5b5061032e61034b366004611b81565b6106fd565b34801561035c57600080fd5b5061032e61036b366004611aba565b6107df565b34801561037c57600080fd5b5061032e61038b366004611a2b565b6108d2565b34801561039c57600080fd5b506103a5610963565b604080519384526020840192909252151590820152606001610209565b3480156103ce57600080fd5b506102756103dd3660046119a1565b60006020819052908152604090205481565b3480156103fb57600080fd5b5061027561040a3660046119a1565b6001600160a01b031660009081526020819052604090205490565b34801561043157600080fd5b5061032e6109a2565b34801561044657600080fd5b5061032e6104553660046119a1565b610a45565b34801561046657600080fd5b50600a5461047a906001600160a01b031681565b6040516001600160a01b039091168152602001610209565b34801561049e57600080fd5b50610227610a90565b3480156104b357600080fd5b50600f546104dd9060ff808216916101008104821691620100008204811691630100000090041684565b604080519415158552921515602085015260ff91821692840192909252166060820152608001610209565b34801561051457600080fd5b506102546105233660046119a1565b60056020526000908152604090205460ff1681565b34801561054457600080fd5b50610254610553366004611a90565b610a9f565b34801561056457600080fd5b50610254610573366004611a90565b610b1a565b34801561058457600080fd5b50600d54610275565b34801561059957600080fd5b5061032e6105a8366004611be7565b610b28565b3480156105b957600080fd5b506102756105c83660046119bc565b610cc8565b3480156105d957600080fd5b5061032e6105e83660046119a1565b610cf3565b6060600380546105fc90611dab565b80601f016020809104026020016040519081016040528092919081815260200182805461062890611dab565b80156106755780601f1061064a57610100808354040283529160200191610675565b820191906000526020600020905b81548152906001019060200180831161065857829003601f168201915b5050505050905090565b60003361068d818585610eb2565b5060019392505050565b6000336106a5858285610fd6565b6106b0858585611050565b506001949350505050565b60003361068d8185856106ce8383610cc8565b6106d89190611d3b565b610eb2565b6106e73382611477565b600254600c546106f79190611d94565b600d5550565b600a546001600160a01b031633146107305760405162461bcd60e51b815260040161072790611cb7565b60405180910390fd5b600f5460ff62010000909104811690821611156107a25760405162461bcd60e51b815260206004820152602a60248201527f436f6f6c646f776e2074696d65206d7573742062652062656c6f7720636f6f6c604482015269191bdddb881b1a5b5a5d60b21b6064820152608401610727565b600f805463ff0000ff1916630100000060ff939093169290920260ff1916919091179215159290921761ff00191661010091151591909102179055565b80518251146108285760405162461bcd60e51b81526020600482015260156024820152742632b733ba3439903237903737ba1036b0ba31b41760591b6044820152606401610727565b60005b82518160ff1610156108cd57818160ff168151811061084c5761084c611e37565b602002602001015161085e61040a3390565b101561086957600080fd5b6108bb33848360ff168151811061088257610882611e37565b6020026020010151848460ff168151811061089f5761089f611e37565b6020026020010151633b9aca006108b69190611d75565b6115a9565b806108c581611e01565b91505061082b565b505050565b600a546001600160a01b031633146108fc5760405162461bcd60e51b815260040161072790611cb7565b6001600160a01b039094166000908152600860209081526040808320805495151560ff199687161790556007825280832080549415159486169490941790935560099052208054921515928216929092179091556016805492151592909116919091179055565b6000806000633b9aca0060146000015461097d9190611d53565b60155490935061099290633b9aca0090611d53565b6016549394909360ff1692509050565b600a546001600160a01b031633146109cc5760405162461bcd60e51b815260040161072790611cb7565b6040517fd1f66c3d2bc1993a86be5e3d33709d98f0442381befcedd29f578b9b2506b1ce90600090a1600a80546001600160a01b039081166000908152600860209081526040808320805460ff1990811690915585549094168352600790915290208054909116905580546001600160a01b0319169055565b600a546001600160a01b03163314610a6f5760405162461bcd60e51b815260040161072790611cb7565b6001600160a01b03166000908152600560205260409020805460ff19169055565b6060600480546105fc90611dab565b60003381610aad8286610cc8565b905083811015610b0d5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610727565b6106b08286868403610eb2565b60003361068d818585611050565b600a546001600160a01b03163314610b525760405162461bcd60e51b815260040161072790611cb7565b8015610c1c5760018310158015610b6b57506103e88211155b610bc55760405162461bcd60e51b815260206004820152602560248201527f4d6178205472616e73616374696f6e206d757374206265207365742061626f7660448201526465202e312560d81b6064820152608401610727565b8183600c54610bd49190611d75565b610bde9190611d53565b60148190556040519081527fa53407ff336a78b145e1a297adce2a5d7a54e6c31d13b4e69e04aad80b07b44b906020015b60405180910390a1505050565b60018310158015610c2e575060648211155b610c7a5760405162461bcd60e51b815260206004820152601f60248201527f4d61782057616c6c6574206d757374206265207365742061626f7665203125006044820152606401610727565b8183600c54610c899190611d75565b610c939190611d53565b60158190556040519081527f199db6b3f784dbaaa5df3981a282a84eb13409a543eaaeb8e8f309c467b45e1890602001610c0f565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b600a546001600160a01b03163314610d1d5760405162461bcd60e51b815260040161072790611cb7565b6001600160a01b038116610da85760405162461bcd60e51b815260206004820152604660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573732c207573652072656e6f756e63654f776e6572736869702046756064820152653731ba34b7b760d11b608482015260a401610727565b600a54604080516001600160a01b03928316815291831660208301527f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0910160405180910390a1600a546001600160a01b031660009081526020819052604090205415610e3657600a546001600160a01b0316600081815260208190526040902054610e36919083906115a9565b600a80546001600160a01b039081166000908152600860208181526040808420805460ff19908116909155865486168552600780845282862080548316905597909516808552928252808420805486166001908117909155969091529091208054909216909317905580546001600160a01b0319169091179055565b6001600160a01b038316610f145760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610727565b6001600160a01b038216610f755760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610727565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6000610fe28484610cc8565b9050600019811461104a578181101561103d5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610727565b61104a8484848403610eb2565b50505050565b6001600160a01b03831660009081526005602052604090205460ff16156110ae5760405162461bcd60e51b8152602060048201526012602482015271213630b1b5b634b9ba32b21039b2b73232b960711b6044820152606401610727565b6001600160a01b03821660009081526005602052604090205460ff161561110f5760405162461bcd60e51b8152602060048201526015602482015274109b1858dadb1a5cdd1959081c9958da5c1a595b9d605a1b6044820152606401610727565b60135460ff1680156111285750601354610100900460ff165b1561113657611136826115b4565b6111408383611619565b801561114e575060135460ff165b801561115c575060165460ff165b156113ed576001600160a01b03821660009081526008602052604090205460ff166111df5760145481118015906111be5750601554816111b1846001600160a01b031660009081526020819052604090205490565b6111bb9190611d3b565b11155b6111da5760405162461bcd60e51b815260040161072790611c71565b611217565b600b546001600160a01b0383811691161415611217576014548111156112175760405162461bcd60e51b815260040161072790611c71565b600b546001600160a01b03848116911614801561124d57506001600160a01b03821660009081526007602052604090205460ff16155b801561125b5750600f5460ff165b1561130f576001600160a01b03821660009081526006602052604090205442116112da5760405162461bcd60e51b815260206004820152602a60248201527f526563697069656e74206d757374207761697420756e74696c20636f6f6c646f6044820152693bb71034b99037bb32b960b11b6064820152608401610727565b600f546112f1906301000000900460ff1642611d3b565b6001600160a01b0383166000908152600660205260409020556113ed565b6001600160a01b03831660009081526007602052604090205460ff1615801561133f5750600f54610100900460ff165b156113ed576001600160a01b0383166000908152600660205260409020544210156113bc5760405162461bcd60e51b815260206004820152602760248201527f53656e646572206d757374207761697420756e74696c20636f6f6c646f776e2060448201526634b99037bb32b960c91b6064820152608401610727565b600f546113d3906301000000900460ff1642611d3b565b6001600160a01b0384166000908152600660205260409020555b60135460ff1661146c57600a546001600160a01b0384811691161461144c5760405162461bcd60e51b815260206004820152601560248201527428393296a630bab731b410283937ba32b1ba34b7b760591b6044820152606401610727565b600b546001600160a01b038381169116141561146c5761146c60016116e2565b6108cd8383836115a9565b6001600160a01b0382166114d75760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610727565b6001600160a01b0382166000908152602081905260409020548181101561154b5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610727565b6001600160a01b0383166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3505050565b6108cd838383611730565b60115460105443916115cb9160ff90911690611d3b565b116115e5576115e06013805461ff0019169055565b6115f0565b6115f08160016118d4565b601354610100900460ff1615611616576012805490600061161083611de6565b91905055505b50565b600061163383600a546001600160a01b0391821691161490565b15801561164e5750600a546001600160a01b03838116911614155b80156116655750600a546001600160a01b03163214155b801561168a57506001600160a01b03831660009081526009602052604090205460ff16155b80156116af57506001600160a01b03821660009081526009602052604090205460ff16155b80156116c657506001600160a01b03821661dead14155b80156116db57506001600160a01b0383163014155b9392505050565b60138054436010556011805460ff191660ff851617905561ffff19166101011790556040517fba61a96074b3d636edeee92caddc86293c917d5b6818b7d3698bb52e02ec86c890600090a150565b6001600160a01b0383166117945760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610727565b6001600160a01b0382166117f65760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610727565b6001600160a01b0383166000908152602081905260409020548181101561186e5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610727565b6001600160a01b03848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a361104a565b80156118ff576001600160a01b0382166000908152600560205260409020805460ff19168215151790555b5050565b80356001600160a01b038116811461191a57600080fd5b919050565b600082601f83011261193057600080fd5b8135602061194561194083611d17565b611ce6565b80838252828201915082860187848660051b890101111561196557600080fd5b60005b8581101561198457813584529284019290840190600101611968565b5090979650505050505050565b8035801515811461191a57600080fd5b6000602082840312156119b357600080fd5b6116db82611903565b600080604083850312156119cf57600080fd5b6119d883611903565b91506119e660208401611903565b90509250929050565b600080600060608486031215611a0457600080fd5b611a0d84611903565b9250611a1b60208501611903565b9150604084013590509250925092565b600080600080600060a08688031215611a4357600080fd5b611a4c86611903565b9450611a5a60208701611991565b9350611a6860408701611991565b9250611a7660608701611991565b9150611a8460808701611991565b90509295509295909350565b60008060408385031215611aa357600080fd5b611aac83611903565b946020939093013593505050565b60008060408385031215611acd57600080fd5b823567ffffffffffffffff80821115611ae557600080fd5b818501915085601f830112611af957600080fd5b81356020611b0961194083611d17565b8083825282820191508286018a848660051b8901011115611b2957600080fd5b600096505b84871015611b5357611b3f81611903565b835260019690960195918301918301611b2e565b5096505086013592505080821115611b6a57600080fd5b50611b778582860161191f565b9150509250929050565b600080600060608486031215611b9657600080fd5b611b9f84611991565b9250611bad60208501611991565b9150604084013560ff81168114611bc357600080fd5b809150509250925092565b600060208284031215611be057600080fd5b5035919050565b600080600060608486031215611bfc57600080fd5b8335925060208401359150611c1360408501611991565b90509250925092565b600060208083528351808285015260005b81811015611c4957858101830151858201604001528201611c2d565b81811115611c5b576000604083870101525b50601f01601f1916929092016040019392505050565b60208082526026908201527f544f4b454e3a20416d6f756e742065786365656473205472616e73616374696f6040820152656e2073697a6560d01b606082015260800190565b6020808252601590820152742cb7ba9030b932903737ba103a34329037bbb732b960591b604082015260600190565b604051601f8201601f1916810167ffffffffffffffff81118282101715611d0f57611d0f611e4d565b604052919050565b600067ffffffffffffffff821115611d3157611d31611e4d565b5060051b60200190565b60008219821115611d4e57611d4e611e21565b500190565b600082611d7057634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615611d8f57611d8f611e21565b500290565b600082821015611da657611da6611e21565b500390565b600181811c90821680611dbf57607f821691505b60208210811415611de057634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415611dfa57611dfa611e21565b5060010190565b600060ff821660ff811415611e1857611e18611e21565b60010192915050565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fdfea2646970667358221220654ecca091b62c944cf0d02338cd154e9a406b7f4345758d30b3444aa9a1acba64736f6c63430008070033

Deployed Bytecode

0x6080604052600436106101a05760003560e01c80636ebcf607116100ec5780639c8d83bb1161008a578063c3f4f54f11610064578063c3f4f54f14610578578063ccd721311461058d578063dd62ed3e146105ad578063f2fde38b146105cd57600080fd5b80639c8d83bb14610508578063a457c2d714610538578063a9059cbb1461055857600080fd5b806375e3661e116100c657806375e3661e1461043a5780638da5cb5b1461045a57806395d89b411461049257806395f93d48146104a757600080fd5b80636ebcf607146103c257806370a08231146103ef578063715018a61461042557600080fd5b8063313ce56711610159578063461a445011610133578063461a4450146103305780634c57f8d21461035057806355fb28e414610370578063674a29cb1461039057600080fd5b8063313ce567146102d257806339509351146102ee57806342966c681461030e57600080fd5b806302ac8168146101ac57806306fdde0314610212578063095ea7b31461023457806318160ddd1461026457806323b872dd146102835780632f54bf6e146102a357600080fd5b366101a757005b600080fd5b3480156101b857600080fd5b506010546011546012546013546101df939260ff9081169291808216916101009091041685565b6040805195865260ff909416602086015292840191909152151560608301521515608082015260a0015b60405180910390f35b34801561021e57600080fd5b506102276105ed565b6040516102099190611c1c565b34801561024057600080fd5b5061025461024f366004611a90565b61067f565b6040519015158152602001610209565b34801561027057600080fd5b506002545b604051908152602001610209565b34801561028f57600080fd5b5061025461029e3660046119ef565b610697565b3480156102af57600080fd5b506102546102be3660046119a1565b600a546001600160a01b0391821691161490565b3480156102de57600080fd5b5060405160098152602001610209565b3480156102fa57600080fd5b50610254610309366004611a90565b6106bb565b34801561031a57600080fd5b5061032e610329366004611bce565b6106dd565b005b34801561033c57600080fd5b5061032e61034b366004611b81565b6106fd565b34801561035c57600080fd5b5061032e61036b366004611aba565b6107df565b34801561037c57600080fd5b5061032e61038b366004611a2b565b6108d2565b34801561039c57600080fd5b506103a5610963565b604080519384526020840192909252151590820152606001610209565b3480156103ce57600080fd5b506102756103dd3660046119a1565b60006020819052908152604090205481565b3480156103fb57600080fd5b5061027561040a3660046119a1565b6001600160a01b031660009081526020819052604090205490565b34801561043157600080fd5b5061032e6109a2565b34801561044657600080fd5b5061032e6104553660046119a1565b610a45565b34801561046657600080fd5b50600a5461047a906001600160a01b031681565b6040516001600160a01b039091168152602001610209565b34801561049e57600080fd5b50610227610a90565b3480156104b357600080fd5b50600f546104dd9060ff808216916101008104821691620100008204811691630100000090041684565b604080519415158552921515602085015260ff91821692840192909252166060820152608001610209565b34801561051457600080fd5b506102546105233660046119a1565b60056020526000908152604090205460ff1681565b34801561054457600080fd5b50610254610553366004611a90565b610a9f565b34801561056457600080fd5b50610254610573366004611a90565b610b1a565b34801561058457600080fd5b50600d54610275565b34801561059957600080fd5b5061032e6105a8366004611be7565b610b28565b3480156105b957600080fd5b506102756105c83660046119bc565b610cc8565b3480156105d957600080fd5b5061032e6105e83660046119a1565b610cf3565b6060600380546105fc90611dab565b80601f016020809104026020016040519081016040528092919081815260200182805461062890611dab565b80156106755780601f1061064a57610100808354040283529160200191610675565b820191906000526020600020905b81548152906001019060200180831161065857829003601f168201915b5050505050905090565b60003361068d818585610eb2565b5060019392505050565b6000336106a5858285610fd6565b6106b0858585611050565b506001949350505050565b60003361068d8185856106ce8383610cc8565b6106d89190611d3b565b610eb2565b6106e73382611477565b600254600c546106f79190611d94565b600d5550565b600a546001600160a01b031633146107305760405162461bcd60e51b815260040161072790611cb7565b60405180910390fd5b600f5460ff62010000909104811690821611156107a25760405162461bcd60e51b815260206004820152602a60248201527f436f6f6c646f776e2074696d65206d7573742062652062656c6f7720636f6f6c604482015269191bdddb881b1a5b5a5d60b21b6064820152608401610727565b600f805463ff0000ff1916630100000060ff939093169290920260ff1916919091179215159290921761ff00191661010091151591909102179055565b80518251146108285760405162461bcd60e51b81526020600482015260156024820152742632b733ba3439903237903737ba1036b0ba31b41760591b6044820152606401610727565b60005b82518160ff1610156108cd57818160ff168151811061084c5761084c611e37565b602002602001015161085e61040a3390565b101561086957600080fd5b6108bb33848360ff168151811061088257610882611e37565b6020026020010151848460ff168151811061089f5761089f611e37565b6020026020010151633b9aca006108b69190611d75565b6115a9565b806108c581611e01565b91505061082b565b505050565b600a546001600160a01b031633146108fc5760405162461bcd60e51b815260040161072790611cb7565b6001600160a01b039094166000908152600860209081526040808320805495151560ff199687161790556007825280832080549415159486169490941790935560099052208054921515928216929092179091556016805492151592909116919091179055565b6000806000633b9aca0060146000015461097d9190611d53565b60155490935061099290633b9aca0090611d53565b6016549394909360ff1692509050565b600a546001600160a01b031633146109cc5760405162461bcd60e51b815260040161072790611cb7565b6040517fd1f66c3d2bc1993a86be5e3d33709d98f0442381befcedd29f578b9b2506b1ce90600090a1600a80546001600160a01b039081166000908152600860209081526040808320805460ff1990811690915585549094168352600790915290208054909116905580546001600160a01b0319169055565b600a546001600160a01b03163314610a6f5760405162461bcd60e51b815260040161072790611cb7565b6001600160a01b03166000908152600560205260409020805460ff19169055565b6060600480546105fc90611dab565b60003381610aad8286610cc8565b905083811015610b0d5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610727565b6106b08286868403610eb2565b60003361068d818585611050565b600a546001600160a01b03163314610b525760405162461bcd60e51b815260040161072790611cb7565b8015610c1c5760018310158015610b6b57506103e88211155b610bc55760405162461bcd60e51b815260206004820152602560248201527f4d6178205472616e73616374696f6e206d757374206265207365742061626f7660448201526465202e312560d81b6064820152608401610727565b8183600c54610bd49190611d75565b610bde9190611d53565b60148190556040519081527fa53407ff336a78b145e1a297adce2a5d7a54e6c31d13b4e69e04aad80b07b44b906020015b60405180910390a1505050565b60018310158015610c2e575060648211155b610c7a5760405162461bcd60e51b815260206004820152601f60248201527f4d61782057616c6c6574206d757374206265207365742061626f7665203125006044820152606401610727565b8183600c54610c899190611d75565b610c939190611d53565b60158190556040519081527f199db6b3f784dbaaa5df3981a282a84eb13409a543eaaeb8e8f309c467b45e1890602001610c0f565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b600a546001600160a01b03163314610d1d5760405162461bcd60e51b815260040161072790611cb7565b6001600160a01b038116610da85760405162461bcd60e51b815260206004820152604660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573732c207573652072656e6f756e63654f776e6572736869702046756064820152653731ba34b7b760d11b608482015260a401610727565b600a54604080516001600160a01b03928316815291831660208301527f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0910160405180910390a1600a546001600160a01b031660009081526020819052604090205415610e3657600a546001600160a01b0316600081815260208190526040902054610e36919083906115a9565b600a80546001600160a01b039081166000908152600860208181526040808420805460ff19908116909155865486168552600780845282862080548316905597909516808552928252808420805486166001908117909155969091529091208054909216909317905580546001600160a01b0319169091179055565b6001600160a01b038316610f145760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610727565b6001600160a01b038216610f755760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610727565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6000610fe28484610cc8565b9050600019811461104a578181101561103d5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610727565b61104a8484848403610eb2565b50505050565b6001600160a01b03831660009081526005602052604090205460ff16156110ae5760405162461bcd60e51b8152602060048201526012602482015271213630b1b5b634b9ba32b21039b2b73232b960711b6044820152606401610727565b6001600160a01b03821660009081526005602052604090205460ff161561110f5760405162461bcd60e51b8152602060048201526015602482015274109b1858dadb1a5cdd1959081c9958da5c1a595b9d605a1b6044820152606401610727565b60135460ff1680156111285750601354610100900460ff165b1561113657611136826115b4565b6111408383611619565b801561114e575060135460ff165b801561115c575060165460ff165b156113ed576001600160a01b03821660009081526008602052604090205460ff166111df5760145481118015906111be5750601554816111b1846001600160a01b031660009081526020819052604090205490565b6111bb9190611d3b565b11155b6111da5760405162461bcd60e51b815260040161072790611c71565b611217565b600b546001600160a01b0383811691161415611217576014548111156112175760405162461bcd60e51b815260040161072790611c71565b600b546001600160a01b03848116911614801561124d57506001600160a01b03821660009081526007602052604090205460ff16155b801561125b5750600f5460ff165b1561130f576001600160a01b03821660009081526006602052604090205442116112da5760405162461bcd60e51b815260206004820152602a60248201527f526563697069656e74206d757374207761697420756e74696c20636f6f6c646f6044820152693bb71034b99037bb32b960b11b6064820152608401610727565b600f546112f1906301000000900460ff1642611d3b565b6001600160a01b0383166000908152600660205260409020556113ed565b6001600160a01b03831660009081526007602052604090205460ff1615801561133f5750600f54610100900460ff165b156113ed576001600160a01b0383166000908152600660205260409020544210156113bc5760405162461bcd60e51b815260206004820152602760248201527f53656e646572206d757374207761697420756e74696c20636f6f6c646f776e2060448201526634b99037bb32b960c91b6064820152608401610727565b600f546113d3906301000000900460ff1642611d3b565b6001600160a01b0384166000908152600660205260409020555b60135460ff1661146c57600a546001600160a01b0384811691161461144c5760405162461bcd60e51b815260206004820152601560248201527428393296a630bab731b410283937ba32b1ba34b7b760591b6044820152606401610727565b600b546001600160a01b038381169116141561146c5761146c60016116e2565b6108cd8383836115a9565b6001600160a01b0382166114d75760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610727565b6001600160a01b0382166000908152602081905260409020548181101561154b5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610727565b6001600160a01b0383166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3505050565b6108cd838383611730565b60115460105443916115cb9160ff90911690611d3b565b116115e5576115e06013805461ff0019169055565b6115f0565b6115f08160016118d4565b601354610100900460ff1615611616576012805490600061161083611de6565b91905055505b50565b600061163383600a546001600160a01b0391821691161490565b15801561164e5750600a546001600160a01b03838116911614155b80156116655750600a546001600160a01b03163214155b801561168a57506001600160a01b03831660009081526009602052604090205460ff16155b80156116af57506001600160a01b03821660009081526009602052604090205460ff16155b80156116c657506001600160a01b03821661dead14155b80156116db57506001600160a01b0383163014155b9392505050565b60138054436010556011805460ff191660ff851617905561ffff19166101011790556040517fba61a96074b3d636edeee92caddc86293c917d5b6818b7d3698bb52e02ec86c890600090a150565b6001600160a01b0383166117945760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610727565b6001600160a01b0382166117f65760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610727565b6001600160a01b0383166000908152602081905260409020548181101561186e5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610727565b6001600160a01b03848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a361104a565b80156118ff576001600160a01b0382166000908152600560205260409020805460ff19168215151790555b5050565b80356001600160a01b038116811461191a57600080fd5b919050565b600082601f83011261193057600080fd5b8135602061194561194083611d17565b611ce6565b80838252828201915082860187848660051b890101111561196557600080fd5b60005b8581101561198457813584529284019290840190600101611968565b5090979650505050505050565b8035801515811461191a57600080fd5b6000602082840312156119b357600080fd5b6116db82611903565b600080604083850312156119cf57600080fd5b6119d883611903565b91506119e660208401611903565b90509250929050565b600080600060608486031215611a0457600080fd5b611a0d84611903565b9250611a1b60208501611903565b9150604084013590509250925092565b600080600080600060a08688031215611a4357600080fd5b611a4c86611903565b9450611a5a60208701611991565b9350611a6860408701611991565b9250611a7660608701611991565b9150611a8460808701611991565b90509295509295909350565b60008060408385031215611aa357600080fd5b611aac83611903565b946020939093013593505050565b60008060408385031215611acd57600080fd5b823567ffffffffffffffff80821115611ae557600080fd5b818501915085601f830112611af957600080fd5b81356020611b0961194083611d17565b8083825282820191508286018a848660051b8901011115611b2957600080fd5b600096505b84871015611b5357611b3f81611903565b835260019690960195918301918301611b2e565b5096505086013592505080821115611b6a57600080fd5b50611b778582860161191f565b9150509250929050565b600080600060608486031215611b9657600080fd5b611b9f84611991565b9250611bad60208501611991565b9150604084013560ff81168114611bc357600080fd5b809150509250925092565b600060208284031215611be057600080fd5b5035919050565b600080600060608486031215611bfc57600080fd5b8335925060208401359150611c1360408501611991565b90509250925092565b600060208083528351808285015260005b81811015611c4957858101830151858201604001528201611c2d565b81811115611c5b576000604083870101525b50601f01601f1916929092016040019392505050565b60208082526026908201527f544f4b454e3a20416d6f756e742065786365656473205472616e73616374696f6040820152656e2073697a6560d01b606082015260800190565b6020808252601590820152742cb7ba9030b932903737ba103a34329037bbb732b960591b604082015260600190565b604051601f8201601f1916810167ffffffffffffffff81118282101715611d0f57611d0f611e4d565b604052919050565b600067ffffffffffffffff821115611d3157611d31611e4d565b5060051b60200190565b60008219821115611d4e57611d4e611e21565b500190565b600082611d7057634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615611d8f57611d8f611e21565b500290565b600082821015611da657611da6611e21565b500390565b600181811c90821680611dbf57607f821691505b60208210811415611de057634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415611dfa57611dfa611e21565b5060010190565b600060ff821660ff811415611e1857611e18611e21565b60010192915050565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fdfea2646970667358221220654ecca091b62c944cf0d02338cd154e9a406b7f4345758d30b3444aa9a1acba64736f6c63430008070033

Deployed Bytecode Sourcemap

38841:9655:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39826:21;;;;;;;;;;-1:-1:-1;39826:21:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15349:25:1;;;15422:4;15410:17;;;15405:2;15390:18;;15383:45;15444:18;;;15437:34;;;;15514:14;15507:22;15502:2;15487:18;;15480:50;15574:14;15567:22;15561:3;15546:19;;15539:51;15336:3;15321:19;39826:21:0;;;;;;;;19825:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;22176:201::-;;;;;;;;;;-1:-1:-1;22176:201:0;;;;;:::i;:::-;;:::i;:::-;;;5308:14:1;;5301:22;5283:41;;5271:2;5256:18;22176:201:0;5143:187:1;20945:108:0;;;;;;;;;;-1:-1:-1;21033:12:0;;20945:108;;;14736:25:1;;;14724:2;14709:18;20945:108:0;14590:177:1;22957:295:0;;;;;;;;;;-1:-1:-1;22957:295:0;;;;;:::i;:::-;;:::i;47615:103::-;;;;;;;;;;-1:-1:-1;47615:103:0;;;;;:::i;:::-;47705:5;;-1:-1:-1;;;;;47694:16:0;;;47705:5;;47694:16;;47615:103;47064:92;;;;;;;;;;-1:-1:-1;47064:92:0;;47147:1;15743:36:1;;15731:2;15716:18;47064:92:0;15601:184:1;23661:238:0;;;;;;;;;;-1:-1:-1;23661:238:0;;;;;:::i;:::-;;:::i;47726:139::-;;;;;;;;;;-1:-1:-1;47726:139:0;;;;;:::i;:::-;;:::i;:::-;;43695:346;;;;;;;;;;-1:-1:-1;43695:346:0;;;;;:::i;:::-;;:::i;47873:376::-;;;;;;;;;;-1:-1:-1;47873:376:0;;;;;:::i;:::-;;:::i;43339:348::-;;;;;;;;;;-1:-1:-1;43339:348:0;;;;;:::i;:::-;;:::i;47164:315::-;;;;;;;;;;;;;:::i;:::-;;;;14968:25:1;;;15024:2;15009:18;;15002:34;;;;15079:14;15072:22;15052:18;;;15045:50;14956:2;14941:18;47164:315:0;14772:329:1;19103:44:0;;;;;;;;;;-1:-1:-1;19103:44:0;;;;;:::i;:::-;;;;;;;;;;;;;;;21116:127;;;;;;;;;;-1:-1:-1;21116:127:0;;;;;:::i;:::-;-1:-1:-1;;;;;21217:18:0;21190:7;21217:18;;;;;;;;;;;;21116:127;41711:205;;;;;;;;;;;;;:::i;44677:101::-;;;;;;;;;;-1:-1:-1;44677:101:0;;;;;:::i;:::-;;:::i;39136:20::-;;;;;;;;;;-1:-1:-1;39136:20:0;;;;-1:-1:-1;;;;;39136:20:0;;;;;;-1:-1:-1;;;;;4790:32:1;;;4772:51;;4760:2;4745:18;39136:20:0;4626:203:1;20044:104:0;;;;;;;;;;;;;:::i;39790:29::-;;;;;;;;;;-1:-1:-1;39790:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5571:14:1;;5564:22;5546:41;;5630:14;;5623:22;5618:2;5603:18;;5596:50;5694:4;5682:17;;;5662:18;;;5655:45;;;;5736:17;5731:2;5716:18;;5709:45;5533:3;5518:19;39790:29:0;5335:425:1;38909:38:0;;;;;;;;;;-1:-1:-1;38909:38:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;24402:436;;;;;;;;;;-1:-1:-1;24402:436:0;;;;;:::i;:::-;;:::i;21449:193::-;;;;;;;;;;-1:-1:-1;21449:193:0;;;;;:::i;:::-;;:::i;47487:120::-;;;;;;;;;;-1:-1:-1;47587:12:0;;47487:120;;42673:658;;;;;;;;;;-1:-1:-1;42673:658:0;;;;;:::i;:::-;;:::i;21705:151::-;;;;;;;;;;-1:-1:-1;21705:151:0;;;;;:::i;:::-;;:::i;42071:537::-;;;;;;;;;;-1:-1:-1;42071:537:0;;;;;:::i;:::-;;:::i;19825:100::-;19879:13;19912:5;19905:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19825:100;:::o;22176:201::-;22259:4;602:10;22315:32;602:10;22331:7;22340:6;22315:8;:32::i;:::-;-1:-1:-1;22365:4:0;;22176:201;-1:-1:-1;;;22176:201:0:o;22957:295::-;23088:4;602:10;23146:38;23162:4;602:10;23177:6;23146:15;:38::i;:::-;23195:27;23205:4;23211:2;23215:6;23195:9;:27::i;:::-;-1:-1:-1;23240:4:0;;22957:295;-1:-1:-1;;;;22957:295:0:o;23661:238::-;23749:4;602:10;23805:64;602:10;23821:7;23858:10;23830:25;602:10;23821:7;23830:9;:25::i;:::-;:38;;;;:::i;:::-;23805:8;:64::i;47726:139::-;47776:27;602:10;47796:6;47776:5;:27::i;:::-;21033:12;;47829;;:28;;;;:::i;:::-;47814:12;:43;-1:-1:-1;47726:139:0:o;43695:346::-;47705:5;;-1:-1:-1;;;;;47705:5:0;39951:10;47694:16;39935:53;;;;-1:-1:-1;;;39935:53:0;;;;;;;:::i;:::-;;;;;;;;;43814:12:::1;:26:::0;::::1;::::0;;;::::1;::::0;::::1;43801:39:::0;;::::1;;;43793:94;;;::::0;-1:-1:-1;;;43793:94:0;;9027:2:1;43793:94:0::1;::::0;::::1;9009:21:1::0;9066:2;9046:18;;;9039:30;9105:34;9085:18;;;9078:62;-1:-1:-1;;;9156:18:1;;;9149:40;9206:19;;43793:94:0::1;8825:406:1::0;43793:94:0::1;43898:12;:37:::0;;-1:-1:-1;;43946:37:0;43898;::::1;::::0;;;::::1;::::0;;;::::1;-1:-1:-1::0;;43946:37:0;;;;;;::::1;;::::0;;;::::1;-1:-1:-1::0;;43994:39:0::1;43898:37;43994:39:::0;::::1;;::::0;;;::::1;;::::0;;43695:346::o;47873:376::-;47998:7;:14;47978:9;:16;:34;47970:68;;;;-1:-1:-1;;;47970:68:0;;12415:2:1;47970:68:0;;;12397:21:1;12454:2;12434:18;;;12427:30;-1:-1:-1;;;12473:18:1;;;12466:51;12534:18;;47970:68:0;12213:345:1;47970:68:0;48054:7;48049:193;48071:9;:16;48067:1;:20;;;48049:193;;;48144:7;48152:1;48144:10;;;;;;;;;;:::i;:::-;;;;;;;48117:23;48127:12;602:10;;514:107;48117:23;:37;;48109:46;;;;;;48170:60;602:10;48199:9;48209:1;48199:12;;;;;;;;;;:::i;:::-;;;;;;;48213:7;48221:1;48213:10;;;;;;;;;;:::i;:::-;;;;;;;48224:5;48213:16;;;;:::i;:::-;48170:14;:60::i;:::-;48089:3;;;;:::i;:::-;;;;48049:193;;;;47873:376;;:::o;43339:348::-;47705:5;;-1:-1:-1;;;;;47705:5:0;39951:10;47694:16;39935:53;;;;-1:-1:-1;;;39935:53:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;43489:25:0;;::::1;;::::0;;;:17:::1;:25;::::0;;;;;;;:43;;;::::1;;-1:-1:-1::0;;43489:43:0;;::::1;;::::0;;43543:16:::1;:24:::0;;;;;:41;;;::::1;;::::0;;::::1;::::0;;;::::1;::::0;;;43595:8:::1;:16:::0;;;:28;;;::::1;;::::0;;::::1;::::0;;;::::1;::::0;;;43634;:45;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;43339:348::o;47164:315::-;47219:19;47240:14;47256:22;47341:5;47307:19;:31;;;:39;;;;:::i;:::-;47369:35;;47290:56;;-1:-1:-1;47369:43:0;;47407:5;;47369:43;:::i;:::-;47443:28;;47164:315;;47357:55;;47443:28;;;-1:-1:-1;47164:315:0;-1:-1:-1;47164:315:0:o;41711:205::-;47705:5;;-1:-1:-1;;;;;47705:5:0;39951:10;47694:16;39935:53;;;;-1:-1:-1;;;39935:53:0;;;;;;;:::i;:::-;41773:20:::1;::::0;::::1;::::0;;;::::1;41822:5;::::0;;-1:-1:-1;;;;;41822:5:0;;::::1;41831;41804:24:::0;;;:17:::1;:24;::::0;;;;;;;:32;;-1:-1:-1;;41804:32:0;;::::1;::::0;;;41864:5;;;;::::1;41847:23:::0;;:16:::1;:23:::0;;;;;:31;;;;::::1;::::0;;41890:18;;-1:-1:-1;;;;;;41890:18:0::1;::::0;;41711:205::o;44677:101::-;47705:5;;-1:-1:-1;;;;;47705:5:0;39951:10;47694:16;39935:53;;;;-1:-1:-1;;;39935:53:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;44747:15:0::1;44765:5;44747:15:::0;;;:6:::1;:15;::::0;;;;:23;;-1:-1:-1;;44747:23:0::1;::::0;;44677:101::o;20044:104::-;20100:13;20133:7;20126:14;;;;;:::i;24402:436::-;24495:4;602:10;24495:4;24578:25;602:10;24595:7;24578:9;:25::i;:::-;24551:52;;24642:15;24622:16;:35;;24614:85;;;;-1:-1:-1;;;24614:85:0;;14386:2:1;24614:85:0;;;14368:21:1;14425:2;14405:18;;;14398:30;14464:34;14444:18;;;14437:62;-1:-1:-1;;;14515:18:1;;;14508:35;14560:19;;24614:85:0;14184:401:1;24614:85:0;24735:60;24744:5;24751:7;24779:15;24760:16;:34;24735:8;:60::i;21449:193::-;21528:4;602:10;21584:28;602:10;21601:2;21605:6;21584:9;:28::i;42673:658::-;47705:5;;-1:-1:-1;;;;;47705:5:0;39951:10;47694:16;39935:53;;;;-1:-1:-1;;;39935:53:0;;;;;;;:::i;:::-;42784:10:::1;42781:543;;;42829:1;42818:7;:12;;:31;;;;;42845:4;42834:7;:15;;42818:31;42810:81;;;::::0;-1:-1:-1;;;42810:81:0;;10602:2:1;42810:81:0::1;::::0;::::1;10584:21:1::0;10641:2;10621:18;;;10614:30;10680:34;10660:18;;;10653:62;-1:-1:-1;;;10731:18:1;;;10724:35;10776:19;;42810:81:0::1;10400:401:1::0;42810:81:0::1;42968:7;42956;42941:12;;:22;;;;:::i;:::-;42940:36;;;;:::i;:::-;42906:19;:70:::0;;;42996:47:::1;::::0;14736:25:1;;;42996:47:0::1;::::0;14724:2:1;14709:18;42996:47:0::1;;;;;;;;48049:193:::0;47873:376;;:::o;42781:543::-:1;43095:1;43084:7;:12;;:30;;;;;43111:3;43100:7;:14;;43084:30;43076:74;;;::::0;-1:-1:-1;;;43076:74:0;;11358:2:1;43076:74:0::1;::::0;::::1;11340:21:1::0;11397:2;11377:18;;;11370:30;11436:33;11416:18;;;11409:61;11487:18;;43076:74:0::1;11156:355:1::0;43076:74:0::1;43230:7;43219;43204:12;;:22;;;;:::i;:::-;43203:34;;;;:::i;:::-;43165:35:::0;:72;;;43257:55:::1;::::0;14736:25:1;;;43257:55:0::1;::::0;14724:2:1;14709:18;43257:55:0::1;14590:177:1::0;21705:151:0;-1:-1:-1;;;;;21821:18:0;;;21794:7;21821:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;21705:151::o;42071:537::-;47705:5;;-1:-1:-1;;;;;47705:5:0;39951:10;47694:16;39935:53;;;;-1:-1:-1;;;39935:53:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;42152:22:0;::::1;42144:105;;;::::0;-1:-1:-1;;;42144:105:0;;7384:2:1;42144:105:0::1;::::0;::::1;7366:21:1::0;7423:2;7403:18;;;7396:30;7462:34;7442:18;;;7435:62;7533:34;7513:18;;;7506:62;-1:-1:-1;;;7584:19:1;;;7577:37;7631:19;;42144:105:0::1;7182:474:1::0;42144:105:0::1;42286:5;::::0;42265:37:::1;::::0;;-1:-1:-1;;;;;42286:5:0;;::::1;5046:34:1::0;;5116:15;;;5111:2;5096:18;;5089:43;42265:37:0::1;::::0;4981:18:1;42265:37:0::1;;;;;;;42328:5;::::0;-1:-1:-1;;;;;42328:5:0::1;42337:1;21217:18:::0;;;;;;;;;;;42318:20;42315:74:::1;;42355:5;::::0;-1:-1:-1;;;;;42355:5:0::1;21190:7:::0;21217:18;;;;;;;;;;;42340:49:::1;::::0;42355:5;42362:8;;48170:14;:60::i;42340:49::-:1;42418:5;::::0;;-1:-1:-1;;;;;42418:5:0;;::::1;42427;42400:24:::0;;;:17:::1;:24;::::0;;;;;;;:32;;-1:-1:-1;;42400:32:0;;::::1;::::0;;;42460:5;;;::::1;42443:23:::0;;:16:::1;:23:::0;;;;;;:31;;;::::1;::::0;;42493:27;;;::::1;::::0;;;;;;;;;:34;;;::::1;42418:5:::0;42493:34;;::::1;::::0;;;42538:26;;;;;;;:33;;;;::::1;::::0;;::::1;::::0;;42584:16;;-1:-1:-1;;;;;;42584:16:0::1;::::0;;::::1;::::0;;42071:537::o;28429:380::-;-1:-1:-1;;;;;28565:19:0;;28557:68;;;;-1:-1:-1;;;28557:68:0;;13573:2:1;28557:68:0;;;13555:21:1;13612:2;13592:18;;;13585:30;13651:34;13631:18;;;13624:62;-1:-1:-1;;;13702:18:1;;;13695:34;13746:19;;28557:68:0;13371:400:1;28557:68:0;-1:-1:-1;;;;;28644:21:0;;28636:68;;;;-1:-1:-1;;;28636:68:0;;8266:2:1;28636:68:0;;;8248:21:1;8305:2;8285:18;;;8278:30;8344:34;8324:18;;;8317:62;-1:-1:-1;;;8395:18:1;;;8388:32;8437:19;;28636:68:0;8064:398:1;28636:68:0;-1:-1:-1;;;;;28717:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;28769:32;;14736:25:1;;;28769:32:0;;14709:18:1;28769:32:0;;;;;;;28429:380;;;:::o;29100:453::-;29235:24;29262:25;29272:5;29279:7;29262:9;:25::i;:::-;29235:52;;-1:-1:-1;;29302:16:0;:37;29298:248;;29384:6;29364:16;:26;;29356:68;;;;-1:-1:-1;;;29356:68:0;;8669:2:1;29356:68:0;;;8651:21:1;8708:2;8688:18;;;8681:30;8747:31;8727:18;;;8720:59;8796:18;;29356:68:0;8467:353:1;29356:68:0;29468:51;29477:5;29484:7;29512:6;29493:16;:25;29468:8;:51::i;:::-;29224:329;29100:453;;;:::o;45315:1553::-;-1:-1:-1;;;;;45415:12:0;;;;;;:6;:12;;;;;;;;45414:13;45406:44;;;;-1:-1:-1;;;45406:44:0;;11718:2:1;45406:44:0;;;11700:21:1;11757:2;11737:18;;;11730:30;-1:-1:-1;;;11776:18:1;;;11769:48;11834:18;;45406:44:0;11516:342:1;45406:44:0;-1:-1:-1;;;;;45470:10:0;;;;;;:6;:10;;;;;;;;45469:11;45461:45;;;;-1:-1:-1;;;45461:45:0;;12065:2:1;45461:45:0;;;12047:21:1;12104:2;12084:18;;;12077:30;-1:-1:-1;;;12123:18:1;;;12116:51;12184:18;;45461:45:0;11863:345:1;45461:45:0;45520:18;;;;:45;;;;-1:-1:-1;45542:23:0;;;;;;;45520:45;45517:98;;;45581:22;45600:2;45581:18;:22::i;:::-;45628:16;45635:4;45641:2;45628:6;:16::i;:::-;:38;;;;-1:-1:-1;45648:18:0;;;;45628:38;:70;;;;-1:-1:-1;45670:28:0;;;;45628:70;45625:1028;;;-1:-1:-1;;;;;45718:21:0;;;;;;:17;:21;;;;;;;;45714:365;;45777:19;:31;45767:41;;;;;:106;;-1:-1:-1;45838:35:0;;45828:6;45812:13;45822:2;-1:-1:-1;;;;;21217:18:0;21190:7;21217:18;;;;;;;;;;;;21116:127;45812:13;:22;;;;:::i;:::-;:61;;45767:106;45759:157;;;;-1:-1:-1;;;45759:157:0;;;;;;;:::i;:::-;45714:365;;;45947:4;;-1:-1:-1;;;;;45941:10:0;;;45947:4;;45941:10;45938:141;;;45989:19;:31;45979:41;;;45971:92;;;;-1:-1:-1;;;45971:92:0;;;;;;;:::i;:::-;46105:4;;-1:-1:-1;;;;;46097:12:0;;;46105:4;;46097:12;:37;;;;-1:-1:-1;;;;;;46114:20:0;;;;;;:16;:20;;;;;;;;46113:21;46097:37;:72;;;;-1:-1:-1;46138:12:0;:31;;;46097:72;46093:548;;;-1:-1:-1;;;;;46198:12:0;;;;;;:8;:12;;;;;;46213:15;-1:-1:-1;46190:85:0;;;;-1:-1:-1;;;46190:85:0;;6973:2:1;46190:85:0;;;6955:21:1;7012:2;6992:18;;;6985:30;7051:34;7031:18;;;7024:62;-1:-1:-1;;;7102:18:1;;;7095:40;7152:19;;46190:85:0;6771:406:1;46190:85:0;46328:12;:25;46309:45;;46328:25;;;;;46309:15;:45;:::i;:::-;-1:-1:-1;;;;;46294:12:0;;;;;;:8;:12;;;;;:60;46093:548;;;-1:-1:-1;;;;;46381:22:0;;;;;;:16;:22;;;;;;;;46380:23;:59;;;;-1:-1:-1;46407:12:0;:32;;;;;;46380:59;46376:265;;;-1:-1:-1;;;;;46467:14:0;;;;;;:8;:14;;;;;;46485:15;-1:-1:-1;46467:33:0;46459:85;;;;-1:-1:-1;;;46459:85:0;;13978:2:1;46459:85:0;;;13960:21:1;14017:2;13997:18;;;13990:30;14056:34;14036:18;;;14029:62;-1:-1:-1;;;14107:18:1;;;14100:37;14154:19;;46459:85:0;13776:403:1;46459:85:0;46599:12;:25;46580:45;;46599:25;;;;;46580:15;:45;:::i;:::-;-1:-1:-1;;;;;46563:14:0;;;;;;:8;:14;;;;;:62;46376:265;46667:18;;;;46663:153;;47705:5;;-1:-1:-1;;;;;47694:16:0;;;47705:5;;47694:16;46702:47;;;;-1:-1:-1;;;46702:47:0;;11008:2:1;46702:47:0;;;10990:21:1;11047:2;11027:18;;;11020:30;-1:-1:-1;;;11066:18:1;;;11059:51;11127:18;;46702:47:0;10806:345:1;46702:47:0;46789:4;;-1:-1:-1;;;;;46783:10:0;;;46789:4;;46783:10;46780:24;;;46795:9;46802:1;46795:6;:9::i;:::-;46828:32;46843:4;46849:2;46853:6;46828:14;:32::i;27316:675::-;-1:-1:-1;;;;;27400:21:0;;27392:67;;;;-1:-1:-1;;;27392:67:0;;12765:2:1;27392:67:0;;;12747:21:1;12804:2;12784:18;;;12777:30;12843:34;12823:18;;;12816:62;-1:-1:-1;;;12894:18:1;;;12887:31;12935:19;;27392:67:0;12563:397:1;27392:67:0;-1:-1:-1;;;;;27559:18:0;;27534:22;27559:18;;;;;;;;;;;27596:24;;;;27588:71;;;;-1:-1:-1;;;27588:71:0;;7863:2:1;27588:71:0;;;7845:21:1;7902:2;7882:18;;;7875:30;7941:34;7921:18;;;7914:62;-1:-1:-1;;;7992:18:1;;;7985:32;8034:19;;27588:71:0;7661:398:1;27588:71:0;-1:-1:-1;;;;;27695:18:0;;:9;:18;;;;;;;;;;;27716:23;;;27695:44;;27834:12;:22;;;;;;;27885:37;14736:25:1;;;27695:9:0;;:18;27885:37;;14709:18:1;27885:37:0;;;;;;;48049:193;47873:376;;:::o;46876:127::-;46962:33;46978:4;46984:2;46988:6;46962:15;:33::i;44786:257::-;44872:19;;:6;44851:18;44894:12;;44851:40;;44872:19;;;;;44851:40;:::i;:::-;:55;:123;;44965:9;45090:23;:31;;-1:-1:-1;;45090:31:0;;;45051:78;44965:9;44851:123;;;44919:34;44939:7;44948:4;44919:19;:34::i;:::-;44988:23;;;;;;;44985:50;;;45013:20;:22;;;:20;:22;;;:::i;:::-;;;;;;44985:50;44786:257;:::o;44357:312::-;44421:4;44446:13;44454:4;47705:5;;-1:-1:-1;;;;;47694:16:0;;;47705:5;;47694:16;;47615:103;44446:13;44445:14;:43;;;;-1:-1:-1;47705:5:0;;-1:-1:-1;;;;;47694:16:0;;;47705:5;;47694:16;44476:12;44445:43;:78;;;;-1:-1:-1;44518:5:0;;-1:-1:-1;;;;;44518:5:0;44505:9;:18;;44445:78;:110;;;;-1:-1:-1;;;;;;44541:14:0;;;;;;:8;:14;;;;;;;;44540:15;44445:110;:140;;;;-1:-1:-1;;;;;;44573:12:0;;;;;;:8;:12;;;;;;;;44572:13;44445:140;:178;;;;-1:-1:-1;;;;;;44602:21:0;;44616:6;44602:21;;44445:178;:216;;;;-1:-1:-1;;;;;;44640:21:0;;44656:4;44640:21;;44445:216;44438:223;44357:312;-1:-1:-1;;;44357:312:0:o;44104:245::-;44160:18;:25;;44217:12;44160:6;44196:33;44240:19;:34;;-1:-1:-1;;44240:34:0;44160:25;44240:34;;;;;-1:-1:-1;;44285:30:0;;;;;44331:10;;;;-1:-1:-1;;44331:10:0;44104:245;:::o;25308:840::-;-1:-1:-1;;;;;25439:18:0;;25431:68;;;;-1:-1:-1;;;25431:68:0;;13167:2:1;25431:68:0;;;13149:21:1;13206:2;13186:18;;;13179:30;13245:34;13225:18;;;13218:62;-1:-1:-1;;;13296:18:1;;;13289:35;13341:19;;25431:68:0;12965:401:1;25431:68:0;-1:-1:-1;;;;;25518:16:0;;25510:64;;;;-1:-1:-1;;;25510:64:0;;6569:2:1;25510:64:0;;;6551:21:1;6608:2;6588:18;;;6581:30;6647:34;6627:18;;;6620:62;-1:-1:-1;;;6698:18:1;;;6691:33;6741:19;;25510:64:0;6367:399:1;25510:64:0;-1:-1:-1;;;;;25660:15:0;;25638:19;25660:15;;;;;;;;;;;25694:21;;;;25686:72;;;;-1:-1:-1;;;25686:72:0;;9438:2:1;25686:72:0;;;9420:21:1;9477:2;9457:18;;;9450:30;9516:34;9496:18;;;9489:62;-1:-1:-1;;;9567:18:1;;;9560:36;9613:19;;25686:72:0;9236:402:1;25686:72:0;-1:-1:-1;;;;;25794:15:0;;;:9;:15;;;;;;;;;;;25812:20;;;25794:38;;26012:13;;;;;;;;;;:23;;;;;;26064:26;;14736:25:1;;;26012:13:0;;26064:26;;14709:18:1;26064:26:0;;;;;;;26103:37;47873:376;45137:170;45225:11;45221:73;;;-1:-1:-1;;;;;45253:15:0;;;;;;:6;:15;;;;;:29;;-1:-1:-1;;45253:29:0;;;;;;;45221:73;45137:170;;:::o;14:173:1:-;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:70;;177:1;174;167:12;111:70;14:173;;;:::o;192:673::-;246:5;299:3;292:4;284:6;280:17;276:27;266:55;;317:1;314;307:12;266:55;353:6;340:20;379:4;403:60;419:43;459:2;419:43;:::i;:::-;403:60;:::i;:::-;485:3;509:2;504:3;497:15;537:2;532:3;528:12;521:19;;572:2;564:6;560:15;624:3;619:2;613;610:1;606:10;598:6;594:23;590:32;587:41;584:61;;;641:1;638;631:12;584:61;663:1;673:163;687:2;684:1;681:9;673:163;;;744:17;;732:30;;782:12;;;;814;;;;705:1;698:9;673:163;;;-1:-1:-1;854:5:1;;192:673;-1:-1:-1;;;;;;;192:673:1:o;870:160::-;935:20;;991:13;;984:21;974:32;;964:60;;1020:1;1017;1010:12;1035:186;1094:6;1147:2;1135:9;1126:7;1122:23;1118:32;1115:52;;;1163:1;1160;1153:12;1115:52;1186:29;1205:9;1186:29;:::i;1226:260::-;1294:6;1302;1355:2;1343:9;1334:7;1330:23;1326:32;1323:52;;;1371:1;1368;1361:12;1323:52;1394:29;1413:9;1394:29;:::i;:::-;1384:39;;1442:38;1476:2;1465:9;1461:18;1442:38;:::i;:::-;1432:48;;1226:260;;;;;:::o;1491:328::-;1568:6;1576;1584;1637:2;1625:9;1616:7;1612:23;1608:32;1605:52;;;1653:1;1650;1643:12;1605:52;1676:29;1695:9;1676:29;:::i;:::-;1666:39;;1724:38;1758:2;1747:9;1743:18;1724:38;:::i;:::-;1714:48;;1809:2;1798:9;1794:18;1781:32;1771:42;;1491:328;;;;;:::o;1824:460::-;1907:6;1915;1923;1931;1939;1992:3;1980:9;1971:7;1967:23;1963:33;1960:53;;;2009:1;2006;1999:12;1960:53;2032:29;2051:9;2032:29;:::i;:::-;2022:39;;2080:35;2111:2;2100:9;2096:18;2080:35;:::i;:::-;2070:45;;2134:35;2165:2;2154:9;2150:18;2134:35;:::i;:::-;2124:45;;2188:35;2219:2;2208:9;2204:18;2188:35;:::i;:::-;2178:45;;2242:36;2273:3;2262:9;2258:19;2242:36;:::i;:::-;2232:46;;1824:460;;;;;;;;:::o;2289:254::-;2357:6;2365;2418:2;2406:9;2397:7;2393:23;2389:32;2386:52;;;2434:1;2431;2424:12;2386:52;2457:29;2476:9;2457:29;:::i;:::-;2447:39;2533:2;2518:18;;;;2505:32;;-1:-1:-1;;;2289:254:1:o;2548:1157::-;2666:6;2674;2727:2;2715:9;2706:7;2702:23;2698:32;2695:52;;;2743:1;2740;2733:12;2695:52;2783:9;2770:23;2812:18;2853:2;2845:6;2842:14;2839:34;;;2869:1;2866;2859:12;2839:34;2907:6;2896:9;2892:22;2882:32;;2952:7;2945:4;2941:2;2937:13;2933:27;2923:55;;2974:1;2971;2964:12;2923:55;3010:2;2997:16;3032:4;3056:60;3072:43;3112:2;3072:43;:::i;3056:60::-;3138:3;3162:2;3157:3;3150:15;3190:2;3185:3;3181:12;3174:19;;3221:2;3217;3213:11;3269:7;3264:2;3258;3255:1;3251:10;3247:2;3243:19;3239:28;3236:41;3233:61;;;3290:1;3287;3280:12;3233:61;3312:1;3303:10;;3322:169;3336:2;3333:1;3330:9;3322:169;;;3393:23;3412:3;3393:23;:::i;:::-;3381:36;;3354:1;3347:9;;;;;3437:12;;;;3469;;3322:169;;;-1:-1:-1;3510:5:1;-1:-1:-1;;3553:18:1;;3540:32;;-1:-1:-1;;3584:16:1;;;3581:36;;;3613:1;3610;3603:12;3581:36;;3636:63;3691:7;3680:8;3669:9;3665:24;3636:63;:::i;:::-;3626:73;;;2548:1157;;;;;:::o;3710:405::-;3779:6;3787;3795;3848:2;3836:9;3827:7;3823:23;3819:32;3816:52;;;3864:1;3861;3854:12;3816:52;3887:26;3903:9;3887:26;:::i;:::-;3877:36;;3932:35;3963:2;3952:9;3948:18;3932:35;:::i;:::-;3922:45;;4017:2;4006:9;4002:18;3989:32;4061:4;4054:5;4050:16;4043:5;4040:27;4030:55;;4081:1;4078;4071:12;4030:55;4104:5;4094:15;;;3710:405;;;;;:::o;4120:180::-;4179:6;4232:2;4220:9;4211:7;4207:23;4203:32;4200:52;;;4248:1;4245;4238:12;4200:52;-1:-1:-1;4271:23:1;;4120:180;-1:-1:-1;4120:180:1:o;4305:316::-;4379:6;4387;4395;4448:2;4436:9;4427:7;4423:23;4419:32;4416:52;;;4464:1;4461;4454:12;4416:52;4500:9;4487:23;4477:33;;4557:2;4546:9;4542:18;4529:32;4519:42;;4580:35;4611:2;4600:9;4596:18;4580:35;:::i;:::-;4570:45;;4305:316;;;;;:::o;5765:597::-;5877:4;5906:2;5935;5924:9;5917:21;5967:6;5961:13;6010:6;6005:2;5994:9;5990:18;5983:34;6035:1;6045:140;6059:6;6056:1;6053:13;6045:140;;;6154:14;;;6150:23;;6144:30;6120:17;;;6139:2;6116:26;6109:66;6074:10;;6045:140;;;6203:6;6200:1;6197:13;6194:91;;;6273:1;6268:2;6259:6;6248:9;6244:22;6240:31;6233:42;6194:91;-1:-1:-1;6346:2:1;6325:15;-1:-1:-1;;6321:29:1;6306:45;;;;6353:2;6302:54;;5765:597;-1:-1:-1;;;5765:597:1:o;9643:402::-;9845:2;9827:21;;;9884:2;9864:18;;;9857:30;9923:34;9918:2;9903:18;;9896:62;-1:-1:-1;;;9989:2:1;9974:18;;9967:36;10035:3;10020:19;;9643:402::o;10050:345::-;10252:2;10234:21;;;10291:2;10271:18;;;10264:30;-1:-1:-1;;;10325:2:1;10310:18;;10303:51;10386:2;10371:18;;10050:345::o;15790:275::-;15861:2;15855:9;15926:2;15907:13;;-1:-1:-1;;15903:27:1;15891:40;;15961:18;15946:34;;15982:22;;;15943:62;15940:88;;;16008:18;;:::i;:::-;16044:2;16037:22;15790:275;;-1:-1:-1;15790:275:1:o;16070:183::-;16130:4;16163:18;16155:6;16152:30;16149:56;;;16185:18;;:::i;:::-;-1:-1:-1;16230:1:1;16226:14;16242:4;16222:25;;16070:183::o;16258:128::-;16298:3;16329:1;16325:6;16322:1;16319:13;16316:39;;;16335:18;;:::i;:::-;-1:-1:-1;16371:9:1;;16258:128::o;16391:217::-;16431:1;16457;16447:132;;16501:10;16496:3;16492:20;16489:1;16482:31;16536:4;16533:1;16526:15;16564:4;16561:1;16554:15;16447:132;-1:-1:-1;16593:9:1;;16391:217::o;16613:168::-;16653:7;16719:1;16715;16711:6;16707:14;16704:1;16701:21;16696:1;16689:9;16682:17;16678:45;16675:71;;;16726:18;;:::i;:::-;-1:-1:-1;16766:9:1;;16613:168::o;16786:125::-;16826:4;16854:1;16851;16848:8;16845:34;;;16859:18;;:::i;:::-;-1:-1:-1;16896:9:1;;16786:125::o;16916:380::-;16995:1;16991:12;;;;17038;;;17059:61;;17113:4;17105:6;17101:17;17091:27;;17059:61;17166:2;17158:6;17155:14;17135:18;17132:38;17129:161;;;17212:10;17207:3;17203:20;17200:1;17193:31;17247:4;17244:1;17237:15;17275:4;17272:1;17265:15;17129:161;;16916:380;;;:::o;17301:135::-;17340:3;-1:-1:-1;;17361:17:1;;17358:43;;;17381:18;;:::i;:::-;-1:-1:-1;17428:1:1;17417:13;;17301:135::o;17441:175::-;17478:3;17522:4;17515:5;17511:16;17551:4;17542:7;17539:17;17536:43;;;17559:18;;:::i;:::-;17608:1;17595:15;;17441:175;-1:-1:-1;;17441:175:1:o;17621:127::-;17682:10;17677:3;17673:20;17670:1;17663:31;17713:4;17710:1;17703:15;17737:4;17734:1;17727:15;17753:127;17814:10;17809:3;17805:20;17802:1;17795:31;17845:4;17842:1;17835:15;17869:4;17866:1;17859:15;17885:127;17946:10;17941:3;17937:20;17934:1;17927:31;17977:4;17974:1;17967:15;18001:4;17998:1;17991:15

Swarm Source

ipfs://654ecca091b62c944cf0d02338cd154e9a406b7f4345758d30b3444aa9a1acba
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.