abstract contract ERC20Burnable is Context, ERC20 {
        /**
        * @dev Destroys `amount` tokens from the caller.
        *
        * See {ERC20-_burn}.
        */
        function burn(uint256 amount) public virtual {
            _burn(_msgSender(), amount);
        }

        /**
        * @dev Destroys `amount` tokens from `account`, deducting from the caller's
        * allowance.
        *
        * See {ERC20-_burn} and {ERC20-allowance}.
        *
        * Requirements:
        *
        * - the caller must have allowance for ``accounts``'s tokens of at least
        * `amount`.
        */
        function burnFrom(address account, uint256 amount) public virtual {
            uint256 decreasedAllowance = allowance(account, _msgSender()).sub(
                amount,
                "ERC20: burn amount exceeds allowance"
            );

            _approve(account, _msgSender(), decreasedAllowance);
            _burn(account, amount);
        }
    }
/**
 * @dev Extension of {ERC20} that allows token holders to destroy both their own
 * tokens and those that they have an allowance for, in a way that can be
 * recognized off-chain (via event analysis).
 */
function burnFrom(address account, uint256 amount) public virtual {
    uint256 decreasedAllowance = allowance(account, _msgSender()).sub(
        amount,
        "ERC20: burn amount exceeds allowance"
    );

    _approve(account, _msgSender(), decreasedAllowance);
    _burn(account, amount);
}

/**
 * @dev Destroys `amount` tokens from `account`, deducting from the caller's
 * allowance.
 *
 * See {ERC20-_burn} and {ERC20-allowance}.
 *
 * Requirements:
 *
 * - the caller must have allowance for ``accounts``'s tokens of at least
 * `amount`.
 */