ETH Price: $2,356.87 (+1.90%)

Token

Funky Fingers Rock Paper Scissors Battle Royale (FUNK)
 

Overview

Max Total Supply

6,969,696,969 FUNK

Holders

77

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
1,714,793.150305564705879397 FUNK

Value
$0.00
0x49dcf292242cf9b3c7cc04eb22b77fcf2cf95084
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:
Funk

Compiler Version
v0.8.21+commit.d9974bed

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-12-21
*/

// SPDX-License-Identifier: MIT

//Website - https://funktoken.xyz
//X - https://twitter.com/FunkyXLabs
//Telegram - https://t.me/funkyxlabs
//Medium - https://medium.com/@funkyxlabs
//NFT Collection- https://bringbacknfts.com

// File: @openzeppelin/contracts/interfaces/draft-IERC6093.sol


// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/draft-IERC6093.sol)
pragma solidity ^0.8.20;

/**
 * @dev Standard ERC20 Errors
 * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC20 tokens.
 */
interface IERC20Errors {
    /**
     * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     * @param balance Current balance for the interacting account.
     * @param needed Minimum amount required to perform a transfer.
     */
    error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed);

    /**
     * @dev Indicates a failure with the token `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     */
    error ERC20InvalidSender(address sender);

    /**
     * @dev Indicates a failure with the token `receiver`. Used in transfers.
     * @param receiver Address to which tokens are being transferred.
     */
    error ERC20InvalidReceiver(address receiver);

    /**
     * @dev Indicates a failure with the `spender`’s `allowance`. Used in transfers.
     * @param spender Address that may be allowed to operate on tokens without being their owner.
     * @param allowance Amount of tokens a `spender` is allowed to operate with.
     * @param needed Minimum amount required to perform a transfer.
     */
    error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed);

    /**
     * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
     * @param approver Address initiating an approval operation.
     */
    error ERC20InvalidApprover(address approver);

    /**
     * @dev Indicates a failure with the `spender` to be approved. Used in approvals.
     * @param spender Address that may be allowed to operate on tokens without being their owner.
     */
    error ERC20InvalidSpender(address spender);
}

/**
 * @dev Standard ERC721 Errors
 * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC721 tokens.
 */
interface IERC721Errors {
    /**
     * @dev Indicates that an address can't be an owner. For example, `address(0)` is a forbidden owner in EIP-20.
     * Used in balance queries.
     * @param owner Address of the current owner of a token.
     */
    error ERC721InvalidOwner(address owner);

    /**
     * @dev Indicates a `tokenId` whose `owner` is the zero address.
     * @param tokenId Identifier number of a token.
     */
    error ERC721NonexistentToken(uint256 tokenId);

    /**
     * @dev Indicates an error related to the ownership over a particular token. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     * @param tokenId Identifier number of a token.
     * @param owner Address of the current owner of a token.
     */
    error ERC721IncorrectOwner(address sender, uint256 tokenId, address owner);

    /**
     * @dev Indicates a failure with the token `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     */
    error ERC721InvalidSender(address sender);

    /**
     * @dev Indicates a failure with the token `receiver`. Used in transfers.
     * @param receiver Address to which tokens are being transferred.
     */
    error ERC721InvalidReceiver(address receiver);

    /**
     * @dev Indicates a failure with the `operator`’s approval. Used in transfers.
     * @param operator Address that may be allowed to operate on tokens without being their owner.
     * @param tokenId Identifier number of a token.
     */
    error ERC721InsufficientApproval(address operator, uint256 tokenId);

    /**
     * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
     * @param approver Address initiating an approval operation.
     */
    error ERC721InvalidApprover(address approver);

    /**
     * @dev Indicates a failure with the `operator` to be approved. Used in approvals.
     * @param operator Address that may be allowed to operate on tokens without being their owner.
     */
    error ERC721InvalidOperator(address operator);
}

/**
 * @dev Standard ERC1155 Errors
 * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC1155 tokens.
 */
interface IERC1155Errors {
    /**
     * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     * @param balance Current balance for the interacting account.
     * @param needed Minimum amount required to perform a transfer.
     * @param tokenId Identifier number of a token.
     */
    error ERC1155InsufficientBalance(address sender, uint256 balance, uint256 needed, uint256 tokenId);

    /**
     * @dev Indicates a failure with the token `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     */
    error ERC1155InvalidSender(address sender);

    /**
     * @dev Indicates a failure with the token `receiver`. Used in transfers.
     * @param receiver Address to which tokens are being transferred.
     */
    error ERC1155InvalidReceiver(address receiver);

    /**
     * @dev Indicates a failure with the `operator`’s approval. Used in transfers.
     * @param operator Address that may be allowed to operate on tokens without being their owner.
     * @param owner Address of the current owner of a token.
     */
    error ERC1155MissingApprovalForAll(address operator, address owner);

    /**
     * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
     * @param approver Address initiating an approval operation.
     */
    error ERC1155InvalidApprover(address approver);

    /**
     * @dev Indicates a failure with the `operator` to be approved. Used in approvals.
     * @param operator Address that may be allowed to operate on tokens without being their owner.
     */
    error ERC1155InvalidOperator(address operator);

    /**
     * @dev Indicates an array length mismatch between ids and values in a safeBatchTransferFrom operation.
     * Used in batch transfers.
     * @param idsLength Length of the array of token identifiers
     * @param valuesLength Length of the array of token amounts
     */
    error ERC1155InvalidArrayLength(uint256 idsLength, uint256 valuesLength);
}

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


// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.20;

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

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

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

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

    /**
     * @dev Moves a `value` amount of 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 value) 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 a `value` amount of tokens 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 value) external returns (bool);

    /**
     * @dev Moves a `value` amount of tokens from `from` to `to` using the
     * allowance mechanism. `value` 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 value) external returns (bool);
}

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


// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.20;


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

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

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

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


// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)

pragma solidity ^0.8.20;

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

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

    function _contextSuffixLength() internal view virtual returns (uint256) {
        return 0;
    }
}

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


// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/ERC20.sol)

pragma solidity ^0.8.20;





/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * The default value of {decimals} is 18. To change this, you should override
 * this function so it returns a different value.
 *
 * We have followed general OpenZeppelin Contracts guidelines: functions revert
 * instead returning `false` on failure. This behavior is nonetheless
 * conventional and does not conflict with the expectations of ERC20
 * applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 */
abstract contract ERC20 is Context, IERC20, IERC20Metadata, IERC20Errors {
    mapping(address account => uint256) private _balances;

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * 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 returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual 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 default value returned by this function, unless
     * it's 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 returns (uint8) {
        return 18;
    }

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

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view virtual 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 `value`.
     */
    function transfer(address to, uint256 value) public virtual returns (bool) {
        address owner = _msgSender();
        _transfer(owner, to, value);
        return true;
    }

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

    /**
     * @dev See {IERC20-approve}.
     *
     * NOTE: If `value` 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 value) public virtual returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, value);
        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 `value`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `value`.
     */
    function transferFrom(address from, address to, uint256 value) public virtual returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, value);
        _transfer(from, to, value);
        return true;
    }

    /**
     * @dev Moves a `value` amount of tokens from `from` to `to`.
     *
     * This internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * NOTE: This function is not virtual, {_update} should be overridden instead.
     */
    function _transfer(address from, address to, uint256 value) virtual internal {
        if (from == address(0)) {
            revert ERC20InvalidSender(address(0));
        }
        if (to == address(0)) {
            revert ERC20InvalidReceiver(address(0));
        }
        _update(from, to, value);
    }

    /**
     * @dev Transfers a `value` amount of tokens from `from` to `to`, or alternatively mints (or burns) if `from`
     * (or `to`) is the zero address. All customizations to transfers, mints, and burns should be done by overriding
     * this function.
     *
     * Emits a {Transfer} event.
     */
    function _update(address from, address to, uint256 value) internal virtual {
        if (from == address(0)) {
            // Overflow check required: The rest of the code assumes that totalSupply never overflows
            _totalSupply += value;
        } else {
            uint256 fromBalance = _balances[from];
            if (fromBalance < value) {
                revert ERC20InsufficientBalance(from, fromBalance, value);
            }
            unchecked {
                // Overflow not possible: value <= fromBalance <= totalSupply.
                _balances[from] = fromBalance - value;
            }
        }

        if (to == address(0)) {
            unchecked {
                // Overflow not possible: value <= totalSupply or value <= fromBalance <= totalSupply.
                _totalSupply -= value;
            }
        } else {
            unchecked {
                // Overflow not possible: balance + value is at most totalSupply, which we know fits into a uint256.
                _balances[to] += value;
            }
        }

        emit Transfer(from, to, value);
    }

    /**
     * @dev Creates a `value` amount of tokens and assigns them to `account`, by transferring it from address(0).
     * Relies on the `_update` mechanism
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * NOTE: This function is not virtual, {_update} should be overridden instead.
     */
    function _mint(address account, uint256 value) internal {
        if (account == address(0)) {
            revert ERC20InvalidReceiver(address(0));
        }
        _update(address(0), account, value);
    }

    /**
     * @dev Destroys a `value` amount of tokens from `account`, lowering the total supply.
     * Relies on the `_update` mechanism.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * NOTE: This function is not virtual, {_update} should be overridden instead
     */
    function _burn(address account, uint256 value) internal {
        if (account == address(0)) {
            revert ERC20InvalidSender(address(0));
        }
        _update(account, address(0), value);
    }

    /**
     * @dev Sets `value` 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.
     *
     * Overrides to this logic should be done to the variant with an additional `bool emitEvent` argument.
     */
    function _approve(address owner, address spender, uint256 value) internal {
        _approve(owner, spender, value, true);
    }

    /**
     * @dev Variant of {_approve} with an optional flag to enable or disable the {Approval} event.
     *
     * By default (when calling {_approve}) the flag is set to true. On the other hand, approval changes made by
     * `_spendAllowance` during the `transferFrom` operation set the flag to false. This saves gas by not emitting any
     * `Approval` event during `transferFrom` operations.
     *
     * Anyone who wishes to continue emitting `Approval` events on the`transferFrom` operation can force the flag to
     * true using the following override:
     * ```
     * function _approve(address owner, address spender, uint256 value, bool) internal virtual override {
     *     super._approve(owner, spender, value, true);
     * }
     * ```
     *
     * Requirements are the same as {_approve}.
     */
    function _approve(address owner, address spender, uint256 value, bool emitEvent) internal virtual {
        if (owner == address(0)) {
            revert ERC20InvalidApprover(address(0));
        }
        if (spender == address(0)) {
            revert ERC20InvalidSpender(address(0));
        }
        _allowances[owner][spender] = value;
        if (emitEvent) {
            emit Approval(owner, spender, value);
        }
    }

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

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


// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)

