ETH Price: $3,355.66 (-2.86%)
Gas: 2 Gwei

Token

Axe (AXE)
 

Overview

Max Total Supply

100,000,000 AXE

Holders

289

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 9 Decimals)

Balance
55,313.291005414 AXE

Value
$0.00
0xd5bfad981a02c346ffd84e6e34f72da247584388
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:
Axe

Compiler Version
v0.8.10+commit.fc410830

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-08-11
*/

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

// SPDX-License-Identifier: MIT

/**


Website: https://axecapital.pro/

Twitter: https://twitter.com/coinaxecapital

Telegram: https://t.me/+TR-DjyYpFwkzZjEy


*/


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

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            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;
        }
    }
}

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


// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

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

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


// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;


/**
 * @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 Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        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);
    }
}

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


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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


// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.0;


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

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


// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC20/ERC20.sol)

pragma solidity ^0.8.0;




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

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

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

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

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

    /**
     * @dev See {IERC20-approve}.
     *
     * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on
     * `transferFrom`. This is semantically equivalent to an infinite approval.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * NOTE: Does not update the allowance if the current allowance
     * is the maximum `uint256`.
     *
     * Requirements:
     *
     * - `from` and `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public virtual override returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, amount);
        _transfer(from, to, amount);
        return true;
    }

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

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

        return true;
    }

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

        _beforeTokenTransfer(from, to, amount);

        uint256 fromBalance = _balances[from];
        require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[from] = fromBalance - amount;
            // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by
            // decrementing then incrementing.
            _balances[to] += amount;
        }

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, amount);
    }

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

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

        _totalSupply += amount;
        unchecked {
            // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above.
            _balances[account] += amount;
        }
        emit Transfer(address(0), account, amount);

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

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

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

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
            // Overflow not possible: amount <= accountBalance <= totalSupply.
            _totalSupply -= amount;
        }

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

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

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

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

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

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

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

pragma solidity 0.8.10;


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

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

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

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

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

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

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

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

    function initialize(address, address) external;
}


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

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

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

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

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


library SafeMathInt {
    int256 private constant MIN_INT256 = int256(1) << 255;
    int256 private constant MAX_INT256 = ~(int256(1) << 255);

    /**
     * @dev Multiplies two int256 variables and fails on overflow.
     */
    function mul(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a * b;

        // Detect overflow when multiplying MIN_INT256 with -1
        require(c != MIN_INT256 || (a & MIN_INT256) != (b & MIN_INT256));
        require((b == 0) || (c / b == a));
        return c;
    }

    /**
     * @dev Division of two int256 variables and fails on overflow.
     */
    function div(int256 a, int256 b) internal pure returns (int256) {
        // Prevent overflow when dividing MIN_INT256 by -1
        require(b != -1 || a != MIN_INT256);

        // Solidity already throws when dividing by 0.
        return a / b;
    }

    /**
     * @dev Subtracts two int256 variables and fails on overflow.
     */
    function sub(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a - b;
        require((b >= 0 && c <= a) || (b < 0 && c > a));
        return c;
    }

    /**
     * @dev Adds two int256 variables and fails on overflow.
     */
    function add(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a + b;
        require((b >= 0 && c >= a) || (b < 0 && c < a));
        return c;
    }

    /**
     * @dev Converts to absolute value, and fails on overflow.
     */
    function abs(int256 a) internal pure returns (int256) {
        require(a != MIN_INT256);
        return a < 0 ? -a : a;
    }


    function toUint256Safe(int256 a) internal pure returns (uint256) {
        require(a >= 0);
        return uint256(a);
    }
}

library SafeMathUint {
  function toInt256Safe(uint256 a) internal pure returns (int256) {
    int256 b = int256(a);
    require(b >= 0);
    return b;
  }
}


interface IUniswapV2Router01 {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountToken, uint amountETH);
    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETHWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountToken, uint amountETH);
    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);
    function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);

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

interface IUniswapV2Router02 is IUniswapV2Router01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountETH);
    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountETH);

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable;
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
}


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

    IUniswapV2Router02 public immutable uniswapV2Router;
    address public immutable uniswapV2Pair;
    address public constant deadAddress = address(0xdead);

    bool private swapping;

    address public marketingWallet;
    address public devWallet;
    
    uint256 public maxTransactionAmount;
    uint256 public swapTokensAtAmount;
    uint256 public maxWallet;
    
    uint256 public percentForLPBurn = 1; // 25 = .25%
    bool public lpBurnEnabled = false;
    uint256 public lpBurnFrequency = 1360000000000 seconds;
    uint256 public lastLpBurnTime;
    
    uint256 public manualBurnFrequency = 43210 minutes;
    uint256 public lastManualLpBurnTime;

    bool public limitsInEffect = true;
    bool public tradingActive = true; // go live after adding LP
    bool public swapEnabled = true;
    
     // Anti-bot and anti-whale mappings and variables
    mapping(address => uint256) private _holderLastTransferTimestamp; // to hold last Transfers temporarily during launch
    bool public transferDelayEnabled = true;

    uint256 public buyTotalFees;
    uint256 public buyMarketingFee;
    uint256 public buyDevFee;
    
    uint256 public sellTotalFees;
    uint256 public sellMarketingFee;
    uint256 public sellDevFee;
    
    uint256 public tokensForMarketing;
    uint256 public tokensForDev;

    bool public whitelistEnabled = false;
    
    /******************/

    // exlcude from fees and max transaction amount
    mapping (address => bool) private _isExcludedFromFees;
    mapping (address => bool) public _isExcludedMaxTransactionAmount;

    // whitelist
    mapping(address => bool) public whitelists;

    // store addresses that a automatic market maker pairs. Any transfer *to* these addresses
    // could be subject to a maximum transfer amount
    mapping (address => bool) public automatedMarketMakerPairs;

    event UpdateUniswapV2Router(address indexed newAddress, address indexed oldAddress);

    event ExcludeFromFees(address indexed account, bool isExcluded);

    event SetAutomatedMarketMakerPair(address indexed pair, bool indexed value);

    event marketingWalletUpdated(address indexed newWallet, address indexed oldWallet);
    
    event devWalletUpdated(address indexed newWallet, address indexed oldWallet);

    event SwapAndLiquify(
        uint256 tokensSwapped,
        uint256 ethReceived
    );
    
    event AutoNukeLP();
    
    event ManualNukeLP();

    uint8 private constant _decimals = 9;

    constructor() ERC20("Axe", "AXE") {
        
        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
        
        excludeFromMaxTransaction(address(_uniswapV2Router), true);
        uniswapV2Router = _uniswapV2Router;
        
        uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory()).createPair(address(this), _uniswapV2Router.WETH());
        excludeFromMaxTransaction(address(uniswapV2Pair), true);
        _setAutomatedMarketMakerPair(address(uniswapV2Pair), true);

        
        uint256 _buyMarketingFee = 0;
        uint256 _buyDevFee = 1;

        uint256 _sellMarketingFee = 0;
        uint256 _sellDevFee = 1;
        
        uint256 totalSupply = 100000000 * 10 ** _decimals;
        
        //  Maximum tx size and wallet size
        maxTransactionAmount = totalSupply * 55 / 10000;
        maxWallet = totalSupply * 55 / 10000;

        swapTokensAtAmount = totalSupply * 1 / 10000;

        buyMarketingFee = _buyMarketingFee;
        buyDevFee = _buyDevFee;
        buyTotalFees = buyMarketingFee + buyDevFee;
        
        sellMarketingFee = _sellMarketingFee;
        sellDevFee = _sellDevFee;
        sellTotalFees = sellMarketingFee + sellDevFee;
        
        marketingWallet = address(owner()); // set as marketing wallet
        devWallet = address(owner()); // set as dev wallet

        // exclude from paying fees or having max transaction amount
        excludeFromFees(owner(), true);
        excludeFromFees(address(this), true);
        excludeFromFees(address(0xdead), true);
        
        excludeFromMaxTransaction(owner(), true);
        excludeFromMaxTransaction(address(this), true);
        excludeFromMaxTransaction(address(0xdead), true);
        
        /*
            _mint is an internal function in ERC20.sol that is only called here,
            and CANNOT be called ever again
        */
        _mint(msg.sender, totalSupply);
    }

    receive() external payable {

    }

    function whitelist(address[] calldata _addresses, bool _isWhitelisting) external onlyOwner {
        for (uint i=0; i<_addresses.length; i++) {
            whitelists[_addresses[i]] = _isWhitelisting;
        }
    }

    function updateWhitelistEnabled(bool _isWhitelisting) external onlyOwner {
        whitelistEnabled = _isWhitelisting;
    }

    function isWhitetlistEnabled() public view returns (bool) {
        return whitelistEnabled;
    }

    // once enabled, can never be turned off
    function enableTrading() external onlyOwner {
        tradingActive = true;
        swapEnabled = true;
        lastLpBurnTime = block.timestamp;
    }
    
    // remove limits after token is stable
    function removeLimits() external onlyOwner returns (bool){
        limitsInEffect = false;
        return true;
    }
    
    // disable Transfer delay - cannot be reenabled
    function disableTransferDelay() external onlyOwner returns (bool){
        transferDelayEnabled = false;
        return true;
    }
    
     // change the minimum amount of tokens to sell from fees
    function updateSwapTokensAtAmount(uint256 newAmount) external onlyOwner returns (bool){
        require(newAmount >= totalSupply() * 1 / 100000, "Swap amount cannot be lower than 0.001% total supply.");
        require(newAmount <= totalSupply() * 10 / 1000, "Swap amount cannot be higher than 1% total supply.");
        swapTokensAtAmount = newAmount;
        return true;
    }
    
    function updateMaxLimits(uint256 maxPerTx, uint256 maxPerWallet) external onlyOwner {
        require(maxPerTx >= (totalSupply() * 1 / 1000)/10**_decimals, "Cannot set maxTransactionAmount lower than 0.1%");
        maxTransactionAmount = maxPerTx * (10**_decimals);

        require(maxPerWallet >= (totalSupply() * 5 / 1000)/1e18, "Cannot set maxWallet lower than 0.5%");
        maxWallet = maxPerWallet * (10**_decimals);
    }
    
    function updateMaxTxnAmount(uint256 newNum) external onlyOwner {
        require(newNum >= (totalSupply() * 1 / 1000)/10**_decimals, "Cannot set maxTransactionAmount lower than 0.1%");
        maxTransactionAmount = newNum * (10**_decimals);
    }

    function updateMaxWalletAmount(uint256 newNum) external onlyOwner {
        require(newNum >= (totalSupply() * 5 / 1000)/10**_decimals, "Cannot set maxWallet lower than 0.5%");
        maxWallet = newNum * (10**_decimals);
    }
    
    function excludeFromMaxTransaction(address updAds, bool isEx) public onlyOwner {
        _isExcludedMaxTransactionAmount[updAds] = isEx;
    }
    
    // only use to disable contract sales if absolutely necessary (emergency use only)
    function updateSwapEnabled(bool enabled) external onlyOwner(){
        swapEnabled = enabled;
    }
    
    function updateBuyFees(uint256 _marketingFee, uint256 _devFee) external onlyOwner {
        buyMarketingFee = _marketingFee;
        buyDevFee = _devFee;
        buyTotalFees = buyMarketingFee + buyDevFee;
        require(buyTotalFees <= 25, "Must keep fees at 25% or less");
    }
    
    function updateSellFees(uint256 _marketingFee, uint256 _devFee) external onlyOwner {
        sellMarketingFee = _marketingFee;
        sellDevFee = _devFee;
        sellTotalFees = sellMarketingFee + sellDevFee;
        require(sellTotalFees <= 99, "Must keep fees at 99% or less");
    }

    function updateTaxes (uint256 buy, uint256 sell) external onlyOwner {
        sellDevFee = sell;
        buyDevFee = buy;
        sellTotalFees = sellMarketingFee  + sellDevFee;
        buyTotalFees = buyMarketingFee + buyDevFee;
        require(buyTotalFees <= 25, "Must keep fees at 25% or less");
        require(sellTotalFees <= 99, "Must keep fees at 99% or less");
    }

    function excludeFromFees(address account, bool excluded) public onlyOwner {
        _isExcludedFromFees[account] = excluded;
        emit ExcludeFromFees(account, excluded);
    }

    function setAutomatedMarketMakerPair(address pair, bool value) public onlyOwner {
        require(pair != uniswapV2Pair, "The pair cannot be removed from automatedMarketMakerPairs");

        _setAutomatedMarketMakerPair(pair, value);
    }

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

        emit SetAutomatedMarketMakerPair(pair, value);
    }

    function updateMarketingWallet(address newMarketingWallet) external onlyOwner {
        emit marketingWalletUpdated(newMarketingWallet, marketingWallet);
        marketingWallet = newMarketingWallet;
    }
    
    function updateDevWallet(address newWallet) external onlyOwner {
        emit devWalletUpdated(newWallet, devWallet);
        devWallet = newWallet;
    }
    

    function isExcludedFromFees(address account) public view returns(bool) {
        return _isExcludedFromFees[account];
    }
    
    event BoughtEarly(address indexed sniper);

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal override {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");

        if (whitelistEnabled)
            require(whitelists[to] || whitelists[from], "Rejected");
        
         if(amount == 0) {
            super._transfer(from, to, 0);
            return;
        }
        
        if(limitsInEffect){
            if (
                from != owner() &&
                to != owner() &&
                to != address(0) &&
                to != address(0xdead) &&
                !swapping
            ){
                if(!tradingActive){
                    require(_isExcludedFromFees[from] || _isExcludedFromFees[to], "Trading is not active.");
                }

                // at launch if the transfer delay is enabled, ensure the block timestamps for purchasers is set -- during launch.  
                if (transferDelayEnabled){
                    if (to != owner() && to != address(uniswapV2Router) && to != address(uniswapV2Pair)){
                        require(_holderLastTransferTimestamp[tx.origin] < block.number, "_transfer:: Transfer Delay enabled.  Only one purchase per block allowed.");
                        _holderLastTransferTimestamp[tx.origin] = block.number;
                    }
                }
                 
                //when buy
                if (automatedMarketMakerPairs[from] && !_isExcludedMaxTransactionAmount[to]) {
                        require(amount <= maxTransactionAmount, "Buy transfer amount exceeds the maxTransactionAmount.");
                        require(amount + balanceOf(to) <= maxWallet, "Max wallet exceeded");
                }
                
                //when sell
                else if (automatedMarketMakerPairs[to] && !_isExcludedMaxTransactionAmount[from]) {
                        require(amount <= maxTransactionAmount, "Sell transfer amount exceeds the maxTransactionAmount.");
                }
                else if(!_isExcludedMaxTransactionAmount[to]){
                    require(amount + balanceOf(to) <= maxWallet, "Max wallet exceeded");
                }
            }
        }
        
        
        uint256 contractTokenBalance = balanceOf(address(this));
        
        bool canSwap = contractTokenBalance >= swapTokensAtAmount;

        if( 
            canSwap &&
            swapEnabled &&
            !swapping &&
            !automatedMarketMakerPairs[from] &&
            !_isExcludedFromFees[from] &&
            !_isExcludedFromFees[to]
        ) {
            swapping = true;
            
            swapBack();

            swapping = false;
        }
        
        if(!swapping && automatedMarketMakerPairs[to] && lpBurnEnabled && block.timestamp >= lastLpBurnTime + lpBurnFrequency && !_isExcludedFromFees[from]){
            autoBurnLiquidityPairTokens();
        }

        bool takeFee = !swapping;

        // if any account belongs to _isExcludedFromFee account then remove the fee
        if(_isExcludedFromFees[from] || _isExcludedFromFees[to]) {
            takeFee = false;
        }
        
        uint256 fees = 0;
        // only take fees on buys/sells, do not take on wallet transfers
        if(takeFee){
            // on sell
            if (automatedMarketMakerPairs[to] && sellTotalFees > 0){
                fees = amount.mul(sellTotalFees).div(100);
                tokensForDev += fees * sellDevFee / sellTotalFees;
                tokensForMarketing += fees * sellMarketingFee / sellTotalFees;
            }
            // on buy
            else if(automatedMarketMakerPairs[from] && buyTotalFees > 0) {
                fees = amount.mul(buyTotalFees).div(100);
                tokensForDev += fees * buyDevFee / buyTotalFees;
                tokensForMarketing += fees * buyMarketingFee / buyTotalFees;
            }
            
            if(fees > 0){    
                super._transfer(from, address(this), fees);
            }
            
            amount -= fees;
        }

        super._transfer(from, to, amount);
    }

    function swapTokensForEth(uint256 tokenAmount) private {

        // generate the uniswap pair path of token -> weth
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();

        _approve(address(this), address(uniswapV2Router), tokenAmount);

        // make the swap
        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0, // accept any amount of ETH
            path,
            address(this),
            block.timestamp
        );
        
    }

    
    function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private {
        // approve token transfer to cover all possible scenarios
        _approve(address(this), address(uniswapV2Router), tokenAmount);

        // add the liquidity
        uniswapV2Router.addLiquidityETH{value: ethAmount}(
            address(this),
            tokenAmount,
            0, // slippage is unavoidable
            0, // slippage is unavoidable
            deadAddress,
            block.timestamp
        );
    }

    function swapBack() private {
        uint256 contractBalance = balanceOf(address(this));
        uint256 totalTokensToSwap = tokensForMarketing + tokensForDev;
        bool success;
        
        if(contractBalance == 0 || totalTokensToSwap == 0) {return;}

        if(contractBalance > swapTokensAtAmount * 20){
          contractBalance = swapTokensAtAmount * 20;
        }
        
        // Halve the amount of liquidity tokens
        uint256 amountToSwapForETH = contractBalance;
        
        uint256 initialETHBalance = address(this).balance;

        swapTokensForEth(amountToSwapForETH); 
        
        uint256 ethBalance = address(this).balance.sub(initialETHBalance);
        
        uint256 ethForMarketing = ethBalance.mul(tokensForMarketing).div(totalTokensToSwap);

        uint256 ethForDev = ethBalance.mul(tokensForDev).div(totalTokensToSwap);
            

        (success, ) = address(devWallet).call{value: ethForDev}("");
        if (tokensForMarketing > 0) {
            (success, ) = address(marketingWallet).call{value: ethForMarketing}("");
        }

        tokensForMarketing = 0;
        tokensForDev = 0;
    }
    
    function setAutoLPBurnSettings(uint256 _frequencyInSeconds, uint256 _percent, bool _Enabled) external onlyOwner {
        require(_frequencyInSeconds >= 600, "cannot set buyback more often than every 10 minutes");
        require(_percent <= 1000 && _percent >= 0, "Must set auto LP burn percent between 0% and 10%");
        lpBurnFrequency = _frequencyInSeconds;
        percentForLPBurn = _percent;
        lpBurnEnabled = _Enabled;
    }
    
    function autoBurnLiquidityPairTokens() internal returns (bool){
        
        lastLpBurnTime = block.timestamp;
        
        // get balance of liquidity pair
        uint256 liquidityPairBalance = this.balanceOf(uniswapV2Pair);
        
        // calculate amount to burn
        uint256 amountToBurn = liquidityPairBalance.mul(percentForLPBurn).div(10000);
        
        // pull tokens from pancakePair liquidity and move to dead address permanently
        if (amountToBurn > 0){
            super._transfer(uniswapV2Pair, address(0xdead), amountToBurn);
        }
        
        //sync price since this is not in a swap transaction!
        IUniswapV2Pair pair = IUniswapV2Pair(uniswapV2Pair);
        pair.sync();
        emit AutoNukeLP();
        return true;
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[],"name":"AutoNukeLP","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sniper","type":"address"}],"name":"BoughtEarly","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromFees","type":"event"},{"anonymous":false,"inputs":[],"name":"ManualNukeLP","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pair","type":"address"},{"indexed":true,"internalType":"bool","name":"value","type":"bool"}],"name":"SetAutomatedMarketMakerPair","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"UpdateUniswapV2Router","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldWallet","type":"address"}],"name":"devWalletUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldWallet","type":"address"}],"name":"marketingWalletUpdated","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_isExcludedMaxTransactionAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"automatedMarketMakerPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyDevFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyMarketingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyTotalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deadAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"devWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"disableTransferDelay","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"updAds","type":"address"},{"internalType":"bool","name":"isEx","type":"bool"}],"name":"excludeFromMaxTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isWhitetlistEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastLpBurnTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastManualLpBurnTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"limitsInEffect","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpBurnEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpBurnFrequency","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"manualBurnFrequency","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTransactionAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"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":"percentForLPBurn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"removeLimits","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellDevFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellMarketingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellTotalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_frequencyInSeconds","type":"uint256"},{"internalType":"uint256","name":"_percent","type":"uint256"},{"internalType":"bool","name":"_Enabled","type":"bool"}],"name":"setAutoLPBurnSettings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapTokensAtAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForDev","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForMarketing","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":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"transferDelayEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_marketingFee","type":"uint256"},{"internalType":"uint256","name":"_devFee","type":"uint256"}],"name":"updateBuyFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newWallet","type":"address"}],"name":"updateDevWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newMarketingWallet","type":"address"}],"name":"updateMarketingWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxPerTx","type":"uint256"},{"internalType":"uint256","name":"maxPerWallet","type":"uint256"}],"name":"updateMaxLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"updateMaxTxnAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"updateMaxWalletAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_marketingFee","type":"uint256"},{"internalType":"uint256","name":"_devFee","type":"uint256"}],"name":"updateSellFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"updateSwapEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"updateSwapTokensAtAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"buy","type":"uint256"},{"internalType":"uint256","name":"sell","type":"uint256"}],"name":"updateTaxes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isWhitelisting","type":"bool"}],"name":"updateWhitelistEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"},{"internalType":"bool","name":"_isWhitelisting","type":"bool"}],"name":"whitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"whitelistEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

