From 9bbfc87b43b05677757d677e505476d51387e1bf Mon Sep 17 00:00:00 2001 From: Perr Hoov <187721938+aka-debug-jie@users.noreply.github.com> Date: Tue, 4 Aug 2026 08:07:28 +0800 Subject: [PATCH] Fix embedded OLE object IDs in subdocuments (#621) --- docxtpl/subdoc.py | 71 ++++++ tests/_issue_621_ole.py | 324 +++++++++++++++++++++++++ tests/embedded_ole_subdoc.py | 78 ++++++ tests/issue_621_public_reproduction.py | 99 ++++++++ tests/templates/issue_621_excel_0.xlsx | Bin 0 -> 4887 bytes tests/templates/issue_621_excel_1.xlsx | Bin 0 -> 4867 bytes tests/templates/issue_621_excel_2.xlsx | Bin 0 -> 4868 bytes tests/templates/issue_621_excel_3.xlsx | Bin 0 -> 4867 bytes tests/templates/issue_621_excel_4.xlsx | Bin 0 -> 4867 bytes tests/templates/issue_621_excel_5.xlsx | Bin 0 -> 4867 bytes tests/templates/issue_621_excel_6.xlsx | Bin 0 -> 4868 bytes tests/templates/issue_621_main.docx | Bin 0 -> 12772 bytes tests/templates/issue_621_subdoc.docx | Bin 0 -> 23798 bytes 13 files changed, 572 insertions(+) create mode 100644 tests/_issue_621_ole.py create mode 100644 tests/embedded_ole_subdoc.py create mode 100644 tests/issue_621_public_reproduction.py create mode 100644 tests/templates/issue_621_excel_0.xlsx create mode 100644 tests/templates/issue_621_excel_1.xlsx create mode 100644 tests/templates/issue_621_excel_2.xlsx create mode 100644 tests/templates/issue_621_excel_3.xlsx create mode 100644 tests/templates/issue_621_excel_4.xlsx create mode 100644 tests/templates/issue_621_excel_5.xlsx create mode 100644 tests/templates/issue_621_excel_6.xlsx create mode 100644 tests/templates/issue_621_main.docx create mode 100644 tests/templates/issue_621_subdoc.docx diff --git a/docxtpl/subdoc.py b/docxtpl/subdoc.py index e8da093..1137c5e 100644 --- a/docxtpl/subdoc.py +++ b/docxtpl/subdoc.py @@ -16,6 +16,11 @@ import re +W14_ANCHOR_ID = ( + "{http://schemas.microsoft.com/office/word/2010/wordml}anchorId" +) + + class SubdocComposer(Composer): def attach_parts(self, doc, remove_property_fields=True): """Attach docx parts instead of appending the whole document @@ -29,6 +34,7 @@ def attach_parts(self, doc, remove_property_fields=True): cprops.dissolve_fields(name) self._create_style_id_mapping(doc) + self.renumber_ole_objects(doc) for element in doc.element.body: if isinstance(element, CT_SectPr): @@ -49,6 +55,71 @@ def attach_parts(self, doc, remove_property_fields=True): self.renumber_nvpicpr_ids() self.fix_section_types(doc) + def renumber_ole_objects(self, doc): + state = getattr(self.doc.part, "_docxtpl_ole_id_state", None) + if state is None: + body = self.doc.element.body + state = { + "shape_ids": set(xpath(body, ".//v:shape/@id")), + "shape_index": 1025, + "object_ids": set(xpath(body, ".//o:OLEObject/@ObjectID")), + "object_index": 1, + "anchor_ids": { + element.get(W14_ANCHOR_ID).upper() + for element in body.iter() + if element.get(W14_ANCHOR_ID) is not None + }, + "anchor_index": 1, + } + self.doc.part._docxtpl_ole_id_state = state + + state["shape_ids"].update( + xpath(doc.element.body, ".//v:shape/@id") + ) + for ole_object in xpath(doc.element.body, ".//o:OLEObject"): + old_shape_id = ole_object.get("ShapeID") + matching_shapes = [ + shape + for shape in xpath(ole_object.getparent(), "./v:shape") + if ( + old_shape_id is not None + and shape.get("id") == old_shape_id + ) + ] + if len(matching_shapes) == 1: + shape_id = self._next_ole_id( + state, "shape", lambda index: "_x0000_i%d" % index + ) + matching_shapes[0].set("id", shape_id) + ole_object.set("ShapeID", shape_id) + if ole_object.get("ObjectID") is not None: + ole_object.set( + "ObjectID", + self._next_ole_id( + state, "object", lambda index: "_%d" % index + ), + ) + + for element in doc.element.body.iter(): + if element.get(W14_ANCHOR_ID) is not None: + element.set( + W14_ANCHOR_ID, + self._next_ole_id( + state, "anchor", lambda index: "%08X" % index + ), + ) + + @staticmethod + def _next_ole_id(state, kind, formatter): + index_key = "%s_index" % kind + ids_key = "%s_ids" % kind + while formatter(state[index_key]) in state[ids_key]: + state[index_key] += 1 + value = formatter(state[index_key]) + state[index_key] += 1 + state[ids_key].add(value) + return value + def add_diagrams(self, doc, element): # While waiting docxcompose 1.3.3 dgm_rels = xpath(element, ".//dgm:relIds[@r:dm]") diff --git a/tests/_issue_621_ole.py b/tests/_issue_621_ole.py new file mode 100644 index 0000000..0d0a23f --- /dev/null +++ b/tests/_issue_621_ole.py @@ -0,0 +1,324 @@ +# -*- coding: utf-8 -*- + +from hashlib import sha256 +from io import BytesIO +import json +from pathlib import PurePosixPath +from zipfile import ZipFile + +from docx import Document +from lxml import etree + + +NAMESPACES = { + "o": "urn:schemas-microsoft-com:office:office", + "pr": "http://schemas.openxmlformats.org/package/2006/relationships", + "r": "http://schemas.openxmlformats.org/officeDocument/2006/relationships", + "s": "http://schemas.openxmlformats.org/spreadsheetml/2006/main", + "v": "urn:schemas-microsoft-com:vml", + "w": "http://schemas.openxmlformats.org/wordprocessingml/2006/main", + "w14": "http://schemas.microsoft.com/office/word/2010/wordml", +} +PACKAGE_RELATIONSHIP = ( + "http://schemas.openxmlformats.org/officeDocument/2006/" + "relationships/package" +) +W14_ANCHOR_ID = "{%s}anchorId" % NAMESPACES["w14"] + + +def assert_file_identity(path, expected_size, expected_sha256): + data = path.read_bytes() + assert len(data) == expected_size, ( + "unexpected fixture size: %s" % path.name + ) + assert sha256(data).hexdigest() == expected_sha256, ( + "unexpected fixture SHA-256: %s" % path.name + ) + + +def _inspect_ooxml_package(data, required_main_part=None): + with ZipFile(BytesIO(data)) as package: + assert package.testzip() is None, ( + "embedded OOXML package has corrupt data" + ) + names = set(package.namelist()) + assert "[Content_Types].xml" in names, ( + "embedded target has no content types" + ) + etree.fromstring(package.read("[Content_Types].xml")) + + if required_main_part is None: + main_parts = sorted( + names + & { + "ppt/presentation.xml", + "word/document.xml", + "xl/workbook.xml", + } + ) + assert len(main_parts) == 1, ( + "embedded package has no unique OOXML main part" + ) + main_part = main_parts[0] + else: + assert required_main_part in names, ( + "embedded package lacks %s" % required_main_part + ) + main_part = required_main_part + + main_xml = etree.fromstring(package.read(main_part)) + sheet_names = ( + main_xml.xpath(".//s:sheet/@name", namespaces=NAMESPACES) + if main_part == "xl/workbook.xml" + else [] + ) + return main_part, sheet_names + + +def assert_xlsx_fixture(path, expected_size, expected_sha256, expected_sheet): + assert_file_identity(path, expected_size, expected_sha256) + main_part, sheet_names = _inspect_ooxml_package( + path.read_bytes(), required_main_part="xl/workbook.xml" + ) + assert main_part == "xl/workbook.xml" + assert sheet_names == [expected_sheet], ( + "unexpected workbook sheets in %s: %r" % (path.name, sheet_names) + ) + + +def add_ole_paragraph_anchor_ids(source, target): + anchor_count = 0 + with ZipFile(source) as source_archive, ZipFile( + target, "w" + ) as target_archive: + for item in source_archive.infolist(): + data = source_archive.read(item.filename) + if item.filename == "word/document.xml": + document_xml = etree.fromstring(data) + paragraphs = document_xml.xpath( + ".//w:p[.//o:OLEObject]", namespaces=NAMESPACES + ) + anchor_count = len(paragraphs) + for index, paragraph in enumerate(paragraphs, start=1): + paragraph.set(W14_ANCHOR_ID, "%08X" % index) + data = etree.tostring( + document_xml, + xml_declaration=True, + encoding="UTF-8", + standalone=True, + ) + target_archive.writestr(item, data) + return anchor_count + + +def add_non_ole_vml_shape(source, target, shape_id): + with ZipFile(source) as source_archive, ZipFile( + target, "w" + ) as target_archive: + for item in source_archive.infolist(): + data = source_archive.read(item.filename) + if item.filename == "word/document.xml": + document_xml = etree.fromstring(data) + ole_objects = document_xml.xpath( + ".//o:OLEObject", namespaces=NAMESPACES + ) + for index, ole_object in enumerate( + ole_objects, start=2048 + ): + old_shape_id = ole_object.get("ShapeID") + matching_shapes = ole_object.getparent().xpath( + "./v:shape[@id=$shape_id]", + namespaces=NAMESPACES, + shape_id=old_shape_id, + ) + assert len(matching_shapes) == 1 + new_shape_id = "_x0000_i%d" % index + matching_shapes[0].set("id", new_shape_id) + ole_object.set("ShapeID", new_shape_id) + body = document_xml.xpath( + ".//w:body", namespaces=NAMESPACES + )[0] + paragraph = etree.Element("{%s}p" % NAMESPACES["w"]) + run = etree.SubElement( + paragraph, "{%s}r" % NAMESPACES["w"] + ) + pict = etree.SubElement( + run, "{%s}pict" % NAMESPACES["w"] + ) + shape = etree.SubElement( + pict, "{%s}shape" % NAMESPACES["v"] + ) + shape.set("id", shape_id) + section = body.find("{%s}sectPr" % NAMESPACES["w"]) + if section is None: + body.append(paragraph) + else: + body.insert(body.index(section), paragraph) + data = etree.tostring( + document_xml, + xml_declaration=True, + encoding="UTF-8", + standalone=True, + ) + target_archive.writestr(item, data) + + +def _assert_unique(values, label, normalizer=None): + normalized = ( + [normalizer(value) for value in values] + if normalizer + else values + ) + assert len(set(normalized)) == len(normalized), "duplicate %s: %r" % ( + label, + values, + ) + + +def _embedding_target(relationship): + target = relationship.get("Target") + assert target, "OLE package relationship has no target" + relative = PurePosixPath(target) + assert not relative.is_absolute(), ( + "external OLE package target: %s" % target + ) + assert ".." not in relative.parts, ( + "traversing OLE package target: %s" % target + ) + package_path = PurePosixPath("word") / relative + assert package_path.parts[:2] == ("word", "embeddings"), ( + "OLE target is outside word/embeddings: %s" % target + ) + return package_path.as_posix() + + +def assert_ole_integrity( + result, + expected_count, + expected_anchor_count, + required_embedding_member=None, + expected_embedding_sha256=None, + expected_workbook_sheets=None, +): + Document(result) + with ZipFile(result) as archive: + assert archive.testzip() is None, "result DOCX has corrupt ZIP data" + document_xml = etree.fromstring(archive.read("word/document.xml")) + relationships_xml = etree.fromstring( + archive.read("word/_rels/document.xml.rels") + ) + archive_names = set(archive.namelist()) + relationships = { + relationship.get("Id"): relationship + for relationship in relationships_xml.xpath( + ".//pr:Relationship", namespaces=NAMESPACES + ) + } + ole_objects = document_xml.xpath( + ".//o:OLEObject", namespaces=NAMESPACES + ) + assert len(ole_objects) == expected_count, ( + "expected %d OLE objects, found %d" + % (expected_count, len(ole_objects)) + ) + + shape_ids = [] + object_ids = [] + relationship_ids = [] + embedding_targets = [] + embedding_sha256 = [] + embedded_main_parts = [] + workbook_sheet_names = [] + for ole_object in ole_objects: + shape_id = ole_object.get("ShapeID") + object_id = ole_object.get("ObjectID") + relationship_id = ole_object.get("{%s}id" % NAMESPACES["r"]) + assert shape_id, "OLE object has no ShapeID" + assert object_id, "OLE object has no ObjectID" + assert relationship_id, "OLE object has no relationship ID" + + matching_shapes = ole_object.getparent().xpath( + "./v:shape[@id=$shape_id]", + namespaces=NAMESPACES, + shape_id=shape_id, + ) + assert len(matching_shapes) == 1, ( + "OLE ShapeID does not resolve to one sibling shape: %s" + % shape_id + ) + + relationship = relationships.get(relationship_id) + assert relationship is not None, ( + "missing OLE relationship: %s" % relationship_id + ) + assert relationship.get("TargetMode") is None, ( + "OLE package relationship must be internal: %s" + % relationship_id + ) + assert relationship.get("Type") == PACKAGE_RELATIONSHIP, ( + "unexpected OLE relationship type: %s" % relationship_id + ) + embedding_target = _embedding_target(relationship) + assert embedding_target in archive_names, ( + "missing embedded package part: %s" % embedding_target + ) + + embedded_data = archive.read(embedding_target) + main_part, sheet_names = _inspect_ooxml_package( + embedded_data, required_embedding_member + ) + shape_ids.append(shape_id) + object_ids.append(object_id) + relationship_ids.append(relationship_id) + embedding_targets.append(embedding_target) + embedding_sha256.append(sha256(embedded_data).hexdigest()) + embedded_main_parts.append(main_part) + workbook_sheet_names.extend(sheet_names) + + assert len(shape_ids) == expected_count + assert len(object_ids) == expected_count + assert len(relationship_ids) == expected_count + assert len(embedding_targets) == expected_count + _assert_unique(shape_ids, "OLE ShapeID values") + _assert_unique(object_ids, "OLE ObjectID values") + _assert_unique(relationship_ids, "OLE relationship IDs") + _assert_unique(embedding_targets, "OLE embedding targets") + + all_shape_ids = document_xml.xpath(".//v:shape/@id", namespaces=NAMESPACES) + assert all(all_shape_ids), "empty VML shape ID" + _assert_unique(all_shape_ids, "VML shape ID values") + + anchor_ids = document_xml.xpath(".//@w14:anchorId", namespaces=NAMESPACES) + assert len(anchor_ids) == expected_anchor_count, ( + "expected %d w14:anchorId values, found %d" + % (expected_anchor_count, len(anchor_ids)) + ) + assert all(anchor_ids), "empty w14:anchorId value" + _assert_unique( + anchor_ids, + "w14:anchorId values after hexadecimal normalization", + normalizer=lambda value: value.upper(), + ) + + if expected_embedding_sha256 is not None: + assert embedding_sha256 == list(expected_embedding_sha256), ( + "embedded payload SHA-256 values changed: %r" % embedding_sha256 + ) + if expected_workbook_sheets is not None: + assert workbook_sheet_names == list(expected_workbook_sheets), ( + "embedded workbook sheets changed: %r" % workbook_sheet_names + ) + + summary = { + "anchor_count": len(anchor_ids), + "embedded_main_parts": sorted(embedded_main_parts), + "embedding_sha256": sorted(embedding_sha256), + "embedding_target_count": len(embedding_targets), + "object_id_count": len(object_ids), + "ole_count": len(ole_objects), + "relationship_id_count": len(relationship_ids), + "shape_id_count": len(shape_ids), + "workbook_sheet_names": sorted(workbook_sheet_names), + } + print(json.dumps(summary, sort_keys=True)) + return summary diff --git a/tests/embedded_ole_subdoc.py b/tests/embedded_ole_subdoc.py new file mode 100644 index 0000000..8e70eea --- /dev/null +++ b/tests/embedded_ole_subdoc.py @@ -0,0 +1,78 @@ +# -*- coding: utf-8 -*- + +from pathlib import Path +from tempfile import TemporaryDirectory + +from docx import Document +from docxtpl import DocxTemplate + +from _issue_621_ole import ( + W14_ANCHOR_ID, + add_non_ole_vml_shape, + add_ole_paragraph_anchor_ids, + assert_file_identity, + assert_ole_integrity, +) + + +SOURCE_FIXTURE = Path("templates/embedded_main_tpl.docx") +SOURCE_FIXTURE_SHA256 = ( + "40fa08a534110d411da00f38ed5ba971c2dcd12849e95edb3a3a9a48ca29919f" +) + + +assert_file_identity(SOURCE_FIXTURE, 164480, SOURCE_FIXTURE_SHA256) +with TemporaryDirectory() as temporary_directory: + output_dir = Path(temporary_directory) + anchored_source = output_dir / "anchored_source.docx" + main_template = output_dir / "main_with_existing_ole.docx" + result = output_dir / "embedded_ole_subdoc.docx" + mixed_source = output_dir / "mixed_vml_and_ole.docx" + mixed_main = output_dir / "mixed_vml_main.docx" + mixed_result = output_dir / "mixed_vml_result.docx" + + source_anchor_count = add_ole_paragraph_anchor_ids( + SOURCE_FIXTURE, anchored_source + ) + assert source_anchor_count == 3 + main_document = Document(anchored_source) + for index in range(source_anchor_count + 1, 11): + paragraph = main_document.add_paragraph("reserved anchor %d" % index) + anchor_id = "%08X" % index + paragraph._p.set( + W14_ANCHOR_ID, + anchor_id.lower() if index == 10 else anchor_id, + ) + main_document.add_paragraph("{{p first_subdoc }}") + main_document.add_paragraph("{{p second_subdoc }}") + main_document.save(main_template) + + template = DocxTemplate(main_template) + template.render( + { + "first_subdoc": template.new_subdoc(anchored_source), + "second_subdoc": template.new_subdoc(anchored_source), + } + ) + template.save(result) + + summary = assert_ole_integrity( + result, expected_count=12, expected_anchor_count=16 + ) + assert summary["ole_count"] == 4 + (2 * 4) + + add_non_ole_vml_shape( + anchored_source, mixed_source, "_x0000_i1025" + ) + mixed_main_document = Document() + mixed_main_document.add_paragraph("{{p mixed_subdoc }}") + mixed_main_document.save(mixed_main) + mixed_template = DocxTemplate(mixed_main) + mixed_template.render( + {"mixed_subdoc": mixed_template.new_subdoc(mixed_source)} + ) + mixed_template.save(mixed_result) + mixed_summary = assert_ole_integrity( + mixed_result, expected_count=4, expected_anchor_count=3 + ) + assert mixed_summary["ole_count"] == 4 diff --git a/tests/issue_621_public_reproduction.py b/tests/issue_621_public_reproduction.py new file mode 100644 index 0000000..50fdd0e --- /dev/null +++ b/tests/issue_621_public_reproduction.py @@ -0,0 +1,99 @@ +# -*- coding: utf-8 -*- + +from pathlib import Path +from tempfile import TemporaryDirectory + +from docxtpl import DocxTemplate + +from _issue_621_ole import ( + assert_file_identity, + assert_ole_integrity, + assert_xlsx_fixture, +) + + +MAIN_FIXTURE = Path("templates/issue_621_main.docx") +SUBDOC_FIXTURE = Path("templates/issue_621_subdoc.docx") +EMBEDDING_ZIPNAME = "word/embeddings/Microsoft_Excel_Worksheet.xlsx" +XLSX_FIXTURES = [ + ( + Path("templates/issue_621_excel_0.xlsx"), + 4887, + "3b7d1befbe9fe6d4dfa8bee06b3dc424774b37079a884e89427c78577516805f", + "No.1", + ), + ( + Path("templates/issue_621_excel_1.xlsx"), + 4867, + "d353a37445081eb1dd471a5f9cdeec55a5222de128483d8998283776c6186f15", + "No.2", + ), + ( + Path("templates/issue_621_excel_2.xlsx"), + 4868, + "291cf1832083f0c0476679fb0030c1f818c079ef4326e5e064b9ce76c541124e", + "No.3", + ), + ( + Path("templates/issue_621_excel_3.xlsx"), + 4867, + "ff759e011e2cf1216aea110819e46cde04f3726a6c7b6d0b67b53cf25a7535a3", + "No.4", + ), + ( + Path("templates/issue_621_excel_4.xlsx"), + 4867, + "7a26b676c693c8f58deeec4879751257a02d6955957a0fcad5bbdef9ada55396", + "No.5", + ), + ( + Path("templates/issue_621_excel_5.xlsx"), + 4867, + "a4f3b5c2de16078dbb77757437fbbeca1ceb2e7d99d99b2dbaba609cf9b83197", + "No.6", + ), + ( + Path("templates/issue_621_excel_6.xlsx"), + 4868, + "51d03cae946ff4763a29049c08acd6a2af5cb1fc167fbce25d5ca53c96227ed6", + "No.7", + ), +] + + +assert_file_identity( + MAIN_FIXTURE, + 12772, + "8445e28450aa911b92d83b251ff634c2f49d8216a6cc829832965ef984f14ca0", +) +assert_file_identity( + SUBDOC_FIXTURE, + 23798, + "c57714a23c1d17f991f95dff21c1e6931195fd7f8848258e82a34586bb5a302d", +) +for fixture in XLSX_FIXTURES: + assert_xlsx_fixture(*fixture) + +with TemporaryDirectory() as temporary_directory: + output_dir = Path(temporary_directory) + result = output_dir / "issue_621_public_reproduction.docx" + template = DocxTemplate(MAIN_FIXTURE) + sub_docs = [] + for index, (xlsx_path, _, _, _) in enumerate(XLSX_FIXTURES): + subdoc_path = output_dir / ("issue_621_subdoc_%d.docx" % index) + subdoc_template = DocxTemplate(SUBDOC_FIXTURE) + subdoc_template.replace_zipname(EMBEDDING_ZIPNAME, str(xlsx_path)) + subdoc_template.save(subdoc_path) + sub_docs.append(template.new_subdoc(subdoc_path)) + + template.render({"sub_docs": sub_docs}) + template.save(result) + summary = assert_ole_integrity( + result, + expected_count=7, + expected_anchor_count=7, + required_embedding_member="xl/workbook.xml", + expected_embedding_sha256=[item[2] for item in XLSX_FIXTURES], + expected_workbook_sheets=[item[3] for item in XLSX_FIXTURES], + ) + assert summary["ole_count"] == len(XLSX_FIXTURES) diff --git a/tests/templates/issue_621_excel_0.xlsx b/tests/templates/issue_621_excel_0.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..5fd51b2968be28a302bae9e282e7532f11716eda GIT binary patch literal 4887 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 literal 0 HcmV?d00001 diff --git a/tests/templates/issue_621_excel_1.xlsx b/tests/templates/issue_621_excel_1.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..f51a28b617ce8b9b4845e6833b3284b498c50dfe GIT binary patch literal 4867 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 literal 0 HcmV?d00001 diff --git a/tests/templates/issue_621_excel_2.xlsx b/tests/templates/issue_621_excel_2.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..5ffb61702a39e26f3577e24c6a73acd5a7ee9f95 GIT binary patch literal 4868 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 literal 0 HcmV?d00001 diff --git a/tests/templates/issue_621_excel_4.xlsx b/tests/templates/issue_621_excel_4.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..cce53372fbb3e8e95307bb27f12c24be26716675 GIT binary patch literal 4867 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 literal 0 HcmV?d00001 diff --git a/tests/templates/issue_621_excel_5.xlsx b/tests/templates/issue_621_excel_5.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..a74ab362b45311ca946bf66fb9ac40d40e3d9110 GIT binary patch literal 4867 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 literal 0 HcmV?d00001 diff --git a/tests/templates/issue_621_main.docx b/tests/templates/issue_621_main.docx new file mode 100644 index 0000000000000000000000000000000000000000..a8599016aada674105a9bd8cbd27f2f14ea95a3f GIT binary patch literal 12772 zcmbt*1ytS1@+R)??(V_e-QC?Cg1b8ecL)S`5AN=+f#B}$wq)kLH#6Dy-?L}8&!O+V zP+wPf)$dk!SAED!0fRsR{A!`HTl~LX|J@)z-Wb~%$vfEDJJQR4h@pJ^0^$!bivAK9 zQ$PR!S0DfYguja!*xS>&*;s#76tG=kKxjihzz10+RgB-w?@ss6BPsgEqF=xZ22$S; zCP^Z|DDd)JUdFFb)qXnW*SiU~dFPE2&vqlARVNXdSpynlMJ3D;2NBdS~VKz^y_pq9U3yL6l;SvLa4UzZ>MXrn``x@&MaA_;L-ADQ^vc03R4^y!9iyOwO)s-#{KDM|{qlmdHN(*8?%RFq`)>SrwDT@5KlYDeoM1o! zJc>1lk_HYB+I^o0Zlg4$a!Zt*0}!zBi09U*#zZ!(J zf$3>ol!;QdSUOC{g6;jZ+u7F8>_jBpEb3&bCQaZ^r{cos`5VNwtH+iA5YagSScxp` zFoG`?_1~5PuRY_-o=5l4tAGHloO4wA?$R7lUCg?U$v!aJ6l_azhB63ZunbS96slhy?k zITz{`xLYp~4=FTa7v_7Hz6AZJAFiC5%;P`&aQ5K`_sm1goV3$dG6ff6e-fK86Th-5hvT+2KJjE1 z_k~1_OC?Fj%xQlU{z3n=*;EFkqtGY5koU$WQwAAZ;Cpq^8FTd}h+tdSumhIay5GD` z%BO1KahV&ol^*>JHbG zcipv|wx8M&S6S^c3t=0UOJ{3!0Tpx^^x(dZQ9MfcYCxjzq?z|Pwn@tLipIJTQ|xe4 zB>lRvv_>a6OSs@uliGIiVA%+739*je!9`+UeZhaZ@V`ev&<_{7+Bq2i76Ew~TV$i4 z0RV=~007|sE#m0pZf)ZD%fqKS;|@QY5Ic&f&bziKIfkCBD}G&K}lc1|#b z44JhP`hxhdMyq0#EZ2?n2$C8l;M^mb(+NVckWvK_ns!Ozm{#@juwQc^fl}G{yrc}z zXscGTn9t$LuQ-2dIcZ0&G6HcxMqN@w-4KmRiofja8N2ShnM-l6v-5j2t zZmyaO3)eF}EKvL$D=a|fP(zVFRG?0i>sQ8CFWdlcOX^M=z_@AQ9~O!k(+w84H)@`= zxQtZFYQ9ygdS!0eXN0u4u5}LFfTqzjBHVS2V;J9;bO{+bBRYPmA*Qh1guc<#TlyHP zh#H2Ezv)ZM6&)juM%^fNh{YJg6~;4Nnd^o;&XlZT5CS(<>zO1s+J-R9Lam->*RI>C zUUh{oP&#HSa{6$Cz`G3bsEefS;~_3Gu=mMn;`TD_9nHg(BEYIc-$Z-oim`QcuArrd z4_{bwXYDC|R{%xk<(a~N!fSMKO^(Q5U=LScU&A4e!iFxXYU9VWaB81;f^*}`6l86%mp&t^?bBe>2EC^VN*TW$Rl{&|wDOLpL$6Dg%2Pq#D5aw%w zAIc|5u90J~&KSOIniC4gMFe<)zVGq#NC|N8nsWff2E$MOeCQ8evwTq7)vWrVWpd}D zqdD&h*jw7B)=i*Ezf+e;jtobci%Zt$Y*poReiAO!-GUZ2Ii1U7{;eTsO^c2^S|N3{_<++9S?vu`dU?QjulbDpd|MMCXxBWiP6 zw=n225H`1!Z58FNyG{jbN#|vKpZ7d}y-D&=>rgv-_U=@nflEthkBL|kz-9Up?B)E4 z7kex>G*Q5N(e66gNK=J*LRU@YdwR_Mnfd@8V}qv0Reje(VF&VNg6sJXV41?{2_)j7 z6_ii-Ozrw&Ah>6h>Uk6p7JwSb6hKq1KiIcy2(bPQChm}7&DXp)0}tx#5QOpaOmy2O z(}AtpbQ=u5&`p+tz_m_^b$A7^+mbSiEFT>7Lluq$2-S`ED2ZLSkd z+LTM)y7`CYb3=8gtzz_cK0jx&8Z#AqILyg8m{)wCy=%Vc^OBhRY`Zq<)IN!9B(-H7 znZDf9S#c)&=u|M&SP0yxsbVZVlw1_kgP_1+V~~e9zH!h%Qq?@U#=Ix4RMLJ>Ay8M) zPe#Kd{ny0HzVN`kScT#`V~WIGdKzfMZ20YO>qo^EX2X`Z%APU_u2m{b#lm*&a6_Yy z^xRY2g$+?w6^(*6-$k05S^Is`rB;1K%! z?c-NnPp=xk%lJNJS_?rMt(l;(5lp_Ua(#EtyE&~CjOX>|R6d4P8kPYV!Lq7Ew|OdnRr-1q{^)#A)VfoGX;a=xz|u@;cY+^lw`v!}E7Mhj^?vH|PUg z)XSEg0j9`ZGB?#UZ9g2kls7p##y%aTv`w$?=}dF-#c2^ojoiYmmb}b;dtrjlV=U3h zJ6_=;oVW{}+Ub@JOKByHZDIjFkbSLYk;VqvC7qM2e>ZIOp|LN%>wRn1xy$n@eQoj- zn-xj&mFJ7ArjyQat2E%s7L%)jRyt#aX9+ym>`Cl~?eil`jc=Of^COWy^A*iz5W?ts z(q~jjHB@BoxS7N6 zd40+M?KRAuA}kyg%R>o<2W7Mm7Ip!G#K|Bx6wDk3ua?Zt5>X#YDW$E1q7cA&I3vO^ zB09RQL>=X-&`=|R4Rt8Jt%QGJM+Wpmk}8(P9ohe6CX3qrIz&cbQ~LMq~Mw|jn!2l(C_0C#p1dv z2~h0F^fP`I>MgPP5J@}80klkDLmbL#V>uspk(EpDnXCAJnIn}QRdP5sRynJ?lE3uL z6hQrO286NPT6#Y;@yF`=QNGc+D=GZ{&5wFW^usn0l>9nZg}JG@dBk>9Xu%&Q{F~L3 z{L6X_RM23!<*SD$ZMR#&!7t;Lj5}7TTvpRO2)A&Ghq-rCgxo@g9Kt4f*U+qXVzx!f3M>$aE&b>V z&pAdJYw5PGUuhsb3*ud;;Yx(NHtgKRWa8kZS@Q6783J`Ryw3rUMjI7Zk6n3u_@iJn z-^Jl2Vsfiiw$LYlPPm+uN&9C%RX}5lmDD3eEXa2Y?x%7h%aFwsPQC`#mwU5HSXjH5 zv`H{F8mm^LEUbFA+XSZ)CpzX!cSUCI;>WazTa(r$g`|~`ds+Jn;0msg7Bh}H_6wCk z|GI@A7+RG|T)lS=U#Z~sRU#!C+Rv6kR=SJE6@Yrjt-PvyERCr~XtvT`YT_2e=Q<)O z=dXAN@{V6yi1+Q@|2W(KmAbG3yyf2k0RRw#`SY6m$JyS|#L3CR*6fd?dx6@p!wNe> zyWIRsV1%oNcD+hs;=&Rp*XQ879hf*;NFxM&z;70h$3+52xr~O~B|9Y5t$KNE-2CUf zZN}yIFp3J@X3?&@oID%h;*{%?nS-G+z9%<{WZb0E_Ng3V@)M!=zHgV6nN(9)GS~9Q>klNkjg54&=t7%swNp1jJV*L(kzu4!MWPjHNNa>&~IF+oEHc zf>##Xx!KdgP^2!){Dp>%d63L}XoS9|>sZZ55^;cw^U=VNFh&U4xaO7RjVEgD1`*)L zJC7A4Sxly*da*75^KPE3N2!(Y&K**TM*prm+;@9{9y zAnt!!&Wlzqfp+ArIHTJgsv>DLVuEkbL}=4O7lpgKf`JMQnrJN5+^)|IWp>Q-p$*rK{8DkA|r;(}%I^8uE!3-la}dS2hSUQwB66iuXNeC^HcC_}BjJqLDdE}^)9 zJ(Eei0nk5T&xcZlyS$5mTIJqoEA*fv4b3hF2=HhH2aG=@W*W0^ z)PE?)j^bBDXsq*E#`?iWL)4 zG`l6`AN^|iKr3L2uwp`!*T)x88fBl=44QOb`Rk&vN}uqyLA%}9&wGM$8ZqTKS@@## zH=mCwj(W;N*GM#-ELb}lHKOTR)_!Kk4D`Z9;YXpJIm{!>x%0l6Gr|uTgpxu0Y~F{* ze&ZSh=^ntRquKT?3KvDDPj%H7Wa|k^#;plHn}J8)-mA{^jQpvx@kRA`RGQe15eGEE zBy=DqdChcby4jpZx8?fr0EtPnlI-J5rPGzhNVq{_qIA90l;UC%ZAM=fa~E%{B_VM> z(IycqQ+ue&OH0xCM7seByr15*q-oNrN3AT1u|lAvC8E+`oxb&26QHx3yo%Ut_sWV^ ztCZezHancsoGjqehs|8&N*%|1Y-HAW-BW!j#xY}Kx?8$5fYyJh^SQ9+_+hk;84ldW zeWYYy-&{nmF~1$&{~q5+hcli1VYUQjwtruq76RhwO zS`SWce$eHdjk9xRGi6!@pXAeUu5%p&*ey~;x(GFNIgPo=gKF7nk1Cpm#@tAVYDm?g zg9ra|V$>CR8}`Y}M>6S?f}n>@Fw?%EGJ1|-KXz6%5hxCVS6MMOo|V^V22|raz}h?X z|D5jlNNN0;?r<_Uu`&5A>9Jambp-_m0MLp70D$^W!9T=5{gL|67>_|_L+MmIdS^)I zIw9FH(ufnuh%td~ttJBOn;vFoGUeGGa&Z~12rw#;RI!*Bit{+mv5W*!q`#^9kz87U z^e&ivI@~9lS^2G4Ff7xQyYv2q*XR6^IE8L~(%e3(nSjPFIO$peW5cV@FrK{PVnP4@ zrzr+R_!Wji^0q2_FHu|D>!n!ARI>Ev5a8I!el*MAlEj3HFR-5i3`i#GASX6gQZHd7 z+;)dW$EG0<#t%eUBCxPAiQF-ED1hr-;hs0|w9R4ywzQ#G7;@XHn72svy_6NQ`=y;I z;G+?3g1>Q@k^_6`g#d~O_Jpcp9O^aIcv}G5pb9Ei#?|k*+*ZX>gKXuMW+jmKI?QNR z=vtj5KC$?XsAyOHu)4u2;DzPSLu|6J{_JGSYW3B{zn*_@I~;@-Izl7S`?d?ys@m3B+6`!w>YV)Kbi*-+LsHFE&NgJX+x@R&H>*L&@}aU-Y@5`i@Fa3&5GcCIJ_S& zZn`H$2OTZ`!TZez;Mx+q4M2mULlE%Hc z#mpTFv@&7~XykB0z`q!|$uhF%+f|a_#;Phv1LoF`YQVe~-Aqp(g}T;HCx07$oEumb zK3HON1>cqR@tlRck=auEAyH$rM<~)P3^`E)GsorkX#Sz6>yJkF!j8S#L%aSE=p zVxo-K67R4Q_H#HpP(HP1_?k~_dah?K&R?(C4M)=pt2yKvwWn2|;E9 z&WNOW_&DRjq$l`xoMCy?1=;QFj+<8VrZrEl9L&duVAB^_VdRPch3Dx z(Ss;JfQupad`)>c3dlXX1~ByK5rabWruAx$zGWlBCcgdUs9DsSW(xg6>;bgTwp3?d zXz6hEc5>Is=SG#4=|uN-ofQq%S4trK9I2FD$Ote@ATgSvy(}g)-0iOw5v)>+3#JNl z>duntO_!=&yt%c+-GNhdXDC{VXRJAM`LF!?O`CETD{}Wnn(K`wV6G=>6PF{RHJWiI z&}W&JY&BTmKb5~VsDvc&V`IoEL_y;#1GDjVA$495Dz1(k2euAiS7;u3k?V`OQ|dc9ywGCXS5c4ZJ(aD?P7^jjS1p7 ziVh4Ui*L{GPV%*ni4wvuKpH>+LXwGTU`2fqFL9bX93misOg;?)3y|tiKJ_EV?a-d_ zb7G|HkzM>g=9LJAhd^n-hhGPqEGj|AQ8=K~qhCde4yjr@-d~!a|G80Ci=U@Ig3ere z9?d-CH39}7+p1fXRH!1Iu-#ahL7BG{bxS+~`5BG6r~vE=mn)#J3)qY?_fR&fssM~g z6jdrCG-!$BGYh>G?X!8O<_;NaDpaOFr3*;R&{ug;bsEVnLHOkkt}-9l8pv)TDAZLD zB~_+7=YX@45k`DP%W#w7-R`?WNEaMfZZyeiO-;ni&@4L(Ll6n*0z$ozUWm1OM zDhQ`xVH0X>IhVt@2~;a1OI*?haW7HjR3DdnnK?0sW7MHa|J-o1Mp*Fhtn0M4_6pN{ zv*M{!Is==uyf)h+z%ChG36o6R+JLKq(3B!lKqr0RL7$fj7fm-&VaR&V#yfV}V3&2Z z%#M_;w~a|Vd33ZpyZ7LOf!~vEq}nP6J$%Izs1ym%*MZaiCM^#N3^ES@wPEunREb_( z3Stb*&Hmc`{aCh~N#Pd#VncH^Z9kJOVby)n71zv%EInxBHfs8a$K?Do+n`kdrmjUM zRa<-*qeKu9Aq^QAR5ervluO{R6ctne&3;)SfovmLLVlj{Hj`ha>% zD>3z4P{MKu9e^-UNQNDj?`+tIiGxf;$;a%2inx162%%_J!5C_wbKev+Z5_)6?(EnA zlsfq`Co(rTq`Pj~Tms@Dr(^XiT+`2;CaQ!Yae4A!Gng zJSBi!U*#g9C$`@GN)tvC*`dnifu^hCOGLpAAn3liVNZ7-HXO}$8}irr>?a>PUJA{! z-nR<7v<{Y=2(&8eoEhwT(5aMDwJP<21&Qf}X*XoG^|7ZFXZ7~Fk&bfR>TiS&{%_IwM7_a^SX7+dfhohOS2zkQ41wwyOhz%GVeMsz)cFC?EMgM%;0G99@j%Kny`7|OWZyH zWRSz_Y-#Re#oAc-%7~1w3f#bv@gv&PzStF`)mIsKW5?tXC}+iL!!G&su41@N;HD&c zsB_eke;wh1%e&Prui6jJLU_{$fKH4s!^nH={Vc-Mo>iCR-SP|uPP8no-~BDT&UDZ} zaIbpqDr7bT&2B!ACrjWN1R0xbvL~ckq3~ z*GSp}s(?uNQI_j$=*o=%(|ZoG(e^5lL2g!Uc0o`<5n>+JklxC-W=-mYvU*O(VS*pW zk*JWau;0{Mj}JKHnE)>hf${^X1?ny5S%WD*k!UpO2S=h}wB=9%+jdr00@bPS5Wy(xb}|QP<>y z!I1kA+RPl#h!i+-LJDOhDI-LJjz-m%+OsPWDT{P7VzG|wY%)jW-N|AnDOdrT$r{Vh z9BuZorq3t~mJ4DEWcH8z3=K#PmBa^ZA&aKPG&_T=&YJ}kEhuJWJcPvk64WL&gLp(A z82V#mE4b@6r=e*kzUQN2SbO<>NC~B$Y^D}x zZ9b^ToRcSJe|_5s#luYD^PsJT%;Rc8VW3Rw$g8E%_R(D2>{NDrO{ud{kTapRDheVHKlCRpHeVc; zNc7KVwTjTs6LlH9gY^>*)(5VQW)}Oe&vvgHuj4V6d@C|RnHE+VJ9F5w#q#LZ@g|+B z_e3Sk0Go}GVjVRRiXG`?tgdT?XK|&10)4Orzc!3Mbe1}`c_!I2aCMzBuSCkTvvcrQ z$lev8!pXwR)1{iZKIkD!Z{`Q!1yz7LY;K$YpmMEL8M3qU@lS79*=4W52={h322R0( zMbrz-O|mlV_`6*k?@v8E7Pnjk%5lYt^77e(k8Un|i|M@q|MS_$FTbI-2L=ED`yg!n z=h-*4v;E)=8Cw5A5b95!v|Z*$82Cj?Nj?u>9MBIC%;m31l!BMZ%|fs1D%Gv3w-R*s z%kn7oIN{2NmoJc;6(84fazVc)UqX?RHB5vUXwAEwT=!xs+RxUoUPU6Llxu15jIxd- zLByXno~gI1?9FSi8HOPz#<>o1It7ipd;GD&R&+g)N}l#z-?PNs$M1K6MNaU3c|8 z_vL+i0CG_f%mZge0ad}?&C-yAXVIiwaB?UW+Cfnd?n6ll!xJw5y2g31j%nd*<#yp=D#wAlw$5#1deoF<|87($9 z&tYkxz$)D)yM7GBIZH4Q5#k>>#O?TXW zII2TA#Y8HnA!rpLrUfr}SpbYfx~Vho_<4$?SQHp$0bDrRr=(1zmG~1jc>{Nv$w!?} z;NQ9N&Ancfxt)x!LdLj}2H3@%ZnK4-VmX@Jv*5?k<8i#l_F(^KOa3RH`QOYbMe`te z_hClbkFbdI@%l$C=ug4FUrhgH-*L-c285vV;Eup0Pg<_moW!B#M8V2_Z-9Q?cX1A#2~=-pL2wF$tF=>@T?zgu;((Ey{9i{ zfUl_K>Z@S-yl-JjF~B9>*16`K)wVn-Vt70{5Oa<4K0lVt@V?U2tmEEw=85J zd{5vp3O1PfXlMnvDl=^8gs*8Kisw{gEAIt%Ka(7(i0eB1Js>^!@o|@XEZF)ucASZ}~?i zY#pFfmt@g*ot+c!yZE&_ki2Ti#0kL(RzGXTjt;DGRy>BBc{Im{sA)d?Xa`79{XK4V zEJ|$#q8Tf7d-|PFb%0J>n6oA))_^Y-lCVMXDS&JnKzyBx0-r+-5wQ9|4*W61ALN|@c?c0d}D zEy9_063HQz7d0skfH|V2mMUfBv@3NVycN;L2SwPFedU#R0=aU)zhwxhF18nA3DSQUjwSM85B3 z414TBt|uviAqnV(2rHJN5Bb6#BFM;&^*f{yX0MuJre)^b7N+((M0W{`e04 zpOiuVsp+HtrR-Px8~6O5i~OB^{!92zedK?K{fmqK`)q&bN&kgz{dlzhqx9db>EGeM z(|iAd3w=b9zu^BN`~II6{fk`sXZy8iu#b=bqMH6%@PBv8uYmSv`vvKz`bX6IeX_p? zxL?3OEp_%!;Qtoxejn-g?A>1@X?;Y_KW6>+F@A^te)#+gzC!vh_&<)KzvF+uxc!A+ zC;AuuAJ@3w@xNF7|H5y5nDKw(0Q?UBo$dP01!S{4j(DokM_R++&-~8 literal 0 HcmV?d00001 diff --git a/tests/templates/issue_621_subdoc.docx b/tests/templates/issue_621_subdoc.docx new file mode 100644 index 0000000000000000000000000000000000000000..e560d3d3a4c23e402676cc37888cbaaf3a3cf87c GIT binary patch literal 23798 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%0A!alVU_AImFhoZ` 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 D0feyn literal 0 HcmV?d00001