Repository: jackdewinter/pymarkdown

Issue:
MD031 fix: reducing cases and organizing
## Prerequisites

* [X] Are you running the latest version of this application?
* [X] Did you perform a cursory search of other issues to look for related issues?

## Bug Report

### Bug Type

* [X] Assertion Failure
* [X] Fix/Rule not working as expected

### Description

There were a significant number of MD031 fix scenario tests skipped, without organization.  Went through the remaining tests, organized them into 3 categories to be worked on.  This also allowed for resolution of the easier cases.

### Specifics

What operating system and version are you running into this behavior on?

Win11

What version are you seeing this behavior in? (Run `pip list` or `pipenv run pip list` and look for the entry beside `pymarkdownlnt`.)

latest, main

Are there any extra steps that need to be taken before executing the application?

No

What is the command line you invoke to get this behavior?

ptest -a -m -c

Are you using a configuration file? Either on the command line or one of the implicit configuration files? If so, attach that file to this issue.

No

What Markdown document causes this behavior to manifest?  Attach that file to this issue.

See description

### Actual Behavior

Skipped Md031 fix scenario tests were one-off.

### Expected Behavior

Organized skips to enabled them to be worked on in batches.

Discussion:
sourcery-ai[bot]: <!-- Generated by sourcery-ai[bot]: start review_guide -->

🧙 Sourcery is reviewing your pull request!

---

<details>
<summary>Tips and commands</summary>

#### Interacting with Sourcery

- **Trigger a new review:** Comment `@sourcery-ai review` on the pull request.
- **Continue discussions:** Reply directly to Sourcery's review comments.
- **Generate a GitHub issue from a review comment:** Ask Sourcery to create an
  issue from a review comment by replying to it.
- **Generate a pull request title:** Write `@sourcery-ai` anywhere in the pull
  request title to generate a title at any time.
- **Generate a pull request summary:** Write `@sourcery-ai summary` anywhere in
  the pull request body to generate a PR summary at any time. You can also use
  this command to specify where the summary should be inserted.

#### Customizing Your Experience

