ETH Price: $2,417.53 (-1.25%)

Token

SaasNode (SAAS)
 

Overview

Max Total Supply

1,000,000,000 SAAS

Holders

9

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
54,686,590.3765653405525724 SAAS

Value
$0.00
0x6d01af8711133dee2b2edfc54dc6ce38223f8396
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:
saasnodeprotocol

Compiler Version
v0.8.14+commit.80d49f37

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT

//Twitter: https://twitter.com/SAASNode

//Whitepaper: https://drive.google.com/file/d/1ZcCYG4Jic8cTpV9oUJaeSo23cVwkLXJH/view

//Website: https://thesaasnode.com/

//Telegranm: http://t.me/SAASNode

// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&*#%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&#.,(.*&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%*..,(...(@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&(....,(....,&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&,.....,(......(&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&(.......,(........%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@%.........,(.........(&@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@&/..........,(...........%@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@#,...........,(............*&@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@&,.............,(..............%@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@#,..............,(...............*&@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@&*................,(.................(@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@(..................,(..................,&@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@&*...................,(....................(&@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@&(.....................,(......................%@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@%.......................,(......................./&@@@@@@@@@@@@@@
// @@@@@@@@@@@@@&/........................,(........................,%@@@@@@@@@@@@@
// @@@@@@@@@@@&%,.........................,(........................../&@@@@@@@@@@@
// @@@@@@@@@@&*.......................*/((*#*((*........................#@@@@@@@@@@
// @@@@@@@@@%....................*%(*******#,,,,,,*%(....................*&@@@@@@@@
// @@@@@@@&*...............*#(/************#,,,,,,,,,,,*/((................#@@@@@@@
// @@@@@@(...........,/#(******************#,,,,,,,,,,,,,,,,,*#(,...........,&@@@@@
// @@@@%,.......*%(/***********************#,,,,,,,,,,,,,,,,,,,,,,,*#(........#@@@@
// @@&(...*(#(*****************************#,,,,,,,,,,,,,,,,,,,,,,,,,,,,*((*...,%@@
// @%/#(***********************************#,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*#(#@
// @@&#/***********************************#,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,(%@@
// @@@@@@&%(*******************************#,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*#&@@@@@@
// @@@@@@@@@@@&#***************************#,,,,,,,,,,,,,,,,,,,,,,,,,,/%&@@@@@@@@@@
// @&&%@@@@@@@@@@@&#/**********************#,,,,,,,,,,,,,,,,,,,,,*(&@@@@@@@@@@@&%&@
// @@@&/.*%&@@@@@@@@@@&&(******************#,,,,,,,,,,,,,,,,,*%&@@@@@@@@@@&&(,,%@@@
// @@@@@%*...,(&&@@@@@@@@@@&#/*************#,,,,,,,,,,,,,/%&@@@@@@@@@@&%/,,,,#@@@@@
// @@@@@@@%,......(%&@@@@@@@@@@&%/*********#,,,,,,,,*(&&@@@@@@@@@@&#*,,,,,,(&@@@@@@
// @@@@@@@@@%........,*%&@@@@@@@@@@@&(*****#,,,,/%&@@@@@@@@@@@&(*,,,,,,,,(&@@@@@@@@
// @@@@@@@@@@&(...........*#&@@@@@@@@@@@&#/#(%@@@@@@@@@@@&%(,,,,,,,,,,,/&@@@@@@@@@@
// @@@@@@@@@@@@&/..............(&@@@@@@@@@@@@@@@@@@@@&%*,,,,,,,,,,,,,,%@@@@@@@@@@@@
// @@@@@@@@@@@@@@&*...............,/%&@@@@@@@@@@@&#*,,,,,,,,,,,,,,,,#@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@&,..................*%&@@@%(,,,,,,,,,,,,,,,,,,,(&@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@%....................,#,,,,,,,,,,,,,,,,,,,,/&@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@&(..................,#,,,,,,,,,,,,,,,,,,*&@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@&/................,#,,,,,,,,,,,,,,,,,%@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@&*..............,#,,,,,,,,,,,,,,,#@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@%,............,#,,,,,,,,,,,,,(&@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@#...........,#,,,,,,,,,,,/&@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@&(.........,#,,,,,,,,,*&@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&/.......,#,,,,,,,,%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&*.....,#,,,,,,#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%,...,#,,,,(@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#..,#,,/&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&(,#*&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@


pragma solidity ^0.8.14;

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

////// lib/openzeppelin-contracts/contracts/access/Ownable.sol
// OpenZeppelin Contracts v4.4.0 (access/Ownable.sol)

/* pragma solidity ^0.8.0; */

/* import "../utils/Context.sol"; */

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

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

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

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

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

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

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

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

////// lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol
// OpenZeppelin Contracts v4.4.0 (token/ERC20/IERC20.sol)

/* pragma solidity ^0.8.0; */

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

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

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

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

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

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

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

////// lib/openzeppelin-contracts/contracts/token/ERC20/extensions/IERC20Metadata.sol
// OpenZeppelin Contracts v4.4.0 (token/ERC20/extensions/IERC20Metadata.sol)

/* pragma solidity ^0.8.0; */

/* import "../IERC20.sol"; */

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

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

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

////// lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol
// OpenZeppelin Contracts v4.4.0 (token/ERC20/ERC20.sol)

/* pragma solidity ^0.8.0; */

/* import "./IERC20.sol"; */
/* import "./extensions/IERC20Metadata.sol"; */
/* import "../../utils/Context.sol"; */

/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * We have followed general OpenZeppelin Contracts guidelines: functions revert
 * instead returning `false` on failure. This behavior is nonetheless
 * conventional and does not conflict with the expectations of ERC20
 * applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

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

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

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

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

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

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

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `recipient` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

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

    /**
     * @dev See {IERC20-approve}.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * Requirements:
     *
     * - `sender` and `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     * - the caller must have allowance for ``sender``'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);

        uint256 currentAllowance = _allowances[sender][_msgSender()];
        require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance");
        unchecked {
            _approve(sender, _msgSender(), currentAllowance - amount);
        }

        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue);
        return true;
    }

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

        return true;
    }

    /**
     * @dev Moves `amount` of tokens from `sender` to `recipient`.
     *
     * This internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `sender` cannot be the zero address.
     * - `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     */
    function _transfer(
        address sender,
        address recipient,
        uint256 amount
    ) internal virtual {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(sender, recipient, amount);

        uint256 senderBalance = _balances[sender];
        require(senderBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[sender] = senderBalance - amount;
        }
        _balances[recipient] += amount;

        emit Transfer(sender, recipient, amount);

        _afterTokenTransfer(sender, recipient, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

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

        _totalSupply += amount;
        _balances[account] += amount;
        emit Transfer(address(0), account, amount);

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

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

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

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

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

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

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

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

    /**
     * @dev Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be transferred to `to`.
     * - when `from` is zero, `amount` tokens will be minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * has been transferred to `to`.
     * - when `from` is zero, `amount` tokens have been minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens have been burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}
}

////// lib/openzeppelin-contracts/contracts/utils/math/SafeMath.sol
// OpenZeppelin Contracts v4.4.0 (utils/math/SafeMath.sol)

/* pragma solidity ^0.8.0; */

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

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

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

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

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

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

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

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

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

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

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

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

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

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

////// src/IUniswapV2Factory.sol
/* pragma solidity 0.8.10; */
/* pragma experimental ABIEncoderV2; */

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

    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(uint256) external view returns (address pair);

    function allPairsLength() external view returns (uint256);

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

    function setFeeTo(address) external;

    function setFeeToSetter(address) external;
}

////// src/IUniswapV2Pair.sol
/* pragma solidity 0.8.10; */
/* pragma experimental ABIEncoderV2; */

interface IUniswapV2Pair {
    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 value
    );
    event Transfer(address indexed from, address indexed to, uint256 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 (uint256);

    function balanceOf(address owner) external view returns (uint256);

    function allowance(address owner, address spender)
        external
        view
        returns (uint256);

    function approve(address spender, uint256 value) external returns (bool);

    function transfer(address to, uint256 value) external returns (bool);

    function transferFrom(
        address from,
        address to,
        uint256 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 (uint256);

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

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

    function MINIMUM_LIQUIDITY() external pure returns (uint256);

    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 (uint256);

    function price1CumulativeLast() external view returns (uint256);

    function kLast() external view returns (uint256);

    function mint(address to) external returns (uint256 liquidity);

    function burn(address to)
        external
        returns (uint256 amount0, uint256 amount1);

    function swap(
        uint256 amount0Out,
        uint256 amount1Out,
        address to,
        bytes calldata data
    ) external;

    function skim(address to) external;

    function sync() external;

    function initialize(address, address) external;
}

////// src/IUniswapV2Router02.sol
/* pragma solidity 0.8.10; */
/* pragma experimental ABIEncoderV2; */

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

    function WETH() external pure returns (address);

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint256 amountADesired,
        uint256 amountBDesired,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    )
        external
        returns (
            uint256 amountA,
            uint256 amountB,
            uint256 liquidity
        );

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

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

    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable;

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

contract saasnodeprotocol is ERC20, Ownable {
    using SafeMath for uint256;

    modifier lockSwap() {
        _inSwap = true;
        _;
        _inSwap = false;
    }

    modifier liquidityAdd() {
        _inLiquidityAdd = true;
        _;
        _inLiquidityAdd = false;
    }

    // == CONSTANTS ==
    uint256 public constant MAX_SUPPLY = 1_000_000_000 ether;
    uint256 public constant BPS_DENOMINATOR = 10_000;
    uint256 public constant SNIPE_BLOCKS = 2;

    // == TAXES ==
    /// @notice Buy devTax in BPS
    uint256 public buyDevTax = 200;
    /// @notice Buy rewardsTax in BPS
    uint256 public buyRewardsTax = 700;
    /// @notice Sell devTax in BPS
    uint256 public sellDevTax = 200;
    /// @notice Sell rewardsTax in BPS
    uint256 public sellRewardsTax = 700;
    /// @notice address that devTax is sent to
    address payable public devTaxRecipient;
    /// @notice address that rewardsTax is sent to
    address payable public rewardsTaxRecipient;
    /// @notice tokens currently allocated for devTax
    uint256 public totalDevTax;
    /// @notice tokens currently allocated for rewardsTax
    uint256 public totalRewardsTax;

    // == FLAGS ==
    /// @notice flag indicating whether initialDistribute() was successfully called
    bool public initialDistributeDone = false;
    /// @notice flag indicating Uniswap trading status
    bool public tradingActive = false;
    /// @notice flag indicating token to token transfers
    bool public transfersActive = false;
    /// @notice flag indicating swapAll enabled
    bool public swapFees = true;

    // == UNISWAP ==
    IUniswapV2Router02 public router;
    address public pair;

    // == WALLET STATUSES ==
    /// @notice Maps each recipient to their tax exlcusion status
    mapping(address => bool) public taxExcluded;
    /// @notice Maps each recipient to the last timestamp they bought
    mapping(address => uint256) public lastBuy;
    /// @notice Maps each recipient to their blacklist status
    mapping(address => bool) public blacklist;
    /// @notice Maps each recipient to their whitelist status on buy limit
    mapping(address => bool) public recipientLimitWhitelist;

    // == MISC ==
    /// @notice Block when trading is first enabled
    uint256 public tradingBlock;
    /// @notice Contract token balance threshold before `_swap` is invoked
    uint256 public minTokenBalance = 1000 ether;

    // == INTERNAL ==
    uint256 internal _totalSupply = 0;
    bool internal _inSwap = false;
    bool internal _inLiquidityAdd = false;
    mapping(address => uint256) private _balances;

    event DevTaxRecipientChanged(
        address previousRecipient,
        address nextRecipient
    );
    event RewardsTaxRecipientChanged(
        address previousRecipient,
        address nextRecipient
    );
    event BuyDevTaxChanged(uint256 previousTax, uint256 nextTax);
    event SellDevTaxChanged(uint256 previousTax, uint256 nextTax);
    event BuyRewardsTaxChanged(uint256 previousTax, uint256 nextTax);
    event SellRewardsTaxChanged(uint256 previousTax, uint256 nextTax);
    event DevTaxRescued(uint256 amount);
    event RewardsTaxRescued(uint256 amount);
    event TradingActiveChanged(bool enabled);
    event TaxExclusionChanged(address user, bool taxExcluded);
    event BlacklistUpdated(address user, bool previousStatus, bool nextStatus);
    event SwapFeesChanged(bool previousStatus, bool nextStatus);

    constructor(
        address payable _devTaxRecipient,
        address payable _rewardsTaxRecipient
    ) ERC20("SaasNode", "SAAS") Ownable() {
        taxExcluded[owner()] = true;
        taxExcluded[address(0)] = true;
        taxExcluded[_devTaxRecipient] = true;
        taxExcluded[_rewardsTaxRecipient] = true;
        taxExcluded[address(this)] = true;

        devTaxRecipient = _devTaxRecipient;
        rewardsTaxRecipient = _rewardsTaxRecipient;

        router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
        pair = IUniswapV2Factory(router.factory()).createPair(address(this), router.WETH());

        _mint(msg.sender, MAX_SUPPLY);
    }

    function addLiquidity(uint256 tokens)
        external
        payable
        onlyOwner
        liquidityAdd
    {
        _rawTransfer(msg.sender, address(this), tokens);
        _approve(address(this), address(router), tokens);

        router.addLiquidityETH{value: msg.value}(
            address(this),
            tokens,
            0,
            0,
            owner(),
            // solhint-disable-next-line not-rely-on-time
            block.timestamp
        );
    }

    /// @notice Change the address of the devTax recipient
    /// @param _devTaxRecipient The new address of the devTax recipient
    function setDevTaxRecipient(address payable _devTaxRecipient)
        external
        onlyOwner
    {
        emit DevTaxRecipientChanged(devTaxRecipient, _devTaxRecipient);
        devTaxRecipient = _devTaxRecipient;
    }

    /// @notice Change the address of the rewardTax recipient
    /// @param _rewardsTaxRecipient The new address of the rewardTax recipient
    function setRewardsTaxRecipient(address payable _rewardsTaxRecipient)
        external
        onlyOwner
    {
        emit RewardsTaxRecipientChanged(
            rewardsTaxRecipient,
            _rewardsTaxRecipient
        );
        rewardsTaxRecipient = _rewardsTaxRecipient;
    }

    /// @notice Change the buy devTax rate
    /// @param _buyDevTax The new devTax rate
    function setBuyDevTax(uint256 _buyDevTax) external onlyOwner {
        require(
            _buyDevTax <= BPS_DENOMINATOR,
            "_buyDevTax cannot exceed BPS_DENOMINATOR"
        );
        emit BuyDevTaxChanged(buyDevTax, _buyDevTax);
        buyDevTax = _buyDevTax;
    }

    /// @notice Change the buy devTax rate
    /// @param _sellDevTax The new devTax rate
    function setSellDevTax(uint256 _sellDevTax) external onlyOwner {
        require(
            _sellDevTax <= BPS_DENOMINATOR,
            "_sellDevTax cannot exceed BPS_DENOMINATOR"
        );
        emit SellDevTaxChanged(sellDevTax, _sellDevTax);
        sellDevTax = _sellDevTax;
    }

    /// @notice Change the buy rewardsTax rate
    /// @param _buyRewardsTax The new buy rewardsTax rate
    function setBuyRewardsTax(uint256 _buyRewardsTax) external onlyOwner {
        require(
            _buyRewardsTax <= BPS_DENOMINATOR,
            "_buyRewardsTax cannot exceed BPS_DENOMINATOR"
        );
        emit BuyRewardsTaxChanged(buyRewardsTax, _buyRewardsTax);
        buyRewardsTax = _buyRewardsTax;
    }

    /// @notice Change the sell rewardsTax rate
    /// @param _sellRewardsTax The new sell rewardsTax rate
    function setSellRewardsTax(uint256 _sellRewardsTax) external onlyOwner {
        require(
            _sellRewardsTax <= BPS_DENOMINATOR,
            "_sellRewardsTax cannot exceed BPS_DENOMINATOR"
        );
        emit SellRewardsTaxChanged(sellRewardsTax, _sellRewardsTax);
        sellRewardsTax = _sellRewardsTax;
    }

    /// @notice Rescue ATI from the devTax amount
    /// @dev Should only be used in an emergency
    /// @param _amount The amount of ATI to rescue
    /// @param _recipient The recipient of the rescued ATI
    function rescueDevTaxTokens(uint256 _amount, address _recipient)
        external
        onlyOwner
    {
        require(
            _amount <= totalDevTax,
            "Amount cannot be greater than totalDevTax"
        );
        _rawTransfer(address(this), _recipient, _amount);
        emit DevTaxRescued(_amount);
        totalDevTax -= _amount;
    }

    /// @notice Rescue ATI from the rewardsTax amount
    /// @dev Should only be used in an emergency
    /// @param _amount The amount of ATI to rescue
    /// @param _recipient The recipient of the rescued ATI
    function rescueRewardsTaxTokens(uint256 _amount, address _recipient)
        external
        onlyOwner
    {
        require(
            _amount <= totalRewardsTax,
            "Amount cannot be greater than totalRewardsTax"
        );
        _rawTransfer(address(this), _recipient, _amount);
        emit RewardsTaxRescued(_amount);
        totalRewardsTax -= _amount;
    }

    /// @notice Admin function to update a recipient's blacklist status
    /// @param user the recipient
    /// @param status the new status
    function updateBlacklist(address user, bool status)
        external
        virtual
        onlyOwner
    {
        _updateBlacklist(user, status);
    }

    function _updateBlacklist(address user, bool status) internal virtual {
        emit BlacklistUpdated(user, blacklist[user], status);
        blacklist[user] = status;
    }

    /// @notice Enables trading on Uniswap
    function enableTrading() external onlyOwner {
        tradingActive = true;
    }

    /// @notice Disables trading on Uniswap
    function disableTrading() external onlyOwner {
        tradingActive = false;
    }

    /// @notice Enables token to token transfers
    function enableTransfers() external onlyOwner {
        transfersActive = true;
    }

    /// @notice Disables token to token transfers
    function disableTransfers() external onlyOwner {
        transfersActive = false;
    }

    /// @notice Updates tax exclusion status
    /// @param _account Account to update the tax exclusion status of
    /// @param _taxExcluded If true, exclude taxes for this user
    function setTaxExcluded(address _account, bool _taxExcluded)
        public
        onlyOwner
    {
        taxExcluded[_account] = _taxExcluded;
        emit TaxExclusionChanged(_account, _taxExcluded);
    }

    /// @notice Enable or disable whether swap occurs during `_transfer`
    /// @param _swapFees If true, enables swap during `_transfer`
    function setSwapFees(bool _swapFees) external onlyOwner {
        emit SwapFeesChanged(swapFees, _swapFees);
        swapFees = _swapFees;
    }

    function balanceOf(address account)
        public
        view
        virtual
        override
        returns (uint256)
    {
        return _balances[account];
    }

    function _addBalance(address account, uint256 amount) internal {
        _balances[account] = _balances[account] + amount;
    }

    function _subtractBalance(address account, uint256 amount) internal {
        _balances[account] = _balances[account] - amount;
    }

    function _transfer(
        address sender,
        address recipient,
        uint256 amount
    ) internal override {
        require(!blacklist[recipient], "Recipient is blacklisted");

        if (taxExcluded[sender] || taxExcluded[recipient]) {
            _rawTransfer(sender, recipient, amount);
            return;
        }

        bool overMinTokenBalance = balanceOf(address(this)) >= minTokenBalance;
        if (overMinTokenBalance && !_inSwap && sender != pair && swapFees) {
            swapAll();
        }

        uint256 send = amount;
        uint256 devTax;
        uint256 rewardsTax;
        if (sender == pair) {
            require(tradingActive, "Trading is not yet active");
            if (block.number <= tradingBlock + SNIPE_BLOCKS) {
                _updateBlacklist(recipient, true);
            }
            (send, devTax, rewardsTax) = _getTaxAmounts(amount, true);
        } else if (recipient == pair) {
            require(tradingActive, "Trading is not yet active");
            (send, devTax, rewardsTax) = _getTaxAmounts(amount, false);
        } else {
            require(transfersActive, "Transfers are not yet active");
        }
        _rawTransfer(sender, recipient, send);
        _takeTaxes(sender, devTax, rewardsTax);
    }

    /// @notice Peforms auto liquidity and tax distribution
    function swapAll() public {
        if (!_inSwap) {
            _swap(balanceOf(address(this)));
        }
    }

    /// @notice Perform a Uniswap v2 swap from token to ETH and handle tax distribution
    /// @param amount The amount of token to swap in wei
    /// @dev `amount` is always <= this contract's ETH balance.
    function _swap(uint256 amount) internal lockSwap {
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = router.WETH();

        _approve(address(this), address(router), amount);

        uint256 contractEthBalance = address(this).balance;

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

        uint256 tradeValue = address(this).balance - contractEthBalance;

        uint256 totalTaxes = totalDevTax.add(totalRewardsTax);
        uint256 devAmount = amount.mul(totalDevTax).div(totalTaxes);
        uint256 rewardsAmount = amount.mul(totalRewardsTax).div(totalTaxes);

        uint256 devEth = tradeValue.mul(totalDevTax).div(totalTaxes);
        uint256 rewardsEth = tradeValue.mul(totalRewardsTax).div(totalTaxes);

        // Update state
        totalDevTax = totalDevTax.sub(devAmount);
        totalRewardsTax = totalRewardsTax.sub(rewardsAmount);

        // Do transfer
        if (devEth > 0) {
            devTaxRecipient.transfer(devEth);
        }
        if (rewardsEth > 0) {
            rewardsTaxRecipient.transfer(rewardsEth);
        }
    }

    /// @notice Change the minimum contract ACAP balance before `_swap` gets invoked
    /// @param _minTokenBalance The new minimum balance
    function setMinTokenBalance(uint256 _minTokenBalance) external onlyOwner {
        minTokenBalance = _minTokenBalance;
    }

    /// @notice Admin function to rescue ETH from the contract
    function rescueETH() external onlyOwner {
        payable(owner()).transfer(address(this).balance);
    }

    /// @notice Transfers ATI from an account to this contract for taxes
    /// @param _account The account to transfer ATI from
    /// @param _devTaxAmount The amount of devTax tax to transfer
    function _takeTaxes(
        address _account,
        uint256 _devTaxAmount,
        uint256 _rewardsTaxAmount
    ) internal {
        require(_account != address(0), "taxation from the zero address");

        uint256 totalAmount = _devTaxAmount.add(_rewardsTaxAmount);
        _rawTransfer(_account, address(this), totalAmount);
        totalDevTax += _devTaxAmount;
        totalRewardsTax += _rewardsTaxAmount;
    }

    /// @notice Get a breakdown of send and tax amounts
    /// @param amount The amount to tax in wei
    /// @return send The raw amount to send
    /// @return devTax The raw devTax tax amount
    function _getTaxAmounts(uint256 amount, bool buying)
        internal
        view
        returns (
            uint256 send,
            uint256 devTax,
            uint256 rewardsTax
        )
    {
        if (buying) {
            devTax = amount.mul(buyDevTax).div(BPS_DENOMINATOR);
            rewardsTax = amount.mul(buyRewardsTax).div(BPS_DENOMINATOR);
        } else {
            devTax = amount.mul(sellDevTax).div(BPS_DENOMINATOR);
            rewardsTax = amount.mul(sellRewardsTax).div(BPS_DENOMINATOR);
        }
        send = amount.sub(devTax).sub(rewardsTax);
    }

    // modified from OpenZeppelin ERC20
    function _rawTransfer(
        address sender,
        address recipient,
        uint256 amount
    ) internal {
        require(sender != address(0), "transfer from the zero address");
        require(recipient != address(0), "transfer to the zero address");

        uint256 senderBalance = balanceOf(sender);
        require(senderBalance >= amount, "transfer amount exceeds balance");
        unchecked {
            _subtractBalance(sender, amount);
        }
        _addBalance(recipient, amount);

        emit Transfer(sender, recipient, amount);
    }

    function totalSupply() public view override returns (uint256) {
        return _totalSupply;
    }

    function _mint(address account, uint256 amount) internal override {
        require(_totalSupply.add(amount) <= MAX_SUPPLY, "Max supply exceeded");
        _totalSupply += amount;
        _addBalance(account, amount);
        emit Transfer(address(0), account, amount);
    }

    receive() external payable {}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address payable","name":"_devTaxRecipient","type":"address"},{"internalType":"address payable","name":"_rewardsTaxRecipient","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"bool","name":"previousStatus","type":"bool"},{"indexed":false,"internalType":"bool","name":"nextStatus","type":"bool"}],"name":"BlacklistUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"previousTax","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"nextTax","type":"uint256"}],"name":"BuyDevTaxChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"previousTax","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"nextTax","type":"uint256"}],"name":"BuyRewardsTaxChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"previousRecipient","type":"address"},{"indexed":false,"internalType":"address","name":"nextRecipient","type":"address"}],"name":"DevTaxRecipientChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"DevTaxRescued","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"previousRecipient","type":"address"},{"indexed":false,"internalType":"address","name":"nextRecipient","type":"address"}],"name":"RewardsTaxRecipientChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"RewardsTaxRescued","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"previousTax","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"nextTax","type":"uint256"}],"name":"SellDevTaxChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"previousTax","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"nextTax","type":"uint256"}],"name":"SellRewardsTaxChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"previousStatus","type":"bool"},{"indexed":false,"internalType":"bool","name":"nextStatus","type":"bool"}],"name":"SwapFeesChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"bool","name":"taxExcluded","type":"bool"}],"name":"TaxExclusionChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"TradingActiveChanged","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":"BPS_DENOMINATOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SNIPE_BLOCKS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokens","type":"uint256"}],"name":"addLiquidity","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"blacklist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyDevTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyRewardsTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"devTaxRecipient","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"disableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"disableTransfers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableTransfers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initialDistributeDone","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lastBuy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minTokenBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"recipientLimitWhitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_recipient","type":"address"}],"name":"rescueDevTaxTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rescueETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_recipient","type":"address"}],"name":"rescueRewardsTaxTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardsTaxRecipient","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellDevTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellRewardsTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_buyDevTax","type":"uint256"}],"name":"setBuyDevTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_buyRewardsTax","type":"uint256"}],"name":"setBuyRewardsTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_devTaxRecipient","type":"address"}],"name":"setDevTaxRecipient","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minTokenBalance","type":"uint256"}],"name":"setMinTokenBalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_rewardsTaxRecipient","type":"address"}],"name":"setRewardsTaxRecipient","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_sellDevTax","type":"uint256"}],"name":"setSellDevTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_sellRewardsTax","type":"uint256"}],"name":"setSellRewardsTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_swapFees","type":"bool"}],"name":"setSwapFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"bool","name":"_taxExcluded","type":"bool"}],"name":"setTaxExcluded","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"taxExcluded","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalDevTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalRewardsTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"transfersActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"bool","name":"status","type":"bool"}],"name":"updateBlacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

