From 312c85ae30a00f8370a9ce61bc22b0e6840fa737 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sat, 27 Jul 2024 23:28:14 +0300 Subject: [PATCH] docs: Update documentation --- bin/docs/assets/v0.63.6/app-dist/share.js | 23 + .../libraries/ckeditor/ckeditor-content.css | 551 ++++++++++++++++++ .../v0.63.6/libraries/normalize.min.css | 2 + bin/docs/assets/v0.63.6/stylesheets/share.css | 165 ++++++ docs/3jc1nUXyteo0.html | 457 +++++++++++++++ docs/4yYHqKbLovVX.html | 391 ++++++++++++- docs/B8hxg4e66cVL.html | 486 +++++++++++++++ docs/BhE2WFknKKHG.html | 457 +++++++++++++++ docs/C09Dou56ffMe.html | 457 +++++++++++++++ docs/GMta9hBHsXHQ.html | 457 +++++++++++++++ docs/KRC2O84LekPz.html | 457 +++++++++++++++ docs/PHqgH8FCfcod.html | 455 +++++++++++++++ docs/QXCi6Y1SYulw.html | 370 +++++++++++- docs/U5RtMeGPeZ29.html | 466 +++++++++++++++ docs/UTB518X6X9Uh.html | 461 +++++++++++++++ docs/VS22Hq5PBFNf.html | 373 +++++++++++- docs/X4N03xLYEWnN.html | 462 +++++++++++++++ docs/XxqZW6JjkW2g.html | 457 +++++++++++++++ docs/Z9N9OKBXXLFW.html | 457 +++++++++++++++ docs/ZlxZh8NH5frM.html | 486 +++++++++++++++ .../attachments/27Z989bSFWAc/image/image.png | Bin 0 -> 62104 bytes .../attachments/XEUUvzBxh89z/image/image.png | Bin 0 -> 8646 bytes docs/biDJ9KgbWLgt.html | 457 +++++++++++++++ docs/btM6L9JtG301.html | 457 +++++++++++++++ docs/d3dnvVOhur16.html | 457 +++++++++++++++ docs/hkrBX8KE1HQl.html | 396 ++++++++++++- docs/jvdjFBOCCrOa.html | 457 +++++++++++++++ docs/mPGbEmYGitWe.html | 457 +++++++++++++++ docs/oXLcQUniOWvl.html | 466 +++++++++++++++ docs/rU1hxvgqlA9x.html | 466 +++++++++++++++ docs/s5gsYTbPQr6c.html | 483 +++++++++++++++ docs/xtBYDVZPb0gr.html | 466 +++++++++++++++ 32 files changed, 12386 insertions(+), 66 deletions(-) create mode 100644 bin/docs/assets/v0.63.6/app-dist/share.js create mode 100644 bin/docs/assets/v0.63.6/libraries/ckeditor/ckeditor-content.css create mode 100644 bin/docs/assets/v0.63.6/libraries/normalize.min.css create mode 100644 bin/docs/assets/v0.63.6/stylesheets/share.css create mode 100644 docs/3jc1nUXyteo0.html create mode 100644 docs/B8hxg4e66cVL.html create mode 100644 docs/BhE2WFknKKHG.html create mode 100644 docs/C09Dou56ffMe.html create mode 100644 docs/GMta9hBHsXHQ.html create mode 100644 docs/KRC2O84LekPz.html create mode 100644 docs/PHqgH8FCfcod.html create mode 100644 docs/U5RtMeGPeZ29.html create mode 100644 docs/UTB518X6X9Uh.html create mode 100644 docs/X4N03xLYEWnN.html create mode 100644 docs/XxqZW6JjkW2g.html create mode 100644 docs/Z9N9OKBXXLFW.html create mode 100644 docs/ZlxZh8NH5frM.html create mode 100644 docs/api/attachments/27Z989bSFWAc/image/image.png create mode 100644 docs/api/attachments/XEUUvzBxh89z/image/image.png create mode 100644 docs/biDJ9KgbWLgt.html create mode 100644 docs/btM6L9JtG301.html create mode 100644 docs/d3dnvVOhur16.html create mode 100644 docs/jvdjFBOCCrOa.html create mode 100644 docs/mPGbEmYGitWe.html create mode 100644 docs/oXLcQUniOWvl.html create mode 100644 docs/rU1hxvgqlA9x.html create mode 100644 docs/s5gsYTbPQr6c.html create mode 100644 docs/xtBYDVZPb0gr.html diff --git a/bin/docs/assets/v0.63.6/app-dist/share.js b/bin/docs/assets/v0.63.6/app-dist/share.js new file mode 100644 index 000000000..03ad92515 --- /dev/null +++ b/bin/docs/assets/v0.63.6/app-dist/share.js @@ -0,0 +1,23 @@ +/** + * Fetch note with given ID from backend + * + * @param noteId of the given note to be fetched. If false, fetches current note. + */ +async function fetchNote(noteId = null) { + if (!noteId) { + noteId = document.body.getAttribute("data-note-id"); + } + + const resp = await fetch(`api/notes/${noteId}`); + + return await resp.json(); +} + +document.addEventListener('DOMContentLoaded', () => { + const toggleMenuButton = document.getElementById('toggleMenuButton'); + const layout = document.getElementById('layout'); + + if (toggleMenuButton && layout) { + toggleMenuButton.addEventListener('click', () => layout.classList.toggle('showMenu')); + } +}, false); diff --git a/bin/docs/assets/v0.63.6/libraries/ckeditor/ckeditor-content.css b/bin/docs/assets/v0.63.6/libraries/ckeditor/ckeditor-content.css new file mode 100644 index 000000000..47274e5f4 --- /dev/null +++ b/bin/docs/assets/v0.63.6/libraries/ckeditor/ckeditor-content.css @@ -0,0 +1,551 @@ +/* !!!!!! TRILIUM CUSTOM CHANGES !!!!!! */ + +.printed-content .ck-widget__selection-handle, .printed-content .ck-widget__type-around { /* gets rid of triangles: https://github.com/zadam/trilium/issues/1129 */ + display: none; +} + +/* + * CKEditor 5 (v41.0.0) content styles. + * Generated on Fri, 26 Jan 2024 10:23:49 GMT. + * For more information, check out https://ckeditor.com/docs/ckeditor5/latest/installation/advanced/content-styles.html + */ + +:root { + --ck-color-image-caption-background: hsl(0, 0%, 97%); + --ck-color-image-caption-text: hsl(0, 0%, 20%); + --ck-color-mention-background: hsla(341, 100%, 30%, 0.1); + --ck-color-mention-text: hsl(341, 100%, 30%); + --ck-color-selector-caption-background: hsl(0, 0%, 97%); + --ck-color-selector-caption-text: hsl(0, 0%, 20%); + --ck-highlight-marker-blue: hsl(201, 97%, 72%); + --ck-highlight-marker-green: hsl(120, 93%, 68%); + --ck-highlight-marker-pink: hsl(345, 96%, 73%); + --ck-highlight-marker-yellow: hsl(60, 97%, 73%); + --ck-highlight-pen-green: hsl(112, 100%, 27%); + --ck-highlight-pen-red: hsl(0, 85%, 49%); + --ck-image-style-spacing: 1.5em; + --ck-inline-image-style-spacing: calc(var(--ck-image-style-spacing) / 2); + --ck-todo-list-checkmark-size: 16px; +} + +/* @ckeditor/ckeditor5-table/theme/tablecolumnresize.css */ +.ck-content .table .ck-table-resized { + table-layout: fixed; +} +/* @ckeditor/ckeditor5-table/theme/tablecolumnresize.css */ +.ck-content .table table { + overflow: hidden; +} +/* @ckeditor/ckeditor5-table/theme/tablecolumnresize.css */ +.ck-content .table td, +.ck-content .table th { + overflow-wrap: break-word; + position: relative; +} +/* @ckeditor/ckeditor5-table/theme/table.css */ +.ck-content .table { + margin: 0.9em auto; + display: table; +} +/* @ckeditor/ckeditor5-table/theme/table.css */ +.ck-content .table table { + border-collapse: collapse; + border-spacing: 0; + width: 100%; + height: 100%; + border: 1px double hsl(0, 0%, 70%); +} +/* @ckeditor/ckeditor5-table/theme/table.css */ +.ck-content .table table td, +.ck-content .table table th { + min-width: 2em; + padding: .4em; + border: 1px solid hsl(0, 0%, 75%); +} +/* @ckeditor/ckeditor5-table/theme/table.css */ +.ck-content .table table th { + font-weight: bold; + background: hsla(0, 0%, 0%, 5%); +} +/* @ckeditor/ckeditor5-table/theme/table.css */ +.ck-content[dir="rtl"] .table th { + text-align: right; +} +/* @ckeditor/ckeditor5-table/theme/table.css */ +.ck-content[dir="ltr"] .table th { + text-align: left; +} +/* @ckeditor/ckeditor5-table/theme/tablecaption.css */ +.ck-content .table > figcaption { + display: table-caption; + caption-side: top; + word-break: break-word; + text-align: center; + color: var(--ck-color-selector-caption-text); + background-color: var(--ck-color-selector-caption-background); + padding: .6em; + font-size: .75em; + outline-offset: -1px; +} +/* @ckeditor/ckeditor5-page-break/theme/pagebreak.css */ +.ck-content .page-break { + position: relative; + clear: both; + padding: 5px 0; + display: flex; + align-items: center; + justify-content: center; +} +/* @ckeditor/ckeditor5-page-break/theme/pagebreak.css */ +.ck-content .page-break::after { + content: ''; + position: absolute; + border-bottom: 2px dashed hsl(0, 0%, 77%); + width: 100%; +} +/* @ckeditor/ckeditor5-page-break/theme/pagebreak.css */ +.ck-content .page-break__label { + position: relative; + z-index: 1; + padding: .3em .6em; + display: block; + text-transform: uppercase; + border: 1px solid hsl(0, 0%, 77%); + border-radius: 2px; + font-family: Helvetica, Arial, Tahoma, Verdana, Sans-Serif; + font-size: 0.75em; + font-weight: bold; + color: hsl(0, 0%, 20%); + background: hsl(0, 0%, 100%); + box-shadow: 2px 2px 1px hsla(0, 0%, 0%, 0.15); + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} +/* @ckeditor/ckeditor5-media-embed/theme/mediaembed.css */ +.ck-content .media { + clear: both; + margin: 0.9em 0; + display: block; + min-width: 15em; +} +/* @ckeditor/ckeditor5-list/theme/todolist.css */ +.ck-content .todo-list { + list-style: none; +} +/* @ckeditor/ckeditor5-list/theme/todolist.css */ +.ck-content .todo-list li { + position: relative; + margin-bottom: 5px; +} +/* @ckeditor/ckeditor5-list/theme/todolist.css */ +.ck-content .todo-list li .todo-list { + margin-top: 5px; +} +/* @ckeditor/ckeditor5-list/theme/todolist.css */ +.ck-content .todo-list .todo-list__label > input { + -webkit-appearance: none; + display: inline-block; + position: relative; + width: var(--ck-todo-list-checkmark-size); + height: var(--ck-todo-list-checkmark-size); + vertical-align: middle; + border: 0; + left: -25px; + margin-right: -15px; + right: 0; + margin-left: 0; +} +/* @ckeditor/ckeditor5-list/theme/todolist.css */ +.ck-content[dir=rtl] .todo-list .todo-list__label > input { + left: 0; + margin-right: 0; + right: -25px; + margin-left: -15px; +} +/* @ckeditor/ckeditor5-list/theme/todolist.css */ +.ck-content .todo-list .todo-list__label > input::before { + display: block; + position: absolute; + box-sizing: border-box; + content: ''; + width: 100%; + height: 100%; + border: 1px solid hsl(0, 0%, 20%); + border-radius: 2px; + transition: 250ms ease-in-out box-shadow; +} +/* @ckeditor/ckeditor5-list/theme/todolist.css */ +.ck-content .todo-list .todo-list__label > input::after { + display: block; + position: absolute; + box-sizing: content-box; + pointer-events: none; + content: ''; + left: calc( var(--ck-todo-list-checkmark-size) / 3 ); + top: calc( var(--ck-todo-list-checkmark-size) / 5.3 ); + width: calc( var(--ck-todo-list-checkmark-size) / 5.3 ); + height: calc( var(--ck-todo-list-checkmark-size) / 2.6 ); + border-style: solid; + border-color: transparent; + border-width: 0 calc( var(--ck-todo-list-checkmark-size) / 8 ) calc( var(--ck-todo-list-checkmark-size) / 8 ) 0; + transform: rotate(45deg); +} +/* @ckeditor/ckeditor5-list/theme/todolist.css */ +.ck-content .todo-list .todo-list__label > input[checked]::before { + background: hsl(126, 64%, 41%); + border-color: hsl(126, 64%, 41%); +} +/* @ckeditor/ckeditor5-list/theme/todolist.css */ +.ck-content .todo-list .todo-list__label > input[checked]::after { + border-color: hsl(0, 0%, 100%); +} +/* @ckeditor/ckeditor5-list/theme/todolist.css */ +.ck-content .todo-list .todo-list__label .todo-list__label__description { + vertical-align: middle; +} +/* @ckeditor/ckeditor5-list/theme/todolist.css */ +.ck-content .todo-list .todo-list__label.todo-list__label_without-description input[type=checkbox] { + position: absolute; +} +/* @ckeditor/ckeditor5-list/theme/todolist.css */ +.ck-editor__editable.ck-content .todo-list .todo-list__label > input, +.ck-editor__editable.ck-content .todo-list .todo-list__label > span[contenteditable=false] > input { + cursor: pointer; +} +/* @ckeditor/ckeditor5-list/theme/todolist.css */ +.ck-editor__editable.ck-content .todo-list .todo-list__label > input:hover::before, .ck-editor__editable.ck-content .todo-list .todo-list__label > span[contenteditable=false] > input:hover::before { + box-shadow: 0 0 0 5px hsla(0, 0%, 0%, 0.1); +} +/* @ckeditor/ckeditor5-list/theme/todolist.css */ +.ck-editor__editable.ck-content .todo-list .todo-list__label > span[contenteditable=false] > input { + -webkit-appearance: none; + display: inline-block; + position: relative; + width: var(--ck-todo-list-checkmark-size); + height: var(--ck-todo-list-checkmark-size); + vertical-align: middle; + border: 0; + left: -25px; + margin-right: -15px; + right: 0; + margin-left: 0; +} +/* @ckeditor/ckeditor5-list/theme/todolist.css */ +.ck-editor__editable.ck-content[dir=rtl] .todo-list .todo-list__label > span[contenteditable=false] > input { + left: 0; + margin-right: 0; + right: -25px; + margin-left: -15px; +} +/* @ckeditor/ckeditor5-list/theme/todolist.css */ +.ck-editor__editable.ck-content .todo-list .todo-list__label > span[contenteditable=false] > input::before { + display: block; + position: absolute; + box-sizing: border-box; + content: ''; + width: 100%; + height: 100%; + border: 1px solid hsl(0, 0%, 20%); + border-radius: 2px; + transition: 250ms ease-in-out box-shadow; +} +/* @ckeditor/ckeditor5-list/theme/todolist.css */ +.ck-editor__editable.ck-content .todo-list .todo-list__label > span[contenteditable=false] > input::after { + display: block; + position: absolute; + box-sizing: content-box; + pointer-events: none; + content: ''; + left: calc( var(--ck-todo-list-checkmark-size) / 3 ); + top: calc( var(--ck-todo-list-checkmark-size) / 5.3 ); + width: calc( var(--ck-todo-list-checkmark-size) / 5.3 ); + height: calc( var(--ck-todo-list-checkmark-size) / 2.6 ); + border-style: solid; + border-color: transparent; + border-width: 0 calc( var(--ck-todo-list-checkmark-size) / 8 ) calc( var(--ck-todo-list-checkmark-size) / 8 ) 0; + transform: rotate(45deg); +} +/* @ckeditor/ckeditor5-list/theme/todolist.css */ +.ck-editor__editable.ck-content .todo-list .todo-list__label > span[contenteditable=false] > input[checked]::before { + background: hsl(126, 64%, 41%); + border-color: hsl(126, 64%, 41%); +} +/* @ckeditor/ckeditor5-list/theme/todolist.css */ +.ck-editor__editable.ck-content .todo-list .todo-list__label > span[contenteditable=false] > input[checked]::after { + border-color: hsl(0, 0%, 100%); +} +/* @ckeditor/ckeditor5-list/theme/todolist.css */ +.ck-editor__editable.ck-content .todo-list .todo-list__label.todo-list__label_without-description input[type=checkbox] { + position: absolute; +} +/* @ckeditor/ckeditor5-list/theme/list.css */ +.ck-content ol { + list-style-type: decimal; +} +/* @ckeditor/ckeditor5-list/theme/list.css */ +.ck-content ol ol { + list-style-type: lower-latin; +} +/* @ckeditor/ckeditor5-list/theme/list.css */ +.ck-content ol ol ol { + list-style-type: lower-roman; +} +/* @ckeditor/ckeditor5-list/theme/list.css */ +.ck-content ol ol ol ol { + list-style-type: upper-latin; +} +/* @ckeditor/ckeditor5-list/theme/list.css */ +.ck-content ol ol ol ol ol { + list-style-type: upper-roman; +} +/* @ckeditor/ckeditor5-list/theme/list.css */ +.ck-content ul { + list-style-type: disc; +} +/* @ckeditor/ckeditor5-list/theme/list.css */ +.ck-content ul ul { + list-style-type: circle; +} +/* @ckeditor/ckeditor5-list/theme/list.css */ +.ck-content ul ul ul { + list-style-type: square; +} +/* @ckeditor/ckeditor5-list/theme/list.css */ +.ck-content ul ul ul ul { + list-style-type: square; +} +/* @ckeditor/ckeditor5-image/theme/image.css */ +.ck-content .image { + display: table; + clear: both; + text-align: center; + margin: 0.9em auto; + min-width: 50px; +} +/* @ckeditor/ckeditor5-image/theme/image.css */ +.ck-content .image img { + display: block; + margin: 0 auto; + max-width: 100%; + min-width: 100%; + height: auto; +} +/* @ckeditor/ckeditor5-image/theme/image.css */ +.ck-content .image-inline { + /* + * Normally, the .image-inline would have "display: inline-block" and "img { width: 100% }" (to follow the wrapper while resizing).; + * Unfortunately, together with "srcset", it gets automatically stretched up to the width of the editing root. + * This strange behavior does not happen with inline-flex. + */ + display: inline-flex; + max-width: 100%; + align-items: flex-start; +} +/* @ckeditor/ckeditor5-image/theme/image.css */ +.ck-content .image-inline picture { + display: flex; +} +/* @ckeditor/ckeditor5-image/theme/image.css */ +.ck-content .image-inline picture, +.ck-content .image-inline img { + flex-grow: 1; + flex-shrink: 1; + max-width: 100%; +} +/* @ckeditor/ckeditor5-image/theme/imageresize.css */ +.ck-content img.image_resized { + height: auto; +} +/* @ckeditor/ckeditor5-image/theme/imageresize.css */ +.ck-content .image.image_resized { + max-width: 100%; + display: block; + box-sizing: border-box; +} +/* @ckeditor/ckeditor5-image/theme/imageresize.css */ +.ck-content .image.image_resized img { + width: 100%; +} +/* @ckeditor/ckeditor5-image/theme/imageresize.css */ +.ck-content .image.image_resized > figcaption { + display: block; +} +/* @ckeditor/ckeditor5-image/theme/imagecaption.css */ +.ck-content .image > figcaption { + display: table-caption; + caption-side: bottom; + word-break: break-word; + color: var(--ck-color-image-caption-text); + background-color: var(--ck-color-image-caption-background); + padding: .6em; + font-size: .75em; + outline-offset: -1px; +} +/* @ckeditor/ckeditor5-image/theme/imagestyle.css */ +.ck-content .image-style-block-align-left, +.ck-content .image-style-block-align-right { + max-width: calc(100% - var(--ck-image-style-spacing)); +} +/* @ckeditor/ckeditor5-image/theme/imagestyle.css */ +.ck-content .image-style-align-left, +.ck-content .image-style-align-right { + clear: none; +} +/* @ckeditor/ckeditor5-image/theme/imagestyle.css */ +.ck-content .image-style-side { + float: right; + margin-left: var(--ck-image-style-spacing); + max-width: 50%; +} +/* @ckeditor/ckeditor5-image/theme/imagestyle.css */ +.ck-content .image-style-align-left { + float: left; + margin-right: var(--ck-image-style-spacing); +} +/* @ckeditor/ckeditor5-image/theme/imagestyle.css */ +.ck-content .image-style-align-center { + margin-left: auto; + margin-right: auto; +} +/* @ckeditor/ckeditor5-image/theme/imagestyle.css */ +.ck-content .image-style-align-right { + float: right; + margin-left: var(--ck-image-style-spacing); +} +/* @ckeditor/ckeditor5-image/theme/imagestyle.css */ +.ck-content .image-style-block-align-right { + margin-right: 0; + margin-left: auto; +} +/* @ckeditor/ckeditor5-image/theme/imagestyle.css */ +.ck-content .image-style-block-align-left { + margin-left: 0; + margin-right: auto; +} +/* @ckeditor/ckeditor5-image/theme/imagestyle.css */ +.ck-content p + .image-style-align-left, +.ck-content p + .image-style-align-right, +.ck-content p + .image-style-side { + margin-top: 0; +} +/* @ckeditor/ckeditor5-image/theme/imagestyle.css */ +.ck-content .image-inline.image-style-align-left, +.ck-content .image-inline.image-style-align-right { + margin-top: var(--ck-inline-image-style-spacing); + margin-bottom: var(--ck-inline-image-style-spacing); +} +/* @ckeditor/ckeditor5-image/theme/imagestyle.css */ +.ck-content .image-inline.image-style-align-left { + margin-right: var(--ck-inline-image-style-spacing); +} +/* @ckeditor/ckeditor5-image/theme/imagestyle.css */ +.ck-content .image-inline.image-style-align-right { + margin-left: var(--ck-inline-image-style-spacing); +} +/* @ckeditor/ckeditor5-highlight/theme/highlight.css */ +.ck-content .marker-yellow { + background-color: var(--ck-highlight-marker-yellow); +} +/* @ckeditor/ckeditor5-highlight/theme/highlight.css */ +.ck-content .marker-green { + background-color: var(--ck-highlight-marker-green); +} +/* @ckeditor/ckeditor5-highlight/theme/highlight.css */ +.ck-content .marker-pink { + background-color: var(--ck-highlight-marker-pink); +} +/* @ckeditor/ckeditor5-highlight/theme/highlight.css */ +.ck-content .marker-blue { + background-color: var(--ck-highlight-marker-blue); +} +/* @ckeditor/ckeditor5-highlight/theme/highlight.css */ +.ck-content .pen-red { + color: var(--ck-highlight-pen-red); + background-color: transparent; +} +/* @ckeditor/ckeditor5-highlight/theme/highlight.css */ +.ck-content .pen-green { + color: var(--ck-highlight-pen-green); + background-color: transparent; +} +/* @ckeditor/ckeditor5-block-quote/theme/blockquote.css */ +.ck-content blockquote { + overflow: hidden; + padding-right: 1.5em; + padding-left: 1.5em; + margin-left: 0; + margin-right: 0; + font-style: italic; + border-left: solid 5px hsl(0, 0%, 80%); +} +/* @ckeditor/ckeditor5-block-quote/theme/blockquote.css */ +.ck-content[dir="rtl"] blockquote { + border-left: 0; + border-right: solid 5px hsl(0, 0%, 80%); +} +/* @ckeditor/ckeditor5-basic-styles/theme/code.css */ +.ck-content code { + background-color: hsla(0, 0%, 78%, 0.3); + padding: .15em; + border-radius: 2px; +} +/* @ckeditor/ckeditor5-font/theme/fontsize.css */ +.ck-content .text-tiny { + font-size: .7em; +} +/* @ckeditor/ckeditor5-font/theme/fontsize.css */ +.ck-content .text-small { + font-size: .85em; +} +/* @ckeditor/ckeditor5-font/theme/fontsize.css */ +.ck-content .text-big { + font-size: 1.4em; +} +/* @ckeditor/ckeditor5-font/theme/fontsize.css */ +.ck-content .text-huge { + font-size: 1.8em; +} +/* @ckeditor/ckeditor5-mention/theme/mention.css */ +.ck-content .mention { + background: var(--ck-color-mention-background); + color: var(--ck-color-mention-text); +} +/* @ckeditor/ckeditor5-horizontal-line/theme/horizontalline.css */ +.ck-content hr { + margin: 15px 0; + height: 4px; + background: hsl(0, 0%, 87%); + border: 0; +} +/* @ckeditor/ckeditor5-code-block/theme/codeblock.css */ +.ck-content pre { + padding: 1em; + color: hsl(0, 0%, 20.8%); + background: hsla(0, 0%, 78%, 0.3); + border: 1px solid hsl(0, 0%, 77%); + border-radius: 2px; + text-align: left; + direction: ltr; + tab-size: 4; + white-space: pre-wrap; + font-style: normal; + min-width: 200px; +} +/* @ckeditor/ckeditor5-code-block/theme/codeblock.css */ +.ck-content pre code { + background: unset; + padding: 0; + border-radius: 0; +} +@media print { + /* @ckeditor/ckeditor5-page-break/theme/pagebreak.css */ + .ck-content .page-break { + padding: 0; + } + /* @ckeditor/ckeditor5-page-break/theme/pagebreak.css */ + .ck-content .page-break::after { + display: none; + } +} diff --git a/bin/docs/assets/v0.63.6/libraries/normalize.min.css b/bin/docs/assets/v0.63.6/libraries/normalize.min.css new file mode 100644 index 000000000..87aa24dc5 --- /dev/null +++ b/bin/docs/assets/v0.63.6/libraries/normalize.min.css @@ -0,0 +1,2 @@ +/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */html{line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0}main{display:block}h1{font-size:2em;margin:.67em 0}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}template{display:none}[hidden]{display:none} +/*# sourceMappingURL=normalize.min.css.map */ \ No newline at end of file diff --git a/bin/docs/assets/v0.63.6/stylesheets/share.css b/bin/docs/assets/v0.63.6/stylesheets/share.css new file mode 100644 index 000000000..718f8594c --- /dev/null +++ b/bin/docs/assets/v0.63.6/stylesheets/share.css @@ -0,0 +1,165 @@ +body { + font-family: 'Lucida Grande', 'Lucida Sans Unicode', arial, sans-serif; + line-height: 1.5; +} + +#layout { + max-width: 1200px; + margin: 0 auto; + display: flex; + flex-direction: row-reverse; +} + +#menu { + padding: 25px; + flex-basis: 0; + flex-grow: 1; + overflow: auto; +} + +#menu p { + margin: 0; +} + +#menu > p { + font-weight: bold; + font-size: 110%; +} + +#menu ul { + padding-left: 20px; +} + +#main { + flex-basis: 0; + flex-grow: 3; + overflow: auto; + padding: 10px 20px 20px 20px; +} + +#parentLink { + float: right; + margin-top: 20px; +} + +#title { + margin: 0; + padding-top: 10px; +} + +img { + max-width: 100%; +} + +pre { + white-space: pre-wrap; + word-wrap: anywhere; +} + +iframe.pdf-view { + width: 100%; + height: 800px; +} + +#toggleMenuButton { + display: none; + position: fixed; + top: 8px; + left: 5px; + width: 1.4em; + border-radius: 5px; + border: 1px solid #aaa; + font-size: 2rem; + z-index: 10; + height: auto; + color: black; + cursor: pointer; +} + +#childLinks.grid ul { + list-style-type: none; + display: flex; + flex-wrap: wrap; + padding: 0; +} + +#childLinks.grid ul li { + width: 180px; + height: 140px; + padding: 10px; +} + +#childLinks.grid ul li a { + display: flex; + flex-direction: column; + height: 100%; + width: 100%; + border: 1px solid #ddd; + border-radius: 5px; + justify-content: center; + align-content: center; + text-align: center; + font-size: large; +} + +#childLinks.grid ul li a:hover { + background: #eee; +} + +#childLinks.list ul { + list-style-type: none; + display: inline-flex; + flex-wrap: wrap; + padding: 0; + margin-top: 5px; +} + +#childLinks.list ul li { + margin-right: 20px; +} + +#noteClippedFrom { + padding: 10px 0 10px 0; + margin: 20px 0 20px 0; + color: #666; + border: 1px solid #ddd; + border-left: 0; + border-right: 0; +} + +#toggleMenuButton::after { + position: relative; + top: -2px; + left: 1px; +} + +@media (max-width: 48em) { + #layout.showMenu #menu { + display: block; + margin-top: 40px; + } + + #toggleMenuButton { + display: block; + } + + #layout.showMenu #main { + display: none; + } + + #title { + padding-left: 60px; + } + + #layout.showMenu #toggleMenuButton::after { + content: "«"; + } + + #toggleMenuButton::after { + content: "»"; + } + + #menu { + display: none; + } +} diff --git a/docs/3jc1nUXyteo0.html b/docs/3jc1nUXyteo0.html new file mode 100644 index 000000000..09753b687 --- /dev/null +++ b/docs/3jc1nUXyteo0.html @@ -0,0 +1,457 @@ + + + + + + + + + + + + + + + + + + + + + + + Themes + + +
+
+ + + + +

