From c81ca99aa886813e489b8fa2a90fcb721201c611 Mon Sep 17 00:00:00 2001 From: mpstaton Date: Sat, 19 Jul 2025 21:08:45 +0300 Subject: [PATCH] improve(settings): improve settings UI On branch development Your branch is up to date with 'origin/development'. Changes to be committed: modified: main.ts new file: package-lock.json modified: package.json modified: styles.css --- main.ts | 545 +++++++++++++++++++++++++++++++++++----------- package-lock.json | Bin 0 -> 122367 bytes package.json | 1 + styles.css | 91 +------- 4 files changed, 425 insertions(+), 212 deletions(-) create mode 100644 package-lock.json diff --git a/main.ts b/main.ts index 4707a7b..bad13ab 100644 --- a/main.ts +++ b/main.ts @@ -1,155 +1,456 @@ -import { Notice, Plugin, Editor } from 'obsidian'; -import { citationService } from './src/services/citationService'; -import { CitationModal } from './src/modals/CitationModal'; -import { cleanReferencesSectionService } from './src/services/cleanReferencesSectionService'; +import { App, Editor, Modal, Notice, Plugin, PluginSettingTab, Setting } from 'obsidian'; +import * as dotenv from 'dotenv'; + +// Load environment variables +dotenv.config({ path: `${process.cwd()}/.env` }); + +interface PerplexedPluginSettings { + mySetting: string; + localLLMPath: string; + requestBodyTemplate: string; + perplexityRequestTemplate: string; + perplexityApiKey: string; + perplexicaEndpoint: string; + perplexityEndpoint: string; + defaultModel: string; + defaultOptimizationMode: string; + defaultFocusMode: string; +} + +const DEFAULT_SETTINGS: PerplexedPluginSettings = { + mySetting: 'default', + // Use host.docker.internal to connect to the host machine from Docker containers + localLLMPath: 'http://host.docker.internal:3030/api/search', + perplexicaEndpoint: 'http://localhost:3030/api/search', + perplexityEndpoint: 'https://api.perplexity.ai/chat/completions', + requestBodyTemplate: `{ + "chatModel": { + "provider": "ollama", + "name": "llama3.2:latest" + }, + "embeddingModel": { + "provider": "ollama", + "name": "llama3.2:latest" + }, + "optimizationMode": "speed", + "focusMode": "webSearch", + "query": "What is Perplexica's architecture?", + "history": [ + { + "role": "user", + "content": "What is Perplexica's architecture?" + } + ], + "systemInstructions": "You are a helpful AI assistant. Provide clear, concise, and accurate information.", + "stream": false, + "maxTokens": 2048, + "temperature": 0.7 +}`, + perplexityApiKey: process.env.PERPLEXITY_API_KEY || '', + perplexityRequestTemplate: `{ + "model": "llama-3.1-sonar-small-128k-online", + "messages": [ + { + "role": "system", + "content": "You are a helpful AI assistant. Provide clear, concise, and accurate information with proper citations." + }, + { + "role": "user", + "content": "What is Perplexity AI's approach to search?" + } + ], + "max_tokens": 2048, + "temperature": 0.7, + "top_p": 0.9, + "return_citations": true, + "search_domain_filter": [], + "return_images": false, + "return_related_questions": false, + "search_recency_filter": "month", + "top_k": 0, + "stream": false, + "presence_penalty": 0, + "frequency_penalty": 1 +}`, + defaultModel: 'llama3.2:latest', + defaultOptimizationMode: 'speed', + defaultFocusMode: 'webSearch' +}; + +export default class PerplexedPlugin extends Plugin { + public settings: PerplexedPluginSettings = DEFAULT_SETTINGS; + private statusBarItemEl: HTMLElement | null = null; + private ribbonIconEl: HTMLElement | null = null; -export default class CiteWidePlugin extends Plugin { async onload(): Promise { - // Load CSS - this.loadStyles(); + await this.loadSettings(); + + // Debug: Log current settings + console.log('Current Perplexica Path:', this.settings.perplexicaEndpoint); + console.log('Full settings:', JSON.stringify(this.settings, null, 2)); + + // This adds a settings tab so the user can configure various aspects of the plugin + this.addSettingTab(new PerplexedSettingTab(this.app, this)); // Register commands - this.registerCitationCommands(); - this.registerReferenceCleanupCommands(); - this.registerCitationFormattingCommands(); + this.registerPerplexicaCommands(); + this.registerPerplexityCommands(); } - - private async loadStyles() { + + onunload(): void { + this.statusBarItemEl?.remove(); + this.ribbonIconEl?.remove(); + } + + private async loadSettings() { + this.settings = Object.assign({}, DEFAULT_SETTINGS, await this.loadData()); + } + + public async saveSettings(): Promise { try { - const cssPath = this.manifest.dir + '/styles.css'; - const response = await fetch(cssPath); - if (!response.ok) throw new Error('Failed to load CSS'); - - const css = await response.text(); - const styleEl = document.createElement('style'); - styleEl.id = 'cite-wide-styles'; - styleEl.textContent = css; - document.head.appendChild(styleEl); + await this.saveData(this.settings); } catch (error) { - console.error('Error loading styles:', error); + console.error('Failed to save settings:', error); + new Notice('Failed to save settings'); } } - private registerCitationCommands(): void { - // Command to show citations in current file + private registerPerplexicaCommands(): void { + // Command to update Perplexica URL this.addCommand({ - id: 'show-citations', - name: 'Show Citations in Current File', - editorCallback: (editor: Editor) => { - new CitationModal(this.app, editor).open(); - } - }); + id: 'update-perplexica-url', + name: 'Update Perplexica URL', + callback: () => { + const modal = new (class extends Modal { + private urlInput!: HTMLInputElement; - // Command to convert all citations to hex format - this.addCommand({ - id: 'convert-all-citations', - name: 'Convert All Citations to Hex Format', - editorCallback: async (editor: Editor) => { - try { - const content = editor.getValue(); - // Get all citation groups - const groups = citationService.findCitations(content); - let totalConverted = 0; - let updatedContent = content; + constructor(app: App, private plugin: PerplexedPlugin) { + super(app); + } - // Convert each citation group - for (const group of groups) { - const result = citationService.convertCitation(updatedContent, group.number); - if (result.changed) { - updatedContent = result.content; - totalConverted += result.stats.citationsConverted; + onOpen() { + const {contentEl} = this; + contentEl.createEl('h2', {text: 'Update Perplexica API URL'}); + + const form = contentEl.createEl('form'); + const div = form.createDiv({cls: 'setting-item'}); + + div.createEl('label', { + text: 'Perplexica API URL', + attr: {for: 'perplexica-url-input'} + }); + + this.urlInput = div.createEl('input', { + type: 'text', + value: this.plugin.settings.perplexicaEndpoint, + cls: 'text-input', + attr: {id: 'perplexica-url-input'} + }); + + const buttonDiv = contentEl.createDiv({cls: 'setting-item'}); + const saveButton = buttonDiv.createEl('button', { + text: 'Save', + cls: 'mod-cta' + }); + + form.onsubmit = (e) => { + e.preventDefault(); + this.onSubmit(); + }; + + saveButton.onclick = () => this.onSubmit(); + } + + onSubmit() { + const newUrl = this.urlInput.value.trim(); + if (newUrl) { + this.plugin.settings.perplexicaEndpoint = newUrl; + this.plugin.saveSettings(); + new Notice(`Perplexica URL updated to: ${newUrl}`); + this.close(); } } - if (totalConverted > 0) { - editor.setValue(updatedContent); - new Notice(`Updated ${totalConverted} citations`); - } else { - new Notice('No citations needed conversion'); + onClose() { + const {contentEl} = this; + contentEl.empty(); } - } catch (error) { - const errorMsg = error instanceof Error ? error.message : String(error); - new Notice('Error processing citations: ' + errorMsg); - } + })(this.app, this); + + modal.open(); + } + }); + + // Command to show current settings + this.addCommand({ + id: 'show-perplexica-settings', + name: 'Show Perplexica Settings', + callback: () => { + new Notice(`Current Perplexica URL: ${this.settings.perplexicaEndpoint}`); + console.log('Perplexica Settings:', this.settings); } }); - // Command to insert a new citation + // Command to insert Perplexica request template this.addCommand({ - id: 'insert-hex-citation', - name: 'Insert Hex Citation', + id: 'insert-perplexica-template', + name: 'Insert Perplexica Request Template', editorCallback: (editor: Editor) => { - try { - const cursor = editor.getCursor(); - const hexId = citationService.getNewHexId(); - - // Insert the citation reference at cursor - editor.replaceRange(`[^${hexId}]`, cursor); - - // Add the footnote definition at the end - const content = editor.getValue(); - const footnotePosition = { - line: content.split('\n').length, - ch: 0 - }; - - editor.replaceRange(`\n\n[^${hexId}]: `, footnotePosition); - - // Position cursor after the inserted citation - const newPos = { - line: footnotePosition.line + 2, // +2 for the two newlines - ch: `[^${hexId}]: `.length - }; - editor.setCursor(newPos); - - } catch (error) { - const errorMsg = error instanceof Error ? error.message : String(error); - new Notice('Error inserting citation: ' + errorMsg); - } + const template = this.settings.requestBodyTemplate; + editor.replaceSelection( + '```json\n' + + template + '\n' + + '```' + ); } }); } - private registerReferenceCleanupCommands(): void { - // Command to clean up references section + private registerPerplexityCommands(): void { + // Command to update Perplexity URL this.addCommand({ - id: 'clean-references-section', - name: 'Add Colon to Footnote References in Selection', - editorCallback: (editor: Editor) => { - const selection = editor.getSelection(); - if (!selection) { - new Notice('Please select some text first'); - return; - } - - const processed = cleanReferencesSectionService.addColonSyntaxWhereNone(selection); - editor.replaceSelection(processed); - new Notice('References cleaned up successfully'); + id: 'update-perplexity-url', + name: 'Update Perplexity URL', + callback: () => { + const modal = new (class extends Modal { + private urlInput!: HTMLInputElement; + + constructor(app: App, private plugin: PerplexedPlugin) { + super(app); + } + + onOpen() { + const {contentEl} = this; + contentEl.createEl('h2', {text: 'Update Perplexity API URL'}); + const form = contentEl.createEl('form'); + const div = form.createDiv({cls: 'setting-item'}); + + div.createEl('label', { + text: 'Perplexity API URL', + attr: {for: 'perplexity-url-input'} + }); + + this.urlInput = div.createEl('input', { + type: 'text', + value: this.plugin.settings.perplexityEndpoint, + cls: 'text-input', + attr: {id: 'perplexity-url-input'} + }); + + const buttonDiv = contentEl.createDiv({cls: 'setting-item'}); + const saveButton = buttonDiv.createEl('button', { + text: 'Save', + cls: 'mod-cta' + }); + + form.onsubmit = (e) => { + e.preventDefault(); + this.onSubmit(); + }; + + saveButton.onclick = () => this.onSubmit(); + } + + onSubmit() { + const newUrl = this.urlInput.value.trim(); + if (newUrl) { + this.plugin.settings.perplexityEndpoint = newUrl; + this.plugin.saveSettings(); + new Notice(`Perplexity URL updated to: ${newUrl}`); + this.close(); + } + } + + onClose() { + const {contentEl} = this; + contentEl.empty(); + } + })(this.app, this); + + modal.open(); } }); + + // Command to show current Perplexity settings + this.addCommand({ + id: 'show-perplexity-settings', + name: 'Show Perplexity Settings', + callback: () => { + new Notice(`Current Perplexity URL: ${this.settings.perplexityEndpoint}`); + console.log('Perplexity Settings:', this.settings); + } + }); + + // Command to insert Perplexity request template + this.addCommand({ + id: 'insert-perplexity-template', + name: 'Insert Perplexity Request Template', + editorCallback: (editor: Editor) => { + const template = this.settings.perplexityRequestTemplate; + editor.replaceSelection( + '```json\n' + + template + '\n' + + '```' + ); + } + }); + } +} + +class PerplexedSettingTab extends PluginSettingTab { + plugin: PerplexedPlugin; + + constructor(app: App, plugin: PerplexedPlugin) { + super(app, plugin); + this.plugin = plugin; } - private registerCitationFormattingCommands(): void { - // Command to format citations by moving them after punctuation and ensuring proper spacing - this.addCommand({ - id: 'format-citations-punctuation', - name: 'Move Citations after Punctuation', - editorCallback: (editor: Editor) => { - // Process the entire document content - const content = editor.getValue(); - - // First move citations after punctuation, then ensure proper spacing - let processed = citationService.moveCitationsBehindPunctuation(content); - processed = citationService.assureSpacingBetweenCitations(processed); - - // Only update if there were changes - if (processed !== content) { - editor.setValue(processed); - new Notice('Formatted citations in document'); - } else { - new Notice('No citations needed formatting'); - } - } + display(): void { + const { containerEl } = this; + containerEl.empty(); + + containerEl.createEl('h2', { text: 'Perplexed Plugin Settings' }); + + // Perplexity Section + containerEl.createEl('h3', { text: 'Perplexity (Remote Service)' }); + containerEl.createEl('p', { + text: 'Configure settings for the hosted Perplexity AI service', + cls: 'setting-item-description' }); + + new Setting(containerEl) + .setName('Endpoint') + .setDesc('API endpoint for Perplexity service') + .addText(text => text + .setPlaceholder('https://api.perplexity.ai/chat/completions') + .setValue(this.plugin.settings.perplexityEndpoint) + .onChange(async (value: string) => { + this.plugin.settings.perplexityEndpoint = value; + await this.plugin.saveSettings(); + }) + ); + + new Setting(containerEl) + .setName('API Key') + .setDesc('Your Perplexity API key (required for remote service)') + .addText(text => text + .setPlaceholder('pplx-xxxxxxxxxxxxxxxxxxxxx') + .setValue(this.plugin.settings.perplexityApiKey) + .onChange(async (value: string) => { + this.plugin.settings.perplexityApiKey = value; + await this.plugin.saveSettings(); + }) + ); + + // Perplexica Section + containerEl.createEl('h3', { text: 'Perplexica (Self-Hosted)' }); + containerEl.createEl('p', { + text: 'Configure settings for your local Perplexica installation', + cls: 'setting-item-description' + }); + + new Setting(containerEl) + .setName('Endpoint') + .setDesc('API endpoint for your local Perplexica instance') + .addText(text => text + .setPlaceholder('http://localhost:3030/api/search') + .setValue(this.plugin.settings.perplexicaEndpoint) + .onChange(async (value: string) => { + this.plugin.settings.perplexicaEndpoint = value; + await this.plugin.saveSettings(); + }) + ); + + new Setting(containerEl) + .setName('Fallback Container Path') + .setDesc('Alternative endpoint for Docker container setups') + .addText(text => text + .setPlaceholder('http://host.docker.internal:3030/api/search') + .setValue(this.plugin.settings.localLLMPath) + .onChange(async (value: string) => { + this.plugin.settings.localLLMPath = value; + await this.plugin.saveSettings(); + }) + ); + + new Setting(containerEl) + .setName('Default Model') + .setDesc('Default AI model for Perplexica to use') + .addText(text => text + .setPlaceholder('llama3.2:latest') + .setValue(this.plugin.settings.defaultModel) + .onChange(async (value: string) => { + this.plugin.settings.defaultModel = value; + await this.plugin.saveSettings(); + }) + ); + + // Perplexity Request Template + const perplexityJsonSetting = new Setting(containerEl) + .setName('Request Body Template') + .setDesc('JSON template for Perplexity API requests'); + + // Create a textarea element for Perplexity + const perplexityTextArea = document.createElement('textarea'); + perplexityTextArea.rows = 10; + perplexityTextArea.cols = 50; + perplexityTextArea.style.width = '100%'; + perplexityTextArea.style.minHeight = '300px'; + perplexityTextArea.style.fontFamily = 'monospace'; + perplexityTextArea.placeholder = 'Enter Perplexity JSON request template...'; + + // Set initial value if it exists + if (this.plugin.settings.perplexityRequestTemplate) { + try { + const config = JSON.parse(this.plugin.settings.perplexityRequestTemplate); + perplexityTextArea.value = JSON.stringify(config, null, 2); + } catch (e) { + // If not valid JSON, use as is + perplexityTextArea.value = this.plugin.settings.perplexityRequestTemplate; + } + } + + // Add input event listener for Perplexity + perplexityTextArea.addEventListener('input', async () => { + this.plugin.settings.perplexityRequestTemplate = perplexityTextArea.value; + await this.plugin.saveSettings(); + }); + + // Add the textarea to the setting + perplexityJsonSetting.settingEl.appendChild(perplexityTextArea); + + // Perplexica Request Template + const perplexicaJsonSetting = new Setting(containerEl) + .setName('Request Body Template') + .setDesc('JSON template for Perplexica API requests'); + + // Create a textarea element for Perplexica + const perplexicaTextArea = document.createElement('textarea'); + perplexicaTextArea.rows = 10; + perplexicaTextArea.cols = 50; + perplexicaTextArea.style.width = '100%'; + perplexicaTextArea.style.minHeight = '300px'; + perplexicaTextArea.style.fontFamily = 'monospace'; + perplexicaTextArea.placeholder = 'Enter Perplexica JSON request template...'; + + // Set initial value if it exists + if (this.plugin.settings.requestBodyTemplate) { + try { + const config = JSON.parse(this.plugin.settings.requestBodyTemplate); + perplexicaTextArea.value = JSON.stringify(config, null, 2); + } catch (e) { + // If not valid JSON, use as is + perplexicaTextArea.value = this.plugin.settings.requestBodyTemplate; + } + } + + // Add input event listener for Perplexica + perplexicaTextArea.addEventListener('input', async () => { + this.plugin.settings.requestBodyTemplate = perplexicaTextArea.value; + await this.plugin.saveSettings(); + }); + + // Add the textarea to the setting + perplexicaJsonSetting.settingEl.appendChild(perplexicaTextArea); } -} \ No newline at end of file +} diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000000000000000000000000000000000000..c0cdbaecb3251c91902433d609027e03b2f19603 GIT binary patch literal 122367 zcmeFaX}79awjlaB>R04AAD?d@L_oC0%X|rn9g3oY$Q>0m=o{&z5wPmkZ?6T|ZrdGk zcGk_hInIdK3OIq;tvTnK&Hwl>zy0teSNri_|MDZy!obloP5trzf}=Yvj4a6ObEh?@k->Ckxf&FYApQ?I<@_E}okptxmocnTQsg_hemLtVl z6d!*QgNK)kUo?KUDo!b`KfhgZ3InH*3Tps$CFXtw}A0z5)k>#zF>Or|Xq!NDLgJ(3t%bXEr zLNMYM19r6%_vmP{^tZ`8^EPP>X^xkY+Y$Q>E0G$rcw5(rzy9@bOI0ga@E|k*XLp%B z&`JWIuX@D&QfS#8q+6c)p*TqtYvG3+YSNMYPi*^|06R-d@8cgiQTUG#pnwbTU;F{+ zFJQgE|J+?pHxzEpIb_PuscnxRE?0wn(^m}A-ql-uUz9gO1|2qu)&QPceFxM z%Tp*o%IOy=qI_(${HUdWZva(=J{6;bU_+9XeFTBhMDNk@Qsm#J;|*j$$(ac3wN)O{bS@gEJ#XH0 zTO(%D=-J|Q?@D4T?>FI1dLpM1B;alTtHe3El@ zrC%&<2e9CcOZ*>zY97$kmy6I*+yCvaaO*und1~le>W37%;4U{R@6VCy47(uK`P-Z1 zYAts^OKr3;fbl<%;$8^ioMj6({#pc=@5y+eQ&Pe-kxu^ z=PWH_T|+U40v5!`7(+7SKDmn5|MkSG-uM#mFD2M_NY|N2P4t>*P4qponJTtdIbayj zO|TfQYRD?Hu2pYAqWr+_2be&j-}5lP04!Ya30O zvX%KrG4%1)KQCHWQU=Hdknqn%xa=Fr24G(h4Sai#WOWgzgTW$1cyc&x6A+v#ON3eG zI7Om9(?OG9gykAC$789ZH2Rzh)`Z2F2tD7!`mIQrr4rX_HdSPRlAVykvhk{cJs?@} z`u`jRQ>8EkHf+UXzgjn50tY0!{Q4fvdc95*?Gb^Lc6O%pGCJz#jqaMp_{DCtm6|y= z5FDG{n{%;+k9U*>BXT$kbtqMH2O{M_p3oy^8o~>;ZpSOMufYNFfM(w$X4Okya>Jij zj|W74hmf5?p9%K1i1l?L!Zu+JEjRs1V@Gf4hM!yGUT%!$TbeheG(l?JX=j5^vvCeJ z?e%6Qn9d-b`b)XK+V;IwpIG3L?`N{;r+F=)+v^95*|&(;cMwYtHBF96=q~3wuVpgL?tIVlLD#VxB-Cp*6=$VFy}{TTNPR@&MLS~! zAc=uVU^%4iWVOHRG`R>y;$0r2!Ri6kzDdXqZ~bef?1;+m5VH%|7esqo&>D-)c4;pc zenVYbkiGB8Tzlrk@NQGDd5qCocUs|85HzU<{54Z&Mk`IG*Ru%8yeX%*YvRhJ2`Tef zhSM8Ddpr#^YjXD4uFQ{b5wve17>MsA*|!+^C&++Ur_b+6*Fqey&VIMuq1^rw>X3Vpov#>)4-1pDXLuM-NtK_Oniz9iPWR-)W);wD!&wzS&rhLH(z3E?(i z+6;WN>CVW7v2VHbe2dO7m#15DK-5fj@4Aqf_IYl+V8}hKiZhm+FOk|R;ia9jiXKST zHz~t!BbX&2jbH9RSM(}CpU72wc~7{c!AfNt1mVQ<&3HDAXw^cpUELL1I@h164o%rZ z%FH@57t3jCX)2sO2v#I)sSJ)fy3qGTY{8A$g%O7s>qi(_muC-zt9<)kZq$Dpu^iv` zjBk^#1N0Ng4&UFS8gI~@XrK!71&dQ~jTQRpeCDu_R&U8nb2VY*1`aJJI$zt(YSz*q8Lr_y_qR`r?kv}jvj%fJjA)IRkQ4`gQ@Yt`7R8^98 z1b-sk@xXhuTk#g-1lDd&FWXR%Bb$!98F(Iw_BVZjR|Q>FP&H)SxdUT+o^8~+jii^V zPTy<}6B;83ufOyg+ZhRW?I5sgG2ROI4?A3NXsF&e9}~C2Nm_TFpLnGl=PP5Ph%3z7JUm@4&3fKM#*Jwu)!fp z;jL^lbkCahd4%!SZj` z)DYwW*^X%V=TVap(ynLUq$5k%C!&?#-XmF?fydD@B@(Lb+f8RM$#Y^-OO&i{@gBA1 z)BxS#LuulMsa$W0ON#FR(er1sz~Lj$p6R*mX6YasOnNQ3x!ZF*!Sx@ItU|y)55c~} zjjj|UfP5m>+b%TGlt&~A%cw*5R&$yOSN^Oq9z-_3XDlfRbv(^&NQisPGV*3gmQv(u zFpl$@NY&L9Nhb>$)_1fK(h_5n3w$g0XzPIy@+~g(H>gBUi@z^YbqO4h>+o{6g3-ID8CGHNV5rKu+4z;-u+3+>P>Ss;TN(%Xzhr|Y)Gh>&~jFw$qp zUL)!d5i;HBTm%^fbLb!InpH1-Y0vz5XZnE1?+~vu=rh6I7BH0)5;4S9nm6n^lYu(f z?79lvBN8-IS5~&{%#9g7XUF7pv*{aYlI*4aVy#Sr6>9ggeXt+Hnk~2TUb9i>GGgnI z;k^Bi6tM3gmJgDuzE8xipaYU!eSc5LoR-+x3A1`EFGq+aZB<4`0$Z9cR7}ettqJ+= zc*u5ma_kP4z=K{Pdm>{|-Rruu@sxzKb`~lN3(Dfos+V@e`B0+L2UPo}_{ZU`f31`q zQTZKWb^-f>Xm1OeNr!G%s!P+}G{j+=h2Zw6gG+mOR`0Lk4g<#x$y^gUI<437?m&zo zb=AsUtk&Vwk;y{ajpz>H0nuyGn~_ZQ;?5X19vB_P>;H0-r5zC-R#kOARNpWh>x zns@ry4u;4OpID0y+SpoNe+&euk8Xr|Kt-xtuPtfQ9f?MV>ymvp_hDdobZn+?O~=-d zFjRSExGTew(ShHwuo&MwAlSFaT=~AgmQWy%0K{!8rT(j9R~N7Wu`a&7M=rF%P7OuW z#OY4ZqYgRhVT7LINQ~~Z=}?6rp^I2GsBJ7Z=7MkbHwZs-R-U57!`euh=G1)G!g`#K z&$A@!=e2!{K#_l}=~%w=cM$AbqWTqu4pIH{mp7?JtV~02yUCit!_lxgos+eMYj+3Z zEu@8{oJ@QoAyIxcS|%7BcMJvWZRTFDz8=E-hGY^-w;5*~_QEzT&PMw%9&f@2)cT&N z{W?~lwyq0Y%q|iV9XlbL1SXGNxL5GR}i+_2}6)@HT7mWL%Qt- z(OelKgv(8Rlyju*C+>KwOp&E|d^mrQhF*B`B0-=YS8DWQNz9)Bpl>n0vZ zaX(fXB(dcb$*niReDo)N%tHP`g7A}@0Qw!O8_Iirls9;hF0AIcEF**>*&RGFrDkVm zs{9<}R?)eKr;Rnp;mHXG!5MmOh)blI)~vZ)@8+(nU|VX0p=||PAh0r-EP5)A$+6Z6 zI%nhYt#JMQWc$Ob?5xO&{jf;UF0lCHcLY?79LgN3q~nJs#_ur5|V zT8A3|t~z`I3{}8=!BL%#*y)ZEH6hzmZqwVW8$%-q7;$1X91^IB#&(|y8_JU4rebJ~ zz_QnnBv|ccXEfO+-HC^IBh{JlFoDtGh!RqL%)6! zpLELrW=<#-RV+7B4U)-E#RXr){S|D0_RCup`nafQcwS3GF+;HbW{s1&+C~Q2+6s5H z8}1`>@9VR)$#29t&Gxl6vqPJrx8n9n56<{HtSURo02#3YH*dmI*L4}|PE}ry>c=WJhJ4uulJpUQ-?&mCXQ1o?K9_5#nw%7}_~UmV>qk!h?T2f5 zmMg`IS)KwXK&8@!3_qbdD1!kaR!Uu?{=hE$xfQ0sEZ$$HjuXT}YVOu9weOkx zi7vJWc#mDhwM5irwm7rN8MJ~$Di`56?XP?ngRthZhdMK5YkS>+a*pS`C5`v>yDT}9 zr)cWOnW6=QpXzb|_bXBi&K4@JtdWHO9HB0`=Y~WTGgS-9n`Lh&cz`yi&mSeA7epE1 zK@&0O7Gb9_)1}fBUf~vk*T{SrPFGV*U|C`>BK%Yt*Jn&Fr-APB5L3tYJz}4-ZElfM ziqMP^Zd#);X-l%x;oz-Bcev=B>f-LzcYflrQqBrK!{3s#|K|$?GBpPj#NIWG>OkfX zZ1AqM{QaO;4l45i{H#L{2Y?m@pkGjjx02l5^;~6S)zPggYF(v~n#)0$`$=EvI#M>< zO5w6w7b&QS+y%KbX}L#;%5r~yc?|g-u`aCdlwDE8|spx@1@N=FP%TMUTbP*Ve?TI9!VYkeXkqII!*5yGCaSOnjgP|D(Rz=`t67127VZSfUM@|Xq%i2@ZWye(MK-1r8@!anUi&R z-<~O#px=IgsxmA1DA}$s`86*-dOtuN|2n>_7Q8>{{5-duj;!@BtLapg`9v+f;_z>> zn(hE15gNW}~n{P6^|>2nBW*l!=k<#GZFX4P#sTqV@W44gT9- z|MIF%ya?8ubnCSMoGixsO1*Gx{$-8cxK?G4kzZ+z+IKBb(3az*roXzX+7aM!pzMKWmy{wUFlkV+S@w~x`f z(M8%zkI5H&qsiJ+6X$!u;-Wg_Ek*N?!QZl6-djN`{Ze)dQ9gcMS0R!}(zmzT-@&fm8ZMEGQ%*1pZLUQHhZi&#dxZ^-WIc&CgM_o6B zHCkVc;SN<71xwoW=8z&Uqd@9mgUAcIlby0&`=f#GpzT(jA??2O*1GVn+fXq)2;m*f z#Y?XWG@;RUWs{%Z>mZo@3(dI)q&zfSf`EBk>`w%szf{rB=!Tj_K=g~t&fo9B1_Zsl z6^I)HxGzXL-&hIMN{4n3>1cBv)rT)na$GP#5;>G$Tiz&5`ZllIz;~>g-gUP27JgG|zA4yB}I86)u2b#bzQO?EIVP ze|5Hu`bUB9MSd7T$1YYSxM~;S2I}>$!6WF`SCx0U2439a&(Lnk?&pQ8 zQV>S>LlAU3IusY4PjTCiB(w^QfQ^KSer4LlNl^tayC z+yK;puc}|a;3pC?$b>Plg*91*vrVT)G-}GKK9BZkwsyTHzs^X=@*HvzFEB4_W`iLx z)l7PB4kzX|i5y&NjcwK!J-ZWOJ2TCuEPPfGU!X&YR8`Z0575M|YeX>;%u56$6#`{}zMh2vQ6V-+FwLYzwiK3JuT24Xkd z|9R`{9`kE~FKeN;-+&%!e~v>Qyy6YZT*QXo<(PY*0Snzb41(!J2;h0#gPF9TS=&Pd zTQG;B2RmbP)02qKa>~tF!Csj>N)piAo9~lp$4BGsUfas` zXzGNCG|dq;dB{>PWKJvExZPLcCux5dQ70u{0tF~4{{ppLaL{v{%ojcq@m)b5L>r3~ zX>v9|THqo}C6Rd}04RXOP6&;Q4y6 z8HY_hQ(NX}A-0rS)dyT58VBVeR7)|M?aYTLNigDGa@ z3-+2a9g>vm^+is@EB^AsR0`FyvEz-Rt(N`j0p8pRJLwN# zSX6)u&N+StG3D2~bu*%}C_qOYH^Qx84~)AJlDE34tIZ^8Jjm#EY}8`V6sESR?>%m* zBZ^$}0wdqLts1cur>d(Pdae#NdDdM`V7!s)`PrNLv|PWykE?}-Rs~ON+XPFFw|*&bB5w+4PV zBIK=;?8kGjRp$h*E@z^LbJL#LGlKc3D@A(hwY@&t>!WAX{U@}X)w7{itbos(svZ?7 z=!TntRC86myDDFFhW#?LoFM}yIe#hD@2mA0!M8k5z*`ZEj6u-=ZL{g1`}TrvF5+P{ zRHklV?1; zw@Tu|%P4;c_ECZYe?QBhT$K{?+yOBYSMv1e=w{#OGT_>@zbvDdKmo!F7rxlc1b|*F zbyzoN(HcCWxV>g;G(74LJBkJR$myKiw=!eVwi%GKg?Zb}s-~>*m1t(9Ww@5cV62z6 zML$|Fe5XybbS~HWoYc>0?u_dv!MvNO#KVYC(KEB$j(lpiA5n1Vw0RG&&11IC+w6P^ z6yUXhUEmb}dV$w`{>dft7v|G}!z<{#Zg}trcPRVy?c_Ue2k2YAWf{$TB{w57+feh|@NjYm z^<@SF+4h{%9P=A*QNzffIXAi;XxcI;l7n(>fN>TEzB{XMDL1!DjE`+wUpD7jgUQIc zpAN4JU>c@NtY+*ldcfXa$!Dhw^|k^1#P!2 zdpSkfE8WFb8`6z+ef(Z~?=LCEB2)N32yu_<;f`z;na^Ld%&$pWg1(T=BD?ar`zG`C zrQx?})YNAkZBvsbgx7-SLC~XjjeOB%wTZtFliiX4`%cW#<3}A(SI!)!r2URJySaIG-+twq_J53g?vt+YH$*Jt@~biShc^JEyzNC_ish?tyHht? zt+grka#|IJJw{)wg4|xjUAsR3yHOl&`LaU83d?p|k!D9zMrGqA&(+|RXW$u`qV<_& z4M=!LU<;gI>Z~=psLp;u*K>x$Mc4fY4jE85kETuBL2Qx4{YCM3bOV4`Fw~+*u`Rsn z=OWVbbpbavqB6GIgLViirR#3TaFNBL*XrPcuQ=H#8T)*_vqwUTh2vd&BF@+A-6(e3 z9!y#k%TD$Smx9s;L2VdG8L#z+VZmo6_A%mLrazs=O@N$8Fo+}mI0k#m&iL42GvWs@ zS*neIVzR{fXy`}L2iPu4t9_~>-|ci#+ZE|ZeiABGFuL&X4=nxLkBgHZ=gAp|&4h!Q z50a%pWTCok;TWCb-G>t&A=n}Qa4fgnbo}uIIa*uV7l4}J-lCGy_Z+{-@n54r4WucUgs8@>il zi~Yn8)O^?22Cx7N7q52s`3oL4_FN2Y;}+}*QLj%AdrAjcdpbpA7_&*d4yf;Ub_oes zdQor4ijV;FTa)TUZ^)(cc$KYY8KSm>)&g|VlMr6Aq!xFY=#lontslop?W*-|X#&r$04$r_hA#!4~R zjgk7TzC!g=&GnbP80mot36deK*`Sx!NdU zQfVMWLe`eY31;+hl3VqLOg-8R*%1qk;c%#BsL*^Xuvn;-2didtd@e|-& zFl%W?ZvCE;fo|FC9%UohLw$~-G#5>~V_nIk{@`s@{1j)!(sd76)lk5%+87nK3YY** z#h;G@oEHf4C2hHoJDQGj&>jc%;3EP?T3OIXn1lwy!k|!WY+bIm>5W`(5)m^AjN`KO zZN37#4%V%xh(hzk_Y}Yf{k&HHNyp5n|?qN~lu2`iXSo&W73kPcF`36gcgoA9~ zNGovr5MX!w5iTr10=yP~icL-c<^@{wU_a;q7n$6fHPRV0!;mx<*box&dA9)veN$|N zPAo$;G2|z(l&WHCXShjWf}X66!D`b^c04v1iwv@Gd~Meu0)%{9R-d8uP$G6xYCqmk zflo(L-r)Ii?&RC%K}ovD_bD}H*-YY)dt2S)1r;2TvCIL-lTA^yW+Y=w+5RHqh{X`+ zMk{mK@&-BA?|2g1XbHVe+HMW?aMI}`A?LtJ%B_52=c^-D&KvYH!rR*O$M4<>!tU zm(&NvX`vK=qWS6}K`000)*fH$RIXD*OfFs*8IL^A}Dr~YLPRmNth~TxEwBpE`2r0a%ui(Jed-|G+ zYx8CujcVuE(4TRX&$vI1_x)pXTrP*#l)u9zS9d#Du&)LGxj0|frXK3as@3M9!}(7r zbN^sD3jM0Rh!*a^Y-=Ew-zHGkcPb?7`pA1CHX=;6Hzdf-N>SLgHlBn7NlhT#4EFAV zg?lh9Y=ZsP;xhuW*25;}&ErNKZiPV%M{7z+VK*ClWILoM(KHignV&MyuUS^Fn7*uM zjDd`mJ#bD-8qkd|W@wjC4r=uB(*Gpve@5b;UL!s$xbNcZtNQ@HzWV+iSEs-Z42HDV z-7w9DzK)muU86Q%w|b68t_dV&+`0~iU2T*GY0pf)u^ZZH>hDMRcoa8&oF8W25;OYOn&-$=CQcCOX}uV4%~N_m~Hhr2e|! zQuwagRKNshDEET(J|pMiXoIIv?#6yIv2v~#s~vyO4kLDD;*&-TYK9ozOE+=~NZ;BL zdw5^`XlyQQdB_Zakt} zXb)>83lkggBCPB*jpyuwT1ECPYP1Lb>#zl@t|5CXxy^Mt7t@3+yW$9fOLyvV9bg> zPA7`W`a??S=XO#>km}R|E7Dw0JY2%U%MH{2l#0Dng(dqJnD|qny5su!UD8{^2NGNU zeNRgH>DC=2XhWhVz+Gx=*LLot&HW5QC}^+?;(4li&`iv7zJb%GXf%e?XfOCG$|!;r zt@bmbzgVDgNI?eb`i$Ka+`%tOXt{~a9}XO`SOn-naP`RHcigip_wy~WJFcs*9lA4H zfGFZ83+kWLt9xb6|6@&@Pa5#MWajcVKy)s@z9&IDF$7@`QtcPT{O_f+{s#;%zinV$zV>wi)P20%uwsR#N_^g|e!c@4 zaNnJyWkZEm^)j5PZm>w-Dw+nh2T<6Vj;zgk-^Bg8)L5nsvp=6r`;9d`Z>Rbo%JA0>qxJJd9pj_7Z14B$W&R9@yx!KUF!yZhOp<|`mO%e- z$2W|NuKkxi@Qbvbiswdt-elR#fA)}R@FSXnQ!}J ztJYXSP06n{*SL{D^G-TX2(wS^O^ifoC)zKP<=7C{$+oxkF?s0P4DFrWhEI5?WcI%L zbS+mq=e=APBY2wO$CdNE4svJd({)A}Q{M1fT>L)GSoy z&btX6C9skL04P|`3J5Q@Tzqa!{b`5$?yO`^46nIJ3yo?BfO=mnAj_Z<$se)0 z8`7T`=$V(lpiD~F{7yfwQx(%?gBD44v_nrW(8Z_JFccV@5Scu#CTiH71)pFaixUGZLDQ*s?gemHrMF!oi z)TH>_M^s-Kw+w7GLVAp{a+79bC~x{)qCo+bkI7Yw@6&XmEN8}6+eD~7jrv@&(vSTM8^T|7zEF3bU2sec2@OB>0!f)c=g_`X2JdgBQDz{mOXylJ|5EG*ANf z4wpIoFKwRx08RReNkBm9=S~?RzQIyab^lf4?+mffkmql}rz{li^ID(13{rzSBVq}M zvTgBQxnXYU-hf$;L7mj5#c=aXM22G8MS4vp&SXJkJD#_&;PED_4ZFUn&YWJ*Xf#ru z7!OTN9I=aw3c|NclKX}^sOJQ;-9SDOh)$PvZe`QT_u>?P`|F{St>U*Yl#>?K!<$Pi z{{M%ru75q;`GGkf8fD((Q4L?J$Uow49>5g@J$!u2y=>LmtF0!>y?r3Gr}NrMYEBz% zDH{5QHlOU3eoPD*HJA(rIbpzcy^cwX9#6^&we9QB4CG@{HX+uw4M?U)1L^LPkiHmZ z`h=RZJT^f?Qt+;Y*?y-ZEbyXSOZkW#(Czddmi~Z#xCB{X>f#P>>4Ob3wYyuw#DlCZ zte9a9W#zqZ%^`2O84xQbQ5(t58-dAlFqB~uPO;)-w5$`#eoNO`55!&8&~nMbW0|8R zTMPnZ*uH2`dDl94xOWLywy?UN`i#4s<=?|y(SPczTBCqfAg%Zd8qyc&f37L?HL>v4 zR?$k9jZfk*4iR_7TCiB^Hs(5m}ofKSZi;mJ8{2V4|;Yyw3}eKA3yOY zW6IpubTk}H+8#i9V|)?B_ySAHd0cJzf&kKKKF4pMgT}M| z8khUK7quE@9D{z)MGxP~tt;?wkZ#ZhuUHU4{|hiCq1gQeQKs`IFVMfB<%<=WW%tga zNnX*W;@~H4D`3E(zPQ!nh8V@h*N1ia0HqLB>**6E20tw!znvj>hl#!}Zr8Iw3P!p< zQm&n^1a1`9cY}OVvt14pCE6rT!OUD#6y&=>aA6aE zu~k%w&SG{+^`UgVUv-DdSy?cq&~zd4-NrDo#!l$h@PXcB;TAOt=>-+3{$x*UGg?q$ z#MpIP{#co^>Tusrf)MN3HL9z%00<{jU~;cdf^2t=bpHu->XzexHZsQ!F~EI&bNB0H zRX$is63dA#?*nugNgkN@7u{&yjfKhAPzxelA9<_Sr@Rr??N!7FYrM0YnDk=a3`ENj zllIudR^5>1Nlwrk3lv4Pc;ix2l*d}8w$v0s;f4_tS?D}#jkqbw=mI=cSO-qR(C34)?t4o>L8(Lj*Sm~<26!S)0llOL`hw+adDL#>TpJ9jLg@@5 z$bjr@O`=UD*+^nnUDm)GZES#=WMJ+;@T!4-1E;oc>bI@U_9geP-O?(Y{vW`YQ zW;NW78weJWt}URoZPuP7J14@dUCvO95@%>LW5+BaEfWflBIzt}e|B|wx)ECjeC`Pe zu${l^_f^3opuCD85(vM&UJZQOlg(Z}9|{53dDyosa^mKcgnF`#4ySCMm<{AuE@G%D2LF^EuU- zMK%t`T4gfk(`zN_4HlqrD&s{qgf*u8a!$+Weunv;kn%lb&%5r@XOyYl@6MQWXCAorqLx}2DmA-s4 zyXp+^M1|tX!J1UGFnDf;snfiM5XlOW8Yv@-gJCiegQa5F{bbBR2|0!mSrL2fsUUa# zmae1IR?Y_)sn<0f3=*aMwU2GlUWTjd_S9hefzsN7 zSR&~71$0#bpk5#dT7)}PjnbTDNZmL4!M^P`*D})IBa4vhZpi@_E)$S)hD&Db$ZOi; zv$P?1dXu?hO9V~{14$5DX*5uMwYQTuChcy|i}nkh{t!WByHeExMn71dfcbP!a~I~# zSJ%EnpymQ{g|g50D-E7k>miY}z4^GsGh7lw!eTG81k$Qa@Rqutq1~FcH4sA|4JO0E zU@alCQE%dz4b$0#TiG?98_SkB@l%k{)a%K#0y0aP5$v9E_XUF|l637uPISG>@GmA) zzq^C-Dud}$Z0m+!3o3lEvC<{T3-p(l?yUJLk z-4^Vqz+oc%V7be~UZ0nhd2GUkrck%w* zw|Z`R`2NPa+k&7DQr^E9b5=@VCDsb4K*j-x7x>CI7AAOfqT^T{q)8n=l*0$F$r?t~Li1=h&p)x=s(8-9J)q*CY{WBwj| zeMF#{P0_aIF6Ii8>knb>4EBt})183S7xC!lOG+1SCLE3=&O!*gFemg-nrbX38PBI? zr^n1c+MLEn0)V+%n*?b}OPq?ob zo^i0V9%<7uzD> zrl0HRzChJ| zgXb{ZSBeT+SBCB}V!o3Oqd2~xF^`t*1B{27b9Yv5q1?XM##t#~6*w>cmaEdMX2Cq$ zn2?&c+`{@w;7nKjS*39^+#feI2UPhFIM!*vMaI=0hSM`NO!i0m8%YJtvY)!FW4}##Xut4Q)}6$^6t_ajq(el$ zSgYar#_tZPbRi+a%1@U%GxOUGa-G?Nm9Hs2I-CXk9%ar)K(z&FB^UQ?XM@je3pr>7HFQTd5Wb)*XevWu6BuVFaY+e znSEtiYPq9#L$bmf_+mWp0Ieh%7+(ttPfH*#$mS1c`%UC74WLXy%aYdpY0cjV-6g({ zJt#$}Al^YWV=+`GDjkjddV+TJHPai-@*29JCrM}9PaA3G5jAcOeBZbwLGqbwFI3Qd zr3|F)Zjkgsg5Kxjpy;h%KrG_`ulxi9_Xf>bQ_Z`UKk^NN=m%jx=*0Zc9ht#w1BHHP zugZu%G@CFKLEbFV=S|f)Z zrq&;+IX`mom9!=>sv{BIb~+{-OB6Ji&0PYMdc3k0I)B{0e`?&TK5!j(K;8T! zgsjRobD@R{Ljv^Vo%Y$@bVPo9U zu}tBsU5;1bzv_*%V)ps7Xt)Y?Bed`Xl=#PYbEFCr>x+TDOOOTXFYZtpTrU@?Ap?2c z5y{RKA+1lwyeU#`iygTACg=de4@sll0quU*w#yDp!?N2PHtFrc?S>m;Jvq+vy_ih3 zXF$hS1UK`hn>iW2@Xns7i&tCJfM-<=BtB_{ z@CP7SxG<4#F!%@L{}yn8%A32rr3*B~n}aFDoQQ@@A8dm)49*bhO_s@XZC^)e)$WD8 z+ITtlr-B~}4r6TAw8)uuQ=T#=0QTr@=;8#L%FZe;dyCy#cshPWD2!%jvt?V3rrll{=igB;Bi z(tvj~?`5s_DzEqDMQx*FO4{Ljy}jD$nGIpl=`q}R(Nv;`qWN;|da2N&k7Gyyq$A(m znk^O57xmgT)C!50_jyap_4>x3VYc=(W4Ud|wsBSRHociL>jSQ1Qd}Y)oqt=Y^doVI!SZpcC zl+_^29WS>s4j!g)yXQyk9woWDuW7XeT23Pm?{h1qjyij^={02eA~E%|pJRdye=mwb zKEUGG!lsC@RLp$WOt>n&)lN7oi*Ju#-&^6237^%?j!tR!!k;~AW6)gv02-34>>~)k z#DjwVmvp(j24r*j7RWma-S@6~3tIN{Dpd+okiiFT`Oam}Vd-Fwi5!*B{}kBqy64b9 zUymevfs4~MPw!V>j_RW8+m+hlkxo`5kWFsJZc&DM$DH_b@BnnRJVGp0^XXe@i@gdXFxDaoM0Bbp z{WNU0oc<8R1E5Vb1m!)x%Jrv#67vQ-Cwu}RX z86g6(&yfDM6|Ls`k;F^(JgO(4>v&^LY*ZPx-Nt$|+oS!aW^g?sClC+Y#ne#L^w|bm zNhl}Cbh5y7dNW$7U!7X>#637}xl{|#t7w8@#bzQG!35~biNlBPGj~|H{S!IGMp1>*%RSV!&fVCrL>)1#3%4pCcRI5N)=V_sW!*J5WbP@C8ieQu7-`Z>Do zxC?ocDMLqV^{KQU$k>P!rM)AKpiVZnR6(WQ51>{kzHicjwY_+sauXu)tT;cu*JUHO zQ{1au=RaNlX(&sPsZieVbS=oVDx1qoVJKDGAYidM;r-^abEFR~TD*dx)vv~77Ro{h6;-7zg7@e~@%&9FN;Qae?^tKKHy1?Tv7BKL9V4Cp3 zHU%)QM{`#N1(ze;iy+J?oON^kaY}dr7W9NTVX?@ghyYoRee6mg=bKiiFRH7{Co6W` z;L~`?stdpm&>;i{)kR0h#~jK}b$Hi%dDY~Z)9sG?N5yY0I#?bw`<0d|pW{Lif=R*^ zua%wu%Clgu$}yyRI(ymh>j2_{r?dzR8m^EJ=Koy%dYfp+o!`sp!di4@z(F7A1G!*X7BgHOuM7 z7gK$T%%0PRpyh&bq)7vXa4j<1BB|q8)}yi@VNJm4U*Z4XFtpbs}$|$%da;E4?ii*sXwqC z_(_Crtg;J<`r3;2QA*``U8~x2mf&72ZV@9)b-Lr>Xc)KV!wx;!jTX2-^N_G12BA8vCF^E7;hYvEHTpG6I)_j{2URZE<16hCL7o`U#AVAYP-zSH z>B`Sw4t&{E>rxxMGFATsF|S+qe5!^8tb0S;GA4OY+V6_{C$NCBpN>>P$yaG}?PZ&@ zS4ddrR+s{_cz>CK-Nsl*&E49i_C0ey(Z%)v@3E`6mWbNS7H2j&gI2Ie;O8cG*ogt5{Lj!-iFF zt|5;jsfeMvBidf6mNDLGM&8t8$?0IL@Ft)WX zO4mb*fi{^hcA;)1=F*_NLF$El`K}f_!2@_beSWKwcZ3H`#GG4%ox)6)N>g}+TL@kw z^I+jmD%c$xerZ^Ul09JVp;TPdIPaA~U)8Xmt~ejZZg>5STw+jN8bOE2nO;Stt zBiKg5g?M`=njlXa>tMR+v^1pMbLZaFj=GrB_f}z#YgvsxjyGeH#%tcJMJFt`T;_zx zr8>J62qWYN*hC(*I~TcsPw@V>nRsrcdD+hO(B$;cinMU_t{mSo9P();C~VAkOE&(` z>%W4A*QUoE3-Dj-+iySqplu152}BJ_+pk&CBKI(IHZAex~Px`b4b@Mf8c_MbrV{?=Zn3q zgKy|in2;AT@`MgWH1Me*f8puh(4o-kU(D`2KWa&cBlOb1dnFN*iAu~9o?`bFv(!f2 zR@azpT{E4-Fga%-g`CxbalBR+OHW58!)Z(JY1WXTWC3Z4D&y!JgcEHYF}M_MlZeko zyOca9b$o3#{4+Q`23Kzo3h4Irz(WbG#Af;Ft@PpzA1Pa5gHAg^v$YWG>c*gG9;@NGKND90!esb{Frh7B1gj5bNxsD(RP@ zvQQH*I5d`wd+RI=YO}tYQVBp6cm#idh6X=>p`oQANM6lwS4w#aAWd=_q(@Px#q4}| zOD(f;I2%HK9UJ5Ors3myCxu5%igjfg?YW}{vA{P5--BpMTqQcGs~u;e%+3zS#maeh z-=DDEt14D)2O{f{pM>{kK^OUH_`%kGcVRn2Ebw;z2AqnbDD(LO*O@Qj)iO_5zl-B= ze}y##O6;+a=r8n@rNWX!_q*!}P??R~X>mfx&(R-2Q?v{_n}WS7Sa!9Q*PR>#i;$A@2DY))Qoj$Up}9@DtXUtGP*MMli& zK~DRRh4MZeJ?VeYCe;Fc;Z0C5=p4rXfd@Fh8c0h!>>gg-=V^1wat{zBV^^~!@Aj{J zHg4r<|4PssUGPv%xO?k+>iiJOhbSs#>+DDPH2B$bb9spcf|S2zc&p zTGct6XcmG!&=Z<2*dzjFdk55BATQFwT`}81iVxkRu2`!$4hm(Cg@c7YJ#b{%>ENR4 z=IO+_78%g!s(j|z+IO9sdE*owx%N8Rd3=^PrZFAV%rjH@pfN(Q6AHSPx@9)Rjef_$ zHv8dK-*#PY0AJ{*^W8v=Z=tN7t18@LTGnjR-A^Zj8Mk&E5E^CG6;C$xS$8tqrZy?{ zLL)>+MhJm=MSHg=@)|dA*6T6ENA+nm4JVs)(VUICo1QaD{fzU@fxNHk_rJi0!m>(B z-;nJSVeVx#9ToK%5tp9N=Y3_sza>e)9_E3fU~{vG&HjX+ZfG3x9*VM+k75i7NU92a zugX-op>d%%zewYU@ByhGo+~o|Ur~HT8}!P+G%nlC#eTYK^>(@}4RAtOm6 z;H(H|f6?yw1oez5P^7Dsg_b4I7ZRZ(Tej`9dD{kA>ZAq@+I*)Cr(>5UI~@)(x>Jv4 zh;<(`qjZXsW7@8_2MRV=GyAsEAJ%G_6LdR6qbpf45D5gI2Q zeAAiCEgz;Pi+nq$5t1UfE*=TNqm}|;ie4s)m#gc^@Byv-L;sxD z16Jf?8_`N>Jz14nWvuYYnsFx7)mG_sCe#f_Ts-!>9B}~=@WjQp(!hPSZ%s^x#)9o= zfi+sEGlZCX{j7%Z-ZE(n$hEqc`!f{N#%U26+mpyn9Ba9z!cnIU`kg3Kr42f4P4Wpg zpRwVlzelA-TfE33e!>;6wtqfnc)jbc{pD#vb4ixFIbz54<9g`D$sBr@9FK2sl-Rp> z2cex}ZF#=LJEjVypuTR?ZVg0#*@+!Klm@YGV#3<8hqmMh$_9@lE>0wG(apz`%o~^s z;LVM;gRG0Y(Y)2ICmk209Hn-LZ)LmmVz2Jg68}V@9bTcx`mVC+ZWy@;g8z|)@*46d zlpXH(Q38K~s|a6=s20M~q?j5Qst)BY7IxzOl;pc8!ozcIB?#*+X{4QWFkTbHvOZ@O zsON^P;RxH+EZ8@F7bH85*r}9Y_7G*l-C5n8?U{col)!H#0zd-W(HgDnnS&Mj+mAP_ zoq}-+WR~E{mG&0uT^siX`t?<1{?s+_;uim{QgNSXULAa(rVl`%%0a3q1@b^$sqz7U zzCJr%#}r%Osa+qvn5?viFFU+sD+lo`Za_;)rrZ0t_sj>9q#iKN}RSm9p+}8K_~TC z?qH^`8ZGtgJwLI7Uic2>u5wjKaL+<1HqF17@mQkl0_+iG7l!~>75y=uTO&r3PUw}} z6O_6>?6y{`K^+tsnPV-ekX+37%s2eBxaJE+43Zc*Jh?4eXx0 zo@%V7k)vwrDU(LHgTCLoDQiupPpd!+p+;am6g3`BQQuW*G0i9Fl)M@jseNNr%R94EQ86YfLN?NvE@in(Q7Ze^fK?a?i*!k4=2;#Fr;tzCp!c#My!h|hvVqOjVI zdZ==gcxo|aHwshY`68p2bF;IW>(#L*`?-OXqt4tOZpDjS{uds^;`7b}(Zh?>aX%c=~ zm+iv8_F+&zcKOnGzDxU}Q`bW4+_V{^&99*TRh`=}zd-Q4t(!N`rob`<6)m@KkG-%N z&GqMhe0d-EIbc&&27spF$2b1+o31<)5WD!$wHL$iu^y+^5EFF`;%L!$O`nUy)wtNaqTxi+vUr22)d=x`f&f`e2un zra}TymUpAE&mv2yU1TS@b}|kgR&RqnTi?4LZ!mb(1o<)ozkzLV`R$=!E!ZbmRaI$S z(V*Vez$3#FSaH!`IYO=tKxW_Th>L143QS*TMx;Py6{js%1f)BAawS#=Y>4krnnSu> zO%Sc9J7jo4c62(tVD*XJ`Y2rB_y*{s{%jOI@pNm2o!<4p;<)ZI`av~aZ$G=C$7vbb z>0@53ce$)nJ5l1iTMcC18dLZ&XKNW7+o;0LrafKruv{5#kx7l(rg%hBHL8Y((BEL@ zemQ_)%YwRk)u)t@hQ0nVA5K8eWSK8ZW89yD*{;*n>bL_1t}mgczd(aLIt^vGS`^m^ zrB_3#59erpOT6C@;VKXR`k}bw@>?=oZeNOzLV2$z)#wJFC`(h(w#J;LY0Xi^O73<{ z8%C5w)BG9Xf?1>9n&KCHFX|;zb`E#7@qW%7_XbkLaIY%2+7J$g-nf%oEe?JoR`yRW zeRxfK`TYVcp;_(Tz#b~4~ ztBzJ8d7=4JB;Jiy$c|N42e6Qa%1{@KV|NZRSWbZ(0Ye|hTTQdNBWB#w19#;@<85b@ zPMITy3Nvv!*=e*cUryi~gl{d7rxCL&SG!gCS23bL{%p5hv|}VrDXWti@fzVi_7DCf zHNmd4wm<)dWLLJzTO=#u4{{YTFzA6T_JmYq4{Yd`x|Khh4Y$&9n335o>AS}xT&ly) zG3=049WyrOsLKN#Y=XpLGiI?o1RlLwj!|PblKWj#US*|_rxVdrh>#60r1}fO(vQI2 znx=LpKg}EXVl=jM%k6`g<)>ixTk7m=mz@;S#pP&;a1*`1R|)azQphhl_lCyJcYfE- z`&8l$nLlsZi965KqC;BNXfZ`s>WGUEU3@)e!Kz4TG+A1CG1cLtTnMO>4kC;Tr>JGr zeVI{Uk*F8ih@)X@o45s-#WUR{2$JK&fT|O=zPN6Gfzr(n$see`l%L^-PF`$p|0t|}h zhIXv8l)w}tnxCbiD0xiX=Ph;@?CGUefm}ZYsbr5}A!o-!V4r8EtkzvU)$pXIL_L^8 zMfK8|YfSMUWKom?Uun});RZ8Tsic>s(FeQ+Hy_u{oWrLQ$t*+`cH%)Uax00RQ!ATr zhX~%wnZg`J;>^T!fg*$hFLOeLZ0AI4dhlHHqrM{tE zrNHkhj|c4Ztk(OZr11u6SBbEfk=B$)HVA9}wsG=j;#)jGN^R)`%*~BtHl;km;>786 zOdb!4IYGO;8|Fb?@sT0fBNCkaz6%y&_R6tj@ZQGpcjA(;HHDt;4Qbk`_ws~WAip1* zd}^qC+fRCfv^LQF<{7+(*&y%w{-ww{sdB=BBNI@2!{WiXI_$xyBq=&T{8$9*@wUVC zpk#cG#8ip^zXI$IO+{ZIM}yTUrsK2|$#Zx_VwktyiajKp@D7Wto*?me)Xwwmo!>W% z-ofwNrr;Nt0KZ@E0e+vGgMDYUTNzOXIpSCz$DPA!;xmNrR4%h3XF@(T=)u?sxNMgq zq0t?9)L^oR;9$Pn9l=VN;aUU}3+V-$7@oYv17~OUd-TOAzI&qY=ggmtEdMM~x*f>; zX&8P6i|);vZEcEXY|Hn7y-jEX{P&^RzA)(-^k?P>luv<8u^@!i4xRtVn4Cd>o0xun z6ij9MmDPb6`6qj*`LNH}A$T&XPJ4(>iQMy>K&h4c>vJLP^&4NaZoz5)qLlyhc=`hu zclh~j8|o9cXI^e$13m_Tp4iHnv~mW!NCg74KPku4vF#)kxkhLj%w)AlZ0~7=QF&~% zo#xSsHMcvBfmo>H_p=eoE2D*A^~Y8;r?L6anR3oy6vXgFZ@ zv3nn@yoWKktD-gl`-Ucsq5ftL^a^4_mCJatwzlY5=2JaX;~q12<>gk132z8WZB01s z5e~K?D3v&_);P{N1FYWAOrg$H3m;jUJuf<8$U6B7lbBrrb-QVfO(zS9-8jC}z3*9pp# zBM})cTNXUK^cNN6m1AwNlUJ!iIm&Ec?+ZMS7YyRe7c;M;aE>!p%)&)-dgsa1J@(7RTkXbA6{`?*J^s1|O7R$G^xKv@iObW0Q zqoD)%1H{sEgIQlsMVEl~>rq5`5|vBZLZ6^+)vtuZp)(i{=H4#!+5RF-CmC(6c3HQo z>mgB2VnfTf;Sm&4XyPhy(D|GY9ixvPGVzI6dVur)BCU`bF{pKGQ)PFM4o<*(R^;{r zUW56MYk>adC_N5#G5NHL=EVL$&-!3M%fX91PSX9=aR9ai%_IULrG$nGS=_)J*jC#U z)Y>*fK|2hifk#$(&z6*QolaGHE*qnyf9USFuXU~eT&mKT1Hh}k+phZ?!r=oPz|F_y zOGAE{dOwk%Wp}!h6f2M8?U>p+t2vxcLDl+t=WhA5OYRe?2zZ~MoDyZmE8kv|iM~EY z>To1coHV2{VIHxNepsVS>GO+!o^*H^Pj7zc#iF{yVxI=qtLOR(;u(==_<+qC^W!m_ zb*-VWsV2z8h}^(Lvn@6crUpN#3L5KWTIk{2x%wZpSveDk0XzoU<`k zg4Z)zA$ndExVv>UT_^q(F7Fy2|Hn@`K-tN1y}|#LA^QgY0k9M5!A0v|KQk?0ce3uU z=tbGA1Q~4fQ6el<#UM6`ODY=?brN;gYRPfzU%Un$MCMHe&3q-+JSi&+iwcgD~Jus^BlAar739Nd?~Im z%Bz%x>|$^R@FXmM^=Z`Ux&y=I)#Z;n~jen-Zw@apG3VXK4ytH9&Js2W=hsLHS$fD!QO zvK#>GlE$cAp{5?{E42aztWQGZT)K@Ge zx!7xPiHik9OIQ%D5}x5feBUL=bZw(k;lUO8zuo(+=A`F{zY z_jN8voiyODvWZDpPg%2+HQ&V*^_DgnnwQ1?bxq+reEi_-w?bBd%d})_X=W5 z@6WmLKx8!@(_=$+5~#dRR7E)qW*)}`e!t!ylR4p6BQtVfmc_<;)_EX-~ zk!gns2i}VBAK6tj9@%`XP7ekKW>4wkWnx#CV{;|?f6f|uaWe~}nTUT!6<&>}co`QT z@ET-%Tmx)0Xno98)E2D$Gh3eUAy%_hW*+q_N|~r;yduv8 zG@NJ~bB+>6$7LtPk{QNxeLUI^0mtDJ@eq_g3d)Z!jP#QHePEBhU=d`$enMp4D4 zaE{rY@Yuj@Lmkfyv4icejGE)X{JSkf>Wb@oWUQc=E0}`co9{||DhK%MmYn7B8VbECTa> z7_Kp<-t-#5mp#Edq5pIZsy+drCtQqmY0uej2^*9g`m1=8OR+tZ`J`M882KpWIae~` zki@#3IMjQTP{J^b@!|{vJ;{rqKLsNuN+Bi$UD4MAADDF7;qY!D(_=0MLhPYh$(od3 z;I(TYZWPOJMC|}B&j3%zJm0(&xpT`n8WZ~{b%7YLcSsN4thPj0bUQXt95V9Aq63Wz zaI;Q^*>)l*)#1n!N5a!RYP%FMX@bI&U?9ya5X-Aj#jiP(y2ylY;`9eYKeG>aeXK?s zyvY&77x0Pi@ za(7sg04H_kC*&&I^#&bhyzDXs&9Gy{pJw&a9^dt>epau$>{o5v-){%T=)8-AGcKImCrhz`0jVOA4%tV{KfF|^o+N7EJ684dcz#H(!(@#3rfVYvn4%Q2}t zoov@E7fZ=v2#VQ*K${iYRNPJcL9UeIMX|o59qtP@Bi**Owr8;hgw?fJ`?AO9g2;A} z&-wOqlh1wrYny1y!U2BmJuTgMwQqV#R}fn&fI8w6{I;p?nV!Z>86P+z0%|aq(j@4} zpr>lFaXNZjxZb#w3Tl9FdwVNY=XxxGxO-K}qB5u}wHqB%!e@%b#^er_G4X>wO9W#i zbFN}yPbl#KM_D^{;QJ_m8xhtV+uuRh9q=F6yYp0gxSyetW8u|!&{wfZ&#cS?ZH60s zjFDh3&)AK~O!}y?5NEcLO34Bd0?6RBVWVFJp;mA3_ z7x8vUH2! zrjE{VR;+m38k!uAdjjbX z(#$ZSfcLm%?)58v(dl7eE{~1=T*>|jUC&pj-Qe#OL_X!d&#{U&l-&e`v;Pi3pr{=b zP^b0Z!#LPw?Rv3uZULX39xh*S0pd{zwVU02$p z=xkRfuyLr5n|&XGCMypqP-oFyu7VAy@~jdyB>_ zdMZPH3!x1tfUo8cP`6Es?PG?E4l=jrM2ML<2ra0gau8<<5p2mx4ThvyEIiB^Hkct+ zzK*&JLGr@xV(s}IFhdYaaXyx}G~|Tc{VoIJl6R|OH%-Rz%jh`$wEHLgN_jQM{G|RG z@%F<+7clansX4nr;%}Vl1{6SI^XH{g+c71i;4lWCu?*=#A!?V_3d)xLM5W_#Ow>Vd zu1s)SCOQN;%n~1(8HPkAlL3_@>CuS{2wx7^fqNKwhwcWHe(smki+F#+Q;(1cM(Fwl zm~8l2rU%@ykK|B0rxU1BtDUFzzZyKf8Z~cHKp!u@FGTJ%(%w)8EDL?tru+`Jq0+aO zT~NZ+RD?Zddz#bCq9^8Nv>Hcp#_5D+W7ZC%DyZHf5jFAxe?$gC=?vv=ADM|{IP|9Z zYV6R(Od_YzegS6DL;bxY&jNhT3NVHAE>`BhphEsKFyIl(T@4JrQV4(i3EaV(7U?T5 z6Er@7BGmI#;nvPRb)_RMlRP^2-{}7}=lJ<;Zn&@ca&MLmo`3)`+ncj|#w1^c+OYdM|N>|DvWV7YFB?1S#M z8dwh3OS(0~M!Z&p7f$=;*`5gVATIDRP4~4^`xTeB6ud!dL(n%(sBcgKcE3H+1`wVZ zPN;>s#1AaKV>OxEmT@HO9RfF23rmYb5psep_$*OjvsheG1&4 zop}%ov>0HJqN7a4jQPokPpBx0eN^lmiv(WpEGmHbIWeUxFz939EKu8*Ku&bJKtYB= z<_=Pb2pkY)^7@}*qr_lDMbkCd`XTQ$YJP<4Pv`ZbE?Q*&Q+ooxZ8pB4=GCI(*Qt3~ zmfVu_atqEX*qi)BB*N2pm#Cs#rdmyBYB#GyNR_5=X%O;qzvKyCh{#2vkR&k4DL0}- zs>e9#qAOsXsXyKIv=ywc>0Fc`ZC$vvHY|4Im(8X7Jb&ApaD%C<9*0*k^$jXO*0)Dq zD#e4wYHn7{9_OS*%~bVNC0ur|sRzCvnmYm;bUa_4gft`)132bz7L!3idMukWayZyw z`Q9B+acnNvzC(-%)$h-^qI-$;zpFwn1-Cz-(%yK+ug1E(8^`(`G+rP!D7@Uggg(Q| z!gRR6Siy#gwKW}uGHyD&uo!@CLAz|m8cL-&A%~VQ!iIxFRS}++LtHddC4zToY#o8e zqnRMi>MTjn1DNCL^ddff1APzceNN*wzwRHn;l{)U++42DO9}*_h=WB zaibp1+!%HCYZ3HH5=y=sIExLv(7Lm*2lav?EM|qLxfwOs4rC>ZjuhMB72cGY(%M+D z>Gegjsu0BQFVWxU#}AX{KVO!%C~Ug&Z|KpKA-rk#oPd200RgQ1JUrA(NSWF469ohk zbIXyzaJMbo7p!HaZ_H}MB(4pV<31W6cOisI?6At`w3e&v0Yp1``Qiw8nWl%^va>)I zcn!n)WIn%O{v}8AfpPh_$BcbFZu^;#z3$=0vu2#VA zfL>I+VF)uFWvH2?;h>w7YOZDb3-h)1jYo_WG`$+?x1HV zc{k$_T2j;5A%Z-LmC@+0)tf&@TBGCcmZJPduI92+<^yvr^p`R<2hqYJ#+3-$7{u$Y zIwGlEJRc1^hh?A&1AHz|s~F1@x){XVYz67&V3=Ak8EDclk$JFe%Q>ufJ0b4jbAsL= zI)rn|6Cd+_(C)%ZO&e*;Jg@O6Fe;wlJM=!d|3-E+quAao#QfZn++zC-8w{HPfSxca zOGvP;V!gvQIvz;8NA4qA?Q0oW7g-Z*P(sk6*Uy;T?#unk9UCz(j4*FAJ%kFf%xP=p zNs8Z;{LqF;<nl2T4)VH+Y4aJG%%i!6Q9xj)%>tqSqL{G$~i*Ug)|hr zlG#K@WL(yh3A-cI-f#ljquR-i47~K1O~+G%LAhRl{`|vgH{zgjoKY|%fDvEYw0E%% zACU8+2!52^54TtccSTQAZ}VmaQjj$`YZ@h*?)t}pQ)1*F3s7{Rv*-jdAVH=n-)7w1 zF~Ot5ma7eV-LEyZv}Rcu$p$w`pbS5#V**mu1(6>~5sb^2=Ulj&L%EudP(_sdA4Sc5 z2O|WVr&7aj$4r8X*`MsOH}%#xr~oD39%(JKXKHM&2*aN3p>i&O9T}udz=`9aD>*W` zwBILasoEY2b6YPpCf*`_*zHeXv#1$b5GM9vKML?{ZtPr~?RE)KqqFof)KBokT!ranzmBC5zVXRk zu=9DrnNQ)KbBwnVw-lF)!NFSiOg^sQT8yi#qel>$c5p>BYqCJEs@Z?T8+)jCJ{sGz z43zHQLtkUGziIh@feA49kO>*#SeHFi6G|N@KCE| z?z7-C&x2uHdRHaLq9;PHacH6g(btcIO6Pxzs#J-Em zOLXP;{n_V(TOu>_K$PY#M>h*{-&_~_0j?#%2{J%F0P_U*E@mo~Frrvd^?9GCjvK}s z^GF;^te?7M!OkZuqQbVcpJqF&V|x&)QTZB?H>0&rdy4|pn`;;_dPkFqLgK5gVN!s{gTqNtL7vAe9>H`(w(GCSvoRa|{so z0r7;!k2`?CM({s2z9QK_?zbo-P++|Ra@>^Ucv5Yk<$8!65%C~aG3aE`dT~a}7Om+* zf>l~5E7XkRJ7$^}lbyX#JZ%Kgeoze49_`|t{S&c&|9IG7XN#Af=3_VN>eWz0Q#kNY zPn;H{-gtOTaO_QcuGzKP;@GlZvfO;Zm~6)#WQniEV*r@l-I{5Ez`%lp)zy@!hH=qROxf?}{<0TnP*B}(33$yXu6k+#B`iIPj zSF5om=#xrau=WTJBspQHqp`Z{4wn`mNeHq+#kn=BH7Eu12^B-p`$nw<#-@K^&A%YY z+i9%lb+o`x`EZWT+l{Uk#k69!@t4m_EB^TNTvGJse_YiNHH8eX*3`7`JG1Q{e}b-- z&98>G?FTh|+W6@xJe5?>j=PM9}YHa(*(n-?hM#!TT zTM2BY3y39y$uLw}VK{aO)g7J$%BX8H5oKW=YYjy{$;vJX6l}SRyCZ?y6r6=lbsp@e zEDmd2wTNOOzMR%OA@RPnsv`@G!Uj`!i<7o(*x=Ptr~kT4?Nu`QM*jWAeBKXmCn}y& z?ypSfof*O|7nSuu>vX_g_>h5w$}%Dzbh#|{omEHYgh5w2ZcHAuYShH04r7YVNfpX{ zXsIQrG`1NcJa8c67$GyZ4pJ6>y+HC28PCkv9-k({`ej4dBSrs(*1r?UdbRiUdjszc z9h+11rpfRHW<$*DCgIlQer7hXON3Fxcq#Xws6$mfEy*2SUpRuO=-S@&HcWqyr?C&Y zG+O2yH*nYh89N?m?Uy@NG-UVbda6?g2AxGYzPB>bcRT+S+1$)W%)n%WOSp`^lcdcPzS($U=dulD*4&Tk9L7Az{#dl!#fbU&La)$rSQT|@J+=t z`>{{Y3u1{oSl4&HzE}2~g z48SOJ7V#Mfi92~8XdTeSr%bYf7}>i$Lm=gV+z#FHn8qU!qd}ol)ag%z}OwTJM2hbLjs7p&$`hogk3 z;vGNUvLl|V14y0*1WW4krMOE3QZ?Dbv^(4Ob3#wSx^TlQe{()n3`TY}wPMXSiBE#u zkL3KolQ(F-V$oMCQ15~M!11?J@Y2`=yAKm1QG+|VjF4V}?TYDfr7g_$4%tMAicD0D zIj$_DOQ2n5fGj7=b;6p%f)Nd$oYDC_KKR4|?Sy627Z$n|?DpR1BGtdilONEv2O&Mn z1-=6?&+dk~ua4@=i24GwLD827e!b#47dAU{{4@>AYJeV!2rAgf#ADFwE08|SXEO)Z zdt?Nymw}j9yV9wB$LjM%IzEV$QdhJlZPPMV2UfC^vAIKQEPYkj{0%uLz45?81$)$x zXPkE(%evvWCPwwHrTPi5LE+~O@Ru5K{X|#ot>GdSbzlbQGZPfx&e%n~g_K~tB=96s z6xU*>4rJnX?C;RfMynjF9!zO0*)(@|#}=9}IU+IG#g zOC+!|j{9Y_P$$p<-gWdDhEGS`c(Unt5@a_Ui@Z}ZnY+In+>8D6?@f;CU!?{82LY5u zhx%7DiVDd08xl8q>dpKq=y*BhV3@#8k(bI;)h_k zXFgnX^ePPk-HKMzdNwU{{SenO93qf8gaj-fP?QdBC(K4)lT$u5qG`9IYSiV_+!Z?a zExgaYJB`-+V&{C$)@q*Vf^@@!k)?Nz(}#2X5ozQJ2|_a{6+pwDX{)t)at zg{NbPfXPF2SV<8_vOA$Wa#rRnTEiVPmpp5iEmz9YcOh4=_d;(P2fRZTTD4F>Ta&TZ z2@$HgJ>6GV+(1)3ZM~TPg=%>q#hzfa2 z`^uK+qP@(W<+FLYp^8p#n9-2uk8(!lEUr`48*3E{3<6VN*7v4x2!1b)40nc)G!l#= zS(D*Z)`6^?Xj3LQggHPr<98iu@Sx8 zPlUbFVW|+k1jw#V{>#n3p!TCR&BD<3o3q|-q50yBJizg13GnZ`n9{b1EoaWUBs2OLGFm}~FQY5$_5zZ*dR2|C+O zqwG}id+tlPF$6%AIkltk>;d1jI#yNn_w!5s4*DG+FbwG#L@*yYEBw4!yWKL*A2&cx zK-z&LSrNB!f!0WACQ1D9|DL$*irbsQ-22+*N3Z{ehZ>*n%`vC{xcHM0)795x@C_|c>AypSI!iDVi5~qL?T5?=TGXkR`of<46n;J;X#+y~tBTEfM z(y`_5I+&wqOLfg>eTFN4l%n^M24XRw$*fJH+_jf}!^^k^2@rIB`;w=@rQ7V#iP9vh zw_)Ip%&EaKgoX5pNr#iDr5YWW5wR7DSeyp|I}xM$=&-0|QKg;GgS1K^q&_V1fxLlO z$;XZDytGrN4E8|q0iFC%zobS5qCcA-vI%d8UOvFJm^(pk+f1GXSHxiN&U!Re z)8ay<8KlSa9DGC;g0dV4dt?ds^$qAr9na@#b*OYx=p?3M82Mtq*(>Ae4AJG`I7kI3 zo`P0ZupN70t*{@N>4dfWmZn*sbB0Zr@N~zy$s4DeAyD{hXQ(ghd#8 zaT}a#va_!$tHv9A6!ZNS_`4AhSN8F%A&P5|4ehQ%i=alQ`MHnn1)Ox!l;xp0EzOeI zoO0p7m8rfw;JHnwzb17PkvN{+4Azk@&vVwC9Cx6-jU7%Rh!*evo(P{jvEfZoICDQ0;(gD<9v&M#|0wy3;( z!b|zy*o1g3P_vxc*O@pv^kPpKcXM_mEXN}XE%yw{CKyvt-3^eWZOA8RFNzq*l~Xmt6v!Ah%0XH3JU$UR1T%=!IV;i`0g6Wx9W8f8ne?1N zg>(pn#b+a2wf$*TOk%6F4!_TLk3GxOF0xa8;|5Vp4e8s6YN55rYOjFiZv^;bgl&oC z+Hqhk(qk@zZ5EGvXbRfcIa`L|Vhd?bKh$}`nc3@fu`LGD9@KztVoFi6n0Ikp(j9p@ zTo?i>EGLdBi_~Frf6VHGgX%@?1ar`ud(t@VF}v>Aec}8%8|xm&{YE2t3P3ej1b+Yu zpI0F#T@w}Xf1q z(JPP*U9WCi|KORFzA{UE-R)e_E%79iclH~vL*3Z0k zUmmpt1hZ=GLzBM0!yunB^Hs;~3gQQYoZ!EdxznmiW#b0kRs1PAHRltNS!{Mf8q3~t zFh*lc!eOx7d{GQtJ!DXol_j4oy^az27Tyud!w~RDxDIx5w(f^r+l*#w?PBBoCoqVS zfz5JtdkB9D14gkOS`iTWR_>MdPl3CyuQ~+;zX1Q4wvXh-$y)ytj67}3^9IHbGi6)C z-Ko#HVG7X8@u6hjVv6suKiK2@#7*l<2c>2Tgg%)nOjZMb&o^4I!7TkEM9Fo`ev9tRr`;f zfd;i#``hkd^fR*a4n{vfo)P(R3-H&386W!wnjWFk9x}WNM$N>TV5ebFoJVQ9(ix1^B42~Ur-!<$)5d0 z_Mp7)&yb+V^Ucs!W;eiE0yh_+t_y&8!u#R~9#x%mj#IqT2X%3VsE#p82F>p~+~>JO zJ{-VC7Ed<4!-`fTCJ0n$w}M{rIIW z@${t|6AnBKShM-&p9PA4Ro2*H;|tx$m_{VL8Fk12s1~!~Ys=CLLxGh_oyN1i>8lJ9 z!KUa&GlXH)ajGAdh`z*vt>r|6!)6pLBY)FLlxzr!Y*I&u^K>_zfuS@Nyn`T{sw`?Y z+D)(Kfn4GB5^s3!C!!zYlA5_;O|t*gEc54AXYo|j`peDRl`u^%_o}ef&f9h0&7)v} z-G`_6vFGs{q;HY=uOD-neAQ4NRQ_I7x3)8G8ems_n^!&5?HjJzu>bh;Iu+DD+tB#) z>jAZz7umVpsBw&6u0wh3!h%|25KC>Kdv~KUzY&zU2H7&)lnNHk)l88sc-wHZ&37GGW8nh2|u7BE{~cS9Fg-<#0KnM7^IPnc)V z9a7||$6CGt8Q5+z+@+}s>D^T9?%Ce((An{lUaPuL zt;d8`3^kI}^3oLGO)$Kx-=FEBk8j_4z@HNT)l>X1=lUJ=4RfAaBTm-Di&?ENFt3o` ze*Kry=47V>MpWk30Yz~zzT8N9!=Z=?#bIFQgCkAq%efm!%W=pt8^Tc(U0BVDpE zsbkn$+ssz3vaZz}=b_p?_Uyf7cAudBL9xMO41TTOxgsExi;8y+Kd7^^$Rr-^3S;X*GW`o-2{@`pM5}Iezp(RAe~?H z8A}3PKG&EDKF35{Swml5QGq!>*ROiD8y*xcoKu;nb8vCET58`EPi?*2EzCCd0$QrV z4E%oRd70gpuX_Hycev^E=f5lsuaVTi{mxR&V}P%oOT-a9<8pBbZNr%MXpZqFvw5`% zMvG2$q=O-|xB4|HWZJ1=_CaIIn%GNn^Km7W~S z`SbA0YOLC-2hwUDN5B)&T5xQiF$DNz}`axFicm@hBP0|D99@Y)A2~X zS}A#D8$6RB&AbCp$yI!sub*Wrz!Cddx@>_B>4kX;=GwLXMdNfe(_>olgZ4;s2g0b} z6(7U(+Ope5`27EtNiM?cE~C5~@VI7_GwAQka(=jFm}kKdWwC;|l3Pkz$a&c;>ho4I z;O3J(GTL)sZmA!a{-#btJHQNk8Dp;Dq1!rlvuaDka5q{-peC@FS}|yC+l>%2MW{XU zTcY8=nqkfy^+kGLE18%5<^LKbbKMtv!${a~M0Y*`Hth3x1LC5Mjr}-!JQhq+;!zR` zC@W(FtMAtJnCL7;6xi5D84ThC+c^ZARj1*6KJ)as!-zOoXbXBy$vs-HHSsu83}*wT z50?|l8D>?*RF^c(8&c+nPU}_}{NUDoG^_qokk|ri5ZGS4guJ!2vnF$8AEv^7L@Z`% z4^1qNC#Kw1o(g-JK(wBL7urxR`}Kxh$`!@&(}dfAk#=2KQeuC{!ipBtLpP;2)Li2* z>3*B~CH(lnM*bTppF2EE3|#_AHz;dZl;nX4EQR9-nd>jgJgQf8TAKx$6CY*(|(;+~V@)^IjU8LO2VnBVwLgB@03T z^ZiQ1>4KrJJ%29e%94u`8mp&71olYDkyQj#=FrJ*uZD@I@ovCZD=1*NSxm~d>*r|V zgJsCxB@y&jD-q8g-0z$3ua2|I@)`^#2%@{e^QKVjZ8kr{YiV=72J)e?W*!UIDjasX zT2A80dW>}Jsot@p?z-B#PQD=OV&vL`B(XcDLPz;vM>s4)skbBp0U-bWP{t+?^KQc73(y8}UmgI- zo#(14iD{}7{eG4gbFQ?fSx9oBH4)1ahr7wxu%^eQKZiQA>R|OdaDr5`y2OS~nfG95 z2!h3NG9P4<&CrXsDl7Io^Rl`U6E9)!zU$)}*)PXGXA(|n&DU(!hf$30Gcj&NbR%Kj zq{A1OfDB*mTdDHQK$s`>Lhl!SLXKRj=AB8sKL%boPc@`+_?3gwxRj43@>b|@0b%Sq zWi)dAX=ks4IW5R&;C59)jnSbW(!h3Dq61{oBYw-OyzU%m;}C84z$1P4QT+F-&98v> z+@Q26Pk7V6`wFzdX#_^4fV!L0r?kZ}&wM)qUy$CBQ1O~cyH;gw%jLl|#}&EWquY6n zZ^oNk$I@YG&k{G?OctG)2XO}?ucxrUm>q(Hk8iN_`>HKbREM{Z({;kU2Dve0`lW zc4xwp8Lqj^k$`&(pW>dyCLZALNh4aG{W4)4t1mS0Eb%Uflu{xS_~n z2BgFzXzMVL40gJVb4gcFeFpyY(*mRO- zzIS(R7jj9-ziL3Yuv+{Bm;mwMYd=AJG#M3rj9Z$Wsk|vx>*b8B!Z=7mCzxe(3JNKg zFbRf(E1HR>Fcd6obxl}kH66-5l;6(_4g}`&l{%fS`~C62IIbY%a`GQYUKkYAGy<}% zJa6}${eQqlEqptJ8XSVrK&PGNH#({r`Qrh(7)jk~sYR*EG?rLZbdlaAY1CP>cxgSxpT%GsaEagmI9rX{y z4Be*wsHhaM4gN@4M%iI6%z0NW-M4T--)RnXPP-5FjBHSL`VqRl+GTov@>76<1rr|F zpV$2AQ^M(#ynM}s0CE3^9mOrw4_R|VCLA39HwPeG0G=t8wa|eL2S7cMByo4+DTI{F z`ZJgeg+nRwJn8a$g;}^dkD#t+&M<=-v%!kW`U3FXGQ>BO;q>$z%z3mS)QWw1r zYm7Q%=4==COCp?#8#Aims1re&+OrR%3XImvnqr=|9<8}N$42w4EzN0M!Shq+``0LQ zwOQ@H2m{Fh&++l1_{V>eGB}@rj_Thj_t1}$blV}OAO7mTIS<| z^Rq1#*PB64pE|N8WwW8Hf_?T7v32%wXWctU>;|M$_(|Da#d>JK#{=6PR@qd~QhR2q zgR3sXCxYxJG@ZM)ZxGbj3~wW-0oJ0Xxp*mm81HJt)Lby3)Tuyaeg#5CK57YM2eeW8 zQ=&M++GfIlCZM6|6T1k~{Dp@FX3yBJ_cGlZj7YgB6i2&W2#L7QDAYaX(+k($6)_JC z4RGQg`ou-*fymnjbN>mdD>JY?qG95uZR|~JG^6##ntUzcz8S8@NISmh6#I50L_L5Bm2Aw$IN{VebyJu)$WHsyz%dPk1FnzoyKvl624NaU$k?x-}u)D z(ppV?^~lwm9`W%*iFv)R<%THDnSFER>?gd2Fdw^M!0~Tddmi)eKtPZIZW}y5?yvcL zm$Dmti`%rei0Q>}UBjb^YHFDw;YaPT8_li#3P)GVA%n)sUXGNQQ)Lq!q?*MDm{b`! zKESODabDuz2WSK~eWP((oZna0pBs(t;PHLtZr39~xT;?5q2&D>0_rpZbec_pr`%v>>7Ja*kDp+!_rqa~m%gq9vkB zy0niA>#nl?xjgji7MdGO04%<1wp>93=(xHA?&_0!vb^Iy8_35a+8btw+03pEtfko6b7d}4L5WX%7ak0uvPAy1r)!7E6=wO1H z3Ws>*`)oA~>47!T^JO+oOHWe+9IJ<{j7&9QCgJ-8_Bqz_Nk360v+c@YJNfo.cite-wide-badge+span{margin-left:.5rem}.cite-wide-instance-actions{display:flex;gap:.5rem;margin-left:.75rem}.cite-wide-convert-btn,.cite-wide-view-btn{white-space:nowrap;padding:.25rem .75rem;font-size:.85em;line-height:1.4;border-radius:4px;transition:all .1s ease}.cite-wide-convert-btn{background-color:var(--interactive-accent);color:var(--text-on-accent);border:1px solid var(--interactive-accent-hover)}.cite-wide-convert-btn:hover{background-color:var(--interactive-accent-hover)}.cite-wide-view-btn{background-color:var(--background-secondary);border:1px solid var(--background-modifier-border)}.cite-wide-view-btn:hover{background-color:var(--background-modifier-hover)}.cite-wide-footer{margin-top:1.5rem;padding-top:1rem;border-top:1px solid var(--background-modifier-border);display:flex;justify-content:flex-end}