608060405260c86006556102bc60075560c86008556102bc6009556000600e60006101000a81548160ff0219169083151502179055506000600e60016101000a81548160ff0219169083151502179055506000600e60026101000a81548160ff0219169083151502179055506001600e60036101000a81548160ff021916908315150217905550683635c9adc5dea0000060155560006016556000601760006101000a81548160ff0219169083151502179055506000601760016101000a81548160ff021916908315150217905550348015620000db57600080fd5b50604051620057ef380380620057ef833981810160405281019062000101919062000a32565b6040518060400160405280600881526020017f536161734e6f64650000000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f534141530000000000000000000000000000000000000000000000000000000081525081600390805190602001906200018592919062000918565b5080600490805190602001906200019e92919062000918565b505050620001c1620001b56200066e60201b60201c565b6200067660201b60201c565b600160106000620001d76200073c60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601060008073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601060003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550737a250d5630b4cf539739df2c5dacb4c659f2488d600e60046101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600e60049054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015620004cd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620004f3919062000abe565b73ffffffffffffffffffffffffffffffffffffffff1663c9c6539630600e60049054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200057d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620005a3919062000abe565b6040518363ffffffff1660e01b8152600401620005c292919062000b01565b6020604051808303816000875af1158015620005e2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000608919062000abe565b600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062000666336b033b2e3c9fd0803ce80000006200076660201b60201c565b505062000cd9565b600033905090565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6b033b2e3c9fd0803ce80000006200078f826016546200086c60201b6200259e1790919060201c565b1115620007d3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620007ca9062000b8f565b60405180910390fd5b8060166000828254620007e7919062000bea565b925050819055506200080082826200088460201b60201c565b8173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405162000860919062000c58565b60405180910390a35050565b600081836200087c919062000bea565b905092915050565b80601860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054620008d1919062000bea565b601860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b828054620009269062000ca4565b90600052602060002090601f0160209004810192826200094a576000855562000996565b82601f106200096557805160ff191683800117855562000996565b8280016001018555821562000996579182015b828111156200099557825182559160200191906001019062000978565b5b509050620009a59190620009a9565b5090565b5b80821115620009c4576000816000905550600101620009aa565b5090565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620009fa82620009cd565b9050919050565b62000a0c81620009ed565b811462000a1857600080fd5b50565b60008151905062000a2c8162000a01565b92915050565b6000806040838503121562000a4c5762000a4b620009c8565b5b600062000a5c8582860162000a1b565b925050602062000a6f8582860162000a1b565b9150509250929050565b600062000a8682620009cd565b9050919050565b62000a988162000a79565b811462000aa457600080fd5b50565b60008151905062000ab88162000a8d565b92915050565b60006020828403121562000ad75762000ad6620009c8565b5b600062000ae78482850162000aa7565b91505092915050565b62000afb8162000a79565b82525050565b600060408201905062000b18600083018562000af0565b62000b27602083018462000af0565b9392505050565b600082825260208201905092915050565b7f4d617820737570706c7920657863656564656400000000000000000000000000600082015250565b600062000b7760138362000b2e565b915062000b848262000b3f565b602082019050919050565b6000602082019050818103600083015262000baa8162000b68565b9050919050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000bf78262000bb1565b915062000c048362000bb1565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562000c3c5762000c3b62000bbb565b5b828201905092915050565b62000c528162000bb1565b82525050565b600060208201905062000c6f600083018462000c47565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000cbd57607f821691505b60208210810362000cd35762000cd262000c75565b5b50919050565b614b068062000ce96000396000f3fe60806040526004361061036f5760003560e01c80639155e083116101c6578063be691883116100f7578063ed00c02511610095578063f2fde38b1161006f578063f2fde38b14610c3a578063f887ea4014610c63578063f9f92be414610c8e578063fe033fda14610ccb57610376565b8063ed00c02514610bbb578063f016d83b14610be4578063f29e448614610c0f57610376565b8063db12c8b6116100d1578063db12c8b614610b01578063dd62ed3e14610b2a578063e1a4521814610b67578063e3f9fc6314610b9257610376565b8063be69188314610a6e578063c1adf7bc14610a99578063cd51e6d414610ad657610376565b8063a9059cbb11610164578063b082c19a1161013e578063b082c19a146109c6578063b0ac1571146109ef578063b9ccf21d14610a18578063bbc0c74214610a4357610376565b8063a9059cbb14610947578063af35c6c714610984578063af8f26e71461099b57610376565b8063967a3a10116101a0578063967a3a1014610879578063a3e8730e146108b6578063a457c2d7146108df578063a8aa1b311461091c57610376565b80639155e083146107fa5780639207cc5d1461082357806395d89b411461084e57610376565b80633a67a0f6116102a05780635d20d9181161023e578063715018a611610218578063715018a6146107785780637db557e31461078f5780638a8c523c146107b85780638da5cb5b146107cf57610376565b80635d20d918146106e75780636053b8811461071057806370a082311461073b57610376565b80634c6d1cd81161027a5780634c6d1cd81461064c57806351c6590a146106755780635a686d54146106915780635b78f35f146106bc57610376565b80633a67a0f6146105f35780633e9ffbea1461060a5780633f651a5f1461062157610376565b80632433c0781161030d578063313ce567116102e7578063313ce5671461052357806332cb6b0c1461054e578063395093511461057957806339b622d3146105b657610376565b80632433c078146104a257806325edf518146104cd5780632f1e3e82146104f857610376565b806318160ddd1161034957806318160ddd146103fa57806319c2c40d1461042557806320800a001461044e57806323b872dd1461046557610376565b806306fdde031461037b578063095ea7b3146103a657806317700f01146103e357610376565b3661037657005b600080fd5b34801561038757600080fd5b50610390610cf4565b60405161039d919061370e565b60405180910390f35b3480156103b257600080fd5b506103cd60048036038101906103c891906137c9565b610d86565b6040516103da9190613824565b60405180910390f35b3480156103ef57600080fd5b506103f8610da4565b005b34801561040657600080fd5b5061040f610e3d565b60405161041c919061384e565b60405180910390f35b34801561043157600080fd5b5061044c60048036038101906104479190613895565b610e47565b005b34801561045a57600080fd5b50610463610f57565b005b34801561047157600080fd5b5061048c600480360381019061048791906138d5565b611023565b6040516104999190613824565b60405180910390f35b3480156104ae57600080fd5b506104b761111b565b6040516104c49190613949565b60405180910390f35b3480156104d957600080fd5b506104e2611141565b6040516104ef919061384e565b60405180910390f35b34801561050457600080fd5b5061050d611147565b60405161051a919061384e565b60405180910390f35b34801561052f57600080fd5b5061053861114d565b6040516105459190613980565b60405180910390f35b34801561055a57600080fd5b50610563611156565b604051610570919061384e565b60405180910390f35b34801561058557600080fd5b506105a0600480360381019061059b91906137c9565b611166565b6040516105ad9190613824565b60405180910390f35b3480156105c257600080fd5b506105dd60048036038101906105d8919061399b565b611212565b6040516105ea9190613824565b60405180910390f35b3480156105ff57600080fd5b50610608611232565b005b34801561061657600080fd5b5061061f6112cb565b005b34801561062d57600080fd5b506106366112f3565b6040516106439190613949565b60405180910390f35b34801561065857600080fd5b50610673600480360381019061066e91906139c8565b611319565b005b61068f600480360381019061068a91906139c8565b61141f565b005b34801561069d57600080fd5b506106a66115c0565b6040516106b3919061384e565b60405180910390f35b3480156106c857600080fd5b506106d16115c6565b6040516106de919061384e565b60405180910390f35b3480156106f357600080fd5b5061070e600480360381019061070991906139c8565b6115cc565b005b34801561071c57600080fd5b506107256116d2565b604051610732919061384e565b60405180910390f35b34801561074757600080fd5b50610762600480360381019061075d919061399b565b6116d8565b60405161076f919061384e565b60405180910390f35b34801561078457600080fd5b5061078d611721565b005b34801561079b57600080fd5b506107b660048036038101906107b191906139c8565b6117a9565b005b3480156107c457600080fd5b506107cd6118af565b005b3480156107db57600080fd5b506107e4611948565b6040516107f19190613a04565b60405180910390f35b34801561080657600080fd5b50610821600480360381019061081c9190613895565b611972565b005b34801561082f57600080fd5b506108386119fc565b6040516108459190613824565b60405180910390f35b34801561085a57600080fd5b50610863611a0f565b604051610870919061370e565b60405180910390f35b34801561088557600080fd5b506108a0600480360381019061089b919061399b565b611aa1565b6040516108ad9190613824565b60405180910390f35b3480156108c257600080fd5b506108dd60048036038101906108d891906139c8565b611ac1565b005b3480156108eb57600080fd5b50610906600480360381019061090191906137c9565b611bc7565b6040516109139190613824565b60405180910390f35b34801561092857600080fd5b50610931611cb2565b60405161093e9190613a04565b60405180910390f35b34801561095357600080fd5b5061096e600480360381019061096991906137c9565b611cd8565b60405161097b9190613824565b60405180910390f35b34801561099057600080fd5b50610999611cf6565b005b3480156109a757600080fd5b506109b0611d8f565b6040516109bd919061384e565b60405180910390f35b3480156109d257600080fd5b506109ed60048036038101906109e89190613a1f565b611d95565b005b3480156109fb57600080fd5b50610a166004803603810190610a1191906139c8565b611eb5565b005b348015610a2457600080fd5b50610a2d611f3b565b604051610a3a9190613824565b60405180910390f35b348015610a4f57600080fd5b50610a58611f4e565b604051610a659190613824565b60405180910390f35b348015610a7a57600080fd5b50610a83611f61565b604051610a90919061384e565b60405180910390f35b348015610aa557600080fd5b50610ac06004803603810190610abb919061399b565b611f67565b604051610acd919061384e565b60405180910390f35b348015610ae257600080fd5b50610aeb611f7f565b604051610af8919061384e565b60405180910390f35b348015610b0d57600080fd5b50610b286004803603810190610b239190613a8b565b611f85565b005b348015610b3657600080fd5b50610b516004803603810190610b4c9190613ab8565b6120a0565b604051610b5e919061384e565b60405180910390f35b348015610b7357600080fd5b50610b7c612127565b604051610b89919061384e565b60405180910390f35b348015610b9e57600080fd5b50610bb96004803603810190610bb49190613af8565b61212d565b005b348015610bc757600080fd5b50610be26004803603810190610bdd9190613a1f565b61220e565b005b348015610bf057600080fd5b50610bf961232e565b604051610c06919061384e565b60405180910390f35b348015610c1b57600080fd5b50610c24612333565b604051610c319190613824565b60405180910390f35b348015610c4657600080fd5b50610c616004803603810190610c5c919061399b565b612346565b005b348015610c6f57600080fd5b50610c7861243d565b604051610c859190613b84565b60405180910390f35b348015610c9a57600080fd5b50610cb56004803603810190610cb0919061399b565b612463565b604051610cc29190613824565b60405180910390f35b348015610cd757600080fd5b50610cf26004803603810190610ced9190613a8b565b612483565b005b606060038054610d0390613bce565b80601f0160208091040260200160405190810160405280929190818152602001828054610d2f90613bce565b8015610d7c5780601f10610d5157610100808354040283529160200191610d7c565b820191906000526020600020905b815481529060010190602001808311610d5f57829003601f168201915b5050505050905090565b6000610d9a610d936125b4565b84846125bc565b6001905092915050565b610dac6125b4565b73ffffffffffffffffffffffffffffffffffffffff16610dca611948565b73ffffffffffffffffffffffffffffffffffffffff1614610e20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1790613c4b565b60405180910390fd5b6000600e60016101000a81548160ff021916908315150217905550565b6000601654905090565b610e4f6125b4565b73ffffffffffffffffffffffffffffffffffffffff16610e6d611948565b73ffffffffffffffffffffffffffffffffffffffff1614610ec3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eba90613c4b565b60405180910390fd5b80601060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507f9081172b1302ac3df81f8da318d2d60362a834f73c0a1b69d14cb14414fbb9fc8282604051610f4b929190613c6b565b60405180910390a15050565b610f5f6125b4565b73ffffffffffffffffffffffffffffffffffffffff16610f7d611948565b73ffffffffffffffffffffffffffffffffffffffff1614610fd3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fca90613c4b565b60405180910390fd5b610fdb611948565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015611020573d6000803e3d6000fd5b50565b6000611030848484612785565b6000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600061107b6125b4565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050828110156110fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f290613d06565b60405180910390fd5b61110f856111076125b4565b8584036125bc565b60019150509392505050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600c5481565b600d5481565b60006012905090565b6b033b2e3c9fd0803ce800000081565b60006112086111736125b4565b8484600160006111816125b4565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546112039190613d55565b6125bc565b6001905092915050565b60106020528060005260406000206000915054906101000a900460ff1681565b61123a6125b4565b73ffffffffffffffffffffffffffffffffffffffff16611258611948565b73ffffffffffffffffffffffffffffffffffffffff16146112ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a590613c4b565b60405180910390fd5b6000600e60026101000a81548160ff021916908315150217905550565b601760009054906101000a900460ff166112f1576112f06112eb306116d8565b612b8e565b5b565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6113216125b4565b73ffffffffffffffffffffffffffffffffffffffff1661133f611948565b73ffffffffffffffffffffffffffffffffffffffff1614611395576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138c90613c4b565b60405180910390fd5b6127108111156113da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d190613e1d565b60405180910390fd5b7f329f5e7109b9e04ed6c5230453b1f7e26c4b2d5cca1b3905f5d9568673a9e9fe6007548260405161140d929190613e3d565b60405180910390a18060078190555050565b6114276125b4565b73ffffffffffffffffffffffffffffffffffffffff16611445611948565b73ffffffffffffffffffffffffffffffffffffffff161461149b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149290613c4b565b60405180910390fd5b6001601760016101000a81548160ff0219169083151502179055506114c1333083613006565b6114ee30600e60049054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836125bc565b600e60049054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d71934308460008061153a611948565b426040518863ffffffff1660e01b815260040161155c96959493929190613ea1565b60606040518083038185885af115801561157a573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061159f9190613f17565b5050506000601760016101000a81548160ff02191690831515021790555050565b60075481565b60155481565b6115d46125b4565b73ffffffffffffffffffffffffffffffffffffffff166115f2611948565b73ffffffffffffffffffffffffffffffffffffffff1614611648576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163f90613c4b565b60405180910390fd5b61271081111561168d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168490613fdc565b60405180910390fd5b7fcc0c894e0aa284b088a2e0f6e7f0d0ac09f79e4876ba88612e6e0ca487f3633b600954826040516116c0929190613e3d565b60405180910390a18060098190555050565b60095481565b6000601860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6117296125b4565b73ffffffffffffffffffffffffffffffffffffffff16611747611948565b73ffffffffffffffffffffffffffffffffffffffff161461179d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179490613c4b565b60405180910390fd5b6117a760006131b3565b565b6117b16125b4565b73ffffffffffffffffffffffffffffffffffffffff166117cf611948565b73ffffffffffffffffffffffffffffffffffffffff1614611825576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181c90613c4b565b60405180910390fd5b61271081111561186a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118619061406e565b60405180910390fd5b7fb586ed184cc52a9de023ce91b18e7c0af2d6e67c455593efb571c65748da800d6008548260405161189d929190613e3d565b60405180910390a18060088190555050565b6118b76125b4565b73ffffffffffffffffffffffffffffffffffffffff166118d5611948565b73ffffffffffffffffffffffffffffffffffffffff161461192b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192290613c4b565b60405180910390fd5b6001600e60016101000a81548160ff021916908315150217905550565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61197a6125b4565b73ffffffffffffffffffffffffffffffffffffffff16611998611948565b73ffffffffffffffffffffffffffffffffffffffff16146119ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119e590613c4b565b60405180910390fd5b6119f88282613279565b5050565b600e60009054906101000a900460ff1681565b606060048054611a1e90613bce565b80601f0160208091040260200160405190810160405280929190818152602001828054611a4a90613bce565b8015611a975780601f10611a6c57610100808354040283529160200191611a97565b820191906000526020600020905b815481529060010190602001808311611a7a57829003601f168201915b5050505050905090565b60136020528060005260406000206000915054906101000a900460ff1681565b611ac96125b4565b73ffffffffffffffffffffffffffffffffffffffff16611ae7611948565b73ffffffffffffffffffffffffffffffffffffffff1614611b3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3490613c4b565b60405180910390fd5b612710811115611b82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7990614100565b60405180910390fd5b7fc42f244a2cb2dfd33ff7e802759f2bc521c79832d2e43453eb4bb09e8196216b60065482604051611bb5929190613e3d565b60405180910390a18060068190555050565b60008060016000611bd66125b4565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015611c93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8a90614192565b60405180910390fd5b611ca7611c9e6125b4565b858584036125bc565b600191505092915050565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000611cec611ce56125b4565b8484612785565b6001905092915050565b611cfe6125b4565b73ffffffffffffffffffffffffffffffffffffffff16611d1c611948565b73ffffffffffffffffffffffffffffffffffffffff1614611d72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d6990613c4b565b60405180910390fd5b6001600e60026101000a81548160ff021916908315150217905550565b60065481565b611d9d6125b4565b73ffffffffffffffffffffffffffffffffffffffff16611dbb611948565b73ffffffffffffffffffffffffffffffffffffffff1614611e11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e0890613c4b565b60405180910390fd5b600c54821115611e56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4d90614224565b60405180910390fd5b611e61308284613006565b7f5a2ddfaa8cd29d1c9d0334d8197f34ae397aea07fdd59189acfe5010290ccd6982604051611e90919061384e565b60405180910390a181600c6000828254611eaa9190614244565b925050819055505050565b611ebd6125b4565b73ffffffffffffffffffffffffffffffffffffffff16611edb611948565b73ffffffffffffffffffffffffffffffffffffffff1614611f31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2890613c4b565b60405180910390fd5b8060158190555050565b600e60039054906101000a900460ff1681565b600e60019054906101000a900460ff1681565b60085481565b60116020528060005260406000206000915090505481565b60145481565b611f8d6125b4565b73ffffffffffffffffffffffffffffffffffffffff16611fab611948565b73ffffffffffffffffffffffffffffffffffffffff1614612001576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ff890613c4b565b60405180910390fd5b7f54920079c625fd9d65e9c2cc9e905b6045a1fc4b350cb1931738abb9fc74f59a600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682604051612054929190614299565b60405180910390a180600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b61271081565b6121356125b4565b73ffffffffffffffffffffffffffffffffffffffff16612153611948565b73ffffffffffffffffffffffffffffffffffffffff16146121a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121a090613c4b565b60405180910390fd5b7fae3a1b402f74f11fa4278ade0285e40f015bc944c463953eb7eba4dc7952a073600e60039054906101000a900460ff16826040516121e99291906142c2565b60405180910390a180600e60036101000a81548160ff02191690831515021790555050565b6122166125b4565b73ffffffffffffffffffffffffffffffffffffffff16612234611948565b73ffffffffffffffffffffffffffffffffffffffff161461228a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161228190613c4b565b60405180910390fd5b600d548211156122cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122c69061435d565b60405180910390fd5b6122da308284613006565b7fbb94e30962759790974c82682351ddb23a0dd0156e5abbca7a62f9f48dcc61cb82604051612309919061384e565b60405180910390a181600d60008282546123239190614244565b925050819055505050565b600281565b600e60029054906101000a900460ff1681565b61234e6125b4565b73ffffffffffffffffffffffffffffffffffffffff1661236c611948565b73ffffffffffffffffffffffffffffffffffffffff16146123c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123b990613c4b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612431576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612428906143ef565b60405180910390fd5b61243a816131b3565b50565b600e60049054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60126020528060005260406000206000915054906101000a900460ff1681565b61248b6125b4565b73ffffffffffffffffffffffffffffffffffffffff166124a9611948565b73ffffffffffffffffffffffffffffffffffffffff16146124ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124f690613c4b565b60405180910390fd5b7fa2e7e5be2ef4e337f327725cfb42a1922cffb5f8276b8683f0e24539eb259c4e600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682604051612552929190614299565b60405180910390a180600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600081836125ac9190613d55565b905092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361262b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161262290614481565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361269a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161269190614513565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051612778919061384e565b60405180910390a3505050565b601260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615612812576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128099061457f565b60405180910390fd5b601060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806128b35750601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b156128c8576128c3838383613006565b612b89565b60006015546128d6306116d8565b101590508080156128f45750601760009054906101000a900460ff16155b801561294e5750600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b80156129665750600e60039054906101000a900460ff165b15612974576129736112cb565b5b6000829050600080600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1603612a5d57600e60019054906101000a900460ff16612a20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a17906145eb565b60405180910390fd5b6002601454612a2f9190613d55565b4311612a4157612a40866001613279565b5b612a4c85600161335b565b809350819450829550505050612b6e565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1603612b1d57600e60019054906101000a900460ff16612b01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612af8906145eb565b60405180910390fd5b612b0c85600061335b565b809350819450829550505050612b6d565b600e60029054906101000a900460ff16612b6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b6390614657565b60405180910390fd5b5b5b612b79878785613006565b612b84878383613446565b505050505b505050565b6001601760006101000a81548160ff0219169083151502179055506000600267ffffffffffffffff811115612bc657612bc5614677565b5b604051908082528060200260200182016040528015612bf45781602001602082028036833780820191505090505b5090503081600081518110612c0c57612c0b6146a6565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600e60049054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612cb3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cd791906146ea565b81600181518110612ceb57612cea6146a6565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050612d5230600e60049054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846125bc565b6000479050600e60049054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac9478460008530426040518663ffffffff1660e01b8152600401612dbb9594939291906147d5565b600060405180830381600087803b158015612dd557600080fd5b505af1158015612de9573d6000803e3d6000fd5b5050505060008147612dfb9190614244565b90506000612e16600d54600c5461259e90919063ffffffff16565b90506000612e4182612e33600c548961350f90919063ffffffff16565b61352590919063ffffffff16565b90506000612e6c83612e5e600d548a61350f90919063ffffffff16565b61352590919063ffffffff16565b90506000612e9784612e89600c548861350f90919063ffffffff16565b61352590919063ffffffff16565b90506000612ec285612eb4600d548961350f90919063ffffffff16565b61352590919063ffffffff16565b9050612ed984600c5461353b90919063ffffffff16565b600c81905550612ef483600d5461353b90919063ffffffff16565b600d819055506000821115612f6d57600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050158015612f6b573d6000803e3d6000fd5b505b6000811115612fe057600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015612fde573d6000803e3d6000fd5b505b50505050505050506000601760006101000a81548160ff02191690831515021790555050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603613075576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161306c9061487b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036130e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130db906148e7565b60405180910390fd5b60006130ef846116d8565b905081811015613134576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161312b90614953565b60405180910390fd5b61313e8483613551565b61314883836135e3565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516131a5919061384e565b60405180910390a350505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b7f248358295a71c50a9351204f4da6e13409c2887fde3625358fbb80b9743e433b82601260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16836040516132f893929190614973565b60405180910390a180601260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600080600083156133c15761338f6127106133816006548861350f90919063ffffffff16565b61352590919063ffffffff16565b91506133ba6127106133ac6007548861350f90919063ffffffff16565b61352590919063ffffffff16565b9050613418565b6133ea6127106133dc6008548861350f90919063ffffffff16565b61352590919063ffffffff16565b91506134156127106134076009548861350f90919063ffffffff16565b61352590919063ffffffff16565b90505b61343d8161342f848861353b90919063ffffffff16565b61353b90919063ffffffff16565b92509250925092565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036134b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134ac906149f6565b60405180910390fd5b60006134ca828461259e90919063ffffffff16565b90506134d7843083613006565b82600c60008282546134e99190613d55565b9250508190555081600d60008282546135029190613d55565b9250508190555050505050565b6000818361351d9190614a16565b905092915050565b600081836135339190614a9f565b905092915050565b600081836135499190614244565b905092915050565b80601860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461359c9190614244565b601860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b80601860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461362e9190613d55565b601860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b600081519050919050565b600082825260208201905092915050565b60005b838110156136af578082015181840152602081019050613694565b838111156136be576000848401525b50505050565b6000601f19601f8301169050919050565b60006136e082613675565b6136ea8185613680565b93506136fa818560208601613691565b613703816136c4565b840191505092915050565b6000602082019050818103600083015261372881846136d5565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061376082613735565b9050919050565b61377081613755565b811461377b57600080fd5b50565b60008135905061378d81613767565b92915050565b6000819050919050565b6137a681613793565b81146137b157600080fd5b50565b6000813590506137c38161379d565b92915050565b600080604083850312156137e0576137df613730565b5b60006137ee8582860161377e565b92505060206137ff858286016137b4565b9150509250929050565b60008115159050919050565b61381e81613809565b82525050565b60006020820190506138396000830184613815565b92915050565b61384881613793565b82525050565b6000602082019050613863600083018461383f565b92915050565b61387281613809565b811461387d57600080fd5b50565b60008135905061388f81613869565b92915050565b600080604083850312156138ac576138ab613730565b5b60006138ba8582860161377e565b92505060206138cb85828601613880565b9150509250929050565b6000806000606084860312156138ee576138ed613730565b5b60006138fc8682870161377e565b935050602061390d8682870161377e565b925050604061391e868287016137b4565b9150509250925092565b600061393382613735565b9050919050565b61394381613928565b82525050565b600060208201905061395e600083018461393a565b92915050565b600060ff82169050919050565b61397a81613964565b82525050565b60006020820190506139956000830184613971565b92915050565b6000602082840312156139b1576139b0613730565b5b60006139bf8482850161377e565b91505092915050565b6000602082840312156139de576139dd613730565b5b60006139ec848285016137b4565b91505092915050565b6139fe81613755565b82525050565b6000602082019050613a1960008301846139f5565b92915050565b60008060408385031215613a3657613a35613730565b5b6000613a44858286016137b4565b9250506020613a558582860161377e565b9150509250929050565b613a6881613928565b8114613a7357600080fd5b50565b600081359050613a8581613a5f565b92915050565b600060208284031215613aa157613aa0613730565b5b6000613aaf84828501613a76565b91505092915050565b60008060408385031215613acf57613ace613730565b5b6000613add8582860161377e565b9250506020613aee8582860161377e565b9150509250929050565b600060208284031215613b0e57613b0d613730565b5b6000613b1c84828501613880565b91505092915050565b6000819050919050565b6000613b4a613b45613b4084613735565b613b25565b613735565b9050919050565b6000613b5c82613b2f565b9050919050565b6000613b6e82613b51565b9050919050565b613b7e81613b63565b82525050565b6000602082019050613b996000830184613b75565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613be657607f821691505b602082108103613bf957613bf8613b9f565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613c35602083613680565b9150613c4082613bff565b602082019050919050565b60006020820190508181036000830152613c6481613c28565b9050919050565b6000604082019050613c8060008301856139f5565b613c8d6020830184613815565b9392505050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206160008201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000602082015250565b6000613cf0602883613680565b9150613cfb82613c94565b604082019050919050565b60006020820190508181036000830152613d1f81613ce3565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613d6082613793565b9150613d6b83613793565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613da057613d9f613d26565b5b828201905092915050565b7f5f627579526577617264735461782063616e6e6f74206578636565642042505360008201527f5f44454e4f4d494e41544f520000000000000000000000000000000000000000602082015250565b6000613e07602c83613680565b9150613e1282613dab565b604082019050919050565b60006020820190508181036000830152613e3681613dfa565b9050919050565b6000604082019050613e52600083018561383f565b613e5f602083018461383f565b9392505050565b6000819050919050565b6000613e8b613e86613e8184613e66565b613b25565b613793565b9050919050565b613e9b81613e70565b82525050565b600060c082019050613eb660008301896139f5565b613ec3602083018861383f565b613ed06040830187613e92565b613edd6060830186613e92565b613eea60808301856139f5565b613ef760a083018461383f565b979650505050505050565b600081519050613f118161379d565b92915050565b600080600060608486031215613f3057613f2f613730565b5b6000613f3e86828701613f02565b9350506020613f4f86828701613f02565b9250506040613f6086828701613f02565b9150509250925092565b7f5f73656c6c526577617264735461782063616e6e6f742065786365656420425060008201527f535f44454e4f4d494e41544f5200000000000000000000000000000000000000602082015250565b6000613fc6602d83613680565b9150613fd182613f6a565b604082019050919050565b60006020820190508181036000830152613ff581613fb9565b9050919050565b7f5f73656c6c4465765461782063616e6e6f7420657863656564204250535f444560008201527f4e4f4d494e41544f520000000000000000000000000000000000000000000000602082015250565b6000614058602983613680565b915061406382613ffc565b604082019050919050565b600060208201905081810360008301526140878161404b565b9050919050565b7f5f6275794465765461782063616e6e6f7420657863656564204250535f44454e60008201527f4f4d494e41544f52000000000000000000000000000000000000000000000000602082015250565b60006140ea602883613680565b91506140f58261408e565b604082019050919050565b60006020820190508181036000830152614119816140dd565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b600061417c602583613680565b915061418782614120565b604082019050919050565b600060208201905081810360008301526141ab8161416f565b9050919050565b7f416d6f756e742063616e6e6f742062652067726561746572207468616e20746f60008201527f74616c4465765461780000000000000000000000000000000000000000000000602082015250565b600061420e602983613680565b9150614219826141b2565b604082019050919050565b6000602082019050818103600083015261423d81614201565b9050919050565b600061424f82613793565b915061425a83613793565b92508282101561426d5761426c613d26565b5b828203905092915050565b600061428382613b51565b9050919050565b61429381614278565b82525050565b60006040820190506142ae600083018561428a565b6142bb602083018461428a565b9392505050565b60006040820190506142d76000830185613815565b6142e46020830184613815565b9392505050565b7f416d6f756e742063616e6e6f742062652067726561746572207468616e20746f60008201527f74616c5265776172647354617800000000000000000000000000000000000000602082015250565b6000614347602d83613680565b9150614352826142eb565b604082019050919050565b600060208201905081810360008301526143768161433a565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006143d9602683613680565b91506143e48261437d565b604082019050919050565b60006020820190508181036000830152614408816143cc565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061446b602483613680565b91506144768261440f565b604082019050919050565b6000602082019050818103600083015261449a8161445e565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006144fd602283613680565b9150614508826144a1565b604082019050919050565b6000602082019050818103600083015261452c816144f0565b9050919050565b7f526563697069656e7420697320626c61636b6c69737465640000000000000000600082015250565b6000614569601883613680565b915061457482614533565b602082019050919050565b600060208201905081810360008301526145988161455c565b9050919050565b7f54726164696e67206973206e6f74207965742061637469766500000000000000600082015250565b60006145d5601983613680565b91506145e08261459f565b602082019050919050565b60006020820190508181036000830152614604816145c8565b9050919050565b7f5472616e736665727320617265206e6f74207965742061637469766500000000600082015250565b6000614641601c83613680565b915061464c8261460b565b602082019050919050565b6000602082019050818103600083015261467081614634565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000815190506146e481613767565b92915050565b600060208284031215614700576146ff613730565b5b600061470e848285016146d5565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61474c81613755565b82525050565b600061475e8383614743565b60208301905092915050565b6000602082019050919050565b600061478282614717565b61478c8185614722565b935061479783614733565b8060005b838110156147c85781516147af8882614752565b97506147ba8361476a565b92505060018101905061479b565b5085935050505092915050565b600060a0820190506147ea600083018861383f565b6147f76020830187613e92565b81810360408301526148098186614777565b905061481860608301856139f5565b614825608083018461383f565b9695505050505050565b7f7472616e736665722066726f6d20746865207a65726f20616464726573730000600082015250565b6000614865601e83613680565b91506148708261482f565b602082019050919050565b6000602082019050818103600083015261489481614858565b9050919050565b7f7472616e7366657220746f20746865207a65726f206164647265737300000000600082015250565b60006148d1601c83613680565b91506148dc8261489b565b602082019050919050565b60006020820190508181036000830152614900816148c4565b9050919050565b7f7472616e7366657220616d6f756e7420657863656564732062616c616e636500600082015250565b600061493d601f83613680565b915061494882614907565b602082019050919050565b6000602082019050818103600083015261496c81614930565b9050919050565b600060608201905061498860008301866139f5565b6149956020830185613815565b6149a26040830184613815565b949350505050565b7f7461786174696f6e2066726f6d20746865207a65726f20616464726573730000600082015250565b60006149e0601e83613680565b91506149eb826149aa565b602082019050919050565b60006020820190508181036000830152614a0f816149d3565b9050919050565b6000614a2182613793565b9150614a2c83613793565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614a6557614a64613d26565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614aaa82613793565b9150614ab583613793565b925082614ac557614ac4614a70565b5b82820490509291505056fea2646970667358221220771cdbdfc59b3e18b57c5974f29850da9925ad6afcb704092d5471584710702264736f6c634300080e00330000000000000000000000007819142bf84ec93ab613131470c0f9c0e0b44fea0000000000000000000000007819142bf84ec93ab613131470c0f9c0e0b44fea