Themes

+ + + + +
+

Server-side

  • There are two themes embedded in the application:
    • light, located in src\public\stylesheets\theme-light.css
    • dark, located in src\public\stylesheets\theme-dark.css
  • The default theme is set only once, when the database is created and is managed by options_init#initNotSyncedOptions.
    • On Electron, the choice between light and dark is done based on the OS preference.
    • Otherwise, the theme is always dark.
  • The theme is served via src\routes\index.ts, in the getThemeCssUrl method.

Client-side

  • The two predefined themes are hard-coded in the client in src\public\app\widgets\type_widgets\options\appearance\theme.js.
  • The user-defined themes are obtained via a call to the server: options/user-themes.
  • The theme retrieval is done via a request
+
+ + + +
+ + + + + + +
+ + diff --git a/docs/4yYHqKbLovVX.html b/docs/4yYHqKbLovVX.html index f2fb532a9..e75e6d9fd 100644 --- a/docs/4yYHqKbLovVX.html +++ b/docs/4yYHqKbLovVX.html @@ -40,13 +40,28 @@ @@ -76,20 +91,6 @@ - Internationalisation - -

- - - - - -
  • - -

    - - - Dependency Management

    @@ -109,6 +110,360 @@ +
  • + +
  • + +

    + + + + Having a simpler packaging system + +

    + + + +
  • + + + + + + +
  • + +

    + + + + Building and deployment + +

    + + + + + +
  • + +
  • + +

    + + + + Project maintenance + +

    + + + + + +
  • + +
  • + +

    + + + + Development and architecture + +

    + + + + + +
  • + +
  • + +

    + + + + Environment Setup + +

    + + + diff --git a/docs/B8hxg4e66cVL.html b/docs/B8hxg4e66cVL.html new file mode 100644 index 000000000..a87867176 --- /dev/null +++ b/docs/B8hxg4e66cVL.html @@ -0,0 +1,486 @@ + + + + + + + + + + + + + + + + + + + + + + + Development and architecture + + +
    +
    + + + + +

    Development and architecture

    + + + + + + + + +
    + + + + + + +
    + + diff --git a/docs/BhE2WFknKKHG.html b/docs/BhE2WFknKKHG.html new file mode 100644 index 000000000..951da8d88 --- /dev/null +++ b/docs/BhE2WFknKKHG.html @@ -0,0 +1,457 @@ + + + + + + + + + + + + + + + + + + + + + + + Main + + +
    +
    + + + + +

    Main

    + + + + +
    +

    The main workflow of the CI:

    • Builds the Docker image and publishes in the GitHub Docker registry.
    • Builds using a portion of the delivery script artifacts for the following platforms:
      • Windows x86_64 as .zip file
      • Windows x86_64 installer (using Squirrel)
      • macOS x86_64 and aarch64.
      • Linux x86_64
      • Linux server x86_64.

    The main workflow of the CI runs on develop branches as well as any branch that starts with feature/update_.

    Downloading the artifacts from the main branch

    Simply go to the develop branch on GitHub and look at the commit bar:

    Press the green checkmark (or red cross if something went bad). Then look at the list of jobs and their status:

    Then look for any of the entires that starts with “Main” and press the “Details” link next to it. It doesn't really matter which platform you'll choose as the artifacts are available on the same page.

     

    +
    + + + +
    + + + + + + +
    + + diff --git a/docs/C09Dou56ffMe.html b/docs/C09Dou56ffMe.html new file mode 100644 index 000000000..84c85f1a6 --- /dev/null +++ b/docs/C09Dou56ffMe.html @@ -0,0 +1,457 @@ + + + + + + + + + + + + + + + + + + + + + + + Having a simpler packaging system + + +
    +
    + + + + +

    Having a simpler packaging system

    + + + + +
    +

    The current build scripts are a bit complicated and maintaining them is not easy.

    Electron Forge seems more mature and has a boatload of features, including Flatpak, snaps, Windows installers & more.

    Have a look also at the Plugins section since there are quite a few interesting things there as well.

    Afterwards consider running a new round of Reducing binary size, especially taking into consideration removing of the unnecessary locales.

    +
    + + + +
    + + + + + + +
    + + diff --git a/docs/GMta9hBHsXHQ.html b/docs/GMta9hBHsXHQ.html new file mode 100644 index 000000000..ecae78fd1 --- /dev/null +++ b/docs/GMta9hBHsXHQ.html @@ -0,0 +1,457 @@ + + + + + + + + + + + + + + + + + + + + + + + Node.js, Electron and `better-sqlite3` + + +
    +
    + + + + +

    Node.js, Electron and `better-sqlite3`

    + + + + +
    +

    better-sqlite3 requires a native module in order to work. In order to ease the installation process, prebuilt binaries are provided by the library developers.

    Trilium Next started with version 8.4.0 for better-sqlite3

    better-sqlite3 versionSQLite versionNode.js prebuildsElectron.js prebuilds
    8.4.0<3.43.0v20???
    8.5.0v20v25
    8.5.1 v26
    8.5.2v20 (macOS + arm64)
    8.6.03.43.0 
    8.7.03.43.1 
    9.0.03.43.2 v27
    9.1.03.44.0 
    9.1.1macOS + Alpine
    9.2.03.44.2 
    9.2.1 / 9.2.2 v28
    9.3.03.45.0 
    9.4.03.45.1 
    9.4.1Windows arm, arm64
    9.4.2 <v29
    9.4.3 <v29
    9.4.4 v29
    9.4.5Better prebuilds
    9.5.03.45.2 
    9.6.03.45.3 v30
    10.0.0v22
    10.1.03.46.0 
    11.0.0>21
    11.1.0 (prerelease)  v31
    11.1.1  
    11.1.2  
    +
    + + + +
    + + + + + + +
    + + diff --git a/docs/KRC2O84LekPz.html b/docs/KRC2O84LekPz.html new file mode 100644 index 000000000..464a8a1b0 --- /dev/null +++ b/docs/KRC2O84LekPz.html @@ -0,0 +1,457 @@ + + + + + + + + + + + + + + + + + + + + + + + i18n-ally + + +
    +
    + + + + +

    i18n-ally

    + + + + +
    +

    i18n-ally is a VS Code extension that aids in internationalization.

    It is currently integrated in the project and offers features such as:

    • Highlight, autocomplete translations.
    • Display translations inline.
    • Extract messages into translation.

    Extracting messages into translation

    1. Open any .js file and select an untranslated string inside a template (TPL).
    2. Press Ctrl+P and look for “i18n Ally: Extract text into i18n messages”
    3. Select the first template.
    4. Select the path of translation, taking into consideration the Guidelines (e.g. jump_to_note.search-for-note-by-its-name).
    +
    + + + +
    + + + + + + +
    + + diff --git a/docs/PHqgH8FCfcod.html b/docs/PHqgH8FCfcod.html new file mode 100644 index 000000000..a837b4355 --- /dev/null +++ b/docs/PHqgH8FCfcod.html @@ -0,0 +1,455 @@ + + + + + + + + + + + + + + + + + + + + + + + Documentation + + +
    +
    + + + + +

    Documentation

    + + + + + + +

    This note has no content.

    + +
    + + + + + + +
    + + diff --git a/docs/QXCi6Y1SYulw.html b/docs/QXCi6Y1SYulw.html index 3e5f58f87..34d8f0bd2 100644 --- a/docs/QXCi6Y1SYulw.html +++ b/docs/QXCi6Y1SYulw.html @@ -86,7 +86,7 @@ node_modules/i18next + I18NEXT }

    Step 4. Using the library

    To import the library, simply use the following mechanism:

    import library_loader from "./library_loader.js";
     
    -await library_loader.requireLibrary(library_loader.I18NEXT);

    Make sure to replace I18NEXT with the library that was created at the previous steps.

    Note that because we are not using a module management mechanism such as ES Modules or Common.js modules, the requireLibrary method does not actually return anything. 

    To benefit from the library, it must export on its own an object in window.

    In the case of i18next, it sets window.i18next and that can be used directly:

    i18next.init({});
    +await library_loader.requireLibrary(library_loader.I18NEXT);

    Make sure to replace I18NEXT with the library that was created at the previous steps.

    Note that because we are not using a module management mechanism such as ES Modules or Common.js modules, the requireLibrary method does not actually return anything. 

    To benefit from the library, it must export on its own an object in window.

    In the case of i18next, it sets window.i18next and that can be used directly:

    i18next.init({});

    Step 5. Adding Electron support

    For Electron, the node_modules are copied as a separate step by bin/copy-dist.ts.

    Scroll all the way down to the nodeModulesFolder and append an entry for the newly added libraries.

    @@ -115,20 +115,6 @@ await library_loader.requireLibrary(library_loader.I18NEXT);

    Make - Internationalisation - -

    - - - -
  • - -
  • - -

    - - - Dependency Management

    @@ -148,6 +134,360 @@ await library_loader.requireLibrary(library_loader.I18NEXT);

    Make +

  • + +
  • + +

    + + + + Having a simpler packaging system + +

    + + + +
  • + + + + + + +
  • + +

    + + + + Building and deployment + +

    + + + + + +
  • + +
  • + +

    + + + + Project maintenance + +

    + + + + + +
  • + +
  • + +

    + + + + Development and architecture + +

    + + + + + +
  • + +
  • + +

    + + + + Environment Setup + +

    + + + diff --git a/docs/U5RtMeGPeZ29.html b/docs/U5RtMeGPeZ29.html new file mode 100644 index 000000000..41c0da655 --- /dev/null +++ b/docs/U5RtMeGPeZ29.html @@ -0,0 +1,466 @@ + + + + + + + + + + + + + + + + + + + + + + + Synchronisation + + +
    +
    + + + + +

    Synchronisation

    + + + + + + + + +
    + + + + + + +
    + + diff --git a/docs/UTB518X6X9Uh.html b/docs/UTB518X6X9Uh.html new file mode 100644 index 000000000..2b59c0dd3 --- /dev/null +++ b/docs/UTB518X6X9Uh.html @@ -0,0 +1,461 @@ + + + + + + + + + + + + + + + + + + + + + + + Build deliveries locally + + +
    +
    + + + + +

    Build deliveries locally

    + + + + +
    +

    In the project root:

    PlatformArchitectureApplicationBuild command
    macOSx86_64Desktop / Electron app./bin/build-mac-x64.sh
    ARM 64Desktop / Electron app./bin/build-mac-arm64.sh
    Linuxx86_64Desktop / Electron app./bin/build-linux-x64.sh
    Server./bin/build-server.sh
    Windowsx86_64Desktop / Electron app./bin/build-win-x64.sh

    Under NixOS the following nix-shell is needed:

    nix-shell -p jq

    For Linux builds:

    nix-shell -p jq fakeroot dpkg

    The resulting build will be in the dist directory under the project root.

    Testing the Linux builds under NixOS

    Desktop clientServer
    $ NIXPKGS_ALLOW_UNFREE=1 nix-shell -p steam-run
    +[nix-shell] cd dist/trilium-linux-x64
    +[nix-shell] steam-run ./trilium
    $ NIXPKGS_ALLOW_UNFREE=1 nix-shell -p steam-run
    +[nix-shell] cd dist/trilium-linux-x64-server
    +[nix-shell] steam-run ./trilium.sh
    +
    + + + +
    + + + + + + +
    + + diff --git a/docs/VS22Hq5PBFNf.html b/docs/VS22Hq5PBFNf.html index 126d58524..0095e0ab9 100644 --- a/docs/VS22Hq5PBFNf.html +++ b/docs/VS22Hq5PBFNf.html @@ -49,6 +49,11 @@ class="type-text">Adding a new client library
  • +
  • + Having a simpler packaging system +
  • + @@ -76,20 +81,6 @@ - Internationalisation - -

    - - - - - -
  • - -

    - - - Dependency Management

    @@ -109,6 +100,360 @@ +
  • + +
  • + +

    + + + + Having a simpler packaging system + +

    + + + +
  • + + + + + + +
  • + +

    + + + + Building and deployment + +

    + + + + + +
  • + +
  • + +

    + + + + Project maintenance + +

    + + + + + +
  • + +
  • + +

    + + + + Development and architecture + +

    + + + + + +
  • + +
  • + +

    + + + + Environment Setup + +

    + + + diff --git a/docs/X4N03xLYEWnN.html b/docs/X4N03xLYEWnN.html new file mode 100644 index 000000000..9aa2a6e0b --- /dev/null +++ b/docs/X4N03xLYEWnN.html @@ -0,0 +1,462 @@ + + + + + + + + + + + + + + + + + + + + + + + bettersqlite binaries + + +
    +
    + + + + +

    bettersqlite binaries

    + + + + +
    +

    The native node bindings

    better-sqlite3 has native Node bindings. With updates of better-sqlite3, but also of Electron and Node.js versions, these bindings need to be updated.

    Note that Electron and Node.js versions need different versions of these bindings, since Electron usually packs a different version of Node.js.

    During development, npm install tries to build or reuse prebuilt natives for the current Node.js version. This makes npm run start-server work out of the box. Trying to run npm run start-electron with these versions generally causes an error such as this:

    Uncaught Exception:
    +Error: The module '/Users/elian/Projects/Notes/node_modules/better-sqlite3/build/Release/better_sqlite3.node'
    +was compiled against a different Node.js version using
    +NODE_MODULE_VERSION 108. This version of Node.js requires
    +NODE_MODULE_VERSION 116. Please try re-compiling or re-installing
    +the module (for instance, using `npm rebuild` or `npm install`).

    How the natives are handled

    Locally, this can be fixed by rebuilding the binaries, which is what npm run switch-electron does, which uses electron-rebuild under the hood.

    When the deliveries are built (see Build deliveries locally), it is not feasible to rebuild the dependencies since we are building for multiple platforms. Luckily, better-sqlite3 provides these prebuilt binaries from us, available as artifacts on their GitHub releases page

    The build script manages the natives for better-sqlite3 by keeping a copy of the .node file for every platform in bin/better-sqlite3.

    Whenever the version of better-sqlite3 changes, the .node files must also be renewed based on their releases page. To simplify this process, a script was created in bin/better-sqlite3/update.sh.

    How to update the natives

    The update script needs to know the version of Electron or Node.js for which to download the prebuilt binaries.

    If you get errors during download, check on the releases page to ensure that this particular combination of Electron/Node actually exists for the given release.

    To determine the NODE_MODULE_VERSION that is required, look for This version of Node.js requires
    NODE_MODULE_VERSION in the error when starting Trilium via:

    • npm run start-electron (or run any Electron delivery), case in which the ELECTRON_VERSION variable needs to be changed.
    • npm run start-server (or run the Linux server delivery), case in which the NODE_VERSION variable needs to be changed.

    Check which files got changed after running the update script and for each platform that got changed, test it locally via Build deliveries locally or via the CI.

    +
    + + + +
    + + + + + + +
    + + diff --git a/docs/XxqZW6JjkW2g.html b/docs/XxqZW6JjkW2g.html new file mode 100644 index 000000000..bffc19454 --- /dev/null +++ b/docs/XxqZW6JjkW2g.html @@ -0,0 +1,457 @@ + + + + + + + + + + + + + + + + + + + + + + + Live reload + + +
    +
    + + + + +

    Live reload

    + + + + +
    +

    Server live reload

    If running the server using npm run start-server, the server will watch for changes in src/public and trigger a frontend reload if that occurs.

    Electron live reload

    Similarly, npm run start-electron supports live refresh  as well.

    However, a core difference is that Electron watches dist/src/public instead of src/public since Electron runs on its own copy of the files.

    To ameliorate that, a separate watch script has been implemented which automatically copies files from src/public to dist/src/public whenever a change is detected. To run it:

    npm run 

    Technical details

    • This mechanism is managed at server level by watching for changes inservices/ws.ts.
    +
    + + + +
    + + + + + + +
    + + diff --git a/docs/Z9N9OKBXXLFW.html b/docs/Z9N9OKBXXLFW.html new file mode 100644 index 000000000..d16eeb443 --- /dev/null +++ b/docs/Z9N9OKBXXLFW.html @@ -0,0 +1,457 @@ + + + + + + + + + + + + + + + + + + + + + + + Guidelines + + +
    +
    + + + + +

    Guidelines

    + + + + +
    +
    • Use hierarchy whenever appropriate, try to group the messages by:
      • Modals (e.g. about.foo, jump_to_note.foo)
    • Don't duplicate messages that are very widely used.
      • One such example is aria-label="Close" which should go to a single message such as modal.close instead of being duplicated in every modal.
    • On the other hand, don't overly generalise messages. A close message that is used whenever the “Close” word is encountered is not a good approach since it can potentially cause issues due to lack of context.
    • Use variable interpolation whenever appropriate.
      • If you see multiple messages joined together only to apply add a variable such as a user-inputted value, try to join those messages together into a single message containing a variable.
      • So instead of “Number of updates: “ + numUpdates + “.” use $(t("number_updates", { numUpdates })) where the message translation would appear as Number of updates: {{numUpdates}}.
    +
    + + + +
    + + + + + + +
    + + diff --git a/docs/ZlxZh8NH5frM.html b/docs/ZlxZh8NH5frM.html new file mode 100644 index 000000000..b56c73abd --- /dev/null +++ b/docs/ZlxZh8NH5frM.html @@ -0,0 +1,486 @@ + + + + + + + + + + + + + + + + + + + + + + + Building and deployment + + +
    +
    + + + + +

    Building and deployment

    + + + + + + + + +
    + + + + + + +
    + + diff --git a/docs/api/attachments/27Z989bSFWAc/image/image.png b/docs/api/attachments/27Z989bSFWAc/image/image.png new file mode 100644 index 0000000000000000000000000000000000000000..5eacee569ab1e56c986309d5f640e96989c94464 GIT binary patch literal 62104 zcmb@u1yEf7(yoi!;BG+^T!TY!OK^85xVvizE=jQ9?(Xgog4^Kk?(TOb|GoD)x9Zfb zv+I6UGeym+nPt=S>+a`$n=l1ANfabPBnSuylusYUlpr9W%po8k+YsP@Em>FLAAvuR zPD+v@5apx9`@jnrGhta_2#Bf}(32r7@EXznqoxxC1ZvNpCuF}};b#bl3&u}k!Yb~1 zM`^G+IP-Y@F=5ScdvvZ`6r6zp%K=7NbLHX7Z3h%P2Mf#1;cc#lhW!g+0n2Ir;V-*x zKRpCUPP;_GK2QAm0+$|kCv9v_yQ3y2cB4FQdZlAXZxI5?fQJTh)wH}YIt=jW5`QJ?lxWNeQ|9loC3X}Y2cL;%B$)RNb z*(%oRw<s|@+az6{C0D8&5BB?KWpbW5p)+y zYq`!nYC3L`G3@{0d^P95aSNI={Z-l&_fAreP{1+L@hIl%?i}lYYt3!Be(tqs$_&gH ziKUr#dn_pAa=@|ifg!$lCYMq&#$iP%V>^}8a1vV&zEHiQ9hycm{i)ft!||Gs!~S-y zTGMGkv4DxcvHX|N6YfSM`k2d8@26$gLehhTYnGM@jwF!L(KR zW2k6+@W`xIionl?aKQF9oA*oEqMO2r4v&W)^y6*TqT7kW>`B{wjY<(_+`>!( z>KlP#P^918-uG(Xpww_arIim&`?VD4%Y^J|y<=Vi881HZm&wPChAjL+Y83*{ zML{)eDEB@P4IDvx7dR!{q#{=Rqs!n@3*%%?6R4(Xm%ONyhHtZH-;Z|My|?M=Y*xco z+I@y*kw6bny|XXSA%(_?C!bU3aAx;!1D+dC4fveOvFh!vQ>giUZX!KhPrGM3hrD2x zTih}(|3oc${>9ZiUXOD4*31DHB~ACB_08S!b1IKl`k3g;*^Y||#IsJ8r za{Gvd!9wJG2Aj#y^Ss+GlU_gd%y(O4>jD z-<4LA6s-*q8mYj;kxKE=F5HQ%AU)K2jZc?R>#2H$o! z;ov&f;z&AQ#$`g8M&IFs$BquQclPl29Q}is(~qLd4yb`Y*$)G63826r}Csr@`K^ka$pcK z&)hW3tm8K6p#^7APTGN6@r{DSg{fiEguW^dL9M)BK7Bk-`Xz3RiJ6BFXV(XR^C61J zdgRmhrQlzYSNU&0{jm28#~vt(wvuhOKd0bHpy{#wbvSFMkjm}Ay^4)7O|aDL5fL1P zFRp4eLmtu{&F=CbGYUdN&2AiQKLi3TGt)poFt=v|u0*S;n(1oe9>nYOz|ap%2PNsY zGS}Z9Lwsxjnj=UW_gG`D3Wk>A zdzmAtp!Zw&kSCQw14!2|yoq%ECkEo77hB&iOokL5uJ#Md-e2Ms`B(e3wCW!u@+eD4C0(ey{7o`OxWTMu!K@a+KN-huSDO251w(^y%N8B1 zap7iRBVKl%I9^N5Zf9m8SOcG_q~a80!+1%tCm?=3^Mpr}ED@O|vD#qvMGz(SeT|RD z>5H<`QqiQAmaxD%zfi#d$zv-PKsrp6NmE}eH-ERBEiF$yUuee^Nqe74-l^6VST!Hq_2!8S6+A zN0d@QeV(H6FD2PoPv_ec{=pyb*lbp-1Aax5bTJ*Iw>{E69(3A{0t;+8+9<87b)FTS z4bz`|%=!j_&6w5ffnwxU%0HPfd>-m}t7yu4d+<9YABQd2e>0FJwkBQsO?~d0$6I|= zwO2xeHvuejCoOElx&DO)8Dr7n*f7W&MM`;6McQOkWUU6|A_}kfphR$4H#BH=j+Jsg zaHe+Kj(8JRL`1}W;5$E2L`2k~n({_(m_=Xlbo1J6VYNDjsk`c@j1~SuLm#fejMa2% z*1gNa3fe-cym058Bh7_I3%2EsSO398`kvin22CY_0_m3*hVrX10#I)>twB|@!(~FV zg!8o}M1`4Bxp?VZ7559WTKy{gRgR@9T@CE{#Ad(c{`gNpaF$3@b*<~QBjNi(LER3A z*r%HlV~}Py3}U0*(Z#Zi>=Mxh%(p4CQE|^SgR0>lJZ!qHTk>uvOR6yvgAeZn-2SBT zP>Zd>?@?cqst_U3Ek2ILQhxZ-fqCEVZ!`?hlAS> zY|W9XFV!q6x3Wpc&}viDP42K~Wz^dcwc+QRilvsHR>DxO%!H0-SQjf%dlh9|tj(!A zKQhR2WUQZLUDb>kxgZ{EKjs2J`K38yu+u?jjnTULb zKn~T2mcufq-SV#tboD|nF%cSyAMa3HGDeg6WAtD6&Tg}KxvB-wKijRg=X4}8Y^tYp z)*;yIgp$gjpP8>DQ^}`|x)5=g5=Y@*Qzx>*im4>p^51``)Gb+EaPpj@iW;Ev^{zLi zpz-^4#Iq##vk~IYk6=FAMSHZTH!Qwn*74Q94oyu}W5iyr5w7Ltj@F2QN1KYWMJ^1J zN(IL7ovn7vPS!EM!v%Z0p2OxZ)tG<6FhoCgG01ByN#NJTFs31&h8!)VGuVEKYhlh>a-b1Lbm= zUdPwg*HoE+0AWj{iFm8oBIAlKaK6*3y$35Sn82lA*WW>`S77B6A% z;^-b!PAc%Xq`rIoWgU;ZzpoL$*P^X{X5}ne)M(r!ZckmZI+H&khbMwTq+t}BK-)(Nk?Ti zP%?yVHLU(UR_K1O5{zsdHVT8qA?Kq~Kj#RIVK)r#ZJKsj@e^XiLM=~3k!VVO+|sY) zDTqnQ$P_7Ny><$EdiwfCe$~kreve?@=b6-@&bq=50h1dMUY8vxzY47?WK!sEyQR2! z=gpZna&}X#7(BR4LXz^S`ST!eZbqwoWN@1?(Mx%J6b?OZo$bsw;-ib8MUr97#z?`k z*mv)4J?qSG+eMq5z=FGcwzlX#3h59ar| zR%Yg!%xCy|oS3x-Kh2gy*d*~Nds-e(jBg42?QKGno+>{o zvOeI-LX19p@oW#o>n5VII&R(3^5!GdYGO%F9(~H8Q6IHFGX1*v-s9r44yp%D$>|`t zz8}g^naod*@R0x852{bY{ozQ#<$6bwScUL0>6yVUR^wZ&erLP~5DuI!qZD$I_pEx) z7X2sBt)$Aks4KLK!iCdLWxqsb=I;M~U+6XWhER;U3*g#5H~ApQJ3@5kO71S*Vzl0& z2)v59wnyfp4NYHXp>U@jJ#P?8VcGC9=4Yhj2!a4{+ePd`tV{mieHgca;rqB3|x=;9cQ zu#C7fB3@?O@BcZYvsDb60JwEn*4*=}d8c%-Z!E$Zx1=zz3?J+bjjAD+0`mRc1GHJh z9f>&JVJknv*+W~Zy=ACm+8$1ir-~tvA}1$jSTV5pqL7@M+qE55E7~tt=oLzWu4`ef zTx7Ka$wk9prj=%>DU9R@N`(pxV@MA^&$Dv2+$)kMkIk z-UmgDP5Rphiti8KOIts8)mKJBhH^p7k}bJPtCwxML|s`-Rl2jLzC-%%zPE?C?28-_ zfzC9%dGI2fMi^hDItAyvam7<#E?j9LL`<%RdTt8g(&s=)(V=V0>%Qe4)U8Y^`?>qN zB&Ns-9ExgXm)p;Z zFoz2r)bh$9Gb0+M`=`uqqt;IZ^KT)aUB@%tLez4J$fcZM)h&QF~`&>j9k8SgHYk^aRfq$U2nCjR$~ z;=f<~{@1Ge|4C3JN|o`T1xo%|fY4z;WHT+9xBnq62o4TNe|iZrjsF??!f+v82NVW* zvlaTv_GexXPdt{>5x}yeso7TmvP7kD%U z1%+?P#w3WCZ^_JdF}LQkuy}ZQzRLpPFZmbwkeeDP0%a0g2fr^E+`~WEJ&cY}*XQ^6 zO_~6&D)%o(LeHrz#Ak2hFyvvwHmfr3r{d$|JD4dWD${O=etLfPn6EU1zCN0dJvu(7 zl}qKe+*hbXI|4oajXmMePa1Ks$2%k1Duw<&_yGy*7D^Wv7umrmL`uafMcluJzxBtE zP8F+`n6GsP{Hd)uIKbhq8(_`BINF?K3W(n8Kg<2simIEx`&;kW4$&BYuqFH?o8YWC zD+9fr$vj$GR%QXb9o*z(R$W)O%^t_9qm(c6>3FfBK(oeFF&vw=k+`${+iT8TTYn5L zla>sCYgCjO;GdgyTiwIL`Qmfi9&bvT4EF`?(K)Op!dKe73i1(NW3Gr;&I(#b$Kpd8 zh4pfZoGOH`PQ#`wiychI^hJQ|ras%Ac}!V-3@d#1y3t!^;CR;Dlc6CM)g*bVA6(e9 znsCZAPByBRF)y=UHdRQwgCXeaO~~iU;Nk8*KAOg7@%tOO^XrRG{oNjO3<RGZ2HaZd4+GY)R?r=>XDN# zmZn@Fr`&`TzdsmXVkt#aiAnLsrOU`n-(Mn{P&ObSz%nd!qJl`w>f=WQ?TN_j@C8y@ z+v|W(ooaB1&S1i9nibzzwDaaK**Y=v<@(2yOiK>S{e@ho*%Q--kY52`;ENpN4_bY$ zlk4{9s{E!?$BnJ$t5wxwF!OZwE&yOx?x1jc55oOne2&>FJF?)iw_jssX-gyA)pez< zE#IErSf1bMt5s()^n4~6c$v=UCQxUwxWaG__Z_M#hw&Fo)Vr$FHO0X=a(-EoLs@Yo zp28x<9tjWkE0U$#k_LEmKXeatuRtxGVNK(@UJGfR=Gc7iT8T~j2b=x|UElI?~vB|l(xL(>_4%G-bt?_~SH8M3V zjaIYzb1OG5uM*JAS?rBx)mltZF=@BB+Q>!F0j)blN1NAloq}ANz=+6z4wu2IK%4nC z5^4RD4+=g$m-UhuEC@Ff=p74-49~4s6K+oCKlQY={WhCNO6Ic*NXBB_nK^!byoJ$( zyWRDJgo&Q5T;JmNejCrE8%`BTDk%zwmQ4h-_B|3&^AGUAZ&rri^Cq9-D`;wFgvet5 zhxpdF)%45Z?dIySb{}|!iEMH6f>Sj*jZBE^lSO%Iu#ekOu3%iV^TAwz>*+<_wtzIP zjn)(zVWTeyk14++@$Os0Eva`}zFZQv?T^6|-4;!JiQegw*|@`&R9??|VD-Q(DH4Rc za^q^?CGKeQ?UCS^=0-QO;<9~LA>5{M7I{u0hKQB?>VKtgXqBS$e6!hlM2`(I1&nWvmcl9H*AZfToP~laR5V6Qo6dL3@Z|-Cv=8k)-GfvL?OBsQm=J24D%49>2w-T5o~*P< zwz!^V9ZVMor(9)zr%|ME-B&Bt2tdNNR|wh`l?(Zb*5Bh0VCs;<=0;K>xi#ACypK6u zuAIoITIOdZ*`g+(o!ANV!mVxz?vK0@5P!HuT38_EdQhTC|@I*kJn zm&T`oj=_jzM9ZEeI_gHi?WC1LiA$-1WO=}954~8Yh=QX~KW1knO?IF(b|Tf|(xU^9 zNiSF5PgeL1Z|yF=XlMy%nKtbPSyuC{0@&@T^*vIv&n{{k2st+x z<&eIco^jf#M7lz+J^PT$c6_Qp{+^i6?Lg@Iuu0KUTU#na;LRB2#*Z@ z97wqD{9p6JO{6c~5WWwv?I>mv*89tsQtE2II&ECpCvYk6Ka_t$Ahr>NFsZ$$lz}wf z{=VB{#mxM>#o-c{RC+c1>-+CbOo}UBS1`J7Do4UOh@7vZf4@&)lr|;g^Jc+e!hZ>X zdep3SjxS%)m=#1T1qGt>RN4#Ymhs=q?FI&kqa<)>%o#X{@+SPq!Lh+Wml@d=G?FG{ zutaxF=8&T=Iqr$mR`yG&kC63}9Db(-g+gIH*{%SYDev4z(5sfl>vG2j_j4qL>+&}A z?E2aSkH#N|QLokgX<3IQQ?JEUcDK8^;0R>YRc5Ojp7&${0}H2ksK&T=*5$+Qxn;jl z>jAP^sTLnW8T+0iX))P*&VF|rQ0sEYxv*)rpo&x?l`V!ySqEdNAmF?478F>lN>@^( z55HswWSl?gd-B1>>TU@Ns(k7ZjTDS&7~q03BcVg75$Cuw{7Dy(3V@Y;Vu7QiNaWs; z-D$=eH>L6y&@cZ`E7y@|aia^QbTTEp+~xLsd4dJS-@M_intL!Ck-E^V{<*yHN+LMg z-Rc=-X$WJ~>}*k_HBIMybEKJ$pwvB|1hopQl*qI^@Ooili)Fkunii4F?ogmwqJH@{ zPCVjO?I86_AH2X600|#&Nk0!QXZ1+Z$S$zQQA)a!G&-bO%|dB3;)gpJ>s;KbFYK~K z5F?N<_(f&>euTRVGGNpxB;(;ps=pAif1^qw08n%~G_UUe6Q!6@yJE;PVW^GMKKK(;p%WZe_ z%k@A42i9_{5A~p}Y-lAd+pcms@%-Ec9Eey zAV>WQ`DsIfYCNd`Ug$I|S5fvLDEakK?!5-8nO|w6!J(wfbI)AdU zn0&c66w?A?@naeE`CQ^IAPFsv|JIJg>Ap&OHP; z`&6Q`!eayo5CZEK5pjfR8Njpog-FslBwAn?c>5apQ$zWsU-QC?e^zovfkVS(!yJfHaU>ZH% zwz?QC%$%zDTeIPx-+>M@o8%f)sps>APso=@EpO{;1vSfiU1)Kcz<`7jkZCcQ%lcZ~ zORCrNTfV7Wm(R^e`faHZAj>F=O)=C<$)<6pJzO0O>{sZuWt)wq*L?hPM$FTl!dUv# z+z?5FtqMgaS)0=?b2N>2a>?V8M-9~m@pd;XwxG~t2v?#kme8G)Y^gNqy@`^t2(3yb zM4jb)>MIu^d*PT5dLZZfz`(%$&5)QYsr>?4Iak{%uZh^9z3=r-FtQ6S$LyEkJd%`YGb)CXecitan1)RQBTaA z)f}`lmNjiPqi{>orm^J1$UO@Pcyl7KWW*c2C@vMrm>Apz+@3Zzu^)KQc7$HNMX||Y z9iV23mr~FZ2`lBgv*Eb%1T^29Wob9qR{dmw!6GJOs5SmPln~|Z{gU5QV>Y=d8B^pF z61@&}A&ivgdwn=<3?k5(hsDl#r|r&ELSbAn0nn zX=^V^wuLbUuc*I}XN}M0)GdY>e}mi>02z8%AfH|gbos2{mJ(|1N;2@ULl3{-%a7NF z$})lc$u2-SEE*%T!wtM^_2%#&62(?6(nx^wib2`by0UkRsJ4Gn6JjS^;e!#rtLjv} zr`yAdpssxA)lLJwUmag`USEN4ex1D2#xuZ}8tlF%AVBx^Dbcv}z1Gd1AO}*@UPP@O z`6z@K8hi=8{Hc3e@J)DB=r}Vx2n2UuxS>%>(-&hWUSm3@YWp-cAC-@`qz$BqwTv9C zT6=+e+f@;ZNiiGOVpjX~@3N@l<3{7*IE;f;nlCSj`*jz&sB3zUS3J(9R4~z1?rfrD z!v@EbrdZib`z$XKt3WH(VFX^CTV@ z=1TY#gm~Y3oQ+1p?RvaYmO6`-z6aq(+e`Q0vHyO1B$*sp;A_y{0!%h>{{)_Tqpg;} z(m3JI&u65mmA=+i)EeM>WP!WJ0|<%z7D8(`nG&H5&-MhYR295 z^6Dhp+ZcI?uG5qY3*R-(ZIX&r-~_;_Q{yX)XmN!>3|)UGh#LJB#GP_-tF&7lbT~z9 zxh3Db&2dW$W8@rKF9ex7oSX_vy|7 zS3?oDT)g+W(^IYZ^QSb`Pn*w=1}k>n*8_87b`?w?1$l+MI~{kmS`r2ZAPLcR(Un6L zwW=I(wv}KcFvVqZmBfgQwiB53KQ-8{=FdCrRG)=M9?e%zF^BnP(JJRx!P-q9a1dvb zV1()iq6_I(k;zGQte~^}?x$BEqhnE6@jLUsp*hZjJb%=~Ajpx3THoC8ChH{2Uc-IE z>d1~l${M~L&ON49=4Tv%VYD^Q{EgG+7X#{pAJ28<;C^t@1Q8p&Xy4Sm>s5;G4Ke!}w z+Aa*AdvU{+iw(-`h~9eL~cYY#uNJJ zb@)EwNf$lnCrC`qEQ6Z8)YZ{dHDM(F8}1uVk)r z062|Y+Mx!c_3p3M@m*dcEQSWp57*!#v-Ij!ho8uv9bhs^#%Wioc z7Chum`}?lEJUbMqfmrH-1V*j#o8!eIqr75$r)RQRUL2Hfnj9Ps$W4Kw6 z&<~2QzCPTQZQ8f#?89C#r|`DAjGP#@(xLfUgH1C<+8Mg3o3DgJyE$WFSkxY-Cb7Rx zT5SOF$zrwrd645OZy}s4SoO4`gUUW-1MBc7Ip}+kdJ>r{$~6&(C-N@2+$gra?hD6> zeDr=#%XC78#wW_wkSZE6nKuj>3xUu5VOWV{Jql;*0XgpH8_pM7w7M*Uosn|AmGKoC zUjfgJSdIj0!O?upIfsAz`#OqTt$IsQ=|rX+LaEp3P%LWBCNA5-8g)bAAbPHBZpo<4 ze)-Bw=|s+}u6}%Rq@9BMh{PHq43J(^fWIrFDP4z;UNVad>Ml7hDi9bRG;UX`v8nL4 zpSxkyF!CF$7rrHw=@szdn#y!5!71kD$!64qE)g|WpG{^UA^~=x-i!yK)_BHk8Bk*R zmLs)%hOsoD>99t$jET;*6*j#ygyiG98hRW&<5}Y1Q6=`%SC>e!KqTMU{~^N_G1bG$ zy6khVs6I-3rJL>E*54~ZOC$UKvRgsMP*LzYXqIVidthLdoQcH?D@rlm<2T4fzA)J5nfu$hgr^Ln9Hgy9Q#bGHbb$0|G+=s$Eo0pANwE3@rH zpa;b$fSY|W83qG`@thxy&vWugP7F)U^`T46B3^IE6W=qf`+^kzF~a?*q5%;G#l^;A zfl3^=2M_Z*C1I_<*i@k%N&ic*V?~Lm&a~+K5u729go^5;X`>>4=V2}F`#ukz3 zrGWiMy6YZ`>}xj_{k!LNGx7f#X;;bVB7d8;{;RluKmB-nHN@QUH$H%avcgATnU7`g7l?+SPFz_i z@2zz~V`F3I?);PtghBj0-vr~~x+f+lC-*saN#b7)y-)&;IH51w!*(&G9M|?S)hui< zA~xr%0$WPI#2GC9UP&(v105WSt*pisoNNsFc z8Dl|K}`mfuTMV_#LNKpYB9RxVJQXv-w<=|AR(Buw z2>vr1a;_<()&$Vkf#dAZZla9WGjLjNz+7_MzXi2l{b8zwnY%akb5 z_0W@%tfyNEq7SJT+_01NL~GZlGKa=Yl=mu5*L*JxE6q-m#&OE+q=)g!_6C zV1=0r)=~!Ll9>yU;V6hHho5jcODDWEXb2_sq^!xS_+0obxKmxgkBAVI?Om;1J>9q6 zpFp8(SYIcN#I5i~B^&+s`1f&sf3X0sOlQ4E?c@3*#Nknadf%woy zBH;ZK`n8If&ovV8tqpkm{0MPV)e6m&%Z2*OTs518V29gOemA+qm@(u2m+hlDvfOU2J z{EgY2?L_o?f-jpgpKneU$2=fbrQ;mek3Fvra#Dw!fKSX(-$Yf)`0FA?N;b^@_Ql;Gp zN2?kvIV(>kmpr_P%XILuozHbVJiespW7URAVJIczwPwCk(I)ri3!(fC>Q@^5mq2z$ zu(^pnDtH>tCO<94D>mQSqT6B7ZLjxQv%wa6H_4GPyKTm9?jt}={sHTTO+JU5r$mok zRrbhdIS;7i1kux(zWm`tTucQ?2UsDfZ*~N7?UF=%>`Q^*l9-!SkY_$!Uz(Y#c)8|k zwbig+_D(2UJDvMwHh;n5^T`T6H!Gtlj&basO531xW0pv53qA?2t0m2hoScpA!X8NcBHqiX?6$O_o*O-<^YXTRt z3+(+uS)bdL4QE)OxmjDiARyDkaou3ia#xl7aP7?%fcwS)u1d8)?#)Yd%FfP6%DtD^ z-NQpQ2)i>Jms#(_i!CaCDD(Z}RI{Jj#M&zS<4fmfipfcuy(i$K+I+l*D-({g_pYHH2wbW0sYM)JxZd zjRrQp)_U!_4yN(pY0E`cxi0f=ds|+x+L!u1!+%Xez)(d#T+VlqZg$)*P9{pv>?E^X zE{1(0&=?~TLoAoVX_qykU0>KFwj1X(8c$DMrr!`;Z8{QwY4bE;sh@LlNPmfEc9tehw|WGUh&6k@ZdJH%S^iB(GA$r`ZYlH8uT{nz(ASF}daD+ic+cCJ*B2e~Z(8X)N=) zJ(+sEJ+(NRbEvgxsZhGH(`xcAa%^*(Sn>e53mUuzK!Xd^<&$|$Fz@v*3QWR3e*DQo z-ca>L)c1tT>-I=xVXTqkE|uctl+I@$?$sH_|Q3KdMe5PDe7H2RqC#lA?<|livdJ$-}LE`#AXO(2R<-F<# zwY=Q@@nuzEBmzRDNy)4@ojGzqApw^KRntsicf#97VvKqW#pbc_I_oS^-iuv^E5%9R z%G7+1&bk-^$qt?>baGf%zHq>D0+`vl3v0^vDFmIr>A+ zNi|imTaODB#nin=k1OD^TT$w~J`CRj<;Rc;OqR@6(3%vhfUCuwq~d74H=Af2%sOpu zZr}qDdK@qWM50pdU~0CZRMiZXApgLbOWw~7h1DT?R!_ucSnIS2_AzAfdD>zHl&!7H zknI}jM7d^HaZTe7%5c6KT1(4B!940H;Cq0!g0nr?Ozdmd1K!MTg7=xZ?o9#r-u%tr zHvN*?13n4-HBg5!w$R38aAzSm-^6jBGdrI=dEg=fm?<|~JVIfCJ?ph{j~ay#Y}OUv zB(85h1OB4xu3Dm&PaTs{DUN`KGgqIb#F?7(*rtC}cS~dG``2*Vg$Apk{?5QnVQ-OfZ$`yq zK1fK&B~$ctvTOlJdV``L@8;VcMKEy9(LM~X@ml;mu(Fq(DN#>UT3ooOqg5#+YpA&y z$C_{{0q}a8=Y9Aez;41pcA{2sA2LYeQ|8q$?j;ILp}3Pa`kLRSNWH!{H38Eo{SFYH zy5fn*#`be%T%&3^ujC(Ru*;vkee*%8zDVhUx4>+qH$zI^kc&JhTHr5)Zh|LhAKmi` zxGC2zp#w1zZELL)BOiW7fLWUGlUJhMHL?u1n9Q$7F}A>hiRx9WqD^xty!QQX=yRU5 zrF87g7#ihdHvOo-?>E6xi{!`m6v#ssUjli0qu+#V6fSP;5NV&LS2X*wRjp-20IZp`Xa`<5slEGHp3?2HeZs3 z?m^h5iA(viDf5iM?}a+r*Vc0+8R&)~H%wMvp0@zJS8n@j{FE=a|B*0z!3{aARKC;l zZfC^GH;sGSww(UDax77P zH~pEAEZLxGGAOwzfl_<%Onwz$(@B?jE=&TAG^7HaGGpl-WN2<&^$GheFA4>8I75y+ zK5lz4-C!Q`PF;_SE1nCIr9@cW&q9^mlQU-D+;VH=zh;0M>GWZJjLu=yGTcj?gm;KM zQ<#<>g>LnI2_&xq#AWC~vu2-#?yk#>Mjof#!X!e>m+M;MEX8%D>cL@u!8M$IBPPqw z^=rZfdQJ+F4q~`ZqKBWvydSVd$So_m;GR3(01Pb;?W{bk#C{<;P4|v@nMAxuN zeEgkA=8Q~;pIa+@UUPA~?_@4e>VUyNVue3LWJ7#0;Vu~%QEAmc@^qQX_Vqux| zn#EL0RPwp(R%xIYwO`I%dh3pq;B1a168N=UAKpzcv)eq#0F@_anO0lyvK*mYU&N(v zfm}-0<5w$$t{v_M0yeW6B9z^b08R?E3QbY7(bR2|i@2gA$Dvdnwmhk%A4ar(Lx~kz zo14$F!M23P=GW=(O$g;7gxVTx*+^6#Uwl{^jJ;J=?(UCOM`?{_gCx2FQ3r)yg7Qm_ z+3a3K{!aA~;eL2W35R$LZACHa(%m~?$)uRR)HHX%YPj*XoNWOM^8TS_Po^$bAoNY3 z(9OA~oY&KnyC9qC+Oo$$(+B(CcJdwhAG@l8?QM)x3IlBbt$WgYJM|n18G*3&e4ov1 zuWd5MpH>kr0N%m=*b<^4(|%&h{vhP1=a~~ZaZYC#NQT+8B=Fzo;F9sq4xWjTm@6Z9R_~}KxBb2sLVodiehUNKp z2Q{U0mPn!a^m5pIDzkojw%0A`S@UUm8?oR`+c;i~encZ5EJ|qUsDQk=#_`rsF+&PH zIV11YuTpipJ3;TUa>bFprk5-27xqNE?UTs=2qO7a_Uj_`LF;X%KUpe$pFIx%F#dC{ zS|;heBGCAlA1~B_8|?H+uFg~h?DXy$8$*R62V2|%RH_^~k~<8@QHaMgHp>iPt&Ubg z#WhB>T;^1>HOH%IV8p33g6AAcWMKhfOHnXvVa#)sW zxra6_bnVDv{aA3MHxeUt?u^d zH`Dw+o2gQEP*~%r{dx{5#Fe_wI4;UT)5NrudXs*Z-(Jq&kXpMd(|VOif5Usp<8mdiN5HxgI06@^}8mI8Tf1_giWyRF~f(;mO@uv;vJHWX=BKr(97{selK;vKP= zd=gmzS=f3XkE;V7lM%Epm980p6myD^-{~@%%tP6-%sxvw&LHY~U@f=xDqxL_^V_cA zu%gnt>s>e^+#G88L=a*bg-nHV4wCFoUP(6wjchWdwTr1q2nJbn5iP=-^_9-)LV64f zpg2FciI|(0Sv|+WLyvhV*J9Y|J=q`osN3Q|UuSVbva>?=M7-of(tRR6!iWf(o6pi; zQ4bzlFCQq{xO;4VzaS%xz$%~kxmh!nBsy&WBqFBSaVPT>v+t0fic?D1;ztrGlo4{o zLlHGFYCA>N=^rqkf`4Q>mOj$a6xLM&Oh-AZ5u`%u=>L?fAPsRk-w-d>X{xsE?gX>~ zS|?LRbIuQyaSYd*qcz9qanE&Y`wdRJw%FPj`mt0`CgAvY-d+Z2mU|~z2>Zc?I_VRJ zgW!GQO%AgenHn8y#qC&%L9)lIKGGnq&qnAbELfL)Ly7FB;82$56-;3t$tV(0`8aqi zr^ATK!2A(yrBgkAZkkoh09dD$R#tK`Dhv6}!nD;9T_i$ilVl9Z<>MfF%-$aU{ZZR1 z)Ki6Msv%WzD4Q^PJ2mdRaeL9(jIJiTRRK$IA;xs6W^9?oU74(C;2hy6#mn{O4?`J!^ik%?Gt=|~Y-?b_YAUoiM^gH9})zeMK z()w9t{vqb9uo0N%?z8c$B!ZR)>mlGfH`GpU|K$Z zZSD5z-U(cc2Mpd#Jrx#(c*T89B1gCUml9+2 z>F+-?AeS&yWHq<9>UK1x88zyUmUVS?1(#`aX*Jlsxqp1TtTya{JD9Jbo?l#41}0>| zlUW9&b9gtj{|u+ZR?>hLMp7CI6(Ap3pcnzO(bo31I0_MGu1b-TLu3+p45?r~&=O7n zRn2~11RgM{gmc_mR1-(5ECGPlKNr?@aZiq0+nyq!6#GsW%rRvk;@{3)Q(vDC=Dnf^&D>cgX?{fOcRnbfLb{?;sCg- zAbLxcYB##(b+yL|6eetK9+wipaBhKI+79H!KgRQg&ah^Ksv2e?O3A4F&Q75^v0m?p z=4To*ibRHM^2F+Gm)(WY8cKj(Dl=lxfgAqcR`dQCIG0=V84>l_Jb@u_D)Z5zpZ~>< zQ>X$lzx&;{gJzC3r`L(47PlCkLvW66%WWYo2AkIl=E3Bnn+bs!ASO&q`yUEk1<=w7 zIRi870nIMfqHQgnO5HR|qE`d|))YG65cq0wdb7z8b|3>(gfL`jn^(sfH6K=uAWcy1 z0tFSX2W~AklYU2GetoYsvEQ|Sf9Z9p3!6+ex^$tQGco;GQnaI(`w_#@$!YTxFf`=> z@{(eeQQz!k*xzL84dwArYxvzpzhExb5er@UBfQP%}+gZHNx z;v$<=qb3^UnYEg_Lm2(^q2Ve}h`1EH0%2*aW*96jH9jmh0CdoG(%z2wLbE<_XH+|L zM@+`~@FvHf`;w3|wKXIrcQQ|UBItb6{P&u$vnW9$A*ZDbpbKv}0wq>H3BQ-}_wKJ2 zhdWWV&I1&VzwO3665xVl0eC@UmB64gyWHYk1mruwr|*vclgG+62nx;v5UdOmeVVFG zz+h6zg<6Xu)e>BGi%D$HhohuqOX5&Ami;lq!427Tn`A|Waj%-!#23)NREv{WXq$S| zXI#L=-BFPQ7luHT(*M7S!ODgM71!~FwJ&enT~ z?_##+s*Ig4O$$|Fu@HrTVdNrUdIRv`p4IB)el%RDUsm6p0U;u0)g8_#!)=>}-43&IGw7Q71P-!!@VOq>lC)L$7UTX7-DZ`pBQAOd}7p7Fq z7CV|OQ>lW&p;^mB7z#;61(8OFY(j~utBTnU0hWUO0|ff9v_&^?>Y0IGC8t~}dlC{Z z(_qAD^cx1;^W~MSZx=p15s0UXaDM08E*7>$W5z!4aDzb$$#GM?7JzvNo_J?a%0sG6 zr}D~ofS80VL~$RKFBIy-@YgH%2Lp>)rXfi=&EhJUwfXsqOaK?I$t?4sGbs9GsU2RN zu+>Cokk2x4h!7Nf$HuHK0%T2jI;^Y+tat?8yDqo1db^lUqL^8NR9On%LEC7gif4VS zaKhvMod1yl`BhHE40@*I^Yj!U-cz+4eM+r)^&0}gp9>h-wz?;ihw_{P@Y?-Xu9G;4 zr^x!1C!j4eg&Zg%F;O7(T8Os?^7iQ4#B5j`H3ni>@X3<9RGM1#{;>9bX+kkA9tD$Q zR|A4ZGQ{fQT}Nr?`HfdtF!J{&9M32 z$u}n%K4K0id2`)XuLp7};wtdHq8KV*R+XoG;8m>l5f>+E*% zP|FsR%IE`NtLtnjV~(=XpW+A?s#T`6!=DdrM6?@?tkG6D_F}QHaRV|b^9@G#$isnR zyl}=aJlRNz60T1;@QJALqqY`1pkJwTI>l2glv9zs<*RNWE9Og4FjCWa5rvDA=QPW3P#{bCzj`_FJ4bY27q_4ZbwhHssj%mkC`V(osn z0wl>zvzFt<3oTyuTTyRJ8xxwf(X+{=lM;?**7XoS2=gb%7qss6pEmg@rqnxre> zj$UVtlTr4bVULvAH&H{gC!URX$g5 zyXsUIMb}@{8BkIwDe{n`r^=KHI=U@efF!+8Xe>`LRf%3}s5h2=Do(LFjJo>yK;v6n z?5aiZu;aM`O5|=L>7q#450@!7ktjhA4Mkz=t`J;Gqt7q4hMFL@Hy%_ZnqUk zERf4-ajX{K(*|+$)zx!KhNZrshwSIjPjjVR87btdM{HvhL}@jy5z&n_s$uUX=M*<7 zZ%wB1BnR6SYEh6v&IrIH%lfRgK;9aT1?kh2F{8t#PP@18TifIdaag}sI)9(w;Q?Xp zEJUqSo+WwNV0k;ZP(*=>TWvlkXA=r-qVf8hm`Dh(5@CRDsYsRbP?|9v%_MSejUI#M z5v3PW8qPg7n!IK6g2I_aA6~v}#wY0DEYLOhYPQsRN3T^oK*wtuuBWd=YXQhZYo{fz z%i4ku5i|A&6jM~BYQdL1pt9gj<^0@a)oH;Q%~)r=r1Xtwt3a#H%jd4rGX74sdB^7! zMsksrq@&4v?%%g%A+IS{)kB(RKwwiv>5g3f8w`K^e+dj9VLsOv#))BC+X_NJn*KwE z6CzAJoUf^(5ZBH5KUKw^TjnWb;?)N;=OP5SF|*-beg*7lDGo3Ik7XN^l_Ad!NsmhtS1jeo`d8~tX$X`s<$7tb zv;M!ia9!BnT)2+aVNbwDCk%XzL*>81!bSDcwQ+r&af_zlLh-g~kkQAaq0`V7CqX5a z{MzMmve6K!u)y!G(vJ)a3IVEFV}?~c5o)7njGB4loJ65UhQxSlNSGGacDduynilCg zp7P-vr=~knrnf&zgnZy|#(o~W-}=$PP&$Qli-)1tsyK#moWwBN2?xz9FJ7l3pW#f& z{%t%o^K&9zxsKdJ@?oZR`YrVUOIcoptG4oW`fu%Xp@sTaMIxiQ;+WM)O@r{Lt`ia0OfdkSeQgl&=O`L*_;QMWmg znLd{PZtzH7;v>@uXtLP?z4%I%bjRQpSv zGkc@fn^046q9+o3e0(%*AV_ez!bnpTBM4-ZDKzq4?4Hg@GG$3Fo%t=^6Y@W0vCfwS z6sEj@miu;oiSG4C@}*8TA9YaonHtNcjpM?Yz-7>|G!V=&fFHCLeJ)90iT2WVUv^NZ;Dp0}f6(AUC}`YzUwz6iP)2QNoT? z(wPCQ9X+&KO`px@nk38D`}CJEai_}lv$dYw3IaS$4{<(k%)~ICRJ{q-0k(%+q)$7g z;eHWvS9V$gdimTHh!XHv{KA8eJt3$SN{H(T#6q6+x9)$b@jNyiyJD-FCAmYrg)$m3 z=v#KE1qL5(#}-Z%#-2~SJ4iJT$$i=?t@Me9n#DxXTpc7w+7&L8j(SxH;;uqfa{e>K zqBn1i2X(O|A*-ooo4yEpUI=xhOC~W!Uw@U@l%qM)LGScZ=2j-vAxmUlDz<#59WV_q z&Vx*=g7$8*xN865PP^9k_4y8lVL2=!_7J{E1({?Fvp7S%WuQUNmx!4T9K!`n6ILH| z-m7J#m{(>5SOt~%)kpRf>s0)^Jbl1GmE>nY=mW%Yj}Zr0)2Cx z?!x9Wy<7T_n)_|4N>SSK-rM-;7!iU2NJQO+G`(Cbn5Ay0h_R{lN67h!2^!J*He?wh z{_|f>w~+7s_orC$YS|}}-FlPPjtXZJ7lczFv5b0-3YBXtN%%xo{x`Wc_~ptGEX{=8vx_VQREJ&PLk2;td176>%H9!;-i z0xYYHn%*Fc{!lf5B%aZcbgsrRG8|E*OEM!JuWJ4=AO;?+X_f8aKo4fj#m@w-IQfKa| zQCQzBu<2$&`qR6#cZ_C7Z*2ZXxn%(5_Na-`1;t)c3bT7*B6{e9 zs$hU)-HVZa&~ttJ)?UkHG@1$CHI_nipP^Ltv3MknuD8T{X@FlCS<-iSG;g0N%d2!Tu9aQ9NS` z0tf)F6n%(|lX%k^(nSZ$4Sqb8T}wq6^y6MR5`&NhpaxVNmpv9@4-xWoi%bnvh6zqD z_JbMAg$Z%G8m^Qb)KPR&;p~w$6PLEO#McL0t)hu9uA}kXVbR=2DovEiKe(zsUXwyW zgF!&;n{Bi^#j96!XSUoHOt9S?-sD3!Xo3>)j@~m?~E%5&{vXEcDChbe`fq;ww zb<+8@vXVveE2A%`{odQEs;UG(Mn4Il3CVT6K4S(Un|K5%Y%KI7_K_YbTH-2|LKcV3 zdM>4`-rqCZh=Js0e&5H~E6jR81@bAb(okf7zENJjiD!~6%v0|x^i~jO`rZ&pnGNqSK%*5oS%1d08W=AgDJ(hsG1olKIWNyJL zZudj41~KUr6Cn1W)N0`+ozc8FOsK(pi=t_NfgzF0aK3TZi^g(3b0h?#x*+*H_xoqM ztvJVyaH8a{FaileLc$80btyc?_Xu;%?#Z-!gE%)JQy=#pqL#muLk@=6cWfZj->q9IND|)KF zIc3v}Y1l&LiAh#{xxe37fA(x~Lh%;qUk9f#b4sMk^^ch)6KYqBMbq=omE`-|=jIYc za0XvOEaqIXY=i)-hbw;1v>~`ztcgGNN?%&XK3wJP5 z&5#6|R(m{7n`fSSP(s)#sS?bjvEgowJaLsNT-EzI980xWXf0SUQJur}(tJgHEev>d zY$U}x?U(90syI~ET|K5Xf-Dyd0y*pRctDhSjy6=mD>?C(HY*`B@wh&Ott%m=R7=@yw43U zN`4E1+v?5-d&eb>TI<3t!DGsW*lqPK_JNw_E}MF7Tn=MqSU9+?tzg!Xf$qjP@=gZ_ zBt+G&{!;46z~5k*L^(k-ZF1`u3WOSt;-6oX0u|@lxCl`@ORMc;Ss1thAufxPT#!mx zUVgiSe_M$=IFK#&V_udeq&IlC$?D|r}ybJ!aYVTy%y`# zImFfmXn0>U9-Z8Wrw!jD7b6#~1672rnV%l%yBeQz3|9r=UG!B#d~~1=`$i`%WgAKX z!rdsK-?-xi2FF+9BralcaO0sW^9O;pw9+&FAFP6MxQ|$3GuC=KyjDnEFOnlS#&_$P zC!J~5O@iTi-X<}GUn>f0_&0f)45%-c1_!EM;+&W z?`|o*IwgAgfmB$5p};93s8XM1yEKNUQ7>(cIZJ+o*V%2pZAQKHmIAiX7~-NxH4P;VE@W9aHObe;i|n8cnIaN= zm-X;y@3cA)9b9L(|E3xTrv`)^9`gd^a zPorVwX7%)inzbR=3k3CsdkwG+L?!nvkXs}9xMx+w7u+uUA9?IsKNQEOZp4x@QHO6^5z@9d;9;9; zw>G3#|9isMt{V=iT4|Vg*Ij1IJ#T-9h+qk$y$O&y1CZn3+!N&H*(V?`@6mE!J(Uo5 z-{jLqOHSUe>K7-X=$ydQu5xa2v8&MQma4iE_$bgP@NMND3TNAS5qO@W*z5_96tDU~ zNx^0TNVCiKmWF2UicznAwD|@{`$sHq1`BUW9+MRj(PqW5K zO7en3Ft}%)t7_vvp8Pjab*GUSO^EZ2A_>nrvkxqixoa*wLr)CRbRy4u-MvD?*r9Wy zJ#k)I{$q|^gAV%3zRmI8g=SP+ z9H6@X4XYlX5`84SP$B@G$vfVIT)+)3(lJm)TI=zb-Ka#H(MQZljEYpoQ)wJz;!&^X z7-@hn>Cnn5WUZfjW4usp$=pkpq|6Cl*C1A@wpK~oBrB3}adCR1xh_K+65gC?2hqD_ zg*<#yLz_6653Za}gL88lQ$N%*+g%y!-;(O9S?2A~bVcxRcA@`@Q%8N@EuA0(hv+Px zaDmNff5(kV^NUmOAx>nK+~A|RdgBdu8r@0>pGzxG}=uP4Ro1!CMx@tDP9(c2$MJoy;cS$FWHCQPAJ(bRHXA*tn= z08~p>?nw@cgC}`k{7hGwkRn1LHih5T1U1eJlA?!DeGj`xvp#E-GINj6 zYG=WnvdGB|yxr&t1lYA7YD?0pq`@RA5+-Q7iZ!=+nPlq}?59dE-GD}-M6Q`xZ8$cS z!l&!7m&^UT_g4)v9sPVki{?{lxQ@(5eG}=aWvFl0ye5V28*^`xjj=@a_=WkOwUS~+ zUzA5?|2VX(u}g`vVYqVx#Jqmbr=*~#k9RT96ia$`xg4TQqwU5EY^KUSEK9HQg%w1* zS?&wuWXiU8y~Ks3z7=)XojHfG%~2v(u*{T8t{?Du z+Z}M#z(U-NB3JX+UGBIoBPc+({I1J|1Y;SoDAG_f#bPlYB_jKWo_A|wfmN@ zz+@JAf65B8hg!pf7J^dk`yq3bUrmPyujUP(>yd&{HN@(7HfS=XnANmg*CvL!I)z0g;#qDTeD*43 zZ>Bk!7F~5NB=wZw?bF)SfFt+uBE49gE$=#@5lRa#WIW|VQ;9d)IG5LJ39>)D!PPv_ zfQ~UoIsvtdCzzz$&St9B!(*^mdo7m-IgQ2?~)G|ve-!9N1kSJy9PEjCsTR_qTqnUOc%vHwfoiRh^p$>nVF!*#X z%^>u&s7Fa4S()2&jC_7e{nMr2d=}z4@8E5$Ru{VKzp}{exEnv+l*_}krJRx@A8ztx zhsJTyG4Iy)n=mmfo(w>^wZ{2~R7j5Q$&NGY0Qnb^ztlo7byaN_rRgZH(P#`yt5qe; zmJa95k%YD61&gLRDfJx0fj1v(0Fpna?EyPZ#JzgQ@!=@}XGv`Gmq!2a6i{KzQ}ZKx z@l(Q*5l(eBfJNX`;shw}UH!4X77q?)b^HjE9 zqHEXkGNunreL*uAxz*g7jka`+6AHZvtZ7)|_2myi0iWIcS{bg0R&WQ*_KPi$O;atQ zgMj)+NFHQ>(9wnHyL~|ZBj8}Sz47mZFsY}Oefc+oW9ekasG_6s7xC>Rmb)jG!X`73 zrlj*;-92V1j8F0GxQy5_=?AV8InChqvCTzbj8XMmDqNFN|Yp1AsOxjW8P2 z{Y`mHwTP=W!RRuLXYM_u&2%45Ns!JN$?^rMljSR0^$JMB5VTl_pBoIkRci_UP!IzM7H$z3a@;E+s6t`QY#F8O-fn3Bvz=ce9FPgZ;thD-~7}5t^O%PzZd)%9pk1X$f z`G-Bokc!@Vlm&1=*YKhdD^JjZm zV3eRY?o>^g+YQx{{*-W5iTo7_1v=_PgVn9&;fMSEJ*od)_u%73`=?qLYI}nUSiC`D zyqJw3rclsuJd%XjXKDBG1SSh$P)uy=h|%wf3grB_!EZ8Al-cBZeI$v%mg9IF@?(b) zR+oC7QhE=QT4`lU6dL|y-GO>mUB}h~AzvjQCH{g1Q59=7*SG`0Vl~Uz&p?MnnXm{p zw88OsaFS1ql5I_c8>2*&R%tcsB*enalA(spT)Z<;!YX0pQ>%AdgSHaUth&DwvR>?C zw>Oab42Hx3QzPXB^@Yau~WM>c9**(s!)e+c1Dv)$I@(qc1HD z`NRq|qb^;wB*rN3vl&a?qJA0q(B-j6ml@DTBGi~8zh3lmt{R;H`(56sk(_+*J2S)0 zVf~;D1pEWjpqvvPWcm9@zja7N6V3VtZasXnuS{Ynwy0gj8XBwfu%%%tsT&iv8X9B6 zscpDkxZNj)(_X+s*mkJn*AnEcv>7g~Agkx#=IOcbpbIg$-1!)bqUE&p_Q{^i!J8jF z1*t?>!x>i3u>x(kSyEtwvHY!q-DoegHb&~n$BOs6V#H2}`V>O5XW>bPi8ZYnB_Ufq zj|XSNN)QAbjC7%`^ug_Oi5upwKFWIeqX#2U^u5P^afC|5HL$0x-0=!sduq!zf!B3_ zR76?L$|(^~(GYa&>Q;2Rp2LLPIZsx&3N0ELP5L`SD`_;u^V&Ju9FlL{U6(K@5I1Yo zIFE!wy<;vMKr1$jtM{)B?|Q$-i>h;;wie?9yR$P$zYiu=EGK>{Slzg4;F@KT`FzQi zV4S0oLhbJOc-|?d!C^CKAGmx$to>K(JW5 zYzLn)kcG0>;I^Fl8ZAWfU@HJbFiuxgcU&OWh+f_MMd);&y>K%GPYD) z8pAE>86l^6s5x{~6ELGWkN&<;iDGl#A|Df`#v{E_!u<(S_P%0cG%GBo)@_(Yac{(| zFcY)jCk8D*NYr+ZT~g&xWg&*oW)^l53qxE($m7(v1OXsRVzF*r<1j1YzB@!KKj)Vn zxF6Dj!0l%R=xN$R1>ND+!5c)5Y`UmI`3K3Wtfgw!N^)Lg+L-05)9oAYEiOBk!2H&x zrip&|mre~{ErpswtTV;RwLx>F(bV_u%}Q(cUrF2@WV@v_E?FQ>XWQ!I?o7}&nq9X) zxGDM_*m$1%n$0zM@;!&zKg^e_jK@3$45_NV9g*A@L&i=}c2k_!4%j zw*9WcWI~FCOrfF`%=Q?`=V>+b0^U8JBlQ`FwU1r~7L9UC@uxv-OK?BTp0ZiDLW=y2 z*S~EAc>TQXYIS#boKub1^{RVG67Ag#P=41O(EJ_{^!ef?Qp-+~k&uv}tlWB)xxdGZ z{qJaws-sqvE|B#GNTKOu8>(pl|NqOU1P+W5${ByA2QR*sPX6U7x+(ZS)am~oBqUK? zw0-RtOpGw}d^|T8@+kS?SSB3*s@WxELBLO0UI|tp0Pla!eDwEuM3KACEq`|)@%A)t zV*US>hyVMPhbJ5$fB@Rn><0)HyfJ7o80>LVDWx*<)!e-0Rw5jLa}3QIXoMSTCYQ?3 z?Rq$!^(Qq8Yak*HORhfhIe)o#QVQxv9CbMfc{hD5Abk?HR9@`MjApeJH*2%ch z=+ol>B0ky(~Bo^GnN`1|GV`vqMHF@G*=|HIs^udyn zg=@G`$rnM*)!HaYBCmouw9&!FN9*xVn694jIEAp9&%Om(SXueB0YK(DS~fl?L7qH@ zQ_D!FQ+}}Ke3MP5eDz9(7M)=s%^YGE!U{ej`v*WIjaKs%mxk}DiJ#&#oA#M0rbPu0 z^Huqw1D*Hmi|`M$A9rg<4ZgR!L<0BFsME(z#(Kn1sRGD-TIk-AHK&zq_Az}(u9C#f6;+~fhZakM$Kmg z1i3)p$NX_a2DAq-Vu1mXHCrUwAC)L#VZL!ol_Faz`9tdazCz=WCReAS9!y@-%WJ$> z9_EuZfse6h_#f69kFVI!fCfBs8aquwJ@G-cu%8Ap-5e2 zfC;Xs7lg5!`((U7cW>dV??)*k+a!6X8co;;*d1gvm{5dgGbrVOD!b=>@((ax%8)`- zUpux`(|3x`nwQ(=IUK8uy1d{e*7|TM28nq`hXEj)>vnxOTYnz_cedANHr8O} zstQ_+YNx;hd-t#Jc?{?72lbCCfWu>PZ*PDU$q)nLRmp>+2_A>0JB%P5+-j`}Uq12Z z2*i*t|ImL?U;EGMYD9x)t?&zON>IJ>X>CDAu}=O;y)E3%nhf8Y0NF{ zJp*QAV(B!7$I#zp{<`F?>20uf9%{RufZj==s|Z1&5jdG7V9RRgXm~|G-jjpyRG+PV zN~_l7HNiqiu^!5KzB3nFJO(`Vjs)*IK@)5^vEDxSO{8cPgAiPvMm}6OV-lA;?`Tj) z0C<@U4|_n~vhy-j7ShsZ)c`;;X!{Yl z28~5xI2j{*yC+WE-&RUO3>W$KC=OP7A^K4;W>_%yf`+rB0AUZYB+%IJuPH;yisnN% z6)Tr}ZU?OxU9*Y;v&Q>$UI;*7zo~U6Tiu8F2a&za78!!qWlI}uMAg|(u0+HqSS-rp z+B)8y$eYUIVecwL_+POk-v`hdmE;Ia8jZ6T7F40in@irBP1A+B1-z+%!4sa$a7~5c zPX=Fk0tz{8w+`%)gu%;ZZ6AGUd%KrT27+3(!Ql|Ra&|k6uMJPWEmasDV@)^c2Ls2^bFuK@jKCG6gMDbD?Qye;?jIHTPsd|H zli{PzA1i-@VK>?T`?_TNSA>x9BNbU0@l_+lTO$BhbvKUaP(WDijn*%HT=D~SyGH6NO_ckjlNo{^&I%1sC@3f3OjqYjUm&4H zgutYHeRrk;M6IYDp$}8VUCwA~k&l0(Rz4MtLiyy!9p(9@ElrEiTnwR(1JU&xXe3DC zgGmGZ-p^l;L73AYe7@MknR-IY?sW5FtWYsJ93Fcs&t0(a6x|A>)GE}duve!w1vkxS zJHufOaHnbUJwk&uZQGxuuA%(;p!4x|%8!pW3ZissG{Kn2DnzUqooF>;_8N~z&6x6yP6{tU zQ*0=l8XOqE$Tb4VtBq z`BZ}^r~TGz;8!p}&#dJmfdY~_^jxl+yd$(vJ*=2yZ@)8`c*=qEyH~KmLob!RqC7;yq)&L3# zQ5*avU(hgFP&on&EWyzb;wp(y`ORj!1v;1Gm3j?(m9EI+GVS)iN#)((o~U(ZeH^#C zydF+3rj(9zsGBTp`zpvs(t*@!CuA~xK%TRTc3H15qS~FR{!@vDcN%EDz zT}hVFUT?rFnruFZIOthL&>hHf1-5>Eeu(Z3V1=d&!AESVT>B%HFM9b8Qh9_*T^y(h z?Ah#S%pr7iRitUJOB=(}IF<)PAeOxr;sA@IHNJQ(odTMWc1NJeY$KkcF0cZNmNWn} zQWCFYUeVW=B1bY)mCxJ046G z^8aq{Z%vCun}y!)FS7A6G+?rHMdn%Mep=(8`5Hv8GPTH46vYmGSut{~Tr^DxtoOG~ z_!$TU%Kd4Nh2dz#_!r2G9tTjKbpK@4p;gWrh8!jbb)hym#MvltTmK-dkg2PJx5L94 zVlo6O1GFX-`6>%;PtijC&S8)dXqEQ|HPNi&t`*UI?*BWr0mpmZ6MObUC*)mBeDqYU zJ@7&NaeJKhju7)7x&y$IX+yQNQ?TX(g(xv$&U3MzgGHMl-854zgU6#ZHsN&~VruQ- zhvf}tH3YncM<5L>R;(tOwft2dDAsId#k2T;;Dbx^YPvvZ6n3v=UsBlC*B6mV5b=-g z{m>W*X@|F032bfGZqzZN5%OAp83CUgt)%5{JZxcaXyj_p>Qxyw+r@F!Ng$x1+p8pJ zYpf*eI){n{1$l?SQ{!lq%mHz!$+@}61@};`gwB%iJ*`Gog9?*7%$Wto+AI34U2W7{E5yV_r>oCc{(six^7wS>KoT!(h%ByYQnr@Lso7~;z1?K)~6!a z`%rU9Y+4~w&a1=va(rpn#{>gPwtR21UWgWXluPN%w8!;lCaAHtg?|WlM{9fsgQuRT z&Cg;o_X3J$LhJ)GCqBlqY2AWEV*QgMX`7q~KJ?g$*=)3cA(Ck*WJ6M92{7o8A?2b|TZacI;~icB6RV202xg5x(8ZLU7ASoG%$fhW>-xO4Vc}v6 zqav9o=_GwWrsXGu@}9cM1S1CrKeQm6?$$=BUIkDoU=hCg{4!G^$WW+Y7F0kt$9HF* z#l!r|Uch!$K;aWKrIHURgv!JvX@cNaga!a|O80x4zSmShK_>Z?buK5`^4d;|(|L_1 zl#oTxs6LL_=tu#}{)_C@38nD7ag{?_Apkn$uRd-%mho2_D^5=PIPm`l{fnKmLb|jJ z)hi6q?MS2m?Y154ahE?)Bp2NiZODJ`W;!&ArOdu0cmq~xtXZFg$B@}zIb{UU+)kwP ze=Jl6nm#=31#EhaDxz=AheF(9mQyujvy&%;!_gS9MX?Grg7LOP{`aE&mJ;#eQBmiWpFW?UeHqj3-u=`+{D3*@$Rnnbs&Y!&o=trgLkRUqTAM^X7YB1fG zXAs+xU}=8r=?L*8{`gm*eNT6>vjeqE64NPum*{K*E|i$!UDa4?iniWo+k_o`0qFDG z?WI8bjzvR9m&zcN8APmS6n%VmdsTs8<%pYV`K{DLNEG z7Aj4KUUz6VIIGK@?MzLQJ(h*DQp&K@xw1KVjRl@g6f;0b9BGm`&0P!4d}`QM>S>9p zmzDb)?hlS)SggA-nN5C{uLM9hyXde3!mecoQ0n{rn_lS%?0v_nyp7}uc%{bclb@T| z_RnXt_vc~dI(x=0X5mpbejJ8wxPL*2P(_!cRjW(|*r6Sro`iy3B;p1Pjyw==F3ht-{8KuWkPw^Na|+`nNQvtJa4&C5IUz!pX@XvmgiJDICz zC{uNCk66U!Ln2I4#HJZvI%>c{dwv-YJAV#WykxjO6|waX_I9t#!+sjW1-yRcf^+xi7H$MNH=tczuxLQa{di z4Og=I@4wSOD$u+|{qc###VinHi`pv6H{qE8FigslP9CuOfY4=UiExcU7vL$lGYKv( zQ?NnFF2f#N!frGgCGXuTe$5s?$iHEcEq3hfP+W;V!)XdXjs=hYOrcHY(Eq~O9wQ3e zYlh%H`zvJhdG#cFY1&SzrEq<=tLAij z#R3c8oc$v?{avGSscuBHq6@%QAKf1H(i{I?rxomLU51%HHuwSNDTJ6^r=J2o0|FKn zHkV^90&MD7+tCRCcT@zh-cP-#mbLk1c0tpH1L_}bj^mjXF-e};becXSPZ_nFYSh{& zD|Ct9f_sL?!9fDvY8Ww0LRMH@cBW}^gbwj}1{%v6)ITqwZG9d2zK0luXv<~Sp zD6rQpO(lOt&_1A#0hH7tzKY+lDr#yYz~2JS7z6K3OnQwd^lCERe*HXM zZ6OU}l(eUma+Vw(t|WXfp@vk71oh*X?33c2u-NS%ruznCjQ|DU=AU6fDJIcoNa$RZ z;CCl`b6hN|Gv2N%IP5VTDMdL?NJEMzne zuM+-R>Xd!-A1`%6oIfmeRyF_0AkBQG3lRC}|HHLT_evR2YEB+@9(Om3rh0yFb~V=z zOqtbEpgtfLK`QdCzdy9uVy-S448@89JL_`;0|W6G8eICYurP%N2P-_zj}&Ip6@k6r zvo?Oj&F<=KQ-oUSq6AYefP+5=e02(g@`eKcyBE8260EGO3N1_9aIYnnzeS{fTwD|| z9;qYi48;fXDfQXet>GjME()8qx5nbi2L~H#@BH<&K@~bD3lA{+yIqApS#q!ulYk4D zLPxOI{aeMau&)#b4t5AUXgtUm&FNiq2{zk)NN~ope>69QbK>M>qR;0s`)+n6gtvZ8 zwnLe9_-_O<}g112*Akzi*PzYE#sY?ecVmp7c?I(B3U3l}Up z&J!J7o#D5{VCZqX-+9%YZ)DEEhdn~l@bIG>3Q!lkIz2NS_u89nN?-F?|D7hb>X(8v zQF?v6^}mkpM+^Qly8lRS+VTG_b{`Siz4P%Z7_R6r-ohp|ah7*wD!YdlqSI^;M#f`Z zyG=nB4I^w{cLd!0ydB6zjlU1Nt||du8jSt|nl+ z|6=s7MXn8R#}4X#_OG{0EN_jOEEQq2SeZBH?h7=suag;I z3uH?uJi*4POlMi?A0_`JWM|NO<$Se+3+8H* zX>st`3NpJw@rN#L)*bOZ@awY;$RAcx31*wY8&W|^)PA=)5L3RYp;u}6WVb&n1(L$$ z)^;3|i9-2-?3YB)-CGmxGG7AGWIIddOO(}Xtrh!`rDe3yD$U2dP>5#5(#24+B>~L> zjE$q}X*N9^>pjttZ4Z-9w4 zg}RTFnqqvO`tNIh$n|_>BDdWgj|5*JL`)_MvL3JY4)v*&tGqVuo~oLQeOIjB1;j%d z4>yo`)JgY6h||rnNU-QDd>4CT^p%wK$;-Fj%yt$(C13Z?^KeC*}`@k0=LQTG;ff%j$`dzV3BEUH4Tmhhsv_cI4m=%vjw zJ{TjziPduf=o&syZU_o5)&N_g<2hu_9`IrT95<-8H+%DlW@>u;+OrB* zS_*SntDbWB#1Q5u?|P8ab-dxkT??W;)BeKUm4vl`Q~e-9v(Zfw%vh$y(8kH92?vhS zw#zjq;S*tZgCy1)JdJgdE}8@u%=>{oQAN11$EN)sLhte=9%ET9vbHz9y5M~X zS7G6fF58c$G9}10>eC7sk|?1WX+-w+klPdT;kI1v@1Tu`8gR*^&D*`8f2rA}H~QmP zk;`|ZdzESmPZ+pSw#J%V)j(|ygMiP<>j;?nmOGjUYme7e6rQnLehR{(6*L<0xob~L zW;T@3LO0;JP#?mMV>#9Klq*!lbUHo41anYw_6cyO+my>(Z1jKJ>=oHA4+bW8H)n7M z3IQ8)BO3A*OmOFa%G zzjdQgDVDvcH_>Wv_`VJg8Nler?Fii9%0!ePTWlayA!0e_)bIP`xqbZL<<9YhC{pW= z9vKSnrMN|C1E~#a1HoVsq7OmO;-vCJmBnjaB>E$L{jCEyB#3W#}33~>V&PZJX3&v%PEz6M}T6>+sW2=;q>u-a*;kSZGvD=PrJ9$PY3Kwj)Uv@|?a5QS$*y(0uoy1E&eEnW{RlNEwXQA--* zsZ+motc;tI%;P+uDvw=DA>=1a@L5yDk?Fz<#yZFsrlNhn{mc;&y??Vko3h zPmX|Gny3z9*;iU1!y{;$4^4X=D_58!@jZs~m+QM_5z!t7j_L368Ig`brzhyiyuJth z_}YW053y?$B)0U8hbME!*wzrlLI&*v@aA?MFI~ z4L%|k@CD#r+4NCxe$=MN1W7z_7{21br+M+BLKA|Ck>RzW_n5)z{>b{Ei}FgvmxO>< z1#Hte<0yJ9B9nhHMn}^TRxIVv9!Z*?J@u1d>1j3JobFq}H;|Ng*E2 zC`rb6u?9vK?M#JvW=ud$BC}j}Ri+kZL`vr_WZ~SP{VRm_JnMJ3miBwog-AzMlh#iZ ziKmI@;gENTvYLXi`hthOy(vlKpP{MDh>fxVOc!2Ao3_qzo0VrI*uvWxJ?542-5+;* z5XI4|GINI>Zg4Eqi!$D;$_b;Hs$FL7#r@HuU5lUfW{99QEZHAOSOT`u+b7Z1l8($))dtiU!Bp+ueN>(GYj+ko;-H+tJW@fzO#RM9(O zbxoUOL1Lilf5eGCeGzg^+zm`(v!}dCKl~Q*)$Xc-Q~LyXOJv z&huE@_=9wB_Rp~GT(yQ5Kkw3yWyCRLYy2}nx^xkvR&6l?95j==8A}Qc?ECgx6}Syr zHKu4CAvQuOjI&Jad`K1OrB3~LZtG8CzRPEoQInS+RU}dAi_0Z#8(khnyWC9KtR1Cb z;i@)fzx~>U0U@(r*wdmPa=!0fOR$nJUFzoM9Bsq+V@|dt#hbC^FQWUCR08({(akpc zo9K=U_$Q(}z)bKr&TUoj*)P{_n7o$s8L^;?OU(a6-dhIMwYKY;5H!IiL4!j`a1sIp z4X(l6Jp^}mcZ=XI!QI{6Jp_WgyKBF!to8NY=WOf#ajL8OKQ#-OV~+Wb`?;R$9w*}F zo*xc<;pm`gO^-%!{Cm6@qyhz`>c4-z&eKkKJ|x-4wO)RM#HZK))6Dib^5|p=L6Ib| z#zYCGW{xTC2e7vXitGyfJV!s1(B6J%{qpVA$3vgqAEI(Kv@@7?KJ_^ChRWPv{hJq` z#e5m}9cL)+%g$n|OAp@q z(yN{N6^Gi{Iu(d8$9{+o?tsORMwZY(9`Q+FyT5d?#y7b~t$xL$&9yuUr91T{fC-8> zU`k6MGTiJXhKh`x174S}&V#{_*6P6mOg$&t)>1|{J9LOtqLS(wv^cSq!~N|4H1Pgk zsOqv;$p0NxO(gaEWZf?!BqUI}TAW0oKs{{zjk3res#+NjubxF0U9nt|&_2l!yMne) z?l*|BgGpHVqw?hqScIp`^jXnJH1&5=G9oE%H8|S~09fsOefpvsr!{POzJ?0Rfxh#I zksluI84hcq%>z)|7H~9m;1Oa!rM$#{|&-m3A7x>I)hUw8fp}Nq?CEs5P+c!0JiCpaz2j|eX zFgUj)a$Pe|Y1RPpmXCL#;wP8iupAmmCc4FVdUz_oeyvkWafkEv}o_-oF zfj?F@xntYi7AneV%O`JSG`>Mg21GivmZt{Z-l~(-N7-DL+_Y+aaoF@4y=#)mT;0)i z2YyW)*xl_E1@0wKd<913l1pu!0zt)YQVEdqnj22vxsZ6Z=h!9X{LKx;$SLihCaLr2 z!cM;;E*henOy6r;&ia7>V|)&W*lulrci~m=l#94&r1uy(BN4U^J@%QLRBT>&_DiVJ z|IPHyxq<``=&j3ZD^_60{ku7}gl)E?J{T&wCFYtodyUJ(M*4ipI|wF;!y)5W@MS#H z(wn0E!#gj#ytMiNvLE>VR!%|z09dpMok~<;9JKDeqdYuZ`ru05=y>(5D-;hsYr%u2 zY4X7bz6}<*3`HAV&PL#d@L`TVIm+zKvXxW1IgjfK5sNiS;>E^#DtS*>6-tERy_c2) z=9+<(1m%$?gh2kC$G%nOn!LkpWF;k~DiT8yPvTrpT&5}?X&CX}sALqW6aHv9HN%J1dITQXP`q^q_9Kl@L^6uL1p7)H9 zqp6|z>CH7BP83^52yu#5_M&1jX}yDDfqJKTWnWZ#J(O>3>lf~Z9KGzKi4tD7yg!zA zZIziOJH{w#6+Vel^~2;cYK8pqM+xrm=u5lek+*Q}A6j-INE-ys#hygFCqeCVfHtWg zY~`P0UHyPAoKHYGGUTMy2jTQzJoKp$!hfoKml~e>&v@w0e`W}Ayr;}9|8l;UbN&$s z={^HydEYO4v}E)fC2b=gb~R1D?3 zn*XBuKR+NqEBm*b{dPck*W~@57~Ne_;9th}|B?J18%?wRO#iCv{^5^4=DNSS`49;rk>3)eT%2vN-v6o|9_$v^1!UW zxEyU04B1-gjxY{hOVz4A`HzcXdz{X9*(BoFlWyN=DaygNGTE#TWmscTpR`X7ckNz@ z<=7PS-o60Pumy_>{MJ{qH;8T38<&OJ)&x#5l9VaJ7O*n4Ru@~X`F|;c=HT!;rnear zs2c6?m^(R_yCbAP#QX{k4Q-~@h63fqJKz0<=3#86yS32_VN;#oW%@{fsf>6n9@`Sl zXyYZ)s~3~n-m6q#eQJz+#tQ>0#-2i(41$Xhu` z*c>-c9t$&{AtTF+2@F){;PY_s%<`^oogA-;sn!}R)SMnX9dZK%SPu|rYb0FKsuiuP zazV-;bJ@BW%C+>CgBN|lQEV`0S(FY3~C3NRYvQ-V{DPZ;}W7AynDHm-+ zcp@7Ng#;AxCVv2;E0>BJl>nn#h>&b$<_v$rBozmV$VOn;17-W>a8&QntKe=jEdY4v zU+>v}XCysB<{QpL2)u#0vmP(_;2QR&|5Yz5@Nes7tuq9cLKSUodDy9ATZ8#9HLx!@ z@^bzUu+c65DH~0t`w4C^shVdnD0cHF-Mg|+z2ffm4zhFXMaF#>aAwS)zep939%tK= zKK9q+6%p_B*19ma^;I{)5P$C3Ynav4EL?L{I_HoY!C6ku-0OZTj+n|qR7Q>#Y zb9%Wqza|EjO4c~#F86WcBVpyI205Pc1KSHA_Awds9Y9MOh@%{ zr6k2)ue2~&nNC34F~D^UHFWm(f)MX7=@A(BN~iK7=VyMURT-oFAmA>>#M^IIQYI@0 zN4oxf=rw8*e!N$5`0zl#v6Py1!u^-7EBBj#FH+k!6$%Z?nBE85>|@-NPnDbC{#S!M z?|E>REU!;Kni|1e7x4~;u{!lJ zf&cKJ}P9BsdQA zg8k9Oi*_i=!}OZR*~e@BG9Rkzf+3>$$lD4zd1anoq*8v#KDv&$ih*ru6xdf;(YmSD zWW%q|iF=$Noy^9QX^$rY?1B{vNo&H3J?<7Voms7wD^6s(7}jBSyB)d5{eKaL?6=q* z2z`~j_2+=jz8U|E&i>8qc=!cGx?(_7l^*)yo%Eh6Gwb{@P)n*KARhd~X8XVUi_LCn zqL7RiPvWpky*`_*F$D?Vbrhf$sf^06*73d1+bu{gBq z9aHFLhf|k9>`F~K3uDbql#FKA$a8i)4`a&$+(3&2w)b0w0hs-IFr6%oLog@b6@oBhShgkutBkRMa4k7$A( zjdS3i=j1Zj6*l3%vlGK<_D+?d%)kn%sH9jZ^+Rb%hwsOuH7%(jB^2u&4X#2&%vwJo zE`5c9&5Xz~h?gBTc`jo<`yol~B!jGrN#}gyd?T`GSfa0hAY-R&NKc`)#q29TsEpl_aac0{O`^pvCd~$08BJtj~V%(uLTxXDE{9#=c~uOd=RjpqrVUw z2Q)iv`|u(^d7Mx6@hCoO=Yfq(sPX2U0v{iLrbdUZ(r6Bd=g&-dZ@>rraaz)j-TL>e zWI}yqbtp*;oo*kjYa1ssl^Gr_03i@+o<9lQN1$uvl+<*<%Y1Ao|?d4R?b`_bw04dqbRTUr4gTM0nbPzeid%Z-x_^J^x0-Ww`!58a}B3 zvwH&U{uSnXcdiw=Kx3ls^^~THie!K!`QdLWJn$bXeE#24;ohD{Dy51B zohP7#(X^njJ+fOC;7DLm=da2VwsM0tH|;w$tMyw!>dh|^5egvuRV{b#R|?8a=xbM* zQ&p&S*9O|Hwt}1eXFK{3Sh3gHW}F}6-(nLszZiIuzf+b?JEN_0VlN?ShW#O({HgBf zeUnkHqauy!uXk8x+XO&DPIww;9^TiZAEIBHPP&s~#g2G|c^y=5NFXTaCXYE29^yrN z{6y%}k9xg#qa8xc{@B6r{}CQu73j&~uz&dc1*qbljPm)_^R2TcWCRme`2?WhKQaHH z;rjd@EpW;Ku|9Ugy}7JY%;`!_Ocuag>Q(UAYe4UEpqUfM1Pe2Ws=pYp#^aIhLmF7y zmoV%__kJ*eITQ5N=CWxa6c9l8{*ls4fSatWO@?sm6IA&OXXbeeFy`Gl`rds?|1FkH zSqj{X2AW}y0;b*`%N6lY4J9dmc`+u==262uRk*SL4+4bBYu&%(XnRBv2Lg)-QS zR|F5B8-bnlVyC#dtdcI=*r_lbajqMzi1B#lu-RTB*49LRMuO1tJ&Jfb^vpFuI>rZz z_(oJl0Rzwf>LV+@ou5*k{8x?r`IkavVs&}}=d);*TzB9)54TZ9m+w>-uTaV|mWRY+T@ux8DfZ70(n& zP8=7vQgD(M)lUcp6Th4+$TaoNT%G+=RR=R&YG8k3a9|j6;4naptwVJ|WTc#Ee1|`k z3b6CbhXTdI_&z6utpZC!;u-_eXA;n2Dj;>fCB!DOp_PJaTU#%bCiQlMQl9rLwM}e~ zE62%Ek9(fz-vH)uqm2k?(+WmWEy2m$XjtcXMsmN$kk;aFDMRGk>p9t54Pq#OLlrI{ z&QhPgw#-0}Cc!@3e+P~D-t{}XZ>*SZ{;$X(c6tvj=Tqi2QH%&WlT^#B5h+9l{*t+o z`1iL@joENLVyLTbA=eF}RiY~+A=N3HwPl7+=x>-b zBqZBY`Q2nsi#DFXA?2{?c-44w;O>nUni!}8r-E8NiLSPccjq%*?4RU_YRbhx_jfn! z<)`p4vn~w}zE~N{){vv+1Mj{CZ+g=lg8@auhjSnOxjK|n266$gj2}yxW}U=u@x*@- zcOM0R1PBbM^!v1OP2=7rqV5=kL>IDsMvJa~F`hj(VKi=Z6&#g_rrk)VSV75+Sz+?q zzfjNNz%QvM9c?xmOd$+nC=0wx-tvjS!>VWB!@$cT367BMnFJDYgi8)A$1l&s!_ev# zs#c|@1=rASZ+4I=n6R{)Kz;-UQ+z&+c&KzB(w0%z!smWpg0wCtzl(>jD32McdjKa! z`xMWlKpRJGLR*T7T32NE)mLR76dBWBVy4>s8Oo&&VY;*n4F(23_2>LDH$B2Ox*3P} z=i`zZZ47?h47m(7njn8$TOxoKYqNyVU#9dL6LS!ctF!U2wS9+pD=(7s7Vy;A-enQO z6{0O!)2Tl#h2`~;UJpP;Nxz4Lc^~HbNUvpV6jQ|{?cW$re$Bov(eGtY+LS+Sw!KT+ zQo(tv&GQ>OZMa6{J2f0qvzOgokNz@q9_u}|Ms3RJG{HCW5zjOcF;pvf5@*eZkvmk1 ztf`T#Ux7&Ndm~S^nq1>jD11NCV}UKE=+DD(*|X>i+0^Fd+jxYVmp6c$;TEoR9DVX^ zuHoy6)3;~gj7_c3c&ey)?B+G>J>yOV{wNES9>oirusuK^F%PW0Q>Vgf5F^Yw`t#GQq)h zA~$He8^`UzmfjGdCfwr=>PUxm%eQ>aRl$Z{B5voj=T|<6OgMGIcV=V1D7){ARnuRF zg`sfhLX70xL#cNfJaA?(!Ltw-qrlP#DVn4X!CYTt zHlyyZctI@L7N+EBllN517DJlc`RN$Y2(nx*^a47)YOQ?}7>;F;RCGs$WXOI5jlBLD z;A=j$;Xzsuv_~@W9K#LNW29a=Yx;)@u0v&Z5U~L7T4D=4= zByn*UH#d8V!M$+c2~8Twskb_Lje$b*CEo$HQR+&!yV*qjeaYKd!JTiX-=DxEwAAtw zeXj*?CgdGN4grlYeT_!ZIy+f(E3urW4aNx^&I?ofm5MCq(R`I$G3n)F-~AZoxxeQw z_o=p?G=4UH`W|`)6Qb19$orv$NBfm;&33RP(M!hG2ySt5gAMD|2b&fSdeRvk&@Ag( z^wyEwwjcZ1JZ^em9vN+0p2D5?{VikQl*t~J)(|EEBdZ#C7WhPg@q{*?EHbaAc5K!O z$*~3MyprJ)1|gVUx+%?)OyHpt@qVX}kRGzY7z*)$>dcv{cOVr|Dy0dz7EBKMF&kd1 zV#;i)oHF-%m6nXyEbD=`>HWzX^M@_#BVEB<^5eCv;gOVXASf+w-_$Imt`D7gXK?;z zw@M znH3A~zn_d)j(;*RxI$EOeZLK*V}e?v;Q#a-@|nea%bbY`2Q=Qzk&u}NaMD5XuB9Sc zv~w1Y>~UOuSnu15v?)85niH|IA%8u)wfH40oM=iy-}`}z)ykWMoG_5KxP^mB5nT*X z;U{H$IQD^y?&t*mR~9WxLwO{tq7V0x#B^}sbB);+;{H+?d}WACEo2fZ-$DdKu#aNc z*O}Wry+HMvYzmi~?pib`{f=-x+ZN>I zhEKUTP8jK09bGfJ#s%^W<8|oDs83jeqa^|o1rCN8tq36+;5NA?v@eV5h}f(n zv1!!>v^*xmPm*Rl?y&Y`*&PuH`AI&RnT}a*7APiNgW(|r+eS|)>=Q!Y_=$<8kULBK zP9Q;X=+W(K8g<6d8Mm|JR~(U0DU62N9`-fPr@MnUZ8-vgGnbwr9QxZ#pq~>Oi(Wmj zy$YfaNd+5t*~Ao5pP=P3J`)}v?@JL4CLBRwj%em`9OIz3br~vWKYztaJg82IrTbj2 zn8X2X!)k1m*l^L)owE#U4|+6@4nhg(fq2J7?S*-Lccr^#pR2ujKO0C;;c@RIWVg+{ zdcvrC`F5xkmM-!^Do{Bkt$nM0R4>P``**J5Shkq355mnM;*`?~&PYibe@+fr`U;HA zb24#_s?aL|=j`W#MmI%`*Cl!_vz4RlIWWIw0+Dt8w-j}zOSTC=x)>4@9MTu5-i-GwzH;m2c7XpA@*ye1q7&E)u`-5nOjj z@xAbNdvX8FlLYZ;wn@y8Rk-J4N9Z@=eCrX=&HPb^qb;Y=pkA3?RoBy{YPFijx_EzR zKjAMVzOCC^fejG+U|E5-!1!lDCmBuJ;s?h!=U#3>f8_j2dhK}xOem~ImsdYxapyi& zK82RkBPj^lf*1Hh@EeqVIsupTz)eeUU)9KkcA>kbl+!{--bc$94kN6=?Wj|G@L!Q94l=lU#1s zkwo0?;tULLHU|@Y72XH}<&cR9f80C$bmSNBax(vb?!;({6eIf!^-_TN&+tsSGXmoE z$4x%FF#R8ZH=CW!lOEP|>j4eHyX7qJI9tLS(7AHn=1-Tm%*G@jXn^4+^{F?KsYA6rtvdaZ0EwF0%B z2_a}y@N;|i*Kg%2t{mlK58O`H^lH@6Jdf?{SJ&6Fp#754<$O0$@ACjy-2i^yC??$w zMCZdrFV#Go(Qty0R4}*Cd-dlJ`xyb=cwC4!<n-D`{85Q{3EAzl zJnpZA=|nk)^>ht~W}PZ59-u49b;u1ge1BjpRGw&k9`au3H5n0c4-KhoO&B!yIli2K zgXn!`y=sjdb=24wp`3RQk(eTGlAU_}hFBo=$~0C)>tVmJsSFw9C-Lv}pE)@@gRVa{ zqtne%TQDE9A3=@*d*h|;RaPrPfB?XfNa0FKVie;QmYdCGQYcnQDAH`qir#hv^VdqF z3+CeLAN-Gw%t9?5h&>-F)$7jvyypydbry_+P-}cCg*8f8qo~C&C?v8BhLdyE zIwY(o_JFxvzRZ?Qwc6cBmCyEMoi0xy+np92guOJ|zb&Bb4yF@`KDg#2CP)CPRa5gq zi{yA$#dvO=h6_z0ua2f0=lPD%BCv_9PN!wutJ9&}@@wefHQ?M>7R!h=4+H!&*JR=N zW{gLZc&gG74B+z?N}l=&CrXQP5nPIc?|BIEMh5*@DtZ&GBQ5%e2NUUqglhBe2R*zK zh2vAkMs2Mw7$^5PXhb6-3%%Fp-iV-~7y(vRMUctu=R>+X)!W^7NR(oZ&rjm<1{)-I z+E-YfB%aKS9m&*Q9l4#%KTa<44z>HtV&v#bL!V($O9N5Mm6M1F;-k$)U0wZgJpcsW zZ9rxll>;o=OrHmEXG(Y}@WA!jrT-L;@1^O6UUx*f^gAp?X20PtycN1mBpe<= z(1gq#Qnl9lx!SEyjEzj4&o86x_kVp{>AsR(B<=?+v)^`nji~V)PwNvnN{{>73X28z zMv_{~r6))Rh{3?vVmS>)#9JM`a*twoRIy^s%0zgu*0#fC58=BwdLg+ro}Dd0il5VH z4a4BN>R@~8$XXl`9-cL?IX|mN+PY(OQzf0JQVw6tD7+b6czXBiXd>I;&AhwHqAXZi zI)CV|G#TCX?1G#9$o-%KCa52%6~;vA?kpD>kEU~Awslbhldi;~Wrm9g4c8;B8dir> z0+L^>C9C3t#ZJkQK`ra!sZq=Ai6)e4EP>_L=I}8s;qZJDI9|&NDM5;^)wKHY{f1LTgduNJQJ{D>sy!auC2zZ}H%CZ8 z1^M&hcAh6+81#g;N77)pt0QguV$9(L#Z6}j@cQANsg_3{ul5d}*fwFE`axX@CNn7YmO8?J8Ii==_E%;40{_r&I`Pr**Yba%H*dQ0||N`I+77os|LnCzWM<4p8o8m92U9iP~^ti7g5Ic~%( zR1bl=iM#4|<@)>>oVQQ?q<4oSt@Ub$`-*LQO6-RCJRC2Pnbp*CRyuqwq&K*#2ExBU zThl3tNAQ@NhmBWFp6k#T7+oe?#LOy+VGO%q7>c4BK-9nj%*Mv%qK}Wym6N)!zkk_x zn8ox=(eM5#Y9EtkD#3Er$@PeAMOiThg`{jhHXWtkarP0w$F|36U+yi`hrE^|kiz$7 zkv;4R+n#ao@;pjl2orK+@#f=uKN|k_WGVN9%LVllTEZwQjgNE;D85jzy$c>GO6(oZ z#zxCEE(b&?=P!iL&(AB|H6V6-V_QjwdGPGoN>hEal1i9MzTtO0qk0onb|%znMYM#R zmpB#ou7kBB!LVV-W_ z#dEbsJX;->swE)YTBSKdmdMvPs3^_fIG0QRj=b-SrRNLF-p4r$c0IanV52&ynp!kx@h@#)NipZRqB<7ophPdRKoAP^AR zl(zWZn4%&wvYIx-70HUxBIuGI&pKV}%!=55?~DG)=4TZJ6RAU31@y?CPt}QjI2?6_ z9qTOV)qIG~LfMgp+juuo?4U#~TSIaHQ~W*T@OyTydfc~LmB~E$tVt7=E}E!I$8leg%Amt?ljl<3fL|wefj)^*S46hsMbFol2;lq@lA_h<92Ij}lVy82W52nG6pN0qZfQ-; z`zknQ5%Lli!cNFaPRRmWOuD|f&s&gMWF@h7B!M7B4Vw3m&`t3P3o*WS0kF0|+H98x z7uELd=WVI+=@;Ac88KxC=d0@TDjMHe7o)XLO&{FdYLoXT^JKuf{bc2VY`TC|S!rb^ zl8g+&m@gD%@dWge`06mY6Qu~EB)(@g&$6`akt|g6=-vAb#9PkCs|+ELm)m77!$kJj zjg2>lXELBGW}(@jc!-%svw+g$z3<9G@S@R3Dp!c;?#*eONRb|x;!_G4nGDokEO#PN zD^<}l8_fnTScuHk*|ExVnYRg`zPi|-^cf~57|`M3H(a>C3r@AxVK^%!TMwp63A^L_ zie^mVj3nyfx{jTZlWO7`2nWL zrL4>i^rJ+b!Pt{pQ)on-tJW20ZRHTZbx*nXH5O9tr~%#2H=gpus@D}@kO84eIjnfp z3U1p=NtwZIg&O3YV0X>HBnn?@v+SA;iT)1m7-RZ+`P0p5{O>nnw4%=q!{Z2hEH1p2$>?&Ik#X0ZS|rBX zVytu;l5{BapI)|^%s0H)n`unow*!k$*xhD$7=N)k8Ev26ajfaQ8A0I_sxphe0lWW^0 z80E<2p_0uK7tBQ-nzYH3dzIzQq2yFY;>>@mc#|a;)T7L>NwEkQK?luWZ+Ha+pwuOgeTQWhpZFXZnkJ%ztYAYyk_%^rqgQOfmT&Y6$}>ak{onepYX6& zx#N@kaL&m960z`FzU=ge%pEj|;W{W`@yFcx((~{n*P{D|89C^+ANfp^qvIEbXKocMB9Wxtx5ni`!aI?Z}1S=q=~qKKAQZ$xHaJ@7J=8cH^sz=c3{Gi{~{Hxj#RBT%b|vdw}85oG$lBmcjE$ z@SiHy-15T_68Lw)vs@HA&t(%D=kLl-yaa9=^2L6%rH0G! zq!PaGOS#Bx>$x6~bR(xPME?%qHxo9?Ic;BC%*P~k7|KGgawylUfIfXL*_-g@Y7 zf6WW4oc?;9nGFwPnU-WXjY~afB>NQ;eNuAuR2vYyh?0svLBS2KScMosi7tSr+a(Tn zUn$TqcRNH_PkKp3fsAZvYr8rHc6vX1MM*>2tP0hG=F0Q5T+tmRE&mQn4K-bSgb|BCVsfzL)Zgh6~y{RD+g#B%2OM_0S6 z^p99WKF22~8_+L%Hri{!Ry`LIA*<8${Tuv{xxPLpUwkFdkDN)jE(fYsYQj}zxroNI z#PZcSwk8|9KcB2i2O~x-a?(V6mguoqr$yDmrcAxnTWA!fQ7qEkK-nNY7AIe`9~iXb z(O7(+X5J&5u*Drxoa^c&Ar&23Vk(+BmnD&s#=Tw`+|t2=eqpRIO*a|MR_>uwZ8p|% z#N_%*+78Wv>Ps`!oGfhq(gY2pHa|qG;!no*OttPwrc+E-+&oXZC9+ww z?_*QB+W2jxBmOnkGTVp$J-f3yOVra2jKrFYr{QTr3M}R@ypUxCvVNLF)G#n@;E!Ss z&dTV#Nmgb$6Iva_A;6pDOEih#UK17*EwVKD_Qy8<1K7qv-fXqu=`{FOTYGP&aso6V zDA(#=9j|48Tc(V(H00{?609xYzxBAUce0B14o4^C;FIVgtplY`vf1H;Q9~|_lexb= z{jl1!MB#j37E2;2HO1)|q*~sTJ2B~I56%5zz`MCKv?u-obfGz^bLuH%#W_MBP_ zS|;>`UEhS!M2-y1{lFWwN?n=rn**_2zN_QYmDM0xZR3doe$Dy2-V7&3BGxC;IID!| z=CS<4xdKmzgneG>KdZpV67L0a9O9E7z1$-}x|XBkbG_Ts`g8)@b_lY>D(M>?<^}Ut zuq@M&?N1MT8@fGVA_5BQWVhdmzsXahd{9!DRqr*}w7fPy#Wh}9YF#67tFvWtEJ0JS zw95P^SvLGyExNVdqVA1*DP0xn6w{q6AT!fsQp~lB`__TM&U`^Ag%OUl?7vTzC))fd z+g%o;TjSdPi(HwU8xqJ0Uno%_C}i-gP3N{kee@QbLXRpy5_I~U+ zUqQAD_8q0<@W&ThGd?lbd$g@@$%D5(e6F|)wf z_x1+)P`+pAZX=_up+0m3RWtt3^Cc2$HPVj01vYF|rtNXn5?f2pL#vZ+FmcRKoKr?x z?_@+4evO5gp8TP1{2Hb8;k(xJKvt`7-Yn*12V9MRDOJeP^B+o2fdESeIN~8%PSUv%^R zb$;*G`?t*Ppml=nG$_UQ9qi4!TP!Hv%gD`{Oh&WcWuhH%pkY=x5afuloJ^*|xRn>C zI0v7?j-W40do8?HHRqD%SpM?F_(s5iESltpx`u{|@??QZh@c{0tIMJ0F3inytG_bd zwr+p$GI*9_hbN*840XN67*Dcfd6Y56vH$LfUDE5IhWitpwq=J-O8(OkoBOYh*#BuX z9E#a3srAL^Z%VuXG43BvOy3vC-=3H#(tnC)|EDkde}~xrao*faeh4HV&Oofv+0l^7 zV)0zD5tvcF6c(a9)+D_9)RP+hceKl?oWxV_ali!<+=wUc=h*-e9XZ(;o@9>x3OX*W zZSp}&{23|ORVW)aE-pg;-=O{T9>i$td`9-2`L^(+x3R9C)#y)TEU&D9 ziq{rzITYFn$|P=5ebl1!d_?nI%THt{c~8 zUJn^`6i{aX1k_t=nydVT&SrgJb!SHm_(0MC#$yv6$53stkOgceV}a-|H^I_?aqf^H zhc&G?peysE|9S}$Wp3gQ-jnIKUz_gd)ZFxmkP+Wv8ra+0uO1voX=-Y&E-tp{|LSt= zji$pt+Z^=)?k0&8xAPYk2qkX{9;8hd(1k*<-=qN!Iq%g^ADubLWKO}MHI149On%UY zgG$IT&i!zk5lx=F!N9--%+@p251y*u-hL~mZ_7q9UpD?(Bn;e=N@84uKjAH27xTW{ z>V5%z3RWX^dfe95?PpiFY`M16RgbYF!w!>7t&>PxKN8du@awx4AHR&w;}#e{3n-qb z?Cp2?OL*PpLshLIS=sRpoFomwe{*$fOBBS=nc&H5{L#n6%c%ai0FL?__!n{&@)emt z50d>5EgV^9jhxXV=c>`@EI~JUba{kfJic$DX(2g)Ykjy#s@lvI3%Z@tqsbEiI&LFu z{U?+z^x^&gP$s=-q6eO$b7j}4Z@JVNy*y~;s+opCggSAbAPMSm=_|>P7X7s+HV?L3 z7OY$~VpqBb6DHF2O=bw{1nI6U1%!pa3!f-ffF!b#+Er`6+ z-5cx27Mng$X*_AdN1>7@;SM8SYma!^S<+atSV=-o0TI#18a-8c2)WK|De0$8rCkyo zFfnF2VJ}3BSU|KKG7;+*UR&?J7<9ohjAu1bsUwvzXA-BY{6Cj#Qzz|N$Fq2()x9?V zrph8+!UGM)lHA}Et@TEPUcIIT^lL0%hvBQ+ZwzU$1IeyJfpl^^&}GnNd%;|v)I|{b zj<~t{%K_lmNUjIoxOkQanfQv3keg^|XLS1F{CK_U*;7ra-_?GygYnFcNo;)8rkMxb z;n`e`E=TA6Phw~svhU|D<_r7aW7T)*&n%S7URiW@8=VE#DZC2z@bhL9lin@YV-E|U|~4uK^c{h zT>uEOm+f#xpumQp2qC-e;zqQ0ec!X-*k2WFOwmY~6`$$WdcP-ZD2%ffBYvyWa@wBz z+RE==HV%*6Zl#KAmGv+@kt51DZ{LzidTl1*C5h{B1eU=Z4Mu$6eWCe)IBO!SOurxC z<*#Gf6=kdDpLG&n4;691y|t`ArV zaD;WFl_?7)bGHpgo~cwlQ?*^&o>WG~JukK2W1km-F-P5gYgvM(g#cjBwJA$l;MnW! zzBrpQqq0cmoG38T8~P3u&E&)|ur@`BwT736X|$}?tgMH+sJr-POOx3+Zqs?MED|`X zUut#ZS*E!seF(5#9}qQ)8v03K5Lx9VZ9b7h8gL<%67&O{7i9CJ>6Cq$Or=xsC_{vR z2K~CKYbA}}`tEs+jfST(Y=lQc>A}O7PmS+Ns|eoZi(id&@ER@0C;3uvi8I; zEm}BVw4+n4TtC2+?i`HLq_$(EAVZ;2%KC9FzCjyBD-)T*-*9KQ%F2!4XugTvI*7N$ zp>jZO^gEs=fDs`8RbM$`&vWVAA2k^pG~^BoUR@I3Z5{(ZwDByaW-%S!ug~jmPF9fJ zo|pz4QgErc5Y@S5-=82~7$KgA;3K%)I9MQ8+|g>*z57{e*sZg-|3iDOWyxCviTyf) z3-+ln$`Bp_2>d9!k2^mJs;LL2SzyoVQlNz6`6jJ*8T~fCd5iOt$#u9|%sf9chypyV zk_}i))w2Z1vuIU0pyM%1cp)*zH68im7nLY>)%X{HOA3jc(85rR7Vs4U`7Blna=T?!CxT9W12}-%z zwI11T{Y>&hBS?#LAE(?LX5Pib>PbnlW@8@%if&2#J=6+zzkmR_qvcLYJ%8lcBR%(q zl07w}qx7ptKCBBoi0EANp3v_qvy8w%j8lUVJVEltbV> zvZyIKS1Hds2*$4%??G<|XZC|c=fjoA6y+~V>PorGT@O-SXHW*iNpe-9q9DmDir#E_ zQ0T`da;000$GyAz#cE**Ra7XG;nq9Xh_^S5C8XEwE(JurcVvFJ2jGl6czlr&@^PbC zdr6mmIFI0^ITw?c1!`b9w_>4aiKS;r9N=Y~n2Lt!pYw%_bOz>gS~@{EY$?01YeSwy z9S7Xzm~rdhQep=|?7nUcjiapyZEH|RM&Rxi&Wf;pdmQ~%=x9{F7u{&h5Vk#9#&SzS zyS1AzP2fqDNMViyb;x`430==PF2)lkZie}wr=gNk~=Gc#hhC(rDHN3|6 z<_?5QqhfD)0Rf^Gz$M5F*LyLJKKxEvX|41A+sZE}UJM33Y@8yQ6HHH=IhK_U}!@ zq(CNkEnQ#&mxEQhQ-&c7<&{KFOaogvR5#{QLu*Ns%t0{putLM<2U9USTbhM<;Hagb zaYO&=BPIpDnpzzMtCLj1HgGM9og^{nw$|lhzdVQ60HJ#j6BTtj*KX%cts7t__y7p- z({FM)w}1bG%P*DF^ZoWIVLJy0_lM-hI>}1M()8PDNVo@$H-b5O2l+V)%Tqh?BzBZe zO0zJw3(W>c-nG8y%-3P~M>iAnt88LXM0=cW9>##P%DJ~N+C~CsVK?FH3_;RvycpShH`mkeqOSc z%YqL1pIm!zw73{2O3|FYWU*^KhfMPzmy{ntuq2~#i3bm6 z18d4x(IO0W@AnB?SEc7ehE3lf#%x2)<;8*rmdxe1{e|Y@+09Jtr7hXg^g8SzSNuHn zUcZ=ceayl3-47fBvUHq>ysO=^@cc_h02T6 zvCq?&%rQ6v-4T6zFQ%zBUd`kXE=hNCMg%eUY`b~0R~Q%FH1|d^23QY%Qk=OZZGI0s z`gFC4*HWkT#vMsLvuJWJJ1+r=+kslsm!RxUt6+-wIM(-p=!Kcww+szq_omZDJ?dn} zFfNAzSFX92zOf9B3$d@yZxQ38gFNUb)$MaPN6T4WU&JT_Lb)N|{`J8d_ANnG>p({B z*i|$Z2_&s9za#rDt@ER=is*!3J_;6L9Bcwg?dP2HH0oc+;Cq*Z9n>7jSG)70<{K6z zv5_Dm2i4(ba)qF@$swk+jRqpoA($9ve!E*LlHPClljq% zz2TWPH5r^FLL&TsF&x0kANMG7efrXZuBk3DDD=~x;lM~~2ESl-=v!tke9{4gj|g+} z=$h5$3pzOa!DO7$-9XYgc9GG%g4!V22w%!)<-gcaZ89DYHVGxBBPBD0>@>_V6SM!* zxj@HL0q73b3yba+1GZ)hxYzUBWTb9xW3V^cqUqzZ@!#iaA`pDTu*PA zLnunNd*s{@%T{A)Y^krc>h4EQ3y>^3D$LNYL(veqQ?BhBwA#NI%8DFU=lnyfTULjK z!;YI6%9(cfE!l&VJp4lPH)fPN^|!Dvy1`_|2#&))r21ug_ol!t!Q`?a5~b~l&=Ar` zYSy7kcmzX3z|=wYOb3N>ibX`d;XD+&a=8w8EMMg%X$s&OX-vZgN2Ade{XS z^6?q>wtP*5-X+Ki`4b|7ksEmKE~ZSHaH|x+8T0Pf%SX)nCMoGUXZpJ;={F( zv<5~jI#pkU$W+vv{&IuT--J#I>wNo$j0sHdKQ=xnh}r%qE!7c5CNt}k8vn)Y7dU3! zj(pO(48uYLHeu3G_dc+BAQdSt@%de<{%*A4NaA`?q_zCqn-$o;q4vxN`eQ62pfmjB zX!bt!4o0zoaF#;^`bI47Bl>xscEpZqvEmuh%!{fd_p9lYD)YH6mUjm*f$3Fr38SMc z6cgWSYMsVyC4*~^*_rdVk|=0ZS>X#35X;9Aqiu zdV;B>6HonFD#p>sTAnjA6!(sTu2pCqw6mp;zFc%^R$HeHjo6@TRs5M~^Ps|GcO^)Z zJvnARxSW^xc$dh6{lA6U6J}T^#{UIruh>+reO_-MV*E3aAPnb?u46OekylAcQeVtY z{k|9DAI4iMN6qN0xQ2*X0#9FCBxHtD_!@e%(>k)nZ4jwnW_R^{C;AM1jwOTqOF zhZ-0@3`jg4Ql?wgYK@uwOy4CP=F9YU`e{(r7+UsuzW3D50L8JoEk+)ziO%FS2D{e4MA{rz z&g!bdvqf?+{~t{hAkPKozC^qq_rTVYyE=|frhTEK;yd%Nfr9VJ+9STM^%uT=JzKKW z?w{x4DCTtww;4^Ac=+J6^9exrvs{KW$kCpu^s+w?AKug|77dV@{2XpRboPyA2t$|; zv2SG#e|Q;4jMy;S_ki7YkAO! z4#=N|l~26NX(*NU1NYS97beF@cS00Hi(gkxjNj8$nZyWH_Y2*OpWpc^;6{&Y;a3t|Uuv zdC7Cf5X+>n(?N<|U%KgZ%<)wU(|l8r!xFzJiZW7Da2NaFr? zJiNo@$wo7WWvlE6L%N=DPA{uKz)+T4clgJR#<=YXvzE4JOT|CDTcI~az;P)nI+kKF zW||YPRBpq37dPzAohe}D&v?T4KN(LTf7K?$u}mE~hmfauXvX%BC_+p&KP{ES?W``7 zHP!Ka8jO7(#i29M=znM)u|Jp7m~H-xYa2%RV6&b z`5YWOAOX_IRWs(rCdoMVFg#}CmXs^~d_~&6xB7y9pb53R7X$0)kYX}NC7_|<2BbWn zIW1vR>3d@M=H3P*%LP3LEdV%!n1&QU5KSfbnrmJ3yGJUBJdOgzSgkFeRKg|2N8|gC zlrdO(77J=+a|B=dj#QV5^6NDb_nR>TMjr^Xg#o3%de^p;c)UU`h-|)c7M1{L06qcU zABzuAFJ;x-ru_+7kmGy4f&;{yU1p}(Lu%LS4>X3qe35)m*Jb#ceTOYwMpRw5Lt(}T(vLLt3a^IG3E9xlNjEM% zwYi;lYwrEqF(CqQCmWfhFT1z+BX|?<^$ zSsqs2;Iwjmz3NPh8~0SkPr#)RndFN2i4;vc*G%R4TPp9w3G{4M|AVf39(^&6#_wHU zXH93yUMjlj$D=H{S?=A_puREI5oOgz*P9VuBA)GXT**Ckzm(#QXe((B~{lwMFk;PAcQGpuEF zYyYBg08{3Id-XLm424w6nh{9>)@-9QVClblxrO?IH4#{KF^E6JkN8;Cd$DtZKrZ{< z@SVW3){tDfuF&i7+1dGEY!pOR#Bq*bo?D$USZrUj8K*I&y_v(ne()VV=PLMRD1n7z zz7-e5(!}1MY(~D}uckS$;k=y!RT`ZWvRR|}B zfPhHM;z6q>2{!P-Bs;UjqE#twE1585_aG@F{`g=yqO? zou?W^CXIf>*)$%em33EXiqmJX?Ah&~=jVmF%mEud+bml%`N$`N>3T!IX0BCqK~ea3 zu$H7!R4ZjetsV9sfPL&{Z9c2;v@ORsG~CBsv%&!pz`K-v93Gc zLVTWc-~S5Hi;L@i9Rc_QSpQGI^uNIW5yrYkTmSbRiOE!kEi5Qg`Q^)(CjtWlmzI`} zv$3(s)G59}fcyPi;DLeqeYvwqf7#}(8su-gjkDW|{?VN1eSoQOl`auEIOnxADd{e= z@Y&IV1ibh3`yrivHg?ajK6aV{AgK4c|eeLtKc0P-EUjpLY3&CaWEypQv8r3|Sndy`4I8X2LICw8UszJn6Xx zHs?9gT0Ii>d$S`1^zTsnCcdSWm29At>YVAo&w{3jo*^Vt?lNqLbDnq;)tzrFm89;k zqUw;qBB%E!QXhsJAq@9XMtD2!{#J-wp>QjE(UmdTwASrs2{Y{~rrrDQ8|J-$x^@1` z_Y3_AS$pUtd^o7rdcYw6f&A)B53V&`qsYb99|-lM0q>*>0#su}Va!n_R|9a{>xiBa z0DlP2v13S)7K@IuPpaL#%diYsE^P6J(5z~Ic1DSSUio6AA(N979x6YbgLs7r6-OTJ zMRsn9@9d9Sw9h=vuDQe#Y-GZNOkb_Zwc$8e`HrQDH?5vRxGZ1PwYj*CJV2wAd0>rP z0fA&pEY~2$h1J`TawO2 z3CTw&-g*COP|>OPK{IbtOLDoy-yrrbqvX}2xt63CM#VSwmO>RT_+b&Mm^(S2C$N%> zF;h_29ZgT<(8*Glh-{=20)1;&lgY&wE*v4}5UmVj5_S)}*&YB-sTs!x%k*{_8{NEf zEHwYxkZ{PoA~QVMd~@t=yp*8l{Lmu?gE2c_<#&6w5|*;DOAcb9eYbRlsE9!m5s!uH zRSxKl0?Q(^Pq6{RrxVU|20R5wsX?_GsfQPwBpros8F|?KBtlk|){rgmRncn>N`@+Q zlWWq)$E!G?$duBv!w*j>2@?{`nbU-(VSAnT?3rI#`}-PToP)oqi_ns}Sv&%i;}WPA z^Cmnt&(2yQYFSW5k4eRIbpk4WHB-K>JwxDm^6aj>!tKrn<;Q+R>7>|}IrU}rH=w>j z@l4IBI3O@@8v-{XpRG@9^VprSBPQ>$rg6Ow7W{tb8}Q<+|@@Mn!7ag;XyIoYX!H#}U_8#jC>;B(tw(nIk<2Sm4?R#r|- zr)r~65;)jiOCr>4jLoQ8hyrgyKpy2~G7(ry3 za+)HmYxakzqksu^2SXN1f5zK04Ll0L0~7vS4kGUd!o|~p>u>c1_?glQ#9=l_Y^{3T zTQI=_;`glQRw`A8t)pT z+O1Z(M$Z%v-QS5hf$M5bt(-~LP2G6!u(72-`9#N@~veQ z*6C}h(`$Q(PBGS1k`B=jCWF4Z`Xy_Duhxg*T|sWJ&|3r4g2AKX=>>M=LIsre3 zw-2sCOYBl5H9kjaS;B&%gg+tX=X=)C)adOrph(|J14qG<)cz+i%UPWpvZfV@&0rVi zY7Qbk8(3+UoeV!*K4mj9M7+`Xf)%GA{yL-=_Yh>;bV^Tw)rpa%w`kfd&g}#V0;_=O zv{>=!h(yhyH{w3yO~r&=zt<02;t8#ibQOV*XuOVVYzT$N#3kR8Vwka~i>%L~vg-MM zPr#GZon#(66^&7@j3kSlj6TlgD1j#Pd8`{8Y4Q|m1616*=h%i7drrE6&z6+cQuVrV7pqxq9L z;XWggQIExJ&3&8(zzyZ|Ed}T55YYC3=GtiV!q{#ScA%+Nq7~Ys9;n|^@PmI%!JW?E zm9dc;AM0tpem3C49$&w;v1L=hq$eplXR)_$-)pZx7MSc_=_#m`N}p|+JF1u~ib#Rz z*VANcS~GY2tMVdV3}4Wuqqq!9>>9k?-10K+U@k3W#YXO8 zb~E^}Dd6SFzDSJp6V*|3a5v&qN5z%Zk$Pd3)-?g4Dgj*=c{ILYAx9oPC??5)@kp>S zOOKPWQYpOzuc@}SgrCh_=)hCg(G%mNfxE_+h7e#jyxJWf8FnImh5(~9g?8n)a$0hHO`WaNN=U@{PgIIG2Mw{ zoHafChn$Pv{X-ko{%OxM=eEPP@<7Ba@!a|miBf&0 zM2~Rwut?h7Bv>F=a2gBl4gms9aCd^!!7VhC z|GnS6HB~bY^D+=yDO@)nwgoLM}te}O2gc9<%ErE&t_s#ip zH}LQ0g@=|B2&rZgc=)%2YA2^AhlErQ!TDo>_P3AarfleegoHovKhKL1*K%tlBnD#@ z1vwpG)6*|FfjWwL@Zc|OwGsLuNGUXmG_(P+^kF`$^xq;(XwQa5>e!LPAhBOVxHfG_ zm`#&41AizE^^Fkr%2ATK*)npc%F%zt$s+ByW8&tm3&%qJfXmzonqF%`cvW_2__SZD z6J9)CyefuOcpT+wmreE@>0j51<3o_+05Z9Khp8T|2Hq-q79s!;CPM@v2(u03CI)

    -$LgnaHy-0x#`L?dNX-8u&k&K!g+~-p^x{1! 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 + + + + + + + + + + + + + + + + + + + + + + Releasing a version + + +

    +
    + + + + +

    Releasing a version

    + + + + +
    +

    On NixOS:

    nix-shell -p dpkg fakeroot jq nodejs_20

    Then simply run from project root:

    ./bin/release.sh 1.2.3

    where 1.2.3 is the desired release version.

    If a version ends with -beta, it will automatically be marked as pre-release in GitHub.

    This will automatically generate a release in GitHub if everything goes according to plan.

    Note that the Windows installer is not automatically uploaded yet, it has to be taken from the main workflow of the CI from the develop branch.

    Make sure to check test the artifacts of the release.

    +
    + + + +
    + + + + + + +
    + + diff --git a/docs/btM6L9JtG301.html b/docs/btM6L9JtG301.html new file mode 100644 index 000000000..dcb786e94 --- /dev/null +++ b/docs/btM6L9JtG301.html @@ -0,0 +1,457 @@ + + + + + + + + + + + + + + + + + + + + + + + Running a development build + + +
    +
    + + + + +

    Running a development build

    + + + + +
    +

    Run server

    Run with default settings:

    npm run start-server

    Run with custom port:

    TRILIUM_PORT=8082 npm run start-server

    Run Electron

    Rebuild better-sqlite3 dependency:

    npm run switch-electron

    Then run Electron:

    npm run start-electron

    To run Electron using the same data directory as the production version:

    npm run start-electron-no-dir

    When done, switch back the better-sqlite3 dependency:

    npm run switch-server
    +
    + + + +
    + + + + + + +
    + + diff --git a/docs/d3dnvVOhur16.html b/docs/d3dnvVOhur16.html new file mode 100644 index 000000000..671dbdfbf --- /dev/null +++ b/docs/d3dnvVOhur16.html @@ -0,0 +1,457 @@ + + + + + + + + + + + + + + + + + + + + + + + Content hashing + + +
    +
    + + + + +

    Content hashing

    + + + + +
    +

    Entity hashing is done in content_hash#getEntityHashes.

    • It works by looking at the entity_changes table and going through each of the entity names/types:
      • blobs
      • attributes
      • revisions
      • attachments
      • notes
      • branches
      • etapi_tokens
      • options
    • For some reason note_reordering entities are ignored specifically.
    • All the rows in entity_changes are then ordered alphabetically, based on their entityId.
    • Every entity row is then grouped by entityName and then by sector. The sector is defined as the first character of the id.
    • The hash is altered to add the isErased value as well since the hash of deleted entries is not updated.
    • For each sector, the hash is calculated using utils.hash, using SHA1 encoded as Base64.
    +
    + + + +
    + + + + + + +
    + + diff --git a/docs/hkrBX8KE1HQl.html b/docs/hkrBX8KE1HQl.html index 0b7abfe87..eb8e7b19a 100644 --- a/docs/hkrBX8KE1HQl.html +++ b/docs/hkrBX8KE1HQl.html @@ -20,19 +20,19 @@ - Internationalisation + Internationalisation / Translations
    -

    Internationalisation

    +

    Internationalisation / Translations

    @@ -42,11 +42,29 @@ "about": { "title": "About TriliumNext Notes" } -}

    Adding a new locale

    To add a new locale, go to src/public/translations with your favorite text editor and copy the en directory.

    Rename the copy to the ISO code (e.g. fr, ro) of the language being translated.

    Translations with a country-language combination, using their corresponding ISO code (e.g. fr_FR, fr_BE), has not been tested yet.

    Changing the language

    Since the internationalisation process is in its early stages, there is no user-facing way to switch the language.

    To change the language manually, edit src/public/app/services/i18n.js and look for the line containing lng: "en". Replace en with the desired language code (from the ones available in src/public/translations).

    Recommendations

    • Use hierarchy whenever appropriate, try to group the messages by:
      • Modals (e.g. about.foo, jump_to_note.foo)
    • Don't duplicate messages that are very widely used.
      • One such example is aria-label="Close" which should go to a single message such as modal.close instead of being duplicated in every modal.
    • On the other hand, don't overly generalise messages. A close message that is used whenever the “Close” word is encountered is not a good approach since it can potentially cause issues due to lack of context.
    • Use variable interpolation whenever appropriate.
      • If you see multiple messages joined together only to apply add a variable such as a user-inputted value, try to join those messages together into a single message containing a variable.
      • So instead of “Number of updates: “ + numUpdates + “.” use $(t("number_updates", { numUpdates })) where the message translation would appear as Number of updates: {{numUpdates}}.

    Client-side translations

    Component-level translations

    Most of the client translations are present in the various widgets and layouts.

    Translation support has to be added manually for every file.

    The first step is to add the translation import with a relative import. For example, if we are in the src/public/app/widgets/dialogs directory, the import would look as follows:

    import { t } from "../../services/i18n.js";

    Afterwards, simply replace the hard-coded message with:

    ${t("msgid")}

    where msgid is the key of the message being translated.

    Template-level translations

    Templates are .ejs files present in src/views, these are used to prepare the root layout for desktop, mobile applications as well as setup (onboarding) and the shared notes view.

    Due to using a different approach, it is not possible yet to translate those files.

    Server-side translations

    Currently the server-side messages are not translatable. They will be added as a separate step.

    +}

    Follow the Guidelines when creating a new message.

    Adding a new locale

    To add a new locale, go to src/public/translations with your favorite text editor and copy the en directory.

    Rename the copy to the ISO code (e.g. fr, ro) of the language being translated.

    Translations with a country-language combination, using their corresponding ISO code (e.g. fr_FR, fr_BE), has not been tested yet.

    Changing the language

    Since the internationalisation process is in its early stages, there is no user-facing way to switch the language.

    To change the language manually, edit src/public/app/services/i18n.js and look for the line containing lng: "en". Replace en with the desired language code (from the ones available in src/public/translations).

    Client-side translations

    Component-level translations

    Most of the client translations are present in the various widgets and layouts.

    Translation support has to be added manually for every file.

    The first step is to add the translation import with a relative import. For example, if we are in the src/public/app/widgets/dialogs directory, the import would look as follows:

    import { t } from "../../services/i18n.js";

    Afterwards, simply replace the hard-coded message with:

    ${t("msgid")}

    where msgid is the key of the message being translated.

    Variables

    In the translation, enclose the variables with {{ and }}:

    {
    +    "key": "{{what}} is {{how}}"
    +}

    Then pass the arguments when reading the translation:

    t('key', { what: 'i18next', how: 'great' })

    Template-level translations

    Templates are .ejs files present in src/views, these are used to prepare the root layout for desktop, mobile applications as well as setup (onboarding) and the shared notes view.

    Due to using a different approach, it is not possible yet to translate those files.

    Server-side translations

    Currently the server-side messages are not translatable. They will be added as a separate step.

    + +
    @@ -71,20 +89,6 @@ - Internationalisation - -

    - - - -
  • - -
  • - -

    - - - Dependency Management

    @@ -104,6 +108,360 @@ +
  • + +
  • + +

    + + + + Having a simpler packaging system + +

    + + + +
  • + + + + + + +
  • + +

    + + + + Building and deployment + +

    + + + + + +
  • + +
  • + +

    + + + + Project maintenance + +

    + + + + + +
  • + +
  • + +

    + + + + Development and architecture + +

    + + + + + +
  • + +
  • + +

    + + + + Environment Setup + +

    + + + diff --git a/docs/jvdjFBOCCrOa.html b/docs/jvdjFBOCCrOa.html new file mode 100644 index 000000000..3db03c34d --- /dev/null +++ b/docs/jvdjFBOCCrOa.html @@ -0,0 +1,457 @@ + + + + + + + + + + + + + + + + + + + + + + + Testing compatibility + + +
    +
    + + + + +

    Testing compatibility

    + + + + +
    +
    better-sqlite3 versionSQLite versionCompatibility
    8.4.0<3.43.0Compatible, same version.
    8.6.03.43.0 
    8.7.03.43.1 
    9.0.03.43.2 
    9.1.0 + 9.1.13.44.0 
    9.2.0 + 9.2.1 + 9.2.23.44.2 
    9.3.03.45.0 
    9.4.0, 9.4.1, 9.4.2, 9.4.3, 9.4.4, 9.4.53.45.1 
    9.5.03.45.2 
    9.6.0 / 10.0.03.45.3 
    10.1.0 / 11.0.0 / 11.1.1 / 11.1.23.46.0 
    +
    + + + +
    + + + + + + +
    + + diff --git a/docs/mPGbEmYGitWe.html b/docs/mPGbEmYGitWe.html new file mode 100644 index 000000000..14e1247a0 --- /dev/null +++ b/docs/mPGbEmYGitWe.html @@ -0,0 +1,457 @@ + + + + + + + + + + + + + + + + + + + + + + + Build information + + +
    +
    + + + + +

    Build information

    + + + + +
    +
    • Provides context about when the build was made and the corresponding Git revision.
    • The information is displayed to the client when going in the about dialog.
    • The build information is hard-coded in src/services/build.ts. This file is generated automatically via npm run update-build-info which itself is run automatically whenever making a build in the CI, or a local delivery.
    +
    + + + +
    + + + + + + +
    + + diff --git a/docs/oXLcQUniOWvl.html b/docs/oXLcQUniOWvl.html new file mode 100644 index 000000000..8b3f5d4ff --- /dev/null +++ b/docs/oXLcQUniOWvl.html @@ -0,0 +1,466 @@ + + + + + + + + + + + + + + + + + + + + + + + Environment Setup + + +
    +
    + + + + +

    Environment Setup

    + + + + + + + + +
    + + + + + + +
    + + diff --git a/docs/rU1hxvgqlA9x.html b/docs/rU1hxvgqlA9x.html new file mode 100644 index 000000000..632d75c2c --- /dev/null +++ b/docs/rU1hxvgqlA9x.html @@ -0,0 +1,466 @@ + + + + + + + + + + + + + + + + + + + + + + + CI + + +
    +
    + + + + +

    CI

    + + + + + + + + +
    + + + + + + +
    + + diff --git a/docs/s5gsYTbPQr6c.html b/docs/s5gsYTbPQr6c.html new file mode 100644 index 000000000..400fd8e01 --- /dev/null +++ b/docs/s5gsYTbPQr6c.html @@ -0,0 +1,483 @@ + + + + + + + + + + + + + + + + + + + + + + + Updating dependencies + + +
    +
    + + + + +

    Updating dependencies

    + + + + +
    +

     

    DependencyThings to check for a basic sanity check
    better-sqlite3See bettersqlite binaries.
    jsdom
    • Note map
    • Clipper
    • Note similarity
    async-mutex
    • Sync
    axios
    • Can't be directly tested, as it's exposed only via the backend script API.
    sax
    • EverNote imports
    • ws
    • debounce
    • Check any action is reported from server to client (e.g. delete a note).
    ejs
    • Onboarding / first setup
    dayjs
    • Day notes
    semver
    • Application should start.
    https-proxy-agent???
    sax
    • EverNote import
    ini
    • Affects config, generally if the application starts then it should be OK.
    +
    + + + + + +
    + + + + + + +
    + + diff --git a/docs/xtBYDVZPb0gr.html b/docs/xtBYDVZPb0gr.html new file mode 100644 index 000000000..908ef69ce --- /dev/null +++ b/docs/xtBYDVZPb0gr.html @@ -0,0 +1,466 @@ + + + + + + + + + + + + + + + + + + + + + + + Project maintenance + + +
    +
    + + + + +

    Project maintenance

    + + + + + + + + +
    + + + + + + +
    + +