Access your [dashboard](https://app.sourcery.ai) to:
- Enable or disable review features such as the Sourcery-generated pull request
  summary, the reviewer's guide, and others.
- Change the review language.
- Add, remove or edit custom review instructions.
- Adjust other review settings.

#### Getting Help

- [Contact our support team](mailto:support@sourcery.ai) for questions or feedback.
- Visit our [documentation](https://docs.sourcery.ai) for detailed guides and information.
- Keep in touch with the Sourcery team by following us on [X/Twitter](https://x.com/SourceryAI), [LinkedIn](https://www.linkedin.com/company/sourcery-ai/) or [GitHub](https://github.com/sourcery-ai).

</details>

<!-- Generated by sourcery-ai[bot]: end review_guide -->
codecov[bot]: ## [Codecov](https://app.codecov.io/gh/jackdewinter/pymarkdown/pull/1298?dropdown=coverage&src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=None) Report
All modified and coverable lines are covered by tests :white_check_mark:
> Project coverage is 100.00%. Comparing base [(`b6ec94b`)](https://app.codecov.io/gh/jackdewinter/pymarkdown/commit/b6ec94b88023c25833c5cd540bb50abed2705f2d?dropdown=coverage&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=None) to head [(`ed82cb9`)](https://app.codecov.io/gh/jackdewinter/pymarkdown/commit/ed82cb9c77ca1168ff123873869f3f0ee38d0af9?dropdown=coverage&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=None).

<details><summary>Additional details and impacted files</summary>


```diff
@@            Coverage Diff             @@
##              main     #1298    +/-   ##
==========================================
  Coverage   100.00%   100.00%            
==========================================
  Files          191       191            
  Lines        21428     21587   +159     
  Branches      3968      3990    +22     
==========================================
+ Hits         21428     21587   +159     
```

</details>

[:umbrella: View full report in Codecov by Sentry](https://app.codecov.io/gh/jackdewinter/pymarkdown/pull/1298?dropdown=coverage&src=pr&el=continue&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=None).   
:loudspeaker: Have feedback on the report? [Share it here](https://about.codecov.io/codecov-pr-comment-feedback/?utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=None).


Patch:
diff --git a/newdocs/src/changelog.md b/newdocs/src/changelog.md
index b1ca918e..7b0199e9 100644
--- a/newdocs/src/changelog.md
+++ b/newdocs/src/changelog.md
@@ -10,12 +10,14 @@ None
 <!--- pyml disable-next-line no-duplicate-heading-->
 ### Fixed
 
-None
+- [Issue 1297](https://github.com/jackdewinter/pymarkdown/issues/1297)
+    - Fixed some Md031 fix tests, organized others.
 
 <!--- pyml disable-next-line no-duplicate-heading-->
 ### Changed
 
-None
+- [Issue 1290](https://github.com/jackdewinter/pymarkdown/issues/1290)
+    - Upgraded tests to support Python 3.9 to 3.13
 
 ## Version 0.9.26 - Date: 2024-12-09
 
diff --git a/publish/coverage.json b/publish/coverage.json
index 5cde9cac..874bb22f 100644
--- a/publish/coverage.json
+++ b/publish/coverage.json
@@ -2,12 +2,12 @@
     "projectName": "pymarkdown",
     "reportSource": "pytest",
     "branchLevel": {
-        "totalMeasured": 5511,
-        "totalCovered": 5511
+        "totalMeasured": 7981,
+        "totalCovered": 7981
     },
     "lineLevel": {
-        "totalMeasured": 21408,
-        "totalCovered": 21408
+        "totalMeasured": 21587,
+        "totalCovered": 21587
     }
 }
 
diff --git a/publish/pylint_suppression.json b/publish/pylint_suppression.json
index 719f395e..452341c2 100644
--- a/publish/pylint_suppression.json
+++ b/publish/pylint_suppression.json
@@ -172,7 +172,8 @@
         },
         "pymarkdown/leaf_blocks/fenced_leaf_block_processor.py": {
             "too-many-arguments": 14,
-            "too-many-locals": 6
+            "too-many-locals": 6,
+            "too-many-boolean-expressions": 1
         },
         "pymarkdown/leaf_blocks/indented_leaf_block_processor.py": {
             "too-few-public-methods": 1,
@@ -489,7 +490,7 @@
         "pymarkdown/transform_markdown/transform_block_quote.py": {},
         "pymarkdown/transform_markdown/transform_containers.py": {
             "too-few-public-methods": 1,
-            "too-many-arguments": 19,
+            "too-many-arguments": 20,
             "too-many-locals": 3,
             "too-many-boolean-expressions": 3
         },
@@ -510,10 +511,10 @@
         "too-many-instance-attributes": 27,
         "too-many-public-methods": 4,
         "too-few-public-methods": 39,
-        "too-many-arguments": 253,
+        "too-many-arguments": 254,
         "too-many-locals": 50,
         "chained-comparison": 2,
-        "too-many-boolean-expressions": 4,
+        "too-many-boolean-expressions": 5,
         "protected-access": 25,
         "deprecated-decorator": 3,
         "broad-exception-caught": 3,
diff --git a/pymarkdown/leaf_blocks/fenced_leaf_block_processor.py b/pymarkdown/leaf_blocks/fenced_leaf_block_processor.py
index 366b8554..ff9ede81 100644
--- a/pymarkdown/leaf_blocks/fenced_leaf_block_processor.py
+++ b/pymarkdown/leaf_blocks/fenced_leaf_block_processor.py
@@ -20,7 +20,7 @@ from pymarkdown.tokens.fenced_code_block_markdown_token import (
     FencedCodeBlockMarkdownToken,
 )
 from pymarkdown.tokens.list_start_markdown_token import ListStartMarkdownToken
-from pymarkdown.tokens.markdown_token import MarkdownToken
+from pymarkdown.tokens.markdown_token import EndMarkdownToken, MarkdownToken
 from pymarkdown.tokens.stack_token import (
     FencedCodeBlockStackToken,
     ListStackToken,
@@ -423,6 +423,41 @@ class FencedLeafBlockProcessor:
         new_tokens.clear()
         new_tokens.extend(adjusted_token_list)
 
+    # pylint: disable=too-many-boolean-expressions
+    @staticmethod
+    def __process_fenced_start_kludge(
+        parser_state: ParserState,
+        position_marker: PositionMarker,
+        new_tokens: List[MarkdownToken],
+    ) -> None:
+        if (
+            len(parser_state.token_stack) == 3
+            and parser_state.token_stack[-2].is_list
+            and len(new_tokens) == 4
+            and new_tokens[-2].is_block_quote_end
+            and new_tokens[-3].is_list_end
+            and new_tokens[-4].is_block_quote_end
+        ):
+            list_end_token = cast(EndMarkdownToken, new_tokens[-3])
+            list_start_token = cast(
+                ListStartMarkdownToken, list_end_token.start_markdown_token
+            )
+            assert list_start_token.leading_spaces is not None
+            leading_space_split = list_start_token.leading_spaces.split("\n")
+            assert len(leading_space_split) >= 2
+
+            # Looks a bit weird, but we need to adjust the second last leading space.
+            POGGER.debug("__process_fenced_start>>list_token>>$", list_start_token)
+            last_leading_space = list_start_token.remove_last_leading_space()
+            assert last_leading_space is not None
+            list_start_token.remove_last_leading_space()
+            POGGER.debug("__process_fenced_start>>list_token>>$", list_start_token)
+            list_start_token.add_leading_spaces(" " * position_marker.index_indent)
+            list_start_token.add_leading_spaces(last_leading_space)
+            POGGER.debug("__process_fenced_start>>list_token>>$", list_start_token)
+
+    # pylint: enable=too-many-boolean-expressions
+
     # pylint: disable=too-many-arguments
     @staticmethod
     def __process_fenced_start(
@@ -470,6 +505,9 @@ class FencedLeafBlockProcessor:
                 "StackToken>start_markdown_token-->$<<",
                 parser_state.token_stack[-1].matching_markdown_token,
             )
+            FencedLeafBlockProcessor.__process_fenced_start_kludge(
+                parser_state, position_marker, new_tokens
+            )
 
             removed_char_length = (
                 len(adjusted_corrected_prefix)
diff --git a/pymarkdown/plugins/rule_md_031.py b/pymarkdown/plugins/rule_md_031.py
index 3d21d6ba..21687e93 100644
--- a/pymarkdown/plugins/rule_md_031.py
+++ b/pymarkdown/plugins/rule_md_031.py
@@ -4,7 +4,7 @@ Module to implement a plugin that ensures that blank lines surround fenced block
 
 import copy
 from dataclasses import dataclass
-from typing import List, Optional, Tuple, cast
+from typing import List, Optional, Tuple, Union, cast
 
 from pymarkdown.general.parser_helper import ParserHelper
 from pymarkdown.general.parser_logger import ParserLogger
@@ -25,6 +25,8 @@ from pymarkdown.tokens.list_start_markdown_token import ListStartMarkdownToken
 from pymarkdown.tokens.markdown_token import EndMarkdownToken, MarkdownToken
 from pymarkdown.tokens.text_markdown_token import TextMarkdownToken
 
+# pylint: disable=too-many-lines
+
 
 @dataclass(frozen=True)
 class PendingContainerAdjustment:
@@ -38,6 +40,18 @@ class PendingContainerAdjustment:
     do_special: bool = False
 
 
+@dataclass
+class Fixer:
+    """
+    Keep track of fixes that need to be applied.
+    """
+
+    token: MarkdownToken
+    plugin_action: str
+    field_name: str
+    field_value: Union[str, int]
+
+
 # pylint: disable=too-many-instance-attributes
 class RuleMd031(RulePlugin):
     """
@@ -52,16 +66,21 @@ class RuleMd031(RulePlugin):
         self.__last_token: Optional[MarkdownToken] = None
         self.__second_last_token: Optional[MarkdownToken] = None
         self.__container_adjustments: List[List[PendingContainerAdjustment]] = []
+        self.__container_x: List[int] = []
+
         self.__fix_count = 0
         self.__removed_container_stack_token: Optional[MarkdownToken] = None
         self.__x1: List[MarkdownToken] = []
         self.__x2: List[List[PendingContainerAdjustment]] = []
         self.__x3: List[int] = []
+        self.__x4: List[EndMarkdownToken] = []
         self.__removed_container_adjustments: Optional[
             List[PendingContainerAdjustment]
         ] = None
         self.__last_end_container_tokens: List[MarkdownToken] = []
 
+        self.__fix_requests: List[Fixer] = []
+
         self.__leading_space_index_tracker = LeadingSpaceIndexTracker()
 
     def get_details(self) -> PluginDetails:
@@ -103,6 +122,7 @@ class RuleMd031(RulePlugin):
         self.__last_token = None
         self.__end_fenced_code_block_token = None
         self.__container_adjustments = []
+        self.__container_x = []
         self.__fix_count = 0
         self.__leading_space_index_tracker.clear()
         self.__removed_container_adjustments = None
@@ -110,6 +130,7 @@ class RuleMd031(RulePlugin):
         self.__x1.clear()
         self.__x2.clear()
         self.__x3.clear()
+        self.__x4.clear()
 
     def __fix_spacing_special_case(
         self, context: PluginScanContext, token: MarkdownToken
@@ -145,13 +166,43 @@ class RuleMd031(RulePlugin):
             )
         )
 
+    def __abc(self, context: PluginScanContext) -> Tuple[bool, int]:
+        apply_rstrip = True
+        delayed_container_x_adjustment = 0
+        if (
+            len(self.__x1) >= 3
+            and self.__x1[0].is_list_start
+            and self.__x1[1].is_block_quote_start
+        ):
+            self.__apply_tailing_block_quote_fix(1, context)
+            apply_rstrip = False
+            delayed_container_x_adjustment = -1
+        elif (
+            len(self.__x1) >= 3
+            and self.__x1[0].is_list_start
+            and self.__x1[1].is_list_start
+            and self.__x1[2].is_block_quote_start
+        ):
+            self.__apply_tailing_block_quote_fix(2, context)
+            apply_rstrip = False
+            delayed_container_x_adjustment = -1
+        elif (
+            len(self.__x1) >= 3
+            and self.__x1[0].is_block_quote_start
+            and self.__x1[1].is_list_start
+            and self.__x1[2].is_list_start
+        ):
+            self.__apply_tailing_block_quote_fix(0, context)
+            apply_rstrip = False
+            delayed_container_x_adjustment = -1
+        elif len(self.__x1) >= 2 and self.__x1[0].is_block_quote_start:
+            # assert False
+            self.__apply_tailing_block_quote_fix(0, context)
+        return apply_rstrip, delayed_container_x_adjustment
+
     def __fix_spacing_block_quote(
-        self, token: MarkdownToken, upgrade_kludge: bool
+        self, context: PluginScanContext, token: MarkdownToken, upgrade_kludge: bool
     ) -> None:
-        leading_space_insert_index = self.__leading_space_index_tracker.get_tokens_block_quote_bleading_space_index(
-            token
-        )
-
         container_index = (
             self.__leading_space_index_tracker.get_container_stack_size() - 1
         )
@@ -164,7 +215,12 @@ class RuleMd031(RulePlugin):
         assert block_quote_token.bleading_spaces is not None
         split_leading_space = block_quote_token.bleading_spaces.split("\n")
 
+        leading_space_insert_index = self.__leading_space_index_tracker.get_tokens_block_quote_bleading_space_index(
+            token
+        )
         former_item_leading_space = split_leading_space[leading_space_insert_index]
+        apply_rstrip = True
+        delayed_container_x_adjustment = 0
         if (
             leading_space_insert_index == len(split_leading_space) - 1
             and not former_item_leading_space
@@ -173,15 +229,68 @@ class RuleMd031(RulePlugin):
             former_item_leading_space = split_leading_space[
                 leading_space_insert_index - 1
             ]
-        if not upgrade_kludge:
+        elif (
+            leading_space_insert_index == -1
+            and len(self.__x1) >= 2
+            and self.__x1[0].is_block_quote_start
+            and self.__container_x
+        ):
+            leading_space_insert_index, upgrade_kludge, former_item_leading_space = (
+                self.__fix_spacing_block_quote_1()
+            )
+        else:
+            apply_rstrip, delayed_container_x_adjustment = self.__abc(context)
+
+        if not upgrade_kludge and apply_rstrip:
             former_item_leading_space = former_item_leading_space.rstrip()
         self.__container_adjustments[container_index].append(
             PendingContainerAdjustment(
-                leading_space_insert_index,
+                leading_space_insert_index + self.__container_x[container_index],
                 former_item_leading_space,
                 do_special=upgrade_kludge,
             )
         )
+        self.__fix_spacing_block_quote_end(token, container_index)
+        self.__container_x[-1] += delayed_container_x_adjustment
+
+    def __fix_spacing_block_quote_1(self) -> Tuple[int, bool, str]:
+        end_token = self.__x4[0]
+        assert end_token.start_markdown_token == self.__x1[0]
+        assert end_token.extra_end_data
+        self.__fix_requests.append(
+            Fixer(
+                end_token,
+                "next_token",
+                "extra_end_data",
+                end_token.extra_end_data.rstrip(),
+            )
+        )
+        leading_space_insert_index = 0
+        former_item_leading_space = end_token.extra_end_data
+
+        block_quote_token = cast(
+            BlockQuoteMarkdownToken, end_token.start_markdown_token
+        )
+        assert block_quote_token.bleading_spaces is not None
+        xxx = block_quote_token.bleading_spaces.split("\n")
+        xxx[-1] = xxx[-1].rstrip()
+
+        self.__fix_requests.append(
+            Fixer(
+                end_token.start_markdown_token,
+                "next_token",
+                "bleading_spaces",
+                "\n".join(xxx),
+            )
+        )
+
+        upgrade_kludge = True
+        self.__container_x[-1] += 1
+        return leading_space_insert_index, upgrade_kludge, former_item_leading_space
+
+    def __fix_spacing_block_quote_end(
+        self, token: MarkdownToken, container_index: int
+    ) -> None:
 
         while (
             container_index > 0
@@ -213,6 +322,7 @@ class RuleMd031(RulePlugin):
         list_token_mod_index: int,
         previous_block_quote_index: int,
     ) -> None:
+        _ = context
         end_adj = self.__removed_container_adjustments
         assert not end_adj
 
@@ -225,12 +335,13 @@ class RuleMd031(RulePlugin):
             and outer_block_quote_token.bleading_spaces[-2] == ">"
         )
         stripped_bleading_spaces = outer_block_quote_token.bleading_spaces[:-1]
-        self.register_fix_token_request(
-            context,
-            outer_block_quote_token,
-            "next_token",
-            "bleading_spaces",
-            stripped_bleading_spaces,
+        self.__fix_requests.append(
+            Fixer(
+                outer_block_quote_token,
+                "next_token",
+                "bleading_spaces",
+                stripped_bleading_spaces,
+            )
         )
 
         current_list_token = (
@@ -378,6 +489,7 @@ class RuleMd031(RulePlugin):
         return False
 
     def __fix_spacing_list_remove_list(self, context: PluginScanContext) -> None:
+        _ = context
         removed_list_token = cast(
             ListStartMarkdownToken, self.__removed_container_stack_token
         )
@@ -390,12 +502,66 @@ class RuleMd031(RulePlugin):
         else:
             split_spaces.append("")
         assert self.__removed_container_stack_token is not None
-        self.register_fix_token_request(
-            context,
-            self.__removed_container_stack_token,
-            "next_token",
-            "leading_spaces",
-            "\n".join(split_spaces),
+        self.__fix_requests.append(
+            Fixer(
+                self.__removed_container_stack_token,
+                "next_token",
+                "leading_spaces",
+                "\n".join(split_spaces),
+            )
+        )
+
+    def __xx(self, container_index: int, initial_index: int) -> Tuple[bool, int, int]:
+        continue_processing = True
+        adjust = 0
+        adj2 = 0
+        if container_index == -1:
+            if (
+                len(self.__x1) == 2
+                and self.__x1[0].is_list_start
+                and self.__x1[1].is_block_quote_start
+            ):
+                adjust = 1
+                adj2 = 1
+                continue_processing = False
+            elif (
+                len(self.__x1) == 3
+                and self.__x1[0].is_list_start
+                and self.__x1[1].is_block_quote_start
+                and self.__x1[2].is_block_quote_start
+            ):
+                adjust = 1
+                adj2 = 1
+                continue_processing = False
+            elif (
+                len(self.__x1) == 3
+                and self.__x1[0].is_block_quote_start
+                and self.__x1[1].is_list_start
+                and self.__x1[2].is_block_quote_start
+            ):
+                self.__xx1(initial_index)
+                continue_processing = False
+                adjust = 1
+        return continue_processing, adjust, adj2
+
+    def __xx1(self, initial_index: int) -> None:
+        gh = cast(ListStartMarkdownToken, self.__x1[1]).leading_spaces
+        assert gh is not None
+        split_spaces = gh.split("\n")
+        assert self.__x3[1] == len(split_spaces) - 1
+        sdf = split_spaces[-1]
+        del split_spaces[-1]
+        # split_spaces.append("")
+        self.__fix_requests.append(
+            Fixer(
+                self.__x1[1],
+                "next_token",
+                "leading_spaces",
+                "\n".join(split_spaces),
+            )
+        )
+        self.__container_adjustments[initial_index].append(
+            PendingContainerAdjustment(0, sdf, do_special=True)
         )
 
     def __fix_spacing_list_not_remove_list(
@@ -405,10 +571,14 @@ class RuleMd031(RulePlugin):
             self.__leading_space_index_tracker.get_closed_container_info(-1)
         )
 
-        if last_closed_container_info.adjustment:
-            adjust = 2 if container_index >= 0 else 1
-        else:
-            adjust = self.__calculate_adjust(initial_index, container_index)
+        continue_processing, adjust, adj2 = self.__xx(container_index, initial_index)
+        if continue_processing:
+            if last_closed_container_info.adjustment:
+                adjust = 2 if container_index >= 0 else 1
+            else:
+                adjust = self.__calculate_adjust(initial_index, container_index)
+        if not continue_processing:
+            last_closed_container_info.adjustment += adj2
         index = (
             LeadingSpaceIndexTracker.calculate_token_line_number(token)
             - self.__leading_space_index_tracker.get_container_stack_item(
@@ -491,7 +661,7 @@ class RuleMd031(RulePlugin):
         if self.__leading_space_index_tracker.get_container_stack_item(
             -1
         ).is_block_quote_start:
-            self.__fix_spacing_block_quote(token, upgrade_kludge)
+            self.__fix_spacing_block_quote(context, token, upgrade_kludge)
         else:
             did_special_list_fix = self.__fix_spacing_list(context, token)
         return did_special_list_fix
@@ -499,7 +669,7 @@ class RuleMd031(RulePlugin):
     def __fix_spacing_removed_container(
         self, context: PluginScanContext, token: MarkdownToken
     ) -> None:
-        _ = token
+        _ = (token, context)
         assert self.__removed_container_stack_token is not None
         if self.__removed_container_stack_token.is_list_start:
             removed_list_token = cast(
@@ -510,12 +680,13 @@ class RuleMd031(RulePlugin):
                 split_spaces.append("")
             else:
                 split_spaces = [""]
-            self.register_fix_token_request(
-                context,
-                self.__removed_container_stack_token,
-                "next_token",
-                "leading_spaces",
-                "\n".join(split_spaces),
+            self.__fix_requests.append(
+                Fixer(
+                    self.__removed_container_stack_token,
+                    "next_token",
+                    "leading_spaces",
+                    "\n".join(split_spaces),
+                )
             )
 
     def __fix_spacing_with_fenced_and_list_end(
@@ -587,18 +758,6 @@ class RuleMd031(RulePlugin):
             else False
         )
 
-    # def __calc_2(self, context: PluginScanContext, did_process_removals: bool) -> bool:
-
-    # This will most likely need rewriting for deeper nestings.
-    # if (
-    #     not did_process_removals
-    #     and len(self.__x1) == 2
-    #     and self.__x1[0].is_block_quote_start
-    #     and self.__x1[1].is_list_start
-    # ):
-    #     did_process_removals = self.__apply_tailing_block_quote_fix(0, context)
-    # return did_process_removals
-
     def __calc_3(
         self,
         context: PluginScanContext,
@@ -620,15 +779,15 @@ class RuleMd031(RulePlugin):
             )
             if token_at_index.is_block_quote_start:  # pragma: no cover
                 found_block_quote_token = token_at_index
-                # while last_stack_token_index >= 0:
-                #     if (
-                #         token_at_index := self.__leading_space_index_tracker.get_container_stack_item(
-                #             last_stack_token_index
-                #         )
-                #     ).is_block_quote_start:
-                #         found_block_quote_token = token_at_index
-                #         break
-                #     last_stack_token_index -= 1
+                while last_stack_token_index >= 0:
+                    if (
+                        token_at_index := self.__leading_space_index_tracker.get_container_stack_item(
+                            last_stack_token_index
+                        )
+                    ).is_block_quote_start:
+                        found_block_quote_token = token_at_index
+                        break
+                    last_stack_token_index -= 1
 
                 if (
                     found_block_quote_token
@@ -636,14 +795,19 @@ class RuleMd031(RulePlugin):
                     and self.__x1[0].is_list_start
                     and self.__x1[1].is_block_quote_start
                 ):
-                    did_process_removals = upgrade_kludge = (
-                        self.__apply_tailing_block_quote_fix(1, context)
-                    )
+                    # dd = 0
+                    # while dd < len(self.__x1) and not self.__x1[dd].is_block_quote_start:
+                    #     dd += 1
+                    # assert dd < len(self.__x1)
+                    dd = 1
+                    did_process_removals = upgrade_kludge = True
+                    self.__apply_tailing_block_quote_fix(dd, context)
         return did_process_removals, upgrade_kludge
 
     def __apply_tailing_block_quote_fix(
         self, modify_index: int, context: PluginScanContext
-    ) -> bool:
+    ) -> None:
+        _ = context
 
         assert self.__x1[modify_index].is_block_quote_start
         block_quote_token = cast(BlockQuoteMarkdownToken, self.__x1[modify_index])
@@ -651,14 +815,14 @@ class RuleMd031(RulePlugin):
         split_spaces = block_quote_token.bleading_spaces.split("\n")
         assert self.__x3[modify_index] == len(split_spaces) - 1
         split_spaces[-1] = split_spaces[-1].rstrip()
-        self.register_fix_token_request(
-            context,
-            self.__x1[modify_index],
-            "next_token",
-            "bleading_spaces",
-            "\n".join(split_spaces),
+        self.__fix_requests.append(
+            Fixer(
+                self.__x1[modify_index],
+                "next_token",
+                "bleading_spaces",
+                "\n".join(split_spaces),
+            )
         )
-        return True
 
     def __fix_spacing(
         self, context: PluginScanContext, token: MarkdownToken, special_case: bool
@@ -672,14 +836,14 @@ class RuleMd031(RulePlugin):
         upgrade_kludge = False
         if len(self.__x1) > 1:
             # These circumstances are already handled by the zero and single level removals.
-            all_removals_are_block_quotes = all(
-                f.is_block_quote_start for f in self.__x1
-            )
+            # all_removals_are_block_quotes = all(
+            #     f.is_block_quote_start for f in self.__x1
+            # )
             all_removals_are_lists = all(f.is_list_start for f in self.__x1)
             was_kludge_one = self.__calc_kludge_one(at_least_one_container)
             did_process_removals = (
-                all_removals_are_block_quotes
-                or all_removals_are_lists
+                # all_removals_are_block_quotes or
+                all_removals_are_lists
                 or was_kludge_one
                 or not at_least_one_container
             )
@@ -799,6 +963,7 @@ class RuleMd031(RulePlugin):
         context: PluginScanContext,
         next_container_adjustment_list: List[PendingContainerAdjustment],
     ) -> None:
+        _ = context
         if self.__leading_space_index_tracker.get_container_stack_item(
             -1
         ).is_block_quote_start:
@@ -842,12 +1007,13 @@ class RuleMd031(RulePlugin):
                     next_container_adjustment.leading_space_to_insert
                 )
 
-        self.register_fix_token_request(
-            context,
-            self.__leading_space_index_tracker.get_container_stack_item(-1),
-            "next_token",
-            token_part_name,
-            "\n".join(split_spaces),
+        self.__fix_requests.append(
+            Fixer(
+                self.__leading_space_index_tracker.get_container_stack_item(-1),
+                "next_token",
+                token_part_name,
+                "\n".join(split_spaces),
+            )
         )
 
     def __process_pending_container_end_tokens(
@@ -867,16 +1033,22 @@ class RuleMd031(RulePlugin):
                     token
                 )
             else:
-                leading_space_insert_index = -10
+                leading_space_insert_index = self.__leading_space_index_tracker.get_tokens_list_leading_space_index(
+                    token
+                )
             self.__x3.append(leading_space_insert_index)
 
-            self.__removed_container_stack_token = (
+            self.__removed_container_stack_token, xx = (
                 self.__leading_space_index_tracker.process_container_end(token)
             )
+            assert xx.start_markdown_token == self.__removed_container_stack_token
             self.__x1.append(self.__removed_container_stack_token)
+            self.__x4.append(xx)
+
             self.__removed_container_adjustments = self.__container_adjustments[-1]
             self.__x2.append(self.__removed_container_adjustments)
             del self.__container_adjustments[-1]
+            del self.__container_x[-1]
 
     def __calculate_special_case(
         self, context: PluginScanContext, token: MarkdownToken
@@ -912,6 +1084,7 @@ class RuleMd031(RulePlugin):
 
         if token.is_block_quote_start or token.is_list_start:
             self.__container_adjustments.append([])
+            self.__container_x.append(0)
             self.__leading_space_index_tracker.open_container(token)
         elif token.is_block_quote_end or token.is_list_end:
             self.__leading_space_index_tracker.register_container_end(token)
@@ -924,6 +1097,12 @@ class RuleMd031(RulePlugin):
 
         self.__leading_space_index_tracker.track_since_last_non_end_token(token)
 
+        self.__next_token_after(context, token)
+
+    def __next_token_after(
+        self, context: PluginScanContext, token: MarkdownToken
+    ) -> None:
+
         if (
             not token.is_end_token
             and not token.is_block_quote_start
@@ -940,9 +1119,17 @@ class RuleMd031(RulePlugin):
         self.__last_token = token
         self.__removed_container_stack_token = None
         self.__x1.clear()
+        self.__x4.clear()
         self.__removed_container_adjustments = None
         self.__x2.clear()
         self.__x3.clear()
 
+        while self.__fix_requests:
+            ff = self.__fix_requests[0]
+            del self.__fix_requests[0]
+            self.register_fix_token_request(
+                context, ff.token, ff.plugin_action, ff.field_name, ff.field_value
+            )
+
 
 # pylint: enable=too-many-instance-attributes
diff --git a/pymarkdown/plugins/utils/leading_space_index_tracker.py b/pymarkdown/plugins/utils/leading_space_index_tracker.py
index fd197ac4..84c2b36d 100644
--- a/pymarkdown/plugins/utils/leading_space_index_tracker.py
+++ b/pymarkdown/plugins/utils/leading_space_index_tracker.py
@@ -3,7 +3,7 @@ Module to work with the rules to keep track of the current container "leading sp
 """
 
 from dataclasses import dataclass
-from typing import List, cast
+from typing import List, Tuple, cast
 
 from pymarkdown.tokens.block_quote_markdown_token import BlockQuoteMarkdownToken
 from pymarkdown.tokens.markdown_token import EndMarkdownToken, MarkdownToken
@@ -30,6 +30,7 @@ class LeadingSpaceIndexTracker:
         self.__closed_container_adjustments: List[ClosedContainerAdjustments] = []
         self.__container_token_stack: List[MarkdownToken] = []
         self.__end_tokens: List[EndMarkdownToken] = []
+        self.__real_end_tokens: List[EndMarkdownToken] = []
         self.__since_last_non_end_token: List[MarkdownToken] = []
 
     def clear(self) -> None:
@@ -39,6 +40,7 @@ class LeadingSpaceIndexTracker:
         self.__closed_container_adjustments.clear()
         self.__container_token_stack.clear()
         self.__end_tokens.clear()
+        self.__real_end_tokens.clear()
 
     def open_container(self, token: MarkdownToken) -> None:
         """
@@ -55,6 +57,7 @@ class LeadingSpaceIndexTracker:
         """
         assert token.is_block_quote_end or token.is_list_end
         self.__end_tokens.append(cast(EndMarkdownToken, token))
+        self.__real_end_tokens.append(cast(EndMarkdownToken, token))
 
     def have_any_registered_container_ends(self) -> bool:
         """
@@ -62,7 +65,9 @@ class LeadingSpaceIndexTracker:
         """
         return bool(self.__end_tokens)
 
-    def process_container_end(self, token: MarkdownToken) -> MarkdownToken:
+    def process_container_end(
+        self, token: MarkdownToken
+    ) -> Tuple[MarkdownToken, EndMarkdownToken]:
         """
         Process a registered container end.
         """
@@ -73,11 +78,13 @@ class LeadingSpaceIndexTracker:
             self.__process_container_end_list(token)
 
         del self.__closed_container_adjustments[-1]
+        end_token = self.__real_end_tokens[0]
+        del self.__real_end_tokens[0]
         del self.__end_tokens[-1]
 
         last_token_on_stack = self.__container_token_stack[-1]
         del self.__container_token_stack[-1]
-        return last_token_on_stack
+        return last_token_on_stack, end_token
 
     def track_since_last_non_end_token(self, token: MarkdownToken) -> None:
         """
diff --git a/pymarkdown/transform_markdown/transform_containers.py b/pymarkdown/transform_markdown/transform_containers.py
index 167eff3d..1e785b38 100644
--- a/pymarkdown/transform_markdown/transform_containers.py
+++ b/pymarkdown/transform_markdown/transform_containers.py
@@ -419,6 +419,7 @@ class TransformContainers:
                 container_token_indices,
                 removed_tokens,
                 removed_token_indices,
+                container_line,
             )
         if len(removed_tokens) > 1:
             prefix = TransformContainers.__abcd_remaining(
@@ -476,6 +477,7 @@ class TransformContainers:
         removed_token_indices: List[int],
         container_stack: List[MarkdownToken],
         possible_prefix: Optional[str],
+        container_line: str,
     ) -> Optional[str]:
         container_stack_copy: List[MarkdownToken] = container_stack[:]
         container_stack_copy.extend(removed_tokens[::-1])
@@ -499,6 +501,64 @@ class TransformContainers:
             current_indent_level = list_token.indent_level if container_stack else 0
             prefix = " " * current_indent_level
         else:
+            if removed_tokens[0].is_block_quote_start:
+                prefix = TransformContainers.__abcd_final_list_second_half_with_second_block_quote(
+                    removed_tokens, removed_token_indices, possible_prefix
+                )
+            else:
+                # if here, first and second removed tokens are lists.
+                prefix = (
+                    TransformContainers.__abcd_final_list_second_half_with_second_list(
+                        removed_tokens,
+                        removed_token_indices,
+                        possible_prefix,
+                        container_line,
+                        prefix,
+                    )
+                )
+
+            del removed_tokens[0]
+            del removed_token_indices[0]
+        return prefix
+
+    @staticmethod
+    def __abcd_final_list_second_half_with_second_block_quote(
+        removed_tokens: List[MarkdownToken],
+        removed_token_indices: List[int],
+        possible_prefix: Optional[str],
+    ) -> Optional[str]:
+        removed_block_quote_token = cast(BlockQuoteMarkdownToken, removed_tokens[0])
+        assert removed_block_quote_token.bleading_spaces is not None
+        split_bleading_spaces = removed_block_quote_token.bleading_spaces.split("\n")
+        if removed_token_indices[0] < len(split_bleading_spaces):
+            prefix = "" if possible_prefix is None else possible_prefix
+            return f"{split_bleading_spaces[removed_token_indices[0]]}{prefix}"
+        return possible_prefix
+
+    @staticmethod
+    def __abcd_final_list_second_half_with_second_list(
+        removed_tokens: List[MarkdownToken],
+        removed_token_indices: List[int],
+        possible_prefix: Optional[str],
+        container_line: str,
+        prefix: Optional[str],
+    ) -> Optional[str]:
+        # sourcery skip: equality-identity, inline-variable, move-assign-in-block, remove-assert-true
+        removed_list_token = cast(ListStartMarkdownToken, removed_tokens[0])
+
+        assert removed_list_token.leading_spaces is None
+        # if removed_list_token.leading_spaces is None:
+        y = 0
+        # else:
+        #     assert removed_list_token.leading_spaces is not None
+        #     y = len(removed_list_token.leading_spaces.split("\n"))
+        # endif
+        x = removed_token_indices[0]
+        assert y == 0
+        assert x == 0
+        if len(removed_tokens) >= 2:
+            del removed_tokens[0]
+            del removed_token_indices[0]
             if removed_tokens[0].is_block_quote_start:
                 removed_block_quote_token = cast(
                     BlockQuoteMarkdownToken, removed_tokens[0]
@@ -507,13 +567,13 @@ class TransformContainers:
                 split_bleading_spaces = removed_block_quote_token.bleading_spaces.split(
                     "\n"
                 )
-                if removed_token_indices[0] < len(split_bleading_spaces):
-                    prefix = "" if possible_prefix is None else possible_prefix
-                    prefix = (
-                        f"{split_bleading_spaces[removed_token_indices[0]]}{prefix}"
-                    )
-            del removed_tokens[0]
-            del removed_token_indices[0]
+                assert removed_token_indices[0] < len(split_bleading_spaces)
+                # if removed_token_indices[0] < len(split_bleading_spaces):
+                prefix = "" if possible_prefix is None else possible_prefix
+                prefix = f"{split_bleading_spaces[removed_token_indices[0]]}{prefix}"
+                if container_line.startswith(prefix):
+                    prefix = ""
+                # endif
         return prefix
 
     @staticmethod
@@ -521,6 +581,7 @@ class TransformContainers:
         removed_tokens: List[MarkdownToken],
         removed_token_indices: List[int],
         container_stack: List[MarkdownToken],
+        container_line: str,
     ) -> Optional[str]:
         removed_list_token = cast(ListStartMarkdownToken, removed_tokens[0])
         assert removed_list_token.leading_spaces is not None
@@ -538,7 +599,11 @@ class TransformContainers:
         del removed_token_indices[0]
 
         return TransformContainers.__abcd_final_list_second_half(
-            removed_tokens, removed_token_indices, container_stack, possible_prefix
+            removed_tokens,
+            removed_token_indices,
+            container_stack,
+            possible_prefix,
+            container_line,
         )
 
     @staticmethod
@@ -547,6 +612,7 @@ class TransformContainers:
         container_token_indices: List[int],
         removed_tokens: List[MarkdownToken],
         removed_token_indices: List[int],
+        container_line: str,
     ) -> Optional[str]:
         container_stack_copy = container_stack[:]
         container_indices_copy = container_token_indices[:]
@@ -578,21 +644,61 @@ class TransformContainers:
             del removed_tokens[0]
             del removed_token_indices[0]
             if container_stack_copy[-2].is_list_start:
-                list_spaces = cast(
-                    ListStartMarkdownToken, container_stack_copy[-2]
-                ).leading_spaces
-                assert list_spaces is not None
-                list_split_spaces = list_spaces.split("\n")
-                assert container_indices_copy[-2] == len(list_split_spaces) - 1
-                prefix += list_split_spaces[container_indices_copy[-2]]
-                del removed_tokens[0]
-                del removed_token_indices[0]
+                prefix = TransformContainers.__abcd_final_inner_list(
+                    container_stack_copy,
+                    container_indices_copy,
+                    container_token_indices,
+                    removed_tokens,
+                    removed_token_indices,
+                    prefix,
+                )
         else:
             prefix = TransformContainers.__abcd_final_list(
-                removed_tokens, removed_token_indices, container_stack
+                removed_tokens, removed_token_indices, container_stack, container_line
             )
         return prefix
 
+    # pylint: disable=too-many-arguments
+    @staticmethod
+    def __abcd_final_inner_list(
+        container_stack_copy: List[MarkdownToken],
+        container_indices_copy: List[int],
+        container_token_indices: List[int],
+        removed_tokens: List[MarkdownToken],
+        removed_token_indices: List[int],
+        prefix: str,
+    ) -> Optional[str]:
+        list_spaces = cast(
+            ListStartMarkdownToken, container_stack_copy[-2]
+        ).leading_spaces
+        assert list_spaces is not None
+        list_split_spaces = list_spaces.split("\n")
+        if container_indices_copy[-2] == len(list_split_spaces) - 1:
+            prefix += list_split_spaces[container_indices_copy[-2]]
+        else:
+            start_index = len(container_indices_copy) - 3
+            while (
+                start_index >= 0 and not container_stack_copy[start_index].is_list_start
+            ):
+                start_index -= 1
+            assert start_index >= 0
+            list_token = cast(ListStartMarkdownToken, container_stack_copy[start_index])
+            leading_spaces_index = container_indices_copy[start_index]
+            assert list_token.leading_spaces is not None
+            list_split_spaces = list_token.leading_spaces.split("\n")
+            prefix += list_split_spaces[leading_spaces_index]
+
+            assert start_index < len(container_stack_copy)
+            # if start_index < len(container_stack_copy):
+            container_token_indices[start_index] += 1
+            # endif
+        del removed_tokens[0]
+        del removed_token_indices[0]
+
+        return prefix
+
+    # pylint: enable=too-many-arguments
+
     # pylint: disable=too-many-locals
     @staticmethod
     def __apply_container_transformation(


Test patch:
diff --git a/publish/test-results.json b/publish/test-results.json
index 7ae3a6ce..33e199de 100644
--- a/publish/test-results.json
+++ b/publish/test-results.json
@@ -1367,7 +1367,7 @@
             "totalTests": 653,
             "failedTests": 0,
             "errorTests": 0,
-            "skippedTests": 56,
+            "skippedTests": 30,
             "elapsedTimeInMilliseconds": 0
         },
         {
@@ -1511,7 +1511,7 @@
             "totalTests": 57,
             "failedTests": 0,
             "errorTests": 0,
-            "skippedTests": 0,
+            "skippedTests": 4,
             "elapsedTimeInMilliseconds": 0
         },
         {
@@ -1620,10 +1620,10 @@
         },
         {
             "name": "test.test_markdown_extra",
-            "totalTests": 271,
+            "totalTests": 315,
             "failedTests": 0,
             "errorTests": 0,
-            "skippedTests": 1,
+            "skippedTests": 11,
             "elapsedTimeInMilliseconds": 0
         },
         {
diff --git a/test/rules/test_md031.py b/test/rules/test_md031.py
index 7f405d5f..f21e08b0 100644
--- a/test/rules/test_md031.py
+++ b/test/rules/test_md031.py
@@ -800,7 +800,7 @@ This is a blank line and some text.
 > This is a blank line and some text.
 """,
     ),
-    pluginRuleTest(
+    pluginRuleTest(  # BAD FIX EXPECTED
         "bad_fenced_block_in_block_quote_with_previous_inner_list_double_drop",
         source_file_contents="""> + inner list
 > + inner list
@@ -810,7 +810,6 @@ A code block
 This is a blank line and some text.
 """,
         disable_rules="md032",
-        mark_fix_as_skipped=skip_fix_bad_markdown,
         scan_expected_return_code=1,
         scan_expected_output="""{temp_source_path}:3:1: MD031: Fenced code blocks should be surrounded by blank lines (blanks-around-fences)
 {temp_source_path}:5:1: MD031: Fenced code blocks should be surrounded by blank lines (blanks-around-fences)
@@ -818,11 +817,11 @@ This is a blank line and some text.
         fix_expected_file_contents="""> + inner list
 > + inner list
 
-> ```block
-> A code block
-> ```
+```block
+A code block
+```
 
-> This is a blank line and some text.
+This is a blank line and some text.
 """,
     ),
     pluginRuleTest(
@@ -2187,9 +2186,7 @@ A code block
         scan_expected_output="""{temp_source_path}:4:3: MD031: Fenced code blocks should be surrounded by blank lines (blanks-around-fences)
 {temp_source_path}:6:3: MD031: Fenced code blocks should be surrounded by blank lines (blanks-around-fences)
 """,
-        disable_rules="md032",
-        use_fix_debug=True,
-        mark_fix_as_skipped=skip_fix_bad_markdown,
+        disable_rules="md032,md027",
         fix_expected_file_contents="""> > > block 3
 > > > block 3
 > > > block 3
@@ -2637,7 +2634,7 @@ A code block
 > > > --------
 """,
     ),
-    pluginRuleTest(
+    pluginRuleTest(  # test_extra_052a0 test_extra_052a1
         "bad_fenced_block_in_block_quote_in_block_quote_in_block_quote_with_previous_block_double_drop",
         source_file_contents="""> > >
 > > > > fourth block 1
@@ -2651,8 +2648,7 @@ A code block
         scan_expected_output="""{temp_source_path}:4:5: MD031: Fenced code blocks should be surrounded by blank lines (blanks-around-fences)
 {temp_source_path}:6:5: MD031: Fenced code blocks should be surrounded by blank lines (blanks-around-fences)
 """,
-        disable_rules="md032",
-        mark_fix_as_skipped=skip_fix_bad_markdown,
+        disable_rules="md032,md027",
         fix_expected_file_contents="""> > >
 > > > > fourth block 1
 > > > > fourth block 2
@@ -2678,8 +2674,7 @@ A code block
         scan_expected_output="""{temp_source_path}:4:3: MD031: Fenced code blocks should be surrounded by blank lines (blanks-around-fences)
 {temp_source_path}:6:3: MD031: Fenced code blocks should be surrounded by blank lines (blanks-around-fences)
 """,
-        disable_rules="md032",
-        mark_fix_as_skipped=skip_fix_bad_markdown,
+        disable_rules="md032,md027",
         use_debug=True,
         fix_expected_file_contents="""> > >
 > > > > fourth block 1
@@ -2920,7 +2915,7 @@ A code block
 > > --------
 """,
     ),
-    pluginRuleTest(  # test_extra_049l2
+    pluginRuleTest(  # test_extra_049l2a test_extra_049l2b
         "bad_fenced_block_in_block_quote_in_block_quote_in_block_quote_with_previous_list_triple_drop",
         source_file_contents="""> > >
 > > > + inner list 1
@@ -2935,9 +2930,8 @@ A code block
         scan_expected_output="""{temp_source_path}:5:3: MD031: Fenced code blocks should be surrounded by blank lines (blanks-around-fences)
 {temp_source_path}:7:3: MD031: Fenced code blocks should be surrounded by blank lines (blanks-around-fences)
 """,
-        disable_rules="md032",
+        disable_rules="md032,md027",
         use_debug=True,
-        mark_fix_as_skipped=skip_fix_bad_markdown,
         fix_expected_file_contents="""> > >
 > > > + inner list 1
 > > >   inner list 2
@@ -3127,8 +3121,7 @@ A code block
         scan_expected_output="""{temp_source_path}:4:5: MD031: Fenced code blocks should be surrounded by blank lines (blanks-around-fences)
 {temp_source_path}:6:5: MD031: Fenced code blocks should be surrounded by blank lines (blanks-around-fences)
 """,
-        disable_rules="md032",
-        mark_fix_as_skipped=skip_fix_bad_markdown,
+        disable_rules="md032,md027",
         use_debug=True,
         fix_expected_file_contents="""> > + --------
 > >   > block 1
@@ -3156,8 +3149,6 @@ A code block
 {temp_source_path}:6:3: MD031: Fenced code blocks should be surrounded by blank lines (blanks-around-fences)
 """,
         disable_rules="md032",
-        use_debug=True,
-        mark_fix_as_skipped=skip_fix_bad_markdown,
         fix_expected_file_contents="""> > + --------
 > >   > block 1
 > >   > block 2
@@ -3251,7 +3242,7 @@ A code block
 > > --------
 """,
     ),
-    pluginRuleTest(  # test_extra_049b1
+    pluginRuleTest(  # test_extra_049b1a
         "bad_fenced_block_in_list_in_block_quote_in_block_quote_with_previous_block_triple_drop_with_thematics",
         source_file_contents="""> > + --------
 > >   > block 1
@@ -3267,12 +3258,10 @@ A code block
 {temp_source_path}:7:3: MD031: Fenced code blocks should be surrounded by blank lines (blanks-around-fences)
 """,
         disable_rules="md032",
-        use_debug=True,
-        mark_fix_as_skipped=skip_fix_bad_markdown,
         fix_expected_file_contents="""> > + --------
 > >   > block 1
 > >   > block 2
-> > --------
+> --------
 >
 > ```block
 > A code block
@@ -3297,12 +3286,10 @@ A code block
 {temp_source_path}:7:1: MD031: Fenced code blocks should be surrounded by blank lines (blanks-around-fences)
 """,
         disable_rules="md032",
-        use_debug=True,
-        mark_fix_as_skipped=skip_fix_bad_markdown,
         fix_expected_file_contents="""> > + --------
 > >   > block 1
 > >   > block 2
-> > --------
+--------
 
 ```block
 A code block
@@ -3401,7 +3388,7 @@ A code block
 > > ______
 """,
     ),
-    pluginRuleTest(  # test_extra_049l3
+    pluginRuleTest(  # test_extra_049l3a test_extra_049l3b
         "bad_fenced_block_in_list_in_block_quote_in_block_quote_with_previous_list_triple_drop",
         source_file_contents="""> > + ______
 > >   + list 1
@@ -3417,8 +3404,6 @@ A code block
 {temp_source_path}:7:3: MD031: Fenced code blocks should be surrounded by blank lines (blanks-around-fences)
 """,
         disable_rules="md032,md035",
-        use_debug=True,
-        mark_fix_as_skipped=skip_fix_bad_markdown,
         fix_expected_file_contents="""> > + ______
 > >   + list 1
 > >     list 2
@@ -3519,7 +3504,7 @@ ______
 > > ______
 """,
     ),
-    pluginRuleTest(
+    pluginRuleTest(  # test_extra_052d0 test_extra_052d1 FOOBAR1
         "bad_fenced_block_in_list_in_block_quote_in_block_quote_with_previous_list_triple_drop_and_thematics",
         source_file_contents="""> > + ______
 > >   + list 1
@@ -3536,6 +3521,7 @@ ______
 {temp_source_path}:8:3: MD031: Fenced code blocks should be surrounded by blank lines (blanks-around-fences)
 """,
         disable_rules="md032,md035",
+        use_fix_debug=True,
         mark_fix_as_skipped=skip_fix_bad_markdown,
         fix_expected_file_contents="""> > + ______
 > >   + list 1
@@ -3747,8 +3733,6 @@ A code block
 {temp_source_path}:6:1: MD031: Fenced code blocks should be surrounded by blank lines (blanks-around-fences)
 """,
         disable_rules="md032",
-        mark_fix_as_skipped=skip_fix_bad_markdown,
-        use_debug=True,
         fix_expected_file_contents="""1. > >
    > > block 3
    > > block 3
@@ -3991,7 +3975,7 @@ A code block
    > --------
 """,
     ),
-    pluginRuleTest(
+    pluginRuleTest(  # FOOBAR14
         "bad_fenced_block_in_block_quote_in_list_with_previous_inner_list_double_drop",
         source_file_contents="""1. > +
    >   list 3
@@ -4006,6 +3990,7 @@ A code block
 {temp_source_path}:6:4: MD031: Fenced code blocks should be surrounded by blank lines (blanks-around-fences)
 """,
         disable_rules="md032",
+        mark_fix_as_skipped=skip_fix_bad_markdown,
         fix_expected_file_contents="""1. > +
    >   list 3
    > + list 3
@@ -4244,7 +4229,6 @@ A code block
 {temp_source_path}:6:6: MD031: Fenced code blocks should be surrounded by blank lines (blanks-around-fences)
 """,
         disable_rules="md032",
-        mark_fix_as_skipped=skip_fix_bad_markdown,
         fix_expected_file_contents="""1. > > ----
    > > > block 1
    > > > block 2
@@ -4360,7 +4344,7 @@ A code block
    > ----
 """,
     ),
-    pluginRuleTest(
+    pluginRuleTest(  # test_extra_052f0 test_extra_052f1
         "bad_fenced_block_in_block_quote_in_block_quote_in_list_with_previous_inner_list_triple_drop",
         source_file_contents="""1. > > ----
    > > + block 1
@@ -4375,8 +4359,6 @@ A code block
 {temp_source_path}:6:4: MD031: Fenced code blocks should be surrounded by blank lines (blanks-around-fences)
 """,
         disable_rules="md032",
-        use_debug=True,
-        mark_fix_as_skipped=skip_fix_bad_markdown,
         fix_expected_file_contents="""1. > > ----
    > > + block 1
    > >   block 2
@@ -4463,7 +4445,7 @@ A code block
    >   ----
 """,
     ),
-    pluginRuleTest(  # test_extra_050e0 test_extra_050e1
+    pluginRuleTest(  # test_extra_050e0 test_extra_050e1 FOOBAR2
         "bad_fenced_block_in_list_in_block_quote_in_list_with_previous_block_double_drop",
         source_file_contents="""1. > + ----
    >   > block 1
@@ -4477,8 +4459,9 @@ A code block
         scan_expected_output="""{temp_source_path}:4:6: MD031: Fenced code blocks should be surrounded by blank lines (blanks-around-fences)
 {temp_source_path}:6:6: MD031: Fenced code blocks should be surrounded by blank lines (blanks-around-fences)
 """,
-        disable_rules="md032",
+        disable_rules="md032,md027",
         mark_fix_as_skipped=skip_fix_bad_markdown,
+        use_fix_debug=True,
         use_debug=True,
         fix_expected_file_contents="""1. > + ----
    >   > block 1
@@ -4491,7 +4474,7 @@ A code block
    > ----
 """,
     ),
-    pluginRuleTest(  # test_extra_049g0
+    pluginRuleTest(  # test_extra_052g0 test_extra_052g1
         "bad_fenced_block_in_list_in_block_quote_in_list_with_previous_block_triple_drop",
         source_file_contents="""1. > + ----
    >   > block 1
@@ -4507,7 +4490,6 @@ A code block
 """,
         disable_rules="md032",
         use_debug=True,
-        mark_fix_as_skipped=skip_fix_bad_markdown,
         fix_expected_file_contents="""1. > + ----
    >   > block 1
    >   > block 2
@@ -4819,12 +4801,11 @@ A code block
 {temp_source_path}:8:4: MD031: Fenced code blocks should be surrounded by blank lines (blanks-around-fences)
 """,
         disable_rules="md032",
-        mark_fix_as_skipped=skip_fix_bad_markdown,
         fix_expected_file_contents="""1. > + ----
    >   + list 1
    >     list 2
    >   + list 3
-   > ----
+   ----
 
    ```block
    A code block
@@ -4850,12 +4831,11 @@ A code block
 {temp_source_path}:8:1: MD031: Fenced code blocks should be surrounded by blank lines (blanks-around-fences)
 """,
         disable_rules="md032",
-        mark_fix_as_skipped=skip_fix_bad_markdown,
         fix_expected_file_contents="""1. > + ----
    >   + list 1
    >     list 2
    >   + list 3
-   > ----
+----
 
 ```block
 A code block
@@ -4941,7 +4921,6 @@ A code block
 {temp_source_path}:6:6: MD031: Fenced code blocks should be surrounded by blank lines (blanks-around-fences)
 """,
         disable_rules="md032",
-        mark_fix_as_skipped=skip_fix_bad_markdown,
         fix_expected_file_contents="""1. > > ----
    > > > inner block 1
    > > > inner block 2
@@ -5077,11 +5056,10 @@ A code block
 {temp_source_path}:7:4: MD031: Fenced code blocks should be surrounded by blank lines (blanks-around-fences)
 """,
         disable_rules="md032",
-        mark_fix_as_skipped=skip_fix_bad_markdown,
         fix_expected_file_contents="""1. > > ----
    > > > inner block 1
    > > > inner block 2
-   > ----
+   ----
 
    ```block
    A code block
@@ -5106,11 +5084,10 @@ A code block
 {temp_source_path}:7:1: MD031: Fenced code blocks should be surrounded by blank lines (blanks-around-fences)
 """,
         disable_rules="md032",
-        mark_fix_as_skipped=skip_fix_bad_markdown,
         fix_expected_file_contents="""1. > > ----
    > > > inner block 1
    > > > inner block 2
-   > ----
+----
 
 ```block
 A code block
@@ -5197,7 +5174,6 @@ A code block
 {temp_source_path}:7:6: MD031: Fenced code blocks should be surrounded by blank lines (blanks-around-fences)
 """,
         disable_rules="md032",
-        mark_fix_as_skipped=skip_fix_bad_markdown,
         fix_expected_file_contents="""1. > > ----
    > > + list 1
    > >   list 2
@@ -5227,7 +5203,6 @@ A code block
 """,
         disable_rules="md032",
         use_debug=True,
-        mark_fix_as_skipped=skip_fix_bad_markdown,
         fix_expected_file_contents="""1. > > ----
    > > + list 1
    > >   list 2
@@ -5298,7 +5273,7 @@ A code block
    > > ----
 """,
     ),
-    pluginRuleTest(
+    pluginRuleTest(  # test_extra_052e0 test_extra_052e1 FOOBAR3
         "bad_fenced_block_in_block_quote_in_block_quote_in_list_with_previous_list_double_drop_with_thematics",
         source_file_contents="""1. > > ----
    > > + list 1
@@ -5316,6 +5291,7 @@ A code block
 """,
         disable_rules="md032",
         mark_fix_as_skipped=skip_fix_bad_markdown,
+        use_fix_debug=True,
         fix_expected_file_contents="""1. > > ----
    > > + list 1
    > >   list 2
@@ -5329,7 +5305,7 @@ A code block
    > ----
 """,
     ),
-    pluginRuleTest(
+    pluginRuleTest(  # test_extra_052h0 test_extra_052h1 FOOBAR4
         "bad_fenced_block_in_block_quote_in_block_quote_in_list_with_previous_list_triple_drop_with_thematics",
         source_file_contents="""1. > > ----
    > > + list 1
@@ -5347,6 +5323,7 @@ A code block
 """,
         disable_rules="md032",
         mark_fix_as_skipped=skip_fix_bad_markdown,
+        use_fix_debug=True,
         fix_expected_file_contents="""1. > > ----
    > > + list 1
    > >   list 2
@@ -5630,7 +5607,7 @@ another list
 > + another list
 """,
     ),
-    pluginRuleTest(
+    pluginRuleTest(  # test_extra_052b0 test_extra_052b1
         "bad_fenced_block_in_list_in_block_quote_with_previous_inner_block_double_drop_without_thematics",
         source_file_contents="""> + list 1
 >   > block 2
@@ -5644,9 +5621,7 @@ another list
         scan_expected_output="""{temp_source_path}:4:3: MD031: Fenced code blocks should be surrounded by blank lines (blanks-around-fences)
 {temp_source_path}:6:3: MD031: Fenced code blocks should be surrounded by blank lines (blanks-around-fences)
 """,
-        disable_rules="md032",
-        use_debug=True,
-        mark_fix_as_skipped=skip_fix_bad_markdown,
+        disable_rules="md032,md027",
         fix_expected_file_contents="""> + list 1
 >   > block 2
 >   > block 3
@@ -6236,7 +6211,7 @@ another list
 > + another list
 """,
     ),
-    pluginRuleTest(  # test_extra_044mcz1 test_extra_046ca
+    pluginRuleTest(  # test_extra_044mcz1 test_extra_046ca SNAFU1
         "bad_fenced_block_in_block_quote_in_list_in_block_quote_with_previous_blockx",
         source_file_contents="""> + > -----
 >   > > block 1
@@ -6252,6 +6227,7 @@ another list
 {temp_source_path}:6:7: MD031: Fenced code blocks should be surrounded by blank lines (blanks-around-fences)
 """,
         disable_rules="md032",
+        use_debug=True,
         mark_fix_as_skipped=skip_fix_bad_markdown,
         fix_expected_file_contents="""> + > -----
 >   > > block 1
@@ -6372,6 +6348,7 @@ another list
 {temp_source_path}:9:7: MD031: Fenced code blocks should be surrounded by blank lines (blanks-around-fences)
 """,
         disable_rules="md032",
+        use_debug=True,
         mark_fix_as_skipped=skip_fix_bad_markdown,
         fix_expected_file_contents="""> + > -----
 >   > > block 1
@@ -6626,7 +6603,7 @@ another list
 """,
     ),
     pluginRuleTest(  # test_extra_049l8
-        "bad_fenced_block_in_block_quote_in_list_in_block_quote_with_previous_list_triple_drop",
+        "bad_fenced_block_in_block_quote_in_list_in_block_quote_with_previous_list_triple_dropx",
         source_file_contents="""> + > -----
 >   > + list 1
 >   >   list 2
@@ -6642,6 +6619,7 @@ another list
 {temp_source_path}:7:3: MD031: Fenced code blocks should be surrounded by blank lines (blanks-around-fences)
 """,
         disable_rules="md032",
+        use_debug=True,
         mark_fix_as_skipped=skip_fix_bad_markdown,
         fix_expected_file_contents="""> + > -----
 >   > + list 1
@@ -6737,6 +6715,7 @@ another list
 """,
         disable_rules="md032,md027",
         mark_fix_as_skipped=skip_fix_bad_markdown,
+        use_fix_debug=True,
         use_debug=True,
         fix_expected_file_contents="""> + > -----
 >   > + list 1
@@ -6959,7 +6938,7 @@ another list
 > + another list
 """,
     ),
-    pluginRuleTest(
+    pluginRuleTest(  # test_extra_052j0 test_extra_052j1
         "bad_fenced_block_in_list_in_list_in_block_quote_with_previous_block_triple_drop",
         source_file_contents="""> + + -----
 >     > block 1
@@ -6974,9 +6953,8 @@ another list
         scan_expected_output="""{temp_source_path}:4:3: MD031: Fenced code blocks should be surrounded by blank lines (blanks-around-fences)
 {temp_source_path}:6:3: MD031: Fenced code blocks should be surrounded by blank lines (blanks-around-fences)
 """,
-        disable_rules="md032",
+        disable_rules="md032,md027",
         use_debug=True,
-        mark_fix_as_skipped=skip_fix_bad_markdown,
         fix_expected_file_contents="""> + + -----
 >     > block 1
 >     > block 2
@@ -7034,7 +7012,6 @@ another list
 {temp_source_path}:7:7: MD031: Fenced code blocks should be surrounded by blank lines (blanks-around-fences)
 """,
         disable_rules="md032",
-        mark_scan_as_skipped=skip_fix_bad_markdown,
         fix_expected_file_contents="""> + + -----
 >     > block 1
 >     > block 2
@@ -7048,7 +7025,7 @@ another list
 > + another list
 """,
     ),
-    pluginRuleTest(
+    pluginRuleTest(  # test_extra_052c0 test_extra_052c1
         "bad_fenced_block_in_list_in_list_in_block_quote_with_previous_block_double_drop_with_thematics",
         source_file_contents="""> + + -----
 >     > block 1
@@ -7064,8 +7041,9 @@ another list
         scan_expected_output="""{temp_source_path}:5:5: MD031: Fenced code blocks should be surrounded by blank lines (blanks-around-fences)
 {temp_source_path}:7:5: MD031: Fenced code blocks should be surrounded by blank lines (blanks-around-fences)
 """,
-        disable_rules="md032",
+        disable_rules="md032,md027",
         use_debug=True,
+        use_fix_debug=True,
         mark_fix_as_skipped=skip_fix_bad_markdown,
         fix_expected_file_contents="""> + + -----
 >     > block 1
@@ -7080,7 +7058,7 @@ another list
 > + another list
 """,
     ),
-    pluginRuleTest(
+    pluginRuleTest(  # test_extra_052k0 test_extra_052k1 FOOBAR7
         "bad_fenced_block_in_list_in_list_in_block_quote_with_previous_block_triple_drop_with_thematics",
         source_file_contents="""> + + -----
 >     > block 1
@@ -7098,6 +7076,7 @@ another list
 """,
         disable_rules="md032",
         mark_fix_as_skipped=skip_fix_bad_markdown,
+        use_fix_debug=True,
         fix_expected_file_contents="""> + + -----
 >     > block 1
 >     > block 2
@@ -7207,7 +7186,7 @@ another list
 > + another list
 """,
     ),
-    pluginRuleTest(
+    pluginRuleTest(  # test_extra_052l0 test_extra_052l01 NONCOMP1
         "bad_fenced_block_in_list_in_list_in_block_quote_with_previous_list_double_drop",
         source_file_contents="""> + + -----
 >     + list 1
@@ -7331,7 +7310,7 @@ another list
 > + another list
 """,
     ),
-    pluginRuleTest(
+    pluginRuleTest(  # test_extra_052m0 test_extra_052m1 NONCOMP2
         "bad_fenced_block_in_list_in_list_in_block_quote_with_previous_list_double_drop_and_thematics",
         source_file_contents="""> + + -----
 >     + list 1
@@ -7561,7 +7540,7 @@ another list
   + another list
 """,
     ),
-    pluginRuleTest(  # test_extra_050a0
+    pluginRuleTest(  # test_extra_050a0a test_extra_050a0b
         "bad_fenced_block_in_list_in_list_with_previous_inner_block_double_drop",
         source_file_contents="""+ + list 1
     > block 2.1
@@ -7578,6 +7557,7 @@ another list
         disable_rules="md032",
         mark_fix_as_skipped=skip_fix_bad_markdown,
         use_debug=True,
+        use_fix_debug=True,
         fix_expected_file_contents="""+ + list 1
     > block 2.1
     > block 2.2
@@ -7643,7 +7623,7 @@ another list
   + another list
 """,
     ),
-    pluginRuleTest(
+    pluginRuleTest(  # test_extra_052n0 test_extra_052n1
         "bad_fenced_block_in_list_in_list_with_previous_inner_block_double_drop_with_thematics",
         source_file_contents="""+ + list 1
     > block 2.1
@@ -7684,14 +7664,13 @@ another list
 A code block
 ```
 ----
-  another list
+another list
 """,
         scan_expected_return_code=1,
         scan_expected_output="""{temp_source_path}:5:1: MD031: Fenced code blocks should be surrounded by blank lines (blanks-around-fences)
 {temp_source_path}:7:1: MD031: Fenced code blocks should be surrounded by blank lines (blanks-around-fences)
 """,
         disable_rules="md032",
-        mark_fix_as_skipped=skip_fix_bad_markdown,
         fix_expected_file_contents="""+ + list 1
     > block 2.1
     > block 2.2
@@ -8161,7 +8140,7 @@ another list
   + another list
 """,
     ),
-    pluginRuleTest(
+    pluginRuleTest(  # test_extra_052p0 NONCOMP4
         "bad_fenced_block_in_block_quote_in_list_in_list_with_previous_block_triple_drop",
         source_file_contents="""+ + > -----
     > > block 1
@@ -8279,7 +8258,7 @@ another list
   + another list
 """,
     ),
-    pluginRuleTest(
+    pluginRuleTest(  # test_extra_052q0 NONCOMP5
         "bad_fenced_block_in_block_quote_in_list_in_list_with_previous_block_triple_drop_and_thematics",
         source_file_contents="""+ + > -----
     > > block 1
@@ -8406,8 +8385,8 @@ another list
   + another list
 """,
     ),
-    pluginRuleTest(  # test_extra_049l9
-        "bad_fenced_block_in_block_quote_in_list_in_block_quote_with_previous_list_triple_drop",
+    pluginRuleTest(  # test_extra_049l9a test_extra_049l9b
+        "bad_fenced_block_in_block_quote_in_list_in_block_quote_with_previous_list_double_dropy",
         source_file_contents="""+ + > -----
     > + list 1
     >   list 2
@@ -8423,7 +8402,6 @@ another list
 {temp_source_path}:7:5: MD031: Fenced code blocks should be surrounded by blank lines (blanks-around-fences)
 """,
         disable_rules="md032",
-        mark_fix_as_skipped=skip_fix_bad_markdown,
         fix_expected_file_contents="""+ + > -----
     > + list 1
     >   list 2
@@ -8437,7 +8415,7 @@ another list
   + another list
 """,
     ),
-    pluginRuleTest(
+    pluginRuleTest(  # test_extra_052r0 NONCOMP6
         "bad_fenced_block_in_block_quote_in_list_in_list_with_previous_list_triple_drop",
         source_file_contents="""+ + > -----
     > + list 1
@@ -8531,7 +8509,7 @@ another list
   + another list
 """,
     ),
-    pluginRuleTest(
+    pluginRuleTest(  # test_extra_052s0 test_extra_052s1
         "bad_fenced_block_in_block_quote_in_list_in_list_with_previous_list_double_drop_and_thematics",
         source_file_contents="""+ + > -----
     > + list 1
@@ -8550,6 +8528,7 @@ another list
 """,
         disable_rules="md032",
         mark_fix_as_skipped=skip_fix_bad_markdown,
+        use_fix_debug=True,
         fix_expected_file_contents="""+ + > -----
     > + list 1
     >   list 2
@@ -8564,7 +8543,7 @@ another list
   + another list
 """,
     ),
-    pluginRuleTest(
+    pluginRuleTest(  # test_extra_052t0 NONCOMP7
         "bad_fenced_block_in_block_quote_in_list_in_list_with_previous_list_triple_drop_and_thematics",
         source_file_contents="""+ + > -----
     > + list 1
@@ -8719,7 +8698,7 @@ another list
   + another list
 """,
     ),
-    pluginRuleTest(  # test_extra_049l4x
+    pluginRuleTest(  # test_extra_049l4xa test_extra_049l4xb FOOBAR10
         "bad_fenced_block_in_list_in_list_in_list_with_previous_block_double_drop",
         source_file_contents="""+ + + -----
       > block 1
@@ -8749,7 +8728,7 @@ another list
   + another list
 """,
     ),
-    pluginRuleTest(
+    pluginRuleTest(  # test_extra_052u0 test_extra_052u1 FOOBAR11
         "bad_fenced_block_in_list_in_list_in_list_with_previous_block_triple_drop",
         source_file_contents="""+ + + -----
       > block 1
@@ -8795,6 +8774,7 @@ another list
 {temp_source_path}:6:1: MD031: Fenced code blocks should be surrounded by blank lines (blanks-around-fences)
 """,
         disable_rules="md032",
+        use_debug=True,
         fix_expected_file_contents="""+ + + -----
       > block 1
       > block 2
@@ -8837,7 +8817,7 @@ another list
   + another list
 """,
     ),
-    pluginRuleTest(
+    pluginRuleTest(  # test_extra_052v0 test_extra_052v1 NONCOMP8
         "bad_fenced_block_in_list_in_list_in_list_with_previous_block_double_drop_with_thematics",
         source_file_contents="""+ + + -----
       > block 1
@@ -9117,7 +9097,7 @@ another list
   + another list
 """,
     ),
-    pluginRuleTest(  # test_extra_050b0 test_extra_050b1
+    pluginRuleTest(  # test_extra_050b0 test_extra_050b1 FOOBAR12
         "bad_fenced_block_in_list_in_list_in_list_with_previous_list_double_drop",
         source_file_contents="""+ + + -----
       + list 1
@@ -9148,7 +9128,7 @@ another list
   + another list
 """,
     ),
-    pluginRuleTest(
+    pluginRuleTest(  # test_extra_052w0 test_extra_052w1
         "bad_fenced_block_in_list_in_list_in_list_with_previous_list_triple_drop",
         source_file_contents="""+ + + -----
       + list 1
diff --git a/test/test_markdown_extra.py b/test/test_markdown_extra.py
index fb29a473..d565c74f 100644
--- a/test/test_markdown_extra.py
+++ b/test/test_markdown_extra.py
@@ -7572,7 +7572,7 @@ block 2</p>
 
 
 @pytest.mark.gfm
-def test_extra_049b1():
+def test_extra_049b1a():
     """
     TBD
     bad_fenced_block_in_list_in_block_quote_in_block_quote_with_previous_block_triple_drop_with_thematics
@@ -7627,7 +7627,70 @@ block 2</p>
 </blockquote>"""
 
     # Act & Assert
-    act_and_assert(source_markdown, expected_gfm, expected_tokens)
+    act_and_assert(source_markdown, expected_gfm, expected_tokens, show_debug=False)
+
+
+@pytest.mark.gfm
+def test_extra_049b1b():
+    """
+    TBD
+    bad_fenced_block_in_list_in_block_quote_in_block_quote_with_previous_block_triple_drop_with_thematics
+    """
+
+    # Arrange
+    source_markdown = """> > + --------
+> >   > block 1
+> >   > block 2
+> --------
+>
+> ```block
+> A code block
+> ```
+>
+> --------
+"""
+    expected_tokens = [
+        "[block-quote(1,1)::>\n> \n> \n> \n>\n> \n]",
+        "[block-quote(1,3)::> > \n> > ]",
+        "[ulist(1,5):+::6::\n\n]",
+        "[tbreak(1,7):-::--------]",
+        "[block-quote(2,7)::> \n> >   > \n> ]",
+        "[para(2,9):\n]",
+        "[text(2,9):block 1\nblock 2::\n]",
+        "[end-para:::False]",
+        "[end-block-quote::> :True]",
+        "[end-ulist:::True]",
+        "[end-block-quote:::True]",
+        "[tbreak(4,3):-::--------]",
+        "[BLANK(5,2):]",
+        "[fcode-block(6,3):`:3:block:::::]",
+        "[text(7,3):A code block:]",
+        "[end-fcode-block:::3:False]",
+        "[BLANK(9,2):]",
+        "[tbreak(10,3):-::--------]",
+        "[end-block-quote:::True]",
+        "[BLANK(11,1):]",
+    ]
+    expected_gfm = """<blockquote>
+<blockquote>
+<ul>
+<li>
+<hr />
+<blockquote>
+<p>block 1
+block 2</p>
+</blockquote>
+</li>
+</ul>
+</blockquote>
+<hr />
+<pre><code class="language-block">A code block
+</code></pre>
+<hr />
+</blockquote>"""
+
+    # Act & Assert
+    act_and_assert(source_markdown, expected_gfm, expected_tokens, show_debug=False)
 
 
 @pytest.mark.gfm
@@ -8481,7 +8544,7 @@ inner list 2</li>
 
 
 @pytest.mark.gfm
-def test_extra_049l2():
+def test_extra_049l2a():
     """
     TBD
     bad_fenced_block_in_block_quote_in_block_quote_in_block_quote_with_previous_list_triple_drop
@@ -8536,11 +8599,75 @@ inner list 2</li>
 </blockquote>"""
 
     # Act & Assert
-    act_and_assert(source_markdown, expected_gfm, expected_tokens)
+    act_and_assert(source_markdown, expected_gfm, expected_tokens, show_debug=False)
+
+
+@pytest.mark.gfm
+def test_extra_049l2b():
+    """
+    TBD
+    bad_fenced_block_in_block_quote_in_block_quote_in_block_quote_with_previous_list_triple_drop
+    """
+
+    # Arrange
+    source_markdown = """> > >
+> > > + inner list 1
+> > >   inner list 2
+> > > + inner list 3
+>
+> ```block
+> A code block
+> ```
+>
+> --------
+"""
+    expected_tokens = [
+        "[block-quote(1,1)::> \n> \n> \n>\n> \n]",
+        "[block-quote(1,3)::]",
+        "[block-quote(1,5)::> > >\n> > > \n> > > \n> > > \n>]",
+        "[BLANK(1,6):]",
+        "[ulist(2,7):+::8::  \n]",
+        "[para(2,9):\n]",
+        "[text(2,9):inner list 1\ninner list 2::\n]",
+        "[end-para:::True]",
+        "[li(4,7):8::]",
+        "[para(4,9):]",
+        "[text(4,9):inner list 3:]",
+        "[end-para:::True]",
+        "[BLANK(5,2):]",
+        "[end-ulist:::True]",
+        "[end-block-quote:::True]",
+        "[end-block-quote:::True]",
+        "[fcode-block(6,3):`:3:block:::::]",
+        "[text(7,3):A code block:]",
+        "[end-fcode-block:::3:False]",
+        "[BLANK(9,2):]",
+        "[tbreak(10,3):-::--------]",
+        "[end-block-quote:::True]",
+        "[BLANK(11,1):]",
+    ]
+    expected_gfm = """<blockquote>
+<blockquote>
+<blockquote>
+<ul>
+<li>inner list 1
+inner list 2</li>
+<li>inner list 3</li>
+</ul>
+</blockquote>
+</blockquote>
+<pre><code class="language-block">A code block
+</code></pre>
+<hr />
+</blockquote>"""
+
+    # Act & Assert
+    act_and_assert(source_markdown, expected_gfm, expected_tokens, show_debug=False)
+    # assert False
 
 
 @pytest.mark.gfm
-def test_extra_049l3():
+def test_extra_049l3a():
     """
     TBD
     bad_fenced_block_in_list_in_block_quote_in_block_quote_with_previous_list_triple_drop
@@ -8601,6 +8728,72 @@ list 2</li>
     act_and_assert(source_markdown, expected_gfm, expected_tokens)
 
 
+@pytest.mark.gfm
+def test_extra_049l3b():
+    """
+    TBD
+    bad_fenced_block_in_list_in_block_quote_in_block_quote_with_previous_list_triple_drop
+    """
+
+    # Arrange
+    source_markdown = """> > + ______
+> >   + list 1
+> >     list 2
+> >   + list 3
+>
+> ```block
+> A code block
+> ```
+>
+> ______
+"""
+    expected_tokens = [
+        "[block-quote(1,1)::> \n> \n> \n>\n> \n]",
+        "[block-quote(1,3)::> > \n> > \n> > \n> > \n>]",
+        "[ulist(1,5):+::6:]",
+        "[tbreak(1,7):_::______]",
+        "[ulist(2,7):+::8:  :    \n]",
+        "[para(2,9):\n]",
+        "[text(2,9):list 1\nlist 2::\n]",
+        "[end-para:::True]",
+        "[li(4,7):8:  :]",
+        "[para(4,9):]",
+        "[text(4,9):list 3:]",
+        "[end-para:::True]",
+        "[BLANK(5,2):]",
+        "[end-ulist:::True]",
+        "[end-ulist:::True]",
+        "[end-block-quote:::True]",
+        "[fcode-block(6,3):`:3:block:::::]",
+        "[text(7,3):A code block:]",
+        "[end-fcode-block:::3:False]",
+        "[BLANK(9,2):]",
+        "[tbreak(10,3):_::______]",
+        "[end-block-quote:::True]",
+        "[BLANK(11,1):]",
+    ]
+    expected_gfm = """<blockquote>
+<blockquote>
+<ul>
+<li>
+<hr />
+<ul>
+<li>list 1
+list 2</li>
+<li>list 3</li>
+</ul>
+</li>
+</ul>
+</blockquote>
+<pre><code class="language-block">A code block
+</code></pre>
+<hr />
+</blockquote>"""
+
+    # Act & Assert
+    act_and_assert(source_markdown, expected_gfm, expected_tokens)
+
+
 @pytest.mark.gfm
 def test_extra_049l5():
     """
@@ -8855,7 +9048,7 @@ list 2</li>
 
 
 @pytest.mark.gfm
-def test_extra_049l9():
+def test_extra_049l9a():
     """
     TBD
     bad_fenced_block_in_block_quote_in_list_in_block_quote_with_previous_list_triple_drop
@@ -8925,8 +9118,83 @@ list 2</li>
 
 
 @pytest.mark.gfm
-# @pytest.mark.skip
-def test_extra_049l4x():
+def test_extra_049l9b():
+    """
+    TBD
+    bad_fenced_block_in_block_quote_in_list_in_block_quote_with_previous_list_triple_drop
+    """
+
+    # Arrange
+    source_markdown = """+ + > -----
+    > + list 1
+    >   list 2
+    > + list 3
+
+    ```block
+    A code block
+    ```
+
+    -----
+  + another list
+"""
+    expected_tokens = [
+        "[ulist(1,1):+::2:]",
+        "[ulist(1,3):+::4:  :\n    \n    \n    \n\n    \n]",
+        "[block-quote(1,5):    :    > \n    > \n    > \n    > ]",
+        "[tbreak(1,7):-::-----]",
+        "[ulist(2,7):+::8::  ]",
+        "[para(2,9):\n]",
+        "[text(2,9):list 1\nlist 2::\n]",
+        "[end-para:::True]",
+        "[li(4,7):8::]",
+        "[para(4,9):]",
+        "[text(4,9):list 3:]",
+        "[end-para:::True]",
+        "[end-ulist:::True]",
+        "[end-block-quote:::True]",
+        "[BLANK(5,1):]",
+        "[fcode-block(6,5):`:3:block:::::]",
+        "[text(7,5):A code block:]",
+        "[end-fcode-block:::3:False]",
+        "[BLANK(9,1):]",
+        "[tbreak(10,5):-::-----]",
+        "[li(11,3):4:  :]",
+        "[para(11,5):]",
+        "[text(11,5):another list:]",
+        "[end-para:::True]",
+        "[BLANK(12,1):]",
+        "[end-ulist:::True]",
+        "[end-ulist:::True]",
+    ]
+    expected_gfm = """<ul>
+<li>
+<ul>
+<li>
+<blockquote>
+<hr />
+<ul>
+<li>list 1
+list 2</li>
+<li>list 3</li>
+</ul>
+</blockquote>
+<pre><code class="language-block">A code block
+</code></pre>
+<hr />
+</li>
+<li>
+<p>another list</p>
+</li>
+</ul>
+</li>
+</ul>"""
+
+    # Act & Assert
+    act_and_assert(source_markdown, expected_gfm, expected_tokens)
+
+
+@pytest.mark.gfm
+def test_extra_049l4xa():
     """
     TBD
     preventing bad_fenced_block_in_list_in_list_in_list_with_previous_block_double_drop
@@ -8992,15 +9260,87 @@ block 2</p>
 
 
 @pytest.mark.gfm
-def test_extra_049l4a():
+def test_extra_049l4xb():
     """
     TBD
+    preventing bad_fenced_block_in_list_in_list_in_list_with_previous_block_double_drop
     """
 
     # Arrange
     source_markdown = """+ + + -----
-    ```block
-    A code block
+      > block 1
+      > block 2
+
+    ```block
+    A code block
+    ```
+
+    -----
+  + another list
+"""
+    expected_tokens = [
+        "[ulist(1,1):+::2:]",
+        "[ulist(1,3):+::4:  :    \n    \n    \n\n    \n]",
+        "[ulist(1,5):+::6:    :\n\n]",
+        "[tbreak(1,7):-::-----]",
+        "[block-quote(2,7):      :      > \n      > \n]",
+        "[para(2,9):\n]",
+        "[text(2,9):block 1\nblock 2::\n]",
+        "[end-para:::True]",
+        "[end-block-quote:::True]",
+        "[BLANK(4,1):]",
+        "[end-ulist:::True]",
+        "[fcode-block(5,5):`:3:block:::::]",
+        "[text(6,5):A code block:]",
+        "[end-fcode-block:::3:False]",
+        "[BLANK(8,1):]",
+        "[tbreak(9,5):-::-----]",
+        "[li(10,3):4:  :]",
+        "[para(10,5):]",
+        "[text(10,5):another list:]",
+        "[end-para:::True]",
+        "[BLANK(11,1):]",
+        "[end-ulist:::True]",
+        "[end-ulist:::True]",
+    ]
+    expected_gfm = """<ul>
+<li>
+<ul>
+<li>
+<ul>
+<li>
+<hr />
+<blockquote>
+<p>block 1
+block 2</p>
+</blockquote>
+</li>
+</ul>
+<pre><code class="language-block">A code block
+</code></pre>
+<hr />
+</li>
+<li>
+<p>another list</p>
+</li>
+</ul>
+</li>
+</ul>"""
+
+    # Act & Assert
+    act_and_assert(source_markdown, expected_gfm, expected_tokens, show_debug=False)
+
+
+@pytest.mark.gfm
+def test_extra_049l4a():
+    """
+    TBD
+    """
+
+    # Arrange
+    source_markdown = """+ + + -----
+    ```block
+    A code block
     ```
     -----
   + another list
@@ -9046,7 +9386,7 @@ def test_extra_049l4a():
 
 
 @pytest.mark.gfm
-def test_extra_050a0():
+def test_extra_050a0a():
     """
     TBD
     bad_fenced_block_in_list_in_list_with_previous_inner_block_double_drop
@@ -9098,7 +9438,70 @@ another list</li>
 </ul>"""
 
     # Act & Assert
-    act_and_assert(source_markdown, expected_gfm, expected_tokens, show_debug=False)
+    act_and_assert(source_markdown, expected_gfm, expected_tokens, show_debug=True)
+    # assert False
+
+
+@pytest.mark.gfm
+def test_extra_050a0b():
+    """
+    TBD
+    bad_fenced_block_in_list_in_list_with_previous_inner_block_double_drop
+    """
+
+    # Arrange
+    source_markdown = """+ + list 1
+    > block 2.1
+    > block 2.2
+
+  ```block
+  A code block
+  ```
+
+  another list
+"""
+    expected_tokens = [
+        "[ulist(1,1):+::2::  \n  \n  \n\n  \n]",
+        "[ulist(1,3):+::4:  :\n\n]",
+        "[para(1,5):]",
+        "[text(1,5):list 1:]",
+        "[end-para:::True]",
+        "[block-quote(2,5):    :    > \n    > \n]",
+        "[para(2,7):\n]",
+        "[text(2,7):block 2.1\nblock 2.2::\n]",
+        "[end-para:::True]",
+        "[end-block-quote:::True]",
+        "[BLANK(4,1):]",
+        "[end-ulist:::True]",
+        "[fcode-block(5,3):`:3:block:::::]",
+        "[text(6,3):A code block:]",
+        "[end-fcode-block:::3:False]",
+        "[BLANK(8,1):]",
+        "[para(9,3):]",
+        "[text(9,3):another list:]",
+        "[end-para:::True]",
+        "[BLANK(10,1):]",
+        "[end-ulist:::True]",
+    ]
+    expected_gfm = """<ul>
+<li>
+<ul>
+<li>list 1
+<blockquote>
+<p>block 2.1
+block 2.2</p>
+</blockquote>
+</li>
+</ul>
+<pre><code class="language-block">A code block
+</code></pre>
+<p>another list</p>
+</li>
+</ul>"""
+
+    # Act & Assert
+    act_and_assert(source_markdown, expected_gfm, expected_tokens, show_debug=True)
+    # assert False
 
 
 @pytest.mark.gfm
@@ -10007,7 +10410,7 @@ block 3</p>
 </blockquote>"""
 
     # Act & Assert
-    act_and_assert(source_markdown, expected_gfm, expected_tokens, show_debug=False)
+    act_and_assert(source_markdown, expected_gfm, expected_tokens, show_debug=True)
 
 
 @pytest.mark.gfm
@@ -12762,94 +13165,2739 @@ block 2</p>
 
 
 @pytest.mark.gfm
-def test_extra_999():
+def test_extra_052a0():
     """
-    Temporary test to keep coverage up while consistency checks disabled.
+    TBD
+    bad_fenced_block_in_block_quote_in_block_quote_in_block_quote_with_previous_block_double_drop
     """
 
-    new_position = PositionMarker(1, 0, "text")
-
-    new_block_quote = BlockQuoteMarkdownToken("", new_position)
-    ex_ws = new_block_quote.extracted_whitespace
-    assert not ex_ws
-
-    new_front_matter = FrontMatterMarkdownToken("--", "--", ["a: b"], {}, new_position)
-    new_value = new_front_matter.calculate_block_token_height(new_front_matter)
-    assert new_value != 999
-    new_value = new_front_matter.calculate_initial_whitespace()
-    assert new_value != 999
-    assert new_front_matter.is_extension
-
-    ParserHelper.count_newlines_in_texts("text")
-
-
-# bad_fenced_block_in_block_quote_in_list_in_block_quote_with_previous_blockx_triple_drop
-#   File "C:\enlistments\pymarkdown\pymarkdown\plugins\rule_md_027.py", line 718, in __handle_blank_line_inner
-#     assert (
-# AssertionError
+    # Arrange
+    source_markdown = """> > >
+> > > > fourth block 1
+> > > > fourth block 2
+> > ```block
+> > A code block
+> > ```
+> > --------
+"""
+    expected_tokens = [
+        "[block-quote(1,1)::]",
+        "[block-quote(1,3)::> > \n> > \n> > \n]",
+        "[block-quote(1,5)::> > >]",
+        "[BLANK(1,6):]",
+        "[block-quote(2,1)::> > > > \n> > > > \n> > ]",
+        "[para(2,9):\n]",
+        "[text(2,9):fourth block 1\nfourth block 2::\n]",
+        "[end-para:::False]",
+        "[end-block-quote::> > :True]",
+        "[end-block-quote:::True]",
+        "[fcode-block(4,5):`:3:block:::::]",
+        "[text(5,5):A code block:]",
+        "[end-fcode-block:::3:False]",
+        "[tbreak(7,5):-::--------]",
+        "[end-block-quote:::True]",
+        "[end-block-quote:::True]",
+        "[BLANK(8,1):]",
+    ]
+    expected_gfm = """<blockquote>
+<blockquote>
+<blockquote>
+<blockquote>
+<p>fourth block 1
+fourth block 2</p>
+</blockquote>
+</blockquote>
+<pre><code class="language-block">A code block
+</code></pre>
+<hr />
+</blockquote>
+</blockquote>"""
 
+    # Act & Assert
+    act_and_assert(source_markdown, expected_gfm, expected_tokens, show_debug=False)
 
-# bad_fenced_block_in_block_quote_in_list_in_block_quote_with_previous_block_triple_drop_with_thematics
-# k0
-#   File "c:\enlistments\pymarkdown\pymarkdown\transform_markdown\transform_containers.py", line 424, in __abcd
-#     assert keep_going
-# AssertionError
 
+@pytest.mark.gfm
+def test_extra_052a1():
+    """
+    TBD
+    bad_fenced_block_in_block_quote_in_block_quote_in_block_quote_with_previous_block_double_drop
+    """
 
-# (occurs after fix, probably bad regen)
-# bad_fenced_block_in_block_quote_in_list_in_block_quote_with_previous_blockx_double_drop
-#   File "c:\enlistments\pymarkdown\pymarkdown\block_quotes\block_quote_processor.py", line 698, in __handle_existing_block_quote_fenced_special_part_two
-#     assert sd == ">"
-# AssertionError
+    # Arrange
+    source_markdown = """> > >
+> > > > fourth block 1
+> > > > fourth block 2
+> >
+> > ```block
+> > A code block
+> > ```
+> >
+> > --------
+"""
+    expected_tokens = [
+        "[block-quote(1,1)::]",
+        "[block-quote(1,3)::> > \n> > \n> > \n> >\n> > \n]",
+        "[block-quote(1,5)::> > >]",
+        "[BLANK(1,6):]",
+        "[block-quote(2,1)::> > > > \n> > > > \n> >]",
+        "[para(2,9):\n]",
+        "[text(2,9):fourth block 1\nfourth block 2::\n]",
+        "[end-para:::True]",
+        "[BLANK(4,4):]",
+        "[end-block-quote:::True]",
+        "[end-block-quote:::True]",
+        "[fcode-block(5,5):`:3:block:::::]",
+        "[text(6,5):A code block:]",
+        "[end-fcode-block:::3:False]",
+        "[BLANK(8,4):]",
+        "[tbreak(9,5):-::--------]",
+        "[end-block-quote:::True]",
+        "[end-block-quote:::True]",
+        "[BLANK(10,1):]",
+    ]
+    expected_gfm = """<blockquote>
+<blockquote>
+<blockquote>
+<blockquote>
+<p>fourth block 1
+fourth block 2</p>
+</blockquote>
+</blockquote>
+<pre><code class="language-block">A code block
+</code></pre>
+<hr />
+</blockquote>
+</blockquote>"""
 
+    # Act & Assert
+    act_and_assert(source_markdown, expected_gfm, expected_tokens, show_debug=False)
 
-# Bad fix
-# bad_fenced_block_in_block_quote_in_block_quote_in_block_quote_with_previous_block_triple_drop
 
+@pytest.mark.gfm
+def test_extra_052b0():
+    """
+    TBD
+    bad_fenced_block_in_list_in_block_quote_with_previous_inner_block_double_drop_without_thematics
+    """
 
-# bad_fenced_block_in_block_quote_in_list_in_list_with_previous_list_triple_drop
-# bad_fenced_block_in_block_quote_in_list_in_list_with_previous_list_triple_drop_and_thematics
-# bad_fenced_block_in_block_quote_in_block_quote_in_list_with_previous_block_double_drop
-# bad_fenced_block_in_block_quote_in_list_in_list_with_previous_block_triple_drop
-# bad_fenced_block_in_block_quote_in_block_quote_in_list_with_previous_block_double_drop
-# bad_fenced_block_in_block_quote_in_block_quote_in_list_with_previous_block_quad_drop_with_thematics
-# bad_fenced_block_in_block_quote_in_list_in_list_with_previous_block_triple_drop_and_thematics
-# bad_fenced_block_in_block_quote_in_list_in_list_with_previous_list_double_drop_and_thematics
-# bad_fenced_block_in_block_quote_in_block_quote_in_list_with_previous_list_triple_drop_with_thematics
-# bad_fenced_block_in_block_quote_in_block_quote_in_list_with_previous_list_double_drop_with_thematics
-# bad_fenced_block_in_block_quote_in_block_quote_in_list_with_previous_block_triple_drop_with_thematics
-# bad_fenced_block_in_block_quote_in_list_in_block_quote_with_previous_block_double_drop_with_thematics
-# bad_fenced_block_in_block_quote_with_previous_inner_list_double_drop
-# bad_fenced_block_in_block_quote_in_block_quote_in_list_with_previous_inner_block_double_drop
-# bad_fenced_block_in_block_quote_in_block_quote_in_block_quote_with_previous_block_double_drop
-# bad_fenced_block_in_block_quote_in_block_quote_double_drop_with_previous_inner_block
-# bad_fenced_block_in_block_quote_in_list_in_block_quote_with_previous_list_double_drop_and_thematics
-# bad_fenced_block_in_block_quote_in_block_quote_in_list_with_previous_list_triple_drop
-# bad_fenced_block_in_block_quote_in_block_quote_in_list_with_previous_inner_list_triple_drop
-# bad_fenced_block_in_block_quote_in_block_quote_in_block_quote_with_previous_list_triple_drop
-
-# bad_fenced_block_in_list_in_block_quote_in_block_quote_with_previous_block_double_drop
-# bad_fenced_block_in_list_in_block_quote_in_block_quote_with_previous_block_triple_drop
-# bad_fenced_block_in_list_in_block_quote_in_block_quote_with_previous_block_triple_drop_with_thematics
-# bad_fenced_block_in_list_in_block_quote_in_block_quote_with_previous_block_quad_drop_with_thematics
-# bad_fenced_block_in_list_in_block_quote_in_block_quote_with_previous_list_triple_drop
-# bad_fenced_block_in_list_in_block_quote_in_block_quote_with_previous_list_triple_drop_and_thematics
-# bad_fenced_block_in_list_in_block_quote_in_list_with_previous_block_double_drop
-# bad_fenced_block_in_list_in_block_quote_in_list_with_previous_block_triple_drop
-# bad_fenced_block_in_list_in_block_quote_in_list_with_previous_list_triple_drop_with_thematics
-# bad_fenced_block_in_list_in_block_quote_in_list_with_previous_list_quad_drop_with_thematics
-# bad_fenced_block_in_list_in_block_quote_with_previous_inner_block_double_drop_without_thematics
-# bad_fenced_block_in_list_in_list_in_block_quote_with_previous_block_double_drop
-# bad_fenced_block_in_list_in_list_in_block_quote_with_previous_block_double_drop_with_thematics
-# bad_fenced_block_in_list_in_list_in_block_quote_with_previous_block_triple_drop
+    # Arrange
+    source_markdown = """> + list 1
+>   > block 2
+>   > block 3
+> ```block
+> A code block
+> ```
+> another list
+"""
+    expected_tokens = [
+        "[block-quote(1,1)::> \n> \n> \n> \n> \n]",
+        "[ulist(1,3):+::4::\n\n]",
+        "[para(1,5):]",
+        "[text(1,5):list 1:]",
+        "[end-para:::True]",
+        "[block-quote(2,5)::> \n>   > \n> ]",
+        "[para(2,7):\n]",
+        "[text(2,7):block 2\nblock 3::\n]",
+        "[end-para:::False]",
+        "[end-block-quote:::True]",
+        "[end-ulist:::True]",
+        "[fcode-block(4,3):`:3:block:::::]",
+        "[text(5,3):A code block:]",
+        "[end-fcode-block:::3:False]",
+        "[para(7,3):]",
+        "[text(7,3):another list:]",
+        "[end-para:::True]",
+        "[end-block-quote:::True]",
+        "[BLANK(8,1):]",
+    ]
+    expected_gfm = """<blockquote>
+<ul>
+<li>list 1
+<blockquote>
+<p>block 2
+block 3</p>
+</blockquote>
+</li>
+</ul>
+<pre><code class="language-block">A code block
+</code></pre>
+<p>another list</p>
+</blockquote>"""
+
+    # Act & Assert
+    act_and_assert(source_markdown, expected_gfm, expected_tokens, show_debug=False)
+
+
+@pytest.mark.gfm
+def test_extra_052b1():
+    """
+    TBD
+    bad_fenced_block_in_list_in_block_quote_with_previous_inner_block_double_drop_without_thematics
+    """
+
+    # Arrange
+    source_markdown = """> + list 1
+>   > block 2
+>   > block 3
+>
+> ```block
+> A code block
+> ```
+>
+> another list
+"""
+    expected_tokens = [
+        "[block-quote(1,1)::> \n> \n> \n> \n> \n>\n> \n]",
+        "[ulist(1,3):+::4::\n\n\n]",
+        "[para(1,5):]",
+        "[text(1,5):list 1:]",
+        "[end-para:::True]",
+        "[block-quote(2,5)::> \n>   > \n>]",
+        "[para(2,7):\n]",
+        "[text(2,7):block 2\nblock 3::\n]",
+        "[end-para:::True]",
+        "[BLANK(4,2):]",
+        "[end-block-quote:::True]",
+        "[end-ulist:::True]",
+        "[fcode-block(5,3):`:3:block:::::]",
+        "[text(6,3):A code block:]",
+        "[end-fcode-block:::3:False]",
+        "[BLANK(8,2):]",
+        "[para(9,3):]",
+        "[text(9,3):another list:]",
+        "[end-para:::True]",
+        "[end-block-quote:::True]",
+        "[BLANK(10,1):]",
+    ]
+    expected_gfm = """<blockquote>
+<ul>
+<li>list 1
+<blockquote>
+<p>block 2
+block 3</p>
+</blockquote>
+</li>
+</ul>
+<pre><code class="language-block">A code block
+</code></pre>
+<p>another list</p>
+</blockquote>"""
+
+    # Act & Assert
+    act_and_assert(source_markdown, expected_gfm, expected_tokens, show_debug=False)
+    # assert False
+
+
+@pytest.mark.gfm
+def test_extra_052c0():
+    """
+    TBD
+    bad_fenced_block_in_list_in_list_in_block_quote_with_previous_block_double_drop_with_thematics
+    """
+
+    # Arrange
+    source_markdown = """> + + -----
+>     > block 1
+>     > block 2
+>   -----
+>   ```block
+>   A code block
+>   ```
+>   -----
+> + another list
+"""
+    expected_tokens = [
+        "[block-quote(1,1)::> \n> \n> \n> \n> \n> \n> ]",
+        "[ulist(1,3):+::4::  \n  \n  \n  ]",
+        "[ulist(1,5):+::6:  :\n\n  þ]",
+        "[tbreak(1,7):-::-----]",
+        "[block-quote(2,7)::>     > \n>     > \n> ]",
+        "[para(2,9):\n]",
+        "[text(2,9):block 1\nblock 2::\n]",
+        "[end-para:::False]",
+        "[end-block-quote:::True]",
+        "[end-ulist:::True]",
+        "[tbreak(4,5):-::-----]",
+        "[fcode-block(5,5):`:3:block:::::]",
+        "[text(6,5):A code block:]",
+        "[end-fcode-block:::3:False]",
+        "[tbreak(8,5):-::-----]",
+        "[li(9,3):4::]",
+        "[para(9,5):]",
+        "[text(9,5):another list:]",
+        "[end-para:::True]",
+        "[end-ulist:::True]",
+        "[end-block-quote:::True]",
+        "[BLANK(10,1):]",
+    ]
+    expected_gfm = """<blockquote>
+<ul>
+<li>
+<ul>
+<li>
+<hr />
+<blockquote>
+<p>block 1
+block 2</p>
+</blockquote>
+</li>
+</ul>
+<hr />
+<pre><code class="language-block">A code block
+</code></pre>
+<hr />
+</li>
+<li>another list</li>
+</ul>
+</blockquote>"""
+
+    # Act & Assert
+    act_and_assert(source_markdown, expected_gfm, expected_tokens, show_debug=False)
+    # assert False
+
+
+@pytest.mark.gfm
+def test_extra_052c1():
+    """
+    TBD
+    bad_fenced_block_in_list_in_list_in_block_quote_with_previous_block_double_drop_with_thematics
+    """
+
+    # Arrange
+    source_markdown = """> + + -----
+>     > block 1
+>     > block 2
+>   -----
+>
+>   ```block
+>   A code block
+>   ```
+>
+>   -----
+> + another list
+"""
+    expected_tokens = [
+        "[block-quote(1,1)::> \n> \n>\n> \n> \n> \n>\n> \n> ]",
+        "[ulist(1,3):+::4::\n  \n  \n  \n\n  ]",
+        "[ulist(1,5):+::6:  :\n\n  þ]",
+        "[tbreak(1,7):-::-----]",
+        "[block-quote(2,7)::>     > \n>     > \n> ]",
+        "[para(2,9):\n]",
+        "[text(2,9):block 1\nblock 2::\n]",
+        "[end-para:::False]",
+        "[end-block-quote:::True]",
+        "[end-ulist:::True]",
+        "[tbreak(4,5):-::-----]",
+        "[BLANK(5,2):]",
+        "[fcode-block(6,5):`:3:block:::::]",
+        "[text(7,4):A code block:]",
+        "[end-fcode-block:::3:False]",
+        "[BLANK(9,2):]",
+        "[tbreak(10,5):-::-----]",
+        "[li(11,3):4::]",
+        "[para(11,5):]",
+        "[text(11,5):another list:]",
+        "[end-para:::True]",
+        "[end-ulist:::True]",
+        "[end-block-quote:::True]",
+        "[BLANK(12,1):]",
+    ]
+    expected_gfm = """<blockquote>
+<ul>
+<li>
+<ul>
+<li>
+<hr />
+<blockquote>
+<p>block 1
+block 2</p>
+</blockquote>
+</li>
+</ul>
+<hr />
+<pre><code class="language-block">A code block
+</code></pre>
+<hr />
+</li>
+<li>
+<p>another list</p>
+</li>
+</ul>
+</blockquote>"""
+
+    # Act & Assert
+    act_and_assert(source_markdown, expected_gfm, expected_tokens, show_debug=False)
+    # assert False
+
+
+@pytest.mark.gfm
+def test_extra_052d0():
+    """
+    TBD
+    bad_fenced_block_in_list_in_block_quote_in_block_quote_with_previous_list_triple_drop_and_thematics
+    """
+
+    # Arrange
+    source_markdown = """> > + ______
+> >   + list 1
+> >     list 2
+> >   + list 3
+> ______
+> ```block
+> A code block
+> ```
+> ______
+"""
+    expected_tokens = [
+        "[block-quote(1,1)::> \n> \n> \n> \n]",
+        "[block-quote(1,3)::> > \n> > \n> > \n> > \n> ]",
+        "[ulist(1,5):+::6:]",
+        "[tbreak(1,7):_::______]",
+        "[ulist(2,7):+::8:  :    \n]",
+        "[para(2,9):\n]",
+        "[text(2,9):list 1\nlist 2::\n]",
+        "[end-para:::True]",
+        "[li(4,7):8:  :]",
+        "[para(4,9):]",
+        "[text(4,9):list 3:]",
+        "[end-para:::False]",
+        "[end-ulist:::True]",
+        "[end-ulist:::True]",
+        "[end-block-quote::> :True]",
+        "[tbreak(5,3):_::______]",
+        "[fcode-block(6,3):`:3:block:::::]",
+        "[text(7,3):A code block:]",
+        "[end-fcode-block:::3:False]",
+        "[tbreak(9,3):_::______]",
+        "[end-block-quote:::True]",
+        "[BLANK(10,1):]",
+    ]
+    expected_gfm = """<blockquote>
+<blockquote>
+<ul>
+<li>
+<hr />
+<ul>
+<li>list 1
+list 2</li>
+<li>list 3</li>
+</ul>
+</li>
+</ul>
+</blockquote>
+<hr />
+<pre><code class="language-block">A code block
+</code></pre>
+<hr />
+</blockquote>"""
+
+    # Act & Assert
+    act_and_assert(source_markdown, expected_gfm, expected_tokens, show_debug=False)
+    # assert False
+
+
+@pytest.mark.gfm
+def test_extra_052d1():
+    """
+    TBD
+    bad_fenced_block_in_list_in_block_quote_in_block_quote_with_previous_list_triple_drop_and_thematics
+    """
+
+    # Arrange
+    source_markdown = """> > + ______
+> >   + list 1
+> >     list 2
+> >   + list 3
+> ______
+>
+> ```block
+> A code block
+> ```
+>
+> ______
+"""
+    expected_tokens = [
+        "[block-quote(1,1)::>\n> \n> \n> \n>\n> \n]",
+        "[block-quote(1,3)::> > \n> > \n> > \n> > \n> ]",
+        "[ulist(1,5):+::6:]",
+        "[tbreak(1,7):_::______]",
+        "[ulist(2,7):+::8:  :    \n]",
+        "[para(2,9):\n]",
+        "[text(2,9):list 1\nlist 2::\n]",
+        "[end-para:::True]",
+        "[li(4,7):8:  :]",
+        "[para(4,9):]",
+        "[text(4,9):list 3:]",
+        "[end-para:::False]",
+        "[end-ulist:::True]",
+        "[end-ulist:::True]",
+        "[end-block-quote::> :True]",
+        "[tbreak(5,3):_::______]",
+        "[BLANK(6,2):]",
+        "[fcode-block(7,3):`:3:block:::::]",
+        "[text(8,3):A code block:]",
+        "[end-fcode-block:::3:False]",
+        "[BLANK(10,2):]",
+        "[tbreak(11,3):_::______]",
+        "[end-block-quote:::True]",
+        "[BLANK(12,1):]",
+    ]
+    expected_gfm = """<blockquote>
+<blockquote>
+<ul>
+<li>
+<hr />
+<ul>
+<li>list 1
+list 2</li>
+<li>list 3</li>
+</ul>
+</li>
+</ul>
+</blockquote>
+<hr />
+<pre><code class="language-block">A code block
+</code></pre>
+<hr />
+</blockquote>"""
+
+    # Act & Assert
+    act_and_assert(source_markdown, expected_gfm, expected_tokens, show_debug=False)
+    # assert False
+
+
+@pytest.mark.gfm
+def test_extra_052e0():
+    """
+    TBD
+    bad_fenced_block_in_block_quote_in_block_quote_in_list_with_previous_list_double_drop_with_thematics
+    """
+
+    # Arrange
+    source_markdown = """1. > > ----
+   > > + list 1
+   > >   list 2
+   > > + list 3
+   > ----
+   > ```block
+   > A code block
+   > ```
+   > ----
+"""
+    expected_tokens = [
+        "[olist(1,1):.:1:3::\n\n\n\n\n]",
+        "[block-quote(1,4):   :   > \n   > \n   > \n   > \n]",
+        "[block-quote(1,6):   :   > > \n   > > \n   > > \n   > > \n   > ]",
+        "[tbreak(1,8):-::----]",
+        "[ulist(2,8):+::9::  ]",
+        "[para(2,10):\n]",
+        "[text(2,10):list 1\nlist 2::\n]",
+        "[end-para:::True]",
+        "[li(4,8):9::]",
+        "[para(4,10):]",
+        "[text(4,10):list 3:]",
+        "[end-para:::False]",
+        "[end-ulist:::True]",
+        "[end-block-quote::   > :True]",
+        "[tbreak(5,6):-::----]",
+        "[fcode-block(6,6):`:3:block:::::]",
+        "[text(7,6):A code block:]",
+        "[end-fcode-block:::3:False]",
+        "[tbreak(9,6):-::----]",
+        "[end-block-quote:::True]",
+        "[BLANK(10,1):]",
+        "[end-olist:::True]",
+    ]
+    expected_gfm = """<ol>
+<li>
+<blockquote>
+<blockquote>
+<hr />
+<ul>
+<li>list 1
+list 2</li>
+<li>list 3</li>
+</ul>
+</blockquote>
+<hr />
+<pre><code class="language-block">A code block
+</code></pre>
+<hr />
+</blockquote>
+</li>
+</ol>"""
+
+    # Act & Assert
+    act_and_assert(source_markdown, expected_gfm, expected_tokens, show_debug=False)
+    # assert False
+
+
+@pytest.mark.gfm
+def test_extra_052e1():
+    """
+    TBD
+    bad_fenced_block_in_block_quote_in_block_quote_in_list_with_previous_list_double_drop_with_thematics
+    """
+
+    # Arrange
+    source_markdown = """1. > > ----
+   > > + list 1
+   > >   list 2
+   > > + list 3
+   > ----
+   >
+   > ```block
+   > A code block
+   > ```
+   >
+   > ----
+"""
+    expected_tokens = [
+        "[olist(1,1):.:1:3::\n\n\n\n\n\n\n]",
+        "[block-quote(1,4):   :   >\n   > \n   > \n   > \n   >\n   > \n]",
+        "[block-quote(1,6):   :   > > \n   > > \n   > > \n   > > \n   > ]",
+        "[tbreak(1,8):-::----]",
+        "[ulist(2,8):+::9::  ]",
+        "[para(2,10):\n]",
+        "[text(2,10):list 1\nlist 2::\n]",
+        "[end-para:::True]",
+        "[li(4,8):9::]",
+        "[para(4,10):]",
+        "[text(4,10):list 3:]",
+        "[end-para:::False]",
+        "[end-ulist:::True]",
+        "[end-block-quote::   > :True]",
+        "[tbreak(5,6):-::----]",
+        "[BLANK(6,5):]",
+        "[fcode-block(7,6):`:3:block:::::]",
+        "[text(8,6):A code block:]",
+        "[end-fcode-block:::3:False]",
+        "[BLANK(10,5):]",
+        "[tbreak(11,6):-::----]",
+        "[end-block-quote:::True]",
+        "[BLANK(12,1):]",
+        "[end-olist:::True]",
+    ]
+    expected_gfm = """<ol>
+<li>
+<blockquote>
+<blockquote>
+<hr />
+<ul>
+<li>list 1
+list 2</li>
+<li>list 3</li>
+</ul>
+</blockquote>
+<hr />
+<pre><code class="language-block">A code block
+</code></pre>
+<hr />
+</blockquote>
+</li>
+</ol>"""
+
+    # Act & Assert
+    act_and_assert(source_markdown, expected_gfm, expected_tokens, show_debug=False)
+    # assert False
+
+
+@pytest.mark.gfm
+def test_extra_052f0():
+    """
+    TBD
+    bad_fenced_block_in_block_quote_in_block_quote_in_list_with_previous_inner_list_triple_drop
+    """
+
+    # Arrange
+    source_markdown = """1. > > ----
+   > > + block 1
+   > >   block 2
+   ```block
+   A code block
+   ```
+   ----
+"""
+    expected_tokens = [
+        "[olist(1,1):.:1:3::   \n   \n   \n   \n]",
+        "[block-quote(1,4):   :]",
+        "[block-quote(1,6):   :   > > \n   > > \n   > > ]",
+        "[tbreak(1,8):-::----]",
+        "[ulist(2,8):+::9::  ]",
+        "[para(2,10):\n]",
+        "[text(2,10):block 1\nblock 2::\n]",
+        "[end-para:::True]",
+        "[end-ulist:::True]",
+        "[end-block-quote:::True]",
+        "[end-block-quote:::True]",
+        "[fcode-block(4,4):`:3:block:::::]",
+        "[text(5,4):A code block:]",
+        "[end-fcode-block:::3:False]",
+        "[tbreak(7,4):-::----]",
+        "[BLANK(8,1):]",
+        "[end-olist:::True]",
+    ]
+    expected_gfm = """<ol>
+<li>
+<blockquote>
+<blockquote>
+<hr />
+<ul>
+<li>block 1
+block 2</li>
+</ul>
+</blockquote>
+</blockquote>
+<pre><code class="language-block">A code block
+</code></pre>
+<hr />
+</li>
+</ol>"""
+
+    # Act & Assert
+    act_and_assert(source_markdown, expected_gfm, expected_tokens, show_debug=False)
+    # assert False
+
+
+@pytest.mark.gfm
+def test_extra_052f1():
+    """
+    TBD
+    bad_fenced_block_in_block_quote_in_block_quote_in_list_with_previous_inner_list_triple_drop
+    """
+
+    # Arrange
+    source_markdown = """1. > > ----
+   > > + block 1
+   > >   block 2
+
+   ```block
+   A code block
+   ```
+
+   ----
+"""
+    expected_tokens = [
+        "[olist(1,1):.:1:3::\n   \n   \n   \n\n   \n]",
+        "[block-quote(1,4):   :]",
+        "[block-quote(1,6):   :   > > \n   > > \n   > > ]",
+        "[tbreak(1,8):-::----]",
+        "[ulist(2,8):+::9::  ]",
+        "[para(2,10):\n]",
+        "[text(2,10):block 1\nblock 2::\n]",
+        "[end-para:::True]",
+        "[end-ulist:::True]",
+        "[end-block-quote:::True]",
+        "[end-block-quote:::True]",
+        "[BLANK(4,1):]",
+        "[fcode-block(5,4):`:3:block:::::]",
+        "[text(6,4):A code block:]",
+        "[end-fcode-block:::3:False]",
+        "[BLANK(8,1):]",
+        "[tbreak(9,4):-::----]",
+        "[BLANK(10,1):]",
+        "[end-olist:::True]",
+    ]
+    expected_gfm = """<ol>
+<li>
+<blockquote>
+<blockquote>
+<hr />
+<ul>
+<li>block 1
+block 2</li>
+</ul>
+</blockquote>
+</blockquote>
+<pre><code class="language-block">A code block
+</code></pre>
+<hr />
+</li>
+</ol>"""
+
+    # Act & Assert
+    act_and_assert(source_markdown, expected_gfm, expected_tokens, show_debug=False)
+    # assert False
+
+
+@pytest.mark.gfm
+def test_extra_052g0():
+    """
+    TBD
+    bad_fenced_block_in_list_in_block_quote_in_list_with_previous_block_triple_drop
+    """
+
+    # Arrange
+    source_markdown = """1. > + ----
+   >   > block 1
+   >   > block 2
+   ```block
+   A code block
+   ```
+   ----
+"""
+    expected_tokens = [
+        "[olist(1,1):.:1:3::   \n   \n   \n]",
+        "[block-quote(1,4):   :   > \n   > ]",
+        "[ulist(1,6):+::7::\n\n   ]",
+        "[tbreak(1,8):-::----]",
+        "[block-quote(2,8)::> \n   >   > ]",
+        "[para(2,10):\n]",
+        "[text(2,10):block 1\nblock 2::\n]",
+        "[end-para:::True]",
+        "[end-block-quote:::True]",
+        "[end-ulist:::True]",
+        "[end-block-quote:::True]",
+        "[fcode-block(4,4):`:3:block:::::]",
+        "[text(5,4):A code block:]",
+        "[end-fcode-block:::3:False]",
+        "[tbreak(7,4):-::----]",
+        "[BLANK(8,1):]",
+        "[end-olist:::True]",
+    ]
+    expected_gfm = """<ol>
+<li>
+<blockquote>
+<ul>
+<li>
+<hr />
+<blockquote>
+<p>block 1
+block 2</p>
+</blockquote>
+</li>
+</ul>
+</blockquote>
+<pre><code class="language-block">A code block
+</code></pre>
+<hr />
+</li>
+</ol>"""
+
+    # Act & Assert
+    act_and_assert(source_markdown, expected_gfm, expected_tokens, show_debug=False)
+    # assert False
+
+
+@pytest.mark.gfm
+def test_extra_052g1():
+    """
+    TBD
+    bad_fenced_block_in_list_in_block_quote_in_list_with_previous_block_triple_drop
+    """
+
+    # Arrange
+    source_markdown = """1. > + ----
+   >   > block 1
+   >   > block 2
+
+   ```block
+   A code block
+   ```
+
+   ----
+"""
+    expected_tokens = [
+        "[olist(1,1):.:1:3::\n   \n   \n   \n\n   \n]",
+        "[block-quote(1,4):   :   > \n   > ]",
+        "[ulist(1,6):+::7::\n]",
+        "[tbreak(1,8):-::----]",
+        "[block-quote(2,8)::> \n   >   > \n]",
+        "[para(2,10):\n]",
+        "[text(2,10):block 1\nblock 2::\n]",
+        "[end-para:::True]",
+        "[end-block-quote:::True]",
+        "[end-ulist:::True]",
+        "[end-block-quote:::True]",
+        "[BLANK(4,1):]",
+        "[fcode-block(5,4):`:3:block:::::]",
+        "[text(6,4):A code block:]",
+        "[end-fcode-block:::3:False]",
+        "[BLANK(8,1):]",
+        "[tbreak(9,4):-::----]",
+        "[BLANK(10,1):]",
+        "[end-olist:::True]",
+    ]
+    expected_gfm = """<ol>
+<li>
+<blockquote>
+<ul>
+<li>
+<hr />
+<blockquote>
+<p>block 1
+block 2</p>
+</blockquote>
+</li>
+</ul>
+</blockquote>
+<pre><code class="language-block">A code block
+</code></pre>
+<hr />
+</li>
+</ol>"""
+
+    # Act & Assert
+    act_and_assert(source_markdown, expected_gfm, expected_tokens, show_debug=False)
+    # assert False
+
+
+@pytest.mark.gfm
+def test_extra_052h0():
+    """
+    TBD
+    bad_fenced_block_in_block_quote_in_block_quote_in_list_with_previous_list_triple_drop_with_thematics
+    """
+
+    # Arrange
+    source_markdown = """1. > > ----
+   > > + list 1
+   > >   list 2
+   > > + list 3
+   ----
+   ```block
+   A code block
+   ```
+   ----
+"""
+    expected_tokens = [
+        "[olist(1,1):.:1:3::   \n   \n   \n   \n   \n]",
+        "[block-quote(1,4):   :]",
+        "[block-quote(1,6):   :   > > \n   > > \n   > > \n   > > ]",
+        "[tbreak(1,8):-::----]",
+        "[ulist(2,8):+::9::  ]",
+        "[para(2,10):\n]",
+        "[text(2,10):list 1\nlist 2::\n]",
+        "[end-para:::True]",
+        "[li(4,8):9::]",
+        "[para(4,10):]",
+        "[text(4,10):list 3:]",
+        "[end-para:::True]",
+        "[end-ulist:::True]",
+        "[end-block-quote:::True]",
+        "[end-block-quote:::True]",
+        "[tbreak(5,4):-::----]",
+        "[fcode-block(6,4):`:3:block:::::]",
+        "[text(7,4):A code block:]",
+        "[end-fcode-block:::3:False]",
+        "[tbreak(9,4):-::----]",
+        "[BLANK(10,1):]",
+        "[end-olist:::True]",
+    ]
+    expected_gfm = """<ol>
+<li>
+<blockquote>
+<blockquote>
+<hr />
+<ul>
+<li>list 1
+list 2</li>
+<li>list 3</li>
+</ul>
+</blockquote>
+</blockquote>
+<hr />
+<pre><code class="language-block">A code block
+</code></pre>
+<hr />
+</li>
+</ol>"""
+
+    # Act & Assert
+    act_and_assert(source_markdown, expected_gfm, expected_tokens, show_debug=False)
+    # assert False
+
+
+@pytest.mark.gfm
+def test_extra_052h1():
+    """
+    TBD
+    bad_fenced_block_in_block_quote_in_block_quote_in_list_with_previous_list_triple_drop_with_thematics
+    """
+
+    # Arrange
+    source_markdown = """1. > > ----
+   > > + list 1
+   > >   list 2
+   > > + list 3
+   ----
+
+   ```block
+   A code block
+   ```
+
+   ----
+"""
+    expected_tokens = [
+        "[olist(1,1):.:1:3::   \n\n   \n   \n   \n\n   \n]",
+        "[block-quote(1,4):   :]",
+        "[block-quote(1,6):   :   > > \n   > > \n   > > \n   > > ]",
+        "[tbreak(1,8):-::----]",
+        "[ulist(2,8):+::9::  ]",
+        "[para(2,10):\n]",
+        "[text(2,10):list 1\nlist 2::\n]",
+        "[end-para:::True]",
+        "[li(4,8):9::]",
+        "[para(4,10):]",
+        "[text(4,10):list 3:]",
+        "[end-para:::True]",
+        "[end-ulist:::True]",
+        "[end-block-quote:::True]",
+        "[end-block-quote:::True]",
+        "[tbreak(5,4):-::----]",
+        "[BLANK(6,1):]",
+        "[fcode-block(7,4):`:3:block:::::]",
+        "[text(8,4):A code block:]",
+        "[end-fcode-block:::3:False]",
+        "[BLANK(10,1):]",
+        "[tbreak(11,4):-::----]",
+        "[BLANK(12,1):]",
+        "[end-olist:::True]",
+    ]
+    expected_gfm = """<ol>
+<li>
+<blockquote>
+<blockquote>
+<hr />
+<ul>
+<li>list 1
+list 2</li>
+<li>list 3</li>
+</ul>
+</blockquote>
+</blockquote>
+<hr />
+<pre><code class="language-block">A code block
+</code></pre>
+<hr />
+</li>
+</ol>"""
+
+    # Act & Assert
+    act_and_assert(source_markdown, expected_gfm, expected_tokens, show_debug=False)
+    # assert False
+
+
+@pytest.mark.gfm
+def test_extra_052j0():
+    """
+    TBD
+    bad_fenced_block_in_list_in_list_in_block_quote_with_previous_block_triple_drop
+    """
+
+    # Arrange
+    source_markdown = """> + + -----
+>     > block 1
+>     > block 2
+> ```block
+> A code block
+> ```
+> -----
+> another list
+"""
+    expected_tokens = [
+        "[block-quote(1,1)::> \n> \n> \n> \n> \n> \n]",
+        "[ulist(1,3):+::4:]",
+        "[ulist(1,5):+::6:  :\n\n]",
+        "[tbreak(1,7):-::-----]",
+        "[block-quote(2,7)::>     > \n>     > \n> ]",
+        "[para(2,9):\n]",
+        "[text(2,9):block 1\nblock 2::\n]",
+        "[end-para:::False]",
+        "[end-block-quote:::True]",
+        "[end-ulist:::True]",
+        "[end-ulist:::True]",
+        "[fcode-block(4,3):`:3:block:::::]",
+        "[text(5,3):A code block:]",
+        "[end-fcode-block:::3:False]",
+        "[tbreak(7,3):-::-----]",
+        "[para(8,3):]",
+        "[text(8,3):another list:]",
+        "[end-para:::True]",
+        "[end-block-quote:::True]",
+        "[BLANK(9,1):]",
+    ]
+    expected_gfm = """<blockquote>
+<ul>
+<li>
+<ul>
+<li>
+<hr />
+<blockquote>
+<p>block 1
+block 2</p>
+</blockquote>
+</li>
+</ul>
+</li>
+</ul>
+<pre><code class="language-block">A code block
+</code></pre>
+<hr />
+<p>another list</p>
+</blockquote>"""
+
+    # Act & Assert
+    act_and_assert(source_markdown, expected_gfm, expected_tokens, show_debug=False)
+    # assert False
+
+
+@pytest.mark.gfm
+def test_extra_052j1():
+    """
+    TBD
+    bad_fenced_block_in_list_in_list_in_block_quote_with_previous_block_triple_drop
+    """
+
+    # Arrange
+    source_markdown = """> + + -----
+>     > block 1
+>     > block 2
+>
+> ```block
+> A code block
+> ```
+>
+> -----
+> another list
+"""
+    expected_tokens = [
+        "[block-quote(1,1)::> \n> \n> \n> \n> \n>\n> \n> \n]",
+        "[ulist(1,3):+::4:]",
+        "[ulist(1,5):+::6:  :\n\n\n]",
+        "[tbreak(1,7):-::-----]",
+        "[block-quote(2,7)::>     > \n>     > \n>]",
+        "[para(2,9):\n]",
+        "[text(2,9):block 1\nblock 2::\n]",
+        "[end-para:::True]",
+        "[BLANK(4,2):]",
+        "[end-block-quote:::True]",
+        "[end-ulist:::True]",
+        "[end-ulist:::True]",
+        "[fcode-block(5,3):`:3:block:::::]",
+        "[text(6,3):A code block:]",
+        "[end-fcode-block:::3:False]",
+        "[BLANK(8,2):]",
+        "[tbreak(9,3):-::-----]",
+        "[para(10,3):]",
+        "[text(10,3):another list:]",
+        "[end-para:::True]",
+        "[end-block-quote:::True]",
+        "[BLANK(11,1):]",
+    ]
+    expected_gfm = """<blockquote>
+<ul>
+<li>
+<ul>
+<li>
+<hr />
+<blockquote>
+<p>block 1
+block 2</p>
+</blockquote>
+</li>
+</ul>
+</li>
+</ul>
+<pre><code class="language-block">A code block
+</code></pre>
+<hr />
+<p>another list</p>
+</blockquote>"""
+
+    # Act & Assert
+    act_and_assert(source_markdown, expected_gfm, expected_tokens, show_debug=False)
+    # assert False
+
+
+@pytest.mark.gfm
+def test_extra_052k0():
+    """
+    TBD
+    bad_fenced_block_in_list_in_list_in_block_quote_with_previous_block_triple_drop_with_thematics
+    """
+
+    # Arrange
+    source_markdown = """> + + -----
+>     > block 1
+>     > block 2
+> -----
+> ```block
+> A code block
+> ```
+> -----
+> another list
+"""
+    expected_tokens = [
+        "[block-quote(1,1)::> \n> \n> \n> \n> \n> \n> \n]",
+        "[ulist(1,3):+::4:]",
+        "[ulist(1,5):+::6:  :\n\n]",
+        "[tbreak(1,7):-::-----]",
+        "[block-quote(2,7)::>     > \n>     > \n> ]",
+        "[para(2,9):\n]",
+        "[text(2,9):block 1\nblock 2::\n]",
+        "[end-para:::False]",
+        "[end-block-quote:::True]",
+        "[end-ulist:::True]",
+        "[end-ulist:::True]",
+        "[tbreak(4,3):-::-----]",
+        "[fcode-block(5,3):`:3:block:::::]",
+        "[text(6,3):A code block:]",
+        "[end-fcode-block:::3:False]",
+        "[tbreak(8,3):-::-----]",
+        "[para(9,3):]",
+        "[text(9,3):another list:]",
+        "[end-para:::True]",
+        "[end-block-quote:::True]",
+        "[BLANK(10,1):]",
+    ]
+    expected_gfm = """<blockquote>
+<ul>
+<li>
+<ul>
+<li>
+<hr />
+<blockquote>
+<p>block 1
+block 2</p>
+</blockquote>
+</li>
+</ul>
+</li>
+</ul>
+<hr />
+<pre><code class="language-block">A code block
+</code></pre>
+<hr />
+<p>another list</p>
+</blockquote>"""
+
+    # Act & Assert
+    act_and_assert(source_markdown, expected_gfm, expected_tokens, show_debug=False)
+    # assert False
+
+
+@pytest.mark.gfm
+def test_extra_052k1():
+    """
+    TBD
+    bad_fenced_block_in_list_in_list_in_block_quote_with_previous_block_triple_drop_with_thematics
+    """
+
+    # Arrange
+    source_markdown = """> + + -----
+>     > block 1
+>     > block 2
+> -----
+>
+> ```block
+> A code block
+> ```
+>
+> -----
+> another list
+"""
+    expected_tokens = [
+        "[block-quote(1,1)::> \n> \n>\n> \n> \n> \n>\n> \n> \n]",
+        "[ulist(1,3):+::4:]",
+        "[ulist(1,5):+::6:  :\n\n]",
+        "[tbreak(1,7):-::-----]",
+        "[block-quote(2,7)::>     > \n>     > \n> ]",
+        "[para(2,9):\n]",
+        "[text(2,9):block 1\nblock 2::\n]",
+        "[end-para:::False]",
+        "[end-block-quote:::True]",
+        "[end-ulist:::True]",
+        "[end-ulist:::True]",
+        "[tbreak(4,3):-::-----]",
+        "[BLANK(5,2):]",
+        "[fcode-block(6,3):`:3:block:::::]",
+        "[text(7,3):A code block:]",
+        "[end-fcode-block:::3:False]",
+        "[BLANK(9,2):]",
+        "[tbreak(10,3):-::-----]",
+        "[para(11,3):]",
+        "[text(11,3):another list:]",
+        "[end-para:::True]",
+        "[end-block-quote:::True]",
+        "[BLANK(12,1):]",
+    ]
+    expected_gfm = """<blockquote>
+<ul>
+<li>
+<ul>
+<li>
+<hr />
+<blockquote>
+<p>block 1
+block 2</p>
+</blockquote>
+</li>
+</ul>
+</li>
+</ul>
+<hr />
+<pre><code class="language-block">A code block
+</code></pre>
+<hr />
+<p>another list</p>
+</blockquote>"""
+
+    # Act & Assert
+    act_and_assert(source_markdown, expected_gfm, expected_tokens, show_debug=False)
+    # assert False
+
+
+@pytest.mark.skip
+@pytest.mark.gfm
+def test_extra_052l0():
+    """
+    TBD
+    bad_fenced_block_in_list_in_list_in_block_quote_with_previous_list_double_drop
+    """
+
+    # Arrange
+    source_markdown = """> + + -----
+>     + list 1
+>       list 2
+>     + list 3
+>   ```block
+>   A code block
+>   ```
+>   -----
+> + another list
+"""
+    expected_tokens = [
+        "[block-quote(1,1)::> \n> \n> \n> \n> \n> \n> \n> \n> ]",
+        "[ulist(1,3):+::4::  \n  \n  ]",
+        "[ulist(1,5):+::6:  ]",
+        "[tbreak(1,7):-::-----]",
+        "[ulist(2,7):+::8:    :      \n  ]",
+        "[para(2,9):\n]",
+        "[text(2,9):list 1\nlist 2::\n]",
+        "[end-para:::True]",
+        "[li(4,7):8:    :]",
+        "[para(4,9):]",
+        "[text(4,9):list 3:]",
+        "[end-para:::False]",
+        "[end-ulist:::True]",
+        "[end-ulist:::True]",
+        "[fcode-block(5,5):`:3:block:::::]",
+        "[text(6,5):A code block:]",
+        "[end-fcode-block:::3:False]",
+        "[tbreak(8,5):-::-----]",
+        "[li(9,3):4::]",
+        "[para(9,5):]",
+        "[text(9,5):another list:]",
+        "[end-para:::True]",
+        "[end-ulist:::True]",
+        "[end-block-quote:::True]",
+        "[BLANK(10,1):]",
+    ]
+    expected_gfm = """<blockquote>
+<ul>
+<li>
+<ul>
+<li>
+<hr />
+<ul>
+<li>list 1
+list 2</li>
+<li>list 3</li>
+</ul>
+</li>
+</ul>
+<pre><code class="language-block">A code block
+</code></pre>
+<hr />
+</li>
+<li>another list</li>
+</ul>
+</blockquote>"""
+
+    # Act & Assert
+    act_and_assert(source_markdown, expected_gfm, expected_tokens, show_debug=False)
+    # assert False
+
+
+@pytest.mark.skip
+@pytest.mark.gfm
+def test_extra_052l1():
+    """
+    TBD
+    bad_fenced_block_in_list_in_list_in_block_quote_with_previous_list_double_drop
+    """
+
+    # Arrange
+    source_markdown = """> + + -----
+>     + list 1
+>       list 2
+>     + list 3
+>
+>   ```block
+>   A code block
+>   ```
+>
+>   -----
+> + another list
+"""
+    expected_tokens = [
+        "[block-quote(1,1)::> \n> \n> \n> \n>\n> \n> \n> \n>\n> \n> ]",
+        "[ulist(1,3):+::4::  \n  \n\n  ]",
+        "[ulist(1,5):+::6:  ]",
+        "[tbreak(1,7):-::-----]",
+        "[ulist(2,7):+::8:    :      \n\n  ]",
+        "[para(2,9):\n]",
+        "[text(2,9):list 1\nlist 2::\n]",
+        "[end-para:::True]",
+        "[li(4,7):8:    :]",
+        "[para(4,9):]",
+        "[text(4,9):list 3:]",
+        "[end-para:::True]",
+        "[BLANK(5,2):]",
+        "[end-ulist:::True]",
+        "[end-ulist:::True]",
+        "[fcode-block(6,5):`:3:block:::::]",
+        "[text(7,5):A code block:]",
+        "[end-fcode-block:::3:False]",
+        "[BLANK(9,2):]",
+        "[tbreak(10,5):-::-----]",
+        "[li(11,3):4::]",
+        "[para(11,5):]",
+        "[text(11,5):another list:]",
+        "[end-para:::True]",
+        "[end-ulist:::True]",
+        "[end-block-quote:::True]",
+        "[BLANK(12,1):]",
+    ]
+    expected_gfm = """<blockquote>
+<ul>
+<li>
+<ul>
+<li>
+<hr />
+<ul>
+<li>list 1
+list 2</li>
+<li>list 3</li>
+</ul>
+</li>
+</ul>
+<pre><code class="language-block">A code block
+</code></pre>
+<hr />
+</li>
+<li>
+<p>another list</p>
+</li>
+</ul>
+</blockquote>"""
+
+    # Act & Assert
+    act_and_assert(source_markdown, expected_gfm, expected_tokens, show_debug=False)
+    # assert False
+
+
+@pytest.mark.skip
+@pytest.mark.gfm
+def test_extra_052m0():
+    """
+    TBD
+    bad_fenced_block_in_list_in_list_in_block_quote_with_previous_list_double_drop
+    """
+
+    # Arrange
+    source_markdown = """> + + -----
+>     + list 1
+>       list 2
+>     + list 3
+>   -----
+>   ```block
+>   A code block
+>   ```
+>   -----
+> + another list
+"""
+    expected_tokens = [
+        "[block-quote(1,1)::> \n> \n> \n> \n> \n> \n> \n> \n> \n> ]",
+        "[ulist(1,3):+::4::  \n  \n  \n  ]",
+        "[ulist(1,5):+::6:  ]",
+        "[tbreak(1,7):-::-----]",
+        "[ulist(2,7):+::8:    :      \n  ]",
+        "[para(2,9):\n]",
+        "[text(2,9):list 1\nlist 2::\n]",
+        "[end-para:::True]",
+        "[li(4,7):8:    :]",
+        "[para(4,9):]",
+        "[text(4,9):list 3:]",
+        "[end-para:::False]",
+        "[end-ulist:::True]",
+        "[end-ulist:::True]",
+        "[tbreak(5,5):-::-----]",
+        "[fcode-block(6,5):`:3:block:::::]",
+        "[text(7,5):A code block:]",
+        "[end-fcode-block:::3:False]",
+        "[tbreak(9,5):-::-----]",
+        "[li(10,3):4::]",
+        "[para(10,5):]",
+        "[text(10,5):another list:]",
+        "[end-para:::True]",
+        "[end-ulist:::True]",
+        "[end-block-quote:::True]",
+        "[BLANK(11,1):]",
+    ]
+    expected_gfm = """<blockquote>
+<ul>
+<li>
+<ul>
+<li>
+<hr />
+<ul>
+<li>list 1
+list 2</li>
+<li>list 3</li>
+</ul>
+</li>
+</ul>
+<hr />
+<pre><code class="language-block">A code block
+</code></pre>
+<hr />
+</li>
+<li>another list</li>
+</ul>
+</blockquote>"""
+
+    # Act & Assert
+    act_and_assert(source_markdown, expected_gfm, expected_tokens, show_debug=False)
+    # assert False
+
+
+@pytest.mark.skip
+@pytest.mark.gfm
+def test_extra_052m1():
+    """
+    TBD
+    bad_fenced_block_in_list_in_list_in_block_quote_with_previous_list_double_drop
+    """
+
+    # Arrange
+    source_markdown = """> + + -----
+>     + list 1
+>       list 2
+>     + list 3
+>   -----
+>
+>   ```block
+>   A code block
+>   ```
+>
+>   -----
+> + another list
+"""
+    expected_tokens = [
+        "[block-quote(1,1)::> \n> \n> \n> \n> \n>\n> \n> \n> \n>\n> \n> ]",
+        "[ulist(1,3):+::4::\n  \n  \n  \n\n  ]",
+        "[ulist(1,5):+::6:  ]",
+        "[tbreak(1,7):-::-----]",
+        "[ulist(2,7):+::8:    :      \n  ]",
+        "[para(2,9):\n]",
+        "[text(2,9):list 1\nlist 2::\n]",
+        "[end-para:::True]",
+        "[li(4,7):8:    :]",
+        "[para(4,9):]",
+        "[text(4,9):list 3:]",
+        "[end-para:::False]",
+        "[end-ulist:::True]",
+        "[end-ulist:::True]",
+        "[tbreak(5,5):-::-----]",
+        "[BLANK(6,2):]",
+        "[fcode-block(7,5):`:3:block:::::]",
+        "[text(8,5):A code block:]",
+        "[end-fcode-block:::3:False]",
+        "[BLANK(10,2):]",
+        "[tbreak(11,5):-::-----]",
+        "[li(12,3):4::]",
+        "[para(12,5):]",
+        "[text(12,5):another list:]",
+        "[end-para:::True]",
+        "[end-ulist:::True]",
+        "[end-block-quote:::True]",
+        "[BLANK(13,1):]",
+    ]
+    expected_gfm = """<blockquote>
+<ul>
+<li>
+<ul>
+<li>
+<hr />
+<ul>
+<li>list 1
+list 2</li>
+<li>list 3</li>
+</ul>
+</li>
+</ul>
+<hr />
+<pre><code class="language-block">A code block
+</code></pre>
+<hr />
+</li>
+<li>
+<p>another list</p>
+</li>
+</ul>
+</blockquote>"""
+
+    # Act & Assert
+    act_and_assert(source_markdown, expected_gfm, expected_tokens, show_debug=False)
+    # assert False
+
+
+@pytest.mark.gfm
+def test_extra_052n0():
+    """
+    TBD
+    bad_fenced_block_in_list_in_list_with_previous_inner_block_double_drop_with_thematics
+    """
+
+    # Arrange
+    source_markdown = """+ + list 1
+    > block 2.1
+    > block 2.2
+  ----
+  ```block
+  A code block
+  ```
+  ----
+  another list
+"""
+    expected_tokens = [
+        "[ulist(1,1):+::2::  \n  \n  \n  \n  \n]",
+        "[ulist(1,3):+::4:  :\n\n]",
+        "[para(1,5):]",
+        "[text(1,5):list 1:]",
+        "[end-para:::True]",
+        "[block-quote(2,5):    :    > \n    > ]",
+        "[para(2,7):\n]",
+        "[text(2,7):block 2.1\nblock 2.2::\n]",
+        "[end-para:::True]",
+        "[end-block-quote:::True]",
+        "[end-ulist:::True]",
+        "[tbreak(4,3):-::----]",
+        "[fcode-block(5,3):`:3:block:::::]",
+        "[text(6,3):A code block:]",
+        "[end-fcode-block:::3:False]",
+        "[tbreak(8,3):-::----]",
+        "[para(9,3):]",
+        "[text(9,3):another list:]",
+        "[end-para:::True]",
+        "[BLANK(10,1):]",
+        "[end-ulist:::True]",
+    ]
+    expected_gfm = """<ul>
+<li>
+<ul>
+<li>list 1
+<blockquote>
+<p>block 2.1
+block 2.2</p>
+</blockquote>
+</li>
+</ul>
+<hr />
+<pre><code class="language-block">A code block
+</code></pre>
+<hr />
+another list</li>
+</ul>"""
+
+    # Act & Assert
+    act_and_assert(source_markdown, expected_gfm, expected_tokens, show_debug=False)
+    # assert False
+
+
+@pytest.mark.skip
+@pytest.mark.gfm
+def test_extra_052n1():
+    """
+    TBD
+    bad_fenced_block_in_list_in_list_with_previous_inner_block_double_drop_with_thematics
+    """
+
+    # Arrange
+    source_markdown = """+ + list 1
+    > block 2.1
+    > block 2.2
+  ----
+
+  ```block
+  A code block
+  ```
+
+  ----
+  another list
+"""
+    expected_tokens = [
+        "[ulist(1,1):+::2::\n  \n  \n  \n\n  \n  \n]",
+        "[ulist(1,3):+::4:  :\n\n]",
+        "[para(1,5):]",
+        "[text(1,5):list 1:]",
+        "[end-para:::True]",
+        "[block-quote(2,5):    :    > \n    > ]",
+        "[para(2,7):\n]",
+        "[text(2,7):block 2.1\nblock 2.2::\n]",
+        "[end-para:::True]",
+        "[end-block-quote:::True]",
+        "[end-ulist:::True]",
+        "[tbreak(4,3):-::----]",
+        "[BLANK(5,1):]",
+        "[fcode-block(6,3):`:3:block:::::]",
+        "[text(7,3):A code block:]",
+        "[end-fcode-block:::3:False]",
+        "[BLANK(9,1):]",
+        "[tbreak(10,3):-::----]",
+        "[para(11,3):]",
+        "[text(11,3):another list:]",
+        "[end-para:::True]",
+        "[BLANK(12,1):]",
+        "[end-ulist:::True]",
+    ]
+    expected_gfm = """<ul>
+<li>
+<ul>
+<li>list 1
+<blockquote>
+<p>block 2.1
+block 2.2</p>
+</blockquote>
+</li>
+</ul>
+<hr />
+<pre><code class="language-block">A code block
+</code></pre>
+<hr />
+<p>another list</p>
+</li>
+</ul>"""
+
+    # Act & Assert
+    act_and_assert(source_markdown, expected_gfm, expected_tokens, show_debug=False)
+    # assert False
+
+
+@pytest.mark.skip
+@pytest.mark.gfm
+def test_extra_052p0():
+    """
+    TBD
+    bad_fenced_block_in_block_quote_in_list_in_list_with_previous_block_triple_drop
+    """
+
+    # Arrange
+    source_markdown = """+ + > -----
+    > > block 1
+    > > block 2
+  ```block
+  A code block
+  ```
+  -----
+  another list
+"""
+    expected_tokens = [
+        "[ulist(1,1):+::2::  \n  \n  \n  \n]",
+        "[ulist(1,3):+::4:  :\n\n]",
+        "[block-quote(1,5):    :    > ]",
+        "[tbreak(1,7):-::-----]",
+        "[block-quote(2,5):    :    > > \n    > > ]",
+        "[para(2,9):\n]",
+        "[text(2,9):block 1\nblock 2::\n]",
+        "[end-para:::True]",
+        "[end-block-quote:::True]",
+        "[end-block-quote:::True]",
+        "[end-ulist:::True]",
+        "[fcode-block(4,3):`:3:block:::::]",
+        "[text(5,3):A code block:]",
+        "[end-fcode-block:::3:False]",
+        "[tbreak(7,3):-::-----]",
+        "[para(8,3):]",
+        "[text(8,3):another list:]",
+        "[end-para:::True]",
+        "[BLANK(9,1):]",
+        "[end-ulist:::True]",
+    ]
+    expected_gfm = """<ul>
+<li>
+<ul>
+<li>
+<blockquote>
+<hr />
+<blockquote>
+<p>block 1
+block 2</p>
+</blockquote>
+</blockquote>
+</li>
+</ul>
+<pre><code class="language-block">A code block
+</code></pre>
+<hr />
+another list</li>
+</ul>"""
+
+    # Act & Assert
+    act_and_assert(source_markdown, expected_gfm, expected_tokens, show_debug=False)
+    # assert False
+
+
+@pytest.mark.skip
+@pytest.mark.gfm
+def test_extra_052q0():
+    """
+    TBD
+    bad_fenced_block_in_block_quote_in_list_in_list_with_previous_block_triple_drop_and_thematics
+    """
+
+    # Arrange
+    source_markdown = """+ + > -----
+    > > block 1
+    > > block 2
+  ```block
+  A code block
+  ```
+  -----
+  another list
+"""
+    expected_tokens = [
+        "[ulist(1,1):+::2::  \n  \n  \n  \n]",
+        "[ulist(1,3):+::4:  :\n\n]",
+        "[block-quote(1,5):    :    > ]",
+        "[tbreak(1,7):-::-----]",
+        "[block-quote(2,5):    :    > > \n    > > ]",
+        "[para(2,9):\n]",
+        "[text(2,9):block 1\nblock 2::\n]",
+        "[end-para:::True]",
+        "[end-block-quote:::True]",
+        "[end-block-quote:::True]",
+        "[end-ulist:::True]",
+        "[fcode-block(4,3):`:3:block:::::]",
+        "[text(5,3):A code block:]",
+        "[end-fcode-block:::3:False]",
+        "[tbreak(7,3):-::-----]",
+        "[para(8,3):]",
+        "[text(8,3):another list:]",
+        "[end-para:::True]",
+        "[BLANK(9,1):]",
+        "[end-ulist:::True]",
+    ]
+    expected_gfm = """<ul>
+<li>
+<ul>
+<li>
+<blockquote>
+<hr />
+<blockquote>
+<p>block 1
+block 2</p>
+</blockquote>
+</blockquote>
+</li>
+</ul>
+<pre><code class="language-block">A code block
+</code></pre>
+<hr />
+another list</li>
+</ul>"""
+
+    # Act & Assert
+    act_and_assert(source_markdown, expected_gfm, expected_tokens, show_debug=False)
+    # assert False
+
+
+@pytest.mark.skip
+@pytest.mark.gfm
+def test_extra_052r0():
+    """
+    TBD
+    bad_fenced_block_in_block_quote_in_list_in_list_with_previous_list_triple_drop
+    """
+
+    # Arrange
+    source_markdown = """+ + > -----
+    > + list 1
+    >   list 2
+    > + list 3
+  ```block
+  A code block
+  ```
+  -----
+  another list
+"""
+    expected_tokens = [
+        "[ulist(1,1):+::2::  \n  \n  \n  \n]",
+        "[ulist(1,3):+::4:  :]",
+        "[block-quote(1,5):    :    > \n    > \n    > \n    > ]",
+        "[tbreak(1,7):-::-----]",
+        "[ulist(2,7):+::8::  ]",
+        "[para(2,9):\n]",
+        "[text(2,9):list 1\nlist 2::\n]",
+        "[end-para:::True]",
+        "[li(4,7):8::]",
+        "[para(4,9):]",
+        "[text(4,9):list 3:]",
+        "[end-para:::True]",
+        "[end-ulist:::True]",
+        "[end-block-quote:::True]",
+        "[end-ulist:::True]",
+        "[fcode-block(5,3):`:3:block:::::]",
+        "[text(6,3):A code block:]",
+        "[end-fcode-block:::3:False]",
+        "[tbreak(8,3):-::-----]",
+        "[para(9,3):]",
+        "[text(9,3):another list:]",
+        "[end-para:::True]",
+        "[BLANK(10,1):]",
+        "[end-ulist:::True]",
+    ]
+    expected_gfm = """<ul>
+<li>
+<ul>
+<li>
+<blockquote>
+<hr />
+<ul>
+<li>list 1
+list 2</li>
+<li>list 3</li>
+</ul>
+</blockquote>
+</li>
+</ul>
+<pre><code class="language-block">A code block
+</code></pre>
+<hr />
+another list</li>
+</ul>"""
+
+    # Act & Assert
+    act_and_assert(source_markdown, expected_gfm, expected_tokens, show_debug=False)
+    # assert False
+
+
+@pytest.mark.gfm
+def test_extra_052s0():
+    """
+    TBD
+    bad_fenced_block_in_block_quote_in_list_in_list_with_previous_list_double_drop_and_thematics
+    """
+
+    # Arrange
+    source_markdown = """+ + > -----
+    > + list 1
+    >   list 2
+    > + list 3
+    -----
+    ```block
+    A code block
+    ```
+    -----
+  + another list
+"""
+    expected_tokens = [
+        "[ulist(1,1):+::2:]",
+        "[ulist(1,3):+::4:  :    \n    \n    \n    \n    \n]",
+        "[block-quote(1,5):    :    > \n    > \n    > \n    > ]",
+        "[tbreak(1,7):-::-----]",
+        "[ulist(2,7):+::8::  ]",
+        "[para(2,9):\n]",
+        "[text(2,9):list 1\nlist 2::\n]",
+        "[end-para:::True]",
+        "[li(4,7):8::]",
+        "[para(4,9):]",
+        "[text(4,9):list 3:]",
+        "[end-para:::True]",
+        "[end-ulist:::True]",
+        "[end-block-quote:::True]",
+        "[tbreak(5,5):-::-----]",
+        "[fcode-block(6,5):`:3:block:::::]",
+        "[text(7,5):A code block:]",
+        "[end-fcode-block:::3:False]",
+        "[tbreak(9,5):-::-----]",
+        "[li(10,3):4:  :]",
+        "[para(10,5):]",
+        "[text(10,5):another list:]",
+        "[end-para:::True]",
+        "[BLANK(11,1):]",
+        "[end-ulist:::True]",
+        "[end-ulist:::True]",
+    ]
+    expected_gfm = """<ul>
+<li>
+<ul>
+<li>
+<blockquote>
+<hr />
+<ul>
+<li>list 1
+list 2</li>
+<li>list 3</li>
+</ul>
+</blockquote>
+<hr />
+<pre><code class="language-block">A code block
+</code></pre>
+<hr />
+</li>
+<li>another list</li>
+</ul>
+</li>
+</ul>"""
+
+    # Act & Assert
+    act_and_assert(source_markdown, expected_gfm, expected_tokens, show_debug=False)
+    # assert False
+
+
+@pytest.mark.gfm
+def test_extra_052s1():
+    """
+    TBD
+    bad_fenced_block_in_block_quote_in_list_in_list_with_previous_list_double_drop_and_thematics
+    """
+
+    # Arrange
+    source_markdown = """+ + > -----
+    > + list 1
+    >   list 2
+    > + list 3
+    -----
+
+    ```block
+    A code block
+    ```
+
+    -----
+  + another list
+"""
+    expected_tokens = [
+        "[ulist(1,1):+::2:]",
+        "[ulist(1,3):+::4:  :    \n\n    \n    \n    \n\n    \n]",
+        "[block-quote(1,5):    :    > \n    > \n    > \n    > ]",
+        "[tbreak(1,7):-::-----]",
+        "[ulist(2,7):+::8::  ]",
+        "[para(2,9):\n]",
+        "[text(2,9):list 1\nlist 2::\n]",
+        "[end-para:::True]",
+        "[li(4,7):8::]",
+        "[para(4,9):]",
+        "[text(4,9):list 3:]",
+        "[end-para:::True]",
+        "[end-ulist:::True]",
+        "[end-block-quote:::True]",
+        "[tbreak(5,5):-::-----]",
+        "[BLANK(6,1):]",
+        "[fcode-block(7,5):`:3:block:::::]",
+        "[text(8,5):A code block:]",
+        "[end-fcode-block:::3:False]",
+        "[BLANK(10,1):]",
+        "[tbreak(11,5):-::-----]",
+        "[li(12,3):4:  :]",
+        "[para(12,5):]",
+        "[text(12,5):another list:]",
+        "[end-para:::True]",
+        "[BLANK(13,1):]",
+        "[end-ulist:::True]",
+        "[end-ulist:::True]",
+    ]
+    expected_gfm = """<ul>
+<li>
+<ul>
+<li>
+<blockquote>
+<hr />
+<ul>
+<li>list 1
+list 2</li>
+<li>list 3</li>
+</ul>
+</blockquote>
+<hr />
+<pre><code class="language-block">A code block
+</code></pre>
+<hr />
+</li>
+<li>
+<p>another list</p>
+</li>
+</ul>
+</li>
+</ul>"""
+
+    # Act & Assert
+    act_and_assert(source_markdown, expected_gfm, expected_tokens, show_debug=False)
+    # assert False
+
+
+@pytest.mark.skip
+@pytest.mark.gfm
+def test_extra_052t0():
+    """
+    TBD
+    bad_fenced_block_in_block_quote_in_list_in_list_with_previous_list_triple_drop_and_thematics
+    """
+
+    # Arrange
+    source_markdown = """+ + > -----
+    > + list 1
+    >   list 2
+    > + list 3
+  -----
+  ```block
+  A code block
+  ```
+  -----
+  another list
+"""
+    expected_tokens = [
+        "[ulist(1,1):+::2::  \n  \n  \n  \n  \n]",
+        "[ulist(1,3):+::4:  :]",
+        "[block-quote(1,5):    :    > \n    > \n    > \n    > ]",
+        "[tbreak(1,7):-::-----]",
+        "[ulist(2,7):+::8::  ]",
+        "[para(2,9):\n]",
+        "[text(2,9):list 1\nlist 2::\n]",
+        "[end-para:::True]",
+        "[li(4,7):8::]",
+        "[para(4,9):]",
+        "[text(4,9):list 3:]",
+        "[end-para:::True]",
+        "[end-ulist:::True]",
+        "[end-block-quote:::True]",
+        "[end-ulist:::True]",
+        "[tbreak(5,3):-::-----]",
+        "[fcode-block(6,3):`:3:block:::::]",
+        "[text(7,3):A code block:]",
+        "[end-fcode-block:::3:False]",
+        "[tbreak(9,3):-::-----]",
+        "[para(10,3):]",
+        "[text(10,3):another list:]",
+        "[end-para:::True]",
+        "[BLANK(11,1):]",
+        "[end-ulist:::True]",
+    ]
+    expected_gfm = """<ul>
+<li>
+<ul>
+<li>
+<blockquote>
+<hr />
+<ul>
+<li>list 1
+list 2</li>
+<li>list 3</li>
+</ul>
+</blockquote>
+</li>
+</ul>
+<hr />
+<pre><code class="language-block">A code block
+</code></pre>
+<hr />
+another list</li>
+</ul>"""
+
+    # Act & Assert
+    act_and_assert(source_markdown, expected_gfm, expected_tokens, show_debug=False)
+    # assert False
+
+
+@pytest.mark.gfm
+def test_extra_052u0():
+    """
+    TBD
+    bad_fenced_block_in_list_in_list_in_list_with_previous_block_triple_drop
+    """
+
+    # Arrange
+    source_markdown = """+ + + -----
+      > block 1
+      > block 2
+  ```block
+  A code block
+  ```
+  -----
+  another list
+"""
+    expected_tokens = [
+        "[ulist(1,1):+::2::  \n  \n  \n  \n]",
+        "[ulist(1,3):+::4:  ]",
+        "[ulist(1,5):+::6:    :\n\n]",
+        "[tbreak(1,7):-::-----]",
+        "[block-quote(2,7):      :      > \n      > ]",
+        "[para(2,9):\n]",
+        "[text(2,9):block 1\nblock 2::\n]",
+        "[end-para:::True]",
+        "[end-block-quote:::True]",
+        "[end-ulist:::True]",
+        "[end-ulist:::True]",
+        "[fcode-block(4,3):`:3:block:::::]",
+        "[text(5,3):A code block:]",
+        "[end-fcode-block:::3:False]",
+        "[tbreak(7,3):-::-----]",
+        "[para(8,3):]",
+        "[text(8,3):another list:]",
+        "[end-para:::True]",
+        "[BLANK(9,1):]",
+        "[end-ulist:::True]",
+    ]
+    expected_gfm = """<ul>
+<li>
+<ul>
+<li>
+<ul>
+<li>
+<hr />
+<blockquote>
+<p>block 1
+block 2</p>
+</blockquote>
+</li>
+</ul>
+</li>
+</ul>
+<pre><code class="language-block">A code block
+</code></pre>
+<hr />
+another list</li>
+</ul>"""
+
+    # Act & Assert
+    act_and_assert(source_markdown, expected_gfm, expected_tokens, show_debug=False)
+    # assert False
+
+
+@pytest.mark.gfm
+def test_extra_052u1():
+    """
+    TBD
+    bad_fenced_block_in_list_in_list_in_list_with_previous_block_triple_drop
+    """
+
+    # Arrange
+    source_markdown = """+ + + -----
+      > block 1
+      > block 2
+
+  ```block
+  A code block
+  ```
+
+  -----
+  another list
+"""
+    expected_tokens = [
+        "[ulist(1,1):+::2::  \n  \n  \n\n  \n  \n]",
+        "[ulist(1,3):+::4:  ]",
+        "[ulist(1,5):+::6:    :\n\n]",
+        "[tbreak(1,7):-::-----]",
+        "[block-quote(2,7):      :      > \n      > \n]",
+        "[para(2,9):\n]",
+        "[text(2,9):block 1\nblock 2::\n]",
+        "[end-para:::True]",
+        "[end-block-quote:::True]",
+        "[BLANK(4,1):]",
+        "[end-ulist:::True]",
+        "[end-ulist:::True]",
+        "[fcode-block(5,3):`:3:block:::::]",
+        "[text(6,3):A code block:]",
+        "[end-fcode-block:::3:False]",
+        "[BLANK(8,1):]",
+        "[tbreak(9,3):-::-----]",
+        "[para(10,3):]",
+        "[text(10,3):another list:]",
+        "[end-para:::True]",
+        "[BLANK(11,1):]",
+        "[end-ulist:::True]",
+    ]
+    expected_gfm = """<ul>
+<li>
+<ul>
+<li>
+<ul>
+<li>
+<hr />
+<blockquote>
+<p>block 1
+block 2</p>
+</blockquote>
+</li>
+</ul>
+</li>
+</ul>
+<pre><code class="language-block">A code block
+</code></pre>
+<hr />
+<p>another list</p>
+</li>
+</ul>"""
+
+    # Act & Assert
+    act_and_assert(source_markdown, expected_gfm, expected_tokens, show_debug=False)
+    # assert False
+
+
+@pytest.mark.gfm
+def test_extra_052v0():
+    """
+    TBD
+    bad_fenced_block_in_list_in_list_in_list_with_previous_block_double_drop_with_thematics
+    """
+
+    # Arrange
+    source_markdown = """+ + + -----
+      > block 1
+      > block 2
+    -----
+    ```block
+    A code block
+    ```
+    -----
+  + another list
+"""
+    expected_tokens = [
+        "[ulist(1,1):+::2:]",
+        "[ulist(1,3):+::4:  :    \n    \n    \n    \n]",
+        "[ulist(1,5):+::6:    :\n\n]",
+        "[tbreak(1,7):-::-----]",
+        "[block-quote(2,7):      :      > \n      > ]",
+        "[para(2,9):\n]",
+        "[text(2,9):block 1\nblock 2::\n]",
+        "[end-para:::True]",
+        "[end-block-quote:::True]",
+        "[end-ulist:::True]",
+        "[tbreak(4,5):-::-----]",
+        "[fcode-block(5,5):`:3:block:::::]",
+        "[text(6,5):A code block:]",
+        "[end-fcode-block:::3:False]",
+        "[tbreak(8,5):-::-----]",
+        "[li(9,3):4:  :]",
+        "[para(9,5):]",
+        "[text(9,5):another list:]",
+        "[end-para:::True]",
+        "[BLANK(10,1):]",
+        "[end-ulist:::True]",
+        "[end-ulist:::True]",
+    ]
+    expected_gfm = """<ul>
+<li>
+<ul>
+<li>
+<ul>
+<li>
+<hr />
+<blockquote>
+<p>block 1
+block 2</p>
+</blockquote>
+</li>
+</ul>
+<hr />
+<pre><code class="language-block">A code block
+</code></pre>
+<hr />
+</li>
+<li>another list</li>
+</ul>
+</li>
+</ul>"""
+
+    # Act & Assert
+    act_and_assert(source_markdown, expected_gfm, expected_tokens, show_debug=False)
+    # assert False
+
+
+@pytest.mark.skip
+@pytest.mark.gfm
+def test_extra_052v1():
+    """
+    TBD
+    bad_fenced_block_in_list_in_list_in_list_with_previous_block_double_drop_with_thematics
+    """
+
+    # Arrange
+    source_markdown = """+ + + -----
+      > block 1
+      > block 2
+    -----
+
+    ```block
+    A code block
+    ```
+
+    -----
+  + another list
+"""
+    expected_tokens = [
+        "[ulist(1,1):+::2:]",
+        "[ulist(1,3):+::4:  :\n    \n    \n    \n\n    \n]",
+        "[ulist(1,5):+::6:    :\n\n]",
+        "[tbreak(1,7):-::-----]",
+        "[block-quote(2,7):      :      > \n      > ]",
+        "[para(2,9):\n]",
+        "[text(2,9):block 1\nblock 2::\n]",
+        "[end-para:::True]",
+        "[end-block-quote:::True]",
+        "[end-ulist:::True]",
+        "[tbreak(4,5):-::-----]",
+        "[BLANK(5,1):]",
+        "[fcode-block(6,5):`:3:block:::::]",
+        "[text(7,5):A code block:]",
+        "[end-fcode-block:::3:False]",
+        "[BLANK(9,1):]",
+        "[tbreak(10,5):-::-----]",
+        "[li(11,3):4:  :]",
+        "[para(11,5):]",
+        "[text(11,5):another list:]",
+        "[end-para:::True]",
+        "[BLANK(12,1):]",
+        "[end-ulist:::True]",
+        "[end-ulist:::True]",
+    ]
+    expected_gfm = """<ul>
+<li>
+<ul>
+<li>
+<ul>
+<li>
+<hr />
+<blockquote>
+<p>block 1
+block 2</p>
+</blockquote>
+</li>
+</ul>
+<hr />
+<pre><code class="language-block">A code block
+</code></pre>
+<hr />
+</li>
+<li>
+<p>another list</p>
+</li>
+</ul>
+</li>
+</ul>"""
+
+    # Act & Assert
+    act_and_assert(source_markdown, expected_gfm, expected_tokens, show_debug=False)
+    # assert False
+
+
+@pytest.mark.gfm
+def test_extra_052w0():
+    """
+    TBD
+    bad_fenced_block_in_list_in_list_in_list_with_previous_list_triple_drop
+    """
+
+    # Arrange
+    source_markdown = """+ + + -----
+      + list 1
+        list 2
+      + list 3
+  ```block
+  A code block
+  ```
+  another list
+"""
+    expected_tokens = [
+        "[ulist(1,1):+::2::  \n  \n  \n  \n]",
+        "[ulist(1,3):+::4:  ]",
+        "[ulist(1,5):+::6:    ]",
+        "[tbreak(1,7):-::-----]",
+        "[ulist(2,7):+::8:      :        ]",
+        "[para(2,9):\n]",
+        "[text(2,9):list 1\nlist 2::\n]",
+        "[end-para:::True]",
+        "[li(4,7):8:      :]",
+        "[para(4,9):]",
+        "[text(4,9):list 3:]",
+        "[end-para:::True]",
+        "[end-ulist:::True]",
+        "[end-ulist:::True]",
+        "[end-ulist:::True]",
+        "[fcode-block(5,3):`:3:block:::::]",
+        "[text(6,3):A code block:]",
+        "[end-fcode-block:::3:False]",
+        "[para(8,3):]",
+        "[text(8,3):another list:]",
+        "[end-para:::True]",
+        "[BLANK(9,1):]",
+        "[end-ulist:::True]",
+    ]
+    expected_gfm = """<ul>
+<li>
+<ul>
+<li>
+<ul>
+<li>
+<hr />
+<ul>
+<li>list 1
+list 2</li>
+<li>list 3</li>
+</ul>
+</li>
+</ul>
+</li>
+</ul>
+<pre><code class="language-block">A code block
+</code></pre>
+another list</li>
+</ul>"""
+
+    # Act & Assert
+    act_and_assert(source_markdown, expected_gfm, expected_tokens, show_debug=False)
+    # assert False
+
+
+@pytest.mark.gfm
+def test_extra_052w1():
+    """
+    TBD
+    bad_fenced_block_in_list_in_list_in_list_with_previous_list_triple_drop
+    """
+
+    # Arrange
+    source_markdown = """+ + + -----
+      + list 1
+        list 2
+      + list 3
+
+  ```block
+  A code block
+  ```
+
+  another list
+"""
+    expected_tokens = [
+        "[ulist(1,1):+::2::  \n  \n  \n\n  \n]",
+        "[ulist(1,3):+::4:  ]",
+        "[ulist(1,5):+::6:    ]",
+        "[tbreak(1,7):-::-----]",
+        "[ulist(2,7):+::8:      :        \n]",
+        "[para(2,9):\n]",
+        "[text(2,9):list 1\nlist 2::\n]",
+        "[end-para:::True]",
+        "[li(4,7):8:      :]",
+        "[para(4,9):]",
+        "[text(4,9):list 3:]",
+        "[end-para:::True]",
+        "[BLANK(5,1):]",
+        "[end-ulist:::True]",
+        "[end-ulist:::True]",
+        "[end-ulist:::True]",
+        "[fcode-block(6,3):`:3:block:::::]",
+        "[text(7,3):A code block:]",
+        "[end-fcode-block:::3:False]",
+        "[BLANK(9,1):]",
+        "[para(10,3):]",
+        "[text(10,3):another list:]",
+        "[end-para:::True]",
+        "[BLANK(11,1):]",
+        "[end-ulist:::True]",
+    ]
+    expected_gfm = """<ul>
+<li>
+<ul>
+<li>
+<ul>
+<li>
+<hr />
+<ul>
+<li>list 1
+list 2</li>
+<li>list 3</li>
+</ul>
+</li>
+</ul>
+</li>
+</ul>
+<pre><code class="language-block">A code block
+</code></pre>
+<p>another list</p>
+</li>
+</ul>"""
+
+    # Act & Assert
+    act_and_assert(source_markdown, expected_gfm, expected_tokens, show_debug=False)
+    # assert False
+
+
+@pytest.mark.gfm
+def test_extra_999():
+    """
+    Temporary test to keep coverage up while consistency checks disabled.
+    """
+
+    new_position = PositionMarker(1, 0, "text")
+
+    new_block_quote = BlockQuoteMarkdownToken("", new_position)
+    ex_ws = new_block_quote.extracted_whitespace
+    assert not ex_ws
+
+    new_front_matter = FrontMatterMarkdownToken("--", "--", ["a: b"], {}, new_position)
+    new_value = new_front_matter.calculate_block_token_height(new_front_matter)
+    assert new_value != 999
+    new_value = new_front_matter.calculate_initial_whitespace()
+    assert new_value != 999
+    assert new_front_matter.is_extension
+
+    ParserHelper.count_newlines_in_texts("text")
+
+
+# FOOBAR1 bad_fenced_block_in_list_in_block_quote_in_block_quote_with_previous_list_triple_drop_and_thematics
+# Expected:> > + ______\n> >   + list 1\n> >     list 2\n> >   + list 3\n> ______\n>\n> ```block\n> A code block\n> ```\n>\n> ______\n:
+#   Actual:> > + ______\n> >   + list 1\n> >     list 2\n> >   + list 3\n> ______\n> \n>```block\n> A code block\n> ```\n> \n>______\n:
+# -> bq and list
+
+# FOOBAR2 bad_fenced_block_in_list_in_block_quote_in_list_with_previous_block_double_drop
+# Expected:1. > + ----\n   >   > block 1\n   >   > block 2\n   >\n   > ```block\n   > A code block\n   > ```\n   >\n   > ----\n:
+#   Actual:1. > + ----\n   >   > block 1\n   >   > block 2\n   >\n   > ```block\n   > A code block\n   >```\n   >\n   > ----\n:
+
+# FOOBAR3 bad_fenced_block_in_block_quote_in_block_quote_in_list_with_previous_list_double_drop_with_thematics
+# Expected:1. > > ----\n   > > + list 1\n   > >   list 2\n   > > + list 3\n   > ----\n   >\n   > ```block\n   > A code block\n   > ```\n   >\n   > ----\n:
+#   Actual:1. > > ----\n   > > + list 1\n   > >   list 2\n   > > + list 3\n   > ----\n   > \n   >```block\n   > A code block\n   > ```\n   > \n   >----\n:
+
+# FOOBAR4 bad_fenced_block_in_block_quote_in_block_quote_in_list_with_previous_list_triple_drop_with_thematics
+# Expected:1. > > ----\n   > > + list 1\n   > >   list 2\n   > > + list 3\n   ----\n\n   ```block\n   A code block\n   ```\n\n   ----\n:
+#   Actual:1. > > ----\n   > > + list 1\n   > >   list 2\n   > > + list 3\n   ----\n   \n```block\n   A code block\n   ```\n   \n----\n:
+
+# FOOBAR5
+# bad_fenced_block_in_block_quote_in_list_in_block_quote_with_previous_list_double_drop_and_thematics
+# Expected:> + > -----\n>   > + list 1\n>   >   list 2\n>   > + list 3\n>   -----\n>\n>   ```block\n>   A code block\n>   ```\n>\n>   -----\n> + another list\n:
+#   Actual:> + > -----\n>   > + list 1\n>   >   list 2\n>   > + list 3\n>   -----\n> \n>  ```block\n>   A code block\n>   ```\n> \n>  -----\n> + another list\n:
+
+# FOOBAR6
+# bad_fenced_block_in_list_in_list_in_block_quote_with_previous_block_double_drop_with_thematics
+# Expected:> + + -----\n>     > block 1\n>     > block 2\n>   -----\n>\n>   ```block\n>   A code block\n>   ```\n>\n>   -----\n> + another list\n:
+#   Actual:> + + -----\n>     > block 1\n>     > block 2\n>   -----\n> \n>```block\n> A code block\n> ```\n>\n> -----\n> + another list\n:
+
+# FOOBAR7
 # bad_fenced_block_in_list_in_list_in_block_quote_with_previous_block_triple_drop_with_thematics
-# bad_fenced_block_in_list_in_list_in_block_quote_with_previous_list_double_drop
-# bad_fenced_block_in_list_in_list_in_block_quote_with_previous_list_double_drop_and_thematics
+# Expected:> + + -----\n>     > block 1\n>     > block 2\n> -----\n>\n> ```block\n> A code block\n> ```\n>\n> -----\n> another list\n:
+#   Actual:> + + -----\n>     > block 1\n>     > block 2\n> -----\n> \n>```block\n> A code block\n> ```\n> \n>-----\n> another list\n:
+
+# FOOBAR8
+# bad_fenced_block_in_list_in_list_with_previous_inner_block_double_drop
+# Expected:+ + list 1\n    > block 2.1\n    > block 2.2\n\n  ```block\n  A code block\n  ```\n\n  another list\n:
+#   Actual:+ + list 1\n    > block 2.1\n    > block 2.2\n\n  ```block\n  A code block\n```\n  \nanother list\n:
+
+# FOOBAR9
+# bad_fenced_block_in_block_quote_in_list_in_list_with_previous_list_double_drop_and_thematics
+# Expected:+ + > -----\n    > + list 1\n    >   list 2\n    > + list 3\n    -----\n\n    ```block\n    A code block\n    ```\n\n    -----\n  + another list\n:
+#   Actual:+ + > -----\n    > + list 1\n    >   list 2\n    > + list 3\n    -----\n    \n```block\n    A code block\n    ```\n    \n-----\n  + another list\n:
+
+# FOOBAR10
 # bad_fenced_block_in_list_in_list_in_list_with_previous_block_double_drop
-# bad_fenced_block_in_list_in_list_in_list_with_previous_block_double_drop_with_thematics
+# Expected:+ + + -----\n      > block 1\n      > block 2\n\n    ```block\n    A code block\n    ```\n\n    -----\n  + another list\n:
+#   Actual:+ + + -----\n      > block 1\n      > block 2\n\n    ```block\n    A code block\n```\n    \n-----\n  + another list\n:
+
+# FOOBAR11
 # bad_fenced_block_in_list_in_list_in_list_with_previous_block_triple_drop
+# Expected:+ + + -----\n      > block 1\n      > block 2\n\n  ```block\n  A code block\n  ```\n\n  -----\n  another list\n:
+#   Actual:+ + + -----\n      > block 1\n      > block 2\n\n  ```block\n  A code block\n```\n  \n  -----\nanother list\n:
+
+# FOOBAR12
 # bad_fenced_block_in_list_in_list_in_list_with_previous_list_double_drop
+# Expected:+ + + -----\n      + list 1\n        list 2\n      + list 3\n\n    ```block\n    A code block\n    ```\n\n  + another list\n:
+#   Actual:+ + + -----\n      + list 1\n        list 2\n      + list 3\n\n    ```block\n    A code block\n```\n    \n  + another list\n:
+
+# FOOBAR13
 # bad_fenced_block_in_list_in_list_in_list_with_previous_list_triple_drop
-# bad_fenced_block_in_list_in_list_with_previous_inner_block_double_drop
+# Expected:+ + + -----\n      + list 1\n        list 2\n      + list 3\n\n  ```block\n  A code block\n  ```\n\n  another list\n:
+#   Actual:+ + + -----\n      + list 1\n        list 2\n      + list 3\n\n  ```block\n  A code block\n```\n  \n  another list\n:
+
+# FOOBAR14
+# bad_fenced_block_in_block_quote_in_list_with_previous_inner_list_double_drop
+
+# NONCOMP1
+# bad_fenced_block_in_list_in_list_in_block_quote_with_previous_list_double_drop
+# Expected:> + + -----\n>     + list 1\n>       list 2\n>     + list 3\n>\n>   ```block\n>   A code block\n>   ```\n>\n>   -----\n> + another list\n:
+#   Actual:> + + -----\n>     + list 1\n>       list 2\n>     + list 3\n> \n> ```block\n> A code block\n> ```\n>  \n> -----\n> + another list\n:
+
+# NONCOMP2
+# bad_fenced_block_in_list_in_list_in_block_quote_with_previous_list_double_drop_and_thematics
+# Expected:> + + -----\n>     + list 1\n>       list 2\n>     + list 3\n>   -----\n>\n>   ```block\n>   A code block\n>   ```\n>\n>   -----\n> + another list\n:
+#   Actual:> + + -----\n>     + list 1\n>       list 2\n>     + list 3\n> -----\n>\n> ```block\n>   A code block\n> ```\n>\n> -----\n> + another list\n:
+
+# NONCOMP3
 # bad_fenced_block_in_list_in_list_with_previous_inner_block_double_drop_with_thematics
-# bad_fenced_block_in_list_in_list_with_previous_inner_block_triple_drop_with_thematics
+# Expected:+ + list 1\n    > block 2.1\n    > block 2.2\n  ----\n\n  ```block\n  A code block\n  ```\n\n  ----\n  another list\n:
+#   Actual:+ + list 1\n    > block 2.1\n    > block 2.2\n----\n\n  ```block\n  A code block\n  ```\n\n  ----\n  another list\n:
+
+# NONCOMP4
+# bad_fenced_block_in_block_quote_in_list_in_list_with_previous_block_triple_drop
+# Expected:+ + > -----\n    > > block 1\n    > > block 2\n\n  ```block\n  A code block\n  ```\n\n  -----\n  another list\n:
+#   Actual:+ + > -----\n    > > block 1\n    > > block 2\n\n  ```block\n  A code block\n```\n  \n  -----\nanother list\n:
+
+# NONCOMP5
+# bad_fenced_block_in_block_quote_in_list_in_list_with_previous_block_triple_drop_and_thematics
+# Expected:+ + > -----\n    > > block 1\n    > > block 2\n  -----\n\n  ```block\n  A code block\n  ```\n\n  -----\n  another list\n:
+#   Actual:+ + > -----\n    > > block 1\n    > > block 2\n-----\n  \n  ```block\n  A code block\n```\n  \n  -----\nanother list\n:
+
+# NONCOMP6
+# bad_fenced_block_in_block_quote_in_list_in_list_with_previous_list_triple_drop
+# Expected:+ + > -----\n    > + list 1\n    >   list 2\n    > + list 3\n\n  ```block\n  A code block\n  ```\n\n  -----\n  another list\n:
+#   Actual:+ + > -----\n    > + list 1\n    >   list 2\n    > + list 3\n\n  ```block\n  A code block\n```\n  \n  -----\nanother list\n:
+
+# NONCOMP7
+# bad_fenced_block_in_block_quote_in_list_in_list_with_previous_list_triple_drop_and_thematics
+# Expected:+ + > -----\n    > + list 1\n    >   list 2\n    > + list 3\n  -----\n\n  ```block\n  A code block\n  ```\n\n  -----\n  another list\n:
+#   Actual:+ + > -----\n    > + list 1\n    >   list 2\n    > + list 3\n-----\n  \n  ```block\n  A code block\n```\n  \n  -----\nanother list\n:
+
+# NONCOMP8
+# bad_fenced_block_in_list_in_list_in_list_with_previous_block_double_drop_with_thematics
+# Expected:+ + + -----\n      > block 1\n      > block 2\n    -----\n\n    ```block\n    A code block\n    ```\n\n    -----\n  + another list\n:
+#   Actual:+ + + -----\n      > block 1\n      > block 2\n-----\n\n    ```block\n    A code block\n    ```\n\n    -----\n+ another list\n:
+
+# SNAFU1
+# bad_fenced_block_in_block_quote_in_list_in_block_quote_with_previous_blockx
+# File "c:\enlistments\pymarkdown\pymarkdown\transform_markdown\transform_containers.py", line 2061, in __adjust
+# assert inner_token_index < len(split_leading_spaces)
+#        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+# SNAFU2
+# bad_fenced_block_in_block_quote_in_list_in_block_quote_with_previous_blockx_double_drop
+#   File "c:\enlistments\pymarkdown\pymarkdown\block_quotes\block_quote_processor.py", line 698, in __handle_existing_block_quote_fenced_special_part_two
+#     assert sd == ">"
+#            ^^^^^^^^^
+# AssertionError
+
+# SNAFU3
+# bad_fenced_block_in_block_quote_in_list_in_block_quote_with_previous_blockx_triple_drop
+# SNAFU7
+# bad_fenced_block_in_block_quote_in_list_in_block_quote_with_previous_list_triple_dropx
+#   File "C:\enlistments\pymarkdown\pymarkdown\plugins\rule_md_031.py", line 949, in __process_pending_container_end_tokens
+#     assert xx.start_markdown_token == self.__removed_container_stack_token
+#            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+# AssertionError
+
+# SNAFU4
+# bad_fenced_block_in_block_quote_in_list_in_block_quote_with_previous_blocks
+# File "c:\enlistments\pymarkdown\pymarkdown\transform_markdown\transform_containers.py", line 2061, in __adjust
+# assert inner_token_index < len(split_leading_spaces)
+#        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+# SNAFU5
+# bad_fenced_block_in_block_quote_in_list_in_block_quote_with_previous_block_double_drop_with_thematics
+# Expected:> + > -----\n>   > > block 1\n>   > > block 2\n>   -----\n>\n>   ```block\n>   A code block\n>   ```\n>\n>   -----\n> + another list\n:
+#   Actual:> + > -----\n>   > > block 1\n>   > > block 2\n> > -----\n> \n> ```block\n>   A code block\n>```\n> \n> -----\n> + another list\n:
+
+# SNAFU6
+# bad_fenced_block_in_block_quote_in_list_in_block_quote_with_previous_list_double_drop
+#   File "C:\enlistments\pymarkdown\pymarkdown\plugins\rule_md_031.py", line 394, in __fix_spacing_list_detect_special
+#     selected_leading_space = split_spaces[index]
+#                              ~~~~~~~~~~~~^^^^^^^
+# IndexError: list index out of range