Deployed Bytecode

0x60806040526004361061036f5760003560e01c80639155e083116101c6578063be691883116100f7578063ed00c02511610095578063f2fde38b1161006f578063f2fde38b14610c3a578063f887ea4014610c63578063f9f92be414610c8e578063fe033fda14610ccb57610376565b8063ed00c02514610bbb578063f016d83b14610be4578063f29e448614610c0f57610376565b8063db12c8b6116100d1578063db12c8b614610b01578063dd62ed3e14610b2a578063e1a4521814610b67578063e3f9fc6314610b9257610376565b8063be69188314610a6e578063c1adf7bc14610a99578063cd51e6d414610ad657610376565b8063a9059cbb11610164578063b082c19a1161013e578063b082c19a146109c6578063b0ac1571146109ef578063b9ccf21d14610a18578063bbc0c74214610a4357610376565b8063a9059cbb14610947578063af35c6c714610984578063af8f26e71461099b57610376565b8063967a3a10116101a0578063967a3a1014610879578063a3e8730e146108b6578063a457c2d7146108df578063a8aa1b311461091c57610376565b80639155e083146107fa5780639207cc5d1461082357806395d89b411461084e57610376565b80633a67a0f6116102a05780635d20d9181161023e578063715018a611610218578063715018a6146107785780637db557e31461078f5780638a8c523c146107b85780638da5cb5b146107cf57610376565b80635d20d918146106e75780636053b8811461071057806370a082311461073b57610376565b80634c6d1cd81161027a5780634c6d1cd81461064c57806351c6590a146106755780635a686d54146106915780635b78f35f146106bc57610376565b80633a67a0f6146105f35780633e9ffbea1461060a5780633f651a5f1461062157610376565b80632433c0781161030d578063313ce567116102e7578063313ce5671461052357806332cb6b0c1461054e578063395093511461057957806339b622d3146105b657610376565b80632433c078146104a257806325edf518146104cd5780632f1e3e82146104f857610376565b806318160ddd1161034957806318160ddd146103fa57806319c2c40d1461042557806320800a001461044e57806323b872dd1461046557610376565b806306fdde031461037b578063095ea7b3146103a657806317700f01146103e357610376565b3661037657005b600080fd5b34801561038757600080fd5b50610390610cf4565b60405161039d919061370e565b60405180910390f35b3480156103b257600080fd5b506103cd60048036038101906103c891906137c9565b610d86565b6040516103da9190613824565b60405180910390f35b3480156103ef57600080fd5b506103f8610da4565b005b34801561040657600080fd5b5061040f610e3d565b60405161041c919061384e565b60405180910390f35b34801561043157600080fd5b5061044c60048036038101906104479190613895565b610e47565b005b34801561045a57600080fd5b50610463610f57565b005b34801561047157600080fd5b5061048c600480360381019061048791906138d5565b611023565b6040516104999190613824565b60405180910390f35b3480156104ae57600080fd5b506104b761111b565b6040516104c49190613949565b60405180910390f35b3480156104d957600080fd5b506104e2611141565b6040516104ef919061384e565b60405180910390f35b34801561050457600080fd5b5061050d611147565b60405161051a919061384e565b60405180910390f35b34801561052f57600080fd5b5061053861114d565b6040516105459190613980565b60405180910390f35b34801561055a57600080fd5b50610563611156565b604051610570919061384e565b60405180910390f35b34801561058557600080fd5b506105a0600480360381019061059b91906137c9565b611166565b6040516105ad9190613824565b60405180910390f35b3480156105c257600080fd5b506105dd60048036038101906105d8919061399b565b611212565b6040516105ea9190613824565b60405180910390f35b3480156105ff57600080fd5b50610608611232565b005b34801561061657600080fd5b5061061f6112cb565b005b34801561062d57600080fd5b506106366112f3565b6040516106439190613949565b60405180910390f35b34801561065857600080fd5b50610673600480360381019061066e91906139c8565b611319565b005b61068f600480360381019061068a91906139c8565b61141f565b005b34801561069d57600080fd5b506106a66115c0565b6040516106b3919061384e565b60405180910390f35b3480156106c857600080fd5b506106d16115c6565b6040516106de919061384e565b60405180910390f35b3480156106f357600080fd5b5061070e600480360381019061070991906139c8565b6115cc565b005b34801561071c57600080fd5b506107256116d2565b604051610732919061384e565b60405180910390f35b34801561074757600080fd5b50610762600480360381019061075d919061399b565b6116d8565b60405161076f919061384e565b60405180910390f35b34801561078457600080fd5b5061078d611721565b005b34801561079b57600080fd5b506107b660048036038101906107b191906139c8565b6117a9565b005b3480156107c457600080fd5b506107cd6118af565b005b3480156107db57600080fd5b506107e4611948565b6040516107f19190613a04565b60405180910390f35b34801561080657600080fd5b50610821600480360381019061081c9190613895565b611972565b005b34801561082f57600080fd5b506108386119fc565b6040516108459190613824565b60405180910390f35b34801561085a57600080fd5b50610863611a0f565b604051610870919061370e565b60405180910390f35b34801561088557600080fd5b506108a0600480360381019061089b919061399b565b611aa1565b6040516108ad9190613824565b60405180910390f35b3480156108c257600080fd5b506108dd60048036038101906108d891906139c8565b611ac1565b005b3480156108eb57600080fd5b50610906600480360381019061090191906137c9565b611bc7565b6040516109139190613824565b60405180910390f35b34801561092857600080fd5b50610931611cb2565b60405161093e9190613a04565b60405180910390f35b34801561095357600080fd5b5061096e600480360381019061096991906137c9565b611cd8565b60405161097b9190613824565b60405180910390f35b34801561099057600080fd5b50610999611cf6565b005b3480156109a757600080fd5b506109b0611d8f565b6040516109bd919061384e565b60405180910390f35b3480156109d257600080fd5b506109ed60048036038101906109e89190613a1f565b611d95565b005b3480156109fb57600080fd5b50610a166004803603810190610a1191906139c8565b611eb5565b005b348015610a2457600080fd5b50610a2d611f3b565b604051610a3a9190613824565b60405180910390f35b348015610a4f57600080fd5b50610a58611f4e565b604051610a659190613824565b60405180910390f35b348015610a7a57600080fd5b50610a83611f61565b604051610a90919061384e565b60405180910390f35b348015610aa557600080fd5b50610ac06004803603810190610abb919061399b565b611f67565b604051610acd919061384e565b60405180910390f35b348015610ae257600080fd5b50610aeb611f7f565b604051610af8919061384e565b60405180910390f35b348015610b0d57600080fd5b50610b286004803603810190610b239190613a8b565b611f85565b005b348015610b3657600080fd5b50610b516004803603810190610b4c9190613ab8565b6120a0565b604051610b5e919061384e565b60405180910390f35b348015610b7357600080fd5b50610b7c612127565b604051610b89919061384e565b60405180910390f35b348015610b9e57600080fd5b50610bb96004803603810190610bb49190613af8565b61212d565b005b348015610bc757600080fd5b50610be26004803603810190610bdd9190613a1f565b61220e565b005b348015610bf057600080fd5b50610bf961232e565b604051610c06919061384e565b60405180910390f35b348015610c1b57600080fd5b50610c24612333565b604051610c319190613824565b60405180910390f35b348015610c4657600080fd5b50610c616004803603810190610c5c919061399b565b612346565b005b348015610c6f57600080fd5b50610c7861243d565b604051610c859190613b84565b60405180910390f35b348015610c9a57600080fd5b50610cb56004803603810190610cb0919061399b565b612463565b604051610cc29190613824565b60405180910390f35b348015610cd757600080fd5b50610cf26004803603810190610ced9190613a8b565b612483565b005b606060038054610d0390613bce565b80601f0160208091040260200160405190810160405280929190818152602001828054610d2f90613bce565b8015610d7c5780601f10610d5157610100808354040283529160200191610d7c565b820191906000526020600020905b815481529060010190602001808311610d5f57829003601f168201915b5050505050905090565b6000610d9a610d936125b4565b84846125bc565b6001905092915050565b610dac6125b4565b73ffffffffffffffffffffffffffffffffffffffff16610dca611948565b73ffffffffffffffffffffffffffffffffffffffff1614610e20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1790613c4b565b60405180910390fd5b6000600e60016101000a81548160ff021916908315150217905550565b6000601654905090565b610e4f6125b4565b73ffffffffffffffffffffffffffffffffffffffff16610e6d611948565b73ffffffffffffffffffffffffffffffffffffffff1614610ec3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eba90613c4b565b60405180910390fd5b80601060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507f9081172b1302ac3df81f8da318d2d60362a834f73c0a1b69d14cb14414fbb9fc8282604051610f4b929190613c6b565b60405180910390a15050565b610f5f6125b4565b73ffffffffffffffffffffffffffffffffffffffff16610f7d611948565b73ffffffffffffffffffffffffffffffffffffffff1614610fd3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fca90613c4b565b60405180910390fd5b610fdb611948565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015611020573d6000803e3d6000fd5b50565b6000611030848484612785565b6000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600061107b6125b4565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050828110156110fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f290613d06565b60405180910390fd5b61110f856111076125b4565b8584036125bc565b60019150509392505050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600c5481565b600d5481565b60006012905090565b6b033b2e3c9fd0803ce800000081565b60006112086111736125b4565b8484600160006111816125b4565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546112039190613d55565b6125bc565b6001905092915050565b60106020528060005260406000206000915054906101000a900460ff1681565b61123a6125b4565b73ffffffffffffffffffffffffffffffffffffffff16611258611948565b73ffffffffffffffffffffffffffffffffffffffff16146112ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a590613c4b565b60405180910390fd5b6000600e60026101000a81548160ff021916908315150217905550565b601760009054906101000a900460ff166112f1576112f06112eb306116d8565b612b8e565b5b565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6113216125b4565b73ffffffffffffffffffffffffffffffffffffffff1661133f611948565b73ffffffffffffffffffffffffffffffffffffffff1614611395576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138c90613c4b565b60405180910390fd5b6127108111156113da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d190613e1d565b60405180910390fd5b7f329f5e7109b9e04ed6c5230453b1f7e26c4b2d5cca1b3905f5d9568673a9e9fe6007548260405161140d929190613e3d565b60405180910390a18060078190555050565b6114276125b4565b73ffffffffffffffffffffffffffffffffffffffff16611445611948565b73ffffffffffffffffffffffffffffffffffffffff161461149b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149290613c4b565b60405180910390fd5b6001601760016101000a81548160ff0219169083151502179055506114c1333083613006565b6114ee30600e60049054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836125bc565b600e60049054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d71934308460008061153a611948565b426040518863ffffffff1660e01b815260040161155c96959493929190613ea1565b60606040518083038185885af115801561157a573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061159f9190613f17565b5050506000601760016101000a81548160ff02191690831515021790555050565b60075481565b60155481565b6115d46125b4565b73ffffffffffffffffffffffffffffffffffffffff166115f2611948565b73ffffffffffffffffffffffffffffffffffffffff1614611648576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163f90613c4b565b60405180910390fd5b61271081111561168d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168490613fdc565b60405180910390fd5b7fcc0c894e0aa284b088a2e0f6e7f0d0ac09f79e4876ba88612e6e0ca487f3633b600954826040516116c0929190613e3d565b60405180910390a18060098190555050565b60095481565b6000601860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6117296125b4565b73ffffffffffffffffffffffffffffffffffffffff16611747611948565b73ffffffffffffffffffffffffffffffffffffffff161461179d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179490613c4b565b60405180910390fd5b6117a760006131b3565b565b6117b16125b4565b73ffffffffffffffffffffffffffffffffffffffff166117cf611948565b73ffffffffffffffffffffffffffffffffffffffff1614611825576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181c90613c4b565b60405180910390fd5b61271081111561186a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118619061406e565b60405180910390fd5b7fb586ed184cc52a9de023ce91b18e7c0af2d6e67c455593efb571c65748da800d6008548260405161189d929190613e3d565b60405180910390a18060088190555050565b6118b76125b4565b73ffffffffffffffffffffffffffffffffffffffff166118d5611948565b73ffffffffffffffffffffffffffffffffffffffff161461192b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192290613c4b565b60405180910390fd5b6001600e60016101000a81548160ff021916908315150217905550565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61197a6125b4565b73ffffffffffffffffffffffffffffffffffffffff16611998611948565b73ffffffffffffffffffffffffffffffffffffffff16146119ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119e590613c4b565b60405180910390fd5b6119f88282613279565b5050565b600e60009054906101000a900460ff1681565b606060048054611a1e90613bce565b80601f0160208091040260200160405190810160405280929190818152602001828054611a4a90613bce565b8015611a975780601f10611a6c57610100808354040283529160200191611a97565b820191906000526020600020905b815481529060010190602001808311611a7a57829003601f168201915b5050505050905090565b60136020528060005260406000206000915054906101000a900460ff1681565b611ac96125b4565b73ffffffffffffffffffffffffffffffffffffffff16611ae7611948565b73ffffffffffffffffffffffffffffffffffffffff1614611b3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3490613c4b565b60405180910390fd5b612710811115611b82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7990614100565b60405180910390fd5b7fc42f244a2cb2dfd33ff7e802759f2bc521c79832d2e43453eb4bb09e8196216b60065482604051611bb5929190613e3d565b60405180910390a18060068190555050565b60008060016000611bd66125b4565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015611c93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8a90614192565b60405180910390fd5b611ca7611c9e6125b4565b858584036125bc565b600191505092915050565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000611cec611ce56125b4565b8484612785565b6001905092915050565b611cfe6125b4565b73ffffffffffffffffffffffffffffffffffffffff16611d1c611948565b73ffffffffffffffffffffffffffffffffffffffff1614611d72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d6990613c4b565b60405180910390fd5b6001600e60026101000a81548160ff021916908315150217905550565b60065481565b611d9d6125b4565b73ffffffffffffffffffffffffffffffffffffffff16611dbb611948565b73ffffffffffffffffffffffffffffffffffffffff1614611e11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e0890613c4b565b60405180910390fd5b600c54821115611e56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4d90614224565b60405180910390fd5b611e61308284613006565b7f5a2ddfaa8cd29d1c9d0334d8197f34ae397aea07fdd59189acfe5010290ccd6982604051611e90919061384e565b60405180910390a181600c6000828254611eaa9190614244565b925050819055505050565b611ebd6125b4565b73ffffffffffffffffffffffffffffffffffffffff16611edb611948565b73ffffffffffffffffffffffffffffffffffffffff1614611f31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2890613c4b565b60405180910390fd5b8060158190555050565b600e60039054906101000a900460ff1681565b600e60019054906101000a900460ff1681565b60085481565b60116020528060005260406000206000915090505481565b60145481565b611f8d6125b4565b73ffffffffffffffffffffffffffffffffffffffff16611fab611948565b73ffffffffffffffffffffffffffffffffffffffff1614612001576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ff890613c4b565b60405180910390fd5b7f54920079c625fd9d65e9c2cc9e905b6045a1fc4b350cb1931738abb9fc74f59a600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682604051612054929190614299565b60405180910390a180600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b61271081565b6121356125b4565b73ffffffffffffffffffffffffffffffffffffffff16612153611948565b73ffffffffffffffffffffffffffffffffffffffff16146121a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121a090613c4b565b60405180910390fd5b7fae3a1b402f74f11fa4278ade0285e40f015bc944c463953eb7eba4dc7952a073600e60039054906101000a900460ff16826040516121e99291906142c2565b60405180910390a180600e60036101000a81548160ff02191690831515021790555050565b6122166125b4565b73ffffffffffffffffffffffffffffffffffffffff16612234611948565b73ffffffffffffffffffffffffffffffffffffffff161461228a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161228190613c4b565b60405180910390fd5b600d548211156122cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122c69061435d565b60405180910390fd5b6122da308284613006565b7fbb94e30962759790974c82682351ddb23a0dd0156e5abbca7a62f9f48dcc61cb82604051612309919061384e565b60405180910390a181600d60008282546123239190614244565b925050819055505050565b600281565b600e60029054906101000a900460ff1681565b61234e6125b4565b73ffffffffffffffffffffffffffffffffffffffff1661236c611948565b73ffffffffffffffffffffffffffffffffffffffff16146123c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123b990613c4b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612431576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612428906143ef565b60405180910390fd5b61243a816131b3565b50565b600e60049054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60126020528060005260406000206000915054906101000a900460ff1681565b61248b6125b4565b73ffffffffffffffffffffffffffffffffffffffff166124a9611948565b73ffffffffffffffffffffffffffffffffffffffff16146124ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124f690613c4b565b60405180910390fd5b7fa2e7e5be2ef4e337f327725cfb42a1922cffb5f8276b8683f0e24539eb259c4e600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682604051612552929190614299565b60405180910390a180600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600081836125ac9190613d55565b905092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361262b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161262290614481565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361269a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161269190614513565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051612778919061384e565b60405180910390a3505050565b601260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615612812576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128099061457f565b60405180910390fd5b601060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806128b35750601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b156128c8576128c3838383613006565b612b89565b60006015546128d6306116d8565b101590508080156128f45750601760009054906101000a900460ff16155b801561294e5750600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b80156129665750600e60039054906101000a900460ff165b15612974576129736112cb565b5b6000829050600080600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1603612a5d57600e60019054906101000a900460ff16612a20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a17906145eb565b60405180910390fd5b6002601454612a2f9190613d55565b4311612a4157612a40866001613279565b5b612a4c85600161335b565b809350819450829550505050612b6e565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1603612b1d57600e60019054906101000a900460ff16612b01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612af8906145eb565b60405180910390fd5b612b0c85600061335b565b809350819450829550505050612b6d565b600e60029054906101000a900460ff16612b6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b6390614657565b60405180910390fd5b5b5b612b79878785613006565b612b84878383613446565b505050505b505050565b6001601760006101000a81548160ff0219169083151502179055506000600267ffffffffffffffff811115612bc657612bc5614677565b5b604051908082528060200260200182016040528015612bf45781602001602082028036833780820191505090505b5090503081600081518110612c0c57612c0b6146a6565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600e60049054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612cb3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cd791906146ea565b81600181518110612ceb57612cea6146a6565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050612d5230600e60049054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846125bc565b6000479050600e60049054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac9478460008530426040518663ffffffff1660e01b8152600401612dbb9594939291906147d5565b600060405180830381600087803b158015612dd557600080fd5b505af1158015612de9573d6000803e3d6000fd5b5050505060008147612dfb9190614244565b90506000612e16600d54600c5461259e90919063ffffffff16565b90506000612e4182612e33600c548961350f90919063ffffffff16565b61352590919063ffffffff16565b90506000612e6c83612e5e600d548a61350f90919063ffffffff16565b61352590919063ffffffff16565b90506000612e9784612e89600c548861350f90919063ffffffff16565b61352590919063ffffffff16565b90506000612ec285612eb4600d548961350f90919063ffffffff16565b61352590919063ffffffff16565b9050612ed984600c5461353b90919063ffffffff16565b600c81905550612ef483600d5461353b90919063ffffffff16565b600d819055506000821115612f6d57600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050158015612f6b573d6000803e3d6000fd5b505b6000811115612fe057600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015612fde573d6000803e3d6000fd5b505b50505050505050506000601760006101000a81548160ff02191690831515021790555050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603613075576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161306c9061487b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036130e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130db906148e7565b60405180910390fd5b60006130ef846116d8565b905081811015613134576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161312b90614953565b60405180910390fd5b61313e8483613551565b61314883836135e3565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516131a5919061384e565b60405180910390a350505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b7f248358295a71c50a9351204f4da6e13409c2887fde3625358fbb80b9743e433b82601260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16836040516132f893929190614973565b60405180910390a180601260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600080600083156133c15761338f6127106133816006548861350f90919063ffffffff16565b61352590919063ffffffff16565b91506133ba6127106133ac6007548861350f90919063ffffffff16565b61352590919063ffffffff16565b9050613418565b6133ea6127106133dc6008548861350f90919063ffffffff16565b61352590919063ffffffff16565b91506134156127106134076009548861350f90919063ffffffff16565b61352590919063ffffffff16565b90505b61343d8161342f848861353b90919063ffffffff16565b61353b90919063ffffffff16565b92509250925092565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036134b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134ac906149f6565b60405180910390fd5b60006134ca828461259e90919063ffffffff16565b90506134d7843083613006565b82600c60008282546134e99190613d55565b9250508190555081600d60008282546135029190613d55565b9250508190555050505050565b6000818361351d9190614a16565b905092915050565b600081836135339190614a9f565b905092915050565b600081836135499190614244565b905092915050565b80601860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461359c9190614244565b601860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b80601860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461362e9190613d55565b601860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b600081519050919050565b600082825260208201905092915050565b60005b838110156136af578082015181840152602081019050613694565b838111156136be576000848401525b50505050565b6000601f19601f8301169050919050565b60006136e082613675565b6136ea8185613680565b93506136fa818560208601613691565b613703816136c4565b840191505092915050565b6000602082019050818103600083015261372881846136d5565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061376082613735565b9050919050565b61377081613755565b811461377b57600080fd5b50565b60008135905061378d81613767565b92915050565b6000819050919050565b6137a681613793565b81146137b157600080fd5b50565b6000813590506137c38161379d565b92915050565b600080604083850312156137e0576137df613730565b5b60006137ee8582860161377e565b92505060206137ff858286016137b4565b9150509250929050565b60008115159050919050565b61381e81613809565b82525050565b60006020820190506138396000830184613815565b92915050565b61384881613793565b82525050565b6000602082019050613863600083018461383f565b92915050565b61387281613809565b811461387d57600080fd5b50565b60008135905061388f81613869565b92915050565b600080604083850312156138ac576138ab613730565b5b60006138ba8582860161377e565b92505060206138cb85828601613880565b9150509250929050565b6000806000606084860312156138ee576138ed613730565b5b60006138fc8682870161377e565b935050602061390d8682870161377e565b925050604061391e868287016137b4565b9150509250925092565b600061393382613735565b9050919050565b61394381613928565b82525050565b600060208201905061395e600083018461393a565b92915050565b600060ff82169050919050565b61397a81613964565b82525050565b60006020820190506139956000830184613971565b92915050565b6000602082840312156139b1576139b0613730565b5b60006139bf8482850161377e565b91505092915050565b6000602082840312156139de576139dd613730565b5b60006139ec848285016137b4565b91505092915050565b6139fe81613755565b82525050565b6000602082019050613a1960008301846139f5565b92915050565b60008060408385031215613a3657613a35613730565b5b6000613a44858286016137b4565b9250506020613a558582860161377e565b9150509250929050565b613a6881613928565b8114613a7357600080fd5b50565b600081359050613a8581613a5f565b92915050565b600060208284031215613aa157613aa0613730565b5b6000613aaf84828501613a76565b91505092915050565b60008060408385031215613acf57613ace613730565b5b6000613add8582860161377e565b9250506020613aee8582860161377e565b9150509250929050565b600060208284031215613b0e57613b0d613730565b5b6000613b1c84828501613880565b91505092915050565b6000819050919050565b6000613b4a613b45613b4084613735565b613b25565b613735565b9050919050565b6000613b5c82613b2f565b9050919050565b6000613b6e82613b51565b9050919050565b613b7e81613b63565b82525050565b6000602082019050613b996000830184613b75565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613be657607f821691505b602082108103613bf957613bf8613b9f565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613c35602083613680565b9150613c4082613bff565b602082019050919050565b60006020820190508181036000830152613c6481613c28565b9050919050565b6000604082019050613c8060008301856139f5565b613c8d6020830184613815565b9392505050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206160008201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000602082015250565b6000613cf0602883613680565b9150613cfb82613c94565b604082019050919050565b60006020820190508181036000830152613d1f81613ce3565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613d6082613793565b9150613d6b83613793565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613da057613d9f613d26565b5b828201905092915050565b7f5f627579526577617264735461782063616e6e6f74206578636565642042505360008201527f5f44454e4f4d494e41544f520000000000000000000000000000000000000000602082015250565b6000613e07602c83613680565b9150613e1282613dab565b604082019050919050565b60006020820190508181036000830152613e3681613dfa565b9050919050565b6000604082019050613e52600083018561383f565b613e5f602083018461383f565b9392505050565b6000819050919050565b6000613e8b613e86613e8184613e66565b613b25565b613793565b9050919050565b613e9b81613e70565b82525050565b600060c082019050613eb660008301896139f5565b613ec3602083018861383f565b613ed06040830187613e92565b613edd6060830186613e92565b613eea60808301856139f5565b613ef760a083018461383f565b979650505050505050565b600081519050613f118161379d565b92915050565b600080600060608486031215613f3057613f2f613730565b5b6000613f3e86828701613f02565b9350506020613f4f86828701613f02565b9250506040613f6086828701613f02565b9150509250925092565b7f5f73656c6c526577617264735461782063616e6e6f742065786365656420425060008201527f535f44454e4f4d494e41544f5200000000000000000000000000000000000000602082015250565b6000613fc6602d83613680565b9150613fd182613f6a565b604082019050919050565b60006020820190508181036000830152613ff581613fb9565b9050919050565b7f5f73656c6c4465765461782063616e6e6f7420657863656564204250535f444560008201527f4e4f4d494e41544f520000000000000000000000000000000000000000000000602082015250565b6000614058602983613680565b915061406382613ffc565b604082019050919050565b600060208201905081810360008301526140878161404b565b9050919050565b7f5f6275794465765461782063616e6e6f7420657863656564204250535f44454e60008201527f4f4d494e41544f52000000000000000000000000000000000000000000000000602082015250565b60006140ea602883613680565b91506140f58261408e565b604082019050919050565b60006020820190508181036000830152614119816140dd565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b600061417c602583613680565b915061418782614120565b604082019050919050565b600060208201905081810360008301526141ab8161416f565b9050919050565b7f416d6f756e742063616e6e6f742062652067726561746572207468616e20746f60008201527f74616c4465765461780000000000000000000000000000000000000000000000602082015250565b600061420e602983613680565b9150614219826141b2565b604082019050919050565b6000602082019050818103600083015261423d81614201565b9050919050565b600061424f82613793565b915061425a83613793565b92508282101561426d5761426c613d26565b5b828203905092915050565b600061428382613b51565b9050919050565b61429381614278565b82525050565b60006040820190506142ae600083018561428a565b6142bb602083018461428a565b9392505050565b60006040820190506142d76000830185613815565b6142e46020830184613815565b9392505050565b7f416d6f756e742063616e6e6f742062652067726561746572207468616e20746f60008201527f74616c5265776172647354617800000000000000000000000000000000000000602082015250565b6000614347602d83613680565b9150614352826142eb565b604082019050919050565b600060208201905081810360008301526143768161433a565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006143d9602683613680565b91506143e48261437d565b604082019050919050565b60006020820190508181036000830152614408816143cc565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061446b602483613680565b91506144768261440f565b604082019050919050565b6000602082019050818103600083015261449a8161445e565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006144fd602283613680565b9150614508826144a1565b604082019050919050565b6000602082019050818103600083015261452c816144f0565b9050919050565b7f526563697069656e7420697320626c61636b6c69737465640000000000000000600082015250565b6000614569601883613680565b915061457482614533565b602082019050919050565b600060208201905081810360008301526145988161455c565b9050919050565b7f54726164696e67206973206e6f74207965742061637469766500000000000000600082015250565b60006145d5601983613680565b91506145e08261459f565b602082019050919050565b60006020820190508181036000830152614604816145c8565b9050919050565b7f5472616e736665727320617265206e6f74207965742061637469766500000000600082015250565b6000614641601c83613680565b915061464c8261460b565b602082019050919050565b6000602082019050818103600083015261467081614634565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000815190506146e481613767565b92915050565b600060208284031215614700576146ff613730565b5b600061470e848285016146d5565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61474c81613755565b82525050565b600061475e8383614743565b60208301905092915050565b6000602082019050919050565b600061478282614717565b61478c8185614722565b935061479783614733565b8060005b838110156147c85781516147af8882614752565b97506147ba8361476a565b92505060018101905061479b565b5085935050505092915050565b600060a0820190506147ea600083018861383f565b6147f76020830187613e92565b81810360408301526148098186614777565b905061481860608301856139f5565b614825608083018461383f565b9695505050505050565b7f7472616e736665722066726f6d20746865207a65726f20616464726573730000600082015250565b6000614865601e83613680565b91506148708261482f565b602082019050919050565b6000602082019050818103600083015261489481614858565b9050919050565b7f7472616e7366657220746f20746865207a65726f206164647265737300000000600082015250565b60006148d1601c83613680565b91506148dc8261489b565b602082019050919050565b60006020820190508181036000830152614900816148c4565b9050919050565b7f7472616e7366657220616d6f756e7420657863656564732062616c616e636500600082015250565b600061493d601f83613680565b915061494882614907565b602082019050919050565b6000602082019050818103600083015261496c81614930565b9050919050565b600060608201905061498860008301866139f5565b6149956020830185613815565b6149a26040830184613815565b949350505050565b7f7461786174696f6e2066726f6d20746865207a65726f20616464726573730000600082015250565b60006149e0601e83613680565b91506149eb826149aa565b602082019050919050565b60006020820190508181036000830152614a0f816149d3565b9050919050565b6000614a2182613793565b9150614a2c83613793565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614a6557614a64613d26565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614aaa82613793565b9150614ab583613793565b925082614ac557614ac4614a70565b5b82820490509291505056fea2646970667358221220771cdbdfc59b3e18b57c5974f29850da9925ad6afcb704092d5471584710702264736f6c634300080e0033

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