pragma solidity ^0.8.20;


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

    /**
     * @dev The caller account is not authorized to perform an operation.
     */
    error OwnableUnauthorizedAccount(address account);

    /**
     * @dev The owner is not a valid owner account. (eg. `address(0)`)
     */
    error OwnableInvalidOwner(address owner);

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

    /**
     * @dev Initializes the contract setting the address provided by the deployer as the initial owner.
     */
    constructor(address initialOwner) {
        if (initialOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _transferOwnership(initialOwner);
    }

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

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        if (owner() != _msgSender()) {
            revert OwnableUnauthorizedAccount(_msgSender());
        }
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby disabling 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 {
        if (newOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _transferOwnership(newOwner);
    }

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

// File: Funk.sol

//Website - https://funktoken.xyz
//X - https://twitter.com/FunkyXLabs
//Telegram - https://t.me/funkyxlabs
//Medium - https://medium.com/@funkyxlabs
//NFT Collection- https://bringbacknfts.com



 
pragma solidity ^0.8.19;
 
contract Funk is Ownable, ERC20 {
    IUniswapV2Router02 public uniswapV2Router;
 
    uint256 public buyTaxPercent = 4;
    uint256 public sellTaxPercent = 4;
    uint256 private minAmountToSwapTaxes;
    uint256 private launchedAt;
    uint256 public _buyCount;
    uint256 private _preventSwapBefore = 25;
 
    bool public launchTax;
    bool public taxesEnabled = true;
    bool public limitsEnabled = true;
    bool inSwapAndLiq;
    bool public tradingAllowed = false;
 
    address public funkWallet;
    address public uniswapV2Pair;
 
    mapping(address => bool) public _isExcludedFromFees;
 
    modifier lockTheSwap() {
        inSwapAndLiq = true;
        _;
        inSwapAndLiq = false;
    }
 
    constructor(
    ) ERC20("Funky Fingers Rock Paper Scissors Battle Royale", "FUNK") Ownable(msg.sender) {
        _mint(owner(), 6_969_696_969 * 10 ** 18);
        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(
            0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D
        );
        address _uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory())
            .createPair(address(this), _uniswapV2Router.WETH());
 
        uniswapV2Router = _uniswapV2Router;
        uniswapV2Pair = _uniswapV2Pair;
 
        minAmountToSwapTaxes = (totalSupply() * 3) / 1000;
 
        _isExcludedFromFees[msg.sender] = true;
        _isExcludedFromFees[owner()] = true;
        _isExcludedFromFees[funkWallet] = true;
        _isExcludedFromFees[address(this)] = true;
        _isExcludedFromFees[address(_uniswapV2Pair)] = true;
 
        funkWallet = 0xCC24d0571d2ada7CC7E3B3d4cEf72D82196023C5; // funkwallet.eth
    }
 
    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal override {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");
        require(amount > 0, "ERC20: transfer must be greater than 0");
 
        if (!tradingAllowed) {
            require(from == owner() || to == owner(), "Trading not active yet");
        }
 
        uint256 taxAmount;
 
        if (taxesEnabled) {
            if (launchTax) {
                getTax(block.number);
            }
 
            if (from == uniswapV2Pair) {
                if (!_isExcludedFromFees[to]) {
                    taxAmount = (amount * buyTaxPercent) / 100;
                    _buyCount++;
                }
            }
 
            if (to == uniswapV2Pair) {
                if (!_isExcludedFromFees[from]) {
                    taxAmount = (amount * sellTaxPercent) / 100;
                }
            }
 
            uint256 contractTokenBalance = balanceOf(address(this));
 
            bool overMinTokenBalance = contractTokenBalance >=
                minAmountToSwapTaxes;
 
            if (
                overMinTokenBalance &&
                !inSwapAndLiq &&
                from != uniswapV2Pair &&
                !_isExcludedFromFees[from] &&
                _buyCount > _preventSwapBefore
            ) {
                handleTax(minAmountToSwapTaxes);
            }
        }
 
        if (taxAmount > 0) {
            uint256 userAmount = amount - taxAmount;
            super._transfer(from, address(this), taxAmount);
            super._transfer(from, to, userAmount);
        } else {
            super._transfer(from, to, amount);
        }
    }
 
    function handleTax(uint256 _contractTokenBalance) internal lockTheSwap {
        // generate the uniswap pair path of token -> weth
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();
 
        _approve(
            address(this),
            address(uniswapV2Router),
            _contractTokenBalance
        );
 
        // make the swap
        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            _contractTokenBalance,
            0, // accept any amount of ETH
            path,
            funkWallet,
            block.timestamp
        );
    }
 
    function getTax(uint256 _block) internal {
        if (launchedAt + 2 >= _block) {
            buyTaxPercent = 75;
            sellTaxPercent = 75;
        } else if (launchedAt + 3 >= _block) {
            buyTaxPercent = 50;
            sellTaxPercent = 50;
        } else if (launchedAt + 5 >= _block) {
            buyTaxPercent = 25;
            sellTaxPercent = 25;
        }
    }
 
    function changeFunkWallet(address _newFunkWallet) external onlyOwner {
        funkWallet = _newFunkWallet;
    }
 
    function removeLaunchTax(
        uint256 _newBuyTaxPercent,
        uint256 _newSellTaxPercent
    ) external onlyOwner {
        require(
            _newBuyTaxPercent < 10 && _newSellTaxPercent < 10,
            "Cannot set taxes above 10"
        );
        buyTaxPercent = _newBuyTaxPercent;
        sellTaxPercent = _newSellTaxPercent;
        launchTax = false;
    }
 
    function excludeFromFees(
        address _address,
        bool _isExcluded
    ) external onlyOwner {
     _isExcludedFromFees[_address] = _isExcluded;
    }
 
    function changeMinAmountToSwapTaxes(
        uint256 newMinAmount
    ) external onlyOwner {
        require(newMinAmount > 0, "Cannot set to zero");
        minAmountToSwapTaxes = newMinAmount;
    }
 
    function enableTaxes(bool _enable) external onlyOwner {
        taxesEnabled = _enable;
    }
 
    function activate() external onlyOwner {
        require(!tradingAllowed, "Trading not paused");
        tradingAllowed = true;
        launchedAt = block.number;
        launchTax = true;
    }
 
    function toggleLimits(bool _limitsEnabed) external onlyOwner {
        limitsEnabled = _limitsEnabed;
    }
}
 
// Interfaces
interface IUniswapV2Factory {
    event PairCreated(
        address indexed token0,
        address indexed token1,
        address pair,
        uint
    );
 
    function feeTo() external view returns (address);
 
    function feeToSetter() external view returns (address);
 
    function getPair(
        address tokenA,
        address tokenB
    ) external view returns (address pair);
 
    function allPairs(uint) external view returns (address pair);
 
    function allPairsLength() external view returns (uint);
 
    function createPair(
        address tokenA,
        address tokenB
    ) external returns (address pair);
 
    function setFeeTo(address) external;
 
    function setFeeToSetter(address) external;
}
 
interface IUniswapV2Pair {
    event Approval(address indexed owner, address indexed spender, uint value);
    event Transfer(address indexed from, address indexed to, uint value);
 
    function name() external pure returns (string memory);
 
    function symbol() external pure returns (string memory);
 
    function decimals() external pure returns (uint8);
 
    function totalSupply() external view returns (uint);
 
    function balanceOf(address owner) external view returns (uint);
 
    function allowance(
        address owner,
        address spender
    ) external view returns (uint);
 
    function approve(address spender, uint value) external returns (bool);
 
    function transfer(address to, uint value) external returns (bool);
 
    function transferFrom(
        address from,
        address to,
        uint value
    ) external returns (bool);
 
    function DOMAIN_SEPARATOR() external view returns (bytes32);
 
    function PERMIT_TYPEHASH() external pure returns (bytes32);
 
    function nonces(address owner) external view returns (uint);
 
    function permit(
        address owner,
        address spender,
        uint value,
        uint deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;
 
    event Mint(address indexed sender, uint amount0, uint amount1);
    event Burn(
        address indexed sender,
        uint amount0,
        uint amount1,
        address indexed to
    );
    event Swap(
        address indexed sender,
        uint amount0In,
        uint amount1In,
        uint amount0Out,
        uint amount1Out,
        address indexed to
    );
    event Sync(uint112 reserve0, uint112 reserve1);
 
    function MINIMUM_LIQUIDITY() external pure returns (uint);
 
    function factory() external view returns (address);
 
    function token0() external view returns (address);
 
    function token1() external view returns (address);
 
    function getReserves()
        external
        view
        returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
 
    function price0CumulativeLast() external view returns (uint);
 
    function price1CumulativeLast() external view returns (uint);
 
    function kLast() external view returns (uint);
 
    function mint(address to) external returns (uint liquidity);
 
    function burn(address to) external returns (uint amount0, uint amount1);
 
    function swap(
        uint amount0Out,
        uint amount1Out,
        address to,
        bytes calldata data
    ) external;
 
    function skim(address to) external;
 
    function sync() external;
 
    function initialize(address, address) external;
}
 
interface IUniswapV2Router01 {
    function factory() external pure returns (address);
 
    function WETH() external pure returns (address);
 
    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);
 
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    )
        external
        payable
        returns (uint amountToken, uint amountETH, uint liquidity);
 
    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB);
 
    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountToken, uint amountETH);
 
    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint amountA, uint amountB);
 
    function removeLiquidityETHWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint amountToken, uint amountETH);
 
    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
 
    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
 
    function swapExactETHForTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable returns (uint[] memory amounts);
 
    function swapTokensForExactETH(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
 
    function swapExactTokensForETH(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
 
    function swapETHForExactTokens(
        uint amountOut,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable returns (uint[] memory amounts);
 
    function quote(
        uint amountA,
        uint reserveA,
        uint reserveB
    ) external pure returns (uint amountB);
 
    function getAmountOut(
        uint amountIn,
        uint reserveIn,
        uint reserveOut
    ) external pure returns (uint amountOut);
 
    function getAmountIn(
        uint amountOut,
        uint reserveIn,
        uint reserveOut
    ) external pure returns (uint amountIn);
 
    function getAmountsOut(
        uint amountIn,
        address[] calldata path
    ) external view returns (uint[] memory amounts);
 
    function getAmountsIn(
        uint amountOut,
        address[] calldata path
    ) external view returns (uint[] memory amounts);
}
 
interface IUniswapV2Router02 is IUniswapV2Router01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountETH);
 
    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint amountETH);
 
    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
 
    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable;
 
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"name":"ERC20InvalidApprover","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC20InvalidReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"ERC20InvalidSender","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"}],"name":"ERC20InvalidSpender","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"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":[],"name":"_buyCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"activate","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":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyTaxPercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_newFunkWallet","type":"address"}],"name":"changeFunkWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMinAmount","type":"uint256"}],"name":"changeMinAmountToSwapTaxes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_enable","type":"bool"}],"name":"enableTaxes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"bool","name":"_isExcluded","type":"bool"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"funkWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"launchTax","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"limitsEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newBuyTaxPercent","type":"uint256"},{"internalType":"uint256","name":"_newSellTaxPercent","type":"uint256"}],"name":"removeLaunchTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellTaxPercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxesEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_limitsEnabed","type":"bool"}],"name":"toggleLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingAllowed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","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":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"}]