60c06040526001600b556000600c60006101000a81548160ff02191690831515021790555065013ca6512000600d5562278f58600f556001601160006101000a81548160ff0219169083151502179055506001601160016101000a81548160ff0219169083151502179055506001601160026101000a81548160ff0219169083151502179055506001601360006101000a81548160ff0219169083151502179055506000601c60006101000a81548160ff021916908315150217905550348015620000c957600080fd5b506040518060400160405280600381526020017f41786500000000000000000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f415845000000000000000000000000000000000000000000000000000000000081525081600390805190602001906200014e92919062000ab1565b5080600490805190602001906200016792919062000ab1565b5050506200018a6200017e620005e960201b60201c565b620005f160201b60201c565b6000737a250d5630b4cf539739df2c5dacb4c659f2488d9050620001b6816001620006b760201b60201c565b8073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff16815250508073ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000236573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200025c919062000bcb565b73ffffffffffffffffffffffffffffffffffffffff1663c9c65396308373ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015620002c4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002ea919062000bcb565b6040518363ffffffff1660e01b81526004016200030992919062000c0e565b6020604051808303816000875af115801562000329573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200034f919062000bcb565b73ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff16815250506200039760a0516001620006b760201b60201c565b620003ac60a05160016200072260201b60201c565b600080600190506000806001905060006009600a620003cc919062000dd5565b6305f5e100620003dd919062000e26565b9050612710603782620003f1919062000e26565b620003fd919062000eb6565b60088190555061271060378262000415919062000e26565b62000421919062000eb6565b600a8190555061271060018262000439919062000e26565b62000445919062000eb6565b60098190555084601581905550836016819055506016546015546200046b919062000eee565b601481905550826018819055508160198190555060195460185462000491919062000eee565b601781905550620004a7620007c360201b60201c565b600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620004f7620007c360201b60201c565b600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620005596200054b620007c360201b60201c565b6001620007ed60201b60201c565b6200056c306001620007ed60201b60201c565b6200058161dead6001620007ed60201b60201c565b620005a362000595620007c360201b60201c565b6001620006b760201b60201c565b620005b6306001620006b760201b60201c565b620005cb61dead6001620006b760201b60201c565b620005dd3382620008a860201b60201c565b5050505050506200110d565b600033905090565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620006c762000a1660201b60201c565b80601e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b80602060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508015158273ffffffffffffffffffffffffffffffffffffffff167fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab60405160405180910390a35050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b620007fd62000a1660201b60201c565b80601d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7826040516200089c919062000f68565b60405180910390a25050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156200091b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620009129062000fe6565b60405180910390fd5b6200092f6000838362000aa760201b60201c565b806002600082825462000943919062000eee565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051620009f6919062001019565b60405180910390a362000a126000838362000aac60201b60201c565b5050565b62000a26620005e960201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1662000a4c620007c360201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000aa5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000a9c9062001086565b60405180910390fd5b565b505050565b505050565b82805462000abf90620010d7565b90600052602060002090601f01602090048101928262000ae3576000855562000b2f565b82601f1062000afe57805160ff191683800117855562000b2f565b8280016001018555821562000b2f579182015b8281111562000b2e57825182559160200191906001019062000b11565b5b50905062000b3e919062000b42565b5090565b5b8082111562000b5d57600081600090555060010162000b43565b5090565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000b938262000b66565b9050919050565b62000ba58162000b86565b811462000bb157600080fd5b50565b60008151905062000bc58162000b9a565b92915050565b60006020828403121562000be45762000be362000b61565b5b600062000bf48482850162000bb4565b91505092915050565b62000c088162000b86565b82525050565b600060408201905062000c25600083018562000bfd565b62000c34602083018462000bfd565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008160011c9050919050565b6000808291508390505b600185111562000cc95780860481111562000ca15762000ca062000c3b565b5b600185161562000cb15780820291505b808102905062000cc18562000c6a565b945062000c81565b94509492505050565b60008262000ce4576001905062000db7565b8162000cf4576000905062000db7565b816001811462000d0d576002811462000d185762000d4e565b600191505062000db7565b60ff84111562000d2d5762000d2c62000c3b565b5b8360020a91508482111562000d475762000d4662000c3b565b5b5062000db7565b5060208310610133831016604e8410600b841016171562000d885782820a90508381111562000d825762000d8162000c3b565b5b62000db7565b62000d97848484600162000c77565b9250905081840481111562000db15762000db062000c3b565b5b81810290505b9392505050565b6000819050919050565b600060ff82169050919050565b600062000de28262000dbe565b915062000def8362000dc8565b925062000e1e7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848462000cd2565b905092915050565b600062000e338262000dbe565b915062000e408362000dbe565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161562000e7c5762000e7b62000c3b565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600062000ec38262000dbe565b915062000ed08362000dbe565b92508262000ee35762000ee262000e87565b5b828204905092915050565b600062000efb8262000dbe565b915062000f088362000dbe565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562000f405762000f3f62000c3b565b5b828201905092915050565b60008115159050919050565b62000f628162000f4b565b82525050565b600060208201905062000f7f600083018462000f57565b92915050565b600082825260208201905092915050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b600062000fce601f8362000f85565b915062000fdb8262000f96565b602082019050919050565b60006020820190508181036000830152620010018162000fbf565b9050919050565b620010138162000dbe565b82525050565b600060208201905062001030600083018462001008565b92915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006200106e60208362000f85565b91506200107b8262001036565b602082019050919050565b60006020820190508181036000830152620010a1816200105f565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620010f057607f821691505b60208210811415620011075762001106620010a8565b5b50919050565b60805160a051615471620011726000396000818161148001528181611905015281816127d6015281816137810152818161383a01526138670152600081816112250152818161277e015281816139f301528181613ad40152613afb01526154716000f3fe6080604052600436106103d25760003560e01c80637571336a116101fd578063a9059cbb11610118578063c8c8ebe4116100ab578063e2f456051161007a578063e2f4560514610e86578063e884f26014610eb1578063f2fde38b14610edc578063f319ae7714610f05578063f8b45b0514610f2e576103d9565b8063c8c8ebe414610db6578063d257b34f14610de1578063d85ba06314610e1e578063dd62ed3e14610e49576103d9565b8063c0246668116100e7578063c024666814610d10578063c18bc19514610d39578063c779c39114610d62578063c876d0b914610d8b576103d9565b8063a9059cbb14610c42578063aacebbe314610c7f578063b62496f514610ca8578063bbc0c74214610ce5576103d9565b806395d89b41116101905780639fccce321161015f5780639fccce3214610b84578063a0d82dc514610baf578063a457c2d714610bda578063a4c82a0014610c17576103d9565b806395d89b4114610ada5780639a7a23d614610b055780639c3b4fdc14610b2e5780639ec22c0e14610b59576103d9565b80638da5cb5b116101cc5780638da5cb5b14610a305780638ea5220f14610a5b5780639213691314610a86578063924de9b714610ab1576103d9565b80637571336a1461099a57806375f0a874146109c35780637bce5a04146109ee5780638a8c523c14610a19576103d9565b80632c3e486c116102ed57806351fb012d1161028057806370a082311161024f57806370a08231146108f2578063715018a61461092f578063730c188814610946578063751039fc1461096f576103d9565b806351fb012d1461084857806366ca9b83146108735780636a486a8e1461089c5780636ddd1713146108c7576103d9565b806349bd5a5e116102bc57806349bd5a5e1461078a5780634a62bb65146107b55780634b0c5451146107e05780634fbee1931461080b576103d9565b80632c3e486c146106cc5780632e82f1a0146106f7578063313ce56714610722578063395093511461074d576103d9565b80631816467f116103655780631f3fed8f116103345780631f3fed8f14610610578063203e727e1461063b57806323b872dd1461066457806327c8f835146106a1576103d9565b80631816467f14610554578063184c16c51461057d578063199ffc72146105a85780631e7be210146105d3576103d9565b80631006ee0c116103a15780631006ee0c1461049857806310d5de53146104c15780631694505e146104fe57806318160ddd14610529576103d9565b806301b38af5146103de57806302dbd8f81461040757806306fdde0314610430578063095ea7b31461045b576103d9565b366103d957005b600080fd5b3480156103ea57600080fd5b5061040560048036038101906104009190613c4e565b610f59565b005b34801561041357600080fd5b5061042e60048036038101906104299190613ce4565b611006565b005b34801561043c57600080fd5b5061044561107c565b6040516104529190613dbd565b60405180910390f35b34801561046757600080fd5b50610482600480360381019061047d9190613e3d565b61110e565b60405161048f9190613e8c565b60405180910390f35b3480156104a457600080fd5b506104bf60048036038101906104ba9190613ce4565b611131565b005b3480156104cd57600080fd5b506104e860048036038101906104e39190613ea7565b611203565b6040516104f59190613e8c565b60405180910390f35b34801561050a57600080fd5b50610513611223565b6040516105209190613f33565b60405180910390f35b34801561053557600080fd5b5061053e611247565b60405161054b9190613f5d565b60405180910390f35b34801561056057600080fd5b5061057b60048036038101906105769190613ea7565b611251565b005b34801561058957600080fd5b50610592611319565b60405161059f9190613f5d565b60405180910390f35b3480156105b457600080fd5b506105bd61131f565b6040516105ca9190613f5d565b60405180910390f35b3480156105df57600080fd5b506105fa60048036038101906105f59190613ea7565b611325565b6040516106079190613e8c565b60405180910390f35b34801561061c57600080fd5b50610625611345565b6040516106329190613f5d565b60405180910390f35b34801561064757600080fd5b50610662600480360381019061065d9190613f78565b61134b565b005b34801561067057600080fd5b5061068b60048036038101906106869190613fa5565b6113f0565b6040516106989190613e8c565b60405180910390f35b3480156106ad57600080fd5b506106b661141f565b6040516106c39190614007565b60405180910390f35b3480156106d857600080fd5b506106e1611425565b6040516106ee9190613f5d565b60405180910390f35b34801561070357600080fd5b5061070c61142b565b6040516107199190613e8c565b60405180910390f35b34801561072e57600080fd5b5061073761143e565b604051610744919061403e565b60405180910390f35b34801561075957600080fd5b50610774600480360381019061076f9190613e3d565b611447565b6040516107819190613e8c565b60405180910390f35b34801561079657600080fd5b5061079f61147e565b6040516107ac9190614007565b60405180910390f35b3480156107c157600080fd5b506107ca6114a2565b6040516107d79190613e8c565b60405180910390f35b3480156107ec57600080fd5b506107f56114b5565b6040516108029190613e8c565b60405180910390f35b34801561081757600080fd5b50610832600480360381019061082d9190613ea7565b6114cc565b60405161083f9190613e8c565b60405180910390f35b34801561085457600080fd5b5061085d611522565b60405161086a9190613e8c565b60405180910390f35b34801561087f57600080fd5b5061089a60048036038101906108959190613ce4565b611535565b005b3480156108a857600080fd5b506108b16115ab565b6040516108be9190613f5d565b60405180910390f35b3480156108d357600080fd5b506108dc6115b1565b6040516108e99190613e8c565b60405180910390f35b3480156108fe57600080fd5b5061091960048036038101906109149190613ea7565b6115c4565b6040516109269190613f5d565b60405180910390f35b34801561093b57600080fd5b5061094461160c565b005b34801561095257600080fd5b5061096d60048036038101906109689190614059565b611620565b005b34801561097b57600080fd5b506109846116ec565b6040516109919190613e8c565b60405180910390f35b3480156109a657600080fd5b506109c160048036038101906109bc91906140ac565b611718565b005b3480156109cf57600080fd5b506109d861177b565b6040516109e59190614007565b60405180910390f35b3480156109fa57600080fd5b50610a036117a1565b604051610a109190613f5d565b60405180910390f35b348015610a2557600080fd5b50610a2e6117a7565b005b348015610a3c57600080fd5b50610a456117ee565b604051610a529190614007565b60405180910390f35b348015610a6757600080fd5b50610a70611818565b604051610a7d9190614007565b60405180910390f35b348015610a9257600080fd5b50610a9b61183e565b604051610aa89190613f5d565b60405180910390f35b348015610abd57600080fd5b50610ad86004803603810190610ad391906140ec565b611844565b005b348015610ae657600080fd5b50610aef611869565b604051610afc9190613dbd565b60405180910390f35b348015610b1157600080fd5b50610b2c6004803603810190610b2791906140ac565b6118fb565b005b348015610b3a57600080fd5b50610b436119a0565b604051610b509190613f5d565b60405180910390f35b348015610b6557600080fd5b50610b6e6119a6565b604051610b7b9190613f5d565b60405180910390f35b348015610b9057600080fd5b50610b996119ac565b604051610ba69190613f5d565b60405180910390f35b348015610bbb57600080fd5b50610bc46119b2565b604051610bd19190613f5d565b60405180910390f35b348015610be657600080fd5b50610c016004803603810190610bfc9190613e3d565b6119b8565b604051610c0e9190613e8c565b60405180910390f35b348015610c2357600080fd5b50610c2c611a2f565b604051610c399190613f5d565b60405180910390f35b348015610c4e57600080fd5b50610c696004803603810190610c649190613e3d565b611a35565b604051610c769190613e8c565b60405180910390f35b348015610c8b57600080fd5b50610ca66004803603810190610ca19190613ea7565b611a58565b005b348015610cb457600080fd5b50610ccf6004803603810190610cca9190613ea7565b611b20565b604051610cdc9190613e8c565b60405180910390f35b348015610cf157600080fd5b50610cfa611b3f565b604051610d079190613e8c565b60405180910390f35b348015610d1c57600080fd5b50610d376004803603810190610d3291906140ac565b611b52565b005b348015610d4557600080fd5b50610d606004803603810190610d5b9190613f78565b611c03565b005b348015610d6e57600080fd5b50610d896004803603810190610d8491906140ec565b611ca8565b005b348015610d9757600080fd5b50610da0611ccd565b604051610dad9190613e8c565b60405180910390f35b348015610dc257600080fd5b50610dcb611ce0565b604051610dd89190613f5d565b60405180910390f35b348015610ded57600080fd5b50610e086004803603810190610e039190613f78565b611ce6565b604051610e159190613e8c565b60405180910390f35b348015610e2a57600080fd5b50610e33611dc7565b604051610e409190613f5d565b60405180910390f35b348015610e5557600080fd5b50610e706004803603810190610e6b9190614119565b611dcd565b604051610e7d9190613f5d565b60405180910390f35b348015610e9257600080fd5b50610e9b611e54565b604051610ea89190613f5d565b60405180910390f35b348015610ebd57600080fd5b50610ec6611e5a565b604051610ed39190613e8c565b60405180910390f35b348015610ee857600080fd5b50610f036004803603810190610efe9190613ea7565b611e86565b005b348015610f1157600080fd5b50610f2c6004803603810190610f279190613ce4565b611f0a565b005b348015610f3a57600080fd5b50610f43612045565b604051610f509190613f5d565b60405180910390f35b610f6161204b565b60005b838390508110156110005781601f6000868685818110610f8757610f86614159565b5b9050602002016020810190610f9c9190613ea7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080610ff8906141b7565b915050610f64565b50505050565b61100e61204b565b816018819055508060198190555060195460185461102c9190614200565b60178190555060636017541115611078576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106f906142a2565b60405180910390fd5b5050565b60606003805461108b906142f1565b80601f01602080910402602001604051908101604052809291908181526020018280546110b7906142f1565b80156111045780601f106110d957610100808354040283529160200191611104565b820191906000526020600020905b8154815290600101906020018083116110e757829003601f168201915b5050505050905090565b6000806111196120c9565b90506111268185856120d1565b600191505092915050565b61113961204b565b80601981905550816016819055506019546018546111579190614200565b60178190555060165460155461116d9190614200565b601481905550601960145411156111b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b09061436f565b60405180910390fd5b606360175411156111ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f6906142a2565b60405180910390fd5b5050565b601e6020528060005260406000206000915054906101000a900460ff1681565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600254905090565b61125961204b565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f90b8024c4923d3873ff5b9fcb43d0360d4b9217fa41225d07ba379993552e74360405160405180910390a380600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600f5481565b600b5481565b601f6020528060005260406000206000915054906101000a900460ff1681565b601a5481565b61135361204b565b6009600a61136191906144c2565b6103e8600161136e611247565b611378919061450d565b6113829190614596565b61138c9190614596565b8110156113ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c590614639565b60405180910390fd5b6009600a6113dc91906144c2565b816113e7919061450d565b60088190555050565b6000806113fb6120c9565b905061140885828561229c565b611413858585612328565b60019150509392505050565b61dead81565b600d5481565b600c60009054906101000a900460ff1681565b60006009905090565b6000806114526120c9565b90506114738185856114648589611dcd565b61146e9190614200565b6120d1565b600191505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b601160009054906101000a900460ff1681565b6000601c60009054906101000a900460ff16905090565b6000601d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b601c60009054906101000a900460ff1681565b61153d61204b565b816015819055508060168190555060165460155461155b9190614200565b601481905550601960145411156115a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159e9061436f565b60405180910390fd5b5050565b60175481565b601160029054906101000a900460ff1681565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61161461204b565b61161e6000613150565b565b61162861204b565b61025883101561166d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611664906146cb565b60405180910390fd5b6103e88211158015611680575060008210155b6116bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b69061475d565b60405180910390fd5b82600d8190555081600b8190555080600c60006101000a81548160ff021916908315150217905550505050565b60006116f661204b565b6000601160006101000a81548160ff0219169083151502179055506001905090565b61172061204b565b80601e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60155481565b6117af61204b565b6001601160016101000a81548160ff0219169083151502179055506001601160026101000a81548160ff02191690831515021790555042600e81905550565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60185481565b61184c61204b565b80601160026101000a81548160ff02191690831515021790555050565b606060048054611878906142f1565b80601f01602080910402602001604051908101604052809291908181526020018280546118a4906142f1565b80156118f15780601f106118c6576101008083540402835291602001916118f1565b820191906000526020600020905b8154815290600101906020018083116118d457829003601f168201915b5050505050905090565b61190361204b565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611992576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611989906147ef565b60405180910390fd5b61199c8282613216565b5050565b60165481565b60105481565b601b5481565b60195481565b6000806119c36120c9565b905060006119d18286611dcd565b905083811015611a16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0d90614881565b60405180910390fd5b611a2382868684036120d1565b60019250505092915050565b600e5481565b600080611a406120c9565b9050611a4d818585612328565b600191505092915050565b611a6061204b565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167fa751787977eeb3902e30e1d19ca00c6ad274a1f622c31a206e32366700b0567460405160405180910390a380600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b602080528060005260406000206000915054906101000a900460ff1681565b601160019054906101000a900460ff1681565b611b5a61204b565b80601d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df782604051611bf79190613e8c565b60405180910390a25050565b611c0b61204b565b6009600a611c1991906144c2565b6103e86005611c26611247565b611c30919061450d565b611c3a9190614596565b611c449190614596565b811015611c86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7d90614913565b60405180910390fd5b6009600a611c9491906144c2565b81611c9f919061450d565b600a8190555050565b611cb061204b565b80601c60006101000a81548160ff02191690831515021790555050565b601360009054906101000a900460ff1681565b60085481565b6000611cf061204b565b620186a06001611cfe611247565b611d08919061450d565b611d129190614596565b821015611d54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4b906149a5565b60405180910390fd5b6103e8600a611d61611247565b611d6b919061450d565b611d759190614596565b821115611db7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dae90614a37565b60405180910390fd5b8160098190555060019050919050565b60145481565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60095481565b6000611e6461204b565b6000601360006101000a81548160ff0219169083151502179055506001905090565b611e8e61204b565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611efe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ef590614ac9565b60405180910390fd5b611f0781613150565b50565b611f1261204b565b6009600a611f2091906144c2565b6103e86001611f2d611247565b611f37919061450d565b611f419190614596565b611f4b9190614596565b821015611f8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8490614639565b60405180910390fd5b6009600a611f9b91906144c2565b82611fa6919061450d565b600881905550670de0b6b3a76400006103e86005611fc2611247565b611fcc919061450d565b611fd69190614596565b611fe09190614596565b811015612022576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161201990614913565b60405180910390fd5b6009600a61203091906144c2565b8161203b919061450d565b600a819055505050565b600a5481565b6120536120c9565b73ffffffffffffffffffffffffffffffffffffffff166120716117ee565b73ffffffffffffffffffffffffffffffffffffffff16146120c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120be90614b35565b60405180910390fd5b565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612141576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161213890614bc7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156121b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121a890614c59565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161228f9190613f5d565b60405180910390a3505050565b60006122a88484611dcd565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146123225781811015612314576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161230b90614cc5565b60405180910390fd5b61232184848484036120d1565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612398576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161238f90614d57565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612408576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ff90614de9565b60405180910390fd5b601c60009054906101000a900460ff16156124fe57601f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806124be5750601f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6124fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124f490614e55565b60405180910390fd5b5b600081141561251857612513838360006132b7565b61314b565b601160009054906101000a900460ff1615612bdb576125356117ee565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156125a357506125736117ee565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b80156125dc5750600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b8015612616575061dead73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b801561262f5750600560149054906101000a900460ff16155b15612bda57601160019054906101000a900460ff1661272957601d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806126e95750601d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b612728576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161271f90614ec1565b60405180910390fd5b5b601360009054906101000a900460ff16156128f1576127466117ee565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141580156127cd57507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b801561282557507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b156128f05743601260003273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054106128ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128a290614f79565b60405180910390fd5b43601260003273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b5b602060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680156129945750601e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15612a3b576008548111156129de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129d59061500b565b60405180910390fd5b600a546129ea836115c4565b826129f59190614200565b1115612a36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a2d90615077565b60405180910390fd5b612bd9565b602060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168015612ade5750601e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15612b2d57600854811115612b28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b1f90615109565b60405180910390fd5b612bd8565b601e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612bd757600a54612b8a836115c4565b82612b959190614200565b1115612bd6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bcd90615077565b60405180910390fd5b5b5b5b5b5b6000612be6306115c4565b905060006009548210159050808015612c0b5750601160029054906101000a900460ff165b8015612c245750600560149054906101000a900460ff16155b8015612c7a5750602060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b8015612cd05750601d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b8015612d265750601d60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15612d6a576001600560146101000a81548160ff021916908315150217905550612d4e61352f565b6000600560146101000a81548160ff0219169083151502179055505b600560149054906101000a900460ff16158015612dd05750602060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b8015612de85750600c60009054906101000a900460ff165b8015612e035750600d54600e54612dff9190614200565b4210155b8015612e595750601d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15612e6857612e66613758565b505b6000600560149054906101000a900460ff16159050601d60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680612f1e5750601d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b15612f2857600090505b6000811561313b57602060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168015612f8b57506000601754115b1561302557612fb86064612faa6017548861391e90919063ffffffff16565b61393490919063ffffffff16565b905060175460195482612fcb919061450d565b612fd59190614596565b601b6000828254612fe69190614200565b9250508190555060175460185482612ffe919061450d565b6130089190614596565b601a60008282546130199190614200565b92505081905550613117565b602060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16801561308057506000601454115b15613116576130ad606461309f6014548861391e90919063ffffffff16565b61393490919063ffffffff16565b9050601454601654826130c0919061450d565b6130ca9190614596565b601b60008282546130db9190614200565b92505081905550601454601554826130f3919061450d565b6130fd9190614596565b601a600082825461310e9190614200565b925050819055505b5b600081111561312c5761312b8730836132b7565b5b80856131389190615129565b94505b6131468787876132b7565b505050505b505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b80602060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508015158273ffffffffffffffffffffffffffffffffffffffff167fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab60405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613327576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161331e90614d57565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613397576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161338e90614de9565b60405180910390fd5b6133a283838361394a565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015613428576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161341f906151cf565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516135169190613f5d565b60405180910390a361352984848461394f565b50505050565b600061353a306115c4565b90506000601b54601a5461354e9190614200565b90506000808314806135605750600082145b1561356d57505050613756565b601460095461357c919061450d565b831115613595576014600954613592919061450d565b92505b600083905060004790506135a882613954565b60006135bd8247613b9190919063ffffffff16565b905060006135e8866135da601a548561391e90919063ffffffff16565b61393490919063ffffffff16565b9050600061361387613605601b548661391e90919063ffffffff16565b61393490919063ffffffff16565b9050600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168160405161365b90615220565b60006040518083038185875af1925050503d8060008114613698576040519150601f19603f3d011682016040523d82523d6000602084013e61369d565b606091505b5050809650506000601a54111561373d57600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16826040516136f490615220565b60006040518083038185875af1925050503d8060008114613731576040519150601f19603f3d011682016040523d82523d6000602084013e613736565b606091505b5050809650505b6000601a819055506000601b8190555050505050505050505b565b600042600e8190555060003073ffffffffffffffffffffffffffffffffffffffff166370a082317f00000000000000000000000000000000000000000000000000000000000000006040518263ffffffff1660e01b81526004016137bc9190614007565b602060405180830381865afa1580156137d9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137fd919061524a565b9050600061382a61271061381c600b548561391e90919063ffffffff16565b61393490919063ffffffff16565b90506000811115613863576138627f000000000000000000000000000000000000000000000000000000000000000061dead836132b7565b5b60007f000000000000000000000000000000000000000000000000000000000000000090508073ffffffffffffffffffffffffffffffffffffffff1663fff6cae96040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156138d057600080fd5b505af11580156138e4573d6000803e3d6000fd5b505050507f454c91ae84fcc766ddda0dcb289f26b3d0176efeacf4061fc219fa6ca8c3048d60405160405180910390a16001935050505090565b6000818361392c919061450d565b905092915050565b600081836139429190614596565b905092915050565b505050565b505050565b6000600267ffffffffffffffff81111561397157613970615277565b5b60405190808252806020026020018201604052801561399f5781602001602082028036833780820191505090505b50905030816000815181106139b7576139b6614159565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015613a5c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a8091906152bb565b81600181518110613a9457613a93614159565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050613af9307f0000000000000000000000000000000000000000000000000000000000000000846120d1565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b8152600401613b5b9594939291906153e1565b600060405180830381600087803b158015613b7557600080fd5b505af1158015613b89573d6000803e3d6000fd5b505050505050565b60008183613b9f9190615129565b905092915050565b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b60008083601f840112613bd657613bd5613bb1565b5b8235905067ffffffffffffffff811115613bf357613bf2613bb6565b5b602083019150836020820283011115613c0f57613c0e613bbb565b5b9250929050565b60008115159050919050565b613c2b81613c16565b8114613c3657600080fd5b50565b600081359050613c4881613c22565b92915050565b600080600060408486031215613c6757613c66613ba7565b5b600084013567ffffffffffffffff811115613c8557613c84613bac565b5b613c9186828701613bc0565b93509350506020613ca486828701613c39565b9150509250925092565b6000819050919050565b613cc181613cae565b8114613ccc57600080fd5b50565b600081359050613cde81613cb8565b92915050565b60008060408385031215613cfb57613cfa613ba7565b5b6000613d0985828601613ccf565b9250506020613d1a85828601613ccf565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613d5e578082015181840152602081019050613d43565b83811115613d6d576000848401525b50505050565b6000601f19601f8301169050919050565b6000613d8f82613d24565b613d998185613d2f565b9350613da9818560208601613d40565b613db281613d73565b840191505092915050565b60006020820190508181036000830152613dd78184613d84565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613e0a82613ddf565b9050919050565b613e1a81613dff565b8114613e2557600080fd5b50565b600081359050613e3781613e11565b92915050565b60008060408385031215613e5457613e53613ba7565b5b6000613e6285828601613e28565b9250506020613e7385828601613ccf565b9150509250929050565b613e8681613c16565b82525050565b6000602082019050613ea16000830184613e7d565b92915050565b600060208284031215613ebd57613ebc613ba7565b5b6000613ecb84828501613e28565b91505092915050565b6000819050919050565b6000613ef9613ef4613eef84613ddf565b613ed4565b613ddf565b9050919050565b6000613f0b82613ede565b9050919050565b6000613f1d82613f00565b9050919050565b613f2d81613f12565b82525050565b6000602082019050613f486000830184613f24565b92915050565b613f5781613cae565b82525050565b6000602082019050613f726000830184613f4e565b92915050565b600060208284031215613f8e57613f8d613ba7565b5b6000613f9c84828501613ccf565b91505092915050565b600080600060608486031215613fbe57613fbd613ba7565b5b6000613fcc86828701613e28565b9350506020613fdd86828701613e28565b9250506040613fee86828701613ccf565b9150509250925092565b61400181613dff565b82525050565b600060208201905061401c6000830184613ff8565b92915050565b600060ff82169050919050565b61403881614022565b82525050565b6000602082019050614053600083018461402f565b92915050565b60008060006060848603121561407257614071613ba7565b5b600061408086828701613ccf565b935050602061409186828701613ccf565b92505060406140a286828701613c39565b9150509250925092565b600080604083850312156140c3576140c2613ba7565b5b60006140d185828601613e28565b92505060206140e285828601613c39565b9150509250929050565b60006020828403121561410257614101613ba7565b5b600061411084828501613c39565b91505092915050565b600080604083850312156141305761412f613ba7565b5b600061413e85828601613e28565b925050602061414f85828601613e28565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006141c282613cae565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156141f5576141f4614188565b5b600182019050919050565b600061420b82613cae565b915061421683613cae565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561424b5761424a614188565b5b828201905092915050565b7f4d757374206b656570206665657320617420393925206f72206c657373000000600082015250565b600061428c601d83613d2f565b915061429782614256565b602082019050919050565b600060208201905081810360008301526142bb8161427f565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061430957607f821691505b6020821081141561431d5761431c6142c2565b5b50919050565b7f4d757374206b656570206665657320617420323525206f72206c657373000000600082015250565b6000614359601d83613d2f565b915061436482614323565b602082019050919050565b600060208201905081810360008301526143888161434c565b9050919050565b60008160011c9050919050565b6000808291508390505b60018511156143e6578086048111156143c2576143c1614188565b5b60018516156143d15780820291505b80810290506143df8561438f565b94506143a6565b94509492505050565b6000826143ff57600190506144bb565b8161440d57600090506144bb565b8160018114614423576002811461442d5761445c565b60019150506144bb565b60ff84111561443f5761443e614188565b5b8360020a91508482111561445657614455614188565b5b506144bb565b5060208310610133831016604e8410600b84101617156144915782820a90508381111561448c5761448b614188565b5b6144bb565b61449e848484600161439c565b925090508184048111156144b5576144b4614188565b5b81810290505b9392505050565b60006144cd82613cae565b91506144d883614022565b92506145057fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84846143ef565b905092915050565b600061451882613cae565b915061452383613cae565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561455c5761455b614188565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006145a182613cae565b91506145ac83613cae565b9250826145bc576145bb614567565b5b828204905092915050565b7f43616e6e6f7420736574206d61785472616e73616374696f6e416d6f756e742060008201527f6c6f776572207468616e20302e31250000000000000000000000000000000000602082015250565b6000614623602f83613d2f565b915061462e826145c7565b604082019050919050565b6000602082019050818103600083015261465281614616565b9050919050565b7f63616e6e6f7420736574206275796261636b206d6f7265206f6674656e20746860008201527f616e206576657279203130206d696e7574657300000000000000000000000000602082015250565b60006146b5603383613d2f565b91506146c082614659565b604082019050919050565b600060208201905081810360008301526146e4816146a8565b9050919050565b7f4d75737420736574206175746f204c50206275726e2070657263656e7420626560008201527f747765656e20302520616e642031302500000000000000000000000000000000602082015250565b6000614747603083613d2f565b9150614752826146eb565b604082019050919050565b600060208201905081810360008301526147768161473a565b9050919050565b7f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060008201527f6175746f6d617465644d61726b65744d616b6572506169727300000000000000602082015250565b60006147d9603983613d2f565b91506147e48261477d565b604082019050919050565b60006020820190508181036000830152614808816147cc565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b600061486b602583613d2f565b91506148768261480f565b604082019050919050565b6000602082019050818103600083015261489a8161485e565b9050919050565b7f43616e6e6f7420736574206d617857616c6c6574206c6f776572207468616e2060008201527f302e352500000000000000000000000000000000000000000000000000000000602082015250565b60006148fd602483613d2f565b9150614908826148a1565b604082019050919050565b6000602082019050818103600083015261492c816148f0565b9050919050565b7f5377617020616d6f756e742063616e6e6f74206265206c6f776572207468616e60008201527f20302e3030312520746f74616c20737570706c792e0000000000000000000000602082015250565b600061498f603583613d2f565b915061499a82614933565b604082019050919050565b600060208201905081810360008301526149be81614982565b9050919050565b7f5377617020616d6f756e742063616e6e6f74206265206869676865722074686160008201527f6e20312520746f74616c20737570706c792e0000000000000000000000000000602082015250565b6000614a21603283613d2f565b9150614a2c826149c5565b604082019050919050565b60006020820190508181036000830152614a5081614a14565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614ab3602683613d2f565b9150614abe82614a57565b604082019050919050565b60006020820190508181036000830152614ae281614aa6565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614b1f602083613d2f565b9150614b2a82614ae9565b602082019050919050565b60006020820190508181036000830152614b4e81614b12565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614bb1602483613d2f565b9150614bbc82614b55565b604082019050919050565b60006020820190508181036000830152614be081614ba4565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000614c43602283613d2f565b9150614c4e82614be7565b604082019050919050565b60006020820190508181036000830152614c7281614c36565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b6000614caf601d83613d2f565b9150614cba82614c79565b602082019050919050565b60006020820190508181036000830152614cde81614ca2565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000614d41602583613d2f565b9150614d4c82614ce5565b604082019050919050565b60006020820190508181036000830152614d7081614d34565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000614dd3602383613d2f565b9150614dde82614d77565b604082019050919050565b60006020820190508181036000830152614e0281614dc6565b9050919050565b7f52656a6563746564000000000000000000000000000000000000000000000000600082015250565b6000614e3f600883613d2f565b9150614e4a82614e09565b602082019050919050565b60006020820190508181036000830152614e6e81614e32565b9050919050565b7f54726164696e67206973206e6f74206163746976652e00000000000000000000600082015250565b6000614eab601683613d2f565b9150614eb682614e75565b602082019050919050565b60006020820190508181036000830152614eda81614e9e565b9050919050565b7f5f7472616e736665723a3a205472616e736665722044656c617920656e61626c60008201527f65642e20204f6e6c79206f6e652070757263686173652070657220626c6f636b60208201527f20616c6c6f7765642e0000000000000000000000000000000000000000000000604082015250565b6000614f63604983613d2f565b9150614f6e82614ee1565b606082019050919050565b60006020820190508181036000830152614f9281614f56565b9050919050565b7f427579207472616e7366657220616d6f756e742065786365656473207468652060008201527f6d61785472616e73616374696f6e416d6f756e742e0000000000000000000000602082015250565b6000614ff5603583613d2f565b915061500082614f99565b604082019050919050565b6000602082019050818103600083015261502481614fe8565b9050919050565b7f4d61782077616c6c657420657863656564656400000000000000000000000000600082015250565b6000615061601383613d2f565b915061506c8261502b565b602082019050919050565b6000602082019050818103600083015261509081615054565b9050919050565b7f53656c6c207472616e7366657220616d6f756e7420657863656564732074686560008201527f206d61785472616e73616374696f6e416d6f756e742e00000000000000000000602082015250565b60006150f3603683613d2f565b91506150fe82615097565b604082019050919050565b60006020820190508181036000830152615122816150e6565b9050919050565b600061513482613cae565b915061513f83613cae565b92508282101561515257615151614188565b5b828203905092915050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b60006151b9602683613d2f565b91506151c48261515d565b604082019050919050565b600060208201905081810360008301526151e8816151ac565b9050919050565b600081905092915050565b50565b600061520a6000836151ef565b9150615215826151fa565b600082019050919050565b600061522b826151fd565b9150819050919050565b60008151905061524481613cb8565b92915050565b6000602082840312156152605761525f613ba7565b5b600061526e84828501615235565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000815190506152b581613e11565b92915050565b6000602082840312156152d1576152d0613ba7565b5b60006152df848285016152a6565b91505092915050565b6000819050919050565b600061530d615308615303846152e8565b613ed4565b613cae565b9050919050565b61531d816152f2565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61535881613dff565b82525050565b600061536a838361534f565b60208301905092915050565b6000602082019050919050565b600061538e82615323565b615398818561532e565b93506153a38361533f565b8060005b838110156153d45781516153bb888261535e565b97506153c683615376565b9250506001810190506153a7565b5085935050505092915050565b600060a0820190506153f66000830188613f4e565b6154036020830187615314565b81810360408301526154158186615383565b90506154246060830185613ff8565b6154316080830184613f4e565b969550505050505056fea2646970667358221220f20a989b58ae1a1d032c34a9e06bbce5b51f97f92ec06df21b01f5ce70c1b11064736f6c634300080a0033