0000000000000000000000007819142bf84ec93ab613131470c0f9c0e0b44fea0000000000000000000000007819142bf84ec93ab613131470c0f9c0e0b44fea

-----Decoded View---------------
Arg [0] : _devTaxRecipient (address): 0x7819142Bf84Ec93ab613131470C0F9c0e0B44Fea
Arg [1] : _rewardsTaxRecipient (address): 0x7819142Bf84Ec93ab613131470C0F9c0e0B44Fea

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000007819142bf84ec93ab613131470c0f9c0e0b44fea
Arg [1] : 0000000000000000000000007819142bf84ec93ab613131470c0f9c0e0b44fea


Deployed Bytecode Sourcemap

36471:16628:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13892:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16059:169;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45575:85;;;;;;;;;;;;;:::i;:::-;;52671:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46144:215;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50479:107;;;;;;;;;;;;;:::i;:::-;;16710:492;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37342:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37543:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37635:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14854:93;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36799:56;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17611:215;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38294:43;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45864:89;;;;;;;;;;;;;:::i;:::-;;48508:116;;;;;;;;;;;;;:::i;:::-;;37439:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42912:323;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40698:500;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37097:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38897:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43353:332;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37252:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46663:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7127:103;;;;;;;;;;;;;:::i;:::-;;42501:296;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45439:83;;;;;;;;;;;;;:::i;:::-;;6476:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45043:160;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37779:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14111:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38651:55;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42114:287;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18329:413;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38169:19;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15523:175;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45718:87;;;;;;;;;;;;;:::i;:::-;;37021:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43906:369;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50281:126;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38072:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37883:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37174:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38415:42;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38787:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41720:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;15761:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36862:48;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46508:147;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44500:389;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36917:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37981:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7385:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38130:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38527:41;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41339:230;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;13892:100;13946:13;13979:5;13972:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13892:100;:::o;16059:169::-;16142:4;16159:39;16168:12;:10;:12::i;:::-;16182:7;16191:6;16159:8;:39::i;:::-;16216:4;16209:11;;16059:169;;;;:::o;45575:85::-;6707:12;:10;:12::i;:::-;6696:23;;:7;:5;:7::i;:::-;:23;;;6688:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45647:5:::1;45631:13;;:21;;;;;;;;;;;;;;;;;;45575:85::o:0;52671:100::-;52724:7;52751:12;;52744:19;;52671:100;:::o;46144:215::-;6707:12;:10;:12::i;:::-;6696:23;;:7;:5;:7::i;:::-;:23;;;6688:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46280:12:::1;46256:11;:21;46268:8;46256:21;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;46308:43;46328:8;46338:12;46308:43;;;;;;;:::i;:::-;;;;;;;;46144:215:::0;;:::o;50479:107::-;6707:12;:10;:12::i;:::-;6696:23;;:7;:5;:7::i;:::-;:23;;;6688:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50538:7:::1;:5;:7::i;:::-;50530:25;;:48;50556:21;50530:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;50479:107::o:0;16710:492::-;16850:4;16867:36;16877:6;16885:9;16896:6;16867:9;:36::i;:::-;16916:24;16943:11;:19;16955:6;16943:19;;;;;;;;;;;;;;;:33;16963:12;:10;:12::i;:::-;16943:33;;;;;;;;;;;;;;;;16916:60;;17015:6;16995:16;:26;;16987:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;17102:57;17111:6;17119:12;:10;:12::i;:::-;17152:6;17133:16;:25;17102:8;:57::i;:::-;17190:4;17183:11;;;16710:492;;;;;:::o;37342:38::-;;;;;;;;;;;;;:::o;37543:26::-;;;;:::o;37635:30::-;;;;:::o;14854:93::-;14912:5;14937:2;14930:9;;14854:93;:::o;36799:56::-;36836:19;36799:56;:::o;17611:215::-;17699:4;17716:80;17725:12;:10;:12::i;:::-;17739:7;17785:10;17748:11;:25;17760:12;:10;:12::i;:::-;17748:25;;;;;;;;;;;;;;;:34;17774:7;17748:34;;;;;;;;;;;;;;;;:47;;;;:::i;:::-;17716:8;:80::i;:::-;17814:4;17807:11;;17611:215;;;;:::o;38294:43::-;;;;;;;;;;;;;;;;;;;;;;:::o;45864:89::-;6707:12;:10;:12::i;:::-;6696:23;;:7;:5;:7::i;:::-;:23;;;6688:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45940:5:::1;45922:15;;:23;;;;;;;;;;;;;;;;;;45864:89::o:0;48508:116::-;48550:7;;;;;;;;;;;48545:72;;48574:31;48580:24;48598:4;48580:9;:24::i;:::-;48574:5;:31::i;:::-;48545:72;48508:116::o;37439:42::-;;;;;;;;;;;;;:::o;42912:323::-;6707:12;:10;:12::i;:::-;6696:23;;:7;:5;:7::i;:::-;:23;;;6688:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;36904:6:::1;43014:14;:33;;42992:127;;;;;;;;;;;;:::i;:::-;;;;;;;;;43135:51;43156:13;;43171:14;43135:51;;;;;;;:::i;:::-;;;;;;;;43213:14;43197:13;:30;;;;42912:323:::0;:::o;40698:500::-;6707:12;:10;:12::i;:::-;6696:23;;:7;:5;:7::i;:::-;:23;;;6688:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;36709:4:::1;36691:15;;:22;;;;;;;;;;;;;;;;;;40828:47:::2;40841:10;40861:4;40868:6;40828:12;:47::i;:::-;40886:48;40903:4;40918:6;;;;;;;;;;;40927;40886:8;:48::i;:::-;40947:6;;;;;;;;;;;:22;;;40977:9;41010:4;41030:6;41051:1;41067::::0;41083:7:::2;:5;:7::i;:::-;41164:15;40947:243;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;36754:5:::1;36736:15;;:23;;;;;;;;;;;;;;;;;;40698:500:::0;:::o;37097:34::-;;;;:::o;38897:43::-;;;;:::o;43353:332::-;6707:12;:10;:12::i;:::-;6696:23;;:7;:5;:7::i;:::-;:23;;;6688:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;36904:6:::1;43457:15;:34;;43435:129;;;;;;;;;;;;:::i;:::-;;;;;;;;;43580:54;43602:14;;43618:15;43580:54;;;;;;;:::i;:::-;;;;;;;;43662:15;43645:14;:32;;;;43353:332:::0;:::o;37252:35::-;;;;:::o;46663:177::-;46782:7;46814:9;:18;46824:7;46814:18;;;;;;;;;;;;;;;;46807:25;;46663:177;;;:::o;7127:103::-;6707:12;:10;:12::i;:::-;6696:23;;:7;:5;:7::i;:::-;:23;;;6688:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;7192:30:::1;7219:1;7192:18;:30::i;:::-;7127:103::o:0;42501:296::-;6707:12;:10;:12::i;:::-;6696:23;;:7;:5;:7::i;:::-;:23;;;6688:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;36904:6:::1;42597:11;:30;;42575:121;;;;;;;;;;;;:::i;:::-;;;;;;;;;42712:42;42730:10;;42742:11;42712:42;;;;;;;:::i;:::-;;;;;;;;42778:11;42765:10;:24;;;;42501:296:::0;:::o;45439:83::-;6707:12;:10;:12::i;:::-;6696:23;;:7;:5;:7::i;:::-;:23;;;6688:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45510:4:::1;45494:13;;:20;;;;;;;;;;;;;;;;;;45439:83::o:0;6476:87::-;6522:7;6549:6;;;;;;;;;;;6542:13;;6476:87;:::o;45043:160::-;6707:12;:10;:12::i;:::-;6696:23;;:7;:5;:7::i;:::-;:23;;;6688:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45165:30:::1;45182:4;45188:6;45165:16;:30::i;:::-;45043:160:::0;;:::o;37779:41::-;;;;;;;;;;;;;:::o;14111:104::-;14167:13;14200:7;14193:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14111:104;:::o;38651:55::-;;;;;;;;;;;;;;;;;;;;;;:::o;42114:287::-;6707:12;:10;:12::i;:::-;6696:23;;:7;:5;:7::i;:::-;:23;;;6688:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;36904:6:::1;42208:10;:29;;42186:119;;;;;;;;;;;;:::i;:::-;;;;;;;;;42321:39;42338:9;;42349:10;42321:39;;;;;;;:::i;:::-;;;;;;;;42383:10;42371:9;:22;;;;42114:287:::0;:::o;18329:413::-;18422:4;18439:24;18466:11;:25;18478:12;:10;:12::i;:::-;18466:25;;;;;;;;;;;;;;;:34;18492:7;18466:34;;;;;;;;;;;;;;;;18439:61;;18539:15;18519:16;:35;;18511:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;18632:67;18641:12;:10;:12::i;:::-;18655:7;18683:15;18664:16;:34;18632:8;:67::i;:::-;18730:4;18723:11;;;18329:413;;;;:::o;38169:19::-;;;;;;;;;;;;;:::o;15523:175::-;15609:4;15626:42;15636:12;:10;:12::i;:::-;15650:9;15661:6;15626:9;:42::i;:::-;15686:4;15679:11;;15523:175;;;;:::o;45718:87::-;6707:12;:10;:12::i;:::-;6696:23;;:7;:5;:7::i;:::-;:23;;;6688:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45793:4:::1;45775:15;;:22;;;;;;;;;;;;;;;;;;45718:87::o:0;37021:30::-;;;;:::o;43906:369::-;6707:12;:10;:12::i;:::-;6696:23;;:7;:5;:7::i;:::-;:23;;;6688:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44057:11:::1;;44046:7;:22;;44024:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;44148:48;44169:4;44176:10;44188:7;44148:12;:48::i;:::-;44212:22;44226:7;44212:22;;;;;;:::i;:::-;;;;;;;;44260:7;44245:11;;:22;;;;;;;:::i;:::-;;;;;;;;43906:369:::0;;:::o;50281:126::-;6707:12;:10;:12::i;:::-;6696:23;;:7;:5;:7::i;:::-;:23;;;6688:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50383:16:::1;50365:15;:34;;;;50281:126:::0;:::o;38072:27::-;;;;;;;;;;;;;:::o;37883:33::-;;;;;;;;;;;;;:::o;37174:31::-;;;;:::o;38415:42::-;;;;;;;;;;;;;;;;;:::o;38787:27::-;;;;:::o;41720:295::-;6707:12;:10;:12::i;:::-;6696:23;;:7;:5;:7::i;:::-;:23;;;6688:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41848:106:::1;41889:19;;;;;;;;;;;41923:20;41848:106;;;;;;;:::i;:::-;;;;;;;;41987:20;41965:19;;:42;;;;;;;;;;;;;;;;;;41720:295:::0;:::o;15761:151::-;15850:7;15877:11;:18;15889:5;15877:18;;;;;;;;;;;;;;;:27;15896:7;15877:27;;;;;;;;;;;;;;;;15870:34;;15761:151;;;;:::o;36862:48::-;36904:6;36862:48;:::o;46508:147::-;6707:12;:10;:12::i;:::-;6696:23;;:7;:5;:7::i;:::-;:23;;;6688:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46580:36:::1;46596:8;;;;;;;;;;;46606:9;46580:36;;;;;;;:::i;:::-;;;;;;;;46638:9;46627:8;;:20;;;;;;;;;;;;;;;;;;46508:147:::0;:::o;44500:389::-;6707:12;:10;:12::i;:::-;6696:23;;:7;:5;:7::i;:::-;:23;;;6688:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44655:15:::1;;44644:7;:26;;44622:121;;;;;;;;;;;;:::i;:::-;;;;;;;;;44754:48;44775:4;44782:10;44794:7;44754:12;:48::i;:::-;44818:26;44836:7;44818:26;;;;;;:::i;:::-;;;;;;;;44874:7;44855:15;;:26;;;;;;;:::i;:::-;;;;;;;;44500:389:::0;;:::o;36917:40::-;36956:1;36917:40;:::o;37981:35::-;;;;;;;;;;;;;:::o;7385:201::-;6707:12;:10;:12::i;:::-;6696:23;;:7;:5;:7::i;:::-;:23;;;6688:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;7494:1:::1;7474:22;;:8;:22;;::::0;7466:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;7550:28;7569:8;7550:18;:28::i;:::-;7385:201:::0;:::o;38130:32::-;;;;;;;;;;;;;:::o;38527:41::-;;;;;;;;;;;;;;;;;;;;;;:::o;41339:230::-;6707:12;:10;:12::i;:::-;6696:23;;:7;:5;:7::i;:::-;:23;;;6688:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41459:57:::1;41482:15;;;;;;;;;;;41499:16;41459:57;;;;;;;:::i;:::-;;;;;;;;41545:16;41527:15;;:34;;;;;;;;;;;;;;;;;;41339:230:::0;:::o;26728:98::-;26786:7;26817:1;26813;:5;;;;:::i;:::-;26806:12;;26728:98;;;;:::o;5149:::-;5202:7;5229:10;5222:17;;5149:98;:::o;22013:380::-;22166:1;22149:19;;:5;:19;;;22141:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;22247:1;22228:21;;:7;:21;;;22220:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;22331:6;22301:11;:18;22313:5;22301:18;;;;;;;;;;;;;;;:27;22320:7;22301:27;;;;;;;;;;;;;;;:36;;;;22369:7;22353:32;;22362:5;22353:32;;;22378:6;22353:32;;;;;;:::i;:::-;;;;;;;;22013:380;;;:::o;47129:1310::-;47271:9;:20;47281:9;47271:20;;;;;;;;;;;;;;;;;;;;;;;;;47270:21;47262:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;47337:11;:19;47349:6;47337:19;;;;;;;;;;;;;;;;;;;;;;;;;:45;;;;47360:11;:22;47372:9;47360:22;;;;;;;;;;;;;;;;;;;;;;;;;47337:45;47333:138;;;47399:39;47412:6;47420:9;47431:6;47399:12;:39::i;:::-;47453:7;;47333:138;47483:24;47538:15;;47510:24;47528:4;47510:9;:24::i;:::-;:43;;47483:70;;47568:19;:31;;;;;47592:7;;;;;;;;;;;47591:8;47568:31;:49;;;;;47613:4;;;;;;;;;;;47603:14;;:6;:14;;;;47568:49;:61;;;;;47621:8;;;;;;;;;;;47568:61;47564:103;;;47646:9;:7;:9::i;:::-;47564:103;47679:12;47694:6;47679:21;;47711:14;47736:18;47779:4;;;;;;;;;;;47769:14;;:6;:14;;;47765:570;;47808:13;;;;;;;;;;;47800:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;36956:1;47886:12;;:27;;;;:::i;:::-;47870:12;:43;47866:117;;47934:33;47951:9;47962:4;47934:16;:33::i;:::-;47866:117;48026:28;48041:6;48049:4;48026:14;:28::i;:::-;47997:57;;;;;;;;;;;;47765:570;;;48089:4;;;;;;;;;;;48076:17;;:9;:17;;;48072:263;;48118:13;;;;;;;;;;;48110:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;48205:29;48220:6;48228:5;48205:14;:29::i;:::-;48176:58;;;;;;;;;;;;48072:263;;;48275:15;;;;;;;;;;;48267:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;48072:263;47765:570;48345:37;48358:6;48366:9;48377:4;48345:12;:37::i;:::-;48393:38;48404:6;48412;48420:10;48393;:38::i;:::-;47251:1188;;;;47129:1310;;;;:::o;48844:1286::-;36598:4;36588:7;;:14;;;;;;;;;;;;;;;;;;48904:21:::1;48942:1;48928:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48904:40;;48973:4;48955;48960:1;48955:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;::::0;::::1;48999:6;;;;;;;;;;;:11;;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;48989:4;48994:1;48989:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;::::0;::::1;49025:48;49042:4;49057:6;;;;;;;;;;;49066;49025:8;:48::i;:::-;49086:26;49115:21;49086:50;;49149:6;;;;;;;;;;;:57;;;49221:6;49242:1;49258:4;49285;49305:15;49149:182;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;49344:18;49389;49365:21;:42;;;;:::i;:::-;49344:63;;49420:18;49441:32;49457:15;;49441:11;;:15;;:32;;;;:::i;:::-;49420:53;;49484:17;49504:39;49532:10;49504:23;49515:11;;49504:6;:10;;:23;;;;:::i;:::-;:27;;:39;;;;:::i;:::-;49484:59;;49554:21;49578:43;49610:10;49578:27;49589:15;;49578:6;:10;;:27;;;;:::i;:::-;:31;;:43;;;;:::i;:::-;49554:67;;49634:14;49651:43;49683:10;49651:27;49666:11;;49651:10;:14;;:27;;;;:::i;:::-;:31;;:43;;;;:::i;:::-;49634:60;;49705:18;49726:47;49762:10;49726:31;49741:15;;49726:10;:14;;:31;;;;:::i;:::-;:35;;:47;;;;:::i;:::-;49705:68;;49825:26;49841:9;49825:11;;:15;;:26;;;;:::i;:::-;49811:11;:40;;;;49880:34;49900:13;49880:15;;:19;;:34;;;;:::i;:::-;49862:15;:52;;;;49964:1;49955:6;:10;49951:75;;;49982:15;;;;;;;;;;;:24;;:32;50007:6;49982:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;49951:75;50053:1;50040:10;:14;50036:87;;;50071:19;;;;;;;;;;;:28;;:40;50100:10;50071:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;50036:87;48893:1237;;;;;;;;36635:5:::0;36625:7;;:15;;;;;;;;;;;;;;;;;;48844:1286;:::o;52085:578::-;52238:1;52220:20;;:6;:20;;;52212:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;52315:1;52294:23;;:9;:23;;;52286:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;52363:21;52387:17;52397:6;52387:9;:17::i;:::-;52363:41;;52440:6;52423:13;:23;;52415:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;52518:32;52535:6;52543;52518:16;:32::i;:::-;52572:30;52584:9;52595:6;52572:11;:30::i;:::-;52637:9;52620:35;;52629:6;52620:35;;;52648:6;52620:35;;;;;;:::i;:::-;;;;;;;;52201:462;52085:578;;;:::o;7746:191::-;7820:16;7839:6;;;;;;;;;;;7820:25;;7865:8;7856:6;;:17;;;;;;;;;;;;;;;;;;7920:8;7889:40;;7910:8;7889:40;;;;;;;;;;;;7809:128;7746:191;:::o;45211:176::-;45297:47;45314:4;45320:9;:15;45330:4;45320:15;;;;;;;;;;;;;;;;;;;;;;;;;45337:6;45297:47;;;;;;;;:::i;:::-;;;;;;;;45373:6;45355:9;:15;45365:4;45355:15;;;;;;;;;;;;;;;;:24;;;;;;;;;;;;;;;;;;45211:176;;:::o;51434:602::-;51551:12;51578:14;51607:18;51657:6;51653:324;;;51689:42;36904:6;51689:21;51700:9;;51689:6;:10;;:21;;;;:::i;:::-;:25;;:42;;;;:::i;:::-;51680:51;;51759:46;36904:6;51759:25;51770:13;;51759:6;:10;;:25;;;;:::i;:::-;:29;;:46;;;;:::i;:::-;51746:59;;51653:324;;;51847:43;36904:6;51847:22;51858:10;;51847:6;:10;;:22;;;;:::i;:::-;:26;;:43;;;;:::i;:::-;51838:52;;51918:47;36904:6;51918:26;51929:14;;51918:6;:10;;:26;;;;:::i;:::-;:30;;:47;;;;:::i;:::-;51905:60;;51653:324;51994:34;52017:10;51994:18;52005:6;51994;:10;;:18;;;;:::i;:::-;:22;;:34;;;;:::i;:::-;51987:41;;51434:602;;;;;:::o;50793:433::-;50963:1;50943:22;;:8;:22;;;50935:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;51013:19;51035:36;51053:17;51035:13;:17;;:36;;;;:::i;:::-;51013:58;;51082:50;51095:8;51113:4;51120:11;51082:12;:50::i;:::-;51158:13;51143:11;;:28;;;;;;;:::i;:::-;;;;;;;;51201:17;51182:15;;:36;;;;;;;:::i;:::-;;;;;;;;50924:302;50793:433;;;:::o;27466:98::-;27524:7;27555:1;27551;:5;;;;:::i;:::-;27544:12;;27466:98;;;;:::o;27865:::-;27923:7;27954:1;27950;:5;;;;:::i;:::-;27943:12;;27865:98;;;;:::o;27109:::-;27167:7;27198:1;27194;:5;;;;:::i;:::-;27187:12;;27109:98;;;;:::o;46986:135::-;47107:6;47086:9;:18;47096:7;47086:18;;;;;;;;;;;;;;;;:27;;;;:::i;:::-;47065:9;:18;47075:7;47065:18;;;;;;;;;;;;;;;:48;;;;46986:135;;:::o;46848:130::-;46964:6;46943:9;:18;46953:7;46943:18;;;;;;;;;;;;;;;;:27;;;;:::i;:::-;46922:9;:18;46932:7;46922:18;;;;;;;;;;;;;;;:48;;;;46848:130;;:::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:307::-;355:1;365:113;379:6;376:1;373:13;365:113;;;464:1;459:3;455:11;449:18;445:1;440:3;436:11;429:39;401:2;398:1;394:10;389:15;;365:113;;;496:6;493:1;490:13;487:101;;;576:1;567:6;562:3;558:16;551:27;487:101;336:258;287:307;;;:::o;600:102::-;641:6;692:2;688:7;683:2;676:5;672:14;668:28;658:38;;600:102;;;:::o;708:364::-;796:3;824:39;857:5;824:39;:::i;:::-;879:71;943:6;938:3;879:71;:::i;:::-;872:78;;959:52;1004:6;999:3;992:4;985:5;981:16;959:52;:::i;:::-;1036:29;1058:6;1036:29;:::i;:::-;1031:3;1027:39;1020:46;;800:272;708:364;;;;:::o;1078:313::-;1191:4;1229:2;1218:9;1214:18;1206:26;;1278:9;1272:4;1268:20;1264:1;1253:9;1249:17;1242:47;1306:78;1379:4;1370:6;1306:78;:::i;:::-;1298:86;;1078:313;;;;:::o;1478:117::-;1587:1;1584;1577:12;1724:126;1761:7;1801:42;1794:5;1790:54;1779:65;;1724:126;;;:::o;1856:96::-;1893:7;1922:24;1940:5;1922:24;:::i;:::-;1911:35;;1856:96;;;:::o;1958:122::-;2031:24;2049:5;2031:24;:::i;:::-;2024:5;2021:35;2011:63;;2070:1;2067;2060:12;2011:63;1958:122;:::o;2086:139::-;2132:5;2170:6;2157:20;2148:29;;2186:33;2213:5;2186:33;:::i;:::-;2086:139;;;;:::o;2231:77::-;2268:7;2297:5;2286:16;;2231:77;;;:::o;2314:122::-;2387:24;2405:5;2387:24;:::i;:::-;2380:5;2377:35;2367:63;;2426:1;2423;2416:12;2367:63;2314:122;:::o;2442:139::-;2488:5;2526:6;2513:20;2504:29;;2542:33;2569:5;2542:33;:::i;:::-;2442:139;;;;:::o;2587:474::-;2655:6;2663;2712:2;2700:9;2691:7;2687:23;2683:32;2680:119;;;2718:79;;:::i;:::-;2680:119;2838:1;2863:53;2908:7;2899:6;2888:9;2884:22;2863:53;:::i;:::-;2853:63;;2809:117;2965:2;2991:53;3036:7;3027:6;3016:9;3012:22;2991:53;:::i;:::-;2981:63;;2936:118;2587:474;;;;;:::o;3067:90::-;3101:7;3144:5;3137:13;3130:21;3119:32;;3067:90;;;:::o;3163:109::-;3244:21;3259:5;3244:21;:::i;:::-;3239:3;3232:34;3163:109;;:::o;3278:210::-;3365:4;3403:2;3392:9;3388:18;3380:26;;3416:65;3478:1;3467:9;3463:17;3454:6;3416:65;:::i;:::-;3278:210;;;;:::o;3494:118::-;3581:24;3599:5;3581:24;:::i;:::-;3576:3;3569:37;3494:118;;:::o;3618:222::-;3711:4;3749:2;3738:9;3734:18;3726:26;;3762:71;3830:1;3819:9;3815:17;3806:6;3762:71;:::i;:::-;3618:222;;;;:::o;3846:116::-;3916:21;3931:5;3916:21;:::i;:::-;3909:5;3906:32;3896:60;;3952:1;3949;3942:12;3896:60;3846:116;:::o;3968:133::-;4011:5;4049:6;4036:20;4027:29;;4065:30;4089:5;4065:30;:::i;:::-;3968:133;;;;:::o;4107:468::-;4172:6;4180;4229:2;4217:9;4208:7;4204:23;4200:32;4197:119;;;4235:79;;:::i;:::-;4197:119;4355:1;4380:53;4425:7;4416:6;4405:9;4401:22;4380:53;:::i;:::-;4370:63;;4326:117;4482:2;4508:50;4550:7;4541:6;4530:9;4526:22;4508:50;:::i;:::-;4498:60;;4453:115;4107:468;;;;;:::o;4581:619::-;4658:6;4666;4674;4723:2;4711:9;4702:7;4698:23;4694:32;4691:119;;;4729:79;;:::i;:::-;4691:119;4849:1;4874:53;4919:7;4910:6;4899:9;4895:22;4874:53;:::i;:::-;4864:63;;4820:117;4976:2;5002:53;5047:7;5038:6;5027:9;5023:22;5002:53;:::i;:::-;4992:63;;4947:118;5104:2;5130:53;5175:7;5166:6;5155:9;5151:22;5130:53;:::i;:::-;5120:63;;5075:118;4581:619;;;;;:::o;5206:104::-;5251:7;5280:24;5298:5;5280:24;:::i;:::-;5269:35;;5206:104;;;:::o;5316:142::-;5419:32;5445:5;5419:32;:::i;:::-;5414:3;5407:45;5316:142;;:::o;5464:254::-;5573:4;5611:2;5600:9;5596:18;5588:26;;5624:87;5708:1;5697:9;5693:17;5684:6;5624:87;:::i;:::-;5464:254;;;;:::o;5724:86::-;5759:7;5799:4;5792:5;5788:16;5777:27;;5724:86;;;:::o;5816:112::-;5899:22;5915:5;5899:22;:::i;:::-;5894:3;5887:35;5816:112;;:::o;5934:214::-;6023:4;6061:2;6050:9;6046:18;6038:26;;6074:67;6138:1;6127:9;6123:17;6114:6;6074:67;:::i;:::-;5934:214;;;;:::o;6154:329::-;6213:6;6262:2;6250:9;6241:7;6237:23;6233:32;6230:119;;;6268:79;;:::i;:::-;6230:119;6388:1;6413:53;6458:7;6449:6;6438:9;6434:22;6413:53;:::i;:::-;6403:63;;6359:117;6154:329;;;;:::o;6489:::-;6548:6;6597:2;6585:9;6576:7;6572:23;6568:32;6565:119;;;6603:79;;:::i;:::-;6565:119;6723:1;6748:53;6793:7;6784:6;6773:9;6769:22;6748:53;:::i;:::-;6738:63;;6694:117;6489:329;;;;:::o;6824:118::-;6911:24;6929:5;6911:24;:::i;:::-;6906:3;6899:37;6824:118;;:::o;6948:222::-;7041:4;7079:2;7068:9;7064:18;7056:26;;7092:71;7160:1;7149:9;7145:17;7136:6;7092:71;:::i;:::-;6948:222;;;;:::o;7176:474::-;7244:6;7252;7301:2;7289:9;7280:7;7276:23;7272:32;7269:119;;;7307:79;;:::i;:::-;7269:119;7427:1;7452:53;7497:7;7488:6;7477:9;7473:22;7452:53;:::i;:::-;7442:63;;7398:117;7554:2;7580:53;7625:7;7616:6;7605:9;7601:22;7580:53;:::i;:::-;7570:63;;7525:118;7176:474;;;;;:::o;7656:138::-;7737:32;7763:5;7737:32;:::i;:::-;7730:5;7727:43;7717:71;;7784:1;7781;7774:12;7717:71;7656:138;:::o;7800:155::-;7854:5;7892:6;7879:20;7870:29;;7908:41;7943:5;7908:41;:::i;:::-;7800:155;;;;:::o;7961:345::-;8028:6;8077:2;8065:9;8056:7;8052:23;8048:32;8045:119;;;8083:79;;:::i;:::-;8045:119;8203:1;8228:61;8281:7;8272:6;8261:9;8257:22;8228:61;:::i;:::-;8218:71;;8174:125;7961:345;;;;:::o;8312:474::-;8380:6;8388;8437:2;8425:9;8416:7;8412:23;8408:32;8405:119;;;8443:79;;:::i;:::-;8405:119;8563:1;8588:53;8633:7;8624:6;8613:9;8609:22;8588:53;:::i;:::-;8578:63;;8534:117;8690:2;8716:53;8761:7;8752:6;8741:9;8737:22;8716:53;:::i;:::-;8706:63;;8661:118;8312:474;;;;;:::o;8792:323::-;8848:6;8897:2;8885:9;8876:7;8872:23;8868:32;8865:119;;;8903:79;;:::i;:::-;8865:119;9023:1;9048:50;9090:7;9081:6;9070:9;9066:22;9048:50;:::i;:::-;9038:60;;8994:114;8792:323;;;;:::o;9121:60::-;9149:3;9170:5;9163:12;;9121:60;;;:::o;9187:142::-;9237:9;9270:53;9288:34;9297:24;9315:5;9297:24;:::i;:::-;9288:34;:::i;:::-;9270:53;:::i;:::-;9257:66;;9187:142;;;:::o;9335:126::-;9385:9;9418:37;9449:5;9418:37;:::i;:::-;9405:50;;9335:126;;;:::o;9467:153::-;9544:9;9577:37;9608:5;9577:37;:::i;:::-;9564:50;;9467:153;;;:::o;9626:185::-;9740:64;9798:5;9740:64;:::i;:::-;9735:3;9728:77;9626:185;;:::o;9817:276::-;9937:4;9975:2;9964:9;9960:18;9952:26;;9988:98;10083:1;10072:9;10068:17;10059:6;9988:98;:::i;:::-;9817:276;;;;:::o;10099:180::-;10147:77;10144:1;10137:88;10244:4;10241:1;10234:15;10268:4;10265:1;10258:15;10285:320;10329:6;10366:1;10360:4;10356:12;10346:22;;10413:1;10407:4;10403:12;10434:18;10424:81;;10490:4;10482:6;10478:17;10468:27;;10424:81;10552:2;10544:6;10541:14;10521:18;10518:38;10515:84;;10571:18;;:::i;:::-;10515:84;10336:269;10285:320;;;:::o;10611:182::-;10751:34;10747:1;10739:6;10735:14;10728:58;10611:182;:::o;10799:366::-;10941:3;10962:67;11026:2;11021:3;10962:67;:::i;:::-;10955:74;;11038:93;11127:3;11038:93;:::i;:::-;11156:2;11151:3;11147:12;11140:19;;10799:366;;;:::o;11171:419::-;11337:4;11375:2;11364:9;11360:18;11352:26;;11424:9;11418:4;11414:20;11410:1;11399:9;11395:17;11388:47;11452:131;11578:4;11452:131;:::i;:::-;11444:139;;11171:419;;;:::o;11596:320::-;11711:4;11749:2;11738:9;11734:18;11726:26;;11762:71;11830:1;11819:9;11815:17;11806:6;11762:71;:::i;:::-;11843:66;11905:2;11894:9;11890:18;11881:6;11843:66;:::i;:::-;11596:320;;;;;:::o;11922:227::-;12062:34;12058:1;12050:6;12046:14;12039:58;12131:10;12126:2;12118:6;12114:15;12107:35;11922:227;:::o;12155:366::-;12297:3;12318:67;12382:2;12377:3;12318:67;:::i;:::-;12311:74;;12394:93;12483:3;12394:93;:::i;:::-;12512:2;12507:3;12503:12;12496:19;;12155:366;;;:::o;12527:419::-;12693:4;12731:2;12720:9;12716:18;12708:26;;12780:9;12774:4;12770:20;12766:1;12755:9;12751:17;12744:47;12808:131;12934:4;12808:131;:::i;:::-;12800:139;;12527:419;;;:::o;12952:180::-;13000:77;12997:1;12990:88;13097:4;13094:1;13087:15;13121:4;13118:1;13111:15;13138:305;13178:3;13197:20;13215:1;13197:20;:::i;:::-;13192:25;;13231:20;13249:1;13231:20;:::i;:::-;13226:25;;13385:1;13317:66;13313:74;13310:1;13307:81;13304:107;;;13391:18;;:::i;:::-;13304:107;13435:1;13432;13428:9;13421:16;;13138:305;;;;:::o;13449:231::-;13589:34;13585:1;13577:6;13573:14;13566:58;13658:14;13653:2;13645:6;13641:15;13634:39;13449:231;:::o;13686:366::-;13828:3;13849:67;13913:2;13908:3;13849:67;:::i;:::-;13842:74;;13925:93;14014:3;13925:93;:::i;:::-;14043:2;14038:3;14034:12;14027:19;;13686:366;;;:::o;14058:419::-;14224:4;14262:2;14251:9;14247:18;14239:26;;14311:9;14305:4;14301:20;14297:1;14286:9;14282:17;14275:47;14339:131;14465:4;14339:131;:::i;:::-;14331:139;;14058:419;;;:::o;14483:332::-;14604:4;14642:2;14631:9;14627:18;14619:26;;14655:71;14723:1;14712:9;14708:17;14699:6;14655:71;:::i;:::-;14736:72;14804:2;14793:9;14789:18;14780:6;14736:72;:::i;:::-;14483:332;;;;;:::o;14821:85::-;14866:7;14895:5;14884:16;;14821:85;;;:::o;14912:158::-;14970:9;15003:61;15021:42;15030:32;15056:5;15030:32;:::i;:::-;15021:42;:::i;:::-;15003:61;:::i;:::-;14990:74;;14912:158;;;:::o;15076:147::-;15171:45;15210:5;15171:45;:::i;:::-;15166:3;15159:58;15076:147;;:::o;15229:807::-;15478:4;15516:3;15505:9;15501:19;15493:27;;15530:71;15598:1;15587:9;15583:17;15574:6;15530:71;:::i;:::-;15611:72;15679:2;15668:9;15664:18;15655:6;15611:72;:::i;:::-;15693:80;15769:2;15758:9;15754:18;15745:6;15693:80;:::i;:::-;15783;15859:2;15848:9;15844:18;15835:6;15783:80;:::i;:::-;15873:73;15941:3;15930:9;15926:19;15917:6;15873:73;:::i;:::-;15956;16024:3;16013:9;16009:19;16000:6;15956:73;:::i;:::-;15229:807;;;;;;;;;:::o;16042:143::-;16099:5;16130:6;16124:13;16115:22;;16146:33;16173:5;16146:33;:::i;:::-;16042:143;;;;:::o;16191:663::-;16279:6;16287;16295;16344:2;16332:9;16323:7;16319:23;16315:32;16312:119;;;16350:79;;:::i;:::-;16312:119;16470:1;16495:64;16551:7;16542:6;16531:9;16527:22;16495:64;:::i;:::-;16485:74;;16441:128;16608:2;16634:64;16690:7;16681:6;16670:9;16666:22;16634:64;:::i;:::-;16624:74;;16579:129;16747:2;16773:64;16829:7;16820:6;16809:9;16805:22;16773:64;:::i;:::-;16763:74;;16718:129;16191:663;;;;;:::o;16860:232::-;17000:34;16996:1;16988:6;16984:14;16977:58;17069:15;17064:2;17056:6;17052:15;17045:40;16860:232;:::o;17098:366::-;17240:3;17261:67;17325:2;17320:3;17261:67;:::i;:::-;17254:74;;17337:93;17426:3;17337:93;:::i;:::-;17455:2;17450:3;17446:12;17439:19;;17098:366;;;:::o;17470:419::-;17636:4;17674:2;17663:9;17659:18;17651:26;;17723:9;17717:4;17713:20;17709:1;17698:9;17694:17;17687:47;17751:131;17877:4;17751:131;:::i;:::-;17743:139;;17470:419;;;:::o;17895:228::-;18035:34;18031:1;18023:6;18019:14;18012:58;18104:11;18099:2;18091:6;18087:15;18080:36;17895:228;:::o;18129:366::-;18271:3;18292:67;18356:2;18351:3;18292:67;:::i;:::-;18285:74;;18368:93;18457:3;18368:93;:::i;:::-;18486:2;18481:3;18477:12;18470:19;;18129:366;;;:::o;18501:419::-;18667:4;18705:2;18694:9;18690:18;18682:26;;18754:9;18748:4;18744:20;18740:1;18729:9;18725:17;18718:47;18782:131;18908:4;18782:131;:::i;:::-;18774:139;;18501:419;;;:::o;18926:227::-;19066:34;19062:1;19054:6;19050:14;19043:58;19135:10;19130:2;19122:6;19118:15;19111:35;18926:227;:::o;19159:366::-;19301:3;19322:67;19386:2;19381:3;19322:67;:::i;:::-;19315:74;;19398:93;19487:3;19398:93;:::i;:::-;19516:2;19511:3;19507:12;19500:19;;19159:366;;;:::o;19531:419::-;19697:4;19735:2;19724:9;19720:18;19712:26;;19784:9;19778:4;19774:20;19770:1;19759:9;19755:17;19748:47;19812:131;19938:4;19812:131;:::i;:::-;19804:139;;19531:419;;;:::o;19956:224::-;20096:34;20092:1;20084:6;20080:14;20073:58;20165:7;20160:2;20152:6;20148:15;20141:32;19956:224;:::o;20186:366::-;20328:3;20349:67;20413:2;20408:3;20349:67;:::i;:::-;20342:74;;20425:93;20514:3;20425:93;:::i;:::-;20543:2;20538:3;20534:12;20527:19;;20186:366;;;:::o;20558:419::-;20724:4;20762:2;20751:9;20747:18;20739:26;;20811:9;20805:4;20801:20;20797:1;20786:9;20782:17;20775:47;20839:131;20965:4;20839:131;:::i;:::-;20831:139;;20558:419;;;:::o;20983:228::-;21123:34;21119:1;21111:6;21107:14;21100:58;21192:11;21187:2;21179:6;21175:15;21168:36;20983:228;:::o;21217:366::-;21359:3;21380:67;21444:2;21439:3;21380:67;:::i;:::-;21373:74;;21456:93;21545:3;21456:93;:::i;:::-;21574:2;21569:3;21565:12;21558:19;;21217:366;;;:::o;21589:419::-;21755:4;21793:2;21782:9;21778:18;21770:26;;21842:9;21836:4;21832:20;21828:1;21817:9;21813:17;21806:47;21870:131;21996:4;21870:131;:::i;:::-;21862:139;;21589:419;;;:::o;22014:191::-;22054:4;22074:20;22092:1;22074:20;:::i;:::-;22069:25;;22108:20;22126:1;22108:20;:::i;:::-;22103:25;;22147:1;22144;22141:8;22138:34;;;22152:18;;:::i;:::-;22138:34;22197:1;22194;22190:9;22182:17;;22014:191;;;;:::o;22211:134::-;22269:9;22302:37;22333:5;22302:37;:::i;:::-;22289:50;;22211:134;;;:::o;22351:147::-;22446:45;22485:5;22446:45;:::i;:::-;22441:3;22434:58;22351:147;;:::o;22504:364::-;22641:4;22679:2;22668:9;22664:18;22656:26;;22692:79;22768:1;22757:9;22753:17;22744:6;22692:79;:::i;:::-;22781:80;22857:2;22846:9;22842:18;22833:6;22781:80;:::i;:::-;22504:364;;;;;:::o;22874:308::-;22983:4;23021:2;23010:9;23006:18;22998:26;;23034:65;23096:1;23085:9;23081:17;23072:6;23034:65;:::i;:::-;23109:66;23171:2;23160:9;23156:18;23147:6;23109:66;:::i;:::-;22874:308;;;;;:::o;23188:232::-;23328:34;23324:1;23316:6;23312:14;23305:58;23397:15;23392:2;23384:6;23380:15;23373:40;23188:232;:::o;23426:366::-;23568:3;23589:67;23653:2;23648:3;23589:67;:::i;:::-;23582:74;;23665:93;23754:3;23665:93;:::i;:::-;23783:2;23778:3;23774:12;23767:19;;23426:366;;;:::o;23798:419::-;23964:4;24002:2;23991:9;23987:18;23979:26;;24051:9;24045:4;24041:20;24037:1;24026:9;24022:17;24015:47;24079:131;24205:4;24079:131;:::i;:::-;24071:139;;23798:419;;;:::o;24223:225::-;24363:34;24359:1;24351:6;24347:14;24340:58;24432:8;24427:2;24419:6;24415:15;24408:33;24223:225;:::o;24454:366::-;24596:3;24617:67;24681:2;24676:3;24617:67;:::i;:::-;24610:74;;24693:93;24782:3;24693:93;:::i;:::-;24811:2;24806:3;24802:12;24795:19;;24454:366;;;:::o;24826:419::-;24992:4;25030:2;25019:9;25015:18;25007:26;;25079:9;25073:4;25069:20;25065:1;25054:9;25050:17;25043:47;25107:131;25233:4;25107:131;:::i;:::-;25099:139;;24826:419;;;:::o;25251:223::-;25391:34;25387:1;25379:6;25375:14;25368:58;25460:6;25455:2;25447:6;25443:15;25436:31;25251:223;:::o;25480:366::-;25622:3;25643:67;25707:2;25702:3;25643:67;:::i;:::-;25636:74;;25719:93;25808:3;25719:93;:::i;:::-;25837:2;25832:3;25828:12;25821:19;;25480:366;;;:::o;25852:419::-;26018:4;26056:2;26045:9;26041:18;26033:26;;26105:9;26099:4;26095:20;26091:1;26080:9;26076:17;26069:47;26133:131;26259:4;26133:131;:::i;:::-;26125:139;;25852:419;;;:::o;26277:221::-;26417:34;26413:1;26405:6;26401:14;26394:58;26486:4;26481:2;26473:6;26469:15;26462:29;26277:221;:::o;26504:366::-;26646:3;26667:67;26731:2;26726:3;26667:67;:::i;:::-;26660:74;;26743:93;26832:3;26743:93;:::i;:::-;26861:2;26856:3;26852:12;26845:19;;26504:366;;;:::o;26876:419::-;27042:4;27080:2;27069:9;27065:18;27057:26;;27129:9;27123:4;27119:20;27115:1;27104:9;27100:17;27093:47;27157:131;27283:4;27157:131;:::i;:::-;27149:139;;26876:419;;;:::o;27301:174::-;27441:26;27437:1;27429:6;27425:14;27418:50;27301:174;:::o;27481:366::-;27623:3;27644:67;27708:2;27703:3;27644:67;:::i;:::-;27637:74;;27720:93;27809:3;27720:93;:::i;:::-;27838:2;27833:3;27829:12;27822:19;;27481:366;;;:::o;27853:419::-;28019:4;28057:2;28046:9;28042:18;28034:26;;28106:9;28100:4;28096:20;28092:1;28081:9;28077:17;28070:47;28134:131;28260:4;28134:131;:::i;:::-;28126:139;;27853:419;;;:::o;28278:175::-;28418:27;28414:1;28406:6;28402:14;28395:51;28278:175;:::o;28459:366::-;28601:3;28622:67;28686:2;28681:3;28622:67;:::i;:::-;28615:74;;28698:93;28787:3;28698:93;:::i;:::-;28816:2;28811:3;28807:12;28800:19;;28459:366;;;:::o;28831:419::-;28997:4;29035:2;29024:9;29020:18;29012:26;;29084:9;29078:4;29074:20;29070:1;29059:9;29055:17;29048:47;29112:131;29238:4;29112:131;:::i;:::-;29104:139;;28831:419;;;:::o;29256:178::-;29396:30;29392:1;29384:6;29380:14;29373:54;29256:178;:::o;29440:366::-;29582:3;29603:67;29667:2;29662:3;29603:67;:::i;:::-;29596:74;;29679:93;29768:3;29679:93;:::i;:::-;29797:2;29792:3;29788:12;29781:19;;29440:366;;;:::o;29812:419::-;29978:4;30016:2;30005:9;30001:18;29993:26;;30065:9;30059:4;30055:20;30051:1;30040:9;30036:17;30029:47;30093:131;30219:4;30093:131;:::i;:::-;30085:139;;29812:419;;;:::o;30237:180::-;30285:77;30282:1;30275:88;30382:4;30379:1;30372:15;30406:4;30403:1;30396:15;30423:180;30471:77;30468:1;30461:88;30568:4;30565:1;30558:15;30592:4;30589:1;30582:15;30609:143;30666:5;30697:6;30691:13;30682:22;;30713:33;30740:5;30713:33;:::i;:::-;30609:143;;;;:::o;30758:351::-;30828:6;30877:2;30865:9;30856:7;30852:23;30848:32;30845:119;;;30883:79;;:::i;:::-;30845:119;31003:1;31028:64;31084:7;31075:6;31064:9;31060:22;31028:64;:::i;:::-;31018:74;;30974:128;30758:351;;;;:::o;31115:114::-;31182:6;31216:5;31210:12;31200:22;;31115:114;;;:::o;31235:184::-;31334:11;31368:6;31363:3;31356:19;31408:4;31403:3;31399:14;31384:29;;31235:184;;;;:::o;31425:132::-;31492:4;31515:3;31507:11;;31545:4;31540:3;31536:14;31528:22;;31425:132;;;:::o;31563:108::-;31640:24;31658:5;31640:24;:::i;:::-;31635:3;31628:37;31563:108;;:::o;31677:179::-;31746:10;31767:46;31809:3;31801:6;31767:46;:::i;:::-;31845:4;31840:3;31836:14;31822:28;;31677:179;;;;:::o;31862:113::-;31932:4;31964;31959:3;31955:14;31947:22;;31862:113;;;:::o;32011:732::-;32130:3;32159:54;32207:5;32159:54;:::i;:::-;32229:86;32308:6;32303:3;32229:86;:::i;:::-;32222:93;;32339:56;32389:5;32339:56;:::i;:::-;32418:7;32449:1;32434:284;32459:6;32456:1;32453:13;32434:284;;;32535:6;32529:13;32562:63;32621:3;32606:13;32562:63;:::i;:::-;32555:70;;32648:60;32701:6;32648:60;:::i;:::-;32638:70;;32494:224;32481:1;32478;32474:9;32469:14;;32434:284;;;32438:14;32734:3;32727:10;;32135:608;;;32011:732;;;;:::o;32749:831::-;33012:4;33050:3;33039:9;33035:19;33027:27;;33064:71;33132:1;33121:9;33117:17;33108:6;33064:71;:::i;:::-;33145:80;33221:2;33210:9;33206:18;33197:6;33145:80;:::i;:::-;33272:9;33266:4;33262:20;33257:2;33246:9;33242:18;33235:48;33300:108;33403:4;33394:6;33300:108;:::i;:::-;33292:116;;33418:72;33486:2;33475:9;33471:18;33462:6;33418:72;:::i;:::-;33500:73;33568:3;33557:9;33553:19;33544:6;33500:73;:::i;:::-;32749:831;;;;;;;;:::o;33586:180::-;33726:32;33722:1;33714:6;33710:14;33703:56;33586:180;:::o;33772:366::-;33914:3;33935:67;33999:2;33994:3;33935:67;:::i;:::-;33928:74;;34011:93;34100:3;34011:93;:::i;:::-;34129:2;34124:3;34120:12;34113:19;;33772:366;;;:::o;34144:419::-;34310:4;34348:2;34337:9;34333:18;34325:26;;34397:9;34391:4;34387:20;34383:1;34372:9;34368:17;34361:47;34425:131;34551:4;34425:131;:::i;:::-;34417:139;;34144:419;;;:::o;34569:178::-;34709:30;34705:1;34697:6;34693:14;34686:54;34569:178;:::o;34753:366::-;34895:3;34916:67;34980:2;34975:3;34916:67;:::i;:::-;34909:74;;34992:93;35081:3;34992:93;:::i;:::-;35110:2;35105:3;35101:12;35094:19;;34753:366;;;:::o;35125:419::-;35291:4;35329:2;35318:9;35314:18;35306:26;;35378:9;35372:4;35368:20;35364:1;35353:9;35349:17;35342:47;35406:131;35532:4;35406:131;:::i;:::-;35398:139;;35125:419;;;:::o;35550:181::-;35690:33;35686:1;35678:6;35674:14;35667:57;35550:181;:::o;35737:366::-;35879:3;35900:67;35964:2;35959:3;35900:67;:::i;:::-;35893:74;;35976:93;36065:3;35976:93;:::i;:::-;36094:2;36089:3;36085:12;36078:19;;35737:366;;;:::o;36109:419::-;36275:4;36313:2;36302:9;36298:18;36290:26;;36362:9;36356:4;36352:20;36348:1;36337:9;36333:17;36326:47;36390:131;36516:4;36390:131;:::i;:::-;36382:139;;36109:419;;;:::o;36534:418::-;36671:4;36709:2;36698:9;36694:18;36686:26;;36722:71;36790:1;36779:9;36775:17;36766:6;36722:71;:::i;:::-;36803:66;36865:2;36854:9;36850:18;36841:6;36803:66;:::i;:::-;36879;36941:2;36930:9;36926:18;36917:6;36879:66;:::i;:::-;36534:418;;;;;;:::o;36958:180::-;37098:32;37094:1;37086:6;37082:14;37075:56;36958:180;:::o;37144:366::-;37286:3;37307:67;37371:2;37366:3;37307:67;:::i;:::-;37300:74;;37383:93;37472:3;37383:93;:::i;:::-;37501:2;37496:3;37492:12;37485:19;;37144:366;;;:::o;37516:419::-;37682:4;37720:2;37709:9;37705:18;37697:26;;37769:9;37763:4;37759:20;37755:1;37744:9;37740:17;37733:47;37797:131;37923:4;37797:131;:::i;:::-;37789:139;;37516:419;;;:::o;37941:348::-;37981:7;38004:20;38022:1;38004:20;:::i;:::-;37999:25;;38038:20;38056:1;38038:20;:::i;:::-;38033:25;;38226:1;38158:66;38154:74;38151:1;38148:81;38143:1;38136:9;38129:17;38125:105;38122:131;;;38233:18;;:::i;:::-;38122:131;38281:1;38278;38274:9;38263:20;;37941:348;;;;:::o;38295:180::-;38343:77;38340:1;38333:88;38440:4;38437:1;38430:15;38464:4;38461:1;38454:15;38481:185;38521:1;38538:20;38556:1;38538:20;:::i;:::-;38533:25;;38572:20;38590:1;38572:20;:::i;:::-;38567:25;;38611:1;38601:35;;38616:18;;:::i;:::-;38601:35;38658:1;38655;38651:9;38646:14;;38481:185;;;;:::o

Swarm Source

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