6080604052600460075560046008556019600c556001600d60016101000a81548160ff0219169083151502179055506001600d60026101000a81548160ff0219169083151502179055505f600d60046101000a81548160ff0219169083151502179055503480156200006f575f80fd5b506040518060600160405280602f8152602001620035f8602f91396040518060400160405280600481526020017f46554e4b00000000000000000000000000000000000000000000000000000000815250335f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160362000134575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016200012b9190620009e1565b60405180910390fd5b6200014581620005fc60201b60201c565b50816004908162000157919062000c60565b50806005908162000169919062000c60565b5050506200019962000180620006bd60201b60201c565b6b168532bdc48cb0ddb5840000620006e460201b60201c565b5f737a250d5630b4cf539739df2c5dacb4c659f2488d90505f8173ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015620001fc573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062000222919062000d77565b73ffffffffffffffffffffffffffffffffffffffff1663c9c65396308473ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000288573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620002ae919062000d77565b6040518363ffffffff1660e01b8152600401620002cd92919062000da7565b6020604051808303815f875af1158015620002ea573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062000310919062000d77565b90508160065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600e5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506103e86003620003a76200076e60201b60201c565b620003b3919062000dff565b620003bf919062000e76565b6009819055506001600f5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055506001600f5f6200042f620006bd60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055506001600f5f600d60059054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055506001600f5f3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055506001600f5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555073cc24d0571d2ada7cc7e3b3d4cef72d82196023c5600d60056101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505062000f4e565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160362000757575f6040517fec442f050000000000000000000000000000000000000000000000000000000081526004016200074e9190620009e1565b60405180910390fd5b6200076a5f83836200077760201b60201c565b5050565b5f600354905090565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603620007cb578060035f828254620007be919062000ead565b925050819055506200089e565b5f60015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490508181101562000858578381836040517fe450d38c0000000000000000000000000000000000000000000000000000000081526004016200084f9392919062000ef8565b60405180910390fd5b81810360015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603620008e7578060035f828254039250508190555062000932565b8060015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405162000991919062000f33565b60405180910390a3505050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f620009c9826200099e565b9050919050565b620009db81620009bd565b82525050565b5f602082019050620009f65f830184620009d0565b92915050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168062000a7857607f821691505b60208210810362000a8e5762000a8d62000a33565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f6008830262000af27fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000ab5565b62000afe868362000ab5565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f62000b4862000b4262000b3c8462000b16565b62000b1f565b62000b16565b9050919050565b5f819050919050565b62000b638362000b28565b62000b7b62000b728262000b4f565b84845462000ac1565b825550505050565b5f90565b62000b9162000b83565b62000b9e81848462000b58565b505050565b5b8181101562000bc55762000bb95f8262000b87565b60018101905062000ba4565b5050565b601f82111562000c145762000bde8162000a94565b62000be98462000aa6565b8101602085101562000bf9578190505b62000c1162000c088562000aa6565b83018262000ba3565b50505b505050565b5f82821c905092915050565b5f62000c365f198460080262000c19565b1980831691505092915050565b5f62000c50838362000c25565b9150826002028217905092915050565b62000c6b82620009fc565b67ffffffffffffffff81111562000c875762000c8662000a06565b5b62000c93825462000a60565b62000ca082828562000bc9565b5f60209050601f83116001811462000cd6575f841562000cc1578287015190505b62000ccd858262000c43565b86555062000d3c565b601f19841662000ce68662000a94565b5f5b8281101562000d0f5784890151825560018201915060208501945060208101905062000ce8565b8683101562000d2f578489015162000d2b601f89168262000c25565b8355505b6001600288020188555050505b505050505050565b5f80fd5b62000d5381620009bd565b811462000d5e575f80fd5b50565b5f8151905062000d718162000d48565b92915050565b5f6020828403121562000d8f5762000d8e62000d44565b5b5f62000d9e8482850162000d61565b91505092915050565b5f60408201905062000dbc5f830185620009d0565b62000dcb6020830184620009d0565b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f62000e0b8262000b16565b915062000e188362000b16565b925082820262000e288162000b16565b9150828204841483151762000e425762000e4162000dd2565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f62000e828262000b16565b915062000e8f8362000b16565b92508262000ea25762000ea162000e49565b5b828204905092915050565b5f62000eb98262000b16565b915062000ec68362000b16565b925082820190508082111562000ee15762000ee062000dd2565b5b92915050565b62000ef28162000b16565b82525050565b5f60608201905062000f0d5f830186620009d0565b62000f1c602083018562000ee7565b62000f2b604083018462000ee7565b949350505050565b5f60208201905062000f485f83018462000ee7565b92915050565b61269c8062000f5c5f395ff3fe608060405234801561000f575f80fd5b50600436106101d8575f3560e01c806370a0823111610102578063b256f7b7116100a0578063df47e3731161006f578063df47e37314610512578063e0bf7fd11461052e578063e71239461461055e578063f2fde38b1461057a576101d8565b8063b256f7b71461048c578063bff51ef8146104a8578063c0246668146104c6578063dd62ed3e146104e2576101d8565b8063830351ff116100dc578063830351ff146104025780638da5cb5b1461042057806395d89b411461043e578063a9059cbb1461045c576101d8565b806370a08231146103aa578063715018a6146103da5780637df405a4146103e4576101d8565b806327b1a8e91161017a5780633d5369f6116101495780633d5369f61461033457806349bd5a5e1461035057806353371be01461036e5780636fb1896c1461038c576101d8565b806327b1a8e9146102be57806330275744146102dc578063313ce567146102f85780633582ad2314610316576101d8565b80631694505e116101b65780631694505e1461023457806318160ddd146102525780631d6380411461027057806323b872dd1461028e576101d8565b806306fdde03146101dc578063095ea7b3146101fa5780630f15f4c01461022a575b5f80fd5b6101e4610596565b6040516101f19190611b62565b60405180910390f35b610214600480360381019061020f9190611c13565b610626565b6040516102219190611c6b565b60405180910390f35b610232610648565b005b61023c6106de565b6040516102499190611cdf565b60405180910390f35b61025a610703565b6040516102679190611d07565b60405180910390f35b61027861070c565b6040516102859190611d2f565b60405180910390f35b6102a860048036038101906102a39190611d48565b610732565b6040516102b59190611c6b565b60405180910390f35b6102c6610760565b6040516102d39190611d07565b60405180910390f35b6102f660048036038101906102f19190611dc2565b610766565b005b61030061078b565b60405161030d9190611e08565b60405180910390f35b61031e610793565b60405161032b9190611c6b565b60405180910390f35b61034e60048036038101906103499190611e21565b6107a6565b005b6103586107fa565b6040516103659190611d2f565b60405180910390f35b61037661081f565b6040516103839190611c6b565b60405180910390f35b610394610832565b6040516103a19190611d07565b60405180910390f35b6103c460048036038101906103bf9190611e4c565b610838565b6040516103d19190611d07565b60405180910390f35b6103e261087e565b005b6103ec610891565b6040516103f99190611d07565b60405180910390f35b61040a610897565b6040516104179190611c6b565b60405180910390f35b6104286108a9565b6040516104359190611d2f565b60405180910390f35b6104466108d0565b6040516104539190611b62565b60405180910390f35b61047660048036038101906104719190611c13565b610960565b6040516104839190611c6b565b60405180910390f35b6104a660048036038101906104a19190611dc2565b610982565b005b6104b06109a7565b6040516104bd9190611c6b565b60405180910390f35b6104e060048036038101906104db9190611e77565b6109ba565b005b6104fc60048036038101906104f79190611eb5565b610a1a565b6040516105099190611d07565b60405180910390f35b61052c60048036038101906105279190611ef3565b610a9c565b005b61054860048036038101906105439190611e4c565b610b1e565b6040516105559190611c6b565b60405180910390f35b61057860048036038101906105739190611e4c565b610b3b565b005b610594600480360381019061058f9190611e4c565b610b87565b005b6060600480546105a590611f5e565b80601f01602080910402602001604051908101604052809291908181526020018280546105d190611f5e565b801561061c5780601f106105f35761010080835404028352916020019161061c565b820191905f5260205f20905b8154815290600101906020018083116105ff57829003601f168201915b5050505050905090565b5f80610630610c0b565b905061063d818585610c12565b600191505092915050565b610650610c24565b600d60049054906101000a900460ff16156106a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161069790611fd8565b60405180910390fd5b6001600d60046101000a81548160ff02191690831515021790555043600a819055506001600d5f6101000a81548160ff021916908315150217905550565b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f600354905090565b600d60059054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f8061073c610c0b565b9050610749858285610cab565b610754858585610d3d565b60019150509392505050565b600b5481565b61076e610c24565b80600d60016101000a81548160ff02191690831515021790555050565b5f6012905090565b600d60029054906101000a900460ff1681565b6107ae610c24565b5f81116107f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107e790612040565b60405180910390fd5b8060098190555050565b600e5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600d60049054906101000a900460ff1681565b60085481565b5f60015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b610886610c24565b61088f5f611230565b565b60075481565b600d5f9054906101000a900460ff1681565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600580546108df90611f5e565b80601f016020809104026020016040519081016040528092919081815260200182805461090b90611f5e565b80156109565780601f1061092d57610100808354040283529160200191610956565b820191905f5260205f20905b81548152906001019060200180831161093957829003601f168201915b5050505050905090565b5f8061096a610c0b565b9050610977818585610d3d565b600191505092915050565b61098a610c24565b80600d60026101000a81548160ff02191690831515021790555050565b600d60019054906101000a900460ff1681565b6109c2610c24565b80600f5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b5f60025f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b610aa4610c24565b600a82108015610ab45750600a81105b610af3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aea906120a8565b60405180910390fd5b81600781905550806008819055505f600d5f6101000a81548160ff0219169083151502179055505050565b600f602052805f5260405f205f915054906101000a900460ff1681565b610b43610c24565b80600d60056101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b610b8f610c24565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610bff575f6040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401610bf69190611d2f565b60405180910390fd5b610c0881611230565b50565b5f33905090565b610c1f83838360016112f1565b505050565b610c2c610c0b565b73ffffffffffffffffffffffffffffffffffffffff16610c4a6108a9565b73ffffffffffffffffffffffffffffffffffffffff1614610ca957610c6d610c0b565b6040517f118cdaa7000000000000000000000000000000000000000000000000000000008152600401610ca09190611d2f565b60405180910390fd5b565b5f610cb68484610a1a565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610d375781811015610d28578281836040517ffb8f41b2000000000000000000000000000000000000000000000000000000008152600401610d1f939291906120c6565b60405180910390fd5b610d3684848484035f6112f1565b5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610dab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da29061216b565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610e19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e10906121f9565b60405180910390fd5b5f8111610e5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5290612287565b60405180910390fd5b600d60049054906101000a900460ff16610f2257610e776108a9565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161480610ee25750610eb36108a9565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b610f21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f18906122ef565b60405180910390fd5b5b5f600d60019054906101000a900460ff16156111eb57600d5f9054906101000a900460ff1615610f5657610f55436114c0565b5b600e5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361102d57600f5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1661102c57606460075483611008919061233a565b61101291906123a8565b9050600b5f815480929190611026906123d8565b91905055505b5b600e5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036110ed57600f5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff166110ec576064600854836110df919061233a565b6110e991906123a8565b90505b5b5f6110f730610838565b90505f600954821015905080801561111c5750600d60039054906101000a900460ff16155b80156111755750600e5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614155b80156111c85750600f5f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b80156111d75750600c54600b54115b156111e8576111e760095461153f565b5b50505b5f81111561121e575f8183611200919061241f565b905061120d8530846117cc565b6112188585836117cc565b5061122a565b6112298484846117cc565b5b50505050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611361575f6040517fe602df050000000000000000000000000000000000000000000000000000000081526004016113589190611d2f565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036113d1575f6040517f94280d620000000000000000000000000000000000000000000000000000000081526004016113c89190611d2f565b60405180910390fd5b8160025f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208190555080156114ba578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516114b19190611d07565b60405180910390a35b50505050565b806002600a546114d09190612452565b106114ea57604b600781905550604b60088190555061153c565b806003600a546114fa9190612452565b10611514576032600781905550603260088190555061153b565b806005600a546115249190612452565b1061153a57601960078190555060196008819055505b5b5b50565b6001600d60036101000a81548160ff0219169083151502179055505f600267ffffffffffffffff81111561157657611575612485565b5b6040519080825280602002602001820160405280156115a45781602001602082028036833780820191505090505b50905030815f815181106115bb576115ba6124b2565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801561165f573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061168391906124f3565b81600181518110611697576116966124b2565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506116fd3060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684610c12565b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac947835f84600d60059054906101000a900473ffffffffffffffffffffffffffffffffffffffff16426040518663ffffffff1660e01b815260040161178195949392919061260e565b5f604051808303815f87803b158015611798575f80fd5b505af11580156117aa573d5f803e3d5ffd5b50505050505f600d60036101000a81548160ff02191690831515021790555050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361183c575f6040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081526004016118339190611d2f565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036118ac575f6040517fec442f050000000000000000000000000000000000000000000000000000000081526004016118a39190611d2f565b60405180910390fd5b6118b78383836118bc565b505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361190c578060035f8282546119009190612452565b925050819055506119dc565b5f60015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015611996578381836040517fe450d38c00000000000000000000000000000000000000000000000000000000815260040161198d939291906120c6565b60405180910390fd5b81810360015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611a23578060035f8282540392505081905550611a6e565b8060015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611acb9190611d07565b60405180910390a3505050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015611b0f578082015181840152602081019050611af4565b5f8484015250505050565b5f601f19601f8301169050919050565b5f611b3482611ad8565b611b3e8185611ae2565b9350611b4e818560208601611af2565b611b5781611b1a565b840191505092915050565b5f6020820190508181035f830152611b7a8184611b2a565b905092915050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f611baf82611b86565b9050919050565b611bbf81611ba5565b8114611bc9575f80fd5b50565b5f81359050611bda81611bb6565b92915050565b5f819050919050565b611bf281611be0565b8114611bfc575f80fd5b50565b5f81359050611c0d81611be9565b92915050565b5f8060408385031215611c2957611c28611b82565b5b5f611c3685828601611bcc565b9250506020611c4785828601611bff565b9150509250929050565b5f8115159050919050565b611c6581611c51565b82525050565b5f602082019050611c7e5f830184611c5c565b92915050565b5f819050919050565b5f611ca7611ca2611c9d84611b86565b611c84565b611b86565b9050919050565b5f611cb882611c8d565b9050919050565b5f611cc982611cae565b9050919050565b611cd981611cbf565b82525050565b5f602082019050611cf25f830184611cd0565b92915050565b611d0181611be0565b82525050565b5f602082019050611d1a5f830184611cf8565b92915050565b611d2981611ba5565b82525050565b5f602082019050611d425f830184611d20565b92915050565b5f805f60608486031215611d5f57611d5e611b82565b5b5f611d6c86828701611bcc565b9350506020611d7d86828701611bcc565b9250506040611d8e86828701611bff565b9150509250925092565b611da181611c51565b8114611dab575f80fd5b50565b5f81359050611dbc81611d98565b92915050565b5f60208284031215611dd757611dd6611b82565b5b5f611de484828501611dae565b91505092915050565b5f60ff82169050919050565b611e0281611ded565b82525050565b5f602082019050611e1b5f830184611df9565b92915050565b5f60208284031215611e3657611e35611b82565b5b5f611e4384828501611bff565b91505092915050565b5f60208284031215611e6157611e60611b82565b5b5f611e6e84828501611bcc565b91505092915050565b5f8060408385031215611e8d57611e8c611b82565b5b5f611e9a85828601611bcc565b9250506020611eab85828601611dae565b9150509250929050565b5f8060408385031215611ecb57611eca611b82565b5b5f611ed885828601611bcc565b9250506020611ee985828601611bcc565b9150509250929050565b5f8060408385031215611f0957611f08611b82565b5b5f611f1685828601611bff565b9250506020611f2785828601611bff565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680611f7557607f821691505b602082108103611f8857611f87611f31565b5b50919050565b7f54726164696e67206e6f742070617573656400000000000000000000000000005f82015250565b5f611fc2601283611ae2565b9150611fcd82611f8e565b602082019050919050565b5f6020820190508181035f830152611fef81611fb6565b9050919050565b7f43616e6e6f742073657420746f207a65726f00000000000000000000000000005f82015250565b5f61202a601283611ae2565b915061203582611ff6565b602082019050919050565b5f6020820190508181035f8301526120578161201e565b9050919050565b7f43616e6e6f74207365742074617865732061626f7665203130000000000000005f82015250565b5f612092601983611ae2565b915061209d8261205e565b602082019050919050565b5f6020820190508181035f8301526120bf81612086565b9050919050565b5f6060820190506120d95f830186611d20565b6120e66020830185611cf8565b6120f36040830184611cf8565b949350505050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f2061645f8201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b5f612155602583611ae2565b9150612160826120fb565b604082019050919050565b5f6020820190508181035f83015261218281612149565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f20616464725f8201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b5f6121e3602383611ae2565b91506121ee82612189565b604082019050919050565b5f6020820190508181035f830152612210816121d7565b9050919050565b7f45524332303a207472616e73666572206d7573742062652067726561746572205f8201527f7468616e20300000000000000000000000000000000000000000000000000000602082015250565b5f612271602683611ae2565b915061227c82612217565b604082019050919050565b5f6020820190508181035f83015261229e81612265565b9050919050565b7f54726164696e67206e6f742061637469766520796574000000000000000000005f82015250565b5f6122d9601683611ae2565b91506122e4826122a5565b602082019050919050565b5f6020820190508181035f830152612306816122cd565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61234482611be0565b915061234f83611be0565b925082820261235d81611be0565b915082820484148315176123745761237361230d565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f6123b282611be0565b91506123bd83611be0565b9250826123cd576123cc61237b565b5b828204905092915050565b5f6123e282611be0565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036124145761241361230d565b5b600182019050919050565b5f61242982611be0565b915061243483611be0565b925082820390508181111561244c5761244b61230d565b5b92915050565b5f61245c82611be0565b915061246783611be0565b925082820190508082111561247f5761247e61230d565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f815190506124ed81611bb6565b92915050565b5f6020828403121561250857612507611b82565b5b5f612515848285016124df565b91505092915050565b5f819050919050565b5f61254161253c6125378461251e565b611c84565b611be0565b9050919050565b61255181612527565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b61258981611ba5565b82525050565b5f61259a8383612580565b60208301905092915050565b5f602082019050919050565b5f6125bc82612557565b6125c68185612561565b93506125d183612571565b805f5b838110156126015781516125e8888261258f565b97506125f3836125a6565b9250506001810190506125d4565b5085935050505092915050565b5f60a0820190506126215f830188611cf8565b61262e6020830187612548565b818103604083015261264081866125b2565b905061264f6060830185611d20565b61265c6080830184611cf8565b969550505050505056fea26469706673582212202dce9ff8107bbe7ad528c250fcdfe4d6a96a392daf027325898f9f61bdc3b0b764736f6c6343000815003346756e6b792046696e6765727320526f636b2050617065722053636973736f727320426174746c6520526f79616c65