Deployed Bytecode

0x6080604052600436106103d25760003560e01c80637571336a116101fd578063a9059cbb11610118578063c8c8ebe4116100ab578063e2f456051161007a578063e2f4560514610e86578063e884f26014610eb1578063f2fde38b14610edc578063f319ae7714610f05578063f8b45b0514610f2e576103d9565b8063c8c8ebe414610db6578063d257b34f14610de1578063d85ba06314610e1e578063dd62ed3e14610e49576103d9565b8063c0246668116100e7578063c024666814610d10578063c18bc19514610d39578063c779c39114610d62578063c876d0b914610d8b576103d9565b8063a9059cbb14610c42578063aacebbe314610c7f578063b62496f514610ca8578063bbc0c74214610ce5576103d9565b806395d89b41116101905780639fccce321161015f5780639fccce3214610b84578063a0d82dc514610baf578063a457c2d714610bda578063a4c82a0014610c17576103d9565b806395d89b4114610ada5780639a7a23d614610b055780639c3b4fdc14610b2e5780639ec22c0e14610b59576103d9565b80638da5cb5b116101cc5780638da5cb5b14610a305780638ea5220f14610a5b5780639213691314610a86578063924de9b714610ab1576103d9565b80637571336a1461099a57806375f0a874146109c35780637bce5a04146109ee5780638a8c523c14610a19576103d9565b80632c3e486c116102ed57806351fb012d1161028057806370a082311161024f57806370a08231146108f2578063715018a61461092f578063730c188814610946578063751039fc1461096f576103d9565b806351fb012d1461084857806366ca9b83146108735780636a486a8e1461089c5780636ddd1713146108c7576103d9565b806349bd5a5e116102bc57806349bd5a5e1461078a5780634a62bb65146107b55780634b0c5451146107e05780634fbee1931461080b576103d9565b80632c3e486c146106cc5780632e82f1a0146106f7578063313ce56714610722578063395093511461074d576103d9565b80631816467f116103655780631f3fed8f116103345780631f3fed8f14610610578063203e727e1461063b57806323b872dd1461066457806327c8f835146106a1576103d9565b80631816467f14610554578063184c16c51461057d578063199ffc72146105a85780631e7be210146105d3576103d9565b80631006ee0c116103a15780631006ee0c1461049857806310d5de53146104c15780631694505e146104fe57806318160ddd14610529576103d9565b806301b38af5146103de57806302dbd8f81461040757806306fdde0314610430578063095ea7b31461045b576103d9565b366103d957005b600080fd5b3480156103ea57600080fd5b5061040560048036038101906104009190613c4e565b610f59565b005b34801561041357600080fd5b5061042e60048036038101906104299190613ce4565b611006565b005b34801561043c57600080fd5b5061044561107c565b6040516104529190613dbd565b60405180910390f35b34801561046757600080fd5b50610482600480360381019061047d9190613e3d565b61110e565b60405161048f9190613e8c565b60405180910390f35b3480156104a457600080fd5b506104bf60048036038101906104ba9190613ce4565b611131565b005b3480156104cd57600080fd5b506104e860048036038101906104e39190613ea7565b611203565b6040516104f59190613e8c565b60405180910390f35b34801561050a57600080fd5b50610513611223565b6040516105209190613f33565b60405180910390f35b34801561053557600080fd5b5061053e611247565b60405161054b9190613f5d565b60405180910390f35b34801561056057600080fd5b5061057b60048036038101906105769190613ea7565b611251565b005b34801561058957600080fd5b50610592611319565b60405161059f9190613f5d565b60405180910390f35b3480156105b457600080fd5b506105bd61131f565b6040516105ca9190613f5d565b60405180910390f35b3480156105df57600080fd5b506105fa60048036038101906105f59190613ea7565b611325565b6040516106079190613e8c565b60405180910390f35b34801561061c57600080fd5b50610625611345565b6040516106329190613f5d565b60405180910390f35b34801561064757600080fd5b50610662600480360381019061065d9190613f78565b61134b565b005b34801561067057600080fd5b5061068b60048036038101906106869190613fa5565b6113f0565b6040516106989190613e8c565b60405180910390f35b3480156106ad57600080fd5b506106b661141f565b6040516106c39190614007565b60405180910390f35b3480156106d857600080fd5b506106e1611425565b6040516106ee9190613f5d565b60405180910390f35b34801561070357600080fd5b5061070c61142b565b6040516107199190613e8c565b60405180910390f35b34801561072e57600080fd5b5061073761143e565b604051610744919061403e565b60405180910390f35b34801561075957600080fd5b50610774600480360381019061076f9190613e3d565b611447565b6040516107819190613e8c565b60405180910390f35b34801561079657600080fd5b5061079f61147e565b6040516107ac9190614007565b60405180910390f35b3480156107c157600080fd5b506107ca6114a2565b6040516107d79190613e8c565b60405180910390f35b3480156107ec57600080fd5b506107f56114b5565b6040516108029190613e8c565b60405180910390f35b34801561081757600080fd5b50610832600480360381019061082d9190613ea7565b6114cc565b60405161083f9190613e8c565b60405180910390f35b34801561085457600080fd5b5061085d611522565b60405161086a9190613e8c565b60405180910390f35b34801561087f57600080fd5b5061089a60048036038101906108959190613ce4565b611535565b005b3480156108a857600080fd5b506108b16115ab565b6040516108be9190613f5d565b60405180910390f35b3480156108d357600080fd5b506108dc6115b1565b6040516108e99190613e8c565b60405180910390f35b3480156108fe57600080fd5b5061091960048036038101906109149190613ea7565b6115c4565b6040516109269190613f5d565b60405180910390f35b34801561093b57600080fd5b5061094461160c565b005b34801561095257600080fd5b5061096d60048036038101906109689190614059565b611620565b005b34801561097b57600080fd5b506109846116ec565b6040516109919190613e8c565b60405180910390f35b3480156109a657600080fd5b506109c160048036038101906109bc91906140ac565b611718565b005b3480156109cf57600080fd5b506109d861177b565b6040516109e59190614007565b60405180910390f35b3480156109fa57600080fd5b50610a036117a1565b604051610a109190613f5d565b60405180910390f35b348015610a2557600080fd5b50610a2e6117a7565b005b348015610a3c57600080fd5b50610a456117ee565b604051610a529190614007565b60405180910390f35b348015610a6757600080fd5b50610a70611818565b604051610a7d9190614007565b60405180910390f35b348015610a9257600080fd5b50610a9b61183e565b604051610aa89190613f5d565b60405180910390f35b348015610abd57600080fd5b50610ad86004803603810190610ad391906140ec565b611844565b005b348015610ae657600080fd5b50610aef611869565b604051610afc9190613dbd565b60405180910390f35b348015610b1157600080fd5b50610b2c6004803603810190610b2791906140ac565b6118fb565b005b348015610b3a57600080fd5b50610b436119a0565b604051610b509190613f5d565b60405180910390f35b348015610b6557600080fd5b50610b6e6119a6565b604051610b7b9190613f5d565b60405180910390f35b348015610b9057600080fd5b50610b996119ac565b604051610ba69190613f5d565b60405180910390f35b348015610bbb57600080fd5b50610bc46119b2565b604051610bd19190613f5d565b60405180910390f35b348015610be657600080fd5b50610c016004803603810190610bfc9190613e3d565b6119b8565b604051610c0e9190613e8c565b60405180910390f35b348015610c2357600080fd5b50610c2c611a2f565b604051610c399190613f5d565b60405180910390f35b348015610c4e57600080fd5b50610c696004803603810190610c649190613e3d565b611a35565b604051610c769190613e8c565b60405180910390f35b348015610c8b57600080fd5b50610ca66004803603810190610ca19190613ea7565b611a58565b005b348015610cb457600080fd5b50610ccf6004803603810190610cca9190613ea7565b611b20565b604051610cdc9190613e8c565b60405180910390f35b348015610cf157600080fd5b50610cfa611b3f565b604051610d079190613e8c565b60405180910390f35b348015610d1c57600080fd5b50610d376004803603810190610d3291906140ac565b611b52565b005b348015610d4557600080fd5b50610d606004803603810190610d5b9190613f78565b611c03565b005b348015610d6e57600080fd5b50610d896004803603810190610d8491906140ec565b611ca8565b005b348015610d9757600080fd5b50610da0611ccd565b604051610dad9190613e8c565b60405180910390f35b348015610dc257600080fd5b50610dcb611ce0565b604051610dd89190613f5d565b60405180910390f35b348015610ded57600080fd5b50610e086004803603810190610e039190613f78565b611ce6565b604051610e159190613e8c565b60405180910390f35b348015610e2a57600080fd5b50610e33611dc7565b604051610e409190613f5d565b60405180910390f35b348015610e5557600080fd5b50610e706004803603810190610e6b9190614119565b611dcd565b604051610e7d9190613f5d565b60405180910390f35b348015610e9257600080fd5b50610e9b611e54565b604051610ea89190613f5d565b60405180910390f35b348015610ebd57600080fd5b50610ec6611e5a565b604051610ed39190613e8c565b60405180910390f35b348015610ee857600080fd5b50610f036004803603810190610efe9190613ea7565b611e86565b005b348015610f1157600080fd5b50610f2c6004803603810190610f279190613ce4565b611f0a565b005b348015610f3a57600080fd5b50610f43612045565b604051610f509190613f5d565b60405180910390f35b610f6161204b565b60005b838390508110156110005781601f6000868685818110610f8757610f86614159565b5b9050602002016020810190610f9c9190613ea7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080610ff8906141b7565b915050610f64565b50505050565b61100e61204b565b816018819055508060198190555060195460185461102c9190614200565b60178190555060636017541115611078576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106f906142a2565b60405180910390fd5b5050565b60606003805461108b906142f1565b80601f01602080910402602001604051908101604052809291908181526020018280546110b7906142f1565b80156111045780601f106110d957610100808354040283529160200191611104565b820191906000526020600020905b8154815290600101906020018083116110e757829003601f168201915b5050505050905090565b6000806111196120c9565b90506111268185856120d1565b600191505092915050565b61113961204b565b80601981905550816016819055506019546018546111579190614200565b60178190555060165460155461116d9190614200565b601481905550601960145411156111b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b09061436f565b60405180910390fd5b606360175411156111ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f6906142a2565b60405180910390fd5b5050565b601e6020528060005260406000206000915054906101000a900460ff1681565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b6000600254905090565b61125961204b565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f90b8024c4923d3873ff5b9fcb43d0360d4b9217fa41225d07ba379993552e74360405160405180910390a380600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600f5481565b600b5481565b601f6020528060005260406000206000915054906101000a900460ff1681565b601a5481565b61135361204b565b6009600a61136191906144c2565b6103e8600161136e611247565b611378919061450d565b6113829190614596565b61138c9190614596565b8110156113ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c590614639565b60405180910390fd5b6009600a6113dc91906144c2565b816113e7919061450d565b60088190555050565b6000806113fb6120c9565b905061140885828561229c565b611413858585612328565b60019150509392505050565b61dead81565b600d5481565b600c60009054906101000a900460ff1681565b60006009905090565b6000806114526120c9565b90506114738185856114648589611dcd565b61146e9190614200565b6120d1565b600191505092915050565b7f000000000000000000000000819cea6c1fdc97ba58809424d773e5bb3f9e6ad781565b601160009054906101000a900460ff1681565b6000601c60009054906101000a900460ff16905090565b6000601d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b601c60009054906101000a900460ff1681565b61153d61204b565b816015819055508060168190555060165460155461155b9190614200565b601481905550601960145411156115a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159e9061436f565b60405180910390fd5b5050565b60175481565b601160029054906101000a900460ff1681565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61161461204b565b61161e6000613150565b565b61162861204b565b61025883101561166d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611664906146cb565b60405180910390fd5b6103e88211158015611680575060008210155b6116bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b69061475d565b60405180910390fd5b82600d8190555081600b8190555080600c60006101000a81548160ff021916908315150217905550505050565b60006116f661204b565b6000601160006101000a81548160ff0219169083151502179055506001905090565b61172061204b565b80601e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60155481565b6117af61204b565b6001601160016101000a81548160ff0219169083151502179055506001601160026101000a81548160ff02191690831515021790555042600e81905550565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60185481565b61184c61204b565b80601160026101000a81548160ff02191690831515021790555050565b606060048054611878906142f1565b80601f01602080910402602001604051908101604052809291908181526020018280546118a4906142f1565b80156118f15780601f106118c6576101008083540402835291602001916118f1565b820191906000526020600020905b8154815290600101906020018083116118d457829003601f168201915b5050505050905090565b61190361204b565b7f000000000000000000000000819cea6c1fdc97ba58809424d773e5bb3f9e6ad773ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611992576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611989906147ef565b60405180910390fd5b61199c8282613216565b5050565b60165481565b60105481565b601b5481565b60195481565b6000806119c36120c9565b905060006119d18286611dcd565b905083811015611a16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0d90614881565b60405180910390fd5b611a2382868684036120d1565b60019250505092915050565b600e5481565b600080611a406120c9565b9050611a4d818585612328565b600191505092915050565b611a6061204b565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167fa751787977eeb3902e30e1d19ca00c6ad274a1f622c31a206e32366700b0567460405160405180910390a380600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b602080528060005260406000206000915054906101000a900460ff1681565b601160019054906101000a900460ff1681565b611b5a61204b565b80601d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df782604051611bf79190613e8c565b60405180910390a25050565b611c0b61204b565b6009600a611c1991906144c2565b6103e86005611c26611247565b611c30919061450d565b611c3a9190614596565b611c449190614596565b811015611c86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7d90614913565b60405180910390fd5b6009600a611c9491906144c2565b81611c9f919061450d565b600a8190555050565b611cb061204b565b80601c60006101000a81548160ff02191690831515021790555050565b601360009054906101000a900460ff1681565b60085481565b6000611cf061204b565b620186a06001611cfe611247565b611d08919061450d565b611d129190614596565b821015611d54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4b906149a5565b60405180910390fd5b6103e8600a611d61611247565b611d6b919061450d565b611d759190614596565b821115611db7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dae90614a37565b60405180910390fd5b8160098190555060019050919050565b60145481565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60095481565b6000611e6461204b565b6000601360006101000a81548160ff0219169083151502179055506001905090565b611e8e61204b565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611efe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ef590614ac9565b60405180910390fd5b611f0781613150565b50565b611f1261204b565b6009600a611f2091906144c2565b6103e86001611f2d611247565b611f37919061450d565b611f419190614596565b611f4b9190614596565b821015611f8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8490614639565b60405180910390fd5b6009600a611f9b91906144c2565b82611fa6919061450d565b600881905550670de0b6b3a76400006103e86005611fc2611247565b611fcc919061450d565b611fd69190614596565b611fe09190614596565b811015612022576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161201990614913565b60405180910390fd5b6009600a61203091906144c2565b8161203b919061450d565b600a819055505050565b600a5481565b6120536120c9565b73ffffffffffffffffffffffffffffffffffffffff166120716117ee565b73ffffffffffffffffffffffffffffffffffffffff16146120c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120be90614b35565b60405180910390fd5b565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612141576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161213890614bc7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156121b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121a890614c59565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161228f9190613f5d565b60405180910390a3505050565b60006122a88484611dcd565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146123225781811015612314576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161230b90614cc5565b60405180910390fd5b61232184848484036120d1565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612398576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161238f90614d57565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612408576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ff90614de9565b60405180910390fd5b601c60009054906101000a900460ff16156124fe57601f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806124be5750601f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6124fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124f490614e55565b60405180910390fd5b5b600081141561251857612513838360006132b7565b61314b565b601160009054906101000a900460ff1615612bdb576125356117ee565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156125a357506125736117ee565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b80156125dc5750600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b8015612616575061dead73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b801561262f5750600560149054906101000a900460ff16155b15612bda57601160019054906101000a900460ff1661272957601d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806126e95750601d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b612728576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161271f90614ec1565b60405180910390fd5b5b601360009054906101000a900460ff16156128f1576127466117ee565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141580156127cd57507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b801561282557507f000000000000000000000000819cea6c1fdc97ba58809424d773e5bb3f9e6ad773ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b156128f05743601260003273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054106128ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128a290614f79565b60405180910390fd5b43601260003273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b5b602060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680156129945750601e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15612a3b576008548111156129de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129d59061500b565b60405180910390fd5b600a546129ea836115c4565b826129f59190614200565b1115612a36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a2d90615077565b60405180910390fd5b612bd9565b602060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168015612ade5750601e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15612b2d57600854811115612b28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b1f90615109565b60405180910390fd5b612bd8565b601e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612bd757600a54612b8a836115c4565b82612b959190614200565b1115612bd6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bcd90615077565b60405180910390fd5b5b5b5b5b5b6000612be6306115c4565b905060006009548210159050808015612c0b5750601160029054906101000a900460ff165b8015612c245750600560149054906101000a900460ff16155b8015612c7a5750602060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b8015612cd05750601d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b8015612d265750601d60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15612d6a576001600560146101000a81548160ff021916908315150217905550612d4e61352f565b6000600560146101000a81548160ff0219169083151502179055505b600560149054906101000a900460ff16158015612dd05750602060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b8015612de85750600c60009054906101000a900460ff165b8015612e035750600d54600e54612dff9190614200565b4210155b8015612e595750601d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15612e6857612e66613758565b505b6000600560149054906101000a900460ff16159050601d60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680612f1e5750601d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b15612f2857600090505b6000811561313b57602060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168015612f8b57506000601754115b1561302557612fb86064612faa6017548861391e90919063ffffffff16565b61393490919063ffffffff16565b905060175460195482612fcb919061450d565b612fd59190614596565b601b6000828254612fe69190614200565b9250508190555060175460185482612ffe919061450d565b6130089190614596565b601a60008282546130199190614200565b92505081905550613117565b602060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16801561308057506000601454115b15613116576130ad606461309f6014548861391e90919063ffffffff16565b61393490919063ffffffff16565b9050601454601654826130c0919061450d565b6130ca9190614596565b601b60008282546130db9190614200565b92505081905550601454601554826130f3919061450d565b6130fd9190614596565b601a600082825461310e9190614200565b925050819055505b5b600081111561312c5761312b8730836132b7565b5b80856131389190615129565b94505b6131468787876132b7565b505050505b505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b80602060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508015158273ffffffffffffffffffffffffffffffffffffffff167fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab60405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613327576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161331e90614d57565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613397576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161338e90614de9565b60405180910390fd5b6133a283838361394a565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015613428576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161341f906151cf565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516135169190613f5d565b60405180910390a361352984848461394f565b50505050565b600061353a306115c4565b90506000601b54601a5461354e9190614200565b90506000808314806135605750600082145b1561356d57505050613756565b601460095461357c919061450d565b831115613595576014600954613592919061450d565b92505b600083905060004790506135a882613954565b60006135bd8247613b9190919063ffffffff16565b905060006135e8866135da601a548561391e90919063ffffffff16565b61393490919063ffffffff16565b9050600061361387613605601b548661391e90919063ffffffff16565b61393490919063ffffffff16565b9050600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168160405161365b90615220565b60006040518083038185875af1925050503d8060008114613698576040519150601f19603f3d011682016040523d82523d6000602084013e61369d565b606091505b5050809650506000601a54111561373d57600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16826040516136f490615220565b60006040518083038185875af1925050503d8060008114613731576040519150601f19603f3d011682016040523d82523d6000602084013e613736565b606091505b5050809650505b6000601a819055506000601b8190555050505050505050505b565b600042600e8190555060003073ffffffffffffffffffffffffffffffffffffffff166370a082317f000000000000000000000000819cea6c1fdc97ba58809424d773e5bb3f9e6ad76040518263ffffffff1660e01b81526004016137bc9190614007565b602060405180830381865afa1580156137d9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137fd919061524a565b9050600061382a61271061381c600b548561391e90919063ffffffff16565b61393490919063ffffffff16565b90506000811115613863576138627f000000000000000000000000819cea6c1fdc97ba58809424d773e5bb3f9e6ad761dead836132b7565b5b60007f000000000000000000000000819cea6c1fdc97ba58809424d773e5bb3f9e6ad790508073ffffffffffffffffffffffffffffffffffffffff1663fff6cae96040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156138d057600080fd5b505af11580156138e4573d6000803e3d6000fd5b505050507f454c91ae84fcc766ddda0dcb289f26b3d0176efeacf4061fc219fa6ca8c3048d60405160405180910390a16001935050505090565b6000818361392c919061450d565b905092915050565b600081836139429190614596565b905092915050565b505050565b505050565b6000600267ffffffffffffffff81111561397157613970615277565b5b60405190808252806020026020018201604052801561399f5781602001602082028036833780820191505090505b50905030816000815181106139b7576139b6614159565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015613a5c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a8091906152bb565b81600181518110613a9457613a93614159565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050613af9307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d846120d1565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b8152600401613b5b9594939291906153e1565b600060405180830381600087803b158015613b7557600080fd5b505af1158015613b89573d6000803e3d6000fd5b505050505050565b60008183613b9f9190615129565b905092915050565b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b60008083601f840112613bd657613bd5613bb1565b5b8235905067ffffffffffffffff811115613bf357613bf2613bb6565b5b602083019150836020820283011115613c0f57613c0e613bbb565b5b9250929050565b60008115159050919050565b613c2b81613c16565b8114613c3657600080fd5b50565b600081359050613c4881613c22565b92915050565b600080600060408486031215613c6757613c66613ba7565b5b600084013567ffffffffffffffff811115613c8557613c84613bac565b5b613c9186828701613bc0565b93509350506020613ca486828701613c39565b9150509250925092565b6000819050919050565b613cc181613cae565b8114613ccc57600080fd5b50565b600081359050613cde81613cb8565b92915050565b60008060408385031215613cfb57613cfa613ba7565b5b6000613d0985828601613ccf565b9250506020613d1a85828601613ccf565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613d5e578082015181840152602081019050613d43565b83811115613d6d576000848401525b50505050565b6000601f19601f8301169050919050565b6000613d8f82613d24565b613d998185613d2f565b9350613da9818560208601613d40565b613db281613d73565b840191505092915050565b60006020820190508181036000830152613dd78184613d84565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613e0a82613ddf565b9050919050565b613e1a81613dff565b8114613e2557600080fd5b50565b600081359050613e3781613e11565b92915050565b60008060408385031215613e5457613e53613ba7565b5b6000613e6285828601613e28565b9250506020613e7385828601613ccf565b9150509250929050565b613e8681613c16565b82525050565b6000602082019050613ea16000830184613e7d565b92915050565b600060208284031215613ebd57613ebc613ba7565b5b6000613ecb84828501613e28565b91505092915050565b6000819050919050565b6000613ef9613ef4613eef84613ddf565b613ed4565b613ddf565b9050919050565b6000613f0b82613ede565b9050919050565b6000613f1d82613f00565b9050919050565b613f2d81613f12565b82525050565b6000602082019050613f486000830184613f24565b92915050565b613f5781613cae565b82525050565b6000602082019050613f726000830184613f4e565b92915050565b600060208284031215613f8e57613f8d613ba7565b5b6000613f9c84828501613ccf565b91505092915050565b600080600060608486031215613fbe57613fbd613ba7565b5b6000613fcc86828701613e28565b9350506020613fdd86828701613e28565b9250506040613fee86828701613ccf565b9150509250925092565b61400181613dff565b82525050565b600060208201905061401c6000830184613ff8565b92915050565b600060ff82169050919050565b61403881614022565b82525050565b6000602082019050614053600083018461402f565b92915050565b60008060006060848603121561407257614071613ba7565b5b600061408086828701613ccf565b935050602061409186828701613ccf565b92505060406140a286828701613c39565b9150509250925092565b600080604083850312156140c3576140c2613ba7565b5b60006140d185828601613e28565b92505060206140e285828601613c39565b9150509250929050565b60006020828403121561410257614101613ba7565b5b600061411084828501613c39565b91505092915050565b600080604083850312156141305761412f613ba7565b5b600061413e85828601613e28565b925050602061414f85828601613e28565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006141c282613cae565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156141f5576141f4614188565b5b600182019050919050565b600061420b82613cae565b915061421683613cae565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561424b5761424a614188565b5b828201905092915050565b7f4d757374206b656570206665657320617420393925206f72206c657373000000600082015250565b600061428c601d83613d2f565b915061429782614256565b602082019050919050565b600060208201905081810360008301526142bb8161427f565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061430957607f821691505b6020821081141561431d5761431c6142c2565b5b50919050565b7f4d757374206b656570206665657320617420323525206f72206c657373000000600082015250565b6000614359601d83613d2f565b915061436482614323565b602082019050919050565b600060208201905081810360008301526143888161434c565b9050919050565b60008160011c9050919050565b6000808291508390505b60018511156143e6578086048111156143c2576143c1614188565b5b60018516156143d15780820291505b80810290506143df8561438f565b94506143a6565b94509492505050565b6000826143ff57600190506144bb565b8161440d57600090506144bb565b8160018114614423576002811461442d5761445c565b60019150506144bb565b60ff84111561443f5761443e614188565b5b8360020a91508482111561445657614455614188565b5b506144bb565b5060208310610133831016604e8410600b84101617156144915782820a90508381111561448c5761448b614188565b5b6144bb565b61449e848484600161439c565b925090508184048111156144b5576144b4614188565b5b81810290505b9392505050565b60006144cd82613cae565b91506144d883614022565b92506145057fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84846143ef565b905092915050565b600061451882613cae565b915061452383613cae565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561455c5761455b614188565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006145a182613cae565b91506145ac83613cae565b9250826145bc576145bb614567565b5b828204905092915050565b7f43616e6e6f7420736574206d61785472616e73616374696f6e416d6f756e742060008201527f6c6f776572207468616e20302e31250000000000000000000000000000000000602082015250565b6000614623602f83613d2f565b915061462e826145c7565b604082019050919050565b6000602082019050818103600083015261465281614616565b9050919050565b7f63616e6e6f7420736574206275796261636b206d6f7265206f6674656e20746860008201527f616e206576657279203130206d696e7574657300000000000000000000000000602082015250565b60006146b5603383613d2f565b91506146c082614659565b604082019050919050565b600060208201905081810360008301526146e4816146a8565b9050919050565b7f4d75737420736574206175746f204c50206275726e2070657263656e7420626560008201527f747765656e20302520616e642031302500000000000000000000000000000000602082015250565b6000614747603083613d2f565b9150614752826146eb565b604082019050919050565b600060208201905081810360008301526147768161473a565b9050919050565b7f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060008201527f6175746f6d617465644d61726b65744d616b6572506169727300000000000000602082015250565b60006147d9603983613d2f565b91506147e48261477d565b604082019050919050565b60006020820190508181036000830152614808816147cc565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b600061486b602583613d2f565b91506148768261480f565b604082019050919050565b6000602082019050818103600083015261489a8161485e565b9050919050565b7f43616e6e6f7420736574206d617857616c6c6574206c6f776572207468616e2060008201527f302e352500000000000000000000000000000000000000000000000000000000602082015250565b60006148fd602483613d2f565b9150614908826148a1565b604082019050919050565b6000602082019050818103600083015261492c816148f0565b9050919050565b7f5377617020616d6f756e742063616e6e6f74206265206c6f776572207468616e60008201527f20302e3030312520746f74616c20737570706c792e0000000000000000000000602082015250565b600061498f603583613d2f565b915061499a82614933565b604082019050919050565b600060208201905081810360008301526149be81614982565b9050919050565b7f5377617020616d6f756e742063616e6e6f74206265206869676865722074686160008201527f6e20312520746f74616c20737570706c792e0000000000000000000000000000602082015250565b6000614a21603283613d2f565b9150614a2c826149c5565b604082019050919050565b60006020820190508181036000830152614a5081614a14565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614ab3602683613d2f565b9150614abe82614a57565b604082019050919050565b60006020820190508181036000830152614ae281614aa6565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614b1f602083613d2f565b9150614b2a82614ae9565b602082019050919050565b60006020820190508181036000830152614b4e81614b12565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614bb1602483613d2f565b9150614bbc82614b55565b604082019050919050565b60006020820190508181036000830152614be081614ba4565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000614c43602283613d2f565b9150614c4e82614be7565b604082019050919050565b60006020820190508181036000830152614c7281614c36565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b6000614caf601d83613d2f565b9150614cba82614c79565b602082019050919050565b60006020820190508181036000830152614cde81614ca2565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000614d41602583613d2f565b9150614d4c82614ce5565b604082019050919050565b60006020820190508181036000830152614d7081614d34565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000614dd3602383613d2f565b9150614dde82614d77565b604082019050919050565b60006020820190508181036000830152614e0281614dc6565b9050919050565b7f52656a6563746564000000000000000000000000000000000000000000000000600082015250565b6000614e3f600883613d2f565b9150614e4a82614e09565b602082019050919050565b60006020820190508181036000830152614e6e81614e32565b9050919050565b7f54726164696e67206973206e6f74206163746976652e00000000000000000000600082015250565b6000614eab601683613d2f565b9150614eb682614e75565b602082019050919050565b60006020820190508181036000830152614eda81614e9e565b9050919050565b7f5f7472616e736665723a3a205472616e736665722044656c617920656e61626c60008201527f65642e20204f6e6c79206f6e652070757263686173652070657220626c6f636b60208201527f20616c6c6f7765642e0000000000000000000000000000000000000000000000604082015250565b6000614f63604983613d2f565b9150614f6e82614ee1565b606082019050919050565b60006020820190508181036000830152614f9281614f56565b9050919050565b7f427579207472616e7366657220616d6f756e742065786365656473207468652060008201527f6d61785472616e73616374696f6e416d6f756e742e0000000000000000000000602082015250565b6000614ff5603583613d2f565b915061500082614f99565b604082019050919050565b6000602082019050818103600083015261502481614fe8565b9050919050565b7f4d61782077616c6c657420657863656564656400000000000000000000000000600082015250565b6000615061601383613d2f565b915061506c8261502b565b602082019050919050565b6000602082019050818103600083015261509081615054565b9050919050565b7f53656c6c207472616e7366657220616d6f756e7420657863656564732074686560008201527f206d61785472616e73616374696f6e416d6f756e742e00000000000000000000602082015250565b60006150f3603683613d2f565b91506150fe82615097565b604082019050919050565b60006020820190508181036000830152615122816150e6565b9050919050565b600061513482613cae565b915061513f83613cae565b92508282101561515257615151614188565b5b828203905092915050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b60006151b9602683613d2f565b91506151c48261515d565b604082019050919050565b600060208201905081810360008301526151e8816151ac565b9050919050565b600081905092915050565b50565b600061520a6000836151ef565b9150615215826151fa565b600082019050919050565b600061522b826151fd565b9150819050919050565b60008151905061524481613cb8565b92915050565b6000602082840312156152605761525f613ba7565b5b600061526e84828501615235565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000815190506152b581613e11565b92915050565b6000602082840312156152d1576152d0613ba7565b5b60006152df848285016152a6565b91505092915050565b6000819050919050565b600061530d615308615303846152e8565b613ed4565b613cae565b9050919050565b61531d816152f2565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61535881613dff565b82525050565b600061536a838361534f565b60208301905092915050565b6000602082019050919050565b600061538e82615323565b615398818561532e565b93506153a38361533f565b8060005b838110156153d45781516153bb888261535e565b97506153c683615376565b9250506001810190506153a7565b5085935050505092915050565b600060a0820190506153f66000830188613f4e565b6154036020830187615314565b81810360408301526154158186615383565b90506154246060830185613ff8565b6154316080830184613f4e565b969550505050505056fea2646970667358221220f20a989b58ae1a1d032c34a9e06bbce5b51f97f92ec06df21b01f5ce70c1b11064736f6c634300080a0033

