ETH Price: $3,296.65 (-3.38%)
Gas: 22 Gwei

Token

Tsunami (TSUNAMI)
 

Overview

Max Total Supply

100,000,000 TSUNAMI

Holders

149

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 9 Decimals)

Balance
94.229062119 TSUNAMI

Value
$0.00
0xca8ba7d3f798d1872a8c05c5358a1b24a4d3ac64
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:
Tsunami

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-01-25
*/

// Tsunami
// Website: www.tsunami-wave.com


pragma solidity ^0.8.17;
// SPDX-License-Identifier: Unlicensed

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

    function WETH() external pure returns (address);

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

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

interface IUniswapRouter02 is IUniswapRouter01 {

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

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

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

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

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

}

abstract contract Context {
    //function _msgSender() internal view virtual returns (address payable) {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

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

abstract contract Ownable is Context {
    address private _owner;

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

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

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

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

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

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

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

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 functionCall(target, data, "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"
        );
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(
            data
        );
        return verifyCallResult(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) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(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) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason 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 {
            // 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

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

library SafeERC20 {
    using Address for address;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

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

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

contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

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

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

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

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

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

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

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address to, uint256 amount)
        public
        virtual
        override
        returns (bool)
    {
        _transfer(msg.sender, 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)
    {
        _approve(msg.sender, 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)
    {
        _approve(
            msg.sender,
            spender,
            allowance(msg.sender, spender) + addedValue
        );
        return true;
    }

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

        return true;
    }

    /**
     * @dev Moves `amount` of tokens from `sender` to `recipient`.
     *
     * This internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `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;
        }
        _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;
        _balances[account] += amount;
        emit Transfer(address(0), account, amount);

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

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

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

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

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

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

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

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

    /**
     * @dev 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 IUniswapV2Pair {
    function getReserves()
        external
        view
        returns (
            uint112 reserve0,
            uint112 reserve1,
            uint32 blockTimestampLast
        );
}

contract Tsunami is ERC20, Ownable {
    address payable marketingFeeAddress;
    address payable stakingFeeAddress;

    bool public tradingActive;

    mapping(address => bool) public isExcludedFromFee;

    uint16 public buyLiquidityFee = 200;
    uint16 public buyMarketingFee = 400;
    uint16 public buyStakingFee = 100;

    uint16 public sellLiquidityFee = 100;
    uint16 public sellMarketingFee = 500;
    uint16 public sellStakingFee = 100;

    uint16 public transferLiquidityFee;
    uint16 public transferMarketingFee;
    uint16 public transferStakingFee;

    uint256 private _liquidityTokensToSwap;
    uint256 private _marketingFeeTokensToSwap;
    uint256 private _stakingFeeTokens;

    uint256 private lpTokens;

    mapping(address => bool) public automatedMarketMakerPairs;
    mapping(address => bool) public botWallet;
    uint256 public minLpBeforeSwapping;

    IUniswapRouter02 public immutable uniswapRouter;
    address public immutable uniswapPair;

    bool inSwapAndLiquify;

    uint256 public maxTx;
    uint256 public maxWallet;

    modifier lockTheSwap() {
        inSwapAndLiquify = true;
        _;
        inSwapAndLiquify = false;
    }

    constructor() ERC20("Tsunami", "TSUNAMI") {
        uint256 startingSupply = 1e8 * 10**decimals(); // 1e8 = 8 zeroes, which is 100,000,000
        _mint(msg.sender, startingSupply);
        maxWallet = (startingSupply / 1000) * 15; // 1.5% of total supply
        maxTx = (startingSupply / 1000) * 15; // 1.5% of total supply

        marketingFeeAddress = payable(
            0x15A1B619c0efB124810516bA85E1e4541bFFC1C6
        );
        stakingFeeAddress = payable(0xa40d2d9a43e1D484cE13Cba93F728fc995fC09ca);

        minLpBeforeSwapping = 100; // this means: 100 / 10000 = 1% of the liquidity pool is the threshold before swapping
        // uniswap v2 router
        address routerAddress = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D;
        uniswapRouter = IUniswapRouter02(payable(routerAddress));

        uniswapPair = IFactory(uniswapRouter.factory()).createPair(
            address(this),
            uniswapRouter.WETH()
        );

        isExcludedFromFee[msg.sender] = true;
        isExcludedFromFee[address(this)] = true;
        isExcludedFromFee[marketingFeeAddress] = true;
        isExcludedFromFee[stakingFeeAddress] = true;

        _approve(msg.sender, routerAddress, ~uint256(0));
        _setAutomatedMarketMakerPair(uniswapPair, true);
        _approve(address(this), address(uniswapRouter), type(uint256).max);
    }

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

    function addBotWallet(address wallet) external onlyOwner {
        require(!botWallet[wallet], "Wallet already added");
        botWallet[wallet] = true;
    }

    function addBotWalletBulk(address[] memory wallets) external onlyOwner {
        for (uint256 i = 0; i < wallets.length; i++) {
            require(!botWallet[wallets[i]], "Wallet already added");
            botWallet[wallets[i]] = true;
        }
    }

    function removeBotWallet(address wallet) external onlyOwner {
        require(botWallet[wallet], "Wallet not added");
        botWallet[wallet] = false;
    }

    function updateMaxTx(uint256 maxTx_) external onlyOwner {
        maxTx = maxTx_;
    }

    function updateMaxWallet(uint256 maxWallet_) external onlyOwner {
        maxWallet = maxWallet_;
    }

    function burn(uint256 amount) external {
        _burn(msg.sender, amount);
    }

    function enableTrading() external onlyOwner {
        tradingActive = true;
    }

    function updateMinLpBeforeSwapping(uint256 minLpBeforeSwapping_)
        external
        onlyOwner
    {
        minLpBeforeSwapping = minLpBeforeSwapping_;
    }

    function setAutomatedMarketMakerPair(address pair, bool value)
        external
        onlyOwner
    {
        require(pair != uniswapPair, "The pair cannot be removed");

        _setAutomatedMarketMakerPair(pair, value);
    }

    function _setAutomatedMarketMakerPair(address pair, bool value) private {
        automatedMarketMakerPairs[pair] = value;
    }

    function excludeFromFee(address account) external onlyOwner {
        isExcludedFromFee[account] = true;
    }

    function excludeFromFeeBulk(address[] calldata accounts) external onlyOwner {
        for (uint256 i = 0; i < accounts.length; i++) {
            isExcludedFromFee[accounts[i]] = true;
        }
    }

    function includeInFee(address account) external onlyOwner {
        isExcludedFromFee[account] = false;
    }

    function includeInFeeBulk(address[] calldata accounts) external onlyOwner {
        for (uint256 i = 0; i < accounts.length; i++) {
            isExcludedFromFee[accounts[i]] = false;
        }
    }

    function updateBuyFee(
        uint16 _buyLiquidityFee,
        uint16 _buyMarketingFee,
        uint16 _buyStakingFee
    ) external onlyOwner {
        buyLiquidityFee = _buyLiquidityFee;
        buyMarketingFee = _buyMarketingFee;
        buyStakingFee = _buyStakingFee;
    }

    function updateSellFee(
        uint16 _sellLiquidityFee,
        uint16 _sellMarketingFee,
        uint16 _sellStakingFee
    ) external onlyOwner {
        sellLiquidityFee = _sellLiquidityFee;
        sellMarketingFee = _sellMarketingFee;
        sellStakingFee = _sellStakingFee;
    }

    function updateTransferFee(
        uint16 _transferLiquidityFee,
        uint16 _transferMarketingFee,
        uint16 _transferStakingfee
    ) external onlyOwner {
        transferLiquidityFee = _transferLiquidityFee;
        transferMarketingFee = _transferMarketingFee;
        transferStakingFee = _transferStakingfee;
    }

    function updateMarketingFeeAddress(address marketingFeeAddress_)
        external
        onlyOwner
    {
        require(marketingFeeAddress_ != address(0), "Can't set 0");
        marketingFeeAddress = payable(marketingFeeAddress_);
    }

    function updateStakingAddress(address stakingFeeAddress_)
        external
        onlyOwner
    {
        require(stakingFeeAddress_ != address(0), "Can't set 0");
        stakingFeeAddress = payable(stakingFeeAddress_);
    }

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal override {
        if (!tradingActive) {
            require(
                isExcludedFromFee[from] || isExcludedFromFee[to],
                "Trading is not active yet."
            );
        }
        require(!botWallet[from] && !botWallet[to], "Bot wallet");
        checkLiquidity();

        if (
            hasLiquidity && !inSwapAndLiquify && automatedMarketMakerPairs[to]
        ) {
            uint256 contractTokenBalance = balanceOf(address(this));
            if (
                contractTokenBalance >=
                (lpTokens * minLpBeforeSwapping) / 10000
            ) takeFee(contractTokenBalance);
        }

        uint256 _liquidityFee;
        uint256 _marketingFee;
        uint256 _stakingFee;

        if (!isExcludedFromFee[from] && !isExcludedFromFee[to]) {
            // Buy
            if (automatedMarketMakerPairs[from]) {
                _liquidityFee = (amount * buyLiquidityFee) / 1000;
                _marketingFee = (amount * buyMarketingFee) / 1000;
                _stakingFee = (amount * buyStakingFee) / 1000;
                require(
                    amount <= maxTx,
                    "Amount exceeds maxTx"
                );
                require(
                    balanceOf(to) + amount <= maxWallet,
                    "Amount exceeds maxWallet"
                );
            }
            // Sell
            else if (automatedMarketMakerPairs[to]) {
                _liquidityFee = (amount * sellLiquidityFee) / 1000;
                _marketingFee = (amount * sellMarketingFee) / 1000;
                _stakingFee = (amount * sellStakingFee) / 1000;
            } else {
                _liquidityFee =
                    (amount * transferLiquidityFee) /
                    1000;
                _marketingFee =
                    (amount * transferMarketingFee) /
                    1000;
                _stakingFee = (amount * transferStakingFee) / 1000;
                require(
                    amount <= maxTx,
                    "Amount exceeds maxTx"
                );
                require(
                    balanceOf(to) + amount <= maxWallet,
                    "Amount exceeds maxWallet"
                );
            }
        }

        uint256 _feeTotal =
            _liquidityFee +
            _marketingFee +
            _stakingFee;
        uint256 _transferAmount = amount - _feeTotal;
        super._transfer(from, to, _transferAmount);
        if (_feeTotal > 0) {
            super._transfer(from, address(this), _feeTotal);
            _liquidityTokensToSwap += _liquidityFee;
            _marketingFeeTokensToSwap += _marketingFee;
            _stakingFeeTokens += _stakingFee;
        }
    }

    function takeFee(uint256 contractBalance) private lockTheSwap {
        uint256 totalTokensTaken = _liquidityTokensToSwap +
            _marketingFeeTokensToSwap +
            _stakingFeeTokens;
        if (totalTokensTaken == 0) {
            return;
        }

        uint256 tokensForLiquidity = contractBalance * (_liquidityTokensToSwap / 2) / totalTokensTaken;
        uint256 initialETHBalance = address(this).balance;
        uint256 toSwap = contractBalance - tokensForLiquidity;
        swapTokensForETH(toSwap);
        uint256 ethBalance = address(this).balance - initialETHBalance;

        uint256 ethForMarketing = ethBalance * _marketingFeeTokensToSwap / totalTokensTaken;
        uint256 ethForStaking = ethBalance * _stakingFeeTokens / totalTokensTaken;
        uint256 ethForLiquidity = ethBalance - ethForMarketing - ethForStaking;
        if (tokensForLiquidity > 0 && ethForLiquidity > 0) {
            addLiquidity(tokensForLiquidity, ethForLiquidity);
        }
        bool success;

        (success, ) = address(marketingFeeAddress).call{
            value: ethForMarketing,
            gas: 30000
        }("");
        (success, ) = address(stakingFeeAddress).call{
            value: ethForStaking,
            gas: 30000
        }("");

        _liquidityTokensToSwap = 0;
        _marketingFeeTokensToSwap = 0;
        _stakingFeeTokens = 0;
    }

    function swapTokensForETH(uint256 tokenAmount) private {
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapRouter.WETH();
        uniswapRouter.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0,
            path,
            address(this),
            block.timestamp
        );
    }

    function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private {
        uniswapRouter.addLiquidityETH{value: ethAmount}(
            address(this),
            tokenAmount,
            0,
            0,
            owner(),
            block.timestamp
        );
    }

    receive() external payable {}

    bool private hasLiquidity;

    function checkLiquidity() internal {
        (uint256 r1, uint256 r2, ) = IUniswapV2Pair(uniswapPair).getReserves();

        lpTokens = balanceOf(uniswapPair); // this is not a problem, since contract sell will get that unsynced balance as if we sold it, so we just get more ETH.
        hasLiquidity = r1 > 0 && r2 > 0 ? true : false;
    }

    function withdrawETH() external onlyOwner {
        payable(owner()).transfer(address(this).balance);
    }

    function withdrawTokens(IERC20 tokenAddress, address walletAddress)
        external
        onlyOwner
    {
        require(
            walletAddress != address(0),
            "walletAddress can't be 0 address"
        );
        SafeERC20.safeTransfer(
            tokenAddress,
            walletAddress,
            tokenAddress.balanceOf(address(this))
        );
    }
}

Contract Security Audit

Contract ABI

[{"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":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"addBotWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"wallets","type":"address[]"}],"name":"addBotWalletBulk","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":"","type":"address"}],"name":"automatedMarketMakerPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"botWallet","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":"buyLiquidityFee","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyMarketingFee","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyStakingFee","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","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":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"}],"name":"excludeFromFeeBulk","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"}],"name":"includeInFeeBulk","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isExcludedFromFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minLpBeforeSwapping","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"removeBotWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellLiquidityFee","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellMarketingFee","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellStakingFee","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutomatedMarketMakerPair","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":[],"name":"tradingActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":[],"name":"transferLiquidityFee","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"transferMarketingFee","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"transferStakingFee","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapPair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapRouter","outputs":[{"internalType":"contract IUniswapRouter02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_buyLiquidityFee","type":"uint16"},{"internalType":"uint16","name":"_buyMarketingFee","type":"uint16"},{"internalType":"uint16","name":"_buyStakingFee","type":"uint16"}],"name":"updateBuyFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"marketingFeeAddress_","type":"address"}],"name":"updateMarketingFeeAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxTx_","type":"uint256"}],"name":"updateMaxTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxWallet_","type":"uint256"}],"name":"updateMaxWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"minLpBeforeSwapping_","type":"uint256"}],"name":"updateMinLpBeforeSwapping","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_sellLiquidityFee","type":"uint16"},{"internalType":"uint16","name":"_sellMarketingFee","type":"uint16"},{"internalType":"uint16","name":"_sellStakingFee","type":"uint16"}],"name":"updateSellFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"stakingFeeAddress_","type":"address"}],"name":"updateStakingAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_transferLiquidityFee","type":"uint16"},{"internalType":"uint16","name":"_transferMarketingFee","type":"uint16"},{"internalType":"uint16","name":"_transferStakingfee","type":"uint16"}],"name":"updateTransferFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"tokenAddress","type":"address"},{"internalType":"address","name":"walletAddress","type":"address"}],"name":"withdrawTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60c0604052600980546001600160601b0319166a6401f400640064019000c81790553480156200002e57600080fd5b50604051806040016040528060078152602001665473756e616d6960c81b815250604051806040016040528060078152602001665453554e414d4960c81b81525081600390816200008091906200068d565b5060046200008f82826200068d565b505050620000ac620000a66200037d60201b60201c565b62000381565b6000620000bc6009600a6200086e565b620000cc906305f5e10062000886565b9050620000da3382620003d3565b620000e86103e882620008a0565b620000f590600f62000886565b601355620001066103e882620008a0565b6200011390600f62000886565b601255600680546001600160a01b03199081167315a1b619c0efb124810516ba85e1e4541bffc1c6179091556007805490911673a40d2d9a43e1d484ce13cba93f728fc995fc09ca1790556064601055737a250d5630b4cf539739df2c5dacb4c659f2488d60808190526040805163c45a015560e01b81529051829163c45a01559160048083019260209291908290030181865afa158015620001ba573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001e09190620008c3565b6001600160a01b031663c9c65396306080516001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000230573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002569190620008c3565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af1158015620002a4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002ca9190620008c3565b6001600160a01b0390811660a052336000818152600860205260408082208054600160ff199182168117909255308452828420805482168317905560065486168452828420805482168317905560075490951683529120805490931617909155620003399082600019620004bc565b60a0516001600160a01b03166000908152600e60205260409020805460ff191660011790556200037530608051600019620004bc60201b60201c565b505062000904565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b0382166200042f5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064015b60405180910390fd5b8060026000828254620004439190620008ee565b90915550506001600160a01b0382166000908152602081905260408120805483929062000472908490620008ee565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6001600160a01b038316620005205760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840162000426565b6001600160a01b038216620005835760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840162000426565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b505050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200061457607f821691505b6020821081036200063557634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620005e457600081815260208120601f850160051c81016020861015620006645750805b601f850160051c820191505b81811015620006855782815560010162000670565b505050505050565b81516001600160401b03811115620006a957620006a9620005e9565b620006c181620006ba8454620005ff565b846200063b565b602080601f831160018114620006f95760008415620006e05750858301515b600019600386901b1c1916600185901b17855562000685565b600085815260208120601f198616915b828110156200072a5788860151825594840194600190910190840162000709565b5085821015620007495787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b600181815b80851115620007b057816000190482111562000794576200079462000759565b80851615620007a257918102915b93841c939080029062000774565b509250929050565b600082620007c95750600162000868565b81620007d85750600062000868565b8160018114620007f15760028114620007fc576200081c565b600191505062000868565b60ff84111562000810576200081062000759565b50506001821b62000868565b5060208310610133831016604e8410600b841016171562000841575081810a62000868565b6200084d83836200076f565b806000190482111562000864576200086462000759565b0290505b92915050565b60006200087f60ff841683620007b8565b9392505050565b808202811582820484141762000868576200086862000759565b600082620008be57634e487b7160e01b600052601260045260246000fd5b500490565b600060208284031215620008d657600080fd5b81516001600160a01b03811681146200087f57600080fd5b8082018082111562000868576200086862000759565b60805160a051612ef362000954600039600081816109000152818161128901528181611f99015261203501526000818161066c015281816125720152818161262a01526126a20152612ef36000f3fe6080604052600436106103035760003560e01c80637437681e11610190578063a9059cbb116100dc578063dd62ed3e11610095578063f11a24d31161006f578063f11a24d31461098d578063f2fde38b146109a8578063f6374342146109c8578063f8b45b05146109ea57600080fd5b8063dd62ed3e14610938578063e086e5ec14610958578063ea2f0b371461096d57600080fd5b8063a9059cbb1461085d578063b62496f51461087d578063bbc0c742146108ad578063c2d0ffca146108ce578063c816841b146108ee578063dbf1cd131461092257600080fd5b806392136913116101495780639bb19a32116101235780639bb19a32146107cb5780639cbc1ad6146107ed578063a457c2d71461081d578063a522ad251461083d57600080fd5b8063921369131461077457806395d89b41146107965780639a7a23d6146107ab57600080fd5b80637437681e146106c85780637bce5a04146106de57806382d58ce9146106ff57806385c5b3191461071f5780638a8c523c146107415780638da5cb5b1461075657600080fd5b8063439be3511161024f5780636f3ec7ae1161020857806371aadb77116101e257806371aadb771461061a57806372bffc891461063a578063735de9f71461065a578063742bd2a5146106a657600080fd5b80636f3ec7ae146105af57806370a08231146105cf578063715018a61461060557600080fd5b8063439be351146104c75780634f46b2c3146104fd5780635342acb41461051f57806353dc21211461054f5780635b06a1d11461056f578063660d0af41461058f57600080fd5b806323a9c742116102bc578063313ce56711610296578063313ce5671461044b578063395093511461046757806342966c6814610487578063437823ec146104a757600080fd5b806323a9c742146103eb57806323b872dd1461040b5780632a3606311461042b57600080fd5b80630305caff1461030f57806306fdde0314610331578063095ea7b31461035c5780630e460b731461038c57806318160ddd146103ac5780631c499ab0146103cb57600080fd5b3661030a57005b600080fd5b34801561031b57600080fd5b5061032f61032a366004612921565b610a00565b005b34801561033d57600080fd5b50610346610aaf565b6040516103539190612962565b60405180910390f35b34801561036857600080fd5b5061037c610377366004612995565b610b41565b6040519015158152602001610353565b34801561039857600080fd5b5061032f6103a73660046129d7565b610b58565b3480156103b857600080fd5b506002545b604051908152602001610353565b3480156103d757600080fd5b5061032f6103e6366004612a9c565b610c6f565b3480156103f757600080fd5b5061032f610406366004612ab5565b610c9e565b34801561041757600080fd5b5061037c610426366004612b2a565b610d3f565b34801561043757600080fd5b5061032f610446366004612921565b610d65565b34801561045757600080fd5b5060405160098152602001610353565b34801561047357600080fd5b5061037c610482366004612995565b610e13565b34801561049357600080fd5b5061032f6104a2366004612a9c565b610e34565b3480156104b357600080fd5b5061032f6104c2366004612921565b610e41565b3480156104d357600080fd5b506009546104ea90640100000000900461ffff1681565b60405161ffff9091168152602001610353565b34801561050957600080fd5b506009546104ea90600160801b900461ffff1681565b34801561052b57600080fd5b5061037c61053a366004612921565b60086020526000908152604090205460ff1681565b34801561055b57600080fd5b5061032f61056a366004612b7d565b610e8f565b34801561057b57600080fd5b5061032f61058a366004612921565b610f06565b34801561059b57600080fd5b5061032f6105aa366004612921565b610f96565b3480156105bb57600080fd5b5061032f6105ca366004612ab5565b611026565b3480156105db57600080fd5b506103bd6105ea366004612921565b6001600160a01b031660009081526020819052604090205490565b34801561061157600080fd5b5061032f6110c2565b34801561062657600080fd5b5061032f610635366004612b7d565b6110f8565b34801561064657600080fd5b5061032f610655366004612b7d565b611161565b34801561066657600080fd5b5061068e7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610353565b3480156106b257600080fd5b506009546104ea90600160501b900461ffff1681565b3480156106d457600080fd5b506103bd60125481565b3480156106ea57600080fd5b506009546104ea9062010000900461ffff1681565b34801561070b57600080fd5b5061032f61071a366004612a9c565b6111e0565b34801561072b57600080fd5b506009546104ea90600160701b900461ffff1681565b34801561074d57600080fd5b5061032f61120f565b34801561076257600080fd5b506005546001600160a01b031661068e565b34801561078057600080fd5b506009546104ea90600160401b900461ffff1681565b3480156107a257600080fd5b5061034661124e565b3480156107b757600080fd5b5061032f6107c6366004612bce565b61125d565b3480156107d757600080fd5b506009546104ea90600160601b900461ffff1681565b3480156107f957600080fd5b5061037c610808366004612921565b600f6020526000908152604090205460ff1681565b34801561082957600080fd5b5061037c610838366004612995565b611330565b34801561084957600080fd5b5061032f610858366004612c07565b6113b4565b34801561086957600080fd5b5061037c610878366004612995565b6114a9565b34801561088957600080fd5b5061037c610898366004612921565b600e6020526000908152604090205460ff1681565b3480156108b957600080fd5b5060075461037c90600160a01b900460ff1681565b3480156108da57600080fd5b5061032f6108e9366004612a9c565b6114b6565b3480156108fa57600080fd5b5061068e7f000000000000000000000000000000000000000000000000000000000000000081565b34801561092e57600080fd5b506103bd60105481565b34801561094457600080fd5b506103bd610953366004612c07565b6114e5565b34801561096457600080fd5b5061032f611510565b34801561097957600080fd5b5061032f610988366004612921565b611573565b34801561099957600080fd5b506009546104ea9061ffff1681565b3480156109b457600080fd5b5061032f6109c3366004612921565b6115be565b3480156109d457600080fd5b506009546104ea90600160301b900461ffff1681565b3480156109f657600080fd5b506103bd60135481565b6005546001600160a01b03163314610a335760405162461bcd60e51b8152600401610a2a90612c35565b60405180910390fd5b6001600160a01b0381166000908152600f602052604090205460ff16610a8e5760405162461bcd60e51b815260206004820152601060248201526f15d85b1b195d081b9bdd08185919195960821b6044820152606401610a2a565b6001600160a01b03166000908152600f60205260409020805460ff19169055565b606060038054610abe90612c6a565b80601f0160208091040260200160405190810160405280929190818152602001828054610aea90612c6a565b8015610b375780601f10610b0c57610100808354040283529160200191610b37565b820191906000526020600020905b815481529060010190602001808311610b1a57829003601f168201915b5050505050905090565b6000610b4e338484611656565b5060015b92915050565b6005546001600160a01b03163314610b825760405162461bcd60e51b8152600401610a2a90612c35565b60005b8151811015610c6b57600f6000838381518110610ba457610ba4612ca4565b6020908102919091018101516001600160a01b031682528101919091526040016000205460ff1615610c0f5760405162461bcd60e51b815260206004820152601460248201527315d85b1b195d08185b1c9958591e48185919195960621b6044820152606401610a2a565b6001600f6000848481518110610c2757610c27612ca4565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff191691151591909117905580610c6381612cd0565b915050610b85565b5050565b6005546001600160a01b03163314610c995760405162461bcd60e51b8152600401610a2a90612c35565b601355565b6005546001600160a01b03163314610cc85760405162461bcd60e51b8152600401610a2a90612c35565b60005b81811015610d3a57600060086000858585818110610ceb57610ceb612ca4565b9050602002016020810190610d009190612921565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905580610d3281612cd0565b915050610ccb565b505050565b600033610d4d85828561177a565b610d588585856117f4565b60019150505b9392505050565b6005546001600160a01b03163314610d8f5760405162461bcd60e51b8152600401610a2a90612c35565b6001600160a01b0381166000908152600f602052604090205460ff1615610def5760405162461bcd60e51b815260206004820152601460248201527315d85b1b195d08185b1c9958591e48185919195960621b6044820152606401610a2a565b6001600160a01b03166000908152600f60205260409020805460ff19166001179055565b6000610b4e338484610e2533886114e5565b610e2f9190612ce9565b611656565b610e3e3382611da2565b50565b6005546001600160a01b03163314610e6b5760405162461bcd60e51b8152600401610a2a90612c35565b6001600160a01b03166000908152600860205260409020805460ff19166001179055565b6005546001600160a01b03163314610eb95760405162461bcd60e51b8152600401610a2a90612c35565b6009805463ffffffff60601b1916600160601b61ffff9586160261ffff60701b191617600160701b938516939093029290921761ffff60801b1916600160801b9190931602919091179055565b6005546001600160a01b03163314610f305760405162461bcd60e51b8152600401610a2a90612c35565b6001600160a01b038116610f745760405162461bcd60e51b815260206004820152600b60248201526a043616e27742073657420360ac1b6044820152606401610a2a565b600780546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b03163314610fc05760405162461bcd60e51b8152600401610a2a90612c35565b6001600160a01b0381166110045760405162461bcd60e51b815260206004820152600b60248201526a043616e27742073657420360ac1b6044820152606401610a2a565b600680546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b031633146110505760405162461bcd60e51b8152600401610a2a90612c35565b60005b81811015610d3a5760016008600085858581811061107357611073612ca4565b90506020020160208101906110889190612921565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055806110ba81612cd0565b915050611053565b6005546001600160a01b031633146110ec5760405162461bcd60e51b8152600401610a2a90612c35565b6110f66000611ef0565b565b6005546001600160a01b031633146111225760405162461bcd60e51b8152600401610a2a90612c35565b6009805461ffff94851663ffffffff199091161762010000938516939093029290921765ffff0000000019166401000000009190931602919091179055565b6005546001600160a01b0316331461118b5760405162461bcd60e51b8152600401610a2a90612c35565b6009805469ffffffff0000000000001916600160301b61ffff9586160269ffff0000000000000000191617600160401b938516939093029290921761ffff60501b1916600160501b9190931602919091179055565b6005546001600160a01b0316331461120a5760405162461bcd60e51b8152600401610a2a90612c35565b601055565b6005546001600160a01b031633146112395760405162461bcd60e51b8152600401610a2a90612c35565b6007805460ff60a01b1916600160a01b179055565b606060048054610abe90612c6a565b6005546001600160a01b031633146112875760405162461bcd60e51b8152600401610a2a90612c35565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316036113085760405162461bcd60e51b815260206004820152601a60248201527f54686520706169722063616e6e6f742062652072656d6f7665640000000000006044820152606401610a2a565b6001600160a01b0382166000908152600e60205260409020805460ff19168215151790555050565b60008061133d33856114e5565b90508281101561139d5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610a2a565b6113aa3385858403611656565b5060019392505050565b6005546001600160a01b031633146113de5760405162461bcd60e51b8152600401610a2a90612c35565b6001600160a01b0381166114345760405162461bcd60e51b815260206004820181905260248201527f77616c6c6574416464726573732063616e2774206265203020616464726573736044820152606401610a2a565b6040516370a0823160e01b8152306004820152610c6b90839083906001600160a01b038316906370a0823190602401602060405180830381865afa158015611480573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114a49190612cfc565b611f42565b6000610b4e3384846117f4565b6005546001600160a01b031633146114e05760405162461bcd60e51b8152600401610a2a90612c35565b601255565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6005546001600160a01b0316331461153a5760405162461bcd60e51b8152600401610a2a90612c35565b6005546040516001600160a01b03909116904780156108fc02916000818181858888f19350505050158015610e3e573d6000803e3d6000fd5b6005546001600160a01b0316331461159d5760405162461bcd60e51b8152600401610a2a90612c35565b6001600160a01b03166000908152600860205260409020805460ff19169055565b6005546001600160a01b031633146115e85760405162461bcd60e51b8152600401610a2a90612c35565b6001600160a01b03811661164d5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a2a565b610e3e81611ef0565b6001600160a01b0383166116b85760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610a2a565b6001600160a01b0382166117195760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610a2a565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b600061178684846114e5565b905060001981146117ee57818110156117e15760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610a2a565b6117ee8484848403611656565b50505050565b600754600160a01b900460ff16611890576001600160a01b03831660009081526008602052604090205460ff168061184457506001600160a01b03821660009081526008602052604090205460ff165b6118905760405162461bcd60e51b815260206004820152601a60248201527f54726164696e67206973206e6f7420616374697665207965742e0000000000006044820152606401610a2a565b6001600160a01b0383166000908152600f602052604090205460ff161580156118d257506001600160a01b0382166000908152600f602052604090205460ff16155b61190b5760405162461bcd60e51b815260206004820152600a602482015269109bdd081dd85b1b195d60b21b6044820152606401610a2a565b611913611f94565b60145460ff168015611928575060115460ff16155b801561194c57506001600160a01b0382166000908152600e602052604090205460ff165b1561198f5730600090815260208190526040902054601054600d546127109161197491612d15565b61197e9190612d2c565b811061198d5761198d816120a4565b505b6001600160a01b0383166000908152600860205260408120548190819060ff161580156119d557506001600160a01b03851660009081526008602052604090205460ff16155b15611d0b576001600160a01b0386166000908152600e602052604090205460ff1615611b32576009546103e890611a109061ffff1686612d15565b611a1a9190612d2c565b6009549093506103e890611a389062010000900461ffff1686612d15565b611a429190612d2c565b6009549092506103e890611a6290640100000000900461ffff1686612d15565b611a6c9190612d2c565b9050601254841115611ab75760405162461bcd60e51b8152602060048201526014602482015273082dadeeadce840caf0c6cacac8e640dac2f0a8f60631b6044820152606401610a2a565b60135484611ada876001600160a01b031660009081526020819052604090205490565b611ae49190612ce9565b1115611b2d5760405162461bcd60e51b8152602060048201526018602482015277105b5bdd5b9d08195e18d959591cc81b585e15d85b1b195d60421b6044820152606401610a2a565b611d0b565b6001600160a01b0385166000908152600e602052604090205460ff1615611bd2576009546103e890611b6f90600160301b900461ffff1686612d15565b611b799190612d2c565b6009549093506103e890611b9890600160401b900461ffff1686612d15565b611ba29190612d2c565b6009549092506103e890611bc190600160501b900461ffff1686612d15565b611bcb9190612d2c565b9050611d0b565b6009546103e890611bee90600160601b900461ffff1686612d15565b611bf89190612d2c565b6009549093506103e890611c1790600160701b900461ffff1686612d15565b611c219190612d2c565b6009549092506103e890611c4090600160801b900461ffff1686612d15565b611c4a9190612d2c565b9050601254841115611c955760405162461bcd60e51b8152602060048201526014602482015273082dadeeadce840caf0c6cacac8e640dac2f0a8f60631b6044820152606401610a2a565b60135484611cb8876001600160a01b031660009081526020819052604090205490565b611cc29190612ce9565b1115611d0b5760405162461bcd60e51b8152602060048201526018602482015277105b5bdd5b9d08195e18d959591cc81b585e15d85b1b195d60421b6044820152606401610a2a565b600081611d188486612ce9565b611d229190612ce9565b90506000611d308287612d4e565b9050611d3d88888361227b565b8115611d9857611d4e88308461227b565b84600a6000828254611d609190612ce9565b9250508190555083600b6000828254611d799190612ce9565b9250508190555082600c6000828254611d929190612ce9565b90915550505b5050505050505050565b6001600160a01b038216611e025760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610a2a565b6001600160a01b03821660009081526020819052604090205481811015611e765760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610a2a565b6001600160a01b0383166000908152602081905260408120838303905560028054849290611ea5908490612d4e565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610d3a908490612449565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015611ff5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120199190612d78565b506001600160701b031691506001600160701b0316915061206f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031660009081526020819052604090205490565b600d5581158015906120815750600081115b61208c57600061208f565b60015b6014805460ff19169115159190911790555050565b6011805460ff19166001179055600c54600b54600a54600092916120c791612ce9565b6120d19190612ce9565b9050806000036120e1575061226e565b6000816002600a546120f39190612d2c565b6120fd9085612d15565b6121079190612d2c565b90504760006121168386612d4e565b90506121218161251b565b600061212d8347612d4e565b9050600085600b54836121409190612d15565b61214a9190612d2c565b9050600086600c548461215d9190612d15565b6121679190612d2c565b90506000816121768486612d4e565b6121809190612d4e565b90506000871180156121925750600081115b156121a1576121a187826126a0565b6006546040516000916001600160a01b03169061753090869084818181858888f193505050503d80600081146121f3576040519150601f19603f3d011682016040523d82523d6000602084013e6121f8565b606091505b50506007546040519192506001600160a01b0316906175309085906000818181858888f193505050503d806000811461224d576040519150601f19603f3d011682016040523d82523d6000602084013e612252565b606091505b50506000600a819055600b819055600c55505050505050505050505b506011805460ff19169055565b6001600160a01b0383166122df5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610a2a565b6001600160a01b0382166123415760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610a2a565b6001600160a01b038316600090815260208190526040902054818110156123b95760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610a2a565b6001600160a01b038085166000908152602081905260408082208585039055918516815290812080548492906123f0908490612ce9565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161243c91815260200190565b60405180910390a36117ee565b600061249e826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661277b9092919063ffffffff16565b805190915015610d3a57808060200190518101906124bc9190612dc8565b610d3a5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610a2a565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061255057612550612ca4565b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156125ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125f29190612de5565b8160018151811061260557612605612ca4565b6001600160a01b03928316602091820292909201015260405163791ac94760e01b81527f00000000000000000000000000000000000000000000000000000000000000009091169063791ac9479061266a908590600090869030904290600401612e02565b600060405180830381600087803b15801561268457600080fd5b505af1158015612698573d6000803e3d6000fd5b505050505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663f305d7198230856000806126e76005546001600160a01b031690565b60405160e088901b6001600160e01b03191681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c40160606040518083038185885af115801561274f573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906127749190612e73565b5050505050565b606061278a8484600085612792565b949350505050565b6060824710156127f35760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610a2a565b6001600160a01b0385163b61284a5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610a2a565b600080866001600160a01b031685876040516128669190612ea1565b60006040518083038185875af1925050503d80600081146128a3576040519150601f19603f3d011682016040523d82523d6000602084013e6128a8565b606091505b50915091506128b88282866128c3565b979650505050505050565b606083156128d2575081610d5e565b8251156128e25782518084602001fd5b8160405162461bcd60e51b8152600401610a2a9190612962565b6001600160a01b0381168114610e3e57600080fd5b803561291c816128fc565b919050565b60006020828403121561293357600080fd5b8135610d5e816128fc565b60005b83811015612959578181015183820152602001612941565b50506000910152565b602081526000825180602084015261298181604085016020870161293e565b601f01601f19169190910160400192915050565b600080604083850312156129a857600080fd5b82356129b3816128fc565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b600060208083850312156129ea57600080fd5b823567ffffffffffffffff80821115612a0257600080fd5b818501915085601f830112612a1657600080fd5b813581811115612a2857612a286129c1565b8060051b604051601f19603f83011681018181108582111715612a4d57612a4d6129c1565b604052918252848201925083810185019188831115612a6b57600080fd5b938501935b82851015612a9057612a8185612911565b84529385019392850192612a70565b98975050505050505050565b600060208284031215612aae57600080fd5b5035919050565b60008060208385031215612ac857600080fd5b823567ffffffffffffffff80821115612ae057600080fd5b818501915085601f830112612af457600080fd5b813581811115612b0357600080fd5b8660208260051b8501011115612b1857600080fd5b60209290920196919550909350505050565b600080600060608486031215612b3f57600080fd5b8335612b4a816128fc565b92506020840135612b5a816128fc565b929592945050506040919091013590565b803561ffff8116811461291c57600080fd5b600080600060608486031215612b9257600080fd5b612b9b84612b6b565b9250612ba960208501612b6b565b9150612bb760408501612b6b565b90509250925092565b8015158114610e3e57600080fd5b60008060408385031215612be157600080fd5b8235612bec816128fc565b91506020830135612bfc81612bc0565b809150509250929050565b60008060408385031215612c1a57600080fd5b8235612c25816128fc565b91506020830135612bfc816128fc565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c90821680612c7e57607f821691505b602082108103612c9e57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060018201612ce257612ce2612cba565b5060010190565b80820180821115610b5257610b52612cba565b600060208284031215612d0e57600080fd5b5051919050565b8082028115828204841417610b5257610b52612cba565b600082612d4957634e487b7160e01b600052601260045260246000fd5b500490565b81810381811115610b5257610b52612cba565b80516001600160701b038116811461291c57600080fd5b600080600060608486031215612d8d57600080fd5b612d9684612d61565b9250612da460208501612d61565b9150604084015163ffffffff81168114612dbd57600080fd5b809150509250925092565b600060208284031215612dda57600080fd5b8151610d5e81612bc0565b600060208284031215612df757600080fd5b8151610d5e816128fc565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015612e525784516001600160a01b031683529383019391830191600101612e2d565b50506001600160a01b03969096166060850152505050608001529392505050565b600080600060608486031215612e8857600080fd5b8351925060208401519150604084015190509250925092565b60008251612eb381846020870161293e565b919091019291505056fea2646970667358221220d389d2b036d369016986143a24b46bcf545a546d0a6598ffcb44cbe6237769c564736f6c63430008110033

Deployed Bytecode

0x6080604052600436106103035760003560e01c80637437681e11610190578063a9059cbb116100dc578063dd62ed3e11610095578063f11a24d31161006f578063f11a24d31461098d578063f2fde38b146109a8578063f6374342146109c8578063f8b45b05146109ea57600080fd5b8063dd62ed3e14610938578063e086e5ec14610958578063ea2f0b371461096d57600080fd5b8063a9059cbb1461085d578063b62496f51461087d578063bbc0c742146108ad578063c2d0ffca146108ce578063c816841b146108ee578063dbf1cd131461092257600080fd5b806392136913116101495780639bb19a32116101235780639bb19a32146107cb5780639cbc1ad6146107ed578063a457c2d71461081d578063a522ad251461083d57600080fd5b8063921369131461077457806395d89b41146107965780639a7a23d6146107ab57600080fd5b80637437681e146106c85780637bce5a04146106de57806382d58ce9146106ff57806385c5b3191461071f5780638a8c523c146107415780638da5cb5b1461075657600080fd5b8063439be3511161024f5780636f3ec7ae1161020857806371aadb77116101e257806371aadb771461061a57806372bffc891461063a578063735de9f71461065a578063742bd2a5146106a657600080fd5b80636f3ec7ae146105af57806370a08231146105cf578063715018a61461060557600080fd5b8063439be351146104c75780634f46b2c3146104fd5780635342acb41461051f57806353dc21211461054f5780635b06a1d11461056f578063660d0af41461058f57600080fd5b806323a9c742116102bc578063313ce56711610296578063313ce5671461044b578063395093511461046757806342966c6814610487578063437823ec146104a757600080fd5b806323a9c742146103eb57806323b872dd1461040b5780632a3606311461042b57600080fd5b80630305caff1461030f57806306fdde0314610331578063095ea7b31461035c5780630e460b731461038c57806318160ddd146103ac5780631c499ab0146103cb57600080fd5b3661030a57005b600080fd5b34801561031b57600080fd5b5061032f61032a366004612921565b610a00565b005b34801561033d57600080fd5b50610346610aaf565b6040516103539190612962565b60405180910390f35b34801561036857600080fd5b5061037c610377366004612995565b610b41565b6040519015158152602001610353565b34801561039857600080fd5b5061032f6103a73660046129d7565b610b58565b3480156103b857600080fd5b506002545b604051908152602001610353565b3480156103d757600080fd5b5061032f6103e6366004612a9c565b610c6f565b3480156103f757600080fd5b5061032f610406366004612ab5565b610c9e565b34801561041757600080fd5b5061037c610426366004612b2a565b610d3f565b34801561043757600080fd5b5061032f610446366004612921565b610d65565b34801561045757600080fd5b5060405160098152602001610353565b34801561047357600080fd5b5061037c610482366004612995565b610e13565b34801561049357600080fd5b5061032f6104a2366004612a9c565b610e34565b3480156104b357600080fd5b5061032f6104c2366004612921565b610e41565b3480156104d357600080fd5b506009546104ea90640100000000900461ffff1681565b60405161ffff9091168152602001610353565b34801561050957600080fd5b506009546104ea90600160801b900461ffff1681565b34801561052b57600080fd5b5061037c61053a366004612921565b60086020526000908152604090205460ff1681565b34801561055b57600080fd5b5061032f61056a366004612b7d565b610e8f565b34801561057b57600080fd5b5061032f61058a366004612921565b610f06565b34801561059b57600080fd5b5061032f6105aa366004612921565b610f96565b3480156105bb57600080fd5b5061032f6105ca366004612ab5565b611026565b3480156105db57600080fd5b506103bd6105ea366004612921565b6001600160a01b031660009081526020819052604090205490565b34801561061157600080fd5b5061032f6110c2565b34801561062657600080fd5b5061032f610635366004612b7d565b6110f8565b34801561064657600080fd5b5061032f610655366004612b7d565b611161565b34801561066657600080fd5b5061068e7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b6040516001600160a01b039091168152602001610353565b3480156106b257600080fd5b506009546104ea90600160501b900461ffff1681565b3480156106d457600080fd5b506103bd60125481565b3480156106ea57600080fd5b506009546104ea9062010000900461ffff1681565b34801561070b57600080fd5b5061032f61071a366004612a9c565b6111e0565b34801561072b57600080fd5b506009546104ea90600160701b900461ffff1681565b34801561074d57600080fd5b5061032f61120f565b34801561076257600080fd5b506005546001600160a01b031661068e565b34801561078057600080fd5b506009546104ea90600160401b900461ffff1681565b3480156107a257600080fd5b5061034661124e565b3480156107b757600080fd5b5061032f6107c6366004612bce565b61125d565b3480156107d757600080fd5b506009546104ea90600160601b900461ffff1681565b3480156107f957600080fd5b5061037c610808366004612921565b600f6020526000908152604090205460ff1681565b34801561082957600080fd5b5061037c610838366004612995565b611330565b34801561084957600080fd5b5061032f610858366004612c07565b6113b4565b34801561086957600080fd5b5061037c610878366004612995565b6114a9565b34801561088957600080fd5b5061037c610898366004612921565b600e6020526000908152604090205460ff1681565b3480156108b957600080fd5b5060075461037c90600160a01b900460ff1681565b3480156108da57600080fd5b5061032f6108e9366004612a9c565b6114b6565b3480156108fa57600080fd5b5061068e7f0000000000000000000000006e2faa83a18e5e6a1a666695bc97955f9077fa9a81565b34801561092e57600080fd5b506103bd60105481565b34801561094457600080fd5b506103bd610953366004612c07565b6114e5565b34801561096457600080fd5b5061032f611510565b34801561097957600080fd5b5061032f610988366004612921565b611573565b34801561099957600080fd5b506009546104ea9061ffff1681565b3480156109b457600080fd5b5061032f6109c3366004612921565b6115be565b3480156109d457600080fd5b506009546104ea90600160301b900461ffff1681565b3480156109f657600080fd5b506103bd60135481565b6005546001600160a01b03163314610a335760405162461bcd60e51b8152600401610a2a90612c35565b60405180910390fd5b6001600160a01b0381166000908152600f602052604090205460ff16610a8e5760405162461bcd60e51b815260206004820152601060248201526f15d85b1b195d081b9bdd08185919195960821b6044820152606401610a2a565b6001600160a01b03166000908152600f60205260409020805460ff19169055565b606060038054610abe90612c6a565b80601f0160208091040260200160405190810160405280929190818152602001828054610aea90612c6a565b8015610b375780601f10610b0c57610100808354040283529160200191610b37565b820191906000526020600020905b815481529060010190602001808311610b1a57829003601f168201915b5050505050905090565b6000610b4e338484611656565b5060015b92915050565b6005546001600160a01b03163314610b825760405162461bcd60e51b8152600401610a2a90612c35565b60005b8151811015610c6b57600f6000838381518110610ba457610ba4612ca4565b6020908102919091018101516001600160a01b031682528101919091526040016000205460ff1615610c0f5760405162461bcd60e51b815260206004820152601460248201527315d85b1b195d08185b1c9958591e48185919195960621b6044820152606401610a2a565b6001600f6000848481518110610c2757610c27612ca4565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff191691151591909117905580610c6381612cd0565b915050610b85565b5050565b6005546001600160a01b03163314610c995760405162461bcd60e51b8152600401610a2a90612c35565b601355565b6005546001600160a01b03163314610cc85760405162461bcd60e51b8152600401610a2a90612c35565b60005b81811015610d3a57600060086000858585818110610ceb57610ceb612ca4565b9050602002016020810190610d009190612921565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905580610d3281612cd0565b915050610ccb565b505050565b600033610d4d85828561177a565b610d588585856117f4565b60019150505b9392505050565b6005546001600160a01b03163314610d8f5760405162461bcd60e51b8152600401610a2a90612c35565b6001600160a01b0381166000908152600f602052604090205460ff1615610def5760405162461bcd60e51b815260206004820152601460248201527315d85b1b195d08185b1c9958591e48185919195960621b6044820152606401610a2a565b6001600160a01b03166000908152600f60205260409020805460ff19166001179055565b6000610b4e338484610e2533886114e5565b610e2f9190612ce9565b611656565b610e3e3382611da2565b50565b6005546001600160a01b03163314610e6b5760405162461bcd60e51b8152600401610a2a90612c35565b6001600160a01b03166000908152600860205260409020805460ff19166001179055565b6005546001600160a01b03163314610eb95760405162461bcd60e51b8152600401610a2a90612c35565b6009805463ffffffff60601b1916600160601b61ffff9586160261ffff60701b191617600160701b938516939093029290921761ffff60801b1916600160801b9190931602919091179055565b6005546001600160a01b03163314610f305760405162461bcd60e51b8152600401610a2a90612c35565b6001600160a01b038116610f745760405162461bcd60e51b815260206004820152600b60248201526a043616e27742073657420360ac1b6044820152606401610a2a565b600780546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b03163314610fc05760405162461bcd60e51b8152600401610a2a90612c35565b6001600160a01b0381166110045760405162461bcd60e51b815260206004820152600b60248201526a043616e27742073657420360ac1b6044820152606401610a2a565b600680546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b031633146110505760405162461bcd60e51b8152600401610a2a90612c35565b60005b81811015610d3a5760016008600085858581811061107357611073612ca4565b90506020020160208101906110889190612921565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055806110ba81612cd0565b915050611053565b6005546001600160a01b031633146110ec5760405162461bcd60e51b8152600401610a2a90612c35565b6110f66000611ef0565b565b6005546001600160a01b031633146111225760405162461bcd60e51b8152600401610a2a90612c35565b6009805461ffff94851663ffffffff199091161762010000938516939093029290921765ffff0000000019166401000000009190931602919091179055565b6005546001600160a01b0316331461118b5760405162461bcd60e51b8152600401610a2a90612c35565b6009805469ffffffff0000000000001916600160301b61ffff9586160269ffff0000000000000000191617600160401b938516939093029290921761ffff60501b1916600160501b9190931602919091179055565b6005546001600160a01b0316331461120a5760405162461bcd60e51b8152600401610a2a90612c35565b601055565b6005546001600160a01b031633146112395760405162461bcd60e51b8152600401610a2a90612c35565b6007805460ff60a01b1916600160a01b179055565b606060048054610abe90612c6a565b6005546001600160a01b031633146112875760405162461bcd60e51b8152600401610a2a90612c35565b7f0000000000000000000000006e2faa83a18e5e6a1a666695bc97955f9077fa9a6001600160a01b0316826001600160a01b0316036113085760405162461bcd60e51b815260206004820152601a60248201527f54686520706169722063616e6e6f742062652072656d6f7665640000000000006044820152606401610a2a565b6001600160a01b0382166000908152600e60205260409020805460ff19168215151790555050565b60008061133d33856114e5565b90508281101561139d5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610a2a565b6113aa3385858403611656565b5060019392505050565b6005546001600160a01b031633146113de5760405162461bcd60e51b8152600401610a2a90612c35565b6001600160a01b0381166114345760405162461bcd60e51b815260206004820181905260248201527f77616c6c6574416464726573732063616e2774206265203020616464726573736044820152606401610a2a565b6040516370a0823160e01b8152306004820152610c6b90839083906001600160a01b038316906370a0823190602401602060405180830381865afa158015611480573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114a49190612cfc565b611f42565b6000610b4e3384846117f4565b6005546001600160a01b031633146114e05760405162461bcd60e51b8152600401610a2a90612c35565b601255565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6005546001600160a01b0316331461153a5760405162461bcd60e51b8152600401610a2a90612c35565b6005546040516001600160a01b03909116904780156108fc02916000818181858888f19350505050158015610e3e573d6000803e3d6000fd5b6005546001600160a01b0316331461159d5760405162461bcd60e51b8152600401610a2a90612c35565b6001600160a01b03166000908152600860205260409020805460ff19169055565b6005546001600160a01b031633146115e85760405162461bcd60e51b8152600401610a2a90612c35565b6001600160a01b03811661164d5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a2a565b610e3e81611ef0565b6001600160a01b0383166116b85760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610a2a565b6001600160a01b0382166117195760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610a2a565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b600061178684846114e5565b905060001981146117ee57818110156117e15760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610a2a565b6117ee8484848403611656565b50505050565b600754600160a01b900460ff16611890576001600160a01b03831660009081526008602052604090205460ff168061184457506001600160a01b03821660009081526008602052604090205460ff165b6118905760405162461bcd60e51b815260206004820152601a60248201527f54726164696e67206973206e6f7420616374697665207965742e0000000000006044820152606401610a2a565b6001600160a01b0383166000908152600f602052604090205460ff161580156118d257506001600160a01b0382166000908152600f602052604090205460ff16155b61190b5760405162461bcd60e51b815260206004820152600a602482015269109bdd081dd85b1b195d60b21b6044820152606401610a2a565b611913611f94565b60145460ff168015611928575060115460ff16155b801561194c57506001600160a01b0382166000908152600e602052604090205460ff165b1561198f5730600090815260208190526040902054601054600d546127109161197491612d15565b61197e9190612d2c565b811061198d5761198d816120a4565b505b6001600160a01b0383166000908152600860205260408120548190819060ff161580156119d557506001600160a01b03851660009081526008602052604090205460ff16155b15611d0b576001600160a01b0386166000908152600e602052604090205460ff1615611b32576009546103e890611a109061ffff1686612d15565b611a1a9190612d2c565b6009549093506103e890611a389062010000900461ffff1686612d15565b611a429190612d2c565b6009549092506103e890611a6290640100000000900461ffff1686612d15565b611a6c9190612d2c565b9050601254841115611ab75760405162461bcd60e51b8152602060048201526014602482015273082dadeeadce840caf0c6cacac8e640dac2f0a8f60631b6044820152606401610a2a565b60135484611ada876001600160a01b031660009081526020819052604090205490565b611ae49190612ce9565b1115611b2d5760405162461bcd60e51b8152602060048201526018602482015277105b5bdd5b9d08195e18d959591cc81b585e15d85b1b195d60421b6044820152606401610a2a565b611d0b565b6001600160a01b0385166000908152600e602052604090205460ff1615611bd2576009546103e890611b6f90600160301b900461ffff1686612d15565b611b799190612d2c565b6009549093506103e890611b9890600160401b900461ffff1686612d15565b611ba29190612d2c565b6009549092506103e890611bc190600160501b900461ffff1686612d15565b611bcb9190612d2c565b9050611d0b565b6009546103e890611bee90600160601b900461ffff1686612d15565b611bf89190612d2c565b6009549093506103e890611c1790600160701b900461ffff1686612d15565b611c219190612d2c565b6009549092506103e890611c4090600160801b900461ffff1686612d15565b611c4a9190612d2c565b9050601254841115611c955760405162461bcd60e51b8152602060048201526014602482015273082dadeeadce840caf0c6cacac8e640dac2f0a8f60631b6044820152606401610a2a565b60135484611cb8876001600160a01b031660009081526020819052604090205490565b611cc29190612ce9565b1115611d0b5760405162461bcd60e51b8152602060048201526018602482015277105b5bdd5b9d08195e18d959591cc81b585e15d85b1b195d60421b6044820152606401610a2a565b600081611d188486612ce9565b611d229190612ce9565b90506000611d308287612d4e565b9050611d3d88888361227b565b8115611d9857611d4e88308461227b565b84600a6000828254611d609190612ce9565b9250508190555083600b6000828254611d799190612ce9565b9250508190555082600c6000828254611d929190612ce9565b90915550505b5050505050505050565b6001600160a01b038216611e025760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610a2a565b6001600160a01b03821660009081526020819052604090205481811015611e765760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610a2a565b6001600160a01b0383166000908152602081905260408120838303905560028054849290611ea5908490612d4e565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610d3a908490612449565b6000807f0000000000000000000000006e2faa83a18e5e6a1a666695bc97955f9077fa9a6001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015611ff5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120199190612d78565b506001600160701b031691506001600160701b0316915061206f7f0000000000000000000000006e2faa83a18e5e6a1a666695bc97955f9077fa9a6001600160a01b031660009081526020819052604090205490565b600d5581158015906120815750600081115b61208c57600061208f565b60015b6014805460ff19169115159190911790555050565b6011805460ff19166001179055600c54600b54600a54600092916120c791612ce9565b6120d19190612ce9565b9050806000036120e1575061226e565b6000816002600a546120f39190612d2c565b6120fd9085612d15565b6121079190612d2c565b90504760006121168386612d4e565b90506121218161251b565b600061212d8347612d4e565b9050600085600b54836121409190612d15565b61214a9190612d2c565b9050600086600c548461215d9190612d15565b6121679190612d2c565b90506000816121768486612d4e565b6121809190612d4e565b90506000871180156121925750600081115b156121a1576121a187826126a0565b6006546040516000916001600160a01b03169061753090869084818181858888f193505050503d80600081146121f3576040519150601f19603f3d011682016040523d82523d6000602084013e6121f8565b606091505b50506007546040519192506001600160a01b0316906175309085906000818181858888f193505050503d806000811461224d576040519150601f19603f3d011682016040523d82523d6000602084013e612252565b606091505b50506000600a819055600b819055600c55505050505050505050505b506011805460ff19169055565b6001600160a01b0383166122df5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610a2a565b6001600160a01b0382166123415760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610a2a565b6001600160a01b038316600090815260208190526040902054818110156123b95760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610a2a565b6001600160a01b038085166000908152602081905260408082208585039055918516815290812080548492906123f0908490612ce9565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161243c91815260200190565b60405180910390a36117ee565b600061249e826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661277b9092919063ffffffff16565b805190915015610d3a57808060200190518101906124bc9190612dc8565b610d3a5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610a2a565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061255057612550612ca4565b60200260200101906001600160a01b031690816001600160a01b0316815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156125ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125f29190612de5565b8160018151811061260557612605612ca4565b6001600160a01b03928316602091820292909201015260405163791ac94760e01b81527f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d9091169063791ac9479061266a908590600090869030904290600401612e02565b600060405180830381600087803b15801561268457600080fd5b505af1158015612698573d6000803e3d6000fd5b505050505050565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663f305d7198230856000806126e76005546001600160a01b031690565b60405160e088901b6001600160e01b03191681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c40160606040518083038185885af115801561274f573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906127749190612e73565b5050505050565b606061278a8484600085612792565b949350505050565b6060824710156127f35760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610a2a565b6001600160a01b0385163b61284a5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610a2a565b600080866001600160a01b031685876040516128669190612ea1565b60006040518083038185875af1925050503d80600081146128a3576040519150601f19603f3d011682016040523d82523d6000602084013e6128a8565b606091505b50915091506128b88282866128c3565b979650505050505050565b606083156128d2575081610d5e565b8251156128e25782518084602001fd5b8160405162461bcd60e51b8152600401610a2a9190612962565b6001600160a01b0381168114610e3e57600080fd5b803561291c816128fc565b919050565b60006020828403121561293357600080fd5b8135610d5e816128fc565b60005b83811015612959578181015183820152602001612941565b50506000910152565b602081526000825180602084015261298181604085016020870161293e565b601f01601f19169190910160400192915050565b600080604083850312156129a857600080fd5b82356129b3816128fc565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b600060208083850312156129ea57600080fd5b823567ffffffffffffffff80821115612a0257600080fd5b818501915085601f830112612a1657600080fd5b813581811115612a2857612a286129c1565b8060051b604051601f19603f83011681018181108582111715612a4d57612a4d6129c1565b604052918252848201925083810185019188831115612a6b57600080fd5b938501935b82851015612a9057612a8185612911565b84529385019392850192612a70565b98975050505050505050565b600060208284031215612aae57600080fd5b5035919050565b60008060208385031215612ac857600080fd5b823567ffffffffffffffff80821115612ae057600080fd5b818501915085601f830112612af457600080fd5b813581811115612b0357600080fd5b8660208260051b8501011115612b1857600080fd5b60209290920196919550909350505050565b600080600060608486031215612b3f57600080fd5b8335612b4a816128fc565b92506020840135612b5a816128fc565b929592945050506040919091013590565b803561ffff8116811461291c57600080fd5b600080600060608486031215612b9257600080fd5b612b9b84612b6b565b9250612ba960208501612b6b565b9150612bb760408501612b6b565b90509250925092565b8015158114610e3e57600080fd5b60008060408385031215612be157600080fd5b8235612bec816128fc565b91506020830135612bfc81612bc0565b809150509250929050565b60008060408385031215612c1a57600080fd5b8235612c25816128fc565b91506020830135612bfc816128fc565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c90821680612c7e57607f821691505b602082108103612c9e57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060018201612ce257612ce2612cba565b5060010190565b80820180821115610b5257610b52612cba565b600060208284031215612d0e57600080fd5b5051919050565b8082028115828204841417610b5257610b52612cba565b600082612d4957634e487b7160e01b600052601260045260246000fd5b500490565b81810381811115610b5257610b52612cba565b80516001600160701b038116811461291c57600080fd5b600080600060608486031215612d8d57600080fd5b612d9684612d61565b9250612da460208501612d61565b9150604084015163ffffffff81168114612dbd57600080fd5b809150509250925092565b600060208284031215612dda57600080fd5b8151610d5e81612bc0565b600060208284031215612df757600080fd5b8151610d5e816128fc565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015612e525784516001600160a01b031683529383019391830191600101612e2d565b50506001600160a01b03969096166060850152505050608001529392505050565b600080600060608486031215612e8857600080fd5b8351925060208401519150604084015190509250925092565b60008251612eb381846020870161293e565b919091019291505056fea2646970667358221220d389d2b036d369016986143a24b46bcf545a546d0a6598ffcb44cbe6237769c564736f6c63430008110033

Deployed Bytecode Sourcemap

31739:12306:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34881:161;;;;;;;;;;-1:-1:-1;34881:161:0;;;;;:::i;:::-;;:::i;:::-;;20426:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22884:208;;;;;;;;;;-1:-1:-1;22884:208:0;;;;;:::i;:::-;;:::i;:::-;;;1682:14:1;;1675:22;1657:41;;1645:2;1630:18;22884:208:0;1517:187:1;34614:259:0;;;;;;;;;;-1:-1:-1;34614:259:0;;;;;:::i;:::-;;:::i;21546:108::-;;;;;;;;;;-1:-1:-1;21634:12:0;;21546:108;;;3113:25:1;;;3101:2;3086:18;21546:108:0;2967:177:1;35147:105:0;;;;;;;;;;-1:-1:-1;35147:105:0;;;;;:::i;:::-;;:::i;36451:203::-;;;;;;;;;;-1:-1:-1;36451:203:0;;;;;:::i;:::-;;:::i;23672:295::-;;;;;;;;;;-1:-1:-1;23672:295:0;;;;;:::i;:::-;;:::i;34444:162::-;;;;;;;;;;-1:-1:-1;34444:162:0;;;;;:::i;:::-;;:::i;34352:84::-;;;;;;;;;;-1:-1:-1;34352:84:0;;34427:1;4557:36:1;;4545:2;4530:18;34352:84:0;4415:184:1;24376:291:0;;;;;;;;;;-1:-1:-1;24376:291:0;;;;;:::i;:::-;;:::i;35260:83::-;;;;;;;;;;-1:-1:-1;35260:83:0;;;;;:::i;:::-;;:::i;36000:112::-;;;;;;;;;;-1:-1:-1;36000:112:0;;;;;:::i;:::-;;:::i;32041:33::-;;;;;;;;;;-1:-1:-1;32041:33:0;;;;;;;;;;;;;;4778:6:1;4766:19;;;4748:38;;4736:2;4721:18;32041:33:0;4604:188:1;32294:32:0;;;;;;;;;;-1:-1:-1;32294:32:0;;;;-1:-1:-1;;;32294:32:0;;;;;;31899:49;;;;;;;;;;-1:-1:-1;31899:49:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;37262:337;;;;;;;;;;-1:-1:-1;37262:337:0;;;;;:::i;:::-;;:::i;37861:233::-;;;;;;;;;;-1:-1:-1;37861:233:0;;;;;:::i;:::-;;:::i;37607:246::-;;;;;;;;;;-1:-1:-1;37607:246:0;;;;;:::i;:::-;;:::i;36120:204::-;;;;;;;;;;-1:-1:-1;36120:204:0;;;;;:::i;:::-;;:::i;21717:177::-;;;;;;;;;;-1:-1:-1;21717:177:0;;;;;:::i;:::-;-1:-1:-1;;;;;21868:18:0;21836:7;21868:18;;;;;;;;;;;;21717:177;3086:103;;;;;;;;;;;;;:::i;36662:287::-;;;;;;;;;;-1:-1:-1;36662:287:0;;;;;:::i;:::-;;:::i;36957:297::-;;;;;;;;;;-1:-1:-1;36957:297:0;;;;;:::i;:::-;;:::i;32658:47::-;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;5481:32:1;;;5463:51;;5451:2;5436:18;32658:47:0;5294:226:1;32169:34:0;;;;;;;;;;-1:-1:-1;32169:34:0;;;;-1:-1:-1;;;32169:34:0;;;;;;32787:20;;;;;;;;;;;;;;;;31999:35;;;;;;;;;;-1:-1:-1;31999:35:0;;;;;;;;;;;35442:168;;;;;;;;;;-1:-1:-1;35442:168:0;;;;;:::i;:::-;;:::i;32253:34::-;;;;;;;;;;-1:-1:-1;32253:34:0;;;;-1:-1:-1;;;32253:34:0;;;;;;35351:83;;;;;;;;;;;;;:::i;2435:87::-;;;;;;;;;;-1:-1:-1;2508:6:0;;-1:-1:-1;;;;;2508:6:0;2435:87;;32126:36;;;;;;;;;;-1:-1:-1;32126:36:0;;;;-1:-1:-1;;;32126:36:0;;;;;;20645:104;;;;;;;;;;;;;:::i;35618:236::-;;;;;;;;;;-1:-1:-1;35618:236:0;;;;;:::i;:::-;;:::i;32212:34::-;;;;;;;;;;-1:-1:-1;32212:34:0;;;;-1:-1:-1;;;32212:34:0;;;;;;32567:41;;;;;;;;;;-1:-1:-1;32567:41:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;25170:476;;;;;;;;;;-1:-1:-1;25170:476:0;;;;;:::i;:::-;;:::i;43653:389::-;;;;;;;;;;-1:-1:-1;43653:389:0;;;;;:::i;:::-;;:::i;22100:200::-;;;;;;;;;;-1:-1:-1;22100:200:0;;;;;:::i;:::-;;:::i;32503:57::-;;;;;;;;;;-1:-1:-1;32503:57:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;31865:25;;;;;;;;;;-1:-1:-1;31865:25:0;;;;-1:-1:-1;;;31865:25:0;;;;;;35050:89;;;;;;;;;;-1:-1:-1;35050:89:0;;;;;:::i;:::-;;:::i;32712:36::-;;;;;;;;;;;;;;;32615:34;;;;;;;;;;;;;;;;22363:201;;;;;;;;;;-1:-1:-1;22363:201:0;;;;;:::i;:::-;;:::i;43536:109::-;;;;;;;;;;;;;:::i;36332:111::-;;;;;;;;;;-1:-1:-1;36332:111:0;;;;;:::i;:::-;;:::i;31957:35::-;;;;;;;;;;-1:-1:-1;31957:35:0;;;;;;;;3344:238;;;;;;;;;;-1:-1:-1;3344:238:0;;;;;:::i;:::-;;:::i;32083:36::-;;;;;;;;;;-1:-1:-1;32083:36:0;;;;-1:-1:-1;;;32083:36:0;;;;;;32814:24;;;;;;;;;;;;;;;;34881:161;2508:6;;-1:-1:-1;;;;;2508:6:0;1732:10;2655:23;2647:68;;;;-1:-1:-1;;;2647:68:0;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;;;;34960:17:0;::::1;;::::0;;;:9:::1;:17;::::0;;;;;::::1;;34952:46;;;::::0;-1:-1:-1;;;34952:46:0;;7606:2:1;34952:46:0::1;::::0;::::1;7588:21:1::0;7645:2;7625:18;;;7618:30;-1:-1:-1;;;7664:18:1;;;7657:46;7720:18;;34952:46:0::1;7404:340:1::0;34952:46:0::1;-1:-1:-1::0;;;;;35009:17:0::1;35029:5;35009:17:::0;;;:9:::1;:17;::::0;;;;:25;;-1:-1:-1;;35009:25:0::1;::::0;;34881:161::o;20426:100::-;20480:13;20513:5;20506:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20426:100;:::o;22884:208::-;23003:4;23025:37;23034:10;23046:7;23055:6;23025:8;:37::i;:::-;-1:-1:-1;23080:4:0;22884:208;;;;;:::o;34614:259::-;2508:6;;-1:-1:-1;;;;;2508:6:0;1732:10;2655:23;2647:68;;;;-1:-1:-1;;;2647:68:0;;;;;;;:::i;:::-;34701:9:::1;34696:170;34720:7;:14;34716:1;:18;34696:170;;;34765:9;:21;34775:7;34783:1;34775:10;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;34765:21:0::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;34765:21:0;;::::1;;34764:22;34756:55;;;::::0;-1:-1:-1;;;34756:55:0;;8468:2:1;34756:55:0::1;::::0;::::1;8450:21:1::0;8507:2;8487:18;;;8480:30;-1:-1:-1;;;8526:18:1;;;8519:50;8586:18;;34756:55:0::1;8266:344:1::0;34756:55:0::1;34850:4;34826:9;:21;34836:7;34844:1;34836:10;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;34826:21:0::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;34826:21:0;:28;;-1:-1:-1;;34826:28:0::1;::::0;::::1;;::::0;;;::::1;::::0;;34736:3;::::1;::::0;::::1;:::i;:::-;;;;34696:170;;;;34614:259:::0;:::o;35147:105::-;2508:6;;-1:-1:-1;;;;;2508:6:0;1732:10;2655:23;2647:68;;;;-1:-1:-1;;;2647:68:0;;;;;;;:::i;:::-;35222:9:::1;:22:::0;35147:105::o;36451:203::-;2508:6;;-1:-1:-1;;;;;2508:6:0;1732:10;2655:23;2647:68;;;;-1:-1:-1;;;2647:68:0;;;;;;;:::i;:::-;36541:9:::1;36536:111;36556:19:::0;;::::1;36536:111;;;36630:5;36597:17;:30;36615:8;;36624:1;36615:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;36597:30:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;36597:30:0;:38;;-1:-1:-1;;36597:38:0::1;::::0;::::1;;::::0;;;::::1;::::0;;36577:3;::::1;::::0;::::1;:::i;:::-;;;;36536:111;;;;36451:203:::0;;:::o;23672:295::-;23803:4;1732:10;23861:38;23877:4;1732:10;23892:6;23861:15;:38::i;:::-;23910:27;23920:4;23926:2;23930:6;23910:9;:27::i;:::-;23955:4;23948:11;;;23672:295;;;;;;:::o;34444:162::-;2508:6;;-1:-1:-1;;;;;2508:6:0;1732:10;2655:23;2647:68;;;;-1:-1:-1;;;2647:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;34521:17:0;::::1;;::::0;;;:9:::1;:17;::::0;;;;;::::1;;34520:18;34512:51;;;::::0;-1:-1:-1;;;34512:51:0;;8468:2:1;34512:51:0::1;::::0;::::1;8450:21:1::0;8507:2;8487:18;;;8480:30;-1:-1:-1;;;8526:18:1;;;8519:50;8586:18;;34512:51:0::1;8266:344:1::0;34512:51:0::1;-1:-1:-1::0;;;;;34574:17:0::1;;::::0;;;:9:::1;:17;::::0;;;;:24;;-1:-1:-1;;34574:24:0::1;34594:4;34574:24;::::0;;34444:162::o;24376:291::-;24491:4;24513:124;24536:10;24561:7;24616:10;24583:30;24593:10;24605:7;24583:9;:30::i;:::-;:43;;;;:::i;:::-;24513:8;:124::i;35260:83::-;35310:25;35316:10;35328:6;35310:5;:25::i;:::-;35260:83;:::o;36000:112::-;2508:6;;-1:-1:-1;;;;;2508:6:0;1732:10;2655:23;2647:68;;;;-1:-1:-1;;;2647:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;36071:26:0::1;;::::0;;;:17:::1;:26;::::0;;;;:33;;-1:-1:-1;;36071:33:0::1;36100:4;36071:33;::::0;;36000:112::o;37262:337::-;2508:6;;-1:-1:-1;;;;;2508:6:0;1732:10;2655:23;2647:68;;;;-1:-1:-1;;;2647:68:0;;;;;;;:::i;:::-;37441:20:::1;:44:::0;;-1:-1:-1;;;;37496:44:0;-1:-1:-1;;;37441:44:0::1;::::0;;::::1;;-1:-1:-1::0;;;;37496:44:0;;-1:-1:-1;;;37496:44:0;;::::1;::::0;;;::::1;::::0;;;::::1;-1:-1:-1::0;;;;37551:40:0::1;-1:-1:-1::0;;;37551:40:0;;;::::1;;::::0;;;::::1;::::0;;37262:337::o;37861:233::-;2508:6;;-1:-1:-1;;;;;2508:6:0;1732:10;2655:23;2647:68;;;;-1:-1:-1;;;2647:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;37980:32:0;::::1;37972:56;;;::::0;-1:-1:-1;;;37972:56:0;;9219:2:1;37972:56:0::1;::::0;::::1;9201:21:1::0;9258:2;9238:18;;;9231:30;-1:-1:-1;;;9277:18:1;;;9270:41;9328:18;;37972:56:0::1;9017:335:1::0;37972:56:0::1;38039:17;:47:::0;;-1:-1:-1;;;;;;38039:47:0::1;-1:-1:-1::0;;;;;38039:47:0;;;::::1;::::0;;;::::1;::::0;;37861:233::o;37607:246::-;2508:6;;-1:-1:-1;;;;;2508:6:0;1732:10;2655:23;2647:68;;;;-1:-1:-1;;;2647:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;37733:34:0;::::1;37725:58;;;::::0;-1:-1:-1;;;37725:58:0;;9219:2:1;37725:58:0::1;::::0;::::1;9201:21:1::0;9258:2;9238:18;;;9231:30;-1:-1:-1;;;9277:18:1;;;9270:41;9328:18;;37725:58:0::1;9017:335:1::0;37725:58:0::1;37794:19;:51:::0;;-1:-1:-1;;;;;;37794:51:0::1;-1:-1:-1::0;;;;;37794:51:0;;;::::1;::::0;;;::::1;::::0;;37607:246::o;36120:204::-;2508:6;;-1:-1:-1;;;;;2508:6:0;1732:10;2655:23;2647:68;;;;-1:-1:-1;;;2647:68:0;;;;;;;:::i;:::-;36212:9:::1;36207:110;36227:19:::0;;::::1;36207:110;;;36301:4;36268:17;:30;36286:8;;36295:1;36286:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;36268:30:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;36268:30:0;:37;;-1:-1:-1;;36268:37:0::1;::::0;::::1;;::::0;;;::::1;::::0;;36248:3;::::1;::::0;::::1;:::i;:::-;;;;36207:110;;3086:103:::0;2508:6;;-1:-1:-1;;;;;2508:6:0;1732:10;2655:23;2647:68;;;;-1:-1:-1;;;2647:68:0;;;;;;;:::i;:::-;3151:30:::1;3178:1;3151:18;:30::i;:::-;3086:103::o:0;36662:287::-;2508:6;;-1:-1:-1;;;;;2508:6:0;1732:10;2655:23;2647:68;;;;-1:-1:-1;;;2647:68:0;;;;;;;:::i;:::-;36821:15:::1;:34:::0;;::::1;::::0;;::::1;-1:-1:-1::0;;36866:34:0;;;;;;;::::1;::::0;;;::::1;::::0;;;::::1;-1:-1:-1::0;;36911:30:0::1;::::0;;;;::::1;;::::0;;;::::1;::::0;;36662:287::o;36957:297::-;2508:6;;-1:-1:-1;;;;;2508:6:0;1732:10;2655:23;2647:68;;;;-1:-1:-1;;;2647:68:0;;;;;;;:::i;:::-;37120:16:::1;:36:::0;;-1:-1:-1;;37167:36:0;-1:-1:-1;;;37120:36:0::1;::::0;;::::1;;-1:-1:-1::0;;37167:36:0;;-1:-1:-1;;;37167:36:0;;::::1;::::0;;;::::1;::::0;;;::::1;-1:-1:-1::0;;;;37214:32:0::1;-1:-1:-1::0;;;37214:32:0;;;::::1;;::::0;;;::::1;::::0;;36957:297::o;35442:168::-;2508:6;;-1:-1:-1;;;;;2508:6:0;1732:10;2655:23;2647:68;;;;-1:-1:-1;;;2647:68:0;;;;;;;:::i;:::-;35560:19:::1;:42:::0;35442:168::o;35351:83::-;2508:6;;-1:-1:-1;;;;;2508:6:0;1732:10;2655:23;2647:68;;;;-1:-1:-1;;;2647:68:0;;;;;;;:::i;:::-;35406:13:::1;:20:::0;;-1:-1:-1;;;;35406:20:0::1;-1:-1:-1::0;;;35406:20:0::1;::::0;;35351:83::o;20645:104::-;20701:13;20734:7;20727:14;;;;;:::i;35618:236::-;2508:6;;-1:-1:-1;;;;;2508:6:0;1732:10;2655:23;2647:68;;;;-1:-1:-1;;;2647:68:0;;;;;;;:::i;:::-;35750:11:::1;-1:-1:-1::0;;;;;35742:19:0::1;:4;-1:-1:-1::0;;;;;35742:19:0::1;::::0;35734:58:::1;;;::::0;-1:-1:-1;;;35734:58:0;;9559:2:1;35734:58:0::1;::::0;::::1;9541:21:1::0;9598:2;9578:18;;;9571:30;9637:28;9617:18;;;9610:56;9683:18;;35734:58:0::1;9357:350:1::0;35734:58:0::1;-1:-1:-1::0;;;;;35945:31:0;;;;;;:25;:31;;;;;:39;;-1:-1:-1;;35945:39:0;;;;;;;34696:170:::1;34614:259:::0;:::o;25170:476::-;25290:4;25312:24;25339:30;25349:10;25361:7;25339:9;:30::i;:::-;25312:57;;25422:15;25402:16;:35;;25380:122;;;;-1:-1:-1;;;25380:122:0;;9914:2:1;25380:122:0;;;9896:21:1;9953:2;9933:18;;;9926:30;9992:34;9972:18;;;9965:62;-1:-1:-1;;;10043:18:1;;;10036:35;10088:19;;25380:122:0;9712:401:1;25380:122:0;25538:65;25547:10;25559:7;25587:15;25568:16;:34;25538:8;:65::i;:::-;-1:-1:-1;25634:4:0;;25170:476;-1:-1:-1;;;25170:476:0:o;43653:389::-;2508:6;;-1:-1:-1;;;;;2508:6:0;1732:10;2655:23;2647:68;;;;-1:-1:-1;;;2647:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;43796:27:0;::::1;43774:109;;;::::0;-1:-1:-1;;;43774:109:0;;10320:2:1;43774:109:0::1;::::0;::::1;10302:21:1::0;;;10339:18;;;10332:30;10398:34;10378:18;;;10371:62;10450:18;;43774:109:0::1;10118:356:1::0;43774:109:0::1;43986:37;::::0;-1:-1:-1;;;43986:37:0;;44017:4:::1;43986:37;::::0;::::1;5463:51:1::0;43894:140:0::1;::::0;43931:12;;43958:13;;-1:-1:-1;;;;;43986:22:0;::::1;::::0;::::1;::::0;5436:18:1;;43986:37:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43894:22;:140::i;22100:200::-:0;22215:4;22237:33;22247:10;22259:2;22263:6;22237:9;:33::i;35050:89::-;2508:6;;-1:-1:-1;;;;;2508:6:0;1732:10;2655:23;2647:68;;;;-1:-1:-1;;;2647:68:0;;;;;;;:::i;:::-;35117:5:::1;:14:::0;35050:89::o;22363:201::-;-1:-1:-1;;;;;22529:18:0;;;22497:7;22529:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;22363:201::o;43536:109::-;2508:6;;-1:-1:-1;;;;;2508:6:0;1732:10;2655:23;2647:68;;;;-1:-1:-1;;;2647:68:0;;;;;;;:::i;:::-;2508:6;;43589:48:::1;::::0;-1:-1:-1;;;;;2508:6:0;;;;43615:21:::1;43589:48:::0;::::1;;;::::0;::::1;::::0;;;43615:21;2508:6;43589:48;::::1;;;;;;;;;;;;;::::0;::::1;;;;36332:111:::0;2508:6;;-1:-1:-1;;;;;2508:6:0;1732:10;2655:23;2647:68;;;;-1:-1:-1;;;2647:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;36401:26:0::1;36430:5;36401:26:::0;;;:17:::1;:26;::::0;;;;:34;;-1:-1:-1;;36401:34:0::1;::::0;;36332:111::o;3344:238::-;2508:6;;-1:-1:-1;;;;;2508:6:0;1732:10;2655:23;2647:68;;;;-1:-1:-1;;;2647:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;3447:22:0;::::1;3425:110;;;::::0;-1:-1:-1;;;3425:110:0;;10870:2:1;3425:110:0::1;::::0;::::1;10852:21:1::0;10909:2;10889:18;;;10882:30;10948:34;10928:18;;;10921:62;-1:-1:-1;;;10999:18:1;;;10992:36;11045:19;;3425:110:0::1;10668:402:1::0;3425:110:0::1;3546:28;3565:8;3546:18;:28::i;28881:380::-:0;-1:-1:-1;;;;;29017:19:0;;29009:68;;;;-1:-1:-1;;;29009:68:0;;11277:2:1;29009:68:0;;;11259:21:1;11316:2;11296:18;;;11289:30;11355:34;11335:18;;;11328:62;-1:-1:-1;;;11406:18:1;;;11399:34;11450:19;;29009:68:0;11075:400:1;29009:68:0;-1:-1:-1;;;;;29096:21:0;;29088:68;;;;-1:-1:-1;;;29088:68:0;;11682:2:1;29088:68:0;;;11664:21:1;11721:2;11701:18;;;11694:30;11760:34;11740:18;;;11733:62;-1:-1:-1;;;11811:18:1;;;11804:32;11853:19;;29088:68:0;11480:398:1;29088:68:0;-1:-1:-1;;;;;29169:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;29221:32;;3113:25:1;;;29221:32:0;;3086:18:1;29221:32:0;;;;;;;28881:380;;;:::o;29552:502::-;29687:24;29714:25;29724:5;29731:7;29714:9;:25::i;:::-;29687:52;;-1:-1:-1;;29754:16:0;:37;29750:297;;29854:6;29834:16;:26;;29808:117;;;;-1:-1:-1;;;29808:117:0;;12085:2:1;29808:117:0;;;12067:21:1;12124:2;12104:18;;;12097:30;12163:31;12143:18;;;12136:59;12212:18;;29808:117:0;11883:353:1;29808:117:0;29969:51;29978:5;29985:7;30013:6;29994:16;:25;29969:8;:51::i;:::-;29676:378;29552:502;;;:::o;38102:2884::-;38231:13;;-1:-1:-1;;;38231:13:0;;;;38226:183;;-1:-1:-1;;;;;38287:23:0;;;;;;:17;:23;;;;;;;;;:48;;-1:-1:-1;;;;;;38314:21:0;;;;;;:17;:21;;;;;;;;38287:48;38261:136;;;;-1:-1:-1;;;38261:136:0;;12443:2:1;38261:136:0;;;12425:21:1;12482:2;12462:18;;;12455:30;12521:28;12501:18;;;12494:56;12567:18;;38261:136:0;12241:350:1;38261:136:0;-1:-1:-1;;;;;38428:15:0;;;;;;:9;:15;;;;;;;;38427:16;:34;;;;-1:-1:-1;;;;;;38448:13:0;;;;;;:9;:13;;;;;;;;38447:14;38427:34;38419:57;;;;-1:-1:-1;;;38419:57:0;;12798:2:1;38419:57:0;;;12780:21:1;12837:2;12817:18;;;12810:30;-1:-1:-1;;;12856:18:1;;;12849:40;12906:18;;38419:57:0;12596:334:1;38419:57:0;38487:16;:14;:16::i;:::-;38534:12;;;;:33;;;;-1:-1:-1;38551:16:0;;;;38550:17;38534:33;:66;;;;-1:-1:-1;;;;;;38571:29:0;;;;;;:25;:29;;;;;;;;38534:66;38516:341;;;38676:4;38627:28;21868:18;;;;;;;;;;;38772:19;;38761:8;;38795:5;;38761:30;;;:::i;:::-;38760:40;;;;:::i;:::-;38719:20;:81;38697:148;;38816:29;38824:20;38816:7;:29::i;:::-;38612:245;38516:341;-1:-1:-1;;;;;38970:23:0;;38869:21;38970:23;;;:17;:23;;;;;;38869:21;;;;38970:23;;38969:24;:50;;;;-1:-1:-1;;;;;;38998:21:0;;;;;;:17;:21;;;;;;;;38997:22;38969:50;38965:1530;;;-1:-1:-1;;;;;39060:31:0;;;;;;:25;:31;;;;;;;;39056:1428;;;39138:15;;39157:4;;39129:24;;39138:15;;39129:6;:24;:::i;:::-;39128:33;;;;:::i;:::-;39206:15;;39112:49;;-1:-1:-1;39225:4:0;;39197:24;;39206:15;;;;;39197:6;:24;:::i;:::-;39196:33;;;;:::i;:::-;39272:13;;39180:49;;-1:-1:-1;39289:4:0;;39263:22;;39272:13;;;;;39263:6;:22;:::i;:::-;39262:31;;;;:::i;:::-;39248:45;;39352:5;;39342:6;:15;;39312:109;;;;-1:-1:-1;;;39312:109:0;;13532:2:1;39312:109:0;;;13514:21:1;13571:2;13551:18;;;13544:30;-1:-1:-1;;;13590:18:1;;;13583:50;13650:18;;39312:109:0;13330:344:1;39312:109:0;39496:9;;39486:6;39470:13;39480:2;-1:-1:-1;;;;;21868:18:0;21836:7;21868:18;;;;;;;;;;;;21717:177;39470:13;:22;;;;:::i;:::-;:35;;39440:133;;;;-1:-1:-1;;;39440:133:0;;13881:2:1;39440:133:0;;;13863:21:1;13920:2;13900:18;;;13893:30;-1:-1:-1;;;13939:18:1;;;13932:54;14003:18;;39440:133:0;13679:348:1;39440:133:0;39056:1428;;;-1:-1:-1;;;;;39633:29:0;;;;;;:25;:29;;;;;;;;39629:855;;;39709:16;;39729:4;;39700:25;;-1:-1:-1;;;39709:16:0;;;;39700:6;:25;:::i;:::-;39699:34;;;;:::i;:::-;39778:16;;39683:50;;-1:-1:-1;39798:4:0;;39769:25;;-1:-1:-1;;;39778:16:0;;;;39769:6;:25;:::i;:::-;39768:34;;;;:::i;:::-;39845:14;;39752:50;;-1:-1:-1;39863:4:0;;39836:23;;-1:-1:-1;;;39845:14:0;;;;39836:6;:23;:::i;:::-;39835:32;;;;:::i;:::-;39821:46;;39629:855;;;39955:20;;40000:4;;39946:29;;-1:-1:-1;;;39955:20:0;;;;39946:6;:29;:::i;:::-;39945:59;;;;:::i;:::-;40070:20;;39908:96;;-1:-1:-1;40115:4:0;;40061:29;;-1:-1:-1;;;40070:20:0;;;;40061:6;:29;:::i;:::-;40060:59;;;;:::i;:::-;40162:18;;40023:96;;-1:-1:-1;40184:4:0;;40153:27;;-1:-1:-1;;;40162:18:0;;;;40153:6;:27;:::i;:::-;40152:36;;;;:::i;:::-;40138:50;;40247:5;;40237:6;:15;;40207:109;;;;-1:-1:-1;;;40207:109:0;;13532:2:1;40207:109:0;;;13514:21:1;13571:2;13551:18;;;13544:30;-1:-1:-1;;;13590:18:1;;;13583:50;13650:18;;40207:109:0;13330:344:1;40207:109:0;40391:9;;40381:6;40365:13;40375:2;-1:-1:-1;;;;;21868:18:0;21836:7;21868:18;;;;;;;;;;;;21717:177;40365:13;:22;;;;:::i;:::-;:35;;40335:133;;;;-1:-1:-1;;;40335:133:0;;13881:2:1;40335:133:0;;;13863:21:1;13920:2;13900:18;;;13893:30;-1:-1:-1;;;13939:18:1;;;13932:54;14003:18;;40335:133:0;13679:348:1;40335:133:0;40507:17;40598:11;40540:42;40569:13;40540;:42;:::i;:::-;:69;;;;:::i;:::-;40507:102;-1:-1:-1;40620:23:0;40646:18;40507:102;40646:6;:18;:::i;:::-;40620:44;;40675:42;40691:4;40697:2;40701:15;40675;:42::i;:::-;40732:13;;40728:251;;40762:47;40778:4;40792;40799:9;40762:15;:47::i;:::-;40850:13;40824:22;;:39;;;;;;;:::i;:::-;;;;;;;;40907:13;40878:25;;:42;;;;;;;:::i;:::-;;;;;;;;40956:11;40935:17;;:32;;;;;;;:::i;:::-;;;;-1:-1:-1;;40728:251:0;38215:2771;;;;;38102:2884;;;:::o;27852:591::-;-1:-1:-1;;;;;27936:21:0;;27928:67;;;;-1:-1:-1;;;27928:67:0;;14367:2:1;27928:67:0;;;14349:21:1;14406:2;14386:18;;;14379:30;14445:34;14425:18;;;14418:62;-1:-1:-1;;;14496:18:1;;;14489:31;14537:19;;27928:67:0;14165:397:1;27928:67:0;-1:-1:-1;;;;;28095:18:0;;28070:22;28095:18;;;;;;;;;;;28132:24;;;;28124:71;;;;-1:-1:-1;;;28124:71:0;;14769:2:1;28124:71:0;;;14751:21:1;14808:2;14788:18;;;14781:30;14847:34;14827:18;;;14820:62;-1:-1:-1;;;14898:18:1;;;14891:32;14940:19;;28124:71:0;14567:398:1;28124:71:0;-1:-1:-1;;;;;28231:18:0;;:9;:18;;;;;;;;;;28252:23;;;28231:44;;28297:12;:22;;28269:6;;28231:9;28297:22;;28269:6;;28297:22;:::i;:::-;;;;-1:-1:-1;;28337:37:0;;3113:25:1;;;28363:1:0;;-1:-1:-1;;;;;28337:37:0;;;;;3101:2:1;3086:18;28337:37:0;;;;;;;36536:111:::1;36451:203:::0;;:::o;3742:191::-;3835:6;;;-1:-1:-1;;;;;3852:17:0;;;-1:-1:-1;;;;;;3852:17:0;;;;;;;3885:40;;3835:6;;;3852:17;3835:6;;3885:40;;3816:16;;3885:40;3805:128;3742:191;:::o;12744:248::-;12915:58;;;-1:-1:-1;;;;;15162:32:1;;12915:58:0;;;15144:51:1;15211:18;;;;15204:34;;;12915:58:0;;;;;;;;;;15117:18:1;;;;12915:58:0;;;;;;;;-1:-1:-1;;;;;12915:58:0;-1:-1:-1;;;12915:58:0;;;12861:123;;12895:5;;12861:19;:123::i;43181:347::-;43228:10;43240;43271:11;-1:-1:-1;;;;;43256:39:0;;:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43227:70;-1:-1:-1;;;;;43227:70:0;;;-1:-1:-1;;;;;43227:70:0;;;43321:22;43331:11;-1:-1:-1;;;;;21868:18:0;21836:7;21868:18;;;;;;;;;;;;21717:177;43321:22;43310:8;:33;43489:6;;;;;:16;;;43504:1;43499:2;:6;43489:16;:31;;43515:5;43489:31;;;43508:4;43489:31;43474:12;:46;;-1:-1:-1;;43474:46:0;;;;;;;;;;-1:-1:-1;;43181:347:0:o;40994:1413::-;32881:16;:23;;-1:-1:-1;;32881:23:0;32900:4;32881:23;;;41173:17:::1;::::0;41132:25:::1;::::0;41094:22:::1;::::0;32881:16;;41173:17;41094:63:::1;::::0;::::1;:::i;:::-;:96;;;;:::i;:::-;41067:123;;41205:16;41225:1;41205:21:::0;41201:60:::1;;41243:7;;;41201:60;41273:26;41351:16;41346:1;41321:22;;:26;;;;:::i;:::-;41302:46;::::0;:15;:46:::1;:::i;:::-;:65;;;;:::i;:::-;41273:94:::0;-1:-1:-1;41406:21:0::1;41378:25;41455:36;41273:94:::0;41455:15;:36:::1;:::i;:::-;41438:53;;41502:24;41519:6;41502:16;:24::i;:::-;41537:18;41558:41;41582:17:::0;41558:21:::1;:41;:::i;:::-;41537:62;;41612:23;41679:16;41651:25;;41638:10;:38;;;;:::i;:::-;:57;;;;:::i;:::-;41612:83;;41706:21;41763:16;41743:17;;41730:10;:30;;;;:::i;:::-;:49;;;;:::i;:::-;41706:73:::0;-1:-1:-1;41790:23:0::1;41706:73:::0;41816:28:::1;41829:15:::0;41816:10;:28:::1;:::i;:::-;:44;;;;:::i;:::-;41790:70;;41896:1;41875:18;:22;:45;;;;;41919:1;41901:15;:19;41875:45;41871:127;;;41937:49;41950:18;41970:15;41937:12;:49::i;:::-;42055:19;::::0;42047:110:::1;::::0;42008:12:::1;::::0;-1:-1:-1;;;;;42055:19:0::1;::::0;42137:5:::1;::::0;42102:15;;42008:12;42047:110;42008:12;42047:110;42102:15;42055:19;42137:5;42047:110:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;42190:17:0::1;::::0;42182:106:::1;::::0;42033:124;;-1:-1:-1;;;;;;42190:17:0::1;::::0;42268:5:::1;::::0;42235:13;;42182:106:::1;::::0;;;42235:13;42190:17;42268:5;42182:106:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;42326:1:0::1;42301:22;:26:::0;;;42338:25:::1;:29:::0;;;42378:17:::1;:21:::0;-1:-1:-1;;;;;;;;;;32915:1:0::1;-1:-1:-1::0;32927:16:0;:24;;-1:-1:-1;;32927:24:0;;;40994:1413::o;26125:708::-;-1:-1:-1;;;;;26256:18:0;;26248:68;;;;-1:-1:-1;;;26248:68:0;;16309:2:1;26248:68:0;;;16291:21:1;16348:2;16328:18;;;16321:30;16387:34;16367:18;;;16360:62;-1:-1:-1;;;16438:18:1;;;16431:35;16483:19;;26248:68:0;16107:401:1;26248:68:0;-1:-1:-1;;;;;26335:16:0;;26327:64;;;;-1:-1:-1;;;26327:64:0;;16715:2:1;26327:64:0;;;16697:21:1;16754:2;16734:18;;;16727:30;16793:34;16773:18;;;16766:62;-1:-1:-1;;;16844:18:1;;;16837:33;16887:19;;26327:64:0;16513:399:1;26327:64:0;-1:-1:-1;;;;;26477:15:0;;26455:19;26477:15;;;;;;;;;;;26525:21;;;;26503:109;;;;-1:-1:-1;;;26503:109:0;;17119:2:1;26503:109:0;;;17101:21:1;17158:2;17138:18;;;17131:30;17197:34;17177:18;;;17170:62;-1:-1:-1;;;17248:18:1;;;17241:36;17294:19;;26503:109:0;16917:402:1;26503:109:0;-1:-1:-1;;;;;26648:15:0;;;:9;:15;;;;;;;;;;;26666:20;;;26648:38;;26708:13;;;;;;;;:23;;26680:6;;26648:9;26708:23;;26680:6;;26708:23;:::i;:::-;;;;;;;;26764:2;-1:-1:-1;;;;;26749:26:0;26758:4;-1:-1:-1;;;;;26749:26:0;;26768:6;26749:26;;;;3113:25:1;;3101:2;3086:18;;2967:177;26749:26:0;;;;;;;;26788:37;36451:203;15711:802;16135:23;16161:106;16203:4;16161:106;;;;;;;;;;;;;;;;;16169:5;-1:-1:-1;;;;;16161:27:0;;;:106;;;;;:::i;:::-;16282:17;;16135:132;;-1:-1:-1;16282:21:0;16278:228;;16397:10;16386:30;;;;;;;;;;;;:::i;:::-;16360:134;;;;-1:-1:-1;;;16360:134:0;;17776:2:1;16360:134:0;;;17758:21:1;17815:2;17795:18;;;17788:30;17854:34;17834:18;;;17827:62;-1:-1:-1;;;17905:18:1;;;17898:40;17955:19;;16360:134:0;17574:406:1;42415:394:0;42505:16;;;42519:1;42505:16;;;;;;;;42481:21;;42505:16;;;;;;;;;;-1:-1:-1;42505:16:0;42481:40;;42550:4;42532;42537:1;42532:7;;;;;;;;:::i;:::-;;;;;;:23;-1:-1:-1;;;;;42532:23:0;;;-1:-1:-1;;;;;42532:23:0;;;;;42576:13;-1:-1:-1;;;;;42576:18:0;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42566:4;42571:1;42566:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;42566:30:0;;;:7;;;;;;;;;:30;42607:194;;-1:-1:-1;;;42607:194:0;;:13;:64;;;;;;:194;;42686:11;;42712:1;;42728:4;;42755;;42775:15;;42607:194;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42470:339;42415:394;:::o;42817:285::-;42898:13;-1:-1:-1;;;;;42898:29:0;;42935:9;42968:4;42988:11;43014:1;43030;43046:7;2508:6;;-1:-1:-1;;;;;2508:6:0;;2435:87;43046:7;42898:196;;;;;;-1:-1:-1;;;;;;42898:196:0;;;-1:-1:-1;;;;;19585:15:1;;;42898:196:0;;;19567:34:1;19617:18;;;19610:34;;;;19660:18;;;19653:34;;;;19703:18;;;19696:34;19767:15;;;19746:19;;;19739:44;43068:15:0;19799:19:1;;;19792:35;19501:19;;42898:196:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;42817:285;;:::o;7790:229::-;7927:12;7959:52;7981:6;7989:4;7995:1;7998:12;7959:21;:52::i;:::-;7952:59;7790:229;-1:-1:-1;;;;7790:229:0:o;9006:571::-;9176:12;9248:5;9223:21;:30;;9201:118;;;;-1:-1:-1;;;9201:118:0;;20351:2:1;9201:118:0;;;20333:21:1;20390:2;20370:18;;;20363:30;20429:34;20409:18;;;20402:62;-1:-1:-1;;;20480:18:1;;;20473:36;20526:19;;9201:118:0;20149:402:1;9201:118:0;-1:-1:-1;;;;;5243:19:0;;;9330:60;;;;-1:-1:-1;;;9330:60:0;;20758:2:1;9330:60:0;;;20740:21:1;20797:2;20777:18;;;20770:30;20836:31;20816:18;;;20809:59;20885:18;;9330:60:0;20556:353:1;9330:60:0;9404:12;9418:23;9445:6;-1:-1:-1;;;;;9445:11:0;9464:5;9485:4;9445:55;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9403:97;;;;9518:51;9535:7;9544:10;9556:12;9518:16;:51::i;:::-;9511:58;9006:571;-1:-1:-1;;;;;;;9006:571:0:o;11966:712::-;12116:12;12145:7;12141:530;;;-1:-1:-1;12176:10:0;12169:17;;12141:530;12290:17;;:21;12286:374;;12488:10;12482:17;12549:15;12536:10;12532:2;12528:19;12521:44;12286:374;12631:12;12624:20;;-1:-1:-1;;;12624:20:0;;;;;;;;:::i;14:131:1:-;-1:-1:-1;;;;;89:31:1;;79:42;;69:70;;135:1;132;125:12;150:134;218:20;;247:31;218:20;247:31;:::i;:::-;150:134;;;:::o;289:247::-;348:6;401:2;389:9;380:7;376:23;372:32;369:52;;;417:1;414;407:12;369:52;456:9;443:23;475:31;500:5;475:31;:::i;541:250::-;626:1;636:113;650:6;647:1;644:13;636:113;;;726:11;;;720:18;707:11;;;700:39;672:2;665:10;636:113;;;-1:-1:-1;;783:1:1;765:16;;758:27;541:250::o;796:396::-;945:2;934:9;927:21;908:4;977:6;971:13;1020:6;1015:2;1004:9;1000:18;993:34;1036:79;1108:6;1103:2;1092:9;1088:18;1083:2;1075:6;1071:15;1036:79;:::i;:::-;1176:2;1155:15;-1:-1:-1;;1151:29:1;1136:45;;;;1183:2;1132:54;;796:396;-1:-1:-1;;796:396:1:o;1197:315::-;1265:6;1273;1326:2;1314:9;1305:7;1301:23;1297:32;1294:52;;;1342:1;1339;1332:12;1294:52;1381:9;1368:23;1400:31;1425:5;1400:31;:::i;:::-;1450:5;1502:2;1487:18;;;;1474:32;;-1:-1:-1;;;1197:315:1:o;1709:127::-;1770:10;1765:3;1761:20;1758:1;1751:31;1801:4;1798:1;1791:15;1825:4;1822:1;1815:15;1841:1121;1925:6;1956:2;1999;1987:9;1978:7;1974:23;1970:32;1967:52;;;2015:1;2012;2005:12;1967:52;2055:9;2042:23;2084:18;2125:2;2117:6;2114:14;2111:34;;;2141:1;2138;2131:12;2111:34;2179:6;2168:9;2164:22;2154:32;;2224:7;2217:4;2213:2;2209:13;2205:27;2195:55;;2246:1;2243;2236:12;2195:55;2282:2;2269:16;2304:2;2300;2297:10;2294:36;;;2310:18;;:::i;:::-;2356:2;2353:1;2349:10;2388:2;2382:9;2451:2;2447:7;2442:2;2438;2434:11;2430:25;2422:6;2418:38;2506:6;2494:10;2491:22;2486:2;2474:10;2471:18;2468:46;2465:72;;;2517:18;;:::i;:::-;2553:2;2546:22;2603:18;;;2637:15;;;;-1:-1:-1;2679:11:1;;;2675:20;;;2707:19;;;2704:39;;;2739:1;2736;2729:12;2704:39;2763:11;;;;2783:148;2799:6;2794:3;2791:15;2783:148;;;2865:23;2884:3;2865:23;:::i;:::-;2853:36;;2816:12;;;;2909;;;;2783:148;;;2950:6;1841:1121;-1:-1:-1;;;;;;;;1841:1121:1:o;3149:180::-;3208:6;3261:2;3249:9;3240:7;3236:23;3232:32;3229:52;;;3277:1;3274;3267:12;3229:52;-1:-1:-1;3300:23:1;;3149:180;-1:-1:-1;3149:180:1:o;3334:615::-;3420:6;3428;3481:2;3469:9;3460:7;3456:23;3452:32;3449:52;;;3497:1;3494;3487:12;3449:52;3537:9;3524:23;3566:18;3607:2;3599:6;3596:14;3593:34;;;3623:1;3620;3613:12;3593:34;3661:6;3650:9;3646:22;3636:32;;3706:7;3699:4;3695:2;3691:13;3687:27;3677:55;;3728:1;3725;3718:12;3677:55;3768:2;3755:16;3794:2;3786:6;3783:14;3780:34;;;3810:1;3807;3800:12;3780:34;3863:7;3858:2;3848:6;3845:1;3841:14;3837:2;3833:23;3829:32;3826:45;3823:65;;;3884:1;3881;3874:12;3823:65;3915:2;3907:11;;;;;3937:6;;-1:-1:-1;3334:615:1;;-1:-1:-1;;;;3334:615:1:o;3954:456::-;4031:6;4039;4047;4100:2;4088:9;4079:7;4075:23;4071:32;4068:52;;;4116:1;4113;4106:12;4068:52;4155:9;4142:23;4174:31;4199:5;4174:31;:::i;:::-;4224:5;-1:-1:-1;4281:2:1;4266:18;;4253:32;4294:33;4253:32;4294:33;:::i;:::-;3954:456;;4346:7;;-1:-1:-1;;;4400:2:1;4385:18;;;;4372:32;;3954:456::o;4797:159::-;4864:20;;4924:6;4913:18;;4903:29;;4893:57;;4946:1;4943;4936:12;4961:328;5035:6;5043;5051;5104:2;5092:9;5083:7;5079:23;5075:32;5072:52;;;5120:1;5117;5110:12;5072:52;5143:28;5161:9;5143:28;:::i;:::-;5133:38;;5190:37;5223:2;5212:9;5208:18;5190:37;:::i;:::-;5180:47;;5246:37;5279:2;5268:9;5264:18;5246:37;:::i;:::-;5236:47;;4961:328;;;;;:::o;5733:118::-;5819:5;5812:13;5805:21;5798:5;5795:32;5785:60;;5841:1;5838;5831:12;5856:382;5921:6;5929;5982:2;5970:9;5961:7;5957:23;5953:32;5950:52;;;5998:1;5995;5988:12;5950:52;6037:9;6024:23;6056:31;6081:5;6056:31;:::i;:::-;6106:5;-1:-1:-1;6163:2:1;6148:18;;6135:32;6176:30;6135:32;6176:30;:::i;:::-;6225:7;6215:17;;;5856:382;;;;;:::o;6243:402::-;6325:6;6333;6386:2;6374:9;6365:7;6361:23;6357:32;6354:52;;;6402:1;6399;6392:12;6354:52;6441:9;6428:23;6460:31;6485:5;6460:31;:::i;:::-;6510:5;-1:-1:-1;6567:2:1;6552:18;;6539:32;6580:33;6539:32;6580:33;:::i;7043:356::-;7245:2;7227:21;;;7264:18;;;7257:30;7323:34;7318:2;7303:18;;7296:62;7390:2;7375:18;;7043:356::o;7749:380::-;7828:1;7824:12;;;;7871;;;7892:61;;7946:4;7938:6;7934:17;7924:27;;7892:61;7999:2;7991:6;7988:14;7968:18;7965:38;7962:161;;8045:10;8040:3;8036:20;8033:1;8026:31;8080:4;8077:1;8070:15;8108:4;8105:1;8098:15;7962:161;;7749:380;;;:::o;8134:127::-;8195:10;8190:3;8186:20;8183:1;8176:31;8226:4;8223:1;8216:15;8250:4;8247:1;8240:15;8615:127;8676:10;8671:3;8667:20;8664:1;8657:31;8707:4;8704:1;8697:15;8731:4;8728:1;8721:15;8747:135;8786:3;8807:17;;;8804:43;;8827:18;;:::i;:::-;-1:-1:-1;8874:1:1;8863:13;;8747:135::o;8887:125::-;8952:9;;;8973:10;;;8970:36;;;8986:18;;:::i;10479:184::-;10549:6;10602:2;10590:9;10581:7;10577:23;10573:32;10570:52;;;10618:1;10615;10608:12;10570:52;-1:-1:-1;10641:16:1;;10479:184;-1:-1:-1;10479:184:1:o;12935:168::-;13008:9;;;13039;;13056:15;;;13050:22;;13036:37;13026:71;;13077:18;;:::i;13108:217::-;13148:1;13174;13164:132;;13218:10;13213:3;13209:20;13206:1;13199:31;13253:4;13250:1;13243:15;13281:4;13278:1;13271:15;13164:132;-1:-1:-1;13310:9:1;;13108:217::o;14032:128::-;14099:9;;;14120:11;;;14117:37;;;14134:18;;:::i;15249:188::-;15328:13;;-1:-1:-1;;;;;15370:42:1;;15360:53;;15350:81;;15427:1;15424;15417:12;15442:450;15529:6;15537;15545;15598:2;15586:9;15577:7;15573:23;15569:32;15566:52;;;15614:1;15611;15604:12;15566:52;15637:40;15667:9;15637:40;:::i;:::-;15627:50;;15696:49;15741:2;15730:9;15726:18;15696:49;:::i;:::-;15686:59;;15788:2;15777:9;15773:18;15767:25;15832:10;15825:5;15821:22;15814:5;15811:33;15801:61;;15858:1;15855;15848:12;15801:61;15881:5;15871:15;;;15442:450;;;;;:::o;17324:245::-;17391:6;17444:2;17432:9;17423:7;17419:23;17415:32;17412:52;;;17460:1;17457;17450:12;17412:52;17492:9;17486:16;17511:28;17533:5;17511:28;:::i;17985:251::-;18055:6;18108:2;18096:9;18087:7;18083:23;18079:32;18076:52;;;18124:1;18121;18114:12;18076:52;18156:9;18150:16;18175:31;18200:5;18175:31;:::i;18241:980::-;18503:4;18551:3;18540:9;18536:19;18582:6;18571:9;18564:25;18608:2;18646:6;18641:2;18630:9;18626:18;18619:34;18689:3;18684:2;18673:9;18669:18;18662:31;18713:6;18748;18742:13;18779:6;18771;18764:22;18817:3;18806:9;18802:19;18795:26;;18856:2;18848:6;18844:15;18830:29;;18877:1;18887:195;18901:6;18898:1;18895:13;18887:195;;;18966:13;;-1:-1:-1;;;;;18962:39:1;18950:52;;19057:15;;;;19022:12;;;;18998:1;18916:9;18887:195;;;-1:-1:-1;;;;;;;19138:32:1;;;;19133:2;19118:18;;19111:60;-1:-1:-1;;;19202:3:1;19187:19;19180:35;19099:3;18241:980;-1:-1:-1;;;18241:980:1:o;19838:306::-;19926:6;19934;19942;19995:2;19983:9;19974:7;19970:23;19966:32;19963:52;;;20011:1;20008;20001:12;19963:52;20040:9;20034:16;20024:26;;20090:2;20079:9;20075:18;20069:25;20059:35;;20134:2;20123:9;20119:18;20113:25;20103:35;;19838:306;;;;;:::o;20914:287::-;21043:3;21081:6;21075:13;21097:66;21156:6;21151:3;21144:4;21136:6;21132:17;21097:66;:::i;:::-;21179:16;;;;;20914:287;-1:-1:-1;;20914:287:1:o

Swarm Source

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