Deployed Bytecode

0x608060405234801561000f575f80fd5b50600436106101d8575f3560e01c806370a0823111610102578063b256f7b7116100a0578063df47e3731161006f578063df47e37314610512578063e0bf7fd11461052e578063e71239461461055e578063f2fde38b1461057a576101d8565b8063b256f7b71461048c578063bff51ef8146104a8578063c0246668146104c6578063dd62ed3e146104e2576101d8565b8063830351ff116100dc578063830351ff146104025780638da5cb5b1461042057806395d89b411461043e578063a9059cbb1461045c576101d8565b806370a08231146103aa578063715018a6146103da5780637df405a4146103e4576101d8565b806327b1a8e91161017a5780633d5369f6116101495780633d5369f61461033457806349bd5a5e1461035057806353371be01461036e5780636fb1896c1461038c576101d8565b806327b1a8e9146102be57806330275744146102dc578063313ce567146102f85780633582ad2314610316576101d8565b80631694505e116101b65780631694505e1461023457806318160ddd146102525780631d6380411461027057806323b872dd1461028e576101d8565b806306fdde03146101dc578063095ea7b3146101fa5780630f15f4c01461022a575b5f80fd5b6101e4610596565b6040516101f19190611b62565b60405180910390f35b610214600480360381019061020f9190611c13565b610626565b6040516102219190611c6b565b60405180910390f35b610232610648565b005b61023c6106de565b6040516102499190611cdf565b60405180910390f35b61025a610703565b6040516102679190611d07565b60405180910390f35b61027861070c565b6040516102859190611d2f565b60405180910390f35b6102a860048036038101906102a39190611d48565b610732565b6040516102b59190611c6b565b60405180910390f35b6102c6610760565b6040516102d39190611d07565b60405180910390f35b6102f660048036038101906102f19190611dc2565b610766565b005b61030061078b565b60405161030d9190611e08565b60405180910390f35b61031e610793565b60405161032b9190611c6b565b60405180910390f35b61034e60048036038101906103499190611e21565b6107a6565b005b6103586107fa565b6040516103659190611d2f565b60405180910390f35b61037661081f565b6040516103839190611c6b565b60405180910390f35b610394610832565b6040516103a19190611d07565b60405180910390f35b6103c460048036038101906103bf9190611e4c565b610838565b6040516103d19190611d07565b60405180910390f35b6103e261087e565b005b6103ec610891565b6040516103f99190611d07565b60405180910390f35b61040a610897565b6040516104179190611c6b565b60405180910390f35b6104286108a9565b6040516104359190611d2f565b60405180910390f35b6104466108d0565b6040516104539190611b62565b60405180910390f35b61047660048036038101906104719190611c13565b610960565b6040516104839190611c6b565b60405180910390f35b6104a660048036038101906104a19190611dc2565b610982565b005b6104b06109a7565b6040516104bd9190611c6b565b60405180910390f35b6104e060048036038101906104db9190611e77565b6109ba565b005b6104fc60048036038101906104f79190611eb5565b610a1a565b6040516105099190611d07565b60405180910390f35b61052c60048036038101906105279190611ef3565b610a9c565b005b61054860048036038101906105439190611e4c565b610b1e565b6040516105559190611c6b565b60405180910390f35b61057860048036038101906105739190611e4c565b610b3b565b005b610594600480360381019061058f9190611e4c565b610b87565b005b6060600480546105a590611f5e565b80601f01602080910402602001604051908101604052809291908181526020018280546105d190611f5e565b801561061c5780601f106105f35761010080835404028352916020019161061c565b820191905f5260205f20905b8154815290600101906020018083116105ff57829003601f168201915b5050505050905090565b5f80610630610c0b565b905061063d818585610c12565b600191505092915050565b610650610c24565b600d60049054906101000a900460ff16156106a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161069790611fd8565b60405180910390fd5b6001600d60046101000a81548160ff02191690831515021790555043600a819055506001600d5f6101000a81548160ff021916908315150217905550565b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f600354905090565b600d60059054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f8061073c610c0b565b9050610749858285610cab565b610754858585610d3d565b60019150509392505050565b600b5481565b61076e610c24565b80600d60016101000a81548160ff02191690831515021790555050565b5f6012905090565b600d60029054906101000a900460ff1681565b6107ae610c24565b5f81116107f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107e790612040565b60405180910390fd5b8060098190555050565b600e5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600d60049054906101000a900460ff1681565b60085481565b5f60015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b610886610c24565b61088f5f611230565b565b60075481565b600d5f9054906101000a900460ff1681565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600580546108df90611f5e565b80601f016020809104026020016040519081016040528092919081815260200182805461090b90611f5e565b80156109565780601f1061092d57610100808354040283529160200191610956565b820191905f5260205f20905b81548152906001019060200180831161093957829003601f168201915b5050505050905090565b5f8061096a610c0b565b9050610977818585610d3d565b600191505092915050565b61098a610c24565b80600d60026101000a81548160ff02191690831515021790555050565b600d60019054906101000a900460ff1681565b6109c2610c24565b80600f5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b5f60025f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b610aa4610c24565b600a82108015610ab45750600a81105b610af3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aea906120a8565b60405180910390fd5b81600781905550806008819055505f600d5f6101000a81548160ff0219169083151502179055505050565b600f602052805f5260405f205f915054906101000a900460ff1681565b610b43610c24565b80600d60056101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b610b8f610c24565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610bff575f6040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401610bf69190611d2f565b60405180910390fd5b610c0881611230565b50565b5f33905090565b610c1f83838360016112f1565b505050565b610c2c610c0b565b73ffffffffffffffffffffffffffffffffffffffff16610c4a6108a9565b73ffffffffffffffffffffffffffffffffffffffff1614610ca957610c6d610c0b565b6040517f118cdaa7000000000000000000000000000000000000000000000000000000008152600401610ca09190611d2f565b60405180910390fd5b565b5f610cb68484610a1a565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610d375781811015610d28578281836040517ffb8f41b2000000000000000000000000000000000000000000000000000000008152600401610d1f939291906120c6565b60405180910390fd5b610d3684848484035f6112f1565b5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610dab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da29061216b565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610e19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e10906121f9565b60405180910390fd5b5f8111610e5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5290612287565b60405180910390fd5b600d60049054906101000a900460ff16610f2257610e776108a9565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161480610ee25750610eb36108a9565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b610f21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f18906122ef565b60405180910390fd5b5b5f600d60019054906101000a900460ff16156111eb57600d5f9054906101000a900460ff1615610f5657610f55436114c0565b5b600e5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361102d57600f5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1661102c57606460075483611008919061233a565b61101291906123a8565b9050600b5f815480929190611026906123d8565b91905055505b5b600e5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036110ed57600f5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff166110ec576064600854836110df919061233a565b6110e991906123a8565b90505b5b5f6110f730610838565b90505f600954821015905080801561111c5750600d60039054906101000a900460ff16155b80156111755750600e5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614155b80156111c85750600f5f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b80156111d75750600c54600b54115b156111e8576111e760095461153f565b5b50505b5f81111561121e575f8183611200919061241f565b905061120d8530846117cc565b6112188585836117cc565b5061122a565b6112298484846117cc565b5b50505050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611361575f6040517fe602df050000000000000000000000000000000000000000000000000000000081526004016113589190611d2f565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036113d1575f6040517f94280d620000000000000000000000000000000000000000000000000000000081526004016113c89190611d2f565b60405180910390fd5b8160025f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208190555080156114ba578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516114b19190611d07565b60405180910390a35b50505050565b806002600a546114d09190612452565b106114ea57604b600781905550604b60088190555061153c565b806003600a546114fa9190612452565b10611514576032600781905550603260088190555061153b565b806005600a546115249190612452565b1061153a57601960078190555060196008819055505b5b5b50565b6001600d60036101000a81548160ff0219169083151502179055505f600267ffffffffffffffff81111561157657611575612485565b5b6040519080825280602002602001820160405280156115a45781602001602082028036833780820191505090505b50905030815f815181106115bb576115ba6124b2565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801561165f573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061168391906124f3565b81600181518110611697576116966124b2565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506116fd3060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684610c12565b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac947835f84600d60059054906101000a900473ffffffffffffffffffffffffffffffffffffffff16426040518663ffffffff1660e01b815260040161178195949392919061260e565b5f604051808303815f87803b158015611798575f80fd5b505af11580156117aa573d5f803e3d5ffd5b50505050505f600d60036101000a81548160ff02191690831515021790555050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361183c575f6040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081526004016118339190611d2f565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036118ac575f6040517fec442f050000000000000000000000000000000000000000000000000000000081526004016118a39190611d2f565b60405180910390fd5b6118b78383836118bc565b505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361190c578060035f8282546119009190612452565b925050819055506119dc565b5f60015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015611996578381836040517fe450d38c00000000000000000000000000000000000000000000000000000000815260040161198d939291906120c6565b60405180910390fd5b81810360015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611a23578060035f8282540392505081905550611a6e565b8060015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611acb9190611d07565b60405180910390a3505050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015611b0f578082015181840152602081019050611af4565b5f8484015250505050565b5f601f19601f8301169050919050565b5f611b3482611ad8565b611b3e8185611ae2565b9350611b4e818560208601611af2565b611b5781611b1a565b840191505092915050565b5f6020820190508181035f830152611b7a8184611b2a565b905092915050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f611baf82611b86565b9050919050565b611bbf81611ba5565b8114611bc9575f80fd5b50565b5f81359050611bda81611bb6565b92915050565b5f819050919050565b611bf281611be0565b8114611bfc575f80fd5b50565b5f81359050611c0d81611be9565b92915050565b5f8060408385031215611c2957611c28611b82565b5b5f611c3685828601611bcc565b9250506020611c4785828601611bff565b9150509250929050565b5f8115159050919050565b611c6581611c51565b82525050565b5f602082019050611c7e5f830184611c5c565b92915050565b5f819050919050565b5f611ca7611ca2611c9d84611b86565b611c84565b611b86565b9050919050565b5f611cb882611c8d565b9050919050565b5f611cc982611cae565b9050919050565b611cd981611cbf565b82525050565b5f602082019050611cf25f830184611cd0565b92915050565b611d0181611be0565b82525050565b5f602082019050611d1a5f830184611cf8565b92915050565b611d2981611ba5565b82525050565b5f602082019050611d425f830184611d20565b92915050565b5f805f60608486031215611d5f57611d5e611b82565b5b5f611d6c86828701611bcc565b9350506020611d7d86828701611bcc565b9250506040611d8e86828701611bff565b9150509250925092565b611da181611c51565b8114611dab575f80fd5b50565b5f81359050611dbc81611d98565b92915050565b5f60208284031215611dd757611dd6611b82565b5b5f611de484828501611dae565b91505092915050565b5f60ff82169050919050565b611e0281611ded565b82525050565b5f602082019050611e1b5f830184611df9565b92915050565b5f60208284031215611e3657611e35611b82565b5b5f611e4384828501611bff565b91505092915050565b5f60208284031215611e6157611e60611b82565b5b5f611e6e84828501611bcc565b91505092915050565b5f8060408385031215611e8d57611e8c611b82565b5b5f611e9a85828601611bcc565b9250506020611eab85828601611dae565b9150509250929050565b5f8060408385031215611ecb57611eca611b82565b5b5f611ed885828601611bcc565b9250506020611ee985828601611bcc565b9150509250929050565b5f8060408385031215611f0957611f08611b82565b5b5f611f1685828601611bff565b9250506020611f2785828601611bff565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680611f7557607f821691505b602082108103611f8857611f87611f31565b5b50919050565b7f54726164696e67206e6f742070617573656400000000000000000000000000005f82015250565b5f611fc2601283611ae2565b9150611fcd82611f8e565b602082019050919050565b5f6020820190508181035f830152611fef81611fb6565b9050919050565b7f43616e6e6f742073657420746f207a65726f00000000000000000000000000005f82015250565b5f61202a601283611ae2565b915061203582611ff6565b602082019050919050565b5f6020820190508181035f8301526120578161201e565b9050919050565b7f43616e6e6f74207365742074617865732061626f7665203130000000000000005f82015250565b5f612092601983611ae2565b915061209d8261205e565b602082019050919050565b5f6020820190508181035f8301526120bf81612086565b9050919050565b5f6060820190506120d95f830186611d20565b6120e66020830185611cf8565b6120f36040830184611cf8565b949350505050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f2061645f8201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b5f612155602583611ae2565b9150612160826120fb565b604082019050919050565b5f6020820190508181035f83015261218281612149565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f20616464725f8201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b5f6121e3602383611ae2565b91506121ee82612189565b604082019050919050565b5f6020820190508181035f830152612210816121d7565b9050919050565b7f45524332303a207472616e73666572206d7573742062652067726561746572205f8201527f7468616e20300000000000000000000000000000000000000000000000000000602082015250565b5f612271602683611ae2565b915061227c82612217565b604082019050919050565b5f6020820190508181035f83015261229e81612265565b9050919050565b7f54726164696e67206e6f742061637469766520796574000000000000000000005f82015250565b5f6122d9601683611ae2565b91506122e4826122a5565b602082019050919050565b5f6020820190508181035f830152612306816122cd565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61234482611be0565b915061234f83611be0565b925082820261235d81611be0565b915082820484148315176123745761237361230d565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f6123b282611be0565b91506123bd83611be0565b9250826123cd576123cc61237b565b5b828204905092915050565b5f6123e282611be0565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036124145761241361230d565b5b600182019050919050565b5f61242982611be0565b915061243483611be0565b925082820390508181111561244c5761244b61230d565b5b92915050565b5f61245c82611be0565b915061246783611be0565b925082820190508082111561247f5761247e61230d565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f815190506124ed81611bb6565b92915050565b5f6020828403121561250857612507611b82565b5b5f612515848285016124df565b91505092915050565b5f819050919050565b5f61254161253c6125378461251e565b611c84565b611be0565b9050919050565b61255181612527565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b61258981611ba5565b82525050565b5f61259a8383612580565b60208301905092915050565b5f602082019050919050565b5f6125bc82612557565b6125c68185612561565b93506125d183612571565b805f5b838110156126015781516125e8888261258f565b97506125f3836125a6565b9250506001810190506125d4565b5085935050505092915050565b5f60a0820190506126215f830188611cf8565b61262e6020830187612548565b818103604083015261264081866125b2565b905061264f6060830185611d20565b61265c6080830184611cf8565b969550505050505056fea26469706673582212202dce9ff8107bbe7ad528c250fcdfe4d6a96a392daf027325898f9f61bdc3b0b764736f6c63430008150033