Deployed Bytecode Sourcemap

39794:17638:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44475:220;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47598:293;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18649:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20999:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47899:383;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41416:64;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39868:51;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19768:108;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49148:157;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40454:50;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40256:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41507:42;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41150:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46442:250;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21780:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39971:53;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40351:54;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40311:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19611:92;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22484:238;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39926:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40555:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44837:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49319:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41226:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47300:286;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41039:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40661:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19939:127;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12074:103;;;;;;;;;;;;;:::i;:::-;;56164:447;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45202:120;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46943:144;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40063:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40965;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44991:155;;;;;;;;;;;;;:::i;:::-;;11426:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40100:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41074:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47187:101;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18868:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48480:244;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41002:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40511:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41190:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41112:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23225:436;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40412:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20272:193;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48928:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41707:58;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40595:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48290:182;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46700:231;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44703:126;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40883:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40137:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45596:385;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40931:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20528:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40179:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45387:134;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12332:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45993:437;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40219:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44475:220;11312:13;:11;:13::i;:::-;44582:6:::1;44577:111;44594:10;;:17;;44592:1;:19;44577:111;;;44661:15;44633:10;:25;44644:10;;44655:1;44644:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;44633:25;;;;;;;;;;;;;;;;:43;;;;;;;;;;;;;;;;;;44613:3;;;;;:::i;:::-;;;;44577:111;;;;44475:220:::0;;;:::o;47598:293::-;11312:13;:11;:13::i;:::-;47711::::1;47692:16;:32;;;;47748:7;47735:10;:20;;;;47801:10;;47782:16;;:29;;;;:::i;:::-;47766:13;:45;;;;47847:2;47830:13;;:19;;47822:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;47598:293:::0;;:::o;18649:100::-;18703:13;18736:5;18729:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18649:100;:::o;20999:201::-;21082:4;21099:13;21115:12;:10;:12::i;:::-;21099:28;;21138:32;21147:5;21154:7;21163:6;21138:8;:32::i;:::-;21188:4;21181:11;;;20999:201;;;;:::o;47899:383::-;11312:13;:11;:13::i;:::-;47991:4:::1;47978:10;:17;;;;48018:3;48006:9;:15;;;;48068:10;;48048:16;;:30;;;;:::i;:::-;48032:13;:46;;;;48122:9;;48104:15;;:27;;;;:::i;:::-;48089:12;:42;;;;48166:2;48150:12;;:18;;48142:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;48238:2;48221:13;;:19;;48213:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;47899:383:::0;;:::o;41416:64::-;;;;;;;;;;;;;;;;;;;;;;:::o;39868:51::-;;;:::o;19768:108::-;19829:7;19856:12;;19849:19;;19768:108;:::o;49148:157::-;11312:13;:11;:13::i;:::-;49255:9:::1;;;;;;;;;;;49227:38;;49244:9;49227:38;;;;;;;;;;;;49288:9;49276;;:21;;;;;;;;;;;;;;;;;;49148:157:::0;:::o;40454:50::-;;;;:::o;40256:35::-;;;;:::o;41507:42::-;;;;;;;;;;;;;;;;;;;;;;:::o;41150:33::-;;;;:::o;46442:250::-;11312:13;:11;:13::i;:::-;42399:1:::1;46561:2;:13;;;;:::i;:::-;46555:4;46551:1;46535:13;:11;:13::i;:::-;:17;;;;:::i;:::-;:24;;;;:::i;:::-;46534:40;;;;:::i;:::-;46524:6;:50;;46516:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;42399:1;46670:2;:13;;;;:::i;:::-;46660:6;:24;;;;:::i;:::-;46637:20;:47;;;;46442:250:::0;:::o;21780:295::-;21911:4;21928:15;21946:12;:10;:12::i;:::-;21928:30;;21969:38;21985:4;21991:7;22000:6;21969:15;:38::i;:::-;22018:27;22028:4;22034:2;22038:6;22018:9;:27::i;:::-;22063:4;22056:11;;;21780:295;;;;;:::o;39971:53::-;40017:6;39971:53;:::o;40351:54::-;;;;:::o;40311:33::-;;;;;;;;;;;;;:::o;19611:92::-;19669:5;19694:1;19687:8;;19611:92;:::o;22484:238::-;22572:4;22589:13;22605:12;:10;:12::i;:::-;22589:28;;22628:64;22637:5;22644:7;22681:10;22653:25;22663:5;22670:7;22653:9;:25::i;:::-;:38;;;;:::i;:::-;22628:8;:64::i;:::-;22710:4;22703:11;;;22484:238;;;;:::o;39926:38::-;;;:::o;40555:33::-;;;;;;;;;;;;;:::o;44837:100::-;44889:4;44913:16;;;;;;;;;;;44906:23;;44837:100;:::o;49319:125::-;49384:4;49408:19;:28;49428:7;49408:28;;;;;;;;;;;;;;;;;;;;;;;;;49401:35;;49319:125;;;:::o;41226:36::-;;;;;;;;;;;;;:::o;47300:286::-;11312:13;:11;:13::i;:::-;47411::::1;47393:15;:31;;;;47447:7;47435:9;:19;;;;47498:9;;47480:15;;:27;;;;:::i;:::-;47465:12;:42;;;;47542:2;47526:12;;:18;;47518:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;47300:286:::0;;:::o;41039:28::-;;;;:::o;40661:30::-;;;;;;;;;;;;;:::o;19939:127::-;20013:7;20040:9;:18;20050:7;20040:18;;;;;;;;;;;;;;;;20033:25;;19939:127;;;:::o;12074:103::-;11312:13;:11;:13::i;:::-;12139:30:::1;12166:1;12139:18;:30::i;:::-;12074:103::o:0;56164:447::-;11312:13;:11;:13::i;:::-;56318:3:::1;56295:19;:26;;56287:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;56408:4;56396:8;:16;;:33;;;;;56428:1;56416:8;:13;;56396:33;56388:94;;;;;;;;;;;;:::i;:::-;;;;;;;;;56511:19;56493:15;:37;;;;56560:8;56541:16;:27;;;;56595:8;56579:13;;:24;;;;;;;;;;;;;;;;;;56164:447:::0;;;:::o;45202:120::-;45254:4;11312:13;:11;:13::i;:::-;45287:5:::1;45270:14;;:22;;;;;;;;;;;;;;;;;;45310:4;45303:11;;45202:120:::0;:::o;46943:144::-;11312:13;:11;:13::i;:::-;47075:4:::1;47033:31;:39;47065:6;47033:39;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;46943:144:::0;;:::o;40063:30::-;;;;;;;;;;;;;:::o;40965:::-;;;;:::o;44991:155::-;11312:13;:11;:13::i;:::-;45062:4:::1;45046:13;;:20;;;;;;;;;;;;;;;;;;45091:4;45077:11;;:18;;;;;;;;;;;;;;;;;;45123:15;45106:14;:32;;;;44991:155::o:0;11426:87::-;11472:7;11499:6;;;;;;;;;;;11492:13;;11426:87;:::o;40100:24::-;;;;;;;;;;;;;:::o;41074:31::-;;;;:::o;47187:101::-;11312:13;:11;:13::i;:::-;47273:7:::1;47259:11;;:21;;;;;;;;;;;;;;;;;;47187:101:::0;:::o;18868:104::-;18924:13;18957:7;18950:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18868:104;:::o;48480:244::-;11312:13;:11;:13::i;:::-;48587::::1;48579:21;;:4;:21;;;;48571:91;;;;;;;;;;;;:::i;:::-;;;;;;;;;48675:41;48704:4;48710:5;48675:28;:41::i;:::-;48480:244:::0;;:::o;41002:24::-;;;;:::o;40511:35::-;;;;:::o;41190:27::-;;;;:::o;41112:25::-;;;;:::o;23225:436::-;23318:4;23335:13;23351:12;:10;:12::i;:::-;23335:28;;23374:24;23401:25;23411:5;23418:7;23401:9;:25::i;:::-;23374:52;;23465:15;23445:16;:35;;23437:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;23558:60;23567:5;23574:7;23602:15;23583:16;:34;23558:8;:60::i;:::-;23649:4;23642:11;;;;23225:436;;;;:::o;40412:29::-;;;;:::o;20272:193::-;20351:4;20368:13;20384:12;:10;:12::i;:::-;20368:28;;20407;20417:5;20424:2;20428:6;20407:9;:28::i;:::-;20453:4;20446:11;;;20272:193;;;;:::o;48928:208::-;11312:13;:11;:13::i;:::-;49065:15:::1;;;;;;;;;;;49022:59;;49045:18;49022:59;;;;;;;;;;;;49110:18;49092:15;;:36;;;;;;;;;;;;;;;;;;48928:208:::0;:::o;41707:58::-;;;;;;;;;;;;;;;;;;;;;;:::o;40595:32::-;;;;;;;;;;;;;:::o;48290:182::-;11312:13;:11;:13::i;:::-;48406:8:::1;48375:19;:28;48395:7;48375:28;;;;;;;;;;;;;;;;:39;;;;;;;;;;;;;;;;;;48446:7;48430:34;;;48455:8;48430:34;;;;;;:::i;:::-;;;;;;;;48290:182:::0;;:::o;46700:231::-;11312:13;:11;:13::i;:::-;42399:1:::1;46822:2;:13;;;;:::i;:::-;46816:4;46812:1;46796:13;:11;:13::i;:::-;:17;;;;:::i;:::-;:24;;;;:::i;:::-;46795:40;;;;:::i;:::-;46785:6;:50;;46777:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;42399:1;46909:2;:13;;;;:::i;:::-;46899:6;:24;;;;:::i;:::-;46887:9;:36;;;;46700:231:::0;:::o;44703:126::-;11312:13;:11;:13::i;:::-;44806:15:::1;44787:16;;:34;;;;;;;;;;;;;;;;;;44703:126:::0;:::o;40883:39::-;;;;;;;;;;;;;:::o;40137:35::-;;;;:::o;45596:385::-;45677:4;11312:13;:11;:13::i;:::-;45734:6:::1;45730:1;45714:13;:11;:13::i;:::-;:17;;;;:::i;:::-;:26;;;;:::i;:::-;45701:9;:39;;45693:105;;;;;;;;;;;;:::i;:::-;;;;;;;;;45851:4;45846:2;45830:13;:11;:13::i;:::-;:18;;;;:::i;:::-;:25;;;;:::i;:::-;45817:9;:38;;45809:101;;;;;;;;;;;;:::i;:::-;;;;;;;;;45942:9;45921:18;:30;;;;45969:4;45962:11;;45596:385:::0;;;:::o;40931:27::-;;;;:::o;20528:151::-;20617:7;20644:11;:18;20656:5;20644:18;;;;;;;;;;;;;;;:27;20663:7;20644:27;;;;;;;;;;;;;;;;20637:34;;20528:151;;;;:::o;40179:33::-;;;;:::o;45387:134::-;45447:4;11312:13;:11;:13::i;:::-;45486:5:::1;45463:20;;:28;;;;;;;;;;;;;;;;;;45509:4;45502:11;;45387:134:::0;:::o;12332:201::-;11312:13;:11;:13::i;:::-;12441:1:::1;12421:22;;:8;:22;;;;12413:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;12497:28;12516:8;12497:18;:28::i;:::-;12332:201:::0;:::o;45993:437::-;11312:13;:11;:13::i;:::-;42399:1:::1;46135:2;:13;;;;:::i;:::-;46129:4;46125:1;46109:13;:11;:13::i;:::-;:17;;;;:::i;:::-;:24;;;;:::i;:::-;46108:40;;;;:::i;:::-;46096:8;:52;;46088:112;;;;;;;;;;;;:::i;:::-;;;;;;;;;42399:1;46246:2;:13;;;;:::i;:::-;46234:8;:26;;;;:::i;:::-;46211:20;:49;;;;46324:4;46318;46314:1;46298:13;:11;:13::i;:::-;:17;;;;:::i;:::-;:24;;;;:::i;:::-;46297:31;;;;:::i;:::-;46281:12;:47;;46273:96;;;;;;;;;;;;:::i;:::-;;;;;;;;;42399:1;46408:2;:13;;;;:::i;:::-;46392:12;:30;;;;:::i;:::-;46380:9;:42;;;;45993:437:::0;;:::o;40219:24::-;;;;:::o;11591:132::-;11666:12;:10;:12::i;:::-;11655:23;;:7;:5;:7::i;:::-;:23;;;11647:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;11591:132::o;9977:98::-;10030:7;10057:10;10050:17;;9977:98;:::o;27252:380::-;27405:1;27388:19;;:5;:19;;;;27380:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;27486:1;27467:21;;:7;:21;;;;27459:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;27570:6;27540:11;:18;27552:5;27540:18;;;;;;;;;;;;;;;:27;27559:7;27540:27;;;;;;;;;;;;;;;:36;;;;27608:7;27592:32;;27601:5;27592:32;;;27617:6;27592:32;;;;;;:::i;:::-;;;;;;;;27252:380;;;:::o;27923:453::-;28058:24;28085:25;28095:5;28102:7;28085:9;:25::i;:::-;28058:52;;28145:17;28125:16;:37;28121:248;;28207:6;28187:16;:26;;28179:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;28291:51;28300:5;28307:7;28335:6;28316:16;:25;28291:8;:51::i;:::-;28121:248;28047:329;27923:453;;;:::o;49506:4311::-;49654:1;49638:18;;:4;:18;;;;49630:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49731:1;49717:16;;:2;:16;;;;49709:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;49790:16;;;;;;;;;;;49786:90;;;49829:10;:14;49840:2;49829:14;;;;;;;;;;;;;;;;;;;;;;;;;:34;;;;49847:10;:16;49858:4;49847:16;;;;;;;;;;;;;;;;;;;;;;;;;49829:34;49821:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;49786:90;49911:1;49901:6;:11;49898:92;;;49929:28;49945:4;49951:2;49955:1;49929:15;:28::i;:::-;49972:7;;49898:92;50013:14;;;;;;;;;;;50010:1841;;;50073:7;:5;:7::i;:::-;50065:15;;:4;:15;;;;:49;;;;;50107:7;:5;:7::i;:::-;50101:13;;:2;:13;;;;50065:49;:86;;;;;50149:1;50135:16;;:2;:16;;;;50065:86;:128;;;;;50186:6;50172:21;;:2;:21;;;;50065:128;:158;;;;;50215:8;;;;;;;;;;;50214:9;50065:158;50043:1797;;;50261:13;;;;;;;;;;;50257:148;;50306:19;:25;50326:4;50306:25;;;;;;;;;;;;;;;;;;;;;;;;;:52;;;;50335:19;:23;50355:2;50335:23;;;;;;;;;;;;;;;;;;;;;;;;;50306:52;50298:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;50257:148;50563:20;;;;;;;;;;;50559:423;;;50617:7;:5;:7::i;:::-;50611:13;;:2;:13;;;;:47;;;;;50642:15;50628:30;;:2;:30;;;;50611:47;:79;;;;;50676:13;50662:28;;:2;:28;;;;50611:79;50607:356;;;50768:12;50726:28;:39;50755:9;50726:39;;;;;;;;;;;;;;;;:54;50718:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;50927:12;50885:28;:39;50914:9;50885:39;;;;;;;;;;;;;;;:54;;;;50607:356;50559:423;51051:25;:31;51077:4;51051:31;;;;;;;;;;;;;;;;;;;;;;;;;:71;;;;;51087:31;:35;51119:2;51087:35;;;;;;;;;;;;;;;;;;;;;;;;;51086:36;51051:71;51047:778;;;51169:20;;51159:6;:30;;51151:96;;;;;;;;;;;;:::i;:::-;;;;;;;;;51308:9;;51291:13;51301:2;51291:9;:13::i;:::-;51282:6;:22;;;;:::i;:::-;:35;;51274:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;51047:778;;;51435:25;:29;51461:2;51435:29;;;;;;;;;;;;;;;;;;;;;;;;;:71;;;;;51469:31;:37;51501:4;51469:37;;;;;;;;;;;;;;;;;;;;;;;;;51468:38;51435:71;51431:394;;;51553:20;;51543:6;:30;;51535:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;51431:394;;;51679:31;:35;51711:2;51679:35;;;;;;;;;;;;;;;;;;;;;;;;;51675:150;;51772:9;;51755:13;51765:2;51755:9;:13::i;:::-;51746:6;:22;;;;:::i;:::-;:35;;51738:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;51675:150;51431:394;51047:778;50043:1797;50010:1841;51881:28;51912:24;51930:4;51912:9;:24::i;:::-;51881:55;;51957:12;51996:18;;51972:20;:42;;51957:57;;52045:7;:35;;;;;52069:11;;;;;;;;;;;52045:35;:61;;;;;52098:8;;;;;;;;;;;52097:9;52045:61;:110;;;;;52124:25;:31;52150:4;52124:31;;;;;;;;;;;;;;;;;;;;;;;;;52123:32;52045:110;:153;;;;;52173:19;:25;52193:4;52173:25;;;;;;;;;;;;;;;;;;;;;;;;;52172:26;52045:153;:194;;;;;52216:19;:23;52236:2;52216:23;;;;;;;;;;;;;;;;;;;;;;;;;52215:24;52045:194;52027:338;;;52277:4;52266:8;;:15;;;;;;;;;;;;;;;;;;52310:10;:8;:10::i;:::-;52348:5;52337:8;;:16;;;;;;;;;;;;;;;;;;52027:338;52389:8;;;;;;;;;;;52388:9;:42;;;;;52401:25;:29;52427:2;52401:29;;;;;;;;;;;;;;;;;;;;;;;;;52388:42;:59;;;;;52434:13;;;;;;;;;;;52388:59;:114;;;;;52487:15;;52470:14;;:32;;;;:::i;:::-;52451:15;:51;;52388:114;:144;;;;;52507:19;:25;52527:4;52507:25;;;;;;;;;;;;;;;;;;;;;;;;;52506:26;52388:144;52385:204;;;52548:29;:27;:29::i;:::-;;52385:204;52601:12;52617:8;;;;;;;;;;;52616:9;52601:24;;52726:19;:25;52746:4;52726:25;;;;;;;;;;;;;;;;;;;;;;;;;:52;;;;52755:19;:23;52775:2;52755:23;;;;;;;;;;;;;;;;;;;;;;;;;52726:52;52723:99;;;52805:5;52795:15;;52723:99;52842:12;52946:7;52943:821;;;52997:25;:29;53023:2;52997:29;;;;;;;;;;;;;;;;;;;;;;;;;:50;;;;;53046:1;53030:13;;:17;52997:50;52993:596;;;53074:34;53104:3;53074:25;53085:13;;53074:6;:10;;:25;;;;:::i;:::-;:29;;:34;;;;:::i;:::-;53067:41;;53163:13;;53150:10;;53143:4;:17;;;;:::i;:::-;:33;;;;:::i;:::-;53127:12;;:49;;;;;;;:::i;:::-;;;;;;;;53243:13;;53224:16;;53217:4;:23;;;;:::i;:::-;:39;;;;:::i;:::-;53195:18;;:61;;;;;;;:::i;:::-;;;;;;;;52993:596;;;53317:25;:31;53343:4;53317:31;;;;;;;;;;;;;;;;;;;;;;;;;:51;;;;;53367:1;53352:12;;:16;53317:51;53314:275;;;53396:33;53425:3;53396:24;53407:12;;53396:6;:10;;:24;;;;:::i;:::-;:28;;:33;;;;:::i;:::-;53389:40;;53483:12;;53471:9;;53464:4;:16;;;;:::i;:::-;:31;;;;:::i;:::-;53448:12;;:47;;;;;;;:::i;:::-;;;;;;;;53561:12;;53543:15;;53536:4;:22;;;;:::i;:::-;:37;;;;:::i;:::-;53514:18;;:59;;;;;;;:::i;:::-;;;;;;;;53314:275;52993:596;53627:1;53620:4;:8;53617:93;;;53652:42;53668:4;53682;53689;53652:15;:42::i;:::-;53617:93;53748:4;53738:14;;;;;:::i;:::-;;;52943:821;53776:33;53792:4;53798:2;53802:6;53776:15;:33::i;:::-;49619:4198;;;;49506:4311;;;;:::o;12693:191::-;12767:16;12786:6;;;;;;;;;;;12767:25;;12812:8;12803:6;;:17;;;;;;;;;;;;;;;;;;12867:8;12836:40;;12857:8;12836:40;;;;;;;;;;;;12756:128;12693:191;:::o;48732:188::-;48849:5;48815:25;:31;48841:4;48815:31;;;;;;;;;;;;;;;;:39;;;;;;;;;;;;;;;;;;48906:5;48872:40;;48900:4;48872:40;;;;;;;;;;;;48732:188;;:::o;24131:840::-;24278:1;24262:18;;:4;:18;;;;24254:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;24355:1;24341:16;;:2;:16;;;;24333:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;24410:38;24431:4;24437:2;24441:6;24410:20;:38::i;:::-;24461:19;24483:9;:15;24493:4;24483:15;;;;;;;;;;;;;;;;24461:37;;24532:6;24517:11;:21;;24509:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;24649:6;24635:11;:20;24617:9;:15;24627:4;24617:15;;;;;;;;;;;;;;;:38;;;;24852:6;24835:9;:13;24845:2;24835:13;;;;;;;;;;;;;;;;:23;;;;;;;;;;;24902:2;24887:26;;24896:4;24887:26;;;24906:6;24887:26;;;;;;:::i;:::-;;;;;;;;24926:37;24946:4;24952:2;24956:6;24926:19;:37::i;:::-;24243:728;24131:840;;;:::o;54965:1187::-;55004:23;55030:24;55048:4;55030:9;:24::i;:::-;55004:50;;55065:25;55114:12;;55093:18;;:33;;;;:::i;:::-;55065:61;;55137:12;55192:1;55173:15;:20;:46;;;;55218:1;55197:17;:22;55173:46;55170:60;;;55222:7;;;;;55170:60;55284:2;55263:18;;:23;;;;:::i;:::-;55245:15;:41;55242:111;;;55339:2;55318:18;;:23;;;;:::i;:::-;55300:41;;55242:111;55422:26;55451:15;55422:44;;55487:25;55515:21;55487:49;;55549:36;55566:18;55549:16;:36::i;:::-;55607:18;55628:44;55654:17;55628:21;:25;;:44;;;;:::i;:::-;55607:65;;55693:23;55719:57;55758:17;55719:34;55734:18;;55719:10;:14;;:34;;;;:::i;:::-;:38;;:57;;;;:::i;:::-;55693:83;;55789:17;55809:51;55842:17;55809:28;55824:12;;55809:10;:14;;:28;;;;:::i;:::-;:32;;:51;;;;:::i;:::-;55789:71;;55909:9;;;;;;;;;;;55901:23;;55932:9;55901:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55887:59;;;;;55982:1;55961:18;;:22;55957:126;;;56022:15;;;;;;;;;;;56014:29;;56051:15;56014:57;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56000:71;;;;;55957:126;56116:1;56095:18;:22;;;;56143:1;56128:12;:16;;;;54993:1159;;;;;;;;54965:1187;:::o;56623:804::-;56680:4;56723:15;56706:14;:32;;;;56801:28;56832:4;:14;;;56847:13;56832:29;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;56801:60;;56919:20;56942:53;56989:5;56942:42;56967:16;;56942:20;:24;;:42;;;;:::i;:::-;:46;;:53;;;;:::i;:::-;56919:76;;57123:1;57108:12;:16;57104:109;;;57140:61;57156:13;57179:6;57188:12;57140:15;:61::i;:::-;57104:109;57296:19;57333:13;57296:51;;57358:4;:9;;;:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57385:12;;;;;;;;;;57415:4;57408:11;;;;;56623:804;:::o;5871:98::-;5929:7;5960:1;5956;:5;;;;:::i;:::-;5949:12;;5871:98;;;;:::o;6270:::-;6328:7;6359:1;6355;:5;;;;:::i;:::-;6348:12;;6270:98;;;;:::o;28976:125::-;;;;:::o;29705:124::-;;;;:::o;53825:601::-;53953:21;53991:1;53977:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53953:40;;54022:4;54004;54009:1;54004:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;;;54048:15;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54038:4;54043:1;54038:7;;;;;;;;:::i;:::-;;;;;;;:32;;;;;;;;;;;54083:62;54100:4;54115:15;54133:11;54083:8;:62::i;:::-;54184:15;:66;;;54265:11;54291:1;54335:4;54362;54382:15;54184:224;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53880:546;53825:601;:::o;5514:98::-;5572:7;5603:1;5599;:5;;;;:::i;:::-;5592:12;;5514:98;;;;:::o;88:117:1:-;197:1;194;187:12;211:117;320:1;317;310:12;334:117;443:1;440;433:12;457:117;566:1;563;556:12;580:117;689:1;686;679:12;720:568;793:8;803:6;853:3;846:4;838:6;834:17;830:27;820:122;;861:79;;:::i;:::-;820:122;974:6;961:20;951:30;;1004:18;996:6;993:30;990:117;;;1026:79;;:::i;:::-;990:117;1140:4;1132:6;1128:17;1116:29;;1194:3;1186:4;1178:6;1174:17;1164:8;1160:32;1157:41;1154:128;;;1201:79;;:::i;:::-;1154:128;720:568;;;;;:::o;1294:90::-;1328:7;1371:5;1364:13;1357:21;1346:32;;1294:90;;;:::o;1390:116::-;1460:21;1475:5;1460:21;:::i;:::-;1453:5;1450:32;1440:60;;1496:1;1493;1486:12;1440:60;1390:116;:::o;1512:133::-;1555:5;1593:6;1580:20;1571:29;;1609:30;1633:5;1609:30;:::i;:::-;1512:133;;;;:::o;1651:698::-;1743:6;1751;1759;1808:2;1796:9;1787:7;1783:23;1779:32;1776:119;;;1814:79;;:::i;:::-;1776:119;1962:1;1951:9;1947:17;1934:31;1992:18;1984:6;1981:30;1978:117;;;2014:79;;:::i;:::-;1978:117;2127:80;2199:7;2190:6;2179:9;2175:22;2127:80;:::i;:::-;2109:98;;;;1905:312;2256:2;2282:50;2324:7;2315:6;2304:9;2300:22;2282:50;:::i;:::-;2272:60;;2227:115;1651:698;;;;;:::o;2355:77::-;2392:7;2421:5;2410:16;;2355:77;;;:::o;2438:122::-;2511:24;2529:5;2511:24;:::i;:::-;2504:5;2501:35;2491:63;;2550:1;2547;2540:12;2491:63;2438:122;:::o;2566:139::-;2612:5;2650:6;2637:20;2628:29;;2666:33;2693:5;2666:33;:::i;:::-;2566:139;;;;:::o;2711:474::-;2779:6;2787;2836:2;2824:9;2815:7;2811:23;2807:32;2804:119;;;2842:79;;:::i;:::-;2804:119;2962:1;2987:53;3032:7;3023:6;3012:9;3008:22;2987:53;:::i;:::-;2977:63;;2933:117;3089:2;3115:53;3160:7;3151:6;3140:9;3136:22;3115:53;:::i;:::-;3105:63;;3060:118;2711:474;;;;;:::o;3191:99::-;3243:6;3277:5;3271:12;3261:22;;3191:99;;;:::o;3296:169::-;3380:11;3414:6;3409:3;3402:19;3454:4;3449:3;3445:14;3430:29;;3296:169;;;;:::o;3471:307::-;3539:1;3549:113;3563:6;3560:1;3557:13;3549:113;;;3648:1;3643:3;3639:11;3633:18;3629:1;3624:3;3620:11;3613:39;3585:2;3582:1;3578:10;3573:15;;3549:113;;;3680:6;3677:1;3674:13;3671:101;;;3760:1;3751:6;3746:3;3742:16;3735:27;3671:101;3520:258;3471:307;;;:::o;3784:102::-;3825:6;3876:2;3872:7;3867:2;3860:5;3856:14;3852:28;3842:38;;3784:102;;;:::o;3892:364::-;3980:3;4008:39;4041:5;4008:39;:::i;:::-;4063:71;4127:6;4122:3;4063:71;:::i;:::-;4056:78;;4143:52;4188:6;4183:3;4176:4;4169:5;4165:16;4143:52;:::i;:::-;4220:29;4242:6;4220:29;:::i;:::-;4215:3;4211:39;4204:46;;3984:272;3892:364;;;;:::o;4262:313::-;4375:4;4413:2;4402:9;4398:18;4390:26;;4462:9;4456:4;4452:20;4448:1;4437:9;4433:17;4426:47;4490:78;4563:4;4554:6;4490:78;:::i;:::-;4482:86;;4262:313;;;;:::o;4581:126::-;4618:7;4658:42;4651:5;4647:54;4636:65;;4581:126;;;:::o;4713:96::-;4750:7;4779:24;4797:5;4779:24;:::i;:::-;4768:35;;4713:96;;;:::o;4815:122::-;4888:24;4906:5;4888:24;:::i;:::-;4881:5;4878:35;4868:63;;4927:1;4924;4917:12;4868:63;4815:122;:::o;4943:139::-;4989:5;5027:6;5014:20;5005:29;;5043:33;5070:5;5043:33;:::i;:::-;4943:139;;;;:::o;5088:474::-;5156:6;5164;5213:2;5201:9;5192:7;5188:23;5184:32;5181:119;;;5219:79;;:::i;:::-;5181:119;5339:1;5364:53;5409:7;5400:6;5389:9;5385:22;5364:53;:::i;:::-;5354:63;;5310:117;5466:2;5492:53;5537:7;5528:6;5517:9;5513:22;5492:53;:::i;:::-;5482:63;;5437:118;5088:474;;;;;:::o;5568:109::-;5649:21;5664:5;5649:21;:::i;:::-;5644:3;5637:34;5568:109;;:::o;5683:210::-;5770:4;5808:2;5797:9;5793:18;5785:26;;5821:65;5883:1;5872:9;5868:17;5859:6;5821:65;:::i;:::-;5683:210;;;;:::o;5899:329::-;5958:6;6007:2;5995:9;5986:7;5982:23;5978:32;5975:119;;;6013:79;;:::i;:::-;5975:119;6133:1;6158:53;6203:7;6194:6;6183:9;6179:22;6158:53;:::i;:::-;6148:63;;6104:117;5899:329;;;;:::o;6234:60::-;6262:3;6283:5;6276:12;;6234:60;;;:::o;6300:142::-;6350:9;6383:53;6401:34;6410:24;6428:5;6410:24;:::i;:::-;6401:34;:::i;:::-;6383:53;:::i;:::-;6370:66;;6300:142;;;:::o;6448:126::-;6498:9;6531:37;6562:5;6531:37;:::i;:::-;6518:50;;6448:126;;;:::o;6580:153::-;6657:9;6690:37;6721:5;6690:37;:::i;:::-;6677:50;;6580:153;;;:::o;6739:185::-;6853:64;6911:5;6853:64;:::i;:::-;6848:3;6841:77;6739:185;;:::o;6930:276::-;7050:4;7088:2;7077:9;7073:18;7065:26;;7101:98;7196:1;7185:9;7181:17;7172:6;7101:98;:::i;:::-;6930:276;;;;:::o;7212:118::-;7299:24;7317:5;7299:24;:::i;:::-;7294:3;7287:37;7212:118;;:::o;7336:222::-;7429:4;7467:2;7456:9;7452:18;7444:26;;7480:71;7548:1;7537:9;7533:17;7524:6;7480:71;:::i;:::-;7336:222;;;;:::o;7564:329::-;7623:6;7672:2;7660:9;7651:7;7647:23;7643:32;7640:119;;;7678:79;;:::i;:::-;7640:119;7798:1;7823:53;7868:7;7859:6;7848:9;7844:22;7823:53;:::i;:::-;7813:63;;7769:117;7564:329;;;;:::o;7899:619::-;7976:6;7984;7992;8041:2;8029:9;8020:7;8016:23;8012:32;8009:119;;;8047:79;;:::i;:::-;8009:119;8167:1;8192:53;8237:7;8228:6;8217:9;8213:22;8192:53;:::i;:::-;8182:63;;8138:117;8294:2;8320:53;8365:7;8356:6;8345:9;8341:22;8320:53;:::i;:::-;8310:63;;8265:118;8422:2;8448:53;8493:7;8484:6;8473:9;8469:22;8448:53;:::i;:::-;8438:63;;8393:118;7899:619;;;;;:::o;8524:118::-;8611:24;8629:5;8611:24;:::i;:::-;8606:3;8599:37;8524:118;;:::o;8648:222::-;8741:4;8779:2;8768:9;8764:18;8756:26;;8792:71;8860:1;8849:9;8845:17;8836:6;8792:71;:::i;:::-;8648:222;;;;:::o;8876:86::-;8911:7;8951:4;8944:5;8940:16;8929:27;;8876:86;;;:::o;8968:112::-;9051:22;9067:5;9051:22;:::i;:::-;9046:3;9039:35;8968:112;;:::o;9086:214::-;9175:4;9213:2;9202:9;9198:18;9190:26;;9226:67;9290:1;9279:9;9275:17;9266:6;9226:67;:::i;:::-;9086:214;;;;:::o;9306:613::-;9380:6;9388;9396;9445:2;9433:9;9424:7;9420:23;9416:32;9413:119;;;9451:79;;:::i;:::-;9413:119;9571:1;9596:53;9641:7;9632:6;9621:9;9617:22;9596:53;:::i;:::-;9586:63;;9542:117;9698:2;9724:53;9769:7;9760:6;9749:9;9745:22;9724:53;:::i;:::-;9714:63;;9669:118;9826:2;9852:50;9894:7;9885:6;9874:9;9870:22;9852:50;:::i;:::-;9842:60;;9797:115;9306:613;;;;;:::o;9925:468::-;9990:6;9998;10047:2;10035:9;10026:7;10022:23;10018:32;10015:119;;;10053:79;;:::i;:::-;10015:119;10173:1;10198:53;10243:7;10234:6;10223:9;10219:22;10198:53;:::i;:::-;10188:63;;10144:117;10300:2;10326:50;10368:7;10359:6;10348:9;10344:22;10326:50;:::i;:::-;10316:60;;10271:115;9925:468;;;;;:::o;10399:323::-;10455:6;10504:2;10492:9;10483:7;10479:23;10475:32;10472:119;;;10510:79;;:::i;:::-;10472:119;10630:1;10655:50;10697:7;10688:6;10677:9;10673:22;10655:50;:::i;:::-;10645:60;;10601:114;10399:323;;;;:::o;10728:474::-;10796:6;10804;10853:2;10841:9;10832:7;10828:23;10824:32;10821:119;;;10859:79;;:::i;:::-;10821:119;10979:1;11004:53;11049:7;11040:6;11029:9;11025:22;11004:53;:::i;:::-;10994:63;;10950:117;11106:2;11132:53;11177:7;11168:6;11157:9;11153:22;11132:53;:::i;:::-;11122:63;;11077:118;10728:474;;;;;:::o;11208:180::-;11256:77;11253:1;11246:88;11353:4;11350:1;11343:15;11377:4;11374:1;11367:15;11394:180;11442:77;11439:1;11432:88;11539:4;11536:1;11529:15;11563:4;11560:1;11553:15;11580:233;11619:3;11642:24;11660:5;11642:24;:::i;:::-;11633:33;;11688:66;11681:5;11678:77;11675:103;;;11758:18;;:::i;:::-;11675:103;11805:1;11798:5;11794:13;11787:20;;11580:233;;;:::o;11819:305::-;11859:3;11878:20;11896:1;11878:20;:::i;:::-;11873:25;;11912:20;11930:1;11912:20;:::i;:::-;11907:25;;12066:1;11998:66;11994:74;11991:1;11988:81;11985:107;;;12072:18;;:::i;:::-;11985:107;12116:1;12113;12109:9;12102:16;;11819:305;;;;:::o;12130:179::-;12270:31;12266:1;12258:6;12254:14;12247:55;12130:179;:::o;12315:366::-;12457:3;12478:67;12542:2;12537:3;12478:67;:::i;:::-;12471:74;;12554:93;12643:3;12554:93;:::i;:::-;12672:2;12667:3;12663:12;12656:19;;12315:366;;;:::o;12687:419::-;12853:4;12891:2;12880:9;12876:18;12868:26;;12940:9;12934:4;12930:20;12926:1;12915:9;12911:17;12904:47;12968:131;13094:4;12968:131;:::i;:::-;12960:139;;12687:419;;;:::o;13112:180::-;13160:77;13157:1;13150:88;13257:4;13254:1;13247:15;13281:4;13278:1;13271:15;13298:320;13342:6;13379:1;13373:4;13369:12;13359:22;;13426:1;13420:4;13416:12;13447:18;13437:81;;13503:4;13495:6;13491:17;13481:27;;13437:81;13565:2;13557:6;13554:14;13534:18;13531:38;13528:84;;;13584:18;;:::i;:::-;13528:84;13349:269;13298:320;;;:::o;13624:179::-;13764:31;13760:1;13752:6;13748:14;13741:55;13624:179;:::o;13809:366::-;13951:3;13972:67;14036:2;14031:3;13972:67;:::i;:::-;13965:74;;14048:93;14137:3;14048:93;:::i;:::-;14166:2;14161:3;14157:12;14150:19;;13809:366;;;:::o;14181:419::-;14347:4;14385:2;14374:9;14370:18;14362:26;;14434:9;14428:4;14424:20;14420:1;14409:9;14405:17;14398:47;14462:131;14588:4;14462:131;:::i;:::-;14454:139;;14181:419;;;:::o;14606:102::-;14648:8;14695:5;14692:1;14688:13;14667:34;;14606:102;;;:::o;14714:848::-;14775:5;14782:4;14806:6;14797:15;;14830:5;14821:14;;14844:712;14865:1;14855:8;14852:15;14844:712;;;14960:4;14955:3;14951:14;14945:4;14942:24;14939:50;;;14969:18;;:::i;:::-;14939:50;15019:1;15009:8;15005:16;15002:451;;;15434:4;15427:5;15423:16;15414:25;;15002:451;15484:4;15478;15474:15;15466:23;;15514:32;15537:8;15514:32;:::i;:::-;15502:44;;14844:712;;;14714:848;;;;;;;:::o;15568:1073::-;15622:5;15813:8;15803:40;;15834:1;15825:10;;15836:5;;15803:40;15862:4;15852:36;;15879:1;15870:10;;15881:5;;15852:36;15948:4;15996:1;15991:27;;;;16032:1;16027:191;;;;15941:277;;15991:27;16009:1;16000:10;;16011:5;;;16027:191;16072:3;16062:8;16059:17;16056:43;;;16079:18;;:::i;:::-;16056:43;16128:8;16125:1;16121:16;16112:25;;16163:3;16156:5;16153:14;16150:40;;;16170:18;;:::i;:::-;16150:40;16203:5;;;15941:277;;16327:2;16317:8;16314:16;16308:3;16302:4;16299:13;16295:36;16277:2;16267:8;16264:16;16259:2;16253:4;16250:12;16246:35;16230:111;16227:246;;;16383:8;16377:4;16373:19;16364:28;;16418:3;16411:5;16408:14;16405:40;;;16425:18;;:::i;:::-;16405:40;16458:5;;16227:246;16498:42;16536:3;16526:8;16520:4;16517:1;16498:42;:::i;:::-;16483:57;;;;16572:4;16567:3;16563:14;16556:5;16553:25;16550:51;;;16581:18;;:::i;:::-;16550:51;16630:4;16623:5;16619:16;16610:25;;15568:1073;;;;;;:::o;16647:281::-;16705:5;16729:23;16747:4;16729:23;:::i;:::-;16721:31;;16773:25;16789:8;16773:25;:::i;:::-;16761:37;;16817:104;16854:66;16844:8;16838:4;16817:104;:::i;:::-;16808:113;;16647:281;;;;:::o;16934:348::-;16974:7;16997:20;17015:1;16997:20;:::i;:::-;16992:25;;17031:20;17049:1;17031:20;:::i;:::-;17026:25;;17219:1;17151:66;17147:74;17144:1;17141:81;17136:1;17129:9;17122:17;17118:105;17115:131;;;17226:18;;:::i;:::-;17115:131;17274:1;17271;17267:9;17256:20;;16934:348;;;;:::o;17288:180::-;17336:77;17333:1;17326:88;17433:4;17430:1;17423:15;17457:4;17454:1;17447:15;17474:185;17514:1;17531:20;17549:1;17531:20;:::i;:::-;17526:25;;17565:20;17583:1;17565:20;:::i;:::-;17560:25;;17604:1;17594:35;;17609:18;;:::i;:::-;17594:35;17651:1;17648;17644:9;17639:14;;17474:185;;;;:::o;17665:234::-;17805:34;17801:1;17793:6;17789:14;17782:58;17874:17;17869:2;17861:6;17857:15;17850:42;17665:234;:::o;17905:366::-;18047:3;18068:67;18132:2;18127:3;18068:67;:::i;:::-;18061:74;;18144:93;18233:3;18144:93;:::i;:::-;18262:2;18257:3;18253:12;18246:19;;17905:366;;;:::o;18277:419::-;18443:4;18481:2;18470:9;18466:18;18458:26;;18530:9;18524:4;18520:20;18516:1;18505:9;18501:17;18494:47;18558:131;18684:4;18558:131;:::i;:::-;18550:139;;18277:419;;;:::o;18702:238::-;18842:34;18838:1;18830:6;18826:14;18819:58;18911:21;18906:2;18898:6;18894:15;18887:46;18702:238;:::o;18946:366::-;19088:3;19109:67;19173:2;19168:3;19109:67;:::i;:::-;19102:74;;19185:93;19274:3;19185:93;:::i;:::-;19303:2;19298:3;19294:12;19287:19;;18946:366;;;:::o;19318:419::-;19484:4;19522:2;19511:9;19507:18;19499:26;;19571:9;19565:4;19561:20;19557:1;19546:9;19542:17;19535:47;19599:131;19725:4;19599:131;:::i;:::-;19591:139;;19318:419;;;:::o;19743:235::-;19883:34;19879:1;19871:6;19867:14;19860:58;19952:18;19947:2;19939:6;19935:15;19928:43;19743:235;:::o;19984:366::-;20126:3;20147:67;20211:2;20206:3;20147:67;:::i;:::-;20140:74;;20223:93;20312:3;20223:93;:::i;:::-;20341:2;20336:3;20332:12;20325:19;;19984:366;;;:::o;20356:419::-;20522:4;20560:2;20549:9;20545:18;20537:26;;20609:9;20603:4;20599:20;20595:1;20584:9;20580:17;20573:47;20637:131;20763:4;20637:131;:::i;:::-;20629:139;;20356:419;;;:::o;20781:244::-;20921:34;20917:1;20909:6;20905:14;20898:58;20990:27;20985:2;20977:6;20973:15;20966:52;20781:244;:::o;21031:366::-;21173:3;21194:67;21258:2;21253:3;21194:67;:::i;:::-;21187:74;;21270:93;21359:3;21270:93;:::i;:::-;21388:2;21383:3;21379:12;21372:19;;21031:366;;;:::o;21403:419::-;21569:4;21607:2;21596:9;21592:18;21584:26;;21656:9;21650:4;21646:20;21642:1;21631:9;21627:17;21620:47;21684:131;21810:4;21684:131;:::i;:::-;21676:139;;21403:419;;;:::o;21828:224::-;21968:34;21964:1;21956:6;21952:14;21945:58;22037:7;22032:2;22024:6;22020:15;22013:32;21828:224;:::o;22058:366::-;22200:3;22221:67;22285:2;22280:3;22221:67;:::i;:::-;22214:74;;22297:93;22386:3;22297:93;:::i;:::-;22415:2;22410:3;22406:12;22399:19;;22058:366;;;:::o;22430:419::-;22596:4;22634:2;22623:9;22619:18;22611:26;;22683:9;22677:4;22673:20;22669:1;22658:9;22654:17;22647:47;22711:131;22837:4;22711:131;:::i;:::-;22703:139;;22430:419;;;:::o;22855:223::-;22995:34;22991:1;22983:6;22979:14;22972:58;23064:6;23059:2;23051:6;23047:15;23040:31;22855:223;:::o;23084:366::-;23226:3;23247:67;23311:2;23306:3;23247:67;:::i;:::-;23240:74;;23323:93;23412:3;23323:93;:::i;:::-;23441:2;23436:3;23432:12;23425:19;;23084:366;;;:::o;23456:419::-;23622:4;23660:2;23649:9;23645:18;23637:26;;23709:9;23703:4;23699:20;23695:1;23684:9;23680:17;23673:47;23737:131;23863:4;23737:131;:::i;:::-;23729:139;;23456:419;;;:::o;23881:240::-;24021:34;24017:1;24009:6;24005:14;23998:58;24090:23;24085:2;24077:6;24073:15;24066:48;23881:240;:::o;24127:366::-;24269:3;24290:67;24354:2;24349:3;24290:67;:::i;:::-;24283:74;;24366:93;24455:3;24366:93;:::i;:::-;24484:2;24479:3;24475:12;24468:19;;24127:366;;;:::o;24499:419::-;24665:4;24703:2;24692:9;24688:18;24680:26;;24752:9;24746:4;24742:20;24738:1;24727:9;24723:17;24716:47;24780:131;24906:4;24780:131;:::i;:::-;24772:139;;24499:419;;;:::o;24924:237::-;25064:34;25060:1;25052:6;25048:14;25041:58;25133:20;25128:2;25120:6;25116:15;25109:45;24924:237;:::o;25167:366::-;25309:3;25330:67;25394:2;25389:3;25330:67;:::i;:::-;25323:74;;25406:93;25495:3;25406:93;:::i;:::-;25524:2;25519:3;25515:12;25508:19;;25167:366;;;:::o;25539:419::-;25705:4;25743:2;25732:9;25728:18;25720:26;;25792:9;25786:4;25782:20;25778:1;25767:9;25763:17;25756:47;25820:131;25946:4;25820:131;:::i;:::-;25812:139;;25539:419;;;:::o;25964:225::-;26104:34;26100:1;26092:6;26088:14;26081:58;26173:8;26168:2;26160:6;26156:15;26149:33;25964:225;:::o;26195:366::-;26337:3;26358:67;26422:2;26417:3;26358:67;:::i;:::-;26351:74;;26434:93;26523:3;26434:93;:::i;:::-;26552:2;26547:3;26543:12;26536:19;;26195:366;;;:::o;26567:419::-;26733:4;26771:2;26760:9;26756:18;26748:26;;26820:9;26814:4;26810:20;26806:1;26795:9;26791:17;26784:47;26848:131;26974:4;26848:131;:::i;:::-;26840:139;;26567:419;;;:::o;26992:182::-;27132:34;27128:1;27120:6;27116:14;27109:58;26992:182;:::o;27180:366::-;27322:3;27343:67;27407:2;27402:3;27343:67;:::i;:::-;27336:74;;27419:93;27508:3;27419:93;:::i;:::-;27537:2;27532:3;27528:12;27521:19;;27180:366;;;:::o;27552:419::-;27718:4;27756:2;27745:9;27741:18;27733:26;;27805:9;27799:4;27795:20;27791:1;27780:9;27776:17;27769:47;27833:131;27959:4;27833:131;:::i;:::-;27825:139;;27552:419;;;:::o;27977:223::-;28117:34;28113:1;28105:6;28101:14;28094:58;28186:6;28181:2;28173:6;28169:15;28162:31;27977:223;:::o;28206:366::-;28348:3;28369:67;28433:2;28428:3;28369:67;:::i;:::-;28362:74;;28445:93;28534:3;28445:93;:::i;:::-;28563:2;28558:3;28554:12;28547:19;;28206:366;;;:::o;28578:419::-;28744:4;28782:2;28771:9;28767:18;28759:26;;28831:9;28825:4;28821:20;28817:1;28806:9;28802:17;28795:47;28859:131;28985:4;28859:131;:::i;:::-;28851:139;;28578:419;;;:::o;29003:221::-;29143:34;29139:1;29131:6;29127:14;29120:58;29212:4;29207:2;29199:6;29195:15;29188:29;29003:221;:::o;29230:366::-;29372:3;29393:67;29457:2;29452:3;29393:67;:::i;:::-;29386:74;;29469:93;29558:3;29469:93;:::i;:::-;29587:2;29582:3;29578:12;29571:19;;29230:366;;;:::o;29602:419::-;29768:4;29806:2;29795:9;29791:18;29783:26;;29855:9;29849:4;29845:20;29841:1;29830:9;29826:17;29819:47;29883:131;30009:4;29883:131;:::i;:::-;29875:139;;29602:419;;;:::o;30027:179::-;30167:31;30163:1;30155:6;30151:14;30144:55;30027:179;:::o;30212:366::-;30354:3;30375:67;30439:2;30434:3;30375:67;:::i;:::-;30368:74;;30451:93;30540:3;30451:93;:::i;:::-;30569:2;30564:3;30560:12;30553:19;;30212:366;;;:::o;30584:419::-;30750:4;30788:2;30777:9;30773:18;30765:26;;30837:9;30831:4;30827:20;30823:1;30812:9;30808:17;30801:47;30865:131;30991:4;30865:131;:::i;:::-;30857:139;;30584:419;;;:::o;31009:224::-;31149:34;31145:1;31137:6;31133:14;31126:58;31218:7;31213:2;31205:6;31201:15;31194:32;31009:224;:::o;31239:366::-;31381:3;31402:67;31466:2;31461:3;31402:67;:::i;:::-;31395:74;;31478:93;31567:3;31478:93;:::i;:::-;31596:2;31591:3;31587:12;31580:19;;31239:366;;;:::o;31611:419::-;31777:4;31815:2;31804:9;31800:18;31792:26;;31864:9;31858:4;31854:20;31850:1;31839:9;31835:17;31828:47;31892:131;32018:4;31892:131;:::i;:::-;31884:139;;31611:419;;;:::o;32036:222::-;32176:34;32172:1;32164:6;32160:14;32153:58;32245:5;32240:2;32232:6;32228:15;32221:30;32036:222;:::o;32264:366::-;32406:3;32427:67;32491:2;32486:3;32427:67;:::i;:::-;32420:74;;32503:93;32592:3;32503:93;:::i;:::-;32621:2;32616:3;32612:12;32605:19;;32264:366;;;:::o;32636:419::-;32802:4;32840:2;32829:9;32825:18;32817:26;;32889:9;32883:4;32879:20;32875:1;32864:9;32860:17;32853:47;32917:131;33043:4;32917:131;:::i;:::-;32909:139;;32636:419;;;:::o;33061:158::-;33201:10;33197:1;33189:6;33185:14;33178:34;33061:158;:::o;33225:365::-;33367:3;33388:66;33452:1;33447:3;33388:66;:::i;:::-;33381:73;;33463:93;33552:3;33463:93;:::i;:::-;33581:2;33576:3;33572:12;33565:19;;33225:365;;;:::o;33596:419::-;33762:4;33800:2;33789:9;33785:18;33777:26;;33849:9;33843:4;33839:20;33835:1;33824:9;33820:17;33813:47;33877:131;34003:4;33877:131;:::i;:::-;33869:139;;33596:419;;;:::o;34021:172::-;34161:24;34157:1;34149:6;34145:14;34138:48;34021:172;:::o;34199:366::-;34341:3;34362:67;34426:2;34421:3;34362:67;:::i;:::-;34355:74;;34438:93;34527:3;34438:93;:::i;:::-;34556:2;34551:3;34547:12;34540:19;;34199:366;;;:::o;34571:419::-;34737:4;34775:2;34764:9;34760:18;34752:26;;34824:9;34818:4;34814:20;34810:1;34799:9;34795:17;34788:47;34852:131;34978:4;34852:131;:::i;:::-;34844:139;;34571:419;;;:::o;34996:297::-;35136:34;35132:1;35124:6;35120:14;35113:58;35205:34;35200:2;35192:6;35188:15;35181:59;35274:11;35269:2;35261:6;35257:15;35250:36;34996:297;:::o;35299:366::-;35441:3;35462:67;35526:2;35521:3;35462:67;:::i;:::-;35455:74;;35538:93;35627:3;35538:93;:::i;:::-;35656:2;35651:3;35647:12;35640:19;;35299:366;;;:::o;35671:419::-;35837:4;35875:2;35864:9;35860:18;35852:26;;35924:9;35918:4;35914:20;35910:1;35899:9;35895:17;35888:47;35952:131;36078:4;35952:131;:::i;:::-;35944:139;;35671:419;;;:::o;36096:240::-;36236:34;36232:1;36224:6;36220:14;36213:58;36305:23;36300:2;36292:6;36288:15;36281:48;36096:240;:::o;36342:366::-;36484:3;36505:67;36569:2;36564:3;36505:67;:::i;:::-;36498:74;;36581:93;36670:3;36581:93;:::i;:::-;36699:2;36694:3;36690:12;36683:19;;36342:366;;;:::o;36714:419::-;36880:4;36918:2;36907:9;36903:18;36895:26;;36967:9;36961:4;36957:20;36953:1;36942:9;36938:17;36931:47;36995:131;37121:4;36995:131;:::i;:::-;36987:139;;36714:419;;;:::o;37139:169::-;37279:21;37275:1;37267:6;37263:14;37256:45;37139:169;:::o;37314:366::-;37456:3;37477:67;37541:2;37536:3;37477:67;:::i;:::-;37470:74;;37553:93;37642:3;37553:93;:::i;:::-;37671:2;37666:3;37662:12;37655:19;;37314:366;;;:::o;37686:419::-;37852:4;37890:2;37879:9;37875:18;37867:26;;37939:9;37933:4;37929:20;37925:1;37914:9;37910:17;37903:47;37967:131;38093:4;37967:131;:::i;:::-;37959:139;;37686:419;;;:::o;38111:241::-;38251:34;38247:1;38239:6;38235:14;38228:58;38320:24;38315:2;38307:6;38303:15;38296:49;38111:241;:::o;38358:366::-;38500:3;38521:67;38585:2;38580:3;38521:67;:::i;:::-;38514:74;;38597:93;38686:3;38597:93;:::i;:::-;38715:2;38710:3;38706:12;38699:19;;38358:366;;;:::o;38730:419::-;38896:4;38934:2;38923:9;38919:18;38911:26;;38983:9;38977:4;38973:20;38969:1;38958:9;38954:17;38947:47;39011:131;39137:4;39011:131;:::i;:::-;39003:139;;38730:419;;;:::o;39155:191::-;39195:4;39215:20;39233:1;39215:20;:::i;:::-;39210:25;;39249:20;39267:1;39249:20;:::i;:::-;39244:25;;39288:1;39285;39282:8;39279:34;;;39293:18;;:::i;:::-;39279:34;39338:1;39335;39331:9;39323:17;;39155:191;;;;:::o;39352:225::-;39492:34;39488:1;39480:6;39476:14;39469:58;39561:8;39556:2;39548:6;39544:15;39537:33;39352:225;:::o;39583:366::-;39725:3;39746:67;39810:2;39805:3;39746:67;:::i;:::-;39739:74;;39822:93;39911:3;39822:93;:::i;:::-;39940:2;39935:3;39931:12;39924:19;;39583:366;;;:::o;39955:419::-;40121:4;40159:2;40148:9;40144:18;40136:26;;40208:9;40202:4;40198:20;40194:1;40183:9;40179:17;40172:47;40236:131;40362:4;40236:131;:::i;:::-;40228:139;;39955:419;;;:::o;40380:147::-;40481:11;40518:3;40503:18;;40380:147;;;;:::o;40533:114::-;;:::o;40653:398::-;40812:3;40833:83;40914:1;40909:3;40833:83;:::i;:::-;40826:90;;40925:93;41014:3;40925:93;:::i;:::-;41043:1;41038:3;41034:11;41027:18;;40653:398;;;:::o;41057:379::-;41241:3;41263:147;41406:3;41263:147;:::i;:::-;41256:154;;41427:3;41420:10;;41057:379;;;:::o;41442:143::-;41499:5;41530:6;41524:13;41515:22;;41546:33;41573:5;41546:33;:::i;:::-;41442:143;;;;:::o;41591:351::-;41661:6;41710:2;41698:9;41689:7;41685:23;41681:32;41678:119;;;41716:79;;:::i;:::-;41678:119;41836:1;41861:64;41917:7;41908:6;41897:9;41893:22;41861:64;:::i;:::-;41851:74;;41807:128;41591:351;;;;:::o;41948:180::-;41996:77;41993:1;41986:88;42093:4;42090:1;42083:15;42117:4;42114:1;42107:15;42134:143;42191:5;42222:6;42216:13;42207:22;;42238:33;42265:5;42238:33;:::i;:::-;42134:143;;;;:::o;42283:351::-;42353:6;42402:2;42390:9;42381:7;42377:23;42373:32;42370:119;;;42408:79;;:::i;:::-;42370:119;42528:1;42553:64;42609:7;42600:6;42589:9;42585:22;42553:64;:::i;:::-;42543:74;;42499:128;42283:351;;;;:::o;42640:85::-;42685:7;42714:5;42703:16;;42640:85;;;:::o;42731:158::-;42789:9;42822:61;42840:42;42849:32;42875:5;42849:32;:::i;:::-;42840:42;:::i;:::-;42822:61;:::i;:::-;42809:74;;42731:158;;;:::o;42895:147::-;42990:45;43029:5;42990:45;:::i;:::-;42985:3;42978:58;42895:147;;:::o;43048:114::-;43115:6;43149:5;43143:12;43133:22;;43048:114;;;:::o;43168:184::-;43267:11;43301:6;43296:3;43289:19;43341:4;43336:3;43332:14;43317:29;;43168:184;;;;:::o;43358:132::-;43425:4;43448:3;43440:11;;43478:4;43473:3;43469:14;43461:22;;43358:132;;;:::o;43496:108::-;43573:24;43591:5;43573:24;:::i;:::-;43568:3;43561:37;43496:108;;:::o;43610:179::-;43679:10;43700:46;43742:3;43734:6;43700:46;:::i;:::-;43778:4;43773:3;43769:14;43755:28;;43610:179;;;;:::o;43795:113::-;43865:4;43897;43892:3;43888:14;43880:22;;43795:113;;;:::o;43944:732::-;44063:3;44092:54;44140:5;44092:54;:::i;:::-;44162:86;44241:6;44236:3;44162:86;:::i;:::-;44155:93;;44272:56;44322:5;44272:56;:::i;:::-;44351:7;44382:1;44367:284;44392:6;44389:1;44386:13;44367:284;;;44468:6;44462:13;44495:63;44554:3;44539:13;44495:63;:::i;:::-;44488:70;;44581:60;44634:6;44581:60;:::i;:::-;44571:70;;44427:224;44414:1;44411;44407:9;44402:14;;44367:284;;;44371:14;44667:3;44660:10;;44068:608;;;43944:732;;;;:::o;44682:831::-;44945:4;44983:3;44972:9;44968:19;44960:27;;44997:71;45065:1;45054:9;45050:17;45041:6;44997:71;:::i;:::-;45078:80;45154:2;45143:9;45139:18;45130:6;45078:80;:::i;:::-;45205:9;45199:4;45195:20;45190:2;45179:9;45175:18;45168:48;45233:108;45336:4;45327:6;45233:108;:::i;:::-;45225:116;;45351:72;45419:2;45408:9;45404:18;45395:6;45351:72;:::i;:::-;45433:73;45501:3;45490:9;45486:19;45477:6;45433:73;:::i;:::-;44682:831;;;;;;;;:::o

Swarm Source

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