🏡 index : old_projects/cv.git

author yaqubroli <jpw24@st-andrews.ac.uk> 2024-09-23 17:56:01.0 +01:00:00
committer yaqubroli <jpw24@st-andrews.ac.uk> 2024-09-23 17:56:01.0 +01:00:00
commit
8eb2b085ec2d4fe877cd09c51c510fe20e8d6108 [patch]
tree
9ce3f033a39c21a532c63405e3e13087cf36d6c9
parent
954b4b5a55347c0c5ec94d873bd47f9b78f8dd36
download
8eb2b085ec2d4fe877cd09c51c510fe20e8d6108.tar.gz

Code almost finished



Diff

 #*superscratch*#                        |    1 +
 #Makefile#                              |    0 
 *scratch*                               |  308 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 .#*superscratch*                        |    1 +
 Writeup.docm                            |    0 
 Writeup.pdf                             |    0 
 cv.docm                                 |    0 
 cv.docm.bak.2.docm                      |    0 
 cv.yml                                  |   14 ++++++--------
 cvr1.docm                               |    0 
 extract.bat                             |    1 +
 publish.bat                             |    1 +
 ~$cv.docm                               |    0 
 ~$cv.dotx                               |    0 
 ~$riteup.docm                           |    0 
 contents/[Content_Types].xml            |    2 --
 examples/CV.docx                        |    0 
 examples/CV.pdf                         |    0 
 examples/Jacob Walchuk CV Rev0.pdf      |    0 
 examples/specimen.docx                  |    0 
 examples/specimen.pdf                   |    0 
 python_build/compile_vba.py             |   27 ---------------------------
 python_build/extract_vba.py             |   32 --------------------------------
 src.bak/NewMacros.bas                   |   66 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 src.bak/StringTable.bas                 |   11 +++++++++++
 src.bak/YAML.cls                        |  330 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 src/#NewMacros.bas#                     |   10 ++++++++++
 src/CV.bas                              |  205 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 src/JsonConverter.bas                   | 1123 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 src/Project.ini                         |   32 ++++++++++++++++++++++++++++++++
 src/StringTable.bas                     |   16 ++++++++++++++++
 src/ThisDocument.cls                    |   13 +++++++++++++
 src/YAML.cls                            |  331 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 contents/_rels/.rels                    |    2 --
 contents/customXml/item1.xml            |    1 -
 contents/customXml/itemProps1.xml       |    2 --
 contents/docProps/app.xml               |    2 --
 contents/docProps/core.xml              |    2 --
 contents/word/document.xml              |    2 --
 contents/word/fontTable.xml             |    2 --
 contents/word/numbering.xml             |    2 --
 contents/word/settings.xml              |    2 --
 contents/word/styles.xml                |    2 --
 contents/word/webSettings.xml           |    2 --
 src.bak/Class Modules/YAML.cls          |  353 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 src.bak/Modules/NewMacros.bas           |   58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 src.bak/Modules/YAMLParser_old.bas      |  313 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 src/Class Modules/YAML.cls              |  353 --------------------------------------------------------------------------------
 src/Modules/NewMacros.bas               |   58 ----------------------------------------------------------
 src/Modules/YAMLParser_old.bas          |  313 --------------------------------------------------------------------------------
 contents/customXml/_rels/item1.xml.rels |    2 --
 contents/word/_rels/document.xml.rels   |    2 --
 contents/word/_rels/numbering.xml.rels  |    2 --
 contents/word/_rels/settings.xml.rels   |    2 --
 contents/word/media/image1.png          |    0 
 contents/word/theme/theme1.xml          |    2 --
 56 files changed, 3179 insertions(+), 824 deletions(-)