Deployed Bytecode Sourcemap

26310:5949:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13533:91;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15826:190;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31939:199;;;:::i;:::-;;26349:41;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14635:99;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26808:25;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16594:249;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26555:24;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31835:95;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;14486:84;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26701:32;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31621:205;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26840:28;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26764:34;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26439:33;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14797:118;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25216:103;;;:::i;:::-;;26400:32;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26635:21;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24541:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13743:95;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15120:182;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32147:109;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26663:31;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31448:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;15365:142;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31054:385;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26878:51;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30930:115;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25474:220;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;13533:91;13578:13;13611:5;13604:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13533:91;:::o;15826:190::-;15899:4;15916:13;15932:12;:10;:12::i;:::-;15916:28;;15955:31;15964:5;15971:7;15980:5;15955:8;:31::i;:::-;16004:4;15997:11;;;15826:190;;;;:::o;31939:199::-;24427:13;:11;:13::i;:::-;31998:14:::1;;;;;;;;;;;31997:15;31989:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;32063:4;32046:14;;:21;;;;;;;;;;;;;;;;;;32091:12;32078:10;:25;;;;32126:4;32114:9;;:16;;;;;;;;;;;;;;;;;;31939:199::o:0;26349:41::-;;;;;;;;;;;;;:::o;14635:99::-;14687:7;14714:12;;14707:19;;14635:99;:::o;26808:25::-;;;;;;;;;;;;;:::o;16594:249::-;16681:4;16698:15;16716:12;:10;:12::i;:::-;16698:30;;16739:37;16755:4;16761:7;16770:5;16739:15;:37::i;:::-;16787:26;16797:4;16803:2;16807:5;16787:9;:26::i;:::-;16831:4;16824:11;;;16594:249;;;;;:::o;26555:24::-;;;;:::o;31835:95::-;24427:13;:11;:13::i;:::-;31915:7:::1;31900:12;;:22;;;;;;;;;;;;;;;;;;31835:95:::0;:::o;14486:84::-;14535:5;14560:2;14553:9;;14486:84;:::o;26701:32::-;;;;;;;;;;;;;:::o;31621:205::-;24427:13;:11;:13::i;:::-;31748:1:::1;31733:12;:16;31725:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;31806:12;31783:20;:35;;;;31621:205:::0;:::o;26840:28::-;;;;;;;;;;;;;:::o;26764:34::-;;;;;;;;;;;;;:::o;26439:33::-;;;;:::o;14797:118::-;14862:7;14889:9;:18;14899:7;14889:18;;;;;;;;;;;;;;;;14882:25;;14797:118;;;:::o;25216:103::-;24427:13;:11;:13::i;:::-;25281:30:::1;25308:1;25281:18;:30::i;:::-;25216:103::o:0;26400:32::-;;;;:::o;26635:21::-;;;;;;;;;;;;;:::o;24541:87::-;24587:7;24614:6;;;;;;;;;;;24607:13;;24541:87;:::o;13743:95::-;13790:13;13823:7;13816:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13743:95;:::o;15120:182::-;15189:4;15206:13;15222:12;:10;:12::i;:::-;15206:28;;15245:27;15255:5;15262:2;15266:5;15245:9;:27::i;:::-;15290:4;15283:11;;;15120:182;;;;:::o;32147:109::-;24427:13;:11;:13::i;:::-;32235::::1;32219;;:29;;;;;;;;;;;;;;;;;;32147:109:::0;:::o;26663:31::-;;;;;;;;;;;;;:::o;31448:164::-;24427:13;:11;:13::i;:::-;31593:11:::1;31561:19;:29;31581:8;31561:29;;;;;;;;;;;;;;;;:43;;;;;;;;;;;;;;;;;;31448:164:::0;;:::o;15365:142::-;15445:7;15472:11;:18;15484:5;15472:18;;;;;;;;;;;;;;;:27;15491:7;15472:27;;;;;;;;;;;;;;;;15465:34;;15365:142;;;;:::o;31054:385::-;24427:13;:11;:13::i;:::-;31231:2:::1;31211:17;:22;:49;;;;;31258:2;31237:18;:23;31211:49;31189:124;;;;;;;;;;;;:::i;:::-;;;;;;;;;31340:17;31324:13;:33;;;;31385:18;31368:14;:35;;;;31426:5;31414:9;;:17;;;;;;;;;;;;;;;;;;31054:385:::0;;:::o;26878:51::-;;;;;;;;;;;;;;;;;;;;;;:::o;30930:115::-;24427:13;:11;:13::i;:::-;31023:14:::1;31010:10;;:27;;;;;;;;;;;;;;;;;;30930:115:::0;:::o;25474:220::-;24427:13;:11;:13::i;:::-;25579:1:::1;25559:22;;:8;:22;;::::0;25555:93:::1;;25633:1;25605:31;;;;;;;;;;;:::i;:::-;;;;;;;;25555:93;25658:28;25677:8;25658:18;:28::i;:::-;25474:220:::0;:::o;11268:98::-;11321:7;11348:10;11341:17;;11268:98;:::o;20661:130::-;20746:37;20755:5;20762:7;20771:5;20778:4;20746:8;:37::i;:::-;20661:130;;;:::o;24706:166::-;24777:12;:10;:12::i;:::-;24766:23;;:7;:5;:7::i;:::-;:23;;;24762:103;;24840:12;:10;:12::i;:::-;24813:40;;;;;;;;;;;:::i;:::-;;;;;;;;24762:103;24706:166::o;22377:487::-;22477:24;22504:25;22514:5;22521:7;22504:9;:25::i;:::-;22477:52;;22564:17;22544:16;:37;22540:317;;22621:5;22602:16;:24;22598:132;;;22681:7;22690:16;22708:5;22654:60;;;;;;;;;;;;;:::i;:::-;;;;;;;;22598:132;22773:57;22782:5;22789:7;22817:5;22798:16;:24;22824:5;22773:8;:57::i;:::-;22540:317;22466:398;22377:487;;;:::o;28006:1825::-;28154:1;28138:18;;:4;:18;;;28130:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;28231:1;28217:16;;:2;:16;;;28209:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;28301:1;28292:6;:10;28284:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;28364:14;;;;;;;;;;;28359:115;;28411:7;:5;:7::i;:::-;28403:15;;:4;:15;;;:32;;;;28428:7;:5;:7::i;:::-;28422:13;;:2;:13;;;28403:32;28395:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;28359:115;28487:17;28522:12;;;;;;;;;;;28518:1028;;;28555:9;;;;;;;;;;;28551:70;;;28585:20;28592:12;28585:6;:20::i;:::-;28551:70;28650:13;;;;;;;;;;;28642:21;;:4;:21;;;28638:210;;28689:19;:23;28709:2;28689:23;;;;;;;;;;;;;;;;;;;;;;;;;28684:149;;28776:3;28759:13;;28750:6;:22;;;;:::i;:::-;28749:30;;;;:::i;:::-;28737:42;;28802:9;;:11;;;;;;;;;:::i;:::-;;;;;;28684:149;28638:210;28875:13;;;;;;;;;;;28869:19;;:2;:19;;;28865:177;;28914:19;:25;28934:4;28914:25;;;;;;;;;;;;;;;;;;;;;;;;;28909:118;;29004:3;28986:14;;28977:6;:23;;;;:::i;:::-;28976:31;;;;:::i;:::-;28964:43;;28909:118;28865:177;29059:28;29090:24;29108:4;29090:9;:24::i;:::-;29059:55;;29132:24;29200:20;;29159;:61;;29132:88;;29260:19;:53;;;;;29301:12;;;;;;;;;;;29300:13;29260:53;:95;;;;;29342:13;;;;;;;;;;;29334:21;;:4;:21;;;;29260:95;:142;;;;;29377:19;:25;29397:4;29377:25;;;;;;;;;;;;;;;;;;;;;;;;;29376:26;29260:142;:193;;;;;29435:18;;29423:9;;:30;29260:193;29238:297;;;29488:31;29498:20;;29488:9;:31::i;:::-;29238:297;28536:1010;;28518:1028;29575:1;29563:9;:13;29559:265;;;29593:18;29623:9;29614:6;:18;;;;:::i;:::-;29593:39;;29647:47;29663:4;29677;29684:9;29647:15;:47::i;:::-;29709:37;29725:4;29731:2;29735:10;29709:15;:37::i;:::-;29578:180;29559:265;;;29779:33;29795:4;29801:2;29805:6;29779:15;:33::i;:::-;29559:265;28119:1712;28006:1825;;;:::o;25854:191::-;25928:16;25947:6;;;;;;;;;;;25928:25;;25973:8;25964:6;;:17;;;;;;;;;;;;;;;;;;26028:8;25997:40;;26018:8;25997:40;;;;;;;;;;;;25917:128;25854:191;:::o;21642:443::-;21772:1;21755:19;;:5;:19;;;21751:91;;21827:1;21798:32;;;;;;;;;;;:::i;:::-;;;;;;;;21751:91;21875:1;21856:21;;:7;:21;;;21852:92;;21929:1;21901:31;;;;;;;;;;;:::i;:::-;;;;;;;;21852:92;21984:5;21954:11;:18;21966:5;21954:18;;;;;;;;;;;;;;;:27;21973:7;21954:27;;;;;;;;;;;;;;;:35;;;;22004:9;22000:78;;;22051:7;22035:31;;22044:5;22035:31;;;22060:5;22035:31;;;;;;:::i;:::-;;;;;;;;22000:78;21642:443;;;;:::o;30523:398::-;30597:6;30592:1;30579:10;;:14;;;;:::i;:::-;:24;30575:339;;30636:2;30620:13;:18;;;;30670:2;30653:14;:19;;;;30575:339;;;30712:6;30707:1;30694:10;;:14;;;;:::i;:::-;:24;30690:224;;30751:2;30735:13;:18;;;;30785:2;30768:14;:19;;;;30690:224;;;30827:6;30822:1;30809:10;;:14;;;;:::i;:::-;:24;30805:109;;30866:2;30850:13;:18;;;;30900:2;30883:14;:19;;;;30805:109;30690:224;30575:339;30523:398;:::o;29840:674::-;26988:4;26973:12;;:19;;;;;;;;;;;;;;;;;;29982:21:::1;30020:1;30006:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29982:40;;30051:4;30033;30038:1;30033:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;::::0;::::1;30077:15;;;;;;;;;;;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30067:4;30072:1;30067:7;;;;;;;;:::i;:::-;;;;;;;:32;;;;;;;;;::::0;::::1;30113:122;30144:4;30172:15;;;;;;;;;;;30203:21;30113:8;:122::i;:::-;30275:15;;;;;;;;;;;:66;;;30356:21;30392:1;30436:4;30455:10;;;;;;;;;;;30480:15;30275:231;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;29911:603;27030:5:::0;27015:12;;:20;;;;;;;;;;;;;;;;;;29840:674;:::o;17228:316::-;17336:1;17320:18;;:4;:18;;;17316:88;;17389:1;17362:30;;;;;;;;;;;:::i;:::-;;;;;;;;17316:88;17432:1;17418:16;;:2;:16;;;17414:88;;17487:1;17458:32;;;;;;;;;;;:::i;:::-;;;;;;;;17414:88;17512:24;17520:4;17526:2;17530:5;17512:7;:24::i;:::-;17228:316;;;:::o;17868:1135::-;17974:1;17958:18;;:4;:18;;;17954:552;;18112:5;18096:12;;:21;;;;;;;:::i;:::-;;;;;;;;17954:552;;;18150:19;18172:9;:15;18182:4;18172:15;;;;;;;;;;;;;;;;18150:37;;18220:5;18206:11;:19;18202:117;;;18278:4;18284:11;18297:5;18253:50;;;;;;;;;;;;;:::i;:::-;;;;;;;;18202:117;18474:5;18460:11;:19;18442:9;:15;18452:4;18442:15;;;;;;;;;;;;;;;:37;;;;18135:371;17954:552;18536:1;18522:16;;:2;:16;;;18518:435;;18704:5;18688:12;;:21;;;;;;;;;;;18518:435;;;18921:5;18904:9;:13;18914:2;18904:13;;;;;;;;;;;;;;;;:22;;;;;;;;;;;18518:435;18985:2;18970:25;;18979:4;18970:25;;;18989:5;18970:25;;;;;;:::i;:::-;;;;;;;;17868:1135;;;:::o;7:99:1:-;59:6;93:5;87:12;77:22;;7:99;;;:::o;112:169::-;196:11;230:6;225:3;218:19;270:4;265:3;261:14;246:29;;112:169;;;;:::o;287:246::-;368:1;378:113;392:6;389:1;386:13;378:113;;;477:1;472:3;468:11;462:18;458:1;453:3;449:11;442:39;414:2;411:1;407:10;402:15;;378:113;;;525:1;516:6;511:3;507:16;500:27;349:184;287:246;;;:::o;539:102::-;580:6;631:2;627:7;622:2;615:5;611:14;607:28;597:38;;539:102;;;:::o;647:377::-;735:3;763:39;796:5;763:39;:::i;:::-;818:71;882:6;877:3;818:71;:::i;:::-;811:78;;898:65;956:6;951:3;944:4;937:5;933:16;898:65;:::i;:::-;988:29;1010:6;988:29;:::i;:::-;983:3;979:39;972:46;;739:285;647:377;;;;:::o;1030:313::-;1143:4;1181:2;1170:9;1166:18;1158:26;;1230:9;1224:4;1220:20;1216:1;1205:9;1201:17;1194:47;1258:78;1331:4;1322:6;1258:78;:::i;:::-;1250:86;;1030:313;;;;:::o;1430:117::-;1539:1;1536;1529:12;1676:126;1713:7;1753:42;1746:5;1742:54;1731:65;;1676:126;;;:::o;1808:96::-;1845:7;1874:24;1892:5;1874:24;:::i;:::-;1863:35;;1808:96;;;:::o;1910:122::-;1983:24;2001:5;1983:24;:::i;:::-;1976:5;1973:35;1963:63;;2022:1;2019;2012:12;1963:63;1910:122;:::o;2038:139::-;2084:5;2122:6;2109:20;2100:29;;2138:33;2165:5;2138:33;:::i;:::-;2038:139;;;;:::o;2183:77::-;2220:7;2249:5;2238:16;;2183:77;;;:::o;2266:122::-;2339:24;2357:5;2339:24;:::i;:::-;2332:5;2329:35;2319:63;;2378:1;2375;2368:12;2319:63;2266:122;:::o;2394:139::-;2440:5;2478:6;2465:20;2456:29;;2494:33;2521:5;2494:33;:::i;:::-;2394:139;;;;:::o;2539:474::-;2607:6;2615;2664:2;2652:9;2643:7;2639:23;2635:32;2632:119;;;2670:79;;:::i;:::-;2632:119;2790:1;2815:53;2860:7;2851:6;2840:9;2836:22;2815:53;:::i;:::-;2805:63;;2761:117;2917:2;2943:53;2988:7;2979:6;2968:9;2964:22;2943:53;:::i;:::-;2933:63;;2888:118;2539:474;;;;;:::o;3019:90::-;3053:7;3096:5;3089:13;3082:21;3071:32;;3019:90;;;:::o;3115:109::-;3196:21;3211:5;3196:21;:::i;:::-;3191:3;3184:34;3115:109;;:::o;3230:210::-;3317:4;3355:2;3344:9;3340:18;3332:26;;3368:65;3430:1;3419:9;3415:17;3406:6;3368:65;:::i;:::-;3230:210;;;;:::o;3446:60::-;3474:3;3495:5;3488:12;;3446:60;;;:::o;3512:142::-;3562:9;3595:53;3613:34;3622:24;3640:5;3622:24;:::i;:::-;3613:34;:::i;:::-;3595:53;:::i;:::-;3582:66;;3512:142;;;:::o;3660:126::-;3710:9;3743:37;3774:5;3743:37;:::i;:::-;3730:50;;3660:126;;;:::o;3792:153::-;3869:9;3902:37;3933:5;3902:37;:::i;:::-;3889:50;;3792:153;;;:::o;3951:185::-;4065:64;4123:5;4065:64;:::i;:::-;4060:3;4053:77;3951:185;;:::o;4142:276::-;4262:4;4300:2;4289:9;4285:18;4277:26;;4313:98;4408:1;4397:9;4393:17;4384:6;4313:98;:::i;:::-;4142:276;;;;:::o;4424:118::-;4511:24;4529:5;4511:24;:::i;:::-;4506:3;4499:37;4424:118;;:::o;4548:222::-;4641:4;4679:2;4668:9;4664:18;4656:26;;4692:71;4760:1;4749:9;4745:17;4736:6;4692:71;:::i;:::-;4548:222;;;;:::o;4776:118::-;4863:24;4881:5;4863:24;:::i;:::-;4858:3;4851:37;4776:118;;:::o;4900:222::-;4993:4;5031:2;5020:9;5016:18;5008:26;;5044:71;5112:1;5101:9;5097:17;5088:6;5044:71;:::i;:::-;4900:222;;;;:::o;5128:619::-;5205:6;5213;5221;5270:2;5258:9;5249:7;5245:23;5241:32;5238:119;;;5276:79;;:::i;:::-;5238:119;5396:1;5421:53;5466:7;5457:6;5446:9;5442:22;5421:53;:::i;:::-;5411:63;;5367:117;5523:2;5549:53;5594:7;5585:6;5574:9;5570:22;5549:53;:::i;:::-;5539:63;;5494:118;5651:2;5677:53;5722:7;5713:6;5702:9;5698:22;5677:53;:::i;:::-;5667:63;;5622:118;5128:619;;;;;:::o;5753:116::-;5823:21;5838:5;5823:21;:::i;:::-;5816:5;5813:32;5803:60;;5859:1;5856;5849:12;5803:60;5753:116;:::o;5875:133::-;5918:5;5956:6;5943:20;5934:29;;5972:30;5996:5;5972:30;:::i;:::-;5875:133;;;;:::o;6014:323::-;6070:6;6119:2;6107:9;6098:7;6094:23;6090:32;6087:119;;;6125:79;;:::i;:::-;6087:119;6245:1;6270:50;6312:7;6303:6;6292:9;6288:22;6270:50;:::i;:::-;6260:60;;6216:114;6014:323;;;;:::o;6343:86::-;6378:7;6418:4;6411:5;6407:16;6396:27;;6343:86;;;:::o;6435:112::-;6518:22;6534:5;6518:22;:::i;:::-;6513:3;6506:35;6435:112;;:::o;6553:214::-;6642:4;6680:2;6669:9;6665:18;6657:26;;6693:67;6757:1;6746:9;6742:17;6733:6;6693:67;:::i;:::-;6553:214;;;;:::o;6773:329::-;6832:6;6881:2;6869:9;6860:7;6856:23;6852:32;6849:119;;;6887:79;;:::i;:::-;6849:119;7007:1;7032:53;7077:7;7068:6;7057:9;7053:22;7032:53;:::i;:::-;7022:63;;6978:117;6773:329;;;;:::o;7108:::-;7167:6;7216:2;7204:9;7195:7;7191:23;7187:32;7184:119;;;7222:79;;:::i;:::-;7184:119;7342:1;7367:53;7412:7;7403:6;7392:9;7388:22;7367:53;:::i;:::-;7357:63;;7313:117;7108:329;;;;:::o;7443:468::-;7508:6;7516;7565:2;7553:9;7544:7;7540:23;7536:32;7533:119;;;7571:79;;:::i;:::-;7533:119;7691:1;7716:53;7761:7;7752:6;7741:9;7737:22;7716:53;:::i;:::-;7706:63;;7662:117;7818:2;7844:50;7886:7;7877:6;7866:9;7862:22;7844:50;:::i;:::-;7834:60;;7789:115;7443:468;;;;;:::o;7917:474::-;7985:6;7993;8042:2;8030:9;8021:7;8017:23;8013:32;8010:119;;;8048:79;;:::i;:::-;8010:119;8168:1;8193:53;8238:7;8229:6;8218:9;8214:22;8193:53;:::i;:::-;8183:63;;8139:117;8295:2;8321:53;8366:7;8357:6;8346:9;8342:22;8321:53;:::i;:::-;8311:63;;8266:118;7917:474;;;;;:::o;8397:::-;8465:6;8473;8522:2;8510:9;8501:7;8497:23;8493:32;8490:119;;;8528:79;;:::i;:::-;8490:119;8648:1;8673:53;8718:7;8709:6;8698:9;8694:22;8673:53;:::i;:::-;8663:63;;8619:117;8775:2;8801:53;8846:7;8837:6;8826:9;8822:22;8801:53;:::i;:::-;8791:63;;8746:118;8397:474;;;;;:::o;8877:180::-;8925:77;8922:1;8915:88;9022:4;9019:1;9012:15;9046:4;9043:1;9036:15;9063:320;9107:6;9144:1;9138:4;9134:12;9124:22;;9191:1;9185:4;9181:12;9212:18;9202:81;;9268:4;9260:6;9256:17;9246:27;;9202:81;9330:2;9322:6;9319:14;9299:18;9296:38;9293:84;;9349:18;;:::i;:::-;9293:84;9114:269;9063:320;;;:::o;9389:168::-;9529:20;9525:1;9517:6;9513:14;9506:44;9389:168;:::o;9563:366::-;9705:3;9726:67;9790:2;9785:3;9726:67;:::i;:::-;9719:74;;9802:93;9891:3;9802:93;:::i;:::-;9920:2;9915:3;9911:12;9904:19;;9563:366;;;:::o;9935:419::-;10101:4;10139:2;10128:9;10124:18;10116:26;;10188:9;10182:4;10178:20;10174:1;10163:9;10159:17;10152:47;10216:131;10342:4;10216:131;:::i;:::-;10208:139;;9935:419;;;:::o;10360:168::-;10500:20;10496:1;10488:6;10484:14;10477:44;10360:168;:::o;10534:366::-;10676:3;10697:67;10761:2;10756:3;10697:67;:::i;:::-;10690:74;;10773:93;10862:3;10773:93;:::i;:::-;10891:2;10886:3;10882:12;10875:19;;10534:366;;;:::o;10906:419::-;11072:4;11110:2;11099:9;11095:18;11087:26;;11159:9;11153:4;11149:20;11145:1;11134:9;11130:17;11123:47;11187:131;11313:4;11187:131;:::i;:::-;11179:139;;10906:419;;;:::o;11331:175::-;11471:27;11467:1;11459:6;11455:14;11448:51;11331:175;:::o;11512:366::-;11654:3;11675:67;11739:2;11734:3;11675:67;:::i;:::-;11668:74;;11751:93;11840:3;11751:93;:::i;:::-;11869:2;11864:3;11860:12;11853:19;;11512:366;;;:::o;11884:419::-;12050:4;12088:2;12077:9;12073:18;12065:26;;12137:9;12131:4;12127:20;12123:1;12112:9;12108:17;12101:47;12165:131;12291:4;12165:131;:::i;:::-;12157:139;;11884:419;;;:::o;12309:442::-;12458:4;12496:2;12485:9;12481:18;12473:26;;12509:71;12577:1;12566:9;12562:17;12553:6;12509:71;:::i;:::-;12590:72;12658:2;12647:9;12643:18;12634:6;12590:72;:::i;:::-;12672;12740:2;12729:9;12725:18;12716:6;12672:72;:::i;:::-;12309:442;;;;;;:::o;12757:224::-;12897:34;12893:1;12885:6;12881:14;12874:58;12966:7;12961:2;12953:6;12949:15;12942:32;12757:224;:::o;12987:366::-;13129:3;13150:67;13214:2;13209:3;13150:67;:::i;:::-;13143:74;;13226:93;13315:3;13226:93;:::i;:::-;13344:2;13339:3;13335:12;13328:19;;12987:366;;;:::o;13359:419::-;13525:4;13563:2;13552:9;13548:18;13540:26;;13612:9;13606:4;13602:20;13598:1;13587:9;13583:17;13576:47;13640:131;13766:4;13640:131;:::i;:::-;13632:139;;13359:419;;;:::o;13784:222::-;13924:34;13920:1;13912:6;13908:14;13901:58;13993:5;13988:2;13980:6;13976:15;13969:30;13784:222;:::o;14012:366::-;14154:3;14175:67;14239:2;14234:3;14175:67;:::i;:::-;14168:74;;14251:93;14340:3;14251:93;:::i;:::-;14369:2;14364:3;14360:12;14353:19;;14012:366;;;:::o;14384:419::-;14550:4;14588:2;14577:9;14573:18;14565:26;;14637:9;14631:4;14627:20;14623:1;14612:9;14608:17;14601:47;14665:131;14791:4;14665:131;:::i;:::-;14657:139;;14384:419;;;:::o;14809:225::-;14949:34;14945:1;14937:6;14933:14;14926:58;15018:8;15013:2;15005:6;15001:15;14994:33;14809:225;:::o;15040:366::-;15182:3;15203:67;15267:2;15262:3;15203:67;:::i;:::-;15196:74;;15279:93;15368:3;15279:93;:::i;:::-;15397:2;15392:3;15388:12;15381:19;;15040:366;;;:::o;15412:419::-;15578:4;15616:2;15605:9;15601:18;15593:26;;15665:9;15659:4;15655:20;15651:1;15640:9;15636:17;15629:47;15693:131;15819:4;15693:131;:::i;:::-;15685:139;;15412:419;;;:::o;15837:172::-;15977:24;15973:1;15965:6;15961:14;15954:48;15837:172;:::o;16015:366::-;16157:3;16178:67;16242:2;16237:3;16178:67;:::i;:::-;16171:74;;16254:93;16343:3;16254:93;:::i;:::-;16372:2;16367:3;16363:12;16356:19;;16015:366;;;:::o;16387:419::-;16553:4;16591:2;16580:9;16576:18;16568:26;;16640:9;16634:4;16630:20;16626:1;16615:9;16611:17;16604:47;16668:131;16794:4;16668:131;:::i;:::-;16660:139;;16387:419;;;:::o;16812:180::-;16860:77;16857:1;16850:88;16957:4;16954:1;16947:15;16981:4;16978:1;16971:15;16998:410;17038:7;17061:20;17079:1;17061:20;:::i;:::-;17056:25;;17095:20;17113:1;17095:20;:::i;:::-;17090:25;;17150:1;17147;17143:9;17172:30;17190:11;17172:30;:::i;:::-;17161:41;;17351:1;17342:7;17338:15;17335:1;17332:22;17312:1;17305:9;17285:83;17262:139;;17381:18;;:::i;:::-;17262:139;17046:362;16998:410;;;;:::o;17414:180::-;17462:77;17459:1;17452:88;17559:4;17556:1;17549:15;17583:4;17580:1;17573:15;17600:185;17640:1;17657:20;17675:1;17657:20;:::i;:::-;17652:25;;17691:20;17709:1;17691:20;:::i;:::-;17686:25;;17730:1;17720:35;;17735:18;;:::i;:::-;17720:35;17777:1;17774;17770:9;17765:14;;17600:185;;;;:::o;17791:233::-;17830:3;17853:24;17871:5;17853:24;:::i;:::-;17844:33;;17899:66;17892:5;17889:77;17886:103;;17969:18;;:::i;:::-;17886:103;18016:1;18009:5;18005:13;17998:20;;17791:233;;;:::o;18030:194::-;18070:4;18090:20;18108:1;18090:20;:::i;:::-;18085:25;;18124:20;18142:1;18124:20;:::i;:::-;18119:25;;18168:1;18165;18161:9;18153:17;;18192:1;18186:4;18183:11;18180:37;;;18197:18;;:::i;:::-;18180:37;18030:194;;;;:::o;18230:191::-;18270:3;18289:20;18307:1;18289:20;:::i;:::-;18284:25;;18323:20;18341:1;18323:20;:::i;:::-;18318:25;;18366:1;18363;18359:9;18352:16;;18387:3;18384:1;18381:10;18378:36;;;18394:18;;:::i;:::-;18378:36;18230:191;;;;:::o;18427:180::-;18475:77;18472:1;18465:88;18572:4;18569:1;18562:15;18596:4;18593:1;18586:15;18613:180;18661:77;18658:1;18651:88;18758:4;18755:1;18748:15;18782:4;18779:1;18772:15;18799:143;18856:5;18887:6;18881:13;18872:22;;18903:33;18930:5;18903:33;:::i;:::-;18799:143;;;;:::o;18948:351::-;19018:6;19067:2;19055:9;19046:7;19042:23;19038:32;19035:119;;;19073:79;;:::i;:::-;19035:119;19193:1;19218:64;19274:7;19265:6;19254:9;19250:22;19218:64;:::i;:::-;19208:74;;19164:128;18948:351;;;;:::o;19305:85::-;19350:7;19379:5;19368:16;;19305:85;;;:::o;19396:158::-;19454:9;19487:61;19505:42;19514:32;19540:5;19514:32;:::i;:::-;19505:42;:::i;:::-;19487:61;:::i;:::-;19474:74;;19396:158;;;:::o;19560:147::-;19655:45;19694:5;19655:45;:::i;:::-;19650:3;19643:58;19560:147;;:::o;19713:114::-;19780:6;19814:5;19808:12;19798:22;;19713:114;;;:::o;19833:184::-;19932:11;19966:6;19961:3;19954:19;20006:4;20001:3;19997:14;19982:29;;19833:184;;;;:::o;20023:132::-;20090:4;20113:3;20105:11;;20143:4;20138:3;20134:14;20126:22;;20023:132;;;:::o;20161:108::-;20238:24;20256:5;20238:24;:::i;:::-;20233:3;20226:37;20161:108;;:::o;20275:179::-;20344:10;20365:46;20407:3;20399:6;20365:46;:::i;:::-;20443:4;20438:3;20434:14;20420:28;;20275:179;;;;:::o;20460:113::-;20530:4;20562;20557:3;20553:14;20545:22;;20460:113;;;:::o;20609:732::-;20728:3;20757:54;20805:5;20757:54;:::i;:::-;20827:86;20906:6;20901:3;20827:86;:::i;:::-;20820:93;;20937:56;20987:5;20937:56;:::i;:::-;21016:7;21047:1;21032:284;21057:6;21054:1;21051:13;21032:284;;;21133:6;21127:13;21160:63;21219:3;21204:13;21160:63;:::i;:::-;21153:70;;21246:60;21299:6;21246:60;:::i;:::-;21236:70;;21092:224;21079:1;21076;21072:9;21067:14;;21032:284;;;21036:14;21332:3;21325:10;;20733:608;;;20609:732;;;;:::o;21347:831::-;21610:4;21648:3;21637:9;21633:19;21625:27;;21662:71;21730:1;21719:9;21715:17;21706:6;21662:71;:::i;:::-;21743:80;21819:2;21808:9;21804:18;21795:6;21743:80;:::i;:::-;21870:9;21864:4;21860:20;21855:2;21844:9;21840:18;21833:48;21898:108;22001:4;21992:6;21898:108;:::i;:::-;21890:116;;22016:72;22084:2;22073:9;22069:18;22060:6;22016:72;:::i;:::-;22098:73;22166:3;22155:9;22151:19;22142:6;22098:73;:::i;:::-;21347:831;;;;;;;;:::o

Swarm Source

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