diff --git a/#*superscratch*# b/#*superscratch*#
new file mode 100644
index 0000000..a5ba7c7 100644
--- /dev/null
+++ a/#*superscratch*#
@@ -1,0 +1,1 @@
cvProps("projects")(ID_SELF)(l)("title")(ID_SELF)
diff --git a/#Makefile# b/#Makefile#
new file mode 100644
index 0000000..e69de29 100644
--- /dev/null
+++ a/#Makefile#
diff --git a/*scratch* b/*scratch*
new file mode 100644
index 0000000..28c7895 100644
--- /dev/null
+++ a/*scratch*
@@ -1,0 +1,308 @@
{
  "___type___": "Dictionary",
  "name": {
    "___type___": "String",
    "___self___": "Jacob Walchuk"
  },
  "email": {
    "___type___": "String",
    "___self___": "walchuk2018@icloud.com"
  },
  "www": {
    "___type___": "String",
    "___self___": "jacob.hcol.uk\n"
  },
  "phones": {
    "___type___": "Array",
    "___self___": [
      {
        "___type___": "Dictionary",
        "cc": {
          "___type___": "String",
          "___self___": "UK"
        },
        "phone": {
          "___type___": "String",
          "___self___": "+44 7519 615 066"
        }
      },
      {
        "___type___": "Dictionary",
        "cc": {
          "___type___": "String",
          "___self___": "CA"
        },
        "phone": {
          "___type___": "String",
          "___self___": "+1 604 880 4825\n"
        }
      }
    ]
  },
  "cv": {
    "___type___": "Array",
    "___self___": [
      {
        "___type___": "Dictionary",
        "title": {
          "___type___": "String",
          "___self___": "Education"
        },
        "entries": {
          "___type___": "Array",
          "___self___": [
            {
              "___type___": "Dictionary",
              "title": {
                "___type___": "String",
                "___self___": "Westside School"
              },
              "location": {
                "___type___": "String",
                "___self___": "Vancouver, Canada"
              },
              "date": {
                "___type___": "String",
                "___self___": "2019---2021"
              },
              "bullets": {
                "___type___": "Array",
                "___self___": [
                  {
                    "___type___": "String",
                    "___self___": "A*A*A*A*A-equivalent marks, per KCL's conversion scale."
                  }
                ]
              }
            },
            {
              "___type___": "Dictionary",
              "title": {
                "___type___": "String",
                "___self___": "Trinity Western University"
              },
              "role": {
                "___type___": "String",
                "___self___": "B.A. in Political Studies"
              },
              "location": {
                "___type___": "String",
                "___self___": "Langley, Canada"
              },
              "date": {
                "___type___": "String",
                "___self___": "2021---2022"
              },
              "bullets": {
                "___type___": "Array",
                "___self___": [
                  {
                    "___type___": "String",
                    "___self___": "Received a 4.23/4.3 grade average in my first year, before transferring."
                  }
                ]
              }
            },
            {
              "___type___": "Dictionary",
              "title": {
                "___type___": "String",
                "___self___": "University of St. Andrews"
              },
              "role": {
                "___type___": "String",
                "___self___": "M.A. Hons. in Philosophy"
              },
              "location": {
                "___type___": "String",
                "___self___": "St. Andrews, Scotland"
              },
              "date": {
                "___type___": "String",
                "___self___": "2022---2025"
              },
              "bullets": {
                "___type___": "Array",
                "___self___": [
                  {
                    "___type___": "String",
                    "___self___": "Standing 2:2 Honours, with a focus on symbolic logic and analytic metaphysics."
                  }
                ]
              }
            }
          ]
        }
      },
      {
        "___type___": "Dictionary",
        "title": {
          "___type___": "String",
          "___self___": "Work Experience"
        },
        "entries": {
          "___type___": "Array",
          "___self___": [
            {
              "___type___": "Dictionary",
              "title": {
                "___type___": "String",
                "___self___": "Kova Engineering, Ltd."
              },
              "role": {
                "___type___": "String",
                "___self___": "Technical Analyst Intern"
              },
              "location": {
                "___type___": "String",
                "___self___": "Langley, Canada"
              },
              "date": {
                "___type___": "String",
                "___self___": "Summer 2023"
              },
              "bullets": {
                "___type___": "Array",
                "___self___": [
                  {
                    "___type___": "String",
                    "___self___": "Discovered employee concerns around an improperly-scaled MySQL database with a ColdFusion frontend, and wrote a longform report on the costs and benefits of a full-stack overhaul to PostgreSQL and Next.js."
                  },
                  {
                    "___type___": "String",
                    "___self___": "Consulted with the CEO, CTO, and other members of the executive team in discovering their needs."
                  },
                  {
                    "___type___": "String",
                    "___self___": "Submitted a code proposal to the lead programmer, which secured and sped up interoperability between the old and new system."
                  }
                ]
              }
            },
            {
              "___type___": "Dictionary",
              "title": {
                "___type___": "String",
                "___self___": "Kova Engineering, Ltd."
              },
              "role": {
                "___type___": "String",
                "___self___": "Assistant I.T. Technician"
              },
              "location": {
                "___type___": "String",
                "___self___": "Langley, Canada"
              },
              "date": {
                "___type___": "String",
                "___self___": "2018---2022"
              },
              "bullets": {
                "___type___": "Array",
                "___self___": [
                  {
                    "___type___": "String",
                    "___self___": "Deployed laptops and servers running Windows, and iPhones using Apple's Device Enrolment Programme."
                  },
                  {
                    "___type___": "String",
                    "___self___": "Onboarded metallurgy technicians with little-to-no IT background."
                  }
                ]
              }
            },
            {
              "___type___": "Dictionary",
              "title": {
                "___type___": "String",
                "___self___": "Free Geek Vancouver"
              },
              "role": {
                "___type___": "String",
                "___self___": "Repair Technician"
              },
              "date": {
                "___type___": "String",
                "___self___": "2017---2018"
              },
              "location": {
                "___type___": "String",
                "___self___": "Vancouver, Canada"
              },
              "bullets": {
                "___type___": "Array",
                "___self___": [
                  {
                    "___type___": "String",
                    "___self___": "Stress-tested PC components including RAM, CPUs, and GPUs, and performed light component-level board repair.\n"
                  }
                ]
              }
            }
          ]
        }
      }
    ]
  },
  "projects": {
    "___type___": "Array",
    "___self___": [
      {
        "___type___": "Dictionary",
        "title": {
          "___type___": "String",
          "___self___": "Book Tracker"
        },
        "description": {
          "___type___": "String",
          "___self___": "Reverse-engineered the SQLite schemas of bibliographic and note-taking software, and wrote a quick Node.js tool to generate progress reports and publish notes to my personal website."
        }
      },
      {
        "___type___": "Dictionary",
        "title": {
          "___type___": "String",
          "___self___": "Homelab"
        },
        "description": {
          "___type___": "String",
          "___self___": "Ran a decommissioned rackmount server at home, deploying KVM on Debian, and later, Xen."
        }
      }
    ]
  },
  "skills": {
    "___type___": "Array",
    "___self___": [
      {
        "___type___": "String",
        "___self___": "Certifications: CompTIA Linux+, IBM Data Analyst Certificate (Excel, Cognos, and R), IBM Data Science Certificate (Python)."
      },
      {
        "___type___": "String",
        "___self___": "Languages: Mandarin (working proficiency), German (basic)."
      },
      {
        "___type___": "String",
        "___self___": "Proficient in VBA, HTML/CSS/JS, and Emacs LISP."
      },
      {
        "___type___": "String",
        "___self___": "Interests: Linguistics, social and economic history, corporate finance.\n"
      }
    ]
  },
  "footer": {
    "___type___": "Array",
    "___self___": [
      {
        "___type___": "String",
        "___self___": "Authorised to work full-time in the UK, without sponsorship."
      },
      {
        "___type___": "String",
        "___self___": "This {{DOCTYPE}} was generated from YAML source using {{LANG}}. For more information, see jacob.hcol.uk/cv.\n"
      }
    ]
  }
}
diff --git a/.#*superscratch* b/.#*superscratch*
new file mode 120000
index 0000000..024e403 120000
--- /dev/null
+++ a/.#*superscratch*
@@ -1,0 +1,1 @@
yaqub@14comma15.5539
diff --git a/Writeup.docm b/Writeup.docm
new file mode 100644
index 0000000000000000000000000000000000000000..9600636b3a8d591b163d1daf514c66dec98fb958 100644
Binary files /dev/null and a/Writeup.docm differdiff --git a/Writeup.pdf b/Writeup.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..fa8452fa6c8b816f7182236e63207455079f82ba 100644
Binary files /dev/null and a/Writeup.pdf differdiff --git a/cv.docm b/cv.docm
index 11f919716d083fab8a94909bb2418ce81c57d78c..d416b5aed90de9e037cdfbc27d6718536fff51fa 100644
Binary files a/cv.docm and a/cv.docm differdiff --git a/cv.docm.bak.2.docm b/cv.docm.bak.2.docm
new file mode 100644
index 0000000000000000000000000000000000000000..2f2e57df5ad8451ce94a54324f5b170537855f50 100644
Binary files /dev/null and a/cv.docm.bak.2.docm differdiff --git a/cv.yml b/cv.yml
index f17f4ab..80b53e3 100644
--- a/cv.yml
+++ a/cv.yml
@@ -9,13 +9,13 @@
    phone: "+1 604 880 4825"

cv:
  - title: Education
  - title: "Education"
    entries:
      - title: "Westside School"
        location: "Vancouver, Canada"
        date: "2019---2021"
        bullets:
          - "/A\*A\*A\*A\*A-equivalent marks, per KCL's conversion scale."
          - "A*A*A*A*A-equivalent marks, per KCL's conversion scale."
      - title: "Trinity Western University"
        role: "B.A. in Political Studies"
        location: "Langley, Canada"
@@ -28,7 +28,7 @@
        date: "2022---2025"
        bullets:
          - "Standing 2:2 Honours, with a focus on symbolic logic and analytic metaphysics."
  - title: Work Experience
  - title: "Work Experience"
    entries:
      - title: "Kova Engineering, Ltd."
        role: "Technical Analyst Intern"
@@ -54,11 +54,9 @@

projects:
  - title: "Book Tracker"
    bullets:
      - "Reverse-engineered the SQLite schemas of bibliographic and note-taking software, and wrote a quick Node.js tool to generate progress reports and publish notes to my personal website."
    description: "Reverse-engineered the SQLite schemas of bibliographic and note-taking software, and wrote a quick Node.js tool to generate progress reports and publish notes to my personal website."
  - title: "Homelab"
    bullets:
      - "Ran a decomissioned rackmount server at home, deploying KVM on Debian, and later, Xen."
    description: "Ran a decommissioned rackmount server at home, deploying KVM on Debian, and later, Xen."
skills:
  - "Certifications: CompTIA Linux+, IBM Data Analyst Certificate (Excel, Cognos, and R), IBM Data Science Certificate (Python)."
  - "Languages: Mandarin (working proficiency), German (basic)."
@@ -66,5 +64,5 @@
  - "Interests: Linguistics, social and economic history, corporate finance."

footer:
  - "Authorised to work full-time in the UK, without sponsorship."
  - "This {{DOCTYPE}} was generated from YAML source using {{LANG}}. For more information, see jacob.hcol.uk/cv."
  - "Authorised to work full-time in the UK, without sponsorship, via an Ancestry Visa."
diff --git a/cvr1.docm b/cvr1.docm
new file mode 100644
index 0000000000000000000000000000000000000000..c3f9537ed316ec1ea3957ba64bbf9d712ea44f70 100644
Binary files /dev/null and a/cvr1.docm differdiff --git a/extract.bat b/extract.bat
new file mode 100644
index 0000000..9456ede 100644
--- /dev/null
+++ a/extract.bat
@@ -1,0 +1,1 @@
"C:\Program Files\VBASync\VBASync.exe" -r -x -f cv.docm -d ./src
diff --git a/publish.bat b/publish.bat
new file mode 100644
index 0000000..9456ede 100644
--- /dev/null
+++ a/publish.bat
@@ -1,0 +1,1 @@
"C:\Program Files\VBASync\VBASync.exe" -r -x -f cv.docm -d ./src
diff --git a/~$cv.docm b/~$cv.docm
new file mode 100644
index 0000000000000000000000000000000000000000..bd673025144cc4e49b5edb59defc86f2ad1da1ac 100644
Binary files /dev/null and a/~$cv.docm differdiff --git a/~$cv.dotx b/~$cv.dotx
new file mode 100644
index 0000000000000000000000000000000000000000..2aa3ec105e3a4389e397b5cbcff3285bd1dd88b6 100644
Binary files /dev/null and a/~$cv.dotx differdiff --git a/~$riteup.docm b/~$riteup.docm
new file mode 100644
index 0000000000000000000000000000000000000000..755566eb55fa0f8a176c8572ecfb990e5dc78a8f 100644
Binary files /dev/null and a/~$riteup.docm differdiff --git a/contents/[Content_Types].xml b/contents/[Content_Types].xml
deleted file mode 100644
index 942889d..0000000 100644
--- a/contents/[Content_Types].xml
+++ /dev/null
@@ -1,2 +1,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Types xmlns="http://schemas.openxmlformats.org/package/2006/content-types"><Default Extension="png" ContentType="image/png"/><Default Extension="rels" ContentType="application/vnd.openxmlformats-package.relationships+xml"/><Default Extension="xml" ContentType="application/xml"/><Override PartName="/word/document.xml" ContentType="application/vnd.ms-word.document.macroEnabled.main+xml"/><Override PartName="/customXml/itemProps1.xml" ContentType="application/vnd.openxmlformats-officedocument.customXmlProperties+xml"/><Override PartName="/word/numbering.xml" ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml"/><Override PartName="/word/styles.xml" ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml"/><Override PartName="/word/settings.xml" ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.settings+xml"/><Override PartName="/word/webSettings.xml" ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.webSettings+xml"/><Override PartName="/word/fontTable.xml" ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.fontTable+xml"/><Override PartName="/word/theme/theme1.xml" ContentType="application/vnd.openxmlformats-officedocument.theme+xml"/><Override PartName="/docProps/core.xml" ContentType="application/vnd.openxmlformats-package.core-properties+xml"/><Override PartName="/docProps/app.xml" ContentType="application/vnd.openxmlformats-officedocument.extended-properties+xml"/></Types>
diff --git a/examples/CV.docx b/examples/CV.docx
deleted file mode 100644
index fa41516f3503c90a6cb22b3881be0e16faa46706..0000000000000000000000000000000000000000 100644
Binary files a/examples/CV.docx and /dev/null differdiff --git a/examples/CV.pdf b/examples/CV.pdf
deleted file mode 100644
index abd4a4d473629eb70a70627ead7da8f1cdb965a2..0000000000000000000000000000000000000000 100644
Binary files a/examples/CV.pdf and /dev/null differdiff --git a/examples/Jacob Walchuk CV Rev0.pdf b/examples/Jacob Walchuk CV Rev0.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..34b7516856dca014c5da11fe1a5d0c922ab95090 100644
Binary files /dev/null and a/examples/Jacob Walchuk CV Rev0.pdf differdiff --git a/examples/specimen.docx b/examples/specimen.docx
new file mode 100644
index 0000000000000000000000000000000000000000..16c56c704dc8e642ca22dea42c3c03340f56e5b4 100644
Binary files /dev/null and a/examples/specimen.docx differdiff --git a/examples/specimen.pdf b/examples/specimen.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..abd4a4d473629eb70a70627ead7da8f1cdb965a2 100644
Binary files /dev/null and a/examples/specimen.pdf differdiff --git a/python_build/compile_vba.py b/python_build/compile_vba.py
deleted file mode 100644
index 8a41eb8..0000000 100644
--- a/python_build/compile_vba.py
+++ /dev/null
@@ -1,27 +1,0 @@
from vbaProjectCompiler.vbaProject import VbaProject
from vbaProjectCompiler.ole_file import OleFile

def compile_vba(input_dir, docm_file):
    # Initialize the VbaProject object
    vba_project = VbaProject()

    # Load the VBA project from the extracted directory
    vba_project.addDirectory(input_dir)

    # Create the OLE file with the VBA project
    ole_file = OleFile(vba_project)
    ole_file.writeFile(docm_file)

    print(f"VBA project compiled and saved to {docm_file}")

if __name__ == "__main__":
    import sys

    if len(sys.argv) != 3:
        print("Usage: python compile_vba.py <input_directory> <output_docm_file>")
        sys.exit(1)

    input_dir = sys.argv[1]
    docm_file = sys.argv[2]

    compile_vba(input_dir, docm_file)
diff --git a/python_build/extract_vba.py b/python_build/extract_vba.py
deleted file mode 100644
index 9429ad8..0000000 100644
--- a/python_build/extract_vba.py
+++ /dev/null
@@ -1,32 +1,0 @@
from oletools.olevba import VBA_Parser
import os

def extract_vba(docm_file, output_dir):
    # Ensure output directory exists
    os.makedirs(output_dir, exist_ok=True)

    # Parse the .docm file to extract VBA code
    vba_parser = VBA_Parser(docm_file)
    if vba_parser.detect_vba_macros():
        for (filename, stream_path, vba_filename, vba_code) in vba_parser.extract_macros():
            # Save each extracted VBA file to the output directory
            output_file_path = os.path.join(output_dir, vba_filename)
            with open(output_file_path, 'w') as vba_file:
                vba_file.write(vba_code)
                print(f"Extracted {vba_filename} to {output_file_path}")
    else:
        print("No VBA macros found in the document.")

    vba_parser.close()

if __name__ == "__main__":
    import sys

    if len(sys.argv) != 3:
        print("Usage: python extract_vba.py <input_docm_file> <output_directory>")
        sys.exit(1)

    docm_file = sys.argv[1]
    output_dir = sys.argv[2]

    extract_vba(docm_file, output_dir)
diff --git a/src.bak/NewMacros.bas b/src.bak/NewMacros.bas
new file mode 100644
index 0000000..9354112 100644
--- /dev/null
+++ a/src.bak/NewMacros.bas
@@ -1,0 +1,66 @@
Attribute VB_Name = "NewMacros"
Option Explicit

Sub Macro1()
Attribute Macro1.VB_ProcData.VB_Invoke_Func = "Normal.NewMacros.Macro1"
'
' Macro1 Macro
'
'
    Dim cvYAML As Object: Set cvYAML = New YAML
    cvYAML.path = "\\Mac\iCloud\Development\cv\cv.yml"
    Dim cvProps As Object: Set cvProps = cvYAML.props
    Debug.Print cvProps("name")(ID_SELF)
    'Dim cvProps As Dictionary:
    
    'Debug.Print cvProps("name")(ID_SELF)

    'Selection.Style = ActiveDocument.Styles("Title")
    'Selection.TypeText Text:="This is a title"
    'Selection.TypeParagraph
    'Selection.TypeParagraph
    'Selection.Style = ActiveDocument.Styles("Heading 1")
    'Selection.TypeText Text:="Heading 1"
    'Selection.TypeParagraph
    'Selection.Style = ActiveDocument.Styles("No Spacing")
    'Selection.TypeText Text:="Whatababab"
    'Selection.TypeParagraph
    'With ListGalleries(wdBulletGallery).ListTemplates(1).ListLevels(1)
    '    .NumberFormat = ChrW(61623)
    '    .TrailingCharacter = wdTrailingTab
    '    .NumberStyle = wdListNumberStyleBullet
    '    .NumberPosition = InchesToPoints(0.25)
    '    .Alignment = wdListLevelAlignLeft
    '    .TextPosition = InchesToPoints(0.5)
    '    .TabPosition = wdUndefined
    '    .ResetOnHigher = 0
    '    .StartAt = 1
    '    With .Font
    '        .Bold = wdUndefined
    '        .Italic = wdUndefined
    '        .StrikeThrough = wdUndefined
    '        .Subscript = wdUndefined
    '        .Superscript = wdUndefined
    '        .Shadow = wdUndefined
    '        .Outline = wdUndefined
    '        .Emboss = wdUndefined
    '        .Engrave = wdUndefined
    '        .AllCaps = wdUndefined
    '        .Hidden = wdUndefined
    '        .Underline = wdUndefined
    '        .Color = wdUndefined
    '        .Size = wdUndefined
    '        .Animation = wdUndefined
    '        .DoubleStrikeThrough = wdUndefined
    '        .Name = "Symbol"
    '    End With
    '    .LinkedStyle = ""
    'End With
    'ListGalleries(wdBulletGallery).ListTemplates(1).Name = ""
    'Selection.Range.ListFormat.ApplyListTemplateWithLevel ListTemplate:= _
    '    ListGalleries(wdBulletGallery).ListTemplates(1), ContinuePreviousList:= _
    '    False, ApplyTo:=wdListApplyToWholeList, DefaultListBehavior:= _
    '    wdWord10ListBehavior
    'Selection.TypeText Text:="This is a bulletted list created manually"
    'Selection.EscapeKey
End Sub
diff --git a/src.bak/StringTable.bas b/src.bak/StringTable.bas
new file mode 100644
index 0000000..9c5803e 100644
--- /dev/null
+++ a/src.bak/StringTable.bas
@@ -1,0 +1,11 @@
Attribute VB_Name = "StringTable"
Option Explicit

Public Const ID_SELF As String = "___self___"
Public Const ID_TYPE As String = "___type___"

Public Const MESSAGE_ERROR_GENERIC As String = "YAML Error"
Public Const MESSAGE_MALFORMED_TYPE As String = "Malformed YAML code on line "
Public Const MESSAGE_MALFORMED_YAML As String = "Malformed type error - this is a problem with the internal dictionary"
Public Const MESSAGE_GETPROP_NOT_STR As String = "Your module has tried to use getProp(), which is meant for type String, on a "
Public Const MESSAGE_GETPROP_NOT_FOUND As String = "Property not found."
diff --git a/src.bak/YAML.cls b/src.bak/YAML.cls
new file mode 100644
index 0000000..3ca3575 100644
--- /dev/null
+++ a/src.bak/YAML.cls
@@ -1,0 +1,330 @@
VERSION 1.0 CLASS
BEGIN
  MultiUse = -1  'True
END
Attribute VB_Name = "YAML"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = False
Attribute VB_Exposed = False
Option Explicit

' Const yamlPath As String = "\\Mac\iCloud\Development\cv\cv.yml"

Public yamlPath As String

Private Function RemoveEmptyStrings(arr() As String) As String()
    Dim tempArray() As String
    Dim i As Integer, j As Integer: j = 0
    ReDim tempArray(LBound(arr) To UBound(arr))
    j = 0
    For i = LBound(arr) To UBound(arr)
        If Len(arr(i)) > 0 Then
            tempArray(j) = arr(i)
            j = j + 1
        End If
    Next i
    ReDim Preserve tempArray(0 To j - 1)
    RemoveEmptyStrings = tempArray
End Function


Private Function RegexMatch(inputString As String, pattern As String, Optional isGlobal As Boolean = True) As Boolean
    ' checks for regex match without instantiating 80 gazillion objects
    
    ' parameters
    ' isGlobal: whether the regex check is global
    
    Dim Regex As Object: Set Regex = CreateObject("VBScript.RegExp")
    Regex.pattern = pattern
    Regex.Global = isGlobal
    RegexMatch = Regex.Test(inputString)
End Function

Private Function RegexSplit(inputString As String, pattern As String, Optional onlyFirst As Boolean = False, Optional splitBefore As Boolean = False) As String()
    ' splits array at any pattern that matches a regex
    
    ' parameters
    ' onlyFirst: if true, only splits the first instance of the match, creating an array of length 2
    ' splitBefore: if true, preserves the actual instance of the match
    
    Dim Regex As Object: Set Regex = CreateObject("VBScript.RegExp")
    Dim matches As Object
    Dim match As Object
    Dim splitParts() As String: ReDim splitParts(0 To 0)
    Dim pos As Integer
    Dim lastPos As Integer: lastPos = 1
    Dim i As Integer: i = 0
    
    ' set regex flags
    Regex.Global = True
    Regex.IgnoreCase = False
    Regex.pattern = pattern
    
    Set matches = Regex.Execute(inputString)
    
    ' lastPos = 1
    ' i = 0
    
    For Each match In matches
        pos = match.FirstIndex + 1
        ReDim Preserve splitParts(i)
        splitParts(i) = Mid(inputString, lastPos, pos - lastPos)
        If splitBefore Then
            lastPos = pos
        Else
            lastPos = pos + Len(match.Value)
        End If
        i = i + 1
        If onlyFirst Then Exit For
    Next match
    
    If lastPos <= Len(inputString) Then
        ReDim Preserve splitParts(i)
        splitParts(i) = Mid(inputString, lastPos)
    End If
    
    ' retvrn
    RegexSplit = RemoveEmptyStrings(splitParts)
End Function

Private Function RegexSubstitute(inputString As String, pattern As String, Optional substitution As String = "")
    ' does what it says on the tin
    Dim Regex As Object: Set Regex = CreateObject("VBScript.RegExp")
    Regex.pattern = pattern
    Regex.IgnoreCase = False
    Regex.Global = True
    RegexSubstitute = Regex.Replace(inputString, substitution)
End Function

' YAML Layer Parser Pseudocode
' ====
' function GetYAMLLayerAsCollection(String fromYAML) {
'    Collection mainDictionary = New Collection();
'    if (fromYAML.containsRegex(/\n[A-Za-z]/)) {
'      // is a dictionary
'      String[] temporaryArray = fromYAML.split(/\n[A-Za-z]/);
'      for each x in temporaryArray {
'        x.splitByFirstInstanceOf(':\n');
'        x[1].replaceAllInstancesOf('
'        mainDictionary.add(x[0], x[1]);
'      }
'    } else if (fromYAML.containsRegex(/\n-/)) {
'      // if array, process the array and return it as "self"
'      String[] temporaryArray = fromYAML.splitBy('\n-');
'      for each x in temporaryArray {
'        x.removeAllInstancesOf('\n- ');
'        x.replaceAllInstancesOf('\n  ', '\n');
'        mainDictionary.add("self", temporaryArray);
'      }
'    } else if (fromYAML.startsWith('"')) {
'      mainDictionary.add("self", removeQuotes(fromYAML));
'    } else {
'      MsgBox("Processing error: neither array, dictionary, nor string");
'    }
' }


Private Function GetYAMLLayerAsDictionary(fromYAML As String) As Dictionary
    Dim mainDictionary As Dictionary: Set mainDictionary = New Dictionary
    ' create regex objects to test for dict, array, and string
    
    'Dim regEx_dict As Object: Set regEx_dict = CreateObject("VBScript.RegExp")
    'Dim regEx_arry As Object: Set regEx_arry = CreateObject("VBScript.RegExp")
    'Dim regEx_strn As Object: Set regEx_strn = CreateObject("VBScript.RegExp")
    
    'regEx_dict.Global = True:  regEx_dict.Pattern = "\n[A-Za-z]"
    'regEx_arry.Global = True:  regEx_arry.Pattern = "\n-\s"
    'regEx_strn.Global = False: regEx_strn.Pattern = "^\s*""(.*?)""\s*$"

    
    Dim parts() As String
    
    If RegexMatch(fromYAML, "(?:\n|\^)\w+:", True) Then
        ' is a dictionary
        parts = RegexSplit(fromYAML, "\n\w+:", False, True)
        Dim part As Variant ' not sure why it can't be as string but whatever billy gates
        Call mainDictionary.Add(ID_TYPE, "Dictionary") ' identify as dict
        For Each part In parts
            Dim keyValue() As String: keyValue = RegexSplit(CStr(part), ":\s", True)
            ' trim trailing \n from category
            If UBound(keyValue) > 0 Then
                keyValue(0) = RegexSubstitute(keyValue(0), "^\n+")
                ' trim 2 spaces off of each line if they're there
                keyValue(1) = RegexSubstitute(keyValue(1), "^\s{2}")
                keyValue(1) = RegexSubstitute(keyValue(1), "\n\s{2}", vbLf)
                Call mainDictionary.Add(keyValue(0), keyValue(1))
            End If
        Next part
    ElseIf RegexMatch(fromYAML, "^-\s", True) Then
        ' is an array
        Call mainDictionary.Add(ID_TYPE, "Array")
        parts = RegexSplit(fromYAML, "(^|\n)-\s", False)
        Dim i As Integer
        For i = LBound(parts) To UBound(parts)
            parts(i) = RegexSubstitute(parts(i), "\n\s{2}", vbLf)
        Next i
        Call mainDictionary.Add(ID_SELF, parts)
    ElseIf RegexMatch(fromYAML, "^\s*""(.*?)""\s*$", True) Then

        ' is a string
        Call mainDictionary.Add(ID_TYPE, "String")
        Call mainDictionary.Add(ID_SELF, RegexSubstitute(fromYAML, """", ""))
    Else
        Call mainDictionary.Add(ID_SELF, "")
        Debug.Print _
        "Neither array, dictionary, nor string:" & _
        vbCrLf & vbCrLf & fromYAML & vbCrLf & vbCrLf & _
        "Make sure all strings are enclosed in double quotes." ', _
        'vbOKOnly, "YAML Error")
    End If
    
    Set GetYAMLLayerAsDictionary = mainDictionary
End Function

' YAML Traverser Pseudocode
' ===
'
' function TraverseYAML(String fromYAML) {
'   Dictionary mainDictionary = GetYAMLLayerAsDictionary(fromYAML);
'   if mainDictionary.___type___ = "Dictionary" {
'     for each entry in mainDictionary {
'       TraverseYAML(entry)
'     }
'     return mainDictionary;
'   } else if mainDictionary.___type___ = "Array" {
'     for each entry in mainDictionary.___self___ {
'       TraverseYAML(entry)
'     }
'     return mainDictionary;
'   } else if mainDictionary.___type___ = "String" {
'     return mainDictionary;
'   } else {
'     MsgBox("Internal YAML Error")
'   }
' }
Private Function GetYAMLAsDictionary(fromYAML As String) As Dictionary
    Dim mainDictionary As Object: Set mainDictionary = GetYAMLLayerAsDictionary(fromYAML)
    Dim entry As Variant
    If mainDictionary(ID_TYPE) = "Dictionary" Then
        For Each entry In mainDictionary
            Debug.Print "=== PROCESSING DICTIONARY ENTRY ==="
            Debug.Print entry & " => " & mainDictionary(entry)
            If entry <> ID_TYPE And entry <> ID_SELF Then
                Set mainDictionary(entry) = GetYAMLAsDictionary(mainDictionary(entry))
            End If
        Next entry
    ElseIf mainDictionary(ID_TYPE) = "Array" Then
        Dim i As Integer
        Dim subArray() As Object
        For i = LBound(mainDictionary(ID_SELF)) To UBound(mainDictionary(ID_SELF))
            Debug.Print "=== PROCESSING ARRAY ENTRY ==="
            Debug.Print mainDictionary(ID_SELF)(i)
            'Set subDictionary = GetYAMLAsDictionary(mainDictionary(ID_SELF)(i))
            'Set mainDictionary(ID_SELF)(i) = subDictionary
            ReDim Preserve subArray(i)
            Set subArray(i) = GetYAMLAsDictionary(CStr(mainDictionary(ID_SELF)(i)))
        Next i
        
        mainDictionary(ID_SELF) = subArray
    ElseIf mainDictionary(ID_TYPE) <> "String" Then
        Debug.Print MESSAGE_MALFORMED_TYPE ', vbOKOnly, errIdentifier)
    End If
    Set GetYAMLAsDictionary = mainDictionary
End Function

' YAML Cleaner Pseudocode
' =====
' function YAMLCleaner(Dictionary mainDictionary) {
'   for each entry in mainDictionary {
'     if entry(ID_TYPE) == "Dictionary" {
'       for each secondOrderEntry in entry {
'         YAMLCleaner(secondOrderEntry)
'       }
'     } else if entry(ID_TYPE) == "Array" {
'       for each secondOrderEntry in entry(ID_SELF) {
'         YAMLCleaner(secondOrderEntry)
'       }
'     }
'     if entry(ID_TYPE) != "Dictionary" {
'       mainDictionary(entry) = mainDictionary(entry)(ID_SELF)
'     }
'   }
'   return mainDictionary;
' }

'Function YAMLCleaner(mainDictionary As Dictionary) As Dictionary
'    Dim entry As Variant
'    If mainDictionary(ID_TYPE) = "Array" Then ' go through array and yamlclean it
'        Dim i As Integer
'        Debug.Print JsonConverter.ConvertToJson(mainDictionary)
'        For i = LBound(mainDictionary(ID_SELF)) To UBound(mainDictionary(ID_SELF))
'
'            'If IsObject(mainDictionary(ID_SELF)(i)) Then
'                'Set mainDictionary(ID_SELF)(i) = YAMLCleaner(mainDictionary(ID_SELF)(i))
'            'Else
'            '    Debug.Print "encountered non-object"
'            'End If
'        Next i
'    End If
'    If mainDictionary(ID_TYPE) = "Dictionary" Then 'iterate through dict and yamlclena it
'        For Each entry In mainDictionary
'            If entry <> ID_TYPE Then
'                Set mainDictionary(entry) = YAMLCleaner(mainDictionary(entry))
'            End If
'        Next entry
'    End If
'
'    For Each entry In mainDictionary
'        If mainDictionary(ID_TYPE) = "Dictionary" And mainDictionary(entry)(ID_TYPE) <> "Dictionary" And entry <> ID_TYPE And entry <> ID_SELF Then
'            Debug.Print "processing " & entry & " which is " & mainDictionary(entry)(ID_TYPE)
'            If IsObject(mainDictionary(entry)(ID_SELF)) Then
'                Set mainDictionary(entry) = mainDictionary(entry)(ID_SELF)
'            Else
'                mainDictionary(entry) = mainDictionary(entry)(ID_SELF)
'            End If
'        End If
'    Next entry
'
'    ' destroy type identifier?
'    Set YAMLCleaner = mainDictionary
'End Function

Private Function GetFileAsString(filePath As String) As String
    ' Dim fileContent As String
    Dim line As String
    Dim fileNumber As Integer
    
    'filePath = "\\Mac\iCloud\Development\cv\cv.yml"
    
    fileNumber = FreeFile()
    
    Open filePath For Input As fileNumber
    
    Do While Not EOF(fileNumber)
        Line Input #fileNumber, line
        GetFileAsString = GetFileAsString & line & vbCrLf
    Loop
End Function

Public Property Let path(thePath As String)
    yamlPath = thePath
End Property

Public Property Get path() As String
    path = yamlPath
End Property

Public Property Get props() As Dictionary
    Set props = GetYAMLAsDictionary(GetFileAsString(yamlPath))
End Property

' YAML Indexer Pseudocode [implement later]
' =====
' function index(string theIndex) {
'   Variant[] mainArray = theIndex.split(".");
'   Dictionary mainDictionary = yamlProps;
'   for each entry in mainArray {
'     if entry is {
'
'     ....


diff --git a/src/#NewMacros.bas# b/src/#NewMacros.bas#
new file mode 100644
index 0000000..f15f425 100644
--- /dev/null
+++ a/src/#NewMacros.bas#
@@ -1,0 +1,10 @@
Attribute VB_Name = "NewMacros"
Option Explicit

Sub Macro1()
Attribute Macro1.VB_ProcData.VB_Invoke_Func = "Normal.NewMacros.Macro1"
    Dim cvYAML As Object: Set cvYAML = New YAML
    cvYAML.path = "\\Mac\iCloud\Development\cv\cv.yml"
    Dim cvProps As Object: Set cvProps = cvYAML.props
    Debug.Print cvProps("name")(ID_SELF)
End Sub
diff --git a/src/CV.bas b/src/CV.bas
new file mode 100644
index 0000000..2304e20 100644
--- /dev/null
+++ a/src/CV.bas
@@ -1,0 +1,205 @@
Attribute VB_Name = "CV"
Option Explicit

Function DrawTitle(theTitle As String)
    Selection.Style = ActiveDocument.Styles("Title")
    Selection.TypeText Text:=theTitle
    Selection.TypeParagraph
End Function

Function DrawSubtitle(theSubtitle As String)
    Selection.Style = ActiveDocument.Styles("Heading 1")
    Selection.TypeText Text:=theSubtitle
    Selection.TypeParagraph
End Function

Function DrawNormalText(theText As String)
    Selection.Style = ActiveDocument.Styles("Normal")
    Selection.TypeText Text:=theText
End Function

Function DrawSmallCaps(theSmallCaps As String)
    With Selection.Font
        .Bold = True
        .SmallCaps = True
    End With
    Selection.TypeText Text:=theSmallCaps
End Function

Function DrawTabEntry(theTabEntry As String)
    Selection.ParagraphFormat.TabStops.ClearAll
    ActiveDocument.DefaultTabStop = InchesToPoints(0.5)
    Selection.ParagraphFormat.TabStops.Add Position:=InchesToPoints(6.5), _
        Alignment:=wdAlignTabRight, Leader:=wdTabLeaderSpaces
    Selection.TypeText Text:=vbTab
    Selection.Font.Bold = wdToggle
    With Selection.Font
        .Bold = False
        .Italic = False
        .SmallCaps = False
        .Color = RGB(GREY_VALUE, GREY_VALUE, GREY_VALUE)
    End With
    Selection.TypeText Text:=theTabEntry
    Selection.TypeParagraph
    ' reset to normal
    Selection.Style = ActiveDocument.Styles("Normal")
End Function

Function DrawBulletedList(theBulletEntries() As String)
    With ListGalleries(wdBulletGallery).ListTemplates(1).ListLevels(1)
        .NumberFormat = ChrW(61623) ' Bullet character
        .NumberStyle = wdListNumberStyleBullet
        .NumberPosition = InchesToPoints(0.25)
        .TextPosition = InchesToPoints(0.5)
        .Font.Name = "Symbol"
    End With
    
    ' Apply bullet list formatting to the selection
    Selection.Range.ListFormat.ApplyListTemplateWithLevel _
        ListTemplate:=ListGalleries(wdBulletGallery).ListTemplates(1), _
        ContinuePreviousList:=False, _
        ApplyTo:=wdListApplyToWholeList, _
        DefaultListBehavior:=wdWord10ListBehavior

    ' Insert each bullet entry
    Dim bulletEntry As Variant
    For Each bulletEntry In theBulletEntries
        Selection.TypeText Text:=bulletEntry
        Selection.TypeParagraph
    Next bulletEntry
    
    ' Remove bullet list formatting after the list is complete
    Selection.Range.ListFormat.RemoveNumbers NumberType:=wdNumberParagraph
    Selection.TypeParagraph
End Function

Function DrawCompoundBulletedList(theTitles() As String, theDescriptions() As String)
    With ListGalleries(wdBulletGallery).ListTemplates(1).ListLevels(1)
        .NumberFormat = ChrW(61623) ' Bullet character
        .NumberStyle = wdListNumberStyleBullet
        .NumberPosition = InchesToPoints(0.25)
        .TextPosition = InchesToPoints(0.5)
        .Font.Name = "Symbol"
    End With
    
    ' Apply bullet list formatting to the selection
    Selection.Range.ListFormat.ApplyListTemplateWithLevel _
        ListTemplate:=ListGalleries(wdBulletGallery).ListTemplates(1), _
        ContinuePreviousList:=False, _
        ApplyTo:=wdListApplyToWholeList, _
        DefaultListBehavior:=wdWord10ListBehavior
    
    If (UBound(theTitles) - LBound(theTitles)) <> (UBound(theTitles) - LBound(theTitles)) Then
        MsgBox "Internal error in projects; this will result in an array bound error."
    End If
    
    ' Insert each bullet entry
    Dim i As Integer
    For i = LBound(theTitles) To UBound(theTitles)
        With Selection.Font
            .Bold = True
            .SmallCaps = True
        End With
        Selection.TypeText Text:="bar" ' theTitles(i)
        With Selection.Font
            .Bold = False
            .SmallCaps = False
        End With
        Selection.TypeText Text:=" - baz" ' " " & ChrW(8212) & " " & theDescriptions(i)
        Selection.TypeParagraph
    Next i
    
    ' Remove bullet list formatting after the list is complete
    Selection.Range.ListFormat.RemoveNumbers NumberType:=wdNumberParagraph
    Selection.TypeParagraph
End Function

Sub DrawCV()
Attribute DrawCV.VB_ProcData.VB_Invoke_Func = "Normal.NewMacros.Macro1"
    Dim cvYAML As Object: Set cvYAML = New YAML
    
    ' Q: Why is the business logic so terrible?
    '    Why is every area of the dictionary referenced from the root with loads of ID_SELFs?
    '    Why not assign it to variables to make it shorter?
    
    ' A: Because VBA does not permit setting array length at runtime, and also seems
    '    to crash with some sort of memory error when assigning subdictionaries to their
    '    own variable.
    '
    '    If I could go back to the drawing board, I probably would have drafted a better solution
    '    (for example not using dictionaries and making the YAML class its own thing)
    '    but at this stage of the project the perfect is the enemy of the good.
    
    cvYAML.path = YAML_PATH
    
    Dim cvProps As Scripting.Dictionary: Set cvProps = cvYAML.props
    
    ' read name
    
    DrawTitle CStr(cvProps("name")(ID_SELF))
    
    ' iterate through subheadings of "cv"
    
    Dim i As Integer: i = 0
    Dim j As Integer: j = 0
    
    For i = LBound(cvProps("cv")(ID_SELF)) To UBound(cvProps("cv")(ID_SELF))
        DrawSubtitle CStr(cvProps("cv")(ID_SELF)(i)("title")(ID_SELF))
        ' iterate through entries
        For j = _
            LBound(cvProps("cv")(ID_SELF)(i)("entries")(ID_SELF)) To _
            UBound(cvProps("cv")(ID_SELF)(i)("entries")(ID_SELF))
            
            DrawSmallCaps CStr(cvProps("cv")(ID_SELF)(i)("entries")(ID_SELF)(j)("title")(ID_SELF))
            DrawTabEntry CStr(cvProps("cv")(ID_SELF)(i)("entries")(ID_SELF)(j)("date")(ID_SELF))
            
            If cvProps("cv")(ID_SELF)(i)("entries")(ID_SELF)(j).Exists("role") Then
                DrawNormalText CStr(cvProps("cv")(ID_SELF)(i)("entries")(ID_SELF)(j)("role")(ID_SELF))
                If cvProps("cv")(ID_SELF)(i)("entries")(ID_SELF)(j).Exists("location") Then
                DrawTabEntry CStr(cvProps("cv")(ID_SELF)(i)("entries")(ID_SELF)(j)("location")(ID_SELF))
                End If
            End If
            
            ' iterate through the bullets of the respective entry
            
            Dim k As Integer
            Dim bulletedList() As String
            
            ReDim bulletedList(LBound(cvProps("cv")(ID_SELF)(i)("entries")(ID_SELF)(j)("bullets")(ID_SELF)) To _
                               UBound(cvProps("cv")(ID_SELF)(i)("entries")(ID_SELF)(j)("bullets")(ID_SELF)))
            For k = LBound(cvProps("cv")(ID_SELF)(i)("entries")(ID_SELF)(j)("bullets")(ID_SELF)) To _
                    UBound(cvProps("cv")(ID_SELF)(i)("entries")(ID_SELF)(j)("bullets")(ID_SELF))
                bulletedList(k) = CStr(cvProps("cv")(ID_SELF)(i)("entries")(ID_SELF)(j)("bullets")(ID_SELF)(k)(ID_SELF))
            Next k
            DrawBulletedList bulletedList
       Next j
    Next i
    
    ' iterate through projects
    
    DrawSubtitle "Projects"
    
    Dim l As Integer
    Dim titles() As String
    Dim descriptions() As String
    ReDim titles(LBound(cvProps("projects")(ID_SELF)) To UBound(cvProps("projects")(ID_SELF)))
    ReDim descriptions(LBound(cvProps("projects")(ID_SELF)) To UBound(cvProps("projects")(ID_SELF)))
    
    For l = LBound(cvProps("projects")(ID_SELF)) To UBound(cvProps("projects")(ID_SELF))
        ' Debug.Print JsonConverter.ConvertToJson(cvProps("projects")(ID_SELF)(l), 2)
        titles(l) = CStr(cvProps("projects")(ID_SELF)(l)("title")(ID_SELF))
        descriptions(l) = CStr(cvProps("projects")(ID_SELF)(l)("title")(ID_SELF))
    Next l
    
    DrawCompoundBulletedList titles, descriptions
    
    ' iterate through skills
    
End Sub

Sub JsonTroubleshoot()
    Dim cvYAML As Object: Set cvYAML = New YAML
    cvYAML.path = YAML_PATH
    Dim cvProps As Scripting.Dictionary: Set cvProps = cvYAML.props
    DrawNormalText JsonConverter.ConvertToJson(cvProps, 2)
End Sub
diff --git a/src/JsonConverter.bas b/src/JsonConverter.bas
new file mode 100644
index 0000000..0767e1d 100644
--- /dev/null
+++ a/src/JsonConverter.bas
@@ -1,0 +1,1123 @@
Attribute VB_Name = "JsonConverter"
''
' VBA-JSON v2.3.1
' (c) Tim Hall - https://github.com/VBA-tools/VBA-JSON
'
' JSON Converter for VBA
'
' Errors:
' 10001 - JSON parse error
'
' @class JsonConverter
' @author tim.hall.engr@gmail.com
' @license MIT (http://www.opensource.org/licenses/mit-license.php)
'' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ '
'
' Based originally on vba-json (with extensive changes)
' BSD license included below
'
' JSONLib, http://code.google.com/p/vba-json/
'
' Copyright (c) 2013, Ryo Yokoyama
' All rights reserved.
'
' Redistribution and use in source and binary forms, with or without
' modification, are permitted provided that the following conditions are met:
'     * Redistributions of source code must retain the above copyright
'       notice, this list of conditions and the following disclaimer.
'     * Redistributions in binary form must reproduce the above copyright
'       notice, this list of conditions and the following disclaimer in the
'       documentation and/or other materials provided with the distribution.
'     * Neither the name of the <organization> nor the
'       names of its contributors may be used to endorse or promote products
'       derived from this software without specific prior written permission.
'
' THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
' ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
' WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
' DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
' DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
' (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
' LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
' ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
' (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
' SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ '
Option Explicit

' === VBA-UTC Headers
#If Mac Then

#If VBA7 Then

' 64-bit Mac (2016)
Private Declare PtrSafe Function utc_popen Lib "/usr/lib/libc.dylib" Alias "popen" _
    (ByVal utc_Command As String, ByVal utc_Mode As String) As LongPtr
Private Declare PtrSafe Function utc_pclose Lib "/usr/lib/libc.dylib" Alias "pclose" _
    (ByVal utc_File As LongPtr) As LongPtr
Private Declare PtrSafe Function utc_fread Lib "/usr/lib/libc.dylib" Alias "fread" _
    (ByVal utc_Buffer As String, ByVal utc_Size As LongPtr, ByVal utc_Number As LongPtr, ByVal utc_File As LongPtr) As LongPtr
Private Declare PtrSafe Function utc_feof Lib "/usr/lib/libc.dylib" Alias "feof" _
    (ByVal utc_File As LongPtr) As LongPtr

#Else

' 32-bit Mac
Private Declare Function utc_popen Lib "libc.dylib" Alias "popen" _
    (ByVal utc_Command As String, ByVal utc_Mode As String) As Long
Private Declare Function utc_pclose Lib "libc.dylib" Alias "pclose" _
    (ByVal utc_File As Long) As Long
Private Declare Function utc_fread Lib "libc.dylib" Alias "fread" _
    (ByVal utc_Buffer As String, ByVal utc_Size As Long, ByVal utc_Number As Long, ByVal utc_File As Long) As Long
Private Declare Function utc_feof Lib "libc.dylib" Alias "feof" _
    (ByVal utc_File As Long) As Long

#End If

#ElseIf VBA7 Then

' http://msdn.microsoft.com/en-us/library/windows/desktop/ms724421.aspx
' http://msdn.microsoft.com/en-us/library/windows/desktop/ms724949.aspx
' http://msdn.microsoft.com/en-us/library/windows/desktop/ms725485.aspx
Private Declare PtrSafe Function utc_GetTimeZoneInformation Lib "kernel32" Alias "GetTimeZoneInformation" _
    (utc_lpTimeZoneInformation As utc_TIME_ZONE_INFORMATION) As Long
Private Declare PtrSafe Function utc_SystemTimeToTzSpecificLocalTime Lib "kernel32" Alias "SystemTimeToTzSpecificLocalTime" _
    (utc_lpTimeZoneInformation As utc_TIME_ZONE_INFORMATION, utc_lpUniversalTime As utc_SYSTEMTIME, utc_lpLocalTime As utc_SYSTEMTIME) As Long
Private Declare PtrSafe Function utc_TzSpecificLocalTimeToSystemTime Lib "kernel32" Alias "TzSpecificLocalTimeToSystemTime" _
    (utc_lpTimeZoneInformation As utc_TIME_ZONE_INFORMATION, utc_lpLocalTime As utc_SYSTEMTIME, utc_lpUniversalTime As utc_SYSTEMTIME) As Long

#Else

Private Declare Function utc_GetTimeZoneInformation Lib "kernel32" Alias "GetTimeZoneInformation" _
    (utc_lpTimeZoneInformation As utc_TIME_ZONE_INFORMATION) As Long
Private Declare Function utc_SystemTimeToTzSpecificLocalTime Lib "kernel32" Alias "SystemTimeToTzSpecificLocalTime" _
    (utc_lpTimeZoneInformation As utc_TIME_ZONE_INFORMATION, utc_lpUniversalTime As utc_SYSTEMTIME, utc_lpLocalTime As utc_SYSTEMTIME) As Long
Private Declare Function utc_TzSpecificLocalTimeToSystemTime Lib "kernel32" Alias "TzSpecificLocalTimeToSystemTime" _
    (utc_lpTimeZoneInformation As utc_TIME_ZONE_INFORMATION, utc_lpLocalTime As utc_SYSTEMTIME, utc_lpUniversalTime As utc_SYSTEMTIME) As Long

#End If

#If Mac Then

#If VBA7 Then
Private Type utc_ShellResult
    utc_Output As String
    utc_ExitCode As LongPtr
End Type

#Else

Private Type utc_ShellResult
    utc_Output As String
    utc_ExitCode As Long
End Type

#End If

#Else

Private Type utc_SYSTEMTIME
    utc_wYear As Integer
    utc_wMonth As Integer
    utc_wDayOfWeek As Integer
    utc_wDay As Integer
    utc_wHour As Integer
    utc_wMinute As Integer
    utc_wSecond As Integer
    utc_wMilliseconds As Integer
End Type

Private Type utc_TIME_ZONE_INFORMATION
    utc_Bias As Long
    utc_StandardName(0 To 31) As Integer
    utc_StandardDate As utc_SYSTEMTIME
    utc_StandardBias As Long
    utc_DaylightName(0 To 31) As Integer
    utc_DaylightDate As utc_SYSTEMTIME
    utc_DaylightBias As Long
End Type

#End If
' === End VBA-UTC

Private Type json_Options
    ' VBA only stores 15 significant digits, so any numbers larger than that are truncated
    ' This can lead to issues when BIGINT's are used (e.g. for Ids or Credit Cards), as they will be invalid above 15 digits
    ' See: http://support.microsoft.com/kb/269370
    '
    ' By default, VBA-JSON will use String for numbers longer than 15 characters that contain only digits
    ' to override set `JsonConverter.JsonOptions.UseDoubleForLargeNumbers = True`
    UseDoubleForLargeNumbers As Boolean

    ' The JSON standard requires object keys to be quoted (" or '), use this option to allow unquoted keys
    AllowUnquotedKeys As Boolean

    ' The solidus (/) is not required to be escaped, use this option to escape them as \/ in ConvertToJson
    EscapeSolidus As Boolean
End Type
Public JsonOptions As json_Options

' ============================================= '
' Public Methods
' ============================================= '

''
' Convert JSON string to object (Dictionary/Collection)
'
' @method ParseJson
' @param {String} json_String
' @return {Object} (Dictionary or Collection)
' @throws 10001 - JSON parse error
''
Public Function ParseJson(ByVal JsonString As String) As Object
    Dim json_Index As Long
    json_Index = 1

    ' Remove vbCr, vbLf, and vbTab from json_String
    JsonString = VBA.Replace(VBA.Replace(VBA.Replace(JsonString, VBA.vbCr, ""), VBA.vbLf, ""), VBA.vbTab, "")

    json_SkipSpaces JsonString, json_Index
    Select Case VBA.Mid$(JsonString, json_Index, 1)
    Case "{"
        Set ParseJson = json_ParseObject(JsonString, json_Index)
    Case "["
        Set ParseJson = json_ParseArray(JsonString, json_Index)
    Case Else
        ' Error: Invalid JSON string
        Err.Raise 10001, "JSONConverter", json_ParseErrorMessage(JsonString, json_Index, "Expecting '{' or '['")
    End Select
End Function

''
' Convert object (Dictionary/Collection/Array) to JSON
'
' @method ConvertToJson
' @param {Variant} JsonValue (Dictionary, Collection, or Array)
' @param {Integer|String} Whitespace "Pretty" print json with given number of spaces per indentation (Integer) or given string
' @return {String}
''
Public Function ConvertToJson(ByVal JsonValue As Variant, Optional ByVal Whitespace As Variant, Optional ByVal json_CurrentIndentation As Long = 0) As String
    Dim json_Buffer As String
    Dim json_BufferPosition As Long
    Dim json_BufferLength As Long
    Dim json_Index As Long
    Dim json_LBound As Long
    Dim json_UBound As Long
    Dim json_IsFirstItem As Boolean
    Dim json_Index2D As Long
    Dim json_LBound2D As Long
    Dim json_UBound2D As Long
    Dim json_IsFirstItem2D As Boolean
    Dim json_Key As Variant
    Dim json_Value As Variant
    Dim json_DateStr As String
    Dim json_Converted As String
    Dim json_SkipItem As Boolean
    Dim json_PrettyPrint As Boolean
    Dim json_Indentation As String
    Dim json_InnerIndentation As String

    json_LBound = -1
    json_UBound = -1
    json_IsFirstItem = True
    json_LBound2D = -1
    json_UBound2D = -1
    json_IsFirstItem2D = True
    json_PrettyPrint = Not IsMissing(Whitespace)

    Select Case VBA.VarType(JsonValue)
    Case VBA.vbNull
        ConvertToJson = "null"
    Case VBA.vbDate
        ' Date
        json_DateStr = ConvertToIso(VBA.CDate(JsonValue))

        ConvertToJson = """" & json_DateStr & """"
    Case VBA.vbString
        ' String (or large number encoded as string)
        If Not JsonOptions.UseDoubleForLargeNumbers And json_StringIsLargeNumber(JsonValue) Then
            ConvertToJson = JsonValue
        Else
            ConvertToJson = """" & json_Encode(JsonValue) & """"
        End If
    Case VBA.vbBoolean
        If JsonValue Then
            ConvertToJson = "true"
        Else
            ConvertToJson = "false"
        End If
    Case VBA.vbArray To VBA.vbArray + VBA.vbByte
        If json_PrettyPrint Then
            If VBA.VarType(Whitespace) = VBA.vbString Then
                json_Indentation = VBA.String$(json_CurrentIndentation + 1, Whitespace)
                json_InnerIndentation = VBA.String$(json_CurrentIndentation + 2, Whitespace)
            Else
                json_Indentation = VBA.Space$((json_CurrentIndentation + 1) * Whitespace)
                json_InnerIndentation = VBA.Space$((json_CurrentIndentation + 2) * Whitespace)
            End If
        End If

        ' Array
        json_BufferAppend json_Buffer, "[", json_BufferPosition, json_BufferLength

        On Error Resume Next

        json_LBound = LBound(JsonValue, 1)
        json_UBound = UBound(JsonValue, 1)
        json_LBound2D = LBound(JsonValue, 2)
        json_UBound2D = UBound(JsonValue, 2)

        If json_LBound >= 0 And json_UBound >= 0 Then
            For json_Index = json_LBound To json_UBound
                If json_IsFirstItem Then
                    json_IsFirstItem = False
                Else
                    ' Append comma to previous line
                    json_BufferAppend json_Buffer, ",", json_BufferPosition, json_BufferLength
                End If

                If json_LBound2D >= 0 And json_UBound2D >= 0 Then
                    ' 2D Array
                    If json_PrettyPrint Then
                        json_BufferAppend json_Buffer, vbNewLine, json_BufferPosition, json_BufferLength
                    End If
                    json_BufferAppend json_Buffer, json_Indentation & "[", json_BufferPosition, json_BufferLength

                    For json_Index2D = json_LBound2D To json_UBound2D
                        If json_IsFirstItem2D Then
                            json_IsFirstItem2D = False
                        Else
                            json_BufferAppend json_Buffer, ",", json_BufferPosition, json_BufferLength
                        End If

                        json_Converted = ConvertToJson(JsonValue(json_Index, json_Index2D), Whitespace, json_CurrentIndentation + 2)

                        ' For Arrays/Collections, undefined (Empty/Nothing) is treated as null
                        If json_Converted = "" Then
                            ' (nest to only check if converted = "")
                            If json_IsUndefined(JsonValue(json_Index, json_Index2D)) Then
                                json_Converted = "null"
                            End If
                        End If

                        If json_PrettyPrint Then
                            json_Converted = vbNewLine & json_InnerIndentation & json_Converted
                        End If

                        json_BufferAppend json_Buffer, json_Converted, json_BufferPosition, json_BufferLength
                    Next json_Index2D

                    If json_PrettyPrint Then
                        json_BufferAppend json_Buffer, vbNewLine, json_BufferPosition, json_BufferLength
                    End If

                    json_BufferAppend json_Buffer, json_Indentation & "]", json_BufferPosition, json_BufferLength
                    json_IsFirstItem2D = True
                Else
                    ' 1D Array
                    json_Converted = ConvertToJson(JsonValue(json_Index), Whitespace, json_CurrentIndentation + 1)

                    ' For Arrays/Collections, undefined (Empty/Nothing) is treated as null
                    If json_Converted = "" Then
                        ' (nest to only check if converted = "")
                        If json_IsUndefined(JsonValue(json_Index)) Then
                            json_Converted = "null"
                        End If
                    End If

                    If json_PrettyPrint Then
                        json_Converted = vbNewLine & json_Indentation & json_Converted
                    End If

                    json_BufferAppend json_Buffer, json_Converted, json_BufferPosition, json_BufferLength
                End If
            Next json_Index
        End If

        On Error GoTo 0

        If json_PrettyPrint Then
            json_BufferAppend json_Buffer, vbNewLine, json_BufferPosition, json_BufferLength

            If VBA.VarType(Whitespace) = VBA.vbString Then
                json_Indentation = VBA.String$(json_CurrentIndentation, Whitespace)
            Else
                json_Indentation = VBA.Space$(json_CurrentIndentation * Whitespace)
            End If
        End If

        json_BufferAppend json_Buffer, json_Indentation & "]", json_BufferPosition, json_BufferLength

        ConvertToJson = json_BufferToString(json_Buffer, json_BufferPosition)

    ' Dictionary or Collection
    Case VBA.vbObject
        If json_PrettyPrint Then
            If VBA.VarType(Whitespace) = VBA.vbString Then
                json_Indentation = VBA.String$(json_CurrentIndentation + 1, Whitespace)
            Else
                json_Indentation = VBA.Space$((json_CurrentIndentation + 1) * Whitespace)
            End If
        End If

        ' Dictionary
        If VBA.TypeName(JsonValue) = "Dictionary" Then
            json_BufferAppend json_Buffer, "{", json_BufferPosition, json_BufferLength
            For Each json_Key In JsonValue.Keys
                ' For Objects, undefined (Empty/Nothing) is not added to object
                json_Converted = ConvertToJson(JsonValue(json_Key), Whitespace, json_CurrentIndentation + 1)
                If json_Converted = "" Then
                    json_SkipItem = json_IsUndefined(JsonValue(json_Key))
                Else
                    json_SkipItem = False
                End If

                If Not json_SkipItem Then
                    If json_IsFirstItem Then
                        json_IsFirstItem = False
                    Else
                        json_BufferAppend json_Buffer, ",", json_BufferPosition, json_BufferLength
                    End If

                    If json_PrettyPrint Then
                        json_Converted = vbNewLine & json_Indentation & """" & json_Key & """: " & json_Converted
                    Else
                        json_Converted = """" & json_Key & """:" & json_Converted
                    End If

                    json_BufferAppend json_Buffer, json_Converted, json_BufferPosition, json_BufferLength
                End If
            Next json_Key

            If json_PrettyPrint Then
                json_BufferAppend json_Buffer, vbNewLine, json_BufferPosition, json_BufferLength

                If VBA.VarType(Whitespace) = VBA.vbString Then
                    json_Indentation = VBA.String$(json_CurrentIndentation, Whitespace)
                Else
                    json_Indentation = VBA.Space$(json_CurrentIndentation * Whitespace)
                End If
            End If

            json_BufferAppend json_Buffer, json_Indentation & "}", json_BufferPosition, json_BufferLength

        ' Collection
        ElseIf VBA.TypeName(JsonValue) = "Collection" Then
            json_BufferAppend json_Buffer, "[", json_BufferPosition, json_BufferLength
            For Each json_Value In JsonValue
                If json_IsFirstItem Then
                    json_IsFirstItem = False
                Else
                    json_BufferAppend json_Buffer, ",", json_BufferPosition, json_BufferLength
                End If

                json_Converted = ConvertToJson(json_Value, Whitespace, json_CurrentIndentation + 1)

                ' For Arrays/Collections, undefined (Empty/Nothing) is treated as null
                If json_Converted = "" Then
                    ' (nest to only check if converted = "")
                    If json_IsUndefined(json_Value) Then
                        json_Converted = "null"
                    End If
                End If

                If json_PrettyPrint Then
                    json_Converted = vbNewLine & json_Indentation & json_Converted
                End If

                json_BufferAppend json_Buffer, json_Converted, json_BufferPosition, json_BufferLength
            Next json_Value

            If json_PrettyPrint Then
                json_BufferAppend json_Buffer, vbNewLine, json_BufferPosition, json_BufferLength

                If VBA.VarType(Whitespace) = VBA.vbString Then
                    json_Indentation = VBA.String$(json_CurrentIndentation, Whitespace)
                Else
                    json_Indentation = VBA.Space$(json_CurrentIndentation * Whitespace)
                End If
            End If

            json_BufferAppend json_Buffer, json_Indentation & "]", json_BufferPosition, json_BufferLength
        End If

        ConvertToJson = json_BufferToString(json_Buffer, json_BufferPosition)
    Case VBA.vbInteger, VBA.vbLong, VBA.vbSingle, VBA.vbDouble, VBA.vbCurrency, VBA.vbDecimal
        ' Number (use decimals for numbers)
        ConvertToJson = VBA.Replace(JsonValue, ",", ".")
    Case Else
        ' vbEmpty, vbError, vbDataObject, vbByte, vbUserDefinedType
        ' Use VBA's built-in to-string
        On Error Resume Next
        ConvertToJson = JsonValue
        On Error GoTo 0
    End Select
End Function

' ============================================= '
' Private Functions
' ============================================= '

Private Function json_ParseObject(json_String As String, ByRef json_Index As Long) As Dictionary
    Dim json_Key As String
    Dim json_NextChar As String

    Set json_ParseObject = New Dictionary
    json_SkipSpaces json_String, json_Index
    If VBA.Mid$(json_String, json_Index, 1) <> "{" Then
        Err.Raise 10001, "JSONConverter", json_ParseErrorMessage(json_String, json_Index, "Expecting '{'")
    Else
        json_Index = json_Index + 1

        Do
            json_SkipSpaces json_String, json_Index
            If VBA.Mid$(json_String, json_Index, 1) = "}" Then
                json_Index = json_Index + 1
                Exit Function
            ElseIf VBA.Mid$(json_String, json_Index, 1) = "," Then
                json_Index = json_Index + 1
                json_SkipSpaces json_String, json_Index
            End If

            json_Key = json_ParseKey(json_String, json_Index)
            json_NextChar = json_Peek(json_String, json_Index)
            If json_NextChar = "[" Or json_NextChar = "{" Then
                Set json_ParseObject.Item(json_Key) = json_ParseValue(json_String, json_Index)
            Else
                json_ParseObject.Item(json_Key) = json_ParseValue(json_String, json_Index)
            End If
        Loop
    End If
End Function

Private Function json_ParseArray(json_String As String, ByRef json_Index As Long) As Collection
    Set json_ParseArray = New Collection

    json_SkipSpaces json_String, json_Index
    If VBA.Mid$(json_String, json_Index, 1) <> "[" Then
        Err.Raise 10001, "JSONConverter", json_ParseErrorMessage(json_String, json_Index, "Expecting '['")
    Else
        json_Index = json_Index + 1

        Do
            json_SkipSpaces json_String, json_Index
            If VBA.Mid$(json_String, json_Index, 1) = "]" Then
                json_Index = json_Index + 1
                Exit Function
            ElseIf VBA.Mid$(json_String, json_Index, 1) = "," Then
                json_Index = json_Index + 1
                json_SkipSpaces json_String, json_Index
            End If

            json_ParseArray.Add json_ParseValue(json_String, json_Index)
        Loop
    End If
End Function

Private Function json_ParseValue(json_String As String, ByRef json_Index As Long) As Variant
    json_SkipSpaces json_String, json_Index
    Select Case VBA.Mid$(json_String, json_Index, 1)
    Case "{"
        Set json_ParseValue = json_ParseObject(json_String, json_Index)
    Case "["
        Set json_ParseValue = json_ParseArray(json_String, json_Index)
    Case """", "'"
        json_ParseValue = json_ParseString(json_String, json_Index)
    Case Else
        If VBA.Mid$(json_String, json_Index, 4) = "true" Then
            json_ParseValue = True
            json_Index = json_Index + 4
        ElseIf VBA.Mid$(json_String, json_Index, 5) = "false" Then
            json_ParseValue = False
            json_Index = json_Index + 5
        ElseIf VBA.Mid$(json_String, json_Index, 4) = "null" Then
            json_ParseValue = Null
            json_Index = json_Index + 4
        ElseIf VBA.InStr("+-0123456789", VBA.Mid$(json_String, json_Index, 1)) Then
            json_ParseValue = json_ParseNumber(json_String, json_Index)
        Else
            Err.Raise 10001, "JSONConverter", json_ParseErrorMessage(json_String, json_Index, "Expecting 'STRING', 'NUMBER', null, true, false, '{', or '['")
        End If
    End Select
End Function

Private Function json_ParseString(json_String As String, ByRef json_Index As Long) As String
    Dim json_Quote As String
    Dim json_Char As String
    Dim json_Code As String
    Dim json_Buffer As String
    Dim json_BufferPosition As Long
    Dim json_BufferLength As Long

    json_SkipSpaces json_String, json_Index

    ' Store opening quote to look for matching closing quote
    json_Quote = VBA.Mid$(json_String, json_Index, 1)
    json_Index = json_Index + 1

    Do While json_Index > 0 And json_Index <= Len(json_String)
        json_Char = VBA.Mid$(json_String, json_Index, 1)

        Select Case json_Char
        Case "\"
            ' Escaped string, \\, or \/
            json_Index = json_Index + 1
            json_Char = VBA.Mid$(json_String, json_Index, 1)

            Select Case json_Char
            Case """", "\", "/", "'"
                json_BufferAppend json_Buffer, json_Char, json_BufferPosition, json_BufferLength
                json_Index = json_Index + 1
            Case "b"
                json_BufferAppend json_Buffer, vbBack, json_BufferPosition, json_BufferLength
                json_Index = json_Index + 1
            Case "f"
                json_BufferAppend json_Buffer, vbFormFeed, json_BufferPosition, json_BufferLength
                json_Index = json_Index + 1
            Case "n"
                json_BufferAppend json_Buffer, vbCrLf, json_BufferPosition, json_BufferLength
                json_Index = json_Index + 1
            Case "r"
                json_BufferAppend json_Buffer, vbCr, json_BufferPosition, json_BufferLength
                json_Index = json_Index + 1
            Case "t"
                json_BufferAppend json_Buffer, vbTab, json_BufferPosition, json_BufferLength
                json_Index = json_Index + 1
            Case "u"
                ' Unicode character escape (e.g. \u00a9 = Copyright)
                json_Index = json_Index + 1
                json_Code = VBA.Mid$(json_String, json_Index, 4)
                json_BufferAppend json_Buffer, VBA.ChrW(VBA.Val("&h" + json_Code)), json_BufferPosition, json_BufferLength
                json_Index = json_Index + 4
            End Select
        Case json_Quote
            json_ParseString = json_BufferToString(json_Buffer, json_BufferPosition)
            json_Index = json_Index + 1
            Exit Function
        Case Else
            json_BufferAppend json_Buffer, json_Char, json_BufferPosition, json_BufferLength
            json_Index = json_Index + 1
        End Select
    Loop
End Function

Private Function json_ParseNumber(json_String As String, ByRef json_Index As Long) As Variant
    Dim json_Char As String
    Dim json_Value As String
    Dim json_IsLargeNumber As Boolean

    json_SkipSpaces json_String, json_Index

    Do While json_Index > 0 And json_Index <= Len(json_String)
        json_Char = VBA.Mid$(json_String, json_Index, 1)

        If VBA.InStr("+-0123456789.eE", json_Char) Then
            ' Unlikely to have massive number, so use simple append rather than buffer here
            json_Value = json_Value & json_Char
            json_Index = json_Index + 1
        Else
            ' Excel only stores 15 significant digits, so any numbers larger than that are truncated
            ' This can lead to issues when BIGINT's are used (e.g. for Ids or Credit Cards), as they will be invalid above 15 digits
            ' See: http://support.microsoft.com/kb/269370
            '
            ' Fix: Parse -> String, Convert -> String longer than 15/16 characters containing only numbers and decimal points -> Number
            ' (decimal doesn't factor into significant digit count, so if present check for 15 digits + decimal = 16)
            json_IsLargeNumber = IIf(InStr(json_Value, "."), Len(json_Value) >= 17, Len(json_Value) >= 16)
            If Not JsonOptions.UseDoubleForLargeNumbers And json_IsLargeNumber Then
                json_ParseNumber = json_Value
            Else
                ' VBA.Val does not use regional settings, so guard for comma is not needed
                json_ParseNumber = VBA.Val(json_Value)
            End If
            Exit Function
        End If
    Loop
End Function

Private Function json_ParseKey(json_String As String, ByRef json_Index As Long) As String
    ' Parse key with single or double quotes
    If VBA.Mid$(json_String, json_Index, 1) = """" Or VBA.Mid$(json_String, json_Index, 1) = "'" Then
        json_ParseKey = json_ParseString(json_String, json_Index)
    ElseIf JsonOptions.AllowUnquotedKeys Then
        Dim json_Char As String
        Do While json_Index > 0 And json_Index <= Len(json_String)
            json_Char = VBA.Mid$(json_String, json_Index, 1)
            If (json_Char <> " ") And (json_Char <> ":") Then
                json_ParseKey = json_ParseKey & json_Char
                json_Index = json_Index + 1
            Else
                Exit Do
            End If
        Loop
    Else
        Err.Raise 10001, "JSONConverter", json_ParseErrorMessage(json_String, json_Index, "Expecting '""' or '''")
    End If

    ' Check for colon and skip if present or throw if not present
    json_SkipSpaces json_String, json_Index
    If VBA.Mid$(json_String, json_Index, 1) <> ":" Then
        Err.Raise 10001, "JSONConverter", json_ParseErrorMessage(json_String, json_Index, "Expecting ':'")
    Else
        json_Index = json_Index + 1
    End If
End Function

Private Function json_IsUndefined(ByVal json_Value As Variant) As Boolean
    ' Empty / Nothing -> undefined
    Select Case VBA.VarType(json_Value)
    Case VBA.vbEmpty
        json_IsUndefined = True
    Case VBA.vbObject
        Select Case VBA.TypeName(json_Value)
        Case "Empty", "Nothing"
            json_IsUndefined = True
        End Select
    End Select
End Function

Private Function json_Encode(ByVal json_Text As Variant) As String
    ' Reference: http://www.ietf.org/rfc/rfc4627.txt
    ' Escape: ", \, /, backspace, form feed, line feed, carriage return, tab
    Dim json_Index As Long
    Dim json_Char As String
    Dim json_AscCode As Long
    Dim json_Buffer As String
    Dim json_BufferPosition As Long
    Dim json_BufferLength As Long

    For json_Index = 1 To VBA.Len(json_Text)
        json_Char = VBA.Mid$(json_Text, json_Index, 1)
        json_AscCode = VBA.AscW(json_Char)

        ' When AscW returns a negative number, it returns the twos complement form of that number.
        ' To convert the twos complement notation into normal binary notation, add 0xFFF to the return result.
        ' https://support.microsoft.com/en-us/kb/272138
        If json_AscCode < 0 Then
            json_AscCode = json_AscCode + 65536
        End If

        ' From spec, ", \, and control characters must be escaped (solidus is optional)

        Select Case json_AscCode
        Case 34
            ' " -> 34 -> \"
            json_Char = "\"""
        Case 92
            ' \ -> 92 -> \\
            json_Char = "\\"
        Case 47
            ' / -> 47 -> \/ (optional)
            If JsonOptions.EscapeSolidus Then
                json_Char = "\/"
            End If
        Case 8
            ' backspace -> 8 -> \b
            json_Char = "\b"
        Case 12
            ' form feed -> 12 -> \f
            json_Char = "\f"
        Case 10
            ' line feed -> 10 -> \n
            json_Char = "\n"
        Case 13
            ' carriage return -> 13 -> \r
            json_Char = "\r"
        Case 9
            ' tab -> 9 -> \t
            json_Char = "\t"
        Case 0 To 31, 127 To 65535
            ' Non-ascii characters -> convert to 4-digit hex
            json_Char = "\u" & VBA.Right$("0000" & VBA.Hex$(json_AscCode), 4)
        End Select

        json_BufferAppend json_Buffer, json_Char, json_BufferPosition, json_BufferLength
    Next json_Index

    json_Encode = json_BufferToString(json_Buffer, json_BufferPosition)
End Function

Private Function json_Peek(json_String As String, ByVal json_Index As Long, Optional json_NumberOfCharacters As Long = 1) As String
    ' "Peek" at the next number of characters without incrementing json_Index (ByVal instead of ByRef)
    json_SkipSpaces json_String, json_Index
    json_Peek = VBA.Mid$(json_String, json_Index, json_NumberOfCharacters)
End Function

Private Sub json_SkipSpaces(json_String As String, ByRef json_Index As Long)
    ' Increment index to skip over spaces
    Do While json_Index > 0 And json_Index <= VBA.Len(json_String) And VBA.Mid$(json_String, json_Index, 1) = " "
        json_Index = json_Index + 1
    Loop
End Sub

Private Function json_StringIsLargeNumber(json_String As Variant) As Boolean
    ' Check if the given string is considered a "large number"
    ' (See json_ParseNumber)

    Dim json_Length As Long
    Dim json_CharIndex As Long
    json_Length = VBA.Len(json_String)

    ' Length with be at least 16 characters and assume will be less than 100 characters
    If json_Length >= 16 And json_Length <= 100 Then
        Dim json_CharCode As String

        json_StringIsLargeNumber = True

        For json_CharIndex = 1 To json_Length
            json_CharCode = VBA.Asc(VBA.Mid$(json_String, json_CharIndex, 1))
            Select Case json_CharCode
            ' Look for .|0-9|E|e
            Case 46, 48 To 57, 69, 101
                ' Continue through characters
            Case Else
                json_StringIsLargeNumber = False
                Exit Function
            End Select
        Next json_CharIndex
    End If
End Function

Private Function json_ParseErrorMessage(json_String As String, ByRef json_Index As Long, ErrorMessage As String)
    ' Provide detailed parse error message, including details of where and what occurred
    '
    ' Example:
    ' Error parsing JSON:
    ' {"abcde":True}
    '          ^
    ' Expecting 'STRING', 'NUMBER', null, true, false, '{', or '['

    Dim json_StartIndex As Long
    Dim json_StopIndex As Long

    ' Include 10 characters before and after error (if possible)
    json_StartIndex = json_Index - 10
    json_StopIndex = json_Index + 10
    If json_StartIndex <= 0 Then
        json_StartIndex = 1
    End If
    If json_StopIndex > VBA.Len(json_String) Then
        json_StopIndex = VBA.Len(json_String)
    End If

    json_ParseErrorMessage = "Error parsing JSON:" & VBA.vbNewLine & _
                             VBA.Mid$(json_String, json_StartIndex, json_StopIndex - json_StartIndex + 1) & VBA.vbNewLine & _
                             VBA.Space$(json_Index - json_StartIndex) & "^" & VBA.vbNewLine & _
                             ErrorMessage
End Function

Private Sub json_BufferAppend(ByRef json_Buffer As String, _
                              ByRef json_Append As Variant, _
                              ByRef json_BufferPosition As Long, _
                              ByRef json_BufferLength As Long)
    ' VBA can be slow to append strings due to allocating a new string for each append
    ' Instead of using the traditional append, allocate a large empty string and then copy string at append position
    '
    ' Example:
    ' Buffer: "abc  "
    ' Append: "def"
    ' Buffer Position: 3
    ' Buffer Length: 5
    '
    ' Buffer position + Append length > Buffer length -> Append chunk of blank space to buffer
    ' Buffer: "abc       "
    ' Buffer Length: 10
    '
    ' Put "def" into buffer at position 3 (0-based)
    ' Buffer: "abcdef    "
    '
    ' Approach based on cStringBuilder from vbAccelerator
    ' http://www.vbaccelerator.com/home/VB/Code/Techniques/RunTime_Debug_Tracing/VB6_Tracer_Utility_zip_cStringBuilder_cls.asp
    '
    ' and clsStringAppend from Philip Swannell
    ' https://github.com/VBA-tools/VBA-JSON/pull/82

    Dim json_AppendLength As Long
    Dim json_LengthPlusPosition As Long

    json_AppendLength = VBA.Len(json_Append)
    json_LengthPlusPosition = json_AppendLength + json_BufferPosition

    If json_LengthPlusPosition > json_BufferLength Then
        ' Appending would overflow buffer, add chunk
        ' (double buffer length or append length, whichever is bigger)
        Dim json_AddedLength As Long
        json_AddedLength = IIf(json_AppendLength > json_BufferLength, json_AppendLength, json_BufferLength)

        json_Buffer = json_Buffer & VBA.Space$(json_AddedLength)
        json_BufferLength = json_BufferLength + json_AddedLength
    End If

    ' Note: Namespacing with VBA.Mid$ doesn't work properly here, throwing compile error:
    ' Function call on left-hand side of assignment must return Variant or Object
    Mid$(json_Buffer, json_BufferPosition + 1, json_AppendLength) = CStr(json_Append)
    json_BufferPosition = json_BufferPosition + json_AppendLength
End Sub

Private Function json_BufferToString(ByRef json_Buffer As String, ByVal json_BufferPosition As Long) As String
    If json_BufferPosition > 0 Then
        json_BufferToString = VBA.Left$(json_Buffer, json_BufferPosition)
    End If
End Function

''
' VBA-UTC v1.0.6
' (c) Tim Hall - https://github.com/VBA-tools/VBA-UtcConverter
'
' UTC/ISO 8601 Converter for VBA
'
' Errors:
' 10011 - UTC parsing error
' 10012 - UTC conversion error
' 10013 - ISO 8601 parsing error
' 10014 - ISO 8601 conversion error
'
' @module UtcConverter
' @author tim.hall.engr@gmail.com
' @license MIT (http://www.opensource.org/licenses/mit-license.php)
'' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ '

' (Declarations moved to top)

' ============================================= '
' Public Methods
' ============================================= '

''
' Parse UTC date to local date
'
' @method ParseUtc
' @param {Date} UtcDate
' @return {Date} Local date
' @throws 10011 - UTC parsing error
''
Public Function ParseUtc(utc_UtcDate As Date) As Date
    On Error GoTo utc_ErrorHandling

#If Mac Then
    ParseUtc = utc_ConvertDate(utc_UtcDate)
#Else
    Dim utc_TimeZoneInfo As utc_TIME_ZONE_INFORMATION
    Dim utc_LocalDate As utc_SYSTEMTIME

    utc_GetTimeZoneInformation utc_TimeZoneInfo
    utc_SystemTimeToTzSpecificLocalTime utc_TimeZoneInfo, utc_DateToSystemTime(utc_UtcDate), utc_LocalDate

    ParseUtc = utc_SystemTimeToDate(utc_LocalDate)
#End If

    Exit Function

utc_ErrorHandling:
    Err.Raise 10011, "UtcConverter.ParseUtc", "UTC parsing error: " & Err.Number & " - " & Err.Description
End Function

''
' Convert local date to UTC date
'
' @method ConvertToUrc
' @param {Date} utc_LocalDate
' @return {Date} UTC date
' @throws 10012 - UTC conversion error
''
Public Function ConvertToUtc(utc_LocalDate As Date) As Date
    On Error GoTo utc_ErrorHandling

#If Mac Then
    ConvertToUtc = utc_ConvertDate(utc_LocalDate, utc_ConvertToUtc:=True)
#Else
    Dim utc_TimeZoneInfo As utc_TIME_ZONE_INFORMATION
    Dim utc_UtcDate As utc_SYSTEMTIME

    utc_GetTimeZoneInformation utc_TimeZoneInfo
    utc_TzSpecificLocalTimeToSystemTime utc_TimeZoneInfo, utc_DateToSystemTime(utc_LocalDate), utc_UtcDate

    ConvertToUtc = utc_SystemTimeToDate(utc_UtcDate)
#End If

    Exit Function

utc_ErrorHandling:
    Err.Raise 10012, "UtcConverter.ConvertToUtc", "UTC conversion error: " & Err.Number & " - " & Err.Description
End Function

''
' Parse ISO 8601 date string to local date
'
' @method ParseIso
' @param {Date} utc_IsoString
' @return {Date} Local date
' @throws 10013 - ISO 8601 parsing error
''
Public Function ParseIso(utc_IsoString As String) As Date
    On Error GoTo utc_ErrorHandling

    Dim utc_Parts() As String
    Dim utc_DateParts() As String
    Dim utc_TimeParts() As String
    Dim utc_OffsetIndex As Long
    Dim utc_HasOffset As Boolean
    Dim utc_NegativeOffset As Boolean
    Dim utc_OffsetParts() As String
    Dim utc_Offset As Date

    utc_Parts = VBA.Split(utc_IsoString, "T")
    utc_DateParts = VBA.Split(utc_Parts(0), "-")
    ParseIso = VBA.DateSerial(VBA.CInt(utc_DateParts(0)), VBA.CInt(utc_DateParts(1)), VBA.CInt(utc_DateParts(2)))

    If UBound(utc_Parts) > 0 Then
        If VBA.InStr(utc_Parts(1), "Z") Then
            utc_TimeParts = VBA.Split(VBA.Replace(utc_Parts(1), "Z", ""), ":")
        Else
            utc_OffsetIndex = VBA.InStr(1, utc_Parts(1), "+")
            If utc_OffsetIndex = 0 Then
                utc_NegativeOffset = True
                utc_OffsetIndex = VBA.InStr(1, utc_Parts(1), "-")
            End If

            If utc_OffsetIndex > 0 Then
                utc_HasOffset = True
                utc_TimeParts = VBA.Split(VBA.Left$(utc_Parts(1), utc_OffsetIndex - 1), ":")
                utc_OffsetParts = VBA.Split(VBA.Right$(utc_Parts(1), Len(utc_Parts(1)) - utc_OffsetIndex), ":")

                Select Case UBound(utc_OffsetParts)
                Case 0
                    utc_Offset = TimeSerial(VBA.CInt(utc_OffsetParts(0)), 0, 0)
                Case 1
                    utc_Offset = TimeSerial(VBA.CInt(utc_OffsetParts(0)), VBA.CInt(utc_OffsetParts(1)), 0)
                Case 2
                    ' VBA.Val does not use regional settings, use for seconds to avoid decimal/comma issues
                    utc_Offset = TimeSerial(VBA.CInt(utc_OffsetParts(0)), VBA.CInt(utc_OffsetParts(1)), Int(VBA.Val(utc_OffsetParts(2))))
                End Select

                If utc_NegativeOffset Then: utc_Offset = -utc_Offset
            Else
                utc_TimeParts = VBA.Split(utc_Parts(1), ":")
            End If
        End If

        Select Case UBound(utc_TimeParts)
        Case 0
            ParseIso = ParseIso + VBA.TimeSerial(VBA.CInt(utc_TimeParts(0)), 0, 0)
        Case 1
            ParseIso = ParseIso + VBA.TimeSerial(VBA.CInt(utc_TimeParts(0)), VBA.CInt(utc_TimeParts(1)), 0)
        Case 2
            ' VBA.Val does not use regional settings, use for seconds to avoid decimal/comma issues
            ParseIso = ParseIso + VBA.TimeSerial(VBA.CInt(utc_TimeParts(0)), VBA.CInt(utc_TimeParts(1)), Int(VBA.Val(utc_TimeParts(2))))
        End Select

        ParseIso = ParseUtc(ParseIso)

        If utc_HasOffset Then
            ParseIso = ParseIso - utc_Offset
        End If
    End If

    Exit Function

utc_ErrorHandling:
    Err.Raise 10013, "UtcConverter.ParseIso", "ISO 8601 parsing error for " & utc_IsoString & ": " & Err.Number & " - " & Err.Description
End Function

''
' Convert local date to ISO 8601 string
'
' @method ConvertToIso
' @param {Date} utc_LocalDate
' @return {Date} ISO 8601 string
' @throws 10014 - ISO 8601 conversion error
''
Public Function ConvertToIso(utc_LocalDate As Date) As String
    On Error GoTo utc_ErrorHandling

    ConvertToIso = VBA.Format$(ConvertToUtc(utc_LocalDate), "yyyy-mm-ddTHH:mm:ss.000Z")

    Exit Function

utc_ErrorHandling:
    Err.Raise 10014, "UtcConverter.ConvertToIso", "ISO 8601 conversion error: " & Err.Number & " - " & Err.Description
End Function

' ============================================= '
' Private Functions
' ============================================= '

#If Mac Then

Private Function utc_ConvertDate(utc_Value As Date, Optional utc_ConvertToUtc As Boolean = False) As Date
    Dim utc_ShellCommand As String
    Dim utc_Result As utc_ShellResult
    Dim utc_Parts() As String
    Dim utc_DateParts() As String
    Dim utc_TimeParts() As String

    If utc_ConvertToUtc Then
        utc_ShellCommand = "date -ur `date -jf '%Y-%m-%d %H:%M:%S' " & _
            "'" & VBA.Format$(utc_Value, "yyyy-mm-dd HH:mm:ss") & "' " & _
            " +'%s'` +'%Y-%m-%d %H:%M:%S'"
    Else
        utc_ShellCommand = "date -jf '%Y-%m-%d %H:%M:%S %z' " & _
            "'" & VBA.Format$(utc_Value, "yyyy-mm-dd HH:mm:ss") & " +0000' " & _
            "+'%Y-%m-%d %H:%M:%S'"
    End If

    utc_Result = utc_ExecuteInShell(utc_ShellCommand)

    If utc_Result.utc_Output = "" Then
        Err.Raise 10015, "UtcConverter.utc_ConvertDate", "'date' command failed"
    Else
        utc_Parts = Split(utc_Result.utc_Output, " ")
        utc_DateParts = Split(utc_Parts(0), "-")
        utc_TimeParts = Split(utc_Parts(1), ":")

        utc_ConvertDate = DateSerial(utc_DateParts(0), utc_DateParts(1), utc_DateParts(2)) + _
            TimeSerial(utc_TimeParts(0), utc_TimeParts(1), utc_TimeParts(2))
    End If
End Function

Private Function utc_ExecuteInShell(utc_ShellCommand As String) As utc_ShellResult
#If VBA7 Then
    Dim utc_File As LongPtr
    Dim utc_Read As LongPtr
#Else
    Dim utc_File As Long
    Dim utc_Read As Long
#End If

    Dim utc_Chunk As String

    On Error GoTo utc_ErrorHandling
    utc_File = utc_popen(utc_ShellCommand, "r")

    If utc_File = 0 Then: Exit Function

    Do While utc_feof(utc_File) = 0
        utc_Chunk = VBA.Space$(50)
        utc_Read = CLng(utc_fread(utc_Chunk, 1, Len(utc_Chunk) - 1, utc_File))
        If utc_Read > 0 Then
            utc_Chunk = VBA.Left$(utc_Chunk, CLng(utc_Read))
            utc_ExecuteInShell.utc_Output = utc_ExecuteInShell.utc_Output & utc_Chunk
        End If
    Loop

utc_ErrorHandling:
    utc_ExecuteInShell.utc_ExitCode = CLng(utc_pclose(utc_File))
End Function

#Else

Private Function utc_DateToSystemTime(utc_Value As Date) As utc_SYSTEMTIME
    utc_DateToSystemTime.utc_wYear = VBA.Year(utc_Value)
    utc_DateToSystemTime.utc_wMonth = VBA.Month(utc_Value)
    utc_DateToSystemTime.utc_wDay = VBA.Day(utc_Value)
    utc_DateToSystemTime.utc_wHour = VBA.Hour(utc_Value)
    utc_DateToSystemTime.utc_wMinute = VBA.Minute(utc_Value)
    utc_DateToSystemTime.utc_wSecond = VBA.Second(utc_Value)
    utc_DateToSystemTime.utc_wMilliseconds = 0
End Function

Private Function utc_SystemTimeToDate(utc_Value As utc_SYSTEMTIME) As Date
    utc_SystemTimeToDate = DateSerial(utc_Value.utc_wYear, utc_Value.utc_wMonth, utc_Value.utc_wDay) + _
        TimeSerial(utc_Value.utc_wHour, utc_Value.utc_wMinute, utc_Value.utc_wSecond)
End Function

#End If
diff --git a/src/Project.ini b/src/Project.ini
new file mode 100644
index 0000000..d3c84c5 100644
--- /dev/null
+++ a/src/Project.ini
@@ -1,0 +1,32 @@
CodePage=1252
SysKind=3
Version=1761683227.9
ID="{0F3D9E32-5905-4E2D-8044-5C70D59D067F}"
Name="Project"
HelpContextID="0"
VersionCompatible32="393222000"
CMG="7476B23FB646BA46BA46BA46BA"
DPB="7775B138B738BB39BB39BB"
GC="7A78BC3DBE3EBE3E41"

[Host Extender Info]
&H00000001={3832D640-CF90-11CF-8E43-00A0C911005A};VBE;&H00000000

[Constants]

[Reference Scripting]
LibId=*\G{420B2830-E718-11CF-893D-00A0C9054228}#1.0#0#C:\Windows\System32\scrrun.dll#Microsoft Scripting Runtime


[Reference VBScript_RegExp_55]
LibId=*\G{3F4DACA7-160D-11D2-A8E9-00104B365C9F}#5.5#0#C:\Windows\System32\vbscript.dll\3#Microsoft VBScript Regular Expressions 5.5


[Reference stdole]
LibId=*\G{00020430-0000-0000-C000-000000000046}#2.0#0#C:\Windows\System32\stdole2.tlb#OLE Automation


[Reference TemplateProject]
LibIdAbsolute=*\C\\Mac\iCloud\Development\cv\cv.dotx
LibIdRelative=*\C\\Mac\iCloud\Development\cv\cv.dotx
Version=1761676241.4

[Reference Office]
LibId=*\G{2DF8D04C-5BFA-101B-BDE5-00AA0044DE52}#2.0#0#C:\Program Files\Common Files\Microsoft Shared\OFFICE16\MSO.DLL#Microsoft Office 16.0 Object Library

diff --git a/src/StringTable.bas b/src/StringTable.bas
new file mode 100644
index 0000000..6ed7891 100644
--- /dev/null
+++ a/src/StringTable.bas
@@ -1,0 +1,16 @@
Attribute VB_Name = "StringTable"
Option Explicit

Public Const YAML_PATH As String = "C:\Mac\Home\Library\Mobile Documents\com~apple~CloudDocs\Development\cv\cv.yml"

Public Const ID_SELF As String = "___self___"
Public Const ID_TYPE As String = "___type___"

Public Const MESSAGE_ERROR_GENERIC As String = "YAML Error"
Public Const MESSAGE_MALFORMED_TYPE As String = "Malformed YAML code on line "
Public Const MESSAGE_MALFORMED_YAML As String = "Malformed type error - this is a problem with the internal dictionary"
Public Const MESSAGE_GETPROP_NOT_STR As String = "Your module has tried to use getProp(), which is meant for type String, on a "
Public Const MESSAGE_GETPROP_NOT_FOUND As String = "Property not found."

Public Const GREY_VALUE As Integer = 128
Public Const BLACK_VALUE As Integer = 255
diff --git a/src/ThisDocument.cls b/src/ThisDocument.cls
new file mode 100644
index 0000000..3b55701 100644
--- /dev/null
+++ a/src/ThisDocument.cls
@@ -1,0 +1,13 @@
VERSION 1.0 CLASS
BEGIN
  MultiUse = -1  'True
END
Attribute VB_Name = "ThisDocument"
Attribute VB_Base = "1TemplateProject.ThisDocument"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = True
Attribute VB_TemplateDerived = True
Attribute VB_Customizable = True
Option Explicit
diff --git a/src/YAML.cls b/src/YAML.cls
new file mode 100644
index 0000000..f53ec30 100644
--- /dev/null
+++ a/src/YAML.cls
@@ -1,0 +1,331 @@
VERSION 1.0 CLASS
BEGIN
  MultiUse = -1  'True
END
Attribute VB_Name = "YAML"
Attribute VB_Base = "0{FCFB3D2A-A0FA-1068-A738-08002B3371B5}"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = False
Attribute VB_Exposed = False
Attribute VB_TemplateDerived = False
Attribute VB_Customizable = False
Option Explicit

' Const yamlPath As String = "\\Mac\iCloud\Development\cv\cv.yml"

Public yamlPath As String

Private Function RemoveEmptyStrings(arr() As String) As String()
    Dim tempArray() As String
    Dim i As Integer, j As Integer: j = 0
    ReDim tempArray(LBound(arr) To UBound(arr))
    j = 0
    For i = LBound(arr) To UBound(arr)
        If Len(arr(i)) > 0 Then
            tempArray(j) = arr(i)
            j = j + 1
        End If
    Next i
    ReDim Preserve tempArray(0 To j - 1)
    RemoveEmptyStrings = tempArray
End Function


Private Function RegexMatch(inputString As String, pattern As String, Optional isGlobal As Boolean = True) As Boolean
    ' checks for regex match without instantiating 80 gazillion objects
    
    ' parameters
    ' isGlobal: whether the regex check is global
    
    Dim Regex As Object: Set Regex = CreateObject("VBScript.RegExp")
    Regex.pattern = pattern
    Regex.Global = isGlobal
    RegexMatch = Regex.Test(inputString)
End Function

Private Function RegexSplit(inputString As String, pattern As String, Optional onlyFirst As Boolean = False, Optional splitBefore As Boolean = False) As String()
    ' splits array at any pattern that matches a regex
    
    ' parameters
    ' onlyFirst: if true, only splits the first instance of the match, creating an array of length 2
    ' splitBefore: if true, preserves the actual instance of the match
    
    Dim Regex As Object: Set Regex = CreateObject("VBScript.RegExp")
    Dim matches As Object
    Dim match As Object
    Dim splitParts() As String: ReDim splitParts(0 To 0)
    Dim pos As Integer
    Dim lastPos As Integer: lastPos = 1
    Dim i As Integer: i = 0
    
    ' set regex flags
    Regex.Global = True
    Regex.IgnoreCase = False
    Regex.pattern = pattern
    
    Set matches = Regex.Execute(inputString)
    
    ' lastPos = 1
    ' i = 0
    
    For Each match In matches
        pos = match.FirstIndex + 1
        ReDim Preserve splitParts(i)
        splitParts(i) = Mid(inputString, lastPos, pos - lastPos)
        If splitBefore Then
            lastPos = pos
        Else
            lastPos = pos + Len(match.Value)
        End If
        i = i + 1
        If onlyFirst Then Exit For
    Next match
    
    If lastPos <= Len(inputString) Then
        ReDim Preserve splitParts(i)
        splitParts(i) = Mid(inputString, lastPos)
    End If
    
    ' retvrn
    RegexSplit = RemoveEmptyStrings(splitParts)
End Function

Private Function RegexSubstitute(inputString As String, pattern As String, Optional substitution As String = "")
    ' does what it says on the tin
    Dim Regex As Object: Set Regex = CreateObject("VBScript.RegExp")
    Regex.pattern = pattern
    Regex.IgnoreCase = False
    Regex.Global = True
    RegexSubstitute = Regex.Replace(inputString, substitution)
End Function

' YAML Layer Parser Pseudocode
' ====
' function GetYAMLLayerAsCollection(String fromYAML) {
'    Collection mainDictionary = New Collection();
'    if (fromYAML.containsRegex(/\n[A-Za-z]/)) {
'      // is a dictionary
'      String[] temporaryArray = fromYAML.split(/\n[A-Za-z]/);
'      for each x in temporaryArray {
'        x.splitByFirstInstanceOf(':\n');
'        x[1].replaceAllInstancesOf('
'        mainDictionary.add(x[0], x[1]);
'      }
'    } else if (fromYAML.containsRegex(/\n-/)) {
'      // if array, process the array and return it as "self"
'      String[] temporaryArray = fromYAML.splitBy('\n-');
'      for each x in temporaryArray {
'        x.removeAllInstancesOf('\n- ');
'        x.replaceAllInstancesOf('\n  ', '\n');
'        mainDictionary.add("self", temporaryArray);
'      }
'    } else if (fromYAML.startsWith('"')) {
'      mainDictionary.add("self", removeQuotes(fromYAML));
'    } else {
'      MsgBox("Processing error: neither array, dictionary, nor string");
'    }
' }


Private Function GetYAMLLayerAsDictionary(fromYAML As String) As Scripting.Dictionary
    Dim mainDictionary As Scripting.Dictionary: Set mainDictionary = New Scripting.Dictionary
    ' create regex objects to test for dict, array, and string
    
    'Dim regEx_dict As Object: Set regEx_dict = CreateObject("VBScript.RegExp")
    'Dim regEx_arry As Object: Set regEx_arry = CreateObject("VBScript.RegExp")
    'Dim regEx_strn As Object: Set regEx_strn = CreateObject("VBScript.RegExp")
    
    'regEx_dict.Global = True:  regEx_dict.Pattern = "\n[A-Za-z]"
    'regEx_arry.Global = True:  regEx_arry.Pattern = "\n-\s"
    'regEx_strn.Global = False: regEx_strn.Pattern = "^\s*""(.*?)""\s*$"

    
    Dim parts() As String
    
    If RegexMatch(fromYAML, "(?:\n|\^)\w+:", True) Then
        ' is a dictionary
        parts = RegexSplit(fromYAML, "\n\w+:", False, True)
        Dim part As Variant ' not sure why it can't be as string but whatever billy gates
        Call mainDictionary.Add(ID_TYPE, "Dictionary") ' identify as dict
        For Each part In parts
            Dim keyValue() As String: keyValue = RegexSplit(CStr(part), ":\s", True)
            ' trim trailing \n from category
            If UBound(keyValue) > 0 Then
                keyValue(0) = RegexSubstitute(keyValue(0), "^\n+")
                ' trim 2 spaces off of each line if they're there
                keyValue(1) = RegexSubstitute(keyValue(1), "^\s{2}")
                keyValue(1) = RegexSubstitute(keyValue(1), "\n\s{2}", vbLf)
                Call mainDictionary.Add(keyValue(0), keyValue(1))
            End If
        Next part
    ElseIf RegexMatch(fromYAML, "^-\s", True) Then
        ' is an array
        Call mainDictionary.Add(ID_TYPE, "Array")
        parts = RegexSplit(fromYAML, "(^|\n)-\s", False)
        Dim i As Integer
        For i = LBound(parts) To UBound(parts)
            parts(i) = RegexSubstitute(parts(i), "\n\s{2}", vbLf)
        Next i
        Call mainDictionary.Add(ID_SELF, parts)
    ElseIf RegexMatch(fromYAML, "^\s*""(.*?)""\s*$", True) Then

        ' is a string
        Call mainDictionary.Add(ID_TYPE, "String")
        Call mainDictionary.Add(ID_SELF, RegexSubstitute(fromYAML, """", ""))
    Else
        Call mainDictionary.Add(ID_SELF, "")
        Debug.Print _
        "Neither array, dictionary, nor string:" & _
        vbCrLf & vbCrLf & fromYAML & vbCrLf & vbCrLf & _
        "Make sure all strings are enclosed in double quotes." ', _
        'vbOKOnly, "YAML Error")
    End If
    
    Set GetYAMLLayerAsDictionary = mainDictionary
End Function

' YAML Traverser Pseudocode
' ===
'
' function TraverseYAML(String fromYAML) {
'   Dictionary mainDictionary = GetYAMLLayerAsDictionary(fromYAML);
'   if mainDictionary.___type___ = "Dictionary" {
'     for each entry in mainDictionary {
'       TraverseYAML(entry)
'     }
'     return mainDictionary;
'   } else if mainDictionary.___type___ = "Array" {
'     for each entry in mainDictionary.___self___ {
'       TraverseYAML(entry)
'     }
'     return mainDictionary;
'   } else if mainDictionary.___type___ = "String" {
'     return mainDictionary;
'   } else {
'     MsgBox("Internal YAML Error")
'   }
' }
Private Function GetYAMLAsDictionary(fromYAML As String) As Scripting.Dictionary
    Dim mainDictionary As Object: Set mainDictionary = GetYAMLLayerAsDictionary(fromYAML)
    Dim entry As Variant
    If mainDictionary(ID_TYPE) = "Dictionary" Then
        For Each entry In mainDictionary
            Debug.Print "=== PROCESSING DICTIONARY ENTRY ==="
            Debug.Print entry & " => " & mainDictionary(entry)
            If entry <> ID_TYPE And entry <> ID_SELF Then
                Set mainDictionary(entry) = GetYAMLAsDictionary(mainDictionary(entry))
            End If
        Next entry
    ElseIf mainDictionary(ID_TYPE) = "Array" Then
        Dim i As Integer
        Dim subArray() As Object
        For i = LBound(mainDictionary(ID_SELF)) To UBound(mainDictionary(ID_SELF))
            Debug.Print "=== PROCESSING ARRAY ENTRY ==="
            Debug.Print mainDictionary(ID_SELF)(i)
            'Set subDictionary = GetYAMLAsDictionary(mainDictionary(ID_SELF)(i))
            'Set mainDictionary(ID_SELF)(i) = subDictionary
            ReDim Preserve subArray(i)
            Set subArray(i) = GetYAMLAsDictionary(CStr(mainDictionary(ID_SELF)(i)))
        Next i
        
        mainDictionary(ID_SELF) = subArray
    ElseIf mainDictionary(ID_TYPE) <> "String" Then
        Debug.Print MESSAGE_MALFORMED_TYPE ', vbOKOnly, errIdentifier)
    End If
    Set GetYAMLAsDictionary = mainDictionary
End Function

' YAML Cleaner Pseudocode
' =====
' function YAMLCleaner(Dictionary mainDictionary) {
'   for each entry in mainDictionary {
'     if entry(ID_TYPE) == "Dictionary" {
'       for each secondOrderEntry in entry {
'         YAMLCleaner(secondOrderEntry)
'       }
'     } else if entry(ID_TYPE) == "Array" {
'       for each secondOrderEntry in entry(ID_SELF) {
'         YAMLCleaner(secondOrderEntry)
'       }
'     }
'     if entry(ID_TYPE) != "Dictionary" {
'       mainDictionary(entry) = mainDictionary(entry)(ID_SELF)
'     }
'   }
'   return mainDictionary;
' }

'Function YAMLCleaner(mainDictionary As Dictionary) As Dictionary
'    Dim entry As Variant
'    If mainDictionary(ID_TYPE) = "Array" Then ' go through array and yamlclean it
'        Dim i As Integer
'        Debug.Print JsonConverter.ConvertToJson(mainDictionary)
'        For i = LBound(mainDictionary(ID_SELF)) To UBound(mainDictionary(ID_SELF))
'
'            'If IsObject(mainDictionary(ID_SELF)(i)) Then
'                'Set mainDictionary(ID_SELF)(i) = YAMLCleaner(mainDictionary(ID_SELF)(i))
'            'Else
'            '    Debug.Print "encountered non-object"
'            'End If
'        Next i
'    End If
'    If mainDictionary(ID_TYPE) = "Dictionary" Then 'iterate through dict and yamlclena it
'        For Each entry In mainDictionary
'            If entry <> ID_TYPE Then
'                Set mainDictionary(entry) = YAMLCleaner(mainDictionary(entry))
'            End If
'        Next entry
'    End If
'
'    For Each entry In mainDictionary
'        If mainDictionary(ID_TYPE) = "Dictionary" And mainDictionary(entry)(ID_TYPE) <> "Dictionary" And entry <> ID_TYPE And entry <> ID_SELF Then
'            Debug.Print "processing " & entry & " which is " & mainDictionary(entry)(ID_TYPE)
'            If IsObject(mainDictionary(entry)(ID_SELF)) Then
'                Set mainDictionary(entry) = mainDictionary(entry)(ID_SELF)
'            Else
'                mainDictionary(entry) = mainDictionary(entry)(ID_SELF)
'            End If
'        End If
'    Next entry
'
'    ' destroy type identifier?
'    Set YAMLCleaner = mainDictionary
'End Function

Private Function GetFileAsString(filePath As String) As String
    ' Dim fileContent As String
    Dim line As String
    Dim fileNumber As Integer
    
    'filePath = "\\Mac\iCloud\Development\cv\cv.yml"
    
    fileNumber = FreeFile()
    
    Open filePath For Input As fileNumber
    
    Do While Not EOF(fileNumber)
        Line Input #fileNumber, line
        GetFileAsString = GetFileAsString & line & vbCrLf
    Loop
End Function

Public Property Let path(thePath As String)
    yamlPath = thePath
End Property

Public Property Get path() As String
    path = yamlPath
End Property

Public Property Get props() As Scripting.Dictionary
    Set props = GetYAMLAsDictionary(GetFileAsString(yamlPath))
End Property

' YAML Indexer Pseudocode [implement later]
' =====
' function index(string theIndex) {
'   Variant[] mainArray = theIndex.split(".");
'   Dictionary mainDictionary = yamlProps;
'   for each entry in mainArray {
'     if entry is {
'
'     ....
diff --git a/contents/_rels/.rels b/contents/_rels/.rels
deleted file mode 100644
index fdd8c4f..0000000 100644
--- a/contents/_rels/.rels
+++ /dev/null
@@ -1,2 +1,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships"><Relationship Id="rId3" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties" Target="docProps/app.xml"/><Relationship Id="rId2" Type="http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties" Target="docProps/core.xml"/><Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument" Target="word/document.xml"/></Relationships>
diff --git a/contents/customXml/item1.xml b/contents/customXml/item1.xml
deleted file mode 100644
index df14848..0000000 100644
--- a/contents/customXml/item1.xml
+++ /dev/null
@@ -1,1 +1,0 @@
<?xml version="1.0" standalone="no"?><b:Sources xmlns:b="http://schemas.openxmlformats.org/officeDocument/2006/bibliography" xmlns="http://schemas.openxmlformats.org/officeDocument/2006/bibliography" SelectedStyle="\APASixthEditionOfficeOnline.xsl" StyleName="APA" Version="6"></b:Sources>
diff --git a/contents/customXml/itemProps1.xml b/contents/customXml/itemProps1.xml
deleted file mode 100644
index 9402714..0000000 100644
--- a/contents/customXml/itemProps1.xml
+++ /dev/null
@@ -1,2 +1,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<ds:datastoreItem ds:itemID="{B248A5C3-C6B1-49A1-A9B8-C0D60D0C1BE8}" xmlns:ds="http://schemas.openxmlformats.org/officeDocument/2006/customXml"><ds:schemaRefs><ds:schemaRef ds:uri="http://schemas.openxmlformats.org/officeDocument/2006/bibliography"/></ds:schemaRefs></ds:datastoreItem>
diff --git a/contents/docProps/app.xml b/contents/docProps/app.xml
deleted file mode 100644
index 0282abe..0000000 100644
--- a/contents/docProps/app.xml
+++ /dev/null
@@ -1,2 +1,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Properties xmlns="http://schemas.openxmlformats.org/officeDocument/2006/extended-properties" xmlns:vt="http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes"><Template>cv.dotx</Template><TotalTime>496</TotalTime><Pages>1</Pages><Words>0</Words><Characters>0</Characters><Application>Microsoft Office Word</Application><DocSecurity>0</DocSecurity><Lines>0</Lines><Paragraphs>0</Paragraphs><ScaleCrop>false</ScaleCrop><HeadingPairs><vt:vector size="2" baseType="variant"><vt:variant><vt:lpstr>Title</vt:lpstr></vt:variant><vt:variant><vt:i4>1</vt:i4></vt:variant></vt:vector></HeadingPairs><TitlesOfParts><vt:vector size="1" baseType="lpstr"><vt:lpstr></vt:lpstr></vt:vector></TitlesOfParts><Company></Company><LinksUpToDate>false</LinksUpToDate><CharactersWithSpaces>0</CharactersWithSpaces><SharedDoc>false</SharedDoc><HyperlinksChanged>false</HyperlinksChanged><AppVersion>16.0000</AppVersion></Properties>
diff --git a/contents/docProps/core.xml b/contents/docProps/core.xml
deleted file mode 100644
index 53ee84d..0000000 100644
--- a/contents/docProps/core.xml
+++ /dev/null
@@ -1,2 +1,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<cp:coreProperties xmlns:cp="http://schemas.openxmlformats.org/package/2006/metadata/core-properties" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dcterms="http://purl.org/dc/terms/" xmlns:dcmitype="http://purl.org/dc/dcmitype/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><dc:title></dc:title><dc:subject></dc:subject><dc:creator>Jacob Walchuk</dc:creator><cp:keywords></cp:keywords><dc:description></dc:description><cp:lastModifiedBy>Jacob Walchuk</cp:lastModifiedBy><cp:revision>1</cp:revision><dcterms:created xsi:type="dcterms:W3CDTF">2024-08-20T16:37:00Z</dcterms:created><dcterms:modified xsi:type="dcterms:W3CDTF">2024-08-21T00:53:00Z</dcterms:modified></cp:coreProperties>
diff --git a/contents/word/document.xml b/contents/word/document.xml
deleted file mode 100644
index 2e8ffdb..0000000 100644
--- a/contents/word/document.xml
+++ /dev/null
@@ -1,2 +1,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<w:document xmlns:wpc="http://schemas.microsoft.com/office/word/2010/wordprocessingCanvas" xmlns:cx="http://schemas.microsoft.com/office/drawing/2014/chartex" xmlns:cx1="http://schemas.microsoft.com/office/drawing/2015/9/8/chartex" xmlns:cx2="http://schemas.microsoft.com/office/drawing/2015/10/21/chartex" xmlns:cx3="http://schemas.microsoft.com/office/drawing/2016/5/9/chartex" xmlns:cx4="http://schemas.microsoft.com/office/drawing/2016/5/10/chartex" xmlns:cx5="http://schemas.microsoft.com/office/drawing/2016/5/11/chartex" xmlns:cx6="http://schemas.microsoft.com/office/drawing/2016/5/12/chartex" xmlns:cx7="http://schemas.microsoft.com/office/drawing/2016/5/13/chartex" xmlns:cx8="http://schemas.microsoft.com/office/drawing/2016/5/14/chartex" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:aink="http://schemas.microsoft.com/office/drawing/2016/ink" xmlns:am3d="http://schemas.microsoft.com/office/drawing/2017/model3d" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:oel="http://schemas.microsoft.com/office/2019/extlst" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:wp14="http://schemas.microsoft.com/office/word/2010/wordprocessingDrawing" xmlns:wp="http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing" xmlns:w10="urn:schemas-microsoft-com:office:word" xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" xmlns:w14="http://schemas.microsoft.com/office/word/2010/wordml" xmlns:w15="http://schemas.microsoft.com/office/word/2012/wordml" xmlns:w16cex="http://schemas.microsoft.com/office/word/2018/wordml/cex" xmlns:w16cid="http://schemas.microsoft.com/office/word/2016/wordml/cid" xmlns:w16="http://schemas.microsoft.com/office/word/2018/wordml" xmlns:w16du="http://schemas.microsoft.com/office/word/2023/wordml/word16du" xmlns:w16sdtdh="http://schemas.microsoft.com/office/word/2020/wordml/sdtdatahash" xmlns:w16se="http://schemas.microsoft.com/office/word/2015/wordml/symex" xmlns:wpg="http://schemas.microsoft.com/office/word/2010/wordprocessingGroup" xmlns:wpi="http://schemas.microsoft.com/office/word/2010/wordprocessingInk" xmlns:wne="http://schemas.microsoft.com/office/word/2006/wordml" xmlns:wps="http://schemas.microsoft.com/office/word/2010/wordprocessingShape" mc:Ignorable="w14 w15 w16se w16cid w16 w16cex w16sdtdh w16du wp14"><w:body><w:p w14:paraId="41D4F8B4" w14:textId="77777777" w:rsidR="00144410" w:rsidRPr="00144410" w:rsidRDefault="00144410" w:rsidP="002D6511"><w:pPr><w:pStyle w:val="NoSpacing"/><w:ind w:left="720"/></w:pPr></w:p><w:sectPr w:rsidR="00144410" w:rsidRPr="00144410"><w:pgSz w:w="12240" w:h="15840"/><w:pgMar w:top="1440" w:right="1440" w:bottom="1440" w:left="1440" w:header="720" w:footer="720" w:gutter="0"/><w:cols w:space="720"/><w:docGrid w:linePitch="360"/></w:sectPr></w:body></w:document>
diff --git a/contents/word/fontTable.xml b/contents/word/fontTable.xml
deleted file mode 100644
index a0065f3..0000000 100644
--- a/contents/word/fontTable.xml
+++ /dev/null
@@ -1,2 +1,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<w:fonts xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" xmlns:w14="http://schemas.microsoft.com/office/word/2010/wordml" xmlns:w15="http://schemas.microsoft.com/office/word/2012/wordml" xmlns:w16cex="http://schemas.microsoft.com/office/word/2018/wordml/cex" xmlns:w16cid="http://schemas.microsoft.com/office/word/2016/wordml/cid" xmlns:w16="http://schemas.microsoft.com/office/word/2018/wordml" xmlns:w16du="http://schemas.microsoft.com/office/word/2023/wordml/word16du" xmlns:w16sdtdh="http://schemas.microsoft.com/office/word/2020/wordml/sdtdatahash" xmlns:w16se="http://schemas.microsoft.com/office/word/2015/wordml/symex" mc:Ignorable="w14 w15 w16se w16cid w16 w16cex w16sdtdh w16du"><w:font w:name="Symbol"><w:panose1 w:val="05050102010706020507"/><w:charset w:val="02"/><w:family w:val="roman"/><w:pitch w:val="variable"/><w:sig w:usb0="00000000" w:usb1="10000000" w:usb2="00000000" w:usb3="00000000" w:csb0="80000000" w:csb1="00000000"/></w:font><w:font w:name="Times New Roman"><w:panose1 w:val="02020603050405020304"/><w:charset w:val="00"/><w:family w:val="roman"/><w:pitch w:val="variable"/><w:sig w:usb0="E0002EFF" w:usb1="C000785B" w:usb2="00000009" w:usb3="00000000" w:csb0="000001FF" w:csb1="00000000"/></w:font><w:font w:name="Courier New"><w:panose1 w:val="02070309020205020404"/><w:charset w:val="00"/><w:family w:val="modern"/><w:pitch w:val="fixed"/><w:sig w:usb0="E0002EFF" w:usb1="C0007843" w:usb2="00000009" w:usb3="00000000" w:csb0="000001FF" w:csb1="00000000"/></w:font><w:font w:name="Wingdings"><w:panose1 w:val="05000000000000000000"/><w:charset w:val="02"/><w:family w:val="auto"/><w:pitch w:val="variable"/><w:sig w:usb0="00000000" w:usb1="10000000" w:usb2="00000000" w:usb3="00000000" w:csb0="80000000" w:csb1="00000000"/></w:font><w:font w:name="Calibri"><w:panose1 w:val="020F0502020204030204"/><w:charset w:val="00"/><w:family w:val="swiss"/><w:pitch w:val="variable"/><w:sig w:usb0="E4002EFF" w:usb1="C200247B" w:usb2="00000009" w:usb3="00000000" w:csb0="000001FF" w:csb1="00000000"/></w:font><w:font w:name="Garamond"><w:panose1 w:val="02020404030301010803"/><w:charset w:val="00"/><w:family w:val="roman"/><w:pitch w:val="variable"/><w:sig w:usb0="00000287" w:usb1="00000000" w:usb2="00000000" w:usb3="00000000" w:csb0="0000009F" w:csb1="00000000"/></w:font><w:font w:name="Times New Roman (Headings CS)"><w:altName w:val="Times New Roman"/><w:panose1 w:val="00000000000000000000"/><w:charset w:val="00"/><w:family w:val="roman"/><w:notTrueType/><w:pitch w:val="default"/></w:font><w:font w:name="Calibri Light"><w:panose1 w:val="020F0302020204030204"/><w:charset w:val="00"/><w:family w:val="swiss"/><w:pitch w:val="variable"/><w:sig w:usb0="E4002EFF" w:usb1="C200247B" w:usb2="00000009" w:usb3="00000000" w:csb0="000001FF" w:csb1="00000000"/></w:font></w:fonts>
diff --git a/contents/word/numbering.xml b/contents/word/numbering.xml
deleted file mode 100644
index eefd20c..0000000 100644
--- a/contents/word/numbering.xml
+++ /dev/null
@@ -1,2 +1,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<w:numbering xmlns:wpc="http://schemas.microsoft.com/office/word/2010/wordprocessingCanvas" xmlns:cx="http://schemas.microsoft.com/office/drawing/2014/chartex" xmlns:cx1="http://schemas.microsoft.com/office/drawing/2015/9/8/chartex" xmlns:cx2="http://schemas.microsoft.com/office/drawing/2015/10/21/chartex" xmlns:cx3="http://schemas.microsoft.com/office/drawing/2016/5/9/chartex" xmlns:cx4="http://schemas.microsoft.com/office/drawing/2016/5/10/chartex" xmlns:cx5="http://schemas.microsoft.com/office/drawing/2016/5/11/chartex" xmlns:cx6="http://schemas.microsoft.com/office/drawing/2016/5/12/chartex" xmlns:cx7="http://schemas.microsoft.com/office/drawing/2016/5/13/chartex" xmlns:cx8="http://schemas.microsoft.com/office/drawing/2016/5/14/chartex" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:aink="http://schemas.microsoft.com/office/drawing/2016/ink" xmlns:am3d="http://schemas.microsoft.com/office/drawing/2017/model3d" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:oel="http://schemas.microsoft.com/office/2019/extlst" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:wp14="http://schemas.microsoft.com/office/word/2010/wordprocessingDrawing" xmlns:wp="http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing" xmlns:w10="urn:schemas-microsoft-com:office:word" xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" xmlns:w14="http://schemas.microsoft.com/office/word/2010/wordml" xmlns:w15="http://schemas.microsoft.com/office/word/2012/wordml" xmlns:w16cex="http://schemas.microsoft.com/office/word/2018/wordml/cex" xmlns:w16cid="http://schemas.microsoft.com/office/word/2016/wordml/cid" xmlns:w16="http://schemas.microsoft.com/office/word/2018/wordml" xmlns:w16du="http://schemas.microsoft.com/office/word/2023/wordml/word16du" xmlns:w16sdtdh="http://schemas.microsoft.com/office/word/2020/wordml/sdtdatahash" xmlns:w16se="http://schemas.microsoft.com/office/word/2015/wordml/symex" xmlns:wpg="http://schemas.microsoft.com/office/word/2010/wordprocessingGroup" xmlns:wpi="http://schemas.microsoft.com/office/word/2010/wordprocessingInk" xmlns:wne="http://schemas.microsoft.com/office/word/2006/wordml" xmlns:wps="http://schemas.microsoft.com/office/word/2010/wordprocessingShape" mc:Ignorable="w14 w15 w16se w16cid w16 w16cex w16sdtdh w16du wp14"><w:numPicBullet w:numPicBulletId="0"><w:pict><v:shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f"><v:stroke joinstyle="miter"/><v:formulas><v:f eqn="if lineDrawn pixelLineWidth 0"/><v:f eqn="sum @0 1 0"/><v:f eqn="sum 0 0 @1"/><v:f eqn="prod @2 1 2"/><v:f eqn="prod @3 21600 pixelWidth"/><v:f eqn="prod @3 21600 pixelHeight"/><v:f eqn="sum @0 0 1"/><v:f eqn="prod @6 1 2"/><v:f eqn="prod @7 21600 pixelWidth"/><v:f eqn="sum @8 21600 0"/><v:f eqn="prod @7 21600 pixelHeight"/><v:f eqn="sum @10 21600 0"/></v:formulas><v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"/><o:lock v:ext="edit" aspectratio="t"/></v:shapetype><v:shape id="_x0000_i1027" type="#_x0000_t75" alt="Receiver with solid fill" style="width:12.7pt;height:13.55pt;visibility:visible" o:gfxdata="UEsDBBQABgAIAAAAIQCo1seoEwEAAEkCAAATAAAAW0NvbnRlbnRfVHlwZXNdLnhtbJSSwU7DMBBE&#xA;70j8g+UrShx6QAgl6YGUIyBUPsCyN4lFvLa8JrR/j5O2ElRtpR493jc7I7tcbuzARghkHFb8Pi84&#xA;A1ROG+wq/rl+yR45oyhRy8EhVHwLxJf17U253noglmikivcx+ichSPVgJeXOA6ab1gUrYzqGTnip&#xA;vmQHYlEUD0I5jIAxi5MHr8sGWvk9RLbaJHmXxGPH2fNublpVcWMnftLFSSLAQEeI9H4wSsbUTYyo&#xA;j3Jl+0x5IucZ6o2nuxT8zAYaT2dK+gVq8vvf5G+s/ba39ATBaGDvMsRXaVNfoQMJWLjGqfyyx1TN&#xA;Uuba1ijIm0CrmTpkOuet3Q8GGK81bxL2AePBXcwfof4FAAD//wMAUEsDBBQABgAIAAAAIQA4/SH/&#xA;1gAAAJQBAAALAAAAX3JlbHMvLnJlbHOkkMFqwzAMhu+DvYPRfXGawxijTi+j0GvpHsDYimMaW0Yy&#xA;2fr2M4PBMnrbUb/Q94l/f/hMi1qRJVI2sOt6UJgd+ZiDgffL8ekFlFSbvV0oo4EbChzGx4f9GRdb&#xA;25HMsYhqlCwG5lrLq9biZkxWOiqY22YiTra2kYMu1l1tQD30/bPm3wwYN0x18gb45AdQl1tp5j/s&#xA;FB2T0FQ7R0nTNEV3j6o9feQzro1iOWA14Fm+Q8a1a8+Bvu/d/dMb2JY5uiPbhG/ktn4cqGU/er3p&#xA;cvwCAAD//wMAUEsDBAoAAAAAAAAAIQABMpY0kAMAAJADAAAUAAAAZHJzL21lZGlhL2ltYWdlMi5z&#xA;dmc8c3ZnIHZpZXdCb3g9IjAgMCA5NiA5NiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAv&#xA;c3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgaWQ9Ikljb25z&#xA;X1JlY2VpdmVyIiBvdmVyZmxvdz0iaGlkZGVuIj48cGF0aCBkPSJNMzkuMiAyOS4yQzQwIDI4LjQg&#xA;NDAuNSAyNy4zIDQwLjUgMjYuMSA0MC41IDI0LjkgNDAgMjMuOCAzOS4yIDIzTDI1LjQgOS4zQzI0&#xA;LjYgOC41IDIzLjUgOCAyMi40IDggMjEuMyA4IDIwLjEgOC41IDE5LjMgOS4zTDE3LjggMTAuOCAz&#xA;Ny43IDMwLjcgMzkuMiAyOS4yWiIvPjxwYXRoIGQ9Ik01OS4zIDY0LjVDNTguOSA2NC45IDU4LjMg&#xA;NjUuMSA1Ny44IDY1LjEgNTcuMyA2NS4xIDU2LjcgNjQuOSA1Ni4zIDY0LjVMMzEuNSAzOS44QzMx&#xA;LjEgMzkuNCAzMC45IDM4LjggMzAuOSAzOC4zIDMwLjkgMzcuOCAzMS4xIDM3LjIgMzEuNSAzNi44&#xA;TDM0LjYgMzMuOCAxNC43IDEzLjlDMTMuNCAxNS4yIDEyLjIgMTYuNCAxMS40IDE3LjIgOS40IDE5&#xA;LjEgOC4yIDIxLjYgOC4xIDI0LjMgNy44IDI4LjggOC45IDMzLjEgMTAuNCAzNy4zIDEyIDQxIDE0&#xA;LjEgNDQuNSAxNi40IDQ3LjggMjQuNiA2MC4xIDM0LjkgNzAuOCA0Ni45IDc5LjMgNDguOSA4MC44&#xA;IDUxIDgyLjEgNTMuMiA4My4zIDU4LjIgODUuOCA2My41IDg3LjYgNjkuMiA4OCA3MyA4OC4zIDc2&#xA;LjggODYuOCA3OS40IDg0TDgyLjEgODEuMyA2Mi4zIDYxLjQgNTkuMyA2NC41WiIvPjxwYXRoIGQ9&#xA;Ik04Ni43IDcwLjYgNzIuOSA1Ni44QzcyLjEgNTYgNzEgNTUuNSA2OS44IDU1LjUgNjguNiA1NS41&#xA;IDY3LjUgNTYgNjYuNyA1Ni44TDY1LjIgNTguNCA4NS4xIDc4LjMgODYuNiA3Ni44Qzg3LjQgNzYg&#xA;ODcuOSA3NC45IDg3LjkgNzMuNyA4Ny45IDcyLjUgODcuNSA3MS40IDg2LjcgNzAuNloiLz48L3N2&#xA;Zz5QSwMEFAAGAAgAAAAhAER4ROnHAQAA1QMAAA4AAABkcnMvZTJvRG9jLnhtbKSTTW7bMBCF9wV6&#xA;B4L7RFaAJo5gORsjQYGiNYr2ADQ5tIjyD0Pasm/focS4zqpFuhA15FBvPg6fVk8nZ9kRMJnge97e&#xA;LjgDL4Myft/znz+eb5acpSy8EjZ46PkZEn9af/ywGmMHd2EIVgEyEvGpG2PPh5xj1zRJDuBEug0R&#xA;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&#xA;AAAAAAcABwC+AQAA5C0AAAAA&#xA;" o:bullet="t"><v:imagedata r:id="rId1" o:title="" cropright="-5041f"/></v:shape></w:pict></w:numPicBullet><w:abstractNum w:abstractNumId="0" w15:restartNumberingAfterBreak="0"><w:nsid w:val="08F42F55"/><w:multiLevelType w:val="hybridMultilevel"/><w:tmpl w:val="861E92D8"/><w:lvl w:ilvl="0" w:tplc="04090001"><w:start w:val="1"/><w:numFmt w:val="bullet"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="720" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:hAnsi="Symbol" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="04090003" w:tentative="1"><w:start w:val="1"/><w:numFmt w:val="bullet"/><w:lvlText w:val="o"/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1440" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:hAnsi="Courier New" w:cs="Courier New" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2" w:tplc="04090005" w:tentative="1"><w:start w:val="1"/><w:numFmt w:val="bullet"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2160" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:hAnsi="Wingdings" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3" w:tplc="04090001" w:tentative="1"><w:start w:val="1"/><w:numFmt w:val="bullet"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2880" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:hAnsi="Symbol" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090003" w:tentative="1"><w:start w:val="1"/><w:numFmt w:val="bullet"/><w:lvlText w:val="o"/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="3600" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:hAnsi="Courier New" w:cs="Courier New" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5" w:tplc="04090005" w:tentative="1"><w:start w:val="1"/><w:numFmt w:val="bullet"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="4320" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:hAnsi="Wingdings" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6" w:tplc="04090001" w:tentative="1"><w:start w:val="1"/><w:numFmt w:val="bullet"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="5040" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:hAnsi="Symbol" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090003" w:tentative="1"><w:start w:val="1"/><w:numFmt w:val="bullet"/><w:lvlText w:val="o"/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="5760" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:hAnsi="Courier New" w:cs="Courier New" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8" w:tplc="04090005" w:tentative="1"><w:start w:val="1"/><w:numFmt w:val="bullet"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="6480" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:hAnsi="Wingdings" w:hint="default"/></w:rPr></w:lvl></w:abstractNum><w:abstractNum w:abstractNumId="1" w15:restartNumberingAfterBreak="0"><w:nsid w:val="163947D1"/><w:multiLevelType w:val="multilevel"/><w:tmpl w:val="93EE981C"/><w:styleLink w:val="CurrentList1"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:numFmt w:val="bullet"/><w:lvlText w:val=""/><w:lvlPicBulletId w:val="0"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="num" w:pos="720"/></w:tabs><w:ind w:left="720" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:hAnsi="Symbol" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:numFmt w:val="bullet"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="num" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:hAnsi="Symbol" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:numFmt w:val="bullet"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="num" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:hAnsi="Symbol" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:numFmt w:val="bullet"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="num" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:hAnsi="Symbol" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:numFmt w:val="bullet"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="num" w:pos="3600"/></w:tabs><w:ind w:left="3600" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:hAnsi="Symbol" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:numFmt w:val="bullet"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="num" w:pos="4320"/></w:tabs><w:ind w:left="4320" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:hAnsi="Symbol" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:numFmt w:val="bullet"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="num" w:pos="5040"/></w:tabs><w:ind w:left="5040" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:hAnsi="Symbol" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:numFmt w:val="bullet"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="num" w:pos="5760"/></w:tabs><w:ind w:left="5760" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:hAnsi="Symbol" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:numFmt w:val="bullet"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="num" w:pos="6480"/></w:tabs><w:ind w:left="6480" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:hAnsi="Symbol" w:hint="default"/></w:rPr></w:lvl></w:abstractNum><w:abstractNum w:abstractNumId="2" w15:restartNumberingAfterBreak="0"><w:nsid w:val="39A530A3"/><w:multiLevelType w:val="hybridMultilevel"/><w:tmpl w:val="06868BE0"/><w:lvl w:ilvl="0" w:tplc="04090001"><w:start w:val="1"/><w:numFmt w:val="bullet"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="720" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:hAnsi="Symbol" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="04090003" w:tentative="1"><w:start w:val="1"/><w:numFmt w:val="bullet"/><w:lvlText w:val="o"/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1440" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:hAnsi="Courier New" w:cs="Courier New" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2" w:tplc="04090005" w:tentative="1"><w:start w:val="1"/><w:numFmt w:val="bullet"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2160" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:hAnsi="Wingdings" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3" w:tplc="04090001" w:tentative="1"><w:start w:val="1"/><w:numFmt w:val="bullet"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2880" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:hAnsi="Symbol" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090003" w:tentative="1"><w:start w:val="1"/><w:numFmt w:val="bullet"/><w:lvlText w:val="o"/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="3600" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:hAnsi="Courier New" w:cs="Courier New" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5" w:tplc="04090005" w:tentative="1"><w:start w:val="1"/><w:numFmt w:val="bullet"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="4320" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:hAnsi="Wingdings" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6" w:tplc="04090001" w:tentative="1"><w:start w:val="1"/><w:numFmt w:val="bullet"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="5040" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:hAnsi="Symbol" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090003" w:tentative="1"><w:start w:val="1"/><w:numFmt w:val="bullet"/><w:lvlText w:val="o"/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="5760" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:hAnsi="Courier New" w:cs="Courier New" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8" w:tplc="04090005" w:tentative="1"><w:start w:val="1"/><w:numFmt w:val="bullet"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="6480" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:hAnsi="Wingdings" w:hint="default"/></w:rPr></w:lvl></w:abstractNum><w:abstractNum w:abstractNumId="3" w15:restartNumberingAfterBreak="0"><w:nsid w:val="5B6C109D"/><w:multiLevelType w:val="hybridMultilevel"/><w:tmpl w:val="28F0EA78"/><w:lvl w:ilvl="0" w:tplc="44AAA75E"><w:start w:val="1"/><w:numFmt w:val="bullet"/><w:lvlRestart w:val="0"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="720" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:hAnsi="Symbol" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="04090003" w:tentative="1"><w:start w:val="1"/><w:numFmt w:val="bullet"/><w:lvlText w:val="o"/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1440" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:hAnsi="Courier New" w:cs="Courier New" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2" w:tplc="04090005" w:tentative="1"><w:start w:val="1"/><w:numFmt w:val="bullet"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2160" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:hAnsi="Wingdings" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3" w:tplc="04090001" w:tentative="1"><w:start w:val="1"/><w:numFmt w:val="bullet"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2880" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:hAnsi="Symbol" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090003" w:tentative="1"><w:start w:val="1"/><w:numFmt w:val="bullet"/><w:lvlText w:val="o"/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="3600" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:hAnsi="Courier New" w:cs="Courier New" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5" w:tplc="04090005" w:tentative="1"><w:start w:val="1"/><w:numFmt w:val="bullet"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="4320" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:hAnsi="Wingdings" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6" w:tplc="04090001" w:tentative="1"><w:start w:val="1"/><w:numFmt w:val="bullet"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="5040" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:hAnsi="Symbol" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090003" w:tentative="1"><w:start w:val="1"/><w:numFmt w:val="bullet"/><w:lvlText w:val="o"/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="5760" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:hAnsi="Courier New" w:cs="Courier New" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8" w:tplc="04090005" w:tentative="1"><w:start w:val="1"/><w:numFmt w:val="bullet"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="6480" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:hAnsi="Wingdings" w:hint="default"/></w:rPr></w:lvl></w:abstractNum><w:abstractNum w:abstractNumId="4" w15:restartNumberingAfterBreak="0"><w:nsid w:val="618B6657"/><w:multiLevelType w:val="hybridMultilevel"/><w:tmpl w:val="CF6C0B6C"/><w:lvl w:ilvl="0" w:tplc="04090001"><w:start w:val="1"/><w:numFmt w:val="bullet"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="720" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:hAnsi="Symbol" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="04090003" w:tentative="1"><w:start w:val="1"/><w:numFmt w:val="bullet"/><w:lvlText w:val="o"/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1440" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:hAnsi="Courier New" w:cs="Courier New" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2" w:tplc="04090005" w:tentative="1"><w:start w:val="1"/><w:numFmt w:val="bullet"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2160" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:hAnsi="Wingdings" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3" w:tplc="04090001" w:tentative="1"><w:start w:val="1"/><w:numFmt w:val="bullet"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2880" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:hAnsi="Symbol" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090003" w:tentative="1"><w:start w:val="1"/><w:numFmt w:val="bullet"/><w:lvlText w:val="o"/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="3600" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:hAnsi="Courier New" w:cs="Courier New" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5" w:tplc="04090005" w:tentative="1"><w:start w:val="1"/><w:numFmt w:val="bullet"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="4320" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:hAnsi="Wingdings" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6" w:tplc="04090001" w:tentative="1"><w:start w:val="1"/><w:numFmt w:val="bullet"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="5040" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:hAnsi="Symbol" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090003" w:tentative="1"><w:start w:val="1"/><w:numFmt w:val="bullet"/><w:lvlText w:val="o"/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="5760" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:hAnsi="Courier New" w:cs="Courier New" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8" w:tplc="04090005" w:tentative="1"><w:start w:val="1"/><w:numFmt w:val="bullet"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="6480" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:hAnsi="Wingdings" w:hint="default"/></w:rPr></w:lvl></w:abstractNum><w:num w:numId="1" w16cid:durableId="1428429609"><w:abstractNumId w:val="1"/></w:num><w:num w:numId="2" w16cid:durableId="1792043940"><w:abstractNumId w:val="2"/></w:num><w:num w:numId="3" w16cid:durableId="291251609"><w:abstractNumId w:val="0"/></w:num><w:num w:numId="4" w16cid:durableId="802885965"><w:abstractNumId w:val="4"/></w:num><w:num w:numId="5" w16cid:durableId="2055424400"><w:abstractNumId w:val="3"/></w:num></w:numbering>
diff --git a/contents/word/settings.xml b/contents/word/settings.xml
deleted file mode 100644
index d51770c..0000000 100644
--- a/contents/word/settings.xml
+++ /dev/null
@@ -1,2 +1,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<w:settings xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:w10="urn:schemas-microsoft-com:office:word" xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" xmlns:w14="http://schemas.microsoft.com/office/word/2010/wordml" xmlns:w15="http://schemas.microsoft.com/office/word/2012/wordml" xmlns:w16cex="http://schemas.microsoft.com/office/word/2018/wordml/cex" xmlns:w16cid="http://schemas.microsoft.com/office/word/2016/wordml/cid" xmlns:w16="http://schemas.microsoft.com/office/word/2018/wordml" xmlns:w16du="http://schemas.microsoft.com/office/word/2023/wordml/word16du" xmlns:w16sdtdh="http://schemas.microsoft.com/office/word/2020/wordml/sdtdatahash" xmlns:w16se="http://schemas.microsoft.com/office/word/2015/wordml/symex" xmlns:sl="http://schemas.openxmlformats.org/schemaLibrary/2006/main" mc:Ignorable="w14 w15 w16se w16cid w16 w16cex w16sdtdh w16du"><w:zoom w:percent="89"/><w:proofState w:spelling="clean" w:grammar="clean"/><w:attachedTemplate r:id="rId1"/><w:linkStyles/><w:defaultTabStop w:val="720"/><w:characterSpacingControl w:val="doNotCompress"/><w:compat><w:useFELayout/><w:compatSetting w:name="compatibilityMode" w:uri="http://schemas.microsoft.com/office/word" w:val="15"/><w:compatSetting w:name="overrideTableStyleFontSizeAndJustification" w:uri="http://schemas.microsoft.com/office/word" w:val="1"/><w:compatSetting w:name="enableOpenTypeFeatures" w:uri="http://schemas.microsoft.com/office/word" w:val="1"/><w:compatSetting w:name="doNotFlipMirrorIndents" w:uri="http://schemas.microsoft.com/office/word" w:val="1"/><w:compatSetting w:name="differentiateMultirowTableHeaders" w:uri="http://schemas.microsoft.com/office/word" w:val="1"/><w:compatSetting w:name="useWord2013TrackBottomHyphenation" w:uri="http://schemas.microsoft.com/office/word" w:val="0"/></w:compat><w:rsids><w:rsidRoot w:val="00144410"/><w:rsid w:val="00144410"/><w:rsid w:val="00167F49"/><w:rsid w:val="001945FC"/><w:rsid w:val="002D6511"/><w:rsid w:val="00D15AC7"/><w:rsid w:val="00EC707E"/></w:rsids><m:mathPr><m:mathFont m:val="Cambria Math"/><m:brkBin m:val="before"/><m:brkBinSub m:val="--"/><m:smallFrac m:val="0"/><m:dispDef/><m:lMargin m:val="0"/><m:rMargin m:val="0"/><m:defJc m:val="centerGroup"/><m:wrapIndent m:val="1440"/><m:intLim m:val="subSup"/><m:naryLim m:val="undOvr"/></m:mathPr><w:themeFontLang w:val="en-US"/><w:clrSchemeMapping w:bg1="light1" w:t1="dark1" w:bg2="light2" w:t2="dark2" w:accent1="accent1" w:accent2="accent2" w:accent3="accent3" w:accent4="accent4" w:accent5="accent5" w:accent6="accent6" w:hyperlink="hyperlink" w:followedHyperlink="followedHyperlink"/><w:shapeDefaults><o:shapedefaults v:ext="edit" spidmax="1026"/><o:shapelayout v:ext="edit"><o:idmap v:ext="edit" data="1"/></o:shapelayout></w:shapeDefaults><w:decimalSymbol w:val="."/><w:listSeparator w:val=","/><w14:docId w14:val="583CDA0A"/><w15:chartTrackingRefBased/><w15:docId w15:val="{27A4DF65-5A1E-432E-86F8-91410E29C3DB}"/></w:settings>
diff --git a/contents/word/styles.xml b/contents/word/styles.xml
deleted file mode 100644
index 2d1dcd8..0000000 100644
--- a/contents/word/styles.xml
+++ /dev/null
@@ -1,2 +1,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<w:styles xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" xmlns:w14="http://schemas.microsoft.com/office/word/2010/wordml" xmlns:w15="http://schemas.microsoft.com/office/word/2012/wordml" xmlns:w16cex="http://schemas.microsoft.com/office/word/2018/wordml/cex" xmlns:w16cid="http://schemas.microsoft.com/office/word/2016/wordml/cid" xmlns:w16="http://schemas.microsoft.com/office/word/2018/wordml" xmlns:w16du="http://schemas.microsoft.com/office/word/2023/wordml/word16du" xmlns:w16sdtdh="http://schemas.microsoft.com/office/word/2020/wordml/sdtdatahash" xmlns:w16se="http://schemas.microsoft.com/office/word/2015/wordml/symex" mc:Ignorable="w14 w15 w16se w16cid w16 w16cex w16sdtdh w16du"><w:docDefaults><w:rPrDefault><w:rPr><w:rFonts w:asciiTheme="minorHAnsi" w:eastAsiaTheme="minorEastAsia" w:hAnsiTheme="minorHAnsi" w:cstheme="minorBidi"/><w:sz w:val="22"/><w:szCs w:val="22"/><w:lang w:val="en-US" w:eastAsia="en-US" w:bidi="ar-SA"/></w:rPr></w:rPrDefault><w:pPrDefault><w:pPr><w:spacing w:after="160" w:line="259" w:lineRule="auto"/></w:pPr></w:pPrDefault></w:docDefaults><w:latentStyles w:defLockedState="0" w:defUIPriority="99" w:defSemiHidden="0" w:defUnhideWhenUsed="0" w:defQFormat="0" w:count="376"><w:lsdException w:name="Normal" w:uiPriority="0" w:qFormat="1"/><w:lsdException w:name="heading 1" w:uiPriority="9" w:qFormat="1"/><w:lsdException w:name="heading 2" w:semiHidden="1" w:uiPriority="9" w:unhideWhenUsed="1" w:qFormat="1"/><w:lsdException w:name="heading 3" w:semiHidden="1" w:uiPriority="9" w:unhideWhenUsed="1" w:qFormat="1"/><w:lsdException w:name="heading 4" w:semiHidden="1" w:uiPriority="9" w:unhideWhenUsed="1" w:qFormat="1"/><w:lsdException w:name="heading 5" w:semiHidden="1" w:uiPriority="9" w:unhideWhenUsed="1" w:qFormat="1"/><w:lsdException w:name="heading 6" w:semiHidden="1" w:uiPriority="9" w:unhideWhenUsed="1" w:qFormat="1"/><w:lsdException w:name="heading 7" w:semiHidden="1" w:uiPriority="9" w:unhideWhenUsed="1" w:qFormat="1"/><w:lsdException w:name="heading 8" w:semiHidden="1" w:uiPriority="9" w:unhideWhenUsed="1" w:qFormat="1"/><w:lsdException w:name="heading 9" w:semiHidden="1" w:uiPriority="9" w:unhideWhenUsed="1" w:qFormat="1"/><w:lsdException w:name="index 1" w:semiHidden="1" w:unhideWhenUsed="1"/><w:lsdException w:name="index 2" w:semiHidden="1" w:unhideWhenUsed="1"/><w:lsdException w:name="index 3" w:semiHidden="1" w:unhideWhenUsed="1"/><w:lsdException w:name="index 4" w:semiHidden="1" w:unhideWhenUsed="1"/><w:lsdException w:name="index 5" w:semiHidden="1" w:unhideWhenUsed="1"/><w:lsdException w:name="index 6" w:semiHidden="1" w:unhideWhenUsed="1"/><w:lsdException w:name="index 7" w:semiHidden="1" w:unhideWhenUsed="1"/><w:lsdException w:name="index 8" w:semiHidden="1" w:unhideWhenUsed="1"/><w:lsdException w:name="index 9" w:semiHidden="1" w:unhideWhenUsed="1"/><w:lsdException w:name="toc 1" w:semiHidden="1" w:uiPriority="39" w:unhideWhenUsed="1"/><w:lsdException w:name="toc 2" w:semiHidden="1" w:uiPriority="39" w:unhideWhenUsed="1"/><w:lsdException w:name="toc 3" w:semiHidden="1" w:uiPriority="39" w:unhideWhenUsed="1"/><w:lsdException w:name="toc 4" w:semiHidden="1" w:uiPriority="39" w:unhideWhenUsed="1"/><w:lsdException w:name="toc 5" w:semiHidden="1" w:uiPriority="39" w:unhideWhenUsed="1"/><w:lsdException w:name="toc 6" w:semiHidden="1" w:uiPriority="39" w:unhideWhenUsed="1"/><w:lsdException w:name="toc 7" w:semiHidden="1" w:uiPriority="39" w:unhideWhenUsed="1"/><w:lsdException w:name="toc 8" w:semiHidden="1" w:uiPriority="39" w:unhideWhenUsed="1"/><w:lsdException w:name="toc 9" w:semiHidden="1" w:uiPriority="39" w:unhideWhenUsed="1"/><w:lsdException w:name="Normal Indent" w:semiHidden="1" w:unhideWhenUsed="1"/><w:lsdException w:name="footnote text" w:semiHidden="1" w:unhideWhenUsed="1"/><w:lsdException w:name="annotation text" w:semiHidden="1" w:unhideWhenUsed="1"/><w:lsdException w:name="header" w:semiHidden="1" w:unhideWhenUsed="1"/><w:lsdException w:name="footer" w:semiHidden="1" w:unhideWhenUsed="1"/><w:lsdException w:name="index heading" w:semiHidden="1" w:unhideWhenUsed="1"/><w:lsdException w:name="caption" w:semiHidden="1" w:uiPriority="35" w:unhideWhenUsed="1" w:qFormat="1"/><w:lsdException w:name="table of figures" w:semiHidden="1" w:unhideWhenUsed="1"/><w:lsdException w:name="envelope address" w:semiHidden="1" w:unhideWhenUsed="1"/><w:lsdException w:name="envelope return" w:semiHidden="1" w:unhideWhenUsed="1"/><w:lsdException w:name="footnote reference" w:semiHidden="1" w:unhideWhenUsed="1"/><w:lsdException w:name="annotation reference" w:semiHidden="1" w:unhideWhenUsed="1"/><w:lsdException w:name="line number" w:semiHidden="1" w:unhideWhenUsed="1"/><w:lsdException w:name="page number" w:semiHidden="1" w:unhideWhenUsed="1"/><w:lsdException w:name="endnote reference" w:semiHidden="1" w:unhideWhenUsed="1"/><w:lsdException w:name="endnote text" w:semiHidden="1" w:unhideWhenUsed="1"/><w:lsdException w:name="table of authorities" w:semiHidden="1" w:unhideWhenUsed="1"/><w:lsdException w:name="macro" w:semiHidden="1" w:unhideWhenUsed="1"/><w:lsdException w:name="toa heading" w:semiHidden="1" w:unhideWhenUsed="1"/><w:lsdException w:name="List" w:semiHidden="1" w:unhideWhenUsed="1"/><w:lsdException w:name="List Bullet" w:semiHidden="1" w:unhideWhenUsed="1"/><w:lsdException w:name="List Number" w:semiHidden="1" w:unhideWhenUsed="1"/><w:lsdException w:name="List 2" w:semiHidden="1" w:unhideWhenUsed="1"/><w:lsdException w:name="List 3" w:semiHidden="1" w:unhideWhenUsed="1"/><w:lsdException w:name="List 4" w:semiHidden="1" w:unhideWhenUsed="1"/><w:lsdException w:name="List 5" w:semiHidden="1" w:unhideWhenUsed="1"/><w:lsdException w:name="List Bullet 2" w:semiHidden="1" w:unhideWhenUsed="1"/><w:lsdException w:name="List Bullet 3" w:semiHidden="1" w:unhideWhenUsed="1"/><w:lsdException w:name="List Bullet 4" w:semiHidden="1" w:unhideWhenUsed="1"/><w:lsdException w:name="List Bullet 5" w:semiHidden="1" w:unhideWhenUsed="1"/><w:lsdException w:name="List Number 2" w:semiHidden="1" w:unhideWhenUsed="1"/><w:lsdException w:name="List Number 3" w:semiHidden="1" w:unhideWhenUsed="1"/><w:lsdException w:name="List Number 4" w:semiHidden="1" w:unhideWhenUsed="1"/><w:lsdException w:name="List Number 5" w:semiHidden="1" w:unhideWhenUsed="1"/><w:lsdException w:name="Title" w:uiPriority="10" w:qFormat="1"/><w:lsdException w:name="Closing" w:semiHidden="1" w:unhideWhenUsed="1"/><w:lsdException w:name="Signature" w:semiHidden="1" w:unhideWhenUsed="1"/><w:lsdException w:name="Default Paragraph Font" w:semiHidden="1" w:uiPriority="1" w:unhideWhenUsed="1"/><w:lsdException w:name="Body Text" w:semiHidden="1" w:unhideWhenUsed="1"/><w:lsdException w:name="Body Text Indent" w:semiHidden="1" w:unhideWhenUsed="1"/><w:lsdException w:name="List Continue" w:semiHidden="1" w:unhideWhenUsed="1"/><w:lsdException w:name="List Continue 2" w:semiHidden="1" w:unhideWhenUsed="1"/><w:lsdException w:name="List Continue 3" w:semiHidden="1" w:unhideWhenUsed="1"/><w:lsdException w:name="List Continue 4" w:semiHidden="1" w:unhideWhenUsed="1"/><w:lsdException w:name="List Continue 5" w:semiHidden="1" w:unhideWhenUsed="1"/><w:lsdException w:name="Message Header" w:semiHidden="1" w:unhideWhenUsed="1"/><w:lsdException w:name="Subtitle" w:uiPriority="11" w:qFormat="1"/><w:lsdException w:name="Salutation" w:semiHidden="1" w:unhideWhenUsed="1"/><w:lsdException w:name="Date" w:semiHidden="1" w:unhideWhenUsed="1"/><w:lsdException w:name="Body Text First Indent" w:semiHidden="1" w:unhideWhenUsed="1"/><w:lsdException w:name="Body Text First Indent 2" w:semiHidden="1" w:unhideWhenUsed="1"/><w:lsdException w:name="Note Heading" w:semiHidden="1" w:unhideWhenUsed="1"/><w:lsdException w:name="Body Text 2" w:semiHidden="1" w:unhideWhenUsed="1"/><w:lsdException w:name="Body Text 3" w:semiHidden="1" w:unhideWhenUsed="1"/><w:lsdException w:name="Body Text Indent 2" w:semiHidden="1" w:unhideWhenUsed="1"/><w:lsdException w:name="Body Text Indent 3" w:semiHidden="1" w:unhideWhenUsed="1"/><w:lsdException w:name="Block Text" w:semiHidden="1" w:unhideWhenUsed="1"/><w:lsdException w:name="Hyperlink" w:semiHidden="1" w:unhideWhenUsed="1"/><w:lsdException w:name="FollowedHyperlink" w:semiHidden="1" w:unhideWhenUsed="1"/><w:lsdException w:name="Strong" w:uiPriority="22" w:qFormat="1"/><w:lsdException w:name="Emphasis" w:uiPriority="20" w:qFormat="1"/><w:lsdException w:name="Document Map" w:semiHidden="1" w:unhideWhenUsed="1"/><w:lsdException w:name="Plain Text" w:semiHidden="1" w:unhideWhenUsed="1"/><w:lsdException w:name="E-mail Signature" w:semiHidden="1" w:unhideWhenUsed="1"/><w:lsdException w:name="HTML Top of Form" w:semiHidden="1" w:unhideWhenUsed="1"/><w:lsdException w:name="HTML Bottom of Form" w:semiHidden="1" w:unhideWhenUsed="1"/><w:lsdException w:name="Normal (Web)" w:semiHidden="1" w:unhideWhenUsed="1"/><w:lsdException w:name="HTML Acronym" w:semiHidden="1" w:unhideWhenUsed="1"/><w:lsdException w:name="HTML Address" w:semiHidden="1" w:unhideWhenUsed="1"/><w:lsdException w:name="HTML Cite" w:semiHidden="1" w:unhideWhenUsed="1"/><w:lsdException w:name="HTML Code" w:semiHidden="1" w:unhideWhenUsed="1"/><w:lsdException w:name="HTML Definition" w:semiHidden="1" w:unhideWhenUsed="1"/><w:lsdException w:name="HTML Keyboard" w:semiHidden="1" w:unhideWhenUsed="1"/><w:lsdException w:name="HTML Preformatted" w:semiHidden="1" w:unhideWhenUsed="1"/><w:lsdException w:name="HTML Sample" w:semiHidden="1" w:unhideWhenUsed="1"/><w:lsdException w:name="HTML Typewriter" w:semiHidden="1" w:unhideWhenUsed="1"/><w:lsdException w:name="HTML Variable" w:semiHidden="1" w:unhideWhenUsed="1"/><w:lsdException w:name="Normal Table" w:semiHidden="1" w:unhideWhenUsed="1"/><w:lsdException w:name="annotation subject" w:semiHidden="1" w:unhideWhenUsed="1"/><w:lsdException w:name="No List" w:semiHidden="1" w:unhideWhenUsed="1"/><w:lsdException w:name="Outline List 1" w:semiHidden="1" w:unhideWhenUsed="1"/><w:lsdException w:name="Outline List 2" w:semiHidden="1" w:unhideWhenUsed="1"/><w:lsdException w:name="Outline List 3" w:semiHidden="1" w:unhideWhenUsed="1"/><w:lsdException w:name="Table Simple 1" w:semiHidden="1" w:unhideWhenUsed="1"/><w:lsdException w:name="Table Simple 2" w:semiHidden="1" w:unhideWhenUsed="1"/><w:lsdException w:name="Table Simple 3" w:semiHidden="1" w:unhideWhenUsed="1"/><w:lsdException w:name="Table Classic 1" w:semiHidden="1" w:unhideWhenUsed="1"/><w:lsdException w:name="Table Classic 2" w:semiHidden="1" w:unhideWhenUsed="1"/><w:lsdException w:name="Table Classic 3" w:semiHidden="1" w:unhideWhenUsed="1"/><w:lsdException w:name="Table Classic 4" w:semiHidden="1" w:unhideWhenUsed="1"/><w:lsdException w:name="Table Colorful 1" w:semiHidden="1" w:unhideWhenUsed="1"/><w:lsdException w:name="Table Colorful 2" w:semiHidden="1" w:unhideWhenUsed="1"/><w:lsdException w:name="Table Colorful 3" w:semiHidden="1" w:unhideWhenUsed="1"/><w:lsdException w:name="Table Columns 1" w:semiHidden="1" w:unhideWhenUsed="1"/><w:lsdException w:name="Table Columns 2" w:semiHidden="1" w:unhideWhenUsed="1"/><w:lsdException w:name="Table Columns 3" w:semiHidden="1" w:unhideWhenUsed="1"/><w:lsdException w:name="Table Columns 4" w:semiHidden="1" w:unhideWhenUsed="1"/><w:lsdException w:name="Table Columns 5" w:semiHidden="1" w:unhideWhenUsed="1"/><w:lsdException w:name="Table Grid 1" w:semiHidden="1" w:unhideWhenUsed="1"/><w:lsdException w:name="Table Grid 2" w:semiHidden="1" w:unhideWhenUsed="1"/><w:lsdException w:name="Table Grid 3" w:semiHidden="1" w:unhideWhenUsed="1"/><w:lsdException w:name="Table Grid 4" w:semiHidden="1" w:unhideWhenUsed="1"/><w:lsdException w:name="Table Grid 5" w:semiHidden="1" w:unhideWhenUsed="1"/><w:lsdException w:name="Table Grid 6" w:semiHidden="1" w:unhideWhenUsed="1"/><w:lsdException w:name="Table Grid 7" w:semiHidden="1" w:unhideWhenUsed="1"/><w:lsdException w:name="Table Grid 8" w:semiHidden="1" w:unhideWhenUsed="1"/><w:lsdException w:name="Table List 1" w:semiHidden="1" w:unhideWhenUsed="1"/><w:lsdException w:name="Table List 2" w:semiHidden="1" w:unhideWhenUsed="1"/><w:lsdException w:name="Table List 3" w:semiHidden="1" w:unhideWhenUsed="1"/><w:lsdException w:name="Table List 4" w:semiHidden="1" w:unhideWhenUsed="1"/><w:lsdException w:name="Table List 5" w:semiHidden="1" w:unhideWhenUsed="1"/><w:lsdException w:name="Table List 6" w:semiHidden="1" w:unhideWhenUsed="1"/><w:lsdException w:name="Table List 7" w:semiHidden="1" w:unhideWhenUsed="1"/><w:lsdException w:name="Table List 8" w:semiHidden="1" w:unhideWhenUsed="1"/><w:lsdException w:name="Table 3D effects 1" w:semiHidden="1" w:unhideWhenUsed="1"/><w:lsdException w:name="Table 3D effects 2" w:semiHidden="1" w:unhideWhenUsed="1"/><w:lsdException w:name="Table 3D effects 3" w:semiHidden="1" w:unhideWhenUsed="1"/><w:lsdException w:name="Table Contemporary" w:semiHidden="1" w:unhideWhenUsed="1"/><w:lsdException w:name="Table Elegant" w:semiHidden="1" w:unhideWhenUsed="1"/><w:lsdException w:name="Table Professional" w:semiHidden="1" w:unhideWhenUsed="1"/><w:lsdException w:name="Table Subtle 1" w:semiHidden="1" w:unhideWhenUsed="1"/><w:lsdException w:name="Table Subtle 2" w:semiHidden="1" w:unhideWhenUsed="1"/><w:lsdException w:name="Table Web 1" w:semiHidden="1" w:unhideWhenUsed="1"/><w:lsdException w:name="Table Web 2" w:semiHidden="1" w:unhideWhenUsed="1"/><w:lsdException w:name="Table Web 3" w:semiHidden="1" w:unhideWhenUsed="1"/><w:lsdException w:name="Balloon Text" w:semiHidden="1" w:unhideWhenUsed="1"/><w:lsdException w:name="Table Grid" w:uiPriority="39"/><w:lsdException w:name="Table Theme" w:semiHidden="1" w:unhideWhenUsed="1"/><w:lsdException w:name="Placeholder Text" w:semiHidden="1"/><w:lsdException w:name="No Spacing" w:uiPriority="1" w:qFormat="1"/><w:lsdException w:name="Light Shading" w:uiPriority="60"/><w:lsdException w:name="Light List" w:uiPriority="61"/><w:lsdException w:name="Light Grid" w:uiPriority="62"/><w:lsdException w:name="Medium Shading 1" w:uiPriority="63"/><w:lsdException w:name="Medium Shading 2" w:uiPriority="64"/><w:lsdException w:name="Medium List 1" w:uiPriority="65"/><w:lsdException w:name="Medium List 2" w:uiPriority="66"/><w:lsdException w:name="Medium Grid 1" w:uiPriority="67"/><w:lsdException w:name="Medium Grid 2" w:uiPriority="68"/><w:lsdException w:name="Medium Grid 3" w:uiPriority="69"/><w:lsdException w:name="Dark List" w:uiPriority="70"/><w:lsdException w:name="Colorful Shading" w:uiPriority="71"/><w:lsdException w:name="Colorful List" w:uiPriority="72"/><w:lsdException w:name="Colorful Grid" w:uiPriority="73"/><w:lsdException w:name="Light Shading Accent 1" w:uiPriority="60"/><w:lsdException w:name="Light List Accent 1" w:uiPriority="61"/><w:lsdException w:name="Light Grid Accent 1" w:uiPriority="62"/><w:lsdException w:name="Medium Shading 1 Accent 1" w:uiPriority="63"/><w:lsdException w:name="Medium Shading 2 Accent 1" w:uiPriority="64"/><w:lsdException w:name="Medium List 1 Accent 1" w:uiPriority="65"/><w:lsdException w:name="Revision" w:semiHidden="1"/><w:lsdException w:name="List Paragraph" w:uiPriority="34" w:qFormat="1"/><w:lsdException w:name="Quote" w:uiPriority="29" w:qFormat="1"/><w:lsdException w:name="Intense Quote" w:uiPriority="30" w:qFormat="1"/><w:lsdException w:name="Medium List 2 Accent 1" w:uiPriority="66"/><w:lsdException w:name="Medium Grid 1 Accent 1" w:uiPriority="67"/><w:lsdException w:name="Medium Grid 2 Accent 1" w:uiPriority="68"/><w:lsdException w:name="Medium Grid 3 Accent 1" w:uiPriority="69"/><w:lsdException w:name="Dark List Accent 1" w:uiPriority="70"/><w:lsdException w:name="Colorful Shading Accent 1" w:uiPriority="71"/><w:lsdException w:name="Colorful List Accent 1" w:uiPriority="72"/><w:lsdException w:name="Colorful Grid Accent 1" w:uiPriority="73"/><w:lsdException w:name="Light Shading Accent 2" w:uiPriority="60"/><w:lsdException w:name="Light List Accent 2" w:uiPriority="61"/><w:lsdException w:name="Light Grid Accent 2" w:uiPriority="62"/><w:lsdException w:name="Medium Shading 1 Accent 2" w:uiPriority="63"/><w:lsdException w:name="Medium Shading 2 Accent 2" w:uiPriority="64"/><w:lsdException w:name="Medium List 1 Accent 2" w:uiPriority="65"/><w:lsdException w:name="Medium List 2 Accent 2" w:uiPriority="66"/><w:lsdException w:name="Medium Grid 1 Accent 2" w:uiPriority="67"/><w:lsdException w:name="Medium Grid 2 Accent 2" w:uiPriority="68"/><w:lsdException w:name="Medium Grid 3 Accent 2" w:uiPriority="69"/><w:lsdException w:name="Dark List Accent 2" w:uiPriority="70"/><w:lsdException w:name="Colorful Shading Accent 2" w:uiPriority="71"/><w:lsdException w:name="Colorful List Accent 2" w:uiPriority="72"/><w:lsdException w:name="Colorful Grid Accent 2" w:uiPriority="73"/><w:lsdException w:name="Light Shading Accent 3" w:uiPriority="60"/><w:lsdException w:name="Light List Accent 3" w:uiPriority="61"/><w:lsdException w:name="Light Grid Accent 3" w:uiPriority="62"/><w:lsdException w:name="Medium Shading 1 Accent 3" w:uiPriority="63"/><w:lsdException w:name="Medium Shading 2 Accent 3" w:uiPriority="64"/><w:lsdException w:name="Medium List 1 Accent 3" w:uiPriority="65"/><w:lsdException w:name="Medium List 2 Accent 3" w:uiPriority="66"/><w:lsdException w:name="Medium Grid 1 Accent 3" w:uiPriority="67"/><w:lsdException w:name="Medium Grid 2 Accent 3" w:uiPriority="68"/><w:lsdException w:name="Medium Grid 3 Accent 3" w:uiPriority="69"/><w:lsdException w:name="Dark List Accent 3" w:uiPriority="70"/><w:lsdException w:name="Colorful Shading Accent 3" w:uiPriority="71"/><w:lsdException w:name="Colorful List Accent 3" w:uiPriority="72"/><w:lsdException w:name="Colorful Grid Accent 3" w:uiPriority="73"/><w:lsdException w:name="Light Shading Accent 4" w:uiPriority="60"/><w:lsdException w:name="Light List Accent 4" w:uiPriority="61"/><w:lsdException w:name="Light Grid Accent 4" w:uiPriority="62"/><w:lsdException w:name="Medium Shading 1 Accent 4" w:uiPriority="63"/><w:lsdException w:name="Medium Shading 2 Accent 4" w:uiPriority="64"/><w:lsdException w:name="Medium List 1 Accent 4" w:uiPriority="65"/><w:lsdException w:name="Medium List 2 Accent 4" w:uiPriority="66"/><w:lsdException w:name="Medium Grid 1 Accent 4" w:uiPriority="67"/><w:lsdException w:name="Medium Grid 2 Accent 4" w:uiPriority="68"/><w:lsdException w:name="Medium Grid 3 Accent 4" w:uiPriority="69"/><w:lsdException w:name="Dark List Accent 4" w:uiPriority="70"/><w:lsdException w:name="Colorful Shading Accent 4" w:uiPriority="71"/><w:lsdException w:name="Colorful List Accent 4" w:uiPriority="72"/><w:lsdException w:name="Colorful Grid Accent 4" w:uiPriority="73"/><w:lsdException w:name="Light Shading Accent 5" w:uiPriority="60"/><w:lsdException w:name="Light List Accent 5" w:uiPriority="61"/><w:lsdException w:name="Light Grid Accent 5" w:uiPriority="62"/><w:lsdException w:name="Medium Shading 1 Accent 5" w:uiPriority="63"/><w:lsdException w:name="Medium Shading 2 Accent 5" w:uiPriority="64"/><w:lsdException w:name="Medium List 1 Accent 5" w:uiPriority="65"/><w:lsdException w:name="Medium List 2 Accent 5" w:uiPriority="66"/><w:lsdException w:name="Medium Grid 1 Accent 5" w:uiPriority="67"/><w:lsdException w:name="Medium Grid 2 Accent 5" w:uiPriority="68"/><w:lsdException w:name="Medium Grid 3 Accent 5" w:uiPriority="69"/><w:lsdException w:name="Dark List Accent 5" w:uiPriority="70"/><w:lsdException w:name="Colorful Shading Accent 5" w:uiPriority="71"/><w:lsdException w:name="Colorful List Accent 5" w:uiPriority="72"/><w:lsdException w:name="Colorful Grid Accent 5" w:uiPriority="73"/><w:lsdException w:name="Light Shading Accent 6" w:uiPriority="60"/><w:lsdException w:name="Light List Accent 6" w:uiPriority="61"/><w:lsdException w:name="Light Grid Accent 6" w:uiPriority="62"/><w:lsdException w:name="Medium Shading 1 Accent 6" w:uiPriority="63"/><w:lsdException w:name="Medium Shading 2 Accent 6" w:uiPriority="64"/><w:lsdException w:name="Medium List 1 Accent 6" w:uiPriority="65"/><w:lsdException w:name="Medium List 2 Accent 6" w:uiPriority="66"/><w:lsdException w:name="Medium Grid 1 Accent 6" w:uiPriority="67"/><w:lsdException w:name="Medium Grid 2 Accent 6" w:uiPriority="68"/><w:lsdException w:name="Medium Grid 3 Accent 6" w:uiPriority="69"/><w:lsdException w:name="Dark List Accent 6" w:uiPriority="70"/><w:lsdException w:name="Colorful Shading Accent 6" w:uiPriority="71"/><w:lsdException w:name="Colorful List Accent 6" w:uiPriority="72"/><w:lsdException w:name="Colorful Grid Accent 6" w:uiPriority="73"/><w:lsdException w:name="Subtle Emphasis" w:uiPriority="19" w:qFormat="1"/><w:lsdException w:name="Intense Emphasis" w:uiPriority="21" w:qFormat="1"/><w:lsdException w:name="Subtle Reference" w:uiPriority="31" w:qFormat="1"/><w:lsdException w:name="Intense Reference" w:uiPriority="32" w:qFormat="1"/><w:lsdException w:name="Book Title" w:uiPriority="33" w:qFormat="1"/><w:lsdException w:name="Bibliography" w:semiHidden="1" w:uiPriority="37" w:unhideWhenUsed="1"/><w:lsdException w:name="TOC Heading" w:semiHidden="1" w:uiPriority="39" w:unhideWhenUsed="1" w:qFormat="1"/><w:lsdException w:name="Plain Table 1" w:uiPriority="41"/><w:lsdException w:name="Plain Table 2" w:uiPriority="42"/><w:lsdException w:name="Plain Table 3" w:uiPriority="43"/><w:lsdException w:name="Plain Table 4" w:uiPriority="44"/><w:lsdException w:name="Plain Table 5" w:uiPriority="45"/><w:lsdException w:name="Grid Table Light" w:uiPriority="40"/><w:lsdException w:name="Grid Table 1 Light" w:uiPriority="46"/><w:lsdException w:name="Grid Table 2" w:uiPriority="47"/><w:lsdException w:name="Grid Table 3" w:uiPriority="48"/><w:lsdException w:name="Grid Table 4" w:uiPriority="49"/><w:lsdException w:name="Grid Table 5 Dark" w:uiPriority="50"/><w:lsdException w:name="Grid Table 6 Colorful" w:uiPriority="51"/><w:lsdException w:name="Grid Table 7 Colorful" w:uiPriority="52"/><w:lsdException w:name="Grid Table 1 Light Accent 1" w:uiPriority="46"/><w:lsdException w:name="Grid Table 2 Accent 1" w:uiPriority="47"/><w:lsdException w:name="Grid Table 3 Accent 1" w:uiPriority="48"/><w:lsdException w:name="Grid Table 4 Accent 1" w:uiPriority="49"/><w:lsdException w:name="Grid Table 5 Dark Accent 1" w:uiPriority="50"/><w:lsdException w:name="Grid Table 6 Colorful Accent 1" w:uiPriority="51"/><w:lsdException w:name="Grid Table 7 Colorful Accent 1" w:uiPriority="52"/><w:lsdException w:name="Grid Table 1 Light Accent 2" w:uiPriority="46"/><w:lsdException w:name="Grid Table 2 Accent 2" w:uiPriority="47"/><w:lsdException w:name="Grid Table 3 Accent 2" w:uiPriority="48"/><w:lsdException w:name="Grid Table 4 Accent 2" w:uiPriority="49"/><w:lsdException w:name="Grid Table 5 Dark Accent 2" w:uiPriority="50"/><w:lsdException w:name="Grid Table 6 Colorful Accent 2" w:uiPriority="51"/><w:lsdException w:name="Grid Table 7 Colorful Accent 2" w:uiPriority="52"/><w:lsdException w:name="Grid Table 1 Light Accent 3" w:uiPriority="46"/><w:lsdException w:name="Grid Table 2 Accent 3" w:uiPriority="47"/><w:lsdException w:name="Grid Table 3 Accent 3" w:uiPriority="48"/><w:lsdException w:name="Grid Table 4 Accent 3" w:uiPriority="49"/><w:lsdException w:name="Grid Table 5 Dark Accent 3" w:uiPriority="50"/><w:lsdException w:name="Grid Table 6 Colorful Accent 3" w:uiPriority="51"/><w:lsdException w:name="Grid Table 7 Colorful Accent 3" w:uiPriority="52"/><w:lsdException w:name="Grid Table 1 Light Accent 4" w:uiPriority="46"/><w:lsdException w:name="Grid Table 2 Accent 4" w:uiPriority="47"/><w:lsdException w:name="Grid Table 3 Accent 4" w:uiPriority="48"/><w:lsdException w:name="Grid Table 4 Accent 4" w:uiPriority="49"/><w:lsdException w:name="Grid Table 5 Dark Accent 4" w:uiPriority="50"/><w:lsdException w:name="Grid Table 6 Colorful Accent 4" w:uiPriority="51"/><w:lsdException w:name="Grid Table 7 Colorful Accent 4" w:uiPriority="52"/><w:lsdException w:name="Grid Table 1 Light Accent 5" w:uiPriority="46"/><w:lsdException w:name="Grid Table 2 Accent 5" w:uiPriority="47"/><w:lsdException w:name="Grid Table 3 Accent 5" w:uiPriority="48"/><w:lsdException w:name="Grid Table 4 Accent 5" w:uiPriority="49"/><w:lsdException w:name="Grid Table 5 Dark Accent 5" w:uiPriority="50"/><w:lsdException w:name="Grid Table 6 Colorful Accent 5" w:uiPriority="51"/><w:lsdException w:name="Grid Table 7 Colorful Accent 5" w:uiPriority="52"/><w:lsdException w:name="Grid Table 1 Light Accent 6" w:uiPriority="46"/><w:lsdException w:name="Grid Table 2 Accent 6" w:uiPriority="47"/><w:lsdException w:name="Grid Table 3 Accent 6" w:uiPriority="48"/><w:lsdException w:name="Grid Table 4 Accent 6" w:uiPriority="49"/><w:lsdException w:name="Grid Table 5 Dark Accent 6" w:uiPriority="50"/><w:lsdException w:name="Grid Table 6 Colorful Accent 6" w:uiPriority="51"/><w:lsdException w:name="Grid Table 7 Colorful Accent 6" w:uiPriority="52"/><w:lsdException w:name="List Table 1 Light" w:uiPriority="46"/><w:lsdException w:name="List Table 2" w:uiPriority="47"/><w:lsdException w:name="List Table 3" w:uiPriority="48"/><w:lsdException w:name="List Table 4" w:uiPriority="49"/><w:lsdException w:name="List Table 5 Dark" w:uiPriority="50"/><w:lsdException w:name="List Table 6 Colorful" w:uiPriority="51"/><w:lsdException w:name="List Table 7 Colorful" w:uiPriority="52"/><w:lsdException w:name="List Table 1 Light Accent 1" w:uiPriority="46"/><w:lsdException w:name="List Table 2 Accent 1" w:uiPriority="47"/><w:lsdException w:name="List Table 3 Accent 1" w:uiPriority="48"/><w:lsdException w:name="List Table 4 Accent 1" w:uiPriority="49"/><w:lsdException w:name="List Table 5 Dark Accent 1" w:uiPriority="50"/><w:lsdException w:name="List Table 6 Colorful Accent 1" w:uiPriority="51"/><w:lsdException w:name="List Table 7 Colorful Accent 1" w:uiPriority="52"/><w:lsdException w:name="List Table 1 Light Accent 2" w:uiPriority="46"/><w:lsdException w:name="List Table 2 Accent 2" w:uiPriority="47"/><w:lsdException w:name="List Table 3 Accent 2" w:uiPriority="48"/><w:lsdException w:name="List Table 4 Accent 2" w:uiPriority="49"/><w:lsdException w:name="List Table 5 Dark Accent 2" w:uiPriority="50"/><w:lsdException w:name="List Table 6 Colorful Accent 2" w:uiPriority="51"/><w:lsdException w:name="List Table 7 Colorful Accent 2" w:uiPriority="52"/><w:lsdException w:name="List Table 1 Light Accent 3" w:uiPriority="46"/><w:lsdException w:name="List Table 2 Accent 3" w:uiPriority="47"/><w:lsdException w:name="List Table 3 Accent 3" w:uiPriority="48"/><w:lsdException w:name="List Table 4 Accent 3" w:uiPriority="49"/><w:lsdException w:name="List Table 5 Dark Accent 3" w:uiPriority="50"/><w:lsdException w:name="List Table 6 Colorful Accent 3" w:uiPriority="51"/><w:lsdException w:name="List Table 7 Colorful Accent 3" w:uiPriority="52"/><w:lsdException w:name="List Table 1 Light Accent 4" w:uiPriority="46"/><w:lsdException w:name="List Table 2 Accent 4" w:uiPriority="47"/><w:lsdException w:name="List Table 3 Accent 4" w:uiPriority="48"/><w:lsdException w:name="List Table 4 Accent 4" w:uiPriority="49"/><w:lsdException w:name="List Table 5 Dark Accent 4" w:uiPriority="50"/><w:lsdException w:name="List Table 6 Colorful Accent 4" w:uiPriority="51"/><w:lsdException w:name="List Table 7 Colorful Accent 4" w:uiPriority="52"/><w:lsdException w:name="List Table 1 Light Accent 5" w:uiPriority="46"/><w:lsdException w:name="List Table 2 Accent 5" w:uiPriority="47"/><w:lsdException w:name="List Table 3 Accent 5" w:uiPriority="48"/><w:lsdException w:name="List Table 4 Accent 5" w:uiPriority="49"/><w:lsdException w:name="List Table 5 Dark Accent 5" w:uiPriority="50"/><w:lsdException w:name="List Table 6 Colorful Accent 5" w:uiPriority="51"/><w:lsdException w:name="List Table 7 Colorful Accent 5" w:uiPriority="52"/><w:lsdException w:name="List Table 1 Light Accent 6" w:uiPriority="46"/><w:lsdException w:name="List Table 2 Accent 6" w:uiPriority="47"/><w:lsdException w:name="List Table 3 Accent 6" w:uiPriority="48"/><w:lsdException w:name="List Table 4 Accent 6" w:uiPriority="49"/><w:lsdException w:name="List Table 5 Dark Accent 6" w:uiPriority="50"/><w:lsdException w:name="List Table 6 Colorful Accent 6" w:uiPriority="51"/><w:lsdException w:name="List Table 7 Colorful Accent 6" w:uiPriority="52"/><w:lsdException w:name="Mention" w:semiHidden="1" w:unhideWhenUsed="1"/><w:lsdException w:name="Smart Hyperlink" w:semiHidden="1" w:unhideWhenUsed="1"/><w:lsdException w:name="Hashtag" w:semiHidden="1" w:unhideWhenUsed="1"/><w:lsdException w:name="Unresolved Mention" w:semiHidden="1" w:unhideWhenUsed="1"/><w:lsdException w:name="Smart Link" w:semiHidden="1" w:unhideWhenUsed="1"/></w:latentStyles><w:style w:type="paragraph" w:default="1" w:styleId="Normal"><w:name w:val="Normal"/><w:qFormat/><w:rsid w:val="00144410"/><w:pPr><w:spacing w:after="0" w:line="240" w:lineRule="auto"/></w:pPr><w:rPr><w:rFonts w:ascii="Garamond" w:hAnsi="Garamond"/><w:w w:val="90"/><w:kern w:val="2"/><w:sz w:val="24"/><w:szCs w:val="24"/><w:lang w:val="en-GB" w:eastAsia="zh-CN"/><w14:ligatures w14:val="standardContextual"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Heading1"><w:name w:val="heading 1"/><w:basedOn w:val="Normal"/><w:next w:val="Normal"/><w:link w:val="Heading1Char"/><w:uiPriority w:val="9"/><w:qFormat/><w:rsid w:val="00144410"/><w:pPr><w:keepNext/><w:keepLines/><w:outlineLvl w:val="0"/></w:pPr><w:rPr><w:rFonts w:eastAsiaTheme="majorEastAsia" w:cs="Times New Roman (Headings CS)"/><w:color w:val="000000" w:themeColor="text1"/><w:spacing w:val="-16"/><w:w w:val="85"/><w:sz w:val="32"/><w:szCs w:val="32"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Heading2"><w:name w:val="heading 2"/><w:basedOn w:val="Normal"/><w:next w:val="Normal"/><w:link w:val="Heading2Char"/><w:uiPriority w:val="9"/><w:semiHidden/><w:unhideWhenUsed/><w:qFormat/><w:rsid w:val="00144410"/><w:pPr><w:keepNext/><w:keepLines/><w:spacing w:before="40"/><w:outlineLvl w:val="1"/></w:pPr><w:rPr><w:rFonts w:asciiTheme="majorHAnsi" w:eastAsiaTheme="majorEastAsia" w:hAnsiTheme="majorHAnsi" w:cstheme="majorBidi"/><w:color w:val="2F5496" w:themeColor="accent1" w:themeShade="BF"/><w:sz w:val="32"/><w:szCs w:val="32"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Heading3"><w:name w:val="heading 3"/><w:basedOn w:val="Normal"/><w:next w:val="Normal"/><w:link w:val="Heading3Char"/><w:uiPriority w:val="9"/><w:semiHidden/><w:unhideWhenUsed/><w:qFormat/><w:rsid w:val="00144410"/><w:pPr><w:keepNext/><w:keepLines/><w:spacing w:before="40"/><w:outlineLvl w:val="2"/></w:pPr><w:rPr><w:rFonts w:asciiTheme="majorHAnsi" w:eastAsiaTheme="majorEastAsia" w:hAnsiTheme="majorHAnsi" w:cstheme="majorBidi"/><w:color w:val="2F5496" w:themeColor="accent1" w:themeShade="BF"/><w:sz w:val="28"/><w:szCs w:val="28"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Heading4"><w:name w:val="heading 4"/><w:basedOn w:val="Normal"/><w:next w:val="Normal"/><w:link w:val="Heading4Char"/><w:uiPriority w:val="9"/><w:semiHidden/><w:unhideWhenUsed/><w:qFormat/><w:rsid w:val="00144410"/><w:pPr><w:keepNext/><w:keepLines/><w:spacing w:before="40"/><w:outlineLvl w:val="3"/></w:pPr><w:rPr><w:rFonts w:asciiTheme="majorHAnsi" w:eastAsiaTheme="majorEastAsia" w:hAnsiTheme="majorHAnsi" w:cstheme="majorBidi"/><w:color w:val="2F5496" w:themeColor="accent1" w:themeShade="BF"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Heading5"><w:name w:val="heading 5"/><w:basedOn w:val="Normal"/><w:next w:val="Normal"/><w:link w:val="Heading5Char"/><w:uiPriority w:val="9"/><w:semiHidden/><w:unhideWhenUsed/><w:qFormat/><w:rsid w:val="00144410"/><w:pPr><w:keepNext/><w:keepLines/><w:spacing w:before="40"/><w:outlineLvl w:val="4"/></w:pPr><w:rPr><w:rFonts w:asciiTheme="majorHAnsi" w:eastAsiaTheme="majorEastAsia" w:hAnsiTheme="majorHAnsi" w:cstheme="majorBidi"/><w:caps/><w:color w:val="2F5496" w:themeColor="accent1" w:themeShade="BF"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Heading6"><w:name w:val="heading 6"/><w:basedOn w:val="Normal"/><w:next w:val="Normal"/><w:link w:val="Heading6Char"/><w:uiPriority w:val="9"/><w:semiHidden/><w:unhideWhenUsed/><w:qFormat/><w:rsid w:val="00144410"/><w:pPr><w:keepNext/><w:keepLines/><w:spacing w:before="40"/><w:outlineLvl w:val="5"/></w:pPr><w:rPr><w:rFonts w:asciiTheme="majorHAnsi" w:eastAsiaTheme="majorEastAsia" w:hAnsiTheme="majorHAnsi" w:cstheme="majorBidi"/><w:i/><w:iCs/><w:caps/><w:color w:val="1F3864" w:themeColor="accent1" w:themeShade="80"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Heading7"><w:name w:val="heading 7"/><w:basedOn w:val="Normal"/><w:next w:val="Normal"/><w:link w:val="Heading7Char"/><w:uiPriority w:val="9"/><w:semiHidden/><w:unhideWhenUsed/><w:qFormat/><w:rsid w:val="00144410"/><w:pPr><w:keepNext/><w:keepLines/><w:spacing w:before="40"/><w:outlineLvl w:val="6"/></w:pPr><w:rPr><w:rFonts w:asciiTheme="majorHAnsi" w:eastAsiaTheme="majorEastAsia" w:hAnsiTheme="majorHAnsi" w:cstheme="majorBidi"/><w:b/><w:bCs/><w:color w:val="1F3864" w:themeColor="accent1" w:themeShade="80"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Heading8"><w:name w:val="heading 8"/><w:basedOn w:val="Normal"/><w:next w:val="Normal"/><w:link w:val="Heading8Char"/><w:uiPriority w:val="9"/><w:semiHidden/><w:unhideWhenUsed/><w:qFormat/><w:rsid w:val="00144410"/><w:pPr><w:keepNext/><w:keepLines/><w:spacing w:before="40"/><w:outlineLvl w:val="7"/></w:pPr><w:rPr><w:rFonts w:asciiTheme="majorHAnsi" w:eastAsiaTheme="majorEastAsia" w:hAnsiTheme="majorHAnsi" w:cstheme="majorBidi"/><w:b/><w:bCs/><w:i/><w:iCs/><w:color w:val="1F3864" w:themeColor="accent1" w:themeShade="80"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Heading9"><w:name w:val="heading 9"/><w:basedOn w:val="Normal"/><w:next w:val="Normal"/><w:link w:val="Heading9Char"/><w:uiPriority w:val="9"/><w:semiHidden/><w:unhideWhenUsed/><w:qFormat/><w:rsid w:val="00144410"/><w:pPr><w:keepNext/><w:keepLines/><w:spacing w:before="40"/><w:outlineLvl w:val="8"/></w:pPr><w:rPr><w:rFonts w:asciiTheme="majorHAnsi" w:eastAsiaTheme="majorEastAsia" w:hAnsiTheme="majorHAnsi" w:cstheme="majorBidi"/><w:i/><w:iCs/><w:color w:val="1F3864" w:themeColor="accent1" w:themeShade="80"/></w:rPr></w:style><w:style w:type="character" w:default="1" w:styleId="DefaultParagraphFont"><w:name w:val="Default Paragraph Font"/><w:uiPriority w:val="1"/><w:semiHidden/><w:unhideWhenUsed/><w:rsid w:val="00144410"/></w:style><w:style w:type="table" w:default="1" w:styleId="TableNormal"><w:name w:val="Normal Table"/><w:uiPriority w:val="99"/><w:semiHidden/><w:unhideWhenUsed/><w:tblPr><w:tblInd w:w="0" w:type="dxa"/><w:tblCellMar><w:top w:w="0" w:type="dxa"/><w:left w:w="108" w:type="dxa"/><w:bottom w:w="0" w:type="dxa"/><w:right w:w="108" w:type="dxa"/></w:tblCellMar></w:tblPr></w:style><w:style w:type="numbering" w:default="1" w:styleId="NoList"><w:name w:val="No List"/><w:uiPriority w:val="99"/><w:semiHidden/><w:unhideWhenUsed/><w:rsid w:val="00144410"/></w:style><w:style w:type="paragraph" w:styleId="Title"><w:name w:val="Title"/><w:basedOn w:val="Normal"/><w:next w:val="Normal"/><w:link w:val="TitleChar"/><w:uiPriority w:val="10"/><w:qFormat/><w:rsid w:val="00144410"/><w:pPr><w:contextualSpacing/></w:pPr><w:rPr><w:rFonts w:eastAsiaTheme="majorEastAsia" w:cs="Times New Roman (Headings CS)"/><w:spacing w:val="-24"/><w:w w:val="85"/><w:kern w:val="28"/><w:sz w:val="56"/><w:szCs w:val="56"/></w:rPr></w:style><w:style w:type="character" w:customStyle="1" w:styleId="TitleChar"><w:name w:val="Title Char"/><w:basedOn w:val="DefaultParagraphFont"/><w:link w:val="Title"/><w:uiPriority w:val="10"/><w:rsid w:val="00144410"/><w:rPr><w:rFonts w:ascii="Garamond" w:eastAsiaTheme="majorEastAsia" w:hAnsi="Garamond" w:cs="Times New Roman (Headings CS)"/><w:spacing w:val="-24"/><w:w w:val="85"/><w:kern w:val="28"/><w:sz w:val="56"/><w:szCs w:val="56"/><w:lang w:val="en-GB" w:eastAsia="zh-CN"/><w14:ligatures w14:val="standardContextual"/></w:rPr></w:style><w:style w:type="character" w:customStyle="1" w:styleId="Heading1Char"><w:name w:val="Heading 1 Char"/><w:basedOn w:val="DefaultParagraphFont"/><w:link w:val="Heading1"/><w:uiPriority w:val="9"/><w:rsid w:val="00144410"/><w:rPr><w:rFonts w:ascii="Garamond" w:eastAsiaTheme="majorEastAsia" w:hAnsi="Garamond" w:cs="Times New Roman (Headings CS)"/><w:color w:val="000000" w:themeColor="text1"/><w:spacing w:val="-16"/><w:w w:val="85"/><w:kern w:val="2"/><w:sz w:val="32"/><w:szCs w:val="32"/><w:lang w:val="en-GB" w:eastAsia="zh-CN"/><w14:ligatures w14:val="standardContextual"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="NoSpacing"><w:name w:val="No Spacing"/><w:uiPriority w:val="1"/><w:qFormat/><w:rsid w:val="00144410"/><w:pPr><w:spacing w:after="0" w:line="240" w:lineRule="auto"/></w:pPr><w:rPr><w:rFonts w:ascii="Garamond" w:hAnsi="Garamond"/><w:w w:val="90"/><w:kern w:val="2"/><w:sz w:val="24"/><w:szCs w:val="24"/><w:lang w:val="en-GB" w:eastAsia="zh-CN"/><w14:ligatures w14:val="standardContextual"/></w:rPr></w:style><w:style w:type="character" w:customStyle="1" w:styleId="Heading2Char"><w:name w:val="Heading 2 Char"/><w:basedOn w:val="DefaultParagraphFont"/><w:link w:val="Heading2"/><w:uiPriority w:val="9"/><w:semiHidden/><w:rsid w:val="00144410"/><w:rPr><w:rFonts w:asciiTheme="majorHAnsi" w:eastAsiaTheme="majorEastAsia" w:hAnsiTheme="majorHAnsi" w:cstheme="majorBidi"/><w:color w:val="2F5496" w:themeColor="accent1" w:themeShade="BF"/><w:sz w:val="32"/><w:szCs w:val="32"/></w:rPr></w:style><w:style w:type="character" w:customStyle="1" w:styleId="Heading3Char"><w:name w:val="Heading 3 Char"/><w:basedOn w:val="DefaultParagraphFont"/><w:link w:val="Heading3"/><w:uiPriority w:val="9"/><w:semiHidden/><w:rsid w:val="00144410"/><w:rPr><w:rFonts w:asciiTheme="majorHAnsi" w:eastAsiaTheme="majorEastAsia" w:hAnsiTheme="majorHAnsi" w:cstheme="majorBidi"/><w:color w:val="2F5496" w:themeColor="accent1" w:themeShade="BF"/><w:sz w:val="28"/><w:szCs w:val="28"/></w:rPr></w:style><w:style w:type="character" w:customStyle="1" w:styleId="Heading4Char"><w:name w:val="Heading 4 Char"/><w:basedOn w:val="DefaultParagraphFont"/><w:link w:val="Heading4"/><w:uiPriority w:val="9"/><w:semiHidden/><w:rsid w:val="00144410"/><w:rPr><w:rFonts w:asciiTheme="majorHAnsi" w:eastAsiaTheme="majorEastAsia" w:hAnsiTheme="majorHAnsi" w:cstheme="majorBidi"/><w:color w:val="2F5496" w:themeColor="accent1" w:themeShade="BF"/><w:sz w:val="24"/><w:szCs w:val="24"/></w:rPr></w:style><w:style w:type="character" w:customStyle="1" w:styleId="Heading5Char"><w:name w:val="Heading 5 Char"/><w:basedOn w:val="DefaultParagraphFont"/><w:link w:val="Heading5"/><w:uiPriority w:val="9"/><w:semiHidden/><w:rsid w:val="00144410"/><w:rPr><w:rFonts w:asciiTheme="majorHAnsi" w:eastAsiaTheme="majorEastAsia" w:hAnsiTheme="majorHAnsi" w:cstheme="majorBidi"/><w:caps/><w:color w:val="2F5496" w:themeColor="accent1" w:themeShade="BF"/></w:rPr></w:style><w:style w:type="character" w:customStyle="1" w:styleId="Heading6Char"><w:name w:val="Heading 6 Char"/><w:basedOn w:val="DefaultParagraphFont"/><w:link w:val="Heading6"/><w:uiPriority w:val="9"/><w:semiHidden/><w:rsid w:val="00144410"/><w:rPr><w:rFonts w:asciiTheme="majorHAnsi" w:eastAsiaTheme="majorEastAsia" w:hAnsiTheme="majorHAnsi" w:cstheme="majorBidi"/><w:i/><w:iCs/><w:caps/><w:color w:val="1F3864" w:themeColor="accent1" w:themeShade="80"/></w:rPr></w:style><w:style w:type="character" w:customStyle="1" w:styleId="Heading7Char"><w:name w:val="Heading 7 Char"/><w:basedOn w:val="DefaultParagraphFont"/><w:link w:val="Heading7"/><w:uiPriority w:val="9"/><w:semiHidden/><w:rsid w:val="00144410"/><w:rPr><w:rFonts w:asciiTheme="majorHAnsi" w:eastAsiaTheme="majorEastAsia" w:hAnsiTheme="majorHAnsi" w:cstheme="majorBidi"/><w:b/><w:bCs/><w:color w:val="1F3864" w:themeColor="accent1" w:themeShade="80"/></w:rPr></w:style><w:style w:type="character" w:customStyle="1" w:styleId="Heading8Char"><w:name w:val="Heading 8 Char"/><w:basedOn w:val="DefaultParagraphFont"/><w:link w:val="Heading8"/><w:uiPriority w:val="9"/><w:semiHidden/><w:rsid w:val="00144410"/><w:rPr><w:rFonts w:asciiTheme="majorHAnsi" w:eastAsiaTheme="majorEastAsia" w:hAnsiTheme="majorHAnsi" w:cstheme="majorBidi"/><w:b/><w:bCs/><w:i/><w:iCs/><w:color w:val="1F3864" w:themeColor="accent1" w:themeShade="80"/></w:rPr></w:style><w:style w:type="character" w:customStyle="1" w:styleId="Heading9Char"><w:name w:val="Heading 9 Char"/><w:basedOn w:val="DefaultParagraphFont"/><w:link w:val="Heading9"/><w:uiPriority w:val="9"/><w:semiHidden/><w:rsid w:val="00144410"/><w:rPr><w:rFonts w:asciiTheme="majorHAnsi" w:eastAsiaTheme="majorEastAsia" w:hAnsiTheme="majorHAnsi" w:cstheme="majorBidi"/><w:i/><w:iCs/><w:color w:val="1F3864" w:themeColor="accent1" w:themeShade="80"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Subtitle"><w:name w:val="Subtitle"/><w:basedOn w:val="Normal"/><w:next w:val="Normal"/><w:link w:val="SubtitleChar"/><w:uiPriority w:val="11"/><w:qFormat/><w:rsid w:val="00144410"/><w:pPr><w:numPr><w:ilvl w:val="1"/></w:numPr><w:spacing w:after="240"/></w:pPr><w:rPr><w:rFonts w:asciiTheme="majorHAnsi" w:eastAsiaTheme="majorEastAsia" w:hAnsiTheme="majorHAnsi" w:cstheme="majorBidi"/><w:color w:val="4472C4" w:themeColor="accent1"/><w:sz w:val="28"/><w:szCs w:val="28"/></w:rPr></w:style><w:style w:type="character" w:customStyle="1" w:styleId="SubtitleChar"><w:name w:val="Subtitle Char"/><w:basedOn w:val="DefaultParagraphFont"/><w:link w:val="Subtitle"/><w:uiPriority w:val="11"/><w:rsid w:val="00144410"/><w:rPr><w:rFonts w:asciiTheme="majorHAnsi" w:eastAsiaTheme="majorEastAsia" w:hAnsiTheme="majorHAnsi" w:cstheme="majorBidi"/><w:color w:val="4472C4" w:themeColor="accent1"/><w:sz w:val="28"/><w:szCs w:val="28"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Quote"><w:name w:val="Quote"/><w:basedOn w:val="Normal"/><w:next w:val="Normal"/><w:link w:val="QuoteChar"/><w:uiPriority w:val="29"/><w:qFormat/><w:rsid w:val="00144410"/><w:pPr><w:spacing w:before="120" w:after="120"/><w:ind w:left="720"/></w:pPr><w:rPr><w:color w:val="44546A" w:themeColor="text2"/></w:rPr></w:style><w:style w:type="character" w:customStyle="1" w:styleId="QuoteChar"><w:name w:val="Quote Char"/><w:basedOn w:val="DefaultParagraphFont"/><w:link w:val="Quote"/><w:uiPriority w:val="29"/><w:rsid w:val="00144410"/><w:rPr><w:color w:val="44546A" w:themeColor="text2"/><w:sz w:val="24"/><w:szCs w:val="24"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="ListParagraph"><w:name w:val="List Paragraph"/><w:basedOn w:val="Normal"/><w:uiPriority w:val="34"/><w:qFormat/><w:rsid w:val="00144410"/><w:pPr><w:ind w:left="720"/><w:contextualSpacing/></w:pPr></w:style><w:style w:type="character" w:styleId="IntenseEmphasis"><w:name w:val="Intense Emphasis"/><w:basedOn w:val="DefaultParagraphFont"/><w:uiPriority w:val="21"/><w:qFormat/><w:rsid w:val="00144410"/><w:rPr><w:b/><w:bCs/><w:i/><w:iCs/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="IntenseQuote"><w:name w:val="Intense Quote"/><w:basedOn w:val="Normal"/><w:next w:val="Normal"/><w:link w:val="IntenseQuoteChar"/><w:uiPriority w:val="30"/><w:qFormat/><w:rsid w:val="00144410"/><w:pPr><w:spacing w:before="100" w:beforeAutospacing="1" w:after="240"/><w:ind w:left="720"/><w:jc w:val="center"/></w:pPr><w:rPr><w:rFonts w:asciiTheme="majorHAnsi" w:eastAsiaTheme="majorEastAsia" w:hAnsiTheme="majorHAnsi" w:cstheme="majorBidi"/><w:color w:val="44546A" w:themeColor="text2"/><w:spacing w:val="-6"/><w:sz w:val="32"/><w:szCs w:val="32"/></w:rPr></w:style><w:style w:type="character" w:customStyle="1" w:styleId="IntenseQuoteChar"><w:name w:val="Intense Quote Char"/><w:basedOn w:val="DefaultParagraphFont"/><w:link w:val="IntenseQuote"/><w:uiPriority w:val="30"/><w:rsid w:val="00144410"/><w:rPr><w:rFonts w:asciiTheme="majorHAnsi" w:eastAsiaTheme="majorEastAsia" w:hAnsiTheme="majorHAnsi" w:cstheme="majorBidi"/><w:color w:val="44546A" w:themeColor="text2"/><w:spacing w:val="-6"/><w:sz w:val="32"/><w:szCs w:val="32"/></w:rPr></w:style><w:style w:type="character" w:styleId="IntenseReference"><w:name w:val="Intense Reference"/><w:basedOn w:val="DefaultParagraphFont"/><w:uiPriority w:val="32"/><w:qFormat/><w:rsid w:val="00144410"/><w:rPr><w:b/><w:bCs/><w:smallCaps/><w:color w:val="44546A" w:themeColor="text2"/><w:u w:val="single"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Caption"><w:name w:val="caption"/><w:basedOn w:val="Normal"/><w:next w:val="Normal"/><w:uiPriority w:val="35"/><w:semiHidden/><w:unhideWhenUsed/><w:qFormat/><w:rsid w:val="00144410"/><w:rPr><w:b/><w:bCs/><w:smallCaps/><w:color w:val="44546A" w:themeColor="text2"/></w:rPr></w:style><w:style w:type="character" w:styleId="Strong"><w:name w:val="Strong"/><w:basedOn w:val="DefaultParagraphFont"/><w:uiPriority w:val="22"/><w:qFormat/><w:rsid w:val="00144410"/><w:rPr><w:b/><w:bCs/></w:rPr></w:style><w:style w:type="character" w:styleId="Emphasis"><w:name w:val="Emphasis"/><w:basedOn w:val="DefaultParagraphFont"/><w:uiPriority w:val="20"/><w:qFormat/><w:rsid w:val="00144410"/><w:rPr><w:i/><w:iCs/></w:rPr></w:style><w:style w:type="character" w:styleId="SubtleEmphasis"><w:name w:val="Subtle Emphasis"/><w:basedOn w:val="DefaultParagraphFont"/><w:uiPriority w:val="19"/><w:qFormat/><w:rsid w:val="00144410"/><w:rPr><w:i/><w:iCs/><w:color w:val="595959" w:themeColor="text1" w:themeTint="A6"/></w:rPr></w:style><w:style w:type="character" w:styleId="SubtleReference"><w:name w:val="Subtle Reference"/><w:basedOn w:val="DefaultParagraphFont"/><w:uiPriority w:val="31"/><w:qFormat/><w:rsid w:val="00144410"/><w:rPr><w:smallCaps/><w:color w:val="595959" w:themeColor="text1" w:themeTint="A6"/><w:u w:val="none" w:color="7F7F7F" w:themeColor="text1" w:themeTint="80"/><w:bdr w:val="none" w:sz="0" w:space="0" w:color="auto"/></w:rPr></w:style><w:style w:type="character" w:styleId="BookTitle"><w:name w:val="Book Title"/><w:basedOn w:val="DefaultParagraphFont"/><w:uiPriority w:val="33"/><w:qFormat/><w:rsid w:val="00144410"/><w:rPr><w:b/><w:bCs/><w:smallCaps/><w:spacing w:val="10"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TOCHeading"><w:name w:val="TOC Heading"/><w:basedOn w:val="Heading1"/><w:next w:val="Normal"/><w:uiPriority w:val="39"/><w:semiHidden/><w:unhideWhenUsed/><w:qFormat/><w:rsid w:val="00144410"/><w:pPr><w:outlineLvl w:val="9"/></w:pPr></w:style><w:style w:type="numbering" w:customStyle="1" w:styleId="CurrentList1"><w:name w:val="Current List1"/><w:uiPriority w:val="99"/><w:rsid w:val="00144410"/><w:pPr><w:numPr><w:numId w:val="1"/></w:numPr></w:pPr></w:style><w:style w:type="character" w:styleId="Hyperlink"><w:name w:val="Hyperlink"/><w:basedOn w:val="DefaultParagraphFont"/><w:uiPriority w:val="99"/><w:unhideWhenUsed/><w:rsid w:val="00144410"/><w:rPr><w:color w:val="000000" w:themeColor="text1"/><w:u w:val="none"/></w:rPr></w:style><w:style w:type="character" w:styleId="UnresolvedMention"><w:name w:val="Unresolved Mention"/><w:basedOn w:val="DefaultParagraphFont"/><w:uiPriority w:val="99"/><w:semiHidden/><w:unhideWhenUsed/><w:rsid w:val="00144410"/><w:rPr><w:color w:val="605E5C"/><w:shd w:val="clear" w:color="auto" w:fill="E1DFDD"/></w:rPr></w:style><w:style w:type="character" w:styleId="FollowedHyperlink"><w:name w:val="FollowedHyperlink"/><w:basedOn w:val="DefaultParagraphFont"/><w:uiPriority w:val="99"/><w:semiHidden/><w:unhideWhenUsed/><w:rsid w:val="00144410"/><w:rPr><w:color w:val="000000" w:themeColor="text1"/><w:u w:val="none"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="BodyText"><w:name w:val="Body Text"/><w:basedOn w:val="Normal"/><w:link w:val="BodyTextChar"/><w:uiPriority w:val="99"/><w:semiHidden/><w:unhideWhenUsed/><w:rsid w:val="00144410"/><w:pPr><w:spacing w:after="120"/></w:pPr></w:style><w:style w:type="character" w:customStyle="1" w:styleId="BodyTextChar"><w:name w:val="Body Text Char"/><w:basedOn w:val="DefaultParagraphFont"/><w:link w:val="BodyText"/><w:uiPriority w:val="99"/><w:semiHidden/><w:rsid w:val="00144410"/><w:rPr><w:rFonts w:ascii="Garamond" w:hAnsi="Garamond"/><w:w w:val="90"/><w:kern w:val="2"/><w:sz w:val="24"/><w:szCs w:val="24"/><w:lang w:val="en-GB" w:eastAsia="zh-CN"/><w14:ligatures w14:val="standardContextual"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Header"><w:name w:val="header"/><w:basedOn w:val="Normal"/><w:link w:val="HeaderChar"/><w:uiPriority w:val="99"/><w:unhideWhenUsed/><w:rsid w:val="00144410"/><w:pPr><w:tabs><w:tab w:val="center" w:pos="4680"/><w:tab w:val="right" w:pos="9360"/></w:tabs></w:pPr></w:style><w:style w:type="character" w:customStyle="1" w:styleId="HeaderChar"><w:name w:val="Header Char"/><w:basedOn w:val="DefaultParagraphFont"/><w:link w:val="Header"/><w:uiPriority w:val="99"/><w:rsid w:val="00144410"/><w:rPr><w:rFonts w:ascii="Garamond" w:hAnsi="Garamond"/><w:w w:val="90"/><w:kern w:val="2"/><w:sz w:val="24"/><w:szCs w:val="24"/><w:lang w:val="en-GB" w:eastAsia="zh-CN"/><w14:ligatures w14:val="standardContextual"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Footer"><w:name w:val="footer"/><w:basedOn w:val="Normal"/><w:link w:val="FooterChar"/><w:uiPriority w:val="99"/><w:unhideWhenUsed/><w:rsid w:val="00144410"/><w:pPr><w:tabs><w:tab w:val="center" w:pos="4680"/><w:tab w:val="right" w:pos="9360"/></w:tabs></w:pPr></w:style><w:style w:type="character" w:customStyle="1" w:styleId="FooterChar"><w:name w:val="Footer Char"/><w:basedOn w:val="DefaultParagraphFont"/><w:link w:val="Footer"/><w:uiPriority w:val="99"/><w:rsid w:val="00144410"/><w:rPr><w:rFonts w:ascii="Garamond" w:hAnsi="Garamond"/><w:w w:val="90"/><w:kern w:val="2"/><w:sz w:val="24"/><w:szCs w:val="24"/><w:lang w:val="en-GB" w:eastAsia="zh-CN"/><w14:ligatures w14:val="standardContextual"/></w:rPr></w:style></w:styles>
diff --git a/contents/word/webSettings.xml b/contents/word/webSettings.xml
deleted file mode 100644
index 74c1519..0000000 100644
--- a/contents/word/webSettings.xml
+++ /dev/null
@@ -1,2 +1,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<w:webSettings xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" xmlns:w14="http://schemas.microsoft.com/office/word/2010/wordml" xmlns:w15="http://schemas.microsoft.com/office/word/2012/wordml" xmlns:w16cex="http://schemas.microsoft.com/office/word/2018/wordml/cex" xmlns:w16cid="http://schemas.microsoft.com/office/word/2016/wordml/cid" xmlns:w16="http://schemas.microsoft.com/office/word/2018/wordml" xmlns:w16du="http://schemas.microsoft.com/office/word/2023/wordml/word16du" xmlns:w16sdtdh="http://schemas.microsoft.com/office/word/2020/wordml/sdtdatahash" xmlns:w16se="http://schemas.microsoft.com/office/word/2015/wordml/symex" mc:Ignorable="w14 w15 w16se w16cid w16 w16cex w16sdtdh w16du"><w:optimizeForBrowser/><w:allowPNG/></w:webSettings>
diff --git a/src.bak/Class Modules/YAML.cls b/src.bak/Class Modules/YAML.cls
new file mode 100644
index 0000000..92b84ad 100644
--- /dev/null
+++ a/src.bak/Class Modules/YAML.cls
@@ -1,0 +1,353 @@
VERSION 1.0 CLASS
BEGIN
  MultiUse = -1  'True
END
Attribute VB_Name = "YAML"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = False
Attribute VB_Exposed = False
Option Explicit

' Const yamlPath As String = "\\Mac\iCloud\Development\cv\cv.yml"

' enums

Public yamlPath As String
Public yamlSerialised As Dictionary

Private Const ID_SELF As String = "___self___"
Private Const ID_TYPE As String = "___type___"

Private Const MESSAGE_ERROR_GENERIC As String = "YAML Error in " & yamlPath
Private Const MESSAGE_MALFORMED_TYPE As String = "Malformed YAML code at " & yamlPath & " on line "
Private Const MESSAGE_MALFORMED_YAML As String = "Malformed type error - this is a problem with the internal dictionary"
Private Const MESSAGE_GETPROP_NOT_STR As String = "Your module has tried to use getProp(), which is meant for type String, on a "
Private Const MESSAGE_GETPROP_NOT_FOUND As String = "Property not found."

Private Function RemoveEmptyStrings(arr() As String) As String()
    Dim tempArray() As String
    Dim i As Integer, j As Integer: j = 0
    ReDim tempArray(LBound(arr) To UBound(arr))
    j = 0
    For i = LBound(arr) To UBound(arr)
        If Len(arr(i)) > 0 Then
            tempArray(j) = arr(i)
            j = j + 1
        End If
    Next i
    ReDim Preserve tempArray(0 To j - 1)
    RemoveEmptyStrings = tempArray
End Function


Private Function RegexMatch(inputString As String, pattern As String, Optional isGlobal As Boolean = True) As Boolean
    ' checks for regex match without instantiating 80 gazillion objects
    
    ' parameters
    ' isGlobal: whether the regex check is global
    
    Dim Regex As Object: Set Regex = CreateObject("VBScript.RegExp")
    Regex.pattern = pattern
    Regex.Global = isGlobal
    RegexMatch = Regex.Test(inputString)
End Function

Private Function RegexSplit(inputString As String, pattern As String, Optional onlyFirst As Boolean = False, Optional splitBefore As Boolean = False) As String()
    ' splits array at any pattern that matches a regex
    
    ' parameters
    ' onlyFirst: if true, only splits the first instance of the match, creating an array of length 2
    ' splitBefore: if true, preserves the actual instance of the match
    
    Dim Regex As Object: Set Regex = CreateObject("VBScript.RegExp")
    Dim matches As Object
    Dim match As Object
    Dim splitParts() As String: ReDim splitParts(0 To 0)
    Dim pos As Integer
    Dim lastPos As Integer: lastPos = 1
    Dim i As Integer: i = 0
    
    ' set regex flags
    Regex.Global = True
    Regex.IgnoreCase = False
    Regex.pattern = pattern
    
    Set matches = Regex.Execute(inputString)
    
    ' lastPos = 1
    ' i = 0
    
    For Each match In matches
        pos = match.FirstIndex + 1
        ReDim Preserve splitParts(i)
        splitParts(i) = Mid(inputString, lastPos, pos - lastPos)
        If splitBefore Then
            lastPos = pos
        Else
            lastPos = pos + Len(match.Value)
        End If
        i = i + 1
        If onlyFirst Then Exit For
    Next match
    
    If lastPos <= Len(inputString) Then
        ReDim Preserve splitParts(i)
        splitParts(i) = Mid(inputString, lastPos)
    End If
    
    ' retvrn
    RegexSplit = RemoveEmptyStrings(splitParts)
End Function

Private Function RegexSubstitute(inputString As String, pattern As String, Optional substitution As String = "")
    ' does what it says on the tin
    Dim Regex As Object: Set Regex = CreateObject("VBScript.RegExp")
    Regex.pattern = pattern
    Regex.IgnoreCase = False
    Regex.Global = True
    RegexSubstitute = Regex.Replace(inputString, substitution)
End Function

' YAML Layer Parser Pseudocode
' ====
' function GetYAMLLayerAsCollection(String fromYAML) {
'    Collection mainDictionary = New Collection();
'    if (fromYAML.containsRegex(/\n[A-Za-z]/)) {
'      // is a dictionary
'      String[] temporaryArray = fromYAML.split(/\n[A-Za-z]/);
'      for each x in temporaryArray {
'        x.splitByFirstInstanceOf(':\n');
'        x[1].replaceAllInstancesOf('
'        mainDictionary.add(x[0], x[1]);
'      }
'    } else if (fromYAML.containsRegex(/\n-/)) {
'      // if array, process the array and return it as "self"
'      String[] temporaryArray = fromYAML.splitBy('\n-');
'      for each x in temporaryArray {
'        x.removeAllInstancesOf('\n- ');
'        x.replaceAllInstancesOf('\n  ', '\n');
'        mainDictionary.add("self", temporaryArray);
'      }
'    } else if (fromYAML.startsWith('"')) {
'      mainDictionary.add("self", removeQuotes(fromYAML));
'    } else {
'      MsgBox("Processing error: neither array, dictionary, nor string");
'    }
' }


Private Function GetYAMLLayerAsDictionary(fromYAML As String) As Dictionary
    Dim mainDictionary As Dictionary: Set mainDictionary = New Dictionary
    ' create regex objects to test for dict, array, and string
    
    'Dim regEx_dict As Object: Set regEx_dict = CreateObject("VBScript.RegExp")
    'Dim regEx_arry As Object: Set regEx_arry = CreateObject("VBScript.RegExp")
    'Dim regEx_strn As Object: Set regEx_strn = CreateObject("VBScript.RegExp")
    
    'regEx_dict.Global = True:  regEx_dict.Pattern = "\n[A-Za-z]"
    'regEx_arry.Global = True:  regEx_arry.Pattern = "\n-\s"
    'regEx_strn.Global = False: regEx_strn.Pattern = "^\s*""(.*?)""\s*$"

    
    Dim parts() As String
    
    If RegexMatch(fromYAML, "(?:\n|\^)\w+:", True) Then
        ' is a dictionary
        parts = RegexSplit(fromYAML, "\n\w+:", False, True)
        Dim part As Variant ' not sure why it can't be as string but whatever billy gates
        Call mainDictionary.Add(typeIdentifier, "Dictionary") ' identify as dict
        For Each part In parts
            Dim keyValue() As String: keyValue = RegexSplit(CStr(part), ":\s", True)
            ' trim trailing \n from category
            If UBound(keyValue) > 0 Then
                keyValue(0) = RegexSubstitute(keyValue(0), "^\n+")
                ' trim 2 spaces off of each line if they're there
                keyValue(1) = RegexSubstitute(keyValue(1), "^\s{2}")
                keyValue(1) = RegexSubstitute(keyValue(1), "\n\s{2}", vbLf)
                Call mainDictionary.Add(keyValue(0), keyValue(1))
            End If
        Next part
    ElseIf RegexMatch(fromYAML, "^-\s", True) Then
        ' is an array
        Call mainDictionary.Add(typeIdentifier, "Array")
        parts = RegexSplit(fromYAML, "(^|\n)-\s", False)
        Dim i As Integer
        For i = LBound(parts) To UBound(parts)
            parts(i) = RegexSubstitute(parts(i), "\n\s{2}", vbLf)
        Next i
        Call mainDictionary.Add(selfIdentifier, parts)
    ElseIf RegexMatch(fromYAML, "^\s*""(.*?)""\s*$", True) Then

        ' is a string
        Call mainDictionary.Add(typeIdentifier, "String")
        Call mainDictionary.Add(selfIdentifier, RegexSubstitute(fromYAML, """", ""))
    Else
        Call mainDictionary.Add(selfIdentifier, "")
        Debug.Print _
        "Neither array, dictionary, nor string:" & _
        vbCrLf & vbCrLf & fromYAML & vbCrLf & vbCrLf & _
        "Make sure all strings are enclosed in double quotes." ', _
        'vbOKOnly, "YAML Error")
    End If
    
    Set GetYAMLLayerAsDictionary = mainDictionary
End Function

' YAML Traverser Pseudocode
' ===
'
' function TraverseYAML(String fromYAML) {
'   Dictionary mainDictionary = GetYAMLLayerAsDictionary(fromYAML);
'   if mainDictionary.___type___ = "Dictionary" {
'     for each entry in mainDictionary {
'       TraverseYAML(entry)
'     }
'     return mainDictionary;
'   } else if mainDictionary.___type___ = "Array" {
'     for each entry in mainDictionary.___self___ {
'       TraverseYAML(entry)
'     }
'     return mainDictionary;
'   } else if mainDictionary.___type___ = "String" {
'     return mainDictionary;
'   } else {
'     MsgBox("Internal YAML Error")
'   }
' }
Private Function GetYAMLAsDictionary(fromYAML As String) As Dictionary
    Dim mainDictionary As Object: Set mainDictionary = GetYAMLLayerAsDictionary(fromYAML)
    Dim entry As Variant
    If mainDictionary(typeIdentifier) = "Dictionary" Then
        For Each entry In mainDictionary
            Debug.Print "=== PROCESSING DICTIONARY ENTRY ==="
            Debug.Print entry & " => " & mainDictionary(entry)
            If entry <> typeIdentifier And entry <> selfIdentifier Then
                Set mainDictionary(entry) = GetYAMLAsDictionary(mainDictionary(entry))
            End If
        Next entry
    ElseIf mainDictionary(typeIdentifier) = "Array" Then
        Dim i As Integer
        Dim subArray() As Object
        For i = LBound(mainDictionary(selfIdentifier)) To UBound(mainDictionary(selfIdentifier))
            Debug.Print "=== PROCESSING ARRAY ENTRY ==="
            Debug.Print mainDictionary(selfIdentifier)(i)
            'Set subDictionary = GetYAMLAsDictionary(mainDictionary(selfIdentifier)(i))
            'Set mainDictionary(selfIdentifier)(i) = subDictionary
            ReDim Preserve subArray(i)
            Set subArray(i) = GetYAMLAsDictionary(CStr(mainDictionary(selfIdentifier)(i)))
        Next i
        
        mainDictionary(selfIdentifier) = subArray
    ElseIf mainDictionary(typeIdentifier) <> "String" Then
        Debug.Print malformedTypeError ', vbOKOnly, errIdentifier)
    End If
    Set GetYAMLAsDictionary = mainDictionary
End Function

' YAML Cleaner Pseudocode
' =====
' function YAMLCleaner(Dictionary mainDictionary) {
'   for each entry in mainDictionary {
'     if entry(typeIdentifier) == "Dictionary" {
'       for each secondOrderEntry in entry {
'         YAMLCleaner(secondOrderEntry)
'       }
'     } else if entry(typeIdentifier) == "Array" {
'       for each secondOrderEntry in entry(selfIdentifier) {
'         YAMLCleaner(secondOrderEntry)
'       }
'     }
'     if entry(typeIdentifier) != "Dictionary" {
'       mainDictionary(entry) = mainDictionary(entry)(selfIdentifier)
'     }
'   }
'   return mainDictionary;
' }

'Function YAMLCleaner(mainDictionary As Dictionary) As Dictionary
'    Dim entry As Variant
'    If mainDictionary(typeIdentifier) = "Array" Then ' go through array and yamlclean it
'        Dim i As Integer
'        Debug.Print JsonConverter.ConvertToJson(mainDictionary)
'        For i = LBound(mainDictionary(selfIdentifier)) To UBound(mainDictionary(selfIdentifier))
'
'            'If IsObject(mainDictionary(selfIdentifier)(i)) Then
'                'Set mainDictionary(selfIdentifier)(i) = YAMLCleaner(mainDictionary(selfIdentifier)(i))
'            'Else
'            '    Debug.Print "encountered non-object"
'            'End If
'        Next i
'    End If
'    If mainDictionary(typeIdentifier) = "Dictionary" Then 'iterate through dict and yamlclena it
'        For Each entry In mainDictionary
'            If entry <> typeIdentifier Then
'                Set mainDictionary(entry) = YAMLCleaner(mainDictionary(entry))
'            End If
'        Next entry
'    End If
'
'    For Each entry In mainDictionary
'        If mainDictionary(typeIdentifier) = "Dictionary" And mainDictionary(entry)(typeIdentifier) <> "Dictionary" And entry <> typeIdentifier And entry <> selfIdentifier Then
'            Debug.Print "processing " & entry & " which is " & mainDictionary(entry)(typeIdentifier)
'            If IsObject(mainDictionary(entry)(selfIdentifier)) Then
'                Set mainDictionary(entry) = mainDictionary(entry)(selfIdentifier)
'            Else
'                mainDictionary(entry) = mainDictionary(entry)(selfIdentifier)
'            End If
'        End If
'    Next entry
'
'    ' destroy type identifier?
'    Set YAMLCleaner = mainDictionary
'End Function

Private Function GetFileAsString(filePath As String) As String
    ' Dim fileContent As String
    Dim line As String
    Dim fileNumber As Integer
    
    'filePath = "\\Mac\iCloud\Development\cv\cv.yml"
    
    fileNumber = FreeFile()
    
    Open filePath For Input As fileNumber
    
    Do While Not EOF(fileNumber)
        Line Input #fileNumber, line
        GetFileAsString = GetFileAsString & line & vbCrLf
    Loop
End Function

Public Property Let path(thePath As String)
    yamlPath = thePath
End Property

Public Property Get path() As String
    path = yamlPath
End Property

Public Property Get props() As Dictionary
    Set props = GetYAMLAsDictionary(GetFileAsString(yamlPath))
End Property

' YAML Indexer Pseudocode [implement later]
' =====
' function index(string theIndex) {
'   Variant[] mainArray = theIndex.split(".");
'   Dictionary mainDictionary = yamlProps;
'   for each entry in mainArray {
'     if entry is {
'
'     ....


'Public Sub TryFunction()
'    Dim fileString As String: fileString = GetFileAsString("\\Mac\iCloud\Development\cv\cv.yml")
'    Dim yamlLayer As Object
'    Set yamlLayer = GetYAMLLayerAsDictionary(fileString)
'    Dim yamlWholeDict As Object: Set yamlWholeDict = GetYAMLAsDictionary(fileString)
'    'Debug.Print JsonConverter.ConvertToJson(yamlWholeDict, 2, 2)
'    Dim yamlCleanDict As Object: Set yamlCleanDict = YAMLCleaner(yamlWholeDict)
'    Debug.Print JsonConverter.ConvertToJson(yamlCleanDict, 2, 2)
'End Sub


diff --git a/src.bak/Modules/NewMacros.bas b/src.bak/Modules/NewMacros.bas
new file mode 100644
index 0000000..96f47ca 100644
--- /dev/null
+++ a/src.bak/Modules/NewMacros.bas
@@ -1,0 +1,58 @@
Attribute VB_Name = "NewMacros"
Option Explicit

Sub Macro1()
Attribute Macro1.VB_ProcData.VB_Invoke_Func = "Normal.NewMacros.Macro1"
'
' Macro1 Macro
'
'
    Selection.Style = ActiveDocument.Styles("Title")
    Selection.TypeText Text:="This is a title"
    Selection.TypeParagraph
    Selection.TypeParagraph
    Selection.Style = ActiveDocument.Styles("Heading 1")
    Selection.TypeText Text:="Heading 1"
    Selection.TypeParagraph
    Selection.Style = ActiveDocument.Styles("No Spacing")
    Selection.TypeText Text:="Whatababab"
    Selection.TypeParagraph
    With ListGalleries(wdBulletGallery).ListTemplates(1).ListLevels(1)
        .NumberFormat = ChrW(61623)
        .TrailingCharacter = wdTrailingTab
        .NumberStyle = wdListNumberStyleBullet
        .NumberPosition = InchesToPoints(0.25)
        .Alignment = wdListLevelAlignLeft
        .TextPosition = InchesToPoints(0.5)
        .TabPosition = wdUndefined
        .ResetOnHigher = 0
        .StartAt = 1
        With .Font
            .Bold = wdUndefined
            .Italic = wdUndefined
            .StrikeThrough = wdUndefined
            .Subscript = wdUndefined
            .Superscript = wdUndefined
            .Shadow = wdUndefined
            .Outline = wdUndefined
            .Emboss = wdUndefined
            .Engrave = wdUndefined
            .AllCaps = wdUndefined
            .Hidden = wdUndefined
            .Underline = wdUndefined
            .Color = wdUndefined
            .Size = wdUndefined
            .Animation = wdUndefined
            .DoubleStrikeThrough = wdUndefined
            .Name = "Symbol"
        End With
        .LinkedStyle = ""
    End With
    ListGalleries(wdBulletGallery).ListTemplates(1).Name = ""
    Selection.Range.ListFormat.ApplyListTemplateWithLevel ListTemplate:= _
        ListGalleries(wdBulletGallery).ListTemplates(1), ContinuePreviousList:= _
        False, ApplyTo:=wdListApplyToWholeList, DefaultListBehavior:= _
        wdWord10ListBehavior
    Selection.TypeText Text:="This is a bulletted list created manually"
    Selection.EscapeKey
End Sub
diff --git a/src.bak/Modules/YAMLParser_old.bas b/src.bak/Modules/YAMLParser_old.bas
new file mode 100644
index 0000000..cfcd417 100644
--- /dev/null
+++ a/src.bak/Modules/YAMLParser_old.bas
@@ -1,0 +1,313 @@
Attribute VB_Name = "YAMLParser_old"
Option Explicit

Const yamlPath As String = "\\Mac\iCloud\Development\cv\cv.yml"

Const selfIdentifier As String = "___self___"
Const typeIdentifier As String = "___type___"
Const errIdentifier As String = "YAML Error in " & yamlPath

Const malformedTypeError As String = "Malformed YAML code at " & yamlPath & " on line "
Const malformedYAMLError As String = "Malformed type error - this is a problem with the internal dictionary"

Function RemoveEmptyStrings(arr() As String) As String()
    Dim tempArray() As String
    Dim i As Integer, j As Integer: j = 0
    ReDim tempArray(LBound(arr) To UBound(arr))
    j = 0
    For i = LBound(arr) To UBound(arr)
        If Len(arr(i)) > 0 Then
            tempArray(j) = arr(i)
            j = j + 1
        End If
    Next i
    ReDim Preserve tempArray(0 To j - 1)
    RemoveEmptyStrings = tempArray
End Function


Function RegexMatch(inputString As String, pattern As String, Optional isGlobal As Boolean = True) As Boolean
    ' checks for regex match without instantiating 80 gazillion objects
    
    ' parameters
    ' isGlobal: whether the regex check is global
    
    Dim Regex As Object: Set Regex = CreateObject("VBScript.RegExp")
    Regex.pattern = pattern
    Regex.Global = isGlobal
    RegexMatch = Regex.Test(inputString)
End Function

Function RegexSplit(inputString As String, pattern As String, Optional onlyFirst As Boolean = False, Optional splitBefore As Boolean = False) As String()
    ' splits array at any pattern that matches a regex
    
    ' parameters
    ' onlyFirst: if true, only splits the first instance of the match, creating an array of length 2
    ' splitBefore: if true, preserves the actual instance of the match
    
    Dim Regex As Object: Set Regex = CreateObject("VBScript.RegExp")
    Dim matches As Object
    Dim match As Object
    Dim splitParts() As String: ReDim splitParts(0 To 0)
    Dim pos As Integer
    Dim lastPos As Integer: lastPos = 1
    Dim i As Integer: i = 0
    
    ' set regex flags
    Regex.Global = True
    Regex.IgnoreCase = False
    Regex.pattern = pattern
    
    Set matches = Regex.Execute(inputString)
    
    ' lastPos = 1
    ' i = 0
    
    For Each match In matches
        pos = match.FirstIndex + 1
        ReDim Preserve splitParts(i)
        splitParts(i) = Mid(inputString, lastPos, pos - lastPos)
        If splitBefore Then
            lastPos = pos
        Else
            lastPos = pos + Len(match.Value)
        End If
        i = i + 1
        If onlyFirst Then Exit For
    Next match
    
    If lastPos <= Len(inputString) Then
        ReDim Preserve splitParts(i)
        splitParts(i) = Mid(inputString, lastPos)
    End If
    
    ' retvrn
    RegexSplit = RemoveEmptyStrings(splitParts)
End Function

Function RegexSubstitute(inputString As String, pattern As String, Optional substitution As String = "")
    ' does what it says on the tin
    Dim Regex As Object: Set Regex = CreateObject("VBScript.RegExp")
    Regex.pattern = pattern
    Regex.IgnoreCase = False
    Regex.Global = True
    RegexSubstitute = Regex.Replace(inputString, substitution)
End Function

' YAML Layer Parser Pseudocode
' ====
' function GetYAMLLayerAsCollection(String fromYAML) {
'    Collection mainDictionary = New Collection();
'    if (fromYAML.containsRegex(/\n[A-Za-z]/)) {
'      // is a dictionary
'      String[] temporaryArray = fromYAML.split(/\n[A-Za-z]/);
'      for each x in temporaryArray {
'        x.splitByFirstInstanceOf(':\n');
'        x[1].replaceAllInstancesOf('
'        mainDictionary.add(x[0], x[1]);
'      }
'    } else if (fromYAML.containsRegex(/\n-/)) {
'      // if array, process the array and return it as "self"
'      String[] temporaryArray = fromYAML.splitBy('\n-');
'      for each x in temporaryArray {
'        x.removeAllInstancesOf('\n- ');
'        x.replaceAllInstancesOf('\n  ', '\n');
'        mainDictionary.add("self", temporaryArray);
'      }
'    } else if (fromYAML.startsWith('"')) {
'      mainDictionary.add("self", removeQuotes(fromYAML));
'    } else {
'      MsgBox("Processing error: neither array, dictionary, nor string");
'    }
' }


Function GetYAMLLayerAsDictionary(fromYAML As String) As Dictionary
    Dim mainDictionary As Dictionary: Set mainDictionary = New Dictionary
    ' create regex objects to test for dict, array, and string
    
    'Dim regEx_dict As Object: Set regEx_dict = CreateObject("VBScript.RegExp")
    'Dim regEx_arry As Object: Set regEx_arry = CreateObject("VBScript.RegExp")
    'Dim regEx_strn As Object: Set regEx_strn = CreateObject("VBScript.RegExp")
    
    'regEx_dict.Global = True:  regEx_dict.Pattern = "\n[A-Za-z]"
    'regEx_arry.Global = True:  regEx_arry.Pattern = "\n-\s"
    'regEx_strn.Global = False: regEx_strn.Pattern = "^\s*""(.*?)""\s*$"
    
    Dim parts() As String
    
    If RegexMatch(fromYAML, "(?:\n|\^)\w+:", True) Then
        ' is a dictionary
        parts = RegexSplit(fromYAML, "\n\w+:", False, True)
        Dim part As Variant ' not sure why it can't be as string but whatever billy gates
        Call mainDictionary.Add(typeIdentifier, "Dictionary") ' identify as dict
        For Each part In parts
            Dim keyValue() As String: keyValue = RegexSplit(CStr(part), ":\s", True)
            ' trim trailing \n from category
            If UBound(keyValue) > 0 Then
                keyValue(0) = RegexSubstitute(keyValue(0), "^\n+")
                ' trim 2 spaces off of each line if they're there
                keyValue(1) = RegexSubstitute(keyValue(1), "^\s{2}")
                keyValue(1) = RegexSubstitute(keyValue(1), "\n\s{2}", vbLf)
                Call mainDictionary.Add(keyValue(0), keyValue(1))
            End If
        Next part
    ElseIf RegexMatch(fromYAML, "^-\s", True) Then
        ' is an array
        Call mainDictionary.Add(typeIdentifier, "Array")
        parts = RegexSplit(fromYAML, "(^|\n)-\s", False)
        Dim i As Integer
        For i = LBound(parts) To UBound(parts)
            parts(i) = RegexSubstitute(parts(i), "\n\s{2}", vbLf)
        Next i
        Call mainDictionary.Add(selfIdentifier, parts)
    ElseIf RegexMatch(fromYAML, "^\s*""(.*?)""\s*$", True) Then
        ' is a string
        Call mainDictionary.Add(typeIdentifier, "String")
        Call mainDictionary.Add(selfIdentifier, RegexSubstitute(fromYAML, """", ""))
    Else
        Call mainDictionary.Add(selfIdentifier, "")
        Debug.Print _
        "Neither array, dictionary, nor string:" & _
        vbCrLf & vbCrLf & fromYAML & vbCrLf & vbCrLf & _
        "Make sure all strings are enclosed in double quotes." ', _
        'vbOKOnly, "YAML Error")
    End If
    
    Set GetYAMLLayerAsDictionary = mainDictionary
End Function

' YAML Traverser Pseudocode
' ===
'
' function TraverseYAML(String fromYAML) {
'   Dictionary mainDictionary = GetYAMLLayerAsDictionary(fromYAML);
'   if mainDictionary.___type___ = "Dictionary" {
'     for each entry in mainDictionary {
'       TraverseYAML(entry)
'     }
'     return mainDictionary;
'   } else if mainDictionary.___type___ = "Array" {
'     for each entry in mainDictionary.___self___ {
'       TraverseYAML(entry)
'     }
'     return mainDictionary;
'   } else if mainDictionary.___type___ = "String" {
'     return mainDictionary;
'   } else {
'     MsgBox("Internal YAML Error")
'   }
' }
Function GetYAMLAsDictionary(fromYAML As String) As Dictionary
    Dim mainDictionary As Object: Set mainDictionary = GetYAMLLayerAsDictionary(fromYAML)
    Dim entry As Variant
    If mainDictionary(typeIdentifier) = "Dictionary" Then
        For Each entry In mainDictionary
            Debug.Print "=== PROCESSING DICTIONARY ENTRY ==="
            Debug.Print entry & " => " & mainDictionary(entry)
            If entry <> typeIdentifier And entry <> selfIdentifier Then
                Set mainDictionary(entry) = GetYAMLAsDictionary(mainDictionary(entry))
            End If
        Next entry
    ElseIf mainDictionary(typeIdentifier) = "Array" Then
        Dim i As Integer
        Dim subArray() As Object
        For i = LBound(mainDictionary(selfIdentifier)) To UBound(mainDictionary(selfIdentifier))
            Debug.Print "=== PROCESSING ARRAY ENTRY ==="
            Debug.Print mainDictionary(selfIdentifier)(i)
            'Set subDictionary = GetYAMLAsDictionary(mainDictionary(selfIdentifier)(i))
            'Set mainDictionary(selfIdentifier)(i) = subDictionary
            ReDim Preserve subArray(i)
            Set subArray(i) = GetYAMLAsDictionary(CStr(mainDictionary(selfIdentifier)(i)))
        Next i
        
        mainDictionary(selfIdentifier) = subArray
    ElseIf mainDictionary(typeIdentifier) <> "String" Then
        Debug.Print malformedTypeError ', vbOKOnly, errIdentifier)
    End If
    Set GetYAMLAsDictionary = mainDictionary
End Function

' YAML Cleaner Pseudocode
' =====
' function YAMLCleaner(Dictionary mainDictionary) {
'   for each entry in mainDictionary {
'     if entry(typeIdentifier) == "Dictionary" {
'       for each secondOrderEntry in entry {
'         YAMLCleaner(secondOrderEntry)
'       }
'     } else if entry(typeIdentifier) == "Array" {
'       for each secondOrderEntry in entry(selfIdentifier) {
'         YAMLCleaner(secondOrderEntry)
'       }
'     }
'     if entry(typeIdentifier) != "Dictionary" {
'       mainDictionary(entry) = mainDictionary(entry)(selfIdentifier)
'     }
'   }
'   return mainDictionary;
' }

Function YAMLCleaner(mainDictionary As Dictionary) As Dictionary
    Dim entry As Variant
    If mainDictionary(typeIdentifier) = "Array" Then ' go through array and yamlclean it
        Dim i As Integer
        Debug.Print JsonConverter.ConvertToJson(mainDictionary)
        For i = LBound(mainDictionary(selfIdentifier)) To UBound(mainDictionary(selfIdentifier))
            
            'If IsObject(mainDictionary(selfIdentifier)(i)) Then
                'Set mainDictionary(selfIdentifier)(i) = YAMLCleaner(mainDictionary(selfIdentifier)(i))
            'Else
            '    Debug.Print "encountered non-object"
            'End If
        Next i
    End If
    If mainDictionary(typeIdentifier) = "Dictionary" Then 'iterate through dict and yamlclena it
        For Each entry In mainDictionary
            If entry <> typeIdentifier Then
                Set mainDictionary(entry) = YAMLCleaner(mainDictionary(entry))
            End If
        Next entry
    End If
    
    For Each entry In mainDictionary
        If mainDictionary(typeIdentifier) = "Dictionary" And mainDictionary(entry)(typeIdentifier) <> "Dictionary" And entry <> typeIdentifier And entry <> selfIdentifier Then
            Debug.Print "processing " & entry & " which is " & mainDictionary(entry)(typeIdentifier)
            If IsObject(mainDictionary(entry)(selfIdentifier)) Then
                Set mainDictionary(entry) = mainDictionary(entry)(selfIdentifier)
            Else
                mainDictionary(entry) = mainDictionary(entry)(selfIdentifier)
            End If
        End If
    Next entry

    ' destroy type identifier?
    Set YAMLCleaner = mainDictionary
End Function

Function GetFileAsString(filePath As String) As String
    ' Dim fileContent As String
    Dim line As String
    Dim fileNumber As Integer
    
    'filePath = "\\Mac\iCloud\Development\cv\cv.yml"
    
    fileNumber = FreeFile()
    
    Open filePath For Input As fileNumber
    
    Do While Not EOF(fileNumber)
        Line Input #fileNumber, line
        GetFileAsString = GetFileAsString & line & vbCrLf
    Loop
End Function

Sub TryFunction()
    Dim fileString As String: fileString = GetFileAsString("\\Mac\iCloud\Development\cv\cv.yml")
    Dim yamlLayer As Object
    Set yamlLayer = GetYAMLLayerAsDictionary(fileString)
    Dim yamlWholeDict As Object: Set yamlWholeDict = GetYAMLAsDictionary(fileString)
    'Debug.Print JsonConverter.ConvertToJson(yamlWholeDict, 2, 2)
    Dim yamlCleanDict As Object: Set yamlCleanDict = YAMLCleaner(yamlWholeDict)
    Debug.Print JsonConverter.ConvertToJson(yamlCleanDict, 2, 2)
End Sub
diff --git a/src/Class Modules/YAML.cls b/src/Class Modules/YAML.cls
deleted file mode 100644
index 92b84ad..0000000 100644
--- a/src/Class Modules/YAML.cls
+++ /dev/null
@@ -1,353 +1,0 @@
VERSION 1.0 CLASS
BEGIN
  MultiUse = -1  'True
END
Attribute VB_Name = "YAML"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = False
Attribute VB_Exposed = False
Option Explicit

' Const yamlPath As String = "\\Mac\iCloud\Development\cv\cv.yml"

' enums

Public yamlPath As String
Public yamlSerialised As Dictionary

Private Const ID_SELF As String = "___self___"
Private Const ID_TYPE As String = "___type___"

Private Const MESSAGE_ERROR_GENERIC As String = "YAML Error in " & yamlPath
Private Const MESSAGE_MALFORMED_TYPE As String = "Malformed YAML code at " & yamlPath & " on line "
Private Const MESSAGE_MALFORMED_YAML As String = "Malformed type error - this is a problem with the internal dictionary"
Private Const MESSAGE_GETPROP_NOT_STR As String = "Your module has tried to use getProp(), which is meant for type String, on a "
Private Const MESSAGE_GETPROP_NOT_FOUND As String = "Property not found."

Private Function RemoveEmptyStrings(arr() As String) As String()
    Dim tempArray() As String
    Dim i As Integer, j As Integer: j = 0
    ReDim tempArray(LBound(arr) To UBound(arr))
    j = 0
    For i = LBound(arr) To UBound(arr)
        If Len(arr(i)) > 0 Then
            tempArray(j) = arr(i)
            j = j + 1
        End If
    Next i
    ReDim Preserve tempArray(0 To j - 1)
    RemoveEmptyStrings = tempArray
End Function


Private Function RegexMatch(inputString As String, pattern As String, Optional isGlobal As Boolean = True) As Boolean
    ' checks for regex match without instantiating 80 gazillion objects
    
    ' parameters
    ' isGlobal: whether the regex check is global
    
    Dim Regex As Object: Set Regex = CreateObject("VBScript.RegExp")
    Regex.pattern = pattern
    Regex.Global = isGlobal
    RegexMatch = Regex.Test(inputString)
End Function

Private Function RegexSplit(inputString As String, pattern As String, Optional onlyFirst As Boolean = False, Optional splitBefore As Boolean = False) As String()
    ' splits array at any pattern that matches a regex
    
    ' parameters
    ' onlyFirst: if true, only splits the first instance of the match, creating an array of length 2
    ' splitBefore: if true, preserves the actual instance of the match
    
    Dim Regex As Object: Set Regex = CreateObject("VBScript.RegExp")
    Dim matches As Object
    Dim match As Object
    Dim splitParts() As String: ReDim splitParts(0 To 0)
    Dim pos As Integer
    Dim lastPos As Integer: lastPos = 1
    Dim i As Integer: i = 0
    
    ' set regex flags
    Regex.Global = True
    Regex.IgnoreCase = False
    Regex.pattern = pattern
    
    Set matches = Regex.Execute(inputString)
    
    ' lastPos = 1
    ' i = 0
    
    For Each match In matches
        pos = match.FirstIndex + 1
        ReDim Preserve splitParts(i)
        splitParts(i) = Mid(inputString, lastPos, pos - lastPos)
        If splitBefore Then
            lastPos = pos
        Else
            lastPos = pos + Len(match.Value)
        End If
        i = i + 1
        If onlyFirst Then Exit For
    Next match
    
    If lastPos <= Len(inputString) Then
        ReDim Preserve splitParts(i)
        splitParts(i) = Mid(inputString, lastPos)
    End If
    
    ' retvrn
    RegexSplit = RemoveEmptyStrings(splitParts)
End Function

Private Function RegexSubstitute(inputString As String, pattern As String, Optional substitution As String = "")
    ' does what it says on the tin
    Dim Regex As Object: Set Regex = CreateObject("VBScript.RegExp")
    Regex.pattern = pattern
    Regex.IgnoreCase = False
    Regex.Global = True
    RegexSubstitute = Regex.Replace(inputString, substitution)
End Function

' YAML Layer Parser Pseudocode
' ====
' function GetYAMLLayerAsCollection(String fromYAML) {
'    Collection mainDictionary = New Collection();
'    if (fromYAML.containsRegex(/\n[A-Za-z]/)) {
'      // is a dictionary
'      String[] temporaryArray = fromYAML.split(/\n[A-Za-z]/);
'      for each x in temporaryArray {
'        x.splitByFirstInstanceOf(':\n');
'        x[1].replaceAllInstancesOf('
'        mainDictionary.add(x[0], x[1]);
'      }
'    } else if (fromYAML.containsRegex(/\n-/)) {
'      // if array, process the array and return it as "self"
'      String[] temporaryArray = fromYAML.splitBy('\n-');
'      for each x in temporaryArray {
'        x.removeAllInstancesOf('\n- ');
'        x.replaceAllInstancesOf('\n  ', '\n');
'        mainDictionary.add("self", temporaryArray);
'      }
'    } else if (fromYAML.startsWith('"')) {
'      mainDictionary.add("self", removeQuotes(fromYAML));
'    } else {
'      MsgBox("Processing error: neither array, dictionary, nor string");
'    }
' }


Private Function GetYAMLLayerAsDictionary(fromYAML As String) As Dictionary
    Dim mainDictionary As Dictionary: Set mainDictionary = New Dictionary
    ' create regex objects to test for dict, array, and string
    
    'Dim regEx_dict As Object: Set regEx_dict = CreateObject("VBScript.RegExp")
    'Dim regEx_arry As Object: Set regEx_arry = CreateObject("VBScript.RegExp")
    'Dim regEx_strn As Object: Set regEx_strn = CreateObject("VBScript.RegExp")
    
    'regEx_dict.Global = True:  regEx_dict.Pattern = "\n[A-Za-z]"
    'regEx_arry.Global = True:  regEx_arry.Pattern = "\n-\s"
    'regEx_strn.Global = False: regEx_strn.Pattern = "^\s*""(.*?)""\s*$"

    
    Dim parts() As String
    
    If RegexMatch(fromYAML, "(?:\n|\^)\w+:", True) Then
        ' is a dictionary
        parts = RegexSplit(fromYAML, "\n\w+:", False, True)
        Dim part As Variant ' not sure why it can't be as string but whatever billy gates
        Call mainDictionary.Add(typeIdentifier, "Dictionary") ' identify as dict
        For Each part In parts
            Dim keyValue() As String: keyValue = RegexSplit(CStr(part), ":\s", True)
            ' trim trailing \n from category
            If UBound(keyValue) > 0 Then
                keyValue(0) = RegexSubstitute(keyValue(0), "^\n+")
                ' trim 2 spaces off of each line if they're there
                keyValue(1) = RegexSubstitute(keyValue(1), "^\s{2}")
                keyValue(1) = RegexSubstitute(keyValue(1), "\n\s{2}", vbLf)
                Call mainDictionary.Add(keyValue(0), keyValue(1))
            End If
        Next part
    ElseIf RegexMatch(fromYAML, "^-\s", True) Then
        ' is an array
        Call mainDictionary.Add(typeIdentifier, "Array")
        parts = RegexSplit(fromYAML, "(^|\n)-\s", False)
        Dim i As Integer
        For i = LBound(parts) To UBound(parts)
            parts(i) = RegexSubstitute(parts(i), "\n\s{2}", vbLf)
        Next i
        Call mainDictionary.Add(selfIdentifier, parts)
    ElseIf RegexMatch(fromYAML, "^\s*""(.*?)""\s*$", True) Then

        ' is a string
        Call mainDictionary.Add(typeIdentifier, "String")
        Call mainDictionary.Add(selfIdentifier, RegexSubstitute(fromYAML, """", ""))
    Else
        Call mainDictionary.Add(selfIdentifier, "")
        Debug.Print _
        "Neither array, dictionary, nor string:" & _
        vbCrLf & vbCrLf & fromYAML & vbCrLf & vbCrLf & _
        "Make sure all strings are enclosed in double quotes." ', _
        'vbOKOnly, "YAML Error")
    End If
    
    Set GetYAMLLayerAsDictionary = mainDictionary
End Function

' YAML Traverser Pseudocode
' ===
'
' function TraverseYAML(String fromYAML) {
'   Dictionary mainDictionary = GetYAMLLayerAsDictionary(fromYAML);
'   if mainDictionary.___type___ = "Dictionary" {
'     for each entry in mainDictionary {
'       TraverseYAML(entry)
'     }
'     return mainDictionary;
'   } else if mainDictionary.___type___ = "Array" {
'     for each entry in mainDictionary.___self___ {
'       TraverseYAML(entry)
'     }
'     return mainDictionary;
'   } else if mainDictionary.___type___ = "String" {
'     return mainDictionary;
'   } else {
'     MsgBox("Internal YAML Error")
'   }
' }
Private Function GetYAMLAsDictionary(fromYAML As String) As Dictionary
    Dim mainDictionary As Object: Set mainDictionary = GetYAMLLayerAsDictionary(fromYAML)
    Dim entry As Variant
    If mainDictionary(typeIdentifier) = "Dictionary" Then
        For Each entry In mainDictionary
            Debug.Print "=== PROCESSING DICTIONARY ENTRY ==="
            Debug.Print entry & " => " & mainDictionary(entry)
            If entry <> typeIdentifier And entry <> selfIdentifier Then
                Set mainDictionary(entry) = GetYAMLAsDictionary(mainDictionary(entry))
            End If
        Next entry
    ElseIf mainDictionary(typeIdentifier) = "Array" Then
        Dim i As Integer
        Dim subArray() As Object
        For i = LBound(mainDictionary(selfIdentifier)) To UBound(mainDictionary(selfIdentifier))
            Debug.Print "=== PROCESSING ARRAY ENTRY ==="
            Debug.Print mainDictionary(selfIdentifier)(i)
            'Set subDictionary = GetYAMLAsDictionary(mainDictionary(selfIdentifier)(i))
            'Set mainDictionary(selfIdentifier)(i) = subDictionary
            ReDim Preserve subArray(i)
            Set subArray(i) = GetYAMLAsDictionary(CStr(mainDictionary(selfIdentifier)(i)))
        Next i
        
        mainDictionary(selfIdentifier) = subArray
    ElseIf mainDictionary(typeIdentifier) <> "String" Then
        Debug.Print malformedTypeError ', vbOKOnly, errIdentifier)
    End If
    Set GetYAMLAsDictionary = mainDictionary
End Function

' YAML Cleaner Pseudocode
' =====
' function YAMLCleaner(Dictionary mainDictionary) {
'   for each entry in mainDictionary {
'     if entry(typeIdentifier) == "Dictionary" {
'       for each secondOrderEntry in entry {
'         YAMLCleaner(secondOrderEntry)
'       }
'     } else if entry(typeIdentifier) == "Array" {
'       for each secondOrderEntry in entry(selfIdentifier) {
'         YAMLCleaner(secondOrderEntry)
'       }
'     }
'     if entry(typeIdentifier) != "Dictionary" {
'       mainDictionary(entry) = mainDictionary(entry)(selfIdentifier)
'     }
'   }
'   return mainDictionary;
' }

'Function YAMLCleaner(mainDictionary As Dictionary) As Dictionary
'    Dim entry As Variant
'    If mainDictionary(typeIdentifier) = "Array" Then ' go through array and yamlclean it
'        Dim i As Integer
'        Debug.Print JsonConverter.ConvertToJson(mainDictionary)
'        For i = LBound(mainDictionary(selfIdentifier)) To UBound(mainDictionary(selfIdentifier))
'
'            'If IsObject(mainDictionary(selfIdentifier)(i)) Then
'                'Set mainDictionary(selfIdentifier)(i) = YAMLCleaner(mainDictionary(selfIdentifier)(i))
'            'Else
'            '    Debug.Print "encountered non-object"
'            'End If
'        Next i
'    End If
'    If mainDictionary(typeIdentifier) = "Dictionary" Then 'iterate through dict and yamlclena it
'        For Each entry In mainDictionary
'            If entry <> typeIdentifier Then
'                Set mainDictionary(entry) = YAMLCleaner(mainDictionary(entry))
'            End If
'        Next entry
'    End If
'
'    For Each entry In mainDictionary
'        If mainDictionary(typeIdentifier) = "Dictionary" And mainDictionary(entry)(typeIdentifier) <> "Dictionary" And entry <> typeIdentifier And entry <> selfIdentifier Then
'            Debug.Print "processing " & entry & " which is " & mainDictionary(entry)(typeIdentifier)
'            If IsObject(mainDictionary(entry)(selfIdentifier)) Then
'                Set mainDictionary(entry) = mainDictionary(entry)(selfIdentifier)
'            Else
'                mainDictionary(entry) = mainDictionary(entry)(selfIdentifier)
'            End If
'        End If
'    Next entry
'
'    ' destroy type identifier?
'    Set YAMLCleaner = mainDictionary
'End Function

Private Function GetFileAsString(filePath As String) As String
    ' Dim fileContent As String
    Dim line As String
    Dim fileNumber As Integer
    
    'filePath = "\\Mac\iCloud\Development\cv\cv.yml"
    
    fileNumber = FreeFile()
    
    Open filePath For Input As fileNumber
    
    Do While Not EOF(fileNumber)
        Line Input #fileNumber, line
        GetFileAsString = GetFileAsString & line & vbCrLf
    Loop
End Function

Public Property Let path(thePath As String)
    yamlPath = thePath
End Property

Public Property Get path() As String
    path = yamlPath
End Property

Public Property Get props() As Dictionary
    Set props = GetYAMLAsDictionary(GetFileAsString(yamlPath))
End Property

' YAML Indexer Pseudocode [implement later]
' =====
' function index(string theIndex) {
'   Variant[] mainArray = theIndex.split(".");
'   Dictionary mainDictionary = yamlProps;
'   for each entry in mainArray {
'     if entry is {
'
'     ....


'Public Sub TryFunction()
'    Dim fileString As String: fileString = GetFileAsString("\\Mac\iCloud\Development\cv\cv.yml")
'    Dim yamlLayer As Object
'    Set yamlLayer = GetYAMLLayerAsDictionary(fileString)
'    Dim yamlWholeDict As Object: Set yamlWholeDict = GetYAMLAsDictionary(fileString)
'    'Debug.Print JsonConverter.ConvertToJson(yamlWholeDict, 2, 2)
'    Dim yamlCleanDict As Object: Set yamlCleanDict = YAMLCleaner(yamlWholeDict)
'    Debug.Print JsonConverter.ConvertToJson(yamlCleanDict, 2, 2)
'End Sub


diff --git a/src/Modules/NewMacros.bas b/src/Modules/NewMacros.bas
deleted file mode 100644
index 96f47ca..0000000 100644
--- a/src/Modules/NewMacros.bas
+++ /dev/null
@@ -1,58 +1,0 @@
Attribute VB_Name = "NewMacros"
Option Explicit

Sub Macro1()
Attribute Macro1.VB_ProcData.VB_Invoke_Func = "Normal.NewMacros.Macro1"
'
' Macro1 Macro
'
'
    Selection.Style = ActiveDocument.Styles("Title")
    Selection.TypeText Text:="This is a title"
    Selection.TypeParagraph
    Selection.TypeParagraph
    Selection.Style = ActiveDocument.Styles("Heading 1")
    Selection.TypeText Text:="Heading 1"
    Selection.TypeParagraph
    Selection.Style = ActiveDocument.Styles("No Spacing")
    Selection.TypeText Text:="Whatababab"
    Selection.TypeParagraph
    With ListGalleries(wdBulletGallery).ListTemplates(1).ListLevels(1)
        .NumberFormat = ChrW(61623)
        .TrailingCharacter = wdTrailingTab
        .NumberStyle = wdListNumberStyleBullet
        .NumberPosition = InchesToPoints(0.25)
        .Alignment = wdListLevelAlignLeft
        .TextPosition = InchesToPoints(0.5)
        .TabPosition = wdUndefined
        .ResetOnHigher = 0
        .StartAt = 1
        With .Font
            .Bold = wdUndefined
            .Italic = wdUndefined
            .StrikeThrough = wdUndefined
            .Subscript = wdUndefined
            .Superscript = wdUndefined
            .Shadow = wdUndefined
            .Outline = wdUndefined
            .Emboss = wdUndefined
            .Engrave = wdUndefined
            .AllCaps = wdUndefined
            .Hidden = wdUndefined
            .Underline = wdUndefined
            .Color = wdUndefined
            .Size = wdUndefined
            .Animation = wdUndefined
            .DoubleStrikeThrough = wdUndefined
            .Name = "Symbol"
        End With
        .LinkedStyle = ""
    End With
    ListGalleries(wdBulletGallery).ListTemplates(1).Name = ""
    Selection.Range.ListFormat.ApplyListTemplateWithLevel ListTemplate:= _
        ListGalleries(wdBulletGallery).ListTemplates(1), ContinuePreviousList:= _
        False, ApplyTo:=wdListApplyToWholeList, DefaultListBehavior:= _
        wdWord10ListBehavior
    Selection.TypeText Text:="This is a bulletted list created manually"
    Selection.EscapeKey
End Sub
diff --git a/src/Modules/YAMLParser_old.bas b/src/Modules/YAMLParser_old.bas
deleted file mode 100644
index cfcd417..0000000 100644
--- a/src/Modules/YAMLParser_old.bas
+++ /dev/null
@@ -1,313 +1,0 @@
Attribute VB_Name = "YAMLParser_old"
Option Explicit

Const yamlPath As String = "\\Mac\iCloud\Development\cv\cv.yml"

Const selfIdentifier As String = "___self___"
Const typeIdentifier As String = "___type___"
Const errIdentifier As String = "YAML Error in " & yamlPath

Const malformedTypeError As String = "Malformed YAML code at " & yamlPath & " on line "
Const malformedYAMLError As String = "Malformed type error - this is a problem with the internal dictionary"

Function RemoveEmptyStrings(arr() As String) As String()
    Dim tempArray() As String
    Dim i As Integer, j As Integer: j = 0
    ReDim tempArray(LBound(arr) To UBound(arr))
    j = 0
    For i = LBound(arr) To UBound(arr)
        If Len(arr(i)) > 0 Then
            tempArray(j) = arr(i)
            j = j + 1
        End If
    Next i
    ReDim Preserve tempArray(0 To j - 1)
    RemoveEmptyStrings = tempArray
End Function


Function RegexMatch(inputString As String, pattern As String, Optional isGlobal As Boolean = True) As Boolean
    ' checks for regex match without instantiating 80 gazillion objects
    
    ' parameters
    ' isGlobal: whether the regex check is global
    
    Dim Regex As Object: Set Regex = CreateObject("VBScript.RegExp")
    Regex.pattern = pattern
    Regex.Global = isGlobal
    RegexMatch = Regex.Test(inputString)
End Function

Function RegexSplit(inputString As String, pattern As String, Optional onlyFirst As Boolean = False, Optional splitBefore As Boolean = False) As String()
    ' splits array at any pattern that matches a regex
    
    ' parameters
    ' onlyFirst: if true, only splits the first instance of the match, creating an array of length 2
    ' splitBefore: if true, preserves the actual instance of the match
    
    Dim Regex As Object: Set Regex = CreateObject("VBScript.RegExp")
    Dim matches As Object
    Dim match As Object
    Dim splitParts() As String: ReDim splitParts(0 To 0)
    Dim pos As Integer
    Dim lastPos As Integer: lastPos = 1
    Dim i As Integer: i = 0
    
    ' set regex flags
    Regex.Global = True
    Regex.IgnoreCase = False
    Regex.pattern = pattern
    
    Set matches = Regex.Execute(inputString)
    
    ' lastPos = 1
    ' i = 0
    
    For Each match In matches
        pos = match.FirstIndex + 1
        ReDim Preserve splitParts(i)
        splitParts(i) = Mid(inputString, lastPos, pos - lastPos)
        If splitBefore Then
            lastPos = pos
        Else
            lastPos = pos + Len(match.Value)
        End If
        i = i + 1
        If onlyFirst Then Exit For
    Next match
    
    If lastPos <= Len(inputString) Then
        ReDim Preserve splitParts(i)
        splitParts(i) = Mid(inputString, lastPos)
    End If
    
    ' retvrn
    RegexSplit = RemoveEmptyStrings(splitParts)
End Function

Function RegexSubstitute(inputString As String, pattern As String, Optional substitution As String = "")
    ' does what it says on the tin
    Dim Regex As Object: Set Regex = CreateObject("VBScript.RegExp")
    Regex.pattern = pattern
    Regex.IgnoreCase = False
    Regex.Global = True
    RegexSubstitute = Regex.Replace(inputString, substitution)
End Function

' YAML Layer Parser Pseudocode
' ====
' function GetYAMLLayerAsCollection(String fromYAML) {
'    Collection mainDictionary = New Collection();
'    if (fromYAML.containsRegex(/\n[A-Za-z]/)) {
'      // is a dictionary
'      String[] temporaryArray = fromYAML.split(/\n[A-Za-z]/);
'      for each x in temporaryArray {
'        x.splitByFirstInstanceOf(':\n');
'        x[1].replaceAllInstancesOf('
'        mainDictionary.add(x[0], x[1]);
'      }
'    } else if (fromYAML.containsRegex(/\n-/)) {
'      // if array, process the array and return it as "self"
'      String[] temporaryArray = fromYAML.splitBy('\n-');
'      for each x in temporaryArray {
'        x.removeAllInstancesOf('\n- ');
'        x.replaceAllInstancesOf('\n  ', '\n');
'        mainDictionary.add("self", temporaryArray);
'      }
'    } else if (fromYAML.startsWith('"')) {
'      mainDictionary.add("self", removeQuotes(fromYAML));
'    } else {
'      MsgBox("Processing error: neither array, dictionary, nor string");
'    }
' }


Function GetYAMLLayerAsDictionary(fromYAML As String) As Dictionary
    Dim mainDictionary As Dictionary: Set mainDictionary = New Dictionary
    ' create regex objects to test for dict, array, and string
    
    'Dim regEx_dict As Object: Set regEx_dict = CreateObject("VBScript.RegExp")
    'Dim regEx_arry As Object: Set regEx_arry = CreateObject("VBScript.RegExp")
    'Dim regEx_strn As Object: Set regEx_strn = CreateObject("VBScript.RegExp")
    
    'regEx_dict.Global = True:  regEx_dict.Pattern = "\n[A-Za-z]"
    'regEx_arry.Global = True:  regEx_arry.Pattern = "\n-\s"
    'regEx_strn.Global = False: regEx_strn.Pattern = "^\s*""(.*?)""\s*$"
    
    Dim parts() As String
    
    If RegexMatch(fromYAML, "(?:\n|\^)\w+:", True) Then
        ' is a dictionary
        parts = RegexSplit(fromYAML, "\n\w+:", False, True)
        Dim part As Variant ' not sure why it can't be as string but whatever billy gates
        Call mainDictionary.Add(typeIdentifier, "Dictionary") ' identify as dict
        For Each part In parts
            Dim keyValue() As String: keyValue = RegexSplit(CStr(part), ":\s", True)
            ' trim trailing \n from category
            If UBound(keyValue) > 0 Then
                keyValue(0) = RegexSubstitute(keyValue(0), "^\n+")
                ' trim 2 spaces off of each line if they're there
                keyValue(1) = RegexSubstitute(keyValue(1), "^\s{2}")
                keyValue(1) = RegexSubstitute(keyValue(1), "\n\s{2}", vbLf)
                Call mainDictionary.Add(keyValue(0), keyValue(1))
            End If
        Next part
    ElseIf RegexMatch(fromYAML, "^-\s", True) Then
        ' is an array
        Call mainDictionary.Add(typeIdentifier, "Array")
        parts = RegexSplit(fromYAML, "(^|\n)-\s", False)
        Dim i As Integer
        For i = LBound(parts) To UBound(parts)
            parts(i) = RegexSubstitute(parts(i), "\n\s{2}", vbLf)
        Next i
        Call mainDictionary.Add(selfIdentifier, parts)
    ElseIf RegexMatch(fromYAML, "^\s*""(.*?)""\s*$", True) Then
        ' is a string
        Call mainDictionary.Add(typeIdentifier, "String")
        Call mainDictionary.Add(selfIdentifier, RegexSubstitute(fromYAML, """", ""))
    Else
        Call mainDictionary.Add(selfIdentifier, "")
        Debug.Print _
        "Neither array, dictionary, nor string:" & _
        vbCrLf & vbCrLf & fromYAML & vbCrLf & vbCrLf & _
        "Make sure all strings are enclosed in double quotes." ', _
        'vbOKOnly, "YAML Error")
    End If
    
    Set GetYAMLLayerAsDictionary = mainDictionary
End Function

' YAML Traverser Pseudocode
' ===
'
' function TraverseYAML(String fromYAML) {
'   Dictionary mainDictionary = GetYAMLLayerAsDictionary(fromYAML);
'   if mainDictionary.___type___ = "Dictionary" {
'     for each entry in mainDictionary {
'       TraverseYAML(entry)
'     }
'     return mainDictionary;
'   } else if mainDictionary.___type___ = "Array" {
'     for each entry in mainDictionary.___self___ {
'       TraverseYAML(entry)
'     }
'     return mainDictionary;
'   } else if mainDictionary.___type___ = "String" {
'     return mainDictionary;
'   } else {
'     MsgBox("Internal YAML Error")
'   }
' }
Function GetYAMLAsDictionary(fromYAML As String) As Dictionary
    Dim mainDictionary As Object: Set mainDictionary = GetYAMLLayerAsDictionary(fromYAML)
    Dim entry As Variant
    If mainDictionary(typeIdentifier) = "Dictionary" Then
        For Each entry In mainDictionary
            Debug.Print "=== PROCESSING DICTIONARY ENTRY ==="
            Debug.Print entry & " => " & mainDictionary(entry)
            If entry <> typeIdentifier And entry <> selfIdentifier Then
                Set mainDictionary(entry) = GetYAMLAsDictionary(mainDictionary(entry))
            End If
        Next entry
    ElseIf mainDictionary(typeIdentifier) = "Array" Then
        Dim i As Integer
        Dim subArray() As Object
        For i = LBound(mainDictionary(selfIdentifier)) To UBound(mainDictionary(selfIdentifier))
            Debug.Print "=== PROCESSING ARRAY ENTRY ==="
            Debug.Print mainDictionary(selfIdentifier)(i)
            'Set subDictionary = GetYAMLAsDictionary(mainDictionary(selfIdentifier)(i))
            'Set mainDictionary(selfIdentifier)(i) = subDictionary
            ReDim Preserve subArray(i)
            Set subArray(i) = GetYAMLAsDictionary(CStr(mainDictionary(selfIdentifier)(i)))
        Next i
        
        mainDictionary(selfIdentifier) = subArray
    ElseIf mainDictionary(typeIdentifier) <> "String" Then
        Debug.Print malformedTypeError ', vbOKOnly, errIdentifier)
    End If
    Set GetYAMLAsDictionary = mainDictionary
End Function

' YAML Cleaner Pseudocode
' =====
' function YAMLCleaner(Dictionary mainDictionary) {
'   for each entry in mainDictionary {
'     if entry(typeIdentifier) == "Dictionary" {
'       for each secondOrderEntry in entry {
'         YAMLCleaner(secondOrderEntry)
'       }
'     } else if entry(typeIdentifier) == "Array" {
'       for each secondOrderEntry in entry(selfIdentifier) {
'         YAMLCleaner(secondOrderEntry)
'       }
'     }
'     if entry(typeIdentifier) != "Dictionary" {
'       mainDictionary(entry) = mainDictionary(entry)(selfIdentifier)
'     }
'   }
'   return mainDictionary;
' }

Function YAMLCleaner(mainDictionary As Dictionary) As Dictionary
    Dim entry As Variant
    If mainDictionary(typeIdentifier) = "Array" Then ' go through array and yamlclean it
        Dim i As Integer
        Debug.Print JsonConverter.ConvertToJson(mainDictionary)
        For i = LBound(mainDictionary(selfIdentifier)) To UBound(mainDictionary(selfIdentifier))
            
            'If IsObject(mainDictionary(selfIdentifier)(i)) Then
                'Set mainDictionary(selfIdentifier)(i) = YAMLCleaner(mainDictionary(selfIdentifier)(i))
            'Else
            '    Debug.Print "encountered non-object"
            'End If
        Next i
    End If
    If mainDictionary(typeIdentifier) = "Dictionary" Then 'iterate through dict and yamlclena it
        For Each entry In mainDictionary
            If entry <> typeIdentifier Then
                Set mainDictionary(entry) = YAMLCleaner(mainDictionary(entry))
            End If
        Next entry
    End If
    
    For Each entry In mainDictionary
        If mainDictionary(typeIdentifier) = "Dictionary" And mainDictionary(entry)(typeIdentifier) <> "Dictionary" And entry <> typeIdentifier And entry <> selfIdentifier Then
            Debug.Print "processing " & entry & " which is " & mainDictionary(entry)(typeIdentifier)
            If IsObject(mainDictionary(entry)(selfIdentifier)) Then
                Set mainDictionary(entry) = mainDictionary(entry)(selfIdentifier)
            Else
                mainDictionary(entry) = mainDictionary(entry)(selfIdentifier)
            End If
        End If
    Next entry

    ' destroy type identifier?
    Set YAMLCleaner = mainDictionary
End Function

Function GetFileAsString(filePath As String) As String
    ' Dim fileContent As String
    Dim line As String
    Dim fileNumber As Integer
    
    'filePath = "\\Mac\iCloud\Development\cv\cv.yml"
    
    fileNumber = FreeFile()
    
    Open filePath For Input As fileNumber
    
    Do While Not EOF(fileNumber)
        Line Input #fileNumber, line
        GetFileAsString = GetFileAsString & line & vbCrLf
    Loop
End Function

Sub TryFunction()
    Dim fileString As String: fileString = GetFileAsString("\\Mac\iCloud\Development\cv\cv.yml")
    Dim yamlLayer As Object
    Set yamlLayer = GetYAMLLayerAsDictionary(fileString)
    Dim yamlWholeDict As Object: Set yamlWholeDict = GetYAMLAsDictionary(fileString)
    'Debug.Print JsonConverter.ConvertToJson(yamlWholeDict, 2, 2)
    Dim yamlCleanDict As Object: Set yamlCleanDict = YAMLCleaner(yamlWholeDict)
    Debug.Print JsonConverter.ConvertToJson(yamlCleanDict, 2, 2)
End Sub
diff --git a/contents/customXml/_rels/item1.xml.rels b/contents/customXml/_rels/item1.xml.rels
deleted file mode 100644
index a9c831d..0000000 100644
--- a/contents/customXml/_rels/item1.xml.rels
+++ /dev/null
@@ -1,2 +1,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships"><Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/customXmlProps" Target="itemProps1.xml"/></Relationships>
diff --git a/contents/word/_rels/document.xml.rels b/contents/word/_rels/document.xml.rels
deleted file mode 100644
index 94cfc8a..0000000 100644
--- a/contents/word/_rels/document.xml.rels
+++ /dev/null
@@ -1,2 +1,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships"><Relationship Id="rId3" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles" Target="styles.xml"/><Relationship Id="rId7" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme" Target="theme/theme1.xml"/><Relationship Id="rId2" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/numbering" Target="numbering.xml"/><Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/customXml" Target="../customXml/item1.xml"/><Relationship Id="rId6" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/fontTable" Target="fontTable.xml"/><Relationship Id="rId5" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/webSettings" Target="webSettings.xml"/><Relationship Id="rId4" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/settings" Target="settings.xml"/></Relationships>
diff --git a/contents/word/_rels/numbering.xml.rels b/contents/word/_rels/numbering.xml.rels
deleted file mode 100644
index 7a29daa..0000000 100644
--- a/contents/word/_rels/numbering.xml.rels
+++ /dev/null
@@ -1,2 +1,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships"><Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/image" Target="media/image1.png"/></Relationships>
diff --git a/contents/word/_rels/settings.xml.rels b/contents/word/_rels/settings.xml.rels
deleted file mode 100644
index 9c2cfc4..0000000 100644
--- a/contents/word/_rels/settings.xml.rels
+++ /dev/null
@@ -1,2 +1,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships"><Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/attachedTemplate" Target="file:///\\Mac\iCloud\Development\cv\cv.dotx" TargetMode="External"/></Relationships>
diff --git a/contents/word/media/image1.png b/contents/word/media/image1.png
deleted file mode 100644
index f49c18fe5782b85bac4c8e90e8a1e481d1ed87ac..0000000000000000000000000000000000000000 100644
Binary files a/contents/word/media/image1.png and /dev/null differdiff --git a/contents/word/theme/theme1.xml b/contents/word/theme/theme1.xml
deleted file mode 100644
index 60a57c2..0000000 100644
--- a/contents/word/theme/theme1.xml
+++ /dev/null
@@ -1,2 +1,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<a:theme xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" name="Office 2013 - 2022 Theme"><a:themeElements><a:clrScheme name="Office 2013 - 2022"><a:dk1><a:sysClr val="windowText" lastClr="000000"/></a:dk1><a:lt1><a:sysClr val="window" lastClr="FFFFFF"/></a:lt1><a:dk2><a:srgbClr val="44546A"/></a:dk2><a:lt2><a:srgbClr val="E7E6E6"/></a:lt2><a:accent1><a:srgbClr val="4472C4"/></a:accent1><a:accent2><a:srgbClr val="ED7D31"/></a:accent2><a:accent3><a:srgbClr val="A5A5A5"/></a:accent3><a:accent4><a:srgbClr val="FFC000"/></a:accent4><a:accent5><a:srgbClr val="5B9BD5"/></a:accent5><a:accent6><a:srgbClr val="70AD47"/></a:accent6><a:hlink><a:srgbClr val="0563C1"/></a:hlink><a:folHlink><a:srgbClr val="954F72"/></a:folHlink></a:clrScheme><a:fontScheme name="Office 2013 - 2022"><a:majorFont><a:latin typeface="Calibri Light" panose="020F0302020204030204"/><a:ea typeface=""/><a:cs typeface=""/><a:font script="Jpan" typeface="游ゴシック Light"/><a:font script="Hang" typeface="맑은 고딕"/><a:font script="Hans" typeface="等线 Light"/><a:font script="Hant" typeface="新細明體"/><a:font script="Arab" typeface="Times New Roman"/><a:font script="Hebr" typeface="Times New Roman"/><a:font script="Thai" typeface="Angsana New"/><a:font script="Ethi" typeface="Nyala"/><a:font script="Beng" typeface="Vrinda"/><a:font script="Gujr" typeface="Shruti"/><a:font script="Khmr" typeface="MoolBoran"/><a:font script="Knda" typeface="Tunga"/><a:font script="Guru" typeface="Raavi"/><a:font script="Cans" typeface="Euphemia"/><a:font script="Cher" typeface="Plantagenet Cherokee"/><a:font script="Yiii" typeface="Microsoft Yi Baiti"/><a:font script="Tibt" typeface="Microsoft Himalaya"/><a:font script="Thaa" typeface="MV Boli"/><a:font script="Deva" typeface="Mangal"/><a:font script="Telu" typeface="Gautami"/><a:font script="Taml" typeface="Latha"/><a:font script="Syrc" typeface="Estrangelo Edessa"/><a:font script="Orya" typeface="Kalinga"/><a:font script="Mlym" typeface="Kartika"/><a:font script="Laoo" typeface="DokChampa"/><a:font script="Sinh" typeface="Iskoola Pota"/><a:font script="Mong" typeface="Mongolian Baiti"/><a:font script="Viet" typeface="Times New Roman"/><a:font script="Uigh" typeface="Microsoft Uighur"/><a:font script="Geor" typeface="Sylfaen"/><a:font script="Armn" typeface="Arial"/><a:font script="Bugi" typeface="Leelawadee UI"/><a:font script="Bopo" typeface="Microsoft JhengHei"/><a:font script="Java" typeface="Javanese Text"/><a:font script="Lisu" typeface="Segoe UI"/><a:font script="Mymr" typeface="Myanmar Text"/><a:font script="Nkoo" typeface="Ebrima"/><a:font script="Olck" typeface="Nirmala UI"/><a:font script="Osma" typeface="Ebrima"/><a:font script="Phag" typeface="Phagspa"/><a:font script="Syrn" typeface="Estrangelo Edessa"/><a:font script="Syrj" typeface="Estrangelo Edessa"/><a:font script="Syre" typeface="Estrangelo Edessa"/><a:font script="Sora" typeface="Nirmala UI"/><a:font script="Tale" typeface="Microsoft Tai Le"/><a:font script="Talu" typeface="Microsoft New Tai Lue"/><a:font script="Tfng" typeface="Ebrima"/></a:majorFont><a:minorFont><a:latin typeface="Calibri" panose="020F0502020204030204"/><a:ea typeface=""/><a:cs typeface=""/><a:font script="Jpan" typeface="游明朝"/><a:font script="Hang" typeface="맑은 고딕"/><a:font script="Hans" typeface="等线"/><a:font script="Hant" typeface="新細明體"/><a:font script="Arab" typeface="Arial"/><a:font script="Hebr" typeface="Arial"/><a:font script="Thai" typeface="Cordia New"/><a:font script="Ethi" typeface="Nyala"/><a:font script="Beng" typeface="Vrinda"/><a:font script="Gujr" typeface="Shruti"/><a:font script="Khmr" typeface="DaunPenh"/><a:font script="Knda" typeface="Tunga"/><a:font script="Guru" typeface="Raavi"/><a:font script="Cans" typeface="Euphemia"/><a:font script="Cher" typeface="Plantagenet Cherokee"/><a:font script="Yiii" typeface="Microsoft Yi Baiti"/><a:font script="Tibt" typeface="Microsoft Himalaya"/><a:font script="Thaa" typeface="MV Boli"/><a:font script="Deva" typeface="Mangal"/><a:font script="Telu" typeface="Gautami"/><a:font script="Taml" typeface="Latha"/><a:font script="Syrc" typeface="Estrangelo Edessa"/><a:font script="Orya" typeface="Kalinga"/><a:font script="Mlym" typeface="Kartika"/><a:font script="Laoo" typeface="DokChampa"/><a:font script="Sinh" typeface="Iskoola Pota"/><a:font script="Mong" typeface="Mongolian Baiti"/><a:font script="Viet" typeface="Arial"/><a:font script="Uigh" typeface="Microsoft Uighur"/><a:font script="Geor" typeface="Sylfaen"/><a:font script="Armn" typeface="Arial"/><a:font script="Bugi" typeface="Leelawadee UI"/><a:font script="Bopo" typeface="Microsoft JhengHei"/><a:font script="Java" typeface="Javanese Text"/><a:font script="Lisu" typeface="Segoe UI"/><a:font script="Mymr" typeface="Myanmar Text"/><a:font script="Nkoo" typeface="Ebrima"/><a:font script="Olck" typeface="Nirmala UI"/><a:font script="Osma" typeface="Ebrima"/><a:font script="Phag" typeface="Phagspa"/><a:font script="Syrn" typeface="Estrangelo Edessa"/><a:font script="Syrj" typeface="Estrangelo Edessa"/><a:font script="Syre" typeface="Estrangelo Edessa"/><a:font script="Sora" typeface="Nirmala UI"/><a:font script="Tale" typeface="Microsoft Tai Le"/><a:font script="Talu" typeface="Microsoft New Tai Lue"/><a:font script="Tfng" typeface="Ebrima"/></a:minorFont></a:fontScheme><a:fmtScheme name="Office 2013 - 2022"><a:fillStyleLst><a:solidFill><a:schemeClr val="phClr"/></a:solidFill><a:gradFill rotWithShape="1"><a:gsLst><a:gs pos="0"><a:schemeClr val="phClr"><a:lumMod val="110000"/><a:satMod val="105000"/><a:tint val="67000"/></a:schemeClr></a:gs><a:gs pos="50000"><a:schemeClr val="phClr"><a:lumMod val="105000"/><a:satMod val="103000"/><a:tint val="73000"/></a:schemeClr></a:gs><a:gs pos="100000"><a:schemeClr val="phClr"><a:lumMod val="105000"/><a:satMod val="109000"/><a:tint val="81000"/></a:schemeClr></a:gs></a:gsLst><a:lin ang="5400000" scaled="0"/></a:gradFill><a:gradFill rotWithShape="1"><a:gsLst><a:gs pos="0"><a:schemeClr val="phClr"><a:satMod val="103000"/><a:lumMod val="102000"/><a:tint val="94000"/></a:schemeClr></a:gs><a:gs pos="50000"><a:schemeClr val="phClr"><a:satMod val="110000"/><a:lumMod val="100000"/><a:shade val="100000"/></a:schemeClr></a:gs><a:gs pos="100000"><a:schemeClr val="phClr"><a:lumMod val="99000"/><a:satMod val="120000"/><a:shade val="78000"/></a:schemeClr></a:gs></a:gsLst><a:lin ang="5400000" scaled="0"/></a:gradFill></a:fillStyleLst><a:lnStyleLst><a:ln w="6350" cap="flat" cmpd="sng" algn="ctr"><a:solidFill><a:schemeClr val="phClr"/></a:solidFill><a:prstDash val="solid"/><a:miter lim="800000"/></a:ln><a:ln w="12700" cap="flat" cmpd="sng" algn="ctr"><a:solidFill><a:schemeClr val="phClr"/></a:solidFill><a:prstDash val="solid"/><a:miter lim="800000"/></a:ln><a:ln w="19050" cap="flat" cmpd="sng" algn="ctr"><a:solidFill><a:schemeClr val="phClr"/></a:solidFill><a:prstDash val="solid"/><a:miter lim="800000"/></a:ln></a:lnStyleLst><a:effectStyleLst><a:effectStyle><a:effectLst/></a:effectStyle><a:effectStyle><a:effectLst/></a:effectStyle><a:effectStyle><a:effectLst><a:outerShdw blurRad="57150" dist="19050" dir="5400000" algn="ctr" rotWithShape="0"><a:srgbClr val="000000"><a:alpha val="63000"/></a:srgbClr></a:outerShdw></a:effectLst></a:effectStyle></a:effectStyleLst><a:bgFillStyleLst><a:solidFill><a:schemeClr val="phClr"/></a:solidFill><a:solidFill><a:schemeClr val="phClr"><a:tint val="95000"/><a:satMod val="170000"/></a:schemeClr></a:solidFill><a:gradFill rotWithShape="1"><a:gsLst><a:gs pos="0"><a:schemeClr val="phClr"><a:tint val="93000"/><a:satMod val="150000"/><a:shade val="98000"/><a:lumMod val="102000"/></a:schemeClr></a:gs><a:gs pos="50000"><a:schemeClr val="phClr"><a:tint val="98000"/><a:satMod val="130000"/><a:shade val="90000"/><a:lumMod val="103000"/></a:schemeClr></a:gs><a:gs pos="100000"><a:schemeClr val="phClr"><a:shade val="63000"/><a:satMod val="120000"/></a:schemeClr></a:gs></a:gsLst><a:lin ang="5400000" scaled="0"/></a:gradFill></a:bgFillStyleLst></a:fmtScheme></a:themeElements><a:objectDefaults/><a:extraClrSchemeLst/><a:extLst><a:ext uri="{05A4C25C-085E-4340-85A3-A5531E510DB2}"><thm15:themeFamily xmlns:thm15="http://schemas.microsoft.com/office/thememl/2012/main" name="Office 2013 - 2022 Theme" id="{62F939B6-93AF-4DB8-9C6B-D6C7DFDC589F}" vid="{4A3C46E8-61CC-4603-A589-7422A47A8E4A}"/></a:ext></a:extLst></a:theme>