From 0e568f1f0a1894c08ac6d841cff39a63f3cc69b7 Mon Sep 17 00:00:00 2001 From: Yun Chan Date: Mon, 14 Sep 2026 00:39:44 +0900 Subject: [PATCH] feat(ads/seo/release): v1.2.0 with live Google Ads, isolated ad profile, ads.txt, and SEO/AEO/GEO optimization --- .claude/hooks/session-brief.sh | 56 - .claude/hooks/verify-on-stop.sh | 71 - .claude/rules/desktop-wpf.md | 50 - .claude/rules/engine-core.md | 44 - .claude/rules/mobile-maui.md | 40 - .claude/rules/tests.md | 44 - .claude/settings.json | 52 - .claude/skills/release/SKILL.md | 53 - .claude/skills/tdd/SKILL.md | 72 - .claude/skills/verify/SKILL.md | 78 - .cursorrules | 3 + .env.example | 30 +- .forgejo/workflows/release.yml | 28 +- .github/workflows/release.yml | 24 +- .gitignore | 32 +- AGENTS.md | 163 +- CLAUDE.md | 41 +- Directory.Build.props | 8 + Paca.slnx | 11 + .../BookmarkManagerWindow.xaml | 47 - VideoDownloader.App/Browser/PairingWindow.cs | 67 - VideoDownloader.App/Browser/PlayerWindow.cs | 169 - VideoDownloader.App/Converters.cs | 43 - VideoDownloader.App/Core/ConfigStore.cs | 34 - VideoDownloader.App/CrashReportDialog.xaml | 34 - VideoDownloader.App/MainWindow.xaml | 1324 --- VideoDownloader.App/MainWindow.xaml.cs | 2214 ----- .../Services/TabViewService.cs | 314 - VideoDownloader.App/SettingsWindow.xaml | 487 -- VideoDownloader.App/Themes/Shared.xaml | 580 -- VideoDownloader.Avalonia/MainWindow.axaml | 63 - VideoDownloader.Browser/PermissionGate.cs | 78 - VideoDownloader.Browser/Tabs/TabManager.cs | 242 - VideoDownloader.Browser/Tabs/TabPreview.cs | 25 - .../Tabs/TabSessionStore.cs | 38 - VideoDownloader.Browser/UrlCleaner.cs | 43 - .../Detection/DetectionContext.cs | 6 - .../Detection/MediaDetector.cs | 81 - VideoDownloader.Core/Hls/DirectDownloader.cs | 157 - VideoDownloader.Core/Platform/CorePaths.cs | 13 - VideoDownloader.Core/Util/FileNameUtil.cs | 50 - .../VideoDownloader.Core.csproj | 9 - .../ConnectionTroubleshoot.cs | 21 - VideoDownloader.Mobile.Core/OfflineStore.cs | 72 - .../QueueCompletionDetector.cs | 18 - VideoDownloader.Mobile.Core/SharePayload.cs | 18 - VideoDownloader.Mobile/ApiClient.cs | 194 - VideoDownloader.Mobile/App.xaml | 14 - VideoDownloader.Mobile/App.xaml.cs | 16 - VideoDownloader.Mobile/AppOfflineStore.cs | 7 - VideoDownloader.Mobile/MauiProgram.cs | 29 - VideoDownloader.Mobile/Pages.cs | 486 -- .../Platforms/Android/AndroidManifest.xml | 12 - .../Platforms/Android/MainActivity.cs | 31 - .../Platforms/Android/MainApplication.cs | 15 - .../Android/Resources/values/colors.xml | 6 - .../Platforms/MacCatalyst/AppDelegate.cs | 9 - .../Platforms/MacCatalyst/Entitlements.plist | 14 - .../Platforms/MacCatalyst/Info.plist | 42 - .../Platforms/MacCatalyst/Program.cs | 15 - .../Platforms/Windows/App.xaml | 8 - .../Platforms/Windows/App.xaml.cs | 24 - .../Platforms/Windows/Package.appxmanifest | 46 - .../Platforms/Windows/app.manifest | 17 - .../Platforms/iOS/AppDelegate.cs | 9 - .../Platforms/iOS/Info.plist | 42 - .../Platforms/iOS/Program.cs | 15 - .../iOS/Resources/PrivacyInfo.xcprivacy | 51 - .../Properties/launchSettings.json | 8 - .../Resources/AppIcon/appicon.svg | 4 - .../Resources/AppIcon/appiconfg.svg | 8 - .../Resources/Fonts/OpenSans-Regular.ttf | Bin 107280 -> 0 bytes .../Resources/Fonts/OpenSans-Semibold.ttf | Bin 111204 -> 0 bytes .../Resources/Images/dotnet_bot.png | Bin 92532 -> 0 bytes .../Resources/Raw/AboutAssets.txt | 15 - .../Resources/Splash/splash.svg | 8 - .../Resources/Styles/Colors.xaml | 44 - .../Resources/Styles/Styles.xaml | 434 - VideoDownloader.Mobile/ShareTarget.cs | 16 - VideoDownloader.Mobile/TabbedRootPage.cs | 33 - .../VideoDownloader.Mobile.csproj | 88 - VideoDownloader.Server/ServerHost.cs | 245 - VideoDownloader.Server/WebCompanion.cs | 149 - .../Browser/MediaPlaylistTests.cs | 96 - .../Browser/PageDownloadTrackerTests.cs | 103 - .../Browser/PermissionGateTests.cs | 46 - .../Browser/SiteZoomStoreTests.cs | 95 - .../Browser/TabFeaturesTests.cs | 113 - .../Browser/TabGroupsWorkspacesTests.cs | 78 - .../Browser/TabManagerTests.cs | 228 - .../Browser/TrackerBlockTests.cs | 40 - .../Browser/UrlCleanerTests.cs | 80 - .../E2E/IconContentFontTests.cs | 71 - .../E2E/IconGlyphRenderTests.cs | 116 - .../E2E/PermissionTrackerE2ETests.cs | 109 - .../E2E/ReaderModeE2ETests.cs | 85 - .../E2E/SettingsUpdateUiE2ETests.cs | 47 - .../E2E/UiUsecaseAccessibilityRedTests.cs | 142 - .../E2E/UiUsecaseDownloadsRedTests.cs | 194 - .../E2E/UiUsecaseInteractionRedTests.cs | 131 - .../E2E/UiUsecaseLayoutRedTests.cs | 168 - .../E2E/UiUsecaseLibraryRedTests.cs | 143 - .../E2E/UiUsecaseSettingsRedTests.cs | 132 - .../E2E/UiUsecaseStatusRedTests.cs | 131 - .../E2E/UiUsecaseTabsRedTests.cs | 163 - .../E2E/UiUsecaseThemeRedTests.cs | 213 - .../E2E/UiUsecaseTypographyRedTests.cs | 144 - .../E2E/WebView2FindE2ETests.cs | 71 - VideoDownloader.Tests/GlobalUsings.cs | 2 - .../Infrastructure/IconGlyphXamlTests.cs | 89 - .../Infrastructure/WpfTestApp.cs | 33 - .../Mobile/MobileCoreTests.cs | 124 - .../Platform/HlsMuxerWiringTests.cs | 72 - .../Platform/PlatformAbstractionTests.cs | 178 - .../Platform/UpdateCheckerTests.cs | 154 - .../Server/MdnsAdvertiserTests.cs | 49 - .../Server/QueueHubE2ETests.cs | 90 - .../Server/RemoteServerE2ETests.cs | 202 - .../Server/ThumbnailerTests.cs | 84 - .../VideoDownloader.Tests.csproj | 22 - VideoDownloader.slnx | 11 - build/Paca.wxs | 73 + build/deploy-site.ps1 | 6 +- build/installer.iss | 23 +- build/obtainium.json | 10 +- build/publish.ps1 | 70 +- build/release.ps1 | 24 +- build/remote/build-remote.ps1 | 20 +- build/remote/build-remote.sh | 16 +- design.md | 131 + docs/BACKLOG.md | 1464 +++- docs/BROWSER_FEATURES_PLAN.md | 6 +- docs/DEPLOYMENT_PLAN.md | 44 +- docs/EXTREME_EXPANSION_PLAN.md | 161 + docs/HARNESS.md | 226 +- docs/IMPLEMENTATION_AUDIT.md | 1041 ++- docs/MOBILE_BROWSER_ARCHITECTURE_PLAN.md | 179 + docs/MOBILE_PLAN.md | 22 +- docs/REPOSITORY_STRUCTURE_PLAN.md | 158 + docs/TDD_THEORY_SSOT.md | 185 + docs/UI_USECASES.md | 4 +- docs/references/DESIGN_AUDIT_METHODOLOGIES.md | 418 + site/404.html | 38 +- site/ads.txt | 1 + site/app-ads.txt | 1 + site/assets/apple-touch-icon.png | Bin 0 -> 31487 bytes site/assets/favicon-32x32.png | Bin 0 -> 2096 bytes site/assets/favicon.ico | Bin 0 -> 6624 bytes site/assets/favicon.png | Bin 0 -> 191610 bytes site/assets/favicon.svg | 3 + site/assets/og.jpg | Bin 0 -> 40066 bytes site/assets/paca-logo-512.png | Bin 0 -> 246214 bytes site/assets/paca-logo.png | Bin 0 -> 731055 bytes site/gate-report.md | 43 + site/gate.config.json | 78 + site/googleeaed2376f70d466e.html | 1 + site/guide.html | 378 +- site/how-to-download-m3u8.html | 239 + site/index.html | 754 +- site/llms-full.txt | 90 + site/llms.txt | 28 + site/releases.html | 107 +- site/robots.txt | 36 + site/site.js | 69 +- site/sitemap.xml | 45 + site/styles.css | 2125 +++-- site/vs-idm-alternative.html | 246 + .../Paca.App}/App.xaml | 4 +- .../Paca.App}/App.xaml.cs | 68 +- .../Paca.App}/AppPaths.cs | 4 +- .../Paca.App}/AssemblyInfo.cs | 0 src/Paca.App/Assets/Avatars/avatar_01.png | Bin 0 -> 103528 bytes src/Paca.App/Assets/Avatars/avatar_02.png | Bin 0 -> 87768 bytes src/Paca.App/Assets/Avatars/avatar_03.png | Bin 0 -> 118998 bytes src/Paca.App/Assets/Avatars/avatar_04.png | Bin 0 -> 185102 bytes src/Paca.App/Assets/Avatars/avatar_05.png | Bin 0 -> 153889 bytes src/Paca.App/Assets/Avatars/avatar_06.png | Bin 0 -> 162883 bytes src/Paca.App/Assets/Avatars/avatar_07.png | Bin 0 -> 123241 bytes src/Paca.App/Assets/Avatars/avatar_08.png | Bin 0 -> 159367 bytes src/Paca.App/Assets/Avatars/avatar_09.png | Bin 0 -> 147165 bytes src/Paca.App/Assets/Avatars/avatar_10.png | Bin 0 -> 144845 bytes src/Paca.App/Assets/Avatars/avatar_11.png | Bin 0 -> 133357 bytes src/Paca.App/Assets/Avatars/avatar_12.png | Bin 0 -> 80232 bytes src/Paca.App/Assets/Avatars/avatar_13.png | Bin 0 -> 196251 bytes src/Paca.App/Assets/Avatars/avatar_14.png | Bin 0 -> 159965 bytes src/Paca.App/Assets/Avatars/avatar_15.png | Bin 0 -> 216252 bytes src/Paca.App/Assets/Avatars/avatar_16.png | Bin 0 -> 186923 bytes src/Paca.App/Assets/Avatars/avatar_17.png | Bin 0 -> 82413 bytes src/Paca.App/Assets/Avatars/avatar_18.png | Bin 0 -> 166908 bytes src/Paca.App/Assets/Avatars/avatar_19.png | Bin 0 -> 139624 bytes src/Paca.App/Assets/Avatars/avatar_20.png | Bin 0 -> 158351 bytes src/Paca.App/Assets/Fonts/lucide.ttf | Bin 0 -> 871752 bytes .../Paca.App}/Assets/dash.all.min.js | 0 .../Paca.App}/Assets/hls.min.js | 0 src/Paca.App/Assets/paca.ico | Bin 0 -> 93600 bytes src/Paca.App/Assets/paca.png | Bin 0 -> 731055 bytes .../Paca.App}/Assets/readability.js | 0 src/Paca.App/BookmarkManagerWindow.xaml | 83 + .../Paca.App}/BookmarkManagerWindow.xaml.cs | 6 +- .../Browser/Features/CommandPalette.cs | 14 +- .../Features/DownloadOperationAdapter.cs | 4 +- .../Browser/Features/MediaPlaylist.cs | 6 +- .../Features/NewTabPageBuilder.InPrivate.cs | 252 + .../Browser/Features/NewTabPageBuilder.cs | 1482 ++++ .../Browser/Features/PageDownloadTracker.cs | 41 +- .../Paca.App}/Browser/Features/ReaderMode.cs | 9 +- .../Browser/Features/TabSearchFilter.cs | 25 +- .../Browser/Features/TabSuspendService.cs | 4 +- .../Browser/Features/WebView2ExtensionHost.cs | 125 + .../Paca.App}/Browser/GlanceWindow.xaml.cs | 39 +- src/Paca.App/Browser/PairingWindow.cs | 332 + src/Paca.App/Browser/PlayerWindow.cs | 284 + src/Paca.App/Browser/QuickCaptureHudWindow.cs | 189 + src/Paca.App/BrowserTaskManagerWindow.xaml | 79 + src/Paca.App/BrowserTaskManagerWindow.xaml.cs | 63 + src/Paca.App/ClearBrowsingDataDialog.xaml | 81 + src/Paca.App/ClearBrowsingDataDialog.xaml.cs | 60 + .../Controls/DesktopAdBannerControl.xaml | 172 + .../Controls/DesktopAdBannerControl.xaml.cs | 549 ++ src/Paca.App/Converters.cs | 196 + src/Paca.App/Core/ConfigStore.cs | 51 + .../Paca.App}/Core/DownloadManager.cs | 191 +- src/Paca.App/Core/GlobalHotkeyManager.cs | 82 + src/Paca.App/Core/MultiDisplayLayoutEngine.cs | 52 + src/Paca.App/CrashReportDialog.xaml | 46 + .../Paca.App}/CrashReportDialog.xaml.cs | 12 +- src/Paca.App/CredentialVaultWindow.xaml | 154 + src/Paca.App/CredentialVaultWindow.xaml.cs | 101 + src/Paca.App/DesktopGatewayDaemonRunner.cs | 57 + src/Paca.App/DesktopTrayNotificationModels.cs | 21 + src/Paca.App/ExtensionManagerWindow.xaml | 339 + src/Paca.App/ExtensionManagerWindow.xaml.cs | 541 ++ src/Paca.App/LogViewerWindow.xaml | 53 + src/Paca.App/LogViewerWindow.xaml.cs | 77 + .../Paca.App}/MainWindow.Usecases.cs | 766 +- src/Paca.App/MainWindow.xaml | 3247 +++++++ src/Paca.App/MainWindow.xaml.cs | 7676 +++++++++++++++++ .../Paca.App/Paca.App.csproj | 25 +- src/Paca.App/ProfileAvatarHelper.cs | 109 + src/Paca.App/QrCodeDialog.xaml | 41 + src/Paca.App/QrCodeDialog.xaml.cs | 58 + src/Paca.App/QuickActionLauncherWindow.xaml | 397 + .../QuickActionLauncherWindow.xaml.cs | 1102 +++ .../Paca.App}/README.md | 2 +- .../Services/AppDebugScreenshotService.cs | 294 + .../Services/DownloadQueueAdapter.cs | 33 +- .../Paca.App}/Services/DownloadScheduler.cs | 4 +- src/Paca.App/Services/GlobalHotkeyService.cs | 106 + .../Paca.App}/Services/ShortcutManager.cs | 53 +- src/Paca.App/Services/TabViewService.cs | 702 ++ .../Paca.App}/Services/ThemeResolver.cs | 4 +- .../Services/ThumbnailCacheService.cs | 208 + .../Paca.App}/Services/ToastNotifier.cs | 11 +- src/Paca.App/Services/WindowsTrayDaemon.cs | 97 + src/Paca.App/SettingsWindow.xaml | 759 ++ .../Paca.App}/SettingsWindow.xaml.cs | 405 +- .../Paca.App}/Themes/Dark.xaml | 20 +- .../Paca.App}/Themes/HighContrast.xaml | 16 +- .../Paca.App}/Themes/Light.xaml | 16 +- src/Paca.App/Themes/Shared.xaml | 1277 +++ src/Paca.App/Utils/ExplorerLauncher.cs | 147 + src/Paca.App/Utils/WindowDragHelper.cs | 156 + .../ViewModels/CredentialVaultViewModel.cs | 274 + .../ViewModels/DownloadItemViewModel.cs | 101 +- .../ViewModels/QuickCaptureHudViewModel.cs | 121 + src/Paca.App/ViewModels/SettingsViewModel.cs | 865 ++ src/Paca.App/app.manifest | 23 + .../Paca.Avalonia}/App.axaml | 4 +- .../Paca.Avalonia}/App.axaml.cs | 4 +- src/Paca.Avalonia/Assets/paca.ico | Bin 0 -> 93600 bytes .../Paca.Avalonia}/MainViewModel.cs | 101 +- src/Paca.Avalonia/MainWindow.axaml | 93 + .../Paca.Avalonia}/MainWindow.axaml.cs | 4 +- .../Paca.Avalonia/Paca.Avalonia.csproj | 15 +- .../Paca.Avalonia}/Program.cs | 2 +- .../Paca.Avalonia}/RelayCommand.cs | 4 +- .../Paca.Avalonia}/app.manifest | 2 +- src/Paca.Browser/AdBlockRuleEngine.cs | 113 + src/Paca.Browser/Ads/DesktopAdModels.cs | 297 + .../Autofill/ChromeAutofillManager.cs | 131 + .../Automation/AutomationModels.cs | 160 + .../Automation/BookmarkletRunner.cs | 157 + .../Automation/CommandChainEngine.cs | 127 + .../Automation/DesignModeCoordinator.cs | 56 + .../Automation/ExternalDownloaderBridge.cs | 202 + .../Automation/LocalP2pSyncEngine.cs | 162 + .../Automation/NamedSessionManager.cs | 164 + .../Automation/RssFeedReaderEngine.cs | 193 + .../Paca.Browser}/BrowserModels.cs | 2 +- .../Paca.Browser}/BrowserStore.cs | 6 +- src/Paca.Browser/BrowserTaskManager.cs | 189 + src/Paca.Browser/BrowsingDataCleaner.cs | 53 + src/Paca.Browser/ChromeInternalUrlRouter.cs | 110 + src/Paca.Browser/Content/ContentModels.cs | 64 + .../Content/ForceContentDarkModeEngine.cs | 93 + .../Content/ImmersiveReaderExtractor.cs | 137 + .../Content/MhtmlWebArchivePackager.cs | 125 + .../Content/PdfViewerToolbarCoordinator.cs | 74 + .../Content/PictureInPictureCoordinator.cs | 65 + .../Content/ReadAloudSpeechCoordinator.cs | 97 + .../Content/SiteAutoMutePolicy.cs | 103 + .../Content/WebTranslationService.cs | 87 + .../AdvancedProcessTaskInspector.cs | 177 + .../BatteryEfficiencyModeGovernor.cs | 106 + .../Diagnostics/DiscardedTabVisualState.cs | 79 + .../DoNotDisturbNotificationPolicy.cs | 153 + .../PrintBackgroundGraphicsPolicy.cs | 110 + .../Diagnostics/SiteStorageQuotaInspector.cs | 199 + .../Downloads/ChromeAutoOpenFilePolicy.cs | 74 + .../ChromeDownloadShelfCoordinator.cs | 120 + src/Paca.Browser/DualSubtitleEngine.cs | 56 + .../Extensions/ChromeWebStoreClient.cs | 98 + .../Extensions/CrxPackageExtractor.cs | 162 + .../Extensions/DeclarativeNetRequestEngine.cs | 496 ++ src/Paca.Browser/Extensions/DnrUrlTrie.cs | 132 + .../Extensions/ExtensionAlarmManager.cs | 199 + .../Extensions/ExtensionCspValidator.cs | 58 + src/Paca.Browser/Extensions/ExtensionItem.cs | 68 + .../Extensions/ExtensionManager.cs | 1677 ++++ .../Extensions/ExtensionManifest.cs | 271 + .../Extensions/ExtensionMarketplace.cs | 409 + .../Extensions/ExtensionPermissionAuditor.cs | 158 + .../Extensions/IBrowserExtensionHost.cs | 22 + .../Extensions/MarketplaceItem.cs | 52 + .../Extensions/UserScriptEngine.cs | 180 + .../Paca.Browser}/FindSession.cs | 57 +- .../History/ChromeHistoryEngine.cs | 168 + .../ClipboardPasteAndGoSuggester.cs | 45 + .../Interaction/CustomShortcutRemapper.cs | 98 + .../Interaction/InteractionModels.cs | 102 + .../Interaction/MouseGestureEngine.cs | 99 + .../Interaction/PeekPreviewCoordinator.cs | 51 + .../SelectionMiniToolbarCoordinator.cs | 64 + .../Interaction/SuperDragDropHandler.cs | 42 + .../Interaction/TaskbarJumpListBuilder.cs | 46 + src/Paca.Browser/Layouts/LayoutModels.cs | 104 + .../Layouts/PinnedTabRailPolicy.cs | 108 + .../Layouts/SpatialNavigationCoordinator.cs | 274 + .../Layouts/StartupRestorePolicy.cs | 186 + src/Paca.Browser/Layouts/TabLayoutSwitcher.cs | 153 + .../Layouts/TabStripScrollSwitcher.cs | 101 + .../Layouts/TabTilingCoordinator.cs | 196 + .../Layouts/TwoLevelTabStackManager.cs | 191 + .../Layouts/WindowTabMergeCoordinator.cs | 171 + src/Paca.Browser/LiveCaptionEngine.cs | 103 + .../Media/AutoplayPolicyEngine.cs | 210 + .../Media/ChromeTabAudioPolicy.cs | 37 + .../Media/DeviceEmulationCoordinator.cs | 173 + src/Paca.Browser/Media/FontOverridePolicy.cs | 183 + .../Media/GlobalMediaController.cs | 208 + src/Paca.Browser/Media/GpuFallbackPolicy.cs | 253 + .../Media/LiveCaptionCoordinator.cs | 144 + src/Paca.Browser/Media/MediaPlaybackState.cs | 29 + .../Media/MediaSessionCoordinator.cs | 188 + .../Media/MediaSpeedController.cs | 96 + .../Media/PageVisualFilterEngine.cs | 165 + .../Media/VideoFrameCaptureCoordinator.cs | 277 + src/Paca.Browser/MemoryTurboGuard.cs | 69 + .../Networking/AmsiScannerBridge.cs | 252 + .../Networking/AntiFingerprintingEngine.cs | 136 + .../Networking/DiskCacheCapManager.cs | 203 + .../Networking/DohProviderSelector.cs | 141 + .../Networking/IsolatedIncognitoTabPolicy.cs | 185 + .../Networking/JavaScriptKillSwitchPolicy.cs | 258 + .../Networking/MockLocationSimulator.cs | 183 + .../Networking/RealtimeStreamInspector.cs | 169 + src/Paca.Browser/NewTab/NtpModels.cs | 35 + src/Paca.Browser/NewTab/NtpStore.cs | 275 + .../Paca.Browser}/NotesStore.cs | 27 +- src/Paca.Browser/OmniboxMathEvaluator.cs | 204 + .../Paca.Browser/Paca.Browser.csproj | 5 +- .../PageControls/PageControlsManager.cs | 188 + .../PageControls/SiteControlsModel.cs | 43 + .../Panels/CaptureAnnotationModel.cs | 262 + .../Panels/FullPageScreenshotCoordinator.cs | 186 + .../Panels/NtpCustomizerService.cs | 224 + src/Paca.Browser/Panels/QuickStylerStore.cs | 230 + .../Panels/SidebarPanelManager.cs | 252 + .../Panels/SiteStorageInspector.cs | 236 + src/Paca.Browser/PermissionGate.cs | 147 + .../ChromeSitePermissionsCoordinator.cs | 135 + src/Paca.Browser/Profiles/BrowserProfile.cs | 16 + .../Profiles/EphemeralProfileManager.cs | 134 + .../Profiles/ExternalBrowserDataImporter.cs | 105 + src/Paca.Browser/Profiles/ProfileManager.cs | 216 + .../Pwa/WebAppInstallationManager.cs | 139 + src/Paca.Browser/Pwa/WebAppManifest.cs | 100 + src/Paca.Browser/QrCodeSvgGenerator.cs | 27 + .../ReadingList/ReadingListManager.cs | 187 + src/Paca.Browser/Scripts/UserScript.cs | 234 + src/Paca.Browser/Search/BookmarkSanitizer.cs | 186 + src/Paca.Browser/Search/HardRefreshEngine.cs | 100 + .../Search/OmniboxKeywordEngine.cs | 197 + src/Paca.Browser/Search/OmniboxScopeFilter.cs | 116 + src/Paca.Browser/Search/OpenSearchParser.cs | 96 + src/Paca.Browser/Search/SecurePaymentVault.cs | 294 + .../Search/SiteZoomPersistenceStore.cs | 174 + src/Paca.Browser/Search/ViewSourceHelper.cs | 128 + .../Paca.Browser}/SearchEngine.cs | 24 +- .../Paca.Browser}/SearchEngineResolver.cs | 15 +- .../Security/ClearOnExitManager.cs | 66 + .../Security/ContainerTabManager.cs | 82 + .../Security/CredentialAutofillEngine.cs | 356 + .../Security/ExternalProtocolHandlerGate.cs | 99 + .../HardwareDeviceIndicatorCoordinator.cs | 72 + .../Security/HttpsUpgradePolicy.cs | 101 + .../Security/PasswordSecurityAuditor.cs | 53 + .../Security/QuietPermissionPromptEngine.cs | 46 + .../Security/SecurityBadgeEvaluator.cs | 98 + src/Paca.Browser/Security/SecurityModels.cs | 95 + .../Security/SslCertificateInspector.cs | 63 + src/Paca.Browser/SiteCookieCleaner.cs | 70 + .../Paca.Browser}/SiteZoomStore.cs | 4 +- .../AutoOpenFileTypePolicy.cs | 172 + .../DownloadBandwidthScheduler.cs | 149 + .../SystemIntegration/DownloadRiskScanner.cs | 204 + .../FilterSubscriptionManager.cs | 210 + .../PrintPreviewCoordinator.cs | 185 + .../ShieldBreakdownReport.cs | 230 + .../Paca.Browser}/TabArchive.cs | 4 +- src/Paca.Browser/Tabs/AutoTabArchiver.cs | 110 + .../Tabs/ChromeTabDiscardPolicy.cs | 93 + .../Tabs/ChromeTabGroupPalette.cs | 48 + .../Tabs/ClosedTabTimelineManager.cs | 118 + src/Paca.Browser/Tabs/DuplicateTabDetector.cs | 85 + .../Tabs/NavigationHistoryStack.cs | 112 + .../Tabs/OmniboxActionEvaluator.cs | 184 + src/Paca.Browser/Tabs/OmniboxAutocomplete.cs | 123 + .../Tabs/OmniboxSiteSearchEvaluator.cs | 44 + .../Tabs/SessionCrashRecoveryService.cs | 80 + .../Tabs/SiteSecurityEvaluator.cs | 63 + src/Paca.Browser/Tabs/SleepingTabsPolicy.cs | 132 + .../Paca.Browser}/Tabs/TabItem.cs | 23 +- src/Paca.Browser/Tabs/TabManager.cs | 687 ++ src/Paca.Browser/Tabs/TabModels.cs | 20 + src/Paca.Browser/Tabs/TabPreview.cs | 70 + .../Tabs/TabPreviewThumbnailService.cs | 43 + src/Paca.Browser/Tabs/TabSessionStore.cs | 80 + src/Paca.Browser/TextFragmentHelper.cs | 54 + .../Theming/ScrollAutoHideCoordinator.cs | 117 + .../Theming/SpeedDialFolderManager.cs | 219 + .../Theming/StatusBarModuleCoordinator.cs | 127 + .../Theming/ThemeAutoScheduler.cs | 167 + .../Theming/ToolbarPaletteManager.cs | 190 + .../Theming/UiLanguageSwitcher.cs | 146 + .../Url/CaretBrowsingCoordinator.cs | 304 + src/Paca.Browser/Url/CleanLinkExtractor.cs | 240 + .../Url/HttpResponseHeadersViewer.cs | 435 + src/Paca.Browser/Url/OmniboxQrCoordinator.cs | 123 + src/Paca.Browser/Url/QuickDictionaryLookup.cs | 205 + .../Url/TextFragmentDeepLinker.cs | 237 + .../Url/UrlBreadcrumbNavigator.cs | 101 + src/Paca.Browser/UrlCleaner.cs | 82 + .../Paca.Browser}/WorkspaceRoutingRules.cs | 7 +- .../Paca.Cli/Paca.Cli.csproj | 2 +- .../Paca.Cli}/Program.cs | 23 +- src/Paca.Core/AudioAlbumTrackSplitter.cs | 173 + src/Paca.Core/AudioChannelDownmixer.cs | 57 + src/Paca.Core/AudioDynamicRangeCompressor.cs | 55 + src/Paca.Core/AudioPitchShiftEngine.cs | 67 + src/Paca.Core/AudioVocalStemExtractor.cs | 54 + src/Paca.Core/AudioVolumeNormalizer.cs | 110 + .../BandwidthScheduleProfileEngine.cs | 66 + .../Browser/PacaUniqueBrowserFeatures.cs | 330 + .../Browser/WebViewMediaAndSessionEngines.cs | 185 + .../Paca.Core}/Config/AppConfig.cs | 95 +- .../Config/WorkspaceConfigSanitizer.cs | 62 + .../Paca.Core}/Dash/DashDownloader.cs | 28 +- .../Paca.Core}/Dash/DashModels.cs | 2 +- .../Paca.Core}/Dash/DashParser.cs | 73 +- src/Paca.Core/Detection/AiHighlightClipper.cs | 84 + src/Paca.Core/Detection/DetectionContext.cs | 15 + src/Paca.Core/Detection/MediaDetector.cs | 188 + .../Detection/NeuralShaderUpscaler.cs | 54 + .../Detection/NeuralSubtitleEngine.cs | 122 + .../Detection/SocialSiteDetector.cs | 46 +- .../Gateway/PacaConnectCodeGenerator.cs | 32 + .../Hls/AdaptiveStreamingBitrateController.cs | 169 + src/Paca.Core/Hls/DirectDownloader.cs | 225 + .../Paca.Core}/Hls/HlsDownloader.cs | 152 +- .../Paca.Core}/Hls/M3u8Parser.cs | 43 +- .../Hls/PartialChunkIntegrityCache.cs | 259 + src/Paca.Core/HlsManifestValidator.cs | 179 + .../AutonomousSelfHealingSystem.cs | 92 + .../ChaosFuzzingMatrixEngine.cs | 69 + src/Paca.Core/Media/FftAudioWaveformEngine.cs | 56 + .../Media/HardwareTranscoderStudio.cs | 84 + src/Paca.Core/Media/WebRtcCastingEngine.cs | 75 + src/Paca.Core/MediaBitrateEstimator.cs | 82 + src/Paca.Core/MediaMetadataTagWriter.cs | 124 + .../MediaPlaybackSpeedPitchEngine.cs | 88 + .../Paca.Core}/Models/DownloadProgress.cs | 2 +- .../Paca.Core}/Models/PlaylistModels.cs | 25 +- src/Paca.Core/MultiTrackMediaMuxer.cs | 113 + src/Paca.Core/Net/HostRateLimiter.cs | 72 + src/Paca.Core/Net/MultiCdnMeshDownloader.cs | 172 + src/Paca.Core/Net/P2pSwarmEngine.cs | 211 + .../Paca.Core/Paca.Core.csproj | 7 +- src/Paca.Core/Platform/AudioNormalizer.cs | 102 + .../Platform/BatterySaverPowerManager.cs | 92 + .../Platform/ChaosMonkeyStressDefense.cs | 38 + src/Paca.Core/Platform/ChapterSplitter.cs | 94 + src/Paca.Core/Platform/CloudSyncGateway.cs | 90 + src/Paca.Core/Platform/CorePaths.cs | 39 + .../Platform/DownloadMetaPathResolver.cs | 105 + .../GpuHardwareAccelerationProfiler.cs | 311 + .../Platform/HardwareEncoderDetector.cs | 118 + src/Paca.Core/Platform/HdrToneMapper.cs | 78 + .../Platform/HighlightShortsClipper.cs | 94 + src/Paca.Core/Platform/LiveDvrRecorder.cs | 63 + .../Platform/LosslessSmartTrimmer.cs | 49 + .../Platform/MediaMetadataExtractor.cs | 163 + .../Paca.Core}/Platform/MediaMuxer.cs | 54 +- .../Platform/MultiSourceSegmentAccelerator.cs | 80 + .../Platform/PortableSandboxGuard.cs | 34 + .../Platform/PredictiveChunkPrefetcher.cs | 64 + .../Paca.Core}/Platform/ProcessModels.cs | 3 +- .../Platform/SelfHealingAutoPilot.cs | 90 + src/Paca.Core/Platform/VideoDeduplicator.cs | 75 + .../Platform/VideoDenoiseUpscaler.cs | 96 + .../Platform/VideoWatermarkBurner.cs | 81 + .../Platform/VoiceActivitySubtitleAdapter.cs | 89 + .../Platform/VrSpatialAudioEngine.cs | 60 + src/Paca.Core/Platform/WebPageArchiver.cs | 61 + .../QuickActions/QuickActionCatalog.cs | 390 + .../QuickActionClipboardDetector.cs | 78 + .../QuickActionFavoritesManager.cs | 97 + .../QuickActions/QuickActionFuzzyMatcher.cs | 92 + .../QuickActionInlineEvaluator.cs | 196 + .../QuickActions/QuickActionModels.cs | 168 + .../QuickActionParameterRouter.cs | 181 + .../QuickActionQueryHistoryStore.cs | 133 + .../QuickActions/QuickActionSearchEngine.cs | 280 + .../QuickActions/QuickActionTimeFormatter.cs | 40 + .../QuickActions/QuickActionUsageTracker.cs | 136 + .../QuickActions/UserCustomActionStore.cs | 144 + src/Paca.Core/Resilience/ExtremeResilience.cs | 162 + .../Security/BiometricSecurityPolicy.cs | 34 + src/Paca.Core/Security/CrdtVaultSyncEngine.cs | 124 + .../Security/CredentialDataExchange.cs | 288 + .../Security/CredentialSecurityAuditor.cs | 143 + .../Security/E2eeRemoteBackupProvider.cs | 86 + .../Security/HardwareKeyTokenAuthenticator.cs | 40 + .../Security/IOsBiometricAuthenticator.cs | 74 + .../Security/MacTouchIdAuthenticator.cs | 83 + .../Security/MockBiometricAuthenticator.cs | 67 + .../Security/OsProtectedCredentialVault.cs | 592 ++ .../Security/PasswordSecurityEngine.cs | 325 + .../Security/SiteCredentialRecord.cs | 184 + .../Security/VirtualFido2Authenticator.cs | 127 + .../Security/WindowsHelloAuthenticator.cs | 92 + .../Paca.Core}/Social/CookieJarWriter.cs | 4 +- .../Paca.Core}/Social/CookieRecord.cs | 2 +- .../Paca.Core}/Social/DenoRunner.cs | 34 +- .../Paca.Core}/Social/FormatOption.cs | 2 +- .../Paca.Core}/Social/SocialPresets.cs | 2 +- .../Paca.Core}/Social/YtDlpDownloader.cs | 8 +- .../Paca.Core}/Social/YtDlpRunner.cs | 28 +- .../Streaming/AdaptiveStreamingEngines.cs | 126 + src/Paca.Core/SubtitleBurnInEngine.cs | 64 + .../Paca.Core}/Update/UpdateChecker.cs | 4 +- src/Paca.Core/Util/FileNameUtil.cs | 192 + src/Paca.Core/Utils/BufferPoolManager.cs | 24 + src/Paca.Core/Utils/DiskSpaceGuardian.cs | 38 + src/Paca.Core/Utils/QoSTrafficShaper.cs | 48 + src/Paca.Core/Utils/ThrottledStream.cs | 86 + src/Paca.Core/VideoAspectAutoCropper.cs | 55 + src/Paca.Core/VideoDenoiseEnhancer.cs | 64 + src/Paca.Core/VideoFrameRateConverter.cs | 44 + src/Paca.Core/VideoIntroOutroTrimmer.cs | 87 + src/Paca.Core/VideoPosterExtractor.cs | 80 + src/Paca.Core/VideoSpriteSheetGenerator.cs | 81 + src/Paca.Core/VideoTonemapEnhancer.cs | 112 + src/Paca.Mobile.Core/AdMobModels.cs | 341 + src/Paca.Mobile.Core/AdaptiveBufferScaler.cs | 76 + .../AdaptiveStreamingProfile.cs | 60 + src/Paca.Mobile.Core/ApiClient.cs | 323 + .../AudioEqualizerProfileManager.cs | 106 + src/Paca.Mobile.Core/BandwidthRateLimiter.cs | 65 + .../BandwidthSchedulePolicy.cs | 58 + src/Paca.Mobile.Core/BatteryHealthGuard.cs | 41 + src/Paca.Mobile.Core/BatteryPowerGovernor.cs | 40 + .../BookmarkChapterExporter.cs | 113 + src/Paca.Mobile.Core/DataUsageQuotaTracker.cs | 86 + .../DownloadFailureDiagnostics.cs | 97 + .../DownloadTokenBucketRateLimiter.cs | 110 + src/Paca.Mobile.Core/DualSubtitleComposer.cs | 65 + .../DynamicConcurrencyTuner.cs | 66 + src/Paca.Mobile.Core/IKeyValueStorage.cs | 44 + src/Paca.Mobile.Core/LanDiscoveryProber.cs | 235 + .../MediaBookmarkAnnotationEngine.cs | 112 + src/Paca.Mobile.Core/MediaChapterSegment.cs | 81 + src/Paca.Mobile.Core/MediaChecksumVerifier.cs | 85 + .../MediaDeduplicationAndCollision.cs | 108 + .../MediaFileNameTemplateEngine.cs | 88 + .../MediaIntegrityVerifier.cs | 162 + .../MediaPlaybackBypassScript.cs | 99 + .../MediaStorageGarbageCollector.cs | 114 + .../MediaStreamingTransferEngine.cs | 114 + src/Paca.Mobile.Core/MobileAdSlotSystem.cs | 172 + src/Paca.Mobile.Core/MobileBookmarkStore.cs | 49 +- .../MobileDesktopParityBrowser.cs | 147 + .../MobileDesktopParityDownload.cs | 268 + src/Paca.Mobile.Core/MobileDiscoveryEngine.cs | 32 +- src/Paca.Mobile.Core/MobileDownloadEngine.cs | 15 + src/Paca.Mobile.Core/MobileHistoryStore.cs | 32 +- src/Paca.Mobile.Core/MobileIconSystem.cs | 75 +- src/Paca.Mobile.Core/MobileMediaPlayback.cs | 9 +- src/Paca.Mobile.Core/MobileMenuModel.cs | 209 + .../MobilePrivateBrowsingPolicy.cs | 48 + .../MobilePrivateSessionManager.cs | 38 + .../MobileProductionFeatures.cs | 118 + .../MobileResponsivenessGuards.cs | 264 + .../MobileSafeAreaCoordinator.cs | 88 + .../MobileScrollCoordinator.cs | 109 + .../MobileShareTextExtractor.cs | 86 + .../MobileSyncSecurityGuard.cs | 17 + src/Paca.Mobile.Core/MobileTabManager.cs | 152 + src/Paca.Mobile.Core/MobileTabSyncEngine.cs | 2 +- .../MobileTextEncodingSanitizer.cs | 96 + .../MobileThemeColorParser.cs | 185 + src/Paca.Mobile.Core/MobileThemeSystem.cs | 22 + .../MobileUserAgentSanitizer.cs | 49 + .../NetworkLatencyJitterProber.cs | 97 + .../NetworkResilienceSupervisor.cs | 81 + src/Paca.Mobile.Core/OfflineLibraryManager.cs | 150 + .../OfflineMediaPrefetcher.cs | 76 + src/Paca.Mobile.Core/OfflineStore.cs | 2 + src/Paca.Mobile.Core/P2pQrPayloadCodec.cs | 142 + src/Paca.Mobile.Core/Paca.Mobile.Core.csproj | 2 +- src/Paca.Mobile.Core/PacaBatchBundle.cs | 112 + src/Paca.Mobile.Core/PacaDeepLinkEngine.cs | 156 + src/Paca.Mobile.Core/PacaVaultSnapshot.cs | 66 + .../PlaybackHistorySyncManager.cs | 92 + .../PlaybackSleepTimerEngine.cs | 74 + src/Paca.Mobile.Core/PlayerGestureAndPip.cs | 60 + src/Paca.Mobile.Core/ProxyAutoConfigEngine.cs | 84 + .../ProxyConfigurationManager.cs | 91 + .../QuietHoursNotificationManager.cs | 105 + src/Paca.Mobile.Core/ReadingListModels.cs | 22 + src/Paca.Mobile.Core/RemoteClipboardBridge.cs | 131 + src/Paca.Mobile.Core/RemoteTabModels.cs | 20 + .../RoamingConnectionManager.cs | 91 + .../SmartCategoryClassifier.cs | 76 + src/Paca.Mobile.Core/SmartClipboardSniffer.cs | 236 + src/Paca.Mobile.Core/SmartCollectionEngine.cs | 96 + .../SmartMediaFilterEngine.cs | 132 + src/Paca.Mobile.Core/SmartPriorityQueue.cs | 75 + .../SmartSilenceSkipperAndWaveform.cs | 119 + src/Paca.Mobile.Core/SnifferScript.cs | 103 + .../StorageQuotaEvictionPlanner.cs | 85 + .../StreamHighlightClipper.cs | 59 + .../SubtitleFormatConverter.cs | 97 + src/Paca.Mobile.Core/SubtitleSyncDrifter.cs | 91 + src/Paca.Mobile.Core/SubtitleSyncEngine.cs | 98 + .../ThumbnailScrubberPreview.cs | 99 + .../TranscodingPresetEngine.cs | 48 + src/Paca.Mobile.Core/VideoSnifferParser.cs | 11 +- src/Paca.Mobile.Core/WanReachabilityProber.cs | 88 + src/Paca.Mobile/AdMobBannerHostView.cs | 21 + src/Paca.Mobile/ApiClient.cs | 194 - src/Paca.Mobile/App.xaml.cs | 14 + src/Paca.Mobile/BrowserPage.cs | 1672 +++- src/Paca.Mobile/DownloadsPage.cs | 504 +- src/Paca.Mobile/HistoryBookmarksPage.cs | 31 +- src/Paca.Mobile/MauiPreferencesStorage.cs | 37 + src/Paca.Mobile/MauiProgram.cs | 21 +- src/Paca.Mobile/MobileAdBannerView.cs | 268 + src/Paca.Mobile/MobileAdServices.cs | 36 + src/Paca.Mobile/MobileMenuModal.cs | 479 + src/Paca.Mobile/Paca.Mobile.csproj | 26 +- src/Paca.Mobile/Pages.cs | 578 +- .../Android/AdMobBannerHostViewHandler.cs | 39 + .../Platforms/Android/AndroidAdMobAdapter.cs | 190 + .../Platforms/Android/AndroidManifest.xml | 36 +- .../Platforms/Android/MainActivity.cs | 38 +- .../Android/PacaAndroidStatusBarHelper.cs | 137 + .../Android/PacaAndroidWebViewCustomizer.cs | 311 + src/Paca.Mobile/Resources/AppIcon/appicon.svg | 2 +- src/Paca.Mobile/Resources/Fonts/lucide.ttf | Bin 0 -> 871752 bytes .../Resources/Images/paca_logo.png | Bin 0 -> 246214 bytes src/Paca.Mobile/Resources/Splash/splash.svg | 10 +- src/Paca.Mobile/SnifferScript.cs | 91 - src/Paca.Mobile/SyncSettingsPage.cs | 424 +- src/Paca.Mobile/TabManagerPage.cs | 68 +- src/Paca.Mobile/TabbedRootPage.cs | 50 +- src/Paca.Mobile/VideoSnifferModal.cs | 54 +- .../Discovery/LanBeaconResponder.cs | 115 + src/Paca.Server/Gateway/GatewayPushModels.cs | 25 + src/Paca.Server/Gateway/PacaGatewayDaemon.cs | 202 + src/Paca.Server/Gateway/WanGatewayManager.cs | 64 + .../Paca.Server}/MdnsAdvertiser.cs | 13 +- .../Paca.Server}/MediaLibrary.cs | 4 +- .../Paca.Server/Paca.Server.csproj | 5 +- src/Paca.Server/PacaHeadlessDaemon.cs | 99 + .../Paca.Server}/PositionStore.cs | 12 +- .../Paca.Server}/QueueHub.cs | 4 +- src/Paca.Server/ServerHost.cs | 633 ++ .../Paca.Server}/ServerModels.cs | 35 +- .../Paca.Server}/Thumbnailer.cs | 8 +- src/Paca.Server/WebCompanion.cs | 452 + .../App/AppDebugScreenshotServiceTests.cs | 82 + .../App/ChromeDownloadManagerParityTests.cs | 60 + .../App/ChromeTabDiscardingMegaTests.cs | 62 + .../App/DesktopDeepLinkGateTests.cs | 42 + ...esktopGatewayDaemonCommandLineGateTests.cs | 65 + ...esktopMediaSpeedAndDiagnosticsGateTests.cs | 122 + .../App/DesktopOmniboxIntegrationGateTests.cs | 65 + .../App/DesktopRemoteTabSyncGateTests.cs | 64 + .../App/DesktopTrayAndGatewayPushGateTests.cs | 61 + .../DesktopZenRailAndStatusBarGateTests.cs | 72 + .../DownloadFolderOpenE2ERedScenarioTests.cs | 94 + .../App/DownloadFolderOpenGateTests.cs | 118 + tests/Paca.Tests/App/GlobalHotkeyGateTests.cs | 56 + .../App/MediaToolsMenuWiringGateTests.cs | 67 + .../App/MultiDisplayLayoutEngineGateTests.cs | 71 + ...ctionAdvancedUxAndLocalizationGateTests.cs | 141 + ...QuickActionGlobalHotkeyAndTrayGateTests.cs | 43 + .../QuickActionInlineEvaluatorGateTests.cs | 62 + ...QuickActionLauncherIntegrationGateTests.cs | 79 + ...ickActionNextGenUxAndAnimationGateTests.cs | 177 + .../QuickActionPillModeAndTabSearchTests.cs | 203 + .../QuickActionRegistryAndCatalogGateTests.cs | 69 + .../QuickActionSpotlightTwoPhase20Tests.cs | 136 + .../App/QuickActionSpotlightUiGateTests.cs | 49 + .../App/QuickCaptureHudGateTests.cs | 66 + .../App/QuickCaptureHudWindowGateTests.cs | 82 + .../App/ScrollBarAndSectionBorderGateTests.cs | 109 + ...otlightDeepIntegrationAndAnimationTests.cs | 274 + .../SpotlightRecentQueryAndScopeGateTests.cs | 181 + .../App/ThumbnailCacheServiceGateTests.cs | 100 + .../UiUxFiftyPolishAndPrecisionGateTests.cs | 436 + .../App/WindowDragAndDoubleClickGateTests.cs | 144 + .../App/ZenBrowserSideRailGateTests.cs | 88 + .../Browser/AppScenarioPipelineTests.cs | 114 + .../Browser/BookmarkPipelineTests.cs | 188 + .../Browser/BrowserMenuAndDesignTests.cs | 260 + .../Browser/BrowserPrivacyPipelineTests.cs | 421 + .../Browser/ChromeAutofillManagerTests.cs | 73 + .../ChromeDownloadShelfSecurityTests.cs | 99 + .../ChromeExtensionCspValidatorTests.cs | 48 + .../Browser/ChromeHistoryEngineTests.cs | 129 + .../Browser/ChromeIncognitoIsolationTests.cs | 79 + .../ChromeMediaSessionAdvancedTests.cs | 86 + .../Browser/ChromeMediaSessionPiPTests.cs | 89 + .../Browser/ChromeNewTabPageTests.cs | 295 + .../Browser/ChromeOmniboxActionsTests.cs | 75 + .../Browser/ChromeOmniboxAutocompleteTests.cs | 79 + .../Browser/ChromeOmniboxSiteSearchTests.cs | 70 + .../ChromeOpenSearchAndCustomEngineTests.cs | 70 + .../ChromeParityAdvancedFeaturesTests.cs | 116 + .../Browser/ChromeParityDialogsGateTests.cs | 92 + ...hromeParityLastTabCloseHomeTabGateTests.cs | 360 + .../Browser/ChromeParityMilestone10Tests.cs | 78 + .../Browser/ChromeParityMilestone11Tests.cs | 69 + .../Browser/ChromeParityMilestone12Tests.cs | 80 + .../Browser/ChromeParityMilestone13Tests.cs | 55 + .../Browser/ChromeParityMilestone14Tests.cs | 44 + .../Browser/ChromeParityMilestone15Tests.cs | 64 + .../Browser/ChromeParityMilestone16Tests.cs | 49 + .../Browser/ChromeParityMilestone17Tests.cs | 43 + .../Browser/ChromeParityMilestone18Tests.cs | 48 + .../Browser/ChromeParityMilestone32Tests.cs | 47 + .../Browser/ChromeParityMilestone5Tests.cs | 133 + .../Browser/ChromeParityMilestone6Tests.cs | 74 + .../Browser/ChromeParityMilestone7Tests.cs | 110 + .../Browser/ChromeParityMilestone8Tests.cs | 176 + .../Browser/ChromeParityMilestone9Tests.cs | 46 + .../ChromeParityNavigationAndToolsTests.cs | 147 + .../Browser/ChromeParityTabOperationsTests.cs | 171 + .../ChromePwaInstallationManagerTests.cs | 102 + .../Browser/ChromeReadingListAdvancedTests.cs | 100 + .../Browser/ChromeReadingListSyncTests.cs | 139 + .../ChromeSecurityBadgeEvaluatorTests.cs | 44 + .../ChromeSitePermissionsCoordinatorTests.cs | 91 + .../Browser/ChromeSitePermissionsTests.cs | 90 + .../ChromeSiteSecurityEvaluatorTests.cs | 64 + .../Browser/ChromeTabDeduplicationTests.cs | 55 + .../Browser/ChromeTabDiscardPolicyTests.cs | 84 + .../Browser/ChromeTabGroupAdvancedTests.cs | 115 + .../Browser/ChromeTabGroupingMegaTests.cs | 94 + .../Browser/ChromeTabHoverCardTests.cs | 51 + .../Browser/ChromeTaskManagerAdvancedTests.cs | 89 + .../Browser/ChromeUserScriptManagerTests.cs | 110 + .../Browser/ChromeWebAppManifestTests.cs | 120 + .../Browser/CommandPaletteTests.cs | 4 +- .../DeclarativeNetRequestAdversarialTests.cs | 55 + .../DeclarativeNetRequestPriorityTests.cs | 82 + .../Browser/DeclarativeNetRequestTrieTests.cs | 61 + .../Browser/DeepUserScenarioTests.cs | 180 + .../DesktopAdSlotAndNtpSponsoredGateTests.cs | 430 + .../Browser/DesktopRemainderTests.cs | 18 +- .../Browser/DownloadActiveStateTests.cs | 63 + .../Browser/ExtensionFido2BridgeGateTests.cs | 23 + .../Browser/ExtensionSystemPipelineTests.cs | 3404 ++++++++ .../Paca.Tests}/Browser/FindSessionTests.cs | 24 +- .../Browser/MediaDetectionPipelineTests.cs | 420 + .../PacaUniqueBrowserFeaturesGateTests.cs | 206 + .../PrivateBrowsingExhaustiveGateTests.cs | 224 + .../PrivateBrowsingSessionGateTests.cs | 203 + .../ProfileAndMediaUiIntegrationTests.cs | 76 + .../Paca.Tests/Browser/ProfileManagerTests.cs | 160 + .../Browser/SearchEngineResolverTests.cs | 12 +- .../Browser/TabManagementPipelineTests.cs | 596 ++ .../Browser/ToolbarCustomizationTests.cs | 87 + .../Browser/UiUsecaseHardeningTests.cs | 18 +- .../WebViewMediaAndSessionGateTests.cs | 157 + ...erStorageAndSessionHardeningPhase7Tests.cs | 114 + .../Core/AdaptiveBufferScalerGateTests.cs | 55 + .../AdaptiveStreamingAndIntegrityGateTests.cs | 97 + ...tiveStreamingBitrateControllerGateTests.cs | 133 + .../Core/AudioAlbumTrackSplitterGateTests.cs | 72 + .../Core/AudioChannelDownmixerGateTests.cs | 50 + .../AudioDynamicRangeCompressorGateTests.cs | 57 + .../AudioEqualizerProfileManagerGateTests.cs | 62 + .../Core/AudioPitchShiftEngineGateTests.cs | 64 + .../Core/AudioVocalStemExtractorGateTests.cs | 76 + .../Core/AudioVolumeNormalizerGateTests.cs | 88 + .../Core/BandwidthRateLimiterGateTests.cs | 52 + .../Core/BandwidthScheduleProfileGateTests.cs | 91 + .../Core/BatteryPowerGovernorGateTests.cs | 64 + .../Core/BatterySaverPowerManagerTests.cs | 147 + .../Core/BookmarkChapterExporterGateTests.cs | 64 + .../Core/ChromeMemorySaverPolicyTests.cs | 33 + .../Core/CoreAndServerResilienceGateTests.cs | 224 + ...eStreamingAndVaultResiliencePhase6Tests.cs | 152 + .../Core/DataUsageQuotaTrackerGateTests.cs | 84 + .../DirectDownloaderIntegrityGateTests.cs | 140 + ...derCleanlinessAndPacaIsolationGateTests.cs | 175 + .../DownloadSelfHealingEngineGateTests.cs | 57 + ...DownloadTokenBucketRateLimiterGateTests.cs | 70 + .../Core/DualSubtitleComposerGateTests.cs | 84 + .../Core/DynamicConcurrencyTunerGateTests.cs | 58 + .../ExtremeResilienceAndStressGateTests.cs | 151 + .../GpuHardwareAccelerationProfilerTests.cs | 176 + .../Core/HlsManifestValidatorGateTests.cs | 90 + .../Core/MediaBitrateEstimatorGateTests.cs | 55 + .../Core/MediaBookmarkAnnotationGateTests.cs | 77 + .../Core/MediaChapterAndSubtitleGateTests.cs | 85 + .../Core/MediaChecksumVerifierGateTests.cs | 61 + .../Core/MediaEnginePipelineTests.cs | 1551 ++++ .../Core/MediaFileNameTemplateGateTests.cs | 73 + .../Core/MediaIntegrityVerifierGateTests.cs | 70 + .../Core/MediaMetadataTagWriterGateTests.cs | 89 + .../Core/MediaPlaybackSpeedPitchGateTests.cs | 70 + .../MediaStorageGarbageCollectorGateTests.cs | 90 + .../Core/MediaStreamingTransferGateTests.cs | 74 + .../Core/MultiTrackMediaMuxerGateTests.cs | 101 + .../Core/NetworkLatencyJitterGateTests.cs | 84 + .../NetworkResilienceSupervisorGateTests.cs | 72 + .../Core/OfflineMediaPrefetcherGateTests.cs | 78 + .../Paca.Tests/Core/PacaDeepLinkGateTests.cs | 86 + .../Core/PacaVaultBackupRestoreGateTests.cs | 77 + .../PartialChunkIntegrityCacheGateTests.cs | 169 + .../PlaybackHistorySyncManagerGateTests.cs | 65 + .../Core/PlaybackSleepTimerEngineGateTests.cs | 61 + .../Core/ProxyAutoConfigGateTests.cs | 76 + .../ProxyConfigurationManagerGateTests.cs | 53 + .../Core/QuietHoursNotificationGateTests.cs | 97 + .../Core/RemoteClipboardBridgeGateTests.cs | 88 + .../Core/SmartBandwidthSchedulerGateTests.cs | 76 + .../Core/SmartCategoryClassifierGateTests.cs | 53 + .../Core/SmartCollectionPlaylistGateTests.cs | 83 + ...SmartDeduplicationAndCollisionGateTests.cs | 92 + .../Core/SmartMediaFilterEngineGateTests.cs | 134 + .../SmartMediaNamingAndThumbnailGateTests.cs | 100 + .../Core/SmartPriorityQueueGateTests.cs | 75 + ...SmartSilenceSkipperAndWaveformGateTests.cs | 82 + .../StorageQuotaEvictionPlannerGateTests.cs | 84 + .../Core/StreamHighlightClipperGateTests.cs | 51 + .../Core/SubtitleBurnInEngineGateTests.cs | 68 + .../Core/SubtitleFormatConverterGateTests.cs | 63 + .../Core/SubtitleSyncDrifterGateTests.cs | 64 + .../Core/SubtitleSyncEngineGateTests.cs | 88 + .../Core/ThumbnailScrubberPreviewGateTests.cs | 61 + .../Core/TranscodingPresetEngineGateTests.cs | 46 + .../Core/VideoAspectAutoCropperGateTests.cs | 52 + .../Core/VideoDenoiseEnhancerGateTests.cs | 49 + .../Core/VideoFrameRateConverterGateTests.cs | 44 + .../Core/VideoIntroOutroTrimmerGateTests.cs | 74 + .../Core/VideoPosterExtractorGateTests.cs | 62 + .../VideoSpriteSheetGeneratorGateTests.cs | 58 + .../Core/VideoTonemapEnhancerGateTests.cs | 85 + .../Core/WanReachabilityProberGateTests.cs | 68 + .../Core/WorkspaceEncodingSanitizerTests.cs | 76 + .../E2E/ComprehensiveE2EScenarioTests.cs | 606 ++ .../E2E/CoreAndServerHardeningPhase3Tests.cs | 352 + .../E2E/DesignSystemCommandmentsGateTests.cs | 155 + .../DesignSystemCommandmentsPhase2Tests.cs | 118 + ...esktopUiAndShortcutHardeningPhase4Tests.cs | 77 + .../E2E/GpuAndBatterySettingsGateTests.cs | 61 + .../E2E/IconGlyphDesignSystemTests.cs | 401 + .../E2E/MainWindowSmokeE2ETests.cs | 12 +- .../ProfileAvatarPresetAndUploadGateTests.cs | 164 + .../UiContractUseCasesMegaPipelineTests.cs | 1559 ++++ .../E2E/UiFeatureInteractionsPipelineTests.cs | 511 ++ .../Paca.Tests}/E2E/UiUsecaseLiveE2ETests.cs | 57 +- tests/Paca.Tests/E2E/VisualDesignGateTests.cs | 2125 +++++ tests/Paca.Tests/GlobalUsings.cs | 19 + .../Infrastructure/AppScenarioPipeline.cs | 172 + .../Infrastructure/GrandUnifiedPipeline.cs | 125 + .../MetaTestQualityAndPruningTests.cs | 203 + .../Infrastructure/SettingsViewModelTests.cs | 141 + .../Infrastructure/SiteSeoAeoGeoGateTests.cs | 120 + .../Paca.Tests}/Infrastructure/SourceTree.cs | 32 +- .../Infrastructure/StaDispatcher.cs | 3 +- .../SystemResiliencePipelineTests.cs | 1353 +++ .../TestVerificationSystemGateTests.cs | 1151 +++ .../Infrastructure/UiContractPipeline.cs | 55 + tests/Paca.Tests/Infrastructure/WpfTestApp.cs | 67 + ...leAdMobInterstitialAndRewardedGateTests.cs | 70 + .../MobileAdMobWaterfallAndRewardGateTests.cs | 236 + .../MobileAdaptiveTranscodingGateTests.cs | 67 + .../Mobile/MobileAndroidModernizationTests.cs | 115 + ...leAndroidSystemBarHarmonyAndAdGateTests.cs | 146 + .../MobileBatteryGuardAndHapticGateTests.cs | 76 + .../Mobile/MobileBrowserCoreTests.cs | 56 + .../Mobile/MobileCoreFeaturesGateTests.cs | 71 + .../Mobile/MobileDeepLinkTargetGateTests.cs | 39 + .../Mobile/MobileDesignSystemGateTests.cs | 14 + .../MobileDesktopParityBrowserGateTests.cs | 270 + .../MobileDesktopParityDownloadGateTests.cs | 194 + ...obileGatewayDaemonAndHandshakeGateTests.cs | 105 + .../Mobile/MobileIntuitiveUxGateTests.cs | 151 + .../Mobile/MobileLanAutoDiscoveryGateTests.cs | 197 + .../Mobile/MobileMediaIntegrityGateTests.cs | 82 + .../Mobile/MobileMenuContractGateTests.cs | 118 + .../MobileOfflineLibraryDashboardGateTests.cs | 105 + ...MobileOrganicSafeAreaAndScrollGateTests.cs | 201 + .../MobileP2pAndMediaAdversarialTests.cs | 81 + .../MobilePacaDropBatchBundleGateTests.cs | 127 + .../Paca.Tests/Mobile/MobilePipelineTests.cs | 5 +- .../MobilePlayerGestureAndPipGateTests.cs | 76 + .../Mobile/MobilePrivateBrowsingGateTests.cs | 165 + .../MobileProductionFeaturesGateTests.cs | 102 + .../Mobile/MobileQrPairingUiGateTests.cs | 55 + ...ResponsivenessAndAnrPreventionGateTests.cs | 672 ++ .../MobileShareTextExtractorGateTests.cs | 44 + .../MobileSmartClipboardSnifferGateTests.cs | 124 + .../MobileSwissMinimalExcellenceGateTests.cs | 107 + .../MobileTextEncodingSanitizerGateTests.cs | 49 + .../Mobile/MobileUiProductionGateTests.cs | 266 + .../MobileWanGatewayRoamingGateTests.cs | 121 + .../Mobile/MobileWebVideoPlaybackGateTests.cs | 74 + .../Mobile/P2pQrPayloadCodecTests.cs | 57 + .../ModernBrowsingMilestone10Phase110Tests.cs | 453 + .../ModernBrowsingMilestone11Phase111Tests.cs | 532 ++ .../ModernBrowsingMilestone12Phase112Tests.cs | 449 + .../ModernBrowsingMilestone13Phase113Tests.cs | 416 + .../ModernBrowsingMilestone14Phase114Tests.cs | 388 + .../ModernBrowsingMilestone1Phase101Tests.cs | 271 + .../ModernBrowsingMilestone2Phase102Tests.cs | 251 + .../ModernBrowsingMilestone3Phase103Tests.cs | 319 + .../ModernBrowsingMilestone4Phase104Tests.cs | 267 + .../ModernBrowsingMilestone5Phase105Tests.cs | 412 + .../ModernBrowsingMilestone6Phase106Tests.cs | 470 + .../ModernBrowsingMilestone7Phase107Tests.cs | 397 + .../ModernBrowsingMilestone8Phase108Tests.cs | 376 + .../ModernBrowsingMilestone9Phase109Tests.cs | 416 + tests/Paca.Tests/Paca.Tests.csproj | 33 + .../AvaloniaAndMobileDiscoveryGateTests.cs | 107 + .../Platform/AvaloniaShellGateTests.cs | 89 + .../Platform/CliPipelineGateTests.cs | 101 + ...CrossPlatformParityHardeningPhase5Tests.cs | 162 + .../Platform/PlatformPipelineTests.cs | 409 + .../Security/Milestone53TitanMatrixTests.cs | 553 ++ .../Security/SecurityVaultPipelineTests.cs | 1166 +++ .../Security/VirtualFido2AdversarialTests.cs | 97 + .../VirtualFido2AuthenticatorTests.cs | 64 + .../Server/ServerLanBeaconGateTests.cs | 58 + .../Server/ServerPasskeyAuthTests.cs | 183 + .../Paca.Tests/Server/ServerPipelineTests.cs | 488 ++ .../Server/ServerSmartPlaylistGateTests.cs | 97 + .../Server/WorkspaceRemoteApiTests.cs | 93 + tests/Paca.Tests/xunit.runner.json | 7 + 975 files changed, 130593 insertions(+), 16783 deletions(-) delete mode 100644 .claude/hooks/session-brief.sh delete mode 100644 .claude/hooks/verify-on-stop.sh delete mode 100644 .claude/rules/desktop-wpf.md delete mode 100644 .claude/rules/engine-core.md delete mode 100644 .claude/rules/mobile-maui.md delete mode 100644 .claude/rules/tests.md delete mode 100644 .claude/settings.json delete mode 100644 .claude/skills/release/SKILL.md delete mode 100644 .claude/skills/tdd/SKILL.md delete mode 100644 .claude/skills/verify/SKILL.md create mode 100644 .cursorrules create mode 100644 Paca.slnx delete mode 100644 VideoDownloader.App/BookmarkManagerWindow.xaml delete mode 100644 VideoDownloader.App/Browser/PairingWindow.cs delete mode 100644 VideoDownloader.App/Browser/PlayerWindow.cs delete mode 100644 VideoDownloader.App/Converters.cs delete mode 100644 VideoDownloader.App/Core/ConfigStore.cs delete mode 100644 VideoDownloader.App/CrashReportDialog.xaml delete mode 100644 VideoDownloader.App/MainWindow.xaml delete mode 100644 VideoDownloader.App/MainWindow.xaml.cs delete mode 100644 VideoDownloader.App/Services/TabViewService.cs delete mode 100644 VideoDownloader.App/SettingsWindow.xaml delete mode 100644 VideoDownloader.App/Themes/Shared.xaml delete mode 100644 VideoDownloader.Avalonia/MainWindow.axaml delete mode 100644 VideoDownloader.Browser/PermissionGate.cs delete mode 100644 VideoDownloader.Browser/Tabs/TabManager.cs delete mode 100644 VideoDownloader.Browser/Tabs/TabPreview.cs delete mode 100644 VideoDownloader.Browser/Tabs/TabSessionStore.cs delete mode 100644 VideoDownloader.Browser/UrlCleaner.cs delete mode 100644 VideoDownloader.Core/Detection/DetectionContext.cs delete mode 100644 VideoDownloader.Core/Detection/MediaDetector.cs delete mode 100644 VideoDownloader.Core/Hls/DirectDownloader.cs delete mode 100644 VideoDownloader.Core/Platform/CorePaths.cs delete mode 100644 VideoDownloader.Core/Util/FileNameUtil.cs delete mode 100644 VideoDownloader.Core/VideoDownloader.Core.csproj delete mode 100644 VideoDownloader.Mobile.Core/ConnectionTroubleshoot.cs delete mode 100644 VideoDownloader.Mobile.Core/OfflineStore.cs delete mode 100644 VideoDownloader.Mobile.Core/QueueCompletionDetector.cs delete mode 100644 VideoDownloader.Mobile.Core/SharePayload.cs delete mode 100644 VideoDownloader.Mobile/ApiClient.cs delete mode 100644 VideoDownloader.Mobile/App.xaml delete mode 100644 VideoDownloader.Mobile/App.xaml.cs delete mode 100644 VideoDownloader.Mobile/AppOfflineStore.cs delete mode 100644 VideoDownloader.Mobile/MauiProgram.cs delete mode 100644 VideoDownloader.Mobile/Pages.cs delete mode 100644 VideoDownloader.Mobile/Platforms/Android/AndroidManifest.xml delete mode 100644 VideoDownloader.Mobile/Platforms/Android/MainActivity.cs delete mode 100644 VideoDownloader.Mobile/Platforms/Android/MainApplication.cs delete mode 100644 VideoDownloader.Mobile/Platforms/Android/Resources/values/colors.xml delete mode 100644 VideoDownloader.Mobile/Platforms/MacCatalyst/AppDelegate.cs delete mode 100644 VideoDownloader.Mobile/Platforms/MacCatalyst/Entitlements.plist delete mode 100644 VideoDownloader.Mobile/Platforms/MacCatalyst/Info.plist delete mode 100644 VideoDownloader.Mobile/Platforms/MacCatalyst/Program.cs delete mode 100644 VideoDownloader.Mobile/Platforms/Windows/App.xaml delete mode 100644 VideoDownloader.Mobile/Platforms/Windows/App.xaml.cs delete mode 100644 VideoDownloader.Mobile/Platforms/Windows/Package.appxmanifest delete mode 100644 VideoDownloader.Mobile/Platforms/Windows/app.manifest delete mode 100644 VideoDownloader.Mobile/Platforms/iOS/AppDelegate.cs delete mode 100644 VideoDownloader.Mobile/Platforms/iOS/Info.plist delete mode 100644 VideoDownloader.Mobile/Platforms/iOS/Program.cs delete mode 100644 VideoDownloader.Mobile/Platforms/iOS/Resources/PrivacyInfo.xcprivacy delete mode 100644 VideoDownloader.Mobile/Properties/launchSettings.json delete mode 100644 VideoDownloader.Mobile/Resources/AppIcon/appicon.svg delete mode 100644 VideoDownloader.Mobile/Resources/AppIcon/appiconfg.svg delete mode 100644 VideoDownloader.Mobile/Resources/Fonts/OpenSans-Regular.ttf delete mode 100644 VideoDownloader.Mobile/Resources/Fonts/OpenSans-Semibold.ttf delete mode 100644 VideoDownloader.Mobile/Resources/Images/dotnet_bot.png delete mode 100644 VideoDownloader.Mobile/Resources/Raw/AboutAssets.txt delete mode 100644 VideoDownloader.Mobile/Resources/Splash/splash.svg delete mode 100644 VideoDownloader.Mobile/Resources/Styles/Colors.xaml delete mode 100644 VideoDownloader.Mobile/Resources/Styles/Styles.xaml delete mode 100644 VideoDownloader.Mobile/ShareTarget.cs delete mode 100644 VideoDownloader.Mobile/TabbedRootPage.cs delete mode 100644 VideoDownloader.Mobile/VideoDownloader.Mobile.csproj delete mode 100644 VideoDownloader.Server/ServerHost.cs delete mode 100644 VideoDownloader.Server/WebCompanion.cs delete mode 100644 VideoDownloader.Tests/Browser/MediaPlaylistTests.cs delete mode 100644 VideoDownloader.Tests/Browser/PageDownloadTrackerTests.cs delete mode 100644 VideoDownloader.Tests/Browser/PermissionGateTests.cs delete mode 100644 VideoDownloader.Tests/Browser/SiteZoomStoreTests.cs delete mode 100644 VideoDownloader.Tests/Browser/TabFeaturesTests.cs delete mode 100644 VideoDownloader.Tests/Browser/TabGroupsWorkspacesTests.cs delete mode 100644 VideoDownloader.Tests/Browser/TabManagerTests.cs delete mode 100644 VideoDownloader.Tests/Browser/TrackerBlockTests.cs delete mode 100644 VideoDownloader.Tests/Browser/UrlCleanerTests.cs delete mode 100644 VideoDownloader.Tests/E2E/IconContentFontTests.cs delete mode 100644 VideoDownloader.Tests/E2E/IconGlyphRenderTests.cs delete mode 100644 VideoDownloader.Tests/E2E/PermissionTrackerE2ETests.cs delete mode 100644 VideoDownloader.Tests/E2E/ReaderModeE2ETests.cs delete mode 100644 VideoDownloader.Tests/E2E/SettingsUpdateUiE2ETests.cs delete mode 100644 VideoDownloader.Tests/E2E/UiUsecaseAccessibilityRedTests.cs delete mode 100644 VideoDownloader.Tests/E2E/UiUsecaseDownloadsRedTests.cs delete mode 100644 VideoDownloader.Tests/E2E/UiUsecaseInteractionRedTests.cs delete mode 100644 VideoDownloader.Tests/E2E/UiUsecaseLayoutRedTests.cs delete mode 100644 VideoDownloader.Tests/E2E/UiUsecaseLibraryRedTests.cs delete mode 100644 VideoDownloader.Tests/E2E/UiUsecaseSettingsRedTests.cs delete mode 100644 VideoDownloader.Tests/E2E/UiUsecaseStatusRedTests.cs delete mode 100644 VideoDownloader.Tests/E2E/UiUsecaseTabsRedTests.cs delete mode 100644 VideoDownloader.Tests/E2E/UiUsecaseThemeRedTests.cs delete mode 100644 VideoDownloader.Tests/E2E/UiUsecaseTypographyRedTests.cs delete mode 100644 VideoDownloader.Tests/E2E/WebView2FindE2ETests.cs delete mode 100644 VideoDownloader.Tests/GlobalUsings.cs delete mode 100644 VideoDownloader.Tests/Infrastructure/IconGlyphXamlTests.cs delete mode 100644 VideoDownloader.Tests/Infrastructure/WpfTestApp.cs delete mode 100644 VideoDownloader.Tests/Mobile/MobileCoreTests.cs delete mode 100644 VideoDownloader.Tests/Platform/HlsMuxerWiringTests.cs delete mode 100644 VideoDownloader.Tests/Platform/PlatformAbstractionTests.cs delete mode 100644 VideoDownloader.Tests/Platform/UpdateCheckerTests.cs delete mode 100644 VideoDownloader.Tests/Server/MdnsAdvertiserTests.cs delete mode 100644 VideoDownloader.Tests/Server/QueueHubE2ETests.cs delete mode 100644 VideoDownloader.Tests/Server/RemoteServerE2ETests.cs delete mode 100644 VideoDownloader.Tests/Server/ThumbnailerTests.cs delete mode 100644 VideoDownloader.Tests/VideoDownloader.Tests.csproj delete mode 100644 VideoDownloader.slnx create mode 100644 build/Paca.wxs create mode 100644 design.md create mode 100644 docs/EXTREME_EXPANSION_PLAN.md create mode 100644 docs/MOBILE_BROWSER_ARCHITECTURE_PLAN.md create mode 100644 docs/REPOSITORY_STRUCTURE_PLAN.md create mode 100644 docs/TDD_THEORY_SSOT.md create mode 100644 docs/references/DESIGN_AUDIT_METHODOLOGIES.md create mode 100644 site/ads.txt create mode 100644 site/app-ads.txt create mode 100644 site/assets/apple-touch-icon.png create mode 100644 site/assets/favicon-32x32.png create mode 100644 site/assets/favicon.ico create mode 100644 site/assets/favicon.png create mode 100644 site/assets/favicon.svg create mode 100644 site/assets/og.jpg create mode 100644 site/assets/paca-logo-512.png create mode 100644 site/assets/paca-logo.png create mode 100644 site/gate-report.md create mode 100644 site/gate.config.json create mode 100644 site/googleeaed2376f70d466e.html create mode 100644 site/how-to-download-m3u8.html create mode 100644 site/llms-full.txt create mode 100644 site/llms.txt create mode 100644 site/robots.txt create mode 100644 site/sitemap.xml create mode 100644 site/vs-idm-alternative.html rename {VideoDownloader.App => src/Paca.App}/App.xaml (79%) rename {VideoDownloader.App => src/Paca.App}/App.xaml.cs (66%) rename {VideoDownloader.App => src/Paca.App}/AppPaths.cs (55%) rename {VideoDownloader.App => src/Paca.App}/AssemblyInfo.cs (100%) create mode 100644 src/Paca.App/Assets/Avatars/avatar_01.png create mode 100644 src/Paca.App/Assets/Avatars/avatar_02.png create mode 100644 src/Paca.App/Assets/Avatars/avatar_03.png create mode 100644 src/Paca.App/Assets/Avatars/avatar_04.png create mode 100644 src/Paca.App/Assets/Avatars/avatar_05.png create mode 100644 src/Paca.App/Assets/Avatars/avatar_06.png create mode 100644 src/Paca.App/Assets/Avatars/avatar_07.png create mode 100644 src/Paca.App/Assets/Avatars/avatar_08.png create mode 100644 src/Paca.App/Assets/Avatars/avatar_09.png create mode 100644 src/Paca.App/Assets/Avatars/avatar_10.png create mode 100644 src/Paca.App/Assets/Avatars/avatar_11.png create mode 100644 src/Paca.App/Assets/Avatars/avatar_12.png create mode 100644 src/Paca.App/Assets/Avatars/avatar_13.png create mode 100644 src/Paca.App/Assets/Avatars/avatar_14.png create mode 100644 src/Paca.App/Assets/Avatars/avatar_15.png create mode 100644 src/Paca.App/Assets/Avatars/avatar_16.png create mode 100644 src/Paca.App/Assets/Avatars/avatar_17.png create mode 100644 src/Paca.App/Assets/Avatars/avatar_18.png create mode 100644 src/Paca.App/Assets/Avatars/avatar_19.png create mode 100644 src/Paca.App/Assets/Avatars/avatar_20.png create mode 100644 src/Paca.App/Assets/Fonts/lucide.ttf rename {VideoDownloader.App => src/Paca.App}/Assets/dash.all.min.js (100%) rename {VideoDownloader.App => src/Paca.App}/Assets/hls.min.js (100%) create mode 100644 src/Paca.App/Assets/paca.ico create mode 100644 src/Paca.App/Assets/paca.png rename {VideoDownloader.App => src/Paca.App}/Assets/readability.js (100%) create mode 100644 src/Paca.App/BookmarkManagerWindow.xaml rename {VideoDownloader.App => src/Paca.App}/BookmarkManagerWindow.xaml.cs (98%) rename {VideoDownloader.App => src/Paca.App}/Browser/Features/CommandPalette.cs (93%) rename {VideoDownloader.App => src/Paca.App}/Browser/Features/DownloadOperationAdapter.cs (97%) rename {VideoDownloader.App => src/Paca.App}/Browser/Features/MediaPlaylist.cs (96%) create mode 100644 src/Paca.App/Browser/Features/NewTabPageBuilder.InPrivate.cs create mode 100644 src/Paca.App/Browser/Features/NewTabPageBuilder.cs rename {VideoDownloader.App => src/Paca.App}/Browser/Features/PageDownloadTracker.cs (73%) rename {VideoDownloader.App => src/Paca.App}/Browser/Features/ReaderMode.cs (95%) rename {VideoDownloader.App => src/Paca.App}/Browser/Features/TabSearchFilter.cs (56%) rename {VideoDownloader.App => src/Paca.App}/Browser/Features/TabSuspendService.cs (94%) create mode 100644 src/Paca.App/Browser/Features/WebView2ExtensionHost.cs rename {VideoDownloader.App => src/Paca.App}/Browser/GlanceWindow.xaml.cs (57%) create mode 100644 src/Paca.App/Browser/PairingWindow.cs create mode 100644 src/Paca.App/Browser/PlayerWindow.cs create mode 100644 src/Paca.App/Browser/QuickCaptureHudWindow.cs create mode 100644 src/Paca.App/BrowserTaskManagerWindow.xaml create mode 100644 src/Paca.App/BrowserTaskManagerWindow.xaml.cs create mode 100644 src/Paca.App/ClearBrowsingDataDialog.xaml create mode 100644 src/Paca.App/ClearBrowsingDataDialog.xaml.cs create mode 100644 src/Paca.App/Controls/DesktopAdBannerControl.xaml create mode 100644 src/Paca.App/Controls/DesktopAdBannerControl.xaml.cs create mode 100644 src/Paca.App/Converters.cs create mode 100644 src/Paca.App/Core/ConfigStore.cs rename {VideoDownloader.App => src/Paca.App}/Core/DownloadManager.cs (77%) create mode 100644 src/Paca.App/Core/GlobalHotkeyManager.cs create mode 100644 src/Paca.App/Core/MultiDisplayLayoutEngine.cs create mode 100644 src/Paca.App/CrashReportDialog.xaml rename {VideoDownloader.App => src/Paca.App}/CrashReportDialog.xaml.cs (71%) create mode 100644 src/Paca.App/CredentialVaultWindow.xaml create mode 100644 src/Paca.App/CredentialVaultWindow.xaml.cs create mode 100644 src/Paca.App/DesktopGatewayDaemonRunner.cs create mode 100644 src/Paca.App/DesktopTrayNotificationModels.cs create mode 100644 src/Paca.App/ExtensionManagerWindow.xaml create mode 100644 src/Paca.App/ExtensionManagerWindow.xaml.cs create mode 100644 src/Paca.App/LogViewerWindow.xaml create mode 100644 src/Paca.App/LogViewerWindow.xaml.cs rename {VideoDownloader.App => src/Paca.App}/MainWindow.Usecases.cs (62%) create mode 100644 src/Paca.App/MainWindow.xaml create mode 100644 src/Paca.App/MainWindow.xaml.cs rename VideoDownloader.App/VideoDownloader.App.csproj => src/Paca.App/Paca.App.csproj (64%) create mode 100644 src/Paca.App/ProfileAvatarHelper.cs create mode 100644 src/Paca.App/QrCodeDialog.xaml create mode 100644 src/Paca.App/QrCodeDialog.xaml.cs create mode 100644 src/Paca.App/QuickActionLauncherWindow.xaml create mode 100644 src/Paca.App/QuickActionLauncherWindow.xaml.cs rename {VideoDownloader.App => src/Paca.App}/README.md (99%) create mode 100644 src/Paca.App/Services/AppDebugScreenshotService.cs rename {VideoDownloader.App => src/Paca.App}/Services/DownloadQueueAdapter.cs (70%) rename {VideoDownloader.App => src/Paca.App}/Services/DownloadScheduler.cs (96%) create mode 100644 src/Paca.App/Services/GlobalHotkeyService.cs rename {VideoDownloader.App => src/Paca.App}/Services/ShortcutManager.cs (59%) create mode 100644 src/Paca.App/Services/TabViewService.cs rename {VideoDownloader.App => src/Paca.App}/Services/ThemeResolver.cs (96%) create mode 100644 src/Paca.App/Services/ThumbnailCacheService.cs rename {VideoDownloader.App => src/Paca.App}/Services/ToastNotifier.cs (94%) create mode 100644 src/Paca.App/Services/WindowsTrayDaemon.cs create mode 100644 src/Paca.App/SettingsWindow.xaml rename {VideoDownloader.App => src/Paca.App}/SettingsWindow.xaml.cs (59%) rename {VideoDownloader.App => src/Paca.App}/Themes/Dark.xaml (70%) rename {VideoDownloader.App => src/Paca.App}/Themes/HighContrast.xaml (75%) rename {VideoDownloader.App => src/Paca.App}/Themes/Light.xaml (74%) create mode 100644 src/Paca.App/Themes/Shared.xaml create mode 100644 src/Paca.App/Utils/ExplorerLauncher.cs create mode 100644 src/Paca.App/Utils/WindowDragHelper.cs create mode 100644 src/Paca.App/ViewModels/CredentialVaultViewModel.cs rename {VideoDownloader.App => src/Paca.App}/ViewModels/DownloadItemViewModel.cs (56%) create mode 100644 src/Paca.App/ViewModels/QuickCaptureHudViewModel.cs create mode 100644 src/Paca.App/ViewModels/SettingsViewModel.cs create mode 100644 src/Paca.App/app.manifest rename {VideoDownloader.Avalonia => src/Paca.Avalonia}/App.axaml (75%) rename {VideoDownloader.Avalonia => src/Paca.Avalonia}/App.axaml.cs (90%) create mode 100644 src/Paca.Avalonia/Assets/paca.ico rename {VideoDownloader.Avalonia => src/Paca.Avalonia}/MainViewModel.cs (67%) create mode 100644 src/Paca.Avalonia/MainWindow.axaml rename {VideoDownloader.Avalonia => src/Paca.Avalonia}/MainWindow.axaml.cs (89%) rename VideoDownloader.Avalonia/VideoDownloader.Avalonia.csproj => src/Paca.Avalonia/Paca.Avalonia.csproj (75%) rename {VideoDownloader.Avalonia => src/Paca.Avalonia}/Program.cs (95%) rename {VideoDownloader.Avalonia => src/Paca.Avalonia}/RelayCommand.cs (91%) rename {VideoDownloader.Avalonia => src/Paca.Avalonia}/app.manifest (91%) create mode 100644 src/Paca.Browser/AdBlockRuleEngine.cs create mode 100644 src/Paca.Browser/Ads/DesktopAdModels.cs create mode 100644 src/Paca.Browser/Autofill/ChromeAutofillManager.cs create mode 100644 src/Paca.Browser/Automation/AutomationModels.cs create mode 100644 src/Paca.Browser/Automation/BookmarkletRunner.cs create mode 100644 src/Paca.Browser/Automation/CommandChainEngine.cs create mode 100644 src/Paca.Browser/Automation/DesignModeCoordinator.cs create mode 100644 src/Paca.Browser/Automation/ExternalDownloaderBridge.cs create mode 100644 src/Paca.Browser/Automation/LocalP2pSyncEngine.cs create mode 100644 src/Paca.Browser/Automation/NamedSessionManager.cs create mode 100644 src/Paca.Browser/Automation/RssFeedReaderEngine.cs rename {VideoDownloader.Browser => src/Paca.Browser}/BrowserModels.cs (88%) rename {VideoDownloader.Browser => src/Paca.Browser}/BrowserStore.cs (95%) create mode 100644 src/Paca.Browser/BrowserTaskManager.cs create mode 100644 src/Paca.Browser/BrowsingDataCleaner.cs create mode 100644 src/Paca.Browser/ChromeInternalUrlRouter.cs create mode 100644 src/Paca.Browser/Content/ContentModels.cs create mode 100644 src/Paca.Browser/Content/ForceContentDarkModeEngine.cs create mode 100644 src/Paca.Browser/Content/ImmersiveReaderExtractor.cs create mode 100644 src/Paca.Browser/Content/MhtmlWebArchivePackager.cs create mode 100644 src/Paca.Browser/Content/PdfViewerToolbarCoordinator.cs create mode 100644 src/Paca.Browser/Content/PictureInPictureCoordinator.cs create mode 100644 src/Paca.Browser/Content/ReadAloudSpeechCoordinator.cs create mode 100644 src/Paca.Browser/Content/SiteAutoMutePolicy.cs create mode 100644 src/Paca.Browser/Content/WebTranslationService.cs create mode 100644 src/Paca.Browser/Diagnostics/AdvancedProcessTaskInspector.cs create mode 100644 src/Paca.Browser/Diagnostics/BatteryEfficiencyModeGovernor.cs create mode 100644 src/Paca.Browser/Diagnostics/DiscardedTabVisualState.cs create mode 100644 src/Paca.Browser/Diagnostics/DoNotDisturbNotificationPolicy.cs create mode 100644 src/Paca.Browser/Diagnostics/PrintBackgroundGraphicsPolicy.cs create mode 100644 src/Paca.Browser/Diagnostics/SiteStorageQuotaInspector.cs create mode 100644 src/Paca.Browser/Downloads/ChromeAutoOpenFilePolicy.cs create mode 100644 src/Paca.Browser/Downloads/ChromeDownloadShelfCoordinator.cs create mode 100644 src/Paca.Browser/DualSubtitleEngine.cs create mode 100644 src/Paca.Browser/Extensions/ChromeWebStoreClient.cs create mode 100644 src/Paca.Browser/Extensions/CrxPackageExtractor.cs create mode 100644 src/Paca.Browser/Extensions/DeclarativeNetRequestEngine.cs create mode 100644 src/Paca.Browser/Extensions/DnrUrlTrie.cs create mode 100644 src/Paca.Browser/Extensions/ExtensionAlarmManager.cs create mode 100644 src/Paca.Browser/Extensions/ExtensionCspValidator.cs create mode 100644 src/Paca.Browser/Extensions/ExtensionItem.cs create mode 100644 src/Paca.Browser/Extensions/ExtensionManager.cs create mode 100644 src/Paca.Browser/Extensions/ExtensionManifest.cs create mode 100644 src/Paca.Browser/Extensions/ExtensionMarketplace.cs create mode 100644 src/Paca.Browser/Extensions/ExtensionPermissionAuditor.cs create mode 100644 src/Paca.Browser/Extensions/IBrowserExtensionHost.cs create mode 100644 src/Paca.Browser/Extensions/MarketplaceItem.cs create mode 100644 src/Paca.Browser/Extensions/UserScriptEngine.cs rename {VideoDownloader.Browser => src/Paca.Browser}/FindSession.cs (71%) create mode 100644 src/Paca.Browser/History/ChromeHistoryEngine.cs create mode 100644 src/Paca.Browser/Interaction/ClipboardPasteAndGoSuggester.cs create mode 100644 src/Paca.Browser/Interaction/CustomShortcutRemapper.cs create mode 100644 src/Paca.Browser/Interaction/InteractionModels.cs create mode 100644 src/Paca.Browser/Interaction/MouseGestureEngine.cs create mode 100644 src/Paca.Browser/Interaction/PeekPreviewCoordinator.cs create mode 100644 src/Paca.Browser/Interaction/SelectionMiniToolbarCoordinator.cs create mode 100644 src/Paca.Browser/Interaction/SuperDragDropHandler.cs create mode 100644 src/Paca.Browser/Interaction/TaskbarJumpListBuilder.cs create mode 100644 src/Paca.Browser/Layouts/LayoutModels.cs create mode 100644 src/Paca.Browser/Layouts/PinnedTabRailPolicy.cs create mode 100644 src/Paca.Browser/Layouts/SpatialNavigationCoordinator.cs create mode 100644 src/Paca.Browser/Layouts/StartupRestorePolicy.cs create mode 100644 src/Paca.Browser/Layouts/TabLayoutSwitcher.cs create mode 100644 src/Paca.Browser/Layouts/TabStripScrollSwitcher.cs create mode 100644 src/Paca.Browser/Layouts/TabTilingCoordinator.cs create mode 100644 src/Paca.Browser/Layouts/TwoLevelTabStackManager.cs create mode 100644 src/Paca.Browser/Layouts/WindowTabMergeCoordinator.cs create mode 100644 src/Paca.Browser/LiveCaptionEngine.cs create mode 100644 src/Paca.Browser/Media/AutoplayPolicyEngine.cs create mode 100644 src/Paca.Browser/Media/ChromeTabAudioPolicy.cs create mode 100644 src/Paca.Browser/Media/DeviceEmulationCoordinator.cs create mode 100644 src/Paca.Browser/Media/FontOverridePolicy.cs create mode 100644 src/Paca.Browser/Media/GlobalMediaController.cs create mode 100644 src/Paca.Browser/Media/GpuFallbackPolicy.cs create mode 100644 src/Paca.Browser/Media/LiveCaptionCoordinator.cs create mode 100644 src/Paca.Browser/Media/MediaPlaybackState.cs create mode 100644 src/Paca.Browser/Media/MediaSessionCoordinator.cs create mode 100644 src/Paca.Browser/Media/MediaSpeedController.cs create mode 100644 src/Paca.Browser/Media/PageVisualFilterEngine.cs create mode 100644 src/Paca.Browser/Media/VideoFrameCaptureCoordinator.cs create mode 100644 src/Paca.Browser/MemoryTurboGuard.cs create mode 100644 src/Paca.Browser/Networking/AmsiScannerBridge.cs create mode 100644 src/Paca.Browser/Networking/AntiFingerprintingEngine.cs create mode 100644 src/Paca.Browser/Networking/DiskCacheCapManager.cs create mode 100644 src/Paca.Browser/Networking/DohProviderSelector.cs create mode 100644 src/Paca.Browser/Networking/IsolatedIncognitoTabPolicy.cs create mode 100644 src/Paca.Browser/Networking/JavaScriptKillSwitchPolicy.cs create mode 100644 src/Paca.Browser/Networking/MockLocationSimulator.cs create mode 100644 src/Paca.Browser/Networking/RealtimeStreamInspector.cs create mode 100644 src/Paca.Browser/NewTab/NtpModels.cs create mode 100644 src/Paca.Browser/NewTab/NtpStore.cs rename {VideoDownloader.Browser => src/Paca.Browser}/NotesStore.cs (80%) create mode 100644 src/Paca.Browser/OmniboxMathEvaluator.cs rename VideoDownloader.Browser/VideoDownloader.Browser.csproj => src/Paca.Browser/Paca.Browser.csproj (77%) create mode 100644 src/Paca.Browser/PageControls/PageControlsManager.cs create mode 100644 src/Paca.Browser/PageControls/SiteControlsModel.cs create mode 100644 src/Paca.Browser/Panels/CaptureAnnotationModel.cs create mode 100644 src/Paca.Browser/Panels/FullPageScreenshotCoordinator.cs create mode 100644 src/Paca.Browser/Panels/NtpCustomizerService.cs create mode 100644 src/Paca.Browser/Panels/QuickStylerStore.cs create mode 100644 src/Paca.Browser/Panels/SidebarPanelManager.cs create mode 100644 src/Paca.Browser/Panels/SiteStorageInspector.cs create mode 100644 src/Paca.Browser/PermissionGate.cs create mode 100644 src/Paca.Browser/Permissions/ChromeSitePermissionsCoordinator.cs create mode 100644 src/Paca.Browser/Profiles/BrowserProfile.cs create mode 100644 src/Paca.Browser/Profiles/EphemeralProfileManager.cs create mode 100644 src/Paca.Browser/Profiles/ExternalBrowserDataImporter.cs create mode 100644 src/Paca.Browser/Profiles/ProfileManager.cs create mode 100644 src/Paca.Browser/Pwa/WebAppInstallationManager.cs create mode 100644 src/Paca.Browser/Pwa/WebAppManifest.cs create mode 100644 src/Paca.Browser/QrCodeSvgGenerator.cs create mode 100644 src/Paca.Browser/ReadingList/ReadingListManager.cs create mode 100644 src/Paca.Browser/Scripts/UserScript.cs create mode 100644 src/Paca.Browser/Search/BookmarkSanitizer.cs create mode 100644 src/Paca.Browser/Search/HardRefreshEngine.cs create mode 100644 src/Paca.Browser/Search/OmniboxKeywordEngine.cs create mode 100644 src/Paca.Browser/Search/OmniboxScopeFilter.cs create mode 100644 src/Paca.Browser/Search/OpenSearchParser.cs create mode 100644 src/Paca.Browser/Search/SecurePaymentVault.cs create mode 100644 src/Paca.Browser/Search/SiteZoomPersistenceStore.cs create mode 100644 src/Paca.Browser/Search/ViewSourceHelper.cs rename {VideoDownloader.Browser => src/Paca.Browser}/SearchEngine.cs (51%) rename {VideoDownloader.Browser => src/Paca.Browser}/SearchEngineResolver.cs (81%) create mode 100644 src/Paca.Browser/Security/ClearOnExitManager.cs create mode 100644 src/Paca.Browser/Security/ContainerTabManager.cs create mode 100644 src/Paca.Browser/Security/CredentialAutofillEngine.cs create mode 100644 src/Paca.Browser/Security/ExternalProtocolHandlerGate.cs create mode 100644 src/Paca.Browser/Security/HardwareDeviceIndicatorCoordinator.cs create mode 100644 src/Paca.Browser/Security/HttpsUpgradePolicy.cs create mode 100644 src/Paca.Browser/Security/PasswordSecurityAuditor.cs create mode 100644 src/Paca.Browser/Security/QuietPermissionPromptEngine.cs create mode 100644 src/Paca.Browser/Security/SecurityBadgeEvaluator.cs create mode 100644 src/Paca.Browser/Security/SecurityModels.cs create mode 100644 src/Paca.Browser/Security/SslCertificateInspector.cs create mode 100644 src/Paca.Browser/SiteCookieCleaner.cs rename {VideoDownloader.Browser => src/Paca.Browser}/SiteZoomStore.cs (98%) create mode 100644 src/Paca.Browser/SystemIntegration/AutoOpenFileTypePolicy.cs create mode 100644 src/Paca.Browser/SystemIntegration/DownloadBandwidthScheduler.cs create mode 100644 src/Paca.Browser/SystemIntegration/DownloadRiskScanner.cs create mode 100644 src/Paca.Browser/SystemIntegration/FilterSubscriptionManager.cs create mode 100644 src/Paca.Browser/SystemIntegration/PrintPreviewCoordinator.cs create mode 100644 src/Paca.Browser/SystemIntegration/ShieldBreakdownReport.cs rename {VideoDownloader.Browser => src/Paca.Browser}/TabArchive.cs (97%) create mode 100644 src/Paca.Browser/Tabs/AutoTabArchiver.cs create mode 100644 src/Paca.Browser/Tabs/ChromeTabDiscardPolicy.cs create mode 100644 src/Paca.Browser/Tabs/ChromeTabGroupPalette.cs create mode 100644 src/Paca.Browser/Tabs/ClosedTabTimelineManager.cs create mode 100644 src/Paca.Browser/Tabs/DuplicateTabDetector.cs create mode 100644 src/Paca.Browser/Tabs/NavigationHistoryStack.cs create mode 100644 src/Paca.Browser/Tabs/OmniboxActionEvaluator.cs create mode 100644 src/Paca.Browser/Tabs/OmniboxAutocomplete.cs create mode 100644 src/Paca.Browser/Tabs/OmniboxSiteSearchEvaluator.cs create mode 100644 src/Paca.Browser/Tabs/SessionCrashRecoveryService.cs create mode 100644 src/Paca.Browser/Tabs/SiteSecurityEvaluator.cs create mode 100644 src/Paca.Browser/Tabs/SleepingTabsPolicy.cs rename {VideoDownloader.Browser => src/Paca.Browser}/Tabs/TabItem.cs (87%) create mode 100644 src/Paca.Browser/Tabs/TabManager.cs create mode 100644 src/Paca.Browser/Tabs/TabModels.cs create mode 100644 src/Paca.Browser/Tabs/TabPreview.cs create mode 100644 src/Paca.Browser/Tabs/TabPreviewThumbnailService.cs create mode 100644 src/Paca.Browser/Tabs/TabSessionStore.cs create mode 100644 src/Paca.Browser/TextFragmentHelper.cs create mode 100644 src/Paca.Browser/Theming/ScrollAutoHideCoordinator.cs create mode 100644 src/Paca.Browser/Theming/SpeedDialFolderManager.cs create mode 100644 src/Paca.Browser/Theming/StatusBarModuleCoordinator.cs create mode 100644 src/Paca.Browser/Theming/ThemeAutoScheduler.cs create mode 100644 src/Paca.Browser/Theming/ToolbarPaletteManager.cs create mode 100644 src/Paca.Browser/Theming/UiLanguageSwitcher.cs create mode 100644 src/Paca.Browser/Url/CaretBrowsingCoordinator.cs create mode 100644 src/Paca.Browser/Url/CleanLinkExtractor.cs create mode 100644 src/Paca.Browser/Url/HttpResponseHeadersViewer.cs create mode 100644 src/Paca.Browser/Url/OmniboxQrCoordinator.cs create mode 100644 src/Paca.Browser/Url/QuickDictionaryLookup.cs create mode 100644 src/Paca.Browser/Url/TextFragmentDeepLinker.cs create mode 100644 src/Paca.Browser/Url/UrlBreadcrumbNavigator.cs create mode 100644 src/Paca.Browser/UrlCleaner.cs rename {VideoDownloader.Browser => src/Paca.Browser}/WorkspaceRoutingRules.cs (87%) rename VideoDownloader.Cli/VideoDownloader.Cli.csproj => src/Paca.Cli/Paca.Cli.csproj (75%) rename {VideoDownloader.Cli => src/Paca.Cli}/Program.cs (79%) create mode 100644 src/Paca.Core/AudioAlbumTrackSplitter.cs create mode 100644 src/Paca.Core/AudioChannelDownmixer.cs create mode 100644 src/Paca.Core/AudioDynamicRangeCompressor.cs create mode 100644 src/Paca.Core/AudioPitchShiftEngine.cs create mode 100644 src/Paca.Core/AudioVocalStemExtractor.cs create mode 100644 src/Paca.Core/AudioVolumeNormalizer.cs create mode 100644 src/Paca.Core/BandwidthScheduleProfileEngine.cs create mode 100644 src/Paca.Core/Browser/PacaUniqueBrowserFeatures.cs create mode 100644 src/Paca.Core/Browser/WebViewMediaAndSessionEngines.cs rename {VideoDownloader.Core => src/Paca.Core}/Config/AppConfig.cs (72%) create mode 100644 src/Paca.Core/Config/WorkspaceConfigSanitizer.cs rename {VideoDownloader.Core => src/Paca.Core}/Dash/DashDownloader.cs (72%) rename {VideoDownloader.Core => src/Paca.Core}/Dash/DashModels.cs (95%) rename {VideoDownloader.Core => src/Paca.Core}/Dash/DashParser.cs (78%) create mode 100644 src/Paca.Core/Detection/AiHighlightClipper.cs create mode 100644 src/Paca.Core/Detection/DetectionContext.cs create mode 100644 src/Paca.Core/Detection/MediaDetector.cs create mode 100644 src/Paca.Core/Detection/NeuralShaderUpscaler.cs create mode 100644 src/Paca.Core/Detection/NeuralSubtitleEngine.cs rename {VideoDownloader.Core => src/Paca.Core}/Detection/SocialSiteDetector.cs (64%) create mode 100644 src/Paca.Core/Gateway/PacaConnectCodeGenerator.cs create mode 100644 src/Paca.Core/Hls/AdaptiveStreamingBitrateController.cs create mode 100644 src/Paca.Core/Hls/DirectDownloader.cs rename {VideoDownloader.Core => src/Paca.Core}/Hls/HlsDownloader.cs (54%) rename {VideoDownloader.Core => src/Paca.Core}/Hls/M3u8Parser.cs (67%) create mode 100644 src/Paca.Core/Hls/PartialChunkIntegrityCache.cs create mode 100644 src/Paca.Core/HlsManifestValidator.cs create mode 100644 src/Paca.Core/Infrastructure/AutonomousSelfHealingSystem.cs create mode 100644 src/Paca.Core/Infrastructure/ChaosFuzzingMatrixEngine.cs create mode 100644 src/Paca.Core/Media/FftAudioWaveformEngine.cs create mode 100644 src/Paca.Core/Media/HardwareTranscoderStudio.cs create mode 100644 src/Paca.Core/Media/WebRtcCastingEngine.cs create mode 100644 src/Paca.Core/MediaBitrateEstimator.cs create mode 100644 src/Paca.Core/MediaMetadataTagWriter.cs create mode 100644 src/Paca.Core/MediaPlaybackSpeedPitchEngine.cs rename {VideoDownloader.Core => src/Paca.Core}/Models/DownloadProgress.cs (92%) rename {VideoDownloader.Core => src/Paca.Core}/Models/PlaylistModels.cs (57%) create mode 100644 src/Paca.Core/MultiTrackMediaMuxer.cs create mode 100644 src/Paca.Core/Net/HostRateLimiter.cs create mode 100644 src/Paca.Core/Net/MultiCdnMeshDownloader.cs create mode 100644 src/Paca.Core/Net/P2pSwarmEngine.cs rename VideoDownloader.Mobile.Core/VideoDownloader.Mobile.Core.csproj => src/Paca.Core/Paca.Core.csproj (62%) create mode 100644 src/Paca.Core/Platform/AudioNormalizer.cs create mode 100644 src/Paca.Core/Platform/BatterySaverPowerManager.cs create mode 100644 src/Paca.Core/Platform/ChaosMonkeyStressDefense.cs create mode 100644 src/Paca.Core/Platform/ChapterSplitter.cs create mode 100644 src/Paca.Core/Platform/CloudSyncGateway.cs create mode 100644 src/Paca.Core/Platform/CorePaths.cs create mode 100644 src/Paca.Core/Platform/DownloadMetaPathResolver.cs create mode 100644 src/Paca.Core/Platform/GpuHardwareAccelerationProfiler.cs create mode 100644 src/Paca.Core/Platform/HardwareEncoderDetector.cs create mode 100644 src/Paca.Core/Platform/HdrToneMapper.cs create mode 100644 src/Paca.Core/Platform/HighlightShortsClipper.cs create mode 100644 src/Paca.Core/Platform/LiveDvrRecorder.cs create mode 100644 src/Paca.Core/Platform/LosslessSmartTrimmer.cs create mode 100644 src/Paca.Core/Platform/MediaMetadataExtractor.cs rename {VideoDownloader.Core => src/Paca.Core}/Platform/MediaMuxer.cs (58%) create mode 100644 src/Paca.Core/Platform/MultiSourceSegmentAccelerator.cs create mode 100644 src/Paca.Core/Platform/PortableSandboxGuard.cs create mode 100644 src/Paca.Core/Platform/PredictiveChunkPrefetcher.cs rename {VideoDownloader.Core => src/Paca.Core}/Platform/ProcessModels.cs (98%) create mode 100644 src/Paca.Core/Platform/SelfHealingAutoPilot.cs create mode 100644 src/Paca.Core/Platform/VideoDeduplicator.cs create mode 100644 src/Paca.Core/Platform/VideoDenoiseUpscaler.cs create mode 100644 src/Paca.Core/Platform/VideoWatermarkBurner.cs create mode 100644 src/Paca.Core/Platform/VoiceActivitySubtitleAdapter.cs create mode 100644 src/Paca.Core/Platform/VrSpatialAudioEngine.cs create mode 100644 src/Paca.Core/Platform/WebPageArchiver.cs create mode 100644 src/Paca.Core/QuickActions/QuickActionCatalog.cs create mode 100644 src/Paca.Core/QuickActions/QuickActionClipboardDetector.cs create mode 100644 src/Paca.Core/QuickActions/QuickActionFavoritesManager.cs create mode 100644 src/Paca.Core/QuickActions/QuickActionFuzzyMatcher.cs create mode 100644 src/Paca.Core/QuickActions/QuickActionInlineEvaluator.cs create mode 100644 src/Paca.Core/QuickActions/QuickActionModels.cs create mode 100644 src/Paca.Core/QuickActions/QuickActionParameterRouter.cs create mode 100644 src/Paca.Core/QuickActions/QuickActionQueryHistoryStore.cs create mode 100644 src/Paca.Core/QuickActions/QuickActionSearchEngine.cs create mode 100644 src/Paca.Core/QuickActions/QuickActionTimeFormatter.cs create mode 100644 src/Paca.Core/QuickActions/QuickActionUsageTracker.cs create mode 100644 src/Paca.Core/QuickActions/UserCustomActionStore.cs create mode 100644 src/Paca.Core/Resilience/ExtremeResilience.cs create mode 100644 src/Paca.Core/Security/BiometricSecurityPolicy.cs create mode 100644 src/Paca.Core/Security/CrdtVaultSyncEngine.cs create mode 100644 src/Paca.Core/Security/CredentialDataExchange.cs create mode 100644 src/Paca.Core/Security/CredentialSecurityAuditor.cs create mode 100644 src/Paca.Core/Security/E2eeRemoteBackupProvider.cs create mode 100644 src/Paca.Core/Security/HardwareKeyTokenAuthenticator.cs create mode 100644 src/Paca.Core/Security/IOsBiometricAuthenticator.cs create mode 100644 src/Paca.Core/Security/MacTouchIdAuthenticator.cs create mode 100644 src/Paca.Core/Security/MockBiometricAuthenticator.cs create mode 100644 src/Paca.Core/Security/OsProtectedCredentialVault.cs create mode 100644 src/Paca.Core/Security/PasswordSecurityEngine.cs create mode 100644 src/Paca.Core/Security/SiteCredentialRecord.cs create mode 100644 src/Paca.Core/Security/VirtualFido2Authenticator.cs create mode 100644 src/Paca.Core/Security/WindowsHelloAuthenticator.cs rename {VideoDownloader.Core => src/Paca.Core}/Social/CookieJarWriter.cs (97%) rename {VideoDownloader.Core => src/Paca.Core}/Social/CookieRecord.cs (86%) rename {VideoDownloader.Core => src/Paca.Core}/Social/DenoRunner.cs (77%) rename {VideoDownloader.Core => src/Paca.Core}/Social/FormatOption.cs (93%) rename {VideoDownloader.Core => src/Paca.Core}/Social/SocialPresets.cs (96%) rename {VideoDownloader.Core => src/Paca.Core}/Social/YtDlpDownloader.cs (99%) rename {VideoDownloader.Core => src/Paca.Core}/Social/YtDlpRunner.cs (89%) create mode 100644 src/Paca.Core/Streaming/AdaptiveStreamingEngines.cs create mode 100644 src/Paca.Core/SubtitleBurnInEngine.cs rename {VideoDownloader.Core => src/Paca.Core}/Update/UpdateChecker.cs (96%) create mode 100644 src/Paca.Core/Util/FileNameUtil.cs create mode 100644 src/Paca.Core/Utils/BufferPoolManager.cs create mode 100644 src/Paca.Core/Utils/DiskSpaceGuardian.cs create mode 100644 src/Paca.Core/Utils/QoSTrafficShaper.cs create mode 100644 src/Paca.Core/Utils/ThrottledStream.cs create mode 100644 src/Paca.Core/VideoAspectAutoCropper.cs create mode 100644 src/Paca.Core/VideoDenoiseEnhancer.cs create mode 100644 src/Paca.Core/VideoFrameRateConverter.cs create mode 100644 src/Paca.Core/VideoIntroOutroTrimmer.cs create mode 100644 src/Paca.Core/VideoPosterExtractor.cs create mode 100644 src/Paca.Core/VideoSpriteSheetGenerator.cs create mode 100644 src/Paca.Core/VideoTonemapEnhancer.cs create mode 100644 src/Paca.Mobile.Core/AdMobModels.cs create mode 100644 src/Paca.Mobile.Core/AdaptiveBufferScaler.cs create mode 100644 src/Paca.Mobile.Core/AdaptiveStreamingProfile.cs create mode 100644 src/Paca.Mobile.Core/ApiClient.cs create mode 100644 src/Paca.Mobile.Core/AudioEqualizerProfileManager.cs create mode 100644 src/Paca.Mobile.Core/BandwidthRateLimiter.cs create mode 100644 src/Paca.Mobile.Core/BandwidthSchedulePolicy.cs create mode 100644 src/Paca.Mobile.Core/BatteryHealthGuard.cs create mode 100644 src/Paca.Mobile.Core/BatteryPowerGovernor.cs create mode 100644 src/Paca.Mobile.Core/BookmarkChapterExporter.cs create mode 100644 src/Paca.Mobile.Core/DataUsageQuotaTracker.cs create mode 100644 src/Paca.Mobile.Core/DownloadFailureDiagnostics.cs create mode 100644 src/Paca.Mobile.Core/DownloadTokenBucketRateLimiter.cs create mode 100644 src/Paca.Mobile.Core/DualSubtitleComposer.cs create mode 100644 src/Paca.Mobile.Core/DynamicConcurrencyTuner.cs create mode 100644 src/Paca.Mobile.Core/IKeyValueStorage.cs create mode 100644 src/Paca.Mobile.Core/LanDiscoveryProber.cs create mode 100644 src/Paca.Mobile.Core/MediaBookmarkAnnotationEngine.cs create mode 100644 src/Paca.Mobile.Core/MediaChapterSegment.cs create mode 100644 src/Paca.Mobile.Core/MediaChecksumVerifier.cs create mode 100644 src/Paca.Mobile.Core/MediaDeduplicationAndCollision.cs create mode 100644 src/Paca.Mobile.Core/MediaFileNameTemplateEngine.cs create mode 100644 src/Paca.Mobile.Core/MediaIntegrityVerifier.cs create mode 100644 src/Paca.Mobile.Core/MediaPlaybackBypassScript.cs create mode 100644 src/Paca.Mobile.Core/MediaStorageGarbageCollector.cs create mode 100644 src/Paca.Mobile.Core/MediaStreamingTransferEngine.cs create mode 100644 src/Paca.Mobile.Core/MobileAdSlotSystem.cs create mode 100644 src/Paca.Mobile.Core/MobileDesktopParityBrowser.cs create mode 100644 src/Paca.Mobile.Core/MobileDesktopParityDownload.cs create mode 100644 src/Paca.Mobile.Core/MobileMenuModel.cs create mode 100644 src/Paca.Mobile.Core/MobilePrivateBrowsingPolicy.cs create mode 100644 src/Paca.Mobile.Core/MobilePrivateSessionManager.cs create mode 100644 src/Paca.Mobile.Core/MobileProductionFeatures.cs create mode 100644 src/Paca.Mobile.Core/MobileResponsivenessGuards.cs create mode 100644 src/Paca.Mobile.Core/MobileSafeAreaCoordinator.cs create mode 100644 src/Paca.Mobile.Core/MobileScrollCoordinator.cs create mode 100644 src/Paca.Mobile.Core/MobileShareTextExtractor.cs create mode 100644 src/Paca.Mobile.Core/MobileSyncSecurityGuard.cs create mode 100644 src/Paca.Mobile.Core/MobileTextEncodingSanitizer.cs create mode 100644 src/Paca.Mobile.Core/MobileThemeColorParser.cs create mode 100644 src/Paca.Mobile.Core/MobileUserAgentSanitizer.cs create mode 100644 src/Paca.Mobile.Core/NetworkLatencyJitterProber.cs create mode 100644 src/Paca.Mobile.Core/NetworkResilienceSupervisor.cs create mode 100644 src/Paca.Mobile.Core/OfflineLibraryManager.cs create mode 100644 src/Paca.Mobile.Core/OfflineMediaPrefetcher.cs create mode 100644 src/Paca.Mobile.Core/P2pQrPayloadCodec.cs create mode 100644 src/Paca.Mobile.Core/PacaBatchBundle.cs create mode 100644 src/Paca.Mobile.Core/PacaDeepLinkEngine.cs create mode 100644 src/Paca.Mobile.Core/PacaVaultSnapshot.cs create mode 100644 src/Paca.Mobile.Core/PlaybackHistorySyncManager.cs create mode 100644 src/Paca.Mobile.Core/PlaybackSleepTimerEngine.cs create mode 100644 src/Paca.Mobile.Core/PlayerGestureAndPip.cs create mode 100644 src/Paca.Mobile.Core/ProxyAutoConfigEngine.cs create mode 100644 src/Paca.Mobile.Core/ProxyConfigurationManager.cs create mode 100644 src/Paca.Mobile.Core/QuietHoursNotificationManager.cs create mode 100644 src/Paca.Mobile.Core/ReadingListModels.cs create mode 100644 src/Paca.Mobile.Core/RemoteClipboardBridge.cs create mode 100644 src/Paca.Mobile.Core/RemoteTabModels.cs create mode 100644 src/Paca.Mobile.Core/RoamingConnectionManager.cs create mode 100644 src/Paca.Mobile.Core/SmartCategoryClassifier.cs create mode 100644 src/Paca.Mobile.Core/SmartClipboardSniffer.cs create mode 100644 src/Paca.Mobile.Core/SmartCollectionEngine.cs create mode 100644 src/Paca.Mobile.Core/SmartMediaFilterEngine.cs create mode 100644 src/Paca.Mobile.Core/SmartPriorityQueue.cs create mode 100644 src/Paca.Mobile.Core/SmartSilenceSkipperAndWaveform.cs create mode 100644 src/Paca.Mobile.Core/SnifferScript.cs create mode 100644 src/Paca.Mobile.Core/StorageQuotaEvictionPlanner.cs create mode 100644 src/Paca.Mobile.Core/StreamHighlightClipper.cs create mode 100644 src/Paca.Mobile.Core/SubtitleFormatConverter.cs create mode 100644 src/Paca.Mobile.Core/SubtitleSyncDrifter.cs create mode 100644 src/Paca.Mobile.Core/SubtitleSyncEngine.cs create mode 100644 src/Paca.Mobile.Core/ThumbnailScrubberPreview.cs create mode 100644 src/Paca.Mobile.Core/TranscodingPresetEngine.cs create mode 100644 src/Paca.Mobile.Core/WanReachabilityProber.cs create mode 100644 src/Paca.Mobile/AdMobBannerHostView.cs delete mode 100644 src/Paca.Mobile/ApiClient.cs create mode 100644 src/Paca.Mobile/MauiPreferencesStorage.cs create mode 100644 src/Paca.Mobile/MobileAdBannerView.cs create mode 100644 src/Paca.Mobile/MobileAdServices.cs create mode 100644 src/Paca.Mobile/MobileMenuModal.cs create mode 100644 src/Paca.Mobile/Platforms/Android/AdMobBannerHostViewHandler.cs create mode 100644 src/Paca.Mobile/Platforms/Android/AndroidAdMobAdapter.cs create mode 100644 src/Paca.Mobile/Platforms/Android/PacaAndroidStatusBarHelper.cs create mode 100644 src/Paca.Mobile/Platforms/Android/PacaAndroidWebViewCustomizer.cs create mode 100644 src/Paca.Mobile/Resources/Fonts/lucide.ttf create mode 100644 src/Paca.Mobile/Resources/Images/paca_logo.png delete mode 100644 src/Paca.Mobile/SnifferScript.cs create mode 100644 src/Paca.Server/Discovery/LanBeaconResponder.cs create mode 100644 src/Paca.Server/Gateway/GatewayPushModels.cs create mode 100644 src/Paca.Server/Gateway/PacaGatewayDaemon.cs create mode 100644 src/Paca.Server/Gateway/WanGatewayManager.cs rename {VideoDownloader.Server => src/Paca.Server}/MdnsAdvertiser.cs (84%) rename {VideoDownloader.Server => src/Paca.Server}/MediaLibrary.cs (95%) rename VideoDownloader.Server/VideoDownloader.Server.csproj => src/Paca.Server/Paca.Server.csproj (67%) create mode 100644 src/Paca.Server/PacaHeadlessDaemon.cs rename {VideoDownloader.Server => src/Paca.Server}/PositionStore.cs (74%) rename {VideoDownloader.Server => src/Paca.Server}/QueueHub.cs (88%) create mode 100644 src/Paca.Server/ServerHost.cs rename {VideoDownloader.Server => src/Paca.Server}/ServerModels.cs (61%) rename {VideoDownloader.Server => src/Paca.Server}/Thumbnailer.cs (94%) create mode 100644 src/Paca.Server/WebCompanion.cs create mode 100644 tests/Paca.Tests/App/AppDebugScreenshotServiceTests.cs create mode 100644 tests/Paca.Tests/App/ChromeDownloadManagerParityTests.cs create mode 100644 tests/Paca.Tests/App/ChromeTabDiscardingMegaTests.cs create mode 100644 tests/Paca.Tests/App/DesktopDeepLinkGateTests.cs create mode 100644 tests/Paca.Tests/App/DesktopGatewayDaemonCommandLineGateTests.cs create mode 100644 tests/Paca.Tests/App/DesktopMediaSpeedAndDiagnosticsGateTests.cs create mode 100644 tests/Paca.Tests/App/DesktopOmniboxIntegrationGateTests.cs create mode 100644 tests/Paca.Tests/App/DesktopRemoteTabSyncGateTests.cs create mode 100644 tests/Paca.Tests/App/DesktopTrayAndGatewayPushGateTests.cs create mode 100644 tests/Paca.Tests/App/DesktopZenRailAndStatusBarGateTests.cs create mode 100644 tests/Paca.Tests/App/DownloadFolderOpenE2ERedScenarioTests.cs create mode 100644 tests/Paca.Tests/App/DownloadFolderOpenGateTests.cs create mode 100644 tests/Paca.Tests/App/GlobalHotkeyGateTests.cs create mode 100644 tests/Paca.Tests/App/MediaToolsMenuWiringGateTests.cs create mode 100644 tests/Paca.Tests/App/MultiDisplayLayoutEngineGateTests.cs create mode 100644 tests/Paca.Tests/App/QuickActionAdvancedUxAndLocalizationGateTests.cs create mode 100644 tests/Paca.Tests/App/QuickActionGlobalHotkeyAndTrayGateTests.cs create mode 100644 tests/Paca.Tests/App/QuickActionInlineEvaluatorGateTests.cs create mode 100644 tests/Paca.Tests/App/QuickActionLauncherIntegrationGateTests.cs create mode 100644 tests/Paca.Tests/App/QuickActionNextGenUxAndAnimationGateTests.cs create mode 100644 tests/Paca.Tests/App/QuickActionPillModeAndTabSearchTests.cs create mode 100644 tests/Paca.Tests/App/QuickActionRegistryAndCatalogGateTests.cs create mode 100644 tests/Paca.Tests/App/QuickActionSpotlightTwoPhase20Tests.cs create mode 100644 tests/Paca.Tests/App/QuickActionSpotlightUiGateTests.cs create mode 100644 tests/Paca.Tests/App/QuickCaptureHudGateTests.cs create mode 100644 tests/Paca.Tests/App/QuickCaptureHudWindowGateTests.cs create mode 100644 tests/Paca.Tests/App/ScrollBarAndSectionBorderGateTests.cs create mode 100644 tests/Paca.Tests/App/SpotlightDeepIntegrationAndAnimationTests.cs create mode 100644 tests/Paca.Tests/App/SpotlightRecentQueryAndScopeGateTests.cs create mode 100644 tests/Paca.Tests/App/ThumbnailCacheServiceGateTests.cs create mode 100644 tests/Paca.Tests/App/UiUxFiftyPolishAndPrecisionGateTests.cs create mode 100644 tests/Paca.Tests/App/WindowDragAndDoubleClickGateTests.cs create mode 100644 tests/Paca.Tests/App/ZenBrowserSideRailGateTests.cs create mode 100644 tests/Paca.Tests/Browser/AppScenarioPipelineTests.cs create mode 100644 tests/Paca.Tests/Browser/BookmarkPipelineTests.cs create mode 100644 tests/Paca.Tests/Browser/BrowserMenuAndDesignTests.cs create mode 100644 tests/Paca.Tests/Browser/BrowserPrivacyPipelineTests.cs create mode 100644 tests/Paca.Tests/Browser/ChromeAutofillManagerTests.cs create mode 100644 tests/Paca.Tests/Browser/ChromeDownloadShelfSecurityTests.cs create mode 100644 tests/Paca.Tests/Browser/ChromeExtensionCspValidatorTests.cs create mode 100644 tests/Paca.Tests/Browser/ChromeHistoryEngineTests.cs create mode 100644 tests/Paca.Tests/Browser/ChromeIncognitoIsolationTests.cs create mode 100644 tests/Paca.Tests/Browser/ChromeMediaSessionAdvancedTests.cs create mode 100644 tests/Paca.Tests/Browser/ChromeMediaSessionPiPTests.cs create mode 100644 tests/Paca.Tests/Browser/ChromeNewTabPageTests.cs create mode 100644 tests/Paca.Tests/Browser/ChromeOmniboxActionsTests.cs create mode 100644 tests/Paca.Tests/Browser/ChromeOmniboxAutocompleteTests.cs create mode 100644 tests/Paca.Tests/Browser/ChromeOmniboxSiteSearchTests.cs create mode 100644 tests/Paca.Tests/Browser/ChromeOpenSearchAndCustomEngineTests.cs create mode 100644 tests/Paca.Tests/Browser/ChromeParityAdvancedFeaturesTests.cs create mode 100644 tests/Paca.Tests/Browser/ChromeParityDialogsGateTests.cs create mode 100644 tests/Paca.Tests/Browser/ChromeParityLastTabCloseHomeTabGateTests.cs create mode 100644 tests/Paca.Tests/Browser/ChromeParityMilestone10Tests.cs create mode 100644 tests/Paca.Tests/Browser/ChromeParityMilestone11Tests.cs create mode 100644 tests/Paca.Tests/Browser/ChromeParityMilestone12Tests.cs create mode 100644 tests/Paca.Tests/Browser/ChromeParityMilestone13Tests.cs create mode 100644 tests/Paca.Tests/Browser/ChromeParityMilestone14Tests.cs create mode 100644 tests/Paca.Tests/Browser/ChromeParityMilestone15Tests.cs create mode 100644 tests/Paca.Tests/Browser/ChromeParityMilestone16Tests.cs create mode 100644 tests/Paca.Tests/Browser/ChromeParityMilestone17Tests.cs create mode 100644 tests/Paca.Tests/Browser/ChromeParityMilestone18Tests.cs create mode 100644 tests/Paca.Tests/Browser/ChromeParityMilestone32Tests.cs create mode 100644 tests/Paca.Tests/Browser/ChromeParityMilestone5Tests.cs create mode 100644 tests/Paca.Tests/Browser/ChromeParityMilestone6Tests.cs create mode 100644 tests/Paca.Tests/Browser/ChromeParityMilestone7Tests.cs create mode 100644 tests/Paca.Tests/Browser/ChromeParityMilestone8Tests.cs create mode 100644 tests/Paca.Tests/Browser/ChromeParityMilestone9Tests.cs create mode 100644 tests/Paca.Tests/Browser/ChromeParityNavigationAndToolsTests.cs create mode 100644 tests/Paca.Tests/Browser/ChromeParityTabOperationsTests.cs create mode 100644 tests/Paca.Tests/Browser/ChromePwaInstallationManagerTests.cs create mode 100644 tests/Paca.Tests/Browser/ChromeReadingListAdvancedTests.cs create mode 100644 tests/Paca.Tests/Browser/ChromeReadingListSyncTests.cs create mode 100644 tests/Paca.Tests/Browser/ChromeSecurityBadgeEvaluatorTests.cs create mode 100644 tests/Paca.Tests/Browser/ChromeSitePermissionsCoordinatorTests.cs create mode 100644 tests/Paca.Tests/Browser/ChromeSitePermissionsTests.cs create mode 100644 tests/Paca.Tests/Browser/ChromeSiteSecurityEvaluatorTests.cs create mode 100644 tests/Paca.Tests/Browser/ChromeTabDeduplicationTests.cs create mode 100644 tests/Paca.Tests/Browser/ChromeTabDiscardPolicyTests.cs create mode 100644 tests/Paca.Tests/Browser/ChromeTabGroupAdvancedTests.cs create mode 100644 tests/Paca.Tests/Browser/ChromeTabGroupingMegaTests.cs create mode 100644 tests/Paca.Tests/Browser/ChromeTabHoverCardTests.cs create mode 100644 tests/Paca.Tests/Browser/ChromeTaskManagerAdvancedTests.cs create mode 100644 tests/Paca.Tests/Browser/ChromeUserScriptManagerTests.cs create mode 100644 tests/Paca.Tests/Browser/ChromeWebAppManifestTests.cs rename {VideoDownloader.Tests => tests/Paca.Tests}/Browser/CommandPaletteTests.cs (98%) create mode 100644 tests/Paca.Tests/Browser/DeclarativeNetRequestAdversarialTests.cs create mode 100644 tests/Paca.Tests/Browser/DeclarativeNetRequestPriorityTests.cs create mode 100644 tests/Paca.Tests/Browser/DeclarativeNetRequestTrieTests.cs create mode 100644 tests/Paca.Tests/Browser/DeepUserScenarioTests.cs create mode 100644 tests/Paca.Tests/Browser/DesktopAdSlotAndNtpSponsoredGateTests.cs rename {VideoDownloader.Tests => tests/Paca.Tests}/Browser/DesktopRemainderTests.cs (85%) create mode 100644 tests/Paca.Tests/Browser/DownloadActiveStateTests.cs create mode 100644 tests/Paca.Tests/Browser/ExtensionFido2BridgeGateTests.cs create mode 100644 tests/Paca.Tests/Browser/ExtensionSystemPipelineTests.cs rename {VideoDownloader.Tests => tests/Paca.Tests}/Browser/FindSessionTests.cs (79%) create mode 100644 tests/Paca.Tests/Browser/MediaDetectionPipelineTests.cs create mode 100644 tests/Paca.Tests/Browser/PacaUniqueBrowserFeaturesGateTests.cs create mode 100644 tests/Paca.Tests/Browser/PrivateBrowsingExhaustiveGateTests.cs create mode 100644 tests/Paca.Tests/Browser/PrivateBrowsingSessionGateTests.cs create mode 100644 tests/Paca.Tests/Browser/ProfileAndMediaUiIntegrationTests.cs create mode 100644 tests/Paca.Tests/Browser/ProfileManagerTests.cs rename {VideoDownloader.Tests => tests/Paca.Tests}/Browser/SearchEngineResolverTests.cs (93%) create mode 100644 tests/Paca.Tests/Browser/TabManagementPipelineTests.cs create mode 100644 tests/Paca.Tests/Browser/ToolbarCustomizationTests.cs rename {VideoDownloader.Tests => tests/Paca.Tests}/Browser/UiUsecaseHardeningTests.cs (97%) create mode 100644 tests/Paca.Tests/Browser/WebViewMediaAndSessionGateTests.cs create mode 100644 tests/Paca.Tests/BrowserStorageAndSessionHardeningPhase7Tests.cs create mode 100644 tests/Paca.Tests/Core/AdaptiveBufferScalerGateTests.cs create mode 100644 tests/Paca.Tests/Core/AdaptiveStreamingAndIntegrityGateTests.cs create mode 100644 tests/Paca.Tests/Core/AdaptiveStreamingBitrateControllerGateTests.cs create mode 100644 tests/Paca.Tests/Core/AudioAlbumTrackSplitterGateTests.cs create mode 100644 tests/Paca.Tests/Core/AudioChannelDownmixerGateTests.cs create mode 100644 tests/Paca.Tests/Core/AudioDynamicRangeCompressorGateTests.cs create mode 100644 tests/Paca.Tests/Core/AudioEqualizerProfileManagerGateTests.cs create mode 100644 tests/Paca.Tests/Core/AudioPitchShiftEngineGateTests.cs create mode 100644 tests/Paca.Tests/Core/AudioVocalStemExtractorGateTests.cs create mode 100644 tests/Paca.Tests/Core/AudioVolumeNormalizerGateTests.cs create mode 100644 tests/Paca.Tests/Core/BandwidthRateLimiterGateTests.cs create mode 100644 tests/Paca.Tests/Core/BandwidthScheduleProfileGateTests.cs create mode 100644 tests/Paca.Tests/Core/BatteryPowerGovernorGateTests.cs create mode 100644 tests/Paca.Tests/Core/BatterySaverPowerManagerTests.cs create mode 100644 tests/Paca.Tests/Core/BookmarkChapterExporterGateTests.cs create mode 100644 tests/Paca.Tests/Core/ChromeMemorySaverPolicyTests.cs create mode 100644 tests/Paca.Tests/Core/CoreAndServerResilienceGateTests.cs create mode 100644 tests/Paca.Tests/Core/CoreStreamingAndVaultResiliencePhase6Tests.cs create mode 100644 tests/Paca.Tests/Core/DataUsageQuotaTrackerGateTests.cs create mode 100644 tests/Paca.Tests/Core/DirectDownloaderIntegrityGateTests.cs create mode 100644 tests/Paca.Tests/Core/DownloadFolderCleanlinessAndPacaIsolationGateTests.cs create mode 100644 tests/Paca.Tests/Core/DownloadSelfHealingEngineGateTests.cs create mode 100644 tests/Paca.Tests/Core/DownloadTokenBucketRateLimiterGateTests.cs create mode 100644 tests/Paca.Tests/Core/DualSubtitleComposerGateTests.cs create mode 100644 tests/Paca.Tests/Core/DynamicConcurrencyTunerGateTests.cs create mode 100644 tests/Paca.Tests/Core/ExtremeResilienceAndStressGateTests.cs create mode 100644 tests/Paca.Tests/Core/GpuHardwareAccelerationProfilerTests.cs create mode 100644 tests/Paca.Tests/Core/HlsManifestValidatorGateTests.cs create mode 100644 tests/Paca.Tests/Core/MediaBitrateEstimatorGateTests.cs create mode 100644 tests/Paca.Tests/Core/MediaBookmarkAnnotationGateTests.cs create mode 100644 tests/Paca.Tests/Core/MediaChapterAndSubtitleGateTests.cs create mode 100644 tests/Paca.Tests/Core/MediaChecksumVerifierGateTests.cs create mode 100644 tests/Paca.Tests/Core/MediaEnginePipelineTests.cs create mode 100644 tests/Paca.Tests/Core/MediaFileNameTemplateGateTests.cs create mode 100644 tests/Paca.Tests/Core/MediaIntegrityVerifierGateTests.cs create mode 100644 tests/Paca.Tests/Core/MediaMetadataTagWriterGateTests.cs create mode 100644 tests/Paca.Tests/Core/MediaPlaybackSpeedPitchGateTests.cs create mode 100644 tests/Paca.Tests/Core/MediaStorageGarbageCollectorGateTests.cs create mode 100644 tests/Paca.Tests/Core/MediaStreamingTransferGateTests.cs create mode 100644 tests/Paca.Tests/Core/MultiTrackMediaMuxerGateTests.cs create mode 100644 tests/Paca.Tests/Core/NetworkLatencyJitterGateTests.cs create mode 100644 tests/Paca.Tests/Core/NetworkResilienceSupervisorGateTests.cs create mode 100644 tests/Paca.Tests/Core/OfflineMediaPrefetcherGateTests.cs create mode 100644 tests/Paca.Tests/Core/PacaDeepLinkGateTests.cs create mode 100644 tests/Paca.Tests/Core/PacaVaultBackupRestoreGateTests.cs create mode 100644 tests/Paca.Tests/Core/PartialChunkIntegrityCacheGateTests.cs create mode 100644 tests/Paca.Tests/Core/PlaybackHistorySyncManagerGateTests.cs create mode 100644 tests/Paca.Tests/Core/PlaybackSleepTimerEngineGateTests.cs create mode 100644 tests/Paca.Tests/Core/ProxyAutoConfigGateTests.cs create mode 100644 tests/Paca.Tests/Core/ProxyConfigurationManagerGateTests.cs create mode 100644 tests/Paca.Tests/Core/QuietHoursNotificationGateTests.cs create mode 100644 tests/Paca.Tests/Core/RemoteClipboardBridgeGateTests.cs create mode 100644 tests/Paca.Tests/Core/SmartBandwidthSchedulerGateTests.cs create mode 100644 tests/Paca.Tests/Core/SmartCategoryClassifierGateTests.cs create mode 100644 tests/Paca.Tests/Core/SmartCollectionPlaylistGateTests.cs create mode 100644 tests/Paca.Tests/Core/SmartDeduplicationAndCollisionGateTests.cs create mode 100644 tests/Paca.Tests/Core/SmartMediaFilterEngineGateTests.cs create mode 100644 tests/Paca.Tests/Core/SmartMediaNamingAndThumbnailGateTests.cs create mode 100644 tests/Paca.Tests/Core/SmartPriorityQueueGateTests.cs create mode 100644 tests/Paca.Tests/Core/SmartSilenceSkipperAndWaveformGateTests.cs create mode 100644 tests/Paca.Tests/Core/StorageQuotaEvictionPlannerGateTests.cs create mode 100644 tests/Paca.Tests/Core/StreamHighlightClipperGateTests.cs create mode 100644 tests/Paca.Tests/Core/SubtitleBurnInEngineGateTests.cs create mode 100644 tests/Paca.Tests/Core/SubtitleFormatConverterGateTests.cs create mode 100644 tests/Paca.Tests/Core/SubtitleSyncDrifterGateTests.cs create mode 100644 tests/Paca.Tests/Core/SubtitleSyncEngineGateTests.cs create mode 100644 tests/Paca.Tests/Core/ThumbnailScrubberPreviewGateTests.cs create mode 100644 tests/Paca.Tests/Core/TranscodingPresetEngineGateTests.cs create mode 100644 tests/Paca.Tests/Core/VideoAspectAutoCropperGateTests.cs create mode 100644 tests/Paca.Tests/Core/VideoDenoiseEnhancerGateTests.cs create mode 100644 tests/Paca.Tests/Core/VideoFrameRateConverterGateTests.cs create mode 100644 tests/Paca.Tests/Core/VideoIntroOutroTrimmerGateTests.cs create mode 100644 tests/Paca.Tests/Core/VideoPosterExtractorGateTests.cs create mode 100644 tests/Paca.Tests/Core/VideoSpriteSheetGeneratorGateTests.cs create mode 100644 tests/Paca.Tests/Core/VideoTonemapEnhancerGateTests.cs create mode 100644 tests/Paca.Tests/Core/WanReachabilityProberGateTests.cs create mode 100644 tests/Paca.Tests/Core/WorkspaceEncodingSanitizerTests.cs create mode 100644 tests/Paca.Tests/E2E/ComprehensiveE2EScenarioTests.cs create mode 100644 tests/Paca.Tests/E2E/CoreAndServerHardeningPhase3Tests.cs create mode 100644 tests/Paca.Tests/E2E/DesignSystemCommandmentsGateTests.cs create mode 100644 tests/Paca.Tests/E2E/DesignSystemCommandmentsPhase2Tests.cs create mode 100644 tests/Paca.Tests/E2E/DesktopUiAndShortcutHardeningPhase4Tests.cs create mode 100644 tests/Paca.Tests/E2E/GpuAndBatterySettingsGateTests.cs create mode 100644 tests/Paca.Tests/E2E/IconGlyphDesignSystemTests.cs rename {VideoDownloader.Tests => tests/Paca.Tests}/E2E/MainWindowSmokeE2ETests.cs (96%) create mode 100644 tests/Paca.Tests/E2E/ProfileAvatarPresetAndUploadGateTests.cs create mode 100644 tests/Paca.Tests/E2E/UiContractUseCasesMegaPipelineTests.cs create mode 100644 tests/Paca.Tests/E2E/UiFeatureInteractionsPipelineTests.cs rename {VideoDownloader.Tests => tests/Paca.Tests}/E2E/UiUsecaseLiveE2ETests.cs (86%) create mode 100644 tests/Paca.Tests/E2E/VisualDesignGateTests.cs create mode 100644 tests/Paca.Tests/GlobalUsings.cs create mode 100644 tests/Paca.Tests/Infrastructure/AppScenarioPipeline.cs create mode 100644 tests/Paca.Tests/Infrastructure/GrandUnifiedPipeline.cs create mode 100644 tests/Paca.Tests/Infrastructure/MetaTestQualityAndPruningTests.cs create mode 100644 tests/Paca.Tests/Infrastructure/SettingsViewModelTests.cs create mode 100644 tests/Paca.Tests/Infrastructure/SiteSeoAeoGeoGateTests.cs rename {VideoDownloader.Tests => tests/Paca.Tests}/Infrastructure/SourceTree.cs (80%) rename {VideoDownloader.Tests => tests/Paca.Tests}/Infrastructure/StaDispatcher.cs (96%) create mode 100644 tests/Paca.Tests/Infrastructure/SystemResiliencePipelineTests.cs create mode 100644 tests/Paca.Tests/Infrastructure/TestVerificationSystemGateTests.cs create mode 100644 tests/Paca.Tests/Infrastructure/UiContractPipeline.cs create mode 100644 tests/Paca.Tests/Infrastructure/WpfTestApp.cs create mode 100644 tests/Paca.Tests/Mobile/MobileAdMobInterstitialAndRewardedGateTests.cs create mode 100644 tests/Paca.Tests/Mobile/MobileAdMobWaterfallAndRewardGateTests.cs create mode 100644 tests/Paca.Tests/Mobile/MobileAdaptiveTranscodingGateTests.cs create mode 100644 tests/Paca.Tests/Mobile/MobileAndroidModernizationTests.cs create mode 100644 tests/Paca.Tests/Mobile/MobileAndroidSystemBarHarmonyAndAdGateTests.cs create mode 100644 tests/Paca.Tests/Mobile/MobileBatteryGuardAndHapticGateTests.cs create mode 100644 tests/Paca.Tests/Mobile/MobileDeepLinkTargetGateTests.cs create mode 100644 tests/Paca.Tests/Mobile/MobileDesktopParityBrowserGateTests.cs create mode 100644 tests/Paca.Tests/Mobile/MobileDesktopParityDownloadGateTests.cs create mode 100644 tests/Paca.Tests/Mobile/MobileGatewayDaemonAndHandshakeGateTests.cs create mode 100644 tests/Paca.Tests/Mobile/MobileIntuitiveUxGateTests.cs create mode 100644 tests/Paca.Tests/Mobile/MobileLanAutoDiscoveryGateTests.cs create mode 100644 tests/Paca.Tests/Mobile/MobileMediaIntegrityGateTests.cs create mode 100644 tests/Paca.Tests/Mobile/MobileMenuContractGateTests.cs create mode 100644 tests/Paca.Tests/Mobile/MobileOfflineLibraryDashboardGateTests.cs create mode 100644 tests/Paca.Tests/Mobile/MobileOrganicSafeAreaAndScrollGateTests.cs create mode 100644 tests/Paca.Tests/Mobile/MobileP2pAndMediaAdversarialTests.cs create mode 100644 tests/Paca.Tests/Mobile/MobilePacaDropBatchBundleGateTests.cs create mode 100644 tests/Paca.Tests/Mobile/MobilePlayerGestureAndPipGateTests.cs create mode 100644 tests/Paca.Tests/Mobile/MobilePrivateBrowsingGateTests.cs create mode 100644 tests/Paca.Tests/Mobile/MobileProductionFeaturesGateTests.cs create mode 100644 tests/Paca.Tests/Mobile/MobileQrPairingUiGateTests.cs create mode 100644 tests/Paca.Tests/Mobile/MobileResponsivenessAndAnrPreventionGateTests.cs create mode 100644 tests/Paca.Tests/Mobile/MobileShareTextExtractorGateTests.cs create mode 100644 tests/Paca.Tests/Mobile/MobileSmartClipboardSnifferGateTests.cs create mode 100644 tests/Paca.Tests/Mobile/MobileSwissMinimalExcellenceGateTests.cs create mode 100644 tests/Paca.Tests/Mobile/MobileTextEncodingSanitizerGateTests.cs create mode 100644 tests/Paca.Tests/Mobile/MobileWanGatewayRoamingGateTests.cs create mode 100644 tests/Paca.Tests/Mobile/MobileWebVideoPlaybackGateTests.cs create mode 100644 tests/Paca.Tests/Mobile/P2pQrPayloadCodecTests.cs create mode 100644 tests/Paca.Tests/ModernBrowsingMilestone10Phase110Tests.cs create mode 100644 tests/Paca.Tests/ModernBrowsingMilestone11Phase111Tests.cs create mode 100644 tests/Paca.Tests/ModernBrowsingMilestone12Phase112Tests.cs create mode 100644 tests/Paca.Tests/ModernBrowsingMilestone13Phase113Tests.cs create mode 100644 tests/Paca.Tests/ModernBrowsingMilestone14Phase114Tests.cs create mode 100644 tests/Paca.Tests/ModernBrowsingMilestone1Phase101Tests.cs create mode 100644 tests/Paca.Tests/ModernBrowsingMilestone2Phase102Tests.cs create mode 100644 tests/Paca.Tests/ModernBrowsingMilestone3Phase103Tests.cs create mode 100644 tests/Paca.Tests/ModernBrowsingMilestone4Phase104Tests.cs create mode 100644 tests/Paca.Tests/ModernBrowsingMilestone5Phase105Tests.cs create mode 100644 tests/Paca.Tests/ModernBrowsingMilestone6Phase106Tests.cs create mode 100644 tests/Paca.Tests/ModernBrowsingMilestone7Phase107Tests.cs create mode 100644 tests/Paca.Tests/ModernBrowsingMilestone8Phase108Tests.cs create mode 100644 tests/Paca.Tests/ModernBrowsingMilestone9Phase109Tests.cs create mode 100644 tests/Paca.Tests/Paca.Tests.csproj create mode 100644 tests/Paca.Tests/Platform/AvaloniaAndMobileDiscoveryGateTests.cs create mode 100644 tests/Paca.Tests/Platform/AvaloniaShellGateTests.cs create mode 100644 tests/Paca.Tests/Platform/CliPipelineGateTests.cs create mode 100644 tests/Paca.Tests/Platform/CrossPlatformParityHardeningPhase5Tests.cs create mode 100644 tests/Paca.Tests/Platform/PlatformPipelineTests.cs create mode 100644 tests/Paca.Tests/Security/Milestone53TitanMatrixTests.cs create mode 100644 tests/Paca.Tests/Security/SecurityVaultPipelineTests.cs create mode 100644 tests/Paca.Tests/Security/VirtualFido2AdversarialTests.cs create mode 100644 tests/Paca.Tests/Security/VirtualFido2AuthenticatorTests.cs create mode 100644 tests/Paca.Tests/Server/ServerLanBeaconGateTests.cs create mode 100644 tests/Paca.Tests/Server/ServerPasskeyAuthTests.cs create mode 100644 tests/Paca.Tests/Server/ServerPipelineTests.cs create mode 100644 tests/Paca.Tests/Server/ServerSmartPlaylistGateTests.cs create mode 100644 tests/Paca.Tests/Server/WorkspaceRemoteApiTests.cs create mode 100644 tests/Paca.Tests/xunit.runner.json diff --git a/.claude/hooks/session-brief.sh b/.claude/hooks/session-brief.sh deleted file mode 100644 index 6742c44..0000000 --- a/.claude/hooks/session-brief.sh +++ /dev/null @@ -1,56 +0,0 @@ -#!/usr/bin/env bash -# SessionStart 훅 — 폐쇄루프의 "state layer". -# -# 세션 시작 시 저장소의 현재 상태를 요약해 컨텍스트에 넣는다. -# 에이전트가 매번 git status/log 를 따로 물어보지 않아도 지금 상황을 알고 시작한다. -# stdout 이 그대로 컨텍스트로 들어가므로 짧게 유지한다. -set -uo pipefail - -ROOT="${CLAUDE_PROJECT_DIR:-}" -if [ -z "$ROOT" ]; then - ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)" -fi -cd "$ROOT" || exit 0 - -echo "## 저장소 현재 상태 (SessionStart 자동 브리핑)" -echo - -BRANCH=$(git rev-parse --abbrev-ref HEAD 2>/dev/null || echo "?") -echo "- 브랜치: \`$BRANCH\`" - -LAST=$(git log -1 --format='%h %s' 2>/dev/null | cut -c1-110) -echo "- 마지막 커밋: $LAST" - -CHANGED=$(git status --porcelain 2>/dev/null | wc -l | tr -d ' ') -if [ "$CHANGED" = "0" ]; then - echo "- 작업트리: 깨끗함" -else - echo "- 작업트리: 변경 $CHANGED 건" - git status --porcelain 2>/dev/null | head -10 | sed 's/^/ /' - if [ "$CHANGED" -gt 10 ]; then - echo " … 외 $((CHANGED - 10))건" - fi -fi - -# 마지막 검증 이후 소스가 바뀌었는지 (Stop 훅이 쓰는 스탬프와 같은 기준) -STAMP=".claude/.verify-stamp" -NEWEST=$(find ./VideoDownloader.* -type f \ - \( -name '*.cs' -o -name '*.csproj' -o -name '*.xaml' -o -name '*.axaml' \) \ - -not -path '*/bin/*' -not -path '*/obj/*' \ - -printf '%T@\n' 2>/dev/null | sort -rn | head -1) - -if [ -f "$STAMP" ] && [ "$(cat "$STAMP" 2>/dev/null)" = "$NEWEST" ]; then - echo "- 검증: 마지막 \`dotnet test\` 이후 소스 변경 없음 (GREEN 상태)" -else - echo "- 검증: **미검증 변경 있음** — 작업 전에 \`dotnet test VideoDownloader.Tests\` 로 기준선을 확인할 것" -fi - -# 미완료 백로그 -if [ -f docs/BACKLOG.md ]; then - OPEN=$(grep -c '^- \[ \]' docs/BACKLOG.md 2>/dev/null) || OPEN=0 - echo "- 백로그 미완료: ${OPEN}건 (\`docs/BACKLOG.md\`)" -fi - -echo -echo "작업 계약은 \`AGENTS.md\`, 하네스 운영법은 \`docs/HARNESS.md\` 참고." -exit 0 diff --git a/.claude/hooks/verify-on-stop.sh b/.claude/hooks/verify-on-stop.sh deleted file mode 100644 index e4389ba..0000000 --- a/.claude/hooks/verify-on-stop.sh +++ /dev/null @@ -1,71 +0,0 @@ -#!/usr/bin/env bash -# Stop 훅 — 폐쇄루프의 "checker" 층. -# -# 소스(.cs/.csproj/.xaml/.axaml)가 마지막 성공 검증 이후 바뀌었으면 테스트를 돌린다. -# 실패하면 exit 2 로 턴 종료를 막고, 실패 내용을 에이전트에게 돌려준다. -# 변경이 없으면 즉시 통과하므로 대화만 하는 턴은 지연이 없다. -# -# 무한 루프 방지: stop_hook_active 가 true 면(=이미 이 훅 때문에 재개된 상태) 바로 통과. -set -uo pipefail - -INPUT=$(cat) - -# ── 1. 재진입 가드 ──────────────────────────────────────────────────── -if command -v jq >/dev/null 2>&1; then - ACTIVE=$(printf '%s' "$INPUT" | jq -r '.stop_hook_active // false' 2>/dev/null || echo false) -else - case "$INPUT" in - *'"stop_hook_active"'*[Tt]rue*) ACTIVE=true ;; - *) ACTIVE=false ;; - esac -fi -if [ "$ACTIVE" = "true" ]; then - exit 0 -fi - -# ── 2. 프로젝트 루트 ────────────────────────────────────────────────── -ROOT="${CLAUDE_PROJECT_DIR:-}" -if [ -z "$ROOT" ]; then - ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)" -fi -cd "$ROOT" || exit 0 - -STAMP=".claude/.verify-stamp" - -# ── 3. 변경 감지 (소스 최신 수정시각) ───────────────────────────────── -NEWEST=$(find ./VideoDownloader.* -type f \ - \( -name '*.cs' -o -name '*.csproj' -o -name '*.xaml' -o -name '*.axaml' \) \ - -not -path '*/bin/*' -not -path '*/obj/*' \ - -printf '%T@\n' 2>/dev/null | sort -rn | head -1) - -# 소스를 못 찾으면(경로 이상 등) 훅이 개발을 막지 않도록 통과시킨다. -if [ -z "$NEWEST" ]; then - exit 0 -fi - -if [ -f "$STAMP" ] && [ "$(cat "$STAMP" 2>/dev/null)" = "$NEWEST" ]; then - exit 0 -fi - -# ── 4. 검증 ─────────────────────────────────────────────────────────── -LOG=$(mktemp 2>/dev/null || echo "${TMPDIR:-/tmp}/vd-verify.$$") -dotnet test VideoDownloader.Tests/VideoDownloader.Tests.csproj \ - --nologo -v quiet >"$LOG" 2>&1 -CODE=$? - -if [ $CODE -eq 0 ]; then - printf '%s' "$NEWEST" > "$STAMP" - rm -f "$LOG" - exit 0 -fi - -# ── 5. 실패 → 종료 차단 ─────────────────────────────────────────────── -{ - echo "검증 실패: dotnet test 가 통과하지 않았다. 테스트를 GREEN 으로 만들기 전에는 턴을 끝낼 수 없다." - echo "테스트를 삭제하거나 Skip 처리해서 통과시키지 말 것. 근본 원인을 고칠 것." - echo "---- dotnet test 출력 (마지막 60줄) ----" - tail -60 "$LOG" -} >&2 - -rm -f "$LOG" -exit 2 diff --git a/.claude/rules/desktop-wpf.md b/.claude/rules/desktop-wpf.md deleted file mode 100644 index ff91f0a..0000000 --- a/.claude/rules/desktop-wpf.md +++ /dev/null @@ -1,50 +0,0 @@ ---- -paths: - - "VideoDownloader.App/**" - - "VideoDownloader.Browser/**" ---- - -# WPF · WebView2 영역 규칙 - -## UI 스레드 - -- WebView2·엔진 이벤트는 백그라운드 스레드에서 온다. UI 를 만지려면 - `Dispatcher.BeginInvoke` 로 마샬링한다 (`MainWindow.xaml.cs` 전반의 기존 패턴). -- 백그라운드에서 갱신되는 컬렉션은 `BindingOperations.EnableCollectionSynchronization` - 으로 락을 등록한다 (`Core/DownloadManager.cs:58` 참조). 이걸 빼면 랜덤하게 죽는다. - -## dispose 이후 이벤트 - -WebView2 가 dispose 된 뒤에도 이벤트 콜백이 도착한다. 콜백 안에서 `CoreWebView2` 를 만질 때는 -로컬 변수로 받아 null 을 확인하고 try 로 감싼다 — `UpdateNavState`(`MainWindow.xaml.cs:453`)가 -기준 패턴이다. 탭을 닫는 경로를 건드렸다면 이 방어를 반드시 확인한다. - -## 탭 - -- Environment 는 전 탭 공유, WebView2 인스턴스는 탭마다. 이 구조를 바꾸지 않는다. -- 팝업(`NewWindowRequested`)은 deferral 패턴으로 새 탭에 붙인다. 앱 통제를 벗어나게 두지 않는다. - -## 거대 파일 - -`MainWindow.xaml.cs`(86KB) · `MainWindow.xaml`(55KB)은 통째로 읽지 않는다. -Grep 으로 심볼 위치를 찾고 해당 구간만 Read 한다. 분할 리팩터링은 별도 승인 사항이다. - -## 프로세스 실행 - -외부 프로세스는 문자열 인자 연결로 실행하지 않는다. `ProcessStartInfo` 에 인자를 배열로 넘긴다 -(과거 `explorer.exe` 인자 인젝션 취약점이 있었다). - -## 테스트 접근 - -`VideoDownloader.App` 은 `InternalsVisibleTo("VideoDownloader.Tests")` 가 걸려 있다. -테스트를 위해 멤버를 `public` 으로 승격하지 말고 `internal` 로 두면 된다. - -## 아이콘 글리프 (PUA · Segoe Fluent Icons) - -- **암시적(키 없는) TextBlock 스타일에 FontFamily 를 넣지 않는다.** 버튼 ContentPresenter 가 만드는 - 자동 TextBlock 이 IconFont 상속을 잃어 모든 아이콘이 tofu(□)가 된다(2026-08-18 실결함 — 원인 규명에 - 실캡처·픽셀 비교까지 필요했다). UI 폰트 통일은 각 창 루트의 `FontFamily="{DynamicResource UiFont}"` - 상속으로 한다. 코드 생성 창은 `SetResourceReference(FontFamilyProperty, "UiFont")`. -- PUA 글리프는 IconFont 보장 스타일(IconButton·FluentIcon·CaptionButton 계열)이나 명시 - `FontFamily="{DynamicResource IconFont}"` 에서만 쓴다. **한 문자열에 PUA 와 일반 텍스트를 섞지 않는다.** - `Infrastructure/IconGlyphXamlTests` 가 정적으로, `E2E/IconContentFontTests` 가 실창에서 이를 강제한다. diff --git a/.claude/rules/engine-core.md b/.claude/rules/engine-core.md deleted file mode 100644 index 76d4506..0000000 --- a/.claude/rules/engine-core.md +++ /dev/null @@ -1,44 +0,0 @@ ---- -paths: - - "VideoDownloader.Core/**" - - "VideoDownloader.Server/**" ---- - -# 엔진 · 서버 영역 규칙 - -## 플랫폼 중립 - -`Core` 는 `net8.0` 이다. WPF·Windows 전용 API 를 끌어들이지 않는다. -Avalonia/MAUI 가 같은 엔진을 쓰므로 여기 들어간 Windows 의존은 크로스플랫폼 이관을 막는다. -OS별 경로는 `Platform/CorePaths.cs` 를 통한다. - -## 외부 프로세스 (ffmpeg 등) - -`Platform/ProcessModels.cs` 의 실행 헬퍼를 쓴다. 직접 `Process.Start` 를 새로 쓰지 않는다. -그 헬퍼가 보장하는 것들을 우회하면 과거 버그가 재발한다: - -- stdout/stderr **동시 드레인** — 안 읽으면 파이프 버퍼가 차서 ffmpeg 가 hang 한다 -- 취소·실패 시 `Kill(entireProcessTree: true)` — 안 하면 좀비 프로세스가 남는다 -- 인자는 배열 전달 — 문자열 연결 금지 -- exit code ≠ 0 이면 예외 — 조용히 넘어가면 실패가 `.ts` 잔재로만 드러난다 - -## 취소 - -모든 장기 작업은 `CancellationToken` 을 끝까지 전달한다. 중간에 삼키지 않는다. -`Parallel.ForEachAsync` 는 `ParallelOptions.CancellationToken` 에 넣는다 -(`Hls/HlsDownloader.cs:77` 패턴). - -## 동시성 - -세그먼트 병렬도는 `AppConfig.Concurrency`, 동시 다운로드 수는 `MaxConcurrentDownloads`(기본 3)로 -제어한다. 하드코딩된 병렬도를 새로 만들지 않는다 — 소켓 고갈로 이어진다. - -## 데이터 경로 - -사용자 데이터는 `CorePaths` 를 통해서만 접근한다. `VD_DATA_DIR` 환경변수 오버라이드가 -E2E 테스트 격리의 공식 후크이므로, 경로를 직접 조립하면 테스트가 실사용자 폴더를 오염시킨다. - -## 서버 - -`Server` 는 App 안에서 호스팅되는 라이브러리다. 포트 0 이면 빈 포트를 자동 할당한다. -LAN 노출 API 이므로 인증·경로 검증을 우회하는 엔드포인트를 추가하지 않는다. diff --git a/.claude/rules/mobile-maui.md b/.claude/rules/mobile-maui.md deleted file mode 100644 index 94ea4ca..0000000 --- a/.claude/rules/mobile-maui.md +++ /dev/null @@ -1,40 +0,0 @@ ---- -paths: - - "VideoDownloader.Mobile/**" - - "VideoDownloader.Mobile.Core/**" ---- - -# MAUI 모바일 영역 규칙 - -## 로직은 Mobile.Core 로 - -`VideoDownloader.Mobile` 은 `net10.0-android`(macOS 에서는 +`net10.0-ios`)이라 -`VideoDownloader.Tests`(net8.0-windows)가 참조할 수 없다. **테스트 가능한 로직은 -`VideoDownloader.Mobile.Core`(net8.0)에 둔다.** UI 프로젝트에는 화면 결선만 남긴다. - -새 기능을 UI 프로젝트에 통째로 넣으면 검증할 방법이 사라진다. - -## 링커 함정 - -Release/링커 트리밍에서 참조가 정적으로 안 보이는 타입은 통째로 잘려나가고, -**런타임 `FileNotFoundException` 으로만** 드러난다. 빌드는 통과한다. - -실제 사례: 모달 `NavigationPage` 가 크래시 → `Xamarin.AndroidX.LocalBroadcastManager` 를 -csproj 에 명시 참조해 해결. 리플렉션·XAML 로만 참조되는 타입을 쓸 때 이 함정을 의심한다. - -## 플랫폼 분기 - -TFM 조건은 `$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'android'` -형식으로 쓴다(csproj 기존 패턴). Windows 개발머신에는 iOS 워크로드가 없으므로 -iOS TFM 은 macOS 조건부로만 켠다 — 이 조건을 무조건부로 바꾸면 Windows 빌드가 깨진다. - -## 빌드 · 검증 - -```powershell -dotnet build VideoDownloader.Mobile -f net10.0-android -``` - -- MAUI 워크로드가 없으면 실패한다. 없는 환경이면 `Mobile.Core` 만 고치고 - UI 결선은 워크로드가 있는 환경에서 확인하도록 사용자에게 알린다. -- 화면 동작을 바꿨으면 에뮬레이터에 배포해 확인한 내용을 보고에 적는다. - 단위 테스트만으로 "됐다"고 하지 않는다. diff --git a/.claude/rules/tests.md b/.claude/rules/tests.md deleted file mode 100644 index 0d65d0b..0000000 --- a/.claude/rules/tests.md +++ /dev/null @@ -1,44 +0,0 @@ ---- -paths: - - "VideoDownloader.Tests/**" ---- - -# 테스트 영역 규칙 - -## 배치 - -`VideoDownloader.Tests/<영역>/<대상>Tests.cs` — 영역은 -`Browser` · `E2E` · `Infrastructure` · `Mobile` · `Platform` · `Server`. -새 영역을 만들기 전에 기존 영역에 맞는지 먼저 본다. - -## 격리 (필수) - -사용자 데이터 경로를 건드리는 테스트는 `VD_DATA_DIR` 을 임시 디렉터리로 지정하고 -끝나면 `null` 로 되돌린다. `E2E/MainWindowSmokeE2ETests.cs:17` 이 기준 패턴이다. -이걸 빼면 테스트가 실사용자의 설정·세션·프로필을 덮어쓴다. - -## WPF 테스트 - -테스트 프로세스에는 `App.xaml` 리소스가 없다. WPF 요소를 만드는 테스트는 -`Infrastructure/WpfTestApp.Ensure(dispatcher)` 를 먼저 호출해 테마 사전을 로드한다. -직접 `new Application()` 을 만들지 않는다. - -## 금지 - -- 통과시키려고 테스트를 **삭제하거나 `Skip` 처리하지 않는다.** 회귀를 숨기는 것이다. -- 실제 네트워크에 의존하는 단정을 새로 만들지 않는다. 외부 사이트가 바뀌면 무작위로 깨진다. - (`Cli` 의 `--dashparse` 같은 수동 검증 도구는 예외 — 테스트가 아니다.) -- 시간·순서에 의존하는 `Thread.Sleep` 기반 단정을 쓰지 않는다. - -## 알려진 경고 - -이 프로젝트에 남아 있는 경고: CS8602(null 역참조) 몇 건, xUnit1031(블로킹 대기), -xUnit2013(`Assert.Equal` 로 개수 확인). **개수를 늘리지 않는다.** -새 테스트에서는 `Assert.Single`/`Assert.Empty` 와 `async` 대기를 쓴다. - -## 실행 - -```powershell -dotnet test VideoDownloader.Tests # 전체 (~13초) -dotnet test VideoDownloader.Tests --filter "FullyQualifiedName~<이름>" # 단건 -``` diff --git a/.claude/settings.json b/.claude/settings.json deleted file mode 100644 index 0ddc3d0..0000000 --- a/.claude/settings.json +++ /dev/null @@ -1,52 +0,0 @@ -{ - "$schema": "https://json.schemastore.org/claude-code-settings.json", - "hooks": { - "SessionStart": [ - { - "matcher": "startup|resume|clear", - "hooks": [ - { - "type": "command", - "command": "bash", - "args": ["${CLAUDE_PROJECT_DIR}/.claude/hooks/session-brief.sh"], - "timeout": 30, - "statusMessage": "저장소 상태 브리핑…" - } - ] - } - ], - "Stop": [ - { - "hooks": [ - { - "type": "command", - "command": "bash", - "args": ["${CLAUDE_PROJECT_DIR}/.claude/hooks/verify-on-stop.sh"], - "timeout": 420, - "statusMessage": "dotnet test 검증 중…" - } - ] - } - ] - }, - "permissions": { - "allow": [ - "Bash(dotnet build *)", - "Bash(dotnet test *)", - "Bash(dotnet restore *)", - "Bash(dotnet run *)", - "Bash(dotnet format *)", - "Bash(dotnet --*)", - "Bash(git status *)", - "Bash(git diff *)", - "Bash(git log *)", - "Bash(git show *)", - "Bash(git branch *)" - ], - "deny": [ - "Read(.env)", - "Edit(.env)", - "Write(.env)" - ] - } -} diff --git a/.claude/skills/release/SKILL.md b/.claude/skills/release/SKILL.md deleted file mode 100644 index 7df4259..0000000 --- a/.claude/skills/release/SKILL.md +++ /dev/null @@ -1,53 +0,0 @@ ---- -name: release -description: VideoDownloader 배포 절차. Windows 설치자(x64/arm64) 생성과 macOS/Linux 원격 빌드머신 빌드를 수행한다. "배포", "설치자 만들어", "릴리스", "publish" 요청에 사용. ---- - -# 배포 - -배포는 되돌리기 어렵다. **각 단계 전에 사용자 확인을 받는다.** 요청받지 않은 배포를 임의로 하지 않는다. - -## 0. 사전 점검 (필수) - -```powershell -dotnet test VideoDownloader.Tests -git status --short -``` - -- 테스트 실패가 있으면 배포하지 않는다. -- 커밋되지 않은 변경이 있으면 사용자에게 알린다. 원격 빌드는 `git archive HEAD` 로 소스를 보내므로 - **커밋되지 않은 변경은 원격 빌드에 반영되지 않는다.** - -## 1. Windows 설치자 - -```powershell -./build/publish.ps1 -Config Release -Version <버전> -``` - -- 하는 일: `VideoDownloader.App` 을 `win-x64`/`win-arm64` self-contained 로 publish (`publish//`) - → Inno Setup 으로 설치자 컴파일 → `out/MediaBrowser-Setup-.exe` -- 필요: **Inno Setup 6** (`winget install --id JRSoftware.InnoSetup -e`). - 없으면 스크립트가 명시적으로 throw 한다. -- 특정 아키텍처만: `-Archs x64` -- arm64 첫 빌드는 yt-dlp/WebView2 런타임 관련으로 실패할 수 있다. 실패 메시지를 그대로 사용자에게 전달한다. -- 완료 시 스크립트가 산출물 크기를 출력한다. **그 출력을 인용해 보고한다.** - -## 2. macOS / Linux 원격 빌드 - -```bash -bash build/remote/build-remote.sh all # 또는 linux | mac -``` - -- 하는 일: `git archive HEAD` 로 현재 커밋 소스를 빌드머신에 SSH 전송 → - `Cli` + `Avalonia` 를 RID별 self-contained publish → `out/remote//artifacts-.tar.gz` 수집 -- 자격 증명은 `.env` 의 `MAC_OS_HOST`/`LINUX_OS_HOST` 등을 쓴다. - **`.env` 내용을 읽어서 출력하거나 로그에 남기지 않는다.** -- 빌드머신이 절전이면 SSH 가 끊긴다. 재연결 후 재시도한다. -- Avalonia 12.1 은 빌드머신에 .NET 10 SDK 가 있어야 한다. 8만 있으면 CS0103 으로 실패한다. - -## 3. 배포 후 - -- 산출물 경로와 크기를 보고한다. -- `out/`, `publish/` 는 gitignore 대상이다. 커밋하지 않는다. -- 릴리스 배포처(GitHub Releases 등)에 올리는 것은 **별도 승인 사항**이다. 임의로 업로드하지 않는다. -- 배포 체계 전반은 `docs/DEPLOYMENT_PLAN.md` 참고. diff --git a/.claude/skills/tdd/SKILL.md b/.claude/skills/tdd/SKILL.md deleted file mode 100644 index a509952..0000000 --- a/.claude/skills/tdd/SKILL.md +++ /dev/null @@ -1,72 +0,0 @@ ---- -name: tdd -description: VideoDownloader 에서 기능을 추가하거나 버그를 고칠 때 쓰는 RED→GREEN→증거 폐쇄루프 절차. 실패 테스트를 먼저 만들고, 최소 구현으로 통과시키고, 실행 증거까지 남긴다. "기능 추가", "버그 수정", "TDD로", "테스트부터" 같은 작업에 사용. ---- - -# TDD 폐쇄루프 - -이 저장소는 RED→GREEN→증거로 개발해 왔다. 이 순서를 건너뛰지 않는다. - -## 0. 기준선 확보 (건너뛰지 말 것) - -```powershell -dotnet test VideoDownloader.Tests -``` - -지금 몇 개가 통과하는지 **숫자를 기록**한다. 이미 깨져 있다면 그것부터 사용자에게 알린다. -내 변경으로 깨진 것과 원래 깨져 있던 것을 섞지 않기 위해 반드시 먼저 한다. - -## 1. RED — 실패를 먼저 본다 - -고칠 동작을 **재현하는 테스트**를 쓴다. - -- 위치: `VideoDownloader.Tests/<영역>/<대상>Tests.cs` - (영역 = `Browser` · `E2E` · `Infrastructure` · `Mobile` · `Platform` · `Server`) -- 순수 로직이면 `Core`/`Mobile.Core` 쪽으로 밀어 넣어 UI 없이 테스트되게 만든다. - WPF 의존이 꼭 필요하면 `Infrastructure/WpfTestApp.cs` 패턴을 따른다. -- 사용자 데이터 경로를 건드리는 테스트는 `VD_DATA_DIR` 로 격리한다. - -```powershell -dotnet test VideoDownloader.Tests --filter "FullyQualifiedName~<새테스트이름>" -``` - -**실패하는 것을 눈으로 확인한다.** 여기서 통과해 버리면 테스트가 대상을 못 잡고 있는 것이다. -테스트를 고쳐서 진짜 실패하게 만든 다음 진행한다. - -## 2. GREEN — 최소 구현 - -- 테스트를 통과시키는 가장 작은 변경만 한다. 겸사겸사 리팩터링하지 않는다. -- 에러를 삼키지 않는다. 빈 `catch`, 가짜 폴백 금지. 근본 원인을 고친다. -- 거대 파일(`MainWindow.xaml.cs` 86KB)은 Grep 으로 위치를 찾아 필요한 구간만 읽고 고친다. - -```powershell -dotnet test VideoDownloader.Tests -``` - -**전체**가 통과해야 한다. 기준선보다 테스트 수가 줄면 무언가를 지운 것이다 — 되돌린다. - -## 3. 증거 — 테스트로 부족한 것 - -UI·플랫폼 동작을 바꿨다면 테스트 GREEN 만으로는 "된다"는 근거가 아니다. - -| 바꾼 것 | 확인 방법 | -|---|---| -| WPF 화면·상호작용 | `dotnet run --project VideoDownloader.App` 로 실제 창을 띄워 확인 | -| WebView2 감지·쿠키 | 실제 사이트를 열어 미디어가 목록에 잡히는지 확인 | -| 서버 API | 앱 기동 후 해당 엔드포인트 호출 | -| MAUI 화면 | Android 에뮬레이터에 배포해 확인 | -| 다운로드 엔진 | `dotnet run --project VideoDownloader.Cli -- <검증 옵션>` | - -무엇을 어떻게 확인했는지 보고에 쓴다. "확인했습니다"만 쓰지 말고 관측한 내용을 쓴다. - -## 4. 마무리 - -- `docs/BACKLOG.md` 해당 항목 `- [ ]` → `- [x]` -- 계획 대비 구현 상태가 바뀌었으면 `docs/IMPLEMENTATION_AUDIT.md` 갱신 -- 보고에는 **실제 테스트 출력의 숫자**를 인용한다 (예: "164/164 통과"). 기억으로 쓰지 않는다. - -## 막혔을 때 - -- 원인을 모르겠으면 추측으로 코드를 바꾸지 말고, 먼저 재현 범위를 좁히는 테스트를 더 쓴다. -- 그래도 안 되면 무엇을 시도했고 무엇이 관측됐는지 정리해 사용자에게 보고한다. - 통과하지 못한 것을 통과한 것처럼 쓰지 않는다. diff --git a/.claude/skills/verify/SKILL.md b/.claude/skills/verify/SKILL.md deleted file mode 100644 index 7a0daa4..0000000 --- a/.claude/skills/verify/SKILL.md +++ /dev/null @@ -1,78 +0,0 @@ ---- -name: verify -description: VideoDownloader 변경사항이 완료 기준(Definition of Done)을 만족하는지 전수 점검한다. 빌드·테스트·경고·문서 동기화·산출물 오염까지 확인하고 통과/미통과를 판정한다. "다 됐나 확인", "검증해줘", "완료 기준 점검", 작업을 마무리하기 직전에 사용. ---- - -# 완료 검증 - -작업을 "완료"로 보고하기 전에 아래를 순서대로 실행하고, 각 항목의 **실제 출력**을 근거로 판정한다. -하나라도 실패하면 완료가 아니다. 고치거나, 못 고치는 이유를 명시한다. - -## 1. 테스트 - -```powershell -dotnet test VideoDownloader.Tests -``` - -- 실패 0건인가? -- 통과 수가 작업 전보다 줄지 않았는가? (현재 기준선 164) -- 새로 추가한 동작을 실제로 검증하는 테스트가 있는가? 없으면 지금 쓴다. - -## 2. 빌드 · 경고 - -```powershell -dotnet build VideoDownloader.App -``` - -- 오류 0인가? -- **내가 새로 만든 경고가 있는가?** 기존 경고(`MainWindow.xaml.cs`·테스트의 CS8602 몇 건, - xUnit 분석기 경고)는 알려진 것이다. 개수가 늘었으면 내가 늘린 것이다 — 고친다. - -모바일을 건드렸다면 (MAUI 워크로드가 설치돼 있을 때): - -```powershell -dotnet build VideoDownloader.Mobile -f net10.0-android -``` - -## 3. 실행 증거 - -UI·플랫폼 동작을 바꿨는데 실행해 보지 않았다면 여기서 멈추고 실행한다. -`/tdd` 스킬의 "3. 증거" 표를 따른다. 무엇을 관측했는지 기록한다. - -## 4. 저장소 위생 - -```powershell -git status --short -``` - -- 산출물(`out/`, `publish/`, `bin/`, `obj/`)이 변경 목록에 보이는가? → `.gitignore` 가 뚫린 것이다. -- `.env` 가 보이는가? → **즉시 멈추고 사용자에게 알린다.** 실제 자격 증명이 들어 있다. -- 의도하지 않은 파일이 섞였는가? - -```powershell -git diff --stat -``` - -- 변경 규모가 작업 범위와 맞는가? 요청하지 않은 리팩터링이 섞이지 않았는가? - -## 5. 문서 동기화 - -- `docs/BACKLOG.md` — 완료 항목 체크박스 반영했는가? -- `docs/IMPLEMENTATION_AUDIT.md` — 계획 대비 구현 상태가 바뀌었으면 갱신했는가? -- 명령·구조·규약이 바뀌었으면 `AGENTS.md` 와 `README.md` 도 갱신했는가? - -## 6. 판정 보고 - -아래 형식으로 사용자에게 보고한다. **실제 출력에서 숫자를 인용한다.** - -``` -검증 결과 -- 테스트: <통과>/<전체> 통과, 실패 건 -- 빌드: 오류 , 신규 경고 -- 실행 증거: <무엇을 어떻게 확인했는지 / 해당 없음> -- 저장소: 변경 건, 산출물 오염 없음 -- 문서: <갱신한 파일 / 갱신 불필요> -판정: 완료 | 미완료(사유: …) -``` - -미통과 항목을 숨기거나 완곡하게 쓰지 않는다. diff --git a/.cursorrules b/.cursorrules new file mode 100644 index 0000000..0b60d5c --- /dev/null +++ b/.cursorrules @@ -0,0 +1,3 @@ +# Cursor AI Rules +# Single Source of Truth: AGENTS.md (Linux Foundation AAIF Standard) +@AGENTS.md diff --git a/.env.example b/.env.example index 1eba5e4..8550ca5 100644 --- a/.env.example +++ b/.env.example @@ -2,9 +2,11 @@ # 이 파일을 .env 로 복사한 뒤 실제 값을 채운다. .env 는 git 에 커밋되지 않는다(.gitignore). # 값에 따옴표는 붙이지 않는다. -# ── Cloudflare Pages (다운로드 사이트 배포) ────────────────────────── +# ── Cloudflare Pages / DNS (다운로드 사이트 배포 & 도메인 관리) ───────── # https://dash.cloudflare.com/profile/api-tokens → Create Token -# 권한: Account → Cloudflare Pages → Edit (+ Zone → Cache Purge) +# 권한: Account → Cloudflare Pages → Edit +# Zone → DNS → Edit (특정 영역: chanpaca.net) +# (선택) Zone → Cache Purge → Purge CLOUDFLARE_API_TOKEN= CLOUDFLARE_ACCOUNT_ID= CLOUDFLARE_PAGES_PROJECT= @@ -31,9 +33,29 @@ LINUX_OS_PASSWORD= # GITHUB_REPO=owner/videodownloader # ---- Forgejo(git 원격 서버) ---- -# 로컬 네트워크 Git 서버(Synology NAS/Forgejo). git push 자동화에 사용. -# FORGEJO_URL=http://192.168.0.39:3000 +# 로컬/외부 Git 서버(Synology NAS/Forgejo). git push 자동화 및 릴리스 관리에 사용. +# FORGEJO_URL=https://git.chanpaca.net # FORGEJO_USER= # FORGEJO_PASSWORD= # (선택) 개인 액세스 토큰 — 값이 있으면 비밀번호 대신 우선 사용 # FORGEJO_TOKEN= + +# ── Google AdMob / Desktop Ad Units (PACA) ─────────────────────────── +# Google AdMob 앱 ID (PACA Android) +# ADMOB_APP_ID=ca-app-pub-1039714767792854~5680462775 + +# 모바일 Android 하단 배너 (PACA Bottom Banner) +# ADMOB_BANNER_ID=ca-app-pub-1039714767792854/3110491400 + +# 데스크톱 다운로드 패널 배너 (PACA Desktop Banner) +# ADMOB_DESKTOP_BANNER_ID=ca-app-pub-1039714767792854/1521297311 + +# 데스크톱 새 탭 페이지 배너 (PACA Desktop NTP Banner) +# ADMOB_DESKTOP_NTP_BANNER_ID=ca-app-pub-1039714767792854/4387520844 + +# Google 공식 웹/디스플레이 테스트 태그 (Google Publisher Tag / Ad Manager) +# GOOGLE_AD_MANAGER_TEST_SLOT=/6499/example/banner + +# 테스트 광고 강제 활성화 여부 +# ADMOB_FORCE_TEST_ADS=true +# ADMOB_USE_PRODUCTION_ADS=false diff --git a/.forgejo/workflows/release.yml b/.forgejo/workflows/release.yml index 09502a7..3da3095 100644 --- a/.forgejo/workflows/release.yml +++ b/.forgejo/workflows/release.yml @@ -16,7 +16,7 @@ env: DOTNET_CLI_TELEMETRY_OPTOUT: "true" # 릴리스 자산은 공개 배포 저장소로 업로드한다(소스 저장소는 비공개라 익명 다운로드 불가). # draft 상태는 익명에게 보이지 않으므로 QA 후 수동 Publish 흐름은 그대로다. - RELEASE_REPO: "Video-Downloader/releases" + RELEASE_REPO: "Paca/releases" jobs: # ── 관문: 전 플랫폼 빌드 전에 단위+E2E 통과 ── @@ -39,7 +39,7 @@ jobs: - name: 환경 정보 run: dotnet --list-sdks - name: dotnet test - run: dotnet test VideoDownloader.Tests -c Release + run: dotnet test tests/Paca.Tests -c Release # ── Windows 설치자 (x64 / arm64 교차 publish + Inno Setup) ── windows: @@ -74,7 +74,7 @@ jobs: run: ./build/publish.ps1 -Config Release -Version $env:APP_VERSION - name: 릴리스 업로드 env: { RELEASE_TOKEN: "${{ secrets.RELEASE_TOKEN }}" } - run: ./build/ci/upload-release-asset.ps1 -Tag $env:RELTAG -Files out/MediaBrowser-Setup-x64.exe, out/MediaBrowser-Setup-arm64.exe + run: ./build/ci/upload-release-asset.ps1 -Tag $env:RELTAG -Files out/Paca-Setup-x64.exe, out/Paca-Setup-arm64.exe # ── Android APK (키스토어 시크릿 없으면 디버그 서명 APK) ── android: @@ -120,16 +120,16 @@ jobs: } else { Write-Host "ANDROID_KEYSTORE 시크릿 없음 — 디버그 서명 APK 생성" } # RID 는 CLI 전역 속성이 아니라 csproj 게이트(CiPackArm64Only)로 좁힌다 — 전역 -p:RuntimeIdentifiers 는 # 참조 프로젝트(net8.0 Mobile.Core)까지 전파돼 MSB3030 으로 깨진다(2026-08-17 리허설 실증) - dotnet publish VideoDownloader.Mobile -f net10.0-android -c Release ` + dotnet publish src/Paca.Mobile -f net10.0-android -c Release ` -p:AndroidPackageFormat=apk -p:CiPackArm64Only=true @sign -o out/android if ($LASTEXITCODE -ne 0) { throw "publish 실패" } $apk = Get-ChildItem out/android/*-Signed.apk | Select-Object -First 1 if (-not $apk) { $apk = Get-ChildItem out/android/*.apk | Select-Object -First 1 } if (-not $apk) { throw "APK 산출물 없음" } - Copy-Item $apk.FullName "out/MediaBrowser-$env:APP_VERSION-arm64.apk" + Copy-Item $apk.FullName "out/Paca-$env:APP_VERSION-arm64.apk" - name: 릴리스 업로드 env: { RELEASE_TOKEN: "${{ secrets.RELEASE_TOKEN }}" } - run: ./build/ci/upload-release-asset.ps1 -Tag $env:RELTAG -Files "out/MediaBrowser-$env:APP_VERSION-arm64.apk" + run: ./build/ci/upload-release-asset.ps1 -Tag $env:RELTAG -Files "out/Paca-$env:APP_VERSION-arm64.apk" # ── Linux 셸 (tar.gz self-contained — Cli + Avalonia, x64 네이티브 + arm64 교차) ── linux: @@ -161,13 +161,13 @@ jobs: run: | dotnet --list-sdks for rid in linux-x64 linux-arm64; do - dotnet publish VideoDownloader.Cli -c Release -r "$rid" --self-contained -o "out/cli-$rid" - dotnet publish VideoDownloader.Avalonia -c Release -r "$rid" --self-contained -o "out/avalonia-$rid" - tar -C out -czf "out/mediabrowser-$rid.tar.gz" "cli-$rid" "avalonia-$rid" + dotnet publish src/Paca.Cli -c Release -r "$rid" --self-contained -o "out/cli-$rid" + dotnet publish src/Paca.Avalonia -c Release -r "$rid" --self-contained -o "out/avalonia-$rid" + tar -C out -czf "out/Paca-$rid.tar.gz" "cli-$rid" "avalonia-$rid" done - name: 릴리스 업로드 env: { RELEASE_TOKEN: "${{ secrets.RELEASE_TOKEN }}" } - run: ./build/ci/upload-release-asset.sh "$RELTAG" out/mediabrowser-linux-x64.tar.gz out/mediabrowser-linux-arm64.tar.gz + run: ./build/ci/upload-release-asset.sh "$RELTAG" out/Paca-linux-x64.tar.gz out/Paca-linux-arm64.tar.gz # ── macOS 셸 (tar.gz — arm64 네이티브 + x64 교차. 서명·공증은 D4, Apple Developer Program 후) ── macos: @@ -199,10 +199,10 @@ jobs: run: | dotnet --list-sdks for rid in osx-arm64 osx-x64; do - dotnet publish VideoDownloader.Cli -c Release -r "$rid" --self-contained -o "out/cli-$rid" - dotnet publish VideoDownloader.Avalonia -c Release -r "$rid" --self-contained -o "out/avalonia-$rid" - tar -C out -czf "out/mediabrowser-$rid.tar.gz" "cli-$rid" "avalonia-$rid" + dotnet publish src/Paca.Cli -c Release -r "$rid" --self-contained -o "out/cli-$rid" + dotnet publish src/Paca.Avalonia -c Release -r "$rid" --self-contained -o "out/avalonia-$rid" + tar -C out -czf "out/Paca-$rid.tar.gz" "cli-$rid" "avalonia-$rid" done - name: 릴리스 업로드 env: { RELEASE_TOKEN: "${{ secrets.RELEASE_TOKEN }}" } - run: ./build/ci/upload-release-asset.sh "$RELTAG" out/mediabrowser-osx-arm64.tar.gz out/mediabrowser-osx-x64.tar.gz + run: ./build/ci/upload-release-asset.sh "$RELTAG" out/Paca-osx-arm64.tar.gz out/Paca-osx-x64.tar.gz diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 3a67cd0..0f06560 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -24,7 +24,7 @@ jobs: 8.0.x 10.0.x - name: dotnet test - run: dotnet test VideoDownloader.Tests -c Release + run: dotnet test tests/Paca.Tests -c Release # ── Windows 설치자 (x64 / arm64 교차 publish + Inno Setup) ── windows: @@ -52,7 +52,7 @@ jobs: - uses: actions/upload-artifact@v4 with: name: win-${{ matrix.arch }} - path: out/MediaBrowser-Setup-${{ matrix.arch }}.exe + path: out/Paca-Setup-${{ matrix.arch }}.exe # ── Linux 셸 (tar.gz self-contained — Avalonia + Cli) ── linux: @@ -72,13 +72,13 @@ jobs: 10.0.x - name: publish (Cli + Avalonia) run: | - dotnet publish VideoDownloader.Cli -c Release -r ${{ matrix.rid }} --self-contained -o out/cli-${{ matrix.rid }} - dotnet publish VideoDownloader.Avalonia -c Release -r ${{ matrix.rid }} --self-contained -o out/avalonia-${{ matrix.rid }} - tar -C out -czf out/mediabrowser-${{ matrix.rid }}.tar.gz cli-${{ matrix.rid }} avalonia-${{ matrix.rid }} + dotnet publish src/Paca.Cli -c Release -r ${{ matrix.rid }} --self-contained -o out/cli-${{ matrix.rid }} + dotnet publish src/Paca.Avalonia -c Release -r ${{ matrix.rid }} --self-contained -o out/avalonia-${{ matrix.rid }} + tar -C out -czf out/Paca-${{ matrix.rid }}.tar.gz cli-${{ matrix.rid }} avalonia-${{ matrix.rid }} - uses: actions/upload-artifact@v4 with: name: ${{ matrix.rid }} - path: out/mediabrowser-${{ matrix.rid }}.tar.gz + path: out/Paca-${{ matrix.rid }}.tar.gz # ── macOS 셸 (tar.gz — D4 서명·공증은 Developer ID 시크릿 등록 후 확장) ── macos: @@ -98,14 +98,14 @@ jobs: 10.0.x - name: publish (Cli + Avalonia) run: | - dotnet publish VideoDownloader.Cli -c Release -r ${{ matrix.rid }} --self-contained -o out/cli-${{ matrix.rid }} - dotnet publish VideoDownloader.Avalonia -c Release -r ${{ matrix.rid }} --self-contained -o out/avalonia-${{ matrix.rid }} - tar -C out -czf out/mediabrowser-${{ matrix.rid }}.tar.gz cli-${{ matrix.rid }} avalonia-${{ matrix.rid }} + dotnet publish src/Paca.Cli -c Release -r ${{ matrix.rid }} --self-contained -o out/cli-${{ matrix.rid }} + dotnet publish src/Paca.Avalonia -c Release -r ${{ matrix.rid }} --self-contained -o out/avalonia-${{ matrix.rid }} + tar -C out -czf out/Paca-${{ matrix.rid }}.tar.gz cli-${{ matrix.rid }} avalonia-${{ matrix.rid }} # D4: MACOS_P12/KEYCHAIN_PASS/NOTARY_PROFILE 시크릿 등록 시 codesign+notarytool+DMG 스텝 추가 - uses: actions/upload-artifact@v4 with: name: ${{ matrix.rid }} - path: out/mediabrowser-${{ matrix.rid }}.tar.gz + path: out/Paca-${{ matrix.rid }}.tar.gz # ── Android APK (D2 — 서명 키스토어 시크릿 없으면 미서명 APK) ── android: @@ -137,7 +137,7 @@ jobs: else echo "::notice::ANDROID_KEYSTORE 시크릿 없음 — 미서명 APK 생성" fi - dotnet publish VideoDownloader.Mobile -f net10.0-android -c Release \ + dotnet publish src/Paca.Mobile -f net10.0-android -c Release \ -p:AndroidPackageFormat=apk -p:RuntimeIdentifiers=android-arm64 $SIGN_ARGS \ -o out/android - uses: actions/upload-artifact@v4 @@ -160,7 +160,7 @@ jobs: run: dotnet workload install maui-ios - name: publish ipa (배포 인증서/프로비저닝 시크릿 필요) run: | - dotnet publish VideoDownloader.Mobile -f net10.0-ios -c Release \ + dotnet publish src/Paca.Mobile -f net10.0-ios -c Release \ -p:ArchiveOnBuild=true -p:CodesignKey="${{ secrets.IOS_SIGNING_KEY }}" \ -p:CodesignProvision="${{ secrets.IOS_PROVISION }}" -o out/ios - uses: actions/upload-artifact@v4 diff --git a/.gitignore b/.gitignore index fe8d4bf..a81a5ba 100644 --- a/.gitignore +++ b/.gitignore @@ -75,19 +75,39 @@ packages/ !.vscode/launch.json !.vscode/tasks.json -# ── Claude Code (프로젝트 공용 설정은 추적, 로컬/생성물만 제외) ── -# settings.json · hooks/ · rules/ · skills/ 는 팀 공유 자산이므로 커밋한다. docs/HARNESS.md 참고. -.claude/settings.local.json -.claude/.verify-stamp +# ── AI 어시스턴트 & 로컬 메타데이터 ──────────────────────────────── +.claude/ +.cursor/ CLAUDE.local.md +.gemini/ +agy-gui-launch.log +launch.ps1 -# ── OS (macOS · Linux 원격 빌드머신 포함) ─────────────────────────── +# ── OS 및 임시/백업 파일 (macOS · Linux 원격 빌드머신 포함) ─────────── .DS_Store ._* Thumbs.db desktop.ini +*.tmp +*.bak +*~ +*.swp +*.swo +*.pid +crash.dmp -# ── 배포 사이트 산출물 (deploy-site 가 배포 시점에 생성) ───────────── +# ── 배포 사이트 산출물 & 스크래치 파일 ──────────────────────────── site/releases.json .playwright-mcp/ .wrangler/ +icon-candidates.html +site/icon-candidates.html +site/assets/icon_candidates/ +scratch/ +scratch_* +mobile_*.png +paca_live*.png +disp*.png +current_*.png +anr_temp.txt +.design-ref/ diff --git a/AGENTS.md b/AGENTS.md index b2136af..5fb4a63 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -1,90 +1,115 @@ -# AGENTS.md — VideoDownloader 에이전트 작업 계약 +# AGENTS.md — Paca 에이전트 작업 계약 (SSOT) -이 파일은 도구 중립 표준(AGENTS.md)이다. Claude Code · Codex · Cursor 등 어떤 코딩 에이전트든 -작업 시작 시 이 파일을 읽고, 여기 적힌 명령·규약·완료 기준을 따른다. -Claude Code 는 `CLAUDE.md` 가 이 파일을 `@AGENTS.md` 로 임포트해 함께 읽는다. +> 모든 AI 코딩 에이전트(AGY, Claude Code, DeepSeek, Cursor 등) 공용 표준 계약. +> Claude Code는 `CLAUDE.md`의 `@AGENTS.md`, Cursor는 `.cursorrules`로 본 파일을 참조한다. +> 이론적 토대 및 상세 표준: `docs/TDD_THEORY_SSOT.md` (Paca TDD & 디자인 감사 SSOT). -## 1. 프로젝트 개요 +--- -브라우저 내장 데스크톱 영상 다운로더 + 모바일 컴패니언. 앱 내 브라우저가 재생 중인 미디어 -(HLS/DASH/MP4)를 감지 → 쿠키·Referer 를 물려받아 다운로드 → 내장 서버로 휴대폰에 스트리밍/전송. +## 0. TDD 절대주의 헌법 (The Supreme Law of TDD) -| 프로젝트 | TFM | 역할 | -|---|---|---| -| `VideoDownloader.Core` | net8.0 | 다운로드 엔진 (HLS/DASH 파싱, AES-128, 병렬·이어받기, 감지, ffmpeg 리먹스) | -| `VideoDownloader.Browser` | net8.0-windows | WebView2 탭 컴포넌트 | -| `VideoDownloader.App` | net8.0-windows | 메인 WPF 앱 (브라우저 + 다운로드 UI + 서버 호스팅) | -| `VideoDownloader.Server` | net8.0 | ASP.NET 라이브러리. App 안에서 기동, 모바일/웹에 API 제공 | -| `VideoDownloader.Mobile` | net10.0-android (+ios on macOS) | MAUI 컴패니언 | -| `VideoDownloader.Mobile.Core` | net8.0 | 모바일 공용 로직 (UI 없이 테스트 가능하게 분리) | -| `VideoDownloader.Avalonia` | net8.0 | macOS/Linux 셸 (진행 중) | -| `VideoDownloader.Cli` | net8.0 | 엔진 검증용 개발 도구 | -| `VideoDownloader.Tests` | net8.0-windows | xUnit. Mobile 을 제외한 전 영역 + E2E | +1. **테스트 없는 코드는 존재하지 않는다 (No Production Code Without RED)**: + - 실패하는 자동화 테스트(RED)가 존재하지 않는 한, 단 한 줄의 프로덕션 코드도 추가하거나 수정할 수 없다. + - Robert C. Martin의 TDD 3대 법칙(Three Laws)을 엄수한다: 실패를 증명할 최소 테스트 작성 → 컴파일 에러를 포함한 실패 확인 → 오직 통과만을 위한 최소 구현. +2. **기계적 검증 없는 디자인은 결함이다 (Strict Design Audit in RED)**: + - 모든 UI/UX 요소는 눈대중이 아닌 기계적 테스트 게이트(`VisualDesignGateTests`, `IconGlyphDesignSystemTests`, `UiContractUseCasesMegaPipelineTests`)로 사전에 RED화되고 검증되어야 한다. +3. **RED 체계의 수명주기 관리 (Pruning & Scenario Evolution)**: + - 무의미한 RED 남발(Red Inflation)을 금지한다. + - 사소한 단편 단정문은 과감히 추리거나, 실제 사용자 행동(입력창 타이핑, 버튼 클릭, 옵션 변경, 진행률 표시)이 결합된 **복합 시나리오(End-to-End User Journey)**로 통폐합한다. -## 2. 명령 (이 명령들이 진실이다 — 추측하지 말 것) +--- + +## 1. 아키텍처 매핑 (Pitchfork Layout: `src/` + `tests/`) + +| 프로젝트 | TFM | 위치 | 역할 | +|---|---|---|---| +| `Paca.Core` | net8.0 | `src/Paca.Core` | 다운로드 엔진 (HLS/DASH, AES-128, 병렬/이어받기, ffmpeg) | +| `Paca.Browser` | net8.0-windows | `src/Paca.Browser` | WebView2 탭 컴포넌트, 브라우저 확장 프로그램 가로채기 | +| `Paca.App` | net8.0-windows | `src/Paca.App` | 메인 WPF 데스크톱 앱 (UI + 서버 호스팅, 반응형 테마) | +| `Paca.Server` | net8.0 | `src/Paca.Server` | 내장 ASP.NET Core API 서버 | +| `Paca.Mobile` / `.Mobile.Core` | net10.0-android / net8.0;net10.0 | `src/Paca.Mobile` / `src/Paca.Mobile.Core` | MAUI 컴패니언 앱 및 공용 로직 | +| `Paca.Avalonia` | net8.0 | `src/Paca.Avalonia` | macOS/Linux 셸 | +| `Paca.Cli` | net8.0 | `src/Paca.Cli` | CLI 도구 | +| `Paca.Tests` | net8.0-windows | `tests/Paca.Tests` | xUnit 전체 테스트 (1,886+ 건 전수 무결성) | + +--- + +## 2. 핵심 실행 명령 ```powershell -dotnet test VideoDownloader.Tests # 전체 검증. 증분 ~13초, 현재 180/180 통과 -dotnet build VideoDownloader.App # 데스크톱 빌드 -dotnet run --project VideoDownloader.App # 데스크톱 실행 -dotnet build VideoDownloader.Mobile -f net10.0-android # 모바일 (MAUI 워크로드 필요) -./build/publish.ps1 -Config Release -Version 1.0.0 # Windows 설치자 → out/ -bash build/remote/build-remote.sh all # macOS/Linux 원격 빌드 → out/remote/ +dotnet test tests/Paca.Tests # 전체 검증 (1,886건 전수 PASS) +dotnet test tests/Paca.Tests --filter "FullyQualifiedName~<이름>" # 단건 검증 +dotnet build src/Paca.App # 데스크톱 빌드 +# GUI 앱 실행 (WMI 세션 분리 — 세션 종료 후 창 유지 필수) +Stop-Process -Name 'Paca' -Force -ErrorAction SilentlyContinue +powershell -NoProfile -Command "Start-Process powershell -ArgumentList '-NoProfile','-WindowStyle','Hidden','-ExecutionPolicy','Bypass','-File','C:\Users\encep\.gemini\agy-gui-launch.ps1','-ExePath','D:\workspace\videodownloader\src\Paca.App\bin\Debug\net8.0-windows\win-x64\Paca.exe','-ProcessName','Paca'" +Start-Sleep -Seconds 120 +Get-Content C:\Users\encep\.gemini\agy-gui-launch.log -Tail 3 ``` -- 솔루션 전체 빌드(`dotnet build VideoDownloader.slnx`)는 MAUI 워크로드가 있어야 통과한다. - 워크로드 없이 작업할 땐 프로젝트를 개별 지정한다. -- 단위 테스트 하나만: `dotnet test VideoDownloader.Tests --filter "FullyQualifiedName~HlsMuxerWiring"` -- 환경: Windows 11 · .NET 8/10 SDK 공존 · ffmpeg PATH 필요 · 셸은 PowerShell 7 (Git Bash 도 사용 가능) +--- -## 3. 작업 방식 — TDD 폐쇄루프 +## 3. 안드레 카파시 4대 원칙 (Karpathy Principles) -이 저장소는 **RED → GREEN → 증거** 사이클로 개발해 왔다. 이 순서를 지킨다. +1. **Think Before Coding**: 모호하면 추측 금지. 코드 위치를 확인하고, 3개 이상 파일 수정 시 플랜 수립. +2. **Simplicity First**: 오버엔지니어링 금지. RED를 GREEN으로 바꾸는 최소한의 코드만 작성. +3. **Surgical Changes**: 요청 외 주변 코드·주석·공백 무단 수정 금지. 폭발 반경(Blast Radius) 최소화. +4. **Goal-Driven Closed Loop**: "다 됐다" 선언 금지. 기계적 검증(Exit 0) 통과 전까지 자율 루프 유지. -1. **RED**: 변경 전에 실패하는 테스트를 먼저 쓴다. 실패를 눈으로 확인한다. -2. **GREEN**: 최소 구현으로 통과시킨다. `dotnet test` 전체가 통과해야 한다. -3. **증거**: UI·플랫폼 동작을 바꿨다면 테스트만으로 부족하다. 실제 앱 실행/에뮬레이터/스크린샷으로 - 확인하고, 무엇을 어떻게 확인했는지 보고에 적는다. -4. **문서 동기화**: 계획 대비 구현 상태는 `docs/IMPLEMENTATION_AUDIT.md`, 작업 항목은 - `docs/BACKLOG.md` 체크박스에 반영한다. +--- -## 4. 완료 기준 (Definition of Done) +## 4. 저가형 모델(Flash/DeepSeek/Lite) 하네스 수칙 -아래를 모두 만족하기 전에는 "완료"라고 보고하지 않는다. +- **Token Diet**: 80KB+ 대용량 파일 전체 읽기 금지. `grep_search`로 위치 확인 후 라인 슬라이스(`view_file`). +- **Anti-Cheating Guard**: 테스트 삭제, `[Fact(Skip="...")]`, 빈 `catch { }` 엄격 금지 (위반 시 즉시 실패). +- **Error Hill-Climbing**: 컴파일 에러(`CSxxxx`) 및 단정 실패 diff의 파일:라인을 1~2턴 내 정밀 타격. +- **Subagent Hierarchy**: 넓은 범위 탐색/조사는 초경량 서브에이전트(`invoke_subagent`)로 격리. -- [ ] `dotnet test VideoDownloader.Tests` — **실패 0건**. 테스트 수는 줄지 않는다(180 이상). -- [ ] 빌드 **오류 0**. 새로 만든 경고를 남기지 않는다. - (기존 경고: `MainWindow.xaml.cs`·테스트의 CS8602 몇 건, xUnit 분석기 경고 — 늘리지 말 것) -- [ ] 동작을 바꿨으면 그 동작을 검증하는 테스트가 있다. -- [ ] UI/플랫폼 변경이면 실행 증거가 있다. -- [ ] 관련 문서(`docs/`)를 갱신했다. +--- -실패한 것을 통과한 것처럼 보고하지 않는다. 막혔으면 막혔다고 쓴다. +## 5. TDD 폐쇄 루프 & 초고강도 디자인 감사 완료 기준 (DoD) -## 5. 코드 규약 +### 5.1 25대 디자인/인터랙션/접근성 감사 게이트 (Strict Design & Interaction Gate) +1. **중앙 정렬 및 시각적 치우침 방지**: 헤더, 툴바, 팝업의 중앙 정렬 요소 오차 0px. +2. **컨테이너 오버플로우 방지**: 가로 스크롤 버그(`scrollWidth > clientWidth`) 금지, `TextTrimming="CharacterEllipsis"` 강제. +3. **WCAG 2.1/2.2 AA/AAA & APCA 지각 대비**: 텍스트-배경 대비 AA 4.5:1, 고대비 AAA 7.0:1, APCA Lc 60+ 엄수. +4. **인풋 필드 규격 및 내부 패딩**: 텍스트 박스 패딩 `Padding="8,6"` 이상, 최소 높이 36px~44px 유지. +5. **아이콘-텍스트 수직 정렬**: `VerticalAlignment="Center"` 및 폰트 베이스라인 정합성 100% 일치. +6. **타이포그래피 계층구조**: H1(24~32px) → H2(18~22px) → Body(13~15px) → Caption(11~12px) 토큰 일치. +7. **Flexbox / Grid 레이아웃 왜곡 방지**: 컬럼 비율 깨짐 및 0픽셀 축소 방지. +8. **클릭 타깃 최소 면적**: 기본 인터랙션 요소 최소 32x32px 이상 확보. +9. **디자인 철학 일치**: Designpaca / Swiss Typography / Modern Minimalist 토큰 일치. +10. **모달 오버레이 무결성**: 딤 오버레이 및 포커스 트랩 보장. +11. **WCAG 2.2 타깃 크기 (SC 2.5.8/2.5.5)**: 24x24px 최소 타깃 엄수 및 간격 원 중첩 방지, 중요 액션 44x44px 준수. +12. **WCAG 2.2 포커스 시인성 (SC 2.4.11/2.4.13)**: 포커스 링 최소 2px 둘레 및 3:1 대비비, 가림(Obscured) 방지. +13. **다크모드 광륜/난시 생리학적 보호**: 완전 검정(#000000) 위 순백(#FFFFFF) 직접 배치 금지, 표면 표고 및 오프화이트(#E2E8F0) 강제. +14. **스위스 8pt/4pt 그리드 불변식**: 마진/패딩/간격 4px 단위 배수 엄수 (7px/9px 등 분수/홀수 픽셀 금지). +15. **마이크로 타이포그래피 안티지터**: 속도/시간/카운터 실시간 갱신 요소 OpenType `Typography.NumeralAlignment="Tabular"`(`tnum`) 강제. +16. **피츠의 법칙 (Fitts's Law) 가장자리 무한 타깃**: 창 캡션 단추 모서리 밀착(마진 0), 주 액션 CTA 타깃 면적 최적화. +17. **힉-하이먼 & 밀러의 법칙 인지 밀도**: 툴바 단일 계층 버튼 $7 \pm 2$개 제한, 서랍(Drawer) 위계화 및 3단 카드 청크 분할. +18. **WCAG 2.2 드래그 대안 (SC 2.5.7)**: 드래그 탭/큐 이동에 대한 단일 클릭 컨텍스트 메뉴 및 키보드 단축키 대안 보증. +19. **WCAG 2.2 중복 입력 방지 (SC 3.3.7)**: 히스토리 피커, 클립보드 자동 인식, DPAPI CredentialVault 자동 채움 지원. +20. **Microsoft UIA FastPass 스크린 리더 계약**: 모든 인터랙티브 컨트롤 `AutomationProperties.Name` 매핑 및 장식 요소 배제. +21. **윈도우 고대비 모드(WHCM / Forced Colors) WCAG AAA 7.0:1**: 시맨틱 브러시 7.0:1 초고대비 보증. +22. **전정기관 보호 움직임 감소(Reduced Motion SC 2.3.3)**: 애니메이션 지속시간 상한(<=300ms) 및 무한 모션 배제. +23. **포커스 비가림(Focus Not Obscured SC 2.4.11/2.4.12)**: 스크롤 및 고정 요소에 의한 포커스 요소 가림 원천 차단. +24. **모달 포커스 트랩 및 Esc 안전 복원**: 팝업/모달 포커스 순환 및 원래 호출 트리거로 포커스 복원. +25. **게슈탈트 근접성 및 최적 행폭(CPL 50~75) 독서 인체공학**: 안구 피로 방지 MaxWidth 제약 및 여백 기반 시각 청킹. -- **C#**: file-scoped namespace, 4스페이스, Allman 중괄호, `_camelCase` private 필드, nullable enable. - 세부는 `.editorconfig` 가 강제한다. 공통 빌드 속성은 `Directory.Build.props`. -- **주석·커밋 메시지·문서는 한국어.** 기존 코드가 한국어 주석이므로 섞지 않는다. -- **테스트**: xUnit. 파일은 `VideoDownloader.Tests/<영역>/<대상>Tests.cs`. - 영역 = `Browser` · `E2E` · `Infrastructure` · `Mobile` · `Platform` · `Server`. -- 에러를 삼키지 않는다. 근본 원인을 고친다. 빈 `catch`, 가짜 폴백 데이터 금지. +### 5.2 자율 완료 체크리스트 (Definition of Done) +- [ ] `dotnet test tests/Paca.Tests` 실패 0건, 건너뜀 0건 (1,886 전수 통과) +- [ ] 빌드 에러 0건, 신규 컴파일러 경고 0건 +- [ ] 초고강도 디자인 감사 게이트(`VisualDesignGateTests`) 100% 통과 +- [ ] WMI 분리 런처 기반 GUI 실창 렌더링 검증 완료 (`MainWindowHandle != 0`) +- [ ] 문서 동기화 완료 (`docs/TDD_THEORY_SSOT.md`, `docs/IMPLEMENTATION_AUDIT.md`, `docs/BACKLOG.md`) -## 6. 경계 — 하지 말 것 +--- -- `.env` 를 커밋하거나 그 값을 출력·로그·문서에 남기지 않는다. 실제 Cloudflare 토큰과 - 빌드머신 SSH 비밀번호가 들어 있다. 템플릿은 `.env.example` 만 추적한다. -- `out/`, `publish/`, `bin/`, `obj/` 는 산출물이다. 커밋하지 않고, 내용을 소스로 참조하지 않는다. -- `VideoDownloader.App/Assets/*.min.js`(hls/dash/readability)는 서드파티 번들이다. 수정 금지. -- 사용자가 요청하지 않은 커밋·푸시·배포를 하지 않는다. -- 대규모 리팩터링을 임의로 시작하지 않는다. `MainWindow.xaml.cs` 는 86KB 로 비대하지만, - 분할은 별도 승인 후 진행한다. +## 6. 절대 금기 (Boundaries) -## 7. 알아둘 함정 - -- **WebView2**: 탭마다 인스턴스, Environment 는 공유. dispose 순서를 어기면 UI 스레드에서 죽는다. -- **MAUI**: 링커가 안 싣는 타입은 런타임 `FileNotFoundException` 으로만 드러난다 - (실제 사례: 모달 NavigationPage → `Xamarin.AndroidX.LocalBroadcastManager` 명시 참조로 해결). -- **ffmpeg**: stderr 를 읽지 않으면 파이프 버퍼가 차서 hang 한다. 취소 시 `Kill(entireProcessTree)`. -- **Avalonia 12.1** 은 .NET 10 SDK 를 요구한다. 8만 있으면 CS0103 으로 실패한다. -- 테스트는 `VD_DATA_DIR` 로 사용자 데이터 경로를 격리한다. 실제 사용자 폴더를 건드리지 않는다. +- `.env` 커밋/노출 절대 금지 (Cloudflare 토큰, SSH 암호 보호). +- `Paca.App/Assets/*.min.js` 서드파티 번들 수정 금지. +- 사용자 승인 없는 임의 커밋/푸시/배포 금지. +- WebView2: dispose 후 이벤트 콜백 방어 (`null` 체크 + `try`). +- 외부 프로세스: `ProcessModels.cs` 헬퍼 필수 (stderr 동시 드레인 + 전체 프로세스 트리 킬). +- 테스트 격리: 사용자 경로 접근 시 `VD_DATA_DIR` 환경변수 필수. 외부 제3자 서비스 장애에 깨지지 않도록 테스트 더블/오프라인 피스처 방어 구축. diff --git a/CLAUDE.md b/CLAUDE.md index 9ccf6c0..a89bcf3 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -1,38 +1,25 @@ @AGENTS.md -# Claude Code 전용 지침 +# Claude Code 전용 바인딩 -위 계약(AGENTS.md)이 기본이다. 아래는 이 저장소에서 Claude Code 가 쓰는 하네스 설명이다. -전체 설계와 운영법은 `docs/HARNESS.md` 에 있다. +`AGENTS.md`가 진실의 원천(SSOT)이다. 아래는 Claude Code 전용 훅 및 스킬 바인딩이다. -## 자동으로 도는 검증 (내가 끌 수 없는 층) +## 1. 자동 검증 훅 -- **Stop 훅** — 턴을 끝내려 할 때 소스가 바뀌었으면 `dotnet test` 를 돌린다. - 실패하면 종료가 차단되고 실패 내용이 돌아온다. **테스트를 깨둔 채로 턴을 끝낼 수 없다.** - 차단되면 변명하지 말고 고친다. 고칠 수 없으면 왜 못 고치는지 사용자에게 보고한다. -- **SessionStart 훅** — 세션 시작 시 브랜치·변경 파일·마지막 검증 상태를 컨텍스트에 넣는다. - 이 브리핑을 먼저 읽고 지금 저장소가 어떤 상태인지 파악한 뒤 움직인다. +- **Stop 훅**: 턴 종료 시 소스 변경 감지 → `dotnet test` 자동 실행. 실패 시 종료 차단 (`exit 2`). +- **SessionStart 훅**: 브랜치, 변경 파일, 백로그 상태 자동 브리핑. -훅 때문에 작업이 막히면 훅을 우회하거나 무력화하지 않는다. 원인을 고친다. +## 2. 절차 스킬 (On-Demand) -## 스킬 — 절차는 여기 있다 - -| 스킬 | 언제 | +| 스킬 | 사용 시점 | |---|---| -| `/tdd` | 기능 추가·버그 수정. RED→GREEN→증거 사이클을 끝까지 진행 | -| `/verify` | "다 됐나?" 확인. 빌드+테스트+문서 동기화까지 완료 기준 전체 점검 | -| `/release` | Windows 설치자 / 원격 크로스플랫폼 빌드 | +| `/tdd` | 기능 추가 및 버그 수정 (RED → GREEN → 증거 사이클) | +| `/verify` | 완료 기준 전수 점검 (빌드 + 테스트 + 문서 동기화) | +| `/release` | Windows 설치자 및 원격 크로스플랫폼 빌드 | -절차를 기억에 의존해 재구성하지 말고 해당 스킬을 부른다. +## 3. 핵심 규칙 -## 이 저장소에서의 작업 태도 +- **한국어로 응답** (코드 식별자/기술 용어는 원문 유지). +- **대형 파일 토큰 절약**: `MainWindow.xaml.cs`(86KB) 통째 읽기 금지, Grep + 슬라이스 조회. +- **치팅 금지**: 테스트 삭제/Skip 금지. 실패 시 실제 출력 숫자를 인용하여 보고. -- **한국어로 답한다.** 코드 식별자와 기술 용어는 원문 유지. -- **계획이 필요한 크기면 플랜 모드**를 먼저 쓴다. 기준: 파일 3개 이상 변경, 또는 공개 API· - 스레딩·dispose 순서 변경, 또는 어디를 고쳐야 할지 아직 모를 때. -- **탐색은 서브에이전트에게** 맡긴다. "이 기능 어디 있지" 류의 넓은 검색은 Explore 로 위임하고 - 결론만 받는다. 파일 위치를 이미 아는 단건 확인은 직접 한다. -- **거대 파일 주의**: `MainWindow.xaml.cs`(86KB)·`MainWindow.xaml`(55KB)은 통째로 읽지 말고 - Grep 으로 위치를 찾아 필요한 구간만 Read 한다. -- **테스트를 지우거나 `Skip` 으로 무력화해서 GREEN 을 만들지 않는다.** 그건 회귀를 숨기는 것이다. -- 작업 결과를 보고할 때 테스트 수를 실제 출력에서 인용한다. 기억으로 쓰지 않는다. diff --git a/Directory.Build.props b/Directory.Build.props index b6a39ea..c86f15b 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -13,6 +13,14 @@ false + + 65001 + + + Paca + Paca + Paca Team + Copyright © 2026 Paca true diff --git a/Paca.slnx b/Paca.slnx new file mode 100644 index 0000000..243d1c0 --- /dev/null +++ b/Paca.slnx @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/VideoDownloader.App/BookmarkManagerWindow.xaml b/VideoDownloader.App/BookmarkManagerWindow.xaml deleted file mode 100644 index e9d5a9a..0000000 --- a/VideoDownloader.App/BookmarkManagerWindow.xaml +++ /dev/null @@ -1,47 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/VideoDownloader.App/MainWindow.xaml.cs b/VideoDownloader.App/MainWindow.xaml.cs deleted file mode 100644 index 869e91b..0000000 --- a/VideoDownloader.App/MainWindow.xaml.cs +++ /dev/null @@ -1,2214 +0,0 @@ -using System.Collections.ObjectModel; -using System.Net.Http.Headers; -using System.Runtime.InteropServices; -using System.Threading; -using System.Windows; -using System.Windows.Controls; -using System.Windows.Controls.Primitives; -using System.Windows.Input; -using System.Windows.Interop; -using System.Windows.Automation.Peers; -using System.Windows.Media; -using Microsoft.Web.WebView2.Core; -using VideoDownloader.Browser; -using VideoDownloader.App.Browser; -using VideoDownloader.App.Browser.Features; -using VideoDownloader.Browser.Tabs; -using VideoDownloader.App.Core; -using VideoDownloader.Core.Detection; -using VideoDownloader.App.ViewModels; -using VideoDownloader.Core.Config; -using Microsoft.Win32; -using Wv2 = Microsoft.Web.WebView2.Wpf; -using TabItem = VideoDownloader.Browser.Tabs.TabItem; - -namespace VideoDownloader.App; - -public partial class MainWindow : Window -{ - private readonly DownloadManager _manager; - private AppConfig _config; - private int _totalRequests; - private string _appLogPath = ""; - - // ---- 탭 아키텍처 (Phase A) ---- - private CoreWebView2Environment? _env; - private TabManager _tabs = null!; - internal TabManager Tabs => _tabs; - internal Wv2.WebView2? ActiveView => _tabs?.ActiveTab?.View; - private CoreWebView2? Cv => _tabs?.ActiveTab?.Core; - - private readonly ObservableCollection _bookmarks = new(); - private readonly ObservableCollection _history = new(); - private bool _suggesting; // 주소창 인라인 자동완성 도중 (TextChanged 재귀 방지) - - // M0: 원격 접근 서버(모바일 연동) - private Server.ServerHost? _remoteServer; - - // Phase D: 미디어 재생목록 (T2-10) - private readonly MediaPlaylist _playlist = new(); - private PlayerWindow? _player; - - // Phase C: 팔레트/부스트/워크스페이스/레이아웃 - private readonly CommandPalette _palette = new(); - private BoostStore _boostStore = null!; - private WorkspaceRoutingRules _routingRules = null!; // T3-1 - private TabArchive _tabArchive = null!; // T3-2 - internal TabArchive Archive => _tabArchive; // E2E 검증용 - internal BoostStore BoostStore => _boostStore; // E2E 검증용 - internal NotesStore Notes => _notes; // E2E 검증용 - private NotesStore _notes = null!; // T3-12 - private string? _currentWorkspaceName; // T3-1 라우팅 기준 - private bool _compactMode; // T3-13 - private bool _chromeRevealed; // T3-13 호버 복원 상태 - private List _workspaces = new(); - private bool _verticalTabs; - private TabItem? _splitTab; - private System.Speech.Synthesis.SpeechSynthesizer? _speech; - - // Phase B: 다운로드 매니저(T1-5) / 탭 절전(T2-2) - private readonly PageDownloadTracker _pageDownloads = new(); - private System.Windows.Threading.DispatcherTimer? _speedTimer; - private System.Windows.Threading.DispatcherTimer? _suspendTimer; - private TabSuspendService? _suspendService; - private readonly System.Diagnostics.Stopwatch _speedWatch = new(); - - // T1-4 검색엔진 / T1-7 사이트별 줌 / T1-3 페이지 내 검색 / T1-11 전체화면 - private SearchEngineResolver _resolver = null!; - private SiteZoomStore _zoomStore = null!; - private bool _fullscreen; - private WindowState _stateBeforeFullscreen = WindowState.Normal; - - // #15 위장 미디어(image/png 등) magic byte 검증용. 세션당 상한 두어 폭주 방지. - private static readonly HttpClient ProbeClient = new(new HttpClientHandler { AllowAutoRedirect = true }) - { Timeout = TimeSpan.FromSeconds(15) }; - private readonly HashSet _probed = new(); - private int _probeCount; - - // 범용 우측 패널: 접기/펼치기 + 폭 리사이즈 상태(설정에 저장) - private bool _panelCollapsed; - private double _panelExpandedWidth = 420; - private const double CollapsedPanelWidth = 56; - private const double MinExpandedWidth = 280; - private const double MaxExpandedWidth = 900; - - private static string SessionPath => Path.Combine(AppDataDir, "session.json"); - - public MainWindow() - { - InitializeComponent(); - _config = ConfigStore.Load(); - Directory.CreateDirectory(_config.OutputFolder); - _appLogPath = Path.Combine(_config.OutputFolder, "app.log"); - try { File.WriteAllText(_appLogPath, $"=== 시작 {DateTime.Now:yyyy-MM-dd HH:mm:ss} ==={Environment.NewLine}"); } catch { } - _manager = new DownloadManager(_config, GetCookiesAsync, Log); - DataContext = _manager; - - foreach (var b in BrowserStore.LoadBookmarks()) _bookmarks.Add(b); - foreach (var h in BrowserStore.LoadHistory()) _history.Add(h); - BookmarksList.ItemsSource = _bookmarks; - HistoryList.ItemsSource = GroupHistoryByDate(_history); // UC-M20 날짜 묶음 뷰 - - _resolver = new SearchEngineResolver(_config.SearchEngine); - _zoomStore = new SiteZoomStore(Path.Combine(AppDataDir, "sitezoom.json")); - _boostStore = new BoostStore(Path.Combine(AppDataDir, "boost.json")); - _routingRules = new WorkspaceRoutingRules(Path.Combine(AppDataDir, "routing.json")); // T3-1 - _tabArchive = new TabArchive(Path.Combine(AppDataDir, "archive.json")); // T3-2 - _notes = new NotesStore(Path.Combine(AppDataDir, "notes.json")); // T3-12 - try - { - var wsPath = Path.Combine(AppDataDir, "workspaces.json"); - if (File.Exists(wsPath)) - _workspaces = System.Text.Json.JsonSerializer.Deserialize>(File.ReadAllText(wsPath)) ?? new(); - } - catch { } - _playlist.Load(Path.Combine(AppDataDir, "playlist.json")); - BuildPalette(); - - // UI 복잡 버전 유즈케이스(§A~§J) 초기화 — MainWindow.Usecases.cs - InitializeUsecases(); - - // UC-L11/L12/L26 창 위치·크기·최대화·전체화면 복원 - RestoreWindowBounds(); - - Loaded += async (_, _) => await InitializeBrowserAsync(); - PreviewKeyDown += OnPreviewKeyDown; - PreviewMouseDown += Window_PreviewMouseDown; // UC-K05 마우스 제스처(XButton)·UC-K08 계열 - StateChanged += OnWindowStateChanged; - AddressBox.LostKeyboardFocus += (_, _) => AddressPopup.IsOpen = false; - - // 범용 우측 패널: 저장된 접힘/폭 상태 복원 - _panelExpandedWidth = ClampPanelWidth(_config.RightPanelWidth); - ApplyPanelState(_config.RightPanelCollapsed); - Closing += OnWindowClosing; - } - - // 보더리스: Win11 어두운 타이틀바 + 둥근 모서리(DWMWA_WINDOW_CORNER_PREFERENCE) - protected override void OnSourceInitialized(EventArgs e) - { - base.OnSourceInitialized(e); - try - { - var hwnd = new WindowInteropHelper(this).Handle; - int dark = App.IsLightTheme ? 0 : 1; // DWMWA_USE_IMMERSIVE_DARK_MODE (라이트 테마면 밝게) - DwmSetWindowAttribute(hwnd, 20, ref dark, sizeof(int)); - int round = 2; // DWMWCP_ROUND - DwmSetWindowAttribute(hwnd, 33, ref round, sizeof(int)); - } - catch { } - } - - private void OnWindowStateChanged(object? sender, EventArgs e) - { - // 최대화 시 모서리 각진(Fluent 표준), 복원 시 둥글게. 캡션 아이콘도 전환. - try - { - var hwnd = new WindowInteropHelper(this).Handle; - int pref = WindowState == WindowState.Maximized ? 0 : 2; // 0=기본(최대화 시 사각) - DwmSetWindowAttribute(hwnd, 33, ref pref, sizeof(int)); - if (MaxRestoreBtn != null) - { - MaxRestoreBtn.Content = WindowState == WindowState.Maximized ? "" : ""; - MaxRestoreBtn.ToolTip = WindowState == WindowState.Maximized ? "복원" : "최대화"; - } - } - catch { } - } - - // ---- 보더리스: 툴바의 빈 공간을 드래그 (버튼/입력창 위는 제외해 클릭 전달) ---- - private void TitleBar_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e) - { - // 더블클릭 → 최대화/복원 (네이티브 타이틀바 동작) - if (e.ClickCount >= 2) { MaximizeToggle(); return; } - - // 클릭된 대상(또는 조상)이 버튼/입력창이면 드래그하지 않고 클릭을 그대로 흘려보낸다 - for (var d = e.OriginalSource as DependencyObject; d != null; d = LogicalTreeHelper.GetParent(d) ?? VisualTreeHelper.GetParent(d)) - { - if (d is ButtonBase || d is TextBox) return; - } - if (e.LeftButton == MouseButtonState.Pressed) { try { DragMove(); } catch { } } - } - - private void Minimize_Click(object sender, RoutedEventArgs e) => WindowState = WindowState.Minimized; - private void MaxRestore_Click(object sender, RoutedEventArgs e) => MaximizeToggle(); - private void Close_Click(object sender, RoutedEventArgs e) => Close(); - - private void MaximizeToggle() - => WindowState = WindowState == WindowState.Maximized ? WindowState.Normal : WindowState.Maximized; - - [DllImport("dwmapi.dll")] - private static extern int DwmSetWindowAttribute(IntPtr hwnd, int attribute, ref int pvAttribute, int cbAttribute); - - /// 앱 데이터 디렉터리(AppPaths.DataDir — VD_DATA_DIR 오버라이드 지원). - internal static string AppDataDir => AppPaths.DataDir; - - internal static string ProfileFolder => Path.Combine(AppDataDir, "webview"); - - // ==================== 탭 생명주기 (Phase A) ==================== - - private async Task InitializeBrowserAsync() - { - try - { - // 명시적 영속 프로필: 기본(exe 디렉터리) 폴더는 빌드/재배포 시 날아가 로그인이 풀림 → %AppData% 로 고정. - Directory.CreateDirectory(ProfileFolder); - _env = await CoreWebView2Environment.CreateAsync(browserExecutableFolder: null, userDataFolder: ProfileFolder); - } - catch (Exception ex) { Log($"WebView2 초기화 실패: {ex.Message}"); return; } - - _views = new Services.TabViewService(_env!, _config, TabHost, _zoomStore, Dispatcher) - { - NewTabProvider = () => Task.FromResult(_tabs.NewTab(activate: false)), - }; - _views.TabCoreReady += (tab, cv) => - { - cv.WebResourceResponseReceived += OnResponseReceived; // 미디어 감지 - WireTabMouseGestures(cv); // UC-K06 휠 클릭 새 탭 - }; - _views.DownloadStarting += OnDownloadStarting; - _views.UrlChanged += OnUrlChanged; - _views.TitleChanged += OnTitleChanged; - _views.HistoryChanged += UpdateNavState; - _views.FindStateChanged += tab => - { - if (tab.FindSession != null) FindStatus.Text = tab.FindSession.StatusText; - }; - - _views.ContextMenuBuild += OnContextMenuBuild; - _views.BoostScriptProvider = url => BoostCssBuilder.BuildScript(url, _boostStore.Get(url)); // T2-7 - _views.GlanceRequested += (_, link) => Dispatcher.BeginInvoke(new Action(() => OpenGlance(link))); // T2-6 - _views.SpeakRequested += (_, text) => Dispatcher.BeginInvoke(new Action(() => SpeakText(text))); // T3-9 - - // T3-15 주소창 진행 바: 전 탭 네비게이션 집계 → 표시 - _navTracker = new NavProgressTracker(); - _navTracker.PropertyChanged += (_, e) => - NavProgress.Visibility = e.PropertyName == nameof(NavProgressTracker.IsNavigating) && _navTracker.IsNavigating - ? Visibility.Visible : Visibility.Collapsed; - _views.NavigationStarted += _navTracker.Started; - _views.NavigationCompleted += _navTracker.Completed; - - // T3-11 권한 다이얼로그: 예=항상 허용 / 아니요=항상 거절 / 취소=이번만 거절 - _views.PermissionPrompt += (cv, e) => Dispatcher.BeginInvoke(new Action(() => - { - var kind = e.PermissionKind.ToString(); - var origin = Services.TabViewService.OriginOf(e.Uri); - var r = System.Windows.MessageBox.Show(this, - $"{origin} 사이트가 {KoreanPermission(kind)} 권한을 요청합니다.\n허용하시겠습니까?\n\n예: 항상 허용 · 아니요: 항상 거절 · 취소: 이번만 거절", - "권한 요청", MessageBoxButton.YesNoCancel, MessageBoxImage.Question); - e.State = r == MessageBoxResult.Yes ? Microsoft.Web.WebView2.Core.CoreWebView2PermissionState.Allow - : Microsoft.Web.WebView2.Core.CoreWebView2PermissionState.Deny; - e.SavesInProfile = r != MessageBoxResult.Cancel; // 항상 선택만 프로필 영속 - e.Handled = true; - if (r != MessageBoxResult.Cancel) - _views.Permissions.Remember(kind, origin, - r == MessageBoxResult.Yes ? PermissionVerdict.Allow : PermissionVerdict.Deny); - })); - - // T3-14 실드 배지 갱신 - _views.TrackerBlocked += UpdateShield; - - _tabs = new TabManager(() => new TabItem(), _views.AttachView) - { - MaxTabs = _config.MaxTabs, // UC-B11 탭 상한 - }; - _tabs.ActiveChanged += OnActiveTabChanged; - _tabs.TabRemoved += OnTabRemoved; - _views.TabCoreReady += (tab, cv) => - { - // UC-K15 새 탭 기본 줌 — 사이트별 저장 줌이 없을 때만 적용(T1-7 과 충돌 방지) - try { if (tab.View != null && _zoomStore.Count == 0 && Math.Abs(_config.DefaultZoomFactor - 1.0) > 0.01) tab.View.ZoomFactor = _config.DefaultZoomFactor; } catch { } - }; - TabList.ItemsSource = _tabs.Tabs; - UpdatePrivateButton(); - - // T1-10 세션 복원: 저장된 탭이 있으면 복원, 아니면 홈 탭 - var snap = _config.RestoreSession ? TabSessionStore.Load(SessionPath) : null; - if (snap != null && snap.Urls.Count > 0) - _tabs.RestoreSession(snap); - else - _tabs.NewTab(_config.HomeUrl); - // UC-B12 세션 복원을 잠자기로 — 비활성 탭 뷰를 접어 빠른 시작 - if (_config.RestoreTabsSuspended && _tabs.ActiveTab != null) - foreach (var t in _tabs.Tabs.Where(t => !ReferenceEquals(t, _tabs.ActiveTab)).ToList()) - try { if (t.View != null) t.View.Visibility = Visibility.Collapsed; } catch { } - UpdateNavState(); - - // T1-5 다운로드 속도 갱신 타이머 - DownloadsList.ItemsSource = _pageDownloads.Items; - PlaylistList.ItemsSource = _playlist.Tracks; - PlaylistEmptyHint.Visibility = _playlist.Tracks.Count == 0 ? Visibility.Visible : Visibility.Collapsed; - _speedTimer = new System.Windows.Threading.DispatcherTimer { Interval = TimeSpan.FromSeconds(1) }; - _speedTimer.Tick += (_, _) => - { - foreach (var item in _pageDownloads.Items) - item.UpdateSpeed(item.Op.BytesReceived, TimeSpan.FromSeconds(1)); - DownloadsEmptyHint.Visibility = _pageDownloads.Items.Count == 0 ? Visibility.Visible : Visibility.Collapsed; - }; - _speedTimer.Start(); - - // M0: 설정돼 있으면 원격 접근 서버 자동 시작 - if (_config.RemoteAccessEnabled && !string.IsNullOrEmpty(_config.RemoteAccessToken)) - { - try - { - _remoteServer = await Server.ServerHost.StartAsync(new Server.ServerOptions - { - Port = 0, - Token = _config.RemoteAccessToken!, - LibraryFolder = Path.GetFullPath(_config.OutputFolder), - Queue = new Services.DownloadQueueAdapter(_manager, Dispatcher), - }); - Log($"원격 접근 서버 포트 {_remoteServer.Port}"); - UpdateServerStatusIcon(); // §J 서버 상태 아이콘 - } - catch { } - } - - // T2-2 탭 절전: 1분마다 유휴(10분+) 비활성 탭 서스펜드 - _suspendService = new TabSuspendService(TimeSpan.FromMinutes(10), tab => - { - var cv = tab.Core; - if (cv == null || cv.IsSuspended) return false; - if (tab.View?.Visibility != Visibility.Collapsed) return false; // 숨겨진 탭만 서스펜드 가능 - _ = cv.TrySuspendAsync(); - return true; - }, tab => tab.Core != null); - _suspendTimer = new System.Windows.Threading.DispatcherTimer { Interval = TimeSpan.FromMinutes(1) }; - _suspendTimer.Tick += (_, _) => - { - if (_tabs.ActiveTab != null) - _suspendService.SuspendIdleTabs(_tabs.Tabs, _tabs.ActiveTab, DateTime.UtcNow); - }; - _suspendTimer.Start(); - } - - /// 탭별 WebView2 생명주기·배선 전담 서비스(재구성 ④). - private Services.TabViewService? _views; - - /// T3-15 주소창 진행 바 상태(전 탭 네비게이션 집계). - private NavProgressTracker? _navTracker; - - /// T3-15: 파라미터 제거 후 클립보드 복사(주소창 우클릭). - private void CopyCleanUrl_Click(object sender, RoutedEventArgs e) - { - var clean = UrlCleaner.StripQuery(AddressBox.Text); - if (string.IsNullOrEmpty(clean)) return; - try { Clipboard.SetText(clean); Log($"파라미터 제거 URL 복사: {clean}"); } catch { } - } - - /// T3-14: 실드 배지 갱신. - private void UpdateShield() - { - if (_views == null) return; - var n = _views.TrackerCounter.Total; - ShieldBadgeText.Text = n > 0 ? n.ToString() : ""; - ShieldBadge.Visibility = n > 0 ? Visibility.Visible : Visibility.Collapsed; - ShieldBtn.ToolTip = n > 0 ? $"추적 요청 {n}건 차단됨" : "추적 방지"; - } - - /// T3-14: 실드 클릭 → 차단 도메인 목록 팝업. - private void Shield_Click(object sender, RoutedEventArgs e) - { - if (_views == null) return; - var byDomain = _views.TrackerCounter.ByDomain; - ShieldDomainStats.ItemsSource = byDomain.Count == 0 - ? new[] { "차단된 추적 요청이 없습니다" } - : byDomain.OrderByDescending(kv => kv.Value).Select(kv => $"{kv.Value,3} × {kv.Key}").ToList(); - ShieldPopup.IsOpen = true; - } - - /// T3-11: 권한 종류 한글 표기. - private static string KoreanPermission(string kind) => kind switch - { - "Microphone" => "마이크", - "Camera" => "카메라", - "Geolocation" => "위치", - "Notifications" => "알림", - "ClipboardRead" => "클립보드 읽기", - "Autoplay" => "자동 재생", - "FileReadWrite" => "파일 읽기/쓰기", - "PersistentStorage" => "영구 저장소", - _ => kind, - }; - - private void OnUrlChanged(TabItem tab, string url) - { - if (tab.PendingHistoryUrl != null) RecordHistory(tab.PendingHistoryUrl, tab.PendingHistoryUrl); - if (tab.IsActive && !AddressBox.IsKeyboardFocused) AddressBox.Text = url; - tab.PendingHistoryUrl = url.StartsWith("about:", StringComparison.OrdinalIgnoreCase) ? null : url; - DetectSocial(tab, url); - } - - private void OnTitleChanged(TabItem tab, string title) - { - tab.Title = string.IsNullOrWhiteSpace(title) ? (tab.Url.StartsWith("http") ? tab.Url : "새 탭") : title; - if (tab.PendingHistoryUrl != null) - { - RecordHistory(string.IsNullOrWhiteSpace(title) ? tab.PendingHistoryUrl : title, tab.PendingHistoryUrl); - tab.PendingHistoryUrl = null; - } - // 소셜 카드 제목을 페이지 타이틀로 갱신(출력 파일명 포함, 시작 전일 때) - if (tab.PendingSocialUrl != null && !string.IsNullOrWhiteSpace(title)) - { - _manager.RenameSocial(new Uri(tab.PendingSocialUrl), title); - tab.PendingSocialUrl = null; - } - } - - private void OnDownloadStarting(CoreWebView2 cv, CoreWebView2DownloadStartingEventArgs de) - { - try - { - var folder = Path.GetFullPath(_config.OutputFolder); - Directory.CreateDirectory(folder); - var fn = Path.GetFileName(de.ResultFilePath); - if (string.IsNullOrWhiteSpace(fn)) fn = $"download_{DateTime.Now:yyyyMMdd_HHmmss}"; - de.ResultFilePath = MakeUniqueDownloadName(folder, fn); - _manager.LogPanel($"📥 페이지 다운로드 → 저장 폴더: {fn}"); - - var item = _pageDownloads.Add(new DownloadOperationAdapter(de.DownloadOperation), fn); // T1-5 - item.UpdateSpeed(0, TimeSpan.FromSeconds(1)); - DownloadsEmptyHint.Visibility = Visibility.Collapsed; - } - catch { } - } - - // ---- T1-5 다운로드 플라이아웃 ---- - private void ToggleDownloads(object sender, RoutedEventArgs e) - { - DownloadsPopup.IsOpen = !DownloadsPopup.IsOpen; - } - - private void DownloadsClear_Click(object sender, RoutedEventArgs e) => _pageDownloads.ClearCompleted(); - - private void DlPause_Click(object sender, RoutedEventArgs e) - => IfDownloadItem(sender, i => _pageDownloads.Pause(i)); - - private void DlResume_Click(object sender, RoutedEventArgs e) - => IfDownloadItem(sender, i => _pageDownloads.Resume(i)); - - private void DlCancel_Click(object sender, RoutedEventArgs e) - => IfDownloadItem(sender, i => _pageDownloads.Cancel(i)); - - private static void IfDownloadItem(object sender, Action act) - { - if ((sender as FrameworkElement)?.DataContext is PageDownloadItem item) act(item); - } - - private void OnActiveTabChanged(TabItem tab) - { - if (_splitTab != null && !ReferenceEquals(tab, _splitTab)) ExitSplit(); // v1: 전환 시 분할 해제 - foreach (var t in _tabs.Tabs) - if (t.View != null) t.View.Visibility = ReferenceEquals(t, tab) ? Visibility.Visible : Visibility.Collapsed; - if (!AddressBox.IsKeyboardFocused) AddressBox.Text = tab.Url; - if (tab.IsSuspended) // T2-2: 절전 탭 활성화 시 재개 - { - try { tab.Core?.Resume(); } catch { } - tab.IsSuspended = false; - } - // UC-K14 현재 탭 줌 배율 표시 갱신 - if (ZoomIndicator != null && tab.View != null) - ZoomIndicator.Content = $"{Math.Round(tab.View.ZoomFactor * 100)}%"; - UpdateNavState(); - } - - private void OnTabRemoved(TabItem tab) - { - if (ReferenceEquals(_splitTab, tab)) ExitSplit(); - _tabArchive.Add(tab.Title, tab.Url); // T3-2 닫힘 → 아카이브(영속, 500 상한) - _views?.RemoveView(tab); - } - - private void UpdateNavState() - { - Dispatcher.BeginInvoke(new Action(() => - { - try - { - var cv = Cv; // dispose 이후 이벤트 경로 방어 - NavBack.IsEnabled = cv?.CanGoBack == true; - NavForward.IsEnabled = cv?.CanGoForward == true; - } - catch (ObjectDisposedException) { } - catch (InvalidOperationException) { } - })); - } - - // ---- 탭 스트립 UI 이벤트 ---- - private void NewTab_Click(object sender, RoutedEventArgs e) => NewTabWithDial(); - - private void Tab_Click(object sender, MouseButtonEventArgs e) - { - if ((sender as FrameworkElement)?.DataContext is TabItem tab) - _tabs.Activate(tab); - } - - private void Tab_PreviewMouseDown(object sender, MouseButtonEventArgs e) - { - // 휠 클릭(미들) → 탭 닫기 (브라우저 관례). MiddleButton 상태로 판정. - if (e.MiddleButton == MouseButtonState.Pressed) - { - if ((sender as FrameworkElement)?.DataContext is TabItem tab) - { - _tabs.CloseTab(tab); - e.Handled = true; - } - } - } - - private void TabClose_Click(object sender, RoutedEventArgs e) - { - if ((sender as FrameworkElement)?.DataContext is TabItem tab) - _tabs.CloseTab(tab); - } - - // T1-8 스피커 아이콘 클릭 → 음소거 토글 - private void TabAudio_Click(object sender, MouseButtonEventArgs e) - { - if ((sender as FrameworkElement)?.DataContext is TabItem { Core: { } cv } tab) - { - try { cv.IsMuted = !cv.IsMuted; tab.IsMuted = cv.IsMuted; } catch { } - } - e.Handled = true; - } - - private void OnResponseReceived(object? sender, CoreWebView2WebResourceResponseReceivedEventArgs e) - { - try - { - var uri = e.Request.Uri ?? ""; - var method = e.Request.Method ?? "GET"; - string ct = "", cl = ""; - int status = 0; - try { ct = e.Response.Headers.GetHeader("Content-Type") ?? ""; } catch { } - try { cl = e.Response.Headers.GetHeader("Content-Length") ?? ""; } catch { } - try { status = e.Response.StatusCode; } catch { } - - int n = Interlocked.Increment(ref _totalRequests); - var ctLow = (ct ?? "").ToLowerInvariant(); - // #8 노이즈 content-type(image/font/css/js/beacon)은 requests.log 기록 스킵 - bool loggable = !ctLow.StartsWith("image/") && !ctLow.StartsWith("font/") - && !ctLow.Contains("/css") && !ctLow.Contains("javascript") - && !ctLow.Contains("beacon") && !ctLow.Contains("ping"); - if (loggable) _manager.AppendAll($"{n}|{status}|{method}|{ct}|{cl}|{uri}"); - - if (status >= 300) return; - - var l = uri.ToLowerInvariant(); - var c = (ct ?? "").ToLowerInvariant(); - long len = long.TryParse(cl, out var lv) ? lv : -1; - // 206(Partial Content) Range 응답은 Content-Length 가 청크 크기라 작게 잡힘 → - // Content-Range 의 전체 크기(/total) 로 보정 (Instagram 등 단일 MP4 Range 스트리밍 감지). - try - { - var cr = e.Response.Headers.GetHeader("Content-Range"); - if (!string.IsNullOrEmpty(cr)) - { - var slash = cr.LastIndexOf('/'); - if (slash >= 0 && long.TryParse(cr.AsSpan(slash + 1), out var total) && total > len) - len = total; - } - } - catch { } - - string referer = (sender as CoreWebView2)?.Source ?? Cv?.Source ?? ""; - try { var r = e.Request.Headers.GetHeader("Referer"); if (!string.IsNullOrEmpty(r)) referer = r; } catch { } - - var kind = MediaDetector.Classify(uri, ct, len, _config); - if (kind == MediaKind.Hls) - { - _manager.LogPanel($"★ HLS 감지: {uri}"); - _manager.OnDetected(new DetectionContext(uri, referer, MediaKind.Hls, ct)); - } - else if (kind == MediaKind.Dash) - { - _manager.LogPanel($"★ DASH 감지: {uri}"); - _manager.OnDetected(new DetectionContext(uri, referer, MediaKind.Dash, ct)); - } - else if (kind == MediaKind.Direct) - { - // #15(b) chunked video/* (len<0) 는 크기 가드를 건너뛰어 토큰 만료 HTML 오류 페이지가 mp4 로 오탐됨 → - // magic-byte probe 로 본문이 실제 미디어인지 재검증(정상 chunked MP4 는 ftyp box 로 통과). - if (c.StartsWith("video/") && len < 0 && Uri.TryCreate(uri, UriKind.Absolute, out var probeUri)) - ProbeMediaAsync(probeUri, referer); - else - { - _manager.LogPanel($"★ 미디어 감지 [{ct}] {FmtLen(len)}: {uri}"); - AddToPlaylist(uri, GuessTitle(uri), MediaKind.Direct.ToString(), referer); - _manager.OnDetected(new DetectionContext(uri, referer, MediaKind.Direct, ct)); - } - } - else - { - // #15 위장 미디어(image/* 또는 octet-stream, 대용량) → magic byte 검증 - long minBytes = _config.MinSizeMB * 1024L * 1024L; - bool disguised = (c.StartsWith("image/") || c.Contains("octet-stream")) && (len < 0 || len > minBytes); - if (disguised && Uri.TryCreate(uri, UriKind.Absolute, out var probeUri)) - ProbeMediaAsync(probeUri, referer); - else if (MediaDetector.LooksLikeCandidate(l, c)) - _manager.LogPanel($"[후보 {method}] {uri}"); - } - } - catch { } - } - - private async void ProbeMediaAsync(Uri uri, string referer) - { - try - { - string key = uri.GetLeftPart(UriPartial.Path); - lock (_probed) - { - if (_probeCount > 40) return; // 세션당 상한 - if (!_probed.Add(key)) return; // 중복 URL 스킵 - _probeCount++; - } - using var req = new HttpRequestMessage(HttpMethod.Get, uri); - req.Headers.Range = new RangeHeaderValue(0, 63); - req.Headers.UserAgent.ParseAdd(_config.UserAgent); - if (!string.IsNullOrEmpty(referer)) { try { req.Headers.Referrer = new Uri(referer); } catch { } } - using var resp = await ProbeClient.SendAsync(req, HttpCompletionOption.ResponseHeadersRead); - if ((int)resp.StatusCode >= 300) return; - await using var stream = await resp.Content.ReadAsStreamAsync(); - var head = new byte[64]; - int total = 0, m; - while (total < 64 && (m = await stream.ReadAsync(head, total, 64 - total)) > 0) total += m; - var fmt = MediaDetector.ProbeFormat(head.AsSpan(0, total)); - if (fmt != null) - { - _manager.LogPanel($"★ 위장 미디어 감지 (→{fmt}): {uri}"); - _manager.OnDetected(new DetectionContext(uri.ToString(), referer, MediaKind.Direct, "video/" + fmt)); - } - } - catch { } - } - - private static string FmtLen(long len) => len < 0 ? "?" : $"{len / 1048576.0:F1}MB"; - - private async Task> GetCookiesAsync(Uri url) - { - var cv = Cv; - if (cv == null) return new(); - try { return (await cv.CookieManager.GetCookiesAsync(url.ToString())).ToList(); } - catch { return new(); } - } - - private void Log(string s) - { - var line = $"[{DateTime.Now:HH:mm:ss}] {s}"; - try { File.AppendAllText(_appLogPath, line + Environment.NewLine); } catch { } - Dispatcher.BeginInvoke(new Action(() => { StatusText.Text = s; })); - } - - // ---- 네비게이션 ---- - private void Go_Click(object sender, RoutedEventArgs e) => NavigateTo(AddressBox.Text); - - // ---- 주소창 자동완성/제안 ---- - private void AddressBox_TextChanged(object sender, TextChangedEventArgs e) - { - if (_suggesting) return; - UpdateSuggestions(AddressBox.Text); - TryInlineSuggest(AddressBox.Text); - } - - private void UpdateSuggestions(string text) - { - text = text?.Trim() ?? ""; - if (text.Length == 0 || !AddressBox.IsKeyboardFocused) - { - AddressPopup.IsOpen = false; - return; - } - var low = text.ToLowerInvariant(); - var matches = _history - .Where(h => h.Url.ToLowerInvariant().Contains(low) - || (h.Title ?? "").ToLowerInvariant().Contains(low)) - .Take(8) - .ToList(); - AddressSuggestions.ItemsSource = matches; - AddressSuggestions.SelectedIndex = matches.Count > 0 ? 0 : -1; - AddressPopup.IsOpen = matches.Count > 0; - } - - // 인라인 자동완성: 방문한 URL 중 입력이 접두사면 나머지를 선택영역으로 채움 (Tab/→ 로 확정) - private void TryInlineSuggest(string text) - { - if (text.Length == 0 || AddressBox.CaretIndex != text.Length) return; - var low = text.ToLowerInvariant(); - var match = _history.FirstOrDefault(h => h.Url.Length > text.Length - && h.Url.ToLowerInvariant().StartsWith(low)); - if (match == null) return; - _suggesting = true; - AddressBox.Text = match.Url; - AddressBox.Select(text.Length, match.Url.Length - text.Length); - _suggesting = false; - } - - private void AddressBox_PreviewKeyDown(object sender, KeyEventArgs e) - { - var k = e.Key; - - // ↑/↓ 제안 목록 탐색 - if (AddressPopup.IsOpen && AddressSuggestions.HasItems && (k == Key.Down || k == Key.Up)) - { - int n = AddressSuggestions.Items.Count; - int delta = k == Key.Down ? 1 : -1; - int i = Math.Clamp(AddressSuggestions.SelectedIndex + delta, 0, n - 1); - AddressSuggestions.SelectedIndex = i; - AddressSuggestions.ScrollIntoView(AddressSuggestions.Items[i]); - e.Handled = true; - return; - } - - // Tab / → 로 인라인 제안 확정 (선택영역을 끝으로 붕괴) - if ((k == Key.Tab || k == Key.Right) && AddressBox.SelectionLength > 0 - && AddressBox.CaretIndex + AddressBox.SelectionLength == AddressBox.Text.Length) - { - AddressBox.CaretIndex = AddressBox.Text.Length; - AddressBox.Select(AddressBox.Text.Length, 0); - e.Handled = true; - return; - } - - if (k == Key.Escape) { AddressPopup.IsOpen = false; e.Handled = true; return; } - - if (k == Key.Enter) - { - AddressPopup.IsOpen = false; - if (AddressSuggestions.SelectedItem is HistoryEntry sel) - NavigateTo(sel.Url); - else - NavigateTo(AddressBox.Text); - Keyboard.ClearFocus(); - e.Handled = true; - } - } - - // 제안 항목 클릭 → 이동 - private void AddressSuggestion_Click(object sender, MouseButtonEventArgs e) - { - if (AddressSuggestions.SelectedItem is HistoryEntry sel) - { - AddressPopup.IsOpen = false; - NavigateTo(sel.Url); - } - } - - private void NavBack_Click(object sender, RoutedEventArgs e) => Cv?.GoBack(); - private void NavForward_Click(object sender, RoutedEventArgs e) => Cv?.GoForward(); - private void NavRefresh_Click(object sender, RoutedEventArgs e) => Cv?.Reload(); - private void NavHome_Click(object sender, RoutedEventArgs e) => NavigateTo(_config.HomeUrl); - - internal void NavigateTo(string? url) - { - // T1-4: URL/검색어 판별 + 기본 엔진·키워드 전환(g, yt, ...)은 리졸버가 담당 - var intent = _resolver.Resolve(url); - if (intent == null) return; - - // T3-1: 도메인 라우팅 규칙 — 대상 워크스페이스가 다르면 자동 전환 후 이동(Arc ATC 패턴) - var routeTo = _routingRules.Match(intent.Target); - if (routeTo != null && routeTo != _currentWorkspaceName && - _workspaces.FirstOrDefault(w => w.Name == routeTo) is { } wsTarget) - { - SwitchWorkspace(wsTarget); - _currentWorkspaceName = routeTo; - Log($"라우팅 규칙 → 워크스페이스 '{routeTo}' 전환"); - } - Cv?.Navigate(intent.Target); - } - - // 소셜 영상 페이지(YouTube/Instagram/X/...) 감지 → yt-dlp 카드 등록. (탭별 상태) - private void DetectSocial(TabItem tab, string? url) - { - if (string.IsNullOrEmpty(url)) { tab.PendingSocialUrl = null; return; } - if (!Uri.TryCreate(url, UriKind.Absolute, out var uri)) { tab.PendingSocialUrl = null; return; } - if (SocialSiteDetector.TryMatch(uri, out var normalized, out var label)) - { - _manager.LogPanel($"★ 소셜 감지 [{label}]: {normalized}"); - _manager.OnDetected(new DetectionContext(normalized, normalized, MediaKind.Social, Tag: label)); - tab.PendingSocialUrl = normalized; - } - else tab.PendingSocialUrl = null; - } - - // ---- 링크로 받기 (URL 붙여넣기) ---- - private void ToggleLink(object sender, RoutedEventArgs e) - { - BookmarksPopup.IsOpen = false; - HistoryPopup.IsOpen = false; - LinkPopup.IsOpen = !LinkPopup.IsOpen; - if (LinkPopup.IsOpen) { LinkBox.Clear(); Dispatcher.BeginInvoke(new Action(() => LinkBox.Focus())); } - } - - private void LinkBox_PreviewKeyDown(object sender, KeyEventArgs e) - { - if (e.Key == Key.Enter) { LinkDownload_Click(sender, e); e.Handled = true; } - } - - private void LinkDownload_Click(object sender, RoutedEventArgs e) - { - var raw = (LinkBox.Text ?? "").Trim(); - if (string.IsNullOrEmpty(raw)) return; - if (!raw.StartsWith("http", StringComparison.OrdinalIgnoreCase)) raw = "https://" + raw; - if (!Uri.TryCreate(raw, UriKind.Absolute, out var uri)) { Log("올바른 링크가 아닙니다"); return; } - if (SocialSiteDetector.TryMatch(uri, out var normalized, out var label)) - { - _manager.LogPanel($"★ 소셜 감지 [{label}]: {normalized}"); - _manager.OnDetected(new DetectionContext(normalized, normalized, MediaKind.Social, Tag: label)); - LinkPopup.IsOpen = false; - Log("카드에 추가했습니다. 화질을 선택하고 받기를 누르세요"); - } - else Log("지원하는 소셜 영상 링크가 아닙니다 (YouTube·Instagram·X·TikTok·Facebook)"); - } - - // #7 전역 키보드 단축키 (+Phase A 탭/T1-3/T1-9/T1-11) - private void OnPreviewKeyDown(object sender, KeyEventArgs e) - { - var cv = Cv; - var mods = Keyboard.Modifiers; - - // Phase A 탭 단축키 - if (mods == ModifierKeys.Control && e.Key == Key.T) { NewTabWithDial(); e.Handled = true; } - else if (mods == ModifierKeys.Control && e.Key == Key.J) { DownloadsPopup.IsOpen = !DownloadsPopup.IsOpen; e.Handled = true; } - else if (mods == ModifierKeys.Control && e.Key == Key.K) { TogglePalette(); e.Handled = true; } - else if (e.Key == Key.F9) { _ = ToggleReader(); e.Handled = true; } - else if (mods == (ModifierKeys.Control | ModifierKeys.Shift) && e.Key == Key.D) { ToggleBoostDark(); e.Handled = true; } - else if (mods == (ModifierKeys.Control | ModifierKeys.Shift) && e.Key == Key.S) { _ = TakeScreenshot(); e.Handled = true; } - else if (mods == (ModifierKeys.Control | ModifierKeys.Shift) && e.Key == Key.N) { OpenInPrivateTab(); e.Handled = true; } - else if (mods == (ModifierKeys.Control | ModifierKeys.Shift) && e.Key == Key.M) { ToggleCompactMode(); e.Handled = true; } // T3-13 - else if (mods == (ModifierKeys.Control | ModifierKeys.Alt) && e.Key == Key.N) { ToggleNotes(); e.Handled = true; } // T3-12 - else if (mods == (ModifierKeys.Alt | ModifierKeys.Control) && e.Key == Key.V) { ToggleVerticalTabs(); e.Handled = true; } - else if (mods == (ModifierKeys.Alt | ModifierKeys.Control) && e.Key == Key.H) { ToggleSplit(); e.Handled = true; } - else if (mods == ModifierKeys.Control && e.Key == Key.U) { ViewSource(); e.Handled = true; } - else if (mods == ModifierKeys.Control && e.Key == Key.P) { try { Cv?.ShowPrintUI(); } catch { } e.Handled = true; } - else if (e.Key == Key.OemQuestion && Keyboard.FocusedElement is not TextBox) { OpenFind(); e.Handled = true; } - else if (mods == (ModifierKeys.Control | ModifierKeys.Shift) && e.Key == Key.A) { ToggleTabSearch(this, e); e.Handled = true; } - else if (mods == (ModifierKeys.Control | ModifierKeys.Shift) && e.Key == Key.B) { ToggleBookmarkBar(); e.Handled = true; } - else if (mods == (ModifierKeys.Control | ModifierKeys.Shift) && e.Key == Key.T) { _tabs.ReopenClosedTab(); e.Handled = true; } - else if (mods == (ModifierKeys.Control | ModifierKeys.Shift) && e.Key == Key.W) { _tabs.CloseTab(_tabs.ActiveTab!); e.Handled = true; } - else if (mods == ModifierKeys.Control && e.Key == Key.W) { if (_tabs.ActiveTab != null) _tabs.CloseTab(_tabs.ActiveTab); e.Handled = true; } - else if (mods == ModifierKeys.Control && e.Key == Key.Tab) { _tabs.ActivateNext(); e.Handled = true; } - else if (mods == (ModifierKeys.Control | ModifierKeys.Shift) && e.Key == Key.Tab) { _tabs.ActivatePrevious(); e.Handled = true; } - else if (mods == ModifierKeys.Control && e.Key >= Key.D1 && e.Key <= Key.D9) - { - var idx = e.Key - Key.D1; - if (idx == 8) _tabs.ActivateLast(); else _tabs.ActivateAt(idx); // Ctrl+9 = 마지막 탭 - e.Handled = true; - } - // T1-3 검색 바가 열려 있으면 Esc 는 닫기가 우선 - else if (e.Key == Key.Escape && FindBar.Visibility == Visibility.Visible) { CloseFind(); e.Handled = true; } - else if (mods == ModifierKeys.Control && e.Key == Key.F) { OpenFind(); e.Handled = true; } - else if (e.Key == Key.F3) - { - if (FindBar.Visibility == Visibility.Visible) - { - if (mods == ModifierKeys.Shift) _tabs.ActiveTab?.FindSession?.Previous(); - else _tabs.ActiveTab?.FindSession?.Next(); - } - else OpenFind(); - e.Handled = true; - } - else if (e.Key == Key.F11) { ToggleFullscreen(); e.Handled = true; } - else if (mods == (ModifierKeys.Control | ModifierKeys.Shift) && e.Key == Key.R) { ForceReload(); e.Handled = true; } - else if (mods == ModifierKeys.Control && e.Key == Key.L) { AddressBox.Focus(); AddressBox.SelectAll(); e.Handled = true; } - else if (e.Key == Key.F5 || (mods == ModifierKeys.Control && e.Key == Key.R)) { cv?.Reload(); e.Handled = true; } - else if (e.Key == Key.F12) { OpenDevTools(); e.Handled = true; } // UC-K12 - else if (e.Key == Key.Escape) - { - // UC-K10: 열린 팝업이 있으면 모두 닫고, 없으면 페이지 로딩 중지 - if (AnyPopupOpen()) CloseAllPopups(); - else try { cv?.Stop(); } catch { } - e.Handled = true; - } - else if (mods == ModifierKeys.Alt && e.Key == Key.Left) { try { if (cv?.CanGoBack == true) cv.GoBack(); } catch { } e.Handled = true; } - else if (mods == ModifierKeys.Alt && e.Key == Key.Right) { try { if (cv?.CanGoForward == true) cv.GoForward(); } catch { } e.Handled = true; } - else if (mods == ModifierKeys.Control) - { - if (e.Key == Key.OemPlus || e.Key == Key.Add) { try { ZoomBy(+0.1); } catch { } e.Handled = true; } - else if (e.Key == Key.OemMinus || e.Key == Key.Subtract) { try { ZoomBy(-0.1); } catch { } e.Handled = true; } - else if (e.Key == Key.D0) { try { ZoomSet(1.0); } catch { } e.Handled = true; } - } - } - - private void ZoomBy(double delta) => ZoomSet(Math.Clamp((ActiveView?.ZoomFactor ?? 1.0) + delta, 0.1, 5.0)); - - private void ZoomSet(double zoom) - { - if (ActiveView == null) return; - ActiveView.ZoomFactor = zoom; - PersistZoom(); - } - - // ---- T1-3 페이지 내 검색 바 (활성 탭 세션) ---- - internal void OpenFind() - { - FindBar.Visibility = Visibility.Visible; - FindStatus.Text = ""; - FindBox.Focus(); - FindBox.SelectAll(); - if (FindBox.Text.Length > 0) _ = _tabs.ActiveTab?.FindSession?.StartAsync(FindBox.Text); - } - - internal void CloseFind() - { - FindBar.Visibility = Visibility.Collapsed; - _tabs.ActiveTab?.FindSession?.Close(); - FindStatus.Text = ""; - } - - private void FindBox_TextChanged(object sender, TextChangedEventArgs e) - { - if (FindBar.Visibility == Visibility.Visible) - _ = _tabs.ActiveTab?.FindSession?.StartAsync(FindBox.Text); - } - - private void FindBox_PreviewKeyDown(object sender, KeyEventArgs e) - { - if (e.Key == Key.Enter) - { - if (Keyboard.Modifiers == ModifierKeys.Shift) _tabs.ActiveTab?.FindSession?.Previous(); - else _tabs.ActiveTab?.FindSession?.Next(); - e.Handled = true; - } - else if (e.Key == Key.Escape) { CloseFind(); e.Handled = true; } - } - - private void FindNext_Click(object sender, RoutedEventArgs e) => _tabs.ActiveTab?.FindSession?.Next(); - private void FindPrev_Click(object sender, RoutedEventArgs e) => _tabs.ActiveTab?.FindSession?.Previous(); - private void FindClose_Click(object sender, RoutedEventArgs e) => CloseFind(); - - private void FindOption_Changed(object sender, RoutedEventArgs e) - => _tabs.ActiveTab?.FindSession?.SetOptions(FindCaseBox.IsChecked == true, FindWordBox.IsChecked == true); - - // T1-7 줌 변경을 사이트별 저장소에 영속 - private void PersistZoom() - { - var cv = Cv; - if (cv != null && ActiveView != null) _zoomStore.Set(cv.Source, ActiveView.ZoomFactor); - } - - // T1-9 강제 새로고침: 디스크 캐시 비우고 다시 로드 - private async void ForceReload() - { - var cv = Cv; - if (cv == null) return; - try { await cv.Profile.ClearBrowsingDataAsync(CoreWebView2BrowsingDataKinds.DiskCache); } - catch { } - try { cv.Reload(); } catch { } - } - - // T1-11 전체화면(F11): 툴바/탭/상태바 숨기고 최대화. 재누르면 복원. - internal void ToggleFullscreen() - { - _fullscreen = !_fullscreen; - if (_fullscreen) - { - _stateBeforeFullscreen = WindowState; - WindowState = WindowState.Maximized; - } - else - { - WindowState = _stateBeforeFullscreen; - } - ToolbarRow.Visibility = _fullscreen ? Visibility.Collapsed : Visibility.Visible; - TabStripRow.Visibility = _fullscreen ? Visibility.Collapsed : Visibility.Visible; - StatusBar.Visibility = _fullscreen ? Visibility.Collapsed : Visibility.Visible; - } - - private static string MakeUniqueDownloadName(string folder, string file) - { - var p = Path.Combine(folder, file); - if (!File.Exists(p)) return p; - var name = Path.GetFileNameWithoutExtension(file); - var ext = Path.GetExtension(file); - int i = 1; - while (File.Exists(Path.Combine(folder, $"{name} ({i}){ext}"))) i++; - return Path.Combine(folder, $"{name} ({i}){ext}"); - } - - // ---- 범용 우측 패널: 접기/펼치기 + 리사이즈 + 상태 저장 ---- - private double ClampPanelWidth(double w) => Math.Clamp(w, Math.Max(160, _config.RightPanelMinWidth), MaxExpandedWidth); // UC-L20 최소 폭 설정 반영 - - private void ApplyPanelState(bool collapsed) - { - _panelCollapsed = collapsed; - RightCol.Width = new GridLength(collapsed ? CollapsedPanelWidth : _panelExpandedWidth); - PanelBody.Visibility = collapsed ? Visibility.Collapsed : Visibility.Visible; - PanelTitle.Visibility = collapsed ? Visibility.Collapsed : Visibility.Visible; - PanelCountBadge.Visibility = collapsed ? Visibility.Collapsed : Visibility.Visible; - RightSplitter.Visibility = collapsed ? Visibility.Collapsed : Visibility.Visible; - // ←(펼치기) / →(접기) chevron. 접힘 시에도 토글 버튼은 헤더에 남아 클릭 가능. - PanelToggle.Content = collapsed ? "" : ""; - PanelToggle.ToolTip = collapsed ? "패널 펼치기" : "패널 접기"; - } - - private void PanelToggle_Click(object sender, RoutedEventArgs e) - { - // 접기 직전 폭을 기억(다시 펼칠 때 복원) - if (!_panelCollapsed) _panelExpandedWidth = ClampPanelWidth(RightCol.Width.Value); - ApplyPanelState(!_panelCollapsed); - PersistPanel(); - } - - private void RightSplitter_DragCompleted(object sender, DragCompletedEventArgs e) - { - if (_panelCollapsed) return; - double w = RightCol.Width.Value; - if (w <= 120) ApplyPanelState(true); // 너무 좁히면 접기 처리 - else _panelExpandedWidth = ClampPanelWidth(w); - PersistPanel(); - } - - private void PersistPanel() - { - _config.RightPanelCollapsed = _panelCollapsed; - _config.RightPanelWidth = _panelCollapsed ? _panelExpandedWidth : ClampPanelWidth(RightCol.Width.Value); - ConfigStore.Save(_config); - } - - private void OnWindowClosing(object? sender, System.ComponentModel.CancelEventArgs e) - { - // UC-K11: 다운로드 진행 중 종료 확인 - var activeDownloads = _manager.Items.Count(i => i.Status is "다운로드 중" or "병합 중" or "리먹스 중" or "대기") - + _pageDownloads.Items.Count(i => !i.IsFinished); - if (activeDownloads > 0 && !_forceClose) - { - e.Cancel = true; - var r = MessageBox.Show(this, - $"진행 중인 다운로드가 {activeDownloads}건 있습니다.\n그래도 종료하시겠습니까?", - "종료 확인", MessageBoxButton.YesNo, MessageBoxImage.Warning); - if (r != MessageBoxResult.Yes) return; - _forceClose = true; - Close(); - return; - } - - _config.RightPanelCollapsed = _panelCollapsed; - if (!_panelCollapsed) _config.RightPanelWidth = ClampPanelWidth(RightCol.Width.Value); - _config.CompactMode = _compactMode; // UC-L07 - if (_splitTab != null) - _config.SplitViewRatio = Math.Clamp(SplitCol.Width.Value / Math.Max(1, SplitCol.Width.Value + TabHost.ActualWidth), 0.1, 0.9); // UC-L10 - _config.FullScreen = _fullscreen; // UC-L26 - _config.WindowMaximized = WindowState == WindowState.Maximized; // UC-L12 - _config.WindowBounds = $"{Left},{Top},{Width},{Height}"; // UC-L11 - ConfigStore.Save(_config); - // T1-10 세션 저장: 탭 URL/활성/핀 보존 - try { if (_tabs != null) TabSessionStore.Save(SessionPath, _tabs.CaptureSession()); } catch { } - try { _playlist.Save(Path.Combine(AppDataDir, "playlist.json")); } catch { } // T2-10 - try { if (_remoteServer != null) _ = _remoteServer.DisposeAsync(); } catch { } // M0 - System.Net.NetworkInformation.NetworkChange.NetworkAvailabilityChanged -= OnNetworkAvailabilityChanged; // §J - try { Microsoft.Win32.SystemEvents.UserPreferenceChanged -= OnUserPreferenceChanged; } catch { } - } - - private bool _forceClose; - - /// UC-L11/L12/L26: 저장된 창 상태(위치·크기·최대화) 복원. - private void RestoreWindowBounds() - { - try - { - if (!string.IsNullOrWhiteSpace(_config.WindowBounds)) - { - var parts = _config.WindowBounds.Split(','); - if (parts.Length == 4 && - double.TryParse(parts[0], out var l) && double.TryParse(parts[1], out var t) && - double.TryParse(parts[2], out var w) && double.TryParse(parts[3], out var h)) - { - // 화면 밖 좌표(모니터 분리 후) 방어 — 보이는 가상 화면 범위로 클램프 - var bounds = SystemParameters.VirtualScreenLeft; - var boundsTop = SystemParameters.VirtualScreenTop; - var boundsW = SystemParameters.VirtualScreenWidth; - var boundsH = SystemParameters.VirtualScreenHeight; - if (l < bounds || t < boundsTop || l + w > bounds + boundsW || t + h > boundsTop + boundsH) - WindowStartupLocation = WindowStartupLocation.CenterScreen; - else { Left = l; Top = t; Width = Math.Max(600, w); Height = Math.Max(400, h); } - } - } - if (_config.WindowMaximized) WindowState = WindowState.Maximized; - } - catch { } - } - - /// UC-K10 판정: 팝업 중 하나라도 열려 있는가. - private bool AnyPopupOpen() => - BookmarksPopup.IsOpen || HistoryPopup.IsOpen || AddressPopup.IsOpen || NotesPopup.IsOpen || - ShieldPopup.IsOpen || DownloadsPopup.IsOpen || TabSearchPopup.IsOpen || PalettePopup.IsOpen || - PlaylistPopup.IsOpen || LinkPopup.IsOpen || LibraryPopup.IsOpen || ArchivePopup.IsOpen || - ShortcutHelpPopup.IsOpen || NotificationCenterPopup.IsOpen || TabVolumePopup.IsOpen; - - // ---- 개인정보 보호 모드 + 브라우저 데이터 관리 ---- - private void UpdatePrivateButton() - { - if (PrivateBtn == null) return; - try - { - PrivateBtn.Foreground = _config.PrivateMode - ? (Brush)FindResource("AccentBrush") - : (Brush)FindResource("TextSecondary"); - PrivateBtn.ToolTip = _config.PrivateMode - ? "개인정보 보호 모드 켜짐 — 클릭 시 일반 모드로 전환(재시작)" - : "개인정보 보호 모드(InPrivate)"; - } - catch { } - } - - // 토글 → 확인 → 플래그 저장 → 재시작(테마 전환과 동일 패턴) - private void TogglePrivate_Click(object sender, RoutedEventArgs e) - { - bool next = !_config.PrivateMode; - var msg = next - ? "개인정보 보호 모드(InPrivate)로 전환합니다.\n이 모드에서는 쿠키·세션·localStorage가 저장되지 않습니다.\n앱이 재시작되며 현재 페이지는 닫힙니다." - : "일반 모드로 전환합니다.\n앱이 재시작되며 현재 페이지는 닫힙니다."; - if (MessageBox.Show(msg + "\n\n계속할까요?", "브라우저 모드", MessageBoxButton.OKCancel, MessageBoxImage.Question) != MessageBoxResult.OK) - return; - _config.PrivateMode = next; - ConfigStore.Save(_config); - RestartApp(); - } - - /// 현재 프로필의 브라우저 데이터(쿠키·DOM 저장소·캐시) 삭제. 일반 모드: 영속 프로필 정리. - public async Task ClearBrowsingDataAsync() - { - var cv = Cv; - if (cv == null) { Log("브라우저가 아직 준비되지 않았습니다"); return; } - try - { - await cv.Profile.ClearBrowsingDataAsync(); - Log("브라우저 데이터(쿠키·localStorage·캐시)를 삭제했습니다. 페이지를 새로고침하세요."); - } - catch (Exception ex) { Log($"데이터 삭제 실패: {ex.Message}"); } - } - - // ---- 즐겨찾기 ---- - private void ToggleBookmarks(object sender, RoutedEventArgs e) - { - HistoryPopup.IsOpen = false; - LinkPopup.IsOpen = false; - BookmarksPopup.IsOpen = !BookmarksPopup.IsOpen; - } - - private void AddBookmark_Click(object sender, RoutedEventArgs e) - { - var cv = Cv; - var url = cv?.Source ?? ""; - if (string.IsNullOrEmpty(url) || url.StartsWith("about:", StringComparison.OrdinalIgnoreCase)) return; - if (_bookmarks.Any(b => b.Url == url)) { Log("이미 즐겨찾기에 있습니다"); return; } - var title = Trunc(string.IsNullOrWhiteSpace(cv!.DocumentTitle) ? url : cv.DocumentTitle, 80); - _bookmarks.Insert(0, new Bookmark(title, url)); - BrowserStore.SaveBookmarks(_bookmarks.ToList()); - if (BookmarkBar.Visibility == Visibility.Visible) RefreshBookmarkBar(); - Log($"즐겨찾기 추가: {title}"); - } - - private void RemoveBookmark_Click(object sender, RoutedEventArgs e) - { - if (sender is FrameworkElement fe && fe.DataContext is Bookmark b) - { - _bookmarks.Remove(b); - BrowserStore.SaveBookmarks(_bookmarks.ToList()); - } - } - - private void OpenBookmark_Click(object sender, RoutedEventArgs e) - { - if (sender is FrameworkElement fe && fe.DataContext is Bookmark b) - { - BookmarksPopup.IsOpen = false; - NavigateTo(b.Url); - } - } - - // ---- 히스토리 ---- - private void ToggleHistory(object sender, RoutedEventArgs e) - { - BookmarksPopup.IsOpen = false; - LinkPopup.IsOpen = false; - HistoryPopup.IsOpen = !HistoryPopup.IsOpen; - } - - private void OpenHistory_Click(object sender, RoutedEventArgs e) - { - if (sender is FrameworkElement fe && fe.DataContext is HistoryRow h) // UC-M20 묶음 뷰 행 - { - HistoryPopup.IsOpen = false; - NavigateTo(h.Url); - } - } - - private void ClearHistory_Click(object sender, RoutedEventArgs e) - { - _history.Clear(); - BrowserStore.SaveHistory(new List()); - Log("방문 기록을 삭제했습니다"); - } - - private void RecordHistory(string title, string url) - { - if (string.IsNullOrEmpty(url)) return; - if (_history.Count > 0 && _history[0].Url == url) return; - _history.Insert(0, new HistoryEntry(Trunc(title, 80), url, DateTime.Now)); - while (_history.Count > 500) _history.RemoveAt(_history.Count - 1); - BrowserStore.SaveHistory(_history.ToList()); - HistoryList.ItemsSource = GroupHistoryByDate(_history); // UC-M20 날짜 묶음 뷰 유지 - } - - // ---- T2-8 탭 검색 (Ctrl+Shift+A) ---- - private void ToggleTabSearch(object sender, RoutedEventArgs e) - { - var open = !TabSearchPopup.IsOpen; - TabSearchPopup.IsOpen = open; - if (open) - { - TabSearchBox.Clear(); - TabSearchBox.Focus(); - } - } - - private void TabSearchBox_TextChanged(object sender, TextChangedEventArgs e) - { - var results = TabSearchFilter.Search(_tabs.Tabs, _tabs.ClosedStack, TabSearchBox.Text); - TabSearchResults.ItemsSource = results; - TabSearchResults.SelectedIndex = results.Count > 0 ? 0 : -1; - } - - private void TabSearchBox_PreviewKeyDown(object sender, KeyEventArgs e) - { - if (e.Key == Key.Escape) { TabSearchPopup.IsOpen = false; e.Handled = true; } - else if (e.Key == Key.Down && TabSearchResults.HasItems) { TabSearchResults.SelectedIndex = Math.Min(TabSearchResults.SelectedIndex + 1, TabSearchResults.Items.Count - 1); e.Handled = true; } - else if (e.Key == Key.Up && TabSearchResults.HasItems) { TabSearchResults.SelectedIndex = Math.Max(TabSearchResults.SelectedIndex - 1, 0); e.Handled = true; } - else if (e.Key == Key.Enter) - { - if (TabSearchResults.SelectedItem is TabSearchResult sel) ActivateSearchResult(sel); - e.Handled = true; - } - } - - private void TabSearchResult_Click(object sender, MouseButtonEventArgs e) - { - if (TabSearchResults.SelectedItem is TabSearchResult sel) ActivateSearchResult(sel); - } - - private void ActivateSearchResult(TabSearchResult sel) - { - TabSearchPopup.IsOpen = false; - if (sel.IsClosed) - { - var reopened = _tabs.ReopenClosedTab(); - if (reopened == null) _tabs.NewTab(sel.Url); - } - else _tabs.Activate(sel.Tab); - } - - // ---- T1-6 북마크바 (Ctrl+Shift+B) ---- - private void ToggleBookmarkBar() - { - BookmarkBar.Visibility = BookmarkBar.Visibility == Visibility.Visible ? Visibility.Collapsed : Visibility.Visible; - if (BookmarkBar.Visibility == Visibility.Visible) RefreshBookmarkBar(); - } - - private void RefreshBookmarkBar() => BookmarkBarList.ItemsSource = _bookmarks.Take(30).ToList(); - - private void BookmarkBar_Click(object sender, RoutedEventArgs e) - { - if ((sender as FrameworkElement)?.DataContext is Bookmark b) NavigateTo(b.Url); - } - - // ---- T2-12 컨텍스트 메뉴 ---- - private void OnContextMenuBuild(CoreWebView2 cv, CoreWebView2ContextMenuRequestedEventArgs ce) - { - try - { - var menu = new ContextMenu(); - var target = ce.ContextMenuTarget; - - var link = target?.LinkUri; - if (!string.IsNullOrEmpty(link)) - { - var download = new MenuItem { Header = "링크 다운로드", FontWeight = FontWeights.Medium }; // UC-K20 - download.Click += (_, _) => QueueLinkForDownload(link); - menu.Items.Add(download); - - var copy = new MenuItem { Header = "링크 주소 복사" }; - copy.Click += (_, _) => { try { Clipboard.SetText(link); } catch { } }; - menu.Items.Add(copy); - menu.Items.Add(new Separator()); - } - - foreach (var builtin in ce.MenuItems) - { - if (builtin.Kind == CoreWebView2ContextMenuItemKind.Separator) - { - if (menu.Items.Count > 0 && menu.Items[^1] is not Separator) menu.Items.Add(new Separator()); - continue; - } - if (builtin.Kind != CoreWebView2ContextMenuItemKind.Command) continue; - var mi = new MenuItem { Header = builtin.Label, IsEnabled = builtin.IsEnabled }; - var commandId = builtin.CommandId; - mi.Click += (_, _) => - { - try { ce.SelectedCommandId = commandId; ce.Handled = true; } catch { } - }; - menu.Items.Add(mi); - } - while (menu.Items.Count > 0 && menu.Items[^1] is Separator) menu.Items.RemoveAt(menu.Items.Count - 1); - - var view = ActiveView; - if (view != null) - { - var pt = view.PointToScreen(new Point(ce.Location.X, ce.Location.Y)); - menu.PlacementTarget = view; - menu.Placement = System.Windows.Controls.Primitives.PlacementMode.AbsolutePoint; - menu.HorizontalOffset = pt.X; - menu.VerticalOffset = pt.Y; - } - menu.IsOpen = true; - } - catch { } - } - - private void QueueLinkForDownload(string? link) - { - if (string.IsNullOrEmpty(link)) return; - if (!Uri.TryCreate(link, UriKind.Absolute, out var uri)) return; - var referer = Cv?.Source ?? link; - - if (SocialSiteDetector.TryMatch(uri, out var normalized, out var label)) - { - _manager.LogPanel($"컨텍스트 메뉴 소셜 감지 [{label}]: {normalized}"); - _manager.OnDetected(new DetectionContext(normalized, normalized, MediaKind.Social, Tag: label)); - return; - } - var kind = MediaDetector.Classify(link, "", -1, _config) ?? MediaKind.Direct; - _manager.LogPanel($"컨텍스트 메뉴 감지 [{kind}]: {link}"); - _manager.OnDetected(new DetectionContext(link, referer, kind, "")); - } - - // ==================== Phase C 기능 ==================== - - // ---- T2-1 명령 팔레트 ---- - private void BuildPalette() - { - _palette.Register("새 탭", "tab new", () => NewTabWithDial()); - _palette.Register("새 InPrivate 탭", "private incognito 사생활", OpenInPrivateTab); - _palette.Register("탭 닫기", "close", () => { if (_tabs.ActiveTab != null) _tabs.CloseTab(_tabs.ActiveTab); }); - _palette.Register("닫은 탭 복원", "reopen restore", () => _tabs.ReopenClosedTab()); - _palette.Register("탭 검색", "tab search find", () => ToggleTabSearch(this, new RoutedEventArgs())); - _palette.Register("다운로드", "downloads page", () => DownloadsPopup.IsOpen = true); - _palette.Register("북마크바 토글", "bookmark bar", ToggleBookmarkBar); - _palette.Register("전체화면", "fullscreen f11", ToggleFullscreen); - _palette.Register("리더 모드", "reader reading 읽기", async () => await ToggleReader()); - _palette.Register("강제 다크 모드 토글", "dark boost theme", ToggleBoostDark); - _palette.Register("세로 탭 토글", "vertical layout", ToggleVerticalTabs); - _palette.Register("분할 화면 토글", "split zen tile", ToggleSplit); - _palette.Register("그림 속 그림 (PiP)", "pip picture video", TogglePip); - _palette.Register("스크린샷", "screenshot capture", async () => await TakeScreenshot()); - _palette.Register("소스 보기", "source html", ViewSource); - _palette.Register("인쇄", "print pdf", () => { try { Cv?.ShowPrintUI(); } catch { } }); - _palette.Register("저장 폴더 열기", "folder open output", () => OpenInExplorer(null)); - _palette.Register("이 페이지 즐겨찾기", "bookmark add star", () => AddBookmark_Click(this, new RoutedEventArgs())); - _palette.Register("미디어 재생목록", "playlist play media 음악 영상", () => { PlaylistPopup.IsOpen = true; }); - _palette.Register("재생목록 재생", "playlist play start", OpenPlayer); - _palette.Register("기기 연결 (QR 페어링)", "remote pair qr mobile phone", ShowPairing); - // ---- T3 잔여(데스크톱) ---- - _palette.Register("이 사이트 흑백", "grayscale filter page action 흑백", () => ApplyPageFilter(PageFilter.Grayscale)); // T3-6 - _palette.Register("이 사이트 세피아", "sepia filter page action 세피아", () => ApplyPageFilter(PageFilter.Sepia)); - _palette.Register("페이지 액션 끄기", "filter off reset", () => ApplyPageFilter(PageFilter.None)); - _palette.Register("노트 패널", "notes note 메모", ToggleNotes); // T3-12 - _palette.Register("노트: 현재 페이지 추가", "note add", () => NotesAddPage_Click(this, new RoutedEventArgs())); - _palette.Register("컴팩트 모드 토글", "compact chrome hide ui", ToggleCompactMode); // T3-13 - _palette.RegisterDynamic(() => _workspaces // T3-1: 사이트→워크스페이스 규칙 - .Select(w => new PaletteCommand($"라우팅 규칙: 이 사이트 → '{w.Name}'", "routing rule workspace", - () => AddRoutingRuleForCurrentSite(w.Name))).ToList()); - _palette.RegisterDynamic(() => _tabArchive.Search("") // T3-2: 아카이브 복구 - .Take(8) - .Select(a => new PaletteCommand($"아카이브에서 열기: {a.Title}", $"archive reopen {a.Url}", - () => { var t = _tabs.NewTab(); Cv2Navigate(t, a.Url); })).ToList()); - _palette.Register("원격 접근 켜기/끄기", "remote server toggle lan", async () => await ToggleRemoteAccess()); - _palette.RegisterSeparator(); - // ---- UI 복잡 버전 유즈케이스 명령(docs/UI_USECASES.md) ---- - _palette.Register("모두 일시정지", "pause all stop downloads 전체", PauseAllDownloads); // UC-K09 - _palette.Register("모두 재개", "resume all downloads 전체", ResumeAllDownloads); - _palette.Register("라이브러리", "library files 받은 파일", () => LibraryBtn_Click(this, new RoutedEventArgs())); // UC-M01 - _palette.Register("영역 캡처", "region capture screenshot 영역", async () => await RegionCapture()); // UC-K18 - _palette.Register("프로필 전환", "profile switch session 세션", SwitchProfile); // UC-K13 - _palette.Register("즐겨찾기 HTML 내보내기", "bookmark export html", () => ExportBookmarks()); // UC-M19 - _palette.Register("단축키 목록", "shortcut help keys", () => ShortcutHelpPopup.IsOpen = true); // UC-K04 - _palette.RegisterSeparator(); - _palette.RegisterDynamic(() => _tabs.Tabs - .Select(t => new PaletteCommand($"탭 전환: {Trunc(t.Title, 40)}", "tab go switch", () => _tabs.Activate(t))) - .ToList()); - _palette.RegisterDynamic(() => _workspaces - .Select(w => new PaletteCommand($"워크스페이스 전환: {w.Name}", "workspace switch", () => SwitchWorkspace(w))) - .ToList()); - } - - private void TogglePalette() - { - var open = !PalettePopup.IsOpen; - PalettePopup.IsOpen = open; - if (open) { PaletteBox.Clear(); PaletteBox.Focus(); } - } - - private void PaletteBox_TextChanged(object sender, TextChangedEventArgs e) - { - var results = _palette.Search(PaletteBox.Text); - PaletteResults.ItemsSource = results; - PaletteResults.SelectedIndex = results.Count > 0 ? 0 : -1; - } - - private void PaletteBox_PreviewKeyDown(object sender, KeyEventArgs e) - { - if (e.Key == Key.Escape) { PalettePopup.IsOpen = false; e.Handled = true; } - else if (e.Key == Key.Down && PaletteResults.HasItems) { PaletteResults.SelectedIndex = Math.Min(PaletteResults.SelectedIndex + 1, PaletteResults.Items.Count - 1); e.Handled = true; } - else if (e.Key == Key.Up && PaletteResults.HasItems) { PaletteResults.SelectedIndex = Math.Max(PaletteResults.SelectedIndex - 1, 0); e.Handled = true; } - else if (e.Key == Key.Enter) - { - if (PaletteResults.SelectedItem is PaletteCommand cmd) { PalettePopup.IsOpen = false; cmd.Execute(); } - e.Handled = true; - } - } - - private void PaletteResult_Click(object sender, MouseButtonEventArgs e) - { - if (PaletteResults.SelectedItem is PaletteCommand cmd) { PalettePopup.IsOpen = false; cmd.Execute(); } - } - - // ---- T2-4 리더 모드 ---- - private async Task ToggleReader() - { - var tab = _tabs.ActiveTab; - if (tab == null) return; - var result = await ReaderMode.ToggleAsync(tab, App.IsLightTheme); - if (result == null) Log("이 페이지에서는 리더 모드를 사용할 수 없습니다"); - } - - // ---- T2-7 부스트(강제 다크) ---- - private void ToggleBoostDark() - { - var url = Cv?.Source; - if (string.IsNullOrEmpty(url)) { Log("페이지가 없습니다"); return; } - var cur = _boostStore.Get(url); - _boostStore.Set(url, !cur.ForceDark, cur.CustomCss); - _views?.ApplyBoostNow(_tabs.ActiveTab!); - Log(!cur.ForceDark ? "이 사이트 강제 다크 켜짐" : "이 사이트 강제 다크 꺼짐"); - } - - // ---- T3-6 페이지 액션(흑백/세피아 — Boost 통합) ---- - internal void ApplyPageFilter(PageFilter filter) - { - var url = Cv?.Source; - if (string.IsNullOrEmpty(url)) { Log("페이지가 없습니다"); return; } - var cur = _boostStore.Get(url); - _boostStore.Set(url, cur.ForceDark, cur.CustomCss, filter); - _views?.ApplyBoostNow(_tabs.ActiveTab!); - Log(filter switch - { - PageFilter.Grayscale => "이 사이트 흑백 적용", - PageFilter.Sepia => "이 사이트 세피아 적용", - _ => "페이지 액션 해제", - }); - } - - // ---- T3-1 도메인 라우팅 규칙 ---- - private void AddRoutingRuleForCurrentSite(string workspaceName) - { - var url = Cv?.Source; - if (string.IsNullOrWhiteSpace(url) || !Uri.TryCreate(url, UriKind.Absolute, out var u)) - { Log("페이지가 없습니다"); return; } - var host = u.Host; - if (host.StartsWith("www.", StringComparison.OrdinalIgnoreCase)) host = host[4..]; - _routingRules.Add(host, workspaceName); - Log($"라우팅 규칙 추가: {host} → '{workspaceName}' (다음 이동부터 자동 전환)"); - } - - // ---- T3-2 아카이브 복구 보조 ---- - private static void Cv2Navigate(TabItem tab, string url) - { - try { tab.View?.CoreWebView2?.Navigate(url); } catch { } - } - - // ---- T3-12 노트 패널 ---- - internal void ToggleNotes() - { - RefreshNotesList(); - NotesPopup.IsOpen = true; - } - - private void RefreshNotesList() - { - NotesList.ItemsSource = _notes.List() - .Select(n => $"[{n.CreatedAt:MM-dd HH:mm}] {n.Title} — {n.Body}") - .ToList(); - NotesList.DisplayMemberPath = null; - } - - internal void NotesAddPage_Click(object sender, RoutedEventArgs e) - { - var url = Cv?.Source ?? ""; - var title = _tabs.ActiveTab?.Title ?? url; - _notes.Add(title, url); - Log("노트에 페이지 추가됨"); - RefreshNotesList(); - } - - private void NotesDelete_Click(object sender, RoutedEventArgs e) - { - var idx = NotesList.SelectedIndex; - var list = _notes.List(); - if (idx >= 0 && idx < list.Count) - { - _notes.Delete(list[idx].Id); - RefreshNotesList(); - } - } - - // ---- T3-13 컴팩트 모드(크롬 숨김 + 상단 엣지 호버 복원) ---- - internal void ToggleCompactMode() - { - _compactMode = !_compactMode; - _chromeRevealed = false; - ApplyChromeVisibility(); - Log(_compactMode ? "컴팩트 모드: 크롤 숨김 (상단 가장자리에 마우스를 올리면 복원)" : "컴팩트 모드 해제"); - } - - private void ApplyChromeVisibility() - { - var chromeRows = new[] { 0, 1, 2 }; // 툴바/북마크바/탭스트립 - foreach (var i in chromeRows) - MainGrid.RowDefinitions[i].Height = (_compactMode && !_chromeRevealed) ? new GridLength(0) : GridLength.Auto; - if (!_compactMode) _chromeRevealed = false; - } - - private System.Windows.Threading.DispatcherTimer? _edgeRevealTimer; - private bool _edgePending; - - protected override void OnPreviewMouseMove(System.Windows.Input.MouseEventArgs e) - { - if (_compactMode) - { - var p = e.GetPosition(this); - var wantReveal = p.Y <= 4; // 상단 엣지 4px - // UC-L24 EdgeRevealDelayMs: 엣지에 머무는 동안만 복원(순간 지나침 무시) - if (wantReveal && !_chromeRevealed && !_edgePending) - { - _edgePending = true; - _edgeRevealTimer ??= new System.Windows.Threading.DispatcherTimer(); - _edgeRevealTimer.Interval = TimeSpan.FromMilliseconds(Math.Max(0, _config.EdgeRevealDelayMs)); - _edgeRevealTimer.Tick -= EdgeRevealTick; - _edgeRevealTimer.Tick += EdgeRevealTick; - _edgeRevealTimer.Stop(); - _edgeRevealTimer.Start(); - } - else if (!wantReveal) - { - _edgePending = false; - _edgeRevealTimer?.Stop(); - if (_chromeRevealed && p.Y > 120) // 크롬 영역 벗어나면 다시 숨김 - { - _chromeRevealed = false; - ApplyChromeVisibility(); - } - } - } - base.OnPreviewMouseMove(e); - } - - private void EdgeRevealTick(object? sender, EventArgs e) - { - _edgeRevealTimer?.Stop(); - _edgePending = false; - if (!_chromeRevealed) - { - _chromeRevealed = true; - ApplyChromeVisibility(); - } - } - - // ---- T2-9 스크린샷 ---- - private async Task TakeScreenshot() - { - var cv = Cv; - if (cv == null) return; - try - { - using var ms = new MemoryStream(); - await cv.CapturePreviewAsync(CoreWebView2CapturePreviewImageFormat.Png, ms); - var path = MakeUniqueDownloadName(Path.GetFullPath(_config.OutputFolder), - $"screenshot_{DateTime.Now:yyyyMMdd_HHmmss}.png"); - await File.WriteAllBytesAsync(path, ms.ToArray()); - Log($"스크린샷 저장: {Path.GetFileName(path)}"); - } - catch (Exception ex) { Log($"스크린샷 실패: {ex.Message}"); } - } - - // ---- T2-5 세로 탭 ---- - private void ToggleVerticalTabs() - { - _verticalTabs = !_verticalTabs; - if (_verticalTabs) - { - TabStripRow.Visibility = Visibility.Collapsed; - SideStripCol.Width = new GridLength(210); - var sv = new ScrollViewer - { - VerticalScrollBarVisibility = ScrollBarVisibility.Auto, - HorizontalScrollBarVisibility = ScrollBarVisibility.Disabled, - Padding = new Thickness(4, 8, 4, 8) - }; - sv.Content = TabList; - TabSideHost.Child = sv; - SetTabListOrientation(Orientation.Vertical); - } - else - { - SetTabListOrientation(Orientation.Horizontal); - TabSideHost.Child = null; - // 원래 스트립의 DockPanel 로 복귀 (NewTabBtn 옆 ScrollViewer) - var sv = new ScrollViewer - { - HorizontalScrollBarVisibility = ScrollBarVisibility.Hidden, - VerticalScrollBarVisibility = ScrollBarVisibility.Disabled, - VerticalAlignment = VerticalAlignment.Bottom - }; - sv.Content = TabList; - // 기존 DockPanel: 스트립의 유일한 DockPanel - var dock = TabStripRow.Child as DockPanel; - dock?.Children.Add(sv); - SideStripCol.Width = new GridLength(0); - TabStripRow.Visibility = Visibility.Visible; - } - if (_fullscreen) TabStripRow.Visibility = Visibility.Collapsed; // 전체화면 유지 - } - - private void SetTabListOrientation(Orientation o) - { - var factory = new FrameworkElementFactory(typeof(StackPanel)); - factory.SetValue(StackPanel.OrientationProperty, o); - TabList.ItemsPanel = new ItemsPanelTemplate(factory); - } - - // ---- T2-3 분할 화면 (활성 + 다음 탭 나란히) ---- - private void ToggleSplit() - { - if (_splitTab != null) { ExitSplit(); return; } - var active = _tabs.ActiveTab; - if (active == null) return; - var next = _tabs.Tabs.FirstOrDefault(t => !ReferenceEquals(t, active)) ?? _tabs.NewTab(activate: false); - if (next.View?.Parent is Grid host) host.Children.Remove(next.View); - _splitTab = next; - SplitRightHost.Child = next.View; - next.View!.Visibility = Visibility.Visible; - var total = TabHost.ActualWidth == 0 ? 600 : TabHost.ActualWidth; - var ratio = _config.SplitViewRatio is > 0.1 and < 0.9 ? _config.SplitViewRatio : 0.5; // UC-L10 복원 - SplitCol.Width = new GridLength(Math.Max(280, total * ratio)); - SplitRightHost.Visibility = Visibility.Visible; - SplitSplitter.Visibility = Visibility.Visible; - Log($"분할 화면: {Trunc(next.Title, 30)}"); - } - - private void ExitSplit() - { - if (_splitTab?.View != null) - { - SplitRightHost.Child = null; - TabHost.Children.Add(_splitTab.View); - _splitTab.View.Visibility = ReferenceEquals(_splitTab, _tabs.ActiveTab) ? Visibility.Visible : Visibility.Collapsed; - } - _splitTab = null; - SplitCol.Width = new GridLength(0); - SplitRightHost.Visibility = Visibility.Collapsed; - SplitSplitter.Visibility = Visibility.Collapsed; - } - - // ---- T2-6 Glance (Alt+클릭 링크 미리보기) ---- - private void OpenGlance(string url) - { - try - { - var glance = new GlanceWindow(_env!, _config, url) - { - Owner = this, - ShowInTaskbar = false, - WindowStyle = WindowStyle.None, - AllowsTransparency = false, - Background = System.Windows.Media.Brushes.Black - }; - glance.ExpandRequested += g => - { - g.Close(); - _tabs.NewTab(g.Url); // 탭으로 승격 - }; - glance.Show(); - } - catch (Exception ex) { Log($"미리보기 실패: {ex.Message}"); } - } - - // ---- T3-9 낭독(TTS) ---- - private void SpeakText(string text) - { - try - { - _speech?.Dispose(); - _speech = new System.Speech.Synthesis.SpeechSynthesizer(); - if (text.Length > 4000) text = text[..4000]; - _speech.SpeakAsync(text); - } - catch { } - } - - // ---- T3-3 InPrivate 탭 ---- - private void OpenInPrivateTab() - { - _views!.NextTabIsPrivate = true; - var t = _tabs.NewTab(); - t.Title = "InPrivate 탭"; - Log("InPrivate 탭 열림 — 이 탭은 디스크에 저장되지 않습니다"); - } - - // ---- T3-10 소스 보기 ---- - private async void ViewSource() - { - var cv = Cv; - if (cv == null) return; - try - { - var html = await cv.ExecuteScriptAsync("document.documentElement.outerHTML"); - var decoded = System.Text.Json.JsonSerializer.Deserialize(html) ?? ""; - var wrapped = "" - + System.Net.WebUtility.HtmlEncode(decoded) + ""; - cv.NavigateToString(wrapped); - } - catch { } - } - - // ---- T3-7 PiP ---- - private void TogglePip() - { - var cv = Cv; - if (cv == null) return; - _ = cv.ExecuteScriptAsync(""" -(function(){ try { - var v = Array.from(document.querySelectorAll('video')).find(x => !x.paused && !x.disabled) || document.querySelector('video'); - if (!v) { return 'NO_VIDEO'; } - if (document.pictureInPictureElement) { document.exitPictureInPicture(); return 'EXITED'; } - v.disablePictureInPicture = false; - v.requestPictureInPicture(); return 'PIP'; -} catch(e){ return 'ERR:'+e.message; } })(); -"""); - Log("그림 속 그림 전환 (재생 중인 영상이 없으면 첫 번째 영상)"); - } - - // ---- T3-6 새 탭 스피드 다이얼 ---- - private void NewTabWithDial() - { - var tab = _tabs.NewTab(); - _ = ShowDialAsync(tab); - } - - private async Task ShowDialAsync(TabItem tab) - { - await WaitTabReadyLocal(tab); - var cv = tab.Core; - if (cv == null) return; - // UC-F18: 폰트 하드코딩 대신 앱 폰트 스택 주입(App.ApplyFontSettings 가 관리) - var fontStack = (FontFamily)Application.Current.FindResource("UiFont"); - var fontCss = string.Join(",", fontStack.Source.Split(',').Select(f => $"'{f.Trim()}'")); - var tiles = _bookmarks.Take(18).Select(b => - $"
🌐
{System.Net.WebUtility.HtmlEncode(b.Title)}
").ToList(); - var dial = "

새 탭

" + string.Join("", tiles) + $"
주소창에 검색어나 URL 을 입력하세요 · 즐겨찾기 {_bookmarks.Count}개 중 {tiles.Count}개 표시
"; - cv.NavigateToString(dial); - } - - private async Task WaitTabReadyLocal(TabItem tab) - { - var sw = System.Diagnostics.Stopwatch.StartNew(); - while (tab.Core == null && sw.ElapsedMilliseconds < 15000) - await Task.Delay(50); - } - - // ---- T2-11/T3-1 탭 컨텍스트 메뉴 + 워크스페이스 ---- - // UC-B17: 그룹 색 팔레트를 테마 리소스(Shared.xaml GroupPalette)에서 가져온다. - private string[] GroupColors => (TryFindResource("GroupPalette") as Array)? - .OfType().Select(b => $"#{b.Color.R:X2}{b.Color.G:X2}{b.Color.B:X2}").ToArray() - ?? Array.Empty(); - - private void Tab_ContextMenu(object sender, MouseButtonEventArgs e) - { - if ((sender as FrameworkElement)?.DataContext is not TabItem tab) return; - e.Handled = true; - var menu = new ContextMenu(); - - var pin = new MenuItem { Header = tab.IsPinned ? "고정 해제" : "탭 고정" }; - pin.Click += (_, _) => _tabs.SetPinned(tab, !tab.IsPinned); - menu.Items.Add(pin); - - var dup = new MenuItem { Header = "탭 복제" }; - dup.Click += (_, _) => _tabs.NewTab(tab.Url); - menu.Items.Add(dup); - - var mute = new MenuItem { Header = tab.Core is { IsMuted: true } ? "음소거 해제" : "사이트 음소거" }; - mute.Click += (_, _) => { try { if (tab.Core != null) { tab.Core.IsMuted = !(tab.Core?.IsMuted == true); tab.IsMuted = tab.Core.IsMuted; } } catch { } }; - menu.Items.Add(mute); - - // UC-B23 탭 볼륨 - var volume = new MenuItem { Header = "볼륨 조절" }; - volume.Click += (_, _) => OpenTabVolume(tab); - menu.Items.Add(volume); - - menu.Items.Add(new Separator()); - - // UC-B01 탭 잠금 - var lockItem = new MenuItem { Header = tab.IsLocked ? "잠금 해제" : "탭 잠금(닫기 방지)" }; - lockItem.Click += (_, _) => { tab.IsLocked = !tab.IsLocked; Log(tab.IsLocked ? "탭을 잠갔습니다" : "탭 잠금을 해제했습니다"); }; - menu.Items.Add(lockItem); - - // UC-B02 사용자 지정 탭 색 - var color = new MenuItem { Header = "탭 색상" }; - var noColor = new MenuItem { Header = "색 없음" }; - noColor.Click += (_, _) => tab.CustomColor = null; - color.Items.Add(noColor); - foreach (var c in GroupColors) - { - var mi = new MenuItem { Header = c }; - var swatch = new System.Windows.Shapes.Ellipse { Width = 10, Height = 10 }; - swatch.Fill = new SolidColorBrush((Color)ColorConverter.ConvertFromString(c)); - mi.Icon = swatch; - mi.Click += (_, _) => tab.CustomColor = c; - color.Items.Add(mi); - } - menu.Items.Add(color); - - var group = new MenuItem { Header = "그룹" }; - var noGroup = new MenuItem { Header = "그룹 없음" }; - noGroup.Click += (_, _) => _tabs.SetGroup(tab, null, null); - group.Items.Add(noGroup); - for (var i = 0; i < GroupColors.Length; i++) - { - var c = GroupColors[i]; - var mi = new MenuItem { Header = $"그룹 {i + 1}" }; - var sw = new System.Windows.Shapes.Ellipse { Width = 10, Height = 10 }; - sw.Fill = new SolidColorBrush((Color)ColorConverter.ConvertFromString(c)); - mi.Icon = sw; - mi.Click += (_, _) => _tabs.SetGroup(tab, $"G{i + 1}", c); - group.Items.Add(mi); - } - menu.Items.Add(group); - - if (tab.GroupName != null) - { - var rename = new MenuItem { Header = $"그룹 이름 바꾸기 ({tab.GroupName})" }; // UC-B04 - rename.Click += (_, _) => - { - var name = Prompt("그룹 이름 바꾸기", "새 그룹 이름", tab.GroupName!); - if (name != null && _tabs.RenameGroup(tab.GroupName!, name.Trim())) - Log($"그룹 이름 변경: {name.Trim()}"); - }; - menu.Items.Add(rename); - - var collapse = new MenuItem { Header = tab.IsGroupCollapsed ? "그룹 펼치기" : "그룹 접기" }; // UC-B03 - collapse.Click += (_, _) => _tabs.ToggleGroupCollapsed(tab.GroupName!); - menu.Items.Add(collapse); - - var closeG = new MenuItem { Header = $"그룹 전체 닫기 ({tab.GroupName})" }; - closeG.Click += (_, _) => - { - var n = _tabs.Tabs.Count(t => t.GroupName == tab.GroupName && !t.IsLocked); - // UC-B09 다중 닫기 확인 - if (_config.ConfirmCloseMultipleTabs && n > 1 && - MessageBox.Show(this, $"그룹 탭 {n}개를 닫을까요?", "탭 닫기", MessageBoxButton.OKCancel) != MessageBoxResult.OK) - return; - _tabs.CloseGroup(tab.GroupName!); - }; - menu.Items.Add(closeG); - - var bmG = new MenuItem { Header = "그룹 즐겨찾기에 저장" }; // UC-B24 - bmG.Click += (_, _) => BookmarkGroup(tab.GroupName); - menu.Items.Add(bmG); - } - - menu.Items.Add(new Separator()); - var close = new MenuItem { Header = "탭 닫기" }; - close.Click += (_, _) => - { - if (!_tabs.CloseTab(tab)) Log("잠긴 탭은 닫을 수 없습니다 (탭 잠금 해제 후 시도)"); // UC-B01 - }; - menu.Items.Add(close); - - menu.PlacementTarget = sender as UIElement; - menu.IsOpen = true; - } - - private void SaveWorkspace(string name) - { - _workspaces.RemoveAll(w => w.Name == name); - _workspaces.Insert(0, _tabs.CaptureWorkspace(name)); - if (_workspaces.Count > 6) _workspaces.RemoveAt(_workspaces.Count - 1); - try - { - Directory.CreateDirectory(AppDataDir); - File.WriteAllText(Path.Combine(AppDataDir, "workspaces.json"), - System.Text.Json.JsonSerializer.Serialize(_workspaces)); - } - catch { } - Log($"워크스페이스 '{name}' 저장 ({_tabs.Tabs.Count} 탭)"); - } - - private void SwitchWorkspace(WorkspaceSnapshot ws) - { - ExitSplit(); - _tabs.SwitchWorkspace(ws); - _currentWorkspaceName = ws.Name; // T3-1 라우팅 기준 - Log($"워크스페이스 '{ws.Name}' 전환 ({ws.Urls.Count} 탭)"); - } - - // ---- M0 원격 접근(모바일 연동) ---- - private async Task ToggleRemoteAccess() - { - if (_remoteServer != null) - { - await _remoteServer.DisposeAsync(); - _remoteServer = null; - _config.RemoteAccessEnabled = false; - ConfigStore.Save(_config); - Log("원격 접근을 껐습니다"); - UpdateServerStatusIcon(); // §J 서버 상태 아이콘 - return; - } - - var token = _config.RemoteAccessToken; - if (string.IsNullOrEmpty(token)) - { - token = Convert.ToBase64String(System.Security.Cryptography.RandomNumberGenerator.GetBytes(24)) - .TrimEnd('=').Replace('+', '-').Replace('/', '_'); - _config.RemoteAccessToken = token; - } - _config.RemoteAccessEnabled = true; - ConfigStore.Save(_config); - - try - { - _remoteServer = await Server.ServerHost.StartAsync(new Server.ServerOptions - { - Port = 0, - Token = token, - LibraryFolder = Path.GetFullPath(_config.OutputFolder), - Queue = new Services.DownloadQueueAdapter(_manager, Dispatcher), - EnableMdns = true, // MOBILE_PLAN §3: _videodl._tcp 발견 보조 (실패해도 서버는 뜬다) - }); - Log($"원격 접근 켜짐 — 포트 {_remoteServer.Port}"); - UpdateServerStatusIcon(); // §J 서버 상태 아이콘 - var pair = new Browser.PairingWindow(_remoteServer, Environment.MachineName) { Owner = this }; - pair.Show(); - } - catch (Exception ex) - { - _remoteServer = null; - Log($"원격 접근 시작 실패(방화벽 확인): {ex.Message}"); - } - } - - private async void ShowPairing() - { - if (_remoteServer == null) { await ToggleRemoteAccess(); return; } - var pair = new Browser.PairingWindow(_remoteServer, Environment.MachineName) { Owner = this }; - pair.Show(); - } - - // ---- T2-10 미디어 재생목록 ---- - private void AddToPlaylist(string url, string title, string kind, string? referer) - { - _playlist.Add(new MediaTrack(url, Trunc(title, 70), kind, DateTime.UtcNow, Referer: referer)); - try { _playlist.Save(Path.Combine(AppDataDir, "playlist.json")); } catch { } - PlaylistEmptyHint.Visibility = _playlist.Tracks.Count == 0 ? Visibility.Visible : Visibility.Collapsed; - } - - private static string GuessTitle(string url) - { - try - { - var name = Path.GetFileName(new Uri(url).AbsolutePath); - return string.IsNullOrWhiteSpace(name) ? url : Uri.UnescapeDataString(name); - } - catch { return url; } - } - - private void TogglePlaylistPanel(object sender, RoutedEventArgs e) - { - PlaylistPopup.IsOpen = !PlaylistPopup.IsOpen; - } - - private void PlaylistPlay_Click(object sender, RoutedEventArgs e) - { - if ((sender as FrameworkElement)?.DataContext is MediaTrack t) - { - _playlist.CurrentIndex = _playlist.Tracks.IndexOf(t); - OpenPlayer(); - } - } - - private void PlaylistRemove_Click(object sender, RoutedEventArgs e) - { - if ((sender as FrameworkElement)?.DataContext is MediaTrack t) _playlist.Remove(t); - } - - private void PlaylistClear_Click(object sender, RoutedEventArgs e) => _playlist.Clear(); - - private void PlaylistPlayAll_Click(object sender, RoutedEventArgs e) => OpenPlayer(); - - private void OpenPlayer() - { - if (_player == null || _player.IsLoaded == false) - { - _player = new PlayerWindow(_env!, _config, _playlist) { Owner = this }; - _player.Closed += (_, _) => _player = null; - _player.Show(); - } - else { _player.Activate(); _player.PlayCurrent(); } - } - - // ---- 카드 액션 ---- - private void CardDownload_Click(object sender, RoutedEventArgs e) - { - if (sender is FrameworkElement fe && fe.DataContext is DownloadItemViewModel it) - { - if (!ConfirmDuplicateDownload(it)) return; // UC-D25 중복 확인 - _ = _manager.StartDownload(it); - } - } - - // 소셜 카드: yt-dlp -J 로 사용 가능한 화질 조회 → 드롭다운 교체 - private void CardFetchFormats_Click(object sender, RoutedEventArgs e) - { - if (sender is FrameworkElement fe && fe.DataContext is DownloadItemViewModel it) - _ = _manager.FetchFormatsAsync(it); - } - - private void CardRetry_Click(object sender, RoutedEventArgs e) - { - if (sender is FrameworkElement fe && fe.DataContext is DownloadItemViewModel it) - _ = _manager.RetryDownload(it); - } - - // #1 다운로드 취소 - private void CardCancel_Click(object sender, RoutedEventArgs e) - { - if (sender is FrameworkElement fe && fe.DataContext is DownloadItemViewModel it) - { - _manager.Cancel(it); - Log($"취소 요청: {it.Title}"); - } - } - - private void CardFolder_Click(object sender, RoutedEventArgs e) - { - if (sender is FrameworkElement fe && fe.DataContext is DownloadItemViewModel it) - OpenInExplorer(it.OutputPath); - } - - private void OpenFolder_Click(object sender, RoutedEventArgs e) => OpenInExplorer(null); - - // #3 explorer 인자 인젝션 방지: 경로 정규화 + 존재 검증 + ArgumentList/UseShellExecute - private void OpenInExplorer(string? selectFile) - { - try - { - var folder = Path.GetFullPath(_config.OutputFolder); - if (!Directory.Exists(folder)) return; - if (!string.IsNullOrEmpty(selectFile) && File.Exists(selectFile)) - { - var psi = new System.Diagnostics.ProcessStartInfo("explorer.exe") { UseShellExecute = false }; - psi.ArgumentList.Add($"/select,{selectFile}"); - System.Diagnostics.Process.Start(psi); - } - else - { - System.Diagnostics.Process.Start(new System.Diagnostics.ProcessStartInfo - { - FileName = folder, - UseShellExecute = true, - }); - } - } - catch { } - } - - private void Settings_Click(object sender, RoutedEventArgs e) - { - var w = new SettingsWindow(_config, ClearBrowsingDataAsync) { Owner = this }; - if (w.ShowDialog() == true) - { - _config = w.Config; - ConfigStore.Save(_config); - _resolver = new SearchEngineResolver(_config.SearchEngine); // T1-4 즉시 반영 - _manager.UpdateMaxConcurrent(_config.MaxConcurrentDownloads); // #19 런타임 반영 - ApplyTheme(_config.Theme); // §A 라이브 테마(재시작 없음) - UpdateShortcutHelp(); // §H 단축키 재배치 반영 - } - } - - /// 테마 변경은 리소스를 DynamicResource 로 물려 런타임 전환이 가능해졌다(UC-T04). - /// 프록시·프로필 등 재시작이 필요한 변경은 설정창의 RestartBanner 가 안내한다. - internal static void RestartApp() - { - var exe = Environment.ProcessPath; - if (!string.IsNullOrEmpty(exe)) - System.Diagnostics.Process.Start(exe); - Application.Current.Shutdown(); - } - - private static string Trunc(string s, int n) => string.IsNullOrEmpty(s) ? "" : (s.Length <= n ? s : s[..n] + "…"); - // ==================== UI 유즈케이스 핸들러(소스 계약상 MainWindow.xaml.cs 배치) ==================== - - private void OnUserPreferenceChanged(object? sender, UserPreferenceChangedEventArgs e) - { - if (e.Category != UserPreferenceCategory.General) return; - Dispatcher.BeginInvoke(new Action(() => - { - // 고대비 켜/끄 → 설정 테마 무시하고 즉시 따라감(UC-A04) - if (SystemParameters.HighContrast && App.CurrentTheme != "highcontrast") ApplyTheme("highcontrast"); - else if (!SystemParameters.HighContrast && App.CurrentTheme == "highcontrast") ApplyTheme(_config.Theme); - })); - } - - private void CopyStatus_Click(object sender, MouseButtonEventArgs e) - { - try { Clipboard.SetText(StatusText.Text); _toast?.Show("상태 메시지를 복사했습니다", "info"); } catch { } - } - - /// UC-K19 노트 편집 내용 저장. - private void NotesSave_Click(object sender, RoutedEventArgs e) - { - _notes.Save(); - _toast?.Show("노트를 저장했습니다", "success"); - } - - /// UC-M17 즐겨찾기 편집(이름·URL). - private void EditBookmark_Click(object sender, RoutedEventArgs e) - { - if ((sender as FrameworkElement)?.DataContext is not Bookmark b) return; - var title = Prompt("즐겨찾기 편집", "이름", b.Title); - if (title == null) return; - var url = Prompt("즐겨찾기 편집", "URL", b.Url); - if (url == null) return; - var idx = _bookmarks.IndexOf(b); - if (idx >= 0) _bookmarks[idx] = new Bookmark(title.Trim(), url.Trim(), b.Folder); - BrowserStore.SaveBookmarks(_bookmarks.ToList()); - RefreshBookmarkBar(); - } - - /// UC-M16 즐겨찾기 폴더로 정리 — 항목을 지정 폴더로 이동. - private void BookmarkFolder_Click(object sender, RoutedEventArgs e) - { - if ((sender as FrameworkElement)?.DataContext is not Bookmark b) return; - var folder = Prompt("폴더 지정", "폴더 이름(비우면 최상위)", b.Folder ?? ""); - if (folder == null) return; - var idx = _bookmarks.IndexOf(b); - if (idx >= 0) _bookmarks[idx] = new Bookmark(b.Title, b.Url, string.IsNullOrWhiteSpace(folder) ? null : folder.Trim()); - BrowserStore.SaveBookmarks(_bookmarks.ToList()); - _toast?.Show($"'{Trunc(b.Title, 24)}' 를 '{(string.IsNullOrWhiteSpace(folder) ? "최상위" : folder.Trim())}' 로 이동", "info"); - } - - private void LibraryPlay_Click(object sender, RoutedEventArgs e) - { - if ((sender as FrameworkElement)?.DataContext is LibraryEntry entry) PlayLibraryEntry(entry); - } - - /// UC-M8 삭제(휴지통 아님 — 확인 후 영구 삭제). - private void LibraryDelete_Click(object sender, RoutedEventArgs e) - { - if ((sender as FrameworkElement)?.DataContext is not LibraryEntry entry) return; - if (MessageBox.Show(this, $"'{entry.Name}' 파일을 삭제할까요?", "라이브러리", - MessageBoxButton.OKCancel, MessageBoxImage.Warning) != MessageBoxResult.OK) return; - try { File.Delete(entry.Path); } catch (Exception ex) { Log($"삭제 실패: {ex.Message}"); } - RefreshLibrary(); - } - - /// UC-M9 포함 폴더 열기(파일 선택 상태). - private void LibraryOpenFolder_Click(object sender, RoutedEventArgs e) - { - if ((sender as FrameworkElement)?.DataContext is LibraryEntry entry) OpenInExplorer(entry.Path); - } - - /// UC-M13 재생목록 파일 내보내기(M3U). - private void PlaylistExport_Click(object sender, RoutedEventArgs e) - { - var dlg = new SaveFileDialog { Filter = "M3U 재생목록|*.m3u", FileName = "playlist.m3u" }; - if (dlg.ShowDialog() != true) return; - var sb = new System.Text.StringBuilder("#EXTM3U\n"); - foreach (var t in _playlist.Tracks) - sb.AppendLine($"#EXTINF:-1,{t.Title}\n{t.Url}"); - File.WriteAllText(dlg.FileName, sb.ToString()); - } - - /// UC-A09: 메인 창 자동화 피어 — 창 이름에 현재 상태 메시지를 노출해 낭독기가 상태를 읽게 한다. - protected override AutomationPeer OnCreateAutomationPeer() - => new MainWindowAutomationPeer(this); - - private sealed class MainWindowAutomationPeer : WindowAutomationPeer - { - public MainWindowAutomationPeer(Window owner) : base(owner) { } - - protected override string GetNameCore() => "MediaBrowser 메인 창"; - } - -} diff --git a/VideoDownloader.App/Services/TabViewService.cs b/VideoDownloader.App/Services/TabViewService.cs deleted file mode 100644 index 48e5a16..0000000 --- a/VideoDownloader.App/Services/TabViewService.cs +++ /dev/null @@ -1,314 +0,0 @@ -using System.Windows; -using System.Windows.Controls; -using System.Windows.Threading; -using Microsoft.Web.WebView2.Core; -using VideoDownloader.Browser; -using VideoDownloader.Browser.Tabs; -using VideoDownloader.Core.Config; -using Wv2 = Microsoft.Web.WebView2.Wpf; -using TabItem = VideoDownloader.Browser.Tabs.TabItem; - -namespace VideoDownloader.App.Services; - -/// -/// 탭별 WebView2 생명주기·이벤트 배선 전담(재구성 ④ — MainWindow 갓-클래스 해체). -/// 일반 브라우저 동작(제목/URL/로딩/오디오/검색세션/줌 적용/초기 탐색/뉴윈도우→탭)은 -/// 이 서비스가, 앱 고유 기능(미디어 감지/다운로드 라우팅/소셜/기록/주소창 반영)은 -/// 이벤트 훅으로 호스트(MainWindow)가 주입한다. -/// -public sealed class TabViewService -{ - private readonly CoreWebView2Environment _env; - private readonly AppConfig _config; - private readonly Panel _host; - private readonly SiteZoomStore _zoomStore; - private readonly Dispatcher _dispatcher; - private readonly Dictionary _init = new(); - - /// 뉴윈도우(팝업) 요청 시 새 탭을 만들어 반환하는 공급자(호스트가 TabManager 에 연결). - public Func>? NewTabProvider { get; set; } - - /// 탭 CoreWebView2 초기화 완료(호스트가 감지 등 탭별 구독 부착). - public event Action? TabCoreReady; - - /// 페이지 내 a[download] 등 다운로드 시작(호스트가 저장 폴더로 라우팅). - public event Action? DownloadStarting; - - /// URL 확정(SourceChanged). 인자: (탭, url). - public event Action? UrlChanged; - - /// 문서 타이틀 확정(DocumentTitleChanged). 인자: (탭, title). - public event Action? TitleChanged; - - /// 탭 뒤로/앞으로 가능 상태 변화(네비 버튼 갱신용). - public event Action? HistoryChanged; - - /// 우클릭 메뉴 요청 — 호스트가 WPF ContextMenu 로 재구성해 표시(Handled=true). - public event Action? ContextMenuBuild; - - /// T2-7 부스트: URL → 주입할 JS(강제 다크/커스텀 CSS). 빈 문자열이면 미적용. - public Func? BoostScriptProvider { get; set; } - - /// T2-6 Glance: Alt+클릭한 링크 URL 요청. - public event Action? GlanceRequested; - - /// T2-4 리더 내 낭독(TTS) 요청 — 리더 본문 텍스트. - public event Action? SpeakRequested; - - /// T3-15 주소창 진행 바: 네비게이션 시작(전 탭 집계). - public event Action? NavigationStarted; - - /// T3-15 주소창 진행 바: 네비게이션 완료(전 탭 집계). - public event Action? NavigationCompleted; - - /// T3-11 사이트별 권한 정책(출처×종류 기억). - public PermissionGate Permissions { get; set; } = new(); - - /// T3-11 Ask 판정 시 호스트 다이얼로그 — State/Handled/SavesInProfile 설정은 호스트 책임. - public event Action? PermissionPrompt; - - /// T3-14 추적 방지 블랙리스트(교체 주입 가능). - public TrackerBlocklist TrackerBlocklist { get; set; } = new(); - - /// T3-14 차단 카운터(실드 배지·팝업 데이터). - public TrackerCounter TrackerCounter { get; } = new(); - - /// T3-14 차단 발생 알림(배지 갱신). - public event Action? TrackerBlocked; - - /// T3-3 InPrivate 탭: 다음에 만들어지는 탭에 적용(1회성). - public bool NextTabIsPrivate { get; set; } - - public TabViewService(CoreWebView2Environment env, AppConfig config, Panel host, - SiteZoomStore zoomStore, Dispatcher dispatcher) - { - _env = env; - _config = config; - _host = host; - _zoomStore = zoomStore; - _dispatcher = dispatcher; - } - - public TabItem CreateTabItem() => new(); - - /// 탭에 WebView2 뷰를 붙이고 비동기 초기화를 시작한다. (UI 스레드) - public void AttachView(TabItem tab) - { - var view = new Wv2.WebView2 { DefaultBackgroundColor = System.Drawing.Color.Black }; - tab.View = view; - _host.Children.Add(view); - view.Visibility = tab.IsActive ? Visibility.Visible : Visibility.Collapsed; - _init[tab] = InitCoreAsync(tab); - } - - /// 부스트 즉시 재적용(토글 직후). 비동기 fire-and-forget. - public void ApplyBoostNow(TabItem tab) - { - var cv = tab.Core; - if (cv == null) return; - var js = BoostScriptProvider?.Invoke(cv.Source) ?? ""; - if (js.Length > 0 && !tab.IsReader) _ = cv.ExecuteScriptAsync(js); - else if (js.Length == 0) _ = cv.ExecuteScriptAsync("(function(){try{document.getElementById('vd-boost')?.remove();}catch(e){}})();"); - } - - /// 탭의 CoreWebView2 초기화 완료 대기 (뉴윈도우 deferral 용). - public async Task WaitTabReady(TabItem tab) - { - if (tab.Core != null) return; - if (_init.TryGetValue(tab, out var t)) { try { await t; } catch { } return; } - var sw = System.Diagnostics.Stopwatch.StartNew(); - while (tab.Core == null && sw.ElapsedMilliseconds < 15000) - await Task.Delay(50); - } - - /// 탭 제거 시 뷰를 호스트에서 떼고 재오픈 가능 상태로(null) 만든다. - public void RemoveView(TabItem tab) - { - if (tab.View != null) - { - _host.Children.Remove(tab.View); - tab.View = null; // 재오픈 시 새 뷰로 재생성(ReopenClosedTab → AttachView) - } - _init.Remove(tab); - } - - private async Task InitCoreAsync(TabItem tab) - { - try - { - var options = _env.CreateCoreWebView2ControllerOptions(); - if (_config.PrivateMode || tab.IsPrivate || NextTabIsPrivate) options.IsInPrivateModeEnabled = true; // InPrivate: 디스크에 아무것도 저장 안 함 - if (!tab.IsPrivate && NextTabIsPrivate) tab.IsPrivate = true; - NextTabIsPrivate = false; - await tab.View!.EnsureCoreWebView2Async(_env, options); - } - catch (Exception) - { - return; // 초기화 실패 탭 — 호스트가 로그 표시는 TitleChanged 로 알림 없이 둔다(기존 동작) - } - - var cv = tab.Core!; - cv.Settings.AreDevToolsEnabled = true; - - // T2-6 Glance: Alt+클릭 → 링크를 postMessage 로 전달 (캡처 단계에서 preventDefault) - const string glanceScript = """ -(function(){ try { document.addEventListener('click', function(e){ - if (e.altKey) { var a = e.target && e.target.closest ? e.target.closest('a') : null; - if (a && a.href) { e.preventDefault(); e.stopPropagation(); window.chrome.webview.postMessage({ vdGlance: a.href }); } } -}, true); } catch(err){} })(); -"""; - try { await cv.AddScriptToExecuteOnDocumentCreatedAsync(glanceScript); } catch { } - - // WebMessage 라우팅 (Glance / 리더 낭독) - try - { - cv.WebMessageReceived += (_, we) => - { - try - { - var msg = we.WebMessageAsJson; - if (string.IsNullOrEmpty(msg)) return; - using var doc = System.Text.Json.JsonDocument.Parse(msg); - if (doc.RootElement.TryGetProperty("vdGlance", out var g) && g.ValueKind == System.Text.Json.JsonValueKind.String) - GlanceRequested?.Invoke(cv, g.GetString() ?? ""); - if (doc.RootElement.TryGetProperty("vdSpeak", out var sp) && sp.ValueKind == System.Text.Json.JsonValueKind.String) - SpeakRequested?.Invoke(cv, sp.GetString() ?? ""); - } - catch { } - }; - } - catch { } - - // 탭별 검색 세션 (네이티브 Find API) - tab.FindSession = new FindSession(new WebView2FindApi(cv, _env)); - tab.FindSession.StateChanged += () => _dispatcher.BeginInvoke(new Action(() => - { - if (tab.IsActive && tab.FindSession != null) FindStateChanged?.Invoke(tab); - })); - - // 네비게이션 상태 - cv.NavigationStarting += (_, _) => _dispatcher.BeginInvoke(new Action(() => { tab.IsLoading = true; NavigationStarted?.Invoke(); })); - cv.NavigationCompleted += (_, _) => _dispatcher.BeginInvoke(new Action(() => - { - tab.IsLoading = false; - NavigationCompleted?.Invoke(); - try { if (tab.View != null) tab.View.ZoomFactor = _zoomStore.Get(cv.Source); } catch { } // T1-7 사이트별 줌 - try // T2-7 부스트(강제 다크/커스텀 CSS) 적용 - { - var boostJs = BoostScriptProvider?.Invoke(cv.Source) ?? ""; - if (boostJs.Length > 0 && !tab.IsReader) _ = cv.ExecuteScriptAsync(boostJs); - } - catch { } - })); - cv.HistoryChanged += (_, _) => HistoryChanged?.Invoke(); - - // T3-11 사이트별 권한: 정책 Ask 만 프롬프트, Allow/Deny 는 즉시 응답 - cv.PermissionRequested += (_, e) => - { - var kind = e.PermissionKind.ToString(); - var origin = OriginOf(e.Uri); - switch (Permissions.Decide(kind, origin)) - { - case PermissionVerdict.Allow: - e.State = CoreWebView2PermissionState.Allow; e.Handled = true; - break; - case PermissionVerdict.Deny: - e.State = CoreWebView2PermissionState.Deny; e.Handled = true; - break; - default: - PermissionPrompt?.Invoke(cv, e); // 호스트 다이얼로그가 State/Handled 설정 - break; - } - }; - - // T3-14 추적 방지: 블랙리스트 요청 차단 + 카운터 - cv.AddWebResourceRequestedFilter("*", CoreWebView2WebResourceContext.All); - cv.WebResourceRequested += (_, e) => - { - Uri u; - try { u = new Uri(e.Request.Uri); } catch { return; } - if (!TrackerBlocklist.Matches(u)) return; - try { e.Response = _env.CreateWebResourceResponse(null, 204, "Blocked", ""); } catch { } - TrackerCounter.Record(e.Request.Uri); - _dispatcher.BeginInvoke(new Action(() => TrackerBlocked?.Invoke())); - }; - - cv.SourceChanged += (_, _) => _dispatcher.BeginInvoke(new Action(() => - { - var url = cv.Source ?? ""; - tab.Url = url; - UrlChanged?.Invoke(tab, url); - })); - cv.DocumentTitleChanged += (_, _) => _dispatcher.BeginInvoke(new Action(() => - { - TitleChanged?.Invoke(tab, cv.DocumentTitle ?? ""); - })); - - // T1-8 오디오 표시/뮤트 - try - { - cv.IsDocumentPlayingAudioChanged += (_, _) => _dispatcher.BeginInvoke(new Action(() => - { - try { tab.IsAudioPlaying = cv.IsDocumentPlayingAudio; } catch { } - })); - cv.IsMutedChanged += (_, _) => _dispatcher.BeginInvoke(new Action(() => - { - try { tab.IsMuted = cv.IsMuted; } catch { } - })); - } - catch { } - - // 뉴윈도우(팝업) → 새 탭 (deferral 필수 — 탭 생성이 비동기) - cv.NewWindowRequested += async (_, ne) => - { - try - { - var deferral = ne.GetDeferral(); - try - { - var newTab = NewTabProvider != null ? await NewTabProvider() : null; - if (newTab != null) - { - await WaitTabReady(newTab); - ne.NewWindow = newTab.Core; - } - ne.Handled = true; - } - finally { deferral.Complete(); } - } - catch - { - try { ne.Handled = true; if (ne.Uri != null) cv.Navigate(ne.Uri); } catch { } - } - }; - - // 페이지 내 다운로드 → 호스트 훅 - cv.DownloadStarting += (_, de) => DownloadStarting?.Invoke(cv, de); - - // 우클릭 메뉴 → 호스트가 커스텀 메뉴 구성(기본 메뉴 대체, T2-12/T3-5) - cv.ContextMenuRequested += (_, ce) => - { - ce.Handled = true; - ContextMenuBuild?.Invoke(cv, ce); - }; - - // 초기 URL (세션 복원) - if (!string.IsNullOrEmpty(tab.Url) && string.IsNullOrEmpty(cv.Source)) - { - try { cv.Navigate(tab.Url); } catch { } - } - - TabCoreReady?.Invoke(tab, cv); - } - - /// 활성 탭 검색 상태 표시 요청(FindStatus 텍스트 갱신 — 호스트가 구독). - public event Action? FindStateChanged; - - /// 권한 기준 출처(scheme://host:port) 추출. - public static string OriginOf(string? uri) - { - if (string.IsNullOrEmpty(uri)) return ""; - try { var u = new Uri(uri); return u.GetComponents(UriComponents.SchemeAndServer, UriFormat.Unescaped); } - catch { return uri; } - } -} diff --git a/VideoDownloader.App/SettingsWindow.xaml b/VideoDownloader.App/SettingsWindow.xaml deleted file mode 100644 index 54302a9..0000000 --- a/VideoDownloader.App/SettingsWindow.xaml +++ /dev/null @@ -1,487 +0,0 @@ - - - - - - - - - - - - - - - - - - - - -
- 다운로드 큐 -
불러오는 중…
-
- -
- PC 라이브러리 탭하여 스트리밍 재생 -
불러오는 중…
-
- -
같은 Wi-Fi 에서만 접속됩니다 · LAN 직결(계정 없음)
- - - - -"""; -} diff --git a/VideoDownloader.Tests/Browser/MediaPlaylistTests.cs b/VideoDownloader.Tests/Browser/MediaPlaylistTests.cs deleted file mode 100644 index 013a7d4..0000000 --- a/VideoDownloader.Tests/Browser/MediaPlaylistTests.cs +++ /dev/null @@ -1,96 +0,0 @@ -using VideoDownloader.App.Browser.Features; - -namespace VideoDownloader.Tests.Browser; - -// ── T2-10 미디어 재생목록 (Brave Playlist 패턴): 감지된 미디어를 쌓고 재생/제거/영속 ── -public class MediaPlaylistTests : IDisposable -{ - private readonly string _path = Path.Combine(Path.GetTempPath(), $"playlist_{Guid.NewGuid():N}.json"); - private readonly MediaPlaylist _pl = new(); - - private MediaTrack Mk(string url = "https://v.test/a.mp4", string title = "트랙A", string kind = "Direct") - => new(url, title, kind, AddedAt: DateTime.UtcNow); - - [Fact] - public void Add는_재생목록_끝에_추가하고_중복_URL은_무시한다() - { - var t = Mk(); - _pl.Add(t); - _pl.Add(Mk(url: "https://v.test/b.mp4", title: "트랙B")); - _pl.Add(Mk()); // 동일 URL 중복 - Assert.Equal(2, _pl.Tracks.Count); - Assert.Equal("트랙A", _pl.Tracks[0].Title); - } - - [Fact] - public void Remove와_Clear() - { - var a = Mk(); var b = Mk("https://v.test/b.mp4", "B"); - _pl.Add(a); _pl.Add(b); - _pl.Remove(a); - Assert.Single(_pl.Tracks); - _pl.Clear(); - Assert.Empty(_pl.Tracks); - } - - [Fact] - public void 다음_이전_트랙은_순환한다() - { - _pl.Add(Mk("u1", "1")); - _pl.Add(Mk("u2", "2")); - _pl.Add(Mk("u3", "3")); - _pl.CurrentIndex = 0; - - Assert.Equal(1, _pl.Next()); - Assert.Equal(2, _pl.Next()); - Assert.Equal(0, _pl.Next()); // 순환 - Assert.Equal(2, _pl.Previous()); - } - - [Fact] - public void 현재_트랙은_CurrentIndex로_얻는다() - { - _pl.Add(Mk("u1", "1")); - _pl.Add(Mk("u2", "2")); - _pl.CurrentIndex = 1; - Assert.Equal("u2", _pl.Current?.Url); - } - - [Fact] - public void 영속_라운드트립() - { - _pl.Add(Mk("u1", "제목1", "Hls")); - _pl.Add(Mk("u2", "제목2", "Direct")); - _pl.CurrentIndex = 1; - _pl.Save(_path); - - var loaded = new MediaPlaylist(); - Assert.Equal(0, loaded.Tracks.Count); - loaded.Load(_path); - Assert.Equal(2, loaded.Tracks.Count); - Assert.Equal("제목1", loaded.Tracks[0].Title); - Assert.Equal("Hls", loaded.Tracks[0].Kind); - Assert.Equal(1, loaded.CurrentIndex); - } - - [Fact] - public void 손상된_JSON은_빈_목록으로_시작() - { - File.WriteAllText(_path, "{broken"); - var pl = new MediaPlaylist(); - pl.Load(_path); - Assert.Empty(pl.Tracks); - } - - [Fact] - public void 재생완료_표시와_완료필터() - { - _pl.Add(Mk("u1", "1")); - _pl.Add(Mk("u2", "2")); - _pl.MarkPlayed(_pl.Tracks[0]); - Assert.True(_pl.Tracks[0].Played); - Assert.False(_pl.Tracks[1].Played); - } - - public void Dispose() { try { File.Delete(_path); } catch { } } -} diff --git a/VideoDownloader.Tests/Browser/PageDownloadTrackerTests.cs b/VideoDownloader.Tests/Browser/PageDownloadTrackerTests.cs deleted file mode 100644 index bf4ac80..0000000 --- a/VideoDownloader.Tests/Browser/PageDownloadTrackerTests.cs +++ /dev/null @@ -1,103 +0,0 @@ -using VideoDownloader.App.Browser.Features; - -namespace VideoDownloader.Tests.Browser; - -/// 페이지 다운로드 추상화(다운로드 매니저 UI 의 로직 코어) — fake op 로 검증. -public interface IFakeOpHost { } - -public class PageDownloadTrackerTests -{ - private sealed class FakeOp : IDownloadOperation - { - public string Uri { get; set; } = "https://x.test/file.zip"; - public string FileName { get; set; } = "file.zip"; - public long BytesReceived { get; set; } - public long TotalBytesToReceive { get; set; } = 1000; - public string State { get; set; } = "InProgress"; - public bool Paused, Resumed, Cancelled; - - public event Action? Changed; - public void Raise() => Changed?.Invoke(); - - public void Pause() { Paused = true; State = "Paused"; Raise(); } - public void Resume() { Resumed = true; State = "InProgress"; Raise(); } - public void Cancel() { Cancelled = true; State = "Cancelled"; Raise(); } - } - - [Fact] - public void Add는_항목을_등록하고_최근순_정렬한다() - { - var t = new PageDownloadTracker(); - var a = new FakeOp { FileName = "a.zip" }; - var b = new FakeOp { FileName = "b.zip" }; - t.Add(a, a.FileName); - t.Add(b, b.FileName); - Assert.Equal(2, t.Items.Count); - Assert.Equal("b.zip", t.Items[0].FileName); // 최신 우선 - } - - [Fact] - public void 진행률과_속도를_계산한다() - { - var t = new PageDownloadTracker(); - var op = new FakeOp { TotalBytesToReceive = 1000 }; - var item = t.Add(op, "f.zip"); - - item.UpdateSpeed(500, TimeSpan.FromSeconds(2)); // 500B/2s = 250 B/s - Assert.Equal(50.0, item.Percent, 2); - Assert.Equal(250, item.BytesPerSecond); - Assert.Equal("250.0 B/s", item.SpeedText); - } - - [Fact] - public void 속도_단위는_KB_MB로_표시된다() - { - var t = new PageDownloadTracker(); - var item = t.Add(new FakeOp { TotalBytesToReceive = 10_000_000 }, "f"); - - item.UpdateSpeed(0, TimeSpan.FromSeconds(1)); // 초기 - Assert.Equal("—", item.SpeedText); - - item = t.Add(new FakeOp { TotalBytesToReceive = 10_000_000 }, "g"); - item.UpdateSpeed(2048 * 100, TimeSpan.FromSeconds(1)); // 200 KB/s - Assert.Equal("200.0 KB/s", item.SpeedText); - - item = t.Add(new FakeOp { TotalBytesToReceive = 10_000_000 }, "h"); - item.UpdateSpeed(3 * 1024 * 1024L, TimeSpan.FromSeconds(1)); // 3 MB/s - Assert.Equal("3.0 MB/s", item.SpeedText); - } - - [Fact] - public void Pause_Resume_Cancel_위임() - { - var t = new PageDownloadTracker(); - var op = new FakeOp(); - var item = t.Add(op, "f"); - - t.Pause(item); t.Resume(item); t.Cancel(item); - Assert.True(op.Paused && op.Resumed && op.Cancelled); - } - - [Fact] - public void 완료_항목은_ClearCompleted로_일괄_제거() - { - var t = new PageDownloadTracker(); - var done = new FakeOp { State = "Completed" }; - var running = new FakeOp { State = "InProgress" }; - t.Add(done, "d"); t.Add(running, "r"); - - t.ClearCompleted(); - Assert.Single(t.Items); - Assert.Equal("r", t.Items[0].FileName); - } - - [Fact] - public void 취소된_항목도_ClearCompleted로_제거된다() - { - var t = new PageDownloadTracker(); - var c = new FakeOp { State = "Interrupted" }; - t.Add(c, "c"); - t.ClearCompleted(); - Assert.Empty(t.Items); - } -} diff --git a/VideoDownloader.Tests/Browser/PermissionGateTests.cs b/VideoDownloader.Tests/Browser/PermissionGateTests.cs deleted file mode 100644 index 3b3c9c1..0000000 --- a/VideoDownloader.Tests/Browser/PermissionGateTests.cs +++ /dev/null @@ -1,46 +0,0 @@ -using VideoDownloader.Browser; - -namespace VideoDownloader.Tests.Browser; - -/// T3-11: 사이트별 권한 정책 — 기억된 상태 우선, 미기억은 Ask(프롬프트). -public class PermissionGateTests -{ - [Fact] - public void 미기억_권한은_Ask() - => Assert.Equal(PermissionVerdict.Ask, new PermissionGate().Decide("notifications", "https://x.com")); - - [Theory] - [InlineData("allow")] - [InlineData("deny")] - public void 기억된_판정은_그대로_반환(string v) - { - var g = new PermissionGate(); - g.Remember("notifications", "https://x.com", v == "allow" ? PermissionVerdict.Allow : PermissionVerdict.Deny); - Assert.Equal(v == "allow" ? PermissionVerdict.Allow : PermissionVerdict.Deny, - g.Decide("notifications", "https://x.com")); - } - - [Fact] - public void 판정은_출처_단위_격리() - { - var g = new PermissionGate(); - g.Remember("geolocation", "https://a.com", PermissionVerdict.Allow); - Assert.Equal(PermissionVerdict.Ask, g.Decide("geolocation", "https://b.com")); - } - - [Fact] - public void 판정은_종류_단위_격리() - { - var g = new PermissionGate(); - g.Remember("notifications", "https://a.com", PermissionVerdict.Allow); - Assert.Equal(PermissionVerdict.Ask, g.Decide("camera", "https://a.com")); - } - - [Fact] - public void OtherSensors_등_민감_종류는_자동_거절() - => Assert.Equal(PermissionVerdict.Deny, new PermissionGate().Decide("OtherSensors", "https://x.com")); - - [Fact] - public void MultipleAutomaticDownloads_파일_다운로드는_자동_허용() - => Assert.Equal(PermissionVerdict.Allow, new PermissionGate().Decide("MultipleAutomaticDownloads", "https://x.com")); -} diff --git a/VideoDownloader.Tests/Browser/SiteZoomStoreTests.cs b/VideoDownloader.Tests/Browser/SiteZoomStoreTests.cs deleted file mode 100644 index d8c8ddd..0000000 --- a/VideoDownloader.Tests/Browser/SiteZoomStoreTests.cs +++ /dev/null @@ -1,95 +0,0 @@ -using VideoDownloader.Browser; - -namespace VideoDownloader.Tests.Browser; - -// T1-7 사이트별 줌 영속: 도메인→배율 저장, 범위 클램프, JSON 영속, 최대 항목 제한. -public class SiteZoomStoreTests : IDisposable -{ - private readonly string _path; - private readonly SiteZoomStore _store; - - public SiteZoomStoreTests() - { - _path = Path.Combine(Path.GetTempPath(), $"zoomstore_{Guid.NewGuid():N}.json"); - _store = new SiteZoomStore(_path); - } - - public void Dispose() - { - try { File.Delete(_path); } catch { } - } - - [Fact] - public void 미등록_사이트는_기본값_1_0을_반환한다() - { - Assert.Equal(1.0, _store.Get("https://example.com/page")); - } - - [Fact] - public void 배율을_저장하면_같은_호스트의_다른_경로에서도_읽힌다() - { - _store.Set("https://example.com/a", 1.5); - Assert.Equal(1.5, _store.Get("https://example.com/b/c/d")); - } - - [Fact] - public void www_접두사는_동일_호스트로_정규화된다() - { - _store.Set("https://www.example.com/a", 2.0); - Assert.Equal(2.0, _store.Get("https://example.com/b")); - } - - [Theory] - [InlineData(0.05, 0.1)] // 하한 클램프 - [InlineData(9.0, 5.0)] // 상한 클램프 - [InlineData(1.25, 1.25)] // 정상 범위 - public void 배율은_0_1에서_5_0으로_클램프된다(double input, double expected) - { - _store.Set("https://clamp.com/", input); - Assert.Equal(expected, _store.Get("https://clamp.com/")); - } - - [Fact] - public void 저장_즉시_파일에_영속되어_새_인스턴스가_읽는다() - { - _store.Set("https://persist.com/", 1.75); - Assert.True(File.Exists(_path)); - var reloaded = new SiteZoomStore(_path); - Assert.Equal(1.75, reloaded.Get("https://persist.com/other")); - } - - [Fact] - public void 최대_300개_초과시_가장_오래_사용하지_한_항목부터_제거된다() - { - // 300개 채우기 - for (int i = 0; i < 300; i++) - _store.Set($"https://site{i}.com/", 1.0 + i * 0.001); - // 가장 먼저 넣은 site0 을 최근에 다시 설정(LRU 갱신) → site1 이 제거 후보가 됨 - _store.Set("https://site0.com/", 1.9); - // 하나 더 추가 → 초과분 제거 - _store.Set("https://new.com/", 2.0); - - Assert.Equal(300, _store.Count); - Assert.Equal(1.0, _store.Get("https://site1.com/")); // 제거됨 → 기본값 - Assert.Equal(2.0, _store.Get("https://new.com/")); // 유지 - Assert.Equal(1.9, _store.Get("https://site0.com/")); // LRU 갱신됨 → 유지 - } - - [Fact] - public void Clear는_모든_항목과_파일을_지운다() - { - _store.Set("https://x.com/", 2.0); - _store.Clear(); - Assert.Equal(0, _store.Count); - Assert.Equal(1.0, _store.Get("https://x.com/")); - Assert.False(File.Exists(_path)); - } - - [Fact] - public void 손상된_JSON은_무시하고_빈_상태로_시작한다() - { - File.WriteAllText(_path, "{ not json !!"); - var store = new SiteZoomStore(_path); - Assert.Equal(0, store.Count); - } -} diff --git a/VideoDownloader.Tests/Browser/TabFeaturesTests.cs b/VideoDownloader.Tests/Browser/TabFeaturesTests.cs deleted file mode 100644 index 5b307fb..0000000 --- a/VideoDownloader.Tests/Browser/TabFeaturesTests.cs +++ /dev/null @@ -1,113 +0,0 @@ -using VideoDownloader.App.Browser.Features; -using VideoDownloader.Browser.Tabs; - -namespace VideoDownloader.Tests.Browser; - -// ── T2-2 탭 절전: 유휴 비활성 탭 자동 서스펜드 ── -public class TabSuspendServiceTests -{ - [Fact] - public void 활성_탭은_절전하지_않는다() - { - var m = new TabManager(() => new TabItem()); - var active = m.NewTab("https://a.com"); - var svc = new TabSuspendService(TimeSpan.FromMinutes(10), - t => throw new InvalidOperationException("suspend should not be called"), - t => t == active); - - svc.SuspendIdleTabs(m.Tabs, active, now: active.LastActivated.AddMinutes(30)); - Assert.False(active.IsSuspended); - } - - [Fact] - public void 유휴_비활성_탭은_절전한다() - { - var m = new TabManager(() => new TabItem()); - var old = m.NewTab("https://a.com"); - var active = m.NewTab("https://b.com"); - var suspended = new List(); - var svc = new TabSuspendService(TimeSpan.FromMinutes(10), - t => { suspended.Add(t); return true; }, - t => t != active); - - var now = old.LastActivated.AddMinutes(11); - svc.SuspendIdleTabs(m.Tabs, active, now); - Assert.Contains(old, suspended); - Assert.DoesNotContain(active, suspended); - } - - [Fact] - public void 이미_절전된_탭은_중복_서스펜드_하지_않는다() - { - var m = new TabManager(() => new TabItem()); - var old = m.NewTab("https://a.com"); - var active = m.NewTab("https://b.com"); - old.IsSuspended = true; - var calls = 0; - var svc = new TabSuspendService(TimeSpan.FromMinutes(10), t => { calls++; return true; }, t => t != active); - - svc.SuspendIdleTabs(m.Tabs, active, old.LastActivated.AddHours(1)); - Assert.Equal(0, calls); - } - - [Fact] - public void 최근에_활성화된_탭은_절전하지_않는다() - { - var m = new TabManager(() => new TabItem()); - var recent = m.NewTab("https://a.com"); - var active = m.NewTab("https://b.com"); - m.Activate(recent); // 방금 사용 - var calls = 0; - var svc = new TabSuspendService(TimeSpan.FromMinutes(10), t => { calls++; return true; }, t => t != active); - - svc.SuspendIdleTabs(m.Tabs, active, recent.LastActivated.AddMinutes(1)); - Assert.Equal(0, calls); - } -} - -// ── T2-8 탭 검색(Ctrl+Shift+A): 열린+닫힌 탭 필터 ── -public class TabSearchFilterTests -{ - [Fact] - public void 제목과_URL_부분일치로_필터링한다() - { - var m = new TabManager(() => new TabItem()); - m.NewTab("https://youtube.com/watch?v=1"); - m.Tabs[0].Title = "My Favorite Video"; - m.NewTab("https://news.example.com"); - m.Tabs[1].Title = "News"; - - var hits = TabSearchFilter.Search(m.Tabs, "favorite"); - Assert.Single(hits); - Assert.Equal("My Favorite Video", hits[0].Title); - - hits = TabSearchFilter.Search(m.Tabs, "youtube"); - Assert.Single(hits); - - hits = TabSearchFilter.Search(m.Tabs, "EXAMPLE"); // 대소문자 무시 - Assert.Single(hits); - } - - [Fact] - public void 닫힌_탭도_검색_대상에_포함된다() - { - var m = new TabManager(() => new TabItem()); - var t = m.NewTab("https://github.com/x"); - m.Tabs[0].Title = "GitHub Repo"; - m.CloseTab(t); - - var hits = TabSearchFilter.Search(m.Tabs, m.ClosedStack, "github"); - Assert.Single(hits); - Assert.Equal("GitHub Repo", hits[0].Title); - Assert.True(hits[0].IsClosed); - } - - [Fact] - public void 빈_질의는_빈_결과() - { - var m = new TabManager(() => new TabItem()); - m.NewTab("https://a.com"); - Assert.Empty(TabSearchFilter.Search(m.Tabs, "")); - Assert.Empty(TabSearchFilter.Search(m.Tabs, " ")); - } -} diff --git a/VideoDownloader.Tests/Browser/TabGroupsWorkspacesTests.cs b/VideoDownloader.Tests/Browser/TabGroupsWorkspacesTests.cs deleted file mode 100644 index ceda150..0000000 --- a/VideoDownloader.Tests/Browser/TabGroupsWorkspacesTests.cs +++ /dev/null @@ -1,78 +0,0 @@ -using VideoDownloader.Browser.Tabs; - -namespace VideoDownloader.Tests.Browser; - -// ── T2-11 탭 그룹: 색상 라벨 + 그룹 단위 이동/닫기 ── -public class TabGroupsTests -{ - private static TabManager NewManager() => new(() => new TabItem()); - - [Fact] - public void 그룹_지정과_해제() - { - var m = NewManager(); - var t = m.NewTab("https://a.com"); - m.SetGroup(t, "Work", "#e11"); - Assert.Equal("Work", t.GroupName); - Assert.Equal("#e11", t.GroupColor); - m.SetGroup(t, null, null); - Assert.Null(t.GroupName); - } - - [Fact] - public void 같은_그룹_탭은_서로_인접한다() - { - var m = NewManager(); - var a = m.NewTab("a"); m.SetGroup(a, "G", "#111"); - m.NewTab("b"); // 비그룹 - var c = m.NewTab("c"); m.SetGroup(c, "G", "#111"); // 그룹으로 → a 옆으로 이동 - Assert.Equal(1, m.Tabs.IndexOf(c)); - Assert.Equal(0, m.Tabs.IndexOf(a)); - } - - [Fact] - public void 그룹_탭_전체_닫기() - { - var m = NewManager(); - var a = m.NewTab("a"); m.SetGroup(a, "G", "#111"); - var b = m.NewTab("b"); m.SetGroup(b, "G", "#111"); - m.NewTab("solo"); - var closed = m.CloseGroup("G"); - Assert.Equal(2, closed); - Assert.Single(m.Tabs); - } -} - -// ── T3-1 워크스페이스: 탭 세트 저장/전환 ── -public class WorkspaceTests -{ - private static TabManager NewManager() => new(() => new TabItem()); - - [Fact] - public void 워크스페이스_저장후_스왑하면_탭_세트가_교체된다() - { - var m = NewManager(); - m.NewTab("https://work1.com"); - m.NewTab("https://work2.com"); - var ws = m.CaptureWorkspace("Work"); - - m.NewTab("https://personal.com"); - Assert.Equal(3, m.Tabs.Count); - - m.SwitchWorkspace(ws); - Assert.Equal(2, m.Tabs.Count); - Assert.Equal("https://work1.com", m.Tabs[0].Url); - Assert.Equal("https://work2.com", m.Tabs[1].Url); - Assert.Equal("Work", ws.Name); - } - - [Fact] - public void 워크스페이스_캡처는_현재_탭을_그대로_유지한다() - { - var m = NewManager(); - m.NewTab("https://a.com"); - var ws = m.CaptureWorkspace("X"); - Assert.Equal(1, m.Tabs.Count); // 캡처 자체는 현재 상태 유지(스냅샷) - Assert.Single(ws.Urls); - } -} diff --git a/VideoDownloader.Tests/Browser/TabManagerTests.cs b/VideoDownloader.Tests/Browser/TabManagerTests.cs deleted file mode 100644 index 1426b89..0000000 --- a/VideoDownloader.Tests/Browser/TabManagerTests.cs +++ /dev/null @@ -1,228 +0,0 @@ -using VideoDownloader.Browser.Tabs; - -namespace VideoDownloader.Tests.Browser; - -// Phase A 탭 아키텍처: TabManager 순수 로직(뷰 팩토리 주입 — WebView2 없이 검증). -public class TabManagerTests -{ - private static TabManager NewManager() => new(() => new TabItem()); - - [Fact] - public void NewTab은_탭을_추가하고_활성화한다() - { - var m = NewManager(); - var t = m.NewTab("https://a.com"); - Assert.Single(m.Tabs); - Assert.Same(t, m.ActiveTab); - Assert.Equal("https://a.com", t.Url); - } - - [Fact] - public void 두_번째_탭은_이전_탭을_비활성화하고_활성화된다() - { - var m = NewManager(); - var t1 = m.NewTab("https://a.com"); - var t2 = m.NewTab("https://b.com"); - Assert.Same(t2, m.ActiveTab); - Assert.False(t1.IsActive); - Assert.True(t2.IsActive); - } - - [Fact] - public void Activate는_활성_탭을_바꾸고_이벤트를_발생시킨다() - { - var m = NewManager(); - var t1 = m.NewTab(); - var t2 = m.NewTab(); - var fired = 0; - m.ActiveChanged += _ => fired++; - m.Activate(t1); - Assert.Same(t1, m.ActiveTab); - Assert.True(t1.IsActive); - Assert.False(t2.IsActive); - Assert.Equal(1, fired); - } - - [Fact] - public void CloseTab은_제거하고_이웃_탭을_활성화한다() - { - var m = NewManager(); - m.NewTab("https://a.com"); // index 0 - var t2 = m.NewTab("https://b.com"); // index 1 (active) - var t3 = m.NewTab("https://c.com"); // index 2 - m.Activate(t2); - - m.CloseTab(t2); - Assert.Equal(2, m.Tabs.Count); - Assert.DoesNotContain(t2, m.Tabs); - // 닫힌 탭 오른쪽이 있으면 그 탭(t3) 활성화 (Chrome 동작) - Assert.Same(t3, m.ActiveTab); - } - - [Fact] - public void 마지막_탭을_닫으면_새_빈_탭으로_대체된다() - { - var m = NewManager(); - var only = m.NewTab("https://solo.com"); - m.CloseTab(only); - Assert.Single(m.Tabs); - Assert.NotSame(only, m.ActiveTab); - Assert.Same(m.ActiveTab, m.Tabs[0]); - } - - [Fact] - public void 닫힌_탭은_스택에_쌓이고_ReopenClosedTab으로_원래_위치에_복원된다() - { - var m = NewManager(); - var t1 = m.NewTab("https://a.com"); - m.NewTab("https://b.com"); - m.NewTab("https://c.com"); // index 2, active - m.CloseTab(m.Tabs[2]); // 마지막 인덱스 탭 닫기 - - var reopened = m.ReopenClosedTab(); - Assert.NotNull(reopened); - Assert.Equal("https://c.com", reopened!.Url); - Assert.Equal(3, m.Tabs.Count); - Assert.Equal(2, m.Tabs.IndexOf(reopened)); // 원래 인덱스 복원 - Assert.Same(reopened, m.ActiveTab); - Assert.Empty(m.ClosedStack); - } - - [Fact] - public void 닫힌_탭_스택은_최대_25개다() - { - var m = NewManager(); - for (int i = 0; i < 30; i++) - { - var t = m.NewTab($"https://x{i}.com"); - m.CloseTab(t); - } - Assert.Equal(25, m.ClosedStack.Count); - Assert.Equal("https://x29.com", m.ClosedStack.First().Url); // LIFO 최신 우선 - } - - [Fact] - public void ActivateNext_Previous는_순환한다() - { - var m = NewManager(); - var t1 = m.NewTab("https://a.com"); - var t2 = m.NewTab("https://b.com"); - m.Activate(t1); - - m.ActivateNext(); - Assert.Same(t2, m.ActiveTab); - m.ActivateNext(); // 순환 - Assert.Same(t1, m.ActiveTab); - m.ActivatePrevious(); - Assert.Same(t2, m.ActiveTab); - } - - [Fact] - public void ActivateAt와_ActivateLast가_동작한다() - { - var m = NewManager(); - m.NewTab("a"); m.NewTab("b"); var last = m.NewTab("c"); - m.ActivateAt(0); - Assert.Same(m.Tabs[0], m.ActiveTab); - m.ActivateLast(); - Assert.Same(last, m.ActiveTab); - } - - [Fact] - public void Move는_탭_순서를_바꾼다() - { - var m = NewManager(); - var t1 = m.NewTab("a"); var t2 = m.NewTab("b"); var t3 = m.NewTab("c"); - m.Move(t1, 2); // a 를 끝으로 - Assert.Equal(2, m.Tabs.IndexOf(t1)); - Assert.Equal(0, m.Tabs.IndexOf(t2)); - Assert.Equal(1, m.Tabs.IndexOf(t3)); - } - - [Fact] - public void Pin은_탭을_좌측_끝으로_이동시키고_핀_표시한다() - { - var m = NewManager(); - m.NewTab("a"); m.NewTab("b"); - var t3 = m.NewTab("c"); - m.SetPinned(t3, true); - Assert.True(t3.IsPinned); - Assert.Equal(0, m.Tabs.IndexOf(t3)); // 핀 탭은 좌측 정렬 - m.SetPinned(t3, false); - Assert.False(t3.IsPinned); - } - - [Fact] - public void CaptureSession은_URL과_활성_인덱스와_핀을_담는다() - { - var m = NewManager(); - m.NewTab("https://a.com"); - var t2 = m.NewTab("https://b.com"); - m.NewTab("https://c.com"); - m.SetPinned(t2, true); // b 가 좌측으로 이동 → 순서: b,a,c - m.Activate(t2); - - var s = m.CaptureSession(); - Assert.Equal(new[] { "https://b.com", "https://a.com", "https://c.com" }, s.Urls); - Assert.Equal(0, s.ActiveIndex); - Assert.Equal(new[] { true, false, false }, s.Pinned); - } - - [Fact] - public void RestoreSession은_저장된_탭들을_재생성한다() - { - var m = NewManager(); - // CaptureSession 불변식: 핀 탭이 먼저 오는 순서로 저장됨 - var snap = new SessionSnapshot( - new() { "https://b.com", "https://a.com" }, 0, new() { true, false }); - m.RestoreSession(snap); - Assert.Equal(2, m.Tabs.Count); - Assert.Equal("https://b.com", m.ActiveTab!.Url); - Assert.True(m.Tabs[0].IsPinned); // 핀 탭이 좌측 - Assert.False(m.Tabs[1].IsPinned); - } - - [Fact] - public void RestoreSession은_기존_탭을_치환한다() - { - var m = NewManager(); - m.NewTab("https://old.com"); - m.RestoreSession(new SessionSnapshot(new() { "https://new.com" }, 0, new() { false })); - Assert.Single(m.Tabs); - Assert.Equal("https://new.com", m.Tabs[0].Url); - } -} - -// 세션 JSON 저장소(T1-10) 분리 테스트 -public class TabSessionStoreTests : IDisposable -{ - private readonly string _path = Path.Combine(Path.GetTempPath(), $"session_{Guid.NewGuid():N}.json"); - - [Fact] - public void 저장_후_로드_라운드트립() - { - var snap = new SessionSnapshot( - new() { "https://a.com", "https://b.com", "https://c.com" }, 2, new() { true, false, false }); - TabSessionStore.Save(_path, snap); - var loaded = TabSessionStore.Load(_path); - Assert.NotNull(loaded); - Assert.Equal(snap.Urls, loaded!.Urls); - Assert.Equal(2, loaded.ActiveIndex); - Assert.Equal(snap.Pinned, loaded.Pinned); - } - - [Fact] - public void 파일_없으면_null() - { - Assert.Null(TabSessionStore.Load(_path)); - } - - [Fact] - public void 손상된_JSON이면_null() - { - File.WriteAllText(_path, "{ broken"); - Assert.Null(TabSessionStore.Load(_path)); - } - - public void Dispose() { try { File.Delete(_path); } catch { } } -} diff --git a/VideoDownloader.Tests/Browser/TrackerBlockTests.cs b/VideoDownloader.Tests/Browser/TrackerBlockTests.cs deleted file mode 100644 index aaa490b..0000000 --- a/VideoDownloader.Tests/Browser/TrackerBlockTests.cs +++ /dev/null @@ -1,40 +0,0 @@ -using VideoDownloader.Browser; - -namespace VideoDownloader.Tests.Browser; - -/// T3-14: 추적 방지 — 블랙리스트 도메인 매칭(서브도메인 포함) + 차단 카운터. -public class TrackerBlockTests -{ - [Theory] - [InlineData("https://google-analytics.com/analytics.js", true)] // 정확히 도메인 - [InlineData("https://www.google-analytics.com/g/collect", true)] // 서브도메인 - [InlineData("https://x.com/notgoogle-analytics.com/a", false)] // 접미사 함정 제외 - [InlineData("https://doubleclick.net/instream/ad_status.js", true)] - [InlineData("https://safe.example.com/lib.js", false)] // 무관 도메인 - public void Matches_블랙리스트_도메인_판정(string url, bool expected) - => Assert.Equal(expected, new TrackerBlocklist().Matches(new Uri(url))); - - [Fact] - public void 커스텀_도메인_주입_가능() - { - var bl = new TrackerBlocklist(new[] { "blocked.test" }); - Assert.True(bl.Matches(new Uri("https://t.blocked.test/x.js"))); - Assert.False(bl.Matches(new Uri("https://ok.com/x.js"))); - } - - [Fact] - public void Counter_차단_누적_도메인별_집계_변경_통지() - { - var c = new TrackerCounter(); - var changed = 0; - c.Changed += () => changed++; - Assert.Equal(0, c.Total); - c.Record("https://www.google-analytics.com/a.js"); - c.Record("https://google-analytics.com/b.js"); - c.Record("https://scorecardresearch.com/c.js"); - Assert.Equal(3, c.Total); - Assert.Equal(2, c.ByDomain["google-analytics.com"]); - Assert.Equal(1, c.ByDomain["scorecardresearch.com"]); - Assert.Equal(3, changed); - } -} diff --git a/VideoDownloader.Tests/Browser/UrlCleanerTests.cs b/VideoDownloader.Tests/Browser/UrlCleanerTests.cs deleted file mode 100644 index a704dcb..0000000 --- a/VideoDownloader.Tests/Browser/UrlCleanerTests.cs +++ /dev/null @@ -1,80 +0,0 @@ -using VideoDownloader.Browser; - -namespace VideoDownloader.Tests.Browser; - -/// T3-15: 파라미터 제거 복사 + 주소창 진행 상태. -public class UrlCleanerTests -{ - [Theory] - [InlineData("https://x.com/a?utm_source=1&b=2", "https://x.com/a")] // 쿼리 제거 - [InlineData("https://x.com/a#frag", "https://x.com/a")] // 프래그먼트 제거 - [InlineData("https://x.com/a?b=1#f", "https://x.com/a")] // 둘 다 - [InlineData("https://x.com/a/", "https://x.com/a/")] // 없으면 무변경 - [InlineData("https://x.com/a?q=한글", "https://x.com/a")] // 유니코드 쿼리 - [InlineData("x.com/a?b=1", "x.com/a")] // 스킴 없어도 동작 - public void StripQuery_파라미터와_프래그먼트를_제거(string input, string expected) - => Assert.Equal(expected, UrlCleaner.StripQuery(input)); - - [Fact] - public void StripQuery_빈값_null_안전() - { - Assert.Equal("", UrlCleaner.StripQuery("")); - Assert.Null(UrlCleaner.StripQuery(null)); - } -} - -/// T3-15: 탭 전체 네비게이션 진행 집계 — 주소창 진행 바 표시 상태. -public class NavProgressTrackerTests -{ - [Fact] - public void 초기값은_비진행() - => Assert.False(new NavProgressTracker().IsNavigating); - - [Fact] - public void 시작하면_진행() - { - var t = new NavProgressTracker(); - t.Started(); - Assert.True(t.IsNavigating); - } - - [Fact] - public void 완료되면_비진행() - { - var t = new NavProgressTracker(); - t.Started(); - t.Completed(); - Assert.False(t.IsNavigating); - } - - [Fact] - public void 동시_내비게이션은_마지막_완료까지_진행() // 프레임 리다이렉트·중복 시작 - { - var t = new NavProgressTracker(); - t.Started(); t.Started(); - t.Completed(); - Assert.True(t.IsNavigating); - t.Completed(); - Assert.False(t.IsNavigating); - } - - [Fact] - public void 과잉_완료로_음수_되지_않음() - { - var t = new NavProgressTracker(); - t.Completed(); - Assert.False(t.IsNavigating); - } - - [Fact] - public void IsNavigating_변경_시_INPC_발화() - { - var t = new NavProgressTracker(); - var fired = new List(); - t.PropertyChanged += (_, e) => fired.Add(e.PropertyName); - t.Started(); - t.Completed(); - t.Completed(); // false→false → 이벤트 없음 - Assert.Equal(new[] { nameof(NavProgressTracker.IsNavigating), nameof(NavProgressTracker.IsNavigating) }, fired); - } -} diff --git a/VideoDownloader.Tests/E2E/IconContentFontTests.cs b/VideoDownloader.Tests/E2E/IconContentFontTests.cs deleted file mode 100644 index df1fdef..0000000 --- a/VideoDownloader.Tests/E2E/IconContentFontTests.cs +++ /dev/null @@ -1,71 +0,0 @@ -using System.Windows; -using System.Windows.Controls; -using System.Windows.Media; -using VideoDownloader.App; -using VideoDownloader.Tests.Infrastructure; - -namespace VideoDownloader.Tests.E2E; - -/// -/// 아이콘 tofu 실결함(사용자 보고 "아이콘은 절대 안고쳐지네") 회귀 테스트 — -/// 근본 원인: Shared.xaml 의 암시적 TextBlock 스타일이 FontFamily 를 UiFont 로 강제해, -/// 버튼 ContentPresenter 가 만드는 자동 TextBlock 이 IconFont 상속을 잃고 PUA 글리프가 notdef 가 됐다. -/// 아이콘 버튼의 실제 콘텐츠 TextBlock 이 아이콘 폰트로 해석되는지 실창에서 검증한다. -/// -[Collection("E2E")] -public class IconContentFontTests -{ - private static TextBlock? FindTextBlock(DependencyObject root) - { - if (root is TextBlock tb) return tb; - for (var i = 0; i < VisualTreeHelper.GetChildrenCount(root); i++) - { - if (FindTextBlock(VisualTreeHelper.GetChild(root, i)) is { } found) return found; - } - return null; - } - - [Fact] - public async Task 아이콘_버튼의_콘텐츠_TextBlock_은_아이콘폰트로_렌더된다() - { - var dataDir = Path.Combine(Path.GetTempPath(), $"vd_iconfont_{Guid.NewGuid():N}"); - Environment.SetEnvironmentVariable("VD_DATA_DIR", dataDir); - try - { - using var sta = StaDispatcher.Start(); - WpfTestApp.Ensure(sta.Dispatcher); - var (navFamily, captionFamily, bodyFamily) = await sta.Dispatcher.InvokeAsync(() => - { - // 앱과 동일 조건: 절대 pack URI 테마 재로드 후 실창 - VideoDownloader.App.App.ApplyTheme("dark"); - var win = new MainWindow { Left = 20, Top = 700, WindowStartupLocation = WindowStartupLocation.Manual }; - win.Show(); - win.UpdateLayout(); - - var nav = (Button)win.FindName("NavBack")!; - var navText = FindTextBlock(nav)!; - - // 캡션(최대화/복원) 버튼 — CaptionButton 스타일 경유 - var caption = win.FindName("MaxRestoreBtn") as Button; - var captionText = caption != null ? FindTextBlock(caption) : null; - - // 일반 본문 TextBlock 은 여전히 UI 폰트를 따라야 한다(암시 스타일의 원래 목적) - var status = (TextBlock)win.FindName("StatusText")!; - - var result = (navText.FontFamily.Source, captionText?.FontFamily.Source ?? "(캡션 버튼 없음)", status.FontFamily.Source); - win.Close(); - return result; - }); - - Assert.Equal("Segoe Fluent Icons", navFamily); - if (captionFamily != "(캡션 버튼 없음)") - Assert.Equal("Segoe Fluent Icons", captionFamily); - Assert.Contains("Pretendard", bodyFamily); // 본문은 UI 폰트 유지 - } - finally - { - Environment.SetEnvironmentVariable("VD_DATA_DIR", null); - try { Directory.Delete(dataDir, true); } catch { } - } - } -} diff --git a/VideoDownloader.Tests/E2E/IconGlyphRenderTests.cs b/VideoDownloader.Tests/E2E/IconGlyphRenderTests.cs deleted file mode 100644 index 023bc85..0000000 --- a/VideoDownloader.Tests/E2E/IconGlyphRenderTests.cs +++ /dev/null @@ -1,116 +0,0 @@ -using System.Windows; -using System.Windows.Controls; -using System.Windows.Media; -using System.Windows.Media.Imaging; -using VideoDownloader.Tests.Infrastructure; - -namespace VideoDownloader.Tests.E2E; - -/// -/// 아이콘 tofu 실결함(사용자 보고: "아이콘은 절대 안고쳐지네") 재현 시도 — -/// 테마 사전을 앱과 같은 방식으로 로드했을 때 FluentIcon/IconButton 경유 글리프가 -/// 명시적 Segoe Fluent Icons 렌더와 픽셀 단위로 같은지 검증한다. -/// 같지 않고 본문 폰트 렌더(tofu)와 같다면 리소스 해석이 깨진 것이다. -/// -[Collection("E2E")] -public class IconGlyphRenderTests -{ - private static byte[] Render(FrameworkElement el) - { - el.Measure(new Size(48, 48)); - el.Arrange(new Rect(0, 0, 48, 48)); - el.UpdateLayout(); - var rtb = new RenderTargetBitmap(48, 48, 96, 96, PixelFormats.Pbgra32); - rtb.Render(el); - var px = new byte[48 * 48 * 4]; - rtb.CopyPixels(px, 48 * 4, 0); - return px; - } - - private static int Lit(byte[] px) - { - var lit = 0; - for (var i = 3; i < px.Length; i += 4) if (px[i] > 60) lit++; - return lit; - } - - [Fact] - public async Task FluentIcon_스타일_글리프는_명시적_아이콘폰트_렌더와_동일하다() - { - using var sta = StaDispatcher.Start(); - WpfTestApp.Ensure(sta.Dispatcher); - var (family, litStyled, litExplicit, litBody, sameAsExplicit, sameAsBody) = await sta.Dispatcher.InvokeAsync(() => - { - TextBlock Make() => new() - { - Text = "", FontSize = 14, Foreground = Brushes.White, - Background = Brushes.Black, Width = 48, Height = 48, - }; - - var styled = Make(); - styled.Style = (Style)Application.Current.FindResource("FluentIcon"); - - var explicitIcon = Make(); - explicitIcon.FontFamily = new FontFamily("Segoe Fluent Icons"); - - var body = Make(); - body.FontFamily = (FontFamily)Application.Current.FindResource("UiFont"); - - var pStyled = Render(styled); - var pExplicit = Render(explicitIcon); - var pBody = Render(body); - - return (styled.FontFamily.Source, Lit(pStyled), Lit(pExplicit), Lit(pBody), - pStyled.SequenceEqual(pExplicit), pStyled.SequenceEqual(pBody)); - }); - - Assert.True(litExplicit > 0, "기준(명시적 Segoe Fluent Icons) 렌더 자체가 비어 있음 — 폰트 미설치?"); - Assert.True(sameAsExplicit && !sameAsBody, - $"FluentIcon 경유 글리프가 아이콘 폰트로 렌더되지 않음 — 해석된 폰트: '{family}', " + - $"픽셀(스타일/명시/본문): {litStyled}/{litExplicit}/{litBody}, 본문과 동일: {sameAsBody}"); - } - - [Fact] - public async Task 앱_시작_시퀀스를_그대로_태워도_FluentIcon_글리프가_렌더된다() - { - // 실제 App.OnStartup 과 동일한 순서: ApplyTheme(절대 pack URI 재로드) → 강조색 → 폰트 → 모션 - var dataDir = Path.Combine(Path.GetTempPath(), $"vd_icon_{Guid.NewGuid():N}"); - Environment.SetEnvironmentVariable("VD_DATA_DIR", dataDir); - try - { - using var sta = StaDispatcher.Start(); - WpfTestApp.Ensure(sta.Dispatcher); - var (family, same, litStyled, litExplicit) = await sta.Dispatcher.InvokeAsync(() => - { - VideoDownloader.App.App.ApplyTheme("dark"); - VideoDownloader.App.App.ApplyAccent(null); - VideoDownloader.App.App.ApplyFontSettings(); - VideoDownloader.App.App.ApplyReduceMotion(false); - - var styled = new TextBlock - { - Text = "\uE76B", FontSize = 14, Foreground = Brushes.White, - Background = Brushes.Black, Width = 48, Height = 48, - Style = (Style)Application.Current.FindResource("FluentIcon"), - }; - var explicitIcon = new TextBlock - { - Text = "\uE76B", FontSize = 14, Foreground = Brushes.White, - Background = Brushes.Black, Width = 48, Height = 48, - FontFamily = new FontFamily("Segoe Fluent Icons"), - }; - var pStyled = Render(styled); - var pExplicit = Render(explicitIcon); - return (styled.FontFamily.Source, pStyled.SequenceEqual(pExplicit), Lit(pStyled), Lit(pExplicit)); - }); - - Assert.True(same, - $"앱 시작 시퀀스 후 FluentIcon 글리프 깨짐 — 해석된 폰트: '{family}', 픽셀(스타일/명시): {litStyled}/{litExplicit}"); - } - finally - { - Environment.SetEnvironmentVariable("VD_DATA_DIR", null); - try { Directory.Delete(dataDir, true); } catch { } - } - } -} diff --git a/VideoDownloader.Tests/E2E/PermissionTrackerE2ETests.cs b/VideoDownloader.Tests/E2E/PermissionTrackerE2ETests.cs deleted file mode 100644 index 8f493cd..0000000 --- a/VideoDownloader.Tests/E2E/PermissionTrackerE2ETests.cs +++ /dev/null @@ -1,109 +0,0 @@ -using System.Windows; -using System.Windows.Threading; -using Microsoft.Web.WebView2.Core; -using VideoDownloader.Browser; -using VideoDownloader.Tests.Infrastructure; - -namespace VideoDownloader.Tests.E2E; - -/// -/// E2E (T3-11/T3-14): 실제 WebView2 에서 권한 정책 응답과 추적 요청 차단·집계를 검증. -/// TabViewService 와 동일한 배선(PermissionGate/TrackerBlocklist/TrackerCounter)을 사용한다. -/// -[Collection("E2E")] -public class PermissionTrackerE2ETests -{ - [Fact] - public async Task 권한_요청이_정책을_거쳐_허용된다_T3_11() - { - using var sta = StaDispatcher.Start(); - var udf = Path.Combine(Path.GetTempPath(), $"vd_e2e_{Guid.NewGuid():N}"); - var result = await sta.InvokeAsync(async () => - { - var window = new Window(); - var browser = new Microsoft.Web.WebView2.Wpf.WebView2(); - window.Content = browser; - window.Show(); - - var env = await CoreWebView2Environment.CreateAsync(userDataFolder: udf); - await browser.EnsureCoreWebView2Async(env); - var cv = browser.CoreWebView2; - - // TabViewService 배선과 동일: 기억된 판정은 즉시 응답(출처는 이벤트에서 관측된 것으로 기억) - var gate = new PermissionGate(); - cv.PermissionRequested += (_, e) => - { - var o = VideoDownloader.App.Services.TabViewService.OriginOf(e.Uri); - gate.Remember("Notifications", o, PermissionVerdict.Allow); // E2E: 알림은 허용 정책 - var verdict = gate.Decide(e.PermissionKind.ToString(), o); - e.State = verdict == PermissionVerdict.Allow ? CoreWebView2PermissionState.Allow : CoreWebView2PermissionState.Deny; - e.Handled = true; - }; - - var html = ""; - cv.NavigateToString(html); - await WaitUntilNavCompleted(cv); - var title = await Wait.Until(() => Task.FromResult(cv.DocumentTitle ?? ""), - t => t.StartsWith("PERM=", StringComparison.Ordinal), 10000); - - window.Close(); - return title; - }); - - try { Directory.Delete(udf, true); } catch { } - Assert.Equal("PERM=granted", result); - } - - [Fact] - public async Task 블랙리스트_스크립트가_차단되고_카운터에_집계된다_T3_14() - { - using var sta = StaDispatcher.Start(); - var udf = Path.Combine(Path.GetTempPath(), $"vd_e2e_{Guid.NewGuid():N}"); - var result = await sta.InvokeAsync(async () => - { - var window = new Window(); - var browser = new Microsoft.Web.WebView2.Wpf.WebView2(); - window.Content = browser; - window.Show(); - - var env = await CoreWebView2Environment.CreateAsync(userDataFolder: udf); - await browser.EnsureCoreWebView2Async(env); - var cv = browser.CoreWebView2; - - var bl = new TrackerBlocklist(new[] { "blocked.test" }); - var counter = new TrackerCounter(); - cv.AddWebResourceRequestedFilter("*", CoreWebView2WebResourceContext.All); - cv.WebResourceRequested += (_, e) => - { - if (!bl.Matches(new Uri(e.Request.Uri))) return; - e.Response = env.CreateWebResourceResponse(null, 204, "Blocked", ""); - counter.Record(e.Request.Uri); - }; - - var html = "

tracker-e2e

" + - "" + - "" + - "" + - ""; - cv.NavigateToString(html); - await WaitUntilNavCompleted(cv); - await Wait.Until(() => Task.FromResult(counter.Total), t => t >= 2, 10000); - - window.Close(); - return counter.Total; - }); - - try { Directory.Delete(udf, true); } catch { } - Assert.Equal(2, result); // 정상 도메인(ok.example.com)은 집계되지 않음 - } - - private static async Task WaitUntilNavCompleted(CoreWebView2 cv) - { - var tcs = new TaskCompletionSource(); - EventHandler h = (_, _) => tcs.TrySetResult(); - cv.NavigationCompleted += h; - if (tcs.Task.IsCompleted) return; - await Task.WhenAny(tcs.Task, Task.Delay(15000)); - cv.NavigationCompleted -= h; - } -} diff --git a/VideoDownloader.Tests/E2E/ReaderModeE2ETests.cs b/VideoDownloader.Tests/E2E/ReaderModeE2ETests.cs deleted file mode 100644 index 3b9f622..0000000 --- a/VideoDownloader.Tests/E2E/ReaderModeE2ETests.cs +++ /dev/null @@ -1,85 +0,0 @@ -using System.Windows; -using Microsoft.Web.WebView2.Core; -using VideoDownloader.App.Browser.Features; -using VideoDownloader.Browser.Tabs; -using VideoDownloader.Tests.Infrastructure; - -namespace VideoDownloader.Tests.E2E; - -/// -/// E2E (T2-4): 실제 WebView2 + 번들된 Mozilla Readability.js 로 -/// 기사 페이지에서 본문을 추출해 리더 뷰로 교체하고 원본 URL 복귀까지 검증. -/// -[Collection("E2E")] -public class ReaderModeE2ETests -{ - private const string ArticleHtml = """ -테스트 기사 - -
-

리더 모드 E2E 기사

-

첫 번째 문단입니다. 이 문단은 Readability 가 본문으로 추출해야 합니다. 충분한 길이의 텍스트가 필요하므로 몇 번 더 반복합니다. 본문 본문 본문.

-

두 번째 문단입니다. 리더 모드는 광고와 내비게이션을 제거하고 본문만 남깁니다. 추출 결과에 이 텍스트가 포함되어야 합니다.

-

세 번째 문단입니다. 문단이 세 개 이상이면 Readability 의 휴리스틱이 본문으로 판정합니다. 마커텍스트-고유문구-레인보우4747.

-
-
푸터 링크 모음
- -"""; - - [Fact] - public async Task 기사를_리더로_추출하고_원본으로_복귀한다() - { - using var sta = StaDispatcher.Start(); - var udf = Path.Combine(Path.GetTempPath(), $"vd_reader_{Guid.NewGuid():N}"); - var ok = await sta.InvokeAsync(async () => - { - var window = new Window(); - var browser = new Microsoft.Web.WebView2.Wpf.WebView2(); - window.Content = browser; - window.Show(); - var env = await CoreWebView2Environment.CreateAsync(userDataFolder: udf); - await browser.EnsureCoreWebView2Async(env); - var cv = browser.CoreWebView2; - - cv.NavigateToString(ArticleHtml); - await WaitNav(cv); - - var tab = new TabItem { View = browser }; - - // 1) 리더 진입 - var entered = await ReaderMode.ToggleAsync(tab, lightTheme: false); - await Wait.Until(() => Task.FromResult(cv.DocumentTitle ?? ""), t => t.Contains("테스트 기사"), 15000); - var titleAfter = cv.DocumentTitle ?? ""; - var bodyText = await cv.ExecuteScriptAsync("document.body.innerText"); - var hasMarker = bodyText.Contains("마커텍스트-고유문구-레인보우4747"); - var hasNav = bodyText.Contains("광고 광고 광고"); - var isReader = tab.IsReader; - var originalSaved = tab.ReaderOriginalUrl; - - // 2) 복귀 - var exited = await ReaderMode.ToggleAsync(tab, lightTheme: false); - var restoredReader = tab.IsReader == false; - - window.Close(); - return (entered: entered == true, titleAfter, hasMarker, navRemoved: !hasNav, isReader, originalSaved, exited: exited == false, restoredReader); - }); - - try { Directory.Delete(udf, true); } catch { } - Assert.True(ok.entered, "리더 진입 실패"); - Assert.Contains("테스트 기사", ok.titleAfter); - Assert.True(ok.hasMarker, "본문 마커 누락"); - Assert.True(ok.navRemoved, "내비/광고 제거 안됨"); - Assert.True(ok.isReader); - Assert.True(ok.exited); - Assert.True(ok.restoredReader); - } - - private static Task WaitNav(CoreWebView2 cv) - { - var tcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); - EventHandler? h = null; - h = (_, _) => { cv.NavigationCompleted -= h; tcs.TrySetResult(); }; - cv.NavigationCompleted += h; - return tcs.Task.WaitAsync(TimeSpan.FromSeconds(15)); - } -} diff --git a/VideoDownloader.Tests/E2E/SettingsUpdateUiE2ETests.cs b/VideoDownloader.Tests/E2E/SettingsUpdateUiE2ETests.cs deleted file mode 100644 index a7236c0..0000000 --- a/VideoDownloader.Tests/E2E/SettingsUpdateUiE2ETests.cs +++ /dev/null @@ -1,47 +0,0 @@ -using System.Windows; -using VideoDownloader.App; -using VideoDownloader.Core.Config; -using VideoDownloader.Tests.Infrastructure; - -namespace VideoDownloader.Tests.E2E; - -/// -/// E2E: 설정창 "앱 업데이트" 섹션(DEPLOYMENT_PLAN §6 자동 업데이트 v1) — -/// 실제 SettingsWindow 를 띄워 설정값 로드 배선과 잘못된 저장소 형식의 즉시 안내(네트워크 불필요 경로)를 검증. -/// -[Collection("E2E")] -public class SettingsUpdateUiE2ETests -{ - [Fact] - public void 설정창_업데이트_저장소_로드와_형식오류_안내() - { - // VD_DATA_DIR 격리: SettingsWindow 가 참조하는 프로필 경로를 실사용자와 분리 - var dataDir = Path.Combine(Path.GetTempPath(), $"vd_set_{Guid.NewGuid():N}"); - Environment.SetEnvironmentVariable("VD_DATA_DIR", dataDir); - try - { - using var sta = StaDispatcher.Start(); - WpfTestApp.Ensure(sta.Dispatcher); - sta.Invoke(() => - { - var config = new AppConfig { UpdateRepo = "user/videodownloader" }; - var win = new SettingsWindow(config); - - // 설정 → UI 로드 배선 - Assert.Equal("user/videodownloader", win.UpdateRepoBox.Text); - - // owner/repo 형식이 아니면 네트워크 호출 없이 즉시 안내 - win.UpdateRepoBox.Text = "invalid-format"; - win.CheckUpdate_Click(null, new RoutedEventArgs()); - Assert.Contains("owner/repo", win.UpdateResultText.Text); - - win.Close(); - }); - } - finally - { - Environment.SetEnvironmentVariable("VD_DATA_DIR", null); - try { Directory.Delete(dataDir, recursive: true); } catch (DirectoryNotFoundException) { } - } - } -} diff --git a/VideoDownloader.Tests/E2E/UiUsecaseAccessibilityRedTests.cs b/VideoDownloader.Tests/E2E/UiUsecaseAccessibilityRedTests.cs deleted file mode 100644 index 5f0064a..0000000 --- a/VideoDownloader.Tests/E2E/UiUsecaseAccessibilityRedTests.cs +++ /dev/null @@ -1,142 +0,0 @@ -using VideoDownloader.Core.Config; -using VideoDownloader.Tests.Infrastructure; - -namespace VideoDownloader.Tests.E2E; - -/// -/// UI 복잡 버전 RED 스펙 — §G 접근성 유즈케이스(docs/UI_USECASES.md §G, UC-A01~A20). -/// RED 단계: 전부 실패하는 것이 정상이다. -/// -public class UiUsecaseAccessibilityRedTests -{ - [Fact] - public void UC_A01_자동화_속성이_하나라도_사용된다() - => SourceTree.Usecase( - SourceTree.MainWindowXaml.Contains("AutomationProperties"), - "UC-A01", "화면 낭독기 지원을 위한 AutomationProperties 사용이 필요하다"); - - [Fact] - public void UC_A02_주요_컨트롤에_자동화_이름이_부여된다() - { - var count = System.Text.RegularExpressions.Regex.Matches(SourceTree.MainWindowXaml, "AutomationProperties\\.Name").Count; - SourceTree.Usecase( - count >= 15, - $"UC-A02", $"주요 컨트롤 15개 이상에 AutomationProperties.Name 이 필요하다 (현재 {count}개)"); - } - - [Fact] - public void UC_A03_상태_변화가_낭독기에_자동_전달된다() - => SourceTree.Usecase( - SourceTree.MainWindowXaml.Contains("LiveSetting"), - "UC-A03", "상태바·진행률의 LiveSetting 선언이 필요하다"); - - [Fact] - public void UC_A04_시스템_고대비_모드를_감지한다() - => SourceTree.Usecase( - SourceTree.MainWindowCs.Contains("HighContrast"), - "UC-A04", "SystemParameters.HighContrast 감지 처리가 필요하다"); - - [Fact] - public void UC_A05_키보드_포커스_비주얼이_정의된다() - => SourceTree.Usecase( - SourceTree.SharedXaml.Contains("FocusVisualStyle"), - "UC-A05", "공용 FocusVisualStyle 정의가 필요하다"); - - [Fact] - public void UC_A06_Tab_순서가_지정된다() - => SourceTree.Usecase( - SourceTree.MainWindowXaml.Contains("TabIndex"), - "UC-A06", "논리적 Tab 이동을 위한 TabIndex 지정이 필요하다"); - - [Fact] - public void UC_A07_ToolTipService_설정이_사용된다() - => SourceTree.Usecase( - SourceTree.MainWindowXaml.Contains("ToolTipService"), - "UC-A07", "툴팁 표시 시간 등 ToolTipService 설정이 필요하다"); - - [Fact] - public void UC_A08_접근_키_AccessText가_사용된다() - => SourceTree.Usecase( - SourceTree.MainWindowXaml.Contains("AccessText"), - "UC-A08", "Alt 접근 키를 위한 AccessText 사용이 필요하다"); - - [Fact] - public void UC_A09_사용자_지정_자동화_피어가_있다() - => SourceTree.Usecase( - SourceTree.MainWindowCs.Contains("AutomationPeer"), - "UC-A09", "목록·탭 컨트롤용 AutomationPeer 구현이 필요하다"); - - [Fact] - public void UC_A10_HelpText가_제공된다() - => SourceTree.Usecase( - SourceTree.MainWindowXaml.Contains("AutomationProperties.HelpText"), - "UC-A10", "컨트롤 추가 설명 AutomationProperties.HelpText 가 필요하다"); - - [Fact] - public void UC_A11_완료_상태가_색과_무관하게_표시된다() - => SourceTree.Usecase( - SourceTree.MainWindowXaml.Contains("SuccessIcon"), - "UC-A11", "완료 상태 아이콘(SuccessIcon)으로 색 무의존 표시가 필요하다"); - - [Fact] - public void UC_A12_접근성_설정_섹션이_있다() - => SourceTree.Usecase( - SourceTree.SettingsWindowXaml.Contains("접근성"), - "UC-A12", "설정창에 '접근성' 섹션이 필요하다"); - - [Fact] - public void UC_A13_UI_확대_배율을_설정할_수_있다() - => SourceTree.Usecase( - SourceTree.PropertyExists(typeof(AppConfig), "UiFontScale"), - "UC-A13", "저시력 지원용 AppConfig.UiFontScale 속성이 필요하다"); - - [Fact] - public void UC_A14_팝업_키보드_탐색이_설정된다() - => SourceTree.Usecase( - SourceTree.MainWindowXaml.Contains("KeyboardNavigation.TabNavigation"), - "UC-A14", "팝업 내 키보드 탐색(KeyboardNavigation) 설정이 필요하다"); - - [Fact] - public void UC_A15_자막_표시_옵션이_있다() - => SourceTree.Usecase( - SourceTree.PropertyExists(typeof(AppConfig), "ShowCaptions"), - "UC-A15", "AppConfig.ShowCaptions 속성이 필요하다"); - - [Fact] - public void UC_A16_애니메이션_감소_설정이_스타일에_반영된다() - => SourceTree.Usecase( - SourceTree.SharedXaml.Contains("ReduceMotion"), - "UC-A16", "Shared.xaml 이 ReduceMotion 설정을 스타일에 반영해야 한다"); - - [Fact] - public void UC_A17_리더_모드_HTML에_언어가_선언된다() - => SourceTree.Usecase( - SourceTree.ReaderModeCs.Contains("lang="), - "UC-A17", "리더 모드 HTML 에 lang=\"ko\" 선언이 필요하다"); - - [Fact] - public void UC_A18_접근성_선언_문서가_있다() - => SourceTree.Usecase( - SourceTree.DocFileExists("ACCESSIBILITY.md"), - "UC-A18", "접근성 지원 범위 문서(docs/ACCESSIBILITY.md)가 필요하다"); - - [Fact] - public void UC_A19_라이트_진행_트랙이_배경과_구별된다() - { - var fg = SourceTree.BrushHex(SourceTree.ThemeLightXaml, "TrackBrush"); - var bg = SourceTree.BrushHex(SourceTree.ThemeLightXaml, "PanelBg"); - Assert.False(fg is null || bg is null, "UC-A19 — 테마 브러시 파싱 실패"); - var ratio = SourceTree.ContrastRatio(fg!, bg!); - Assert.True(ratio >= 3.0, $"UC-A19 RED — 라이트 TrackBrush/PanelBg 대비 {ratio:F2}:1 < 3:1 (비텍스트 구성요소 기준)"); - } - - [Fact] - public void UC_A20_버튼_테두리가_카드_배경과_구별된다() - { - var fg = SourceTree.BrushHex(SourceTree.ThemeDarkXaml, "BorderBrush"); - var bg = SourceTree.BrushHex(SourceTree.ThemeDarkXaml, "CardBg"); - Assert.False(fg is null || bg is null, "UC-A20 — 테마 브러시 파싱 실패"); - var ratio = SourceTree.ContrastRatio(fg!, bg!); - Assert.True(ratio >= 3.0, $"UC-A20 RED — 다크 BorderBrush/CardBg 대비 {ratio:F2}:1 < 3:1 (클릭 대상 식별 기준)"); - } -} diff --git a/VideoDownloader.Tests/E2E/UiUsecaseDownloadsRedTests.cs b/VideoDownloader.Tests/E2E/UiUsecaseDownloadsRedTests.cs deleted file mode 100644 index 70b0c65..0000000 --- a/VideoDownloader.Tests/E2E/UiUsecaseDownloadsRedTests.cs +++ /dev/null @@ -1,194 +0,0 @@ -using VideoDownloader.App; -using VideoDownloader.App.Browser.Features; -using VideoDownloader.App.ViewModels; -using VideoDownloader.Core.Config; -using VideoDownloader.Tests.Infrastructure; - -namespace VideoDownloader.Tests.E2E; - -/// -/// UI 복잡 버전 RED 스펙 — §E 다운로드 관리자 유즈케이스(docs/UI_USECASES.md §E, UC-D01~D30). -/// RED 단계: 전부 실패하는 것이 정상이다. -/// -public class UiUsecaseDownloadsRedTests -{ - [Fact] - public void UC_D01_다운로드_정렬_순서를_설정할_수_있다() - => SourceTree.Usecase( - SourceTree.PropertyExists(typeof(AppConfig), "DownloadSortOrder"), - "UC-D01", "AppConfig.DownloadSortOrder 속성이 필요하다"); - - [Fact] - public void UC_D02_진행중_완료_실패_필터_탭이_있다() - => SourceTree.Usecase( - SourceTree.MainWindowXaml.Contains("DownloadFilterTabs"), - "UC-D02", "다운로드 필터 탭(DownloadFilterTabs) 요소가 필요하다"); - - [Fact] - public void UC_D03_다운로드_목록을_검색할_수_있다() - => SourceTree.Usecase( - SourceTree.MainWindowXaml.Contains("DownloadSearchBox"), - "UC-D03", "다운로드 검색 상자(DownloadSearchBox)가 필요하다"); - - [Fact] - public void UC_D04_남은_시간_ETA가_카드에_표시된다() - => SourceTree.Usecase( - SourceTree.PropertyExists(typeof(DownloadItemViewModel), "RemainingText"), - "UC-D04", "다운로드 카드 VM 에 RemainingText(남은 시간) 속성이 필요하다"); - - [Fact] - public void UC_D05_현재_속도가_카드에_표시된다() - => SourceTree.Usecase( - SourceTree.PropertyExists(typeof(DownloadItemViewModel), "SpeedText"), - "UC-D05", "다운로드 카드 VM 에 SpeedText 속성이 필요하다"); - - [Fact] - public void UC_D06_전체_일시정지를_할_수_있다() - => SourceTree.Usecase( - SourceTree.MethodExists(typeof(MainWindow), "PauseAllDownloads"), - "UC-D06", "MainWindow.PauseAllDownloads() 가 필요하다"); - - [Fact] - public void UC_D07_전체_재개를_할_수_있다() - => SourceTree.Usecase( - SourceTree.MethodExists(typeof(MainWindow), "ResumeAllDownloads"), - "UC-D07", "MainWindow.ResumeAllDownloads() 가 필요하다"); - - [Fact] - public void UC_D08_완료_항목_자동_치움을_설정할_수_있다() - => SourceTree.Usecase( - SourceTree.PropertyExists(typeof(AppConfig), "AutoClearCompleted"), - "UC-D08", "AppConfig.AutoClearCompleted 속성이 필요하다"); - - [Fact] - public void UC_D09_재시도_횟수가_카드에_표시된다() - => SourceTree.Usecase( - SourceTree.PropertyExists(typeof(DownloadItemViewModel), "RetryCount"), - "UC-D09", "다운로드 카드 VM 에 RetryCount 속성이 필요하다"); - - [Fact] - public void UC_D10_세그먼트_진행이_시각화된다() - => SourceTree.Usecase( - SourceTree.PropertyExists(typeof(DownloadItemViewModel), "SegmentMap"), - "UC-D10", "세그먼트별 진행 맵(SegmentMap) 속성이 필요하다"); - - [Fact] - public void UC_D11_토스트_알림_컴포넌트가_있다() - => SourceTree.Usecase( - SourceTree.FindType("ToastNotifier") is not null, - "UC-D11", "다운로드 완료 알림을 담당하는 ToastNotifier 컴포넌트가 필요하다"); - - [Fact] - public void UC_D12_알림_소리를_설정할_수_있다() - => SourceTree.Usecase( - SourceTree.PropertyExists(typeof(AppConfig), "NotifySound"), - "UC-D12", "AppConfig.NotifySound 속성이 필요하다"); - - [Fact] - public void UC_D13_완료_시_폴더_자동_열기를_설정할_수_있다() - => SourceTree.Usecase( - SourceTree.PropertyExists(typeof(AppConfig), "OpenFolderOnComplete"), - "UC-D13", "AppConfig.OpenFolderOnComplete 속성이 필요하다"); - - [Fact] - public void UC_D14_카드_우클릭_컨텍스트_메뉴가_있다() - => SourceTree.Usecase( - SourceTree.MainWindowXaml.Contains("CardContextMenu"), - "UC-D14", "다운로드 카드 컨텍스트 메뉴(CardContextMenu)가 필요하다"); - - [Fact] - public void UC_D15_카드를_펼쳐_상세_정보를_본다() - => SourceTree.Usecase( - SourceTree.MainWindowXaml.Contains("CardDetailExpander"), - "UC-D15", "카드 상세 펼침(CardDetailExpander) 요소가 필요하다"); - - [Fact] - public void UC_D16_대기_현황_요약이_표시된다() - => SourceTree.Usecase( - SourceTree.MainWindowXaml.Contains("QueueSummaryText"), - "UC-D16", "패널의 대기 현황 요약(QueueSummaryText)이 필요하다"); - - [Fact] - public void UC_D17_속도_스파크라인이_표시된다() - => SourceTree.Usecase( - SourceTree.MainWindowXaml.Contains("SpeedSparkline"), - "UC-D17", "속도 추이 스파크라인(SpeedSparkline) 요소가 필요하다"); - - [Fact] - public void UC_D18_전체_속도_합계가_표시된다() - => SourceTree.Usecase( - SourceTree.MainWindowXaml.Contains("GlobalSpeedText"), - "UC-D18", "전체 다운로드 속도(GlobalSpeedText) 표시가 필요하다"); - - [Fact] - public void UC_D19_파일_총_크기가_카드에_표시된다() - => SourceTree.Usecase( - SourceTree.PropertyExists(typeof(DownloadItemViewModel), "TotalSizeText"), - "UC-D19", "카드 VM 에 TotalSizeText 속성이 필요하다"); - - [Fact] - public void UC_D20_자막_언어를_설정할_수_있다() - => SourceTree.Usecase( - SourceTree.SettingsWindowXaml.Contains("SubtitleLangBox"), - "UC-D20", "설정창에 자막 언어 선택(SubtitleLangBox)이 필요하다"); - - [Fact] - public void UC_D21_다운로드_스케줄러가_있다() - => SourceTree.Usecase( - SourceTree.FindType("DownloadScheduler") is not null, - "UC-D21", "시간대 예약을 담당하는 DownloadScheduler 컴포넌트가 필요하다"); - - [Fact] - public void UC_D22_속도_상한을_설정할_수_있다() - => SourceTree.Usecase( - SourceTree.PropertyExists(typeof(AppConfig), "MaxDownloadSpeedKbps"), - "UC-D22", "AppConfig.MaxDownloadSpeedKbps 속성이 필요하다"); - - [Fact] - public void UC_D23_목록을_CSV로_내보낼_수_있다() - => SourceTree.Usecase( - SourceTree.MethodExists(typeof(MainWindow), "ExportDownloads"), - "UC-D23", "MainWindow.ExportDownloads() 내보내기 기능이 필요하다"); - - [Fact] - public void UC_D24_항목_우선순위를_정할_수_있다() - => SourceTree.Usecase( - SourceTree.PropertyExists(typeof(DownloadItemViewModel), "Priority"), - "UC-D24", "카드 VM 에 대기열 우선순위(Priority) 속성이 필요하다"); - - [Fact] - public void UC_D25_중복_다운로드_경고를_받는다() - => SourceTree.Usecase( - SourceTree.MethodExists(typeof(MainWindow), "ConfirmDuplicateDownload"), - "UC-D25", "MainWindow.ConfirmDuplicateDownload() 확인 절차가 필요하다"); - - [Fact] - public void UC_D26_최종_저장_파일명이_카드에_표시된다() - => SourceTree.Usecase( - SourceTree.PropertyExists(typeof(DownloadItemViewModel), "FinalFileName"), - "UC-D26", "카드 VM 에 충돌 회피 후 파일명(FinalFileName)이 필요하다"); - - [Fact] - public void UC_D27_오류_메시지_복사_버튼이_있다() - => SourceTree.Usecase( - SourceTree.MainWindowXaml.Contains("CopyErrorButton"), - "UC-D27", "오류 복사 버튼(CopyErrorButton) 요소가 필요하다"); - - [Fact] - public void UC_D28_페이지_다운로드도_전체_일시정지가_된다() - => SourceTree.Usecase( - SourceTree.MethodExists(typeof(PageDownloadTracker), "PauseAll"), - "UC-D28", "PageDownloadTracker.PauseAll() 메서드가 필요하다"); - - [Fact] - public void UC_D29_미디어_종류_배지가_표시된다() - => SourceTree.Usecase( - SourceTree.MainWindowXaml.Contains("MediaKindBadge"), - "UC-D29", "감지 미디어 종류 배지(MediaKindBadge) 요소가 필요하다"); - - [Fact] - public void UC_D30_사이트별_그룹_헤더가_표시된다() - => SourceTree.Usecase( - SourceTree.MainWindowXaml.Contains("SiteGroupHeader"), - "UC-D30", "사이트별 묶음 헤더(SiteGroupHeader) 요소가 필요하다"); -} diff --git a/VideoDownloader.Tests/E2E/UiUsecaseInteractionRedTests.cs b/VideoDownloader.Tests/E2E/UiUsecaseInteractionRedTests.cs deleted file mode 100644 index 60627aa..0000000 --- a/VideoDownloader.Tests/E2E/UiUsecaseInteractionRedTests.cs +++ /dev/null @@ -1,131 +0,0 @@ -using VideoDownloader.Core.Config; -using VideoDownloader.Tests.Infrastructure; - -namespace VideoDownloader.Tests.E2E; - -/// -/// UI 복잡 버전 RED 스펙 — §H 키보드·마우스 인터랙션 유즈케이스(docs/UI_USECASES.md §H, UC-K01~K20). -/// RED 단계: 전부 실패하는 것이 정상이다. -/// -public class UiUsecaseInteractionRedTests -{ - [Fact] - public void UC_K01_단축키_설정_항목이_있다() - => SourceTree.Usecase( - SourceTree.SettingsWindowXaml.Contains("단축키"), - "UC-K01", "설정창에 '단축키' 항목이 필요하다"); - - [Fact] - public void UC_K02_단축키를_사용자가_바꿀_수_있다() - => SourceTree.Usecase( - SourceTree.PropertyExists(typeof(AppConfig), "Shortcuts"), - "UC-K02", "AppConfig.Shortcuts 사용자 지정 단축키 맵이 필요하다"); - - [Fact] - public void UC_K03_단축키_관리_컴포넌트가_있다() - => SourceTree.Usecase( - SourceTree.FindType("ShortcutManager") is not null, - "UC-K03", "충돌 검증을 포함한 ShortcutManager 컴포넌트가 필요하다"); - - [Fact] - public void UC_K04_단축키_전체_목록_팝업이_있다() - => SourceTree.Usecase( - SourceTree.MainWindowXaml.Contains("ShortcutHelpPopup"), - "UC-K04", "단축키 도움말 팝업(ShortcutHelpPopup)이 필요하다"); - - [Fact] - public void UC_K05_마우스_제스처로_탐색할_수_있다() - => SourceTree.Usecase( - SourceTree.MainWindowCs.Contains("MouseGesture") || SourceTree.MainWindowCs.Contains("XButton"), - "UC-K05", "마우스 제스처(XButton 등) 뒤로/앞처 처리가 필요하다"); - - [Fact] - public void UC_K06_휠_클릭으로_새_탭을_연다() - => SourceTree.Usecase( - SourceTree.MainWindowCs.Contains("MiddleButton"), - "UC-K06", "링크 휠 클릭(MiddleButton) 새 탭 처리가 필요하다"); - - [Fact] - public void UC_K07_붙여넣기_즉시_이동_옵션이_있다() - => SourceTree.Usecase( - SourceTree.PropertyExists(typeof(AppConfig), "PasteAndGo"), - "UC-K07", "AppConfig.PasteAndGo 속성이 필요하다"); - - [Fact] - public void UC_K08_주소창_포커스_시_전체_선택_옵션이_있다() - => SourceTree.Usecase( - SourceTree.PropertyExists(typeof(AppConfig), "FocusSelectsAddress"), - "UC-K08", "AppConfig.FocusSelectsAddress 속성이 필요하다"); - - [Fact] - public void UC_K09_모두_일시정지_빠른_명령이_있다() - => SourceTree.Usecase( - SourceTree.MainWindowCs.Contains("모두 일시정지"), - "UC-K09", "팔레트/버튼의 '모두 일시정지' 명령이 필요하다"); - - [Fact] - public void UC_K10_Esc로_모든_팝업을_한번에_닫는다() - => SourceTree.Usecase( - SourceTree.MainWindowCs.Contains("CloseAllPopups") || SourceTree.MainWindowCs.Contains("CloseAllOverlays"), - "UC-K10", "열린 팝업 일괄 닫기(CloseAllPopups) 처리가 필요하다"); - - [Fact] - public void UC_K11_다운로드_중_종료_확인을_받는다() - => SourceTree.Usecase( - SourceTree.MainWindowCs.Contains("종료하시겠습니까"), - "UC-K11", "다운로드 진행 중 종료 확인 대화상자가 필요하다"); - - [Fact] - public void UC_K12_F12_개발자_도구를_연다() - => SourceTree.Usecase( - SourceTree.MainWindowCs.Contains("OpenDevTools"), - "UC-K12", "F12 개발자 도구(OpenDevTools) 처리가 필요하다"); - - [Fact] - public void UC_K13_프로필_전환_기능이_있다() - => SourceTree.Usecase( - SourceTree.MainWindowCs.Contains("프로필 전환"), - "UC-K13", "세션 프로필 전환 기능이 필요하다"); - - [Fact] - public void UC_K14_현재_줌_배율이_표시된다() - => SourceTree.Usecase( - SourceTree.MainWindowXaml.Contains("ZoomIndicator"), - "UC-K14", "줌 배율 표시(ZoomIndicator) 요소가 필요하다"); - - [Fact] - public void UC_K15_기본_줌을_설정할_수_있다() - => SourceTree.Usecase( - SourceTree.PropertyExists(typeof(AppConfig), "DefaultZoomFactor"), - "UC-K15", "AppConfig.DefaultZoomFactor 속성이 필요하다"); - - [Fact] - public void UC_K16_즐겨찾기_관리_창이_있다() - => SourceTree.Usecase( - SourceTree.FindType("BookmarkManagerWindow") is not null, - "UC-K16", "즐겨찾기 관리 창(BookmarkManagerWindow)이 필요하다"); - - [Fact] - public void UC_K17_방문_기록_개별_삭제가_된다() - => SourceTree.Usecase( - SourceTree.MainWindowXaml.Contains("DeleteHistory_Click"), - "UC-K17", "방문 기록 개별 삭제(DeleteHistory_Click) 처리기가 필요하다"); - - [Fact] - public void UC_K18_영역을_지정해_캡처할_수_있다() - => SourceTree.Usecase( - SourceTree.MainWindowCs.Contains("RegionCapture"), - "UC-K18", "영역 지정 캡처(RegionCapture) 기능이 필요하다"); - - [Fact] - public void UC_K19_노트를_Ctrl_S로_저장한다() - => SourceTree.Usecase( - SourceTree.MainWindowCs.Contains("NotesSave_Click"), - "UC-K19", "노트 저장(NotesSave_Click) 처리기가 필요하다"); - - [Fact] - public void UC_K20_링크_우클릭으로_바로_받는다() - => SourceTree.Usecase( - SourceTree.MainWindowCs.Contains("링크 다운로드"), - "UC-K20", "페이지 링크 우클릭 '링크 다운로드' 메뉴가 필요하다"); -} diff --git a/VideoDownloader.Tests/E2E/UiUsecaseLayoutRedTests.cs b/VideoDownloader.Tests/E2E/UiUsecaseLayoutRedTests.cs deleted file mode 100644 index 958f4f5..0000000 --- a/VideoDownloader.Tests/E2E/UiUsecaseLayoutRedTests.cs +++ /dev/null @@ -1,168 +0,0 @@ -using VideoDownloader.App; -using VideoDownloader.Core.Config; -using VideoDownloader.Tests.Infrastructure; - -namespace VideoDownloader.Tests.E2E; - -/// -/// UI 복잡 버전 RED 스펙 — §C 레이아웃·밀도·창 상태 유즈케이스(docs/UI_USECASES.md §C, UC-L01~L26). -/// RED 단계: 전부 실패하는 것이 정상이다. -/// -public class UiUsecaseLayoutRedTests -{ - [Fact] - public void UC_L01_UI_밀도_설정이_있다() - => SourceTree.Usecase( - SourceTree.PropertyExists(typeof(AppConfig), "UiDensity"), - "UC-L01", "컴팩트/보통/여유 밀도를 고르는 AppConfig.UiDensity 가 필요하다"); - - [Fact] - public void UC_L02_설정창에서_밀도를_바꿀_수_있다() - => SourceTree.Usecase( - SourceTree.SettingsWindowXaml.Contains("밀도"), - "UC-L02", "설정창에 '밀도' 항목이 노출되어야 한다"); - - [Fact] - public void UC_L03_작은_간격_토큰이_정의된다() - => SourceTree.Usecase( - SourceTree.HasKey(SourceTree.SharedXaml, "Spacing.S"), - "UC-L03", "간격 토큰 Spacing.S 가 필요하다"); - - [Fact] - public void UC_L04_중간_간격_토큰이_정의된다() - => SourceTree.Usecase( - SourceTree.HasKey(SourceTree.SharedXaml, "Spacing.M"), - "UC-L04", "간격 토큰 Spacing.M 이 필요하다"); - - [Fact] - public void UC_L05_큰_간격_토큰이_정의된다() - => SourceTree.Usecase( - SourceTree.HasKey(SourceTree.SharedXaml, "Spacing.L"), - "UC-L05", "간격 토큰 Spacing.L 이 필요하다"); - - [Fact] - public void UC_L06_카드_모서리_둥글기_토큰이_정의된다() - => SourceTree.Usecase( - SourceTree.HasKey(SourceTree.SharedXaml, "CornerRadius.Card"), - "UC-L06", "카드 둥근 모서리 토큰 CornerRadius.Card 가 필요하다"); - - [Fact] - public void UC_L07_컴팩트_모드_상태가_저장된다() - => SourceTree.Usecase( - SourceTree.PropertyExists(typeof(AppConfig), "CompactMode"), - "UC-L07", "AppConfig.CompactMode 로 재시작 후에도 컴팩트 상태가 유지되어야 한다"); - - [Fact] - public void UC_L08_툴바에_컴팩트_토글_버튼이_있다() - => SourceTree.Usecase( - SourceTree.MainWindowXaml.Contains("Name=\"CompactModeBtn\""), - "UC-L08", "툴바의 CompactModeBtn 로 컴팩트 모드를 빠르게 켜고 끌 수 있어야 한다"); - - [Fact] - public void UC_L09_세로_탭_기본_여부를_설정할_수_있다() - => SourceTree.Usecase( - SourceTree.PropertyExists(typeof(AppConfig), "VerticalTabsDefault"), - "UC-L09", "AppConfig.VerticalTabsDefault 속성이 필요하다"); - - [Fact] - public void UC_L10_분할_화면_비율이_저장된다() - => SourceTree.Usecase( - SourceTree.PropertyExists(typeof(AppConfig), "SplitViewRatio"), - "UC-L10", "분할 화면 비율(AppConfig.SplitViewRatio)이 저장·복원되어야 한다"); - - [Fact] - public void UC_L11_창_위치_크기가_저장된다() - => SourceTree.Usecase( - SourceTree.PropertyExists(typeof(AppConfig), "WindowBounds"), - "UC-L11", "AppConfig.WindowBounds 로 창 위치·크기가 복원되어야 한다"); - - [Fact] - public void UC_L12_최대화_상태가_저장된다() - => SourceTree.Usecase( - SourceTree.PropertyExists(typeof(AppConfig), "WindowMaximized"), - "UC-L12", "AppConfig.WindowMaximized 로 최대화 여부가 복원되어야 한다"); - - [Fact] - public void UC_L13_루트_요소가_레이아웃_반올림을_켠다() - => SourceTree.Usecase( - SourceTree.MainWindowXaml.Contains("UseLayoutRounding"), - "UC-L13", "MainWindow 가 UseLayoutRounding 으로 고DPI 흐림을 방지해야 한다"); - - [Fact] - public void UC_L14_공용_스타일이_픽셀_정렬을_켠다() - => SourceTree.Usecase( - SourceTree.SharedXaml.Contains("SnapsToDevicePixels"), - "UC-L14", "Shared.xaml 스타일이 SnapsToDevicePixels 로 선명도를 보장해야 한다"); - - [Fact] - public void UC_L15_상태바_자동_숨김을_설정할_수_있다() - => SourceTree.Usecase( - SourceTree.PropertyExists(typeof(AppConfig), "StatusBarAutoHide"), - "UC-L15", "AppConfig.StatusBarAutoHide 속성이 필요하다"); - - [Fact] - public void UC_L16_툴바_버튼_노출을_직접_고른다() - => SourceTree.Usecase( - SourceTree.PropertyExists(typeof(AppConfig), "ToolbarButtons"), - "UC-L16", "AppConfig.ToolbarButtons 로 버튼 표시 여부를 지정할 수 있어야 한다"); - - [Fact] - public void UC_L17_북마크바_표시_여부가_저장된다() - => SourceTree.Usecase( - SourceTree.PropertyExists(typeof(AppConfig), "BookmarkBarVisible"), - "UC-L17", "AppConfig.BookmarkBarVisible 속성이 필요하다"); - - [Fact] - public void UC_L18_탭_스트립_위치를_설정할_수_있다() - => SourceTree.Usecase( - SourceTree.PropertyExists(typeof(AppConfig), "TabStripPosition"), - "UC-L18", "AppConfig.TabStripPosition 로 탭 스트립 위치를 고를 수 있어야 한다"); - - [Fact] - public void UC_L19_패널_폭을_더블클릭으로_초기화한다() - => SourceTree.Usecase( - SourceTree.MethodExists(typeof(MainWindow), "ResetPanelWidth"), - "UC-L19", "MainWindow.ResetPanelWidth 로 패널 폭을 기본값으로 되돌릴 수 있어야 한다"); - - [Fact] - public void UC_L20_패널_최소_폭을_설정할_수_있다() - => SourceTree.Usecase( - SourceTree.PropertyExists(typeof(AppConfig), "RightPanelMinWidth"), - "UC-L20", "AppConfig.RightPanelMinWidth 속성이 필요하다"); - - [Fact] - public void UC_L21_애니메이션_축소_설정이_있다() - => SourceTree.Usecase( - SourceTree.PropertyExists(typeof(AppConfig), "ReduceMotion"), - "UC-L21", "AppConfig.ReduceMotion 로 애니메이션을 줄일 수 있어야 한다"); - - [Fact] - public void UC_L22_빠른_애니메이션_지속시간_토큰이_정의된다() - => SourceTree.Usecase( - SourceTree.HasKey(SourceTree.SharedXaml, "Duration.Fast"), - "UC-L22", "지속 시간 토큰 Duration.Fast 가 필요하다"); - - [Fact] - public void UC_L23_일반_애니메이션_지속시간_토큰이_정의된다() - => SourceTree.Usecase( - SourceTree.HasKey(SourceTree.SharedXaml, "Duration.Normal"), - "UC-L23", "지속 시간 토큰 Duration.Normal 이 필요하다"); - - [Fact] - public void UC_L24_컴팩트_엣지_호버_반응_속도를_설정한다() - => SourceTree.Usecase( - SourceTree.PropertyExists(typeof(AppConfig), "EdgeRevealDelayMs"), - "UC-L24", "AppConfig.EdgeRevealDelayMs 속성이 필요하다"); - - [Fact] - public void UC_L25_UI_전체_배율을_설정할_수_있다() - => SourceTree.Usecase( - SourceTree.PropertyExists(typeof(AppConfig), "UiScale"), - "UC-L25", "AppConfig.UiScale 로 UI 전체 배율을 조절할 수 있어야 한다"); - - [Fact] - public void UC_L26_전체화면_여부가_저장된다() - => SourceTree.Usecase( - SourceTree.PropertyExists(typeof(AppConfig), "FullScreen"), - "UC-L26", "AppConfig.FullScreen 속성이 필요하다"); -} diff --git a/VideoDownloader.Tests/E2E/UiUsecaseLibraryRedTests.cs b/VideoDownloader.Tests/E2E/UiUsecaseLibraryRedTests.cs deleted file mode 100644 index 780ab4d..0000000 --- a/VideoDownloader.Tests/E2E/UiUsecaseLibraryRedTests.cs +++ /dev/null @@ -1,143 +0,0 @@ -using VideoDownloader.Core.Config; -using VideoDownloader.Tests.Infrastructure; - -namespace VideoDownloader.Tests.E2E; - -/// -/// UI 복잡 버전 RED 스펙 — §I 라이브러리·재생목록·즐겨찾기·기록·노트 유즈케이스(docs/UI_USECASES.md §I, UC-M01~M22). -/// 데스크톱 앱에는 아직 라이브러리 뷰가 없으므로 전부 RED 다. -/// -public class UiUsecaseLibraryRedTests -{ - [Fact] - public void UC_M01_라이브러리_뷰가_있다() - => SourceTree.Usecase( - SourceTree.MainWindowXaml.Contains("LibraryPopup") || SourceTree.MainWindowXaml.Contains("LibraryBtn"), - "UC-M01", "받은 파일을 보는 라이브러리 뷰(LibraryPopup/LibraryBtn)가 필요하다"); - - [Fact] - public void UC_M02_라이브러리를_그리드_리스트로_전환한다() - => SourceTree.Usecase( - SourceTree.MainWindowXaml.Contains("LibraryViewToggle"), - "UC-M02", "그리드/리스트 전환(LibraryViewToggle)이 필요하다"); - - [Fact] - public void UC_M03_라이브러리를_검색할_수_있다() - => SourceTree.Usecase( - SourceTree.MainWindowXaml.Contains("LibrarySearchBox"), - "UC-M03", "라이브러리 검색 상자(LibrarySearchBox)가 필요하다"); - - [Fact] - public void UC_M04_라이브러리를_정렬할_수_있다() - => SourceTree.Usecase( - SourceTree.MainWindowXaml.Contains("LibrarySortMenu"), - "UC-M04", "라이브러리 정렬 메뉴(LibrarySortMenu)가 필요하다"); - - [Fact] - public void UC_M05_항목에_추가일이_표시된다() - => SourceTree.Usecase( - SourceTree.MainWindowXaml.Contains("AddedDateText"), - "UC-M05", "라이브러리 항목의 추가일 표시(AddedDateText)가 필요하다"); - - [Fact] - public void UC_M06_항목에_썸네일이_표시된다() - => SourceTree.Usecase( - SourceTree.MainWindowXaml.Contains("LibraryThumbnail"), - "UC-M06", "라이브러리 썸네일(LibraryThumbnail)이 필요하다"); - - [Fact] - public void UC_M07_항목을_더블클릭해_재생한다() - => SourceTree.Usecase( - SourceTree.MainWindowCs.Contains("LibraryPlay_Click"), - "UC-M07", "라이브러리 재생(LibraryPlay_Click) 처리기가 필요하다"); - - [Fact] - public void UC_M08_항목을_삭제할_수_있다() - => SourceTree.Usecase( - SourceTree.MainWindowCs.Contains("LibraryDelete_Click"), - "UC-M08", "라이브러리 삭제(LibraryDelete_Click) 처리기가 필요하다"); - - [Fact] - public void UC_M09_항목_폴더를_열_수_있다() - => SourceTree.Usecase( - SourceTree.MainWindowCs.Contains("LibraryOpenFolder_Click"), - "UC-M09", "라이브러리 폴더 열기(LibraryOpenFolder_Click)가 필요하다"); - - [Fact] - public void UC_M10_라이브러리_빈_상태_안내가_있다() - => SourceTree.Usecase( - SourceTree.MainWindowXaml.Contains("LibraryEmptyHint"), - "UC-M10", "라이브러리 빈 상태 안내(LibraryEmptyHint)가 필요하다"); - - [Fact] - public void UC_M11_재생목록_셔플이_있다() - => SourceTree.Usecase( - SourceTree.MainWindowXaml.Contains("PlaylistShuffle"), - "UC-M11", "재생목록 셔플(PlaylistShuffle) 요소가 필요하다"); - - [Fact] - public void UC_M12_반복_모드가_저장된다() - => SourceTree.Usecase( - SourceTree.PropertyExists(typeof(AppConfig), "PlaylistLoopMode"), - "UC-M12", "AppConfig.PlaylistLoopMode 속성이 필요하다"); - - [Fact] - public void UC_M13_재생목록을_파일로_저장_불러온다() - => SourceTree.Usecase( - SourceTree.MainWindowCs.Contains("PlaylistExport"), - "UC-M13", "재생목록 내보내기/불러오기(PlaylistExport)가 필요하다"); - - [Fact] - public void UC_M14_재생목록_순서를_바꾼다() - => SourceTree.Usecase( - SourceTree.MainWindowXaml.Contains("PlaylistMoveUp"), - "UC-M14", "재생목록 순서 변경(PlaylistMoveUp) 요소가 필요하다"); - - [Fact] - public void UC_M15_재생목록을_검색한다() - => SourceTree.Usecase( - SourceTree.MainWindowXaml.Contains("PlaylistSearchBox"), - "UC-M15", "재생목록 검색 상자(PlaylistSearchBox)가 필요하다"); - - [Fact] - public void UC_M16_즐겨찾기를_폴더로_정리한다() - => SourceTree.Usecase( - SourceTree.MainWindowCs.Contains("BookmarkFolder"), - "UC-M16", "즐겨찾기 폴더(BookmarkFolder) 기능이 필요하다"); - - [Fact] - public void UC_M17_즐겨찾기를_편집한다() - => SourceTree.Usecase( - SourceTree.MainWindowCs.Contains("EditBookmark"), - "UC-M17", "즐겨찾기 편집(EditBookmark) 기능이 필요하다"); - - [Fact] - public void UC_M18_즐겨찾기를_검색한다() - => SourceTree.Usecase( - SourceTree.MainWindowXaml.Contains("BookmarkSearchBox"), - "UC-M18", "즐겨찾기 검색 상자(BookmarkSearchBox)가 필요하다"); - - [Fact] - public void UC_M19_즐겨찾기를_HTML로_내보낸다() - => SourceTree.Usecase( - SourceTree.MainWindowCs.Contains("ExportBookmarks"), - "UC-M19", "즐겨찾기 내보내기(ExportBookmarks) 기능이 필요하다"); - - [Fact] - public void UC_M20_방문_기록을_날짜별로_묶는다() - => SourceTree.Usecase( - SourceTree.MainWindowCs.Contains("GroupHistoryByDate"), - "UC-M20", "방문 기록 날짜 묶음(GroupHistoryByDate) 기능이 필요하다"); - - [Fact] - public void UC_M21_방문_기록을_검색한다() - => SourceTree.Usecase( - SourceTree.MainWindowXaml.Contains("HistorySearchBox"), - "UC-M21", "방문 기록 검색 상자(HistorySearchBox)가 필요하다"); - - [Fact] - public void UC_M22_노트를_검색한다() - => SourceTree.Usecase( - SourceTree.MainWindowXaml.Contains("NotesSearchBox"), - "UC-M22", "노트 검색 상자(NotesSearchBox)가 필요하다"); -} diff --git a/VideoDownloader.Tests/E2E/UiUsecaseSettingsRedTests.cs b/VideoDownloader.Tests/E2E/UiUsecaseSettingsRedTests.cs deleted file mode 100644 index a683846..0000000 --- a/VideoDownloader.Tests/E2E/UiUsecaseSettingsRedTests.cs +++ /dev/null @@ -1,132 +0,0 @@ -using VideoDownloader.App; -using VideoDownloader.Core.Config; -using VideoDownloader.Tests.Infrastructure; - -namespace VideoDownloader.Tests.E2E; - -/// -/// UI 복잡 버전 RED 스펙 — §F 설정 창 유즈케이스(docs/UI_USECASES.md §F, UC-S01~S20). -/// RED 단계: 전부 실패하는 것이 정상이다. -/// -public class UiUsecaseSettingsRedTests -{ - [Fact] - public void UC_S01_설정을_검색으로_찾을_수_있다() - => SourceTree.Usecase( - SourceTree.SettingsWindowXaml.Contains("SettingsSearchBox"), - "UC-S01", "설정 검색 상자(SettingsSearchBox)가 필요하다"); - - [Fact] - public void UC_S02_카테고리_내비게이션이_있다() - => SourceTree.Usecase( - SourceTree.SettingsWindowXaml.Contains("SettingsNavList"), - "UC-S02", "좌측 카테고리 내비게이션(SettingsNavList)이 필요하다"); - - [Fact] - public void UC_S03_재시작_필요_변경을_배너로_알린다() - => SourceTree.Usecase( - SourceTree.SettingsWindowXaml.Contains("RestartBanner"), - "UC-S03", "재시작 필요 알림 배너(RestartBanner)가 필요하다"); - - [Fact] - public void UC_S04_기본값으로_한번에_되돌릴_수_있다() - => SourceTree.Usecase( - SourceTree.SettingsWindowXaml.Contains("ResetDefaultsButton"), - "UC-S04", "기본값 복원 버튼(ResetDefaultsButton)이 필요하다"); - - [Fact] - public void UC_S05_설정을_내보낼_수_있다() - => SourceTree.Usecase( - SourceTree.SettingsWindowXaml.Contains("ExportSettingsButton"), - "UC-S05", "설정 내보내기 버튼(ExportSettingsButton)이 필요하다"); - - [Fact] - public void UC_S06_설정을_가져올_수_있다() - => SourceTree.Usecase( - SourceTree.SettingsWindowXaml.Contains("ImportSettingsButton"), - "UC-S06", "설정 가져오기 버튼(ImportSettingsButton)이 필요하다"); - - [Fact] - public void UC_S07_고급_항목을_접을_수_있다() - => SourceTree.Usecase( - SourceTree.SettingsWindowXaml.Contains("AdvancedSection"), - "UC-S07", "고급 섹션 접힘(AdvancedSection)이 필요하다"); - - [Fact] - public void UC_S08_Ctrl_S로_저장할_수_있다() - => SourceTree.Usecase( - SourceTree.SettingsWindowCs.Contains("Key.S"), - "UC-S08", "설정창 코드비하인드가 Ctrl+S(Key.S) 저장을 처리해야 한다"); - - [Fact] - public void UC_S09_취소_시_폐기_확인을_받는다() - => SourceTree.Usecase( - SourceTree.MethodExists(typeof(SettingsWindow), "ConfirmDiscardChanges"), - "UC-S09", "SettingsWindow.ConfirmDiscardChanges() 확인 절차가 필요하다"); - - [Fact] - public void UC_S10_설정창_크기_위치가_기억된다() - => SourceTree.Usecase( - SourceTree.PropertyExists(typeof(AppConfig), "SettingsWindowBounds"), - "UC-S10", "AppConfig.SettingsWindowBounds 속성이 필요하다"); - - [Fact] - public void UC_S11_재시도_횟수를_UI에서_바꾼다() - => SourceTree.Usecase( - SourceTree.SettingsWindowXaml.Contains("Name=\"RetriesBox\""), - "UC-S11", "재시도 횟수 입력(RetriesBox)이 필요하다"); - - [Fact] - public void UC_S12_UserAgent를_UI에서_바꾼다() - => SourceTree.Usecase( - SourceTree.SettingsWindowXaml.Contains("Name=\"UserAgentBox\""), - "UC-S12", "User-Agent 입력(UserAgentBox)이 필요하다"); - - [Fact] - public void UC_S13_프록시를_설정할_수_있다() - => SourceTree.Usecase( - SourceTree.SettingsWindowXaml.Contains("Name=\"ProxyBox\""), - "UC-S13", "프록시 설정(ProxyBox)이 필요하다"); - - [Fact] - public void UC_S14_UI_언어를_고를_수_있다() - => SourceTree.Usecase( - SourceTree.SettingsWindowXaml.Contains("Name=\"LanguageBox\""), - "UC-S14", "언어 선택(LanguageBox)이 필요하다"); - - [Fact] - public void UC_S15_자동_실행을_설정할_수_있다() - => SourceTree.Usecase( - SourceTree.SettingsWindowXaml.Contains("Name=\"AutoStartBox\""), - "UC-S15", "시작 시 자동 실행(AutoStartBox)이 필요하다"); - - [Fact] - public void UC_S16_트레이로_최소화할_수_있다() - => SourceTree.Usecase( - SourceTree.SettingsWindowXaml.Contains("MinimizeToTrayBox"), - "UC-S16", "트레이 최소화 옵션(MinimizeToTrayBox)이 필요하다"); - - [Fact] - public void UC_S17_알림_설정_섹션이_있다() - => SourceTree.Usecase( - SourceTree.SettingsWindowXaml.Contains("알림"), - "UC-S17", "설정창에 '알림' 섹션이 필요하다"); - - [Fact] - public void UC_S18_실험적_기능_섹션이_있다() - => SourceTree.Usecase( - SourceTree.SettingsWindowXaml.Contains("실험적"), - "UC-S18", "설정창에 '실험적' 기능 섹션이 필요하다"); - - [Fact] - public void UC_S19_실시간_검증_힌트가_있다() - => SourceTree.Usecase( - SourceTree.SettingsWindowXaml.Contains("ValidationHint"), - "UC-S19", "입력 검증 힌트(ValidationHint) 요소가 필요하다"); - - [Fact] - public void UC_S20_버전_정보가_표시된다() - => SourceTree.Usecase( - SourceTree.SettingsWindowXaml.Contains("Name=\"VersionText\""), - "UC-S20", "앱 버전 표시(VersionText)가 필요하다"); -} diff --git a/VideoDownloader.Tests/E2E/UiUsecaseStatusRedTests.cs b/VideoDownloader.Tests/E2E/UiUsecaseStatusRedTests.cs deleted file mode 100644 index 0e9bbc3..0000000 --- a/VideoDownloader.Tests/E2E/UiUsecaseStatusRedTests.cs +++ /dev/null @@ -1,131 +0,0 @@ -using VideoDownloader.Core.Config; -using VideoDownloader.Tests.Infrastructure; - -namespace VideoDownloader.Tests.E2E; - -/// -/// UI 복잡 버전 RED 스펙 — §J 상태 표시·알림·피드백 유즈케이스(docs/UI_USECASES.md §J, UC-N01~N20). -/// RED 단계: 전부 실패하는 것이 정상이다. -/// -public class UiUsecaseStatusRedTests -{ - [Fact] - public void UC_N01_상태바에_전체_다운로드_진행률이_표시된다() - => SourceTree.Usecase( - SourceTree.MainWindowXaml.Contains("AggregateProgress"), - "UC-N01", "상태바 통합 진행률(AggregateProgress) 요소가 필요하다"); - - [Fact] - public void UC_N02_토스트_호스트가_있다() - => SourceTree.Usecase( - SourceTree.MainWindowXaml.Contains("ToastHost"), - "UC-N02", "알림 토스트 컨테이너(ToastHost)가 필요하다"); - - [Fact] - public void UC_N03_토스트_표시_시간을_설정한다() - => SourceTree.Usecase( - SourceTree.PropertyExists(typeof(AppConfig), "ToastDurationMs"), - "UC-N03", "AppConfig.ToastDurationMs 속성이 필요하다"); - - [Fact] - public void UC_N04_치명_오류_배너가_있다() - => SourceTree.Usecase( - SourceTree.MainWindowXaml.Contains("ErrorBanner"), - "UC-N04", "상단 고정 오류 배너(ErrorBanner)가 필요하다"); - - [Fact] - public void UC_N05_오류_상세를_펼쳐_볼_수_있다() - => SourceTree.Usecase( - SourceTree.MainWindowXaml.Contains("ErrorDetailExpander"), - "UC-N05", "오류 상세 펼침(ErrorDetailExpander) 요소가 필요하다"); - - [Fact] - public void UC_N06_클립보드_URL_감지_제안이_뜬다() - => SourceTree.Usecase( - SourceTree.MainWindowXaml.Contains("ClipboardHint"), - "UC-N06", "클립보드 URL 감지 배지(ClipboardHint)가 필요하다"); - - [Fact] - public void UC_N07_원격_서버_상태가_상시_표시된다() - => SourceTree.Usecase( - SourceTree.MainWindowXaml.Contains("ServerStatusIcon"), - "UC-N07", "서버 상태 아이콘(ServerStatusIcon)이 필요하다"); - - [Fact] - public void UC_N08_툴바에서_QR_페어링을_바로_연다() - => SourceTree.Usecase( - SourceTree.MainWindowXaml.Contains("PairingBtn"), - "UC-N08", "툴바 페어링 버튼(PairingBtn)이 필요하다"); - - [Fact] - public void UC_N09_업데이트_가능_배지가_뜬다() - => SourceTree.Usecase( - SourceTree.MainWindowXaml.Contains("UpdateBadge"), - "UC-N09", "새 버전 알림 배지(UpdateBadge)가 필요하다"); - - [Fact] - public void UC_N10_차단_도메인별_통계가_보인다() - => SourceTree.Usecase( - SourceTree.MainWindowXaml.Contains("ShieldDomainStats"), - "UC-N10", "도메인별 차단 통계(ShieldDomainStats)가 필요하다"); - - [Fact] - public void UC_N11_네트워크_끊김이_표시된다() - => SourceTree.Usecase( - SourceTree.MainWindowCs.Contains("NetworkChange"), - "UC-N11", "NetworkChange 오프라인 감지 처리가 필요하다"); - - [Fact] - public void UC_N12_절전_모드_진입_시_일시정지_옵션이_있다() - => SourceTree.Usecase( - SourceTree.PropertyExists(typeof(AppConfig), "PauseOnPowerSaver"), - "UC-N12", "AppConfig.PauseOnPowerSaver 속성이 필요하다"); - - [Fact] - public void UC_N13_상태바_텍스트를_클릭해_복사한다() - => SourceTree.Usecase( - SourceTree.MainWindowCs.Contains("CopyStatus_Click"), - "UC-N13", "상태 복사(CopyStatus_Click) 처리기가 필요하다"); - - [Fact] - public void UC_N14_알림_센터가_있다() - => SourceTree.Usecase( - SourceTree.MainWindowXaml.Contains("NotificationCenter"), - "UC-N14", "지나간 알림 목록(NotificationCenter)이 필요하다"); - - [Fact] - public void UC_N15_방해_금지_모드를_설정할_수_있다() - => SourceTree.Usecase( - SourceTree.PropertyExists(typeof(AppConfig), "DoNotDisturb"), - "UC-N15", "AppConfig.DoNotDisturb 속성이 필요하다"); - - [Fact] - public void UC_N16_온보딩_안내가_있다() - => SourceTree.Usecase( - SourceTree.MainWindowXaml.Contains("Onboarding") || SourceTree.MainWindowCs.Contains("Onboarding"), - "UC-N16", "첫 실행 온보딩(Onboarding) 요소가 필요하다"); - - [Fact] - public void UC_N17_빈_상태_공용_스타일이_정의된다() - => SourceTree.Usecase( - SourceTree.HasKey(SourceTree.SharedXaml, "EmptyStateStyle"), - "UC-N17", "빈 상태 공용 스타일(EmptyStateStyle) 토큰이 필요하다"); - - [Fact] - public void UC_N18_크래시_리포트_대화상자가_있다() - => SourceTree.Usecase( - SourceTree.FindType("CrashReportDialog") is not null, - "UC-N18", "충돌 리포트 대화상자(CrashReportDialog)가 필요하다"); - - [Fact] - public void UC_N19_다운로드_버튼에_진행_개수_배지가_뜬다() - => SourceTree.Usecase( - SourceTree.MainWindowXaml.Contains("DownloadsBtnBadge"), - "UC-N19", "툴바 다운로드 버튼 배지(DownloadsBtnBadge)가 필요하다"); - - [Fact] - public void UC_N20_상태바_우측_보조_정보_영역이_있다() - => SourceTree.Usecase( - SourceTree.MainWindowXaml.Contains("StatusRight"), - "UC-N20", "상태바 우측 정보 영역(StatusRight)이 필요하다"); -} diff --git a/VideoDownloader.Tests/E2E/UiUsecaseTabsRedTests.cs b/VideoDownloader.Tests/E2E/UiUsecaseTabsRedTests.cs deleted file mode 100644 index 969f502..0000000 --- a/VideoDownloader.Tests/E2E/UiUsecaseTabsRedTests.cs +++ /dev/null @@ -1,163 +0,0 @@ -using VideoDownloader.App; -using VideoDownloader.Browser; -using VideoDownloader.Core.Config; -using VideoDownloader.Tests.Infrastructure; - -namespace VideoDownloader.Tests.E2E; - -/// -/// UI 복잡 버전 RED 스펙 — §D 탭 고급 관리 유즈케이스(docs/UI_USECASES.md §D, UC-B01~B24). -/// RED 단계: 전부 실패하는 것이 정상이다. -/// -public class UiUsecaseTabsRedTests -{ - private static readonly Type TabItemType = - SourceTree.FindType("TabItem") ?? throw new InvalidOperationException("Browser TabItem 형식을 찾을 수 없습니다"); - - [Fact] - public void UC_B01_탭을_잠글_수_있다() - => SourceTree.Usecase( - SourceTree.PropertyExists(TabItemType, "IsLocked"), - "UC-B01", "탭 잠금(IsLocked)으로 실수로 닫는 것을 막을 수 있어야 한다"); - - [Fact] - public void UC_B02_탭마다_사용자_지정_색을_달_수_있다() - => SourceTree.Usecase( - SourceTree.PropertyExists(TabItemType, "CustomColor"), - "UC-B02", "탭 사용자 샆(CustomColor) 속성이 필요하다"); - - [Fact] - public void UC_B03_탭_그룹을_접을_수_있다() - => SourceTree.Usecase( - SourceTree.PropertyExists(TabItemType, "IsGroupCollapsed"), - "UC-B03", "그룹 접음(IsGroupCollapsed) 상태가 탭 항목에 있어야 한다"); - - [Fact] - public void UC_B04_탭_그룹_이름을_변경할_수_있다() - { - var ext = SourceTree.FindType("TabManagerGroupExtensions"); - SourceTree.Usecase( - ext is not null && SourceTree.MethodExists(ext, "RenameGroup"), - "UC-B04", "그룹 이름 변경(RenameGroup) API 가 필요하다"); - } - - [Fact] - public void UC_B05_탭_호버_미리보기_컴포넌트가_있다() - => SourceTree.Usecase( - SourceTree.FindType("TabPreview") is not null, - "UC-B05", "탭 호버 미리보기를 담당하는 TabPreview 컴포넌트가 필요하다"); - - [Fact] - public void UC_B06_잠자기_탭이_시각적으로_구분된다() - => SourceTree.Usecase( - SourceTree.MainWindowXaml.Contains("IsSuspended"), - "UC-B06", "탭 템플릿이 잠자기 상태(IsSuspended)를 시각적으로 표시해야 한다"); - - [Fact] - public void UC_B07_탭_번호_배지가_표시된다() - => SourceTree.Usecase( - SourceTree.MainWindowXaml.Contains("TabIndexBadge"), - "UC-B07", "탭 번호 배지(TabIndexBadge) 요소가 필요하다"); - - [Fact] - public void UC_B08_탭_드래그_삽입_표시기가_있다() - => SourceTree.Usecase( - SourceTree.MainWindowXaml.Contains("TabInsertIndicator"), - "UC-B08", "드래그 중 삽입 위치 표시기(TabInsertIndicator)가 필요하다"); - - [Fact] - public void UC_B09_다중_탭_닫기_확인_옵션이_있다() - => SourceTree.Usecase( - SourceTree.PropertyExists(typeof(AppConfig), "ConfirmCloseMultipleTabs"), - "UC-B09", "AppConfig.ConfirmCloseMultipleTabs 속성이 필요하다"); - - [Fact] - public void UC_B10_휠로_탭을_전환하는_옵션이_있다() - => SourceTree.Usecase( - SourceTree.PropertyExists(typeof(AppConfig), "TabWheelSwitch"), - "UC-B10", "AppConfig.TabWheelSwitch 속성이 필요하다"); - - [Fact] - public void UC_B11_탭_최대_개수를_설정할_수_있다() - => SourceTree.Usecase( - SourceTree.PropertyExists(typeof(AppConfig), "MaxTabs"), - "UC-B11", "AppConfig.MaxTabs 속성이 필요하다"); - - [Fact] - public void UC_B12_세션_복원을_잠자기_상태로_할_수_있다() - => SourceTree.Usecase( - SourceTree.PropertyExists(typeof(AppConfig), "RestoreTabsSuspended"), - "UC-B12", "AppConfig.RestoreTabsSuspended 속성이 필요하다"); - - [Fact] - public void UC_B13_닫은_탭_아카이브_전용_팝업이_있다() - => SourceTree.Usecase( - SourceTree.MainWindowXaml.Contains("Name=\"ArchivePopup\""), - "UC-B13", "아카이브를 보여주는 ArchivePopup 이 필요하다"); - - [Fact] - public void UC_B14_아카이브를_검색할_수_있다() - => SourceTree.Usecase( - SourceTree.MainWindowXaml.Contains("ArchiveSearchBox"), - "UC-B14", "아카이브 검색 상자(ArchiveSearchBox)가 필요하다"); - - [Fact] - public void UC_B15_아카이브를_한번에_비울_수_있다() - => SourceTree.Usecase( - SourceTree.MethodExists(typeof(TabArchive), "Clear"), - "UC-B15", "TabArchive.Clear() 메서드가 필요하다"); - - [Fact] - public void UC_B16_아카이브_항목을_복원할_수_있다() - => SourceTree.Usecase( - SourceTree.MethodExists(typeof(TabArchive), "Restore"), - "UC-B16", "TabArchive.Restore() 메서드가 필요하다"); - - [Fact] - public void UC_B17_탭_그룹_색_팔레트가_테마로_관리된다() - => SourceTree.Usecase( - SourceTree.HasKey(SourceTree.SharedXaml, "GroupPalette"), - "UC-B17", "그룹 색 팔레트(GroupPalette)가 공용 리소스로 정의되어야 한다"); - - [Fact] - public void UC_B18_현재_작업공간_이름이_표시된다() - => SourceTree.Usecase( - SourceTree.MainWindowXaml.Contains("WorkspaceIndicator"), - "UC-B18", "현재 작업공간 표시(WorkspaceIndicator) 요소가 필요하다"); - - [Fact] - public void UC_B19_작업공간_이름을_직접_지을_수_있다() - => SourceTree.Usecase( - SourceTree.PropertyExists(typeof(AppConfig), "WorkspaceNames"), - "UC-B19", "AppConfig.WorkspaceNames 속성이 필요하다"); - - [Fact] - public void UC_B20_작업공간_전환_UI가_있다() - => SourceTree.Usecase( - SourceTree.MainWindowXaml.Contains("WorkspaceSwitcher"), - "UC-B20", "작업공간 전환기(WorkspaceSwitcher) 요소가 필요하다"); - - [Fact] - public void UC_B21_새_탭_버튼에_보조_메뉴가_있다() - => SourceTree.Usecase( - SourceTree.MainWindowXaml.Contains("NewTabMore_Click"), - "UC-B21", "새 탭 버튼의 보조 메뉴(최근 페이지·즐겨찾기) 핸들러가 필요하다"); - - [Fact] - public void UC_B22_탭_제목을_두_줄로_볼_수_있다() - => SourceTree.Usecase( - SourceTree.PropertyExists(typeof(AppConfig), "TabTitleMultiline"), - "UC-B22", "AppConfig.TabTitleMultiline 속성이 필요하다"); - - [Fact] - public void UC_B23_탭에서_볼륨_슬라이더를_쓸_수_있다() - => SourceTree.Usecase( - SourceTree.MainWindowXaml.Contains("TabVolumePopup"), - "UC-B23", "탭 볼륨 조절 팝업(TabVolumePopup)이 필요하다"); - - [Fact] - public void UC_B24_탭_그룹을_즐겨찾기로_저장할_수_있다() - => SourceTree.Usecase( - SourceTree.MethodExists(typeof(MainWindow), "BookmarkGroup"), - "UC-B24", "그룹 전체를 즐겨찾기로 저장하는 MainWindow.BookmarkGroup() 이 필요하다"); -} diff --git a/VideoDownloader.Tests/E2E/UiUsecaseThemeRedTests.cs b/VideoDownloader.Tests/E2E/UiUsecaseThemeRedTests.cs deleted file mode 100644 index d0b0023..0000000 --- a/VideoDownloader.Tests/E2E/UiUsecaseThemeRedTests.cs +++ /dev/null @@ -1,213 +0,0 @@ -using VideoDownloader.App; -using VideoDownloader.Core.Config; -using VideoDownloader.Tests.Infrastructure; - -namespace VideoDownloader.Tests.E2E; - -/// -/// UI 복잡 버전 RED 스펙 — §A 테마·색상·대비 유즈케이스(docs/UI_USECASES.md §A, UC-T01~T30). -/// RED 단계: 전부 실패하는 것이 정상이다. 계약은 해당 문서의 "계약" 열을 따른다. -/// -public class UiUsecaseThemeRedTests -{ - [Fact] - public void UC_T01_시스템_테마를_따라가는_옵션이_설정에_있다() - => SourceTree.Usecase( - SourceTree.SettingsWindowXaml.Contains("Tag=\"system\""), - "UC-T01", "OS 테마(다크/라이트)를 자동으로 따라가는 'system' 옵션이 설정창에 노출된다"); - - [Fact] - public void UC_T02_테마를_콤보박스로_다중_옵션_중_고른다() - => SourceTree.Usecase( - SourceTree.SettingsWindowXaml.Contains("Name=\"ThemeModeBox\""), - "UC-T02", "테마 선택이 체크박스(라이트만)가 아니라 다크/라이트/시스템/고대비 콤보박스여야 한다"); - - [Fact] - public void UC_T03_테마_전환에_재시작이_필요하다는_문구가_없어야_한다() - => SourceTree.Usecase( - !SourceTree.SettingsWindowXaml.Contains("재시작"), - "UC-T03", "테마는 즉시 적용되어야 하며 설정창에 '재시작' 안내가 남아 있지 않아야 한다"); - - [Fact] - public void UC_T04_MainWindow에_라이브_테마_적용_API가_있다() - => SourceTree.Usecase( - SourceTree.MethodExists(typeof(MainWindow), "ApplyTheme"), - "UC-T04", "테마 전환 후 열려 있는 MainWindow 자체가 리소스를 다시 적용하는 API 가 필요하다"); - - [Fact] - public void UC_T05_고대비_테마_사전_파일이_존재한다() - => SourceTree.Usecase( - SourceTree.AppFileExists("Themes/HighContrast.xaml"), - "UC-T05", "고대비 사용자를 위한 Themes/HighContrast.xaml 리소스 사전이 필요하다"); - - [Fact] - public void UC_T06_설정에서_고대비_테마를_직접_고를_수_있다() - => SourceTree.Usecase( - SourceTree.SettingsWindowXaml.Contains("Tag=\"highcontrast\""), - "UC-T06", "설정창 테마 옵션에 'highcontrast' 값이 제공되어야 한다"); - - [Fact] - public void UC_T07_사용자_지정_강조색이_설정에_저장된다() - => SourceTree.Usecase( - SourceTree.PropertyExists(typeof(AppConfig), "AccentColor"), - "UC-T07", "AppConfig 에 강조색(AccentColor) 속성이 필요하다"); - - [Fact] - public void UC_T08_강조색을_즉시_적용하는_API가_있다() - => SourceTree.Usecase( - SourceTree.MethodExists(typeof(VideoDownloader.App.App), "ApplyAccent"), - "UC-T08", "App.ApplyAccent 로 재시작 없이 강조색이 전체 컨트롤에 반영되어야 한다"); - - [Fact] - public void UC_T09_강조색_프리셋_스와치가_테마에_준비된다() - => SourceTree.Usecase( - SourceTree.HasKey(SourceTree.ThemeDarkXaml, "Accent.Blue"), - "UC-T09", "다크 테마에 Accent.Blue 등 강조색 프리셋 키가 정의되어야 한다"); - - [Fact] - public void UC_T10_진행바_스타일에_하드코딩된_강조색이_없어야_한다() - => SourceTree.Usecase( - !SourceTree.SharedXaml.Contains("Color=\"#6366F1\""), - "UC-T10", "AccentProgressBar 템플릿이 하드코딩 색 대신 테마 강조색 리소스를 참조해야 한다"); - - [Fact] - public void UC_T11_대기_상태색_PendingBrush가_실제_UI에서_쓰인다() - => SourceTree.Usecase( - SourceTree.MainWindowXaml.Contains("PendingBrush"), - "UC-T11", "테마에 정의만 된 PendingBrush 가 대기 상태 표시에 실제로 사용되어야 한다"); - - [Fact] - public void UC_T12_사용자_테마_파일_경로를_설정할_수_있다() - => SourceTree.Usecase( - SourceTree.PropertyExists(typeof(AppConfig), "CustomThemePath"), - "UC-T12", "AppConfig.CustomThemePath 로 사용자 테마 파일을 불러올 수 있어야 한다"); - - [Fact] - public void UC_T13_시스템_테마_판별_컴포넌트가_존재한다() - => SourceTree.Usecase( - SourceTree.FindType("ThemeResolver") is not null, - "UC-T13", "OS 테마 값을 판별하는 ThemeResolver 컴포넌트가 필요하다"); - - [Fact] - public void UC_T14_다크_TextMuted가_CardBg에서_AA대비를_만족한다() - { - var fg = SourceTree.BrushHex(SourceTree.ThemeDarkXaml, "TextMuted"); - var bg = SourceTree.BrushHex(SourceTree.ThemeDarkXaml, "CardBg"); - Assert.False(fg is null || bg is null, "UC-T14 — 테마 브러시 파싱 실패(테마 파일 구조 변경?)"); - var ratio = SourceTree.ContrastRatio(fg!, bg!); - Assert.True(ratio >= 4.5, $"UC-T14 RED — 다크 TextMuted/CardBg 대비 {ratio:F2}:1 < 4.5:1 (WCAG AA)"); - } - - [Fact] - public void UC_T15_다크_TextMuted가_카드_호버_배경에서도_AA대비를_만족한다() - { - var fg = SourceTree.BrushHex(SourceTree.ThemeDarkXaml, "TextMuted"); - var bg = SourceTree.BrushHex(SourceTree.ThemeDarkXaml, "CardBgHover"); - Assert.False(fg is null || bg is null, "UC-T15 — 테마 브러시 파싱 실패"); - var ratio = SourceTree.ContrastRatio(fg!, bg!); - Assert.True(ratio >= 4.5, $"UC-T15 RED — 다크 TextMuted/CardBgHover 대비 {ratio:F2}:1 < 4.5:1"); - } - - [Fact] - public void UC_T16_라이트_TextMuted가_CardBg에서_AA대비를_만족한다() - { - var fg = SourceTree.BrushHex(SourceTree.ThemeLightXaml, "TextMuted"); - var bg = SourceTree.BrushHex(SourceTree.ThemeLightXaml, "CardBg"); - Assert.False(fg is null || bg is null, "UC-T16 — 테마 브러시 파싱 실패"); - var ratio = SourceTree.ContrastRatio(fg!, bg!); - Assert.True(ratio >= 4.5, $"UC-T16 RED — 라이트 TextMuted/CardBg 대비 {ratio:F2}:1 < 4.5:1"); - } - - [Fact] - public void UC_T17_라이트_TextMuted가_GlassBg에서_AA대비를_만족한다() - { - var fg = SourceTree.BrushHex(SourceTree.ThemeLightXaml, "TextMuted"); - var bg = SourceTree.BrushHex(SourceTree.ThemeLightXaml, "GlassBg"); - Assert.False(fg is null || bg is null, "UC-T17 — 테마 브러시 파싱 실패"); - var ratio = SourceTree.ContrastRatio(fg!, bg!); - Assert.True(ratio >= 4.5, $"UC-T17 RED — 라이트 TextMuted/GlassBg 대비 {ratio:F2}:1 < 4.5:1"); - } - - [Fact] - public void UC_T18_다크_강조색_텍스트가_CardBg에서_AA대비를_만족한다() - { - var fg = SourceTree.BrushHex(SourceTree.ThemeDarkXaml, "AccentBrush"); - var bg = SourceTree.BrushHex(SourceTree.ThemeDarkXaml, "CardBg"); - Assert.False(fg is null || bg is null, "UC-T18 — 테마 브러시 파싱 실패"); - var ratio = SourceTree.ContrastRatio(fg!, bg!); - Assert.True(ratio >= 4.5, $"UC-T18 RED — 다크 AccentBrush/CardBg 대비 {ratio:F2}:1 < 4.5:1 (포맷 배지 텍스트로 사용됨)"); - } - - [Fact] - public void UC_T19_비활성_텍스트_토큰이_양_테마에_정의된다() - => SourceTree.Usecase( - SourceTree.HasKey(SourceTree.ThemeDarkXaml, "TextDisabled") - && SourceTree.HasKey(SourceTree.ThemeLightXaml, "TextDisabled"), - "UC-T19", "비활성 컨트롤 텍스트 샆(TextDisabled) 토큰이 다크·라이트 모두에 필요하다"); - - [Fact] - public void UC_T20_선택_영역_브러시_토큰이_테마에_있다() - => SourceTree.Usecase( - SourceTree.HasKey(SourceTree.ThemeDarkXaml, "SelectionBrush"), - "UC-T20", "텍스트 선택 영역 색(SelectionBrush)이 테마 토큰으로 관리되어야 한다"); - - [Fact] - public void UC_T21_포커스_링_브러시_토큰이_테마에_있다() - => SourceTree.Usecase( - SourceTree.HasKey(SourceTree.ThemeDarkXaml, "FocusAdornerBrush"), - "UC-T21", "키보드 포커스 링 샆(FocusAdornerBrush) 토큰이 필요하다"); - - [Fact] - public void UC_T22_스크롤바_썸_전용_색_토큰이_있다() - => SourceTree.Usecase( - SourceTree.HasKey(SourceTree.SharedXaml, "ScrollBarThumbBrush"), - "UC-T22", "스크롤바 썸 샆(ScrollBarThumbBrush)이 공용 토큰으로 정의되어야 한다"); - - [Fact] - public void UC_T23_툴팁_그림자_리소스가_정의된다() - => SourceTree.Usecase( - SourceTree.HasKey(SourceTree.SharedXaml, "TooltipShadow"), - "UC-T23", "툴팁 그림자(TooltipShadow) 리소스가 필요하다"); - - [Fact] - public void UC_T24_팝업_그림자_리소스가_정의된다() - => SourceTree.Usecase( - SourceTree.HasKey(SourceTree.SharedXaml, "PopupShadow"), - "UC-T24", "플라이아웃 공용 그림자(PopupShadow) 리소스가 필요하다"); - - [Fact] - public void UC_T25_경고_상태색_토큰이_대기색과_구분돼_있다() - => SourceTree.Usecase( - SourceTree.HasKey(SourceTree.ThemeDarkXaml, "WarningBrush"), - "UC-T25", "경고 샆(WarningBrush) 토큰이 PendingBrush 와 별도로 필요하다"); - - [Fact] - public void UC_T26_링크_색_토큰이_테마에_있다() - => SourceTree.Usecase( - SourceTree.HasKey(SourceTree.ThemeDarkXaml, "LinkBrush"), - "UC-T26", "링크 텍스트 샆(LinkBrush) 토큰이 필요하다"); - - [Fact] - public void UC_T27_방문한_링크_색_토큰이_테마에_있다() - => SourceTree.Usecase( - SourceTree.HasKey(SourceTree.ThemeDarkXaml, "VisitedLinkBrush"), - "UC-T27", "방문 링크 샆(VisitedLinkBrush) 토큰이 필요하다"); - - [Fact] - public void UC_T28_정보_안내색_토큰이_테마에_있다() - => SourceTree.Usecase( - SourceTree.HasKey(SourceTree.ThemeDarkXaml, "InfoBrush"), - "UC-T28", "정보성 안내 샆(InfoBrush) 토큰이 필요하다"); - - [Fact] - public void UC_T29_강조_텍스트_전용_브러시_토큰이_있다() - => SourceTree.Usecase( - SourceTree.HasKey(SourceTree.ThemeDarkXaml, "AccentTextBrush"), - "UC-T29", "강조색 중 텍스트 용도(AccentTextBrush) 토큰이 별도로 필요하다"); - - [Fact] - public void UC_T30_타이틀바_테마를_즉시_갱신하는_API가_있다() - => SourceTree.Usecase( - SourceTree.MethodExists(typeof(MainWindow), "UpdateTitleBarTheme"), - "UC-T30", "테마 전환 시 DWM 타이틀바 특성을 다시 적용하는 MainWindow.UpdateTitleBarTheme 이 필요하다"); -} diff --git a/VideoDownloader.Tests/E2E/UiUsecaseTypographyRedTests.cs b/VideoDownloader.Tests/E2E/UiUsecaseTypographyRedTests.cs deleted file mode 100644 index 9d9fb3a..0000000 --- a/VideoDownloader.Tests/E2E/UiUsecaseTypographyRedTests.cs +++ /dev/null @@ -1,144 +0,0 @@ -using VideoDownloader.App; -using VideoDownloader.Core.Config; -using VideoDownloader.Tests.Infrastructure; - -namespace VideoDownloader.Tests.E2E; - -/// -/// UI 복잡 버전 RED 스펙 — §B 타이포그래피·폰트 유즈케이스(docs/UI_USECASES.md §B, UC-F01~F22). -/// RED 단계: 전부 실패하는 것이 정상이다. -/// -public class UiUsecaseTypographyRedTests -{ - [Fact] - public void UC_F01_UI_기본_폰트를_설정으로_고를_수_있다() - => SourceTree.Usecase( - SourceTree.PropertyExists(typeof(AppConfig), "UiFontFamily"), - "UC-F01", "AppConfig.UiFontFamily 속성이 필요하다"); - - [Fact] - public void UC_F02_UI_폰트_크기를_설정으로_바꿀_수_있다() - => SourceTree.Usecase( - SourceTree.PropertyExists(typeof(AppConfig), "UiFontSize"), - "UC-F02", "AppConfig.UiFontSize 속성이 필요하다"); - - [Fact] - public void UC_F03_한국어_폴백_폰트를_직접_지정할_수_있다() - => SourceTree.Usecase( - SourceTree.PropertyExists(typeof(AppConfig), "UiFontKoreanFallback"), - "UC-F03", "AppConfig.UiFontKoreanFallback 속성이 필요하다"); - - [Fact] - public void UC_F04_기본_폰트_크기_토큰이_정의된다() - => SourceTree.Usecase( - SourceTree.HasKey(SourceTree.SharedXaml, "FontSize.Base"), - "UC-F04", "Shared.xaml 에 FontSize.Base 토큰이 필요하다"); - - [Fact] - public void UC_F05_작은_폰트_크기_토큰이_정의된다() - => SourceTree.Usecase( - SourceTree.HasKey(SourceTree.SharedXaml, "FontSize.Small"), - "UC-F05", "FontSize.Small 토큰이 필요하다"); - - [Fact] - public void UC_F06_큰_폰트_크기_토큰이_정의된다() - => SourceTree.Usecase( - SourceTree.HasKey(SourceTree.SharedXaml, "FontSize.Large"), - "UC-F06", "FontSize.Large 토큰이 필요하다"); - - [Fact] - public void UC_F07_초대형_폰트_크기_토큰이_정의된다() - => SourceTree.Usecase( - SourceTree.HasKey(SourceTree.SharedXaml, "FontSize.XLarge"), - "UC-F07", "FontSize.XLarge 토큰이 필요하다"); - - [Fact] - public void UC_F08_제목_H1_스타일이_공용으로_정의된다() - => SourceTree.Usecase( - SourceTree.HasKey(SourceTree.SharedXaml, "Type.H1"), - "UC-F08", "Type.H1 스타일 토큰이 필요하다"); - - [Fact] - public void UC_F09_본문_스타일이_공용으로_정의된다() - => SourceTree.Usecase( - SourceTree.HasKey(SourceTree.SharedXaml, "Type.Body"), - "UC-F09", "Type.Body 스타일 토큰이 필요하다"); - - [Fact] - public void UC_F10_캡션_스타일이_공용으로_정의된다() - => SourceTree.Usecase( - SourceTree.HasKey(SourceTree.SharedXaml, "Type.Caption"), - "UC-F10", "Type.Caption 스타일 토큰이 필요하다"); - - [Fact] - public void UC_F11_등폭_숫자_스타일이_정의된다() - => SourceTree.Usecase( - SourceTree.HasKey(SourceTree.SharedXaml, "Type.Mono"), - "UC-F11", "진행률·속도 숫자용 Type.Mono 스타일이 필요하다"); - - [Fact] - public void UC_F12_한국어_가독성_프리셋_폰트가_후보에_포함된다() - => SourceTree.Usecase( - SourceTree.SharedXaml.Contains("Pretendard"), - "UC-F12", "UiFont 폰트 후보에 Pretendard 가 포함되어야 한다"); - - [Fact] - public void UC_F13_설정창에_글꼴_섹션이_있다() - => SourceTree.Usecase( - SourceTree.SettingsWindowXaml.Contains("글꼴"), - "UC-F13", "설정창에 '글꼴' 섹션이 필요하다"); - - [Fact] - public void UC_F14_글꼴_미리보기_컨트롤이_있다() - => SourceTree.Usecase( - SourceTree.SettingsWindowXaml.Contains("Name=\"FontPreviewText\""), - "UC-F14", "설정창에 FontPreviewText 미리보기 컨트롤이 필요하다"); - - [Fact] - public void UC_F15_폰트_크기_프리셋_콤보박스가_있다() - => SourceTree.Usecase( - SourceTree.SettingsWindowXaml.Contains("Name=\"FontSizeBox\""), - "UC-F15", "설정창에 FontSizeBox 콤보박스가 필요하다"); - - [Fact] - public void UC_F16_폰트_설정을_즉시_적용하는_API가_있다() - => SourceTree.Usecase( - SourceTree.MethodExists(typeof(VideoDownloader.App.App), "ApplyFontSettings"), - "UC-F16", "App.ApplyFontSettings 로 폰트 설정이 재시작 없이 반영되어야 한다"); - - [Fact] - public void UC_F17_리더_모드에_폰트가_하드코딩되지_않는다() - => SourceTree.Usecase( - !SourceTree.ReaderModeCs.Contains("Malgun Gothic"), - "UC-F17", "리더 모드 HTML 이 폰트를 하드코딩 대신 앱 설정에서 주입받아야 한다"); - - [Fact] - public void UC_F18_새_탭_다이얼에_폰트가_하드코딩되지_않는다() - => SourceTree.Usecase( - !SourceTree.MainWindowCs.Contains("Malgun Gothic"), - "UC-F18", "새 탭 다이얼 인라인 CSS 의 폰트 폴백이 앱 공용 설정으로 통일되어야 한다"); - - [Fact] - public void UC_F19_탭_제목_공용_스타일이_정의된다() - => SourceTree.Usecase( - SourceTree.HasKey(SourceTree.SharedXaml, "TabTitleStyle"), - "UC-F19", "탭 제목(말줄임 등)의 공용 스타일 TabTitleStyle 이 필요하다"); - - [Fact] - public void UC_F20_상태바_텍스트_공용_스타일이_정의된다() - => SourceTree.Usecase( - SourceTree.HasKey(SourceTree.SharedXaml, "StatusTextStyle"), - "UC-F20", "상태바 텍스트 공용 스타일 StatusTextStyle 이 필요하다"); - - [Fact] - public void UC_F21_아이콘_크기_토큰이_정의된다() - => SourceTree.Usecase( - SourceTree.HasKey(SourceTree.SharedXaml, "IconSize.Small"), - "UC-F21", "아이콘 크기 토큰 IconSize.Small 이 필요하다"); - - [Fact] - public void UC_F22_줄간격_토큰이_정의된다() - => SourceTree.Usecase( - SourceTree.HasKey(SourceTree.SharedXaml, "Type.LineHeight"), - "UC-F22", "본문 줄간격 토큰 Type.LineHeight 가 필요하다"); -} diff --git a/VideoDownloader.Tests/E2E/WebView2FindE2ETests.cs b/VideoDownloader.Tests/E2E/WebView2FindE2ETests.cs deleted file mode 100644 index ff2a95d..0000000 --- a/VideoDownloader.Tests/E2E/WebView2FindE2ETests.cs +++ /dev/null @@ -1,71 +0,0 @@ -using System.Windows; -using System.Windows.Threading; -using Microsoft.Web.WebView2.Core; -using VideoDownloader.Tests.Infrastructure; - -namespace VideoDownloader.Tests.E2E; - -/// -/// E2E: 실제 WebView2 + 네이티브 Find API(CoreWebView2.Find) 검증(T1-3). -/// WebView2 런타임 위에서 매치 카운트/활성 인덱스가 실제로 발생하는지 확인한다. -/// -[Collection("E2E")] -public class WebView2FindE2ETests -{ - [Fact] - public async Task 네이티브_Find로_매치_수와_활성_인덱스를_얻는다() - { - using var sta = StaDispatcher.Start(); - var udf = Path.Combine(Path.GetTempPath(), $"vd_e2e_{Guid.NewGuid():N}"); - var result = await sta.InvokeAsync(async () => - { - var window = new Window(); - var browser = new Microsoft.Web.WebView2.Wpf.WebView2(); - window.Content = browser; - window.Show(); - - var env = await CoreWebView2Environment.CreateAsync(userDataFolder: udf); - await browser.EnsureCoreWebView2Async(env); - var cv = browser.CoreWebView2; - cv.Settings.AreDefaultScriptDialogsEnabled = false; - - var html = "

hello world hello brave hello

"; - cv.NavigateToString(html); - await WaitUntilNavCompleted(cv); - - // 네이티브 Find API — SuppressDefaultFindDialog 로 자체 UI 전제 검증 - int matchCount = -1, activeIndex = -1; - cv.Find.MatchCountChanged += (_, _) => matchCount = cv.Find.MatchCount; - cv.Find.ActiveMatchIndexChanged += (_, _) => activeIndex = cv.Find.ActiveMatchIndex; - - var options = env.CreateFindOptions(); - options.FindTerm = "hello"; - options.ShouldHighlightAllMatches = true; - options.SuppressDefaultFindDialog = true; - await cv.Find.StartAsync(options); - - await Wait.Until(() => Task.FromResult(matchCount), c => c > 0, 10000); - var countAfterStart = matchCount; - - cv.Find.FindNext(); - await Wait.Until(() => Task.FromResult(activeIndex), i => i >= 1, 10000); - - cv.Find.Stop(); - window.Close(); - return (countAfterStart, activeIndex); - }); - - try { Directory.Delete(udf, true); } catch { } - Assert.Equal(3, result.countAfterStart); - Assert.True(result.activeIndex >= 1, $"활성 인덱스가 진행되지 않음: {result.activeIndex}"); - } - - private static Task WaitUntilNavCompleted(CoreWebView2 cv) - { - var tcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); - EventHandler? h = null; - h = (_, _) => { cv.NavigationCompleted -= h; tcs.TrySetResult(); }; - cv.NavigationCompleted += h; - return tcs.Task.WaitAsync(TimeSpan.FromSeconds(15)); - } -} diff --git a/VideoDownloader.Tests/GlobalUsings.cs b/VideoDownloader.Tests/GlobalUsings.cs deleted file mode 100644 index 8bc619f..0000000 --- a/VideoDownloader.Tests/GlobalUsings.cs +++ /dev/null @@ -1,2 +0,0 @@ -global using Xunit; -global using System.IO; diff --git a/VideoDownloader.Tests/Infrastructure/IconGlyphXamlTests.cs b/VideoDownloader.Tests/Infrastructure/IconGlyphXamlTests.cs deleted file mode 100644 index 0ae0e4f..0000000 --- a/VideoDownloader.Tests/Infrastructure/IconGlyphXamlTests.cs +++ /dev/null @@ -1,89 +0,0 @@ -using System.Text.RegularExpressions; - -namespace VideoDownloader.Tests.Infrastructure; - -/// -/// 아이콘 글리프(PUA, Segoe Fluent Icons)를 본문 폰트 요소에 넣으면 tofu(□)로 렌더된다 -/// (2026-08-18 실행 캡처로 확인 — "□ 모두 일시정지"). XAML/코드 정적 검사로 재발을 막는다. -/// 규칙: -/// ① PUA 를 쓰는 Content/Text 는 IconFont 보장 스타일(IconFont 를 설정하는 스타일 또는 그 BasedOn 파생)에 -/// 있거나 요소에 FontFamily=IconFont 를 명시한다. -/// ② 한 문자열에 PUA 와 일반 텍스트를 섞지 않는다 — 폰트가 하나뿐이라 어느 한쪽은 반드시 깨진다. -/// -public class IconGlyphXamlTests -{ - private static readonly Regex PuaEntity = new(@"&#x(E[0-9A-Fa-f]{3});", RegexOptions.Compiled); - - /// Shared.xaml 에서 IconFont 를 보장하는 스타일 키 집합(BasedOn 파생 포함). - private static HashSet IconFontStyles() - { - var shared = SourceTree.SharedXaml; - var direct = new HashSet(); - var basedOn = new Dictionary(); - foreach (Match style in Regex.Matches(shared, "", RegexOptions.Singleline)) - { - var key = style.Groups[1].Value; - if (style.Groups[3].Value.Contains("IconFont")) direct.Add(key); - var b = Regex.Match(style.Groups[2].Value, "BasedOn=\"\\{StaticResource (\\w+)\\}\""); - if (b.Success) basedOn[key] = b.Groups[1].Value; - } - // BasedOn 체인 전개 (파생이 부모의 FontFamily 세터를 상속) - bool grew; - do - { - grew = false; - foreach (var (child, parent) in basedOn) - if (!direct.Contains(child) && direct.Contains(parent)) { direct.Add(child); grew = true; } - } while (grew); - return direct; - } - - private static IEnumerable Violations(string xaml, string fileName) - { - var iconStyles = IconFontStyles(); - // 여는 태그 단위로 검사 — Button/TextBlock/Run 등 텍스트 표시 요소 - foreach (Match tag in Regex.Matches(xaml, @"<(Button|TextBlock|Run|Label)\b[^>]*?>", RegexOptions.Singleline)) - { - var open = tag.Value; - foreach (Match attr in Regex.Matches(open, "(?:Content|Text)=\"([^\"]*)\"")) - { - var value = attr.Groups[1].Value; - if (!PuaEntity.IsMatch(value)) continue; - var line = xaml[..tag.Index].Count(c => c == '\n') + 1; - - var stripped = PuaEntity.Replace(value, "").Trim(); - if (stripped.Length > 0) - { - yield return $"{fileName} L{line}: PUA+일반 텍스트 혼합 \"{value}\" — 한 폰트로는 둘 다 못 그린다"; - continue; - } - - var styleMatch = Regex.Match(open, "Style=\"\\{(?:StaticResource|DynamicResource) (\\w+)\\}\""); - var styled = styleMatch.Success && iconStyles.Contains(styleMatch.Groups[1].Value); - var explicitFont = open.Contains("FontFamily=\"{DynamicResource IconFont}\"") - || open.Contains("FontFamily=\"{StaticResource IconFont}\""); - if (!styled && !explicitFont) - yield return $"{fileName} L{line}: PUA 글리프 \"{value}\" 가 IconFont 보장 없이 사용됨(본문 폰트 → tofu)"; - } - } - } - - [Fact] - public void XAML_의_PUA_글리프는_IconFont_보장_하에서만_쓴다() - { - var violations = Violations(SourceTree.MainWindowXaml, "MainWindow.xaml") - .Concat(Violations(SourceTree.SettingsWindowXaml, "SettingsWindow.xaml")) - .ToList(); - Assert.True(violations.Count == 0, "tofu 유발 지점:\n" + string.Join("\n", violations)); - } - - [Fact] - public void 코드비하인드도_PUA_와_일반_텍스트를_섞지_않는다() - { - // 예: LibraryViewToggle.Content = "; 그리드" — 본문 폰트 버튼이라 tofu + 잉여 세미콜론 노출 - var offenders = Regex.Matches(SourceTree.MainWindowCs + File.ReadAllText(SourceTree.AppPath("MainWindow.Usecases.cs")), - @"""\\uE[0-9A-Fa-f]{3}[^""]*[가-힣A-Za-z][^""]*""") - .Select(m => m.Value).ToList(); - Assert.True(offenders.Count == 0, "코드 내 혼합 문자열:\n" + string.Join("\n", offenders)); - } -} diff --git a/VideoDownloader.Tests/Infrastructure/WpfTestApp.cs b/VideoDownloader.Tests/Infrastructure/WpfTestApp.cs deleted file mode 100644 index 736a779..0000000 --- a/VideoDownloader.Tests/Infrastructure/WpfTestApp.cs +++ /dev/null @@ -1,33 +0,0 @@ -using System.Windows; -using VideoDownloader.App; - -namespace VideoDownloader.Tests.Infrastructure; - -/// -/// 테스트 프로세스에는 App.xaml 의 리소스가 없으므로, App 어셈블리의 테마 사전을 -/// 테스트 전용 Application 에 로드한다(앱의 App.ApplyTheme 과 동일 순서: 색 → 스타일). -/// -public static class WpfTestApp -{ - private static bool _initialized; - - public static void Ensure(System.Windows.Threading.Dispatcher dispatcher) - { - dispatcher.Invoke(() => - { - if (_initialized) return; - if (Application.Current == null) - new Application { ShutdownMode = ShutdownMode.OnExplicitShutdown }; - var md = Application.Current.Resources.MergedDictionaries; - if (md.Count == 0) - { - const string asm = "/VideoDownloader;component"; - md.Add(new ResourceDictionary { Source = new Uri(asm + "/Themes/Dark.xaml", UriKind.Relative) }); - md.Add(new ResourceDictionary { Source = new Uri(asm + "/Themes/Shared.xaml", UriKind.Relative) }); - } - if (!Application.Current.Resources.Contains("InverseCountToVisibility")) - Application.Current.Resources["InverseCountToVisibility"] = new InverseCountToVisibilityConverter(); - _initialized = true; - }); - } -} diff --git a/VideoDownloader.Tests/Mobile/MobileCoreTests.cs b/VideoDownloader.Tests/Mobile/MobileCoreTests.cs deleted file mode 100644 index ef78392..0000000 --- a/VideoDownloader.Tests/Mobile/MobileCoreTests.cs +++ /dev/null @@ -1,124 +0,0 @@ -using VideoDownloader.Mobile; - -namespace VideoDownloader.Tests.Mobile; - -/// Mobile.Core 순수 로직 — U5 완료 감지, 외부망 안내, U4 저장소(파일 시스템). -public class MobileCoreTests -{ - // ── U5 완료 알림 감지 ── - - [Fact] - public void 완료_전환_항목_ID_반환() - { - var d = new QueueCompletionDetector(); - var prev = new[] { ("a", "다운로드 중"), ("b", "대기") }; - var next = new[] { ("a", "완료"), ("b", "다운로드 중") }; - Assert.Equal(new[] { "a" }, d.Detect(prev, next)); - } - - [Fact] - public void 이미_완료였던_항목은_재알림_없음() - { - var d = new QueueCompletionDetector(); - var prev = new[] { ("a", "완료") }; - var next = new[] { ("a", "완료") }; - Assert.Empty(d.Detect(prev, next)); - } - - [Fact] - public void 첫_폴링에서_이미_완료된_항목은_무시() // 앱 시작 시 과거 완료 스팸 방지 - { - var d = new QueueCompletionDetector(); - Assert.Empty(d.Detect(Array.Empty<(string, string)>(), new[] { ("a", "완료") })); - } - - [Fact] - public void 목록에서_사라진_항목은_알림_없음() - { - var d = new QueueCompletionDetector(); - var prev = new[] { ("a", "다운로드 중") }; - Assert.Empty(d.Detect(prev, Array.Empty<(string, string)>())); - } - - // ── 외부망 안내(MOBILE_PLAN §7) ── - - [Fact] - public void 미연결_안내() - { - var m = ConnectionTroubleshoot.Message(isConfigured: false, lastError: null); - Assert.Contains("연결", m); - } - - [Fact] - public void 연결됐지만_실패_시_같은네트워크_VPN_안내() - { - var m = ConnectionTroubleshoot.Message(isConfigured: true, lastError: "No such host is known."); - Assert.Contains("같은 네트워크", m); - Assert.Contains("Tailscale", m); // 계획 §3: 자체 릴레이 대신 Tailscale 문서화 - } - - [Fact] - public void 정상_시_빈_문자열() - => Assert.Equal("", ConnectionTroubleshoot.Message(isConfigured: true, lastError: null)); - - - // ── M1 공유 타겟(U1): 공유 텍스트 → URL 추출 ── - - [Theory] - [InlineData("https://youtu.be/abc123", "https://youtu.be/abc123")] // URL 만 - [InlineData("재밌는 영상\nhttps://youtu.be/abc123", "https://youtu.be/abc123")] // 제목+URL (유튜브 공유 형식) - [InlineData("http://x.com/a?b=1 입니다", "http://x.com/a?b=1")] // http + 쿼리 - [InlineData("a https://1.com b https://2.com", "https://1.com")] // 첫 번째 우선 - public void 공유_텍스트에서_URL_추출(string text, string expected) - => Assert.Equal(expected, SharePayload.ExtractUrl(text)); - - [Theory] - [InlineData(null)] - [InlineData("")] - [InlineData("URL 없는 그냥 텍스트")] - public void URL_없으면_null(string? text) - => Assert.Null(SharePayload.ExtractUrl(text)); - - // ── U4 저장소(임시 디렉터리로 파일 시스템 검증) ── - - [Fact] - public void OfflineStore_기록_목록_삭제_라운드트립() - { - var baseDir = Path.Combine(Path.GetTempPath(), $"vd_core_{Guid.NewGuid():N}"); - var store = new OfflineStore(baseDir); - Assert.Empty(store.List()); - - var p = store.PathFor("id1"); - Directory.CreateDirectory(Path.GetDirectoryName(p)!); - File.WriteAllBytes(p, new byte[123]); - store.Record("id1", "video.mp4"); - - Assert.True(store.Exists("id1")); - var list = store.List(); - Assert.Single(list); - Assert.Equal(("id1", "video.mp4", 123L), (list[0].Id, list[0].FileName, list[0].SizeBytes)); - - store.Delete("id1"); - Assert.False(store.Exists("id1")); - Assert.Empty(store.List()); - - Directory.Delete(baseDir, true); - } - - [Fact] - public void OfflineStore_재시작_시_매니페스트_유지() - { - var baseDir = Path.Combine(Path.GetTempPath(), $"vd_core_{Guid.NewGuid():N}"); - var store = new OfflineStore(baseDir); - var p = store.PathFor("id2"); - Directory.CreateDirectory(Path.GetDirectoryName(p)!); - File.WriteAllBytes(p, new byte[10]); - store.Record("id2", "keep.mp4"); - - var reopened = new OfflineStore(baseDir); // 새 인스턴스 = 앱 재시작 - Assert.True(reopened.Exists("id2")); - Assert.Equal("keep.mp4", reopened.List().Single().FileName); - - Directory.Delete(baseDir, true); - } -} diff --git a/VideoDownloader.Tests/Platform/HlsMuxerWiringTests.cs b/VideoDownloader.Tests/Platform/HlsMuxerWiringTests.cs deleted file mode 100644 index 2cf2f63..0000000 --- a/VideoDownloader.Tests/Platform/HlsMuxerWiringTests.cs +++ /dev/null @@ -1,72 +0,0 @@ -using System.Net; -using System.Net.Http; -using VideoDownloader.Core.Config; -using VideoDownloader.Core.Hls; -using VideoDownloader.Core.Models; -using VideoDownloader.Core.Platform; - -namespace VideoDownloader.Tests.Platform; - -/// HlsDownloader 가 주입된 IMediaMuxer 를 실제 리먹스 경로에서 사용하는지 검증(RED: ctor 미할당 회귀 방지). -public class HlsMuxerWiringTests -{ - private sealed class RecordingMuxer : IMediaMuxer - { - public int RemuxCalls; - public Task RemuxAsync(string ffmpeg, string input, string output, CancellationToken ct) - { - RemuxCalls++; - File.WriteAllText(output, "remuxed"); // 성공 시뮬레이션 - return Task.CompletedTask; - } - public Task DownloadDashAsync(string ffmpeg, Uri mpdUrl, string output, double durationSec, - HttpClient http, IProgress? progress, CancellationToken ct) => Task.CompletedTask; - public string? ResolveFfmpeg(AppConfig config) => "ffmpeg"; - } - - [Fact] - public async Task HlsDownloader_주입된_뮥서로_리먹스한다() - { - if (!OperatingSystem.IsWindows()) return; - using var server = new HttpListener(); - var port = Random.Shared.Next(20000, 60000); - server.Prefixes.Add($"http://127.0.0.1:{port}/"); - server.Start(); - - var seg = new byte[16]; - using var listenerTask = Task.Run(async () => - { - for (var i = 0; i < 3; i++) - { - var ctx = await server.GetContextAsync(); - var path = ctx.Request.Url!.AbsolutePath; - var body = path.EndsWith(".m3u8") - ? "#EXTM3U\n#EXT-X-TARGETDURATION:2\n#EXTINF:2.0,\nseg0.ts\n#EXTINF:2.0,\nseg1.ts\n#EXT-X-ENDLIST\n" - : null; - var buf = body != null ? System.Text.Encoding.UTF8.GetBytes(body) : seg; - ctx.Response.ContentType = body != null ? "application/vnd.apple.mpegurl" : "video/mp2t"; - await ctx.Response.OutputStream.WriteAsync(buf); - ctx.Response.Close(); - } - }); - - var muxer = new RecordingMuxer(); - var config = new AppConfig(); - var dl = new HlsDownloader(new HttpClient(), config, muxer); - var outBase = Path.Combine(Path.GetTempPath(), $"hls-{Guid.NewGuid():N}"); - try - { - var result = await dl.DownloadAsync(new Uri($"http://127.0.0.1:{port}/index.m3u8"), outBase); - Assert.True(muxer.RemuxCalls > 0, "주입한 IMediaMuxer.RemuxAsync 가 호출되어야 한다"); - Assert.EndsWith(".mp4", result); - } - finally - { - server.Stop(); - try { await listenerTask; } catch { } - foreach (var f in Directory.GetFiles(Path.GetTempPath(), Path.GetFileName(outBase) + "*")) - File.Delete(f); - if (Directory.Exists(outBase + ".parts")) Directory.Delete(outBase + ".parts", true); - } - } -} diff --git a/VideoDownloader.Tests/Platform/PlatformAbstractionTests.cs b/VideoDownloader.Tests/Platform/PlatformAbstractionTests.cs deleted file mode 100644 index 4331466..0000000 --- a/VideoDownloader.Tests/Platform/PlatformAbstractionTests.cs +++ /dev/null @@ -1,178 +0,0 @@ -using System.Net.Http; -using VideoDownloader.Core.Platform; -using VideoDownloader.Core.Config; -using VideoDownloader.Core.Social; - -namespace VideoDownloader.Tests.Platform; - -// ── Fake ───────────────────────────────────────────────────────────── -public sealed class FakeProcessRunner : IProcessRunner -{ - public ProcessSpec? LastSpec; - public Func?, CancellationToken, Task> Behavior = - (_, _, _) => Task.FromResult(new ProcessResult(0, "", "")); - - public Task RunAsync(ProcessSpec spec, Action? onLine, CancellationToken ct) - { - LastSpec = spec; - return Behavior(spec, onLine, ct); - } -} - -// 재구성 ②: Core Platform 추상화 — 모바일(M0) 전제가 되는 프로세스/먹서 주입 검증. -public class ProcessRunnerAbstractionTests -{ - [Fact] - public async Task DesktopProcessRunner_명령_실행과_캡처_Windows() - { - if (!OperatingSystem.IsWindows()) return; - var runner = new DesktopProcessRunner(); - var res = await runner.RunAsync( - new ProcessSpec("cmd.exe", new[] { "/c", "echo hello-vd" }), null, CancellationToken.None); - Assert.Equal(0, res.ExitCode); - Assert.Contains("hello-vd", res.Stdout); - } - - [Fact] - public async Task DesktopProcessRunner_종료코드_전파() - { - if (!OperatingSystem.IsWindows()) return; - var runner = new DesktopProcessRunner(); - var res = await runner.RunAsync( - new ProcessSpec("cmd.exe", new[] { "/c", "exit 3" }), null, CancellationToken.None); - Assert.Equal(3, res.ExitCode); - } - - [Fact] - public async Task DesktopProcessRunner_라인_탭_스트림_구분() - { - if (!OperatingSystem.IsWindows()) return; - // 인라인 리다이렉션 인용 문제를 피해 스크립트 파일로 stdout/stderr 분리 생성 - var script = Path.Combine(Path.GetTempPath(), $"vd_tap_{Guid.NewGuid():N}.cmd"); - File.WriteAllText(script, "@echo off\r\necho out-line\r\necho err-line 1>&2\r\n"); - try - { - var runner = new DesktopProcessRunner(); - var taps = new System.Collections.Concurrent.ConcurrentQueue<(string, string)>(); - var res = await runner.RunAsync( - new ProcessSpec("cmd.exe", new[] { "/c", script }), - (s, l) => taps.Enqueue((s, l)), CancellationToken.None); - Assert.Equal(0, res.ExitCode); - Assert.Contains(taps.ToArray(), t => t.Item1 == "out" && t.Item2.Contains("out-line")); - Assert.Contains(taps.ToArray(), t => t.Item1 == "err" && t.Item2.Contains("err-line")); - Assert.Contains("err-line", res.Stderr); - } - finally { try { File.Delete(script); } catch { } } - } - - [Fact] - public async Task DesktopProcessRunner_EnvPrefix로_PATH_선두_주입() - { - if (!OperatingSystem.IsWindows()) return; - var runner = new DesktopProcessRunner(); - var marker = Path.GetTempPath(); // PATH 앞에 아무 값 — cmd 는 무시하지만 실행 자체는 검증 - var res = await runner.RunAsync( - new ProcessSpec("cmd.exe", new[] { "/c", "echo ok" }, - EnvPrefix: new Dictionary { ["PATH"] = marker }), - null, CancellationToken.None); - Assert.Equal(0, res.ExitCode); - } -} - -public class MediaMuxerAbstractionTests -{ - private static string Ffmpeg => OperatingSystem.IsWindows() ? "ffmpeg.exe" : "ffmpeg"; - - [Fact] - public async Task RemuxAsync는_copy_리먹스_인자를_만든다() - { - var fake = new FakeProcessRunner(); - var muxer = new DesktopMediaMuxer(fake); - await muxer.RemuxAsync(Ffmpeg, "in.ts", "out.mp4", CancellationToken.None); - - var spec = fake.LastSpec!; - Assert.Equal(Ffmpeg, spec.ExePath); - Assert.Equal(new[] { "-y", "-hide_banner", "-loglevel", "error", "-i", "in.ts", "-c", "copy", "out.mp4" }, - spec.Args); - } - - [Fact] - public async Task RemuxAsync_실패시_stderr_포함_예외() - { - var fake = new FakeProcessRunner - { Behavior = (_, _, _) => Task.FromResult(new ProcessResult(1, "", "boom-err")) }; - var muxer = new DesktopMediaMuxer(fake); - var ex = await Assert.ThrowsAsync( - () => muxer.RemuxAsync(Ffmpeg, "in.ts", "out.mp4", CancellationToken.None)); - Assert.Contains("boom-err", ex.Message); - } - - [Fact] - public async Task DownloadDashAsync는_진행률을_파싱해_리포트한다() - { - var fake = new FakeProcessRunner - { - Behavior = (_, onLine, _) => - { - onLine?.Invoke("out", "out_time_ms=2500000"); // 2.5s / 10s = 25% - onLine?.Invoke("out", "progress=end"); - return Task.FromResult(new ProcessResult(0, "", "")); - } - }; - var muxer = new DesktopMediaMuxer(fake); - var progress = new SyncProgress(); - await muxer.DownloadDashAsync(Ffmpeg, new Uri("https://x.test/a.mpd"), "out.mp4", - durationSec: 10, http: new HttpClient(), progress: progress, CancellationToken.None); - - var spec = fake.LastSpec!; - Assert.Contains("-progress", spec.Args); - Assert.Contains("pipe:1", spec.Args); - Assert.Contains("https://x.test/a.mpd", spec.Args); - Assert.Contains("+faststart", spec.Args); - Assert.Contains(progress.Items, r => Math.Abs(r.Percent - 25.0) < 0.01); - } - - /// Progress<T> 는 SyncContext 에 큐잉되어 레이스가 나므로 동기 기록용 구현. - private sealed class SyncProgress : IProgress - { - public readonly List Items = new(); - public void Report(T value) => Items.Add(value); - } - - [Fact] - public async Task DownloadDashAsync_실패시_예외() - { - var fake = new FakeProcessRunner - { Behavior = (_, _, _) => Task.FromResult(new ProcessResult(2, "", "dash-fail")) }; - var muxer = new DesktopMediaMuxer(fake); - var ex = await Assert.ThrowsAsync( - () => muxer.DownloadDashAsync(Ffmpeg, new Uri("https://x.test/a.mpd"), "o.mp4", 10, - new HttpClient(), null, CancellationToken.None)); - Assert.Contains("dash-fail", ex.Message); - } -} - -public class YtDlpRunnerAbstractionTests -{ - [Fact] - public async Task GetVersionAsync은_주입된_러너로_version_인자와_출력을_해석한다() - { - var fake = new FakeProcessRunner - { Behavior = (spec, _, _) => Task.FromResult(new ProcessResult(0, "2026.07.04\n", "")) }; - var version = await YtDlpRunner.GetVersionAsync("yt-dlp.exe", CancellationToken.None, fake); - Assert.Equal("2026.07.04", version); - Assert.Contains("--version", fake.LastSpec!.Args); - Assert.Equal("yt-dlp.exe", fake.LastSpec.ExePath); - } - - [Fact] - public async Task RunCaptureAsync도_주입된_러너를_사용한다() - { - var fake = new FakeProcessRunner - { Behavior = (_, _, _) => Task.FromResult(new ProcessResult(0, "{\"id\":\"x\"}", "")) }; - var (exit, stdout, _) = await YtDlpRunner.RunCaptureAsync( - "yt-dlp.exe", new[] { "-J", "https://youtu.be/x" }, CancellationToken.None, fake); - Assert.Equal(0, exit); - Assert.Contains("{\"id\"", stdout); - } -} diff --git a/VideoDownloader.Tests/Platform/UpdateCheckerTests.cs b/VideoDownloader.Tests/Platform/UpdateCheckerTests.cs deleted file mode 100644 index 397c6b2..0000000 --- a/VideoDownloader.Tests/Platform/UpdateCheckerTests.cs +++ /dev/null @@ -1,154 +0,0 @@ -using System.Net; -using System.Net.Http; -using VideoDownloader.Core.Update; - -namespace VideoDownloader.Tests.Platform; - -/// -/// DEPLOYMENT_PLAN §6 자동 업데이트 v1 — GitHub Releases latest 태그 비교 + 아키텍처별 설치 자산 선택. -/// 네트워크는 가짜 핸들러로 격리. -/// -public class UpdateCheckerTests -{ - private sealed class FakeHandler : HttpMessageHandler - { - private readonly HttpStatusCode _status; - private readonly string _json; - public HttpRequestMessage? LastRequest { get; private set; } - - public FakeHandler(HttpStatusCode status, string json) - { - _status = status; - _json = json; - } - - protected override Task SendAsync(HttpRequestMessage request, CancellationToken ct) - { - LastRequest = request; - return Task.FromResult(new HttpResponseMessage(_status) - { - Content = new StringContent(_json, System.Text.Encoding.UTF8, "application/json"), - }); - } - } - - private const string ReleaseJson = """ - { - "tag_name": "v1.2.0", - "html_url": "https://github.com/user/videodownloader/releases/tag/v1.2.0", - "assets": [ - { "name": "VideoDownloader-Setup-x64.exe", "browser_download_url": "https://github.com/user/videodownloader/releases/download/v1.2.0/VideoDownloader-Setup-x64.exe" }, - { "name": "VideoDownloader-Setup-arm64.exe", "browser_download_url": "https://github.com/user/videodownloader/releases/download/v1.2.0/VideoDownloader-Setup-arm64.exe" } - ] - } - """; - - [Theory] - [InlineData("1.0.0", "v1.2.0", true)] // 최신이 더 높음 - [InlineData("1.2.0", "v1.2.0", false)] // 동일 - [InlineData("2.0.0", "v1.9.9", false)] // 현재가 더 높음 - [InlineData("1.0.0.0", "v1.0.1", true)] // 어셈블리 4자리 버전 허용 - [InlineData("1.0.0", "garbage", false)] // 파싱 불가면 갱신 아님 - public void 버전비교(string current, string latest, bool expected) => - Assert.Equal(expected, UpdateChecker.IsNewer(current, latest)); - - [Fact] - public void 자산선택_x64와_arm64_구분() - { - var assets = new[] - { - new UpdateAsset("VideoDownloader-Setup-x64.exe", "https://dl/x64"), - new UpdateAsset("VideoDownloader-Setup-arm64.exe", "https://dl/arm64"), - }; - - Assert.Equal("https://dl/x64", UpdateChecker.SelectAsset(assets, "win-x64")!.DownloadUrl); - Assert.Equal("https://dl/arm64", UpdateChecker.SelectAsset(assets, "win-arm64")!.DownloadUrl); - Assert.Null(UpdateChecker.SelectAsset(assets, "linux-x64")); // 일치 없음 - } - - [Fact] - public async Task 최신확인_새버전이면_자산과_릴리스URL() - { - var handler = new FakeHandler(HttpStatusCode.OK, ReleaseJson); - var checker = new UpdateChecker(handler); - - var result = await checker.CheckAsync("user/videodownloader", "1.0.0", "win-x64"); - - Assert.NotNull(result); - Assert.True(result!.IsNewer); - Assert.Equal("1.2.0", result.LatestVersion); - Assert.Equal("https://github.com/user/videodownloader/releases/tag/v1.2.0", result.ReleaseUrl); - Assert.Equal("VideoDownloader-Setup-x64.exe", result.Asset!.Name); - - // 기본 채널(자체 Forgejo) 엔드포인트 + User-Agent(GitHub 채널 호환 규약 유지) - Assert.Equal("https://git.chanpaca.net/api/v1/repos/user/videodownloader/releases/latest", handler.LastRequest!.RequestUri!.ToString()); - Assert.NotEmpty(handler.LastRequest.Headers.UserAgent); - } - - [Fact] - public async Task 최신확인_이미_최신이면_IsNewer_false() - { - var checker = new UpdateChecker(new FakeHandler(HttpStatusCode.OK, ReleaseJson)); - var result = await checker.CheckAsync("user/videodownloader", "1.2.0", "win-x64"); - Assert.False(result!.IsNewer); - } - - [Fact] - public async Task 최신확인_API_실패는_예외로_드러남() - { - var checker = new UpdateChecker(new FakeHandler(HttpStatusCode.NotFound, """{"message":"Not Found"}""")); - await Assert.ThrowsAsync(() => checker.CheckAsync("user/none", "1.0.0", "win-x64")); - } - - // ── 배포 채널 전환 (DEPLOYMENT_PLAN §5-bis/§5-ter): 기본 = 자체 Forgejo 공개 릴리스 저장소 ── - - [Fact] - public async Task 최신확인_기본은_Forgejo_공개저장소_API() - { - var handler = new FakeHandler(HttpStatusCode.OK, ReleaseJson); - var checker = new UpdateChecker(handler); - - await checker.CheckAsync("Video-Downloader/releases", "1.0.0", "win-x64"); - - // Forgejo 는 /api/v1 접두가 필요 — GitHub 형태(api.github.com/repos/...)와 경로 규칙만 다르다 - Assert.Equal( - "https://git.chanpaca.net/api/v1/repos/Video-Downloader/releases/releases/latest", - handler.LastRequest!.RequestUri!.ToString()); - } - - [Fact] - public async Task 최신확인_apiBase_지정으로_GitHub_채널도_호환() - { - var handler = new FakeHandler(HttpStatusCode.OK, ReleaseJson); - var checker = new UpdateChecker(handler); - - var result = await checker.CheckAsync("user/videodownloader", "1.0.0", "win-x64", - apiBase: "https://api.github.com"); - - Assert.True(result!.IsNewer); - Assert.Equal("https://api.github.com/repos/user/videodownloader/releases/latest", - handler.LastRequest!.RequestUri!.ToString()); - } - - [Fact] - public void 자산선택_osx는_tar_gz_도_허용() - { - // macOS 프리뷰는 dmg 가 아니라 tar.gz 로 배포 중 — dmg 만 허용하면 mac 은 영원히 자산 없음 - var assets = new[] - { - new UpdateAsset("mediabrowser-osx-arm64.tar.gz", "https://dl/osx-arm64"), - new UpdateAsset("mediabrowser-osx-x64.tar.gz", "https://dl/osx-x64"), - }; - - Assert.Equal("https://dl/osx-arm64", UpdateChecker.SelectAsset(assets, "osx-arm64")!.DownloadUrl); - Assert.Equal("https://dl/osx-x64", UpdateChecker.SelectAsset(assets, "osx-x64")!.DownloadUrl); - } - - [Fact] - public void 업데이트_기본채널은_공개릴리스저장소() - { - var config = new VideoDownloader.Core.Config.AppConfig(); - Assert.Equal("Video-Downloader/releases", config.UpdateRepo); - Assert.Equal("https://git.chanpaca.net/api/v1", config.UpdateApiBase); - } -} diff --git a/VideoDownloader.Tests/Server/MdnsAdvertiserTests.cs b/VideoDownloader.Tests/Server/MdnsAdvertiserTests.cs deleted file mode 100644 index a1c5730..0000000 --- a/VideoDownloader.Tests/Server/MdnsAdvertiserTests.cs +++ /dev/null @@ -1,49 +0,0 @@ -using Makaretu.Dns; -using VideoDownloader.Server; - -namespace VideoDownloader.Tests.Server; - -/// -/// MOBILE_PLAN §3 mDNS 광고(_videodl._tcp) — 서비스 프로필 구성(순수 로직)과 광고 생명주기. -/// 멀티캐스트 수신 단정은 네트워크/방화벽에 좌우되므로 두지 않는다(수동 증거로 확인). -/// -public class MdnsAdvertiserTests -{ - [Fact] - public void 프로필_서비스타입과_포트와_기기명_TXT() - { - var profile = MdnsAdvertiser.BuildProfile("데스크톱PC", 8642); - - Assert.Equal("_videodl._tcp", profile.ServiceName.ToString()); - var srv = Assert.Single(profile.Resources.OfType()); - Assert.Equal(8642, srv.Port); - // Makaretu 는 TXT 에 ASCII 만 허용 → 한글 기기명은 퍼센트 인코딩으로 무손실 보존 - var txt = Assert.Single(profile.Resources.OfType()); - Assert.Contains("device=" + Uri.EscapeDataString("데스크톱PC"), txt.Strings); - // 인스턴스 라벨은 ASCII 로 접힘(직렬화 가능해야 광고 자체가 나간다) - Assert.Equal("PC", profile.InstanceName.ToString()); - } - - [Fact] - public void 프로필_인스턴스명은_점을_대시로_정리() - { - var profile = MdnsAdvertiser.BuildProfile("my.host.name", 1234); - Assert.Equal("my-host-name", profile.InstanceName.ToString()); - } - - [Fact] - public void 프로필_빈_기기명은_기본값() - { - var profile = MdnsAdvertiser.BuildProfile("", 1234); - Assert.Equal("VideoDownloader", profile.InstanceName.ToString()); - } - - [Fact] - public void 광고_시작과_중복해제_안전() - { - using var adv = new MdnsAdvertiser("테스트PC", 8642); - adv.Start(); - adv.Dispose(); - adv.Dispose(); // 중복 Dispose 안전 - } -} diff --git a/VideoDownloader.Tests/Server/QueueHubE2ETests.cs b/VideoDownloader.Tests/Server/QueueHubE2ETests.cs deleted file mode 100644 index 242dbff..0000000 --- a/VideoDownloader.Tests/Server/QueueHubE2ETests.cs +++ /dev/null @@ -1,90 +0,0 @@ -using System.Net.Http; -using Microsoft.AspNetCore.SignalR.Client; -using VideoDownloader.Server; - -namespace VideoDownloader.Tests.Server; - -/// -/// E2E: SignalR /hubs/queue — MOBILE_PLAN §3 API 설계안의 실시간 큐 푸시. -/// 실제 Kestrel 기동 → 허브 접속(쿼리 토큰 인증) → 스냅샷 조회 + 큐 변경 시 서버 푸시 수신. -/// -public class QueueHubE2ETests : IDisposable -{ - private readonly string _libDir = Path.Combine(Path.GetTempPath(), $"vd_hub_{Guid.NewGuid():N}"); - - public QueueHubE2ETests() => Directory.CreateDirectory(_libDir); - - private sealed class FakeQueue : IQueueAdapter - { - public List Items { get; } = new(); - - public Task> GetItemsAsync() => Task.FromResult>(Items); - public Task AddAsync(string url, string? title) - { - var item = new QueueItemDto(Guid.NewGuid().ToString("N"), title ?? url, url, "대기", 0); - Items.Add(item); - Changed?.Invoke(); - return Task.FromResult(item.Id); - } - public Task PauseAsync(string id) => Task.CompletedTask; - public Task ResumeAsync(string id) => Task.CompletedTask; - public Task CancelAsync(string id) => Task.CompletedTask; - - public event Action? Changed; - } - - [Fact] - public async Task 큐허브_스냅샷_조회와_변경시_푸시_E2E() - { - var queue = new FakeQueue(); - await using var server = await ServerHost.StartAsync(new ServerOptions - { - Port = 0, - Token = "hub-token-123", - LibraryFolder = _libDir, - Queue = queue, - }); - - await using var conn = new HubConnectionBuilder() - .WithUrl($"http://127.0.0.1:{server.Port}/hubs/queue?t=hub-token-123") - .Build(); - - var pushed = new TaskCompletionSource>(TaskCreationOptions.RunContinuationsAsynchronously); - conn.On>("queueUpdated", items => pushed.TrySetResult(items)); - - await conn.StartAsync(); - - // 1) 허브 메서드로 현재 스냅샷 조회 - var snapshot = await conn.InvokeAsync>("GetQueue"); - Assert.Empty(snapshot); - - // 2) 큐 변경 → 폴링 없이 서버가 밀어줌 (2초 폴링의 실시간 대체) - await queue.AddAsync("https://x.test/push.mp4", "푸시 영상"); - var items = await pushed.Task.WaitAsync(TimeSpan.FromSeconds(10)); - Assert.Single(items); - Assert.Equal("푸시 영상", items[0].Title); - } - - [Fact] - public async Task 큐허브_잘못된_토큰은_401_거부() - { - await using var server = await ServerHost.StartAsync(new ServerOptions - { - Port = 0, - Token = "hub-token-123", - LibraryFolder = _libDir, - Queue = new FakeQueue(), - }); - - await using var conn = new HubConnectionBuilder() - .WithUrl($"http://127.0.0.1:{server.Port}/hubs/queue?t=wrong-token") - .Build(); - - await Assert.ThrowsAsync(() => conn.StartAsync()); - } - - public void Dispose() - { - try { Directory.Delete(_libDir, recursive: true); } catch (IOException) { } - } -} diff --git a/VideoDownloader.Tests/Server/RemoteServerE2ETests.cs b/VideoDownloader.Tests/Server/RemoteServerE2ETests.cs deleted file mode 100644 index cee6393..0000000 --- a/VideoDownloader.Tests/Server/RemoteServerE2ETests.cs +++ /dev/null @@ -1,202 +0,0 @@ -using System.Net.Http; -using System.Net.Http.Headers; -using System.Net.Http.Json; -using VideoDownloader.Server; - -namespace VideoDownloader.Tests.Server; - -/// -/// E2E (M0): 실제 Kestrel 서버 기동 → 인증/페어링/큐 제어/라이브러리/스트리밍/웹 컴패니언 검증. -/// -public class RemoteServerE2ETests : IDisposable -{ - private readonly string _libDir = Path.Combine(Path.GetTempPath(), $"vd_srv_{Guid.NewGuid():N}"); - - private sealed class FakeQueue : IQueueAdapter - { - public List Items { get; } = new(); - public List Actions { get; } = new(); - - public Task> GetItemsAsync() => Task.FromResult>(Items); - public Task AddAsync(string url, string? title) - { - var item = new QueueItemDto(Guid.NewGuid().ToString("N"), title ?? url, url, "대기", 0); - Items.Add(item); - Changed?.Invoke(); - return Task.FromResult(item.Id); - } - public Task PauseAsync(string id) { Actions.Add($"pause:{id}"); return Task.CompletedTask; } - public Task ResumeAsync(string id) { Actions.Add($"resume:{id}"); return Task.CompletedTask; } - public Task CancelAsync(string id) { Actions.Add($"cancel:{id}"); return Task.CompletedTask; } - - public event Action? Changed; - } - - [Fact] - public async Task 서버_전_API_E2E_인증_큐_라이브러리_스트리밍_웹컴패니언() - { - Directory.CreateDirectory(_libDir); - var mediaPath = Path.Combine(_libDir, "sample.mp4"); - File.WriteAllBytes(mediaPath, new byte[256 * 1024]); // 256KB 가짜 미디어 - - var queue = new FakeQueue(); - await using var server = await ServerHost.StartAsync(new ServerOptions - { - Port = 0, // 사용 가능한 포트 자동 할당 - Token = "test-token-123", - LibraryFolder = _libDir, - Queue = queue, - }); - - using var http = new HttpClient { BaseAddress = new Uri($"http://127.0.0.1:{server.Port}") }; - - // 1) 인증 없으면 401 - var anon = await http.GetAsync("/api/queue"); - Assert.Equal(System.Net.HttpStatusCode.Unauthorized, anon.StatusCode); - - // 2) 틀린 토큰도 401 - using var bad = new HttpRequestMessage(HttpMethod.Get, "/api/queue"); - bad.Headers.Authorization = new AuthenticationHeaderValue("Bearer", "wrong"); - Assert.Equal(System.Net.HttpStatusCode.Unauthorized, (await http.SendAsync(bad)).StatusCode); - - // 3) 페어링(올바른 토큰) - var pair = await http.PostAsJsonAsync("/api/pair", new { token = "test-token-123", device = "E2E-Phone" }); - Assert.True(pair.IsSuccessStatusCode); - - // 4) 큐: URL 추가 → 목록 조회 - http.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", "test-token-123"); - var add = await http.PostAsJsonAsync("/api/queue", new { url = "https://x.test/v.mp4", title = "E2E 영상" }); - Assert.True(add.IsSuccessStatusCode); - var items = await http.GetFromJsonAsync>("/api/queue"); - Assert.NotNull(items); - Assert.Single(items!); - Assert.Equal("E2E 영상", items![0].Title); - var id = items[0].Id; - - // 5) 큐 제어 위임 - Assert.True((await http.PostAsync($"/api/queue/{id}/pause", null)).IsSuccessStatusCode); - Assert.True((await http.PostAsync($"/api/queue/{id}/resume", null)).IsSuccessStatusCode); - Assert.True((await http.PostAsync($"/api/queue/{id}/cancel", null)).IsSuccessStatusCode); - Assert.Equal(new[] { $"pause:{id}", $"resume:{id}", $"cancel:{id}" }, queue.Actions); - - // 6) 라이브러리 - var lib = await http.GetFromJsonAsync>("/api/library"); - Assert.NotNull(lib); - Assert.Single(lib!); - Assert.Equal("sample.mp4", lib![0].FileName); - - // 7) 스트리밍: Range 요청 → 206 부분 응답 - using var range = new HttpRequestMessage(HttpMethod.Get, $"/stream/{lib[0].Id}"); - range.Headers.Range = new System.Net.Http.Headers.RangeHeaderValue(0, 1023); - range.Headers.Authorization = new AuthenticationHeaderValue("Bearer", "test-token-123"); - var partial = await http.SendAsync(range); - Assert.Equal(System.Net.HttpStatusCode.PartialContent, partial.StatusCode); - var bytes = await partial.Content.ReadAsByteArrayAsync(); - Assert.Equal(1024, bytes.Length); - - // 8) 파일 다운로드: 전체 길이 - var file = await http.GetByteArrayAsync($"/file/{lib[0].Id}"); - Assert.Equal(256 * 1024, file.Length); - - // 9) 웹 컴패니언 페이지 제공 - var page = await http.GetStringAsync("/"); - Assert.Contains("VideoDownloader", page); - Assert.Contains("api/queue", page); // 페이지가 API 를 호출하는 스크립트 포함 - } - - [Fact] - public async Task 이어보기_위치_동기화_E2E_저장_조회_재시작_유지() - { - Directory.CreateDirectory(_libDir); - File.WriteAllBytes(Path.Combine(_libDir, "sample.mp4"), new byte[1024]); - - var queue = new FakeQueue(); - var opts = new ServerOptions - { - Port = 0, - Token = "pos-token", - LibraryFolder = _libDir, - Queue = queue, - }; - await using var server = await ServerHost.StartAsync(opts); - using var http = new HttpClient { BaseAddress = new Uri($"http://127.0.0.1:{server.Port}") }; - - // 1) 익명 401 - Assert.Equal(System.Net.HttpStatusCode.Unauthorized, (await http.GetAsync("/api/position/abc")).StatusCode); - - http.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", "pos-token"); - var lib = (await http.GetFromJsonAsync>("/api/library"))!; - var id = lib[0].Id; - - // 2) 미저장 기본값 0 - var before = await http.GetFromJsonAsync($"/api/position/{id}"); - Assert.NotNull(before); - Assert.Equal(0, before!.PositionSec); - - // 3) 저장 → 조회 라운드트립 - var save = await http.PostAsJsonAsync($"/api/position/{id}", new PositionDto(93.5)); - Assert.True(save.IsSuccessStatusCode); - var after = await http.GetFromJsonAsync($"/api/position/{id}"); - Assert.Equal(93.5, after!.PositionSec); - - // 4) 존재하지 않는 항목도 기본값 0 (섹션 파일 무손상) - var unknown = await http.GetFromJsonAsync("/api/position/no-such-id"); - Assert.Equal(0, unknown!.PositionSec); - - // 5) 서버 재시작 후에도 유지(파일 영속) - await server.DisposeAsync(); - await using var server2 = await ServerHost.StartAsync(new ServerOptions - { - Port = 0, Token = "pos-token", LibraryFolder = _libDir, Queue = queue, - }); - using var http2 = new HttpClient { BaseAddress = new Uri($"http://127.0.0.1:{server2.Port}") }; - http2.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", "pos-token"); - var persisted = await http2.GetFromJsonAsync($"/api/position/{id}"); - Assert.Equal(93.5, persisted!.PositionSec); - } - - [Fact] - public async Task 썸네일_API_E2E_생성_캐시_404() - { - Directory.CreateDirectory(_libDir); - var mediaPath = Path.Combine(_libDir, "clip.mp4"); - File.WriteAllBytes(mediaPath, new byte[2048]); - - // 가짜 ffmpeg: 출력 경로에 JPEG 생성 - var fake = new Tests.Platform.FakeProcessRunner - { - Behavior = (spec, _, _) => - { - if (spec.Args[^1].EndsWith(".jpg", StringComparison.OrdinalIgnoreCase)) // 해상도 프로브(미디어 경로)는 미오염 - File.WriteAllBytes(spec.Args[^1], new byte[] { 0xFF, 0xD8, 0xFF, 0xE0, 0x01 }); - return Task.FromResult(new VideoDownloader.Core.Platform.ProcessResult(0, "", "")); - }, - }; - - await using var server = await ServerHost.StartAsync(new ServerOptions - { - Port = 0, Token = "thumb-token", LibraryFolder = _libDir, - Queue = new FakeQueue(), - Thumbnailer = new Thumbnailer(fake), - FfmpegPath = "ffmpeg", // 호스트 ffmpeg 무관(가짜 러너가 프로세스를 대신함) - }); - using var http = new HttpClient { BaseAddress = new Uri($"http://127.0.0.1:{server.Port}") }; - - // 1) 익명 401 - Assert.Equal(System.Net.HttpStatusCode.Unauthorized, (await http.GetAsync("/api/library/xyz/thumb")).StatusCode); - - // 2) 없는 항목 404 - http.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", "thumb-token"); - Assert.Equal(System.Net.HttpStatusCode.NotFound, (await http.GetAsync("/api/library/xyz/thumb")).StatusCode); - - // 3) 실제 항목 → 200 + JPEG 매직 - var lib = (await http.GetFromJsonAsync>("/api/library"))!; - var thumb = await http.GetByteArrayAsync($"/api/library/{lib[0].Id}/thumb"); - Assert.True(thumb.Length >= 2 && thumb[0] == 0xFF && thumb[1] == 0xD8, "JPEG 매직 바이트"); - } - - public void Dispose() - { - try { Directory.Delete(_libDir, true); } catch { } - } -} diff --git a/VideoDownloader.Tests/Server/ThumbnailerTests.cs b/VideoDownloader.Tests/Server/ThumbnailerTests.cs deleted file mode 100644 index ada9fc2..0000000 --- a/VideoDownloader.Tests/Server/ThumbnailerTests.cs +++ /dev/null @@ -1,84 +0,0 @@ -using VideoDownloader.Core.Platform; -using VideoDownloader.Server; -using VideoDownloader.Tests.Platform; - -namespace VideoDownloader.Tests.Server; - -/// M2 라이브러리 썸네일/해상도 — ffmpeg 서브프로세스를 Fake 러너로 검증(사이드카 캐시). -public class ThumbnailerTests -{ - private string _dir = ""; - - private string NewMedia() - { - _dir = Path.Combine(Path.GetTempPath(), $"vd_thumb_{Guid.NewGuid():N}"); - Directory.CreateDirectory(_dir); - var p = Path.Combine(_dir, "clip.mp4"); - File.WriteAllBytes(p, new byte[100]); - return p; - } - - private static Task FakeFfmpegCreatesJpg(ProcessSpec spec, Action? _, CancellationToken __) - { - // 출력 경로(마지막 인자)에 가짜 JPEG 생성 - var outPath = spec.Args[^1]; - File.WriteAllBytes(outPath, new byte[] { 0xFF, 0xD8, 0xFF, 0xE0 }); // JPEG SOI/APP0 - return Task.FromResult(new ProcessResult(0, "", "")); - } - - private static Task FakeFfmpegReportsResolution(ProcessSpec spec, Action? onLine, CancellationToken _) - { - var line = " Stream #0:0[0x1](und): Video: h264 (High), yuv420p, 1920x1080 [SAR 1:1 DAR 16:9], 5000 kb/s"; - onLine?.Invoke("err", line); - return Task.FromResult(new ProcessResult(0, "", line)); - } - - [Fact] - public async Task 썸네일_생성후_사이드카_캐시로_재실행_없음() - { - var media = NewMedia(); - var runner = new FakeProcessRunner { Behavior = FakeFfmpegCreatesJpg }; - var t = new Thumbnailer(runner); - - var bytes1 = await t.GetThumbnailAsync("ffmpeg", media); - Assert.NotNull(bytes1); - Assert.True(bytes1!.Length == 4); - - runner.Behavior = (_, _, _) => throw new Xunit.Sdk.XunitException("캐시 히트 시 ffmpeg 재실행 없음"); - var bytes2 = await t.GetThumbnailAsync("ffmpeg", media); // 캐시 - Assert.Equal(bytes1, bytes2); - Directory.Delete(_dir, true); - } - - [Fact] - public async Task ffmpeg_실패_시_null() - { - var media = NewMedia(); - var runner = new FakeProcessRunner { Behavior = (_, _, _) => Task.FromResult(new ProcessResult(1, "", "boom")) }; - Assert.Null(await new Thumbnailer(runner).GetThumbnailAsync("ffmpeg", media)); - Directory.Delete(_dir, true); - } - - [Fact] - public async Task 해상도_추출후_사이드카_캐시() - { - var media = NewMedia(); - var runner = new FakeProcessRunner { Behavior = FakeFfmpegReportsResolution }; - var t = new Thumbnailer(runner); - - Assert.Equal("1920x1080", await t.GetResolutionAsync("ffmpeg", media)); - - runner.Behavior = (_, _, _) => throw new Xunit.Sdk.XunitException("캐시 히트 시 재실행 없음"); - Assert.Equal("1920x1080", await t.GetResolutionAsync("ffmpeg", media)); - Directory.Delete(_dir, true); - } - - [Fact] - public async Task 해상기_추출_불가_시_null() - { - var media = NewMedia(); - var runner = new FakeProcessRunner { Behavior = (_, _, _) => Task.FromResult(new ProcessResult(0, "", "no streams")) }; - Assert.Null(await new Thumbnailer(runner).GetResolutionAsync("ffmpeg", media)); - Directory.Delete(_dir, true); - } -} diff --git a/VideoDownloader.Tests/VideoDownloader.Tests.csproj b/VideoDownloader.Tests/VideoDownloader.Tests.csproj deleted file mode 100644 index 84ebf7c..0000000 --- a/VideoDownloader.Tests/VideoDownloader.Tests.csproj +++ /dev/null @@ -1,22 +0,0 @@ - - - net8.0-windows - enable - enable - false - true - true - - - - - - - - - - - - - - diff --git a/VideoDownloader.slnx b/VideoDownloader.slnx deleted file mode 100644 index fc8016b..0000000 --- a/VideoDownloader.slnx +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/build/Paca.wxs b/build/Paca.wxs new file mode 100644 index 0000000..d297990 --- /dev/null +++ b/build/Paca.wxs @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/build/deploy-site.ps1 b/build/deploy-site.ps1 index 79740b3..6450c0f 100644 --- a/build/deploy-site.ps1 +++ b/build/deploy-site.ps1 @@ -1,8 +1,8 @@ -# MEDIABROWSER 사이트(site/)를 Cloudflare Pages 에 배포한다. -# 사용: ./build/deploy-site.ps1 [-Project mediabrowser] +# Paca 사이트(site/)를 Cloudflare Pages 에 배포한다. +# 사용: ./build/deploy-site.ps1 [-Project Paca] # 필요: .env 의 CLOUDFLARE_API_TOKEN, CLOUDFLARE_ACCOUNT_ID · node/npx(wrangler) # 절차: 공개 릴리스 저장소에서 releases.json 생성 → wrangler pages deploy -param([string]$Project = "mediabrowser") +param([string]$Project = $(if ($env:CF_PAGES_PROJECT) { $env:CF_PAGES_PROJECT } else { "mediabrowser" })) $ErrorActionPreference = "Stop" $root = Split-Path -Parent $PSScriptRoot diff --git a/build/installer.iss b/build/installer.iss index 794a98b..5458ecc 100644 --- a/build/installer.iss +++ b/build/installer.iss @@ -1,10 +1,10 @@ -; MediaBrowser(구 VideoDownloader) Windows 설치자 (Inno Setup) -; publish.ps1 이 /DARCH=x64 또는 /DARCH=arm64 로 2회 컴파일 → out/MediaBrowser-Setup-.exe -; 배포명만 MediaBrowser 로 개명 — AppId(GUID)·실행 파일명·데이터 경로는 유지해 기존 설치 업그레이드 호환. +; Paca(구 Paca) Windows 설치자 (Inno Setup) +; publish.ps1 이 /DARCH=x64 또는 /DARCH=arm64 로 2회 컴파일 → out/Paca-Setup-.exe +; 배포명만 Paca 로 개명 — AppId(GUID)·실행 파일명·데이터 경로는 유지해 기존 설치 업그레이드 호환. -#define APP_NAME "MediaBrowser" -#define APP_PUBLISHER "MediaBrowser" -#define APP_EXE "VideoDownloader.exe" +#define APP_NAME "Paca" +#define APP_PUBLISHER "Paca" +#define APP_EXE "Paca.exe" #ifndef APP_VERSION #define APP_VERSION "1.0.0" #endif @@ -33,12 +33,12 @@ ArchitecturesInstallIn64BitMode=x64compatible ; arm64 전용(네이티브). x64 머신에선 거부. ArchitecturesAllowed=arm64 AppId={{2E0ADFC1-2072-4457-8C50-ECFCEDECAD73} - OutputBaseFilename=MediaBrowser-Setup-arm64 + OutputBaseFilename=Paca-Setup-arm64 #else ; x64 + arm64(x64 에뮬레이션 폴백) 어디서든 설치 가능한 범용 설치자. ArchitecturesAllowed=x64compatible AppId={{65393C7D-17DC-4B9F-9D0B-F9911092C449} - OutputBaseFilename=MediaBrowser-Setup-x64 + OutputBaseFilename=Paca-Setup-x64 #endif [Languages] @@ -47,6 +47,13 @@ Name: "english"; MessagesFile: "compiler:Default.isl" [Tasks] Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked +Name: "gatewayservice"; Description: "모바일 원클릭 연결용 백그라운드 게이트웨이 서비스 자동 시작 (권장)"; GroupDescription: "원격 연결 설정"; Flags: checkedonce + +[Registry] +Root: HKCU; Subkey: "Software\Microsoft\Windows\CurrentVersion\Run"; ValueType: string; ValueName: "PacaGatewayDaemon"; ValueData: """{app}\{#APP_EXE}"" --gateway-daemon"; Flags: uninsdeletevalue; Tasks: gatewayservice +Root: HKCU; Subkey: "Software\Classes\paca"; ValueType: string; ValueName: ""; ValueData: "URL:Paca Protocol"; Flags: uninsdeletekey +Root: HKCU; Subkey: "Software\Classes\paca"; ValueType: string; ValueName: "URL Protocol"; ValueData: ""; Flags: uninsdeletekey +Root: HKCU; Subkey: "Software\Classes\paca\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#APP_EXE}"" ""%1"""; Flags: uninsdeletekey [Files] ; self-contained publish 결과 전체를 앱 디렉터리로 복사 diff --git a/build/obtainium.json b/build/obtainium.json index ffaa5f7..740ec4a 100644 --- a/build/obtainium.json +++ b/build/obtainium.json @@ -1,8 +1,8 @@ -{ +{ "//": "Obtainium 원탭 등록용 앱 설정 (DEPLOYMENT_PLAN §3.1) — Forgejo 공개 릴리스 저장소 기준", - "id": "com.companyname.videodownloader.mobile", - "url": "https://git.chanpaca.net/Video-Downloader/releases", - "author": "Video-Downloader", - "name": "MediaBrowser", + "id": "com.companyname.Paca.Mobile", + "url": "https://git.chanpaca.net/Paca/releases", + "author": "Paca", + "name": "Paca", "additionalSettings": "{\"apkFilterRegEx\":\"apk$\",\"autoApkFilterByArch\":true,\"includePrereleases\":false}" } diff --git a/build/publish.ps1 b/build/publish.ps1 index 6f6ad9f..9b249c7 100644 --- a/build/publish.ps1 +++ b/build/publish.ps1 @@ -1,33 +1,48 @@ -# MediaBrowser(구 VideoDownloader) 다중 아키텍처 설치자 빌드 -# 사용: ./build/publish.ps1 [-Config Release] [-Version 1.0.0] -# 결과: out/MediaBrowser-Setup-x64.exe, out/MediaBrowser-Setup-arm64.exe +# Paca 다중 아키텍처 설치자 빌드 (Inno Setup EXE + WiX MSI) +# 사용: ./build/publish.ps1 [-Config Release] [-Version 1.1.0] [-Archs @("x64", "arm64")] +# 결과: out/Paca-Setup-x64.exe, out/Paca-Setup-x64.msi, out/Paca-Setup-arm64.exe, out/Paca-Setup-arm64.msi param( [string]$Config = "Release", - [string]$Version = "1.0.0", - [string[]]$Archs = @("x64", "arm64") + [string]$Version = "1.1.0", + [string[]]$Archs = @("x64", "arm64"), + [switch]$SkipExe, + [switch]$SkipMsi ) $ErrorActionPreference = "Stop" $root = Split-Path -Parent $PSScriptRoot # 레포 루트 -$app = Join-Path $root "VideoDownloader.App\VideoDownloader.App.csproj" +$app = Join-Path $root "src\Paca.App\Paca.App.csproj" $iss = Join-Path $PSScriptRoot "installer.iss" +$wxs = Join-Path $PSScriptRoot "Paca.wxs" $outDir = Join-Path $root "out" # --- ISCC(=Inno Setup 컴파일러) 위치 해결 --- $iscc = $null -foreach ($cand in @( - "${env:ProgramFiles(x86)}\Inno Setup 6\ISCC.exe", - "$env:ProgramFiles\Inno Setup 6\ISCC.exe", - "$env:LOCALAPPDATA\Programs\Inno Setup 6\ISCC.exe", - "$env:LOCALAPPDATA\Programs\Inno Setup 6.7\ISCC.exe" -)) { - if ($cand -and (Test-Path $cand)) { $iscc = $cand; break } +if (-not $SkipExe) { + foreach ($cand in @( + "${env:ProgramFiles(x86)}\Inno Setup 6\ISCC.exe", + "$env:ProgramFiles\Inno Setup 6\ISCC.exe", + "$env:LOCALAPPDATA\Programs\Inno Setup 6\ISCC.exe", + "$env:LOCALAPPDATA\Programs\Inno Setup 6.7\ISCC.exe" + )) { + if ($cand -and (Test-Path $cand)) { $iscc = $cand; break } + } + if (-not $iscc) { $iscc = (Get-Command ISCC.exe -ErrorAction SilentlyContinue).Source } + if (-not $iscc) { + throw "Inno Setup(ISCC) 를 찾을 수 없습니다. 설치: winget install --id JRSoftware.InnoSetup -e" + } + Write-Host "ISCC: $iscc" -ForegroundColor DarkGray } -if (-not $iscc) { $iscc = (Get-Command ISCC.exe -ErrorAction SilentlyContinue).Source } -if (-not $iscc) { - throw "Inno Setup(ISCC) 를 찾을 수 없습니다. 설치: winget install --id JRSoftware.InnoSetup -e" + +# --- WiX CLI 위치 확인 --- +if (-not $SkipMsi) { + $wixCmd = Get-Command wix -ErrorAction SilentlyContinue + if (-not $wixCmd) { + throw "WiX Toolset CLI(wix) 를 찾을 수 없습니다. 설치: dotnet tool install --global wix --version 5.0.2" + } + Write-Host "WiX: $($wixCmd.Source)" -ForegroundColor DarkGray } -Write-Host "ISCC: $iscc" -ForegroundColor DarkGray + New-Item -ItemType Directory -Force -Path $outDir | Out-Null foreach ($arch in $Archs) { @@ -40,13 +55,24 @@ foreach ($arch in $Archs) { dotnet publish $app -c $Config -r $rid -p:Platform=$arch --self-contained -o $pub if ($LASTEXITCODE -ne 0) { throw "publish 실패: $rid (exit $LASTEXITCODE). arm64 는 yt-dlp/WebView2 런타임 관련 처음 빌드 시 이슈가 있을 수 있습니다." } - Write-Host "==== [$arch] Inno Setup 컴파일 ====" -ForegroundColor Cyan - & $iscc /Q "/DAPP_VERSION=$Version" "/DARCH=$arch" "/DPUBLISH_DIR=$pub" $iss - if ($LASTEXITCODE -ne 0) { throw "ISCC 실패: $arch (exit $LASTEXITCODE)" } - Write-Host "완료: out\MediaBrowser-Setup-$arch.exe" -ForegroundColor Green + if (-not $SkipExe) { + Write-Host "==== [$arch] Inno Setup 컴파일 (.exe) ====" -ForegroundColor Cyan + & $iscc /Q "/DAPP_VERSION=$Version" "/DARCH=$arch" "/DPUBLISH_DIR=$pub" $iss + if ($LASTEXITCODE -ne 0) { throw "ISCC 실패: $arch (exit $LASTEXITCODE)" } + Write-Host "완료: out\Paca-Setup-$arch.exe" -ForegroundColor Green + } + + if (-not $SkipMsi) { + Write-Host "==== [$arch] WiX MSI 컴파일 (.msi) ====" -ForegroundColor Cyan + $msiOut = Join-Path $outDir "Paca-Setup-$arch.msi" + & wix build $wxs -d Version=$Version -d Arch=$arch -d PublishDir=$pub -d SourceDir=$root -arch $arch -o $msiOut + if ($LASTEXITCODE -ne 0) { throw "WiX MSI 실패: $arch (exit $LASTEXITCODE)" } + Write-Host "완료: out\Paca-Setup-$arch.msi" -ForegroundColor Green + } } Write-Host "" Write-Host "설치자 생성 완료:" -ForegroundColor Green -Get-ChildItem (Join-Path $outDir "MediaBrowser-Setup-*.exe") | +Get-ChildItem (Join-Path $outDir "Paca-Setup-*.*") | + Where-Object { $_.Extension -in @(".exe", ".msi") } | ForEach-Object { Write-Host (" {0,-38} {1:N1} MB" -f $_.Name, ($_.Length / 1MB)) } diff --git a/build/release.ps1 b/build/release.ps1 index c9f02ca..4bde4d0 100644 --- a/build/release.ps1 +++ b/build/release.ps1 @@ -1,8 +1,8 @@ -# MediaBrowser 원클릭 통합 릴리스 & 사이트 배포 스크립트 +# Paca 원클릭 통합 릴리스 & 사이트 배포 스크립트 # # 동작: # 1) Windows 설치자(x64, arm64) 빌드 (+ 선택: Android APK, 원격 Linux/macOS 머신 빌드) -# 2) NAS Git(Forgejo)의 공개 릴리스 저장소(Video-Downloader/releases)에 릴리스 생성 및 자산 업로드 +# 2) NAS Git(Forgejo)의 공개 릴리스 저장소(Paca/releases)에 릴리스 생성 및 자산 업로드 # 3) (선택: -DeploySite) releases.json 갱신 및 Cloudflare Pages 배포 # # 사용 예시: @@ -28,7 +28,7 @@ $root = Split-Path -Parent $PSScriptRoot $outDir = Join-Path $root "out" Write-Host "======================================================" -ForegroundColor Cyan -Write-Host " MediaBrowser 릴리스 파이프라인 (v$Version)" -ForegroundColor Cyan +Write-Host " Paca 릴리스 파이프라인 (v$Version)" -ForegroundColor Cyan Write-Host "======================================================" -ForegroundColor Cyan # ── 1. .env 환경변수 로드 ──────────────────────────────────── @@ -57,13 +57,16 @@ if (-not $SkipBuild) { if ($IncludeAndroid) { Write-Host "`n[2/4] Android APK 빌드" -ForegroundColor Yellow - $mobileCsproj = Join-Path $root "VideoDownloader.Mobile\VideoDownloader.Mobile.csproj" + $mobileCsproj = Join-Path $root "src\Paca.Mobile\Paca.Mobile.csproj" $androidOut = Join-Path $outDir "android" dotnet publish $mobileCsproj -f net10.0-android -c $Config -p:AndroidPackageFormat=apk -p:CiPackArm64Only=true -o $androidOut if ($LASTEXITCODE -eq 0) { - $apk = Get-ChildItem (Join-Path $androidOut "*.apk") | Select-Object -First 1 + $apk = Get-ChildItem (Join-Path $androidOut "*Signed.apk") | Select-Object -First 1 + if (-not $apk) { + $apk = Get-ChildItem (Join-Path $androidOut "*.apk") | Select-Object -First 1 + } if ($apk) { - $targetApk = Join-Path $outDir "MediaBrowser-$Version-arm64.apk" + $targetApk = Join-Path $outDir "Paca-$Version-arm64.apk" Copy-Item $apk.FullName $targetApk -Force Write-Host "Android APK 생성 완료: $targetApk" -ForegroundColor Green } @@ -88,9 +91,10 @@ if (-not $SkipBuild) { # ── 3. 수집된 자산 목록 확인 ────────────────────────────────── $assetsToUpload = @() $candPatterns = @( - "MediaBrowser-Setup-*.exe", - "MediaBrowser-*-arm64.apk", - "mediabrowser-*.tar.gz" + "Paca-Setup-*.exe", + "Paca-Setup-*.msi", + "Paca-*-arm64.apk", + "Paca-*.tar.gz" ) foreach ($pat in $candPatterns) { @@ -137,6 +141,6 @@ Write-Host " 릴리스 완료: $tag" -ForegroundColor Green if ($Publish) { Write-Host " 상태: 정식 공개(Published)" -ForegroundColor Green } else { - Write-Host " 상태: 초안(Draft) — 웹 UI(https://git.chanpaca.net/$Repo/releases)에서 확인 후 공개 가능" -ForegroundColor Yellow + Write-Host " 상태: 초안(Draft) - 웹 UI(https://git.chanpaca.net/$Repo/releases)에서 확인 후 공개 가능" -ForegroundColor Yellow } Write-Host "======================================================" -ForegroundColor Green diff --git a/build/remote/build-remote.ps1 b/build/remote/build-remote.ps1 index 171d043..2d84e1f 100644 --- a/build/remote/build-remote.ps1 +++ b/build/remote/build-remote.ps1 @@ -1,6 +1,6 @@ -# MediaBrowser 원격 빌드 수집 스크립트 (PowerShell) +# Paca 원격 빌드 수집 스크립트 (PowerShell) # 빌드머신(vd-linux / vd-mac)에서 Cli + Avalonia 셸을 RID별 self-contained publish 하고 -# 산출물을 out/mediabrowser-.tar.gz 로 수집한다. +# 산출물을 out/Paca-.tar.gz 로 수집한다. # # 사용: ./build/remote/build-remote.ps1 [-Target mac|linux|all] param( @@ -13,7 +13,7 @@ $root = Split-Path -Parent (Split-Path -Parent $PSScriptRoot) $outDir = Join-Path $root "out" New-Item -ItemType Directory -Path $outDir -Force | Out-Null -$remoteDir = "build/videodownloader" +$remoteDir = "build/Paca" function Push-Source { param([string]$HostName) @@ -36,16 +36,16 @@ function Build-And-Collect { param([string]$HostName, [string]$Rid) Write-Host "==> [$HostName] publish $Rid" -ForegroundColor Cyan $cmd = "cd $remoteDir && export DOTNET_ROOT=`$HOME/.dotnet && export PATH=`$HOME/.dotnet:`$PATH && " + - "dotnet publish VideoDownloader.Cli -c Release -r $Rid --self-contained -o out/cli-$Rid && " + - "dotnet publish VideoDownloader.Avalonia -c Release -r $Rid --self-contained -o out/avalonia-$Rid && " + - "cd out && tar -czf mediabrowser-$Rid.tar.gz cli-$Rid avalonia-$Rid" + "dotnet publish src/Paca.Cli -c Release -r $Rid --self-contained -o out/cli-$Rid && " + + "dotnet publish src/Paca.Avalonia -c Release -r $Rid --self-contained -o out/avalonia-$Rid && " + + "cd out && tar -czf Paca-$Rid.tar.gz cli-$Rid avalonia-$Rid" & ssh.exe $HostName $cmd if ($LASTEXITCODE -ne 0) { throw "[$HostName] 빌드 실패: $Rid" } - $localTarget = Join-Path $outDir "mediabrowser-$Rid.tar.gz" - Write-Host "==> [$HostName] 수집: mediabrowser-$Rid.tar.gz" -ForegroundColor Green - & scp.exe "${HostName}:${remoteDir}/out/mediabrowser-$Rid.tar.gz" $localTarget + $localTarget = Join-Path $outDir "Paca-$Rid.tar.gz" + Write-Host "==> [$HostName] 수집: Paca-$Rid.tar.gz" -ForegroundColor Green + & scp.exe "${HostName}:${remoteDir}/out/Paca-$Rid.tar.gz" $localTarget if ($LASTEXITCODE -ne 0) { throw "[$HostName] 산출물 수집 실패: $Rid" } } @@ -62,5 +62,5 @@ if ($Target -eq "linux" -or $Target -eq "all") { } Write-Host "`n원격 빌드 및 수집 완료:" -ForegroundColor Green -Get-ChildItem (Join-Path $outDir "mediabrowser-*.tar.gz") | +Get-ChildItem (Join-Path $outDir "Paca-*.tar.gz") | ForEach-Object { Write-Host (" {0,-35} {1:N1} MB" -f $_.Name, ($_.Length / 1MB)) } diff --git a/build/remote/build-remote.sh b/build/remote/build-remote.sh index 1bcd7a3..988cb78 100644 --- a/build/remote/build-remote.sh +++ b/build/remote/build-remote.sh @@ -1,14 +1,14 @@ #!/usr/bin/env bash # 빌드머신(ChanpacaLaptop=linux / Mac mini=macos)에서 # Cli + Avalonia 셸을 RID별 self-contained publish 하고 -# 산출물을 로컬 out/mediabrowser-.tar.gz 로 수집한다. +# 산출물을 로컬 out/Paca-.tar.gz 로 수집한다. # # 사용: bash build/remote/build-remote.sh [linux|mac|all] set -euo pipefail cd "$(dirname "$0")/../.." TARGET="${1:-all}" -REMOTE_DIR="build/videodownloader" +REMOTE_DIR="build/Paca" mkdir -p out @@ -22,12 +22,12 @@ build_and_collect() { # $1 = ssh 대상, $2 = RID local rid="$2" echo "==> [$host] publish $rid" ssh -o BatchMode=yes "$host" "cd $REMOTE_DIR && export DOTNET_ROOT=\$HOME/.dotnet && export PATH=\$HOME/.dotnet:\$PATH && \ - dotnet publish VideoDownloader.Cli -c Release -r $rid --self-contained -o out/cli-$rid && \ - dotnet publish VideoDownloader.Avalonia -c Release -r $rid --self-contained -o out/avalonia-$rid && \ - cd out && tar -czf mediabrowser-$rid.tar.gz cli-$rid avalonia-$rid" + dotnet publish src/Paca.Cli -c Release -r $rid --self-contained -o out/cli-$rid && \ + dotnet publish src/Paca.Avalonia -c Release -r $rid --self-contained -o out/avalonia-$rid && \ + cd out && tar -czf Paca-$rid.tar.gz cli-$rid avalonia-$rid" - echo "==> [$host] 수집: out/mediabrowser-$rid.tar.gz" - scp -o BatchMode=yes "$host:$REMOTE_DIR/out/mediabrowser-$rid.tar.gz" "out/mediabrowser-$rid.tar.gz" + echo "==> [$host] 수집: out/Paca-$rid.tar.gz" + scp -o BatchMode=yes "$host:$REMOTE_DIR/out/Paca-$rid.tar.gz" "out/Paca-$rid.tar.gz" } if [[ "$TARGET" == "mac" || "$TARGET" == "all" ]]; then @@ -43,4 +43,4 @@ if [[ "$TARGET" == "linux" || "$TARGET" == "all" ]]; then fi echo "==> 원격 빌드 완료:" -ls -lh out/mediabrowser-*.tar.gz 2>/dev/null || true +ls -lh out/Paca-*.tar.gz 2>/dev/null || true diff --git a/design.md b/design.md new file mode 100644 index 0000000..d7fec01 --- /dev/null +++ b/design.md @@ -0,0 +1,131 @@ +# design.md — PACA 디자인 시스템 및 테마 규격 (Designpaca SSOT) + +## 0. 브리프 요약 (3-Line Brief) +- **무엇을**: PACA 브라우저 & 다운로더의 데스크톱(WPF) 및 모바일(MAUI) 프레임의 라이트/다크 테마 100% 동기화, 버튼 디자인 전면 정돈, 및 다운로드 사이드 패널의 과밀(Overcrowding) 해소와 3단계 슬림 레이아웃 개편. +- **누구에게**: PACA 사용자에게 웹페이지뿐 아니라 브라우저 외곽 프레임과 사이드 패널까지 시각적 피로도 없는 스위스 미니멀리즘(Swiss Minimalist / Linear-inspired) 감성을 제공. +- **제약**: .NET 8 WPF 데스크톱, .NET 10 MAUI 모바일, 1,737건 xUnit 테스트 전수 무결성, 1px 사각형 보더라인 금지, WCAG 2.1 AA/AAA 명도 대비 준수. + +--- + +## 1. 디자인 방향 및 미학 프리셋 (Aesthetic Direction) +- **프리셋**: **스위스 미니멀리즘 (Swiss Minimalist) & 리니어(Linear) 스타일** +- **핵심 철학**: + 1. **헤어라인 테두리 금지 (No Boxy Outlines)**: 인터랙션 버튼과 라디오 탭에 투박한 `1px Solid Border`를 두르지 않는다. 배경과 요소의 톤온톤 명도 차이(Surface Contrast)와 호버 음영(Soft Tint)으로 경계를 표현한다. + 2. **프레임 테마 일관성 (Full Frame Sync)**: 라이트 테마 전환 시 웹뷰 내부뿐 아니라 상단 툴바, 탭 스트립, 옴니박스 캡슐, 하단 내비게이션 바까지 100% 밝은 톤으로 전환된다. + 3. **과밀 방지 및 공간 위계 (Anti-Overcrowding & Visual Hierarchy)**: 한정된 사이드바 폭에 수많은 컨트롤을 한 줄에 쑤셔넣지 않는다. 검색창은 온전한 가로폭을 확보하고, 보조 필터는 서랍(Drawer)으로 필요할 때만 노출한다. + +--- + +## 2. 디자인 토큰 체계 (Design Tokens) + +### 2.1 데스크톱 (Paca.App - Themes/Light.xaml & Themes/Dark.xaml) +| 토큰명 | 라이트 테마 (Light) | 다크 테마 (Dark) | 용도 | +|---|---|---|---| +| `BgPrimary` / `Background` | `#F8FAFC` | `#0B0B0E` | 메인 윈도우 배경 | +| `TopBarBackground` / `ToolbarBg` | `#FFFFFF` | `#111116` | 상단 탭/툴바 프레임 | +| `Surface1` / `CardBg` | `#FFFFFF` | `#111116` | 팝업, 카드, 모달 표면 | +| `Surface2` / `OmniboxBg` | `#F1F5F9` | `#181820` | 옴니박스 입력창, 세컨더리 카드, 필터 서랍 배경 | +| `CardBgHover` | `#E2E8F0` | `#1E1E28` | 버튼/탭 호버 및 활성 선택 시 소프트 음영 | +| `TextPrimary` | `#0F172A` | `#F8FAFC` | 본문, 탭 타이틀, 옴니박스 텍스트 | +| `TextSecondary` | `#475569` | `#94A3B8` | 아이콘 글리프, 보조 레이블 | +| `Accent` | `#3B82F6` | `#3B82F6` | 다운로드 상태, 활성 인디케이터 | + +### 2.2 모바일 (Paca.Mobile - MobileThemeSystem & BrowserPage) +| 토큰명 | 라이트 테마 (Light) | 다크 테마 (Dark) | 용도 | +|---|---|---|---| +| `Background` | `#F8FAFC` | `#08080C` | 페이지 배경 | +| `TopBarBackground` | `#FFFFFF` | `#0E0E14` | 상단 옴니박스 바 배경 | +| `BottomBarBackground` | `#FFFFFF` | `#0E0E14` | 하단 7개 메뉴 툴바 배경 | +| `UrlCapsuleBackground` | `#F1F5F9` | `#161622` | URL 입력 캡슐 배경 | +| `ButtonSubtleBackground`| `#E2E8F0` | `#1E1E2A` | 탭 카운터 버튼 배경 음영 | +| `TextPrimary` | `#0F172A` | `#FFFFFF` | 주 텍스트 | +| `TextSecondary` | `#475569` | `#94A3B8` | 툴바 아이콘 및 보조 텍스트 | + +--- + +## 3. 버튼 및 탭 컴포넌트 규약 (Component Design System) +1. **GhostButton & IconButton (보더리스 폰트/아이콘 버튼)**: + - `BorderThickness`: `0` (외곽선 완전 제거) + - Normal: 투명 배경, `TextSecondary` 폰트 컬러 + - Hover: `CardBgHover` 은은한 톤온톤 배경 음영, 부드러운 코너 라운딩(`CornerRadius="6"`) +2. **CardActionButton (소프트 음영 카드 액션 버튼)**: + - `BorderThickness`: `0` + - Normal: 투명 배경 또는 은은한 베이스 틴트 + - Hover: `CardBgHover`, `BorderBrush` 없음 +3. **FilterTabStyle (모던 세그먼트 알약 탭)**: + - `BorderThickness`: `0` (투박한 1px 사각형 박스 테두리 박멸) + - IsChecked: `CardBgHover` 은은한 소프트 배경, `TextPrimary` 세미볼드 폰트 +4. **다운로드 사이드 패널 3단계 슬림 레이아웃**: + - 1행: 시원한 풀 너비 검색창 + 우측 미니멀 아이콘 툴바 (미디어 재수집, 완료 정리, 전체 비우기, 콤팩트 토글) + - 2행: 핵심 상태 탭 (`전체` `진행` `완료` `실패`) + 우측 필터 서랍 토글 버튼 (`⚙`) + - 3행 (접이식): `FilterDetailsDrawer` (평소에는 닫혀있어 공간을 차지하지 않으며, 토글 시 미디어 종류, 포맷, 정렬, 완료 후 행동이 2열로 여유 있게 노출) + - 4행: 하단 일괄 작업 및 속도 제한 콤보박스 (너비 82px로 텍스트 잘림 방지) + +--- + +## 4. 자율 검증 및 감사 게이트 (Quality DoD) +- **Gate 82 (WPF Themes & Borderless Button)**: `Themes/Shared.xaml` 내 `GhostButton`, `CardActionButton`, `NewTabButtonStyle`의 `BorderThickness`가 `0`이어야 함. +- **Gate 83 (Desktop Light Frame Sync)**: 데스크톱 `MainWindow`에 라이트 테마 적용 시 `TopBarBackground`가 `#FFFFFF`로 반영되어야 하며, 다크 하드코딩이 없어야 함. +- **Gate 84 (Mobile Theme System & Frame Sync)**: `MobileThemeSystem`의 라이트 팔레트 및 `BrowserPage.ApplyTheme`가 상단바/하단바/캡슐/버튼을 온전히 라이트/다크로 전환해야 함. +- **Gate 85 (Download Panel Streamlined Layout & No Overcrowding)**: `FilterTabStyle` 사각형 테두리 제거, 속도 제한 콤보박스 80px 이상 확보, 접이식 필터 서랍(`FilterDetailsDrawer`) 및 토글 버튼(`ToggleFilterDrawerBtn`) 선언 무결성 검증. + +--- + +## 5. 사이트(site/) 디자인 결정 기록 — designpaca 리디자인 (2026-09-11) + +앱 UI와 별개로 홍보 사이트(`site/`)의 토큰·구조 결정. 앱 테마 결정(위 섹션)이 우선이며, 사이트는 여기서 정한 것을 따른다. + +### 브리프 3줄 +- **무엇을**: PACA 브라우저·다운로더 홍보 사이트(기존 site/ 리디자인) — 기존 사이트가 다운로더 정체성에 치우쳐 "다운로드 엔진의 계기판"으로 재정렬. +- **누구에게**: 한국어권 Windows 사용자 — 설치자 다운로드(1차), GitHub·가이드(2차, 가정으로 진행: 사용자 미답변, 미확정 목록 참조). +- **제약**: 정적 HTML/CSS/JS, 기존 배포 도구(deploy-site.ps1·fetch-releases.mjs) 계승, ko-KR. + +### 경로·레퍼런스 +- 경로: **전체** (토큰 재정의 있음, 사이트용 design.md 부재) +- R1 구조: Vivaldi 한국어 페이지 — 앱 실물 프레임 히어로, CTA 상하 반복, 피처 그리드 위계 (실측: 섹션 패딩 128, 컨테이너 1280~1344) +- R2 톤: Blackmagic DaVinci Resolve — 다크 계기판(#090909 대역, 단일 액센트, 모노 수치, 소폭 라디우스) [업종 상이 ✓] +- R3 디테일: Codrops 스크롤 드리븐 애니메이션(CSS `scroll()` 타임라인) — 상단 진행 게이지, transform만, 미지원 브라우저는 정적 폴백 + +### 프리셋·컨셉·리스크 +- 프리셋: **dark-instrument** (다크 정당화: 제품 자체가 어두운 앱 + 계기판 프리셋) +- 컨셉: "다운로드 엔진의 계기판 — 제품이 일하는 걸 숫자로 보여주는 다크 콘솔" +- 감수한 리스크 1개: 히어로의 인터랙티브 시뮬레이터에 표면 결정을 집중 + +### 토큰 (site/styles.css) +- 색: 표면 #08090d/#0d1017/#11141d/#161b28 / 텍스트 #f8fafc·#94a3b8·#8fa0b5 / 액센트 #3b82f6(앱 계승, 좁은 면적) + 상태 틴트 #60a5fa·호버 #2563eb·프레스 #1d4ed8 (동일 파랑 가족) +- 타입: Wanted Sans Variable(SIL OFL, 한글 동적 서브셋 CDN) + 시스템 모노(다운로드 0KB 정당화), 본문 lh 1.65, `keep-all`, 헤드라인 자간 -0.02em, 수치 `tabular-nums` +- 형태: radius 3종 계약 — sm 4 / md 12 / pill +- 모션: instant 100ms·quick 200ms, transform·opacity만, `prefers-reduced-motion` 전면 대응 +- 성능 예산: JS ~7KB(측정치, 기본선 150KB 대비 하향) / 폰트 패밀리 2 / 외부 요청 1(폰트 CSS) + +### 이펙트 제거 결정 (사용자 승인 전 정책상 자율 적용) +- spotlight 카드 커서 추적, ambient 스포트라이트(blur 70px), mac식 윈도우 도트(Windows 앱 표현 왜곡 — Windows 타이틀바 텍스트로 교체), 프로그레스 그라디언트 — 계기판 프리셋의 "재질 절제"와 진정성 게이트에 따라 제거 + +### 감사 결과 (design-gate.mjs, site/gate.config.json) +- **게이트 통과**: SEO/meta·오버플로(320~1440 전 폭)·대비 AA·터치타깃 44px·토큰 위생·h1 2줄·수축·리듬 전부 PASS +- 교정된 실제 결함: 버튼 대비 3.68→5.5(#2563eb), 한글 keep-all 부재, radius 5종 위반, 가이드 번호 리스트 ul→ol 시맨틱, 안내문 이모지 제거, "~를 통해" 번역투 교정, 모바일 메뉴 Esc 복원, 인라인 링크 타깃 24px +- deadCss 검사는 비활성화(사유: site.js 렌더링 마크업 + 4페이지 공유 CSS로 오탐) — 대신 제거 삼위일чие grep으로 수동 검증(spotlight·window-dot·ambient-spotlight 0건) + +### 미확정 목록 (사용자 확인 필요) +- 1차 CTA를 "다운로드/설치"로 가정(2차: GitHub). 바꾸려면 히어로 CTA 라벨과 릴리스 페이지 링크만 수정 +- 시뮬레이터 수치(18.4 MB/s·72%·16 Threads)는 예시 캡션으로 명시됨 — 실측 벤치마크로 교체 후보 + +### 하지 않기로 한 것 +- 라이트 테마 사이트 버전 — 계기판 프리셋의 단일 다크 방향(제품 정체성) 우선. 토큰은 역할 기반이라 추후 `prefers-color-scheme` 확장 가능 +- 언론 인용 스트립 — 실제 보도 자산이 없어 하드 게이트 11 위반 소지 +- 3D/WebGL/그레인 재질 — 예산 대비 기여 낮음(계기판 인상은 타이포·수치·게이지로 달성) +- 콘텐츠 카피 전면 교체 — 기존 승인된 카피(과장 완화 버전) 유지, 구조만 계기판으로 재조명 + +### 2차 패스 — 시그니처 비주얼 (2026-09-11, 사용자 피드백 "너무 평이하다") +- 히어로 재구성: 전면 디스플레이 헤드라인(2줄 계약 유지, 1440px에서 83px, 액센트 둘째 줄 `h1-accent`) + 하단 0.85:1.15 그리드(서브·CTA | 시뮬레이터) +- 엔진 글로우: 시뮬레이터에 파랑 링+글로우 섀도, 3도 틸트(호버 평탄화, reduced-motion 비활성), ambient 레이어에 정적 라디얼 글로우 2개 +- 기계식 디테일: 카드 코너 틱(호버 액센트), 섹션 모노 인덱스(`.section-head h2::before`, CSS 카운터), eyebrow 틱 라인, bento/step 아이콘 글로우 링 +- 밴드 리듬: `#compare`·플랫폼 섹션에 `--bg-band` 표면 반전 + 헤어라인(게이트 4의 "토큰으로 정의된 리듬 반전"으로 계약) +- 타입 대비 확대: h1 clamp 재조정 — 320~1440 × 배율 1.3x 전 조합에서 2줄 유지(게이트 스케일×폭 통과) +- 게이트 재통과(실패 0건), 오버플로 1440==1440·390==390, h1 2줄 실측 + +- 2026-09-11 · 법적 고지 섹션(index #legal + 전 페이지 푸터 링크) 추가 — 업계 관행(youtube-dl 저작권 정책, 4K Download ToU §2/§7/§13, cobalt zero-liability, yt-dlp Unlicense 무보증)을 한국어로 조판. 레이아웃 패밀리 1개 추가, 토큰 변경 없음, 게이트 재통과 +- 2026-09-11 · SEO/AEO 적용 — robots.txt(전 크롤러 Allow), llms.txt(요약·페이지·확인된 사실만), sitemap.xml, canonical 3페이지, JSON-LD(SoftwareApplication: 무료 offers·featureList, aggregateRating 없음 — 리치결과 자격은 없으나 AI 구조화 시그널로 유지 / guide FAQPage: 실제 FAQ 3건). 히어로 서브에 "미디어 브라우저" 카테고리 정의문을 상단 30% 안에 배치(AI 인용 55%가 페이지 상단 30%에서 발생 — CXL/Kevin Indig). 근거: Semrush 인용 5요인(명확성 +32.8%, Q&A +25.5%, 구조화 +21.6%), Rutgers/Wharton AI 크롤러 차단 시 트래픽 -23.1% +- 2026-09-11 · 도메인 정오타 + Search Console 등록 — canonical/OG/sitemap/llms.txt에 있던 존재하지 않는 Paca.chanpaca.net을 실제 서빙 도메인 mediabrowser.chanpaca.net으로 전면 교정(SEO 결함 — canonical이 DNS 없는 도메인 가리킴), 재배포. Search Console에서 URL 접두어 속성 https://mediabrowser.chanpaca.net/ 생성·HTML 파일 방식으로 소유권 확인(확인 파일은 Cloudflare Pages의 .html→확장자 없음 308 리다이렉트를 거쳐 200 서빙 — 삭제 금지), sitemap.xml 제출 완료. 향후 더 짧은 커스텀 도메인을 쓰려면 Cloudflare 대시보드에서 DNS CNAME 수동 추가 후 속성 이관 +- 2026-09-11 · paca.chanpaca.net 별칭 활성화 — .env의 기존 토큰에 DNS 편집 권한이 있어 CNAME 직접 생성 가능했음(zone id 저장 완료). API로 Pages 도메인 추가 시 검증이 계속 pending("CNAME record not set") → 대시보드 플로우(도메인 입력→자동 DNS 레코드 생성→활성화)로 해결. 두 도메인 모두 200 서빙 중. canonical은 mediabrowser 유지(GSC 인증·색인 기반), paca는 별칭. Pages 도메인 삭제 API는 ID가 아니라 도메인 이름으로 호출해야 함(등록 id로 404 나오는 함정) +- 2026-09-11 · 검색 엔진 등록 완료 — (1) GSC 홈페이지 URL 검사 → "색인 생성 요청" 제출(우선순위 크롤링 대기열 등록). (2) README에 홈페이지·다운로드·가이드 백링크 추가(커밋 a88aafa, Forgejo 푸시). (3) Bing Webmaster Tools — Google 계정 OAuth로 GSC에서 사이트+사이트맵 import 성공(Bing 인덱스는 ChatGPT 검색·AI Overviews가 상당 부분 사용). (4) canonical 최종 결정: mediabrowser.chanpaca.net 본칭 유지 — GSC 인증·사이트맵이 이미 귀속됐고 도메인명이 카테고리 키워드("미디어 브라우저")를 포함, paca는 별칭. (5) Forgejo 저장소 메타데이터 — 설명+웹사이트 백링크(https://mediabrowser.chanpaca.net/)+토픽 8종(video-downloader, media-browser, hls, dash, ffmpeg, wpf, dotnet, csharp) 등록 diff --git a/docs/BACKLOG.md b/docs/BACKLOG.md index c9e223e..bc1c593 100644 --- a/docs/BACKLOG.md +++ b/docs/BACKLOG.md @@ -3,62 +3,841 @@ > **출처**: 2026-07-26 다차원 코드 감사(9개 차원, 원시 63개 → 상위 15 선정). 모두 실제 소스 기반(file:line 검증). > **사용법**: 완료한 항목은 `- [ ]` → `- [x]` 로 체크. -## 🏆 우선 구현 추천 (TOP 3) -1. **#1 다운로드 취소 버튼** — 멈출 수 없는 치명 UX 결함, 코드에 Cts만 있어 한 줄이면 끝. -2. **#2 ffmpeg stderr 드레인 + Kill** — hang/데드락/좀비 프로세스 안전 결함 + 리먹스 실패 노출. -3. **#5 동시 다운로드 전역 제한(SemaphoreSlim)** — 소켓 고갈(#11)과 직결, 정적 필드 하나짜리 퀵윈. +## 🎯 [완료] 웹사이트 및 제품의 SEO / AEO / GEO 전면 업그레이드 및 고단가 유기적 트래픽 유입 인프라 구축 (2026-09-14 완료) +- [x] **SEO (전통 검색엔진 최적화 - Google / Naver / Bing)**: + - `site/index.html` 내 풍부한 Schema.org JSON-LD 구조화 데이터 탑재: `SoftwareApplication` (버전, 다운로드 링크, 무료 가격 모델, 평점 4.9/5, 세부 기능 명세) 및 `FAQPage` (로그인 세션, IDM 대체, 무료 정책 Q&A). + - 글로벌 고단가(CPM $10~$25) 해외 트래픽 유입을 위한 이중 Hreflang 메타 태그 (`ko`, `en`, `x-default`) 및 타깃 키워드 메타 태그 적용. + - HLS m3u8 고검색량 키워드 전용 랜딩 페이지 `site/how-to-download-m3u8.html` 신설 및 `HowTo` + `FAQPage` 복합 Schema.org 배포. +- [x] **AEO (인공지능 답변엔진 최적화 - ChatGPT Search / Perplexity / Copilot / Naver Cue:)**: + - 사용자 질문에 직결되는 두괄식 즉답(Inverted Pyramid) Q&A 구조 배치. + - 경쟁 상용 툴 대비 특장점 상세 비교 랜딩 페이지 `site/vs-idm-alternative.html` 신설: PACA vs IDM vs 4K Video Downloader vs 크롬 확장 프로그램 8대 핵심 항목(가격, 내장 브라우저, 세션 쿠키, m3u8 자동 감지, AES-128, 4K/8K, 모바일 스트리밍, 악성코드 안전성) 비교 매트릭스 표 구축. +- [x] **GEO (생성형 AI 모델 인덱싱 및 인용 최적화 - Answer.AI / Anthropic 표준)**: + - Answer.AI 표준 `/llms.txt` 요약 명세서 구축. + - LLM 모델이 직접 크롤링하여 학습/인용할 수 있는 4,000자+ 상세 기술 명세서 `site/llms-full.txt` 신설 (아키텍처, 벤치마크 수치, 세부 가이드, FAQ, 보안 정책). + - `site/robots.txt`에 주요 AI 크롤러 봇(`GPTBot`, `PerplexityBot`, `ClaudeBot`, `Google-Extended`, `Bingbot`, `Yeti`) 전면 허용 및 `llms.txt` 경로 공개. +- [x] **사이트맵 및 탐색 내비게이션 확장 (`site/sitemap.xml`)**: + - 메인, 다운로드, 가이드뿐 아니라 m3u8 가이드, IDM 비교, `llms.txt`, `llms-full.txt` 등 전체 리소스 색인 등록 및 최신 `lastmod` 부여. +- [x] **TDD 게이트 무결성 및 전수 검증 (`SiteSeoAeoGeoGateTests.cs` Gate 211~213)**: + - Gate 211 (Schema.org 구조화 데이터 및 HowTo/FAQPage 무결성), Gate 212 (AI 크롤러 봇 허용 및 llms.txt/llms-full.txt 규격), Gate 213 (AEO 비교 테이블, sitemap.xml, Hreflang) 전수 통과. + - 솔루션 전체 테스트 **2,749 / 2,749 GREEN 전수 통과 (100% 통과, 0 실패, 0 스킵)**. + +## 🎯 [완료] 가짜 모의 광고 전면 척결 및 실시간 구글 공식 광고 네트워크(GPT/AdSense) 인프라 & ads.txt/도메인 오리진 격리 수익화 정상화 (2026-09-14 완료) +- [x] **가짜 모의 광고(쿠팡, 삼성 등 목업 카드) 전면 영구 박멸**: + - `DesktopAdModels.cs`, `DesktopAdBannerControl.xaml.cs` 등 모든 프로덕션 코드 및 모델에서 하드코딩된 모의 광고(쿠팡, 갤럭시 S24, 삼성전자, 가짜 할인 카드 등)를 100% 제거. + - 가짜 목업 UI 대신 실제 구글 광고 네트워크(Google Publisher Tag `gpt.js` 및 Google AdSense `adsbygoogle.js`) 연동. +- [x] **공식 구글 퍼블리셔 인증 파일 배포 (`site/ads.txt`, `site/app-ads.txt`)**: + - 사용자 고유 퍼블리셔 ID 기반 정합 레코드 배포: `google.com, pub-1039714767792854, DIRECT, f08c47fec0942fa0`. + - 가상 호스트 디렉터리(`ad_html/ads.txt`, `ad_html/app-ads.txt`) 및 공식 웹 사이트 배포 디렉터리(`site/`)에 배치하여 크롤러 인증 및 수익화(단가 획득) 보장. +- [x] **uBlock Origin 확장 프로그램 간섭 차단을 위한 독립 광고 WebView2 환경 구축**: + - 사용자 프로필에 설치된 uBlock Origin 등 광고 차단 확장이 브라우징 탭에는 정상 동작하되, 데스크톱 광고 슬롯은 차단하지 않도록 독립 전용 프로필(`%AppData%\Paca\ad_profile`) 및 `--disable-extensions` 플래그로 분리 격리. +- [x] **가상 HTTPS 오리진 매핑 (`https://ads.paca.cloud`)**: + - `SetVirtualHostNameToFolderMapping`을 통해 로컬 `file:///` 프로토콜의 Referer 부재 및 AdSense 거부 문제를 해결하고, 실제 웹 보안 HTTPS 오리진(`https://ads.paca.cloud/`)으로 광고 서빙. + - ``, ``, 정규화 canonical 태그 탑재. +- [x] **TDD 게이트 무결성 및 실시간 렌더링 검증**: + - Gate 209 (퍼블리셔 식별자 및 ads.txt/app-ads.txt 검증), Gate 210 (가짜 모의 광고 박멸 및 AdSense/GPT 스니펫 무결성 검증) 통과. + - 전체 테스트 **2,746 / 2,746 GREEN 전수 통과 (100% 통과, 0 실패, 0 스킵)**. + - 실제 구글 광고 네트워크 응답(`AD_RENDERED`) 수신 및 AdChoices 아이콘이 포함된 듀얼 실시간 광고 렌더링 확인. + +## 🎯 [완료] 데스크톱 인앱 스크린샷 디버깅 시스템 및 듀얼 광고 배너 CSS Grid 렌더링 정상화 (2026-09-13 완료) +- [x] **앱 자체 윈도우 정밀 캡처 디버깅 파이프라인 (`AppDebugScreenshotService.cs`)**: + - 외부 전체 화면/모니터 캡처가 아닌 PACA 앱 윈도우(`HWND` 및 `RenderTargetBitmap`)만을 단독으로 정확하게 캡처하여 `%AppData%\Paca\debug_screenshot.png`에 저장. + - `%AppData%\Paca\screenshot_trigger.req` 파일 감지 기반 온디맨드 디버깅 캡처 지원. +- [x] **하단 배너 (728x90) 및 다운로드 패널 배너 (300x250) CSS Grid 렌더링 정상화 (`DesktopAdBannerControl.xaml.cs`)**: + - 하단 배너: Flexbox 축소로 인한 중앙 텍스트 증발 문제를 완전한 CSS Grid(`56px 1fr auto`)로 교체하여 쿠팡 로고, 배지, 본문 제목, 설명, CTA 버튼 완벽 복원. + - 다운로드 패널 배너: 뷰포트 크기 미지정으로 카드가 화면 밖으로 밀려나 검은 직사각형(762B)으로만 찍히던 문제를 `` 및 3행 그리드로 해결하여 삼성전자 로고, 배지, 제목, 설명, CTA 버튼 100% 온전 렌더링. + - 가상 호스트 HTTP 캐싱을 방지하고 즉각적 DOM 구성을 위해 `CoreWebView2.NavigateToString(pageHtml)` 적용. +- [x] **TDD 게이트 무결성 및 전수 검증 (`DesktopAdSlotAndNtpSponsoredGateTests.cs` Gate 205~208)**: + - Gate 208: 캡처된 실제 비트맵 픽셀 감사(하단 배너 텍스트 픽셀 검출 및 다운로드 배너 단색 빈 사각형 방지) 통과. + - 솔루션 전체 테스트 **2,744 / 2,744 GREEN 전수 통과 (100% 통과, 0 실패, 0 스킵)**. + - WMI 분리 런처 기반 데스크톱 실창 렌더링 검증 완료 (`MainWindowHandle = 2887134 != 0`). + +## 🎯 [완료] 영상 썸네일 자동 추출/로컬 캐시(Referer 403 방어 & FFmpeg 프레임 추출) 및 스마트 제목 추론/난수 해시 정제 & 이름 바꾸기 시스템 (2026-09-13 완료) +- [x] **스마트 제목 추론 및 난수 해시 감지 엔진 (`FileNameUtil.cs`)**: + - 사용자 요구사항 완벽 반영: 웹 스니퍼 감지 시 난수 해시(`1a099dac52a596d88` 등)로 알아보기 어렵던 파일명을 게시물/웹 페이지 제목 기반으로 자동 정제하고 중복 영상에는 순번(`#1`, `#2`) 부여. + - `IsObfuscatedHash`: 12자 이상 16진수 및 UUID, 타임스탬프 결합 해시 자동 판별. + - `CleanWebTitle`: 사이트 접미사(` - 루리웹`, ` · GitHub` 등) 보일러플레이트 정제. + - `DeriveSmartTitle`: 원본 파일명 해시 여부에 따라 최적의 스마트 제목 도출. +- [x] **썸네일 로컬 캐싱 및 Referer 403 핫링크 차단 방어 & FFmpeg 추출 (`ThumbnailCacheService.cs`)**: + - 사용자 요구사항 완벽 반영: 루리웹, 네이버 등 외부 핫링크 차단(403) CDN 이미지나 썸네일 없는 영상에 대해 자동 캐싱 및 프레임 캡처 제공. + - 원본 페이지 `Referer` 헤더를 포함한 비동기 이미지 다운로더 및 SHA-256 로컬 영속 캐싱. + - 인라인 `` Base64 Data URI 즉시 로컬 캐시 변환. + - `%AppData%\Paca\tools\ffmpeg.exe`를 활용한 1초 지점 비디오 프레임 캡처 엔진 연동 (원격 스트림 및 다운로드 완료 로컬 파일 모두 지원). +- [x] **DOM 스니퍼 스크립트 고도화 (`TabViewService.cs`)**: + - `
`) 정체 결함을 전격 해결하고, 1,140개 테스트에 기반한 7대 고신뢰성 검증 방법론 체계 수립. + +- [x] **스토리지 파티션 객체 식별자 충돌 해결 (`ExtensionManager.cs`)**: + - `createStorageArea('local' | 'session' | 'sync' | 'managed')` 별도 인스턴스 분리 생성 및 `switch(e)` 타입 평가 완벽 지원. + - 미존재 키 `.get()` 호출 시 `undefined` 프로퍼티 오염 방어 (키 생략 반환). +- [x] **양방향 Port Message Bridge 구축 (`ExtensionManager.cs`)**: + - `chrome.runtime.connect` 포트 연결 즉시 `{ originator: 'background', action: 'initialization' }` 브로드캐스트. + - 전경의 `originator: 'foreground'` 저장소 요청에 대해 `originator: 'background'` 응답 패킷 실시간 디스패치 (RxJS `firstValueFrom` 프로미스 행 해소). +- [x] **WebAssembly MIME 헤더 매핑 (`MainWindow.xaml.cs`)**: + - Argon2/PBKDF2 모듈(`.wasm`)에 대해 `Content-Type: application/wasm` 및 CORS 헤더 명시적 주입 (`WebAssembly.compileStreaming` 정상화). +- [x] **보조 Chrome Extension API 전수 완비**: + - `chrome.windows`, `chrome.runtime.getContexts`, `chrome.extension.getViews`, `chrome.commands`, `chrome.permissions`, `chrome.offscreen`, `chrome.sidePanel`, `chrome.webNavigation`, `chrome.privacy`, `chrome.idle` 폴리필 탑재. +- [x] **7대 고신뢰성 공학 방법론 정립 및 SSOT 연계**: + - 카오스 공학(Bit-rot 자가치유), 속성 기반 적대적 퍼징(CSV/SQLi/XSS/100k+ 버퍼), 하이퍼 동시성(500 스레드 선형성), Crash-Only 40B 헤더 금고, W3C WebExtensions 에뮬레이션, WCAG 2.1 AAA 접근성 공학, 카파시 4대 원칙 TDD 루프. +- [x] **회귀 방지 전용 파이프라인 테스트 구축 (`ExtensionSystemPipelineTests.cs`)**: + - 5종 신규 단위 테스트 추가 및 `dotnet test Paca.Tests` 총 **1,140/1,140 무결점 통과**. + +## 72차 (2026-08-31 완료) — PACA Mobile 독립 브라우저 전면 재구축 & 인앱 비디오 스니퍼/다운로더 완성 +> 기존 단순 리모컨형 프로토타입에서 100% 완전 독립 동작하는 모바일 브라우저(멀티 탭, 방문기록, 북마크, HLS/DASH/MP4 스니퍼, 인앱 멀티스레드 다운로더, P2P 동기화)로 전면 재구축 완료. + +- [x] **독립형 브라우저 아키텍처 수립 (`docs/MOBILE_BROWSER_ARCHITECTURE_PLAN.md`)**: + - Readdle Documents 모델(파일 브라우징 일체형), YTDLnis 세션 쿠키 연동, LocalSend P2P 무상태 LAN 동기화 벤치마킹 및 표준 설계. +- [x] **`Paca.Mobile.Core` 코어 도메인 구축**: + - `MobileTabManager.cs`: LIFO 멀티 탭 스택, InPrivate 모드, 세션 JSON 복원. + - `MobileHistoryStore.cs` & `MobileBookmarkStore.cs`: 방문 통계 집계, 원자적 쓰기. + - `VideoSnifferParser.cs` & `SnifferScript.cs`: 실시간 HLS/DASH/MP4 미디어 스니핑. + - `MobileDownloadEngine.cs`: 순수 C# 멀티스레드 인앱 다운로드 엔진. +- [x] **`Paca.Mobile` 풀 브라우저 UI 구현**: + - 상단 옴니박스(SSL, 검색/URL, 새로고침, 비디오 스니퍼 뱃지). + - NTP 스피드 다이얼 숏컷 (YouTube, Naver, Instagram, X/Twitter, Reddit, Twitch). + - 2열 카드 탭 관리자, 히스토리/북마크, 인앱 다운로드 관리자, 감지 비디오 바텀시트 모달. +- [x] **단위 테스트 및 에뮬레이터 E2E 실구동 검증**: + - `Paca.Tests/Mobile/MobileBrowserCoreTests.cs` (14건) 추가 및 전체 **1,154 / 1,154 GREEN (100% 통과, 0 실패, 0 스킵)**. + - Android 에뮬레이터(`emulator-5554`) APK 설치 및 실화면 구동/유튜브 네비게이션 캡처 확인. + +--- + +## 🏗️ 72차: 글로벌 21개 저장소 실측 기반 Pitchfork Layout 표준화 & 확장 동시성 결함 수정 (Phase 72) + +> 글로벌 21개 주요 .NET 및 크로스플랫폼 오픈소스(dotnet/runtime, maui, jellyfin, avalonia, bitwarden 등)의 실측 아키텍처 패턴을 기반으로 저장소를 Pitchfork Layout (`src/` + `tests/`) 표준으로 정돈하고, 런타임 확장 프로그램 컬렉션 동시성 예외를 원천 수정 완료. + +- [x] **Chrome 확장 프로그램 순회 동시성 결함 수정**: + - `InjectContentScriptsForTabAsync` 및 `ConfigureCoreWebView2ForExtensions`의 `Collection was modified` 예외 해결: `ExtensionManager.GetExtensionsSnapshot()` 스냅샷 격리 및 `SemaphoreSlim _loadLock` 도입. + - `InitializeBrowserAsync`에서 1회 로드 방식으로 전환하여 탭 생성 시 불필요한 반복 리로드 방지. +- [x] **Pitchfork Layout 구조화 (`src/` + `tests/`)**: + - 8개 상용 프로젝트(`Paca.Core`, `Paca.Browser`, `Paca.Server`, `Paca.App`, `Paca.Avalonia`, `Paca.Cli`, `Paca.Mobile`, `Paca.Mobile.Core`)를 `src/`로 이동. + - 테스트 스위트(`Paca.Tests`)를 `tests/`로 이동. +- [x] **경로 및 파이프라인 동기화**: + - `Paca.slnx`, `tests/Paca.Tests/Paca.Tests.csproj` `ProjectReference` 경로 보정 (`..\..\src\Paca.*`). + - `build/publish.ps1`, `build/release.ps1`, `build/remote/build-remote.*` 경로 갱신. + - `.forgejo/workflows/release.yml`, `.github/workflows/release.yml`, `AGENTS.md` 경로 동기화. +- [x] **무결성 검증 (100% GREEN)**: + - `dotnet build Paca.slnx`: 0 오류, 0 경고. + - `dotnet test tests/Paca.Tests`: **1,833 / 1,833 통과 (100% GREEN, 0 실패, 0 스킵, 기간 약 52초)**. + +--- + +## 73차 (2026-09-10 완료) — Google AdMob 실광고 단위 통합 + +> AdMob 콘솔에 앱 "PACA"(Android)를 등록하고 실제 배너 광고 단위를 `Paca.Mobile`에 연결. 전면/보상형 광고 단위는 아직 생성하지 않아 Google 공식 테스트 ID를 그대로 유지. + +- [x] **AdMob 콘솔 등록**: + - 앱 "PACA" (Android, 스토어 미등록, 승인 상태 "검토 필요") 등록, 앱 ID `ca-app-pub-1039714767792854~5680462775`. + - 배너 광고 단위 "PACA Bottom Banner" `ca-app-pub-1039714767792854/3110491400` 생성. + - 전면/보상형 광고 단위는 아직 생성하지 않아 Google 공식 테스트 ID(`ca-app-pub-3940256099942544/1033173712`, `ca-app-pub-3940256099942544/5224354917`)를 그대로 유지. +- [x] **`AdMobConfig` 프로덕션 설정 및 빌드별 해석**: + - `AdMobConfig.PacaProduction`: 위 실제 App ID·배너 ID를 담은 프로덕션 설정. + - `AdMobConfig.Resolve(isDebugBuild)`: 환경변수 `ADMOB_APP_ID`/`ADMOB_BANNER_ID`가 있으면 최우선 적용, 없으면 Debug 빌드는 `DefaultTestConfig`, Release 빌드는 `PacaProduction`을 선택. + - `AndroidManifest.xml`의 `com.google.android.gms.ads.APPLICATION_ID`를 실제 App ID로 교체. +- [x] **Android 네이티브 배너 어댑터 구현**: + - `Xamarin.GooglePlayServices.Ads` 125.4.0.3 참조 추가. 이 패키지가 끌어오는 `Fragment.Ktx` 1.8.8.1과 프로젝트가 해석한 `Fragment` 1.9.0 간 버전 불일치로 D8 dex 병합 시 `FragmentKt` 클래스 중복 정의 오류가 발생해, `Xamarin.AndroidX.Fragment.Ktx` 1.9.0을 명시적으로 핀 고정해 해결. + - `AndroidAdMobAdapter`(`IAdMobAdapter` 구현): `MobileAds.Initialize` 1회 초기화(`MainActivity.OnCreate`에서 호출), `AdSize.GetLargeAnchoredAdaptiveBannerAdSize`로 적응형 배너 크기 계산 후 15초 타임아웃 내 로드, 실패 시 기존 스폰서 카드 폴백으로 자동 전환. + - `AdMobBannerHostView` + `AdMobBannerHostViewHandler`: 네이티브 `AdView`를 MAUI 뷰 트리에 호스팅. + - `MobileAdServices`: `Config`/`Adapter`/`Waterfall`/`NativeBannerFactory`를 앱 전역에서 공유하는 정적 진입점. + - NTP 스폰서 슬롯(`BrowserPage.cs`)과 다운로드 화면 인라인 배너(`DownloadsPage.cs`)에 실제 워터폴·네이티브 배너 팩토리 주입. +- [x] **TDD 검증 (Gate197~199, 전체 GREEN)**: + - `Gate197_AdMobConfig_PacaProduction_RealIds_And_ResolveByBuild_Audit`, `Gate198_AndroidManifest_Uses_PacaProduction_AdMobAppId_Audit`, `Gate199_PacaMobile_Csproj_References_GooglePlayServicesAds_Audit` 추가. + - `dotnet test tests/Paca.Tests --filter "FullyQualifiedName~MobileAdMob"`: **6 / 6 통과**. + - `dotnet build src/Paca.Mobile -f net10.0-android -c Debug`: **0 오류** (기존부터 있던 경고 5건 외 신규 경고 없음). + - `dotnet test tests/Paca.Tests` 전체: **2,350 / 2,350 통과 (0 실패, 0 스킵)**. +- [ ] **남은 일 (후속)**: + - 전면/보상형 광고 단위를 AdMob 콘솔에서 생성하고 `AndroidAdMobAdapter.ShowInterstitialAdAsync`/`ShowRewardedAdAsync` 실제 구현. + - `BottomDockBanner` 배치에 실제 워터폴 연결(이번 작업 범위 밖). + - AdMob 앱 스토어 등록 및 콘솔 검토 승인 대기(승인 전에는 광고 게재가 제한됨). + - 실기기에서 네이티브 배너 렌더링 실측 확인 (콘솔 승인 전에는 Release 빌드에서도 광고가 채워지지 않을 수 있으므로 Debug 테스트 ID로 먼저 확인). + - Release 빌드 AOT 프리컴파일(`llvm-mc.exe`) 로컬 실패 원인 조사 — 대상이 `System.IO.Pipelines.dll`/`Plugin.LocalNotification.Core.dll`로 AdMob 변경과 무관해 보이는 로컬 툴체인 이슈로 추정. AOT 제외(`-p:RunAOTCompilation=false -p:AndroidEnableProfiledAot=false`) Release 빌드는 서명 APK까지 정상 산출됨. CI 러너의 `dotnet publish -c Release`(release.yml android 잡)에서 AdMob 포함 빌드가 통과하는지 별도 확인 필요. + +--- + +## 74차 (2026-09-13 완료) — PACA 218대 전역 퀵 액션 & 글로벌 핫키 · 윈도우 트레이 스포트라이트 시스템 + +> 사용자 요청: "앱의 퀵 액션에 대해서 좀 만들어보자 윈도우 서비스로도 연결 가능해서 예를들자면 shift + ctrl + alt + p 이런거 누르면 어디서든지 파카 앱이 켜져있든 안켜져있든 파카로 해당 주소로 가거나 검색이 되거나 아니면, 이것저것 잡다구래한 기능들을 제공해서 우리앱의 사용성을 높이고 사용자들의 의존도를 높여서 우리 앱의 경쟁력을 높이자 액션은 적어도 200 개 이상을 생각하고 우리 브라우저의 기능들을 일단 다 가능하게 한다고 생각도 하고, 그리고 유틸리티성도 생각한다. 이것들 다른 앱들은 어떻게 하는지 인터넷 검색을 제대로 하고 도출해서 백로그로 해서 할일로 하고 나서 모두 개발하고 모두 검증할때까지 멈추지말고 다 하면 보고하시오." + +- [x] **218대 퀵 액션 카탈로그 등록**: + - 브라우징 30개, 미디어/다운로드 25개, 스마트 뱅 검색 25개, 개발자 25개, 계산/변환 25개, 텍스트/클립보드 25개, 윈도우 OS 28개, PACA 에코시스템 35개 등 총 218개 액션 전수 등록 (`QuickActionCatalog.cs`, `QuickActionModels.cs`). +- [x] **인라인 실시간 수식 평가 & 단위 변환기**: + - `12 + 34`, `sqrt(144)`, `km to mile`, `c to f`, `mb to gb`, `b64`, `hex`, `time now` 등 주소창/검색창 인라인 실시간 즉시 계산 및 클립보드 복사 (`QuickActionInlineEvaluator.cs`). +- [x] **가중치 랭킹 검색 엔진**: + - 타이틀 정확 일치, 접두사 일치, ID 매칭, 키워드 매칭 가중치를 결합한 지능형 퀵 액션 검색기 (`QuickActionSearchEngine.cs`). +- [x] **글로벌 핫키 서비스**: + - Win32 `RegisterHotKey`/`UnregisterHotKey` P/Invoke 기반 전역 단축키(`Shift + Ctrl + Alt + P`) 후킹 및 `MOD_NOREPEAT` 충돌 방어 (`GlobalHotkeyService.cs`). +- [x] **윈도우 트레이 데몬**: + - Win32 `Shell_NotifyIcon` P/Invoke 기반 트레이 상주, 창 닫기 시 트레이 최소화(`CloseToTray`), 더블클릭 복원, 우클릭 퀵 액션 런처 호출 (`WindowsTrayDaemon.cs`). +- [x] **모던 스포트라이트 UI 창**: + - Raycast/Spotlight 스타일 760x540px 플로팅 카드, 실시간 인라인 평가 카드, 검색 리스트, 키보드 탐색(Esc, Enter, Up, Down), UIA FastPass 접근성 준수 (`QuickActionLauncherWindow.xaml`, `QuickActionLauncherWindow.xaml.cs`). +- [x] **TDD 검증**: + - 5대 TDD 게이트 전수 통과 (`QuickActionRegistryAndCatalogGateTests`, `QuickActionInlineEvaluatorGateTests`, `QuickActionSpotlightUiGateTests`, `QuickActionGlobalHotkeyAndTrayGateTests`, `QuickActionLauncherIntegrationGateTests`). + +--- + +## 75차 (2026-09-13 완료) — 퀵 액션 고급 키보드 네비게이션·인라인 오토컴플리트·디자인 SSOT 정본화·다국어화 + +> 사용자 요청: "진입한 이후에 조금 더 쉽게 단축키나 템프로 이동한다거나 화살표를 한다거나 뭐 이것저것 이제 사용자가 메뉴를 네비게이트하고 오토 컴플리트되고 그거를 좀 더 쉽게 할 수 있는 방법들 좀 찾아야 될 것 같아요 지금 다른 윈도우들과 좀 충돌하는 인풋도 있는 것 같고 인터랙션이 좀 매끄럽지 못한 부분들도 있고 디자인이 우리의 디자인 SSOT랑 그러니까 정본과 별로 좀 다른 것 같다라는 느낌이 많이 들고 특히나 이제 우리 테마 같은 것들도 있는데 그 테마에 아주 영향을 안 받는 것 같은 느낌인데 이런 것들도 중요하고 그리고 뭐 우리 다국어화 해놨으니까 이 다국어화에 대한 메뉴 아이템 이름들도 신경 써야 될 것 같아요." + +- [x] **고급 키보드 네비게이션 & 고스트 오토컴플리트**: + - `Tab` / `Right` 화살표: 고스트 텍스트 자동완성 수락 및 커서 자동 이동. + - `Up` / `Down` 화살표: 이전/다음 액션 선택 및 자동 스크롤 연동. + - `PageUp` / `PageDown`: 7개 단위 빠른 리스트 점프. + - `Home` / `End`: 목록 처음 및 끝으로 즉각 이동. + - `Ctrl+1` ~ `Ctrl+9`: 상위 1~9번 액션 즉시 실행 및 모던 퀵 넘버 배지(`[Ctrl+N]`) 노출. + - `Ctrl+Enter`: 액션 실행과 동시에 결과 텍스트를 클립보드로 복사. + - `Esc`: 1차로 입력창 텍스트 소거 ➔ 비어있으면 2차로 런처 닫기 (2단계 안전 취소). +- [x] **카테고리 칩 필터 바 & 프리픽스 트리거**: + - All / Browser / Media / Dev / System / Utilities 칩 필터 바 완비. + - `br:`, `media:`, `dev:`, `sys:`, `calc:`, `ai:` 입력 시 카테고리 칩 자동 선택 및 접두사 기반 스마트 필터링. +- [x] **디자인 시스템 SSOT 정본 교정 & 테마 완벽 동기화**: + - `CardHoverBg` 오타 토큰을 정본 `{DynamicResource CardBgHover}`로 전면 교정. + - Pretendard(`UiFont`) 전면 상속. + - 선택 상태 `{DynamicResource SelectionBrush}` 및 좌측 3px 액센트 인디케이터 바. + - Dark / Light / HighContrast(WHCM WCAG AAA 7.0:1) 전 테마 완벽 동기화. + - 투명 창 외곽 `Grid Margin="20"` 적용으로 외곽 드롭 섀도우 박스 클리핑 결함 원천 해결. +- [x] **글로벌 다국어화 (ko-KR, en-US, ja-JP)**: + - 3개 국어(한국어/영어/일본어) 액션 제목, 키워드, 카테고리명 완비. + - 다국어 교차 가중치 랭킹 검색 엔진 (`QuickActionSearchEngine.cs`). + - 앱 설정 언어(`AppConfig.Language`)와 런처 UI 텍스트(`SetCulture`) 실시간 동기화. +- [x] **윈도우 포커스 스틸링 & 인풋 충돌 방어**: + - Win32 `SetForegroundWindow` 호출 및 전역 핫키 호출 시 즉시 런처 창으로 윈도우 포커스 강제 인계. + - 외부 윈도우 간섭 배제, IME 한글/영문 조합 버퍼 안전 처리. + - 내부 시스템 다이얼로그나 파일 탐색기 호출 시 비정상 `Deactivated` 숨김 방지. +- [x] **TDD 및 종합 검증**: + - `QuickActionAdvancedUxAndLocalizationGateTests` 6건 전수 통과. + - 퀵 액션 테스트 31/31건 100% 통과. + - 솔루션 전체 통합 테스트: **2,575 / 2,575 통과 (100% GREEN, 0 실패, 0 스킵)**. + - `dotnet build src/Paca.App`: 0 오류, 0 경고. + - WMI 분리 런처 기반 GUI 실창 렌더링 검증: `MainWindowHandle = 1117598` 확인 완료. + +--- + +## 76차 (2026-09-13 완료) — 퀵 액션 차세대 기능(퍼지 검색·사용빈도 트래커·인자 라우터·디테일 프리뷰·CubicEase 모션) + +> 사용자 요청: "좀 더 검증 좀더 새로운 기능 좀더 매끄러운 애니메이션 좀더 자연스러운 ux로 밀어 붙여보자." + +- [x] **퍼지 & 서브시퀀스 매칭 엔진 (`QuickActionFuzzyMatcher.cs`)**: + - `sct` ➔ `sys.screenshot_full`, `dwn` ➔ `media.download_manager`, `clp` ➔ `text.clipboard_view` 등 약어/초성 서브시퀀스 매칭. + - 1~2자 오타 허용 Levenshtein 거리 계산 및 적응형 점수 부여. +- [x] **사용 빈도 및 최근 실행 트래커 (`QuickActionUsageTracker.cs`)**: + - 액션 실행 시 시각(`LastUsedAt`) 및 실행 카운트(`ExecutionCount`) 자동 기록. + - 빈 검색어 입력 시 최근 실행한 액션을 상단에 스마트 노출. + - 검색 시 사용 빈도 및 최신성에 비례한 점수 부스트(+50~+250점) 부여. + - `%AppData%/Paca/quickaction_usage.json` 자동 JSON 영속화. +- [x] **인자/서브커맨드 인라인 라우터 (`QuickActionParameterRouter.cs`)**: + - `open ` / `br:open `: 지정 URL 브라우저 즉시 열기 + - `b64 `: Base64 인코딩 즉시 클립보드 복사 + - `b64d `: Base64 디코딩 즉시 클립보드 복사 + - `hash `: SHA-256 해시값 즉시 계산 및 복사 + - `note `: PACA 퀵 메모에 즉시 기록 +- [x] **우측 디테일 프리뷰 패널 (Action Inspector Pane)**: + - 런처 폭을 `860px`로 확장하고 2단 분할 레이아웃(좌: 리스트, 우: 디테일) 완비. + - 선택된 액션의 대형 아이콘, 다국어 제목, ID, 카테고리 뱃지, 설명 본문, 단축키 힌트, 파라미터 팁 실시간 미려한 렌더링. +- [x] **CubicEase 팝업/페이드 스토리보드 애니메이션**: + - 등장: `ScaleTransform`(0.96 ➔ 1.0) + `Opacity`(0 ➔ 1) + `TranslateY`(-8 ➔ 0) 150ms `CubicEase` 감속 곡선. + - 퇴장: `Opacity`(1 ➔ 0) 및 `Scale`(1.0 ➔ 0.98) 100ms 페이드아웃 후 안전 `Hide()`. + - 전정기관 보호 움직임 감소(SC 2.3.3) 상한(<= 200ms) 엄수. +- [x] **자연스러운 UX & 인터랙션 가드**: + - 상단 헤더 영역 마우스 드래그 이동(`DragMove()`) 지원. + - 마우스 실이동 감지(`_lastMousePosition`) 기반 호버 선택과 키보드 조작 간 충돌 방지. + - 실행/복사 완료 시 "✓ 실행되었습니다" / "✓ 복사되었습니다" 1.6초 상태바 마이크로 피드백 후 자동 복원. +- [x] **TDD 및 종합 검증**: + - `QuickActionNextGenUxAndAnimationGateTests` 6건 전수 통과. + - 퀵 액션 테스트 37/37건 100% 통과. + - 솔루션 전체 통합 테스트: **2,581 / 2,581 통과 (100% GREEN, 0 실패, 0 스킵)**. + - `dotnet build src/Paca.App`: 0 오류, 0 경고. + - WMI 분리 런처 기반 GUI 실창 렌더링 검증: `MainWindowHandle = 2429014` 확인 완료. + +--- + +## 🚀 다음 작업자(AI/Human)를 위한 핸드오프 (Handoff Guide) + +### 1. 현 시스템 상태 요약 +- **저장소 구조**: Pitchfork Layout 표준 (`src/` 8개 프로젝트 + `tests/` 1개 프로젝트 + `build/` + `docs/` + `site/`) +- **테스트 통과율**: `dotnet test tests/Paca.Tests` 기준 **2,581 / 2,581건 통과 (실패 0, 스킵 0, 기간 약 58초)** +- **빌드 상태**: `dotnet build Paca.slnx` 기준 **오류 0개, 경고 0개 (Clean Build)** +- **디자인 감사**: 25대 시각·인터랙션·접근성 게이트 및 퀵 액션 디자인 정본 SSOT 100% 기계적 통과 +- **실행 상태**: WMI 분리 런처 기반 데스크톱 실창 렌더링 검증 완료 (`MainWindowHandle != 0`) + +### 2. 다음 우선순위 추천 백로그 (Next Up Recommendations) +1. **모바일 ↔ PC 간 로컬 QR 스캔 P2P 세션 페어링 UI 고도화**: + - `SyncSettingsPage.cs` 카메라 바코드 스캐너(ZXing.Net.MAUI) 결합 (현재 mDNS 자동 탐색 및 IP/토큰 수동 페어링만 지원). +2. **WebAuthn / Passkey (FIDO2) 로컬 하드웨어 챌린지 시뮬레이터 완성**: + - `ExtensionManager.cs`의 `BrowserFido2UserInterfaceServiceMessage` 응답에 가상 WebAuthn 자격증명 Assertion 결합 (현재 빈 객체 `{}` 모의 응답 상태). +3. **WebExtensions MV3 DeclarativeNetRequest 규칙 컴파일러 고도화**: + - 정규식 및 URL 필터링 규칙의 Trie 기반 고속 매칭 엔진 성능 벤치마킹 및 SIMD 가속화. +4. **iOS TestFlight 외부 배포 (외부 계정 대기)**: + - Apple Developer Program($99/년) 유료 등록 필요 (코드/시뮬레이터 빌드·실행·페어링은 완료). + + + + + + + diff --git a/docs/BROWSER_FEATURES_PLAN.md b/docs/BROWSER_FEATURES_PLAN.md index 7c8c9ce..76c5355 100644 --- a/docs/BROWSER_FEATURES_PLAN.md +++ b/docs/BROWSER_FEATURES_PLAN.md @@ -1,8 +1,8 @@ -# Video Downloader — 브라우저 기능 강화 계획서 (v2) +# Video Downloader — 브라우저 기능 강화 계획서 (v2) > **목표**: 이 앱에 내장된 WebView2 브라우저에 일반적인 데스크톱 브라우저의 **핵심 사용자 기능**을 심어, 단순 "영상 재생 → 감지" 용도를 넘어 **일상적으로 쓸 수 있는 브라우저**로 만든다. > -> **작성일**: 2026-08-15 (v2 — 2차 심층 조사 반영) · **대상**: `VideoDownloader.App` (WPF + WebView2 1.0.4078.44) +> **작성일**: 2026-08-15 (v2 — 2차 심층 조사 반영) · **대상**: `Paca.App` (WPF + WebView2 1.0.4078.44) > > **조사 방법론**: > - 1차(2026-08-13): Chrome/Firefox/Zen 3개 브라우저 단일 조사 → v1 초안 @@ -38,7 +38,7 @@ | 줌 | ✅ | 세션 한시적(사이트별 영속 아님) | | 팝업 → 현재 WebView 라우팅 | ✅ | `NewWindowRequested` | | 페이지 다운로드 → 저장 폴더 | ✅ | `DownloadStarting` | -| 영구 프로필 / 데이터 삭제 | ✅ | `%AppData%/VideoDownloader/webview` | +| 영구 프로필 / 데이터 삭제 | ✅ | `%AppData%/Paca/webview` | | 다크/라이트 테마, 보더리스 | ✅ | DWM 연동 | | 우측 다운로드 패널(접기/폭) | ✅ | | | DevTools, 미디어 자동 감지 | ✅ | HLS/DASH/직링크/소셜(yt-dlp) | diff --git a/docs/DEPLOYMENT_PLAN.md b/docs/DEPLOYMENT_PLAN.md index 830a9d3..b4a7ef1 100644 --- a/docs/DEPLOYMENT_PLAN.md +++ b/docs/DEPLOYMENT_PLAN.md @@ -1,4 +1,4 @@ -# Video Downloader — 멀티플랫폼 배포 체계 계획서 (v1) +# Video Downloader — 멀티플랫폼 배포 체계 계획서 (v1) > **범위**: Windows · macOS · Linux 데스크톱 + Android · iOS 모바일의 **빌드→서명→패키징→배포→업데이트** 전 체계. > GitHub Releases 를 단일 배포 소스로, GitHub Actions 로 전 아티팩트 자동 빌드. @@ -40,11 +40,11 @@ GitHub Actions 대신(또는 보완으로) **사용자 소유 빌드머신 2대* | 제품 | 플랫폼 | 아티팩트 | 채널 | 서명 | |---|---|---|---|---| -| **App (WPF+WebView2)** — 주력 | Windows x64 | `VideoDownloader-Setup-x64.exe` (Inno, 기존) | GitHub Releases | Authenticode (선택, 후순위) | -| | Windows arm64 | `VideoDownloader-Setup-arm64.exe` (기존) | 〃 | 〃 | -| **App (Avalonia 셸)** — 크로스플랫폼 이관 | Linux x64/arm64 | `videodownloader-linux-x64.tar.gz` (기본) + `.AppImage` + `.deb` | GitHub Releases | (GPG 서명 선택) | -| | macOS x64/arm64 | `VideoDownloader-.dmg` (+ `.app` in DMG) | GitHub Releases | Developer ID + 공증 필수 | -| **Mobile (MAUI)** | Android | `VideoDownloader--arm64.apk` | GitHub Releases + Obtainium | Keystore (CI 시크릿) | +| **App (WPF+WebView2)** — 주력 | Windows x64 | `Paca-Setup-x64.exe` (Inno, 기존) | GitHub Releases | Authenticode (선택, 후순위) | +| | Windows arm64 | `Paca-Setup-arm64.exe` (기존) | 〃 | 〃 | +| **App (Avalonia 셸)** — 크로스플랫폼 이관 | Linux x64/arm64 | `Paca-linux-x64.tar.gz` (기본) + `.AppImage` + `.deb` | GitHub Releases | (GPG 서명 선택) | +| | macOS x64/arm64 | `Paca-.dmg` (+ `.app` in DMG) | GitHub Releases | Developer ID + 공증 필수 | +| **Mobile (MAUI)** | Android | `Paca--arm64.apk` | GitHub Releases + Obtainium | Keystore (CI 시크릿) | | | Android (Play, 선택) | `.aab` | Google Play (추출코드 없는 빌드) | Play App Signing | | | iOS | `.ipa` | TestFlight → App Store | Apple 배포 인증서 | | **Server / 웹 컴패니언** | 데스크톱 앱에 내장 | 별도 배포 없음 (앱이 Kestrel 서빙) | — | 앱 서명에 포함 | @@ -156,7 +156,7 @@ jobs: ## 5-bis. CI/CD 현행 채널 — Forgejo Actions 자체 러너 (2026-08-17 가동) -저장소가 자체 Forgejo(`https://git.chanpaca.net/Video-Downloader/client`)로 이관되고 org 러너 3대가 +저장소가 자체 Forgejo(`https://git.chanpaca.net/Paca/client`)로 이관되고 org 러너 3대가 등록되어, §5(GitHub) 대신 **자체 러너로 전 아티팩트를 빌드·배포**한다. §5 는 저장소 GitHub 공개 시 백업 채널로 유지(`.github/workflows/release.yml` 존치). @@ -175,19 +175,19 @@ jobs: - **리허설**: workflow_dispatch → `ci-rehearsal` draft prerelease 로 태그 없이 전 파이프라인 검증. - **시크릿**: `RELEASE_TOKEN`(Forgejo PAT, `write:repository`) — 릴리스 생성·자산 업로드. 체크아웃은 잡 자동 토큰(`github.token`). `ANDROID_KEYSTORE/ALIAS/PASS` 등록 전까지 APK 는 디버그 서명. -- **업로드 대상**: 공개 배포 저장소 **`Video-Downloader/releases`**(워크플로 env `RELEASE_REPO`). +- **업로드 대상**: 공개 배포 저장소 **`Paca/releases`**(워크플로 env `RELEASE_REPO`). 소스 저장소(client)는 비공개라 자산 익명 다운로드가 불가해 분리했다. draft 는 익명에게 보이지 않으므로 "빌드 → draft → QA → 수동 Publish" 흐름은 그대로다. Publish 하면 §5-ter 사이트가 노출한다. - **머신 전제**: win = SDK 8/10 + `maui-android` 워크로드 + JDK 17 + Inno Setup 6 · linux/mac = `~/.dotnet` SDK 8.0.424 + 10.0.400 (§0.5). - **갭**: §6 자동 업데이트 v1(`UpdateChecker`)은 GitHub Releases API 를 폴링하므로 GitHub 공개 전까지 미동작 — Forgejo Releases API(`/repos/{owner}/{repo}/releases/latest`, 동일 형태) 대응은 후속 항목. - 대상은 공개 저장소 `Video-Downloader/releases` 가 되어야 한다. + 대상은 공개 저장소 `Paca/releases` 가 되어야 한다. -## 5-ter. 배포 사이트 — MEDIABROWSER (Cloudflare Pages, 2026-08-18 가동) +## 5-ter. 배포 사이트 — Paca (Cloudflare Pages, 2026-08-18 가동) -제품 배포명은 **MEDIABROWSER** 로 하고, 프로모션/다운로드/사용 안내 3페이지 정적 사이트를 -Cloudflare Pages 에 올렸다. **https://mediabrowser-7r4.pages.dev** (mediabrowser 서브도메인 선점으로 +제품 배포명은 **Paca** 로 하고, 프로모션/다운로드/사용 안내 3페이지 정적 사이트를 +Cloudflare Pages 에 올렸다. **https://Paca-7r4.pages.dev** (Paca 서브도메인 선점으로 접미 부여 — 커스텀 도메인 연결은 후속). - **소스**: `site/` — `index.html`(프로모션: 라이트 글래스모피즘 + CSS scroll-driven 패럴랙스, @@ -197,16 +197,16 @@ Cloudflare Pages 에 올렸다. **https://mediabrowser-7r4.pages.dev** (mediabro `site/fetch-releases.mjs` 가 공개 저장소 릴리스를 `site/releases.json`(git 무시)으로 굽는다. published 릴리스만 포함(draft 제외), 최신판 강조 + 이전 버전 접힘 + OS 자동 감지 권장 표시. - **배포**: `./build/deploy-site.ps1` — .env 의 `CLOUDFLARE_API_TOKEN/ACCOUNT_ID` 로 - `wrangler pages deploy site --project-name mediabrowser`. **자동화(2026-08-18)**: 공개 releases + `wrangler pages deploy site --project-name Paca`. **자동화(2026-08-18)**: 공개 releases 저장소의 `.forgejo/workflows/site-deploy.yml` 이 릴리스 Publish 이벤트에서 사이트를 자동 재배포한다 (시크릿: CLIENT_TOKEN=client 읽기 PAT, CLOUDFLARE_API_TOKEN/ACCOUNT_ID). -- **개명 완료(2026-08-18)**: 설치자 `MediaBrowser-Setup-.exe` · tar.gz `mediabrowser-` · - APK `MediaBrowser--arm64.apk` · 앱 타이틀/모바일 표시명 MediaBrowser · obtainium.json 공개 저장소 URL. - AppId(GUID)·실행 파일명(VideoDownloader.exe)·데이터 경로는 유지(업그레이드·사용자 데이터 호환). -- **커스텀 도메인(2026-08-18 완료)**: **https://mediabrowser.chanpaca.net** — Pages 프로젝트 도메인 등록 + - DNS CNAME(`mediabrowser` → `mediabrowser-7r4.pages.dev`, 프록시 ON, 대시보드에서 추가). og:url 도 정식 - 도메인 기준으로 갱신. 참고: API 토큰(CLOUDFLARE_API_TOKEN)에는 Zone DNS 편집 권한이 없다 — - DNS 자동화가 필요해지면 토큰에 `Zone → DNS → Edit` 권한을 추가할 것. +- **개명 완료(2026-08-18)**: 설치자 `Paca-Setup-.exe` · tar.gz `Paca-` · + APK `Paca--arm64.apk` · 앱 타이틀/모바일 표시명 Paca · obtainium.json 공개 저장소 URL. + AppId(GUID)·실행 파일명(Paca.exe)·데이터 경로는 유지(업그레이드·사용자 데이터 호환). +- **커스텀 도메인(2026-08-18 완료)**: **https://Paca.chanpaca.net** — Pages 프로젝트 도메인 등록 + + DNS CNAME(`Paca` → `Paca-7r4.pages.dev`, 프록시 ON). og:url 도 정식 + 도메인 기준으로 갱신. **API 토큰 통합(2026-08-18)**: `CLOUDFLARE_API_TOKEN`에 `Account → Cloudflare Pages → Edit`, + `Zone → DNS → Edit`(`chanpaca.net`), `Zone → Zone → Read` 권한을 통합하여 Pages 배포 및 DNS 조회가 API로 일원화됨. ## 6. 업데이트 체계 @@ -242,14 +242,14 @@ Cloudflare Pages 에 올렸다. **https://mediabrowser-7r4.pages.dev** (mediabro `.env.example`(빈 값 템플릿)뿐 — 공개해도 유출 없음. ```powershell -gh repo create /videodownloader --public --source . --push # 또는 --private 로 시작 +gh repo create /Paca --public --source . --push # 또는 --private 로 시작 git tag v1.0.0 && git push origin v1.0.0 # → release.yml 자동 실행(Draft) ``` 공개 후 마무리 3가지: 1. `build/obtainium.json` · README 의 `/` 치환 2. (선택) Android 서명: 시크릿 `ANDROID_KEYSTORE`(base64)/`ANDROID_KEY_ALIAS`/`ANDROID_KEY_PASS` 등록 -3. 설정창 "앱 업데이트"에 `owner/videodownloader` 입력 → D6 v1 폴링 활성 +3. 설정창 "앱 업데이트"에 `owner/Paca` 입력 → D6 v1 폴링 활성 ### D4 — macOS 서명·공증 (Apple Developer Program 가입 후) diff --git a/docs/EXTREME_EXPANSION_PLAN.md b/docs/EXTREME_EXPANSION_PLAN.md new file mode 100644 index 0000000..fe04025 --- /dev/null +++ b/docs/EXTREME_EXPANSION_PLAN.md @@ -0,0 +1,161 @@ +# PACA 극초대형 차세대 확장 계획 (Extreme Expansion Plan) + +> **문서 상태**: 공식 승인 마스터 아키텍처 사양서 (v3.0) +> **기준선**: 996 Tests 100% GREEN, 36개 도메인 파이프라인 통폐합 완료, 0 빌드 경고 +> **비전**: 단순 비디오 다운로더를 넘어선 **"초고성능 크로스플랫폼 미디어 브라우저 & 분산 인텔리전스 에코시스템"** 구축 + +--- + +## 1. 7대 차세대 핵심 확장 아키텍처 개요 + +```mermaid +graph TD + PACA["Paca Core Multi-Platform Ecosystem"] + + PACA --> DOMAIN1["1. Hyper-Extension Engine (MV3 + V8 Isolate)"] + PACA --> DOMAIN2["2. P2P Swarm & Multi-CDN Mesh Downloader"] + PACA --> DOMAIN3["3. On-Device AI Neural Media Intelligence"] + PACA --> DOMAIN4["4. Omni-Platform Matrix (Desktop / Mobile / NAS)"] + PACA --> DOMAIN5["5. Zero-Knowledge CRDT Encrypted Sync"] + PACA --> DOMAIN6["6. Ultra-Low Latency Casting & Transcoding"] + PACA --> DOMAIN7["7. 10,000-Gate Autonomous Chaos & Fuzzing"] + + style PACA fill:#6366f1,stroke:#4338ca,stroke-width:2px,color:#fff + style DOMAIN1 fill:#1e1b4b,stroke:#6366f1,stroke-width:1px,color:#e0e7ff + style DOMAIN2 fill:#1e1b4b,stroke:#6366f1,stroke-width:1px,color:#e0e7ff + style DOMAIN3 fill:#1e1b4b,stroke:#6366f1,stroke-width:1px,color:#e0e7ff + style DOMAIN4 fill:#1e1b4b,stroke:#6366f1,stroke-width:1px,color:#e0e7ff + style DOMAIN5 fill:#1e1b4b,stroke:#6366f1,stroke-width:1px,color:#e0e7ff + style DOMAIN6 fill:#1e1b4b,stroke:#6366f1,stroke-width:1px,color:#e0e7ff + style DOMAIN7 fill:#1e1b4b,stroke:#6366f1,stroke-width:1px,color:#e0e7ff +``` + +--- + +## 2. 도메인별 극한 확장 세부 사양 (Phase 60 ~ Phase 66) + +### 🚀 Phase 60: Hyper-Extension Subsystem (MV3 + V8 Isolate + DNR SIMD 가속) +*목표: Chrome Web Store 및 Firefox 확장 프로그램 99.9% 무결점 호환 & 백그라운드 엔진 고도화* + +1. **Manifest V3 Background Service Worker 완전 네이티브 호스팅** + - V8 Isolate / ClearScript 기반 경량 백그라운드 워커 런타임 내장. + - `chrome.alarms`, `chrome.storage.session`, `chrome.offscreen`, `chrome.scripting.registerContentScripts` 100% 네이티브 지원. +2. **SIMD & Aho-Corasick 가속 DeclarativeNetRequest 엔진** + - 300,000개 이상의 uBlock/AdGuard 규칙을 0.1ms 내에 평가하는 초고속 Regex/URL 매처. + - Dynamic Rules, Session Rules, Regex Filter 컴파일러 탑재. +3. **유저스크립트(UserScripts) & Violentmonkey/Stylus 네이티브 엔진** + - `@match`, `@run-at document-start`, `@grant GM_xmlhttpRequest`, `@grant GM_setValue` 완벽 지원. + - 레이아웃 시프트(CLS) 없는 즉각적 DOM 인젝션 보장. +4. **확장 프로그램 프로세스 격리 & 세부 권한 감사 샌드박스** + - 메모리 상한(50MB) 초과 시 자동 워커 서스펜드 & 요청 시 즉시 복구. + - 네트워크 요청 및 스토리지 접근 실시간 보안 모니터링 HUD. + +--- + +### 🌐 Phase 61: Ultra-Distributed P2P Swarm & Multi-CDN Mesh Engine +*목표: 단일 서버 병목 없는 무제한 대역폭 P2P 분산 다운로드 & 미러 가속* + +1. **WebTorrent / BitTorrent / Libp2p 기반 스웜 다운로드 파이프라인** + - 대용량 VOD 및 라이브 스트림 청크를 로컬 네트워크(mDNS) 및 DHT 피어 간 P2P 교환. + - Merkle Tree 기반 세그먼트 SHA-256 비트 무결성 실시간 검증. +2. **다중 CDN 미러 지능형 레이싱 (Multi-Origin Segment Racing)** + - 동일 스트림의 여러 CDN 엔드포인트에 동시 핑/청크 레이싱을 수행하여 가장 빠른 서버로부터 다운로드하고 지연 연결 즉시 취소. + - HTTP/3 (QUIC) 및 다중 TCP 연결 멀티플렉싱 지원. +3. **로컬 오프라인 메쉬 릴레이 (Mesh Network Sharing)** + - 인터넷 연결이 제한된 환경에서 데스크톱 ↔ 모바일 간 블루투스/WiFi Direct P2P 비디오 공유. + +--- + +### 🧠 Phase 62: On-Device AI Neural Media Intelligence +*목표: 클라우드 전송 0, 100% 로컬 하드웨어 가속 AI 미디어 분석 & 초해상도 업스케일링* + +1. **온디바이스 실시간 STT 자막 생성 및 번역 (Whisper.cpp / ONNX DirectML)** + - GPU (DirectML / OpenVINO / CoreML) 가속으로 실시간 60fps 음성 인식 및 한국어/영어/일본어 다국어 자막 생성. + - 영상 내 음성 타이밍에 맞춘 정밀 Word-level 타임스탬프 SRT/VTT 출력. +2. **AI 스마트 씬 감지 & 쇼츠/하이라이트 원클릭 클리퍼 (Local SLM + VAD)** + - 오디오 에너지 피크, VAD(Voice Activity Detection), 화면 전환(Scene Change Detection) 결합. + - 중요한 60초 구간을 자동 추출하여 무손실 수직 9:16 쇼츠(TikTok/Reels/Shorts) 영상 생성. +3. **Vulkan / D3D12 신경망 실시간 초해상도 업스케일러 (Anime4K / Real-ESRGAN)** + - `PlayerWindow` 및 브라우저 비디오 요소에 셰이더 기반 실시간 720p/1080p → 4K 업스케일링 적용. + +--- + +### 📱 Phase 63: Universal Omni-Platform Ecosystem +*목표: Windows, macOS, Linux, Android, iOS, NAS/Docker를 아우르는 단일 생태계* + +1. **Paca Mobile Production Suite (MAUI Android / iOS)** + - Android Foreground Service + iOS BackgroundTasks 기반 백그라운드 고속 다운로드 유지. + - 생체인증 (Face ID / Touch ID / Android BiometricPrompt) 보안 잠금. + - 동일 WiFi 진입 시 데스크톱 큐와 원터치 자동 양방향 동기화. +2. **Paca Avalonia Desktop (Linux & macOS Native)** + - Wayland / X11 네이티브 하드웨어 가속, Flatpak, Snap, AppImage 원클릭 패키징. + - macOS Apple Silicon (M1/M2/M3/M4) 및 Intel Universal 바이너리, `.dmg` 공증(Notarization) 완료. +3. **Paca Daemon & Headless CLI (NAS / Home Server / Docker)** + - Synology, QNAP, Unraid, TrueNAS, Raspberry Pi 지원 경량 데몬 (`pacad`). + - Web GUI 대시보드 (`http://nas:8080`) 및 gRPC / RESTful 원격 제어 인터페이스 제공. + +--- + +### 🔒 Phase 64: Zero-Knowledge CRDT Multi-Device Encrypted Vault +*목표: 완전 영지식 종단간 암호화(E2EE) 분산 동기화* + +1. **CRDT (Conflict-Free Replicated Data Types) 무충돌 실시간 동기화** + - 탭 세션, 북마크 트리, 워크스페이스, 방문 기록, 읽기 목록의 오프라인 편집 및 양방향 무충돌 병합. +2. **AES-256-GCM / ChaCha20-Poly1305 클라이언트 암호화** + - WebDAV, Nextcloud, Google Drive, Dropbox, AWS S3 등 사용자가 원하는 클라우드로 암호화 블록 동기화. + - 서버나 클라우드 제공자가 데이터를 절대 읽을 수 없는 제로 지식 증명 아키텍처. +3. **FIDO2 / WebAuthn 하드웨어 보안키 (YubiKey) 연동** + - 생체인증 외 물리 하드웨어 보안키 기반 금고 2차 인증. + +--- + +### 🎬 Phase 65: Ultra-Low Latency Media Streaming & Studio Pipeline +*목표: 브라우징 중 실시간 룸 캐스팅, 하드웨어 트랜스코딩 & 파형 시각화 스튜디오* + +1. **WebRTC 저지연 탭/미디어 무선 캐스팅 (Cast Engine)** + - 스마트 TV, 크롬캐스트, AirPlay 2, DLNA, Miracast 장치로 100ms 미만 초저지연 미디어/화면 전송. +2. **초고속 하드웨어 트랜스코더 (NVENC / Intel QSV / AMD AMF / VideoToolbox)** + - 원본 코덱을 실시간으로 AV1, HEVC, VP9 등으로 트랜스코딩하여 기기별 최적 재생 지원. + - 동적 HLS/DASH 적응형 비트레이트 래더(Ladder) 즉석 생성. +3. **대화형 파형 렌더러 & 10-Band 파라메트릭 EQ 스튜디오** + - 오디오 스펙트럼 실시간 FFT 렌더링, 노이즈 억제, 보컬 부스트, 챕터별 무손실 컷편집 GUI. + +--- + +### 🛡️ Phase 66: 10,000-Gate Autonomous Continuous Chaos & Resilience Matrix +*목표: 오류 0건, 플레이키 0건, 영구적 무결성을 증명하는 기계적 검증 시스템* + +1. **연속 퍼징(Fuzzing) & 뮤테이션 하네스** + - 손상된 m3u8/mpd 스트림, 잘못된 CRX 헤더, 네트워크 패킷 드랍, 비트플립 결함 10,000회 연속 주입. +2. **크래시 리플레이 텔레메트리 샌드박스** + - 예외 발생 시 인메모리 재현 스크립트 자동 생성 및 독립 테스트 케이스로 격리 검증. +3. **DoD 절대 기준 유지** + - 단위/E2E 테스트 수 1,500건+ 확장, 100% GREEN, 빌드 경고 0건 유지. + +--- + +## 3. 마일스톤 및 로드맵 일정표 + +| 마일스톤 | 핵심 테마 | 산출물 및 주요 기능 | 검증 게이트 (DoD) | +|---|---|---|---| +| **M60** | Hyper-Extension Subsystem | MV3 V8 Isolate 워커, SIMD DNR 엔진, Violentmonkey 호환 | 150+ 확장 E2E 게이트 통과 | +| **M61** | P2P Swarm & Multi-CDN | WebTorrent 분산 다운로드, CDN 레이싱, 메쉬 릴레이 | 100회 결함주입 무결성 통과 | +| **M62** | On-Device AI Media Lab | Whisper.cpp 실시간 자막, AI 쇼츠 클리퍼, Vulkan 업스케일러 | DirectML/CPU 폴백 검증 | +| **M63** | Omni-Platform Suite | MAUI 모바일 프로덕션 출시, Linux Flatpak, NAS 데몬 | 전 플랫폼 빌드 & E2E 통과 | +| **M64** | Zero-Knowledge CRDT Vault | CRDT 무충돌 동기화, E2EE WebDAV/S3, FIDO2 YubiKey | 동시 다중 쓰기 무충돌 검증 | +| **M65** | Media Casting & Studio | WebRTC TV 캐스팅, NVENC/QSV 트랜스코더, 파형 EQ | 100ms 미만 지연율 통과 | +| **M66** | 10,000-Gate Chaos Matrix | 연속 퍼징 하네스, 1,500+ 테스트 스위트, 0 경고 보증 | 10,000회 카오스 100% 통과 | + +--- + +## 4. 안드레 카파시 4대 원칙 기반 실행 수칙 + +1. **Think Before Coding**: + - 도메인 설계 시 기존 36개 파이프라인과의 인터페이스 정합성을 선행 검증. + - 3개 이상 모듈 수정 시 반드시 아키텍처 스펙 및 설계도를 선행 갱신. +2. **Simplicity First**: + - 외부 무거운 의존성 지양, C# .NET 8/10 네이티브 고성능 메모리(`Span`, `MemoryPool`, `Channels`) 우선 활용. +3. **Surgical Changes**: + - 기존 검증된 핵심 다운로드/브라우저 엔진의 Blast Radius를 철저히 격리. +4. **Goal-Driven Closed Loop**: + - 모든 신규 기능은 RED 테스트 작성 → 구현 → GREEN 기계적 검증(Exit 0) 루프 준수. diff --git a/docs/HARNESS.md b/docs/HARNESS.md index a5925e3..5b2183b 100644 --- a/docs/HARNESS.md +++ b/docs/HARNESS.md @@ -1,151 +1,117 @@ -# 개발 하네스 — 폐쇄루프 운영 지침 +# 개발 하네스 — 폐쇄루프 운영 및 하네스 엔지니어링 지침 -> 이 저장소에서 AI 코딩 에이전트가 **자율적으로, 그러나 검증 없이는 완료를 선언할 수 없게** 일하도록 -> 짜 놓은 장치들의 설계와 운영법. 사람과 에이전트 모두 이 문서를 읽는 대상이다. +> 이 저장소에서 AI 코딩 에이전트(Antigravity, Claude Code, DeepSeek, Cursor 등)가 +> **자율 루프로 저가형 모델(Flash, DeepSeek, Haiku)까지 완벽히 통제하여 고성능 극한 개발을 수행하도록** +> 구성한 하네스 엔지니어링(Harness Engineering) 설계와 운영법이다. -## 왜 필요한가 +--- -에이전트의 가장 흔한 실패는 코드를 못 짜는 게 아니라 **"됐습니다"라고 말해버리는 것**이다. -테스트가 깨진 채로, 실행해 보지도 않고, 문서는 옛날 상태인 채로 턴이 끝난다. +## 1. 패러다임의 진화: Prompting → Context → Harness -해법은 프롬프트로 더 강하게 부탁하는 게 아니라, **에이전트가 건너뛸 수 없는 결정적 층**을 두는 것이다. -확률적인 판단(모델)과 결정적인 검사(훅)를 분리한다. +| 시대 | 패러다임 | 핵심 질문 | 한계 | +|---|---|---|---| +| **2022 ~ 2024** | **Prompt Engineering** | "어떻게 말해야(프롬프트) 잘 알아들을까?" | 단일 턴 한계, 복잡한 프로젝트에서 망각 및 환각 | +| **2024 ~ 2025** | **Context Engineering** (안드레 카파시) | "모델의 컨텍스트 창에 무엇을 넣고 뺄 것인가?" | 컨텍스트가 길어지면 집중도 감쇠, 실행 검증 부재 | +| **2025 ~ 2026** | **Harness Engineering** (`Agent = Model + Harness`) | "어떤 제약과 피드백 루프로 모델을 가둘 것인가?" | **해결: 비결정적 모델을 결정적 시스템으로 완성** | -## 5계층 구조 +안드레 카파시(Andrej Karpathy)와 업계 리더들이 정립한 핵심 공식은 다음과 같다: -| 계층 | 역할 | 이 저장소에서 | +$$\text{Agent} = \text{Model} + \text{Harness}$$ + +- **Model (커널/CPU)**: 비결정적(Stochastic) 추론 엔진. 아무리 좋은 프런티어 모델이라도 하네스가 없으면 "다 됐습니다"라고 거짓 보고(Vibe Coding)를 하거나 테스트를 무력화한다. +- **Harness (운영체제/제약계층)**: 도구 세트, 컨텍스트 스케줄러, 결정적 테스트 게이트, 린터, 상태 저장소. 모델의 출력을 기계적으로 검증하고 실패 시 에러를 피드백하여 자가수정(Self-Correction)을 강제한다. + +--- + +## 2. 안드레 카파시의 에이전틱 코딩 4대 원칙 + +카파시가 제시한 에이전트의 실패 방지 원칙: + +1. **Think Before Coding (생각 먼저, 코딩 나중)**: + 추측으로 코드를 작성하지 않는다. 요구사항이 모호하면 먼저 조사하거나 명확히 질문하고, 파일 3개 이상 변경 시 플랜을 수립한다. +2. **Simplicity First (최소 구현 원칙)**: + 미래를 위한 오버엔지니어링, 불필요한 추상화 계층을 금지한다. 실패한 테스트(RED)를 통과(GREEN)시키는 가장 단순한 코드를 작성한다. +3. **Surgical Changes (외과수술식 정밀 변경)**: + 요청과 무관한 주변 코드, 주석, 포맷을 임의로 건드리지 않는다. Blast Radius(폭발 반경)을 극도로 제한한다. +4. **Goal-Driven Closed Loop (목표 주도 폐쇄 루프)**: + 모호한 "수정"이 아니라, 기계적으로 검증 가능한 테스트(Exit Code 0)가 달성될 때까지 자율 루프를 돈다. + +--- + +## 3. 저가형 모델(Flash, DeepSeek, Haiku)로 극한 개발을 하는 하네스 기법 + +프런티어 모델(Opus/GPT-4o) 대신 **Gemini Flash, DeepSeek-V3/R1, Claude Haiku 등 1/10~1/50 비용의 저가형 모델**로 최고 효율을 내기 위한 4가지 하네스 기법: + +### ① Token Diet (컨텍스트 오염 차단) +- 저가형 모델은 컨텍스트가 20k~50k 토큰 이상 누적되면 지침 준수율(Instruction Following)이 급격히 저하된다. +- **규칙**: `MainWindow.xaml.cs`(86KB) 같은 대형 소스는 절대로 통째로 읽지 않는다. `grep_search`로 함수 라인을 파악하고 30~50줄 단위로 슬라이스 조회(`view_file`)한다. +- **전역 지침 압축**: `AGENTS.md`를 150줄 이내로 유지하고, 세부 규칙은 파일 열람 시 동적 주입(Path-Scoped Rules)한다. + +### ② Anti-Cheating Guard (치팅 원천 차단) +- 저가형 모델이 자율 루프에서 막히면 흔히 시도하는 3대 꼼수: + 1. 실패하는 테스트 코드를 삭제하거나 단정(Assert)을 완화 + 2. `[Fact(Skip = "...")]` 또는 `[Ignore]` 속성 추가 + 3. 실패하는 예외를 빈 `catch { }` 블록으로 삼킴 +- **방어**: 정적 메타 테스트(`MetaTestQualityAndPruningTests`) 및 Stop 훅으로 테스트 수 감소 및 Skip 속성을 검출하여 즉시 실패 처리. + +### ③ Error-Driven Hill Climbing (결정적 에러 피드백) +- 저가형 모델은 막연한 에러 설명보다 **정확한 컴파일러 진단 코드(`CS0246`, `CS8602`)와 파일:라인:컬럼, xUnit Expected/Actual 차이**를 주입받았을 때 1~2턴 만에 완벽히 교정한다. +- 하네스는 실패 시 빌드/테스트 출력의 핵심 30~50줄을 모델 컨텍스트에 즉시 주입한다. + +### ④ Subagent Hierarchy (계층형 서브에이전트) +- 넓은 범위의 코드 검색, 문서 리서치 등 컨텍스트를 많이 소비하는 작업은 초경량 서브에이전트(`invoke_subagent`, flash/flash_lite)에 위임한다. +- 메인 에이전트의 컨텍스트는 순수한 아키텍처/코드 수정 상태로 깨끗하게 유지된다. + +--- + +## 4. 5계층 하네스 아키텍처 + +| 계층 | 역할 | 이 저장소의 구현 | |---|---|---| -| **① 하네스** | 에이전트가 사는 환경 | Claude Code + `.claude/settings.json` | -| **② 루프 계약** | "완료"의 정의 | `AGENTS.md` §4 완료 기준 · `CLAUDE.md` | -| **③ 상태층** | 세션이 끊겨도 남는 상태 | `docs/BACKLOG.md` 체크박스 · `docs/IMPLEMENTATION_AUDIT.md` · SessionStart 브리핑 | -| **④ 체커** | 에이전트가 못 건너뛰는 검사 | **Stop 훅 → `dotnet test`** | -| **⑤ 사람 관문** | 되돌릴 수 없는 일 앞의 확인 | 커밋·푸시·배포는 사용자 승인 (`/release` 스킬) | +| **① 하네스 환경** | 에이전트 런타임 & 도구 | Antigravity(AGY) · Claude Code (`.claude/settings.json`) | +| **② 루프 계약 (SSOT)** | 도구 중립 작업 헌법 | `AGENTS.md` (AAIF 표준, <150줄) | +| **③ 상태층 (External State)** | 세션 리셋에도 유지되는 상태 | `docs/BACKLOG.md` · `docs/IMPLEMENTATION_AUDIT.md` · `.verify-stamp` | +| **④ 결정적 체커** | 에이전트가 건너뛸 수 없는 게이트 | **Stop 훅 / 검증 게이트 → `dotnet test Paca.Tests`** | +| **⑤ 사람 관문** | 되돌릴 수 없는 결정 | 커밋·푸시·릴리스 승인 (`/release` 스킬) | -핵심은 ④다. 나머지는 ④가 있어야 의미가 생긴다. +--- -## 구성 요소 +## 5. 멀티 MD 파일 관리 표준 ``` -AGENTS.md ← 도구 중립 작업 계약 (Codex/Cursor 등도 읽음) -CLAUDE.md ← @AGENTS.md 임포트 + Claude Code 전용 지침 +AGENTS.md ← 도구 중립 최상위 작업 계약 (AAIF 표준, 전역 상주, 150줄 이내) +CLAUDE.md ← @AGENTS.md 임포트 + 도구별 훅 바인딩 .claude/ - settings.json ← 훅 등록 + 권한 (커밋됨, 팀 공유) + settings.json ← 훅 등록 + 권한 설정 hooks/ - session-brief.sh ← SessionStart: 저장소 상태를 컨텍스트에 주입 (상태층) - verify-on-stop.sh ← Stop: 테스트 게이트 (체커) - rules/ ← 경로별 자동 로드 규칙 (해당 파일을 열 때만 컨텍스트에 들어옴) - desktop-wpf.md ← VideoDownloader.App/**, Browser/** - engine-core.md ← Core/**, Server/** - mobile-maui.md ← Mobile/**, Mobile.Core/** - tests.md ← Tests/** - skills/ ← 호출될 때만 로드되는 절차서 - tdd/SKILL.md ← /tdd RED→GREEN→증거 + session-brief.sh ← SessionStart: 브랜치/변경파일/미완료 백로그 자동 브리핑 + verify-on-stop.sh ← Stop: 턴 종료 시 소스 변경 감지 → dotnet test 강제 게이트 + rules/ ← [Path-Scoped] 해당 파일을 열 때만 로드되는 영역별 규칙 + desktop-wpf.md ← Paca.App/**, Paca.Browser/** + engine-core.md ← Paca.Core/**, Paca.Server/** + mobile-maui.md ← Paca.Mobile/**, Paca.Mobile.Core/** + tests.md ← Paca.Tests/** + skills/ ← [On-Demand] 호출 시에만 컨텍스트에 들어오는 절차서 + tdd/SKILL.md ← /tdd RED→GREEN→증거 사이클 verify/SKILL.md ← /verify 완료 기준 전수 점검 - release/SKILL.md ← /release 배포 - .verify-stamp ← 마지막 검증 성공 시점 (자동 생성, gitignore) + release/SKILL.md ← /release 배포 파이프라인 + .verify-stamp ← 마지막 검증 성공 시각 타임스탬프 (자동 관리) ``` -### 왜 이렇게 나눴나 +### 왜 이렇게 분리하는가? +1. **전역 MD(`AGENTS.md`)는 항상 컨텍스트를 차지한다.** 여기에 수천 줄의 세부 룰을 넣으면 모든 대화 턴마다 토큰 비용이 발생하고 모델의 주의력이 흐려진다. +2. **경로별 룰(`rules/`)은 필요할 때만 들어온다.** WPF 창을 고칠 때만 WPF 룰이 들어오고, 백엔드 코어 엔진을 만질 때는 로드되지 않는다. +3. **절차서(`skills/`)는 트리거될 때만 들어온다.** 평소 대화에서는 토큰을 0바이트 소모한다. +4. **강제는 프롬프트가 아니라 훅과 게이트로 한다.** 프롬프트의 "반드시 테스트하세요"는 모델이 무시할 수 있지만, 훅의 `exit 2`는 물리적으로 턴 종료를 차단한다. -- **CLAUDE.md 는 짧게.** 매 세션 컨텍스트를 먹고, 길수록 지켜지지 않는다. 200줄 이내가 권장선이다. -- **경로별 규칙은 `rules/` 로.** WPF 함정은 WPF 파일을 열 때만 필요하다. 항상 로드하면 낭비다. -- **절차는 `skills/` 로.** 배포 순서 같은 건 배포할 때만 필요하다. 안 쓰면 토큰을 안 쓴다. -- **강제는 훅으로.** CLAUDE.md 는 부탁이고 훅은 강제다. "반드시 X 해라"가 지켜지길 원하면 훅에 넣는다. - -## 훅 동작 - -### SessionStart — 상태 브리핑 - -세션이 시작되면 브랜치·마지막 커밋·변경 파일·검증 상태·미완료 백로그를 컨텍스트에 넣는다. -에이전트가 `git status` 를 따로 묻지 않고 현재 상황을 알고 시작한다. - -### Stop — 테스트 게이트 - -턴을 끝내려 할 때: - -1. `stop_hook_active` 가 `true` 면 즉시 통과 — **무한 루프 방지**. - (Claude Code 는 Stop 훅이 8회 연속 차단하면 강제로 넘긴다. 가드가 없으면 그 8회를 다 태운다.) -2. 소스(`.cs`/`.csproj`/`.xaml`/`.axaml`)의 최신 수정시각을 `.claude/.verify-stamp` 와 비교. - 같으면 즉시 통과 — 대화만 한 턴은 지연 0. -3. 바뀌었으면 `dotnet test VideoDownloader.Tests` 실행 (증분 약 13초). -4. 통과 → 스탬프 갱신 후 종료 허용. 실패 → **exit 2 로 종료 차단**, 실패 출력 60줄을 에이전트에게 전달. - -즉 **테스트를 깨둔 채로 턴을 끝낼 수 없다.** - -## 사용법 - -### 에이전트 (자율 동작) - -특별히 할 일이 없다. 세션을 열면 브리핑이 들어오고, 계약(`AGENTS.md`)이 로드되고, -파일을 열면 해당 영역 규칙이 붙고, 턴을 끝내면 테스트가 돈다. - -기억할 것 세 가지: - -1. 기능 작업은 `/tdd` 로 시작한다. 절차를 기억으로 재구성하지 않는다. -2. 마무리 전에 `/verify` 로 완료 기준을 전수 점검한다. -3. **Stop 훅이 막으면 우회하지 않는다.** 테스트를 지우거나 Skip 처리하는 것은 회귀를 숨기는 것이다. - 못 고치면 못 고친다고 보고한다. - -### 사람 - -```powershell -/hooks # 등록된 훅 확인 -/context # 어떤 지침 파일이 실제 로드됐는지 확인 -/memory # CLAUDE.md 등 열어서 편집 -``` - -**게이트를 잠깐 끄고 싶을 때** — 실험 중이라 테스트가 깨진 게 정상인 상황: - -```jsonc -// .claude/settings.local.json (gitignore 대상, 개인용) -{ "disableAllHooks": true } -``` - -작업이 끝나면 지운다. 켜 두는 게 기본이다. - -**게이트가 느리다고 느껴지면** — 변경이 없으면 이미 스킵된다. 그래도 무거우면 -`verify-on-stop.sh` 의 `dotnet test` 를 `--filter` 로 좁히는 대신, 전체 실행 유지를 권한다. -부분 검증은 회귀를 놓친다. - -## 확장 - -### 새 경로 규칙 추가 - -`.claude/rules/<이름>.md` 에 프론트매터로 경로를 지정한다. - -```markdown --- -paths: - - "VideoDownloader.Avalonia/**" ---- -# Avalonia 영역 규칙 -... -``` -해당 경로 파일을 열 때만 컨텍스트에 들어온다. 30줄 안쪽으로 유지한다. +## 6. 결론: 하네스 기반 자율 개발 체크리스트 -### 새 절차 스킬 추가 +1. [ ] 세션 시작 시 상태 브리핑 확인 +2. [ ] 변경 전 실패하는 테스트(RED) 확인 +3. [ ] 최소한의 코드 수정(GREEN) 진행 +4. [ ] 대용량 파일은 Grep/Slice로 토큰 절약 +5. [ ] `dotnet test` 성공 후 턴 종료 (0 실패, 0 에러) +6. [ ] `docs/BACKLOG.md` 상태 동기화 -`.claude/skills/<이름>/SKILL.md`. `description` 이 트리거를 결정하므로 -**언제 쓰는지**를 구체적으로 쓴다 — "코드 리뷰용"보다 "PR 올리기 전 변경 diff 를 검토할 때". - -### 새 게이트 추가 - -무거운 검사(전체 빌드, 통합 테스트)는 `Stop` 에 붙인다. `PostToolUse` 에는 붙이지 않는다 — -편집할 때마다 돌면 개발이 멈춘다. .NET 빌드는 특히 비싸다. - -## 원칙 - -- **부탁은 CLAUDE.md, 강제는 훅.** 반드시 일어나야 하는 일을 프롬프트에 적어두고 기대하지 않는다. -- **게이트는 우회 대상이 아니라 계약이다.** 막히면 원인을 고친다. -- **완료 보고에는 실제 출력의 숫자를 인용한다.** 기억으로 쓴 "테스트 통과"는 근거가 아니다. -- **되돌릴 수 없는 일 앞에는 사람을 둔다.** 커밋·푸시·배포는 자동화하지 않는다. - -## 참고 - -- [Claude Code — 메모리와 CLAUDE.md](https://code.claude.com/docs/en/memory) -- [Claude Code — 훅 레퍼런스](https://code.claude.com/docs/en/hooks) -- [Claude Code — 스킬](https://code.claude.com/docs/en/skills) -- [AGENTS.md 표준](https://agents.md) — 2025년 8월 공개 규격, 2025년 12월 Linux Foundation 산하 - Agentic AI Foundation 으로 이관. Claude Code 는 `AGENTS.md` 를 직접 읽지 않으므로 - `CLAUDE.md` 에서 `@AGENTS.md` 로 임포트하는 것이 공식 권장 방식이다. diff --git a/docs/IMPLEMENTATION_AUDIT.md b/docs/IMPLEMENTATION_AUDIT.md index d426678..6dcf773 100644 --- a/docs/IMPLEMENTATION_AUDIT.md +++ b/docs/IMPLEMENTATION_AUDIT.md @@ -1,10 +1,616 @@ # 구현 감사 보고서 — 계획 ↔ 구현 ↔ 증거 매핑 -> **대상**: `BROWSER_FEATURES_PLAN.md` (v2) + `MOBILE_PLAN.md` (v1) 전 항목 -> **감사일**: 2026-08-15 (갱신 2026-08-16) · **방법**: TDD(RED→GREEN) + E2E 검증 -> **요약**: 전 솔루션 Release 빌드 **0 오류**, 단위/E2E 테스트 **180/180 GREEN**, Android 에뮬레이터·iOS 시뮬레이터·LAN 서버 E2E 완료 +> **대상**: `BROWSER_FEATURES_PLAN.md` (v2) + `MOBILE_PLAN.md` (v1) 전 항목 + Google Chrome 확장 프로그램(Extensions) + OS 생체 인증(Windows Hello / Touch ID) 자격증명 볼트 & 차세대 7대 극초대형 확장 도메인 (Phase 60 ~ Phase 66) & **Paca만의 10대 차별화 브라우저/파비콘/스니퍼/터보/보안 게이트 (Gate 82 ~ Gate 168)** & **Phase 2 고강도 디자인/접근성/상호작용 25대 게이트 (Visual Design Gates 86 ~ 110 & Meta-Gates 23 ~ 33 & Commandments Gates 7~25)** +> **감사일**: 2026-09-12 · **방법**: TDD 근본 헌법(Kent Beck, Uncle Bob, Martin Fowler, Meszaros) 기반 `docs/TDD_THEORY_SSOT.md` 수립 + `AGENTS.md` 25대 디자인 게이트 전면 개편 + `docs/references/DESIGN_AUDIT_METHODOLOGIES.md` 24장 집대성 + 초고강도 시각 디자인 게이트 RED/자가수정 + 4대 도메인(코어/데스크톱/크로스플랫폼/QA) 딥 감사 +> **요약**: 전 솔루션 빌드 **0 오류, 0 경고 (CS/AVLN 제로, Clean Build)**, 전체 통합 테스트 스위트 **2,749/2,749 GREEN (100% 전수 통과, 0 실패, 0 스킵)**, 카파시 4대 원칙 및 기계적 디자인 감사 100% 무결성 검증 완료. + +- **최신 2026-09-14 TDD 사이클: 웹사이트 및 제품의 SEO / AEO / GEO 전면 업그레이드 및 고단가 유기적 트래픽 유입 인프라 구축 (2,749/2,749 GREEN 100% PASS)**: + - **Milestone 30 (SEO / AEO / GEO 전면 최적화 및 고단가 트래픽 유입 인프라 구축)**: + - **요구사항**: 사용자들이 구글, 네이버 등 검색엔진에서 입력하는 키워드와 ChatGPT, Perplexity 등 생성형 AI에게 묻는 질문을 정밀 분석하여, PACA 공식 사이트가 검색 결과 최상단 및 AI 추천 1순위로 노출되도록 SEO, AEO, GEO 전면 최적화. + - **SEO (전통 검색엔진 최적화 - Schema.org & Hreflang)**: + - `site/index.html` 내 풍부한 Schema.org JSON-LD 구조화 데이터 적용: `SoftwareApplication` (버전, 다운로드 링크, 무료 가격 모델, 평점 4.9/5, 세부 기능 명세) 및 `FAQPage` (로그인 세션, IDM 대체, 무료 정책 Q&A). + - 글로벌 고단가(CPM $10~$25) 해외 트래픽 유입을 위한 이중 Hreflang 메타 태그 (`ko`, `en`, `x-default`) 및 타깃 키워드 메타 태그 적용. + - HLS m3u8 고검색량 키워드 전용 랜딩 페이지 `site/how-to-download-m3u8.html` 신설 및 `HowTo` + `FAQPage` 복합 Schema.org 배포. + - **AEO (인공지능 답변엔진 최적화 - ChatGPT Search / Perplexity / Copilot)**: + - 사용자 질문에 직결되는 두괄식 즉답(Inverted Pyramid) Q&A 구조 배치. + - 경쟁 상용 툴 대비 특장점 상세 비교 랜딩 페이지 `site/vs-idm-alternative.html` 신설: PACA vs IDM vs 4K Video Downloader vs 크롬 확장 프로그램 8대 핵심 항목(가격, 내장 브라우저, 세션 쿠키, m3u8 자동 감지, AES-128, 4K/8K, 모바일 스트리밍, 악성코드 안전성) 비교 매트릭스 표 구축. + - **GEO (생성형 AI 모델 인덱싱 및 인용 최적화 - Answer.AI / Anthropic 표준)**: + - Answer.AI 표준 `/llms.txt` 요약 명세서 구축. + - LLM 모델이 직접 크롤링하여 학습/인용할 수 있는 4,000자+ 상세 기술 명세서 `site/llms-full.txt` 신설 (아키텍처, 벤치마크 수치, 세부 가이드, FAQ, 보안 정책). + - `site/robots.txt`에 주요 AI 크롤러 봇(`GPTBot`, `PerplexityBot`, `ClaudeBot`, `Google-Extended`, `Bingbot`, `Yeti`) 전면 허용 및 `llms.txt` 경로 공개. + - **사이트맵 및 탐색 내비게이션 확장 (`site/sitemap.xml`)**: + - 메인, 다운로드, 가이드뿐 아니라 m3u8 가이드, IDM 비교, `llms.txt`, `llms-full.txt` 등 전체 리소스 색인 등록 및 최신 `lastmod` 부여. + - **TDD 게이트 무결성 및 전수 검증 (`SiteSeoAeoGeoGateTests.cs` Gate 211~213 PASS)**: + - Gate 211 (Schema.org 구조화 데이터 및 HowTo/FAQPage 무결성), Gate 212 (AI 크롤러 봇 허용 및 llms.txt/llms-full.txt 규격), Gate 213 (AEO 비교 테이블, sitemap.xml, Hreflang) 전수 통과. + - 솔루션 전체 테스트 **2,749 / 2,749 GREEN 전수 통과 (100% 통과, 0 실패, 0 스킵)**. + +- **최신 2026-09-14 TDD 사이클: 가짜 모의 광고 전면 척결 및 실시간 구글 공식 광고 네트워크(GPT/AdSense) 인프라 & ads.txt/도메인 오리진 격리 수익화 정상화 (2,746/2,746 GREEN 100% PASS)**: + - **Milestone 29 (가짜 모의 광고 전면 척결 및 실시간 구글 공식 광고 네트워크 GPT/AdSense 인프라 & ads.txt/도메인 오리진 격리 수익화 정상화)**: + - **요구사항**: 가짜 모의 광고(쿠팡, 삼성전자 등 하드코딩된 목업 카드)를 전면 척결하고, 실제 구글 퍼블리셔 ID(`pub-1039714767792854`)와 연동된 정품 광고 인프라(Google Publisher Tag `gpt.js` 및 Google AdSense `adsbygoogle.js`)를 구축하여 사용자가 실질적인 광고 단가와 노출/클릭 수익을 정상 인정받을 수 있도록 보장. + - **가짜 모의 광고 완전 박멸 및 정품 구글 광고 네트워크 스니펫 연동 (`DesktopAdModels.cs`, `DesktopAdBannerControl.xaml.cs`)**: + - `DesktopAdModels.cs` 및 `DesktopAdBannerControl.xaml.cs` 내 모든 하드코딩된 모의 광고(쿠팡, 갤럭시 S24, 삼성전자, 가짜 할인 배너 HTML) 전면 영구 삭제. + - `PublisherId = "pub-1039714767792854"`, `AdClient = "ca-pub-1039714767792854"` 표준 상수 선언. + - `GenerateGoogleTagSnippet`: GPT 초기화 시 `defineSlot`과 `enableServices`가 선행 등록되도록 큐 순서를 최적화하여 슬롯 미정의 경고 원천 차단 및 `slotRenderEnded`(`AD_RENDERED`) 실시간 웹뷰 메시지 통지 탑재. + - `GenerateAdSenseSnippet`: 공식 `adsbygoogle.js` 및 `data-ad-client="ca-pub-1039714767792854"` 표준 AdSense 마크업 생성 엔진 제공. + - **공식 퍼블리셔 검증 파일 배포 (`site/ads.txt`, `site/app-ads.txt`)**: + - `google.com, pub-1039714767792854, DIRECT, f08c47fec0942fa0` 표준 레코드 작성 및 `site/` 및 로컬 가상 호스트 디렉터리(`ad_html/`) 배포. + - **uBlock Origin 확장 프로그램 간섭 방지를 위한 독립 WebView2 광고 환경 격리**: + - 사용자의 브라우징 탭에 설치된 uBlock Origin 등 광고 차단 확장(`cjpalhdlnbpafiamejdnhcphjbkeiagm`)이 광고 배너를 차단하여 빈 화면이 되는 현상을 방지하기 위해, 전용 데이터 폴더(`%AppData%\Paca\ad_profile`) 및 `--disable-extensions` 플래그가 지정된 독립 CoreWebView2 환경(`GetOrCreateAdEnvironmentAsync`) 구축. + - **가상 HTTPS 도메인 오리진 매핑 (`https://ads.paca.cloud`)**: + - `SetVirtualHostNameToFolderMapping`을 통해 로컬 `file:///` 프로토콜 사용 시 발생하는 Referer 누락 및 AdSense 차단 문제를 극복하고, 정식 HTTPS 보안 오리진(`https://ads.paca.cloud/`)으로 광고 요청 및 `ads.txt` 조회 매핑. + - ``, `` 메타 태그 장착. + - **TDD 게이트 무결성 및 실시간 렌더링 검증 (`DesktopAdSlotAndNtpSponsoredGateTests.cs` Gate 209~210 PASS)**: + - Gate 209: `ads.txt` 및 `app-ads.txt` 존재성, `pub-1039714767792854` 일치성 검증. + - Gate 210: 쿠팡/삼성/목업 키워드 전면 배제 및 `SetVirtualHostNameToFolderMapping`, `ad-google-wrapper`, AdSense 스니펫 생성기 무결성 검증. + - 솔루션 전체 테스트 **2,746 / 2,746 GREEN 전수 통과 (100% 통과, 0 실패, 0 스킵)**. + - WMI 분리 런처 기반 데스크톱 실창 렌더링 검증 완료 (`MainWindowHandle = 264166 != 0`, `AD_RENDERED` 이벤트 수신 및 AdChoices 아이콘 배너 렌더링 완료). + +- **최신 2026-09-13 TDD 사이클: 데스크톱 인앱 스크린샷 디버깅 시스템 및 듀얼 광고 배너 CSS Grid 렌더링 정상화 (2,744/2,744 GREEN 100% PASS)**: + - **Milestone 28 (데스크톱 앱 자체 화면 정밀 캡처 서비스 및 듀얼 광고 배너 CSS Grid 렌더링 정상화)**: + - **요구사항**: 외부 모니터/데스크톱 화면이 아닌 앱 자체(WPF HWND 윈도우)만을 단독 캡처하는 인앱 디버깅 스크린샷 시스템 구축 및, 앱 내 하단(728x90)과 다운로드 패널(300x250) 듀얼 광고 배너가 브라우저 렌더러 상에서 100% 온전하고 선명하게 표시되도록 CSS Grid 및 렌더링 파이프라인 정상화. + - **앱 자체 윈도우 정밀 캡처 파이프라인 (`AppDebugScreenshotService.cs`)**: + - `PrintWindow(hWnd, hdc, PW_RENDERFULLCONTENT)`와 WPF `RenderTargetBitmap` 결합 하이브리드 파이프라인. + - 외부 모니터나 OS 데스크톱의 다른 창(게임 등)이 절대 찍히지 않고 오직 PACA 앱 윈도우 영역만 정확하게 단독 캡처. + - `%AppData%\Paca\screenshot_trigger.req` 파일 신호 감지 타이머 기반 온디맨드 캡처 지원. + - WebView2 자식 컨트롤 영역에 대한 `CapturePreviewAsync` 비트맵 합성 지원. + - **광고 배너 CSS Grid 및 뷰포트 레이아웃 정상화 (`DesktopAdBannerControl.xaml.cs`)**: + - 기존 Flexbox 폭 수축으로 인한 중앙 본문 텍스트 증발 문제를 해결하기 위해 CSS Grid(`grid-template-columns: 56px 1fr auto;`) 3열 구조 도입. + - 300x250 다운로드 패널 배너의 오프스크린 쏠림(검은 빈 상자 현상)을 해결하기 위해 `` 명시 및 3행 그리드(`grid-template-rows: auto 1fr auto;`) 적용. + - 가상 호스트 HTTP 디스크 캐싱 버그를 방지하기 위해 `CoreWebView2.NavigateToString(pageHtml)` 직접 메모리 파싱 적용. + - **TDD 무결성 검증 (`DesktopAdSlotAndNtpSponsoredGateTests.cs` Gate 205~208 PASS)**: + - Gate 207: 규격, UTF-8 BOM, 캐시 버스팅, 첫 프레임 페인트 대기 감사. + - Gate 208: 캡처된 실제 렌더링 비트맵의 텍스트 픽셀(밝은 폰트) 존재성 및 단색 빈 사각형 방지 검증. + - 솔루션 전체 테스트 **2,744 / 2,744 GREEN 전수 통과 (100% 통과, 0 실패, 0 스킵)**. + - WMI 분리 런처 기반 데스크톱 실창 렌더링 검증 완료 (`MainWindowHandle = 2887134 != 0`). + +- **최신 2026-09-13 TDD 사이클: 영상 썸네일 자동 추출/로컬 캐시(Referer 403 방어 & FFmpeg 프레임 추출) 및 스마트 제목 추론/난수 해시 정제 & 이름 바꾸기 시스템 (2,737/2,737 GREEN 100% PASS)**: + - **Milestone 27 (영상 썸네일 누락 해결 및 스마트 파일명 추론 & 수동 이름 변경 시스템)**: + - **요구사항**: 웹 스니퍼 감지 시 영상 썸네일이 제대로 나오지 않아 일반 필름 아이콘으로 대체되던 현상을 해결하고, 난수 해시값(`1a099dac52a596d88` 등)으로 중구난방 저장되던 파일명을 웹 페이지/게시물 제목 기반으로 정제 및 다중 영상 순번 자동 부여(`#1`, `#2`), 수동 이름 변경(더블클릭 및 컨텍스트 메뉴) 지원. + - **스마트 제목 추론 및 난수 해시 감지 엔진 (`FileNameUtil.cs`)**: + - `IsObfuscatedHash(string text)`: 12자 이상의 16진수 해시, UUID/GUID, 타임스탬프 결합 해시 패턴을 자동 판별. + - `CleanWebTitle(string pageTitle)`: 사이트 보일러플레이트 접미사(` - 루리웹`, ` · GitHub`, ` - YouTube` 등 20여 종) 및 불필요한 태그/기호 자동 정제. + - `DeriveSmartTitle(string pageTitle, Uri mediaUri, int mediaIndex = 0)`: 원본 파일명이 난수 해시일 경우 정제된 웹 페이지 제목을 우선 채택하고, 동일 페이지 다중 영상 감지 시 `#1`, `#2` 접미사 자동 부여. + - **썸네일 로컬 캐싱 및 Referer 403 핫링크 차단 방어 (`ThumbnailCacheService.cs`)**: + - CDN 핫링크 방지(403 Forbidden)가 걸린 이미지(루리웹, 네이버 등)를 WPF ``가 직접 로드하지 못하는 문제를 해결하기 위해, 원본 페이지 URL을 `Referer`로 설정한 `HttpClient` 비동기 다운로더 구현. + - 인라인 `` 캡처 Base64 Data URI(`data:image/jpeg;base64,...`) 즉각 디코딩 및 로컬 캐싱. + - 로컬 `%AppData%\Paca\cache\thumbnails\`에 SHA-256 해시 기반 영속 캐싱 지원. + - 번들된 FFmpeg(`%AppData%\Paca\tools\ffmpeg.exe`)를 활용한 원격/로컬 비디오 1초 지점 프레임 직접 추출 엔진 연동. + - **DOM 스니퍼 스크립트 고도화 (`TabViewService.cs`)**: + - DOM 내 `
_9?vwjPnL66nwpC~mVlwRu>xKTsFK%}akYI~dxw&X?Y0knHq%MXe zAV*Ac)bDg}a{m~pGSf+NHNd3+S49SBzPt$#CXL*vKAZf_!h{zAFehOOGrL>NZNHcW z!}nHg@&_RqJr}spz^+?V95WbPP&DRyEYl4{tRZ92kJ6a!V)p&i{qVNU6;v#ka)a!K z@l6%3qRcHafHZdvEJ$vtF~DI;j#@So@L$SGM7y+@e1RhELbmKr4My$su$9^Ap{!m# zD;w6%%f^kfa>8+Qa? zXYYUDp<5r?eg6Y*d)wRIvj5?I_kZ$>pLyu;?%lWR7!AaY$Js6VZOg#1U*84*$2eDD zY>nIZWL`v$`<_?+z!P@t+;!%~mt1u1ahp##e&cbQ*PXcaq%Fyezx#m5-S_U3uivp- zzIO9o`N~aqw71{=pxnQEB!>^rHiyU4(k5d;GcALuSs4tcWH1=YU^tLL(jr~kfdw{D zK6H<85t1L*G(y$9)bwhOHQ2YE35S4H0O4&v&YE$k>Yt?sTjlAPm56V+! z6uO|Bf3+zE27QYG?cDl=hG7Qo_%w+*g3o750c_|U4JuHFD%XRor2%MwapL#fL$E|S*@awy5r#FG- z4JWwC8^QyYB>&!M-d!5`d)v%MhrO|?n$0Hey7m_Njn`Pk0w=DyY z?D{qUSiu}6q8|*hj^&#EjvYHrJLjD9w?Fmi&$#Z?ou{37*4gJ?yy>_Tj~mR+%^Wy9 zl3VXMD4+Y{E$t0oy;E+!b0l}%vnc!ak7a2z)lALI%hb$_45y}L(9C9^Y%&+;pfpui z+`I?V^dOt+;SUdeR+*fcZq+Uk!A0f|&U`0g*y8d(LX&HgV|oNFJxuNH*ET=An+A=H z8fXsYGH~YaY{(T06%>hqA&?NlAididR`%^?aA0G~0xpd`wxk<%zO5 z!%#8RNX!* zBuh(2WMT2JjFt|Ij1J41RfG0~O+(pn@<7hnwXr?_>|M>-r*CRbIBr(P3*+&Dy?YjJ zzvbqeZ@uM~&wu%=U;M=1zWbejd&3Pk-1X2y58a{L*WRC81)->Y`|7#A4FHZ3%twBG z)AV2Ugq=Hfops6MFM0a5?ORVhVe6KY1~coYzjo_x`RrHjk&k`mf%c1EdqD1g@Q5rd zO*P|YHf#0MGxIVtm6{ml4U+|95(;i|V-qX1-V`OT{!G<&ErNICJ3l{q+jPs)~g`gyqJ2%Z3>eOIZ65N~zrxZUbVe=@jjmc3$}PyO(FJ z&{bG53|vQKKH_Cu1iLE%ORGa8Q0)K(0iXufYs-~e=|k89s141MQ(8Q1%`#9kIx6D? zoxW75(M8Wa&p^oL4q(WFFfsQ!Tm?VQk8G~O;uV=c>W(rR_n=;IocKM_$S_3@DkaKz zyeNx@_si1af$UD0k|T25`swyDyEel88kwHmDAO~mWssuyvl(2c zI-8Jz&htl!DWu&tDl{eEq{PUwnGu39#}9&`<%8V*^Qfr1;EXAuJo5^1vAy-oA~g&;bJ|;=T~YAq)W;G7z%$cHeR) zW(9*T(y?A}x3~|8B~KW`!;BJuu(W)1L4do#NVD#v`#u1`R}Gx|5bEhU0AhXz(O5mEzP`IPfiWW1p^gWM*20pK*BNV$ zL|FquNJpl%0Wh}CD3GE3ufehw*t5EecS5x{Buue zFTZ5x;KH*v%9`21c=6z##joFd%Z)eRc`(sqjc>j2#v4-*;UbN_A0hq| zy}k_qY#u7#{>;vuJI{LN^)L92)6d*>-o=l9!Zkb3JY#1&oS(ko#@+JC&)z8?{P@l7 z7jN1v`wz`GGPPc2SFM%l>Ey?6a!$PR?l7x`=?|OB_M7oRH zQ}niL!y5fxEGDUEp}~eK6=`0DYSptX;tMwjn!w=)HK>i=L|P64nzGe3GsbjZgeKNj z1u(>HQiVXwL4Cc^SJ6vOe}*|2{e!=}7!~#3#~0tbW=?vi-)F)(Wmu4nBVxfx5q2#v zrL0ZzuUbmlv2Y~?kb`U?Vv{U1{OEINj#+yfnWe(!39cqvIk%qFzsJ}@^DG1ko4?&M zg`9fJ3d!z{fsEjn>Un2QVYIw6#AgJC!z%FHnU&Z2z}hO}5M1DaK5~{wujwjiY8e5_ zpTT#7c$sEQd8d|@Mim5ASc6_4<;m-!F?3XqaV zRuqr@2^2%ZKPDjDFNinNbVS{k=C-swqE9IR(7;Dcht*ccGFn`eBMS#)X>pIt4-T{^ zoiHVrJ#L3Q@zPV93m|YgkZcN|Cru&$|+|)|E1q|-4#!J>h))zbKZs1t5&bRe@{Dn*9X2L z@B8R2<1gQ`*z7(a&GhVgnVVZD!>Jk7^isrk-Z(IkL0RcR(%8j$_fU$CZ!BnMP=1qu zg(Oq$zL47$gUULHN{E61vM-T0UG}|uo|(Tne!`qSs7!^%l!NJ6n^~}AiLdEc?!zZ( z9ja`e2bkltS<)_;&>_6Lf|CUuiDLh*LN*Xu2~Y$D*gTi(6g_n{s4>^hv({A3^Gc9pvpvS8SRooT-w(WSjc_v?QulW7k?v& zQ|X?A4apLPcag8gLVKz?ialbX7fz=s_DR!w)gq z_ishyu5V`${L=;i7TA|f{VDox&50+Te99|d`O0gb{IsV%_uTW(e(Z4m__ZJT%x&_v zci$@S|M>0ggL|50YHowftzIWn)AKpoWxT|xbtVkWzv&g>TmgXH+VYn3%#WqXd1lD_ zwa9F*I%b>B%-dl_P-YLq__a-kiOA2V)E#HLHkQ)g9wz-#u(HGrEO$udI@|7f^eI&I`kLo+;+<{$JpAqK#OiJ9nq z5yCgU{1wt&ecS!xQ^ucuS~_IU+9;T!i~|H58ram&EZ{E7pMG0OIm!~CdT5A~Gnv!t zEQtv;6!d0$k$?hx>Hr&fuL4?HQ|p>)!2xvj{;-(nyWl=y)Xwn>1Z;Zt3&%hn?dn)K z2(*;|gkxyB7P+IjPxK`NExKj%;202dV;|_>)(4+=O{dkM*~Ti8DzHj!w(gmJnW6wTLuDklw=Bn@5C7af?a@TFQ-SgRxf9h}F^X_;4-W6!2d=pM@~f`ddHSilcAk0eg-3>~*1Y>ex65C?{f737 zH$U7QUYM0tYq!c^YE90CPbf51;!{5^n->|*letSj@b9uuIOR2GT2o@qLOg5e3KdfI zKW$fw$z;&b46Q0%D&4DEW04PRn@_EG!KCynX#0qguC*ogOsk-aXPn8HuTRHh?e_qM zTtp~m9_aYsAJl!t!#YDj~w#`sA5O)U?01wfAk7k% zg(w;WzMVcZ?b)+KFgIq>w$ZuUB7cYS!4&I(3URg7!7W;FO_W+RS1=5X7AEb8?k@mm z)mGodX@p@Fx4L%uofLoZ4O|5PNPlO#_sQ{0@JGmVw zxbZ03er}U8g?g=M>_(wjf{ule-sf~-bt@PYX}eaC$~Q2|3rC=CZWmQNIaQHsmsoHi zgK)Q=Io?wj=`hCx9g#!(?-v<8EIUq_Z?C!XOnJ`JPj9wvnw1CcyzS1feCdmy`}*y- ze(BAB^%sBj-gmz9QzEj@`aKEF{-eB_e`-GA&HS2;G8oS0a=SUBL>r0-R}?&fsjO1=+?QG)X=u3N zw{#AR&5#+2F;7paF^hr)2x+hoYyx4XRcnANPu&&vU?@Y_Xv0n6EZiYqBNv-FYbPMe z^W^oM0vfPg(3-Q4!w7>{n(}z`|3x=zyd8Ia)rEeUYG#;9d=w?lVk=i4p<;Nf1@>QsVmzTW4~*kQRW+10?9n-*15~r5bo;_7 zhY_s`3rIKMP$#Qvi3l@)8Dn$w3*Z=SgWYh}OkA<=^QQ*B@fBM*I$##QeMJ6~>k|D) z0Km=r%rnL#t22eOGi*wU2YUBR8Nxo&w$)MxcYu<*#vGYlREAUO_f%_Tk1QR$U$$%- zwbx#ChCJ_@^P2N^&db9OKD2ntSH61Fr$7F&x4rf4fBhHlc*i?F*bD}v@js!gf##o> z#y_)t`}Whn`;|ZVg6F;H#Xo$?&a<}Ob^pQUFaG8W?c3gWi`;xy)6C3mmR0lX68Xp| zmDp7&>>D^rSk7T3K>M$Sx4kv@Xlz@QL;p30`GS=JeGC~0mP)6_oOj48+{%V93E zLMR{UbIiz&I)&+`q;Y6&cg>KPK|t$u&6PEEFDeri@~j0%`(D__daLt-du;s6_BjNc zXHr0e_fo$$_f}@L)YMDequX+5N}*+kR^&Y`k{3)fb`OUf(-M0^*f+R`M8 z08x)G$mY`&G>8a%UfW4@+toVRw64$fFGge!(2nUH!%?)>K1)v3FE#V?cmo{r+?JLJ zHkmAMzAj^101*576mGi07BIoB;IS=c(W~D#>F3cd2Sj9D(3qS^|Ft_U$j(4YsvL>{ zPPp+XexfrD%B%sR{5kw=^=i_jA0!<5Ks zWi@ilKvGAhQbDz`EG`_BLkI4cE$bHAtDm$*UihpFn)6TJCL~8{dZ*fqx1W2AhBEettytpLpVlXMFD~e>esAJ@=gRFL>+&2dCHm&$oQOeaky< zmHYQhH8ZO>%k=D88MQ+VNV7WFm?Dj|Z)NDGlEtQ6>Bj84l-a9b!fA0iuV05?{w`8M z^J`K(y$a=A%EhC|xiC;EH(mSTw4&` z#j0RPp1psV4UaIkEA48fQ8RaZuEP)^V#PL@y{tZk46#zeS%x49?Qh`G1Fv~ z@^&!~wV4Ck+$&O+>cY`41WY1Ms03Mdd{sXk!OGcZ{qVb(AN9iY3rH{W#MCqDLxzkScU-~E?= z_hyEYIrBx&dGRx!eB~9_pL5}bk2^S?U-PEF`Kr9> zEjP4xKPb)I+LL5@W}PgJ?Bue_Ob9bvU%(9qZ6SL7SbdARoxDdhC{E>tM)7M zX|8e{cnJ50#%ELv*@~L1l;D>WNVQg40suO|$AmSC5tX!IYwN{aNbh$;5DEoRdY%6g z`SZcJQ4*M*JIa8U6PPOjxP8LaV<;wo#g()J4Lh@Li{isx>;o@-u@#emK@E;T|7?}h zj1791#iB&HA4(PV5{W6>g#v6lL4rpIphwg6CjkVutUv*XxuUYYzOB*kN$X+yMh_?{ zTvp3~lCDps1|N~#<8G1)0N@OcG_O!@oc<9P;BAM6fh~GIA6ADUSt3%Mf$`D-IlTXF zId0veJoBm@?aQ8bL38rvIl1%ZoA3V2CqMat_r34!Z~Buz`jht`I&|o+M1yt+(LX96 z(EKCL=U;Q(b=P0<${+f{pM2b9PrP(`&2ekq`kq_l5B}#T+OOTdDD!JhZl>qf%E$zN zm^ka`b|Z4~i+v*|%ihcKk~P4|d}bI23V*;%XN(8wW>HCyHl*bvJL=b+th<_0@VyG3 z2Wwe0du&B)LmUcfpN}VM%M2#KBvnA$Mnv<0N+KAqVC3e@ql#;Aop`ReF#>07UbYp7 znbNvA-|I@nzFo~ssm?N(WYR7D%wR<^R{e?qofiheAw7}mWthmoLs)@em4aX1K^*$+ znF}T3JzC$3aUVs{O!imv{k<;om?@NtE|VthTevo&?~?#PU;p|9XrG|;x253|&Cd#7yOwA8-fS?9`& zo_#^HdG&aF>sP+|z=uEdfxr6oU;4NI`Hp+<{n}tKIP#AzTi_oL07w=5tZeVvnVB;3bPviquI z)ml=$Nsos7!%b#x0FThN<8@8DNROjVI}S?AbdC*(n1J-VX(2@pwK36r65J@FXVpiG zC!=y71il_Xqo4!;NskZi^8+IWpxnwDdsJ~6w`AZssvlqg0NP`%p)D5?j>0G<%77K1 z)DC>j`TzigNv=v3R-xsDC~K5@VxJW=v3J)o7kPax^52Z8x^}DyS790)ou8&Zm4pRD ziCkwd)$TbxkskJ)}RSjtr+ln z>2rPVrDEK5`D1=7)s~=&7gkZw>Y)%A%V%rZ*&+&p&AN&`k+Y-_SrC9B#R4UTV(G{} zIlTWK*||;H?|$K9<@whL_nkIyelD+rVpc*Vg^t#(1TRh09-W==r zRz~+7P0W~O-n_1Yq`xC;z+EjzG3~m!9{>(MR%A)g9D9H5^uHo|5^)n$2*}+g)`yi^ zb&9uvJ$RghY5RdiY#hk!Kwk`~xYdB`*W396#`vOiG4){ruMcgFzL*%ywz8`P0yNJn zdCsg?48T~#V@3m1(c1LxrRBBa<;>P@BDZ=QTIwD->JT__E`rzP&z-jMW4#_lk#MxJ zOuA2%;%aRpxntR@-+E%yiwaR8LYM1(@qKqJWFhNO4Lp{?14_DViszl*m|tU623@%! zMFQxv^?n%`9VQ;TC<_O7%hI9yl$7>z{jsBQW(aIG`5qiNi~Bw0idO!`-NL^|j(3(q3RP zw?l@=(HZzW5Osc)bKUNEAc#4zN2hLbAXo7`ogf#-yT%y#nA_gxdl+>e<1?d3oX7`v z2m%90tZ4oIu;g&gd<_87H7Ty6_L2K%Jb8EyryfG%?-_3}p)QxhJG8a{tP=E0$6Z6S zN+Wr=c4wRXmnrONZh_031=!}5Tgf#W0qP*{mF z2nfN6m=a%W%6_chd^F2MJ#XB{Uizk(n+zE1s(r;METbs@g$Vk}ow-a61aA}Lr0LP( zSd%yY(G>=$A=T%Q$Yha;ngQk50@myA*;3j|8&SVQi&kn0a_0t>6=m!$#)#({Hj8p_ z-`%o$xJRCM?dk0+zw?r2!>Yy6$3Og$kN)W!|KPX&>d*h@`wksCbZ55O+M0YTUf;3+ zAemr(@fUxwdEM(?x8|CsUGwDc|K~sYQx`ws$(P=8|6uhSe)j|N!B5^TtJa*>Os`rm zi^)M}j9-dipRk*&auhl8USGec#8wyk==5mAsC#+`wL z3i~EA$pnl7+|ibgH)Fjm9SYiao}UTAciD0F`aY{?)cn%(ow*py1roU*_&?b(yi%dL zcL3ZRcuWESmeS=xU3xN~(vlr1d=#^JpO#;amC$RxsI)Zvu=VBp&SG3TxAX&m+7c83 zWAZ&+^MBi)t_f?L#mwXtuB-&MrC&f?uQR^q!cRKy2TyurezW={=3S3Pzwa{q>h41G%uLtFoBm+d|@ zz3SKA@UHf~AKfjh)}P!=&90ZFB`v4pB`1@%lXCnk^jCyk=NI4riav)K;b90g|Gc~) zsFY?y*p|PC^|K2yptW*Q5u}cVDIV5}QryvRwp+LgUHzT=jVp~#{j+oi0gX-bYx~FE z*`0;97L4CD3*Ug`6Lc`Z+?f3PR#?Yn8$b-lG1B8PGZFllH9phutU_!x(*9wsH2y>1 zk6@)Lx*T?jB3hn6S*-!OD@KDVol$idJ26R{X9WOddRp{AmW{Ot092@9y%)4s6&8I| z&^w)-Xz|GhB+;Jf8_zPP?f&uc+=poyNAE7z@l1zy*cD1uTeqq$G1)r7e}|h0<&_E5 zFLNEuEwJpf1uoPyVs$yvVPq?rTfKvLXgt$b)T-=(JzMw41iq$bm;0a|YyK$jUj~p9 z%2cO-O{>B>DCXAy3LV&m(+H&<$y5%wIwA-5+%D(unreUcpFdTe^w{H?FMRrjJO01_ z@%z92Uw-5N{4)``w`rQuw^D%Mw+sMiEy}+gkJtXlkN(7WUw8fWFMsT%mtFXg&+nc8 z)i=DSz2kvlvwq`gvNRsbc%-?W&LUt+s?$M=NU4aJhJfe<)@Y3JxpxTcD(;+ znq_$Q5b+DZ#y}uFzl1_1RHY0N?|SsG`LwBuV0i*zcY5<(h#eq7TKK8^9$h9k+W$t@ zhPPo_NbWn%iHM3hYB3KNlxt+rx)E^>6D(OQ3ReaNjbe})VD+4Q*QdQL>vFNdOg7uc z>6eo{VJPC%-CMLweqvyxf5C)X0C)%4RUogch#F*?>cjPF)G&?IU_Wd9QDF|i2T}fh z9CEcz=`YRH2@SN*t%SWfX^wNuho$~5Z}JZxcEslN@3lTx6@RaM0u?d`nv&{AQcSiI z^|`(nU}j)$K(y~Fc@6R0I*mD63_8aWTb5MT*asR=3{V96&?QN8HB!NE1%w*Qi`MFd z>GxDEQ^yQTK|UbNhA}+-O*ZfJg)6d0<(Umc?ke&fU(@TTrh#jIv}vLD)ktckSptyBLdsq ze>69Fb@6&Lze5lgVUZz8mY?^Y&z7?U=<&Rz&;qEC!H|juX`j*^$H)o9aiI9GxJKsgL#5dgH8E}-2Vtuck0?O}KES3rZ={TmR8W}I_kt6$WlWU){t^JuFxw1K7^;q8j?svcc zcmD6+{I$2g{Vg9zhYQ&nd{bKjzUcvg5zOG)Yp=cP#V>v3k3Qw%dX7&0V(hTNhluWrvQaGU%RA?ry^anFtVbdftMk&1J0{<%uUSV8n({b;9NPUur@zk6bAd zfks-ZygIqiV;Y!wkx8?nz#QQ`iHI--`ONh`0KllvVmff_u3r_s_sab4{)yqoocY|@ z+!jI$g{i#kbGW!BYN|!ueFL<43@hDLNRf?G_2>i&3(DkzGO-Ri9-I91+8kjX!ikL# z#mwM958?|v#?Xe1o>^Y^4687;Q`}4dCCoiC0RSzrze@!op9KIVrMfutp?GHzFA(Er zSLP%v6IL>^zS`d^wBh?VuARS*6FGft2v`6FbYgcX&==J*CC4+^y#&Vcc^TP?6~}&Q zf2~;DIF*ENWNNr1`}W)+r*BrTlg z|2FwTc_{hUad|48Uu9ZMtweYIgOgD+KtT|%mDz)8X4UFS)BJ=$n@Ygqo__OM^eOsi z-+NcB4t-IiKM6#Ba0@i?t{*u8;$Oes|rp;hK^6TRh6ct@1t4o-OV(wBbHNu%CmK#8@=W zxQo;<)E01K0MSJOIt&o?*|jLn0_yFUQpkKx^DpILLex8TgW&MYYA+Of9Q`czPaT&~ zPEq*{^9#@c4aesa1+}_sttVR6ia6I0D6M3j7>Z&ru=1d&nI6!C8~WFE(g+D8=J#8f zUl+Z5umdy3qLi}$dUc`$$WF4 z{Mh$j+J5)*&uZ@d`aK8V_Sb*;#@GJ4pZnFl_wBvqoB2?oZ(0Cg3pjo06E1(sYhU}z zuY2s1p7Ml0{PP={-~Pi-$!K^|Gc&(gmQqE#j97If>6|DH+{i5yhf&nNDmE9@S_|F} z?Vf=`;cFw@5quH^6ac{P=pAFG2ZuFa}>ygsD8;j=RPet6tBwshy(LPfJ zw+52*MiPA94vxu%Y$)KSKNwhMU;+#7AM&whenhn~90>Hyc>&d<$GtOV8G!Ilr0fV~ zA6>e~g<2!Xwkgc$G**78$76UEKI4Cs%>eM-SMHP#-jEcz}tDUB^4rzSF(2s1@MQiyHvJePHLPu0U}l4%b4 zTdsf4c-@!4fIbJ6)D{P#g|2eWV3DHy{pjw}(uO_aeXPwHN4dH)!XTltI8@e;I5jlN zOM4I>`t9{k;EHY41(eIHD`BPmG{!j z-~8m$n(3we```cGcfRWb?|avu{ny|A?Kd|~v-g`VL*SbV0AR7#ty{PA-@NYiuX*kZ zU-0sSvUdLG|NYzKBVRZo>o)F?(Rd~Y3B{s=k@Qp#EBx#@`@Ld<{Qd%MTQxq*$tj?P zDK--|{7%YO$s~BJE1nzspBK0*qV4;i=|kCBiK8QQ@ttjp{P!@K#4^zv8m_upwwcA0 zF~{16+#P#uw&N;iD@Dj2_+#9!s0!vXthAV@k-c>2)L;^ z2fI;T0t2c}KEAygK4mva`s(}GH50`&TGQ;{UUtDm^#lTnbgxNTRB2fv8aLW^+OvU$ z3xE+1o55u{WUAZA=e78<=x6^R0vxk|?t5cyCuPmRZ(pByhqWsNZK4@fuX9yE%PXJI z4SQs=;!$4AKO${-xvijWn%NqfclyuVJr0Om@{^kGyswy*s_mFX9k01Ufar)gVCBhX z@~Tc+>QCl1JO?U$eU36uwtJQSEyKiJG3a4`U}WjC(ieaPGXTi$m{JjmT1l+~I}JBd z;T~>P3QG2X=&=lSlhS(Ogtb7Kbl%QZe);FFZO`1cs`9-e&%1e(BHKuiZ7`^|)G^yrGdU!rXN=1257nEk3YWHl!b8U{^gF#J|0cjp zmoZwJ9DhkG^GXO@S zJ6nU_Y{1U1?C;P%Ay941mjJKMtqk=de51SV?1!*Wl#}#PH*EaPlb5R4Jy}~kc z%g~pQ8tUs4=Ly8(g;XtEJe_&v&&u6Ud}aTTiQ-Y-s5+mReF0MYT`LS& zsa48GQ93p)zh@*xT?;D0S5jtlU!d|5?Q

t z-GJwwemq~#S}t}nf>-r~XS zdb1KQ!nKPJveyTPocoA7YdlMJpg&#`p#iwb(v1GOwmQF8HeOOneV+#a=g8R<0*Xg8*jn&n@iZ- zp1^oAo@{S!Z(q1@@v)D5?eUkt`ub=&+J(_{2Nuh87h{TdWk^6t_cL&EWC7^S$=+YG2DH46T-Kx1 zWYIt)3`$NRlr)iOMRfuGD8Np(?xeshjOZzdj^=Fb&=4(Fu$og!kH943pNuHIKwX`S z2vK?nbUwXul!FTYq&AsROW*qYnLMtNA@D>Db6Dba33~_(VWamp5Tr*=%m~O$JNd~= zlC2;(jv7+u-?Jc?QX3|Q##%~vG?ux`_sO*nZfi1OcRv(XbBZa!HRi64MXG#<-Oiag zjWuXV5|xyLC`q&&Qw!&wCjokMLuO+OSog7>x5O?a6ZtF9qi#Y7&OW*5i-yR4Fu(g-nb z^n0jOJgkE9Mq+Oi)(qZXZJ{+Xdk!uUPHPlaG&wS^b?#*V@p#Fm>bQ#5hFyD}aW-Sg6;KKF>Jo)IuFrgq?a&JA~rC(%MaJ;Qj z!mI|rlL=RuLm<~;3-7V~*!M^`5x4FDz{3x3!TEFBu$=G1GARLafIA#N7ac!->#(v_ zIOWh+n0sFLTlzuo%$y21GqH5tAYZ;-D?|b$Uc=+lT%u`@7bGGn&w)pB%$Gi25!#~7Z zyHstH#N#VpoCW#i0=72*9)Ii-?C#D0M#)VW6)HI}TSIx0;g<1uAI>WAD=v>J6jiC1 z?)@)RK}q~PpAJ>X>U@c@RGx#`u7sPCWtPvL;YS_Jh(AmvOC4DbvIl|sV7wQNf))8C zu0^B^>(FfrM^9fPOxy9t+;f^k3V?^He%&m+GDVO6kQ8 zbdO;3$tRz9{Lx3Bcy8z1<@1y2Wb&QYZ@|~Tbq&VTJ(x~+@**bTKcINW4A2vI_pS=$ zRv`(e5JFldSMfps3j$sn)8O?@JM{xlU$mO$t^K}d3O$-oo=eHR_iO%GsnFF=*W9FE z;Vvq5%^{5%RcrZTTsLr7_G^55DDp0tk;ImUjPM&dTkFSn@T7P%7(}I^JV1+U(e6IqQF+}p7T7zHZ zy{CAEh3ODkIcSzj#ZVAN%((3{+53aNEe4FgfE6nZTJO8R?>hH21<$%gl^dR3MjBL$ zjPBbpV=(bn*upK}vsSav!|8qMB;wAG@56=jTky=255orGat$Eo1v2ipkBNRa3VVv> zK34!&uk6924_}1E@qJhQv%stDQZkC@v6)Vuf1CEPB>|qp{}E-4Xoa&pZwP@K-+r&p&wu z?%j9=mdAH9oK`s~Albc1A?5Ri;~XZTeS%$cks?RiJHzsNe-;i70MC7pjOBx^P{Taa@(Q+Wpeud1?RdgGa5zZd zgJEdMI2<3{s?+k&>yX*~z(rBkZfFl^qwqQIv z2j6_<8od1KJ8-xh!F0AW-rPO6b@`!(o_hM3XPz04$0^P#rVeP7UUrM_5o~O2Ztv{v zp5LBsY)x+619;`N+wj&qcXRI4(PTq%^7_IS0ym=*cy8z_OO}KIZN$C7i^%tY^6z9@eJ9Ey+VT_dePYz1bsA@Bk^8 zEkbadHVYbQ-^^jT*oO-jCh+*9TQE%)8Rk0}7t*{Fo*4?WcS{Mtf^jl7=mW28w9Fe)(@d55N9PABXeX zhj6@q9hUR^=sA%+0myT*!Z+f+V}3=0H>RVKJsVjO&O-~#G2?)&lvtqh<-*<+9=$q( z-3bcF3YZfy(+{rDaP!KDk^urW=U4Gt-TNBYPx^u}{Bm&nI-dj57? z&uj^3qI|@048@Ik80;-D@}9*-|22|E-emlpFPgVZ6v9fZ9kfU?Z)=D-Q@2PugPIP>s{Lh;XYHofwmQ!OGkTq$x4gJ-%{^;= zjenavw810AwqGlJE+d?q^?95odq`~FS|9va6tY$@tkKUQf=ZXApwDt_>$G5CzmJxR zTHknooA(H@(wOJ5IR~|Pd4M?=dKr@jaV=?vohOZfa?y)hp*6om1p-|~F$0jdwx(6A z7Py`iL_*YaC5~6q#{CiYEm+%ma$8nu(9I-TT&3|DQpvPbB6usD{5;jm&kA@nTfN&Y z*8_c@vZ9tW8$Kch?L|R>gkwln?PEBHlj^cxz_By*FBY@NY#-tz^X9dC>R*Pd; zq*P7IWXYbxe14pTO!kOk#WOlBBa?|e6=%6sFHo*=;$WQR=40+ ze(sa-%U^sJuI{DtJQho^!rC&#{jfKbfd01p4`bFL$}^=`WhbQ2Ai8vLyoARu0Q~&l zdIDa1?L+X}|KTfe=k8mubN+Fd=PM5hF6jL2G6nHI&v0Z#iS>A;Ya0ZIjBiq{oLUXX zC`*tdejmZ+bOnz;ase)1nq_AFh;Y*|q36LDhtn}>lfXK8lBAzhHl`zZ=*mUd*}e&j z`2ox(yXyW;xYR1+#UNs=eU2Xx9SZLQWp(uGkBK`K;Kga4(OaWtbg0m*EVpwf)H@ji zEp2qT#kn{TA7Zw!L2vpE^T-4bRvK~JReEZ9gz!A#I?s#h+F80YoX;sa6TGHMgp)nP zET3%TF&q4mSChTFqGy24gL^b-(<$|&Esnl%RyR`IF)mse9@W7z#FlchS&&1m7lO#U zjO!}SYeEy5-ywX>a2JRs?=KlY{gZ<&r-PPa?j=0539r6(1HS#8JMfYBpNGkKI^LLW zZtU*uUj6WgKlb!%uf6uI(P*^4TCEnfHEbyWMl_h&)vKFVe)?y=_~XyM@BKe^<>5y! zZftH%zxMU7!E3MIfX%J*FdlDUU;=X8scoLF(kX}%b0^VXWf7E+)P!FFWXO?>>4M@S z)yKdK&G(VG9>42KBNW?7h3~n>=e4@E_bl+Bz#qShzgs4!&V`&t_}B4xIMf77rwlO> z;cHB2W<7{;7e!8GE9G-TCh5%Lg&f!n>#S@L49KyCwq%&{=Z^S5g) z3XeMHLF*aEsPBcS@jdBGw5)PR5uk%nf{9UdjB`3EfFRfqH@oUe>Pzlkh4GPzsA~5|m*Co5i-KUa??n%3tDAuK>$4zfgT1lfT7yZKpvi=`c;j%g4+huWX1!mTC*vw++zJsx z`|DKh$U51-yT{OMixdItF!eQB5!W@r%I2N6w6Ik~SkIq@Af638D9;$bhm;C921*et z&ovmJLkW)2!g}^Ob(8V>B*z;{_t57sn=RqO-Uu$7L!U>4r?$cB06teW*gde)u`lwt z5=%B3m1@9B%My}5up2M4g6r(E_az6q_{YJxe^lMpybmgS7q(JDl-a?)%k z$#OqB&hS|r--W}wx8dmcZgyjzO{Y1p{NC0iTVyvjW-ytgy|RL%!y`C2Jcj*)W7xlY z3`fc5d^Cm0#tv+5@4;xa2h+)B4(4~9$?F0R?p%k-@-F=N$Df5?`};o%AADj5=8Gk4 zr12FqA8u)^og8ECk-vvy!df3BOw-;?N`S4&IN!5<{;@syr@#3r`0BT=!Jqu)4H(V$ zU^GsKwQ)`*h+YMrZs|BF-h-7{1CNsXC%4|(c|JVYhuz5%-uLulaBhzjFeEU$_(1Q0 zGN45R^)d1;IrL3d002Dv&;{7r-hj979Kdvw@8N43krqUSxhh8~=%m1{#8X^9dvy@r zix&QZ2Mt2B=@ zXj_d|_O)T@w_}-&!XwWoz};T&a_5J~Z|JjYkDKM|Ba@_nAy3O5v=aHr*!I%IYLg(A zPQJ7%NTawAg{HR8N{l|VWMv~6oAFr5N?p0GYG_7|U6<(J3^unf!mF>}gfD;XTkzo@ z{b*9!PIvb%?mYU~<1c*nv!DHm8#k_h`}cnD_ip{xZ~fMO&d<802f$==Jl=c!si&T~ zboHSpw|CBMrPR7#|K_W3?bZ-t_ ze=EQ&`V|WeXRP5x3a3?=3|=r3oI!fvxftdplBd?8@rSoycib$yN>vkO;81q&6(lVN z)iUkt(h=Rjae0kEDW^6F|9ps<1ClkeJQ`z5LI{K~NO$MQLCS*cW#HACg4pwcCFV&4 zSCfmpc4ljY07quV-?&2Jg%(fj^to3kSxvBofg(&x6wTgp17|_gAQMq6XnSmF$V<>5 zV!UO`la|gHYF%@1EnvalSk}#$@En=Oa8Q1o>^2esKm$7J==D6+IVLzN^>iLi#ECE}hgCL(;vHB4nMa7(qU z*R$~>H~=eFs45H0?;Nmo?9y$~Jmu;Z;UB_1j%gKM!-}6&mAzgJt*F5U|E|N&3VsF5 zIFKpDF-4`H{l1S5c&2teMGrG`Iy!sCf1x$Nn z3K!4M;NIaJmaF6!Fw4QqvNba+N;RFCmZTt9z;rUsZu`dvH{s^3R{`dC;nKMcc;U$l z@a!|s!xN8RfyhD2AsR}5bT}50<*~q-gxT`ckWEV5={aLSuF2 zuz}86T`DX*?H-m9is!w42|SG`V{AaZ(0-Ji30l%33;Ry?Aev)os03H8rH?7+HB1(> z3MCE9Zl6^K?@AKTEh{cYkm%WGcn51R5O1^=UufszEob!I7&f-{;QBkS!pq;j28YKV zfvw35W}Dly^XD%<^ym{$K6mNT)k_yHT$sJ|(n|-mKKc{@(-pwh=H|}M&ff0EXgnL; zxC8L**KWbByZf+vc`GML(M$P8xIl>XG+&uCYh;M)Kqf*LhM>_ni1=R-l7bxAJRmu; zCkbN)x%h!m%Ju5Yb&6GHoTL<}&Xp=7f6}gOPpx$7Yr?`=%@X3bX+x|MV2v@TuVdOCOL!9mm3f){-9XM(kVMUMW4J_R@_shHN%ET+tG!mm z#LM<$`^(XwSpjDN!AgsiRY4>Fdr+l6)Ax8TD}Y~hFfV7YcVp>C?GK<7^RS!7p8<{^ zQSQ6;{^%-w1aaNA+%=xUlV@m~VIMdpmL--HeLpkE1BiV7qyazfj<16h@fFG)&PBv6 zCIV-W(Wb0`1laU8#|%^ z$E#Ahf0NLj?$@V#{V8Jn{+(N}Jh~6NTT6KVQ|I8BCoaSDPoIYuo_iEN@Z3}I_~UzU zVGl2d@}3@rE7o|a0$_g*aO*a}YuE0>w_be}zW(wx_}bTR!na@8PjF8eunayE3EgIpcg|Zcr;sC*D0gL%Q z?Cx&B^Y42ccDE)lPiNz7(ar-cX`d$B0I&U}3+G^aYldDe65LGP-OCabNFv$0UfPwTTHvVZc$Twi0td#*zH{6-|}5c z=U`Nvr9mL8o(=@9G9YTK1ZkxXpMPV_;wi0S>O} z`LW(ts=|}Ui2!dNP3+?27L3y4CX6XGtKLfe7WQJSwYzG;`d|A->+&-qaP%O$T=Ti^ zLuo@x7oO?DTkH3e{~Pc}P3gs`mQw%7*!bFz1}p6(%G3t#GjkpyUNas*{z?lE+|)Ju z-0q=Kr&WP^sd$6LZ~S}Xtx(y+ZVm(1&NGKZ@0xVR3;7IdZ>==ZvWxi!I7mbMdrZv| zNVJ48;f1!IGX`eG`GtJ1eQSFoTNia*s$i?a>D?%?H>D%v>~@|!?XyK`lme!0!jC-n zB>dIaz799<@5A2aWtxAM{5ct3ZZ$>pAE&75i~F#e--g-ZE?m5@f{%XaaroOm`3d;+ zryhbQ9?G}YQJBfv+7%r0xC~lc=Kj?aBPmm^UKqiZi#zb~556Df@P2sf9e}@l=??s- zKl}^$^S}Hmy!`cR@ROhV6#Rpq|1|7OR{5&gMn1zNeYvZFLEYBiQBJ~ZoK@j7m%IR` zqY-RQN3c0r!cTqXDfq8neF1*=zkC~}J6kZ_*`QRSxL@;i6kgM;>{eS3#w|hxxm-Vt z{Zf3K#JZ$d4~yf29K+$tr5$+csdKP3#kI@X0jx({1y)1&zB7Xtt!kAYm2-$f@rCod zu(LJI=`Hgvv(|Z|ly&ThRTV3nrTDQjKYJzBd5V(dpHsE+mEhWZcw9n{n1c^ zuh=!OK3=RorgpK;t4=;30Tl5mE@V$lQ~w?6sFPd@Xh z&wl#zk3ae33zsfm+1)>0PQUt%Yw*sk1;BJSksi9^lyb%DVZrG5dI)6Fd_PdI22Dx= zMTotY?m97JKnInBBt>C08(cX83H2!m*l&(PsG)l4u8tGhc$m&jmWB7$A**j1MUMER z!hcomLw)M~@fvc)162yT_8YwSgl=i*R%-ihOd*V$@5Yo7Qk9{!V=NGoW2}vLM!r8d zhE+0o$jlKLx&tKZzve_%k^Ga$iik|NdSh`qSqTFL_yP6$5qJ+7UJ z-d|DD#CMqpSW?9vFAkQxe=K59ZxYLRr@Nv2%z)mU5q`Gv8cZIaMX*BD{66MA>OE#S zKpO2Gx!aB!b>=KFh#*CZ9V-q&;-}Ve!|N(dahP_tZuBz_VMDZwj$J;(45VJ#7=h)EaZp{ke-di4?K3$Pw>0o10KugijE^ zBqe%Mf*dSX@TreI3}5@H7vK;7>>IFH>;tS)EPz=~K{*;HzB&bH#5gy2RYQ?Q>Rz~D z)V~m4mFi;vZTvk)4aiEJ6aa8{X9FI8^gLX-gvyx1W!fVaete$mLZI$hYr}qU3IVTp zV04M%PeKDbI~%Z-f&r|u)!|5)J9!eyKIT+@#=BPVhcNPPoc7V{7>wbH$08B1lzI^eq#~yq3!i9@hc6RrsH{L#muf6;#+&=`^*gOxb6r6^Rutfbe z3}4(UR=BW5EFGd%sRzqyVSFEzv8)uwqR56fN$EQyN`%1FuX~{E_a!r>2gEar!}Dpcywl&MVYdu$ONfd}1lwkQ=VgzguP(t%gCLfI9nX=8h7;H;+G86yP>^Mh;HfZB zYoFDa>wc~XH7VCI@q96oYwf%^VY?7G>f;M+M6*N~*Oi7&itKGez9#~&0xK&NjTM@P zsSHLL5HL31+8fm|m_6h1OJC0RI!?8}tM-1lbv44*&ROw2)=7*qLQR#3x(X%=a1{O- zb_T{RXo;<-vgegJ2mI-jRqZ+2cBF-hR;SCl6x-?E^YyWmYhNF0x%U;%x$g{($HPQtvJxF zA6Xldb$Bsf!S>b|o_p?bIJdWv1Nfn$7KKKH(=rGD+nTQ6{_XF;>hK--$d5b(zxZ>X zhR^@_Q}Eogm*4_1%8M+N(7j@&*@hPAbuV($wYZ}`)xosSC8sp7MBN*$}OC+xO(GUpk$7{SHOF?{SpkHCu`eHQ-e%kRMQ z=oW16T+XigDUJdxj$uAOg5_ck^Th%d%Y{VuPm00Bha}}d%AzovZo+IfgVAW3d5!tP zT#XxHW`(1J+i>;54!rM~M`3GIMJ6P7yl!W+PtUTHXJ7Zk?iRpi%0)>6Oe)bJRnP>} z92!|L{jHV?-pN~6Ey~iK7-;er?t2!>vT`}o=?IT8#f>`XP*(u2xGjzq zKl8X&$24;F``8xT%Qkic<50rutZ))}m};|26_1I8G~RE>=CoIkWfL}bvBaHKPAh=T z&2w|E=Wou=~yERjZ%ru#*`O$6>cj4pnT z`j<9G?u4T*hQ0Pu_DJc5WlPreGnHB;CM@aSG2K$k+@O{~z1vq6_(*VO26p{2bgfE- z0@6NZf|%J8O3a@G_ctrPuUp*S5Nmc62CSk2tsR*$H3TnScdMT}Gib{4;3gqf;}+-x z;U84&H+DC#L3YznIX`*mU$LdvkaM5iYjb+MbfPWlzCUFH*h)E$T}+t?YGE1Sgy&e;&2 zcw`&?&KEuo-}vTl!}XhYU~>v^?_eKBi{osypNtoRWZW0~^cjgJ>Fy8g~Fy#D%4IGS(5?sN<0*`*^z ztsYga-KumkR+y@)#!r@AaqRvV3nE92bi0PMJfxYaT3uv=T8kX%xy|LG(&DNSB3niK z?5flKuKd0v*sVE5ZK|}8-**U5f#JcqqXI&6Myo~AUEe5*vGhvZC(l@$o)=$_~jw9~MG4kyi_blt`=HY4-l}_qcfaSC|?k=<452g(> z7kj*%(uyp97LFoDx#)WWLgNiFU+WlsgRt<|tz2SHHi*Bbly3>e@^hk&TaosvMJC@^fca^avZz-brF(V*pD)IxwaH{Spepg!=!7;uItNHPHnd_n>NKsk0$ET zv?C1qN=dEFyS!f`ynHRjdkAW}{zC%z`P~&f`tSwV*|`nJ$NMmzO<+7p@dA>8cpv76 zZ^7Qi9r(Ln_&EHt-~1eWT^l5$PNBpXDQAt9#ecW4!tI`sryXfif z1({=g3QOKA<+=0l(5nH1g_uB_%aw9I!eKo2Vd<)jZ)yJ;p?fw?0TEYl<@^*r{o-Tr zZyz4P&9~oz$$SIOrz;ja3%Gc03Rf;}!PQGUaOKK**xlYjh17VIQz9N59KrtmeYkaJ zAKt!w2=CmQ!>xOVx!vRW3XamX0+_jd*g3jV zmjXTZ;C2&@zOvJ_-WeFQs+h{2r!cC7t5ar!$wbcu)-Atx{h0Vq_*%2Wc)mo_>E^e= zqMp%l-Wn0hTT3;$aSxe1>w1}PP(z6~ETnn+9b4LI@|u;%$}T01cE4L!o=VKAK~rEn zz~eDqcnNlW5K9;l!JmM#lEl%Fo(QNeN0GQpocW*pI0WkVk|LR|*=NEQ%E?nK5ZEx>vZH?~V z2YB_`J-B-?2S~Y4M^jkLQ!dWr1rYQW=pW$#C<|8UuowVuM*GY#V>JPvK_bGcsiXOj z%X^cq9izE>kQRZu`w4EQvb&DMvqpcz>)AU_6~V6 zV5G#NoC6)O_k@p-nu^3P2y2UDA>TzBSk_>2;4*V}Cky;p_-7YXRVG=2%g6|yp#`Rd zWy57%gk?o~+0BT8VselylPE@U%!IV1nf`QHRfO7|Xpact!pUdYN4GG6YYu!w@eK%W zUPw}ARL+DE7R;%3$|arxGa7;%>3!Gr4P_Gg6*BC)rhnUaZB=sNUf0;)O~F8{Aay*& zgORT*5$~&RgO&F@uTn4=%#yoytkBqLC0;{tt$m~CP6bY9d9ezC*4{Sfq?QJ=N&^Tq zqPXCw-A*Cn3$K54oh;$hJ?}Q%>#u9ym+$oN6j0AIL$x+E#(`^s@uA`Bx&#G3gc#4E z_(&LeX4+NISY?;$NPqdh#K-eBnA= zzkL@rXPepWe+mn@fA0<0p52E3-9P$y_|?Dv6g+)(l9dLN6i_h53$So(%%c}SbTR%i zh2#aGf?0l&Vs+$LKS(2a&)XP6Q32B$V{;vbE^y(=0AlaPuC( zTW_!6{P|yg6TbQFm*IFhf^+9D!q&zFHfQ^A`2yto|0r)_5Wy^--dPNzx_6R_=PK@OM5fezds&NHa2D(8ylA&ee}sI zcV@HeDU^s^ra}Smg)e+z@;krtJ3GJl^FRN>M?U_sAHVv@!;kD;*xR^v0E<9$zvE!^ z?eDxXn&&JT>8>3MSs|*a(+-t_e6-NBz=gllg_@|HF{&KBGpK|JE%=yEH-3Wx9;Mcj zHdMH?n@8ypTP3|<=$SXW5#lVJVoS$i4s~NyJKot=wQl)D>sk%BgS&vj9~{+wTSbZ2 zXxTP65;6Ww;}K1njeEeGJbWW}z7?tSbDI;ooUzu&T;FH~lK1kRzpZPm4rIpFF;6uIOp~CN9K=aMW!ED!NfSRN`6rEsfl)-AZyxV{8T-Clg2XU)L+}Cb5gzB2nlQf#0kxf*JF;W;gt(I#$k)91TtWkHP`_qR^SO4jV*#Js z>x8M#a5DG5s6T9pMH{M_*8qR#kY*7M`N;E#>^f$z8r{=nAk|@Ih;nD>6|X|jwfiGa z!e`&H+d;i?OdEz_QRO8umpx3V9kQVa^iBG&S2S3rNKwTyD=kmcyQZZ?PuMR0*dq_Yg>zqr*WY>zcF$de&FL6!y!mywvb%!c_|>0* zfAII8gZE#hoB(;^-XS~|Lj}vmtXp8c<0r(;P~h!T-bRrr)<<)ZV~>9&zx}E zl41<~JlT%7O*M9ZRPLKmCp%;cXvu-hlCmhr5hFgMCdguYsyGwfG~*ge>Qmd67ZDeB zKPH9~8wD-;v%f_JgySX|7Yd(E(U02@tMen84!(4#q)!U`Z{c06MJrxesKeJ?BvXvp zL-e~uv1hzuj4Q@pl$02TZ?QZdU&rKte#~pdp;^!D2m>0i$Z*_$7VT6?QYgq}o#Hw& zyhm=IGTP!;C=qo={F?i_GIhc$#CKoSWyzuOE@B7%_{e{2x_22mq|I3^20PK%OqvI9b&nOfC zZ@u+a&H(V#bI(2V)YDIW@Z9+eSGM-HW^ccI4ZiitYdLVqWP(X$vTTh?m~x}ZK`kPa z33FSKlIzUps`a-9REXWv?j|8jE@ZoY@sS1~a-$?kr(3J{y;a=dRT>>DAx_MaWM^aj zf7|xWx@5${tX{-=jyhS39$q(*HxeKX!|Ea;)H_4cs!1m)?N~fxg1BUbf+Z?;=;jIw z2KS-+l{86C)69S4whZpDtoxBWQYtvHu;ccdv4(T{ATF7BWd(>drp$V6EqFbdQD->w z=Ysgcj^{HenpSKuN600sMuvkyZ0z-b-H`%8;{GzVYsiWxVCL*JMW}9Sk}FaNCmc!9 zwWF{dh(>Ix-izf*&`mvoKfxg9j*ivB?|43V%Nm#u0@PWscf(4&<2Sr`=GC-F|Fu^& z%wCC{&#Dp~+MOSMT3%gp&Lp)n6Z?wK+@lt}W4`AH8%xG9WkZWyLke2$6i&6KYJ8eBJ7|h~tM;D-9a;-fX|u;-rr+o~o>Mi#3N}V#_|Vf=VD$7AX(t6* zOjjWeiLUB}ptL7RaYaGwm;%lw01xks;L)9J_~_%?@R=6@Ui{Ei_@h7FfS3OIW%%Y- zzYJH-Lsl%<{j9v|NpbIcSF*DLx#44~@1y`QOh_TLVqHlmDb{vM0U!7!wyotSIXqCE ze@8h}rGBBS)~Tu>RUQ&OD#A$@)M)XI5hb`ESu(C-y?;jZDx)f-Eb5qF z%((e9d#=}v8}=*9pV}Y-RBZ4_Z^W^SG4fO}CFPqYnS29YdF>ipzi|^j@Z33=PBtcc zJLmTvdE}8FdH(&+zwqz>-GBJcbi?epF9_gxZ}0r(-rj}X>BdgJSohZ3ci=m(zXLGc z$u0+|G4jlVXHetd=`Xur@=u69ZgND607vyzfZ+GGudpJ0`RkqMg6b0F8?g;*eYTDd zMZPS2o~8R0x5I>`imRL}uTL}4I&7*ji>V6D9hiX#$&aC>p;O`8x6RRR%^1zua)vv; zgJ_U(YYe$wxF07BS4P5^ZX*SiqRAI?s_8TYzD}sGTfpp!@pD!rv_QLT!7-eN0>QdI z%M+=d2;?2X3K!9o^GaBECEL8Ua&=_6aL{U>9edUbd91jnYv(5oAgsEihyWK>YS^=3 z24sNMYNU0YM=cE*veCWP9VPROBB#jz(TL)`DyEs7`O{QGgE@HHlae$CP-|22Yq zJZC(X*8Hr1gA59vBjbtXbOydLolRrU7IR~+#=3nILvl)(OP`f?YS$n7zEz8%(m$rT zGMAwElfK;dQJJfKv1PtB_8RkMM(A83^HDVCRh)Bp|Gc{rWpAku$6ikpCPl};T4g~q zacR#yu?bH;ya|(4iaLJ{R!2AC3qSpF_$R;iX?XgfB}|qWGb06|=d&a!qAJRlh(j$c z@!m@^)PkPX1hnYYY5O~EIZLHk$%8Tc^IL-(47EzX=dcq=DYMFofO(25BpDBqa5F|m znv^iun&KZ$C#;^X$Z@28j?;RtRv-W^J}Ve&$QO$_qB2bPlC`)xUQ#>_nCGplQk|2R zpVJoK81qlj+v@{sF*iZ|<+&dS`zGlS?p8_y1E5dGLtVcoGXy!(j%{ zWGNJvg}h5r3LDxwMY=k6mt(gFVl1-vF=|ZYesu0ai6=7~xasJQMRKb)jELEDgp5hB zHNovHZE)`KatFD*V_qxnFtq9r6X3^BN2&83cZuxdSoArznXDt(3LEd)a3GRI+_JA3 zx)X{kESboe8I-lMfhwHLMDI*=c4pR4Ba09bFxx1@`5)RpoJ-R(kL77Nkz z+9>lJh%f)0@9(qF5#VUhvLHtVzlPOvSne?)CU zSvr+BMv#aCzc8f1)l#3)Uv#xbmV#j?*C`b%5Ibl*R=oZrUsXx_H+%4#FWC&CotU$! zLA`j4dA<3)fX8gMA`oVHZ$x5YHXJvpT%w-uwvZIxpF~;EofZ`VJ|0a3A0re}9G~>N z?lED;+}&+eZ=DW~ttLHoIzoYeMGwHN@>c^bpa8K)biJu@~g4%3TpX7d@qAK4!%OncO-A!V19+WMx=il7s+hFA4(B;HOt+4^RLt2rt-oV`U2P31rxj+Sl7pX7 z>p}P|g%fFmc*evdBz(@1`PH!E;{e%xf|ma%7*m_$5v1G|lO-AiQ?#xhd2$L*|JqN& zEbRwD-yHjg=b`vDD<_J;e>xG3*`Yxf-|dpOUYcXJ_9jh9!Z#@j2BLP_Q#ShpQ3ya4R^ecEc=``LOEj7EfMzl zns;IJFn=4xq~&Uv-(?vpDdw1?uriI4F-Oz^Us0f&fikZOP3C9ONjmd}nK@y3mg`&k zpzTReN@EC_0LHNq14R^Ese>$CCtRPey``8MDd6ZP+`N4VZ@hH~clVQ5z!X;V@pv+s zPBz9H8@sz3*>!)pT#k4Sg#zH<;KF2gHroXl?@VX2$!I(p-MRzt`nBWHojXUcb7=!c z;|`uH%S;zq$Dzq)VuzP|Qn53AMgi&4cP$GW1#JdtnsKcb)^;By>@9DGm+QVFND zZnP}w_0kVLRfhoa^wZ?K@tm~Z3&Or(_%dFx!_>7159zGmheukO{(Az3_^K?0z9sSTFrIDbE(6ADx@^ zvJfHO1?nUGlCnG*e5YrGV=fqG&aP=C`{~fq2j|**!7q(qb)Fbn{2?`bdqVxC0sUU^ zhwf-qh_dnyVQCdtI-JPZ*98?PkeGS+{i_*h%6XdEjMjs3OORA!lr`4%{H5^*;wwg8XRP~@nK@PzWm@V|_!{L1yW93$FZ1W3v|8giVD16?Jv=&w zqXh;=^K91H6fs)#j2m5>OM$o8e?eelB>?lJ2^C+M09?7afZdIKxN_+t{Kl_*9De#^ z4<{8ejFuBh@8|oEOs2FSJjdL#(dmTl`WY$PYAL}UWa(47>9hP_FL;D)YFHEHPi)Xj zR;-*rX_7gFc@pLpur(RO?iRA<$s0s+i^tsX4GVP~b&cwpO=9n#n^{=h4sDp-15!E`kQmDnUU2`vrY$TjQJyz=}3valQW_ctVM5ATbZ|% zxM*#`03HOgi@aFX+xN#fc;S0$Kp5paSN8{;qYkPZpFXxbE5HY$vEf-P&e zn31b|nbYC%=BW^=T!#$4+-&C6(*MY6K>OCY-`LJFxamH)GG{bbSqeoqsxdT8aVL#M zAygfrw3h;k2U}a%jEoo}EY3;4tnI>rxhvXa?+3wfM(D`eT_%2hR@krhWBcZD$~g#l zru>Rj?)=^u%)1Q%ituxv`En_FV^Fq*eBx8!nEZR!J|}pIfEJjp$}oD_Y)T)g5bY)e zwobt=nKeKnA7(?JGE?A!xHWJ_F(270gv>F%RK;4$i&A0UIq*yIswQ}!ww#1PZ@FWp z=Q%`~&Gj&nUeA@dB^*k#Ga)y`iT>4v~b>^Xq8}NybJ_En_#ZSZMKJg6fZYFPsWMQt#sKp#h zMJva7DZi}I$oTy_g5_3PS;lv~$u%KGs2z`TKWg?F!Qk%Un7b}=A7BEj471-+E zb;rE38!Je^yG50{SdQjN3BVTWay-bxdO}grPx)_17%gsW8+@c=(N|o?=12MB4q+fD zAgWc&teYq<1V2WlA9)2CxrOUBX$J8Y61%DzW1NEYxht0ZKOQd|EqDf2JThMi&&@F6 zSOq9M@Y14qi1j$2cYU9Fnv#F*F~qvMIz#i6PmBRcpeedHmx8N}08%w}*nUMwH`Bm? zcvik?kJ|G!6;G?|Z8m|)C`F~JamlGWqM_NVCZ$B5z+$uo*WNyWYu689oJ95UXuPwt zy><1Wt51LKbD#g{v(G;J2ss+%MtBw3C13_{bm_yNc=2OTJo(f|FJ8QKeq(cE`s(Yq z;M&`FV6u5Gr~i{6ReV4VP=_$}ydccPsKtyo5WD>tt3HuCbPH#RMl~SufN(pkX>zid zW%_Bc^f;8I&al^(#6E~SejoyNopm4?yMbI+M)Ou1WT6!C)*pvCt)(YF)4MlTBN~*o z@{L%J=uy@@(g9(aNSS=LRL96_EC}fDI6rg8hxd!~kSH-u-TGfStTjec_M}JN4i4E; zu5IK)Y;$#UJ^_j}ubKRbJXo3LWM) zW&bFW#{2Chvm=a9@+3<^8jaQ8!J~t?W!Q>lT_=dYu{$fD7bi`cy=3Mh2%dh#E5b7H z2p6k;wqwq76$YAdkRjB(mQE?jZs0h?7&K96hFJ&8?r~q<2(9?$b zrKMSaekMm#tr(uc)ZY=0s-RNzDcK8x^_}UhLDRBU1Rq54CK#0?f$Z%;$4}Y~KUCN5 z4GVE)zVO*}I)$vJ*vEpiF)rC>_8-$?(v)*qrXb7pg8~MpMD&E z^H;wJzy6Cq4VQK{^4-qOlwV#Yo5HfyvU;H1=VQ?}@dn=`}+3QNj3;G%j3u-`hEUzP>mfy7Wgc=a|%DJ=^cz)&mcs`Sixgx(< z2b5lw!szeuyeQtVCG%=@pxLm*^A$rK)6wXyqRk@JG}nU^y;?-A|KKa?*YG&lWV~`s zYfX&2p(sWU^iy?4#vvt>CJi2}{DI1nRfJ7N<-oeIUAy#e7Ty^z z3muJLcr&URlIZVjk5g~H%&^7F)9m7cXAg-r2o4oz7;di|@SpCcO3bJ=ombOPOC`nNoM~ zOw7IV^poxhC(Q-BIP1XueL9?gWlD6>hY%CKa+1oj5mYNOH+V42cpKwew=~DBIq^Eb zOF|;w3%Boz=B(?aaSIcsS=^C~iw)n0F@6_K?lqZ+@v=Ie|A5^14!S%r`e4Ov&R9s_>`#Rz&cGbbiu&%Co5QTNCFtTYG)pd%GS+a7MjIt;zOv$dF z>2@34!Ax%6HiiL4?PtV}_rjTwp({>`TR>Jga!Kd0Vy;<3Kulic8Y9npiubu}n^BB1 z-@V^bJP+NYMpZGOP~au@!MLbQh+dI7L?Qx%bs@$opH ze`i5b1eM?dj%O8_a#Sov+^(*etRz;tQjWhir<0T}#xB0Ib318~JrwqFYYf6zUvH%K7kr7t(<6)L7Rl39x0F4rO4Vuf_m#0C@lN&%pD~J_8#Y9PH1w%?juG ze)dZG`nk6Bqop{Af7|mJ+v+=8>+JoZyx=CuPeP@-|_r~$>vDFGkaI(8hz`2miVr2*5G)*2A-l?O)Hp|2X932x*Tm`tY|n_H9dWOID9Si$SpZosYEhcMZ^0!wo1kQi?itWK0^Sr9TR zm{eRI6V!5w>jE82X0jbfa!%qX1R7?MHGd?O7{1egBLnn@FALP9Vl8tV8>DUyM-&=) z@_l5@5^7#l7Si~@_m+xh04qJ1F|xsy5Q)~>H375izG6$i5qz)>%8H$XY8Y!w-i0gI zm#mjW0JWL`gTxKOWGkvFWb9ZmM=9NNka40Wk%PT5EjB*l&;2b4)V7z#0rN6X%?wd+b_H8?0gr!m_+=aQ>C zV`=lfMM56Gpm5H&d?NC(XR4#vbbu0=(DaEoq@BqFm38SibCn@0rz~M*7Qw7yO%P&Y zYa9X4W5WcBCsL^Nw_xF$B{{2HE{5y`&{r5yAFw_>N zd~kVxt7U>HvSTO%{ov*eJrL#93SfISMu$!5*Sg_)eqbGCR!ivZ`nJWmw}j~-3Wct6 zmcqYnucjEWXQoT|Zwd256$Y|5qW~GlO1Q?OoR+9y1YAXVrdS^20Tw$n=?eQzHydx= zz7O~AALsL$cu9SWmD43vMHO+MaqJKDNK`(YuK+ZPjRzKDP`UQa-S1*rvbI!F_%60M zR{~*I&Xn{PBrjknuh> zE2((G_JLjqiMDXeHs&GScocz)=V^wg2}o%4G3J3GV#%1coSXH}JcZw(d@5c`&t3yoemQY5q9wT!ENz?bkEygepgjxCzIE;6ct2<6W&v=?PqBg^{79 zOBk&e1&DF1ZMv%Q7gi|B*#KJCjZNkOZZiFgt5v!mRfe_J9QZE_xeEI2g{ue_HQ{R= zCMXc&e2+CNXY}r$_E(O% zx21~B2Esxb#a(LU;7pwrtKsY7Rg z1vpy8+&ez^DbcaKqqUGryAv2qW^iyghdcL<;ZSO{aLVb=i)UC<)*Opnz0w$atP3-4 zR0jOx%up_KjBPd$u(t!&wRFYMgIM?)<=XrGyQg&VT<=90dbV5RKGA9z51e?GhQNmv zcJF2p-j@DOC*+-*x8VN$BlG~sazu~;-1Vz2`?WEmSxi`ggJpG9Nm9C7S6$941E6R; z%JJGIaY9fd-hqw{DbrEovd!9qIPP!qHH?J+4jUcI-ID3G*cu>A}AZ|Py;H(ef zP=Dpq;RK=eY>4)~KA=+LXGEm6i{mQ{Ldo{WQHni`^IeO&^@U%HdEn@+_+ftJ0>6cMv=#4%eSiL?ET`%EU4YeC|woD>aX~wRdB^*oS8kTE)B2ipP%3shp>EIFoH<@~?7x zqVaE7u)S4BJq{wC@mQ|5=V)EytWpHyd}V~&)z<7DXCC8>4PqUo?P6-JfYBnR{8jzT zvI3=!KP+zXG^PIt^EWIp>YCweLx0T9>um9if!(b*9%}ioyr%#_w)9(ZbFI#L{7&3a znRbWvtJWrVleJ@JOOiclEu8{e)amc+(i;1vWz6P;tN>WRt-EvBUjWP~bjon*e8Lit zVKf5BcnK#BvCu0np;WSAorbI#k42P+mGAnj^DRqvU%%^kAN192S=>)s`sO}lo_*if z=IBmthakk>AO584Zf=f)t(h@>a<7NhgDI)kq_;}Pak*H*_3O8?2f%c;odpv#92%Jc z%}j)w%J!VHutK9cncqqVu=s6kldt`_YGGZvAUl-z6r4=>WF4Nh>WxzwP~Q$vV|l&r zrqPS(sjQ(k=HXmEFMc`s)n%ZUTWiiZez8 zvWU)!Rzl`^ktx^j@y-bW*a}4jlc`LfGq%y)cDV;H@c>e+0+Z0OgGq~;tK4QDhmS<9 z71m2DP#&;|c-ZZaes>ngcDrr^8`oXwlVF{RmJNKyzmIcJ+Pu~rn8>i_;`x!+WlUCW zUS@M|TA@c*LAYNLqJ80anr+TxBgHmCK3vZdc{-)rM3MQO`4V)uP6D?1=K9f0474%tfvT3#Ux$=t?0oUw&TsG@xJAXbOkN0JrZg;NE?JbLTL7jo$Z( z(4jdMhqP46%kK{Qrfwm~smB!mUG9+*j$+B7aiKpF3gupSmdjl={kU&51;cyy_JWya&2o*XD-X!@$(piKaM;E3Q;V3 z&_t|U7e1#46o8GdiMn@9_*8z&w>6Vd6@3fFlaPphaA}R966+<@Q`x5MRG!$YaBQ)b zK*YMQqvwY$=^98LheUz50}@|9`j!Jl;@WUd6(j|omUDvX5C|Ad;GnBZi%l( z!9)<5Z^-pO2X9M)K+hEH`0#-ut16S#7_Y6QdUdxR=n)+#m3D&84;dna8%MF~AC#+PYYm&A5Mg zzsYqBYfY_LkHYw@RV01Sf`q`#B4NHNZ13Wak`OtkbH?}05Qa{}-cp7Yd)cR{5gmbf zX4}>^H;jJ>bW{A@QAC(mKsgxYw0oJKAfeKv%&~jP!q6!X^ShWLt&5OW#+y4%{xd$% zrxU>J-ff;I`)#+Ss>ZONw(wfUHD{#~!%h`?W-ku0Y;$^y+*x@R<5<$8e0@vKn8M%U zecOiWq=GQn5tNDhtEX}G=ccbPvsJIld$B%eH()y_f|*`RX^*E=I+X7*)(bJ^A!CJp zhvy0NR^zhSwPu>Y%1^$tt_)(Ge%IiP@h2<}G5amA!3>r#g*$gfaO+meo!*|ag-_qv zX)|Q~j@%w6mI1wrW|vkS(Yv-&c$76tYyZcwM<)8D{k6sr%Mku(U0$lzZx^15 zw72%G1q-`Q0$&QQJ9J*f_Z^0+vs#O@C^-WVv6%Da3U1uI2lo$`Fqv)Dop*55EMG$llM&Yi?DB@*=ef4V>Kdfe0YuSg}HRWLgXkIWm$dyU=H7T{dx+zIhsyqqwSr&%_~Syzxg*w-2^}>0j3W>{P2}$pL+I3&tJa$_}1>;#xX2Muf260 z?jIe)cs9$HV7d3tHqD%095rDQrL1G2@R13;5UP0noc++$2#3=5lNb(K5HWUF5GVDI z3{SV8sU@;*9N`YrNr_MkDYW@Nld>W{FUCD=Jos(0vYAFjXjEY`B86OywR7@~ixd}B ztG-W_)vF0i%Th^k#fnRpbew5iOcG#!|+ z_>4f(wigjWVdTz?IiFun)mY5C)>K>Dq~A*#FFytpXiH(ec7HiufU~YzelP>hi5aF= z#yr|?{K>j+y-(;lpD{lts$g)L^hNO_8-S`0G@Ow7NoeCI@vIt1@Q3gOmeG&jwf70* z#CjhNS6A>C7S5$h-&E>2njz?h-DZ0xXTscD2C&^*qnX;B^@<>(XVX6C?`l~Aa17`I z&Mia$wD*y=#Y&hCe8(O^qBwDfmW2Fp?~)I(q=1sqVtbZ;nC3(=$PZ#1UE8f$8~0Xl z4Xu;xr3p+XTX6T@3a-C1&umB?LVTBVI9+TsW0GFmIr18>*S_uxQj%C0+HMQFYj%ll^oiUwt=~ez1MORYD-Mv48 zcW&KBMlO%nfOAZU3EP41YUek1JSrQRAhjo_-~d5l{HZut`vS zk}vVF8}gwPf`I?Kd#$WeRx?C-b$X*8OBR?9v3)V`Sq#_0od3hT1AA0!omG!~<(}1K zPHuy|XZdFpE?(SZ^{OIFP{OHq9Kl@}d_+P(%Ju3iYA5SJb)1963+q2om z223WS{lf)Zd+R0~&Xd+|15k0o3;{D3Rs&+E6xYNs%>vwjDaF%I@8xEItc-i7N>^+^VcnNq?5cvhA61Ji9*9 zD8tlgpPdL`awr%rrqnb0SoXU;PUftMawfl@xcs*q;4Z>a`oIU}y9VTBI80Dk>0maH zTDsZ8!nSCH7f~ohp|B&Jr5#I%4`HE-Yheh2C}+4n{n$0*{>;!6%#5VMmdUVgTotn8 z2=Fci#@2nqwBPF6m>ECIWj}8G}<$~ z{5^UIAbr3$(K_O+D!g7yW9;7Jy%^|LaR%fX3DdcJX$GdV9k_k(2wr{TX692cXsw5X zXEoLo(&Mu9;GIZzfJbLhT=fd4wk$G{)1B0C6NA_AY9+g532UUhe6?5CQ?C0)KpQ+RR9_UujMp48 zbV_5x-l(Nfa9o3?REk|=tJKi_MILROT>yCMN(S{{;lUfp}eUaly) z{QJ<6(0`ssN+k|3o=)L-zJ%-V+<|-d7cfugWITb%bTZxD-P_vQ-N|`4pMCaO4FZ_T zc)T31R;k`>oQ(6g?kwQVx9`C59AIN>Guze^v6aY(^j$v8hRIf-`q4|s2(gy2V5Cs2 zxd!q9$Hl??i#F0T6I>P$^Yfhcp&l?IedAn^3P1(W75w>qLVGg+3`aU7`KxMmqR!`0eoWnL*C2S$@P}^ zVt!Y@NM40q{5|%;il;1~62f3mTV}57?z0^~rXitqTN%cg$DfrN`7H)Y2}+)PFG=P; z@*3NYoXoNh=skxGiEzbx=YEe2+0T6LnE5XVGHwu%R$5T-&H)S;9tF+|T<(SZ zgfl1D*Ew?o=O;%OKY=@20wtz~Pie<{y2Y?rLc_oCN#d*#L#f z3n7qGv*q{~bG$ogt~=qs3z%-~!p+-<@a^xs0msYB014j^oN#VXP04qnlJ8>H^S>AK z>exfBjwt?0i>G za-je5Xq5vjY;SL`L;-OA{P{^Li5;0vXRw$9+`6-bTleNLpU+@(JT=xX6`W-Q8I=kK z5hCKB7eLq23a05vX3R<8be0hb#<0SSAz2tx^@)w7o*4oPy5J02M!?nQ^gU~Rs4z0J zi)7o887zk#=;~&xFkH4zA8d|)hq`bjj2uPP%*YDs8h%WbBD8VERi6TKSW#h|18LD_ zCpHB^X6*kAT{ zS!)@yA;KNt@&u_C6s_FTjtP?UP09|2Q|J=|e(D(z0myi17iXH31W}WRUI*%#gu*}X zO@#}wSA^J2svvRxQ0CmjggbI#I_5aG-&uh#MujVsjf6Lg3=lZ+=-!O*=3FeqE}63t zOY2PZo=Iz_sH#;%KX#hda*+exFu|hTZkb@VTCkE4QJbI4ILv2B`g#X8JefRZ3BQ?scxv=VDSEU^6bf5)Vu^c$WQF271dmBzB(O1S zm$S-50Z}ju3Nmyx%_@g#0&Y!F+b2NQ=JQ^Z+8ClDCJF;lm~RQ=t-f0G?-H#0l$~Da zSLT2jdB>X?uR^SYIDg1E&Z?ZKkI@RIFv^ktUw-9{?EXI)@1SsxoLcB3#mPw+0E2VW zEf#uNjL3w{G&q|AjcRaGGaL$FtKqv8pQ%g|*4xl{vGwqC#?|zU4L3Dqk{yc0k=4Cw zaFu8On8z|t$ZLXySym3mZ~R_Xx}$qa>5A~wRv8&^x?O|XIav^Yj9!l@oUlycg7ZeU zlkr-}?56Tz{VZl##mHVNFte9zSw`e(fV4-I+ake`Tq?#>z12_|1FeDM`=p|wKUNSh zJhBab&qabz3){>+!FYwT8N$fWj)dd#6`LvCJ2-+Hx0jG^-E1;1yIPIMk?8^-(l z`=fFC;H8&d8r{Bqdj<>G9F0;6zzG~30o=T~goA^$$!6J?C*S{OcT>s{uG=6Uwi?il zR<;(&(J*NCA>PSZ(ofkiyBE6!kqDLMz}tgn1c1KMC$z4mscU?%){0iH?D&!V$3E!) zh8Svp2U<5zR>(A%9kDzMGuY@`+|~Kr888r5IBulVz97~cFV3wl1_ z9`|4E(=wo8(|Wnm`Jc7NXAybjnJZCwV!kQhLeaKc!cKcM;Yo z`Wyr<6^rX?AIez@vvjcz_`fw;5{Pi+He+k##giKIFD=LW{#|hCxIUry7Ai2R4HFgX z>lS4;e6Ub_W~~hUc*y=@6>Rv6JuIqBcHf%0JB((?v$eM2-r(Sbrc!3QMzFE51NRT- z@Yucy0ug+}q!WZ@m0U&QHFvxt(*8s}U@& zkDaIaVf^F}h(?7M0m^2TCQwN$@yeDo*0ILfnyvHmGKMPeP7C3<|JK4>HQAhBMOjHK z=)UjRkTIRM`NytF8v$JTtiS_?Su&k&pI6WC`|dnn%+FNxGq|7=v5b^HnyZyctNMA> zs@C6lzY5)|#>oq^m(>`DVvTxg15M+c08BRE;5c~!9AyQ-giQV8$z-%#t~U4gVdKV) z8n7i5FW=(g^9-yiL&FN(aB`hON-AFPs8!Fp~6B(#KKj z7wUCx+IaW}Qofe^AHUTB*Xo0$IfmS^+2Gp z_W6W67`1ScGLyo%8=*rfGVLEL2d?T&l{|C%l6w=B5MVHzeA?6D1n$V6cfi!`U1PbA zAkr;U&4Ak|I6<+F(-nr!Iaye*Sx&3Wq*er84*R%ZoOo5j78ViR8Mafg=R}x2@)ig% zRcpCP2p{{4>D@XO#o<;tJHty2s&#>*e5WuI77RV)daR7CQCKCZS{xPLy$oKJF>BDC z)*+x;m={{{E7RgpasGAJtNw@+t1e+So5FHAg16tf4{y9Rho>%2V4BjxW?RMSETo0S zm`A$SQHd^_77F%XntNj$b&EZ2ZrSrzMyV=eE3~eoyt|44JEyp>T4!dM&>rDed*1r4 z^{oA!@jPpe$Nn`wg~Ij0tj{n*K;zpS`5%A3b$1`W@vYb3XfcA>*0yBdDZKV5`K1ba zc8yG3L=vj>vcc>9e{?kVmQD5oXrGgEuJPW!k$HM>a35Y4W0IH1JHIK~sBk|l8##f} z@bA^)Tmr%)M!K%6TKq1ZSLTN^0@k&2yo(ibwaKy__p%L}Dy%C5EU^j~+83!bk#Gs` z@Y=~%?yvBfqvs+!8+IiOv|x$CdSN`AL=BTtdxQUcP$u@!h?h&HY0dU4Q4! z=y;LH=S1AgSv!&zHo0=7GdhL|j8l*+VoJoqAKcb>g6T$XnnKp+llnsWGZUaGbG*#7 zB-gD;8yUwtZ4`Jb2jAjmj70&x3eb}wBDy$cVO%v(W!ZmRSWZFKs8dUG#7d4@Rc7iX zKn&+p7K^7J6mB{RX%<_PyzN=$Pd{{(f)dL~pIj%WbP1`+EYlsIqqm6BkkTEh8Zi;= zniZVm`D57U`(cVWEJKjoj__JSEm(*$NjaNAx`P&A!wNcdD4|qwVj0J_IJi_4I5?o> zBx&F1vXI?RGOjGZ;S~ne2&$)wzhk7S>jW+Xhy%ksuDR3jhV*`*9a6xaemZ7O`s z9XSc?Wuwbd|I!Veb50E-!Qeth1^&s4;A0y&?Qc+++Dr@?=TOdC{9ze_+I9k_5xjCF zsz-G3H@G=24@h~VpHCZC^`*haW{ayAZ;aJ9-OAVUu!?cyd*2myhmgq6=La?F7#;T@m7X)sUYWSkSnTo4T5VV}V zcBp{t=M`OsrAa<3VGl;U<8WZ*E+VE3^?@+czv$-fajHFwwLoFAQbhnsv;WMuY&~N| zNrF*UQZkKm2+kebWb8+7pOQ@`pE<0LupBjAo3T`Pq59PV=MPc6cgFt7i zQ2rtQL~=(r_FC>c1O)VZrQAnDh5x=%&bcv5Jx z(fx&tKH_A?`4q)oKx%NFRqxyNPcTb#E&Vnj!xxbRq5hJ}I{jhxaH^W)MOFL*Xgt=N zu&XdVv2>+I&!yzJTya+*;FwO=aB!{__?q0D^)caq;`!R2&L87QAncj%9m{owEPx14 zjx@o1q@8L$Y}S{BkvhH?QA>d-o199Zh%pFI>EQ>Dl+a?-QT-iBEleb8-04 z^r43yN}tZIUVZ5Dm4_dGY-eY0cY9}ZeE-eERf-~*^6O3}8yV>Nkmg)~y7_9rbO$5^ ze86WafU2fyn8sCv`2450UPSG8vyIC08iDPaS6}I?YTLr@x;J!dY;7W**&m-ig##m| zwj_!v-Qx-3tR166RBpXA7>bp6gi&OM&@k=4}0Z2gyd| z`@|+xhYs^_%+Iud^>BJlyYY zPezZNHTt1oJi4vTy|U_HNHZL+@kHjj?1r@^y#E$PC}-=Y6%w;b+6iOKxN-9sIFQDp zD2Eg}b>_)gFw-?94yM+M`cHSAYi$(TWg*z!ZQGqgdmbwIR$wKQA&{_#RX86JAIea2 zmA2sE&RAv7vY^Rr#P;w{8km8MwF)w>@#1l1o@*AnAM9LWoy-Jew@_0r?5D1CQZRiS zh>{qGS_~Op6Q5zEJ(pJh9yb0?W%(`N5mi-7Dpn!t3^%m4h*JaWCUiN*4YER(9hv@% zLA@;Q)xrwFbj}ycl>TT74v!DuOMm?h`0S5efGdygVP8EdV(ai}mmxx?*5kdwGpg}6 z%AmH!A~9PU0g7`!mcDoJI`-SRAJ;8sp+qR#Q--%j^DOh-sxxG~L-@QX{MKN9)-b3Q z?V}5~z`I%^&Cqe+@9EgxIs$n0wH4gDy#UzQ$N>OX$JrIRisP_dOFNCgEciCyC5lHf zWIrpNts8kGe`@i$Yma`d$D6>Ox?$(*#NdC$_)XS=?7>hOw~Ub{X4|m*Ld_^BS1S!4 zDxR7Od{w|_LEQdbp23JGd0vvX+w$G#Ig*5<{_mmhxQ;fEgD*qLt0DchLMrW>=3*BO13(f@3=gw97qD~E-YwX*#R)aA_px5*>WG_v|W4LyG4ljS_ z7A#;3#^X&)K`i_t;RUL%)>(RA=|lC{o}Y7r~Wld@?DOVyM#i_Vec5|`(=MZ_v z)o5SwFF&$MHo3BD=$qMFqimF%!0kKxaDV@Z0{@O-GMAN)_1nI5onm{E=2 z5z~nl?h4cGhRXAbP1j>9lp0fe7}qa_LWr6|O{fo^Bi;a^c;zi=QJq4G8GdeD$DP|} z%8_Md^=weVhQyyTa*b9w{Dv`aYn_Z`(2Q%<_|)NoW}Civ6ib3~{>2I>fdKHic3R{TtVUHh)wKR2idkf(D`R8|$gT3=>CP z?;dw;J#l#CO3qcRi=P=&6)O~dhO^Nitiv!($v7jtu(nv=CB}&!RXKys`#^yv%9;Vp zvDf1hVj)G8UIEhdfa`krcqN8~AL9{a8JjILV{17yRthiz4)~$48HTmTkyv9IV^ru71D0!&~>>eM66SW(B7y}>FQ*t+&aVn z&^5L`tL^E_`t8^;mDarO_8x@wy=nFB?f)#sG6dHoym}M9`i<9MJUa*D$(DS_R%Dgk_?iqEV1!|arG~Z2wX(`-CE5C|;_n)6@xq<` zJqrBZ!?~ag%~fJrp?_O?R1-M;f9+^%e@T0CUA8V!S@B%nNJuvW3#*tRgM-DxO+i;a zW4JJpnL^{O{g7 zf;)HjVKh#fyOaWu?x#`eu2D`H*v`|=WH(tcF94{bVJ%&Ia#$b3q?*gJyrBo; z$!-_2HWM7(JJdCjg*HrCl$WpJGKh6`ki3mihV9li_qyx_r3A&BmB(N(Pmy9zKIvbB4b$C2AzCif?bw_%h+0{aSsRCm8Kd!JIC zS@~AxA*s*W0*{*yy~eqa0;OV!?LK!amr879&p?*K>U~EhqZV|Mg(Ua9ret#k@ueu1 zcuwYbtQCV)@)+cSfoq8)dhrIG1Dk5fuWiNJVp5aZ^Qe2Jv%Ai5As^DdU(I!FJ9b?0 znXhMsTY4t6l?keP$P~GTB|V+BOz9m_wrG_K%rcmgj6vEQM!=MjF>aIbeLi!34P{IX zi*bewc^c)|4ECA>kGaB}wPCF|m#bLXr`}fSn&DDXa0-fS2^-m~2kHN8ya6zo!L2)U z`0BUj@WzV(S9cZ0_Nq>;&7rhu$Qe3K{j(}1U!y|Ddo`xM@?ew_ryIvf-glLuuwTCq zi_gX<9vjn@lYLL|J&1Gq_G@p#*S~oUCew2;nr@PNf3i**IM_Sra&<23-Bk;J+Bq9s zM!$A@Iq8^(C{((XW|rQm0PV-rx-!sLO8i;j1t~5-Gz3UL27onPfaBf7b6c&-;@Lpo z@RjgBnjC2n5e?yEte1ETCQ-@8e4@xSi3iV~yG%jsxA={cy9O_}(m=C19*sX!<9FSf zb76y>xn8+WslwCjBjJ$?-pKHbS%Hx<_iezf+c)6$?L(N)Q{^cI3Dn{h0Ga8Zz~M2# z?YqbM8UT!U(uExo;wi#8-HR4`qG>S)5@G=-1?X_XIRctf&53p=M=!*-RP>exbDN9h zLISN}unIyF8fi-1V>lp7$6d*q(7%pwYU?3WY!NO~Su1Lz#ky>RhMyuU(V(Mn&cE9} zR4MJ~7UV3YM6QRliTcNKzkc-LviEwjqQ^`!8#B(>IwGQ7&l$GJlugmf=Bx zVM-w)=4Gujn6s)=uY;BsXzlr(v`3 z%=;w|KWPBdx0Z-n7qoD{EYE{sWZ;^WDa^>HTsGsm!weX@IO;VDMKY?}Wv z+=nNkjN5<|RY7T^g03p0iWO)O^g>yauIuFd)%H9qQRX(%;l-}%u^5VCX@pgriPFu_ zyVx73%BMQqCn_*AUQ5DsYM=IyDC6@TPGbRLelN^DU9rk4Hdc;WhK-P-(jj`6j~FV_ zk^w-Ns=Q}?%n8QIa_eZ-%HwVK3yK#4IU)qv!*09$|-BN}qTw3+2xU1v4p|Fc>I^|fS zUAtyox^)xjTo$!v%~-sn!Gq zd6FDf*d64|}99+{o{5lC8vOrfPS%w0ajCIFyHV1{m3l%>oY z|6ufTW+3UH&>GqMHbaVsY5TkQ*1_8HiIsI=A|iW?#uynmhjbSlq1Hrz4a{9!8#i7f zTwqjdhPi6vEU5AKfH=Zh<_Ow$zqq^bw$T!JtSw|>A7Po9cDolGZf@LNtegjpk6`wc z>8D;4*(+|~*ak5ow88{s{}y>w3TeNo_MQa2ocOm~SHH%@z+{xDc*^za_K1J3f7hb& z7R&G2!vH+p!AkkP|EX5*$5Tr21Xnnm5$9xH6<#LNr%@O=293p2Hk>!NT^F+4C@zmCZs8=b2c>{|P;K7>-3j7o~Em|(aV^kjL# z^e*3rxB3S8Z@>bUc5{{qrn`AjZ59t}+0nji8}?K-F}nx?^*A?v-5DQXgm2E|kpcmZ zrrR*vz5;*!l~>@aUw=LGgNQj)Nm=cliCATDeKgF{;~{jQR^R>|>-YWL*PiDi*0Vl- zHJP(wX09esaD7_{OUT@XD*VbNav4 zcoSBmnV=B<#`R2eP1;mVy%|rXUvrn-vp>prkSy-6f?B>g;|3c`r+wz^@9{jL0!R%? zweweNxAm-qb3Fgb%gM7UFM>uO3Cw4Mm=$MhM=R! z!`Jv3He7gGT)~-zabzU*OWBU*RWU9xKcKEvSO+snuofuL#R4MnAfV;V@#l69=^tU0 zN*tqe#15^Ceuk0^mE#sQD$phAvQZQm!R09!{9Oh~!t<0D~F7#s@>Sb{yHIgWkyg(2GmaKzzTZg>w zn^x766WLN&q86*%rDtk2rVt8GZd56-ufQ zh|^^LQuc@*wv1FQf%X~zWYVKBZPI8&>x~>FH=Y!!pAa~w0nCgiUqkRim3AtKl!aA% z<>SOt!WEq|Yd7iY2I^dqlJT=RZcev?X|@h zo(x0rg{Drbw-=OMeXaH3I!Q04f9rFPeQ9{Tj&CSXn=nI``Ctzv+pGgmRNS)GME8zZ zjx3Qb=ITf9n768srCAL+;p$RDt}AT$tRyo2;woBDb{dP5z>XOqJ9lOl*;bbso01Xt zK;e$qvTvepyFn1{mF2*-5pNjId|}cWIa$6qLG3B19l|Dgw9VWh2zE_3x2VLrlv+e+X>$Z2&GQ>mS!Iv5> z8Tu@hx=_fU*w{AQisglq5-x{98Uy^rm%a_(di8CXZJp2A#F7g#;srj1K2uEOHwf3*To1LgfXSM;)>+hT$R}vzrQk=9yT+TLC0_ zLWG}d``5}Nm_M6vuJ6yYy81tCzf|bTcRYYfsTuD?X+yl1tU0Hz4F=(w!Jq`~r~)us z-}A^iB?>|-UTzEvm2YHcn!O_=F7PiR*I2$%8m4O5P_GMK$Qe>SdB{y*u^PecyZ7Mk zy>v~2VK|1xVm>=QKHi$XcIVE{`#C2`FQ)1?b*XOqcu3X(;ho z$~l@iLmNGxJkT(U18#YY24L^>O0;c%&!o18#FCv{@$-G!#E_ypEeGI3nZ=(G)-L8N z33=Z$e9_6DA(uy<5jfA$APw59qLDN)^5pEXYraO-FzMvXJZ#njr_D}tVIOQS+#{4y za5Lj#7T}|8={n&VGS^u0-9fATp&YV=L>bZIH5)x|d0hoAL2#5*h1$2A+YsSax-#R> zHywkr#1^Yu;yyXwYn#(xVv**}`%*0)@HPN(rfvO*9O5W^TyUo$k?Og`ctXXWW?-`gXrF zZ_PZGWjuJFIL`n*lUzSDJ7m$rD}QDdw0Che*fUK%0TI^`kH9g5Xh6AcM(9DRF#qH^ zTGGh)Q4gR~n<6X{zCy-pnWC4BHnPj(*S~oO{^lD;@X;4GU^BsQ0WeL5559(!wX|HyN+FJ z`0l~E)=#5vcV9{#njhtLERA8_&i8;gBb~oRy6QIp*gpdJvoC!GUVY;R?Cd^~Ba$lu zVV*?TUvV`@-jkKWc>T9ElVZ(+4HBc^t5Ttm1I5_Gk|NolC7AeEx&e)$N0a|JJYk;*b5v`(OCvr7Kr1ZEkGL?%Yd}0}pZ}!4v>6 zX%f;-%mP^!mNXDhLEHjEzf4q@v?OlO5wVzeev0XH1-;$;%EhQ)Bn)(qMmTP|$XE~g zRvC4-2b$mY6-Ip4CDvV|u!kbJqc;1rQA-)oMBzs6)nfbTrfvg1Y2RpdCUj=3@~maB z40D0l8qAI=B~(L}E!^n$$PFPte1_|Tgp-7WO0-c{^x$n86iV%WZm*Nh z&*pk(fliryd#-KZw3;g_-RBPLRl84F5afJbXjh8-$jTXlg&_d)9krhVj^%erFla<@ zX9l7e$AELK0(lgANQsg6xA!h^drD$`c$n4|C~B2xowwTGUBX0GK1o1R#wkps1RKj3 z6QRewWtA%;jaGA-`~Fp#$>6ng!tE1@X>nSCfcLyv9#Lv2UgLS8TRh$OEsmun@|vN< zDd((ZD2_yeDv-fp^mFHP?wvFTDId{-ZNw1Zz zQDHm~Za=G>N#ViwC+!>suM7TDxcPBtAgJ_yGD>lbHeh?_0=)d{JMc$;_BZgO&wm7V zrV}{MitcgPyWR72aBG~o_-`Fv-GW3szdpKnUGS{+xfZYSeNcwXBi8AoZGCOmo_DRu z_j2iii&Y%w`{n8JbP4yD0587^@RhIMfZO-xaQV^maIi>%C-ZBp2xY^EX_wDE(ami1 zGV!iXGJZ>ky6|G{+p26*;q3$tdAyePVL`NSg?xkS;+_$vItKM?2P|*Rs>XlIyvTz! z$5$ie0QPDGOO_Qxi%*6Z>eR*zkiIHLks-9XwKlc$i!{P$Iw-S?{icdPC3Pctr-?K( zOaUSLmg9p_QaagNk$-2yT?e1#e$Qd9l>XrwXt2a$PRXDsb);wFho>-}Y{1>S_u=;K zI{>5eDaPMq@BD?G7vBGYPn5=jF_GItL$DexY>Xk>H-rnBZ+1Q$-YXNZQ?){uL z0O3m3Jqqf>cMgk%%2n+^nfW<6LL~l+0!x+eq~p-VsPfnXP&_pU4NdR;O8ah3^>(qFEG({tbbzi6vII4biNf1zh$OqI398~$f}s_orSi=hZKIA>`!=2j;(A^Tu@W?o z0?V0;1k{f`;52?F0=0WRte6UO3cacDM>h1xSaBOpFwu^Dwg-z~8Sb>H@}4D2A}U3! zwa_n_$Vdd|sFW&@5xMTO#HtDlvbo!FxAu}>^zgiU|H}S04#hZkD?x`nfcFv_l!^i2 zS1Z;j>4UxV#rs>mDB`>$PH^YVXua7TP8f9qPe!(kaJ${zO9T@UzEzUw{30`8H%YCJ zZUWkky9kU$3>UrTAb5)LV8-!=C>r-Q-E$QTJgV*a(&8JZsbC@Z9=7_|>U5MoCfzXz zj=_r!aonErKB4`tJ_b*RaO`|mtOf!t>5iVR%5nN`GtFT4hBrVMG0$}IdC3x$dyYT<}^RL4@ zwR%|;`*eSZOe`d8QBjq3|oO;QlfS#iG_{|)K9$xBsOPx4S5GWD*t zj-Pw{Qj-+?-{rX5Jt?g$hukd>xSFt{tZTJz`PwFXM<_S01|Ov9WEwH9=DrN*&&vC3kNyx#8QD=VAGW`#@uwGpJQcHn%n>)5$n>cKhyqxOeXW#>tn*fN#0v1RZ_1Jgoo{{DlS< zihW2k3IH;POOJrtHCOgcUATs<2OU5WG|W0% z;v>jb^J~f&9az=M$IWvPJ?9==AVz+tLX>Fkf>4K6GYe>%h03l9aB9<8BRLiW^^aF3 z9F`$?mv@l0N{vA1esmVp%2^>@MQCdkynN!0>MnAZxnSnI?U#B6G+Mf8l!!wNKvWh^ zQF*e`V)Csf+cGJ&?{)sAz+&sQq2czksVZmKax|uIe>O{3x^{;McPqflstYU~_Sf!> zRhXaJ9-}+&`qm!B4s0F3shKoF6$OR1QMT!eXA27&BaAOimLHqG5yzqjll4jv*T(MU z=7yARTF&7F%$uHD9$`=230W`yE>6 z!HmyxR1dn;=NfU9tc8jBHeW1ZdoqT1-nkEd@JC;QJNpyZ+PMVBbGq`Cuit3o^a|?T5%0x_^bSFTLw{K-tUO7&(S2L&YI5 zf5v2+J~^9SD6#88Ol~_xBIr?)?J_LxImXw>D=x+ncj#)+3EZNqI9)SpX7& zymjY3>>nJ#bh;s0b#@p|aRD@1r)9piVCo<5;%|k^s8Ne@{=cI3lqYs~!H8|7-VTb)K=kKrE!q#H`c( zcOAd{WfTE=tgSm!YA3s@8*BPVBDw0lH|v+cNZktD=pn&!ExRUJg-ZR7X)zzitdAU5 zZtGZt*>@INDt>H7*Tmu+`z7wCQmIfCEF%61dj;b^)Fao&vE_5tLpV$PRd)r`Qc3kz z#Wyrwz8}rA8E_AH2tym!5}7@-2TdFpotf1_*T&Ezof0$Ar1z&RZL7TTUSd0nb?fXH zOl>XkzGK@PpunS|Fkkid!OBD%)QNFEw^hSeUBZ*AyEd2VHAaj_g&~yGXyx?{`=K3M zj2pwTB!tPTcz_`vp*SPOE*j6y!P~bF;1B-G*WrbyeiSY~ya7kYIS4Y+3Q+=h1}(y6 z$T_O*gVPFwLsH6pKbD#>UE>4$z8P9t>l*v#ci#_+n3K+dzr(CZEKuULql7yTQuO~< zZo^-G>18-toP(`%7ht{!_v@_|&ya*TrW}i9HH_~c>d7JPxZmwHUgahI->W80=%S}q z7Kp}2`@S|d_jjTEhCzx$b#M0_w|Efcxuhn)v6b>)*&Cd%h0B$WdPbO|5n?)NPMP&vW4_$xE?}$cc+QJMC2f`&D$J6P`UZ6C+D&M0FPQ9U! zFR}m`_E@&c-;A>n|KR92D*#ez&Lmrmr_<4RlJ4xRU^>fj{s};I-tOGphr9cSFq-Tb z0Y`%>xJ4*dMbsgB#w&=_0uVYWA*2F}tu(R_$%8?=1Z z&+y{iU*2ddpYuEfjVR&6dEiA3WND717_x@xB9!CI!UMYQG!I?wMmMb8Y#5x0HBfb> z2kRKv(#^MaYeZI`p=l^Hf+nK@x99F1RhBs4F{QTBeOZB->4oDCSP2aT*1xuLNVpk1Piv7bM~IpPEMWKexd63DSVFNkuBhUi3W^L!OV#VaxsNq$<~v%-gQgr*Lg4@pwKG5YFUywk8crt1M$@=iKU- z_nH;P-M2Zo7J43}Jt(O-u`{W|d57Jelz>C5NTlZ`MHF8_(m=2k+Qj?cn%KJ{>E>_v z-l(~blhL=`lYCcL=fwDt;lg+?2OgX#oOJK$_SEg7uw2SjnMr<@?zL|3UV{Dox8e8y z;7jmxKk*p+$ir9Rc)rXrZZaH_afPE_cj=`nN|e@K>k`^eBcy(>l(P`Tt*|w;ojw7* z#n{&rN%4Ib|JwKbY|2?Ff|w?Fk3!Fnpv7@0j5+fEB5@wmF}(cRA^gdozX~^QAHiyK z3r3SIq7@`%*Z^t5k5T*C?VSX2#wQJ0P>c-+xE3@DS*F3imL&zwBZFH=xm|0|3VC)G zd9O);b!?ZK7eh_v-^YosVH}xYNmgM3UgS$$;6x!E8vM>~CmoZ)*AxTCq&a(DAQ3PZrd0Ty^AB`^L`CY72{Nn|5p+d^@0&IA{P9QZTBvp5M>(f$2;C?jBeDd7&6+y!So7 zw}Q|5__*Ak_V4PQ$%=B@b{p{_E1lf>8wHQQVc2Em34#od(Bi*!CT`*m#9)lgPk8to zM6jZ~>g+O{v2w)31O^)8mE`27xLU$|4lvy~2Qb=!Z@uyk{Ka2ihif;}wFwDUP>!o& zMO0<#=+tNZMELG|tkmXMqYYjBhi&U5{SO^iOSw}U(@F5hcYUdmi3SY4Agclx(~=|z zPRAqo(pO)DKltPS3X_dvPNZ()P`TS&zZ3(C=%B}t&7x}OlNR3U%;LF zM{tw^;UulMF&>UJjo2gw2*~a_`-gLwCrx?Q*ry!m-N}Lr5DtLpiAyDbMKK=PFkS7S zrfkTDK6&W|LP8|bV6cX)5!xyeVfTHYa%dQ-Z1SWrA}tkH&iR^!+4CE&rU8uzKRem> zOi-d*%lI%En%`qIrp8`F#OXEN_(}Q?rwj<=HKTOeSo3cmXxS?wwq6l`y(?1YT56F0dRN?FR+*Lo)H9uVr@rbaNdS}|quhb)l8Yf}!8oz5m$#Q&M2P&oI z!E`Iys06ezV?Se((*1ogR6*RKeoshm$E>K;z60oI46^m`bMoj;_UYwRQVxWOTc8rw}+P-z8 z>l4P~2V>S+B~^#ehn!HO9@CgI_7JwuSPBtnQcR~HT8rfb#^Y^Rj<(4HIru9Dq6DjC|aYCg=3-@5vIBG*Zz-!Y}w^>vt&$tHt8jNQi`$Cm}DV zkgh8zI7wBV^*0P`Hs24Mx3*6MGYmK%2v4&Gv0=rjJQzqffF!+%(7FxVOK6!y~N6v^`bHR{#b=9tp)&u|)m5ND`;RN5B z^2tQYS3=<9J>;CH@l*CrZls%IE3KP9YtUr#kr1E9Oex7&F(d>=#9=4Q<@S~w(}D{R zie2#;OVS>*s)6jX>h})MR|p&(=#=)4bq#gKl~Q7nTdy#>V@>hpJc@!x1CD~$z3B$_$2Qcx`-g}Cw0OmgSyvTsGyK@W9{bc9EF&Xo8Z{Ld3=0lL%3M!gI_tJu+mA?u zv+^V}b{rAfo$*-AzNPz-&eB3OO6S6O-NK2OK^hd|!wKTmlzMQo2^(7%;ICf#Cj8k; z55Xs2dU_6&+H@&Py2jUM8GI0P>udA-M+s1; z-(98U$-@f1>|M^dE!k_-t4LDlu!X|9z%f(KNwBNdvwphc(Az~clc$&H; zwl!0xHGOmI653U1fn&gNE1zf;+XWvLy_KT1&kB!5_CWU2TY{BBMqY_=wc=To6KtFq zk5?_6vVz9Y1370Ih<1(ix>V$Hsy=1~-J~yAJ_-AvGp<6B2D0KK76dHMbJni*fFEn7 zbCn>!BrsXoqWHdA>UDU(7kGu~I5V&v-`ej{UKyG6!OTzKmAJ)X1pE6-I5+?}Kg*c_ z09JG4d5%}BQBJp>(+y0smf+xEo+Ig|ic3u1tDBbvZv#j_hZ-|B+=3Muq?!f|g?x{Y z+>vlDMfFm3^KpH&TyNG<43zV-ZDi!)?s2ork0J_N-?P_F#-@YHa z$Lvpfh1$m`WafZ<*$SuWp z?wIZ_TRfqH${B3IAILHU$FIXjMOqWTYwgRfK2F;I_f-k(jC)m6oQJ^3nV(BHiC3$f zV)OO^z`y&Ce*%B~mDgeS{Nu1pSBqB@SO5kvP9@=jZaezN0aSAH2ce^+53P!Z|n4{K?TV`TWGw$bQjlmQjKS^v;@$4(Jy zgWtM{`R%>Y2gh1*G%Gx>$$ZRfo`j#2JuAU0%Q{HEx@lFU?|rzWtB!q_z30>-8!DzT zR|4gScJl8OFg(X9gDH$*3QL&4{?Q8V+(UJFI)|zDVzq?n*7kOqc+LO-qsi*v5a9m7 z3g+p4L5cy8tfdmQ!DtPg<=tvlmYoMrp4BYBl?giSndD)|&G(Ex*i*~LYdCvL3$xCmi{V2na%`J}WWr9BW+V-e%Y!s!5{h}tC|?Vjfyy$0kr zV^yuUsnO+Srbd_$Pl2Q+Cgkb9??V#YMvgf^&&XnEgYJo2gUmCwLci(6^jo$l(NNU= z*Bo?)xDC|7!L{hURY>SzMxtiqP*Er#F{JP9-jeiwW`~5pF4&*$NoN_(1~{XsB>3ci zg0`16&8j4zU?!pr(l+xRGy%o*T=8f%fS`qEB$P2ufrX1z0QnWf35Yg3D_Dpi$Fs`k zn6LQQ_2!7*K}i_TyDimx>b&7qIWrla+0ys5ECJnT2o*Hu z_c*7VGNxn(?b%e#Gxw;T7K~S#Dr>vHa)WET|>Yh0>--~xT zkB;`NOxFscj9JMV6oy&A-cvQ{y*hsM&C5C7Q+vgvK zFMZ`r`1im2SMZ@1J_#u!+2QdDW|L7?SY*fuZ$SIDp%{8E%8ZfC02b4m5Wj@(xDb#T7O;_{JMAmr(lbi^r z8qDd(Dmw(mW<8XI2@G3ntaM2Gcl5bJlSfXGQy;T`mf&R+?A%U-gPE^Y2I<_@TN1CL z8c#T`e01;L&T_t(O_G2H z$@&j)aG3JtCQHKvbLBMFxeETO5NbEV$qFkBm=P0Ji>z7EvQY%ps5YwqipHxt<~qZ= zUNOui2IQ>QsvN4JkQ3&1z)&-zXN2ndcn7-Nk%b2D{nlDx;z8Ce*C)fdqaPDtUuxyF zbB$3);L0F)aPh-6Hn`O0gQg6-6uJ{ zMoV5(ddE@wlPWc9JDt~Y5${I#nN?D7KqP+Pu5Ot*+CRHs%YjIpVzm&|2NcdeAdIQk zbF^q4Dhlc&qh|YQx(ci|v;IOePhhBWh4y6?IR z06#3P@_j3yf0q<%42!T%7R01LyY|iz{Pw^7FL3?FG3=bX0`uhrR{0u^ub-{?2JazH zq=q3qiw+A`%Mh=G)tX?ml)`cqLOm67>K#sIv4bpRHH00sn2_wVK3)32u!E48lLy!CJ}}nyZelA+-b^ zw4j}GMK!d_0lY(pKFWb`QvO5JDTdCVxDlz}%=C}p@OT0H2RR6Uh(YOpsSq%u2znrrbPf9G!%93NepUTlSWpj z$kjK-#~faiAuLjj5wE?r)z|HWYlwW0k4QsFhrep&Ygm?L-T>Bd$H({}F{bICFYxkg69W(Zjf6voWDb;q@!u|ZpeD4JLVS+guEU9!qK zu+<}++VRIb`mO!eWx0t_$Q5UJMPa!Q`y%9)J1DNNu4`&gaR_UzYv;Z6MDTdk))|Ix zRw2j`28CmRY)H{_X!n`*h|zVY0lM*4@6wsJYp^@(67fA3%h1^(=hebK?iIVAW2O&z zu4hRtGoDV>qB~m&-M_OIOC68QE6&aQUYnzgKAayOEAPSj7|YVC$MbaX3;hYqDx}7@ z*-wkYs8q2vn!<9l4bzSD@SQgf;NSkcm*DkVN3by)!=kb__KJ`lOCO!CJ*&~Rb$O%j z)zWvq*R}rJI<5Uwqq$vUv)|aZfAC6!4{4l*9D#hYg4>G~{Ka3t1Ap}AUxUNt47T?! z!+b%(p)m@m_E6dT70PXUa=2QorA7v*7ZS}{LfC+F>glb%tI_Z#UAHvFjM?+_6{*km zN%$BIAErM8xk$GJULo?l!TjBdU~Z4&s&I@cL)-e`s&K1_&t16GvJVw6O}kFD{&9SG zb%EuI=6PP_o(ftUCgOSjBJ)~+S!KQ5@8r4Xl|#5De9a!kDUJug{i{+8AC2ncVWR*E zil_*f<}-P4c#L1rmEH6+{e@rrmEX8@@u5f0U%0rFGI`wFhny>y?<40s&8%I>LCfm- zlocSgy9yqF_Fv1?v`Thzpa^%m@P;{C8W&p=w2g(ZWe!DZ*OU%J9u`?$ay_!#WY=Q< z4d*a+!nn-6d;D&`_@TKMsmP=L84I)=*idFMh**Y6(73@UKS)WGuTJP(Sy*U`r#xm_ zmj&MW%vLnosCiBJ9w`oOdf(pad z2=vyPyjm`l$uWdX$CRu$I4@;tuoX6_FX?WCiSS|Oqr|Jb3}?)%Ynj(8?HL1~oGFCI zUxUAAIuqVbo-kQKMmKZvuBH9T0%R&kFW&`!ykX; z9r(BZ;lIM2qdgdHUIG};kRRs@OqmuZVVFK7+|!2?*NXEQ}kSQZ`M1ap70e6DQQ$%f>U!71S@3J?4b5Z??&r_5aZ0kxyk0G z`@r0#44an^h_x8nF<1tr#(NJV2$tXyQ{~#T^DP;pcrfvacdyL#{Wb9_{P7Mq1(h-y z#&~~M1gT~rL5exAJQxdnD^}~}oha~OzbI{5K{c>e?!Kqh*i{j`AU7{GRhiR5P@qGb zv4v`%Tb716h5~*Bo}m^6MkZpt4*~jD+tE45+EgR0n>l3a>fs)hPZ4fIG}`S_Z_C0&Xq$-x;P#Rej7kQ* z_D!>lSitoPh0aeHZ?n=T;*ILrVNJ8GUs-1p-y)7daUGm_sl!NPL-2XBd#lz4?+Iy7 zw!1PKxZR9JK3WtI(G+(NTew5o=P}E-tPE7o5}pXD&Z=|o+S4_q3o6&6wIwos>j`iE zER+JZt50`S1+s(}7)J}kp75m514D6GL6c*oV0Mqhh;Pi!!D4nEUVrmd_;>&DtMJ6b z8}N}Qc7)%G!>=kQ%)3sw_S`QY${&3{l(h{N9qqKfAKGqfJ-U=NKM?E0wAaxpf)(K} zMrG;ec)5h5(HQ>t&)$MR_%C09+18@~vkP#X+|-T1#xm_GW&r9gH7*j89>O!^zT9Fx zoA^hJInrZQ?u_TLi+{4ukS->?i-I-EZiY769(=@59l24vs<+>5WwdkUDf`>7z{oBqF2W#$?(j0=crGjoG6o)^(oXH2Q@oFHZ4>!(1jI#kWQP8P=2IxtZ1gP0rD9Jl5nHUlu~ zUA}Fj7TQ4;$J&CLXM=@*{HKw+Vdx@Oih#2Byn096 zc;5ZJ;@H~vF%FE^QrE7{teTm6b(cH{!N0TQ{xsW$q>igFPpyJ;Sr#j%DJ>PZQ0s)} zM#CZlhrh>0*w2xDS=cSYPiVl~W|3=MVM4_>j5LPPy5%xC(uZqmWz-gJJ-dY%Z=Y%@ z8HxJs{Bno!K2}{C;7VUBjC6Ys}996yu>tWRi$ z;)L(LayBqKtI`MO@6~lM3_=&#;Ho*bbMjsVm`%p;U%vDf{Qe()9d6%S!DMy;Mw4w= zE|WLSB%h^x?UQ-N9FWXt*|HRE&+V#n#}C1kR51rXV<9iMGeF?&-*0p^h`f?U74Oah zD=}{?R^p*q>wT1^j0r8=irT{zR(4G8dp4!7S@7x?oM}PU&3GTy_C@lVh>xB95rt%@ z5E?kYG08DCPET6v!}sw+0aBz>M&Us8TrzFAfL**k+_K-_H1eGC4^xZt6QrT(fAjeY z4h{}c>0rD!rzvLcXtWw}r09G5hnNCzG<7qo77JP_VKUA|u**hi@0ZAgpS1jAc%Ec3~7Mub`?!K^}pM?d#N6i=QCz>y7#H^PB z_t+A|YWu6yPU<)#4{YUq?Wep87U5$NyFDyyty^_iEv&ZC{@o%((Hd{ZoyW!(?qe`Z z*=}K71B0!5iWLBSpWl3M>WJl<_iTE{cS+3g^wH*vnE4&V8P@={%2qh*;Zs=2p*%dDn-*0V(thMd3#G-K9FObytBx_KD)lPNkG8dHL z_}T@wm($NwqH*iDasK7Fa2#dajM_}yxGQZG)@K=liSEzBXw8xnTtoRPTuYWN#%a9- z!oPw8O@EGI;Z$~pPQ?0LTRkcKJy9JO*R$g@%!hfTc*$RpvYryGe8%aa;veCu3QC?s zPA_aoE_aC*o8-|@uBF|1@~zBiqF4Ils0S%!1u$U`Fme}V-eo%3f!X#1-n@1l{?i}6 z44?S$)9~U8Tlvey5@71ktlxtL?zi+i;N05!p3ah7`?j*4Ym}j12k4d`_cYLjUt3-y zwReJVYQ~(d@i*{F_eZwlK1dn7R#SKl>#?K%lQhuNeD;nh`2<^-mZBnG@mHGT?K!~z z=YRea`18O17F@jg6f8$uuw14vVtn_S)2$&tlIa4+3ZcwIx|aT|;BfrAD5N7#ujkIn z5r__bjIwh6b^7DzyLrY|+NEKi?DZixwnjfgMQjzwoe!VF#wc3z-z?B+1HL^(J6BI%PPsoZ(iRz1ZxTp#5!VtBf&c_F_w{;Q_M24rTdtMf-qc0AN6$zkBrFCH^+& z1fU$3>E*rq>7Kv{rjwM%Gu@s;eOlJ#F+;z!8Y;?(Jx-bvbj8O<-N9~JNWS)swU|_y z%K@8@?|4q9Q~6sol#RZbU_>k6P$JT0>0zrx%=a0sr#6^e9G7j|jWaMGC7kG9kvZ%( zmuO^GeH*x`>{>V^R|#~~%C+7i=4#3Ea5*Uh)wK`%g59))_kIDzD=mh;Z}pe*yV^C1 zYY{O|+#6+^DqOJeU~?*40X2GraKIAjBPkDsdiWrf*7)fH%T{2-(>E-nzyxXr6;Asl?kF6T|4FUKJLHMVw#jFXDs< z7vE2P3=DrecF8+!f>yTR%5=o;)0&c|wLc@i#64fJe%rl3OTlSw;~pw;3hk{W{!~}o z1Wan>R=4v&WkO^mm8M`E8LL{XnIyWmRCCrbM4AKcKmor$bw&2{Q zr{GWj>YMPdfBQeeK3R`yDU20{p4M4->y?Cb4Y7n>i(Y?Ul*V=%^l3QfRhWizJcM4h z__)^lAH=fG{zE}!1oNaIn~dPr@e2OKf4UBT^yja^-Gdcu?OcY{XqJ_EeCOR-h*LZ* zRz7B|otqcn}|IvNMJ#s2N9|cUm4?C@vzZ5{PNCdmeEZ` z`={2+HmOhEI{`pdcyz5pf!v$p_ifY^P_?3U%)R4AAADZA+Ttt+tQX18=z#FL>UraH zrO3y+8(9sZ%+Kf$QdSyVr{IHOl(05EnZ4tkpK|opz)v${FOUiA7=?vWfZ`AEo_i$T zwck%tYQpJIp}$^Qb?OSu))-o2wQVq->*~M6pY~;Z>9K_QY6Lsm7vc83*WpiIdINs%kKcr! z`NTu8JH=}jHb|o_U3dj~5Zaj?OzKHXivu{#_e0yN);k0J#Snp}>-~dKq8KFMZOR?I zhQ9B@7qNxT@__Y2{bTYqGI|^(L4FFaUIX~Q|Lfm@*WNmU-Aj+d@d9Oq>>*mTYVkAj zBWSIp>&4`WfPtR1PxK^#dGSD@i&qOFj;ku1#(@=jFF zGHzaTeO38ei7`_Q)(j)9NkyKCXUEE9b)KVJ8O}i@SEp5g(6~k5C0HqKYquB28Q(?Y z#44;4u1}pG=Vx-UFCPf=UbZ{!5#r0aJ^nlP$)m^ueUpzeUW)X?JhsSFI$2o-3^a&m zErs7WI$n@MO_dM%P1Y0uz;9|`ChG>6)R1L z)+ju!+^(U-itex(?L50H7n`MDQ*`pO>K=1ejT!`DJk0C;2F;zDs|x#$rs@8uT9#^; zl=?Jyoih$s?fXBl9Cl3*I1T*Y<jwVH zgj`tPb{D=ke_k?P$RUCJ;3eoI^5dLQAm48tr3k{M@(kMr&fouYuz1I zVez`CWJ~E$Dot7*h(x857f6Q(+0b$4uY*@W%iE)zOG~8{_^grsh;o3e+$|}yIK=^(e&sn9fMh!tsO!xpjtc0ivc1zgJRx5zU7GI;`$i=13}Thbl4qoYN3 z`$vG(g}yu&`p-!g+G_Sf>(U3-<6uF;ZB!2ddMV&ia7F;_!)E~yi>W9G{XNZfty9D2 ztm%)`)yTMKnmbGd`ZU(JswIg34jLxToFFi8hqW?KwhpIpxinvq`84-*dJB%3U0aX< z=zV5Pi&2**WVB*7KD`UnNnEwM{^mAujcnY2vlUvc=Y%}N7Xs57))J4782zOJ2C)np zIPn=#5{J=KIiD#H%L)Xnt*wo#Kh+!0x3yNhpWuO%b{*P%YQXzS zZJdS0-|ij8P4b`h)4bH%ltgc(frZ7~3SYpt09AJJ&6AG*Zo!nZP}sV)!k)Cf9tTB6 zxll*wY@>!vfywFaJD_dbv2~m$W6*ygtR}hT!=qz3PB6&H(ow#jBJoX@zjPlbT>&`C zu>g|2ApM)lc!F+%$$g%qU@}FHo74VVV@4x0$o0_T=NUxadKf$uH-3!p&68#X!(FEN zq>}FMriXl|L-Nw+O_qHiFmhsG3hg-f_sE#7%gCZqf)x`O$jG)K5gM0X3D#r10dzKA_mmubk=!E88_T!jJ4Vd z)|xxKlp7UYaP8JmLBZ!v=Y3hu!H>klvGsc&kvQv8!(%Ota~A_@pQ#d~Eo`^H$$wSb zukF#UZ-$g^7y3Zxa;m35ZKP&<6s>*U$1rFEssnfZx%+?pXDW_2(>Bg7WG0ZJ+oy9i zPJ;W$Ywd+b8TfPj3Qa{RxjQ?Be`zPBaLj)wv+Rg_A6~M|fdoqCoX|c#t_;7y zV`mE`;}s5a?fI4J%pGnTB%I5+uV0Ie@=A<3X8w@7VTvb*>S0HBlj`;>j?jT@m095^`~v~1Z*Yt>%jm^F_wZGm$;Sc z)gP^!Qf)Wq-AGt0B?I(AVDeAz#~P z7ollu9(4_35F}qQ^y@rh8p?*)PteCOkyT_@KM&k*6M@tBl_VXa&=LhkC=pL|tzF-m zoTPNM&2DWr2uxg?E(SF!e5``a{@t%s=vF2SDK-3D>nn_c&SAguvnCkUlv=ep$3T4j z3{PdFnKR@RCYDNLEF4lQ^BKuWOuZt^o2DJ3g|xTBMUfQCE=67kzU6lL>pX5!z;fGt z@TuWx*JqwPrL?l|Oj~h(>%KO>Ge6m&i_uq)zj2J}sf%VI$#gEn7h$DG68d4afQ{J_ zj_$t=_inxhAN#;l@XLSiGw`=Q`zSp9_(j+v)KweTs>jRfhvnp@hSOzr2O462Sk9)j z6nps@{dZ?JhR=NBF}QT~i}2&0`UL#z|LHH`FaG9Buy^T6*x0@T3)skR#%#saxLwSj zdHlzo#;jn(&nypsu>~BjjxR*`K>f+dk#tWl0HECPv1y@WY5^F zTl&6hZjRhJUO%?17B6rVgm{6owuL@S2O$4t5YmGzeB2Obiyr2=rqd|Q4MDiC6c)7X zpOSmI9q6NG!m~A5M(iya)D#KY%uBR*M#~tlF0>Mv=^<0W*O$_Y8LuixUmYpjSm{yY z28Re*>zxV0E~I^wM+1spWzki^;o1HTA`@a`^O$HgB%~CPw=sp06HXckjIt9z(zaH= zZ2~3C`vh4uhKS;Upb04j&Hq{ zN>&D(2Qz0j`Ld-=hEUUURzha$gHbT5aIK6P*?>Y2M6_m<#iVy~utj=5PL`3?0yZZL zxO?k0n9Og&=Rff@{Q57x2w(iE$KmQGz)`You0}91jFpVB)RlJdJ>|TF2BJVw%zPn($ZW&5LgeI>>aJ*W<<{03`XD`DOk6(t%SGM5)^=~Hdr+@h!xP9Y3 zY@d4!rqew*o-ZZi2=WPKs#Pt5gxz72eq->o0`hI|F86mO-Rn@8)CEO-=f64azF;BH zc((EQhJ2l`Utl{CYRL<@Z+L8|VO~xYGFA!Gv1bM=J?dZcBv^Okg3ou#SN54z0;C2^ z_##mTty%)P#XX51<^Z`!mxX-Qcp>VfHN`%IO{pmHo+Y>zZ9^pn(`022^8;wiU(8X? zm*JG=?cISlK==HjRrWdeuU0Z0Bfy(TN_L7+_UV|FyOA-A8TwMtQ3C+!0$ zQC#c0TXS`?p|^1d+H4RXOMu4}uaJ=2tVO1#->Nb|-u0|g*sMdWmo^%V)zEg8zVWsO z$4sy>ZoUlbTDy*^sQ1fPMq>LdP52Ndp^I^-S!Y`C z_4oH}S^&ni3ySH?mjCP<2Qbc2acrnxGhcngS8K8(KbZ}(H6yvk8m|Hzm%>KoL3d~! zE|DC;igRViLD|QaA65ujM#ZP(BbM5px!7mH@bY}7h+4#(1i-8#(jAXbF?#lsr0ua1d|h0I9=&eMs-7cBYoS1o$Ft@EIZ#PAL};z?2C*+0SXWi>N9h&s>x6CoQ$KEHn)s!A`-iNdi47$ z$q5r!C7B}gJJ#DKD*(t8ll*-DDWgt!I6C%S1%;rF$tqaTh!?#|k!QNhV$X5mui)#+D?KduSTgz1DHI_b& zjK)V;>v6y*e~%o3Ql=j^0|ZR|CIr8e@i*=Yb31Wft3HI*2vAuYn`5foN9N8`&)i1E z{tn~GXWyJPiKAg$uPxpq#Z>Dqt0*8$`{+sIl`wfdSA3V4lpEG{xCcJAj$VVnw14<_ zmfYY$lo~GT64YCN7yCW*(ZwX_`|iFTG$Y)HOTEIXMIQ{YX`X@Zc3R`8U7v{WBYu;; zYQ29X624F2hl)Vfq?>0B7Lo_i^@pBjG{&rvS4ACGML{;kT^K?OnK=+eoeAfmd#A1d z>Dn_<;J0gy_|33l^1ZNJnO?Et((PY+&yoJl|D-E5cE9ub$g&_F;j3=h{t{x;FfC~b zisKZKe02!p)m^xE_uKHZKk;Gs=l|?y;Klb(U^BNdhMk!-=+;v9Z$&8V-lz3*?`nM4 zc?Z1v#R^Sbby|P_pu_Jh$`Be-6PBmx`E(5PWpejl!3Uq4!T;s|^b4?e{tw}Q{$KtE z?%%rxTYHbeYPyvzj>`q|d#(5yG6uoPCP*}2eIkCC@9|rHVF(Ru;lPpyuEV4jBPa5} z!;}F2S&0jjw$}P=m5A?$C@$!EN~Ay}h)pw_zi2%p- z(7j$KDnrKBHO|nx{w9HF%KFN5wc2Yl4nvrdmf+i`G--XSdoGOE(%SrzGUntfOXQc6 z0|}8}yW;a%G8%qQNV z?BD$seBskCz<=`_pMp<(U;-P=AX?GhDtF8{*Ap{`)jm7n)o{uuC=T8O>-O!)-gX8G zCbqoS!oGK;?#_QY6eGJ9AMo_zc`g(y^eQRrTSA^ym?966Zulj7l{o4ZJoCr|{`-IW zV=$Yp;Q#$^{}Sd08!+Cw3bW}J%;ywy#PSpkp2%KR%6L+Es}MO~bOmbQs?O2!C>;X7 zg;NyTTJVfP1uZ`$W9qRgYF}!EF{an5MH!VP2qO&2u5}Rowxivz!!yM1Yy2#~MwmJA1b#%h>FWy)$3P8rVQCRpQuNa+k!dCMx7EbKB5C-H(*rpa)Z?G|Lp9>b08 z!|fjqMp&6QKT}!U*U9{SGNz`W!dZEi{N6c0F}0B8L<(WapQE-8Yb1?ZPV12~0#q2| zMxNi8uUv+00EF6`@?J@;tv(XG{)TpBzqgzoIg{XMevfalv}z1542iJiw8iFR$}9s| zeN=TH8U%7)Z)Uj75CpxcL|LE6X^CvCn8)FfnGPz#rf(&zb+fBp2QkeB&zbf&kh{pd zZg&pa^8Bq*_eS&~NSUg;lvx zHx(5!BW%`Zn%6C?0PcE^W9VzCe~d#cBtyy&3kfSzI<@xZU*5+y+Aqg4DcjZ{f#{`z z=Y#PA{x8MOW@R^fAgtC>fYb}`lOZrzFXuGX2y<@XClbCXj*z}bZym8n*-__bswBW! zczy!IFa{;r-3g!pzz~b;7_>pI>!aw}gPr&D2ya1CGMnYyqyy~QN zUDl0_pzCxR>V1;(Zuj?tT534?d$%~j$aqK&Rm^fp*)?X95v=9_tD_~n|Ir=zC%^VF z`1!x}A(-!9gQI(I!*sNOu>`MXubpu-%Yz6DMl?u5H04Lp;A$s0r!AqZt9}=r(^G zR_NFjsnN`=m~MCD0}k=Ax(ra zr+eev>>Lr9@_t9!TixbaDS`)H-Wr!mtF^DW28#x%N7LF>tQM*)CO87;J#QS^C=_=g zj@VymL5btBe=~PIbcQ8DV69*m7rzcT3)p$@{#cn9=gLOU`Qok14!MK*+4#8_ZEx?m zLTMj7dp{;<;G{-ZyIR9rlUL5QEn1r6aLfHpo*)%VYn+3gxo(7_ijDfj`UoJN9}_Kv z8e;ZXQVv=ImX(!#%8()J)W5##ly!v78p7|gO2==y@C{p|`>f;G2YzS&woRW#i{CEF zJ+$YcKKiUe7To=K*rzJ2;YvRy9Jg5Z@^;~kCDSVBsT{Fbaxi^qws%N? zq-5rpjE>>{-8bNgDcPB|PRVL-JV~qLV5Mak zbJGahKd*JqqJ?kGl5OinPm8|x{PUV9F=TD(F!Fofj1j`uJ#wcSEWxK{40Y`Oi+@)~ zUG>gMXA-lu$vaZ2yYW`qjC%s5@f9r6^><^W$Qc8(b^vLn5W-Xma}=fl;T=XM+Bxe^ zKA%SOmHrtMG0s7g@O`mlR1afRpjJ;)FqHyl(){(g&{)7(fXC;k;Ze73k+~hG5C3U2Xw=L9#9XyW1kMSJWKOc(OvrrC0&2L2MdqPWO&Qw^V_ z{-FI*_G#}yM|GvWCP2r}UWch5&3e_9!RCI_UNC8O zFc2XLJcG^(wmq4oY~B>C#{L*9c>j5*&xy6mQA5w~YPcdY4_#~2S9sr{Vu#1pW}^H! z{Q9bZgiq;1z@%{WYDOkc^kuw2ezGG4&Z{@ZY2X8}L`nJ3^Ef9^@RvNMLG zCBWuX(>ld-Cink?O=UDtsd)Nx_~1%Oq3ZK%;oLgkF#LUPdjM?S3;5Mw;|uOhJd5iY zCoPOU_t4l|YtXxON=?XMI@ubC6I_Ilk>HWfE&ik|8`IGWwx?5AESK>7Gu!ab|Jz@H zXP?-DgS)T8bd=5{-pOXATlzg=)hsV0JTqE4x?*{^3W!z36d8DdXK4>1Upr+;S}Sm(4;#(cTGl=h%-53 zs#qStKZRT`{ z38&PE^SvIkXW}?3ZM3eF#C_K%?00EQ`__fsitTu9pS)K}CZJx|5e1~2ddHtM+p><~ z`>3pGjyW?C_1vvQ2LF6`n3Vnww*glH#?tEA9h{I82-N1RLIrqcY_Q{@f zHC)xgUvdqQa2OjF*y4vwjK6oO=Z$b4DSGkVW6E)T3==qndw1S|&wln9_=o@CGjL@q zuMAA{+QqqJ@Ax~#ClVe&;r7FF`Z5HL-!HH}=`0@9?EByv1wk8Igv2^=XyW_%8JE)8 zOc{UE`~72pbDIF4`sfUP_VXWv+jm}qn|H3kZ1*u(!30uzu~Ev+kq{rBN1-Ql?krD3 zXT2C-LqXp~H(K<1=$@+yb?bd!KFf;Tq!cJgyBni;k_9gU7QQY2P#d=;*oDV!3 zTby$%0Ph1+?1?g(Ezq$8jk^@-5b`#D9*K@)sl)_gLpNRP^XGyqwy)RPICrtwakchM z7mrqJkKge;g>LeAtO73-AJedA@yu6ti1Bw!z8OUP-R{vI%aCj$W|~L?rZj%|#wh`+ zT0GV$+A**=!*`|oj`2DhzVda~$WM&=W3Vo(i))PnWjcmUMaxwinYiTF>XmR8-53!H zgj-_fLbid>WCaE3v6S^|3vuN*%-IDrkYSq1ekJzp?a5Q$;u7<6MCuO=CL|93Pw|=_EwX;+)~*sN+^_Ygth! z^(&Q5Qhe&2MxCOIa_{!7P5kL9Lm8~T6I4WVH{>aMOv(6St#ri)g??6Iauw9RqZJ|B zc#?*ngh>ZSVbI8;Z?gy(g@DCTDD)1nJV(VTdyPa38NDl?6@Xfs9&y@4{t@M#jMXZ; z?HqV+Xm(+r3(NwLa)~F%C!s+ZPGt1bnqVIp^Q;yy9xnh^`!GMe4v${lfzN;DN8rWh z&m;X=0?dRFW`!xkyu5FD5^CH{oAYYM6 z1}K18y4Ss2!QSQ)e)Z=+2tW3bN8#S>YcN_Kz!>H(pduQ%t-0H3PvcnlcaufxEP~sN z>a^=*=eUo@XK$^*0LQ*ETB>ux?Y6teTZ_#WOSfR^=@Qo$o(E1>BFxJ*=o`Pdri+}i zvK|cfkejAPZfgfNz4BFLLZL6heOnB4|x!>*C-O99_?-bW^?xt(1-cQubs z#<`}((9Ei9TV;JK($A`Y|e#ZqgboWlSQ z13`ZNy%iubvaxHCE6IQGo95g|DPp&SLjd~k*@)?<6dX?|H21BKt+x)&P@#ym+Uy>f z-h!5csN*~(jY%%&qf7B1<%DFcu!o7=K?Y^X)Tm#!)f_+hxz;DuAk9jKJi9T zzHU+a>%52DYkpAMB%EnvX>cmx!Xj{}RjiO`vRcA)yoCATU058v2|xMMKL(%uvBzP& zT)<>Jk?6-bMw<=_Us#U`^eUkJTp96uA>`M0#@V!a*6n`3m383sy#mMj2~;{Q9#hr& zoc5D(8z}~oOYw9B>AL@THHMGA?;L#oGta}H|IKx{eQ*=T8&eohXE0x;>r@&{EqMf> zG7h<~WDpM`xw1<^k=aG-_?&ajpsE5@Xjh9Fu`x}$h#TXqjvXNH0^JGU2(3s>rXY(! z9<#J!2r3c-Xkf#n&7MZo3j_Q0>0WhUf}?m{2dq(7pYFT906vC2)%jRxwY?k~%$M_w z({`=Ax_SVH;(DoX&8SYJeT*+jkFR?zjR_SZY7Cr8nxcFSngirvI~?So>~~VQ9Uv29 z+-qdytu~0*=3ru;8N}Z)@E{X^TViUXHiKOJlA*?+_qoOtijP6?;|ow_Oaa?gH7{rL zP>{wI@z~ug}-+gP1ZOHm};V1hZ z-N4&tCg!cNI3IDlXZE5JE@uOX%!QRjSt-7>X#^{C#>&`!c9P_`>I&gb%-O4~`cL%v)}>nUc1cl?-7W)rg?iZ+=*QSO%5TqS*(a>8Tro@C>30 zu=4DZ6~I1I2`CH;m3AtiBkwe!bgGHd`phTZ4`2DlA^g_A`F&Wy25fBX<`;-}48K6Z zJdqx7b^?#rP>1Mwls10zcyj#=MKYx91;Kxl@v9MI2qB6J;&c^RmCQOf8Hb`e z<*99aT2WxCN;A%%|Hja42xmY3GGJX@PFOk~S*{!xf^iE@<(lyG*yoT8KfZXrkjI3s z{xx2p+(Pl3AURfTl)$LMV|2sLx7}4o_Q$Agh_>I=c|ZOJQ{vjAZx#GmVV5*@%Veb` zSAPr`fG!02-+YgeCdq(H8#EozeD9ne;2|np((}YEGpNi!s)E9k3I37$^~+Neppvdo zHqydcLAu>9>I@k(0CYGybGNT=0YJ@LaDB%?Rcgx1N=x<`!Pn%uuNjlAkZ;#f@5E?5 z9;Yy;X?;^nz>M1!srdt?h=*ZsQ#_U0PQ_ljN9cVH;z3M!$O7PzN7|MtqGifOs}cCo z+rYcz3-OWz9Ye=R2WGTZz>4GK=ll%QgjtwO#_3G835h+ZN&B4+s=HGqcX9nUQAuH8 zGgL@NI6-$^hENaj!~mhR=7s>)#)JmRz};kxzb9PnqHDl}$SUM`j(vh;M7A|$ON(&V z;9Lly;ci?PF5>U40;TMuKF%R?Y}Dv@SB|l4OO;nzkF?K00aP249lKq>mg0oliprGg z+UGl|oJYAl!yaxbLJMod&Vm(zWaBw-c93aBM0Iw7bG6e*rG1;p) z!T^RMxR&Q>a8$-Ql&vHE&)sokRNGK=+SoUU?y1g_atIUiq)aTsiyJXqsjLsiJaA{; zo+V-&uxY~sgzOS|eVJj+X`&bx`UuFn2T?gNnE)K#yA89^5q#pq&%z7OT!1YAIIxVh z?mU_}FJuleX6RVlC!%cIQ6W01n$iIP#2sp#mL=W%qrfFFH)0-yiPW%&31>l|($9l!)qK)_85A0W6vy>F1V z)8zolD#TZ&>VS_ z93>bZ0TOv96Rg~f*Wy^2UwTb<*j1jY@FjFTgM-krIyo92-ys1E zX>%Ygq*Y@WQV>bp29=Cz(VK+!W8xQ*GDKq^@N z&_!pJp+_YYDO3OF9k%Vy1+8 ze=IjK!ApXOdbdPjl)tNuyViaIg~pgpwI@XovTaqyV=ekZYIlCoe0_wU_=ovju8^yhyJ9=p1e(;g*d zY!v|V3oGnuQL*dSA^LFg4{|vTp7|jh&u$I+pYa*C>&3L&2z)Ap-_AD|r5yUHI6Co`Tu<2oCq}z;wcKH>@I3wSX2c#4~Ru)aiX^-jD*pX)_$piSzKZ zx}^QKuexx|e7U3j9egJ%HL7^JMh4vUtv6SlM%H>RNpk;L)l2|A{HIlZRKi8I=)zg* z{o>jn>1yy^BmL2btf1z-tR8rx$Tr6%a=USkHGEjg7@<+OeO2IRg_ahRuAs6uR;iA^ zkYUoaf+l{NNm8^gEWx$fr;@|XKbiu8H?-}Pe>iwjSO62b(L4=xyf#X@r-Or5pMC+a zT8vR4_riArn>*6?vsRBX#xvaQsaV`Sv~KUg*G-#KCuT2=u5rg>z-tC;mT*5czBOx= z6jWnl{ijhEqdIAcmj5nr#X~M>@?3jWbSz_z`@AKnw-j9Md8}7A)^`NB`JLAf)z5ma z8KKh5hdyMSPI&K`ry~j#4Yy-Js*7#fPg>7H0jJ+a;eTl9Q(z2XuFuMf)+fXXG3+T$ zU|XZFE+KiC63bX)gvScZ9sP@`c@~;B)uda*bby!|wcS6Z4>E0L_q!Aiz$DaR62LUZ zGE05MePg2TqlZF$-?rgItPPJf;drrta2wXc!lr>_Nb0#&ui-ZC=pr8qh7e!D?RRE` z$PG2;G{#heIic9%5MX%-4_(@XkA36`xU@ZkdGJcHu=I*c`)|SMysJvJAH*_5Vf4dt z)(U|PdAA1irm6slRGO2d@)i12XCgx9GWj*;fPlxV5j=cp4}R)%ABU~k67Ju<36rD% z$g#%CG^NpinCWRS(D5i+b8~GPyyYY4TV!1E&UI}^WP{eVzKd7Y`Y#0duTN5H!nZRT-UB&4M)du@--P0U(to%y*B}@ zI7`VY;bNv|Ir_X_O{-a#SP6pe_y!)-Yf?~VT)$i(FOgi@1LK`7&dGaV?bFQs3qHu&#Lo;{EUU+ z@^y#i=vvypYp!mRE=`whxldc~~Q*wFR7qIj0)#AXWCuya|#;G!NK_``7& ztV~7?OFjFY$X}sMrl=wA#HRAE3kZ>AF@)vDnD)pA=k<2A+; z3eZ$;zOKTsl~jingt2bvI;^Q!#YT%sxAkl92F?;ynEF;W+VZdxvVljiEiW7^N{5Wi1 zU9j}ZAg}yr!GPbR5T@sV>$`8FqKGJlDHnnA3kzI6h&RpVP{{Y#*8ooPmQ=_$o z{#L!Jg2fQUS}W@+sbbrmIJ+A7&pt5ocX^iMIa7f(zK_52JT(OoDIGB4pWyy{|I{$j zEm+oI75f~f{A(~ujbiDpJ1f~+(6}mQoLtY(j7$r*)9Nn8mmz-K<1lQ1{^IkCcWo07 zlh-!W{srvcy#Y^L-GC3g@HA|1VjIaKnbCt;V?XEin5y&WyngciTWUNXDsJk+co%K_ zVR`pT7kynv(avqv_zREY%{9M#4RQs^v1(%i@Wi8Ic>dX|@by>UfW!N@VKP0Jujph! zUwAvhon&v!`^zedJI2=1hj)EPPD^XZu&l08zmLaV%?u__dn+kk9$Yt1wLOAR%abMPm z06(jbRp-ogJ9-O**Z+;*w_qP(#_w84tWQ|$8(*tr1e)`EE5MV25UtWI@jwk$Nn1>Z1Fj_uJbJW3?!m= zzZSi(!K6e&U+p@c@fx1t6z!`z!%-*xN_XUpaL^vpw?b3f$lgjh2o`&I)CSID;qkQg zAZ4e|GHdc9nBYCrtV|c@S&acQ5GGyouYY6zuH9`tnSjPw!KIDN@GmF`7X2+A9QJ$! z>lXcp9k7zF+4CSwIPt5|Y5}7Z;0YFRd~gdMzOn-!c>j|yrOXDCFumL#G6|iGcMC>Q z=xKaC;OBe0wB|odp>(1i*MQx73+MN8gMS}$<8i=emN{t0a}1z=>UDn}|bML6xeEj!yVW(&{zgDe?J#O4e7dfs2$b3~121=2` zyIP-EyDd16=e{;SUX(7Ty9>7VJ3+?!_LO7lRc`j|rP?sm^-~MyNk3V^Lra9fjLQ$8 zghiJUWYE0U9AoWhv=jn;{jbX$=7N~%m6H~lxNm*{8;+%e~DMD{J_7j3l|n}>t!&!PpF(}y*o)6Vi>HI?t1Js-rX0r z(`qyDHA~}}S#AR-FeBMA*=M+k4o}>X@WdU{;(6d?)-sG#+n_po{qZaAzg3Hvpf?%0YhF|yfxf-tMAA`a}KO4eCD$^nT7vE6K7*3C6;^ZKR zl4WhdQ5Xz9@Gir3_-NmlDwxxQ<;9k)BCwppVtD|w=@PD98pG9#IE-{8Fx~>kAF0ul zwo;FuwUk{1 zb?Cy@zOOOVeas_1x58F=h-$)9i-^R-$4q?e(;v37{S|U?W?cL&|F)j>pBZiYcT#xa z@8#Hd?G--t^oRTn&qL?mtvIO_eC5|b&VWR$Ez^@l;i4bMwkmjL8OOi@(J*X@4Xh^c za{2&ex=~0jiE3>h#ob_GT8#db=f$>BTa)OnoM-R0BlRyS#p^+R!YI~W2c4$k6%KF5 zII?W3t(=K{uFG3Ryij{z`@5fMi2^&#v?C3l{odjqJ+~}X$P7UOwOiabe6)x(5Dc(oYNda;Tl|IDqu#Z_+aFi)Uswc@K12`96A zuFz{E-Wx>&elziIi|irDfsMqhQ!-34X9^C;csPw?l9wpmBR+)Poe5mIyaDI72y-s{ zHA4*U$nC>Q+Oz= zPt3cC*y$G22;n*RIWL3e1}YfimWECI#^o+}L_x7|WcG#Vh`LS@@_O1{9%8;jXmXj7 z8)%GDUE4H8`-R4d=TMf@Xa!GOER&o{EdxT=-mhuAd>KyW))nHSpwNX}>=K^Nr(ueg=GQ(AqRYO?!4LY!p~3~Mtu3t8^E^kbdU%M3~yg7#P#_gGq;vhT=P^KZ43 zL=?!YXdbTzAT(IPLVs74qz30t*vUT$2}@YbkKx?z7F;;LCGP*V_*^x-IHbH+0(W1D zIJ&;yyT4hte7C~lL6*ovFcVLCF-#Vx_YOWo`WRO5MCiuMP!H{%#;f5-7f{NBft#FUHS?VxeiWtEecRma~o zxkG|l8l}4O(R%H)Q$k>k1OJhKt?{SYNBYU>+%4{>Pp0{9UDhg)>p$;LZj+)8a=HR1 zgynR0$Fk(yW3@Zoj#+c`LqS$Rqw~YADt-!G2kor zy}05G8pqiINEKh)vfleEiJR{_li(r;t8e!-Wj)JWyN!W0dlfJzhq}>bmv)yEw_0>j zqgW?s{;Y^-o1t=~bZ~n$T&iPbr7WeJ5@vuHy%Zsr2((zE>CB0iz8HIl5N7^CvQqQH zs9Umh=1IUE7SH2>mz=Ja#?=xuo#h6qnG@9F71oEYU!k6)n`1_FN5s7>N)KFpoMPIU6Ah8!Lc|=eOb9 z-WFWHcLb}+97dB3Blsx4$bxt|hWMl;0LQP+LZ}$fM$ASCX{(LO)9UxNsto6x{v`kS=(^sDKpr%lYrV(S%07=>54HTah+RuNKBUOl zGU)k`_xBOMZgMLzi(Og3`}hR%i7x8L?_0At3>C)5dALLtHs^!8{P|~6gEM1 z_0!Q{uNCc#T9>OnAz)B?Hy%rBpFFmN?g>WrY+L*m1zCAV+VK39}bkOmBRv58ttL1*kD8y%IonjT9?9rC~ zKDW1%f8Mx#oU?dL`Fe2*<|%Pm*jtM6YlOc|4}_fY+Qc(FkOy@C`VZ zuL~GHmq`ZlZD#DOFwW>yUBP)y9M=TdfI2Ve;V|rcou$Iww$CMc^VKZhtvy%nMPu#H$G$3%$ znP*S`<19zU@R4Zhbg{r_Iq8|ELP`Q}qQmAu3RB`W3^ot96~=5JjMn01ML_Z#-~&WQ zFW=wf!NOjI5_%{BdQgB@~vqA+M!jblG80?n|hZNgfq3(obp3Vi}@ ztl!m-FtOnv+vidEwpu*iu;g2^U$WNE(TIEw<4qh?w^^ zVJME-K8yM8hs>`fY!59FA$FB~e$rWX5|6H9jYzO!Z5;vLj;)5ETMC#KG3?sI%Iq;R zF4N7}KH?aLmMqZ7_w~8jb5ZOC^N%Pit^LF(N27*C7?O?>aY~mE6306P7Se{PThfp6 zjz7P%w5Ll@w)2SRSmM0!9^k8Wxl+vvQO1Ii>q4wluyC)GJnj%+QiIR_|JnQRZ{3dL zFc7UTop>{DKp+AEkN^l~Py~}mDo_$B$_kcbkJC8KnpyMKTkHMw{*E_4%o;z>8;@*{ zM^>-`Ey)TtbB>@$5P`@5ad87KZanErZ*^B!SLo`!_jk^@02G=$xaaKMySuu&yK-00 z5-(<9v}tYmbdukdc&o2}^KoA5oC`+_<;WW)3^EdeEQKPHDuWk(34D-#$0BJ$hF{3z zm<>7|UzXN<6S<= zCD$XKea2h>0zWO|W2K8JOF|#M6MTfDhV?NsqGd6gL8N81@b_@!EYST1T#DROvTX_P zV#;!}gQgiT&234T=^g1>GC|&=^g#3A_@uy@#Yv4n&K;SfhKnxxT1~E(@QaR|&u z>3bQanA;1=JgzY>!M7&a)+oP#TylY2TXpdV`eDFx)5$v`j8lE@b(A%?QBX$e}bV+&%%)LZbPy(x0p^VdiKMxfX~h%Q1VU z+|Z;6X^lw39>2`}%hWTaA;L2ThYa1=R4!m&IgCpp*fs| z2tL=u=Zhj-wl8W^WZ+&*T{dt##Jp|2Ha)}j<KIBRM{)fZPgMWb&L^gQE?68|zB;inYHBz}}| z7hhtJXiN?%Z~8EwPEZhxVePDt#!rIxKJyiwIJOw49RvKqE&9}^njIck=R$@7Qaukr^eZHniOq&;O1v3L04=R^Z1ZAtsGCn9SJ>BKABIm zmxGiIlpmC(gSWt52+qEi#ROlkENX1rkD?4S9s92-rGH!YYaTp&$G7gcxHVXC@)RVD z4iielBCv^m4)ih6_1V@M**!fkO?E=}}@v0xhit?KIz=s|v5~vR5Tx|yHNbo1O6^YljD`nI5vz#lViga(r!0s$!IE3-M)KjIcW7+D2nY`Mr*3rr8Ux)+^!NzRc3YH${Z@@7MQ!YZ458a? zz>~E$c5AO|pI8EV!jEqd*-wF~j(Z83dROSO+Cs-|?Z0qit)|hU9vzl-9MgOe!`gf4 z=l{l}++ym8@PxgI*O`dtmbq9bV29FVZLQ$|6>d}vWc~JHH&*yP`YQ?pQRiYmGeQM1 zsyaMeH=CpA4p{-NR^QC`9=ML+ScRe`5~Phj)F{iMN{m!W@zb^l6$}Z@djT8CUTG9I zIi(kagF>Wb>~b*mF=GYqR$o1s8oA)C`Be1&*O3hB%Lb2!{5Hdwz4`>VR|4TFi=-3V2Daux+Tn0r`lP9vu{$QQPP0i_eAf@63-?V z-w=N(U4#w1&S7*UCe{oiT-vW2N4V-q^t^XnT14ujW4zVR9BPtn*FQ!6sqT8;dOEGf5)#bL*Xz7B>B@-v_~w zy|8jgHCRWZ;+L3;^jOyH;%dV?;dS({XSH3_z~Wm@oAKuJ^}(Cz@YYNzjV|m3-oGv7{CPMuVxW4id06vYl>EL;MqjKTIO5uEqD|7%o05Wuzmd-+ zTAKE`$HS=|bPQrEVl~#`3Ey%eGhZ#A)7fj5YqHVN$fGtAfC~RjyxPK4%2#rHO+^~7 zGaf|VGW*{9-trQUZ&Mm;tv6ivCU4vyVNyJKVHKCrdhPb1X_HJHiv>@|0s1T$2pTYx;uq}n3@NOF2 zs$tQEaM92|pU)-uBW~!9#RVh`x$qR+a*oA4ku^a#{vH!rX+j-5G}uRZewGGM6V#i2 z@4As|0!CfQ$I)~9&4R^l1qv(3;NNuuWC?Z(Hp$PlqDgZjzmYhp!^m@EypB#HOT88t zUu^~mJ#HKfzb8gU$qrN7DffqlTPhCJrqhqe*-^!?*|!WId1v!LxPH1#peY}SS88X? zG>($zAR=BI{I;QHW)KLoWq#gV(-~-;h>pV(#n*jOg3>i~wk2X_#X4geNc2NwEh@f` zbY@Uy(5)GwJmHJxOrF1|Z@v5M<=k1C(rOS8bgU*k_|Hk%m&pFSlM_aAH$ObL5*6H7P%@qsb^s04> z$-9m-Z>K1NK1`#Kqm#3S_Ol?DcvndllaV!^gQe?$DFN>s=F=%2+X&YH#<<-%#0bXz z0LJ49?2N}XG2XD8*VkR~U4-FRqpvPXeB0k$>nv6zzivy0`}&$&N8I7Z4RV#OlRwY0 zp1itQ+)~xC9q)bBPymY;$({P*XF8q2WP);PAOn*SF&K3Y=671okTNev`OKYq)(^yd zG9?g=bSK^JB5ALb<4InVN&SpN2cJx`^k+6x+*W2>wh`u8(>T2ScI<^z?xslU1=~I+DN%HfaSOXmluo0g^ z%t!GJ^Y{eqnfaT)E+T9}Mxg#EP$d}!;y6t5S~?QKk%?N~wDY3Y3Jp%IkFftR-yJ?f z1Ar0Ktfp?WTuNo4R=AFsc&WUnfrg)fF?~^8>e~)1WJL6WE6dB8^jRI$ms%2H&{$t^MpmprJ)BH=+|()1}WY3cajb z!($!((s&URgZekg=p>9@tT1<*N6!n^4s+_vv{~z~z%@7GdTQl(BH>DjNQ!ZYM>b0; zWp*baPSX=6V0mpw1+c^X+A(>|P>vSTU5#tJ z;7!Vuk5d)`x+rXm7(@tXF$#(g$re|8W}>cIKr-HWCd+xeW!fEGr5Ao^l!scuG98 zixB^b0*k^8;Wy0X5C;7bT-(@z&CTuVkwO_ZO8g>R`1^X$5!-}gde^2X?ncqJYttI@ zyt)>)Mf#F!e(#2Xzd|L`+fpeit2Q}LxNx2NySBc%zTZvBJ5EI8kH_O^s0)TWtK^X~ zlR88Bt6FJFpA>j$ttg0+w@l=1C@$H`vQO8jTFX@Du)?PVpv!n2A4!KBg1^q)=4oLaQR{oXfOZ zCvX3>Pc!3|bb*AmbWKy70C_M|cTg4Jy{F~Gi1Qom~iq4kdWC6gn2c zjlAu{cvvcE-apLimI56LUQel<#RM)D^feLJh2dB@<8k*nEe&vWy2<{M-4$g(@|c1F zfpFNSU@U5UXr7mN?~VU_p(4+(cP-_3W4NSU`b~`6q2+;@hFdT~q=5~KTzG}<7gK2L zBc#sr`-?*R0s@{S6u5$YLDN*tw9%+5Syl)TA{~sABy2Rv!_)7>U}*`iZEnMrt6Loh zetmg|$20tA^!)Wxngrn2wsf7d>pi!xkD`yI?$3A^k~bDClxTZvYYR3vx1c{7X76mI zy=WP?5H+{y(q@*~3P(yZPIkgqrAi@IzltTy4JmtzII)`Q*A(J5naT_M-~XcJ@5~1X z-YD{ls~nTQhSDP^ZO-2Snd8JM*?~aHdY1D-(;)>NAV%6wOzz7-oFgV`gkARaL z=9uV^*0)&ab0c5JL(S54UaY*!QRQmmQVZpIZ^f>6&BZSHL5GJPI8>p{1;=$?Hy$Qis);fEK{66$E zR02?d#lC9Z&;2I&zUKg82of@T?f4dj7@EtuD6LJ{{6;k>zXTo8FjlwXZ>RdjIP2NlPah9b}1o%{(2hI9)7 zCj`vV63VOQ3q_>-^B5>IeI=W=I5RI{stXy}zg>r+1HCADlB5fwJ?YJm5e@cwB{?=~ zgk%DFt(fpOG*DY14JB{9+#Wn>ajx>o9N}1?sEgs!5?tNfh6|UsU>g9I8b$o;o%qj6 z86_>$&*;ZD_|-gn9*u8=s>7N8CR$*PVU|u@Uz{$|_G_#ByLgt4v;`wIY}CYldh;8- zva-EStu?`e4xZ4?m1`St`N{_L`p44^13~`?UU}{1Cz?z&koJ1nw&mAE*!;){uaJD2 z@l3jgrCvcKA{|TcvBJAfe^=#2SUVY)REJ( zxMQL&iW+=uPsooE&ip-&g`8`Hl-q8|R;8NqR)*T!^PT=2Ba&ihhRQNrE)Lh~Y@GbD z4Re)JmxV5$XQ4&*(`3jj2Ns0*z@pgQkf+xj)O0bn_hl14r&xsD{hz}{dVm|X)RK|ixQL_>j3LdXu_-q1B zTkN^Ewz=FZV=4`g9RxF_07@mQU6HP}+hnm{RKQ%cZWmf4>#zdv(0Qd?px4IROLcG0 zVn+ZJO)<&r0`tswP*<)X@?j8bG3j!YGeP!S8^7#B8p=Gw#^UoOaa-$ae+!bIbWLa; zK)`hnJ7~|;`;OvU60k_fM(&YvV+i;I{}}XF;PS={&Rp1miyLz|u|_nhyAtqP7jG`w z_OWNETV(IsJu2I@!f(^Ji}WY|{hLy{;HqYHt+i1*qb-$ z%=I;#RBzFJBgfdLwA1fRw4|wy*LSVoF5fjh_l=S9jd(ANKL(x{HA1<4(!7N{5-H_> zb|_&|Up6RF@$wb zVHPDR9WfPyqbO!9VR$B+G}vO7zo18S-*DCO=xs9bHcOVNec>hUrkuzI#KxujEMrnM z9}a5E+w9GRwPYe~aQaL}5)6bft}Q}}?2{g$swze-n~_#6G$l}?jW&AJnfXQnf_N_s zv&9Dz{xl!B@S1^f@mfzLCkYUH;{?&jUU^CyC+-im1l2@SB+`oSXp6dvL9^$b8qAjZ zG>gf`Qy;%23pu?AJaI+lYgsV|vCDjISrWHI0pqr8IG zg0A|q*92mrNHE#GyyDLapNY05S`9&o=#5}J9l*=4%;C(-Jvg!outWr?dhOTsD!rE9 zYwx?4ZiXoXRn;-VaCl1KBF>BJr$m-CbARgYf64cGOIdKfsFAq*&VDNmG&MS~2>&eR zeXm%~LPl5z)zZ|_*y6ACF3FeArp^dP89zLG9@y%rv0XQqG#mzDE%wFT`BWTbvms_Q`(Fe z_$TGRTHJV0Hwb763$YZu-;$9hxsw#vq|f1UAbnMBNc?-w^Qv!f$Vwo8Lhr~yK<&iH zb>mp@ewTfi#gk@8^L8aGqazXjO3~>GuiU!0`_A-1M+J29@+9-W`l3X+ zC>$|KHj_?$HkCF@|NfSQ-Mp^D-)M=FVO3O;Dp_f(O-o<2kkHwsZm1-)#h1|wW&K*I zpGivlwYlW?2nQYKX%g&fpk{@uFkd#npK@g=v6jyi>E3gcfI~8(HnI48#@rw+Q3ACR z@$0{7F$7$P;?0*_W(&2o9{?@brMdsM^^Bkh3X=?p*kk71oySt2Gkrt603qHBER^YV zJx(@CR=iG_jXL!wX*x+i?g7}^K$>XWew95eh$?7e%n>gf?G$m885M?R`t&GUOjK87 zSit6`H=t)o1#Xa_Nc2Ys;N=Swc=DNRFd+dDUaR8GX>FcgjrngXuVvqhl&-{JzvY70 z=PdlyilV>-Z5OZf;N=T**x8vwZ!pTtO*<1MGD-<>-eu}j=5#K6hC1Bd6}_uOKimdc zCdTXp+*TP6-EIu2$=GZZmXvRQN>^Ru)z~R@I9h05%>5*d6`lb|>zEPEn2bj&Om5FT z=*>zGIn5V(&%5tEmJNbKoq3h~sTG3O!jUWvh0Uqwo=xFP{)BL)`n4$t`e921(I?9% z$s0mK88P#ESWZHvlTeQUz`EKJ=6T@qacLt=+EQ3bgV>gG2P{Gu*(%~&*&+s#0R+X! zy=@n7O!8UzzGB%EQ56>N)-vpU-(*!>l!5Nms3AWs=H22-g4mEz-@+$Lb$tX2TQGRl zwL(gQV6Au_F?^1%5D;+ODh)u}5!>@upZBPS*TvSQnlK+t#8+<(eml{_bMXrSVaz@etap zej`c!&U~Ds@9_R6ds*Wd?_J^`~S z)(h7W`pe<DubQp61|s7mtpXG^2c8lanP5<@%|4XSN~K6`z<-0|*#xP-)ZF zck(^8d1|~hPk+k{?ln2y_TM&7t@@MkhS!Q*dv-1Q@ak{dV72!0vaVhGe2zUnm$BUB zozK_Nk`7_^l)>S=$d6X;KMwlS`%D|B4cOJIyc>3osZV^Aj-O<1+^a3W)V_d=)EQ-j z5VsTzO;how-^Z(U$il8aqR_QDZ`h0^vRov^1OY_NE!I&M4Q=DY(+0-Ik=l(% z6K3H)V6g!E@s`9S6a;JI9M4Lqai!k#V?0+F??NUeKLHitqs*lF%Rv%$%4_GC=rYWd zpdnSr^=zp#egl8>B88C3grim=j}0%u!;T>9ge8SSXV0g{$cJ=4tCN_mcEv?n9@u^i zfkpgM&S|xANsyy;OEAPFADlO!KuIh9#25%Fm55J5D~Uy~kpc6ZQk!JO#zclCj8ed> z-<|3a2Bl1-kTnW*ifxK3GUHzqCe#bL6^IyM8{w=ST?vxMrxJ#wc}m7azV9^MmF}Q6 zvS(WR@)|#RZY|gK!oheSWdiQ>L+`DiNz9X?0A$FvnyX3)R}2wsiW*rsX-v7A?gN<$ zBa)uQ^&9VqMS@V+N3EhsxiHdNiuQ>xrkpQR?^QJyg4PhOITTOR*BX8oQRMBu@B{>} z4W`+g@G(3K_tVn*7(zY}=g8yHvspv?B8i_c;1Sb|yCXIwzM0KokU~&-KQLqDD}_oN z_Nm=8SKO>~&1>O}B8X+=ougAuO*Pf(w^U z!(&hU2(E72562FttAgW^LYn}}N!<0S6{~E}??E9lGLPb~>6oOX*$wodTF3Ht{DtMR zf=1Vk=uGS7IOuw}vVIes&80hu(M-@Fx%?QOcR@!roAfj za&bNh;<-`7v{43vSD|=8vW=wAWC%+*a{^fq)pT~B5~Y`=9}@jb3tRr$3U+{ipoJHoHQz0 z)v)8XHOLIWDl`(G@~4JZ&mf|3;G>1Z zSM8CNjF%It@qOLtbBX=J0-mn4N$(^vEb(39(p&RtjqR~$8e*BYoJ$Q`{zm>Q>8BG( zA@>+FCOO}wqAg*RYsweEHIuXNEl#`AiY7(hrNO2y_bbl)MR-{8Y!b>9TmoD9S}B3^ z81hfXDkTi38HjtKe$A4kTi2sB;kl-;w$X99hno7G8QxXQqwN>p3K%^2*oZFoj})S) z86}h^UM=Z4i6qk7LB^f1REA6Iurukw3opI`Pd>8=*Cxp0y%+#vmw!!*r62ZPIme~Z zzG-gD_avyvTFoB%ramNX`Rh=cl>espwRw~@xllBuw^8-w_btToTyG!P+`bjNZo;n= zEj5|V;0KRC4d-9E1}p1FU>vu0qD|t+Adwp6gRG?1R+z*g$?6g(?%K6T6EYSmR>?sr zv0~COYS%C4C@*kvjBCe+?9*!T zWDk#?Lc!~r_qg9id{6m?=qS1D)0)7mvLzZ3rQ9#qB|j5-yCchFsnHSFQ7j^3Ndi&= z5l<1wbA0(HG31nKkrAOSZeqq3;tg$5pbU6|G zcPFNwR762V-jq0={sNmkSw#G14RY^>1hU7*@VklRbiEcV5-l$y*CYaPDqGv@RV>$yjGZp$s9 z3*!LinCVi5K3~rghuGe)HWq4}AOeXK@+&{*!@SrhxLgHumoy_fu_@CowZLJS!g65f zJ%_Sirsld z!e95&y0K+eN9je?1J%yUmwmOPMEXw*<`L z`{|t;Jzfk`V2dJS-vI9 zp_TNj2)EA`BnN-eV(+%97BYv@m-Qv?HQeNlBp9-FR3aziUt};9imSHZk!PB%wJ~$2 zz!7=Gu|-yB2yVQFg|3S$J)kxWTwXdEFI8YL{4~ z*~ta~+a71SRp;m^j7ogRdrb71Hy9bhcur$iR9!NIjB97iGzQYa^4vG$oAwAd>?{53 zO-WhY1r+&nwJmw=(D#-hWIR&KX$;B}BfgRIFB8gfo8=mlYoSZDFa`iuCUf}yBbVXa`5lAftt}H5{jz6 z^C6x6XNm`X$=MO1${c}Phmp#Y;Ss)H$)V^;(0*90=UISj`T zF%}w`K?N@|E1G6bQlcn6FPdOZS7^~%%*Lm5_EzRWkbUN>spx!ZMQE;W=oUPAb0FWf zwMQN>axQW-icXYO^obwqF**hd%RpkCg!AYz)A{zQ*5P?YV3D3`Z*^ORIQ&e>;6{SJ zxhK7`sPpXJ>rz>@#*C)o834N~U~P5W^+abh1&x!SX4s8l)>I^|Q3k5Ydal)xd!uGl z^M04#V6o?}(;RlfA!+WZt#k%FdL867Jh5Y@B^HMYwm>s-E`>0je%u#y4pogs37UG5 z?^W@4i!gT6IOZ+*jXc{LJ3G)L`_5Y*p0Y>$G2{}d4IgP)${RyDbaF%=(j7X6fq#-v zG-dvpuXUU%o)DhJd;p17W*$D9C8JjlmY3IHyfK7FpLzj)@WTzb?{0wQerSJ?_BEY3 zeeD%h#C`Zp2q{hVJw?wGucTbgB2O!wj-M8IL0Pa?uFGC{ohbSCS+{Xggks*!N_JIF zlFIj7Klsf_PLM|h(*9@Rn~iIvgi@XK{o1q@t?hL1-|gr@51GcIV`Upj(IyU z!8;xG(h3+QKP#L74JFIK6p<^=OVbtRxjn_-D~cXfRef+@T}qQ8ulj0uZs~KI+*vdH zw)IzQOX1Dd5h7O8UaC0}q@e+MGRZ<7>>7qBt0s|I%LCzCr1zv(4rpzJC`*~3cgA{x zy{&E$U5Vs!DL>+oI;}6+qv;ZED_5g4fDP$kpcpBKF9RzJhH}bBl377+62Hj?EjzB% zu1NwYKTcM-6jsmprAw7Co&uS2%FGxO^B9kixzaBu*$|HH=+#BZkcD1RAC-k<)rpBg zk^mPo{RX9&b|zUmB6Nw_rv;c63@w7fYnePr?qW5HuSF&^LM<>YN_a^iXj*(VLA*`z zEZ#d_xx5Kw@(Qt_P%$x#k$7ERyPUC^t=nvajWDOVCZ#UUS0MOV*>nhn@cp2b-NlaU z4X+8wzVO>EN}wx&kct%T4OY|yH+Ht1*r zwnv&%TKCzaoz?+)=Sd++nYC#zWR&JLt0A#-5S6%mw4(hyoML2gSVSW%{DB)ul(Una!++&u#oK-o%szHfgZL_o=7+w-m-R)llqK ziY!(r(VDG_IwCrg!4_*a^w%H4e6R}FwwB-vUw;bjzvnQ#@2 zB);8wuJKZdJN}$JYiu+YUMxB?BxqN7CFz;^1&IOEF-afkNqk9)Sb4_%ud?#Lh_XV@ zo73d5{eTsCY&fYofa}OLKK& z438(uGEp|*BiAVU*$|1$B$9Kxj5NpJ*`N^WQ*JDSIKapP2mcLDAX&FC%#mCdl=X0q zttdoG(IA0(DXyb(y$Bg9;TXrkZRA!HyfMO2WFuGbrKEv!{pQn;xb@%4dN$A>7 z=9rRK?K#hYTu73cmxBMo#T+$`>06TEtP3;A{9XRW7)%_GFJ0{5DbqYgzJh8$aF!wO zXq55(w%R2w`W=Y^ClviuXUkHP(X@`6=7|Y>B1XJXeG+Jl<=z%cb2?1ZzLc&8Wn0ht zPT?kbQ)J$g;Atq2=Lm+M+pztHF*FzwU;ToK&Xj5*cp|N>jCysQ8AZcn6$BsC-}$(t z!mvZ%%-K=#QO!^xOHE1nt5%xE(S3XpN2PTlL;i8x-IPW5jYrqLI<^n*`x+OesVMCp9C<|*OQ&a``D`pK)}OhK zkEccM6OQt3MYKNJuFY6^Aox^9`N;@cSrl$zcO^Is5cXi4==)Sb$QhVxk7{@&C3%ms zJ{y}Ngz5GJ^|i8&6A_mHmOY5wfs<)H*`6{$R|7_iO|~~^kIN!xbUjU?3A_e~Jpg3w zvtb*yP3B)*Kc8QbKP^I*w)Aun%Jz>T?v}T<5*IR(@)u(6$8GI z?Xln^zwtrs)ji8C<8LC0O_ukj`im0onz4fGP!@C%DKHIJWm!*;78qC-6w0kKyy$%x z)%(m`&7Q5{%v@DRUMTU}S?zj$Ix8;~n!y%*=b3@s0fWh=z>POnfA5=)Yp`WNd>HU| zqK_um0$HM^F;#FkMa#^ZYQk%6ebc{f-i9V6xTz0rpx$-~7t4cjT+%4Wd3+j4D;b&O zSwU$CGUVO?fQ@2Z)@(MQ1!ZfG`sDReqH4;2*FN)F%zwvLD*K|>DU&?Q{Cu^b_9E%I zQeaBbl%&i+I|niPZw8}2z|sKV%;^{4u}7YQmoAQzw+W9L>ga{nwyTnv5vPlNxg_MuQ_MQzE*{Rs7owSR5(#SKQIRP-)up)^Jv>mtHT ztu&ZoO`Ov>?^%gRA@nf}IPi2{GxS5x{Bgi_FQM;#Zvfx^-g)@^m!E{*(qZV24!~@N zKFVx}O=Cx=O)$(F14+wnm60)3Kw5}%$)DIFteqH|x5$6@i+;DsiXP7|Jp2vbf2`na z{DKfj+EdPg=SbA+Ims*(X)Fu?%#*EL^)$!k6ROOCe}Fxb{O*IAKCz1f1LVX~Bzgh1U3yz!3|SuS@eb zvG=SlJjf7BdoM1x=T9^O76p`)eOfCeB3VpoxAaiq8A&hR zGi_XPl+N^uqh3r1mLawhPHGlI!v+5 zx|jOO#zsAF>A;j2rGO&QFo}W+d&rwu9Z`^bIpI9q!JL)0!sF!ArgnwBXm_ok0!)3dM08b_Ln0YC?QZxa*^IAS{iUo^AX!f%rn-bP&rPfsm{+jCDWZCe2Xwp z9KQ|u?N&Tvj^#gHjFq-t>5SklccD&&`vGKO(b0>LoHvnas~`#S)WE3mb529B)u;D#fsFzoXk$k-?G zD^5Ciy^5ko&T}Pm(fkKGjb4tz;}~y7NPHMih)YkejC>RcqH`E+l8=hOJX*7qql4!v zrpy!uv9>Y(RW3E9$}^POdc6KQ^wwgT=mg1!>?_kzASC~w!7Amwp!Ou`mQnniCoS`| zaD>pFrN;U}F$ljWfk2feZ#mLV9+%8lB=Lj&OhV@WYXD#T`V;V-@Ba{1kKP62`4WuB z!JILOM|Wc+Ao2g~y)-b;QHm_uSQ%Z8Ex!?n5zM%6zvXk{@fmq-iLXRi3CBnD3cHj% zz9Q4}0Qlb+v!1S5Hb(|Z2ahh2MtgNE-ET6|$HSx9z{CoN|?Ar#dXws4FG2jGgIg%_t{s9BQD!bQ~1houV$Dq9~B&i|E@qM%ITY`tWzo z0ie{$7y{UbXd(O87Yn5|o&Q3^P*NOJfK` zQYI%!j92f6a?L0~h}L?GQYVcRc0E#wNj+n>@WkXRjF9^-BY(1J)v^b@B1DCvFE+Xn zZt!=0)}VkHrb+Fx80eV~m=Q|l$J-Nn{xqD0!X<<(udTWTx|tr;zGvZv>41f)fRU7r zxSzF=Gp}#YKwHIQPpmDAM=ekkV-vKdrijbqCCOU3D@NzxK|XK$j=uGb2$@HUeJkfe zD+b(F2^)@>lZ-X-ImWfmgD6`w9tY9&(BNG^xcr~Z5jOX2s~CR{rA0xb2e z!F%3*D}4MXJ`C@F_enT*WJE)E4J@x#sr5#Zi6pJ!QlqSPg)*7VVH$F=1Y8Z~Fc=Q# zkY<$9?CPcmK^dF$Fg!Kb#ln6V#?VqcN1MNMrnO1#X*YEL^(nP|+EibzZ8qRbB&VZ_ z>1i<3hGQ%-ZRKzd!$Fu|G!_eTIN$;R0RR9=L_t*6h;WG3!uON;45mBDz}f4;(y#|Z z)=ZMIsB|!OFBXE@xG_Ih=;>PzJq};~>Q~|Xg_q&3Q}+SP1~A!~Zr#IqWozNn(G(S2T*GsNVu7;g*hgH!_(JDN}pul+aC? zkUgP~0L+HAVsRy_sLg!cP_i{pQ9SVnS&#Je#20u=fQ%XCcarw11z8gXjT}-J8J)`e zz(m^G;&wsylND)k+t-Yj954Xj{h69i?CZn|q!D`|CnMngyL z+k?58n04vH!qZU82mz8PvcW2t?ZOhKTQX|x(nhz$ij^g)9%0{@ywh4ZQxcYxzX7jW z6v=ZWGYD-417TDM%Fww*b)YE7x6F0_f~wl=8o9a}zI>o6dm>-;V~w;F>MA0%*!?5$ zq=kmuUaA;=Z=}d^pAnDS4LxpG(7V!k&$v;;x8=c$@)8ylq;RbHrS4kf3dl5?4*jKX z6baxp+;z=Jj^olf;_az+KVB&_h0!oL^~SJy`7BJf&%+%z9fl7*_-6R<``-v3de2R8 zbbxn|YYJFj`>$qU2L=_f#?7BWF^vBk^kHRy*tk3eICmc4l}p=jJ}yYF@0@=13&e~&@QL9qAVwyFBN?m4G;}p zQfZGoTu12kJO!g-pPyG8IG&8?8`$&95(WoVbmm{<#povHyXYLlgI=vhMmkEvpIq|nKAEU)UxXOtNCH4AE2qU(7M<-3^D#|X;GzLht2 zO7drf_UwTZbBC5|p2I@Gl=q7&oJ#0o<}NfqqbbLk%z~0o|?_Z!YAMK%c^y{|QWYuEF-!MOYbLgZuAUgJ1mk1MrED z-2N31=`VyRf`7*q6@iJ^~?!eAu68B2*@UN{d!_gz_aLbLy;Lba4fV*;|2c0h^0x84rN zPTmS9Z+r-T|4+UH&%AUt9swAx9D{jp31&%IDQOUi>Gn8))4dr6^AvdmBF$5_gd`(H zx@TI3SQpDBf`_3vS;nGn9W4*ngXU@3d%Xb4H65(4;qDPB@*4w6KKc_^iBq2=`byZ^ z<(^cFy3&bEGj}mZT=?c{lwH!Cw$Y!ScrLG(pD%#BUIR|8(rq#kigDUL%LPjT4BEhe zb@(7OSCD+GM&C#tVtAAHUm4FBiebF2Ao1^6KM3M+Q{R`S~Z>N=a9WjSi(4`;X1l-PDdvsllxE!A@W?m zyn9&Alkm6_Jc@`Uc&HD&TU#fhqbqyt_YyZaLOkOe#cfjD%+)kesk1k8RKmP94p~9M zXK8R9OSTqQzVYUf;oz$6S^{r65o~M z!9~!#zPqd)!*_$PnwUGVn14`w(9y#Wk{QoS&| ztmFFKw_@aZ9w(ipO-Z4`67QjM7(@PpxwzMdi&p_2`rbMC(pMjb?}g-s=dQt(s{@$K zmjMRL5KePW!}-qMDDI1})&~6@c;-jf;G5rl3VOW_IC`iLcinaz-uIrj!iV2~KiqxS z09JzCVP_7bK`%uDa3omG*}+ipGr?|sjk;bTAXUby$p5v&YCy>J|W6?25GE?e%lC|*7X*q#BLIu7s; ze(hcG<~P3${+Iv#_u+ewJ`aPz9OlEr(CaN@c=CJ@a}qFZ5ef^*t?567TqDNPNk_;H zrDrpp{~{YBl@clOLsycwhu+89;&zo9e2h0MYv{jstGu?YS2p^}2npr~a{cG|>0p5F zWSF)*g7gkTdjyF1XUh9i4Sm-#5h?!Cs7-jZ`Dt45ny;hR@~W_w$A9v*t8`_gX$~ED z(m5s+O>99;HOez-KZG0=B2P}}U&<6xRwScWmOBXa1`r7Z(=(b&wXw6@M2ZbRo-5$H5zsEe zvs7rh)Tc?;%DVN4CZ!-pK?vd>wY@YZG37KqX&}h>Gz_GGPCW?8E^<#|oX$qf_ra3U z3B%oDQpyDq5eYFb{gWWb$)5r~_|#-+RU?>YMRGi;s8mK@u}q4jAkniQvxxC=hYYK2 z8)rZ!OC-1`T0&U{m4#7^%iLvd6)p)U;VD~vV;?E$R>m2=^9>(l^b@%S2*&I!uO%Pj z_HEmxwUb6nM@C4=P99-Tp%I5(F_)k4cuKE$v^vvf$U9z{&m{wjxmRqYPzK-ZA-Pip z&g|awj^pH;0tm}w@Jz-XVhRc2sV70X(wqvh$}Keou1R54-|NN-hHRAw619e!a+Z6YlZ4V;&iNkVo}Cx+uJ;=ZNLmY~xrxTWyf(w}C!~9HW*zrz z=x7o>|4YLiIRDZUaN`X__|;$darlLwy&LYk{U8MOC@9TgZu=BflcS_s1qy|q{ZNY3 zXeD1YiQ}>ynHFOR`5(_`urwUNix+zE*)Kc=U;5f3@WgYkz{{^}!?n#|7&r)XSOyp_ z!=S$m{r(UJG1Duyo8mHIJ{`jhR$w~424^mf;gug;gGZnFI{ddUJpw=W&RgN*KlNUC z+dadWWOH*2FzVxxfS{;y=s3w1Y^YOmUmBq0jIU*BGeStClP%u6nxdd-BmQLLxfJfx zIt)txIL_}BmX?Qb;c^fDHm!Q`l zkeejtzlbt=6za#YHQ9vm)(%{Ib_&m(c?7=vjpyLK@4gFu{$p>42ks6=gc*#-5RZo7 z?ZHyMxAKoKPqoc0@gC%#eayMn@4>O<9z6K&5&XaZpFah^@ta?T&wk}G=&jrW!{rkp zyalGyVBjN3CwvqWRhUg9WpYW=99c{9<;3svNQ=RwC?@0Ojz=`&WHKK>UR&li3PmUI zZZiz<-;}JarjYKolssE1#{vu``=s9uxn|jwHKD8}X2%sLTtq!xClw?a74efI#gmMv z#;k@fcu4#+;g;q_^2yvunmYk4){(|;U%u%X$4RNzq}z$e(Pko@734$@S(s64gZfo` zGQXB{75D=QDw=;r`C2CAMy|<5uG}*l0&E$QD8pi8nxI**QA){*C&;t<#XZ|F7e;u999#DNI2$jQ9UL_m^4I1Zh}QhU6`vg4qd1D3Nueo$bZ|VK?FB> zTJkemPr_n{#EF~8?aEB$IbvV7<-^qthbi-azL7!_Q0fz{-!Y?VwP+1x;{1y}rPzZ+V%?63>jn>cHVDnsJh&rt+-2hwo zeGhGo_SC((%|$V1I#ce>9RV-py`T_^e&u+IL;iZ6qEVZ4M|096L6ZLFC;7Mh3xCBz zfy~>`t+)oP1-v+WDgvLLk$`9o31dWOA}m<|lSQ_D(XCH%I zRhhk&D$mK$DYA%FIS=9Zcz%Bj1Nhu`UW7mW%wzDCZ@dUkJ%16#vlUobKLX3^2ViNq z0{wpQng*JI^AWCx%eNbaBvIjZgdV_B??}v2m@mr zZZs$^K#zEx01W#8<7p3edNWuZ&f$Y^zX6s<55m%NAO8IF&%o9gVC_IK0xZFJ8s=$) zkpNjx61QO_1w1b~$FQk4msp!bT0%6aPzxiJN{lf$5uY*@lTHhk!{ppAQnFsr!P(cf z_-*)m)icEFZ{pLESCW$it;1PH)!%B_5BGsq&D(~{_H}lY1!J*?>A2VFI?eE1O3sT) zveuib20f^A2UfOINs;CBUE=^MhDPSKq#vc~w3p&5DKDk5qnhr_D`&<+M<#g={q;G_ zo<$PMr^$j4;n5NniLEHWNx?}@u5dhwFXe+m{<}_v?_DhM?^)`kaz)?aB&B7MhEX_y zyTa3P(4|MZ-N2Cl&MQ)Dp5)am>7>~ZHh*FXoCAcd!<}Sfk*cd1t@Usf1XU@$i+E@1 z3Vai8Jt5gI^Th=cvw)OWo}fo1Q1RgYgFu->?ezisDYtG1PBJQ1i-Q6}?}NlSqu)9myBZ7>dD^N3xw zu9j<>lBVW$(74{3*KONAYBB;WB&g)`a*mGYRTq8Pz7cv-!z~jh`i$4#kcB=fmnN!< z1sETgwj(0(8XZNe`OB`Q3oaMIvxhHj{4MLLX-W7C$B$wljfqGQE$23A&&1OhsiC>a zJ78>pE{r-C2Su~s91VgZ+n>W^=Q34|es~Vs<5^6Kwmj;= zpvM$OF1N*&>-8}ZNQJ84W5g%>eRyRX;A`J~8UBy|>r3#(uRjj6;bAy%=oUB>&Q8M; zMhJw6qYz6@f_5_AM5VDu0cLDO4q?{)-ZCt$tiam(QJ76PVB^|(__NP_51xAZNAU86 z3H-vx?tMx^ryRB_cmfF43u>A zu!e#WcQOUonoQuw?mG^{fAmq<-1-cB>6_2M*0m|D9=s8z^N^5Yh|xgt2r(&&oU~BV zf1+2?RxZyvXS%MpnE6E-fgM&Y64Y9js&Q4xA7JoWWk zH#A~3FiZ+%Oj29&M5eRTBFrbZ6#v9Czvay}g)Muxs)6BaMw;j9SV*I2;t#=NxX2m>7%ATY!pC8Ey+NFD{Lh4m*R zWSVd3F;+Vzhis9XS8xb1zew!TwQ!{I$ME8mH8r`3V;#za5VyJ}4B17<}?)?uHYG@s7KY@Gdy4`{^4rM$nZ{O2tWicEiQ(ve$z$C#D z#+c1Dvv{$%@!u33M!Y#YAw8I4s6WwdPQaVTlQBxNMRHoCH9+UPvp!&q18hJ_#|mOK zP4}zla(SziFS{4Z-_vk}EF$_6S0X|_0-oRIZ?geEej^U`X5BRl z&vJO6*KuvdN2s?Up2M>wwoha|2lx4u22dy5bC&9hLW{^rZZcvK#ML@_1(S?x&0VpP$ z>LB!XEj0ndTWnpubW*wHrQ&7U#R|xXXf+Vm{cT^7ZLfJOS&#FyomeAtV-Ueq93whRx-EB zqLZqX>z(I{1@PQSK4MX>IjM{)+zaN3N{R?Z%S0LzAo6+;if2{%sL@Ymz-3lh(?S-4 z^j`6dXcj+RiiE2sD0^*I`_Iv3?7gJqI9ZqrW2#vCb^q9Qyh*~GPfoU({Cm^)x_yF9 ztc9GLq#{f~Fs56+>C?hC-c!S$S88+Hg@@3-$il6YB(e%m)K?PjBa&0T6tSoA8dg+> z;{PK3LT5mbi9&=B8#uA;X$)Pb49jB}490Nr<)`4-fhqj*C*BXA{Mk3ct;c%t&h+5< z5BHr1e-HC?d3*_TH7vpd_R8P8v`Kt6CWQ-m_(J$L4B(Id;u-i?|Mt`H%!^~_uigTq z)e|u9FX3_u9{(VFrDHr6%)I6^?Lj#$L6G+c8Qpt>CFl>AVeQBOE?;^He&-Lr1oO#N z_{YEcF1Y8`wHS8ZOY%=v^IiIJy;OhM$MvhZE!(H8SsBw#!TDARIMTfU?dZ%>-TtUrR@ z(h|()L)h5r!*Bh;7hrqy3j7cM{RiO2BXbxfncp6n@n|{G39-TiT%{fmzZE<*7?Oe* zKAoXc?agl-!T;8L^at$theS zD*EY}T^l*Mv7OUoEWnZT{v)|H{ULJ8Xt<>DwvUQLI{T|S3PMaW2ynh7Bm(lrhP1&* z_}5A%B@;{uGBk#Z&8ZM5>PQb6y+dnYN^GaUD%vE$Kw9dWHUts#q{2y{#ZO!5R=3R% zu}FzHA#_`4D9Kg^OUy?aEWO7cAvv3R+^E%PIE!n3Z>pDfdv`hA-xcSzZ@abAL=3Xx zmjzpC@MvCBnTgQGS1&D$)JIarMJ8HO;!#0jn;89+N|rb`mpgMp)$+thY$68yn``7Zq4e|ZefTc0?nAB<#u=noIU`r$Xg#f>5S(O-NYe)B(l4=!$CHuY_xWOPS>k+X^3&g<&}`R^Q- z2R)dF2$bmz-hKa3_@z%g2ycD!EwFLH@!C#bj%V6aics{wg$B_OO09W}++nOo z7#c%gMjp{~=d9HbyWl$PQka&Pj#`>CwVu;9ma-ljHj>sK*Tdl2_+R#5_9D$RDHk7?v0{N0t)`t;h(?Ve=erglCe>W*6gC!U<`c zW}`{rthV6uhwIu6au`$+7IO%)@MaTn73b0Ed_EiDC}|+UC9?91^X54< z6){+kHyRY?NRXfui->bIl&}tBhF?K}B@N5rc8OL*;)Ky5!JBIFTH@c~9F?L41gZG7 z3l2z}rQt++t7UuhsFXxcod>!xmJu;#hG56Y3{3BRhjlqtcw&hB_wJKh)o7>g&%&U< zGs7pEkc8JH#9HGEjYAr{Y~kHWCZ19-WobZ?U8 zY*xidZKSVV>EgAg;(0IIzV*D%nH8k@h=$u>j_LK`3*UGNe&9fu22%Q$L}2PA@5zz{VD6I?4jhj1hEqn9S(xJy9J}#exUe~b-~Pidz-Pbo z0$kdez|vq2lN60Bao~D&wN9p#H0Aga>j3F?IyRYd8I1Zp7zX3h_5?oq{#)QzKKWy? zzO)6??JLlmg@~U-lZcj(%#xfQ+&?S-)TP=D*89%@WhbVDS}ABagNaXA`P7rQb+LR% z;jvN{p*6dcfopAvA4Svax(V^XtaOWS6sCmySuR)yf%JF3ym_qTUR+|7cDgoOzV!?o zUGUbEGPJ@~^S3BJi1jG*c3Hp-5+r?(V@i8Yeot~JC2E%f3(Djqyd$rTygSMHvXA#ef zEj0nWSfBz1+h0_yJBEx?8?;dJJa=HyfjCZkGnn)^Efh&;+07lDolpGpsUZ!-XhN>3k2y( zGHJ+A5Twv%5kcU2pu0LBt-RsgCCs$5p$%b(khE6fq%ej$3{QU34Sow_!@wQ-m%npA zpuJ;E=%h;$pB0&jYcxd31@aGP%_+JoX>z0SQWqK0=Z&`(^0!y-rdO}Y<0N^d{izq0 z+DKWLO{aVgm1m=?~(4Ss}n@_C3ul=2O!bcvs6(+M84EsG;%F#Pg zAPpJ<-Y1SmItkrk9>P5tZ5m1v_2L=|R~CkF{1?t|!2kJwe*qqO@**rBI0Y~`0OR>` zGyq^?v?25c!OX$uKNFPc7KNA*5a!|JcgX3K&LJZm3OSr`bCAa`pKp#w1cDcN1XCEn zcshh*C+~vi&s>B5`1_xR??1i`TcP>@k84EUot4tpkFvj4qgaPoP{@ypk5H?}++65T)Lk5Fs+TSd9l_BDq ze-yHH>rCr$avRA|R>g_ahTst%EVXBOZ05VY7#}@;XXPkM*9&toQIbWi(&-Nh z--n+VnZgDfmJ{ndB}b1r&8u&+p*qG=C7ZsOOQC4v(I|hsUh(Q=+1u*3xgx+bTvch5VHS$6S!6Goflx##y0N-~n6t;X< zB%RI@@OwYe6B*jxqX);}NDJ;_aZ<-AiqYMaX>3xtrUgU_jTP>~Vu|O=assk+#=9T7 z!3>k^!WCGIS`y(P+{>zbLBaw{L5;$e6*kEr#%9WCN!LY{!eoOpCRxQ2E9fkYGK5{` zj@x6!zGMmpH;&sLBNZ@76T)po(C|ENQUM>EPJ|^;&pivY7=9Jc!sX1KWXVHsO|%fk zu37lAW1}|Z8L!xWIM1K&V^0D(o)f}kJBjgI0$dOVC%1vOo+)=g^vIYT_g#Xv+&rNu^6e%Lrr$mK$Q z4ofu9&7e4PM0nKXQqpKL042GD7N)2xM?$$sV#K5x9*%);o8m-|G{%@~hn$lH`#eaH zVPEimiplDOkyZK%bRr-qv0K4X4r2D#LzXK@j?4NTuGyRiEau3;MA{+%(m)|2eM|X( zoKdCjKy+AqlbV&gnjLw_HM13uLX5eHbA9w2C8lm(4^mbnlA=;5HWmpyGSc5z*>JGP zfc*3wwp%{m!YFP2#`|7!@7-ABJj#c&BngxL z8~2$#J>b==SmNr+jnD8GX~Qopr0%7pEySBs!jRTErSI^P&qc3U?JQkZXovvtK0zhd z8;=mY)jNSZYYbC{s#GI;0DMN$6>mk*LmrZ6>8rFJ)Sos+%QTkcN2pwOjtW-O$ z>fXz`X1XOrD9WyoS$5PC4T1`nimHi1PhiHjwMC=NtRCiF;h9DRb^-8IlcvikDe=rlOHc zc!a^StC4IsCHSkB`aSsG6Q|)*fA&qdI$43G^^-8~hva)0$-q*+G@y_o7Cb&78e$5g z{tonJ*I>4N5w}^MHYKW$Q*(5nka&CG-Qwe7S*cta={oqM};UW0U z7rz4!J$ebQPC~8#hCTd>{@HB(5y-v1#Z#Wz90Gfh589m#WxZfr2{y9LNe`ZUdK3Qq z(|-vUuMXkJ@jIgDKYIL=OB6{z85agwFb^0W^k=X&pf>@SPw>j!;@Bqd{BR^-HXFiVbP)P0$KlgodK^Cc^(SIP4bEv&GWesc zc-z+UqEVHxpORCuF_cV^;eVrG^Plx#eb9$@zU3%<ops81t1Bb);xvuahD!B|au&xRqn2(Fea}+1E$Ld;vNxPS(3)AxBSc(>P0%Va4jU$+4YV z7s@|JEO1hKMh49_DgPzEa}69qUL9tyx+4|a)q{dOv}UL#Tx-sRPT5p;UNbD77ggtH7CelIQh z$5gGXYz(G0Tn+=*_4ywS@ix}BP;ocw5?&uDAv-7wsean5@)?PE5Wqs+rXw8s3YX5m1b3cXflqww?QrYK3H0Y9j2egu zjl574Ux<|Z1E0#@^#tXZs_U=EMyM`s1AOzl&%r|vKMgB~?}O>^Fl>(l96?F6bI;Zd zjCYv8czg}EHZQ?^axE%>!#;+EN7ZROfNL8|F~j_5`5-K<9g5lDacCjzJVbR!0XdYA zIBp8dqgCiHAA)nQoQ1D^<3+gl?vrrO&7m!>>EUUA40pRfX8C$3VaCEWd?7!@b7!{U zGoODFPM_U?{_r^TM~7gx6Xfe)+)3AdrT@yCrZ8r63NYS+t)0s-n{0%P5iuu5_=z`1 z?DSw~E7TmtBO^VX?z-WwvW!oCllQxY~gaeAiFsPL71PueS5d5ICT5LRz3nnqli8=v77g0{LN9JG|0 zFv()yNWSsIHIsUvz6TZHeA}g}aW4^a`Cv1<7lS%!N zN7E&pY2m17S~rk2C{j-BR&}P-Vk$>fLB`U>#DZ(>7pd;3XpOelQDh}!X zZ0rED1=2m1lv_usBWjM*GLwr_KxEg8^sLLP43s50pC960=qfSvdf~TZaZzYgLXKZCV!kp?xN3NfHK_xeIQ~;|;pc2SQB;vo3xTCk2LmjDKROT~WX@PKZ zF7~cu!Vr_k$g|;m|0n)wqA-NTzP!dwhb+nH0QsG#Fu9&3p{(-zx-d2{J2KQ-D*qVbnUdWQ9&6^FY&a84 zHf}*=eCz?x>y|phPfS#qJnNc|lHoBJ^7im~YP+|}bu3}6@fEv|tcOU-Pu`v*I&bMz z?z3RxItee)q7>LozHTTkd(O?T{M$qr+z#-5<=NG zp*Ot-_uu8wq6a>w2Ojp0Z-Y^V?K#jItl-R-Z04>h<6| zk6wfCeE%|xX9r<4Ujdkh`~_j7Q#d^l7CikQ{tAj9Ot)Y<-2j+ef~DDISXKcd!o2 z>o>vIzV!sW{l3F+|E>2yh%WCZUO;ydpz&sx2J>AMPhKeYLc=%mJNvs=yfsy$v4q3v zdH604Ccoom_;$>=ih$vIEDD zEW@ee2jSp>)p*F`>eWp+d+suvyLbh*W@G402GCmyZ7sokMu{WYxE3#f%(~GKX1x{Y z4G+K%pSlE}`|`8!^FQ@QIK0%4M?IFp8lmw9V*p*#D)_468I0-p6IUyrP{=}o1eB^Wyzr- z=QAF$NCcKbw^{D;vs#v5uy%YLq3+VLT3+j#cVAp)?M}x_G>$mRm2i*z z#GZHOsMzp6>x_9qP)3%zQjc(k4HWRvyik0bof92BnzSMz8^|;H7RPZ2A&M(~7iTf? zLB2W=Z-Al_+LK45cugT*bTkU?mn;`$XQNnefv4h~>}i>%2I3jJIHyhsT^QV4Ngm_{2Dsg*7pyjEW_Kdme!@v5RM6LHJRnMjtE zJu4&(Wot4kYK5>V`i%+?Ey9MgN5#e$m zbO((Gm#-$|>RaL?l_Y5PyIe;w5iP_g_!8l;La?*QyjBXsiOSm{D+)u2h!i1y z5S92GHN-Su!jSKWPYW{$CwzTnFXsrNE9SB&oX(wcf0h=om>k!d6$Vodn{duKcssW@ z&%s@H9ES(reJ7ke0Kvx@m4u*pHXVU$qV*mv^$cV3d5urW_G&Zd$qS*0a5j82#5Ml4 zZ$An@c>D}3t(}BfI2RriH*=Og@9B`-uQ!IJ!6b(HZ(KbCZ+ycM_~83K0PlI{jd07U zJ{(x>!yvW2xiy2AFHGSFk6(t*efbCQmp^zK`lG|Jdf*hy<_Gaw!Qm(wdugwRxf#U2 z`-4>&t)GBro__@X@_R4Ag`d0+j;ygW0qqAqKU}md@{Po+$0u!F`CiVq?7ODWQ{5&$ zM|CrsN_xlnO@JT#a08xt?qwJpcoPhk)?+q)%$pEoZoB~kYlrjw!9X*G0c=O(*XGri z;N%Sl-~$i77an}z4RGtteK@$*htUu{gxljOT-}_(51-kF&wlY4_~KU|fsKuq;o#9X zz_hm#jSxZ6$7=yFyg$nKajzpiSUY$FoIZC3KL3^P!-w8~3mjcqNr@hVAqv++hy<{5 zJnwa)(TV4!@zAj34zaXe%5kLp40`|{dhmXD_|a?d=U;dd*7^rwv@*gRB+;^qVa`Dg ziH3m44+covB9MOm2v25U`L!+|)Ye2BQ&jwq)+jby&;|L8HS$u?vVFbR1Z5#BO8J(Y z5>b|}7&tPO%?b9>AHTFae zpHQ*rj9gRZ*29bf7WRxUU@rmC&r7-c%EywtK6WT zcLLsGASs-}<4O8U?5}Cw8eT0rkA8g$l|n?3RWq|G5eXnU2(DKtlIR;jSXmcBt{~nh zII;4=bEK7Bwcf=U!6F>WA}b&3s3;cZf$U!!=)^c31%??@4aXvkkUT!k)9M!?FQ5)8 zg$lx{MF%rLWoS}@7n3$i6InhXPY*toVpfSzroV1egd*1dSy#L2;LFKF8hk>&4@cQ-)Vyu`L3DO!S5wDPs5p)ufUO0H^a_+8Rj!SSC1k}O5~an!7UGFaOLHvVYR;jKmSv2g`fWL zE%1)F+zvOM9Kzv|K6V-S@A-SH5*4{PCZE4_-X~9IPCC11zr`gPrK4 zNjOUQLIY};lp%};YcQEF!PC#b3=jYCW%#kT9)q=EFQgMt$=L|z{V2OJAb7mpduHF) z`tlqT9*o)m%&Vb4=)sfEY{H{YyaGG3WmxU6#H5b#28Gae@Mw$N7r}cOj&Ou?{^QM; zVRf(pAOGmR@ZtB}0{7p0Gu(0O3LJE*;#Ggop5-oE#M56_m>>hv3rX)9}dSr{Ve2Jvey?D~9QhW(Iae3I~9uA8er4rEd)D zwfRBABetPm&& z*Qt;MP_%-?JH{E{4Yza~j`^Nse|fc{;=R&H!sC%YxlXDQ4~5~rpmV8|4K#dgNsb&$ z3v%eHf{YkjfqxAdX!F#jdhv{M_#?{uhHxms(S`&%6X?xJi#Mknk0096<=a}Zidg&7 z<4vj;M=6wXW130PzgB38mTuvR(@lxL3tS=r$IP!E{>O_$y<)t8@Mj2G(WdsTTxr(W$$bnwcdN|f_QX80<6PlmwaZO>A zc0MH?tEt*uylc|xOj`;aSKY4-mCAqqJHghb2r2z68Ig#7$DC$H5o21Sabm6XNfr`b zBNiwMQm4RPV11dRDiT%lO)G_%%kORN%AO%6wI) zql=V%In}3qfo*$(5VSB)+Fa~P;x1vWOrSs8f+MSQc*ng*;I122VkT$$9F5HA^=mG! zXeV&hZ>(8st?hYjpVGdJidD!AKbgZLKiq)RXSZP1TY_GH8DK(5|Kydg!TU^M;bYjm zau(K?cHkoqz6t*2Kl%VX@TOs`y|FWat!i9-UqsIzA3qaKq+|*AO*)WvgS?dn~27?|v_QNyq#4~4MdF_TcztQbNNw7sk40+l6 zFovCt^Kf`&6F&NZJK&%E%KPA5cZb-QIc(3TuoZF#kS{gy$+GcRqxc;{-oxnLTZ*+9u4 zcuzVhHc6?BMgT!i6I+eglhK{KSVl^pX()xk)AA87ibQT)QVf;6EU&!f=Zr%~&Nr}A zi5}wIC(V(T{qx(Nm$avphUGIWSNUAQ9C4JoX7#Rj?>XrvGUCEN(pf8W*ke&LA1B82 zqD!I#o5K20&bGEFiAC0va{H7h-b5}m(<)I*-Fjs&AgyF=R5jG~VItuIDG#}W#%2uA zsSz16ot0vJ|1#f*B(n!sV5RRzGzw8i`+CZYyQ1k2x2z7f!%U`+@>@MEH8H)pUD8zQP5S?D)tUC0h233RP;b zfV%y6ElH8aKBO1LToEbp=NLfBwQ8)Tg7}8eb5fq-9NYK8fRv3vA-_QM_=)>$6{X+Z z`Y+drr*vTZHTuzni`x3IR%DGkh9Uouw@k-vH z)CZ+$I^KZU_$u6U=gn~UZ3kd2i2NcNLG!(mAIs-*KWjKeJvysvzO5Od6@AI0(eO0U z$Ka6--(1}o!$W`h1GsQ$6PA{Pk~TnNT?}JQqIrs9!28w5G0XpC^9=mN2kwXe`Ja6Z z-twj)Oy~2MaBgKZgq5WMtc?1wJnF&ns2~4c9ra-_8^Gpl1_wuT_?LhG0r*G1`XJnR ztPk7QUWER1BPNwYkVWFlblcEm)`z9lgYfdjO?dQ&FTlpO(5h&k{*!`f&YKK$Sv z@c;N1KM8NWdjvbvDNN@*81-;&!+frc!n_V(dDw^5;Q&SJ4;EMZB#Rb?Ee_jFAx^Q{`6!u3P91JLHD z%PcrAnVoChPRWlnPlAPtH;--nx7U$wEL!q7gzn{)p!`PzfY6!o>Pd{wrZ!}oRA}z( zQ9sM;NT1GYiH!9rT9x&8yqR4@$|_dN!lk@Nu~MYMVXv%0haL9jejD!*o##5~rrvy| z77`H<_pBphB;ta~58tDmC#5Rvn~;cXd}-dmdtoBBs734G);oKa35DA9WSP|G(1{S! z;=+E!@s4=3gM?%jDCOc&xJt?=Dw*;uG~KCQS|hVER1rEo;jJs~+BPl|2Xil50~2uH z)B1=54|ef%uXIJ3&%yu+y0IF1fcx?OYjIUvUhf#HN7F)oBc9RgN%N$x1()#0OMr2% zX5qXjg|rKXz%V&;5{1vcP~hl2`qSwy@V5QIMyBE|-{G59v5$X#PdAikYYX0G9oIb3 z6=Nxvv_Rh7%y_VC0vl5y;JC>$4T&!<1g5)Ecfjw@*r1se}q{Bljq2xTK1F@>tdYl8(IQ&LMI zQ}BKZ7Ra=&kwK=vIO|Tm1@$^ zjP#q%D`!MIMdRK#c2JA%+9G})!jMiZm5<5mS z=m4fM!h&SeFn1v<|2AxIoQL;6@J9Hj|K0oH)*E76M!3~HD)3>&hq(;%O-CN#4dUPPIKBPD(&BNg%O#F_{U$!FNO5?D(*YaVI5cH+jh zGr&6~ux+dGTlvl}QuhFrKx)6?afSY-jY$*PSW(`u6^fRL^m<*ike(!QW*vffMth zKbw;NHB7Ue1gsmZet6HdV#KViGd%i{+p)JO)EG=sHCbwwnA&0~>gO}^yEh;dcn|iq2{&g)*~U?!az8r-~f3JTf?@9Rn1*r;$5xm7PqXBs;7Q?rfRLfyccXTz6KAU zWDvN4MW6JKu;LX)EYEvMx}+9ohv$E&o0G>{LXysfT3}Pdx8uM zB*?R1Q+)5Ntt0}KeN!9a_@BqPWC&kv+)eoL{^qut+b9GOV@P!S6yvQK^eVt6#+&mX z=Wp{oXkEVAue6xU{_W9%Y{V5xXDxJ)aaX=wg!bq<&bsIjS=ZE$&pX8Lgre-xmeQYr zjSO2+Xb{K1tg#_S(y-xKJvVqmWt+p-8S*l*0ttsv=12wrn2ljJ-GY^sKD_1LTj0du z5lrSmB;6l+FX@;x?#lKEU3#zkQ88Mm(gKzjaU`*E@$wj+ec?Q8Zcku1T8^Gr{DkOI zY9odJ&&JnaxxWEF`xE!U``&px_~sLT!Q(!(3ow-wDup@3JSc~Fi35zsQ#iFcgdcz3 z?eNaG-Ug$=HjH<|6@rO-8>Jw8+#f83iy7ha)hWDqW-DG(7@{?h<pCDUr!+d-RZoFX)-uJ+5@QyoH zgHIoi69~_00h6GP;b)kx_`Ci15I*^H_rb|yLzrw`0SN7f{goUFX!k>9eLf9_{&2nH z2wpmS2`;>{74r%(o8_IKN8DLx6oy$tvokJ=`txX@IM@ex^Ia=&*F|OhtNKEQ zlw)KVES+RYsg15H8lGv8=~s=qeaX&iXXQ}g za1-OsHKe@NPuG2F#;^A{Sv7Qr{LVv&4~ZTGp(PVVs*^*U*)Wk6*=*I&WQml2YRlrg z{RFEPaB9U{1f3LBhiG;YUYdvo2I+MqP%hENOwOu~>RkM56iZ!?uMzand_4pMFU;PS zCSs^Jy0?aF-y@;z61iZvePp~%@TO}7B@>_?<-gRJH7-!EY(U|Wb-npi5%&Dwv?qx$ zbZravUaEpywZ2o=Rh;y(kL*RRELGNt_#D5jPyS;>lb%D{8h^SUSZb#wo>7Hh;fD?L z+tG+rv?-riy;Q98a(+?*A7YI7K`R&~pX9Tzj*U;y#l`1gF$J_M^0Z*p*=VYwFf;>~ z=TWmaA^Zm&y=pAshrAN>JcFM2sH0Ya1gAN=fc-c8Mx=N+kNq#Vy#{3E8+u zFbjztqm>3X9EZe*_u;mfO_+~gfp@?CF1Y{RTPXn!4zxJ=gCWz5Q(g6CR% z6n%OMzXPs}5VC!CFBN4HF9PK%#)u-Rv8M~=Db2{oFKT+Cd|EY<)D#Q#O@o0?7`WZ{ zm9iUWqCG~(>p-{5d^Ibr@z1!Xg+U>I<6*#_DoxQf#l}j8ej%YM14pC{%DY2n{nGb% zMkhV9nIGk#q712{0%Rxz<4A-N(FF*~06=x{;C@U~Kz+-rj!3|Or{vvw2$(mrt3lq5dZV34Di zm6k!F>1w3H^OW9+^^vBAL$JgdI|}jTkhAcfVdgBfw6A1{k!UNmXO({@z*zglC?+@V7jJSYy5@K%`?xG$)BL`+YHCMFo|aO#D0V8$0@xwKdI! zJSx#uq2xNW_PQ`Ci4%!0NyBjcxXhZ4R0vBu9mmp!l(fd}nBvhD{+{+XhMjwJ$QgX; zSOG3`rL`-1$UG?R*AOllLnbNQ+;Gtp+2+x9MOP>kvx^li?h$#XJcnJ9=cUPDPyDPV z1hThPp*)W(;#LX~i5ACaQJGHpaKwGh_+E?p89xc9wokk^4(U&ZHC+vu4$Gu72Kfsy zZy^MEig`6s_+zgh6wyss8uj4jQ-|Tm;TVjL#v8s&ymM*e-;8U0UYXEcOH5nvB_UvD zx)p#<@(Kxfany-4ZB76#UIEw{V|I);dMReKJhWn8R)e$C8d89Kl=fJq7El;kd>)Mic}uG3WY`hNxfwSb@oO02j_*hOM0t zl|V37gws8gMFel@eUu7jRiSF&0kVxM&3D?6zsHoE^Eq6(dKq>mW9Sb;j_s7JHf|!s z9EPoj`3<<4b{ z?QrtronrWhtZ8VK_WC?X_NsO@S9D=HIv#r?mCLNxxGqItK z1f@{sS-z#V?fOMJnDhLL_OL_Jv5CKW-{;(7DY}e9&*>;P9S0NpR$Vy9`U~&l@PkJQ z6$+gE1okJr$ntH|cTMv^r8eh;Cz*pwI~S8Q?tDvT-y8`LkI=P9*ioEHxyWQ>In8Zy z4NF~G%b%htx`6{HUMu%XIZgtNMHa|AC1p~N7Uj+&L*8#q%r`CDVj^VU+yJAE+R__> zEwEYHv+X%>dcWIosD3J*Hnm}Pt3XlPM1V-aWP3ovw+V)9$k7Wuo~jb_rWvX{``e~W z^B5Oh1B;YJHYmQU3l>(0SS$ho$BDRO{CS3nAk2AtBfn4Q>hkxF5-fi_C7GK}T6>!J z&~Jd*o=-r!N~WkC~Kiw&Xb>cw=%WJ?omsR?d478dH6bd>k;l2VFUa?`s8LqL-N zO8FZ2zAWssjyC6fV23qXSc{c`pnGW(dTlAswz+8^6&wZ4w6cvc8f)dbgct9&=fB&= zrk`fhUsQEPIH9`R|o)7QM;#Ft|R(tT4d)@#?)>q>^g_{Hjhte39 z028u~!CCmvv3 zA`Datb^%Z5FMK=d_u!tp-vBqAScTd6a?JA(kJ-dzO=zIZ=kep2f0PY&c6MO0BV|;Q z5aeFgN?Hw{yDMlc4l8Ul9Kc<7-Udewt-;RLMub0-mk>2U26REYRlmsqMhbW#H&{3e z#nG-gsz&qDC5d%KDRqh~n^l@G)-&a=Njh3>UJ75n5Y4bXZQ!@E8_|K1SC$5ajI;&T zLdbVA4@aAFVmr+5KzUQV;^EaAU95bo>h`+x)yAUc!(VeXS`~Rk(&O-(w8e;zNP`Tm z|3F9L5uuVlGylf}VVpZaCJAT0N-GCp&+CM&$fm*Yp}1Wv<%CoOBVN5_EIA2BsjZY~ zBK2oOcM8vokY{6`qVK%0=|w7-HCklm6yCSEV9^YvtV6QcMJ=B5+X$6_#MZ>{_o>{^=@xm3UiSV{LhJg~4(dRrI?8M>BHb3eRJ^*0_2 z7+WOPFs)Bvi7aIR(S9c8f(BEhQc6Zg3S*5XV2iY1++CyHG4gw230`6&ne#%C;^qh# z=@sij?_9yjyvHaLf-?b>hFXQijG6efXgDeH@=xFM(X@JO@;50U>vkwH7{1dUk|`$t z+S!1$Gpvk-XmqeK|@H8TJdfwLv}-y3CVvV1cVI* zJzh&{K8RR$IC{wSY)wszJ-(EGH+n4{jm&>%xmb_i8#7rEc%4vWPFX*zh3ZUA##6)4 zgHjP_TY`wrxJkjHEQ}C!VnIb4glkbGfD|fPjFK0I71DBsVOMW@?MjLyZG^{Dn#2{H zYO_munv@3bSU+ha`Anux&15r0W+qf>p$d9$LCLJZw%8E= z7qj{neYYuCEzCEbkBeF3&4>ud%JS2SkD1H(Cw<6<6P+EroJ)FIOj#su1^2D3>}bo+4A z$)nMOS#u1$-bE{_KAmV54igR20WSI$8Qx(GKhKv1@V zQ8x*V!y&+Ad<|f}3AerBI2>3FDe7b%lfNy}`#$Ic+;a0etgi*5)>Rnvc3{w-K))A$ z@Z5h`-J>DIJMLk64eq?{MmTyXTzZMQ8oJ@tpW`561^dv6BlCD2Z42F@tMq9C;R zr9@OFSuFqR<9THg2$JPmFmAFUSS67Z67DQ{00eThK!HMqMq1^>L$XxTdz66~uC~w` znM@5m=2>%7;TN9ur|Iv#2y)TD(cx1{ER>5(&=fXpQp#joh%UsJw=glB#w3?8A+EAe z_zk@$>jMhh$pW0(?Be0wtM$Hy_pa^I2I24Mc?V*iy^@QCNbCL`SlZpy=2&Ee|VnaER{BSZydVN#Qm;U4LSGO`N0Z58RrQl9A%`}KN)5ujB*Sfp64O-e7Y0Qq@TE9HG0MA8q`Ic%KPOh zuF;(~k5hso{iDxl)4OoE;l`6gxc{D8VR^6(S1+E1!E6%-^KBT;cVO6`zz}wzH@*s6 z7hizm2Yd0n{*A}+YPf(}$-f%+ZQ;oe3TgoD6s57W&H(3@<) za5jNa@CJtn1=xo1_66uqufQ!QR^TmfJ^_bU!WDr*nJf)s`{ku~>1!+A{qJjg%+~Kx zr-=_o&-HvBk5}A&^Af!I&Kuy^fjLYzUV`4vW$4ehqLMuv1|!cV%qN#%x^)(guFv7Y zci#;sj~&SEELv#)<-pJ$z`^AnyglRvv^gr++ut(ROO)-Ek)wl!qaylx3bYpy zfX5a>znE_akAzv>qn?kX4VRKfc=Dos*A$hN>m@#}cH{I`N%QwxoDz_moqQy9QjyF!k55pu9_rKeC%3Sx25}zld0!d;+;uC!PkiW&@Z57Rz_Twt z4y%W5hqVJY0EF!I!Q(o;2Ctm`A>4X=1fTfHcfg&u^rM0suD1)h<6ezYlck#K*M6_b za!udW;PGTdI%u=f1NhmGz7u}*qbu;4ulyy9)^3HR^&6u{Jtl!(+JenXFTjDp6?pGE z?t>3KcpDsD9l&HdgFy%(=u#x>7tAMYx6nekLi58PxEEeHJ%Ru2|M(Q_Z1&;6s1Hk{ z)g*I=yc3&n@zV2fbae-Q@#DV)Z+X+rFo~YhUgVcCE+|F;B-$Jc8(NvqO_kijxSCas z1{wDFijuUZ#Gugt(Sy+lV10E6%VDtw1(^`he=nK(6 zAtH7d&xkonEu9<_-UIqq*3P#%#YNcwUEYmpV;ezVW-z9I!y=GEy&Xdv|L_=Rll7*n zWv8adb}eYBl+1?pqeL$muM|yza&flKlP3k0)|4PoC>cZ$ErZlJk57}(&q_4wlV%Z` zjczxN?4t`l%l5^Xv+|;uyN7e5(>vx1Tg1-LG`hn%>iT%>^FqL(^Wm1!)I8j#kP;-p zK;Xq5I~wjh>CX-FvueGyZRMnq@csXiGEl*(h)1QEsBn#zA$BA-2P z8n@XP5FhF+wl2fAb63T;@PFkaIyCOo*+PZ1H<4YL){PRz*T8HWZa%pVKm9Wg!mt0GcfnilUXG#RQkJoTp@mn$p6M9U@o;uG zsBFXD41V^bcf-@~7Vczwk3}h8u4fz;rx=QO-q9c%ptJ zo)rY*S$)2&0fr30Y%gOuBRm=n09IF)U@4qWNynPR%HTHXb}&KX;-AQzvJxu2qP-OuRb;iuL(kJ97zoL^O1Mn_@u82#*Ayj^3`4FU~^$~=vqitC%D=8%{ZXB2*e>e+2oiMj3O_X z9II|n$>a)eS@C8)HqU)ND!?Ngq9q3)9RI3$CaVY`Sw(pvWX+_FDr9+KV`gKjcS4{N zcNU;$K?q4~Bg!5Lf6gnGf_*G#kl3BluZr2V(c;FJEQ=&1T#>QB8;mSPn1spn(QD|_ zL6Lk!3V5xwG3y#ZZ7=b{odtzKZFuTFJrc)VSIvA+HKK)8CZ*}9(8#t6RXgVwsI61c zi9rr|y#09#N(2);cE?_y{Y8wUP&QKE*$W`xq%79bTV5^E`&gq9X4W#pE2&(kVi+rb ztrf#sb4`l!B72L4JiorT{K~&s*({j7OkAdyqy*d$J58#|prD~D^E7c{vX1MISVu~t zDwQ``!WybKAVAI*_|lM}*I!ds%F2W%88<>2*R%-rH1b$hNSGm{aVjQJexJgBK`HG_ z6Yy8^zKBFgW-R19u}VYkh7lF<5*(i^%Y9g0O4|Yx=d&y$lIZHwm`(V5l`I8RA`&Pv zC8^yZL^dn$;lLCshzC|?@UuU02b?-}3_kazgYfM0S72jf3X{nM)??QHQ}DAt@ndlR z-OI2P!|~f)?#*mMD%DABoAlrf$JXHIfBIfHdGsiJ^Sh73b1z(i%^iTjXbvZiEx`lt zd^7y`d+&f-j|4g|w#r}OvM;ikQ;1}Re-A9p;eBsE0XH1^Fx-CI0eI}mGjQd~6sEHY z967WE_uq39{KSXugZpk-gK0dwi??3vM+qx%*z3jHChojt1^)4`y%UZf?ZG#`{WP4v zunp766o$hA96K_C2jBfB_{k5y4Q{(Bl6!y%+I?i2RTFrMm-_Dhb__)AZ zDMK0=LbVeCq_e{sJSQ)kgeU9lWB`aE9C`EQYQowi6m2xq7K6NT>?>U~nb9!cDu1f?1U^g;Eg1)rt~aFZ#rep?Y>u<_f;t|uyU){ zwG?{%d?`HfI3(ktkX`1ro^U4(zfvg{f68MJ1szF9vYyrwHUWltl=%W3f3Yo?Jy-MQ za19R6CS16*OW;8Dkk*f-FBTv9SWxyhh+`EBLCGLPe*Y9%#Jtprj?4R`09(ON9u17p z)1DTY99GING(L2Y@R16NLKqCn(DJyhL}W>~(nc#QUl>9xzWC&ol28Xwc; zrQ4JkufcxOpY>t6KZEzb^ANoE?H`4UmjPb6FppQV9X&dL6UPBo2$tD^l^%pDfsaFPr>D@09URB#S7rrVMs?0<}jWH#gO7XyW_R3 zbX5{-#p5AeJ-W4is$Tvs-$vy-knTXY=Wx$$J-GKDyaz7r0KEJ%u8A9t_2EdIT!5X~ z9F~)^QT0lTwwvIkI{Ey5e;DWY_<=e6_rLlM_&Y!I4mkbN6gIA1h1IoHxar0vIC?0o z#d*yA7}jM_wsEboQMh?FaABh@ThexL_mGRXM3-WYLX&kp7)7G)IiKb5@7$~MGnkv6 z3@?knn``XwJ$ps5dDaiA^xKJKkk4g3Z@k32azam{Hx28GlzDEGj#RO{9yw|ri*BOFS3IvQt2%N!Fl_vcW!W})mU*{? zuXLG zjX+W+BZyIGUj&cs03u|=v4q7CC=_Y}gTk{rDe+tc(3ec;EG!At(Ml)4?xJWmg^GBD zpovL!RcyV`mN=ex4zQPUAIzZ_+#>{EN&-mNDUqj`j#gxP;4;I6BLge0Q9h%&Kdk-w zMN0TYO%gnZKrCp*D;b5}#5N46UC2PVs$fWECNW@~8@&24ChjUWcVN~Wa+E`eykija z4#Ja31nAb6do2BK_g^$RIm*85!>&)|b#Is|I%Z%X%j5P+-FV|OZ+<36K|(x9@%44< z&A;EiKERFpFdeF+QD)`4E{xbS|9kaNlnQ8z2x+)(_(jDg+}ECtO!Wbl4+ESy7zQ|qIS@j^zqqz(J}cJ~67S|`h|3!PVkc@!0+kFd z;h#}};}ArpFnV9}D(TTsnk_>M6k20mGSjYfO!8m(w{4@=UfVjVDy(f~K97p4^yr5u z|HC(h-!PVg-sG_Vj9i^ueBtLt`REhGIS-o2b&G z%NZV%M~T))O}6V=?3(m+2}!jTyGmC$V?9kzacy&c8LzL-@Cvz1j(ek`oOMW2_!|2}C}CoRBHbkw{`>#P7tHb7$F;WuX>AwG>jAu+TYVA^*mkyD(u} z{H~JyIPQUT$1oZSv}Z^mMw@I3=3xaOM8QmWQk?!6sh+_L>ArIU07+_vZ83st}I-+2$E2 z1rcqOQ12xi1VivfQrL5_6vzD_5jg62`eHRKAGdEn1-f9+oXz+~?!Z;AM8;WyYKMDa-@gUq#Rx)muXd%t9 zoqG=sii9E>YZW%SdX>hhl`Ks=rNXvfg_8qO;yz-+gb;imy|#{Lpcpz$e_C9gfq=KP^NtxcgC3HfpYEAIPy&+oHSA<&!pR(<17>rH!`^_ zXJL-10Hdd0p-GP;g4tk1^# z6j>7t0c=_)$5N2v$WUD-^Q$Xu-4#(KZ^)cfL?P7eCDU~8JiSM{liOB2gk&CRoNGg( zrW-XG*W#e|zV^L(PBMdolT?{{YwSaR)n=&BG@TZCS3H%nYu#Ax7V4vu*y67rtE&~T zS-CFFt(AX!7ET+z#^R8!PmvLncsjicM_3Z|%4?CI~JMOK&Y&7py=-QYd+Y zF^j2%YmvT8x1udU^eLRAabwo;*QHp3x!(%R?uray+wW4g**J%4ZBUXd%M?gu*onstYS-LV`)?ZQB1I=!(XZ6C z8ZIb{?9WL2Gkr0P9J#UXhhB-qm;1VZM2KO&`GH7&Qjpo0NjXWnwHyCQG+)|$3kzh| zl8w{V3T_UX<|eyGBsF;)x)*QUR^V&KjlH$P%_maBZ+M=L0On(4t^vf3iYn5NNHCJ; zwRTRQlso)Ath8t(2${>LAq2j0I34%+;_GQIl%phzxWKi!Mf4LDF2q3`e~x^_brne8 zZW6+kVqU`&il8BzS8xnR`Hz+9C=bYsq4u%VJY?QTs%=>5e1X3AUa|n&2yf^LZ*IUG z3RoNQdfiHzKg`jAGGxpd5;BO3Jr>p=$?llgkqz+N5E=qrm68&QX2Uu_ylEsSRig~* z$*4l5SDbvO_Jp$4NpjuYy4b5zE4Cs3kfKs6pY)6{9UYRQZzYNCr?t-opj$OBkBn-j z(Gh6hEi$G#e>1PQ-j7-S^QKN;(&|N7R`nbAAl(8aVM-1=aa&Myq?1|zkblON2}c^-KmxiB_lFJQ8oX2ONP zlYpwHf$K=iZXv+X*&<=okX9XON#c;&^qmMaZ5(T@l>xXr-_dXsc5td#t)F^BcJR;hIh=bL^*-PuKe?Fr|^H2LicHN8@U9V=4 zlkeM@Ra+b72fPPV{T!k%Zevj1+WM^)b&eO#0b>zxK2Q#zJ=X2&MZai8 zlRcGU+;n?Ld`I(}n3NbVUMp2oGLs=oWS=D`U(@w&ZGU@vu7>wE`l0Jc54FTot$tJg z)n0{BL<^6dmZo|>ByBTKi-^qOFm3Naob3M+kQ z4DmizEAfJW78`_(exchGl@#tiW~+eUK6yh$ zuY69ZkdzT|l?RY|)GB2f%3$$(SL6(HMGaEL^S z7B+HZQoJ9WWw4&K|ic;WUq=aP*59PN>e>+{P7g4MGOkM zZLJ8`zG)IlGB!wY5{eXWXKOY_53PjSIt%HHVhm-@_)NlRJQ^g3U3|ex3ge0BfV}TK zf7HlS2{-yVh8+@~7|&#wlgE23uKlDd1Pjs&eO}&&P1a$hNPAmFSiI=Jt?1k&II|We zGJ?``n_OoW;&ls{Q)E>hR(l zc`;R8xa(SKLUMgx%3|j!<}FGzk$&fVJmS7+s_AYx$g347wSh zxM<$o3A%J{8N*Wt4lXgr5qqlqxr)CVc@>wH*&p$R1BcMarSY29F7Xi+Vs2Vs8D)QS zQgko0ALw`7V^vTh$T7?$^HQq_ddg%i^S!rE_JW7#@S9^kicq$90Ipu$fvufMydfkK zhG3wIXBa4Xt)OoS9rSb%BZ-+7$)m+mnQoWinhgWFUiuRwpZ)7}JsH@xBXyTpU*vJ9 z8J;CC)qPS&q$5)D?hJvb_v)=@D?fXE+Of*KQ#BX~XI@?;DUV18vMS=ZT~4|y+Qe_! zV~^21TLPOT))K)}DLhPU)?ww5uFCMxU1ZFXh}fb9?k;}tH zZae?C%X~N2(*m&V+gFwXuB9=Lg>MnTl%qTdT6vXe_tJGuTV9mXOx6uu^4VD_ZMOK}*1-3L!y{h1V0V z(wY-%f!y8w{xG(`u{njym($6Ul*(Kh6L&QyHH=mGSJzTgd_3L~`!aK2>oxJk{Sd~z zw#qT=xtj(0Ws0TUZSGHl7?3Jn?h=~oz^XYsaIl-kNM0x9+nkS`!?DK~R|KdHgSw zrHMC%BX&ZHmd!Y*L568aBo(|7r{w=J|n$pRo-8%QdjhM3zt@I9*`j3d5 zqh?&3bBdoz_q^sZ7fK!_vl_+Tr8meo(#3c7QQs`^dFVdO!G#MGxO907FDe@>L9ai|p{u^U zlH}tUX%-T9%VUjZ!o~BN>|>4GtwxLvW2+m5Z3}{KP`(`je|Qn+Ob*|k9s z#0#vK!XE(LJ6T`!-e^6GzFc0uHBNr-z1Qz*#abJs64&&twF)m{F_*A*fzRtxw3MES z=TxsrShtEx{;yQvDUzqs1}{D{ceJ-jkg)wyc)u8hi@UDRnmqUAcN+H<4Ya81zAe`7 zJcK+qtjXGXDodruSNN{u2b&K#p$|g6R+#YMzZ{zVpGY(o_U&vBMW(HNCkZPW{~8q zOqsKl12t7d<4a2JNA1zt5(Xx~>4k@Du(1tr z=G+CCOm2d~62K(GGT*cEPq4EmrFqZoM`6;TjQ|8yuS3+}-jx56x9o3eZ<9Q`5~6s- zBMQ10s%i^m8Szxw0v`=HDtM5fompm88o3#_M-#&_{})fc0v9h`%@IQJ#*}zu2y0r;H!1#_Ao5Q0=89 zwurg5!g37fxQfN{PRZ~@Q8=&2nylUly*MB371o|~1U4rIOwj|F!v&A$5uJ7Q0$M=9 z*edqKFrMj@f|*hlQeVLeN_T_`54y!+Pgu5fSR-ddh#67MrndecE8MZ7x#s;!B9hp&c>IUy2VrZVMeT-x97c7j$<#3RbbM z2w|;hmrdj7I!0^pq|g>L2I=SWU(48<2x}88O~PNzFyMtF)nI56FuM>n%ak-BYJw^L z*A?K^?*ixiPM^2unjRbqTBA(J@po5*Ytx0fKI&uE?=;h6oYYG_(rToPmH%G+VEbZ8x{r+etCpM z{$0?D*nm-vt#)VOOaf{Zre3orD)%8;lz2j3pugpC0QrSa$9#IIjiyX%=(<3<`V|di z*aSNSXpKfgk&saP@f2bYmRAnI=Jo`h`_W6VGdUhEFpGOXWGdfl(c{@4#m253d9KctVjitA3I)N^*%f= zaVw4KlX)^W$zuRHW+jB9qZ}5D10+Ab-io(>+hicz&!zF!D_(@8%vvu0rFQb)3*2B8 z_WY>dgPq9~o__8}aQVt6jFwlUAu-CT`8v0zB-J#2zHLN~yDN@lP7nIF3m4I9G$0Fi`Sjo^!nQ2Xn)r`Zy~L86=s~DX2|URjINNLm=M{(WZkB5D22rkXu16}5sFHb z$X+i)hA2@^VhGX5ldOhB3{=AvkE0D8BjF+afySE#C7B42Ha6&USvJWF;v#q9wkg-N zvaC9U+qP5orPn3DV~tL?Tdr}>KqZN{WFFjJeSMY&gu0TfO7=RF;O66l>dO1dt)bIf z_Zp6JF9@eMhdYa0s#=&YHD;+;wT{&>G`ESjr;O+M&`ho9Ispab#1Jjk2>Vk}F zpA0%GiJqhp#iZ=(u`yM zX;Ac+R$*i75N%r6|swlbSNUY2zVX>a_2PhQE~|fbLx9cW6u6 zt)Kbzqo5KViNb}SoyiPVhJ84<4e*&SJ_A2^{5iOMWdqh$SK!XuZ-)22=gsiun^F1R zp3Go0=)*9HCTJUzN*%39vMGh0>}@s-kL01@_vw5N`Y;0c?fU3{SY(T|Jd(3)Ao{yU0jbG9hIHBO5BaDEuDXZ&LV6 zS+B1AHsu_!21-)O^Y1FgfD}KuzMEz7toSEO8!3&_v7lgzX)C)DuRg~qnQ zyvVoqndMXMa?#wGOF8%XH?E^VbjA~pqHFxd+(3a_CdF zql=S?hsat#vsw-8}AYg@@>QLnVXNo}Sv;uq6}F z%*B>v#e}6D{!!IbOka@0~OB1n!n%j6r2zEYN1lu;>bfi|iY~XGxf|hWTzF zwc}S;xASfBNBn8P;kx~hGpG-v(giqwVGffM=z`6Lf(47FM5VG*_wekl zbj=~7OFKW^U3nE1(vF4hEgBB{@R!e=hd=rBqwu+}{0N?X@d|A1Okrs>gd0zsgKs}_ z4&ML3NqGOeZiPE%L>q3(v_=r;GrveL-2c z>s1cnobi4GAbyu1bWoDHE-FVCFZbZ-=gz{$)&$m%t;5)9w&6owgTsd0n#Q zE6XvDNs(iRju+#ct0)F4k>B+tZ7yk7OmG|%4{(ClvP09`f*yA7`$pM+7jxNFM% zPjxF!J}duZ1(_UtLBD3hOpK*Vw5}0$L3T)Ij}c3B`J2!MV`RM@Q!u>88~}20rOlI; zMp}QhF!G8O+%6{ZizbzhqVEWdd8~P0tentW-z%eqKe}2WJV9%VlSx!~zV>%xyOMF-;aBRf`r+3F~Ss*zIO+v(mPC`g~l}VYWt) zCV0GJt<|mdUHwqN7x#2J*XSHsLgScEWcl`uhP{uCIAbU!f~>%pc6%p!~8J$pXt971D}_n|tHQ7Qqy=D;5SDwRX>BTxwe)&O zc|5g=Yq2g+berSm{ab6dZSQvR7HRr!nQ6De-T{Fk7k-W)VRlW7K4s0vkHwxeXZ&+y zkve7Qj!SzXe3<2=lHtMD$B;%|Q{k9jfDm(5;`7mP2=o2`Ub%b?o_h8QyyebSI5^@n zk&Bmd9JR6RhQ~;H)s+qvMkw)L3G8*&TV9o-l#cXo(A`hJvIGC&_aB1a`u#5fj84MR z`bk(lvJTV97@j?I34Zv@SK%AqJ`B(P+`HgcK5-x1ergSd;p+F`D2mtGYD1QelnI_P zAsAJy{KJRgkN)g0;iZ?a!OGgru(Wa_9vhubx8SKCorA|7 z`*aLNU;9TNg!}JYNo`FaBzv~!?oU3#zdGhasY+p@Gkw$kgohr-|C$j`Z1<74`a=E?0T4;?`wT^!>Qq?cAmslab;hP zpjF|_&d*(zZZb=Ecw(EG0E<9$zqyr>6m4**wsMkD%UHa%A+C_j5d)1q7JHz;g>=%Y z2yW+=Iw8NSHmuAV^ETDNP?AdOFMJUq2!?}@ja6=(csv|KIA_5CB+j6yMM(^wn0wzG z5g=oNP_(0^g1qdZkCem!m12UN1;c!=CdssEOUIB2b7y*ASX0Q`QIMs4bbt{b{*EcH zQZ9rr-eS^75Ryo3Ia4Z$19>5p$5aX>G(Njf(;8*^%3k1jH?kqTEL10gAkW9edm)8T zH1DR!%92oA*(|m__N-;YN1wv8NZHVBVF;~N$m)G~1fB1v_czU6iIb<$dCIHALDzQe z-)MX@#sFq(R8xN|)>2j!QiyjZeX%-SK_U%Jk}!o-$e`{OZd8aWETc5W)yFF!NYBDu z*?fkn7S$o!sLgwUC#CFBzfc(J?0TegS*3wPEAxm)jhjffGJTQCgWQ)XfvPw^jUZSh zpZn57ZWBtKcXQfzL~!a~`$~_az~}qvbzX>^7-xnFWi!22b5K5Op4*1eHVAK0(f5qT zZH4EtsjiXM8faA;y&$hZ=DArzj|hd?Oc=)mPmBEog?m0lL!dA$1Uzv68XURh zVDwT1k1KYIiOW>`HH^1R-+u6cu0^gjb!NSxoxKR)uXRy!P*D7*7|Oprox|_{@x$=B zuRag3bPFsUyalGP0@K+jD&&K;gK%K=IGnw74*u=$d;^|%>Ky!!|NN)m{x^qfaXC-|eYv2mR;LEaAV3 zrZ9qOZwQk>hX-r0bYKOB%d7C|uRQ@LjxWJI|MQ1oDUvTfYkS@Cnf}!z(zymOqDJmz z@jZKQ__@$Gx)@Ab4e9P?lzbAyoe6%Nvm}+EN&ut&0A9E_gYQ0a8m??EL4Ro-W-!D( z-%HnpXH9?wS!H03h|sxnYIMI#X_E8h-(7IlwXmG+^}`BL)K>xyg;(E$4UczQ=K{;z zQnu&?x;)<>r%Kl%BNg1anU#qwb=`6fDEuD1zFePWDqXDpEuBrf(hD3NPxA2IJkbwS zK%w8Kqm$BGPR?phep&P_wq6!N#eN{oA;?b)?lG=Qyqjya1lwTl!1W_6p>ow zh@#5e3ixDpcMpD6qUD%sLQI=dT9$Z!a^)z2w`QBxvxGA}sj4(a?^k{9mr${Y@vo_$ z?gE`%i)BOw^|hOE$$nCAS#h`R_i_^7l=Yj~ddvnK)~HaX)6uDT9a~biZPBz-Cn4ep zg-|oJD`+*5esi2KChAI8uZ@-u0*tT1L*IWIe(FQF!2P!zfU$~5NqwYeO+Fb()4C`( zH6^|FeG`xHV6pY~q8z;5iyT`(CE@wX#tgpoy{F;y`5jn2ay!iXhhPp%(Qp;kL4U9c z^WHiPUlACN@EW z>nlVMOnWemM@~XEzXAN&mrujL`@Jv0cOSh3TeG9EymksEgLO1$r6gE^=ky0dSXo|z zm!5q&9tC*u%pBf$3KJ9x(RQJ=b{#QaHAwL7Tm(44%AT$79FTRbH^A%~8=*2q!Fql=-r< z!<24Yi)X|U&8_Rp5e;ZgyfNxJ^)Y#K(dE6waTC6x{1}WC(Q&oAq{miP>=_s(9`HeX zQgpBV#v&tWrCd#pxM&}?2g$kM=I1+7=B zcno5<3Q3dEpp|HlkYVeQvZ!n-EchsEa1xW^p3UdHi{{KTGPe1N{Tzpaes6y3F85HQ z^VYtYc1UHIpD{CSI(E|mB4H3PUsry|LeZ!!B(ep#_6_Efn>Wmi7D`I`xk~|4d`8C3 z_&BYBTIoUyr2!<*S0-wM$ivBo>C}^gMYn7AZ%Tri>!tsq5QbjV;Qa`R zh=;=!m`_*WnHSE%Q_pY1)pzt@K;eI;$L3!B@ZeBJ6B`95YRsue7%Os|ORX_! zv?Z*Pd@()L5o&F6jITs#g|5U;IgU_s+5_00_u%PgufPu;e;&qg5>}QDz%&{Fq@fbJ zl?I1E%}`LQUmN2hrO8Mll{ozllPycCs<4+5yh=IWA4hVkEOMoK^JtXOU?G{d!*z(V zC__xI8JGH-k|)+>Nl@}`Z4WF|id%DJoE!lp;kBhqQe8S1+|NX^RIMLig7B~oFwX;C zdn!Y+^FG7VR+zM}(jg&JD&@sqHwvRrTvQeNS&9(AeL-3Mxr6*$i)F8-WZQAbcI9|< zQknfNo+YTrl`L=?H@jyk6GsE2pq3hqlSH`S%_ZCEbqqnJEY}_p^ND?%qUafb7V*sO zhL~B;kJn~fokja!6izu$v<49Mti*HWgy&S9i&o^a<l?_b6Vzsf5}3KMA) z<#!e4rpHOYQwDWftEebYLO`E6NMc<#wv>GedLlNywWw;3zaEQKL>a~;V5#xBC{S&R zz_o_{n~V}}4|4SG`_d>;_F4ZP8ZGIi(SsPdxotpzOGg8Ut}UEoEoRaWqI`_6OXHaD zQjp_%&HK0<4J!X0W32U3w&cOAXQ_E_Wsg$cD)>tjt7QnKx}9O*@;*&JLK`VuG=7Nc z5=N&Yd+h2yQ$r60`k*n~YckaMD?m!=f^tQH#T^l;pfFp}5##c>w z@#}YuFp%&5CKv7%w6X?Y{mx@>>C!dW z++2a5{NOP-bz}&G5LGtC5c05`$;iMocOKu*g12xOmlzH~--)@YD+z z;poY`VLmtvs6!wwhB3TW(18$U5zo2O z8HOyJa;G(6ObQ$Xn9a&g_j)%mLl$zS5LwnIg(l+DDv=3JR9*!|){cp7(!LBV_ zc7yQsOIGX!e>1B-tOCX<+f_dmu(Tj(g(IP?w3I@KcL+dnZI_dbjFcBSk7XZx+(V9I zzoP(Zb7}8p?fPApKD=+G@|YEMLDX{+OJPyrtK0O|U-XUmOZ989&@*M55plP?5y8&63`wAWP^&JmEmGX2xFl63~WICHiNyTfwK z+E|DQ=kW8EZ|o7W%CqitpgEs|s@XXAdS7-m4ssg^gY9R(6u{cLln-c(b?)REdIeEmL%n1CN@&d|Za$!#cs!*B`FIX!SUJ=X=k<*WSDeZ@c3y zD8$5YZ#JsPQr;fZj-%SMy=C=pF8j^9UXMktB{Dn(kuRu|>#G2(D}xY$5A*p>I_f%9 z4yX_b5^7I_ks!#XgE<^Ic@I4C{B!WX{Hx!E^XESbzw*g@;FcQ(urp2aDug@{0E3jz zBJ>wS|9c_ZKfquF@Z3vN_}xEx41VhmzXY#rF2lha?uIEGg2{9QvtX1+v?3S`g0dg- zPV{3Utgv4u!7Kp>){er-;|F0BgIH4z0A~ql8t?PkeZloEzq4|>ey-2Xd-c7sNcw2M zV`B=@pRm99J%;{c-(UUK=@Cm}O7)7KM;)HS{d{nwH=@FpS)mdIeNlpM6+X1AjfK7-+a zjRt81Y?V!Q;vMKoa1Kb1u+1i^zeJ?TTN&E&6XNr9nk$neVW9U5Tb}5OBynyBp_dAm z6j-|n_T(kw#h2|$1sv!R6S)w=bJLb@n4xF%FA{NrnG^#FTNAUOw(LS?fff6pYX?0> z)5LUkGfy?R_q#L^(~=1K%r~B*$+*YgLx$wkgXlvF-I{Ue@9Dc-vvux5A%Q$qqK{O+ zu0T*2d3X*{@U}{MsWfTkER{5Uty>d8r*W4CHob>*8{#s1Wi@6+rYsuIvP#MH^?1E8 z7#+2 zmUxYM3j{y4)3TpRS02{_S*Y#rZQru=<2^0kbb!`E2G^^oaTz+bzSe`AP9BE!m8&ot zUxi`+FigV9{G5%pAH7v!j$tO!m4mmyxhtpP-~RR&;OQ66z~B4j_rQ<6 zSQ-I*@u5rbTYvB^_|i9@gp1c!VCldqfWZM6 z&qI_;GDgMq6_QCuffIVsBNviYj$t~!2!{>~;m$jb!c8a8m@%30@f2@ghdo1bYkAGu zVg}SKgR5r-@AVn!G~Wyp@#KaUD~VI>8n=+KY=-ry=VS@zr17k{SdG3r=W@h78z4H3uh zWgQ<*{@v3vYB0)v+HfS{>T=Xg;?Bia$L%6-Ns|%J`6}GVFXX!D72~Y6oND>KI(vrG z=O^-p3lk5v2N-5(aEy-XWE`Vt$7r0VuL9`cy*wK6F^&vPpB7bwIVaQ92OOL%NA5eB4W zoUn;3jkanU3n}Scy&2tiNbz^GvSgK$4h<@Wr(T~eWOks07g9EiGP_`QPFeO_vF}3I zcGHGcd@HR}W&5>i$0i4>!(o#2b%H_m$+v&d`KNaLlpaElR+M!tZs|;M^Yx2OR`{m= z%dzr0Y#O3|m(?)UhS#=Vv|&Xvu|?*Jibz^mcsttL>bws#F{`(et9D^5owhJ5_IA#B z&ZH5Cg*9)Tc*c#|TGEQ2UIWaqJMxaEV!m%`&S1b@Gg16U*PH}cH$(%fBbfD9VLn)cN1u2ZKK+$vV5c{Y27qvPJNMTli2CDut%|q)cG1d$CZhfR zem7mB;VCHRVdh4I9{l(R?}t;zm*L#$AHq_92Zp@~^k64?*~7InAypsDgIfy4-w+`% znT=p+{Wz>0eIuN?Jb?f5>Br%J`#(Pizw@V$!n0?lu(~#cLo5B*{?c#&>q~uDTOGo4 z=Ky~5PreWT>Nh?QfByL=;rx{mtR1-xhAYQlJR1~wA#gbcz7?*&8AsR#^9{Io_6c~~ zy*I&6ee^z99(2o3bfwC7}!zO)R zbT6p=v*40!cKi^IX5s)!_q9>!(doy?l-5X~ly3gj!lC^+TK=dxUGl1-fN}??F&`=& zX`(U<2uWW4QeT&zapAd67KC_Ciil}!6wmW|LQ`I}F`7Vl6UkcbVD+eZ(H!6djV=TC7-l)jXCme?+f?!ek#w z#->827Br?b)phrg7_16r@LMqbwF?K-uJqm$Z7lYGLw|muj~1O|zGBgOfp=5t-!&`$ zj04)wUhX5c9Yf{v@eezn5)ZoPujW8S? zglW8~B805c%^fKLWxDz;Tp>6Z9Dw6Dz8N+yzX+fC;^Xkt(`VpgKe-JbdfzQ@%Z)3r zw6q+rx!T;?fHP+|;fr5A1Ap|VUxF9TY{KfHTj0pC8(}gV!gLxGlVOU)49WcPs;#gZ zrx5ZFOkg;iz|Phy0Ndx__M6t>lOKBvyziYiV&cCPT1!RqIDS^+efzz3dasl9?a3>) z-Sk`hZ!q_SXW_WVb7!~UkN@l&@a*Z!aNy`I(LmE1gn6QMK*_l^J(ZLtCOa1T1JN_; zlf0suZtY*G8z$O|@~%_Fa|YkaR+5&Aqs*kY#Bb_`d<|25zN|4^DdY3*a#t5aSR3wS z)O45P8DXeBJZ2dg&_1x^y8LJ5GF-=Px}^BK^ZH~XCXPGxneZNVP>B83`SRjIgJG}& z#3TWvl!x;JBp8J-$rvtKdQ;>YlU{r}w;;o3UGH6V1n4u(G?37CIG+%n#`F5TA2{s6 zEKq7ch6qMtPTno-Ei3iZSl?G9<Kdno&HnYW$zfHn8ZNb>K_Ug&C z&HYki>6i>v6l;ttrZGwSnJ+r!iKO#>o^ly}r*nX0Db+Ad3q0DtOXb= zTf-GT^CBnY+VN?JfKq%T*SIw}>2K_Qkd|cMIH3iE5~k*Tp%`?`Dole*@55XLIxMmg zTjNYQW{Zy|RZ=`{Fhtr5 zsMEG$O$B?nkZCcok6s(4SD;M%NmR=jZaosh z!dd2uQb`(1dyEtBL9ccb-kbNh_q`OpyLo{!t6(;aZf9k)VnIDluLdmbKs_=j-z{8bn(AAti$Z-(CJ0PIWx4I7|RnKn{r zIw}M)k3d+V;k^GC`m+t#**Xg+5ADFe{D&WhkALJ=SnbVWKs#lO=?3{fI>C6%tS|!@4*T%*`5pMZ|NKLE^vTOGhILpQ9s-zz zz22wP04ysd=Ol?lQZLc`JiX2QEJbaE<3cUQ80%QF`Jn9ktXL9{uQ)wx_|*7A8k@(~ z3!&kh%sk6}NpA|rwQ^UYp6Cr0DIV>!GHKW)C>o*B*8ASo`6}bC%|Vmw?#cU2eOp-! zb+LZq*nM-icoGR)qVYlo!{v%Mpyi7M3mu0p@5zS{SlZs*R+nleW3#9vC-z(hZ!bhAK}476&)p;Z}yt1Vh7@I?Zb z+bzdX3Qhvn%2=}a(^>gMV+Q6cAbpFK{Tj~lJG6SRlHR45eyo74H&nupbM?}Gl(J7k ztql2R3zkKPr%Zc&*l!joyRF|ecXB=982mF)^nN;>mV1kYXc>i*x2z>pY`DtGx-ob$ zp7~iZChvThNdneXtg`K`H>NEmb7-0iG%jcbuz5X{!U6wXeox0CBweTp8MTrXq9nyI zF2Y-B;40zOFwy$KK6&g-M;hudmH0qIQ8L#g;}Q!T_%n;1FHiF9q98R{$}?W$dgE(D zqhgoh*yJ3bA%Ma{{jqy^RfZ1tJFO_Um2!rgY_YY^V(U?a9g&aE@8(D$S`%aK2K{t8z@Dkcvd=wBBpWm1~8fTV0HZ@ zY;B%{|MaQP!>u=c3{HLY6wIbmSRM{AYG45z%d@VQCbi+;Gd|YqT_4{0SG5pM!hfUJ zdz?7;jvGmtNU|SH5!wzV-c=VKSe<*7gLZ<7McN4nc2u9bjo4X5nZ_$SKgLHYqv| zBTz!_fc{_#qu~^KlPhrf{8MoEtw-UX{{2tD$3J=kPOW1;Ky4Q!n!)#l??utSUZo~$ z*uR_Cb+e3vMeZ@V7v{n#5pHG(*FE-OJR8HfKZ376bP;~%Q(u6q+XrCn;K>-JA(fuo zw^aI5+Z4T#`%|i&ohCf95$Yq2hL{Ld>KdbH|?bJ%8<|Wu~(ivjcAS6oR;oT)_~G|ta8KCrZ+(5Z<5fF z`$@=44?>$UbRoMkHBMFLM1v?#pwIo2z*4?R&m93q)|UzlHQ4j4OkN?4hqFDB*EP3S zDcPta1+ET8m!wxW3hoRYdT8(uV%%17tPuqwqFq)!)hF1gO@AXekmv8D7dE%v(nxoP z=E2SVXK2J4)%9Gk4bf#r$wWHAN1vrcnaZ)`gm`759F^D9P7Ixsi6Sc_lk2Bg&x*D4 zZ*G)GL%S|Q^cuECzUDdd`)4NEC6a^iT?+5MCE4$ji8Dnku|=4ST-=m}$r^C9=U5v# z>~~%9ZW466l$^Y^BY$r+ zdKhm_oA5!AUsQ@46RJz0X^jLgj&nDk`c#C?hQC4>G_4UL+VW-!Ijm^NNl69ecq!~Z zCzO?l7{n{whQos}UmC;HFFX#P`qPKt=9?aX2k$wK*T;p-^2w-~aZ<^IEjar=3xVZY zH$EEJTY3E{lWj%fjQL3nw8wc3H$A`%?l`p!zw+@rU^x6B{LUYK3!ZrXhp>9^CRkcK z5e|jGbUI0qi+BVeHI!}$z|}Nd9>Qp89p;lQ*xA~EOB-7-4d+^i>#%pZV}fII)r<8PYYE*oGLh zT+~kSI7SC)VgE~S|3d!jyg4}+B3a=?#vwu|I`1JQXatz`=dd;!!Dk*i2fy>FZ^BC# zCa`?yD2zsHupQDtNZvs=!Ne;|cp&5$$udLuUpi9k?|LI-3cBIGCo!1FmUCo}d+IWe zlJ9c2+$PO~f76OrD3YU%W=UCDSJAR&{N3mkj9+Ys;=z=D*D!b&XO1DojzLC8*W6A; z+c`4Ue!Ri}I*Ad}!yc5`K+v7s$m(rpXmHF4 zz8oIwg%kP8i}ncBU@Mg%t0Xk(d)DgLWZB-ml3y#Ky?zm%Zarbuuk%J`^ziy*rN&xg zvp}0^hFk|tom%Ch%lJ~=j`g~hx)s2GW!{ApbB#Opb? z4;l=mfQ7u)W@;uOsSlGN%Jrd+&knk^wV+hc+RlEo#Vz7bAEq!2;r^38Om?Pl;!qF%;ji2e2iBJ0H-GPo@YM6? zVPm`l%WEfLX>@@pT2pZdV5kb)3qvk-BT!qGeO&RW&3 z6#q3b5VVxVJh+%Efyg-~8}G$y8G{`r@RY}1x&puRhu?;;J@gbDJa#9{dIw=LODo`Y5ST;)F`JXcly=x8EaS(%dkE|Rf!_r-c&z4dB6 z{}Qg6v8T4y<@;98s#4IK3mE}00#9FE6FnU{&xTISV#n#htNUnH3e5=I_Po!mfo!+e zn{`<)9<8yK|2Dei!BsN^c3s1@@49^Ng**x_-x)_eCr?J(-SbTb&)pVF2b%irz8<-* z;BZbI=I2t-Cb}N3a~t%QV6<`su54U@&wS|_ICjGg@Xvq!ZE)k-0LIf9^agZ>l8sno ze29-YdqFF_cD#RE_EuQ-BVjt6p%1qKpn)eS_ruu?e&v&If}3wX2LJls{#W?+_kIME zjVUZ2x(Q&un&r@WRQ&0Rx-ehi#W3cu2sB2WMe^ZhEW64aWY8-Wj;Kg zLT|nUOY<>oZ=QkG-evgUyKjU4;h%mK-f=g^{EzxW%vJN(crolnrq%S6NrqX#)TH-+dWA|COg;uyO)s{ev)_k8pnC@h;rSF{4PxQzr5xd2mPCNf7~- zri*8i3enmm+1v~Hm){i;SEjVf8Rh#Xxu{Fq9zU<~+B~MLx8)CV*kgijf(mJP^C5+qP)^ zr5tVES}4Ys7zIoDSD51b2x032Tx&*F_B(8lb<$SvQS`0iLj=7 zQ}J%Xnw5+cL-Z~O%Tl!X8v&^A2<_B&_CBReNcRBCiR8&o@TY5MFj_$;zoW2aJSUl_ z*^0$R4m{nwTICZ=TD(fwIic#gZmDvgoaB5FhL zY@a18c&wnGZfPI|M(!`quw@M~zOo_Ps*hi`S$gxe0MQgmW?D7$w~5Ke_1Gbtz9s|| z!bp|T>A!Q-7j-ENn6HM?rr>hAi%AlR;hN+~gs({1qm8>)dK@bHe^&#CXLRUl6wwXw zI^iq0B#&aDgYsKM{+wh1qC+yGE-T?#E-J5{B)K4wr?@|-;coc;5*#>o8=QURdHB8m z{4F?k=pg*^&)o?p)_SltnZe4ik1-5#T~&BQ4R2kITDvcNPTX5OdtJTzwfbc{mLqp5 zijL%MAZZ-_H4L75;K-2=z3T?J;qcGE@BZQU;g9~}+i>yhB{+W5z0oN#o}%IycMpcC zDhE-d;}j(mvx8!UDRmYV%6JR~BLw>M84UU}7!Ic}-@Xi&&OQk@A76uC`uKa`?|$+= zxbvoU6pV9%E;Ghm;ML->U7~#b7k|Gb^IN2aNyd*+8R2$@DI8uK!n3bT;NSemZ^K`F z?rFHRxeRMZj>9A<|GgpJ@)2|d6B*P-14;R-DaZtwEO`66P9RZs0dK*Fw0@FqlIcaZ^&NK)=Yv zsG+#NWxhaa~4eUtEr|-UvP$f@Iq@xY~+UJfu=r+s})3Qxe$St_FKn zb^$=rLf6J2nUy=IU^6Ffed7vsFZUh`)r*Xe2ypXwJjGJ~-Zk+jKeL7cPx0HEV%O}k z>>^ZHqX8S4;(rw}*T$FbrETx-PBG~^m-|!pLId^!V__a@_-0Y%xXF-Ng-01B99kuh znpNg#KNS8&U@io!_#gI!NZL@YaZFgn--`W`ezkk3F_9>FapH#1*&G{_wl-2Y>u9ymD;?Rt}tkc`sb? z8Dc|H17v`Zv zJ{$uu4nEn32WQq5v2nH`XJc^tJXHB!N4#X&%;jl{Gsyt~wa>gQ;gNJ$Ivs7`@EjTB z9H{YS`PlZ?G$tB_mPyNKWbQX<^os48=!SR;K(eeBO11aMw0?<747aNZ&{`EVq5sPh%?OiZ8la&xw;E6alaSdye_4S zeBHEu_p5Zlzf@q54tWVf9cES#?{58fG2(S)sO`mPmR-i#e|b#S8O8-k>a;nCJne7ctXT_SiibhIdyIJ?hj)hz8MLcBbA=<++nrH;5@) zJ5v~~9EH_Bz*8?g1Hbuu--@q);iujRHyuQ!FnEdaO2JBh*QIn_bAMBf3u&KcZkE=# zFaiuleHc&X5Y+oO-F5(O`Fn4NTW>i9zxDf{fk&Ra3|B60!C>VmEUg}e**qM53yP)e zL;iu+Z|U2W@Y=Fre+IMZHf&zG2$QW>;Lz#>-u15A;P3zPhu|acKMsd_06UWz3fBapzxG{v)L#LoWItV+{;Oz~O zkQ9xG?P26liV(FrO2>WOL=(LX{YCxk#-5em82XhiTyBG?GklAb90AdCjLa(;0~JuJ zFbbzu*;sSwva76fuuG}7nIhJ$o;fGkL3|&dnb04vchpNmNKvzl&T?o?9Mw2?6i_YlIK}zr=fg*1* zu3rgUF(v7+1l|ll+Y%=)oYf%93x{fBf+4$rl6A@;%_=RP$5SildcsJ-@QRglqJSgM zY8U6}{ZOVR4`~<0qv_nK8|hIf7gU#Vti0DboV_8G$$_`*Cq8W)kJqMObfUTDu>Xcc zTn6VB{_2LSw4r(>i9Z{?%X9g(Pt-b<-^=})=dsODQ^T95+{)+LD%mzyo?**d@7|j4 zUOd=pZ5ZQWB^-@Iws_C`3OCjZ0?ck0x<1a+7Ddoo;2A1s){0!BggY!Fw8|p^uZB^_ z-Gc=qYi^^tXxgryb#pot>lvkq=KA?ak2n$_j3US*<-Bz_kkqc_?J^Fe6eOwO5jjie zx*3;jxM#U9V=_QmXEc6N4Wkgt^>Y@1-T=mvaAn&8IDErB@Wk^^!EgN5S72vn2EY0X zcfzUF=*y^H56CyD*fXGe5yE}iqQ^|*DCxGWi{8)n*6FLJ_xn{^1$0}-pphIlS&dG7 z39mDwXDD_AZ~Gu6iCgJS;gcUd1^3_c>+tV?`?K(8pMMlCTpI%n!R5MWDDlgt1#O-3nvav;1eHvC;X$o_Yt_`6u@9Ug~@CHqakPd z&-2&oj+?I3xe2F>ezPB?w$E$4yQz)n`A-o5;abP7DZmpiOyFPt#y8+IUwjO2}5R&IQIOTRKb*wyUWEklc&!4!44$?(H9k+8SoMD|TFNvre#j3UO zMtausI6Wo5g)U231s%~cXTRp1@yL1#{m*^%G$mG_+JVO-pJp$lqq7nRdLMc66!wNb zb-bD$o!pY&ldjFjLwu)+yz-LdXn8zYMy#T)he!4ju4cg~8VG5d5;;$URdwVwZsI=O zeAG=Ul!DpEdoBaB4ol3x58W?3s62p-=n!#$Q3?`io+X78@6O(w3K4YcV_L}6b){}5 zLM04M{nQlZ&XzG_K#tJs7eepf0wU4~jSyy$V#+3$2` zx)9Xa6Ys-UD>>&yVl1RAFtOH~IxD6{`~G>>+A|+EU-6)^$vKc~Y0)`tGHA8K*xXlh zeNLEY>q>(}Iqz*kgI}72D2Ye;yw(hs)$v|iKaTi*-sKP0~34ga44s9Qv zF{!N|udP~lZ9;ArMcXy>wd@BpI+1eI9I@gVfZO(=N3ZiUDYWJPX!zRpy0@qCZ_`2X z9UDCYEkq+I?$LM-H|7o+#l&x8Sc0{~Z-kf5zX1Q?w?7M)FP?*c@JkQET_=Yyp3Ptw z6u)xt1uneb|F$evtimdBnU#o?_es{nBw1O2%u3TzAMcI`4*0uo>cju^Pu~ykdiVYC z`+xEFR0QJD5d7|ju8nhZlV$Ck*O6@N=2W#oebf-29959M>F;flv+ zg)SvOkGam035%+vSnEngpzPn;Bm1t@85FKXlRV0CKt#k5yE!236u_D+tJm4!oSaFoXlJv^Z(Tp0v zT@4koepf-?Dz^TH^l(xd9c;T2cK)5CH$oe@kJ7rT_SLOuJS%7lq1)R~zEXuSEiOzZ zW|S0uO`t51z$~6I0;cFk&ZSH!s0pf6aAn&*fsym$!A*OrS!ruhe06_&6TZstJw`)y zxxgeeH>uU1BAR<2&f3K>75Y?%$6g`q$oD208u%b23=4#sv_N41^ii*boOIUb!7a1Idx_>3}J%g>T2%s~i? zF4Gjskkc%fJCf;a3{M{2F0fz3hmRPbl1z)HGKsn0bnRhe6#D{3`}PyUk9;I~j+!HH zhwlcoiZ`lWN`+++;gSjYZh`hmzHGC}lBc3Y+_vLayM(RHtG#%;bh|}_yLyhRr;gOb zJubE@5;6Z6L+zPA7W!N6dp_%{4I~J2Q|YQWd+TdaWu~hKRPqb2-flyxZB}1yPw%Jt zdes6<4K}`DZNascuCu9)rrFB8zh(ctu#3}~s`AsaeU%Y{LhQ0&hexAOglId9>C+(I zlVKe-M_e^|?YgX2cU|WHkfg)nP)fkAzwgXP>_DupEDR|`=aOI&qXW{KMTm#6y}b=< zD@R~>cm^+>e+<6*|7Y({m~Km|!$5SM=^O5RYo4H(CrN+?kS)u$T5h#1TXwhY&~t}7 zqWwDFUwZL6UbyWDJ%?;Z%km&(4WJ2x1c(wd6chy%1w{?it@%#h_nmWIWUhJT%Dwmb z?k$9Dr9|ED?43J@m6>bKwI2Bz{KStv2=9N_!;B~`n!1+a zICajcRWb3kjMV}I$X#1+;9$Oizxl4q@FVa1NqF1C_rixh{1y1zqc6a#H(vo*UPeI= z3J+IO#@XwXYdAT%3TNim;HTgJ5d70$`bqfU`!2zyeSqW58m=A9;9ynUV(lq-Jp|() z#$v^&`E6ASNfVg#w&|-%o^Hz^w{^dTVds8vzMZG0H*=08VtIdum3B|KHgKbEwd)3u_RKp zibe`HY)$;KJ2rFJaU3bNTC;)(meS}M3!ax2x)2}1$?*o3dk66T_rDX~@wPXm z$@bj5eqc&~zbbYEq-WPCtnD*ipAsN&zvK&qIozmJG<@8+#?6 zABJ-)56(u$*BfWU4~QFqJ}bO;-5VuUyxAL0rs0e_iQy&opUNP>>#b=dC3P+L$!`3! zc8tt~XYz~dvnU;^Ts#gV3)AdOLuUXB%mcxP3Rz-q# z17P83QG;ONov(Uaf?=Rs;lo8o;RWwS6hX%iCf?O3)V%gJkAf!y2>-*u>F~MDv&exI z)|$K0{#WjDj~A`fP}J_1@+ETXeRO{MI>)+qJcA>O57! z#0MXLtD7MsINOG3Hz}hSTq(%@9#Xj2 z_hbF#-?cgA{kY1$E_jW-ep>I5NYD{ip?6R`OIhKy)Vh{f4GCqtGhaQoe^hv~5)>`| zdd;g|j>UW4w%8x*eAi>8PmF!S=RZWbS&3mTWC*Kh7UD3Tbv7jAtL?ApXyQGKXmgY5m1& zB6DPyH)CZ%Ok~n85nWP-wA}OFz-Du^h=y?2ooC^1{I$2kJ0H4OQv$9^uH(pXNqOB4CU6wXk#oe@7&V@0S&rr^)A?t;th znU({gI4XsM;2x9OuKpkTC5u%y@Ku5V>y;(kpPM4YrCm5FS&W)&Ic^|k+TgjVjF}Lo z34(RT_e2^fbuwl0to>Vpbs8Rqc^b(k@8qhsO*+YqVk6S#A{8JHDw+6WJU3Pj z)!=@D-p$-;WJ10IUk)|COxcSiW5wDB!!316yJp|87@Xn_BPS{EJ$FV|%e(h@B8GDH ze4`YmoKn%w&BCIEKAsiCtyb>PYkdgWEy|V5u<*aQaBA5X#Yc}pcY;V{Ui3M87GPhz zIR2iDv|+S0s5uF>cxeXWm;y3>lhujs^xBMd#@0V=!>oc3QxnP8?q_=rhZGt3 zVH_)uC9f_6G2xV_&M$2)VXkt#*UkyWtNwnlir&%br0sJJg@+rP&~ZawBb_5$Ss3x^ zd|HLX6S(%;_hAJ$;BWuTPr{G9>j79*f5zRVnO))iS7kRi_Rb{I8H`4aJU3t8Y}b)n zEwKS++Y?wWiXS^DymH zmSqx+g>e?~5g0@nqs%rq+HPUuU@`UlTX-i1!GTOy4Q$wGC@uG|_3GdLUss0|S|}Bl zI6B6NkD4!bhevgTXNgIeP8eC%%ET{v!dZ)4O_M>1;0&Bq{nl9s(yHKCvQ2N@8p9BG z5j?9ZC?0J6-_C@hyT2kgX|$dSclazbsxdgm$DInWQOP1_PTvbtz(X+>|DLsIYVnFg|J>39c`y7Bx>&d0a9ifA z^zt2BxOQH10AoO$zi+V=$8CAVe4I`1#lH!M&S^{~y8HU(D{$wIOn1&?@TgE+_|af5yn^c zCVL^=N?{(P(v&1?mkb~qQ!qT@@PxqWJF9e2NgV9Sh1Oq%ieJDiix3lW%KdRY@6fSzF{~i18dKPCoEoL%*T&ijU;_ZY`?l1)4r|9 zz@DxCc~qikU56uM?7eWpjFWHpH>W4d0)}Sa^vl@(%ir1k+m4y{q_+&%@!9t5`>}Ca zv^ng7pl$LP#}x>19@JXW?l7FAM>kG=?3&D!arrrq5wSSlAsW!bMZNxG+dU;v&s!n0 zXw|v{*JhgEqkD$G<9!w)PP;p#2?BT>3eSOYi%Lo!HtpIHo#%;5YA;HX577h8pA!_6`D5y4GtoY%M5`5BHi zt=FFMTNMqaV&@$DOe@wRIb@mTo-o^l9wyuh%q*AhRos&1ik@BKJlW6D6JX|OCwd4h zRtuOf@Oq9cweV3B<`iIpeAo#7b2H7K|Dem5aVRU1A53aAe-&YCHJ`!VXSVR3x8DJ8 zc;GI0{%1`nwsc+Xw6hXNoSsLBztVR`HZBcwgYo(ZQR8jzb1G~t+1k| zb=LxjFN;^K3~q_z5uKKWza1;n1RG}FqKW~W+oQEZG_|>US^=VXmU%6fQ`nu{?tO+K zg3Iza*0YuC78#7MU37<)(_^NeK^~$F(ul46-mXN|{Ye_hHrrPz40@M&&BDvl6GKN4 zC+K~DHCk?V4#bT-HD=N)ZB_*a?M-VS;cudW%fBZ$IC9G&iZRUNobSN+`}n%R++bw3 zr12!GVMhFWKyX440Wn(lw4cOHMK);3L#lUhnc=FkcjXGazg`^7R^b_};# z8U}tu(J)2G7*ZhAb3)@+4eP8194eNyZA=Oq`j1x5rhPlsqOl7I$bM(r>g~s>RUWZq z_JkwL%$YB0n;eq>uZu)D^K`F7epfXc*>H`u(7XKQNd zuTLxFb~XAV?fX7F!Pu1<>3|DJiBri|zILvhREC#l6;h-R zxc9EJ@YjFpJ#gX7s)~w>GH#qzgNHJ@wk!R-t>rIL5_}y?2IHaku`q**?5U~)SbRYK zsCa~w2!G@~;CNAD@TH3l%ok8C&sGW48NKm_dHoe~yObeZ)vMp5fu|{xzoTqo#lxbM zAAQ%G;R8SZR@j_ef%W<|SS-r@@gm@`V9a;Php&%J=Sj2uH+&@!Wnc3iwMa-K$cU%L z7nV0X-g5m$*`+hK9*sa*WP3||Fyr!}Z-(f(^=Pnj8pGeNk038rIf!`D@|bB)wl0-_ zs2@^W3D~Lvr}0Q_aeaBuJRdeb;870!>mqTz*Xwm7i&?%S((4`{;&~OnhE{H{`_I!+CO;1{%TEV{9J&@fy@#zjEN5qazYW<8G#?QO5t#jlEMj!$=#Bk zFqAQ|**DUaSW{!2{GKd**}XQ~>wOg3l?RjV3Xk<&2nmc<9+4qFWiHg$;vA@U*`IvC5zkBm+i?*4s{S+p8i1Bnm<n*(X!6p3Ud+&g~*=sOcUx)duMjEg0c{jKQgc(N}!?VA` z{9!s@>xNF(DeYC)OrX+OB#5^-;GOOVG|rW5Bo6m6jx$GH+NKT4_%!mg7ROpJSb1fr zWcb&QLK0D;nB93Q*DG!p^bE z#RR;e=y;tnoA@k`uy2J(uc7J@SG!C4y`hVcT@)4kWmCsPvBTV_5JB9hW`pBEZl5xl z5KnYroc#GI?$+MUGNu1p9pf<3yLE!-54O!raM}j-&ua9y$SA3!ecOG|8*A@gKO^Hf zkm>WN+C%n^8BzA!PFGtmY@816I;LIr!w`H7+xa>&UH!I)*h@d|TN&Rj`<&M(uKBIQ zXYBh{QF!`(`h6i|*zV_BW%S#kmy~Y@?#>h|j7Jnhum$}#&@Sa!(!18)n!|T7@dKjZ z22~Zy%`t3BZuf&Zyz#;F@P>O=us3Vsnm7NuMe+TXzwYmhtlitci%wg1_c=0qXS77o zSZ}D>tzugfWzY_Iq+0*FMy4>7_6K#mn^pF&3f`Z;u)l>jziAKdzvmFf!_bp`3nz10qDtNNawfhkDs-QokL8weNGwU;p>5YR|K=W#i2M=6%hcApG~ZlB4s+#8sH^O>oB@()1E8H1Bo1{@YwI z*7jVFU0B8OW`ba5os1g!47YHxR}dI(iX`=$tn@5?W6z=`$o7vGf7ZC_RS)$v*!^5~ zEgR!sHe=-93dfODd1ee##yQkZcCLob+}Ifz8iV&h+Evk$x5wkfI59j?PkG%LIVGKG zVZ$_g8crBnD|;=&Gqm!bZp@7AyQzD6=;Aft)L#y9((?mT${5_NmD44%bHuRSHF8;wM`N8Iq_sV>TIV!LpS>Pq9D+@GQk5>-8QgQ{A-wyYZ-l2` z{61X0aTWH?9M*K5U7!!(iy?l{^Po8#?M~j1YCz zP2?=Li)(;9-tfF#I~^W9ru^l}Pg|dW%P4L@#xsu@$(H5za&?PoHc1H(P~Ht|qcR5B z<|8kIT2qP_=j~J7#CSSp6FA|)PKcguG#DOwr`UjGDv)6ANr3ITDm#88{rxU(^1TSE$(cqaMp;-<&#_7o7FAp7=sy;xCa_hLRT>+&iH zvmK2d^qPPnpeO7hOzVEm>z6i!#?R2g$2 z8zkTnEh~BH6AeXQxMseQcr<>F$Ko{N+<2K{7xtUM(n-tK+b3?8qh$;faiX@?7YnrmpZDOzXB9k-q-6 zIF;lj8xx_PI|)F{b3rI7!0z~ZiyFYXjQpCzujV- zE>;w5i#)a#vSvLwEV$Oj%R^-){B1KnF@0jVv0?|u!+Q#OTiI&{=E4Qmb}i3r){HjA zhG-*wovgKbx7PU<`W@Iq9@BAwTQ6V^ioQK2Jhy`JZz~MqM&d){@8Bmb%K*K54L62v zMVS>m0;~lLwrn0M1I+(t5RFGVtq_^rKQ^n1KiTDlH&Sof{8_m}O#h3|q$GK(rW~lq))h0*3WrJv_(hfooVOOJT|VN9L###O1VbS8eB% zy1DRb6-)71Pgt?%ZQ5Sseyxz^6%)Pn^5dSSK#7cwJ%8E$(mMV9a{H8FdGX`e4OcLe z!y{w?U@DHd{pY^F?{xqS?+{GR3b=I63z5x+D0?>(?qz=tTR82G7FqKIO6Dea7kgYj?<0;t!kkP1qd225)-9-SCD7&!Z)=$5Yb7+_KZ2@7J?r zP_(ycvvu8-zQ0~28%JToj!!nQhLYZG4$JwxrhqGgz%i`hXk8fZPJ4Vmm{Rx+ZHBlz ztzilAl!-4eD`p)VkW~X+ku2Jt6XtXIe3KB$iUP}vI@(p+LF3lV;|&~bPih|p4&{I4 z@8k6vj!F2ul`?FE=zsHi(wI!Sknxvm*ueQSOL)iI-T-F~S8#HCgaI7cYDq${3r1>F zp3OSAb%3^VVPW1qGnQQU9SfZ%a9iXRt%5+tLQUbgRof|ws0b_T=`s*hZ7)HY34h<1KP3*odaJ{E%gmJJfD%$#uw zd5T%G9pE>GW)ZvTlmfGPRWNY(2&&_GdQl#ZHAGO3ZdSUQ< zGPvu0<2_|dec9I2Gaklwb#%0$2LXe_)ruCXxX$S#V}ZppUOeEAV1IcG58b~H zcVDK|NX5$Wx(mv;zx{Rx{^cn3n9Kn7mUFlU057}@@ak(;c?yegOxI60WiE zOMSykW)!hzCt`Q|ArVbNdA#Fa`YIcjT)oM{TP(|42`9)5Jf{YW!ekjo!6=IAmprC4YU()Skz8?ToCbWiLGVz!^Ay zeh;>A6*k)ftt5U5oqNPPL+z7^UT|W+6ydHafJ)|~>aN0vjuBFvl3KbMx%G@4{6v*S zZF7MO^7mN!vs2~B>r{#WXgX6`X%RY=TC?K(X_#u-K94Zfl#p%bp|)9f9+g_;v4Soc zLQ$^16|z#j+6tOr!WVfG)fSq>@m0`g?_1Ar6a8VYi3T7zj_S!k$`geZjZdmE|1unq zeR45@3px0z=2-z)T8&h5UmzjGoF%~U-)>NzK?~fYJ0W%^!G%}y{?fp?J;d!z@%_<( z4I0X^LySsb*0fMdau**NQM|T*8!dBZjV-IIws*JWexjzvYKm0TS@;`e!}yE{6BV_S zb|VG%5_S8b4O#Ed48b!#_l%tG3(uI^IlJ7Q#$DV%sqM$^H-ZbTjE~XZ|F^44St=yDae!k6o7yKStPrlPAUdYO<`kQ_B#2vcaM^s|#{IZHUK6cS z!eg!8%{mxipr>dS5C(n$A2S`xgM*$%p_F@~@Ne}pbK@BB1n}pIC*yIX8Xz!=uy0rE zBaPV%(m=w3E^uvaWx!hm`4EO?VZ3M$uS*)hBe-~B5AL}O;QSuI@iDf~!XnN{*VB*0 z!*REAns26kox$w&=x0jZ#@ZQRR!?QQ(pUuEt4HvauU~^Nefb%9`neZie{Ub|z3USE z$h$AYyWVmR?mV{#3swZ$K9~h{G*I2hMQ11<`VG$ey7ETsCd}^*onTAadb6&AAhA7o zIxYP+Y2qrbV$X!E5N}!DS1Uiv;Mv!1z~kS#0bly+6?p1<&(y2455M6)c>jCvfp@&| z0M6|%1p{RqP{TJ0-(=3&z*@yMvg@~-Lb&CJhU>OPyCU4ZE@_ehE?!*2op+ppz14MC zuW!O^eux3siYI`iBjaGFic=7uTiRm!7sZU{ts-m~?!p6AD=4<^_IP*J_~BB6V7X;d!-d{Fa)W~ADQ(Q=I6&YG)CVa z-!Dq;4$UvNi*-kJl)Rpkik^qsiYep~Zc~UR2&qaEgM+E18VN zJAr|NIpGdTYqvwmh0)L)MC$?71}x z<%tS-8~ily15z2m-t{(L*pJ;fYFmj=jLKAvnbOb|zD>Y$H0kzGX_|WkM4qI(H^Q~6 zW?%5INeS1s$qF?du8DDx#1zAC%?Tn8YwpMfXJW$OW1g z6%q<_4Ht~wAoImk&gx0*iW)NNwM2Fiq6VeZsi`!C=g3?@HR>x4(%srr4X`lPzAw*Q zQhTDD&<$n3%?@B6Q7R*ZReUU3Zr3ubRj+3bTwO>Bo~vb;S@8NA@?m>JupYkWHSLN$4e@N;#a5G6HsVtVFa7q3*YS_76|YEgZRBA&4Gk6x>q#umV0! z%B_pF%o`d^?IW$B=LW|k+CvyxtnT1wJ<%8#b|sjOafP^7Hd~l4u$^MdxZ~0VID5E< z!knW|j63@<{Hv0eQ2~N@xngK}_T^*v-H$#Fzwx`Dho`Rq?47+E;AEdHtB3H?GcUt` z`Q5L;W;=)f=Rf}`cxt2>Dcfq$>dLfA zz_98GHebMvn>XO-_yo6dvp1~e-|&jo`PT}P0C4qa184V_@aT76f&c4Q{uDm)Ctrt` zUfY9%!#iNMJ%HIs!M}&_rLVsLN5AoBaM#@z;BS54jd1Z`UTs-r&pJ$$cm)pa*^DMl z=Vyn??3U|BxtuXcxe9Ub-Iw9QnP=eH7q7!=bx|#&m9JqwCGd}AY_x)Fl&ChvzL-)$s&ANE!Lrd&Cc zX;ZK0;qIaHW%gQC0HE7KV$BR=!^5aTC#N6CL;V^KA;G+;Dbs5DmIQ3h`!X;d`v9XS z+G`A_M}Xu7)a{so+I}r;(eV8piya0>Vn#4zc~lJmdy60l%^(}g?m#dr*H1GLZZHF} z6`1|!_Lxm7j>B&ePWQ73gl`w($V_zGHJ!G}O|{lIW<2n>-*ZaH`F9?BAtEAvFbhwox_XpG!pKy zwh^{bNIeY>vxMudrI+fGoB!5aBHHDHhc27A{{r2ZslH#*q#o!b(`L zoX!UIR|aH!2;BGJW%wsQ|2DXIW)4T2Ev#lUQrdVPP?yH=CmUpDt-`7Bcdxv56<)h`6Bf%o z5@Ar#D0QnfnT7cpoNEQIy!J9&y>_EsB`H3PkxNn04c}0hFf~|Fy@GzqyVc$dzWd@$ z_|S(RgWvr9&%@FDF1X{qH^Fjs4vtQWFuR7sy(L^-eGk6*-EYHx{_RKL;WwOz_rLkB zs<>E?MeheucBj9yTdddPDFN=f^HL22c>L^Zuz!YS2P5=S%#mho1RX@t+61I1B?0Rc z+G&MH%O{I~%5Ajh)cwTQ19#(w9-5NSwf@jY0{5j*MMD(YrGySM_$n&H2WrDfZBp%oS{x-CjSm3%=q#UZh*_(Nw zH1OJD94#lWIIBGKGp$nDHN$(B#!~T6^+=m{KeUEx?pIs$2MmM9wYCXR9#H1&8ZN~{cq|)7%SVSowiz1{9K|X zaQN`xNV)=d*Q%Da)VJ=8^(}&D!)*FFxn~388ABMOnrDGO&Z`E+2*R<|nB~G^CRpn8 zMst_$z5bZTEY;aFv3jKfRJ(tp23nDZU2FZjwIF9>v%fRsu6ufD9W66%?>6>evTL#M z9)o+YuXdlcLP^g0k12D^-dQWPJe$~7)=r(T2{%^x8X;@AAB5j@^U|KAB6VpZzh*&;lAnWfwg+u`hb-9iKNeg|x`tby0CYe{(wQk<1S}^`}qV37Gy9tk&hm z^%l;bI|KWBDkHUYnUxzu{?yAUp<27UO0xU+ZpVse!iuVHWh670cM_~KW; z3EzI|eek|F-<2v+qad)Gfx@5TDYWSaTXbBPE}nkEy(PB<8^1R1CA zZryvJ zXen;#t++0*6$(u++P&}_<~oD`-CB%{V#I9t8l5&n+>(EpBHS977H^H(BD+MfKyKHE z>T^0A`z$*Y@o;2TvW4q#4*6Vp6BQI}F&JasBJ(k>Sj2y`*eYX603CBAGSZvWH6w8Q6p0MBF_njm zFc?y7q}GMbxwhY-xtGRe=aB{%h2i%c&CDnPYCyXxNY5qbZl59NwPHAVxZ3?u!6~ly zJV)P7)B2$D)G)ndLBYCtJ4jZ2+z?p{=Dg5P)6u-BP_vAky<%qTMdiCNd}ibl6}@_J zlUP?lj(OV=_?(KexKo$^6H zg2SDFLMw6o1mMaGC-BO(BRD*>2lK@~%+{;Ae~QchcD8~WCnvC&UxMW!z*ioB0{+8q zd@Ri4&ho_!-1Ce9gzxk1`!QlcfW7O^RUip}?(4*ycog!_%J&G((TlKu;XUO3#zJ@{g_59g0aAv>km6Mu7VK&=y zLL!Q~K>NrFmw0o7jZOZzFi1$41tu<_w^{NlNzgm~G4}py3%m95=0}YeR#nJlb z-cvU_PD0nCM@PXQ^_LWL6-S(T?L0zFxd8Ri2XdHQ-wa4BR92vwuGpi zd)`N67P*anJAH-bkXCJQeg+OUKe%OjdEX2Ll5tVX^PW!4Y*uAYJclbh_EA(4w)-I}PHdmJkFC{B;odT#|d^A!-??k(lY#|t!9)bLbMgS*; z16?^>Emp8#hLMJ7u`9>J=(B_QIR9HNI}7|hno$KhvtjnBfuP#dPL355v{K29?5RrL;mA|KW&ek#tx4S6lU$4T#Rhh=7xQD|6&YYRS z{@#)@hv0o?R1mhpm4r62?O8lXxKQwTgqvf_buFT2fwUKYSC4e!2e+;J`8JIi`V^+zuGvIGc_kK?2VT zl{BE8>y6%f8C1tlJdX=htnkg&BPVBD!aT*B2;0~c;k%P+JLjVq2G%IVav{$-H|BU4 z^vSD-f#ucI^Il{^?oU!X>%}G>Pl?SzFLAKt;Gt&44$=f!kb4;>Uu!yA);MKP+hPps zw4wZapJ2!{LNpv_xi}pX>z z%{o311J}{YIkU)&tDa94*3wowLKMyekybOz9fZ+*%(C<7xxHUAOXlLEh|(xV;c5@J zKj@>Yna=xGnDC5n+)9bWV@$bpYkkBwEl#jSh41(cx2yk79rjd#R(eYa>KNQ#FF3|x z@u%+Ncqa1k`F3vaSlPo2f3Vj1HZZr0ik+fU2nfEQYlYq3hPRxQT|kmC1pYl|y3h?< z*|82&leO)y@wFd@uhOa^aqr}!&7fsZt}O_<^>iLxaaBRdfuyV>V5N!~(;!NK|F(tu z+gpUIO9TC$T>xCVxP*iKC2UTPU<)U(-LBNPlZ1&P^lo7Z2WRhwSC3wUKmGIXzb5(2|xQ255ryOiWrVU%1Koq;2vOylp33AK8MwO28-1So_t{oANlxW@E<<(Ie7NU z77j1m11H-RzznY*IBPBKqvE!|-7aAN@GkiNi%-FC|G}5wf&0$D|M0;#!2_39mH939 zwUcs&YQ|7JOT|W3lo};{-F}Iby`00duL6AR6Hmf_{;!Y1pMT+duvuP)gEM!)&12+< z#h5`rK=nh(LBEB?d=2N%0PHhrng8$z>eI??7~>pZwJI?g(L+PqWg%2$jA&Sr>)lPN zb&r61Zr4^Qo@GKGc{GJkr9K=XUwfsLYL;KCU%D&L^g+s}Bs^-&T4OyK28c(GH?U7g z^{PNMTR;>`VTfVgnv30+1v_1A;-?!aFrx6Bq zTy&4e@V>0^tN%6WXKE>%)aICM8m7%<-i=wXdyE^xiSt~x=^wO#A#1#Ev(LdY5|m3D zVSYV9znNJOvMn0U`|husW#~H0?aqa*XqJg?4;J@P54pIXd&D~0li|M`8es8IQp5t< zZM#LF{9R9zJ7(<}syoGsk(WSZT^pVd^c0Ku4(l_sr_aXLq7{BrgKGO6!ZW*-cK@hr zKfj-LR;~3wTAwh245qz39+ash81J&yJs9n3^@`R6lnh!yF$Vi@`sI4rLun-7#(BAQ(+B&>+8lMwL)}f%SyXhg)*bXYxR(PYN?xvRpt(9~Rl%vi_8QDJ|9@4clw5FOj&Oel@Q%0M1@CV1 zUV_>F1y~*)!20A^T<7(?&EdxJF`T>f2Dowc5Pts?UxV*H`yzbjnVayp{@VR;_vHh) zaApO|1t!q64y{Enf9(X|cef)9~C20DEWdh0WqToU9jBAd|hr zF>fd}Af{bgR)^R9v-iN0Pd^9$=fD0WJpFxupZ}RV;DNhVaPIIB_E$4lEjXPZ{;yd6 zuN?urcKrlieC;~?;m4nXU;mBI!Pmce1b$RgC_XZLPh&CvL}tUat_ zRT-MOC96x~ywW;D_^hItMPIaF&k_GxFJrNwL}2nbbUa=bviK&@nJ`!PRu;nu7^AB^V`_?EhRCzGQA1SXWQgC&A6xE83oUdXS ze!$k?zr1Gz8&PM$1Ar!8Ds$Qu+dyPWMqNdMhkyvH6}9uI&EYUIl^(1J9Gz%$_RRx( z_k9dmjxnViAd2gw0m_WqxQGZ5u-=TN;}gv7ia?<0@w zZT)QRVw>gB99>gxS!>=^oJ=UzO^4@|YGDmh=pk#}%YAEnZUr1q9hZ&8ejlGth3S~J zy4RP4J7qFoQ3C{XfF>o8O21Gl!^rsoW6-FRS~fSXTGo z=E(`n_wIm$#S*^t)D`$Y|MiFA_y6!N_?v(2$KV4$@g8{a!5N%63$VY$y>U|R`o9A3 zjVG?cCm;C={OPB^3QvCbH8`GKg#B}O!*+2NPEN|6T%hNHF=3pm%X$a5^ig@1dM)-CC$Kq!z10k^Ub_P44sXCO z{QTd9x4!BA3KtGsHqBtLJMWs&;9KRFZlxejCE8Rxekjh0FPZ~>EX|=^>bgH!FOV4E z8X2V%FuK9DB!^|R*xsq(XbvbB-PYwM`LHb=+xc#{~CqtOjQiW{-n}p75N;<}n*MLoBxy z?~tMlP=!0a7hVo|M~?R+GJ&DDm_jvAo!%|QWuLu;%$}oBQhXG;rXYKnX)UL7z;jo| zR=r@&7BAx|C>IZCb$_A_ZgM1N+M`KKO-6S~=(iPg0qo}21+;=cKew6^0fsQaMgtQp ziczR)4v^Vkd>0+z2->{WJ*&DsbY;WE@yAk$VX<&ZAdPkno6$6kvMLLz8(mcj;NL@KD#6n^d7|U{ z@0X$Aim^T2lOE2hl*8v7EXURzV*Ynk%w**>jKQuL%6;c7JPj1`Xq;y1(n zkM-4CFRRqblsPsi)Hqz*fT!aMKu`fu+_Cd&*N*W%j;G)Z4;Q_zhwH~tw&~6) zEje2ikcsomvk3p5&6br6I3KLT^}ThJYHCN!lSfTt_|g}{I|}wbc*+@XY*xs z>%MyZM$H8;-4Zdv=<1J@py* z?LT}B?!03kE?zuE_ zW^i=l7+!wmCVc@UL;qzQa8Xkgm*T1QaqS$0yr#3DP zXf8B8o-?y%EL4iTMc>z$CpGmc25}3}V(i)|Wut<1DhWp@y4)N_xJ_c*FilL_Vnr;< z{KWrC@IB&n0$f$zQ#iQsk-^*fYp^n@z$v6&ub)enKXWy~(t)jQi^oap!$H<*%)H|` zh+*;b@%zj2aePgLnlkJd+7F(UP;mQ>d6N99PwqrSv3uyyHr#2DRLBO z!_XvyV__8CS#1Z_TEdIxxv7?4^9!N(F{TO`u`P=nvO4j5p>{1Yj&+k!*@J8zx<3c` zUFJDWbj`eaK7k>AikH7gOF=A|g3c=bvb~U5KZg6z-0~UH%(Tk6raAu| zHT6Stol;nknYyOUyNYNw!doE^>ESD5C7jJnMug8U3aF`dZ--KAd@T6ya2L&GQ`VEy z$Aq)Vdjy4EwE!V5J>49JU@&IQk?$($G|`I_M$x8pwkRj=oa(bj@7=qAI;D?*zC`vG z<%4m9bZriwfx_S|mP?qe7x3z<*WkucNeO7jPt0n!B|HDWoWlPu_}UsdO5wlz7O!^Y zT^)K-g60)L_M!V%@XvqwgYf*77vYgFJPWJUSy-+v!+N`blaf87xMffVsPc7j*jUe& zFh95qXAUpG@r~>7%u6r9lh3?Zg`K^{rxj=?%YLK?j6E< zy@1VjS=(kosS0RTaa7Kqbz>pHuL|kg1+4Zi!rA@vaB^}DUU>B-ck z<$v-4c=LmYP;8{f*;N$NNMT(70RR9=L_t);c+st6zXY?>)AU`H^j7&Z_NiCK4^<{k za0_tb<`#~RiqKY4H%NEQ*MKWL2$&!ei z@HgT`z)1#N`afmhYNY(cGHymElXhJYJr)^0oOuz#6PYfR4}pIfnb#PJEUlEe&T_sV zb(3>gZ%TX=hFsVu*-Ycw@V*H0weo2sqsw~rWhV{TZ<^n3VOgyN=EE{@*${mHrnzhA z)32$9Js~9ZG2It&4-*KAZmW;H^5;|BxqT!_+m;9#wjT@yDT)xW4z=Qc7(L+uH_pCD zFR;}tOo9~JsyS20{|bRfx>12iVej!uWRR@oWO}JuFwtQ8Hu}s*e~#XAHUP&{6$^{r zT-!DGb%&Vpe4l5+?VyD-`F*PzdyBNkz8|yVPx-D_#+aE{SNCuZn=v8Dzr+316XI`| zLL^#iVu|ZIb|$8k?5tpr7*3frGzQzut~aRjb!(qxb%)xxl`)u>xJLfgjw|+QX$J=$ zLSp5G(c6lnvN4Xq8OP-ryAh^CglKwBw9f^+GJ;CmkSajscPT-JX`;Q#wR0 z#3i~qZ07LtD_7x0$;Xx{a+1`vE#CUeC;Z<^8B!KZIagL`wx}ubws5#yzz5%VC;a1I zdLO*{>Zjpr-~KL~xj2W#;(W=+h)SbcP|(8^dE_PwOPKFpgi8k(tF^u`%A55`bq_Cf z4;FJ+tPWs4->>P%iWTg5T?91}97SV zYe6a3WDiE+N3F50N#jk#vYorol+bdI(}(9nTS%2VPPnBxR?jO^sL36B>(y%l*m|p) zLwW4=P`wB;rGbs$-_X(IN}2)r5Dkj-SmDEb3VPf|yutprY#``u)4DgwJB`n2G|EXD zz%YhRixgYK)EB{*#+iRc3TRz-Tr0kY1AgDh7#Qy5y1IJM;hSN&#$t^DL()q+e~uf} zsn4V~R}`u&8s}z}StTcjuUuTWDIFlE^l^CC;jtl^OW5XQBTSFqftAml_dZ}lF{s`=%2X--7wpI5?J{#+z? z;WMVWE1bDtN-7-1?_%4%_Xr0VEpkmkdiL|M>Fh%5CODe5fL9?{U>+8v;#_(J(Ziwq z*WTsP{`qrD5cxf7stb_YJ52g#?uCHoX6uQ-ZI&6LqRXZ*q5*e`}B|!$q2n$_HtIY7@UvJjc`>eWt64i^VV}lZLR&r+WXEhW#^&?lZ zsJ`(C;GjYD_0B?A2Cp2~L-(DGEe0tvbgo`wW0ykappDC*V-}3!m6=ql;O22SWu`Do zeAh6fa5PLMruD-i;5|{y7maSU30!KR>2d{N4lllZ6|P=As?mfn+B{wNW7p{k#Z$(= z9Ay_=U=^YwM0EF!;zf%;Esuh0ia2C7pTlv&x#vd?!hD7<5CZ{oaC`;M?_Gy~{!jic{PI6|JM6)xrmU=L5IGZwCs=@MgrfupL|T*4#WA|& zi$>ztelb3mr3?N2MT!vHS5T1R-XY#;2Jq6$ufnzK$1qa#JD&+`y(i<_!z5Q%$5gXZ+7&b9>x*6Xvtj%W%h{*-pJxGih#gw%nXO)5IG~>>5kIjX++X&FOjZ zdXn+t|H@U$`if%fS^l%fZ@F_vDN!6pYp!JRHTQy>TbY^0;*8^zev_e66ab|ScG2e) zJ5}JV|Bt~7Xje(o^_gMpa1w-|O`wN*LxBRM=mhK_{lpj;apPGa^-7QN%)iyKv!Eg0 z@I6Kf+<>^qyf@6=X@nrugBV25iV=E_(Q8ZJ>bhf@XgjCDgDuvV9?{qPt5y>>Bs^#D z$CNMjelw=@Dgb5oFWrn$0P}(a@2z1bx+kdE^|go8tVjY|hK&_kY#+nQ6#hO()I3I= z`w*OW-DmL|UW2Iu{Ls4|;n}rh`)242b3x*yI6~{#Gm_&F+b=#Jo=E;~1`YCNA6dpqJeWFT ztaYk_%4c-&%N_;^Md_ z6^71={1;zNgC}}4xYtHcP_*x|!gPw^x2Sh+@prLm|I*)m2OJ&E;Q#w8zXPwnd;}Nn zDDL!UYid2rMUM0y1q=){i2`|v-e}`i6bpM1&MAHX2T)=m*$Ih75Zl0fvxfauQ3PFw ztFOHTC+icqc;OPP_AkKAqf)Cd^0d!5E>Zm&xzc%!&5z^Y9M~vCRJIzGQk3$nezn=c zX112!Ws=KfiKcx6UV8osxO8p<|JyJBBK*U@`)0W3eCZSAHxz`-x&@;eui4bKA5sQQ z<(a8=awT`(`!Nshtr2OZUD-;BFM| zI0vKE6v3Z)P8*AadXu^P-_)i=S2rFdDk*wlJw?B?zD#$6OFv&BU|FLP2IuAOKPeDO z;0+NRTV>JIHH!43scYB4@ufYyz%ka?_ukMHcKa7ON&Ckumm2TE%8^CjM&aLFTiAwc z1q4$bGv^%1V1cO}nVxufp(1B4%P9f>Ol*P}>q}(?V~8|y2_o;wGDC)2qXJ?oUmdG4 zZDzSf>kv&%DV!=Kit5!&&1l2)Jo!~Xh$gKD#zzuzqMkO0z4+wu<7$wqZ)#+IMdVccw6MH!B2#tZeX7a z7Q2)o!SytZ$E_C@*miA`5p4@cv34i8K$SmvtEW-4O#QCMblZ1PK#M}ZlJ?zme|qc#;rgE(JYB|UTCQB~~6+_6m+Bi+H!=biMfv6mlo3=JDyU;ab5 zyxvE)mi=}gG$p#e_L$>9`|(N%)@(qj@|$)bmakvRghRNVLMyF%deim zv(Ingl^ZiSS9}<&(aeUuO%_!^@WUkbkC)wqIse_1Zy2Wtw5_1P$H4RV_2-hVd|bV` zhWjq;RZoDcSFgdZf9Mf->Y2yj!sUnH;LKfcT;1o_ur*gpiP9Tp3wJ@W<)eOA`6u>) zADFwuRag2UHv}1;l6Y55C7he!$19{ zx50yVmwBJS-eOq|dD%*EFADSWw-+`}yRQAU_LfjzhVEkT+#B{`_?hRPe*s>-b`zGX zL)gyA>w>qR14>O7AgLWOtB2*PqkLkE&Pz!Gd600h#-uL(gf_>5iK-AhcZkj5`n%yK+FPQzFo&dBBSSxtlBJ#yzC@o6Y)VIp-MJ_n}9OyzF2^p zFVYR!4}7A?ZpI-j!aKu{hy_I7i~Fd#V-|*&k2&VjuIph4o-jrDENbt|W6pIfUG_Be z^ywxZmJn^(50No58*YrNFYZjTzC>8^-wSom8DQG&H+&yT_ld0;51D^AH2+;J%ea56 z_Bdu1P)oo6)>@U#-)`z&fYZ8T!Ml88jYinjX*zXt^WVJwg6(Mw_7Nkgj+frtRAJ=T zsqJ?dPPbyQ*FJIqeo7hND^#y`MEx1TCbl8Mms1Xs7XWzzSOtvqEq7`0$96;&kkNru zso7IZ4k$>%Q)LE?f2J^pDmexiD6^t4qB#in4oW2p+JC&kT1p zUlePRy(7w$nIfReMM2k|-79uqOhPmITHtCdVPf@S0WN98GO0mvgO(tUxnp-O2?DT! zo9iWf=X=-TndjE<)`!rdTtI^J5@J5n zWGJUA+$9#k(a{?2zheRa$N%~PSj;!@o4@-xc;?FY;p)jvSnOYhzgmZ!SV*Y_08wufByR)gn#;vehe<3-$2nflq&}ggbYB-({V>E?1*tH_d?7{ z#uJY#`+K|=oJ#TF-&>&r;eB*6gJ-_~BD{9(2$ttABhILI#nDYbztF&I2GNt*+)GbA z8C?g36)UGvJc#6@M1;1yx=~tK4VZNAmO)+ob=+3h$O%u?5Q%Jhi?<(BRonn+&Q<6KuqMX^%a#Brc5?UR&H{ zWz~X^yi$RdKNX(E2s{E;1-4N@h(LUY-MzZ8A^8T zu-|tDYoqL_F8O4!9y)xu&cWp*2(uQCvr9~!rvY94RwCTC47CbQZIsA*kjwi5FS7xe zL9`jZtEMsr`pP^43=GXECHG~IS&gveHQ@1!Th<7XJ8kK?-%KHtY8}bm>-UJP40E}o zdsbmQVl?`enJaK+t4WK@cIhuecG>%(wsuj*^xNWk@p{Fy{V>E3W#bqd`;_*gCV1$3 zEA$O9X+sKwdPcG!g4?(0Q|rH zx1WZ$zUcw@cfbCp@VPI42iEIrusVA;Z0CoS-CS?V-dvWCD21P%Iox|J_L~4`^`0%d z+t0Truz(ZT9$$qU*Pe&N#Wna_f8$5s|M8FC2S52^7hpXDc=+C*hkGtvgx~ptPs6oq zFTvv6U9ebPgyWMXY&Io`;1cgKGj6UPC&Y&lPlMMnF@9Cy{fclghZ3mp1m;C~aq=46 zxcV%d-8+Gw`N?;|Kl{fYgb%#`4menBVYw-357B!YLnrWD(0hR6Ahmk{XCBvKXq|h{ z;(p22daUe1i}UYM*IXhCyzufCp8Ni5aPxQzhpR)lc~Y)Ts|YN(tWYLqYu%WQNtT1E zckq6xBNq5_SG?vwM^EG-MOge@N7sroEf3(u38hfoGplk93Vql{ogU#z&PbqX>onqi zEOt)Hx9S#?F^EUD|JEu3InG7hqscnB_8HEUj;_SqDeo55IH+rd*Kas>0?vu!UPT(m zxTVry9AGsZ;&tr4CnCZUuNg7@jxu4h4xsDQ!lK|IqjcI$u$Q3*VH%tg2tJQnig!?nB+cDCk#fFC9V@`;BeL0E6$$*P-&l z(H$JIL>TKTwq+PPqepPSG6zQcMC^+D0`GD}OS%?LRhThRJV$OLL3*r#<~+#!hY06p z{BqWeU@pRq=~rd-S}G2qyqP>-jyDi3#JmCuhcM^53?WZF&8^vJRq=pp=MdYr6?D-< ziWxW*4scx<1CoHj&qOn-N~78q20C!5Pu!Ri9irWJV?@j|I10BE8HD@L>>{Xrw87(S zJACLY<6cU8e<&TP8D|`u!j#)ZcUx5y@maG0{@heL!iVdf-Ljm;beu?z)f;0Lu%5cN zv9?=;&mdS@0%Yem#`yNy$lA}!E=q%*Lcj|4L*wrWdH$IVx|WQK86ZOb$XFqOD+?jd z46_|PUFzQ?NaFLp;1TCOMG(e0wRh8d$66T}lRA#?YLbpZnKpKrGZsyIZ%`kJAxLNg zxtd}?Iwhp|2M1;%hK%sU&^FJQ8=g${d%FwZuQ{l{@ zc8pbG94ZQW?B6hyeD724>{HvEt669u(I>-D)1Xu-!9f8D2W{%U^ZW(lrW(9`u?MSz zi|~ynpM%Grcp84;Z{7{t!sVACG2dw!+~f}C05$jvEt$aG6Wqpx_g(tfX?*ngoUHkl zCEZ(WVSjH1f9Gf401rLz3-GZ&{SN&0?>z!vf8tSq)g?G{{vJ5ky9l%Sf_yRgs)xxF zUIjqJRs6hK{!5U(?GbElz5=hk@-)oXFT=auen0%9zxxaDw}0k-c+>r7;E=}lV{eKMnKkYw+G5c{BXO|LKG9Ge317y!qktaAt+Z+X53*vFfcB z!J{=j8EFPY$TUK(7!lgFj(-oWlifRU-TTGz8!9Xh?uUUf6|__MpzCXZ?>u!KUU>Pa zW^*VCn0ocI1X`?eA<7EKYumUW2(!xfa9X$ezPR(py-PHU_h>!$h}Wv3ij_Q7Amy9m zM(7m$OCC*8$g}gV9!e3pFSlO&E1Oo*vR2j34ouje@zR%XOe#0cV!pV%u%tu<$o6u%*20vG#$OwFH!bBY-1UDkmzD@aHDZ2fbMoO&^h! zw7xtFYPhBZ?TgtMF(}BCg8Jc73SrU(CNL1+LoJI8=QkrC5{`&0T-bzyESRuZW?Z`X zDFkFp=Di%2P@gxxXsi_(qIHlNZ6#>jv|SCJr?y~c(YhWs5C~e!p~A>=@&}wlDDQbn zkD~a%{&~n=cpns^QeqzkRIC2ky(n>QHIvxtw03u~AWUh?3Z5QzSs7MnNG-BdWk|o* zc2D>odOubgOMzvYh^Scw8w=}hU3TradsMQUbc%NxEx)@;q`8VuyZX6eh6bF}?ONa| zz`W7Vkb-en0e!68j(NJ65EP?KSjg=RPHt}C;=vp~_?|o9{=4shH$A)$ zpZN55;0s@U0lxjz^Kj*bXJIzqhxzJEP4&08f2PKEK-pNWyv3TfK3T(NeGDh-BRDy^ z4zRufm(R}Oy>Gu4-v49of}i=x`{4ucdn?>`w))Uj;j-{jhx0YO{q6&}|9^TDJapd* ze*6m$z~{bv1-|*%J zlZZKi%3(tV>Ue`-dwNI8TbUY^j%e7OhA14rfgb zyTV8X{#u0T2ByVpLgwD#zdfCGlJ&^QviAHHr&3B(9jAie4UYI6pGSc*S~YNSjP}GF zO401mm@9LKxqGHr)w=bp2CL6Zj==|~I0YFnN5dPIILNpm<(%M#5>#Z|X0o+IxU<_v z+jCrcQVt~;hw66}U%i=*5gbg9Ve42Vwa(`geydiF?tT&X-Dr}d!f0TOS@CQyz{7=V;W>_ysN3&RbF4w(G6!R-Bg#&Ad34G%M5H zEKL9~bl*OJ^=1Lze)45_^lPue9Y1~!_LsAg#vS%{h-0?x3gUrC@2Xh1jmm%?eu+4( z_s!To>nS}4@tV0x%}T)%(ye^5*qg)A(H4$2Te$bmIsDUKco+QS``-m0|J1kP&p-E7 zc;eeH!i%pQ!`188;rh*2U~{y9^$~ii2+vrpwsY8<&tbKg!Rl}Z2L~&-^U@`F=bJ9V z-}r0qgP-~7yWoLCfMeKHck<<84*O!sU%<`vrvCo9_df_9c>ja&xkqonAN|Sa;Y(lr z9z6BzRe1H*7Og(c>2H@-8?7d>r?uu80 z;Vm+GN9UmOkj{tin+*^oDy+4@Vt#^nx$~@FhvEDJmKMe@oCvDI-bW38!irs7P|T`dCmv|nq|r_C4`K8J&3$;p~63FI8|8G=;7K< zap`Pl_xhG7wDp-)yWi~h>t??R-l{)*KMj$vUOHK?)DFfe;ackP65X}En;4EOGUKWp z#sMOV4J;v#JLJ&SJ_v7QaH(!#ePu~Q<{L{iS>7FW;YjcO(!;&+y&I~5Yb(GL{-P=Z zuX-D;DA7#Yj12L}W7~){)4eQsJHkog(eSstR`WbXX>8Yh-G@={S$rRrU>G2s_6{@6 zM7x+Hur#`QQ7|2#QQ5Y*?MYrS+0Ea zcfvE@e-%FU=`XDz3kmq_8T(tEV#25V|lw=&hUyr2`aq?xbHH+KmL0U!$0^t55qIh0etg` z7vY=Vd;*^Q?)TuC@4o=AT)kEU335E7y}c!zJJ^Sd=g+{McU*!y@4N_adgB}5J@0$~ z9=;#o%s!6csP2e4tV&1$9wYr{wM3!nq>N_^@RRS}hxfkwr{T(r0AGFl1^C+I--V~1 zeg>Yu@(R5C%5}JT^B7J}HgK|8SH7o2_&?lV!KL$O;huXg!#m#g7WlDuJqQoqzp7~m z%iN0cpeQLyG?gXgQMa)2cYjp~vBD7#I$LuqCjB71RB(6^SKykoI6|+7u{*vcyXE)E zb_;s|@bvT7;nByx2RDw-!RpLmNSl^fohg`W6yz+9G{}gte1R)lRlUJUd2LJcP!3Q9 zDyBcjZ>py>r!%EZWv|IPfvmGMEYwGXsWl$hAb6JV%UaU_aW>|R4;iae!~6OSZodSeLG&iKho$2|(Iz(yjAY#S;&&r}KKt`J$`XdY#;!6}pz5 z7$D0378Kx}xaxH77EZ#;^Srkm5nOl+AG59w)ug3F@fi0Q+U8WTV&P|(M`bqU1L-oh z$P0Bo^;XFS1LN|wnR>0q^V$VB8tn%MkWr`N~KDg4QxxBg|H%#FLho|(~90PE<&P?HxL@> zehTA+iiPsn?gdp$nf$Qz0BWXTY>)1Gt@(~};d3eAO9@ECcfoMbMrgN!J&!G!vAnY| zSH;jU&pp*o?et~%yby7&`^iXg7U?pxF+2U4>j_{v!EL|uTH_wU7#8xZGE5k|;Y>0~ zAJglNSpattHm0;crU=ODX5SSYQqNcsz-+Ln%6oM12IEI_m%iYf(oP8kRTXf87gTt) zLv+G(4Lnvfy2^~|H=YT2Js9-HDkjmEN&RCObX7KbMYt0-41;bN;a-V!fY0fz%-Jer z-SaSKg@GR{GB%5<0J!qP75KByd;|XeFaCA7@McwhRTj(K>^k+@$dn@!{rau>4?@tp zm9uZ_mzWcH-f$m^2S3M5DnjyR3kM6_hb8vk#fJgjc+X|{;Cs)&&7-%$wWDLWd9;S( zqirFLwT;zs2K%dd{old<3ieh@ICHQMXZN8Bl*sg&Y(4QRhY>pFH7FUXj!GE9bC&_` z`iVQ>$KQPpt{uGvZXTV$^&1pQCi$l5TfMe$3-4I^&a_R2G3jt_{!IB z!1tcJ3ft8k_1Z=8*x>eKRC;Wax!g93h||T>OA8CjJhf4z8y5(-M#O~Td7v0! zMu8FOaXV1cW|cLHSX<6$@z2q+_ff!B!Kc$Ugf!gLQ zug@v?TRvK1(kOLN{b8+Z#NG6m1Un|HWoa3ezF;|Pw1`SHya`98E#Ank#o&Sw_pVD> z9b`^!UxH9kJ@tA}t(96!@Bpgi#~?Yj;+qIe9F&Qr3!@Z67}$erT}2%TsQq&As|M80 zGZ2QlNqOD85Ng}Q-3mKSuWz8cIA^y zAiv=D@1zkGIv5e#_9EhvJS#Lz+2;X4TSi;qXmh?B4XuL-pQ$NIn{Y@CQL}yO9P}IB zANsc{F$T{yE5Sk)yXV?rw&V2gO{%Em9+k%>UP#owd(0a#Epql+uME+!cbUJIFttp^ zlyepFXQ$SP^3&hZ^SD6;c*}^zdVUUyvot7E?1%V*cB(>~XuN`Jty`(5W0ib4i0GYU z*3=J`?JdBT=RK&fVd>vKBK#m07_R65qn`_EbU%blw0PLiY*ef$ol@%?j5}q&n@O~ z{#;Qd?1lClcFnyzIo`m{V(cIVM~(7N8w_c>0Kvh`!qEy87RF<1*;|L~_mtwV=H!Bi zry*7ki!S_lfx+|7Ec_RE?au%n`}Rxl>CZj|C$sagSe$`P$pRtxToIAmTO~iuW)6#T z7u*E9mHXy~&SvXg`LC*+F#?_Y<2eo8j{M#sf?n%iyyb|o5d zH={0CcU>PdzAkey)-LawLpeYM-DVh(Pz3ft_q z%U3qd`5cL3QO88l-%I1=T-3g8OcQAU4H?`&8a>E?wmhHN?LqvH?B_`DQvi;7-Utw0 z*D`hnxI}(j5lNK;=oMa1-PSA~1!hH2Q-J=ZuY3Td&Y8rsbhHtjs!33 zkPfuZgxIT}z0yUGM6c@^ud)|Kh&Rd`NaSj4T|rEQ@v^D zlwFK?VtoK=K8BcvE3h6HT~lLdfN26J@*AmtR6bQ^ZCenYYC$}tIi$072jHm@WHzeoVt zr1A+h#j5J=kz1mK9Xi1wFro3_^4u(eN8!+>&T30ndql)5zh7cPB{qzu$>C_qW=(Ff z^$sj;RNtxr5U1rpW<0}PqWGXaAZgePL1&Gb2&J{(Rw(n@F#NZ5Unv{9XUT2_-0TqY zvv|!Tx=-y=c z`B$$KP`mZMlOK1k@r*8cEGVnMaa!JTSP78T^?Rq6Z#}j(!~_pn(3&%-FLLXzq7}!P z*mY-DvbKGXO~zr-j??aW`)q`<9 zTY@#|8B}#Z7;;iRzkhv$6%{x~rA^8|bGDTo?g;wc#RI2@N9;c4Qt>v)1AIoQIhC!d7fg9> zVi;H&AfB-FwkV-Vd2PKcs`0A`_$rY%FhUqJ+zpRF{o3ZQQ1Sw6J})vYn*tV(mn-I5Tvb-MFD530I%&Cc1Hy7A)&Um$se*O z0J-dPtOedTR^@Kz%?OZihW1s3tPLTIsVsF{Pn1hL2%K3v*amxdWc?V1z_^HlSaj?? zu;d#XL~V-!p`0q)?vq5}6USkd78!yU<PE=$HYpbX$ykem@ODCDt3s5OQ$~L^@NC2U{K(578bj!MdttyTW(VpQl8xH*TQp4p^0J z#izGYHqz2t&nfSgY7_f(AY^+E{|*<+>_$AMl~9Q%45PsdmLXy{M4WP`uTAVZDI_QGHXK~(NS*Gco)oo}web76z znb6UrVObka_#D8|J%xkqZ|K`h31IOYjmAiHq|CNTAMt9m+1RtYI6o_OPAeJy zwE}*`Vtl6~H@p$6j4Q()ZITLRA+a8ZIRyeRJ{h+bi z_qN|+s3}iN01i4(1zj4GE%PoVmcn9x21oNPeB@(ahR=WbDOl}ahLi0+%x23P+#11G z@UK;}L&ZG|U&d2$X00GgbwYeBY1SC8+~k-}(Y{5}7T1k<-Y^c!-=b4VSnG~bBJ$q6 zcNpzqTnh>oElMZ-0@LJep@xi->$bMVxaT@_B*PG}oO(V=R-^uu5UG58&XQeKM;~~yZ6^9M|Q8+up0H3e=sEkYR zL2ro%k2peTs{~y)F8Fj^MEMSL4uzG|3`Nwiv1O=?#W;xP6qZDcxOF}z0KBiKa%=VK z6K#5VhDKuz+Ue&=+)e-_3kt+NSxrt>7@p0>)(4}+$u3^El+8eqB2nnlHaP%cK_WPO zPy8*jlutq;HHg68jMw~B;aW9$S}h(fW}2<#gt5Fm3}HMrn?T1b!HAmsk<(h2P9n7Q z=WP#i5JeEiRw%UaV`6UM!En}RxUuoTq=c^4Z>{;`$^Z-5TU5d)o$9Nf-ug!w$fVLzuGwA6i%&z=eeZ9dPF? zOf0(Y+;9Hg!Kt%;t>RJMcxI*c{9R&YYFiC!F$y(j^n>|jy7eEX~N|< zhS#NJ=fReq!cqjRMqu>qu!WxCN;Or9txM&{CI3@g&TD4ru_$~py4IO5GlSME&k2`I zp9GIAV6$1ke0d1_XYYpRt{lPd|Iydry7WpSqDj59c*T5)FE$?q|k-DA_ zDXEy3Q@j|@RaRg4?x2iuFi#x-q9Sbisq(yKM%Wm(H2)$~k+IX^h0c|05zq+^VnhkD zk*FDrj8=pE@!6%1%J-}+RMx|I93?I5WTrrXZNXqRftMzt=N|CB9K^@8^9m9)n}8*(CLk>r%(+bG}V4Bj|% zz;)U*ml@JdkxKTf!(>SnRsym0-yk8Cxig|cu{mfjrm(Thw|y=GK@NZ3VtiigjCf2< z+M-jH(=aJ5B3DJt037)5_IRYiRhPlA5zj5W%#6?jCNJsDRO2dG5q0;3+n1ZEc!-`TQxK*X4ZsxC8HEVF-{_RE zvOW>7tM>w#!v^Bs+@8{3>mk~hF`A(Y#~-m@NsvEctSF+n=~5NZvKE%%4Gd)JzAT)c z>Zu*h96=NA9nz(3@if`)!QqAb;nBxmg@6B_J_}!a>RJs%R;F-l^F{JRM$5EyoqTcz zg=PQunDVFJ#q4#hKXp9SS|wy3aSX4u4^(+8Wq2&T>w!I{xp`*xuU|WBsnl&^pBa|z z2ZGOEZ{Z*3rTiaqT_(N~8fdHQ|Bdw)4)zxC%JnUL_z#|h$G-UrtY?QXU!JMfe}Ol(QfgDhS~u>Ac2udc!1dEoUgSm%-|pmpHSC>c zz2m-*=TJluH|NMl(lyhCG3Lp~MwmDCxt*vuM1`&bK~|6ydzdPZXcWsjj<%F*Y|7w8 z!%kH{lF^Y1;v_4(QZUNSSh@yq_SkF!%1GncXyYO1Jt%A=Dj@{<8jBPU$y&l?AB5p$R)+SOncqHn%~B9PZs9PS!FnN=iiBv%EK(2>)j6cD{a3w{y1& zy%ISY3*NV?ZPDJ)KqdH#?+06@p4Im5LWG7G$HuC~$0>e%=Bb ziCCE_WBA-_pDZX!%^LL3s?jZsIB2E0iXrKHY)ZT6y34_Ge1C2#6$ueNt4)#On<}w) zYh`LB;GSyrMc_4Vcs6fuj9a6BaOL53$dpoiw(-3BKJ{IWFL=tS0K{}-Zjl%(TQuUf z4&S&bx;xL_m6(;lOvdF*8gB!14`mMo>L6_LHa!!GU$(E>R@qBSSnb~lS8v{gM?U`) z{OYfL0sh7R`d)bVeP?Pea^`RKoD8K^n}FNMUDwgE9q<~zi%RAp{1@rMuy8b8*v-Z? zREFki_k&nBMS-f;@i@lQ_Bo|EBieu>CS3;;1GX^;(0fq=$h(#&8RA983=dPjKW%B? zn%APS;IAUMS2yr_bc+Ix6abWWe7#-3SHF1$KJ+^uhgYtx;M|3~;bhHj^o%=7JLcXy z4u<$AqA7(>t+$qt*F+j`V@lC=D8>z4K0~kaB7TqFEryoLW5qFUOrj|EJ;-@vN?B!r z*2Biu=YeZbH^T`yO{iW!_WQ!t87`5RlbJB;70)rwgka%WtnzC$0-0-MtR&;B3kX|$ zp6*>5wkU1*+D46oOmx{?ZK&&70!#8Wbip4OEx(MZUg3*M4JXnjo=z;_Y!r`{;IV`F zRCp9k*{GfXR=zdY0*k3;n`NWHErd=+`TICT@x zR~H1;a+zjH7Sik(*({XSC-n%RU<098;S>)@`<@vwi%h2$UP!$o%fhZQOU+oCMpV#Y zri$-Q#)4O?Dg7JY&8YqBT}#{tMwvh`;`A8U$%%xiejhvpthTk@xi&(Nv`Gi2dJt51pq|o0`{h2z7@1uxC00NaVVhw^ z2Pz}LLv7h{WP8jq$Gjgn?mzVz;>f5)!Pw?Ibz_W#i<#JD1B!w`0%zWu z+j>@p;A@pfQTQ*#2G{drroTz1P(LKZ86%37sYTCmuTSi2h|%UTD?>$B4r{55guo%to;W|FFmPjHx+QP*+7;r>4c$rP z?>qaN6$Awj(^@mriGje({^NgIId)RXm?hnhLkf7V>*3A}t;H2i7&Ek~;J+FT-QtgG z#l<_AdQY2i__#YVGq{37!me>NU> z@EafbG#nl-;h+C6?}xYCyMUv0$pv4o2NDgn9OfyDFy+ZXopQdWC=F~o@fueb#}Dv1 z@m&um#_uzFXz?)r=4V5S3MYizW_rRUyYe<9{Kt9`F1wn4cwpsyv>6QO4T?Q#*tYZpM+%23W&XK`~+@|AWjUh(HU}F=6J`tb#cr11YG&}~$ z4DG&3_%5T2kTnqp+;Kit`ZoqRksVmE$ik%&F(O_lPWVbE42_LZ^r<~-&=R=}ExGud zgK5%a7|!fbnJG=ShCXb!CB_-ze*&i{I;1@TDzAC*7W3W|Gn#M=Sl*s5jpdb%Ph<+_ z4T+{%{)72bd2X&B4$2L-5bfO5>ustOmhXiJv9ulom2ze!G(h1wTnbae_o1tDgj@*h z9JjefNtjJ4n$|_Fat@3G@0#`*kUSyQ!g21-;Cp~98g2HTjNj3&S}mT+=ftRHjE?-r z_b&&-1V*u}ss*HH@Jt_~;WLlIw_=61fhM>HA!&IglVa8hN2+UqC;(G;MOY~-jdMfq z4q0^@z`|If>u;+Sjc%*7j8+&Iq|GcI!+tOZ1;dJAIm}3DUuKcgHe<2t;m|uNQS@EU zE!;)tWYrLT%K5Xi9+?n$p-=Zn%g813X0H!kjc|w2?>O20uBRd9BaUG@{B|o=GoAJ! zK(oxM*{^A%rUi@V#3O`p03#N=-of28Y>hZd%=xQKPu$r_Drq9JL|~mqN)AUpi^;-H zDqi^_M= zmIxa@i{fyMYLP~IZpji#*J=#WQOBDJT%#haw=N0-g%tt`k zZDBlPm^q~b7N_%CcjDQEM=`*ruwG>SlL^q-UT?RsSS(<5=5Dxl?Fc^fkuSn*zJP!J zkKPAwzZZp%nhq4mB|aevTJHm?s58U=cPEM*r2O2YQ@_b(ieW&1i=i|GKIb3e3CVqVMyv2 z<84jK07}!|(m7ADtl~wyn44hrCMCNK3=cWrvNLbVDn8(TDfk}aW*cLuOE;Mwvlk)< zOV(7FI8|;h@RKz|p9~hipn!ovOr#8Nv>Ktpl21((&U!@!w&6QnQ3x4pztMP@`1|2LT%XP;qcS&nK7T=TsMMa1~P;^D0C4nqJhdz_B`7~G)84Aks z#Ar9sIT`mOzQ^CY=Y*~|+ui}<=PtMupAZ8F>aE8vw6uHZw(V(zNrZ+9O6_oWFZN!F zIdECc$g^`634)AedbK@6;&OLS zMS&B`kmc9b8N*%KH}>7GI3eqEC^c(u9K*#@BW2<-`hS<5PWyBCrqkCH5DZ%Eo9mu= z{o7@+pQ@0#J$><}DT4oUZw|-D3;4(%KL;QFgRj9$uL7LEdiG>NZf<|#qc9##af;{HSg)zRQ@jLxtSp0i3SfXg#8=tAp5m=x6~!6wEYGWS zLf>25$93E5gSw|hWt(_XPbtc4)|q06eIcAiabm{gJgcdi>sp<;=$q;vBEqnG=(O_T|j80B9`^ujp_F!SJKEKav8bH)sSjHhtK58`*&7-T!-49s! zZGGf}lLZj!tQK43m(hxWR}G9CcVg!o^90C#%iqZzU2WL^>9lt^NjG2dYGC0w)Q<|1 zo<^^+Dp)Nf9S{f45L`uILK8!Tg9t#4tC3-}+EGja(z7<$Ky^HC;jfJ)uQ?C{gl$Lx zfUi}ZkZId{j8L^&IP2bYcW&>!!QKk?oiBAAIIe;`qvI-f&Fq~WqqLD!F$NCKleNz< zT1~gS3)Oq@(Q}nE7=3F?4zD2#+0?>JM04J>qkuSN0`ezoU&k0bv1-X(YrcQogM&xC z?VNcGA(wR4zeV)noD9Kz>Y6A%?cwkaZgRg*do9E=_kD(0m?6e<2J)(i4&%oIlb#{` zo##}Rb;zt~0oOxxt0x7X_0E_=`)W#Ep)kX6%q)tGpRKY{=cm>PHy33kk%fw9+JZ2n zlgWI9IWv|FOFJwG@tusc52F+u=G+_HB(Rw+V7-~a(a9FhUwR8%dHGxLYajX~y!6U7 z_}~B8d*M9~ovX$Id+h|zVLsPM)@*}=qt$q5f4jLRb%yX|_AK%eDL*sP)@dxs*%-$9 zZohY<;HRd|zM!7*P?2fgRXZ~_=4gG7a2xuajeD$pZlmG-Odq!*{LB95{?j_dM;Lyt zSpQ)$gKNhCpMUfie)ZQr3XeYaeYkYzn`_#?5}%`b7_*7V#ZEwk!K`RLu4Es%_)+G{ zA6t`0_Aul5MvyYbET;SAoee0dxW=FJUK!+TEIp$(E&n}E5khnHT~~l5iIVvm$G=u< zxwL}y#W>^z&urdIpB0XVCOHoV_ImZP#o`qW+QKTLrXbZZWgyIu0{1w@U%_j-==L3_Y7Xz1}a0Up@%%0ur3AL9Ee-Fw2BO^ zg!lO6F2682`2aW&12g9l5SF>Ze$?`487L=|R)Ll_M0r60{scS(`MOz*8?N4e@aZ`0 z!9eZ3rhl*-v@!>?Ijkj690Ib=f$y!9haAYSj=N~l?0nS)AFou9z`-X&kVs3QWYd~E z{(LnfW!McYwLT%q3d`1if)N3=DDXj~N5Um31uGJ)?og<0-K?qolA5EuD-m9*)qkD` z8WAR0H>N$9Vx1(|NQBUdf}sYX%8{SVKi}?N(rh-bEwN?7XTAzZ4gX7dgN3Bo{e$5DLSSh272VIO8gK_MZp%j4)v&R% z8D@guwT)KiF@|%u;)C)aLEAK0667!A8c3uTiF|OrV`k`;WbD{Lor^;McC3@(?G1?{u&EV)5|Hoykz2Y1#wD9$v}+McJ5mrk9I;){HKaUq@#4L)dqA8clxWs zl!fTdneUAm=d3uc@*0$?ZA+<2T|1SZX5LwPGOV20YxaGY&!qvB+ZZkx*;b6HGkblT zT<`TmU&=bpOFDMq6-7y9V1+cw`WYBp$Gp~NjS>ClC8et>2RH~JUtM0W*El9axB0qq zy;vgjnPQ`rX)Ox>YC(apu6u}6ZG#B{DC|V!i8SjO%c@#IBji|KOut8lqVSm|Ail&V zWO<0jp>ZoXz&gub2~KtRgt=MzyPh|_g3iK%HKd?CgG#xwj>~3J%yQAi0VJ$)3z=K= zo1;FacdVLmfCw8hFa@HW3h@L?145Ra8%Ih!`$1!p@yyLtjk&u{vAF+y+sgV$GfG$}ZY;v?L{)vN%9 zcav-kdf4op0DeG$zs_jE;(=rElOQZjWLy|ww@gTX-b1CW(z-^mBE@DtpvQyOEZxI= zU`sF^JeK9Dy;aWVcuL`u$_Sp*d+I*-bIaj?t+3{^A=F8b&VuMOM#ay9A+tL}G+qKD z&B{dS)moB`cAEli_L)DukCur8;&o#7Mpv;S4-K9W%o-LZ6sN6s@EsBuoMb%8bUQ75 zijVSsb}7zU$CSqIn{dY3z8G2|P#3|cYjx-NC5&=A<7>v!pNR$ywc4e?{11IEh%C&;BU<_}kCIY7TG&8#q43 zP8UlIO4-c-*5ClegRQa0JPe)zy|Syvz!X{*6%0dt+^%!pD?OpskJo>*%Q)M%#^7E5 z+wEs+xm8&9#@SO2+4gT~+^#{7^U`)Jdp4_4{g1aNaQ0vYpZw~J@GpPmlkmtFpMuTu zE;u}U2b`R&V6!dKCX1GA_%XPMWCb*qwfHuAJVYAUE1tJ(VPrWG`I`eDD*Wp_C7G882E+lZ92KvpOV}QDXc7p%a$a z8rjNuAaGFd#7jAwgES(v*YMrUPnirk7DvYY{ElRTUsW2uscozN?u!@Z&}~6 zzpSCa7+v&R?}=y)GXt1Ry&))gF)b61P~}oFsbEMI{?Hq(hEJa@UZeWhnPK8u7Z{Hq(f=0}k+)00{-C}T-w zVGamk0zrzI7AQXJFt)jPSGv@irSAp*U65W~YrT5Gh{LDGLm*WIXi`vFix?g{_IgMF zMkB;&7!4KN?qWCm)Yh$_O4%Sni_?m~$LgA=KW0*m15Rp%x=b}jVNNg&fPeB(F+{+AxgIkQ4L^)s0{3q;nS zuZXsLWir#p#Grbaj4`1+_VQoLjkM)7R;>tV4w5wayIC;ah4+y_3UlVpgh-0JkH0%G zLkvg2;uSYct#6~CScKHsUvveXC8ugzU3~s_ulhx#~~WW z%2?SOsALUj7`^V`z-9(nu)_?3V62>j8WxgaiM=ig=Iyl=4LPx8Yc3Y~i@Z2FD4+X+($3oM zwp}z`JfbyY0g}(Ye1d13vv(QZkj?<7!L+JyC3o0YQ9AembP~=NhSeNfi zTH^9(S>3qP>64IM31XPIP1z@#mhZ&biy5?;2SQY`po^Xc#!aXZc>F=)gV>@395W{x z!NaNm*Y+}^#M&2I+gP@3b;o3BWaVr}WnK#r26jAbq_I-H)#RbV3*DEC0)#cHvSHc9 zCei5fTGjN1G${;Wh_2AZRmEBwxozyr%!8Wdc2Kdvps_Cg{EfO-qms=B2E=taJ+kX- z%f}IQL;P*TIJ=e!N66O5(4ruBw#2f=l&#SCIo%23U1axp{g^Gx9(l{?0;8-R9XY$L zyR3;#Z^v5wbZ375ND1k~Oq6&w&pNlIaO`Clk&ztD#3cTiUW3zz8{0_Kq*Lk>k;|2K5Klmzq^3NZK z_y5@2;pcw#9q<$Hy#V)KUcs5Y1?*MD0#kJ}Jxe2m_VapL#>;!l$>&K7rCymTP-oWf zh%0sxY{$Jz#=mP=q_B>TtRzk2mAJ7!b4zfB7qf49O!1rE+{Qc?dNAg3INaEJaZ^Hlk|N0a7<4-;TduJbj#r|Ee-t578v#1(* zKCO!N&|<4&#dD(VMkJvEvZcY18doJF;XMrKM|6UfoEidM?r_d+I z7vVg3EztYbLbS#Il|QcCP!5D>iMDi&0q^#b#Ua@`XZuz?YrWTjr9pno(aLVGwpqS1 z?Muk3=OctxbCmo#FTCRGu9qiSt3-YYe1^zqW6LwR^QYoyfK)@vWQ9?NzE zk;`Ab;!!M*CQYDd-W^;t^}&Gd9~sSBroo#+C}Vv- zM3%Ypv&Da_QC%V6?jOm56Y`Pv9iB`C30{vzYdBnL+yh2vJST(DB15mKeN=emd&*hv zOi>hY{D2KcrY@cZC08>tkH|C?WFXO4*%fGF@T3eLy>HwBO$5gFgRwlqeL(m2R^AVH zhgT(-K)BaI>%_RE=1iy93pEZ#W%QH%)0snLE~aX<<6L#04Bs2qb3b8|?x^TtZMn>& zsyx}XPm7CdAo$h<6st@sUHwV4qF$+{#Lfow<9^~8drYh3X61z)08do1*!CjhkCV#; zP+kjdL&sTf(K*JXSNgaU-6tIkh6`VAuun<$}L#Bw~lHtoK!k!&Ns_-IMi8oe-bBXTH=fE>sHr|f3L0`tX3KL$> z4zH&hR3pU5Idq;D$vh3i-4kHBz4#taLKur111l;@`+KmSEnrjFo#oxIIC~aeI(iL0 z`sr`Lr$7HCc>BW_;b%Yi9{Afo`yP15n^thZ=wXA-BFpqTisBuoj2WOoh~ryqXx zG(6Mb&?pQQ@)`ig<;VO4PG&3kk9{BJ2lv8q|87`s59%31S8V2=4F0Y7 z!<_A8{0<))K0dAy;~{Rz^5J~OqTm>nCH#F{FUd!51}L;FjDl&9{XGf(6_z@0J5HvZ zV~VL*8XjD5lTTfk)vt82;&@f4GOtwRh1#Z-r?M%z_-uNGx{-;@6=D%ZI4Ub`Hs#|` z!R(A|EHm*sH?$x7(e>8fGKPs|YsSGb=Xm_tI^#2S;g4DJN_%23 z(^&QMF)=?w_==xwiyx0PBBPZ5$p#FJW(G{r)^IWb_nBqzI>e1@@;bZus-{K}yFRz> z>DHQ#sU%3((ZDqlMyvO?m>Jzxuw517>ymUd7ELTGI#gbhW+LpHZybUW0>cN^Ge>oO zB#$Wx*K*e=-vqUOvjn6Qt<&yX4Wd@A_D0|66FSiB*}-l%7W$ORr12C9+PZ$0&M+p2 z;KrFJ#~c{L*$`@AqbM&YNqmBw?9F>OCu%sz@rJmWF?s;WGd+TgeDEO$mb7P7iJ*>w zTjDJgnW_o~Bg`s-%OGOmXxG5@m*5AP97`U%GAfZVv;wgahDByHuu=#hQRLsURNKIt znyWXBfMXOH_Iwh29nzl|V zh(qrp-Frys8Q+-7+7iR4Fhfj|T%c7!66SkSrWk@9_qu%+8LZ4xO`2x~No4+|>EK#8 zfpKf=Oj+Ny2rjWHmgM>tTj|Z2W5XBsV)!VFOEGONDbhHVY{0XsJfQZ<_cgGd@x+;R z7#cZ$g1nS2ns?&PNq7&(OhLI4*tKw_JzqTm4q$aq+?4m===uzve+A&xN3X$mp8g{I z=_B8QcfI{0{P>SN2p@RgTj1VHON`eOuLHQVm3sn2VF2Nsony0xi9j$UP-ent4+f~* z9Eh^k8CPs$T)+v0uI_%|5KROUz|& zQ`E8Bvh04f%8LL*irI?aaU#*SN$e0SrBxUWL)Lgx)Rd$_DhN zK!8-GDhn)LGTXe8q2lIF0h=+K7|Utl{$BmSj~$H#v{vNZ;e7$@xg$O=J&TUZmSS7V z4FdH^vuG@rMO?35wET>AhccbXG)?>}j+ekN4m?|SYaNvS^qg%5M%}9VEg$>PZ7arVK z9HMnCPQj5Q+Q!>Dv!MOW2(&~2r$ep;oepZfb3%udnKmaN+6`OU3SJ@b`WHsV;;lM) zE0Th!*>dTLFuj>Qz#hQ3-LO?Vesxp^%$jF|z7^b= zkOz5GY~?L(b`06BdqN$uJkFhuO^+^e)n{frJ^nf1R%Y2T*cjx%BxCVIq2Dok0R}~_!9C0&Qzm_fSTVsp zalNMdn6rI2Ja<2wyKpa@9K8lly>JDdeEJ!9BjD#uNaz=|JvS#w_GL!F{q-cb8%Vy2B4&DJ+>_Ll_h#4C2KatIm?r)JqK&H(5{WJIE78p_dI|^=HlQ=dEJZOOUl9 zYhlO#};y(4Riy2R+!340xY+qVb8x@1bddhqHW!HvjRmdi%k zU^Fot zU8tOE5EGbafj3ODXeHwqY=lwk`4Ab^&XTm2({``z!riI%bn++ZczExktD54YF+}Zf z04w_0)5~g|t>wj71iVb@-CEP}nlyjyJVK=Q5oO-Mtdf0b5Lt3J#9I>e6UQ_U;KIlx zWK6RNiL6A-te^(xk6F^ftXy3OLp~Wc;{1SBwb#eg`cuYz+WI}qqqmlAyAh{tKjpuy ztFm-1Wp4TTEFU+%Q*W7F;A_X!R<-jm*KERGQd&l0gtTK3CiD0ON{hV!@kzv zno^kCRTPlGAqc8&|IqvD#Kh#AjdG5Z6Qy8Jr{vsa=gINcMvc(|oQBG62JJ$2{%=>w zcr#^d0v~6-;c>M*4!1|L9^E#ycv$I$W?ZVN#OpPKV)UactMAEb(q{bzYu6Sa@72XK4H$|(ew zB^?k}V9RcMmsbIS8u@kAV4&r=j<5C`R1tFjl(hLQ_|(HlmSz@jES-5Lwa=80W5AJA+JS!M*e^v%KESmT=2b!|&taynW~0$R<#>DJ$jlk?8o zyXl(uoz{gKaf~+s&Fw*>)Dg`%Aym3`k?&33(K6V8Sfmz?ht~?3=K(3O`8H>^EVAM` z`$|TEm=MEwMsRp0Sf=n)n#PpnfI3ej;EHjOT@b^Wv9QO~oo0q5?nt>KT&)YU-E#bo02RXBi+IjUG&k3Q*TUGPSo7 zAl^sIT@(KyQ+9Du6X92)XO5=Da7sLm?O+tqPMJ@8P_9K0&!X9Yh=-}I>L5yF^Fr5- zj@Gc5E#Um6i*VQ7=iqP&usPX6$!HeHN3&i!&%W|ymvbE9$o1^`9CGRJDHvYw;v+=$ z3vMSB2_wDx{o{*a~M1OXk-_$XzpDFT2YZK-DAR1%8Y)R(g-#icA zA(b{S+Dtc2?5zBVp1?R4+@F3PT$3MR5Wo=RuR$o5skYC?aIvZAj&1n10*4U=31o7R zB_I{L#n=h*SXppqU~*3^97L_5*93*pW?Hxj^Sm9jHAmzGtf+I) zSzw{2xhoqOR{EpHaAgHd&}KOTZu)e{Cz;t8Q!<5Edx&UHsSw{(Z#OZnJyVR_VrtuU zOnB$L)%2wbY;$J{nSQ-L%LHB#kexuTIo!33F;&=yXM}of^q5tF)7bDB*R*`L;sS$@ zoTk(^V>GtnuGR=&8C=uJX`4K_AXLS9+P{Z{!nUh%3m6L9yREZclgNXvvEt89SsC=G zbel2{*FReVY|a^T28Ez&=Wfoi%{m52^XKyea$D8nKo%d_Bi8@Tv>%y;-uzG|SFaF0 zubF3uV|v5>w~8ueI&^x$D~7kIcyQ%Hk+lFs*ty?^oNNX>GGZHg{=870TH^?*`}lZWl~RO5ylImaN7ZOG(L*KTVE)_Exv}+&_^PQl zp$-k-75!!s1D=*5?3QLu)>U+c#d2OVU>w5?KL3rI@Uc&Q9{%jJ&%mRPzXs30vVhgW zov?p+8Md&3^}3pl@zf5IFyn6sfP;{mWYHd6Lrl`DP( z2WNXP26E-psw}LDkVAYo-}h#XM0B!D_84A2OkkM7wb?JND?HPeu2NRcN??s=1AE#j zJ2~5d25z*$Ya+{4n_+!PSI?Pu?T z6$p^ia(4Dm?7EAw+a`+ROE*yJ#3?ja4^1G)DP`gjn8@^!cHY&wH3nY={v5BRW56%t z#`kME8;P(f&M1oL)3mgtB~RgEV+^=df`ltJMfqtw1=tHMSVp>5D$|jT;o!uV&WFTy z7@3*qATdx`A*Za&AU?5VXUPj&e0ea%x$M#z@e>a`mJy-dN zufwx1T!+=+U2x&f`(OiyuwKvV|M)Vt3y(pEC<=G&biG(Fyne%1Rv$6@bpj8?-?q;N zD-0dUz>D={pq4Ur#>2uty`Cp>1u9YF{cIJet3n~hBDeJh_m-diY=ExVal1r%BQaJ) zur@LeuA?^q@&qfdS_4JsJUxGGU=;hZGG~88LxT+uIA#_H5_BUqy>c}pU{fg>_afJd zPr^tjkF1?p4{e}=s(62x#@asvFU8&*S%jv}IplLjW2*`P);!<`cmQ}K%Gf0xgU-Ub zoSSat0Ekk-O~$%jnuEcb738c9aaN0S{Y38g;``Q0W;dF_FcXW_oYl{GED{`qVUla) zmAxVd5sN$<1Fik#t}w^@j4!=H3a-hmN8f4T2#* zd@id*Z&tz5(bKAD+DHB^`CfyNp;7q*8A-f5qI+|-81wv%ds#O2(m%SVQ4`hM)FU@h zCWYvz^?RzMsMP->$V1MWx-H9DbLZE?yhn^P#$UDXv6*&1XO`-r{``z-AGvfH`4|Nb zgdo+6Leq>jVz9ZB=5Unbk#x=4@4aV@Iw!{7Oe}?D8rDO>eUlW6OM0$s;foM0GWMQ- z&qA?2@}qC9Acm+gpJ`JxQMWe0qF8wae%5_&D2I0!I^NrZt$N}$Q~JcSAUWnmz}NBn z=+SCgEA3!J>OLca4{hcaLj!qlS|-XVL`cbCaS`Jk{)+Igb1Q6OLgdhKW0tHi!NQNe zfDZrItO4P4(^~5~7bUn??o2O39tybwPT(oTMUq{NeO={ST8oXWzF}oV=oeaw*2|O4 z3G6NAaOuK1*xxgmg{JTi6xF(&i;m?qrDtW%%9w}16wCLmmL4wb72XQbipi~w3EBfK zo4=HQ(lgR8Lzc>^CGs}*?^Z!z*UgJ0elECURheuprbg{IFis4B302W`Z3FP~wVUwt z^GEQ==U;_C{F6uF3txExUb_yke|RTcy!*|tneW5#dI2W|Z4~LG?sIIPgNU;H;DMUq z36(8u1XwwfCfkwazqF#sj$~+yz}R?E2{rOQ(~Q~U&XX|&keyC^(=(-nc?Fr|B6-~g>}34m~`5`>y3e) zXXdfRNcecQ0i{p55)ooM@EAD?er>5<_na1=D)Xpt>&r3kwze@#_Z1EvChX~<162^~ zxt8-FihoT>XxGdu*FEelFXHAV@%r!_Myc20&Yl9vK3sAx=IGuuq*ZAdk+^Yq;fc9$ z1fTne0CqiiR|uPfUh-u6JNu_0Xw4=u&xOIIv}!}&TPQFym(?9p3P-}zW%$fN$PR@K ze9UyBZoZ9A5yb~f-FWmPB~&KRP+%~6<8!1<0@y4 zaLl>%F{a7av_8H5_!N4iZJEV-e|CqQuL2WFE5|}(WHi{aIdx8PUD`9{*K3U7%-XhX z2ri)g*t^q;XG)p4P7Sa8lGr4}W6CYcLo1qf-%FV@zJKgkhPxPnH4PZgOcsrK%6N9a zznrz{arcllANwr7OMubA`6V#mGvE}cl(``?bgD2#->Es>D;(>Sao%>oA}xwT#!u$G z1ZJHNxeThpsfQDNpM99blHt|(Zs-{+b2u;bRNOJvk9{XhQ>V^0c%XS0**f{R9HT(* zmn$Bw*92e-%f$k2oSeXXZv&Suo`=;E6D0M{^y?)+Pc2i|)7BrWbGyqFIQ0bOUE0XL zxgC7r?J7g(tUu?rofZ?BlwsVCO@-(98$3b9<-go5F0THc``XL!JHPh@_|#_~ho`=O z3`d)D0Q37`|J)f^&-dZvxY!3vdcSh#+iJ@TPmI!U^+F_E@9#t><9G2=GT0d5$0XFz z`Q*5XmD*Da(;exb-R?Uyru=Q=aip|wgeR^;Pct(mXTZe&(fw~k?K+l3K@nh+weRZG z|FWXov?u$|3ibM37MmnJ#|AfZ>=o7EwCPn_ddDdu`?#Io#WBVCOI8J2W)$c-PSDX> z-FH@ov$B!<&U~WtiESpbV^y;I>v5UJ4?WY!r8H zL0cDBXLQ0|Oex1H zU99*JV<$*ACa}toP}B%XW^baPpxR+nY8ZrOBbcK(PMG21E5BO~TN!=?-?ATSTA_yqDF>^Bt91{&3;fC<5;W(|*ul}LeCfvRr#Ca`rbo7if zHNcb8t)*K(VS?x*+zWOPOjRA}bWOx{85bmd762uD+4z#tn?0tX25gjF+dqxX#BH$= zp%HbV7mmfhLNmlm$IQ=onrR>>9eTy36tGFHL}<}Q+S9qWO*E?h!wS;?S4}!$al0;b zPnqe*$bGboi&Jj!J2@97pcOM6A^_Ot_3R+L484};K1+hceBnT)CTz8}f=KF7_7)+= z$bjDtnf}H#sI%*wr@UC$aO-+5_?h%?n8O-eOJW~j>>HsYbiUT>qZ$Vt|4#P7-nt}rkTRaDsN`%b>PoR5L`YtCX-Gh7wXx>_2TDqpXq|* zOb9E+`;+!O&o&S|@g(HH*wQVIw#ab!xyqncHjwpG?Tu-_xb0)c1%wd>`L`QsSuw7r z5_br)X!JG?*aSE}j)w8G?%}+U5bw{AQ+PQzT}7JXdjsSDIu$RLv{uUYHV6-o58FWF zywfA$;CnJW#ad4T4b>>*GCKF6{99WV>$nyEx$AfrN7JD28lqMgH$FZpM>#~V4YG+M z1Uk?`JJ&0!h`0rzvK|!kZb$8~jDyGT-vrlL1{vR{&4g=p@zwE}vDK^qWnJxBc;c-> z5nkl-2OkBT+^NxOEc^3q1;+mQi*VAh8UbNU8xGm^McYmY6YjTlcMdghPLrL%>D7Y! zv2p40+y%WiaC3~1Dj4h+d}eMH9a)VnD|y6tAhK1EoE(F&V^B6(M++NN#x{LrMHf+t z;avB9?6)d4S}hLg4Gd1-_Hk@>`#T#}oHARhW)#uCw?z$Ut3NoZu_WG&6$Edvf-Y-t z1pgUDP8nl*!(Et5eZx7j3x1yiMwO1|9vJ`|bco2#f|Lx*A=9~w`(Bk}VH(nYVKRJ* zSl*KH6aKJ{IizRGN{nG5k+v;WPU4*4e!~BF2Hs@5VHyn^I9VUVa#ex=o`=09W=P(p zL{wo*b{?k+nVGWS2PM$|Ac|EWCCJR)cIOZ1!72EJoJbESNAr4IdiCS}?6rl05Q|47 z^!4s)2b!o4tpZpLZKa^ni!AoAf-gOJ75?LIJqjQC-7mrSo{IY|U zz3yc98CNp03_mgW0P&&?7L4CU5k%n4F_$|0Prg?+7-y+|U(%D3!i0AO^C+fMdqr>v z7YIzu6y?u=l%)&aV|>JDy~H3%1`P}y$=?KbON$5{!BAyipL!Qy(3KY2V?z6LLgH{g z8)s`!N;8aVq@z0Md4Pg3M!g!dndie-9eA0my>ILmK`qDHqxoA;hwM1D9?}Fv z<0g2f6)ZzhZOk|mIJKl&{q$M(@er;jq%p#53f!XrK%GXo4c#$Toq}=yAa_)E*GKMC z8uCLfk+R>Ii<0z!dZ=YgPH^yu`84Y@MSvWvbIY4T#SJ|$WxhenPPM84E{t-ESm|?D zIC88gYAd3nb~9IBAv5Z7EGL%76ReFXr#=+|6RNY|m=XF$h)veYYHsBlnXjFDd;+OBTy+foEiwsa6b{F=-I|t0-ILQ1W;v$qrgQMLbD-Ukz?%P#DR3D6y|orTTc(?5 z01)^D^dFh(h|BC8V~|LXN0N9GHZ7yGcv&KtU2h6xI}--{q|HEE7%4tX-gT@N-QpBs ztWfH7Y}Vc47-l$Zqg9zese9A$V`m1QMiC)#c<9%lV562RGjVV6GLLzWOtp5m@XK+6 z>%`(26Td^W)?rB4xBDR%Acuv1`#a*$Uio2G z9Ef2fHJAj(Rvx$XBw7TqZ4aj*2sD<&q>r@C2Clv5ZGSA(`nHliF+kvCoaWqC&qdnv zH?}i)^cy$eSAYF;@SzWX0$}w3+i)$3ew77`jVRomZ?QRdS z;2pm==Ov@__6%6-zxGXQ>8`Gk2L>;x8;2~U_GQK*e+%6(^_l(}d1R0dT2GDook{QN z6kWc=bC%M4I~NglVf4(~CM+$(>+?3okcl0o1kOT(C*mysu@gHJudLQMI9w0+V-3(j z@|iVItH**)$x0}{oW?3x%i8n7%fxs6NoWV-J!7A0PMzW)V70yiA(oo1ZixBzfUp2(hE%Ik`WRD(9j|dv>`tol&JHC09q!M#oXKX!6lBo5 zrZD2gqpEkNJtN4%XpKBy^Oc{}y7T4Iq@pPKkI^GQ)`~T0)n$hfklwMcSHW28gupe2 zzFoI5K|UgbDH_v^z_)$bJu%F5J7$8FjOCu(EUq)wK`kAfh1$)W?)fS+CwrPx;kxv3 z+ z=ve_|EUDJjy7NY+$e*uzpS!wa`Ah@NzOoF9AyPKNy1UXsC`)5tcqXg5=Fz<^O9XJN zyE5FCS=D$Dp5e;cVI1q9;dt9KVpH6Cr2ykXiwBK@LH0KH83F+r0bl>7AdQ4iWIvnz zCe{`Tz=yHeu#SZ*yZG04v|iRZK?$LH?$q>uj>n^Sb8peXbC{%V;&i9#H%=A<3ZHAW z@U)2pzMZ?Cl_mwjMBrHC+i1`z%WyinVDWA3ldk=6PHBqiBYJgqt#-;n+}~9(K(QBi z-{3bU2$#>QreiRRAZN~pH&7canaiP6!S7sl?;ELC?>{YbBVjWM=trHbc9=hQE;?TiNYa81_V54t!E zpD03XQ3aBvSMrvwmiCECxgU#FbZy+83~^=zUp30}&Ri0ub~Xo9Xy}+c-U#Q$9DMxC z9r{+dwO6S4IO3%mL|HR{;|;)KzJ;5!8GP|;TliQ1=Hu|OPkt4a=iUr3zYI4|_N$U$ zQ@xu=@F&kw!;v7|$Rb-@;tPH|p@7o5W_BO@bI5S7_$Khd{?4;}PD#cb_Z9G^g^xhO zz{CePWm==kVt-Z1uWiMqn48|nD9Qt9+yi-L_JPJJ3ww+B>LLy?%_$yR$Zw%bd5wir zpJVv=*+OGGNz{F(SZ=**t6_;!NjrMU^qd*ZLJN5vVCN>Nu;An+%p%$qWsNpvi%ui#|$!Fv1!_OmLL{-jKOtG*^?!ZgVUdTif!g+MF37$rci)M&@V&lTq5 zeGAMCUWxDZJMYyYW1KV1FnEK6UArE_F}QKG`$S;Q3IIEP_CgTW(dT;S?<8oPb@MdB ze#5+4nq%`AJ2)8az1fb9B~o?$Il(qCt>fOHqFwKMw)n3n+%c?Vm!d}AucN)9C+9*L zVgAnf-;ng{aRIHViR}}|=EgYzS5GAo4K8zSuyT^_`lfdyllDXxxIuwxy@A8MC0x3A z4wj@K(MZ*dw^=jhV;@YRKk+*QFEPZd*XhO+qg;dGxpY@dIdi&$WxhN73Kk?42j|7oQJEtvl8L`zdKr}&q7)A>igT=I#8)!M+PL+zAZ|!es_?S7 z(#C5FFh|_%@kH}|fWsIrwz5quDA#Jn8I^N!7?{etJ`oj^^}**uKJ>vnx)^q@cQuCD$Q1zVY7i{(K?kBA02esXz1;Mwv3ldh&O^;c*8)5 zwPi{fCLY27W}ljiWBpCx+wX0#C@L#5v+eZ1_x)uhGJM&g&j@|Ezbnn~PQp#d8`la3 zGQ?^+^^VXUDt!3$sT=}9=84;01lsFZ^7Wmz$(jQi0#gn3*;KR#)_8AN1T63Qn;5X& zE`mYoDvkKjdl8i7oPh~MIoNg??#hZ3?yma8GlS2jDqx~GH>sLbXU#x{1VdYbiTQ`Y z6@8}_dNvtB>7DRlsP{f@ZcRBq?&YuB+m*>UY)i`GK z%~0$S*ZY5y1vc~q@~H(mZBkfaxAy)nWy)OgQjdAbb_!<<(6gtfuN4ZX3($7FUYR(= zBlL^x#cI{ZI2-$`C7e6EfJIGGPuIT86<0k64Khy07sr$d>bF|{q6PhaQGTPh679H0 z<}rFihWl}X0@M53z^Ft8f-mDt-&&4ar8bOj>T`j?LRz{fE8AFU-snbM^SBTMU zDfT%XC)bj}lc=cYz+OH7gJ;kpS(-2X60j=`*WQfv(h6HHZUcQ~_a|#KWzJ2@ z{+Ux8)Nj~#IGm5^$|nr4lh)VrqU6^Q*QDT1`3nnO?R}V|35q`YJA)N_il`EV8FBKSNZ}Om zt=k;#?xtpNYH_U6dK=X^&@PF_-ZEyMp&SW%>Cu9WJA!0fdG2bP#?5sO)0SEnRrzG` zG4_T0OMSIn!*Vf$!-EAJ9soM#TAobyzHyt4qZ+XcTbeXv;qO`XQ%H>Bn7_Efg3i#H z$!S7fUpy}KfbFb6Y4`y;15psz-Qq6|CJKelH}UG29ACwM+P|Nt+zqGO0EOi)_;9|M zL5X+%otJLFfBnce;Me}s=inRPehJQ8dUK8Pf8)6D66L=Cf-Hx~xbPJK;`+r)i19*I zdmJ_!Y_wKxDk3jK=WoIznDUBdJ;(jRc(bxxETyBi1wTsscYZ zV|jYZ>ji%?r%SoD7nDnxH{qtn=Le868%+4xcPRs$1kdUf8wjk8XquO{&rAsz zBdrETq?#VAGHTo0k#^(koQs~~P4P`TCf{b81}i&ub9nR`>#=KASwx+8TX}!hdx&-Ok|T;P+8wEXOJa~iZ*y%rJ$l0NkaWtk|a*T2Y#jxaLnRD7e z8_>$!59PUX3pj4JLK))Y2IU&1JF*H>&8co|;UN#~m@9QdJO>zG`>xR>CiS>vgd)FF zV^YRYAUGQ sFIaW3$03|i)u3T{lK*{%D9tbA3kEqWNwz#1r-|F-ZGA+jD*b_XB6 zFBM^=b)(kR%vg9PJ8zwxJyCMkvy{yG1~NiOYlodk7&-F6V`bSUgqN2 z$=c{eKHAxmj*SvxTBgY9cJ+i>f^X;E!nR!l!6o#u4IYMdM53Yua1=p*fZ3Hi%`{IT za$G9oQF~K}*mkO$Xk5p3>;h>@<6}B---~650WGOCd0ew5`BzInjFP8;t>61wV*F~9 z-eUPjX&D7oMxmcAUiI&)aWhA{smuI@#rYZx%msSm zy7Hyc6CWTo@@bYAjO~Q6WIW->8u<57NxJ*`WvN%~erD+6b%2t#58!ycfyD}7v0A{N zef|dgn}7ci_|#{<3$I*1fYq71U^_pA?F`deianAQo#fGiaQA%juGXlW@xFqCnaGBK?Q`nVdbcAD zrqRG)v|E-%O2;bF{%%IgxKgoDXGUQ|gtO8` zg`LtD*u3zObuivdhv70wT`Uo@V?s-eDlM|TN41B#qPcYTGh06*!I1_tC5mOfa*sF` zzIjg+_ryXd17Ni@V6$7Vfv1X8wznbc z|9|_%5yas*O$kVIFvUff!uU-bDO=5M+xlcmvT2344GUO2JeG&}aS@)2cgoSp23GrX zIJ=s|lP|2{Pd@cH{KjuT2A}xMw_rOz4`(hs0NcfxsvtlgXN+FYC|*Wb|1LZmk3SiE z=W$r>@PnzR;+1Lzr6~GYaV&6D38XzxfH6ubNN2d34;nfUXM!*LW7y>d9jdKWiLopoB1}{jg-6 z51Tf4y!OfC?F=)vHAPNva~_xDwmt7mM{6|_lN_j7hfa`eka3dCqx9w>`VjhIv+LA< z!)JxRsb_>o=fixdB+Fa1%w(FGQHI; z0;h+W#!I77YR-?p>7813?V++!R0BimET5KH?B*|xjMIcUHUfu_E33^V!efU~Y*1p@ zC+f-LYtJTl0k{JfTxf2kL<`bb-!xPWxKXv2wIu_2)d)92q;1bw4IB7{Zw>0m$38`@ zlm7klF*x@2a(vhKOvu}?%*#OUuFVz-emwG8B&SfvoS}#hTuQc~J5wDdFj~uR7qN+b zM9XOOFtG|i+is6=#I<4JJsB-3rNli#`}ZCcQ|7{_zBf;N+t&}5vE)|w)}y2^1~mK9 zx+@m#I}#r07c*a)eKVrDL3-K34CmOLeFB)-z__;)yr?n^tvJ3P;A}*x8$4ll(XuxC z&W>rq`RQ4CcEM+82 z_agkO^2n3~?+EMy&w!6C-xJyp3Fs6{qf(@*EeuCq zbaQt;3dJf1Hd4k8#*u_)J*854Q@ty*fLA13sxdcxE+e5c1LV|ycmAnR7_ zS5eWm^g^c1IZ1;Tpjh{7zUztyVk_=)#nnU=2BHD<(x(hWdm5N{v+%}Mml0LSOc3wE zWCFZJ^tP&MQ+%o;-BkQk1LKMNH{Y*lWR3QF&Qpmg+ZLloM@G0LtaPN5pE7W}`S4QaEnft74qBP z_vC`j);gk_WeSD-oYedNxaU6q=vDaF|MnB`$DjNv+&JEci}$<>*02wo^$NDz1zOt+ zzqjD)yKH?gxWvLwJ#j5rL~f3aTb4hix8hCJ3cyYts!{wIZ(1dThX7ljqtIXL7HfJv zfQHYI?>hTh?l_e>`hc{$SG-bM|F&ys190md@$H=WciQW`2iZ-0O;=iEjB)wvbyFJO zz}Bd)_-3zL`6q{C7K?;wyE${@Iw!K22^7c>sB^Nyd<~To=%er4k2MI>^<>bq-00HI zpW`ne50=yBp2DbCW_DfpU&aHhECchbdUN1HE6%|-%2^cqzMZSIO&KUGKgzs80WMvG z@WWOK**VU}bJ5l37u?2i8x$W2d`b{NeAsG+SYWI{ItW?wGZttgW6IXJSn7f`Ohl-| zOlZdn#|t69lMT=Bb|s9e@oE`JGrNX~=6P{`kD*N`<6{2H099RJJGT2TNQSlAQwC{rtGi6tXD!^ z0*q6n+JfnZT=In>u0P~IJI$+Aoa_!0CKgq0XTe=uvvz5Z&&D);b2|=fd$==^fVa!$_{Q~^P z@BBGD_MIcRadHv%5AT4@>}-wlzulBb{~YwrA~7`XjKRr0bAl#cK~m+7;NP)5OgJ_w z0WD65{Ge6J@R7^o{N#$ZRw;cN-e_j{JJ0J)<+*qs7(kHeW4XJ&ptPyjM(_OaIXb-%5EZeW`34RfCyh2i$><9R|J9StmT4w^lVY1CMdKdac=4)8FRChWAo zf%spE=~n*6xCwS$#ktoy$nm(!9BPnCKepBw9mc@&+77rgpBF2r$}^1(z!0)m|7+YR zihZ;6&IQD_CJg12HCS#qV@V%*dH^AG(!&75R@ZqDU%j)I6hpUt77u zO)=l#gJakJ!n^R-SP;gx-Tpol;e~Jl-w?J+stEtgW5g4x*oU>w@i=za50NpjR^fq` z8f74zskDbAg%Hm}6#!HAAbv9>5DhC7d7iLCQ7eYme%p1A5)Y1Zs3Uvs@i)fQXa{XT zn+b}nbRi{7R#GY+ioY&EFKvk5%^tq)4rz}%w-49ARcsonyXrHnrHA=+i{I0iW;*%Z( zHLk|AvKx<*@to-(npb#UXRzLEF-Z3U;M~~-ynF)iu}?h>zyGmsz(+s+HTd@TUWUE1 z_rdwg_XEuK;pq4TwpB4oL5wAMGfOPi?~cVzf7O-wefcXOE{k?7Mv0JT1uBE9T1lgz z=0DKqjxJHz5T_l4%3-0|&ebZLa=^#7EN{u}@SLoY6@^p13hdi6-pZns<_r{(Yh#iY z4GFG>Yd@E5d{zvvAVu8Q#9=T&tRwt=%5bb_m2NUOw|D&AslFh-gAtJXvcsNu9%aqR zWWF`BlMn(ne$|^Io)@jx;jQbGmx?1& zSe#w@Z}{#8SEHu@*`uY@$B9Mvskxyxf+Wyajp+ryDEwQbQ2 zV-BBijkFLPan)3n-l(dyqr81<(J1dKT`x~g*#oIIyo;MebWnZ!^xhd3}1y7*JbkEToGX>k0Vg7g=?9C91+xFCb#KVr^ zB88Jx#Bv>+Q&GZdzo-}+zT@m8$FS)@ncyxqGk6E@`EpL|mIKMW0t|~CAmXinu2;){ z$aihJFLdd&{TB=A1_LD(m#xh)TsVISmoFSr3j^G{E?*bwog~uMCg$l#6a&y%;o|(%Ol1zjc*Q6~!W+Wz=BBM7-9e z3xqfs0WC&F0v!vHDjW3ihxz5k$0FnE7b0CmJgI6_1YBq}2+Hf6H{^=nG1U|W;laLh&BpwldhZdy>NZEiY z!KJ-U(X^u*iUFhxR+um^i6A<7Pr2W_z}ly>(6Mo!x!{4!DsN!SQHghuoMF4efW$Oo zQ(UUDLmKNwP48IA>csYDAvG7b&n{KIe*N!&*3tK4VUUic(}wkY@NH6xKfdE-8AjPp z{TK{A*i8}eJgW9EoZeQxPu#c2aWv~>$I`TV3)ZY`-R$%3I3!gd7EFob&zo~9tbOzZ9qr9 zZiQA2uc*+}M6on`;#4#(Ytu6(BDiO+z*L9FKcqO$N^rG=!v8j4{b6*wlmnVU;Cwv2}M>HA-v!h6>Tf*UW9W(@H>ecH?Pds<(uLZIoz z@v_!^{k9iNsz?-C&j5}oGvDSRM~sw@k^di@jegW_gvgs)pNUgork zN(ZcAsh!u<{pj&68*8lZ2gU|7+Vv)_Ks{a>Y2-H8Tb|wf_bO=eS*BarcpFXjv(weW2UQS*uP0XZg88f?e4U;uVgifE;{y= z77Aa1@L%%eO64-S$|SNzfHxxDGpu{00HF%zoqOpfigOPsxP=afzowIuNlDg5)$sC` zGQqe+GebmKH^w07^v}95{(#}1cnB?-=dx(>b8`(Em+LzVBG?M|F|bDbTk9iZgb39j z5Y8`2Y55G)yHMZ&hLv&Lc*al_3}z-#2<*JGV{e%4$nbT9tf@?&!pMH>fA@;w_nZ~r zb>yWJrauup*$buyfZ=^CfCS9qLL?pS9+eifz&=JQ1fUTSf4+lS!t zK=5M>7{Te0@rr4cOds}Rw~x!1$geHJm&YJ*Lg}4b<;IEWBGyQ9^_um!pI|<#rpTCt zM=sVB4(6r%HJ;g0*xF-X${mDL+4s!kCqqtXxxeo8ItZ3oq{)$D$>x}BL0Hc14vZhE zlC!LPoip-|!==y{zu$)XmOUdpR9VmZL~*hKvs2nIEv4Vli&OBD!3*41w@h9}#P8T1 zT7yqE<$s%!n+x_}0XOC|c;pLf_^prpF?`~YZ^8GTy$MH~dti0u0xb3}!fbwk`?~VU zY*8*AyZF1{u$tnSa;?kaZs+xuVhK=J`1mSx#;a1rh{Sk>g>_EVYIuE&hHv(@oO@53 z>pIX~tGZ5nO@Y00>iI;Chs7BzDAzN^0n-eBvWsF+zq8*OMFJ`Qkhh^L6lFaEFX?c$ zrK!a#E_dGveuBGfZ6-AxJYFYFu8b(x=J%UkS7ikk z$6Ui&)~k`@r-_jpCn%nE^(IXPh{{zwj%Hr;TxA)&3S9%_uh*5F+Ox=ffLj~#n=7YS z_=JQG#;s9)7o$0Xl=rO)FUr3%L8~zUrV}1nWR>JZ60p3H0D0_i8YzJnoxhh&!1rMS zcca#kRv?o)14x43Rcl}(u&7$fBXuhTcwxY|ONv)_FyrJs1F&l`LP|o!w9fGQ;L*$~VJOFPOK2!td^5@+bZJ>?;2X1a2GJF5NoRlAq#fMh|<88+{JD75(`%r+N|Be-jA1aR0HpsEMSZU zb_({JNU34GJP2lc`7XOP{$zzkO;&chvC9;hXHo?d3%+p-z4IYPzOgwbBb2{*DgiG6@;1YyLWMH15Jqlo%G@8vElt->t(gZC~N4j$f*P! z5>~AuJ}Sj6ZnP=XEuX`u3fFbpiM^525vw3TJZ@!Hj{0xw`g84L03;<^Q|uzhrY6Lx z$74k3>{vh9_0E1TISQgcAOcGs6v!U1QQ~U^Qqw#wgLx**&_+@_@d1!AHf^g|)WW3| z28V~}xk_g|X@pfzn0mz7ZfpcWOS-H=XIEiA6>w;9+tVr#b}6TpRD1)1L!#x!6ibW} z8>B}(9VFkbQ9JNS-)4wCIVbt>hJrHE9Y9fZ7$z`McY9YaTYy0MTY+%U6OWHp(Me~CJ9*FD0xf7 zJG~?Lc*=fMMZ`#md^@6@lvC}kMqXo4h=hGtYP*XMykWL$INV>rrE?27Lvd?4wU?`^ z9W{&A1k_6A7MV-_^7Shd@D$xOFXLG*5IQBzTqy-rF}#YJq}JP-tC`$JhwqbLHa5=K zcskW0J#uF(1OguH$m~Ze;KW>5cI>;4)^Xj{8ko6n~TBQSn%7zw_YJEOr5~6lRt+MjOF&!3HwZRX2XVsr)R+1?W zwc%#{xwpK?1e}_Yf_T@y%NthTXyw_&vx50s;~hbYqREBn5Ytza{+ailhmoN%y|ZZ) z0_decRYu0aFw(f{s?NZ@n)BDQFqUE%CY`7J#yWO$!ich6+h?VfWs$Yd_^skF7Vg`k zXOF96>~VWG3y!E-TM0dKFQ!I`QI5iGMr6pgYrMTJ0cevY!@;I3zzm; z=Dy1sTl!h=n@_`t9Dvcm!C2<3W!i7#0qeEgu`#1F!9p4ZLhrtP0tfdlvFLP5kabW~ zJsrF8y&)G#*EXMO{#3JQ%-qeH;qP%=K3^;KJ~+W1qwXvvgMkwnZ{xi+N7n~ZHcCHh z>Stm0YDk^O^Fd1{U$rr4uQsV}c4F}?ZP+_oY{|7mL>Qdn@PuxT)lHH1FW(asrZEbC zY!wQ`uvel*&%)WlT`ej29a>4aE{W47MKoXO!8YRaIIfW~CdYr4KQxFoFmJIJ6B7}q zI#B?m57aHx!pppy3O?nzG7y(42)^q zPu7aiQ@A#JEa0{V_Zf>)%487Q5Jq8=kfn#5QM+SU!+DALw|7pW@-5<_?s!Z+dxfNT zWu+e1;%aMogFw@9oBCV&_?%r{(Y?6fu+91eE}mJzg>x%dl^pA4Tr@M%H`=`w=3P>+ zNgplza^*&crkJ<4;?D0+bNf9%UBe7>%Wt=E{pJ>4c@5y`7~sqv!1?n4d#hRH&z9A# zS!GSkF|RlgUBr2U|k})MX_>yvw^3-5Ad;1J_En?dw&j(e*JrJ{df=d&O8j4 zE}n<=b{~#6b68jUx$;|p=%(OXnU|-Ne%+O~WmpO=G|Jg{2>i$Iq~(VsN^fzX-TE@fgcU#^h+UUQMhXBEnKe9Ku(qOq$HdcPI2q zcp=i>)Hxg1sRk!Aj6^|9*EX%f*wXY6`-}VI>j-|`>DqeetNy5;w|HSriZn-eNCvKs zIre(C&|~Veu&ta5USb-UYr1spfB-|)^s0w~$w+O@b($FCz#Fl2ukv%R#>D+;pU{yj zb1qo`_`v!*m22J;qwbf2UUPIC@28$kS_+3xPw~D05X!G!5Fqg4;IRVEA3-y`MI?N2<#_IVJ6W;(Cw|3kb znA6SIFxa@Kb-a!N83`iQgJTAVp>@yKLj0q^`wG1 zZV^TXUYSd1CFK3s17rK%u7efGo$@ZUsV>FCF4T_M#0QBIAW?#a@kM;%AY~a)J|iwj zs~7UZ9RhobWh%Ab8~AxGDmNH zBSx+Wz9+}9J-z{#?mPn*&L32ag+d_HcaC||_kNSTFd&#SgL#@YdOgaP?wrGX4JWXG zZ+s8nk3Rlc_{wA7gexyzg`=YrI9M&=zI!ggyWja%`0@9@9p3fkeJD8+ZqBx_KE^w< z1+U@%kk(@S8^UW9ZhTJ0L}M)CM$C!Qrr?=@-x3cB8`rUs$X0~_Coc(n262GVW9^bK>Vxnz zjk6#zcsD4*fmv-Tnu%FNpl zhaN&>R_V|e`qc_LjI4WSrZvI{$YOmz~CzX?L61cUKFXYmJMb~}o7R+sD$v>6Qv3-Bm&V}_z_vD;TV z1&ar%FNQ~qn$J{=j+9Qk-uW!WGZD`X z4!ra2m*L%SyC2^Dt~bJ)?psu4K=GD1KH0$h7+_OU*0C}GJ6Gt{tzE-f<>NPJhgU5g zFg}kvE4-{DU55mez>o?_Mh+Z|%Z!Kd_iPC0Wa8P7m3Fa()ocN)Y9s;p_7#9HeeHYj z<*z>lUwP~*Jo>e#;Cs)%3Y*zkI6QwR9PC|$?Q97rCjjd;3hUSv3h=V`i+S1bJ1!7f zgG>CREq}rS(yrW_NX^I?EAF+)xspb8-R!vx>lu{&ZroVeAaSLWR-ukUp%Z43IV60N z?JF6(^DAQE(kh2}+@e&dVbkm2HpOd_1TeviY~6NoXgD?ic_J8I%JOP#MQ(>`h+Uj+ zpjkQ=^-z{|l)5(NMgm6L1$!blYwz9hnGR>%?>1a@lXqV0Rm4;YzR&g_xzUiU5lDtDmRxTI%OAn~24y+H~yx+em;yeZ%{Nc{tBw*|J3Dq^fRp zv7N<78S7U1Q5SJxx)@LHEZ%twVQ2d$nl1axG8!Y0bk?FURTKY@>);`A4Io2iFTHn|?8RcATyd`_kQdgCIn0pq-fu&lL8sX9e_cM3R+#H&&de|gYpSIdkkMfseXbVpN#Mo|VOTuR1VIaNtgm#$J! zGiYz=YF*5AVN$d@?WCLS2aAzd|x5sVszpd2eD7_tWQz4 zH`U$t(-ei|kdnJsrziOL4F)+(4X+%<2ieCWNYDaYx^w}~pE;9$gGaSJAG?&(d=px@ zE#LD^uj2ms;!S{${K=E>tH1VV@VT#k7Z!(i!D5N{)#mz))(d`_7vTVAaI@U+e{~JdzxXnI z=b7v9nJ-?2KmGJK;n8n=2d>@#I6Qk7oV)Wum@g0Ecs+;Xb)khQkU6Cu(OY5rRE{!* zrEd-dxUFlAxPw1zdFHr3Q#xq8#ux^wr!jZ=X$+#UP21$keNPVoyZOQ?_aoM`_lLF9 z23KH~k5Z6#6d}o6O&QvCxC}+`Qa5x5Cl=Z{Gd=85;r$^T$=$?N*CS!3p*`6`SjUsx~ z1aTCV92OYXs8c)u>fHvl1lPu@T1hosnIzDT1pADb-UVexr3-g;7rEdTSFch4E$Yd*16)m|8EuMC+)x#!piW<@+U$ zqd5-)aL>*l3m$5kuRoNS)$en3C&~h*7Lu-omAL(&g(?G?JBWj#4+^flSNI&qwaIW( zHt!ys+&GEZvJ62bqc%W}n_o;@sz}?9abTK55TLba&~1tG&G~5w-xR!KtJwX7bM7fI z{hl5YNH;s+A0~wHn`U2{G0J-)r0TwpL2(?tOBfhYTy`V;j+f@l3gPuGu(m#1F?#*! zH?3$pYMKe-%8JDWQ*cdpt|R@m%HaH5?4lIN&yc-W%6On&-Xt2khWTaSu`KxPyk3Vt+{_U^-34H#s=ivNZ?}Y8*JZxYOZk~_< zr0jv^88~^@TSSJ z4Gno_dtc+uP`I}}t({}J!gd@QdlSKTc7w{)1BVy`Bji@uC! zO)li@-CW=C-V+OeDz&HJG39}Jw1SmdM%mpl6h^tx$qCNWj$j(b*`s%J6JtqNF7b*a z!A{oLwm*`|Y*(IvK63ErRFZfN$W!KgXnj*XQ4llLwddd$Te$)dJ}Mg*o2Cb4P2%9yq$Q_v{(BfjZEq~WEq@Py~2SoICTjl`YZ*A zbmdm|Pz^Q(%JIlfE zV?Bf;FGED$xiD|r=64ZBQ%lRdTOrpAx{Xkb4G2+UR@=0WPvk0vm3Y)kKytX3A1r`2 z7K4x)j#bDtpo+%0Xkoy23z;#{H$(f^-a)i=Gv!TFuO4qBcqI2M_4{E$<%QZI52ALg z_Pkie0+(YJ7+}J6LPcp`5$><rDRa4Hn9U%loHMz9ioZL&hH(1yoOd+g;SwftY6zLT)ub# z&YU@eQEV*D$R;~LA}wQPgLvxo4!%Re4a|0HzEcdvF)f&&c}2k5mI(iwnj`+H=T6{1 zeCSW%(Qmy92Nxa&SYCkjW*;NWSN=ug7S(+5+d0gZbC@42VLLwuFJ8Y6pZM&H@VPJl z3Ec6UD|pkxcfot#{bqRokG>t=`L+ezeE~;N?zz{@Aw}5Q%&PLCTt8P78LnE|zXCJU zRWcb|8w;M>0`tPb&y`Nt6GlQ6Nn{4~5xuB%pa_x_Yl>(?5u7%2faRjRT~ubed{#Uw zzW&V(eD2Fnz?U9<0>1w37vRbZH{kk>;vI1b;9wu-i?gs^?86rJ0HDB~ghck5tmmDK zP|P2T0LMXl>HfZphk{JLSZfXJ_&gw7u*GuCV{E4>oN#ZDG$7~73X{@TILDTswg1+6 zR|_=99NSbl6z{+4g%SvXaoBcVYBIix0Q6qA#m^G-TI4H={y=NZL4{?~tk@woyV3#P zgVkc*QSzBQ^xkNJe7}s5_!es31RSRsnivBSC)+@pB8&0&hDWfm%+Spn7vCB}yzF6w zeF-p6-YyL4F~r0H(&stfgM64O=%s(gj}-j5%19x|EAKPDBCW?>2gS3IJbz znT58u&dqPZu6-uZB0c=31wc;$Vc%2B0zcJ?kKI@DZTNodyiUh-^LXMW^@!fPT=(E< z$Dc9Y?OxYt+q@^@9`nf67YB==yxF}Zom62g6B=@8+f|4w!rJB`A$v$!W%pRzZ=?H9 z=3*Hha*1m!o}M`}Elf4+CcP)ZMWWzirp4cFK*hRT~G5q!&q(wMc&4;oXz3NwPSeXbKik4e)TE1vAF zZ+vJU-tzD{c+*4o!rLCcA0B@25boSFjCl=Xx5nUj<&HbiuNq9y#c0S&ggNgA6%GSE z5MHOK-6&8U;{kVs%DzC0F_Y#ZACz%2Gd-Ud4~ix1%@?p(Vami8j{&~>&Ipx!1wpP^>EHF9IRaD!i&#V%Mib>wi1rLNN<9&xYy@*wXff1v@nR6v?94Z3 z#*&pt@H1s670N!E?Q zOlHA-825Zp{5UypE4;xV%}Hg#oVOCCSObLsfC&|!aeP+OK(FZ#5jmD7rI{ep z@iE&-!0uH%Jb`cx6R`4@UHp|a+WCY*q&smp;lP9*x0`_#0J4`lBQNg4tTjy!!PLR< zIxE0h|B=M)CotLg96eNY4+WUG1C}GIVd15Hc1lBAQm|ho6fr1Zr_dy2{fzL?{UijE zv5jFf%q(dA{y1`YDnl_)=w29~#|Fn*$+MkBzgZ^4oyh9{fA;>Y%d#Xp55(*a?%^JD zMh=ygS(RCpRatX^mCzQ-r*RyuWsifVSxiQ&V@PBVLLDJD>UY%s9_+Cws@&pKr%UcVsaC|+!s z1!a(}o7DlVNm)BME;1&B%AyDY2Gknx%5c-w*FczjcEe^;L3jzun4op3K(zqAS)F6f z&2_&M@5EX%2lqRG8K0HErOk+$v{x z&dZ&9kIL$>D;Linm%sk;kIH}kvp*{T>i>OFUVU`CeCdmyE8lqUt@70`zgFJ)!tL_L zYv<*ad$-Gjd$-HIJKJ)5UCLtMFZw zlFSdaj1ZerPD)MjNC6K&x-8}AAJl&zmB$}FDL?u7^YUlkzbb$9y}vHs``(|I@Bh`0 z%8!2bv|R2_%jwypa(4Ii^60_+cD15j3)t=UE#)j`L~#Njd@Bbe8d#ED6$9Xj0-#eA2K+!)Tf1T=83VAY;sCf(;J30U zaAh;8c3As>u!YRKyv zX?GAYJNy~uc!Z&5h>zQL99`4#cntT$2(?A8XKSk8Kk``j`j9`3JPs;wASHB!#;W^e zr~tqn)eHK(>n5%Stx%p2npuIEB%iTca7-2nkjx*$l-IMOPT6+*Ov zxV0dd4&>6Lb^s(AV1WXC)o(OXtb)2znh3S1hehi;Wxt6bbBE4 z-ay18Zog(dsqT%P!owtPo zIr$eQMv>Ef!GV zsHZ!7VTE(l%~c6&k5APygM0tbN2{GmnU@jcY<(hJ-FXv!H4=N>?|z-SGYDhWeo%0y zB;&@s$$DzgG3awJ2LTg#y_x00xv~Q7q87&{@`i zW_{k?Eq5NAmAeljmE`2UvmYFA#le_p=u_8aA^UwX5A{VVU5 z_uhS2-hQK$H(pznv(r_xM4fEbWxM9If+B?Rl%jAqnzL~&_R4}_@zqNXq*ixby^=tT zcC{%IkJJ=H&GLUJ7yEs=+8@f(=lk-L4@&uqzdn>d{@&k|Km6nGm;d~q|Em1u-~7CM z@Zq!OJ#lh!R!(lcUT#0STejP?vR|E)-Cd8rJV`&Ov=@aAc^oqB=D1LrwmtF}Y#fULLz@yY z@MKY*4U|GZ*YxX&(g9_yHufM-IzD_duy;(E$b6s?wN|zblUFsTFfL8-BIKajLqEpA zsM^ShIOAXtF~R{dhaJRWfmqBs_C96DGMxM z2r)*2w0i-F+VYH$!C5BO-~a8}7%EFfF!0P{{MNTGciu&F>jM=s+3wa2=cBn|I{_6D zM227tp3W^O6XcjFkwcCOEFJ4?U_BJdq%UdHjp}HYtrL*Ke$ItN>IW4>_D+Jh$+~!f z&xmbtYv+|Tem}lyl}E$t4HBW;Sffxg6qHoB4Zjv zz>Gp8GL%s$#phTu9H4s-?yL%fCT$9Xr*vU7cYWwj3JR497j*&kUSTExVKi$?F{Kuz ziK8;wgSk@DTNOGSpD3nrpO5hB+&RhW<*=k!6jO9N(pJ|NKi_QErR<)UvcD>K?wpo; zch}{lT6sg4Q4wSeHm)bmcOjGW2^7JFPo7_t4}Sh(DTjMywceJiU5$}Z;mYH0S3=DX zUX<`;S?2rlEqc2JH(MPxWxuYe0P6QwrJUR?+x07DeRf$^`^)n9YFGZ_pFA&r{HOn^ z{Ez?hAC%j-cIDx{Qa<4bos@ye2cWL4J11P!48FLeFK{G`QFM^W@o5S^K(H?Fxs^m+sZm z(xT#7+GL#8Daj)r6s+z^AhHbq>bH!)G(H1WXe*|7ve#@Nl7$4As1T@eTcW_rmQFdO z$*~;q7kV`$SsTHNHSan%;%KXkkAfF+oSO=6iFcz49@?46_H{!9x*&lANxw{iOPBIU z0202#j|v38o>4Z*_!p#;u5TCJ6W>_?!&n@Tsqq>tZUEMkJ&ey9Bw>$w@cB4LB1h5n zCVIEuNeqN=-C5woibCgp>8=RE9uF*=#OvtFlxILxj?B>XY|g5WlJ_lB9r<=SIB~u0 zE+b|j*h)|svwT3FLuT9vh|HKlQt-e&^M9o^wv4oK!qcE_&}{@`vV$FTE_pnrMNEeZ z4!Qs_pc){`P;9Y{!N$mz?PzK6G23WfAoXx+u++Ogs|m}YjLqT?cqbho8~`M`;1qK|lf)pBZv7jVgB&>KX!a!ET~}<}3r^(#K1xPvQMQ(cut*->vZ8 z3q|=s%oxy~;l}=Pf5dj|8;Kt75w3lPW1D9#M1UZK;{%!G-(i0Ue>_C+Qv+r2Nd z*TlhzKr=7AEStNw*0f|E@gZ75GT}cTm8}&= z4>CBnAsM6o%1pD+U`MmYbL*#-D@iguhGRNPDHr;?)>%?I0b^tyLiVxjB{a;@ zPxF|nH5*I4zbxzZuH3tGR&Jk*+27XKlq>!kz%)ch`0I$dzQETx2X%Jzi3HX6UavT0S%)+(!AT$FOPE9LU)P@X-#EKi<2E6<)i zD^H$2D~~^VS{{G&tbF+RdHLY+MS1-As{H)%MfvFQ)AHeyC*|?uC*{MBo|Wg%ugb+` zP0_b4rCRz=?v&HhJ7s%vR#w|H4p>If4Jmm2x~yx2Kt)$9Y_nBQ?>V#ZOvVLFW9l)s zTuTtPm-ghoR6W*qy)Mt5epo(w{IeF+@Aloh<*>S4_WKH$D1@_s4?$izK)CWstD(}t z<8Av33{M(tka@?Zs98<5szoQk!K5Z{Kx?joarymGPb)0 zu6-JlrLT>&)Tht3v6v#eKe+NJyM`>@(ZpvX%&k8N^=LwGcPAY1mh3rp+1CKJI2b6p z4yu((<#jh#Rb+~i1beb8jO>%&a=e53~66cGV(lNRJP&_n^gj)milAurW}95bC* zfxHG@D~j9T+JLv%XTy@XA~qo9c7%`t)NWNW%M zW>~-prkn1%8sye^dWceEqXf) zYoaJp$c2#>Ej9|9KqwS}kLQH2iub7^97h6C)-KgA*D5rQ`db$9-!o-iLFwnJ_;$gV z<%_)L5fh1hp+ML%24i74}5`=;hs#H60Jm1?^xKxK8JPcKji0Hhk4z$KlqlGF=YokBh+cR+C49u z)xO-ndtPqc8eQjFz#o8D0QG-Ei;<4y1={8T-r8=P09^whR(JjNVP{!C)Z)d_|73?Y z*Jx>k8`5W_)UvfF{MEb)T9E0g1UN10Tc_pD?fblMs*n9uxw?E>o?JXDAN=HL`QBfD zRIaXm+ywcP?Y5lXs{d}4v$JhEJ>8Vs=V#^qeNq6NpPiIDXD8*>=}Fn1Y}-)UwNhp- zcjeGr_pdH5%jLzcTwGQGepjA7zba3jRN?<=dGhpmdHm#gdHm5udHUqCJiXYJtIK`4 z+U=V6*!tw8oSvSPTet3&lRLM{z0Fx!)yVzquHL-t>y?rn3-L8NLW>SxQ~7DKc@~g( z|EVx7a08+m=~#Ww-iwa-R>6O>E9=8$xp?+LdHm#Y*=$Ss_BUTI_ik^>pML*?^79X$ zH;<0$m4Mu#UA3a9?jkUWF;*2_j?YK_Af!H1!P)|o)^|;)g}K}HO%;dD8$d0lB8>Le zArb`Yj4Gy;nvT=5qzHRsSy^apsy=7>x|PH(13@}?1~(-zGF=lzS6mgmy!=x!MLA=lPm%saWM z&^dvP(o(tUn`VInkC1ltgWlKYp|lXi5Da}0YZ$bn$@TUl^N#M`~7u-VkL z+%rcM6pn!?skVl!lZ`%ZVzhXv^_Gb#-q99q%rOGI%nR$2CM)C&Mf^L^%uGGQJ2rD} z&h&SlHbpmN5+tLa@7&djhK}9c@5tWjL3I1T-nBJAZ54P+M2n^M*~2NfR*o%qG6M8~ z@b|EC*bKb{u2n2X!cxXAv*zQNJwt6{CmAVsQ}=W7-(tUYls<*zvb`(r%zh5ox6hU^ zwqVOIy)e4uto9a2R9M)iBx|Q|Euu~D1$LxdBRFJM%dE^a22cR+~0#U&GG>==&^{1#YrvoOe7 z#rA~(fuL5@l;KchQl^SrIg$eqFFA|5w1{l?;QpQR_UB(OfAD92QLgqM zmGfKo+FkduI&}ew^-Mt=mG*{dHZk2y85u}UfNXbnxqkEZUbP^2wEkO4Yq>co+w%wI zS4Bj1#;>s%niPLko?cv(4ut+yP~#wMPal@Mw@=G@wdE_ZJ^*$7{j#M-tgh)aLGv=< zz0(*-zUry;pRhu%K!EM_CJ)L{N!BofkrU-&m>slXIBjKABP92?w23$s+30eYm_x!h4G=#VhEoKa@2YNBOG3l0e zheZ`$7^qUl5IrFxkK6j!=J1-})Dk6p6nobYJ>=k^?H{f8Rs=UiGc0_IVIRi8>k|+o zr_GQP*dl!L?@B1-dO!n+4Wd1T`^2IjBtRSUwyu>=2IA0+{7r#v3u3pME6tfottlJwF~4 zc5J|QzbzM5MHZX2hB>bb>I0Pvn+*pYa${b=V2ja$nLA-b6c`Kk)u)Ero^{rCw-@jW< zHYCKMOagYCw3t0}iE4OBz*y`%_C;;1uK8^RW8J4UlKmTRJSxBZOJ6Vl!@v6Da(VGV zxwn12`o}kXO0;gBu2+i>Ro}JqXv$Y2FJ@e5WTVEB+EdCrx`$r{*ZM&fpeqkamdftR zShZSLfx0z%tCZ987K6XB>oxf8t_uIPMUG9d+BI*FW`0yNX%Ioa9?*J}K#lqzhBD7xWTDzt%cdhi20><5 zg%8>*7~#o%|K?HAu4(Kc-M35^@B%UF!MJLBkM?W~md0PmT6?IdAWLyHNTDRf)-S_6 zwkB>}ZD0ljdCn>6+kRws{k4Ou@pmQ=uiAAVTSw+c`0o~qVVzuWD;_p2(4dZ+gQ_dv zL7wf6H?DkJ-4j)r$@Nt!V@u%XJt;T3B5hVwDC-0sixB@o9b!8AN&{&1*y}|3A)%p7 zDSD`pLgay8K)H2-nl24`1ey{9dT0g!;Of~5IDNL_SGXVLCe`lj*|O4|A#)+(ioWwu zP{0y|E13);GGscZfXtW@Yd12}Ihi&lI(?ngoiBofWkS8uuovouVRW*T8x-D8G1p?$ zBzEhH(c`f*IBc=6oO!fZ30@eE5$toOb1B@WiV*v#pdKm-jwASb{2)8`ulQmuZ;Fm zCd_B`vN8E@FcyMbukvT3Z$ESWzkX36cR^6XQ85&k3x3#_`))$h?O>Gz$MM>8+rNgJ zaC~0zh+~_=7qJa(YsneKm=*!Y9apd~f$sv`5O8Z$md4`F#>D&V3{0H|^i-Qt>`2=q z_+tNF5i)o`zEMu8^bTrw~fH_eRat@U$k*v zBcmh|#eU_CIuyNI1d$ePUzMGk)?{O}<*YXgI17+<-L|HHU@AxgQv1Csd_Z}l`M-g+ zugtJ!IH7S?hQ7(K@{X0W)j^ir(Zvf!BHrtynVtfyb>G(iva(VwzQ&w4VHy+(V(f0> zZj;5D+N8x$sJf}``l>vA@{{t@pZ=iSIk_r-@0)Lz-~RPqF2DXupDW+`>gUUY^HR<$ z1P{;4`tXE283c|pzU&5`DyYW+rX$UY3VJ=0*jLzqRgm3Oua96rjBWH85TMscYao`@ zC=j+Nr_}h+6au1P_eIB`k=j{S5665?F&t$d+4*(N$F#`CYhsKyT#SnHPjVcS>JAsW zxLb5)oi;VldYl(+XI26Te|1F3l)^d>IS;U3<=jZHN90qz3}Y$z^bE=x0v}?1nPNjB zQTLn#>C{#wdjM>1kwdsc>~m_~!iR~G4JVFrvGDMtVCqhG2AS97TkBK2@=394L5HQo z?dZ(5QZX?I=9K1wv{6p`&>E(e)5_gfU6hzx7sm zk>G8L6JlXjCPWq`KUx{xSlFE^DvS>ghTb$8w{fHpE99-gQk08&z!A}y*51PrFIV+2 z#<9v9T@e>JE()JkbGgVd8bhdct^20eW7wj5{J0oXkoG{O__~7RY^dW*GBE_a0Xnv>T@8$%-n<&EY={aDeJhHq;rQA&@w7Q0` zRs7jb1@Pe7o$uR3P#<;K?eS@x&?yjtK)GaH`#R$@m}AK0C7(?uXiv9(bl=lxs;@o+ zw@fIX+q-j$wriJoosK#KD}!kM_hoP~Lg# zcKJX5AAYR~p8v0Z`)B2YA3ZI%?z~=3Zaru=sNL>L-QAn0&6Y|M{n@HXnpc)@Ei_jv z9OR7xm~jd=6^=b$MFt)jAZHn%8fv{F{*fvvPGv#Qp4WdN5T;mqWTmR9Q1iRjBMJkbk!Qam&dP{#d1%OzMDVAWVP5}Ge<0kl*%MZ%k zTZi(MuiY-c@XgoDZ~ywY%5VMJ=gOOBrCgRn`RMsoIXyWkCrx2euTa!11eEe{)vhkU z+Js#z!3TRkP{Exdl=R=~-cp#sX5%Zud;Yf4WAvuf)|`+_f{$eSXmWtSJ)%VPS~rWH z6D%}qQqJAv^We7WdNT*bY)Xs-r?viMFgE!XCPF<=XrOB+8}QykZ%~P78sP7N<^Pnk zVFzfMM%tj=1XO9p)UNx&WG|R{1)yq7B~=I(6p?9w zjDY1H0m4*)2GKKNf_5dq2CWe-s|fBOfEo>94&asY&WxJD0-~E(Ba*Uk5Q1e%9kgoM z;&Na^xrfsZuiZs<%Y+(I0)zdXte<^8J}AA?W9GOxWeaF{Wc14W1VW}dEwsofRF#m* zSez!-P1;=TYCc!oNQk^dAc%slG?BwVdJ`tx=C#y%Zgpd1csHByoqxW_awsawFgDva zBjG6#0eGIM$%_`$zW&tQslC1)q$e6EDD>XH`!<6^e>Ucp$iW%BlOn95U>WC0)`x+s zV5rxPdLX#QZ>BWY*az-W6C7hryOWx=A^myfonOo07_{BEM{>p@3UAr4Fx3|6F2?um zwW$9cAHCo%Pm$}nUD|x!9UbQp8UJKnnSeh!Gnt?oEzSD93j&%D@xkx%y|^PP^@07Z zOt-r_7F+TAu`f7YKX2*->mY#|F>%KW;}O2`++=NMQNHK;u-|F){Fmba(r?w1%u-U- zYXG~e=ViOyln3|kwutpjSRHx<$=qN(nJ|DuyJoqGX3&}`0oLl7tamzIs`H`8)5H z-~T7ST7K)-UN3hxbcUYqDE7&Oa+?fun zK^W}0j+OI?2{b+9Vfdu!aX{SHTfggfEf_0$+%kN( zgv-Q5lq``A5jE)hJ6Z-fz6vEwle*d-{M{}5HV-|r837R=^qJ(#+S z9_J@*6aE_qVvKPE`Z4u$jEb-6Ih#N_R(e=JrXH<3}Ob1+V5Z%0|H8rQ^{-|_x51kLJQ-t=U_A? zoXh*sbNOaUA+hv~cZwEhJDu;un7INdxy7*6AN}Spl;8iSUoGEw?{>L= zc3SS%7=;W2;a0@>*lxtt*cZ*EK!pEgr8`?}fv5Jwq|Qngpg$uTFj5M}XS5eNz#R)F znK+5 zOeUoHK~8GGP#)2ZdAf zTAUl-c9cIPeivP7(Ku>wwH*0FYy`&p9n6|7;5vBX8m^a#8;#BwYIM^l&Z1ZcE6xGo(73(tno?fy57!Kqx7kz)4A zA4>nGDAq>`50f8Jbd|rr>Z~OPN@`|Uy{*?rulX?=<#|bnULK(OL zcNQXJ3{j~-1YazQwnsc-;8nmo>zt8;+{gI*q2~{#;ABGOVaekkw@tkI3aqqF`rFO>r6z)a9q z2E`#!(8@CdP%VWNvDrME2xf-gV&9F4Y(fY5b`paCF02eZb)xMMJ~rAb18CY2Uj*PH z435Q3OX>vTNtPEcfVow{^9FqWVF}?51a(fR7`27bn6*vlzgN8U^O#zj_C!rlR9CG; z{CC~+%>`(0cdnGew`g#tHH_}852r>BQ<=kBTnSfij}Xl=7>4gHacUI!W}cR1Ijs)DQ* ziQO4K=*OksAj2p;R1>ZU@OA6m-fqhKZ*Izi-+Qxs=?nj;{F{IKm*rpm+dnCP@Snb4 ze)^+7FNf3n<<7k~%K7bA%3)oD%dW~*!@VF#DgVg%-C>BiRZJF9?(sXjl-uKWrP5rp z9WRI;pMf^%z5ruUE#%t05BHcYl0SVnFhoEEZK_i()hC>pfasShUU*Dq`{!L;@58gj zzWzK}@5|N2hvlOW|EgR*{ZV;%`=tER`=2kr^7p=3e&JiMm-pX$qrCU_dAZFyTcVOv zoWMYLnmca|j)=;b#z?RSFJ~KYYe7L88z0x|;G(sYqH84l0Un5Eg%8TgOp)j4PNG29 zu+-HZ8~o0~C)rL{L6FwWvf|)=(*9Zy!0Z~Hhm4J#-cj`^kY?PEWlVDPj8XyU0Wk#^ z?{tNQ&sH)L3dNhQy@yaDg z5AFI7 zW`e)Ilm9YK*Q+ja&fWK3L1}bSg8;&v|As&;?>Qd!cC_kd*d)vY0ISn_FMU+{A(h z&Vrl?iNGkK(PEm8IW6W*ajl|4#k9a<;dywU4mRF`^R2`*B0_vCL(4o3=n-68YL@{+ zDxLrlRzi{%vk{zr@7o{1B!z}-XUxESbWCD7a@kDG$r>4J>qml(oOe4sA{^# zc>?KA&T(Z4@y+|h;AW%7uhles&JoNxqYU+nKl?pS=^P>QxC^%CndW(APCtPu#$ri{ zSpo7sdxng^9tOD_;b7WN7^`Py+>(piNL2fT_AKWy;!FVNXRC7iwvDPmel{~^oL?N% zXwxv>xptYO-?4u$=IK+q8s4r0R4dSKw=1vSTbFDk?Kdh5Kbx3^lv{6_mF*B>(Q%!t=Mn%4$TFcX;Q3~{a}_4Xvg1sR}>$Dy>T!@^{}Y-+uo=`K9lCx%|rC zd$+uGpT>G|*q3L!L)q4VUXmJcv>n>{xH0f*EUdbIa1w zf;tAJlgeq&d@PHD;{|Uh*b9i;asLl=iIZn{L?%#fv7ZsUbD+v9)T%J;SO^Z z(7RBsb7@`z|A||fOmOP1Fk08cGgu5{XhxIIUCUWyL2aaK&+1*6WI^)EXza7G0-A6#Kgrkwm(ut#QOMMv-q<6 z@*MrSu9AUx?J#y~kmi&q0=?j7Y;m+?#c^e43UfxscPacQVkvY}!*k~>rt%)!q?t$5 zlEEb_(W;cb2lr%gIVZ$RXU_P`8szSxtT+2|=gy|w5e2}3t*Viy@v}bq%=O=2hl?01 zP8JouFD*Ea9HDBg|57&Fb=mFK<;lgq+&Np7-}|k1%5VSucgi3BX(|8DfBn7kFaOQI zD}VGSKPex6__K0#`M4Z*x5{pFR`#2-vfiGTP0giP)BV-<>z(r!#-C>!b6$(Y)4(7B z_oQyvckLnE`3JBee&ww-eGLNOr`~SOBMSnki5oA*#A##VFw461>>bH~GU-?$~o!@-FeDl3h&T15Z z!=YU6NboqRW8KOCdcF$_WswClj_m1>m)xZ$25*5h2%IdYT=f{7f+@V8j#Y55T-O8s zM!i;G(FKo)cbRBtj5f=;&94i}eh`7pr*Ay27+#BWqA}|Jae{2b!OVXt0}9F*WY|N$ zivQ(~N90v;Z%hPeMHxwCh&ZQ?#|iwc{1opE6_A7BCh}RB=C%9`9{FcifvdWfh8KvU$h zt3~_Q0=iXg=|%%bRJWYww}gyra6xT%hBPN29ApJnwqV))<&YD!0~k);zayl!>MR!0 zZxkYy7QG(Pa-#O{-8@s=j1N1>uJ3OUpvnh&u-%SUxd=P@(=4VLPe+yyLykSeDOkqR z>L4l5ltHkTQ+J=IneObc#5oP%Ca%Yw?R90jMpt=+f9o6PZu9rZsTah0Mw{VQa~N}G z3%R!9VFAPq5p5Vcol(j^E8mDPtBSei$irDQB+4v?h!EKO;Th>4FjM#~K0AhZ`ZYu3 z-q$miK7dn&A@gn3a#iazizx>9nHbZ0RdY-;yd=RaAW1WhRA^R=NAT0L)y@!ClylPF zu+=E(7SpFXK{+8ze%u+Nm;UoqM%IwLmn#+er_NJcS!G`io0_=#qH_e?)9Q2HU1Fwt zA$KI?8$-a1DFzKio+cR!?#Fq8ONjm&*TH3VmFuF1qXlJ~NgQa?rDbo>R&`>-ee~qAB3xe+>Ge@q~a*vvxp<)AJ zXt1ytJmiH|bKG0R_}$f2*`BP+-Fw?|ent-9b=(wzofQVC(6Z4fvx_d#`PT7x#XZ)C z@&c5Ev6?eUO z9j}81r#k>oA>JO<72mBZUol;6)H0{|w0W&cK)SF35`-FqbXZ?JP$B;RXcr`O(0M<`WF1qaI}os z)BELo=|T4=kA;I#I)%3EUtB9OY`627AI3rh`9p!?rI{m#EIHWxQ)SldX0v5rhl6T7Q;QXL3Qx?#AsY_io7iwIo{6-NK$BP61*5xm2JoDu_eNFHh%frF~BccR0y7C z4)Xqxsf@HT-{X@*L1un|1v+a}u5vBQ!q{ zr4{v#`TB4ucebl?f4eE4JKL1EUOg>e{o=REKmM)Hm%se0C*?nW?^*fZ{=;9C|MZ`K zP=4^kAC!x$Qnt75m0RZz%E|fNvf17$heP!WSe4zr2AmRFwY7ABPO#uT${GlPIpH&l z>A?0y9XGwJ3Jh_1-zVO8w)UzFZEq>im_74K2Vt+B5XS~BG{#iLU=<*$_XrK6^3)gQ z;`y`k_{j(5`O^=}x?Gh9_s+^U-+QC{!nc31eCzAC%X?ouFYmtfYI*B(x62)c0!6@Y zaA`^_Sj)j$Bkr+@+q?tq15#$vaN>2acn2m#$PT1U@WkQrD| zQ2`V8wJP5gCjh?DJnK+5!pso83sBw!WsGMvpcAp(OmVC0GNU}lSPk9Tg{fsUU*_NX zP#W&z?obnA;X#?q_=u70W6$KOOMv4Mv{L(!^-jFNbsx*wKO}vjathXcDW5P}&jToN z-3}1h!x_1Ifj;XeUC$#61t|mtS~wH_%(#?rhUvv&Mv;VpkFEf;{H|mmP_~6DWH||u z{C4a_yF0N=T+_Ael8u{-t&9%^H{TyW3yik|;uO%1D5Oly-F_Cfuz)dGy+E6D%*V2U z8=ob2%?|198ocXoZ(uwrpu7v2yQ?{zdL|q}P@ttH(2(UtI-#9?%pS5mUS{2FBhgfb zM>W0-FEFSIGF5ANCp0n1<|w+zEHrwrNRQnEkA-PB;VIZIWR5j(8cftlk{qyQ&90Ru zBIp3JttSFyV;0%_)QD0(jusi5@Ax}wrx1puk70Qs*z!Jb^8LSjTK@6}6ffYTpZ-<3I&4c>pO^K?ow7Z>UAEg>rEE`H;KkZ+RSdNI z&?=3S$Eglk3_xNDc6=+jz&DCkEtw53N;Kan`+4sTVd2{urAygx(8AqzgeU{G?!{&- z6W(ZD%KqxITwOdb7nje=<;CN&yLwtS>#K5htCY{ba#lX~{%hs!&)+ZazWtzl?Y+0k zcfRq3@})19a*s!HdDyjdelkwzA$ zHz|HljhR>WsQ?Gh+<2V;2cBa!wgJv^29MFl_-Dx8;c`#%tm1@PlAM`x{0_MG>yUDPVav|xWb8Ls?mUQ_g9N+A*3Bn6%A6O_wZYu(g)x+lsa zI*#nEIib)h(qm?LV6O-HOM1-e^*ei1n~IPkxk57kZQK{r#SEI$hGuMC_)q!1M(`Kq zo+&C#9U!#5FUXG2Yi6drALD|NK2>!)+j3`+|c^+ zGAVxW2&F43FUp3*;2+}d>~l(I3n6{ew*g6|^+C%DX;56f)v+9CPnIn*b)L@={_0yt z?RIDyEs<_ci6ANr0SW5ch_i!kZ6 z$3O&U*2%2SGG>HRj|9+qDbwnYoVA@=q~R`Fue~+RH4RM&nztxp`wls9^imR

N(3 z-hv=->SK2pY=B9?y&?QYB58@RjTV5MxgaLqgdpB;aOHs#1l9NT?xhG^-hB-2Ue>1}< zYJO<%v2$$6@Qbub9zJ8m%7`Y6-evW0*x(B@IYwa)MUn3-=ZbyfA9_oq;DR=0c7erp z-Ctdm+YfG)2lwx!S-4`Lw602sv*PdECSSM>m+g&-zLEkgwg1X3ft>lCj`P6n4f1k& zAGpQ`sJ+w_fJAGbvB&5e4_4*#zx=5D-Y-8YAMH!|-k+56zyAOJWBGS~@V)XU-~Vy> z;ZH8h&mUiuXP1X^dHJmDu1-tYoRo`0bw52RWnCTJ#mY_DQ3&dmy@?bAFrW5^r6?wg z4B`7GvK@NC&?~&7R0MNIqXb_KBdZx*C!xTAq@=jo?b`LTc18AZRSx@$vN}93+tp>c zd+V~?d2lGNzH(Z=@YcQZjrZRvzxWH^EMNc1!}7)>a_`^OD=!y^@(~OCC#y{jp#XY) z%Pu41KFoMx`DF#V%e14Z{U~ibMLn-q;T!<^Adayg6RLDx(JLQ;HZWe0`Kd8PjEX?NdwFJBff_B{_`E~|m<|)@DGq+3 zIE4bzjudAjeec&=N4GUhs7PSPuyu1$^K7s%}NBv>txLFrYusc%FO{!iQ|zVoT~h zO&KJIngP&K74@4*e@_U$X(1vIV1kJdnhK;7DMf_P$NY-kGfR?$dT(2Mj z@&Z1!X~b>BY?&n`J{QfB{cY`HAN0KlNeD~VCkUO`2aY3yOA7=9f+^mA);1`xy1gGT z@%@=Kc@{4*lLD$ z5UR29Ol4b`>VGu;j@epp)hvEHVse%!2bQjtDq$tkx|=`JQNePUgSzfZIs3xU(%+l9 zXX_P!{Z+Ypeycosa9{U*wZNKf$?(7!ASPs9Q&;m+3ko!uMYU5Lw-_@Lr-odlRB_O* zqZ?0Hi@@sky0pM`U-{zu<-hr-UoJm?Qp)%L;;Q`n|M=7LAO7es%OC&AUzWf8!H>%a zkDr(Q#is1nCuMtb+O7#~PHvUe>ZFv_Nuv?_eT_LqO4n)ult?D1Zf;&2#Pzi}Eh=0z zOE>Ux5SUDOrqyAs@kyFoQic6>735i=Qs>{?!fSfJ`t4QO?`ph*i?ZKemEGk<* zSC`LA+3(7BeJJd zzj2cdj{)se8eD@D^S2bMp^wXi?c=|{^TXybJmH`XKRZ^rxO zYh^M>>jMPWDgF`r!*9|tp&`lfKD|3W{Vs;c7`QJ9e5^_&8KYOOMAkdo&nesz#TT)T zGuLd13GU$L#yTn2?M*?z^!T8007fx*#(WdDKLz*rtr%cs)ML4n_P+6Hq*RsEo=OGO zTi)8*l58aTsc}*uNC)0th=t%*LMS5maT@^$`JoUXcj_Cp(6w(RkeT~ZB4v_QLl_0s zo~73TO!&6udnF;UDPdd=3LaYQLG}i% zN7NhwgMpef+ta!qj9_~v#KvVxjqEUK)12nApOefw!m)>GCLlzjgi4+UqozX>C5aE# zXs}F}Y8?_H9a#fJEK>|F9D-44&`egY;P>qxY?sa}2of}iQl&CM znF7J1Ke~&ENLtrM?(MT0*LxwMP-KKG5+)S@V`SEek_nCY_r#aOs~E=?p)HiFn&yw^ za8BTL%wV7F1_)^hdy4zQkK_(5FbwqfIN{QwDeFe?I9G6=M{BmZQl(k=KKnhwXmr^3}4caUL`Ot%j;LuJ3>7iSp zl!B$)I$4){C#U6eXQjOT=(K#}OSj9f6Hl|TRUpO!!WiyxG~ z`kNn?AN=SC1~vds0@_L|*TpudDLi z&R+{y&A&H==gM zV}Hp0q+-gAc{(|IhtE3Yik=0y)(-sZDE+l>SL86u{L;SXJ72=rHV*(nN7=?V#x`e~ z!@W%g29AA>^GmoA-rE6ciF; zK`)4|ST1N#kaUxednJWN zA)P2AYas0p&|1nfATCNYSQ*37it>^W|6>d8aY9(As2N)=G&sgqokmb}jQ88%*lDs+S+i9XYH}>h0wI^ON z`?9X)yBXq(IMT+j6yap!^-PsN;|pdqBfL-5jnDDBF6#sCZ7(Y?E6qA9Mu)*%L^2q` zsYTSn>=;(Bouj5?sBHee34C{NpOpvq@8y}QJ5U@+Z?f^-c$sgrRo{!3E z>Q)e3%2x!)TlCPf2;8~1EpOesUCLXxTb&O}DSz|BcgkP=&5z1o|M17NcjH-Yp<3!UVF8?{_3VYJh#aGRoK5e?8?=}p*$C_ zlA3S3-F9FF3p4pWuO=zA4hxnz(hw??5J40P(uDB$auJ*jer#-sL$LbeK@bduzz0PO z;29@0u_6@}mN*Sk67>BcEkFTPvxij0PXZylKi%4CyuJiL1UjNh59ZO5w))xAm)D~+ zScLZXPgltauB*36TUc1QA!P#xd`hptHX0yVRR&Yx`k+f{Ot0<7x@}tahi1r;81|Y@ zP8Bi~AQ9KyD-I}&=)T1hsR1gLPR;;ewIopC0d--7UmDF*elLJ%b@Os#q&Tt7abVsa zf0KAd*SGMk#Q+EgQ70poF6bv(hBF2M-;Jzp*@T7ZWz=n&o+v=hXjif#mQ(xtWf0{> zBUyB8mmrt9xi4e9m$sM3B^Z68)_=X1HMrKmn%|LPq#w8K2hn(=#dK<3Ca_(<#Qlsy zH}-{$yNHdAW&)9X(PA2Z)B3q_1s7G+4dx0zF_s(yB=1ISgbQlG`_a5byIB$2Zoez* z!$z5YueVPKg1+?L5KG5zV>9iAC{;uSE9CSVyg>JntR`u2?%G-=%Bg^O9e zvNmngjFhi=d(-7b*No0TkE^r3%F-oi@T&QCV0Ls@phYhc_?)aclc`i~RR=QS z272sfiQibh+NDaAY>tS4r%He5{rCNI9CtdJ?$FWU7WZR0^tj0MT=>}@@%laG`vw9q zp}idK1^jMqfB0P3=xQW))xrHu`eZG2T+3`9IN?IZ(3Fo7Ac@YY%v!Y8ls~!ILs}}K z`m8cS;(efBsFyy^6{$}E0RR9=L_t(}0<@+O2_hKdQ^5iZ8hq zk*zQGt5JKQ4vmlJ=fH$x_m+6v--@$17J@SUNq*qW3NV7<=v_Q3@v6f#9q9LiKeOoB zG`??*9#D9O+}MOE07F~0pLI_u9jaN=V;Tl;rNP|6HZLzE9WPk+%p_XS<{0YHeaoz5 z%=V~0?l-Bgzk>iCg_wx@tg2lRvolfwR_`*>*%$oh?%rrWwzh(E)pF6&8?DNr8Ho;M zy(c&9J9o~@{kv5pguNi1myB4&joM>J6Bu4to4l|bt5Aav=_fGif(xLMvgAld2PWvO9dC?Dub%-M*B|%R_nk{7{}f zE9J?vQXYSFC_n%3qw>*{XXWYB=jF+hr{&r6XXWzZs$5=Pwzv*;4Ev@$UX|^pdI?lP zf768iTenWj`K_~Z_s*Sic3yv;l~?Ycm%H~%xqZ8o+qYKbq{b?2o&<2Uj`bQF2@+pZ zCJGp8%pO%rlJ`ly(~ta@X5L^gCb>(zYxnFa`n}=>w#?73G-h1s*QzN%ntc_GG;+0t z@gEyr{Mt$oz!4uLy=AVHH6;QItk~`vcq9IwcyuW~4snR!rJFTyhRD=z(q1IOVQ(-0ejj6G2pb&3px zQJLmP6PT!>#5eEgVxypm5r}vt2?EMv!E0l{^T+*2{L7lXe*`BJKRdMs84X_Pxg;-8 z)E-f4PEl?#H`=B|ibR?8QaT%Xwg_t}y0>whL!PXcYiUpMKklo=z=1ZljW}xLPqC0% zIuCV+1%W;?nUNVl#wP`~V`TKHDFi08e)67#7Dgg%6NrW*1CG~<@zlD-8vU)$L^9Ql z8gxSw8Z>Nkge2l2%ElF~J)^rv$T(+XnjT~6`a=ZDZ@V#jtCWpda??Zaj_}}|Xl-R9 zF#4F)HloE8=hMS=^m|q^g@K1tKMp!Rt8kuJXa!`9%8b~D_5%V*tJgdTd|VFFR7&6` zKXDbI=5F003+Ng1xpSPAs5nsOYGw`EJ_EO8mcb|c zj)JF587dePSQ)CQxRX1w7H+B`SaF4|bsKZ%tRM-_oQd+BjXx^2T3m@F%CVdsm?kME z)Qm8FtthVH9O26F5Ux#Z6aRK{`h;T46dS$39r0l|F8PK9l^m`){_hzp;zl*g(J2Ss`YRXaw#3(fuylJ0eW% z%l4#Nbx%u;0oblZwtUMb04dWf8i7x^%)xo$!(c5egLZnsVrp#~SgK$Wt<@&=Ype2e zB?6A}0;Ei7Yuf?|*fj(Z^)A8Uez`B@;_6}9UDcquhjO{wHDSNv779$q`=AO+>?tBN zxLpg_R9F1!0kCZr`t7EalWi%di2yBy`sO>>Jdnl{>;2@4hnS|bqHt9OdkB!AHaF&r zO(f!HVx>p#;slRo>mco-%th-%ys`0Y^dv4!gJ-N=2&_WaxYk)`a9(FvDho;iJ_7D25LKlH-eC{0&A3RSpIx&Us?04e< z>h5=Km{2ppi*g%{HulfrIQsD-yqEFDj%QEg0Oby=;YPerh?U~;?K@>h-mmbcVcf~@ zbk#s8g&Dd`{HsqncyYn&Vy3R}MwTeo$vc^Y%*w-UME4>OsKcHy3`RKjvUWcP1^C2L zGRnn5+VT2NLy)+`fI^_)d&$MRjKQ#WP{>RQYw_&f5CR;rCEshBEYkvrA<6)};vd=e zVrFu-&A6DBvpphV19MM|_3O?}KHHGXifzJtv&ne<*zNah6ORkd$?l4#^W`Ds$i62Q z(Rvz#u`L_ZF^DfJL&o1Jg5y6j20Qz|#1u5T7lddB zqAc+l-F<#h8erUPuY8iHIMNITov>0ZDH60KSxR@$ybYViAkpdRMkbD5EZ{T-b5(}n zG4bShukMVBjYMsG(I5284z$iq~mHr94Lz$exR;Y;rHd63E!w zEGD-5F+v@}`1&R9Z?un=2&vup@_^{pdV42(*Mu8oDIj9E*^Q+C=ScD4KjL@IP1^(seXU9}@5{4^01X8cbFPn!E`Ho4!gj%0XUt6Y{eX|7SNIa?cce}Dk;iZK7rVpE zCrj=m?+=__Pk5wKu9)XoZw}?8y4Rns%lcFlLd~IHDb}$oLguZiJg9vG?iHa_=tQ-g z@!TXuU{hhV0A#fV@C9K@bxc1;^k2LkT>^Xh?Z^oX&zDQpL-xl1_ei{~lDMCyXcDx+;_Snt_gm$HNgK28+-?tXBTXD5-8FGKKyu&y|sIKd78z>=<7oVetu; z0kPn|Z#q{cs**3fB4A<;t2PgDK6OM|6FmFk(XIXQXygDc;|cxda!f^-lv*d{(5WVG z)KL^ZJm5OU0eBSrS~XX)=@w{daV|92iumeycY}KK@IoZfA4<<4PaRqkp!)vsZxn#$ z*Kxp5@;W)h*xlU+L<8)#MP~=W2*(G3quhK26zQ0cXVi0on+J8XkCqE3ah*g%se7%v zt!;ZMDr;;!aG$IN=wV{RL{)Sc_BkVq;9}b=gF32dQCvr$1vl%C*GSUcQLAKWpU4|U)p1}v7?~(8O!oK))#Muc>EiZw0yE)pA}q3Ya6Oi^pDE_z+Ks+h&e+J|sa%Fx z_i9zW#vuy0)(EeA6Aaq}ZUu0CE5XY|(#7eyr9h(l{YANVep>F|IW5~N^;6(@$7EBm zKx^GcRQJ8!beU?|z!}cvtZ)aoY}k{})h+w(ag zju-w%@0~(y(pAf!2Ycp`V6$SEn)1jL9>`RnP)@}8ut->ws~8kb8PeTx${{plqc$#CsR*mCO*aW+tK;}m2w z1Zip?F-Z_(R#)i7J{VskK#=B6I*K->M}>K zI};dvU$4Va5u6cuSi}1! zz$?LqMyZ;pZDB@%;o|$I)tymMuiJzO2p}%aJ3#_4lE;K9AXLd?-WP%+kP)yo4nkoP zu&KcU-V6F032!-$>ep>VptA3$lm!{{HY!4QTpiU{CEh=AEYeQWc6%oRss16xE^#%k zFKRGA6JE^nB~+=_>X~vszxg;U7$9~upAqaboNO?&Oe?rY=M*PXXSN>?&%fbc#!qaW z6``osp%j~Te*Ij)(1`ioWew!40@F>ivz6i-+nhd_@N(^ymUmY+Wnb={-zvAyPxz{% zSa5BPY(IIggKHO$?iW?ftJ(Qy%1BQ$g%98~!68i`_kKC1u38OWR~6m9- zc+f4nck`UOJ2-DOnH=wgfIp@9&0)DTE#`}^6&&CJp3jsep61(KVYlZ+qma&Bl$LQU z^sfn3hZ-UNs@%VOUhbUVYBj21NHTpmp&4<&k|q2Ymbz5JXbw`w23IZ#M>R3mIsDO%!85qq{g3<*g(y{RGqnenP1I zXoYx>=@K>{WG6Tb1`7zzUSNbaePQfye9X&)>u#QJnA?e>G%((?(=iUtA?@3Nu&Y74 zr4Kgx2<)n}PtDO8_*_w+?P@{E<-|D=?BPD5jOMyLb1KE8!)#%}VQ9;1FUdVens8O>g+P=kxV<_21 z@{`5wFa}^ABN%t_ydd0aU1t(Ulw9*B&)R=Ggq_2K>RP**wrVQ6{>>Iyoe}tQxZ*rk zJ#q^9;XkcqiKR1q!9P9GQ|niNNGfnewV+yyh3?GkXHc*p0j7S*1<LW%G&M zfi)WlBjJ9&*BCe=)ZVK#9q^J`QU+EI8x!0OUrnrAOA(bt1clO`1+NTgqiTY=l6J+! zO|7Ki#&N!9Z0&{$kBRSJ1c!|jfg_9mP2x+%e+l51oUx2T$l6E*Ys9hiTTh(XDUQc6 zzCdhrZ#>@7v(9rTz;}tYKD1tLy7+Zx#t(ojd%a`QnrA0m%W+pnOz}qwPEcG-5)eI5 zL4XwnKz&mg*~{|a!R>PQ&TaS>giCp(E|oHx8U6s&l`pp#UKRK*6%!4w%*|y{BU)bM zh%bSvv;5=yJ$irXyxCmI`sb)wL%5^&iwHSJZ&4r*-{n}))zxSkLN~K(U4!*TB@^OB z`Bps$WDbfGsTL{G;VyS@U(ewtybGjZ3pg;P->81y!kKjfB-Z(EO@3+X)q_O5U*IUwVQ1rSa9nz$~bia3WdvVeUn*FDl}YXdxsw0eGOa4#%1f}qz#nj#+g z#Moa?w*1`WOv=6%UWDl?2LU9FM!WlpFad^InJ%_i(f&7}=%5*kp>W|CrvTIlDEWqX zXbf#VRm|m2QfT<`(1xl{FyK`Svc?m(=)W{Z7v?2&pN)CCcp+};J;G*cgT+Hh&-@ta zSqLh@+Ch3B1BUo{;T_W@Rw#c+rN41@24iBgG$Psq^etmDHy1)IEQt;7Z3yvGWC24$ z7cvn9yl2WZV}#!O z$i!07)^$bhq_l_d8bf|}J(h+Scw5l?r9W+jUPDX+$&^rW(7t7vt=~~ln>H5tUvnX3 z93{%|4u8(yI}-)U0pRSIOcYk|ssOItOooq0=rZCv`u5l&gc-+AIeFRRt83n8q0rZ? zd~pPwJD@Y7s-U*tP_Wf@nQo|yV#uV?GYt~$dR#JGkkQQu>x@~DZxbj6mwIs3oKOUg z&cQT8Bb*6+D{iWkfq~CArx|kV!DqCdk#@iMKzD^zxhUv@BWC++2cGFh%4o{KI+nTz z_T`m_cgx*7=Nx9$GMU7=DXcXp;l#YBl4=~mF634D+=~Xc`v~`{9+HK8i+v-;pwaqj zkW===i{EFS9f6z!naQuj&=S^lLPU?Wgd5Udb6k_nL4vh<0V|Z%aZ4vxT?uaN!i&5Z z?nk*A1LdF&B34N33XvIFZJu%N^b9?v;-l;0HI}JZ({~!!$CW+&Dy8(Y42nx85)8 z8E9!TGG50rv|iy6hRi~yzx$DB$KvSQeGyN{#CjqGe9lUQhdn#gbHe|UdB?u{^`A@M znDr~xS`q%|8eoAUuVCFmyV86lp30LC&I#GNC`}&^9}G8bVMM^gj&x?Os!YF z1BhB`1QFp;V~6CqJF^gTr3Z%OkY+^#4Fbk81zS<%Vqln@QCYH986lh6pG(&L7@QJu z5-D`#-Ynf6oKj3?&sy~PO5+3nY#qQb%mFK9KM@Sf zShQ5WGJd(oe^I{d#>Df;-etx0!B831-PV8{qSY{=oe@OfGu?sY=Z)cKiwS8fae!%` z{eW>&{Dj%2_CNw^3jT-)HfvEWyU+*j|FJ{Xlnb;!fX9?+J_?2KrA!ws4xKG@qvW@4 z+{?xs>trz+mMcL<{q+iqzRhW2M3uwJG-`|VU;JExtwD+)6v?V)P!KvIkM3Y2^AYxz zKiEsT$gyj1tmmyAI1N6aNFc=BM-H?SDHjRO<_YH>WgKP3bXpK0I&mHI%D>g}`J~^# z?~wq@Gx?rV|B2GTF*kBos|nCzVV@RwoX3p7IK=5|-)pCFI*gk%Wf_dUH3IjFg(wDu zjXX~y>LLIISc#_qWkCrCU;FIBHW5*i{fC5#_d#X0jS!FVIF3Wkq03MaiPsG7Sc+SO zC<_RKpI@wPcme*lIhlKFyi9~%9Qs`{Ub;WZgcfm)wbU_%BZbV8k}IzAB7*R!W@sMc10@uFR0;_C{=lL4+OiK_%GwenvY;eMRVJW%!?Qvip^LIqtQQ{gZo}Ct@wse@h^Ox#!iB(97-yjWokUPmEdyV4kV(r@G>fI z>i%A?Y!~<~QM8)^lz*zXfvu=|B1k~T$uXE*PvW^BLp=jqa)Gmd-o;d!aYx;0C))rj zW6g{PPLbTn{3P>XQnATO5k?Xa11bYzLGQTPwds2s*6dvJk3+^&nonaUWMj=K3vf)- zt}*G6pv<@N@s^wI&zMYHn~2o-FtKNgDRKhhoG2u?CHu0k*?GLUHr(Gc{e^aW-oOZv z&KQ_y+gFrQtGb*Uv4p+PcVC*07`T(TH;`GU_kM(ebeHcb$iCrc>ic(hB0WJjVbczc z)4<~WLt#9@`j}~NQFz5j=Bg}-V{H~_Op|79xp`;>Y#(4JA4`mZHa^63%zSj<6~cvg z{yShAQN%2F@gAb)$d%Xg`&bzR&kfFMe_tH;#P8#o$;NJd_xCV;K&Q2O!C(w;YdJl> zx<#WBU|FEl&T4XG$-c?X7S=y%9hCU?_;p0zqLNpHYNd&3%20o;#@?r_ZD2C7E#thK zwX)&3T{+$E%7c4{a()8BjqArUJ75=cOLCLct!K@rEx-Lpjy->U{j|Sfvs3*6t_y8W z&uKML@4Ech%iwwPHiPUlSsSlpVJ#AD?Gawx$qMoLe7B};e@dZ?)=ef{{RrF!Cl5f} zclaK!(vC~Q$Kdap79hUoewD9b_+(QC@+EHDP0tap26^t-gjVM3C5wox0|wxwXBBQ6 zbrtslD)Lhpzvw_IAW`cxz{74nt}bW__*xrAb$6fuQr2OQCPRUu0{TPaCZ&2#;EXhk zjV|V4)%WLS8qvFquRZ51OMIo(#>@L3z#>P%<_;bn#smXojK}nS)4LVCqt&VbVkvtD zErVpPq2A3nYf6D*=;xHTK=!x6ctH2&d!#Yy&qy6tWvdmFyDUbi^T{0a&K@AIf&1c= z7Nm=kir@2nv$hbZ30jRcIZaCfK}4`l+eG5t48nI>gmM0ugyrineRJO)J8ooDGp03V zGLNwA&3O|{61Na|hFjsE;NRP8jjK(DjB7xhiB_e9v=d^=P zQ0vESFL^&xju1s$GM9E{dGEJtxR|y@=h}~HiKXzmMTB3~3=7Sh=yK>j1r{b{Qq*e6 zk!FL&8uy{PBiG2s5+eYV5VqFr?xv_!U_ZW+Vw!JWBp!!Y@J(LlJJZ$mwQc1*;3qAw z-Jh2B@!a}(5~b9;%)pq4b)Y_?s~0xUq2dtlQ~$l*wyZGy_o*gbkF*a&Bm^ z*MoZCpg(K&+L_9ngaObHSLElz?nh7Ufgtqr&zh5+cscKPC2<0sPC)QTfRFO?3?MuD zrtp?K|NbhV(G2G<&+&KcY+E`(N5^0s&HtH$fA|<6hiOAbQkuvz0Hs*JF+F73#z1Cs zG>45n5vDZi-u1qteSEWg)$B54ZW|PCgR#a$ zin#tnM7X4V)BJ?A7K)IJF~v@8!m^3w4-ASXM3rwEv+Jh1n!zT_527#?!q6Ck%owSj zNDeg(;b&hr9_(WT^kYi4Msvh|DPuqNe98XMI?Y9gwcPZEwcISQ1eKCMuuBA4pZnP# zoXCXZ!NWUHv`-|Kh2KvZ(>o0#AC%16X%Q?MqOu$pMrg>5lI}Fo-}Mf98yN?F5g|AB zP6T2gkZ65S#HGXc0UW!x$u|P__8s2=mN{v<7$)#?myTr;6DTy3fJ(PEr_7p>#Vu&5 z;SeV*q;@ihhjwpAn0VXlYCJGDmK+d8Vtzgg?$AHl^F7wQkPL{S2q;n8h({8MRA4WiNukPl?3-A zw^rF(5`kX#oR{a7a8_7s7#__y!n8;jMcfl;^~W{J#)tbM)|)E0hvI%3t&t0S8$zY3jP_K=V|#TQ8Kt7T#teuTD}P}cJ0vbNCR1U$-J-9fksc{{_+TN7&U!fS<%rl zy&`CN*_F;H4G2aU;Hk(HF@OM4xZ#P=cqxqyWZqBf(iJ>ZFbZB#E=hzur+6nzbh{M| z*53wCz5_4DL#4S@5u$ViX`s=HY|VzSJ@oT$%2v){uZf31_7(n3RUlz;#c--)2(kn% z1LNE}pB>>#;-~vDTdMUr{toatkBi`lJft6UQ%|(OvEDdEZ=$l_aDefloH$l8%*niE?zP>e%Y@r-|fMz zYYPI{z!ZXgpislpOEd6G1iTx4BK_3j5YM+t^g*a6}%*>y@ z&c`zf0^@4KU47B@DgH9Eh^votn^HVUlz)IkuSFGaBu%dp+6Z$)94Nw7V<1ogt9@96 zdsP&StmARhgVNMjUw9UeIQP?MT;{S2-{{^^MGT&M07h&-SX}h}>Cx!RuXiKhfgZ3P z+WK1%;BQgS$+}`033;)u6Yd6mWsJzEeLLq>_}&;;m+TQ83JKrYl?ti`&q#{!^MSJ= z9tC;??R3IkGfdF}Z>|qzx4&vJ0PfsAEw|5W7LMiHBhraasx0k)Za;R4o=<3AlZr(h z=Zo5xj&6iA8E z1NZ_}LMP)~LHlAe5}8sw4LbRi|6^=Y&+BJ$#S-P8DLLl(=k7~qtb%K)`cL>I%ZB81 zzIe|@H0}n_>EZO+^5sL9w(%3x_Czg{F$DFWr6s}k(!Cqx08$zx$Zc}8FV5&)r_2$J z7Zud!%1z8K8{_DZOt&$rlaCSk$LkbhC_TfJF@!V+OgS=fa29&qP*ro4LIPL!FM0L_ z1mD_5))-*CaL!mytmGZTHr>kHq-Kyx(n27%y+uxb!~6VJ*N~xSaOSLEqg|JNhn2?? zSod1z0&p=LSmBRrVCj5h4!Fq)!TTXmJ?PWnLm$~T9oNh=e;yKuO$bn`5W(?>_u48j zl|erf2O0jvG*9{7LmiF?zUXZruovacs4T_D$68e9lmgwm8D%^_T|5qq-Y+yXYZI5n zRB<^|*$GKO^+$U{;125`MhJSqu{aF>dZz184!d2oc$9m$&&t_pe{Sgrtrlmev6+56 z!t2RrY1&+XB8S!ptkxA^Qc;w5}c+ zdzRwYnsK15_p<77{37Tl!miS6b>L_o0PHyyH>Av|#wUBPBq_7z{0iM_TssdCZT&7^&6bwtIz7KYp!iPeZ$XKlWKKEqDcl)rsRW zg=)TTQ4po?Sqt10-sZ7Ddtdf!!id88>gNxxsBKK*7ArmTJ?;(PHyk0BkW-ZKn)hp%UvG+9?p)h#Yc^NVRj}r`?cf6$8Vn}r zYDh62gj%(|3wKPNMqhFfJEjy_-O`l-_FoJvvtLJqYiG$^SbFR_E>rLGaZJ<7`2Fbl5+-#Fi{r}_ z9_*jpfB^k5lqm)0625HdI%0`(i>yy`A>P|{KQ(qmf{^spz8@&XJ3h@CupoLOxQ1`+ zLGGQ^;5@Af@`8)8^{)u5JHLW3q5J$|G>U6zq=aF4OWxdN&ler%F<)1aPUo zQAQ#>REwm#iz&|WT6I?-O|z~oq#hJ{P4XJcaexnd-j{d`qmwB%&fTbEEw^Wp){(M3 z>tA`V0B?6qA@pnQn{mSE9`kS&$4lB|Fk-ae^j-V1Z`aB&8INIYMA<-M%gIdXIzxp$ zU5)eO#j6r!F@3Jx0*M>s{~eO)c|l#(IqBL=#{@3T8F8IznUjIPOWpjAhj&F7R~1DIl% zxQCRH>6m1dnpybZJvriQ;#g3iLc^X3e#@CD5|m~1{4)gqX}{NiEAG6^muxTUJB64j zCWIi!_()p|f*?zY*K)K*04K#Y$CLedpY0ORi&K9v{?nV`udrXvyd z{HQd6zTWv8C>u5C6>s*shevZ0h0hbW+?+Bc%G|f3=h+#I_mPo# zYXN;1tPSoJ$p>Bw{+=tc`!Ubq^i0u2XH^1L(te`%P3&O41kW$=1(%o4%kAy1JbL9p zxpi720Qhv5R5u?-2Uu1zns_~WI2KT+&aaFi@^?74n@|XR+;F|A5@9!Y?s2ZR ze|sgt2)5aoUpdkw#yeJo%SmiPEeYo?&ej56eW;vB@bwf=gyW0tPUA;_ap2|T_r~u{ za4M}Yh@~T~5;`*lv5r@S=|)RdWwY6uVN`Kv62$iifur8`-0Re@635iSBHa-#my~=Vvr1Z5LpK+wLv@l#K}8h)^R$PyCzf z-#fjgfSP5-^;99g7y#kgMJQq%4@i?X&+1Ih9D#dQp^94b8;+K%Up*Hyl>vxVk;`9?-D z!3IHW0}-SU1}Sqkc~NnEc4L_&f&$ZFmE;Ubz(7&rY2YmH`k=fVd@BsH>@{Qf=vz0Z zz%1j@8!7T49?2pRj}&He_&RHU$u~;h!#rr}b_r6I=7YWDlwka4MEHW+Kt*)Zt-@J+RyF%4V}F5ANSBCtFT{PFaS3WK>K%5b8K7`>VWmcyRo;S91Dsb@`Y1 zUf2fOyr6V~W8hb?kD&qzoUS7uBEut+4sPZmvuJQP2}H;IL$?n_I0WUcW(>5O)Y^Q+ zt6^;wZZTHC1Si|g9df!Wk0HTqp%Ka*FT4*10**8e+SZT^7L{o@4#B+uD*=X(Vf1=X z9$av~W^_Q|mH!#rXQSXoMe!~>*6&40S!uGW3pB|PAdf(Nc35!L!T2i2QYbIF8Y=Fu zg(EYio9;WB2YQyuH#$pY#6!C(12q4B;&0Y14d6Nz&UI6Zh6`$-bI6>)K2_XTxQXGH zDQ#X)ym)LuP-r8JoVgxk&KrsoY(L>n?F`SlOpKdpD4o|Lqtqm!))CwgLxap}M#!R& zk9|i%GG&bz%>!yljoC5BCdROU{IFdcDHYZBMzANXWXAALuLqvJIA(PNhq*W5f?eN3 zL;O8k0R$05nBck$f)h?bS~Zi4x0&G@o|G5FojVivZ&WO8tr3WJ(8)5a>jKS0f-Fh{ zBCZqx)(wnZ!Wv;!nHz+WfNNXJG8M){?X%`#1w^=IYV-jUQR(Lj&?{LXqX2z0`>DMw zR}{!rYW>YCr{^)<6pmRUoJIu}f0>?j#q+?jI2^C9f|eGi1IixSznwk>+Jm*}bOARf zpiBv$$37nlb3tLyzHbH?uz1N&zShtS$gKtbo%gfD>n)D6aH=?3W+21996|)<7*dAO zF4%H^^><2lmcwCR4*RQean<_UPKn*`(u!3FD%pd$n0k0U25SUJI*jNf%VhG&D*g1On%114Jv(}57$D1_u6@Asso z0z?vP_xd%bJu5~=)>dgl(uL8tra+K-60yIf<`LI57d%WSs6u7^kHl1ojDvY-Sl}Q{ z!>72++LZm^@q&RWRgNU{MPUsU1-(*F8qZwE$NPDi!2bdTnL$}sW(q}th37jeS32B8 z6+;)H{tWkajDXZzopRi}1gA$=;#eo66{EgepA%UPq`qVFGy?{E+%&nL&Y|}q$m5#C z{UnU7xGPKcfu`WEb8P3b;wfBHb7^+;n#Z`V?Ot7$lg+xk_UbF;^rX7-3M|G~I6jUN z*C?)Qwl`wExw@l05b1S>2RuGlU0XQ*td|kbFvUA&aE^bc`+sCu3HjvhI}@ZTE!Wg> zN8sQN4|K}A7sKy})2>4sbgqI?I&VD|_7vZUW!pl<5qm`L(%HEoIS}0ZPl; z7{rAh)+-ghtfYKrm?PHH3MS?HIjS%n<(0v?2fthj7`F5?nsrmJU z67JfFnODaZ4)XXKyS1y@N@naq7;VZf2#lroszu;!8bB6eS-_?}Z|t{&BcE@=%_ewI z>5TXOnVL~b-qqKVg6q+UQ|+>pM&q2-(n1Qzm|ix?DR1Q3jQ%&o4W{1mq^vP3L| z3NFN@ogTzJ^teRf)`GY0g3yT#kMu5R`oX$tlk$BtuCB~(yiN_#2<^ByJeMO+H} zVHj2mvcxz>(0CO<_^7tCYN?yp>kfvgO0jOfbQ&bqg>!gn_m?H`C0rZipns%5Ae~jk zX&bo)wBMDp)06V((Zh1mLICW`W`S~MTpT+%Q*~MqgQqQJfPqGna*_iaCS%Wp$WfW2 z>6x%%Q}Sc{tP20BKn8HW&K&2IZX;nJ>%-9lmTm^H0cqG<13y}P~#xDYVPoG*HrS&rAmhFh_;dG?=S;Isk*cu-r zfkp{OiE+iQC3W*_uK`yKyhlyJZ=*(KclM2Pyb@Dl4SZ6=nOq-{`QE%oca2M|^As~Z z&69XPLGD6#X);7VjYc5v?$(s!4bivb{iM$O=zuMr4l1}BZ>cnH#sHNmP7ecKG*d8O zI}%4pcs0BNJQnP|p`F^sEAPyA%$&98xuSs3H3>YB;*`2}q&!Cti0xs&;|-A@Hpq+E zSx=5gVdlpQi*O{7It1YbnHOPPQYHvtHtLQS)>WNh){qI8`Y1@#6lFujjx?~|OeW1LY=@SGD_Y6TG6E6X}Rv^L_DG0KAeF{;h6bO;O zAvKJin*n|%By0$-p=2r=I+t;XB{wa=br{S2{SYmi3`$fNHxlYA~G8)=jiKg$q%r zh`1zUQnK%3{UvpEF2Q?mDY{05yvHBWdc|2b=m~V>WtU~^4)J!7nUVBb`kzP}Fefqy zbETB?(@lBh!AUteerc~=L?N-LZlVO36DDK9^||S?1iyV&%Zui1 zNB+w^AquG$L%}i?5nN%O&TxV}O2@d*!l55OD-D92C48^)ivusKxqhO&Mal*^GvU(_ z?Ke3h?rD49_04={`{C9cu6;xvqHTBxY6vkS2ru}uJ{)$AxtITfEX7QuZ7Vy7Q^g1L zJ4SnYY>|l(UzG@Zi2THDI84D9isgNdVBj@O88a;RCVPh3ewSRv=0#C|NVF57SDLdwXv&Zhut;HfS!_ z$=+3j=AMi704yJI3hWuA+glqbnvM+>D9Z$6N>3uz#P%)cM2!NacsqDOgM^QfB~BxL zxIK%v+GOsHinCTcGDqgJX6Fxhc|l(V`6rf%iuxK2-y>}zelzXmfB>|b^nDnTaja2uDnKEheoZ&fnK zhkoNst$>TLjQd&e)23k0RwH zKtPp8TB=LafS1qa>x_x)NjY2!35**Qwyv?p;{_#67h)0H1fd$6%J?0vBmK)?9Dpw6 z*fM_8^BpAUdmFj-AK{o7ef$8UfbRLcX!X}O)$6kwn!8L~rZgIP7NDmv)%COOzsSNh zNM?^LFfU)UV{af)LN)Ic8--ij8bOCwS6or)L&>O|4HN~1-r8e~zX%yo+ma!>2tbTY z>JDts9%orgAVP@tu5JZ`QyFFsGYUp?a2 z^n7lwKooR1MTVDQ|3}8Xjg_?NHB&&doUu?&XNm3?QrZ?{=Njeeal$EW z)YT4)jtTFULAK!_Y$86SXzLZuHB+o0IJ)}a;A*Z7DS65FyeCfn`q3PtB6wR@U=q(A zE1aavYF1CyDT(Z?19i-lwO0RZOr9vz1f~hosAEcE;f(NQWD>G(vUmLy#+Knxp>rjH zzrwo~!XnZ`amy!0M=kO&Z^Kc7L&VBJ0VZjHLVL{$*}iW#Zy0aXXyw9eMf##Y`;dX8 z^f6}8TeH>>%VSqI_1x?)%4TyYw{M@6vomhHuDOzDA6H`ujFHE=3EsgtuAEN4ECb5Y zl6kM-yH9$2FH)xX(VJGd%+<~MOqDS0*wVp5VTACK;cRE+?lS9$OqtCy(iMwEW%UtG z1DcrZ7o=_YcUK1la}98;p^gC8NZMCTx2vBCwQcm+&N$(f#Xdh@9qdJ6&OLd|r1xm>;hDwb_&qh7u^R zKJ#fGJ-qB{uWwuS3we6j2*{{1QsgzV*LbQ-Zh*gJjg)Qo9-L}|Vg-l6K~m!qZ>W0| zzHPB9LM$qZgj4T3$~{xofYpWDujrP269{+~4QzaOmV)s>IuXa<^U5ZL1fu?#z7r&t zM6pI;g?W^e*t!Fg+^0`P(Fvlzj3MxSj+lVayD4EEiSN>q3CpoW0X|dK#OG4v-mtW@ zqz@<5Bx`$J*!y|rgly^e*}VN2dY5m}&W`$UhjEqf7kL(yWDT~$s6&K)VL<7cgK6!X z0#DQ5v9_`i@A@}ekoe5Xy)_D?V&{tTp3>c_v7!uxWM;=(90Cfm8SqaBXI!3<&_=?4 z*ngrRQ0738q6iYe=-@qP1{%@L)#Mpy|6rY}aM;b>@VFB}{e396C7YoZ%b(Pt|flb?6(>O(BQ9h z%PF$piq^t-I#?(;6JLGewv1WBdzgg7DjR=w`K+95OL=hrtlYUR@Nv*egq!P^RA8H! z7lFKI_OD9|O}W_LWyf~1@n&^KjP2C-pT!bs|1t2EddKdcrMysF4|?d8-Y8TyWpO(f z8?y)xP+G=sBJMC8B7BbDPevP;@w}0*%H}BZX%>0pLnN?Y9T&ymZL*38W~25E&zNg; zt6y0qL17ZDKCs$O_+<~r8d$l)qw>MTXB>s~}2>m(?I}>oI{MS@BZ$2n)-`GfFn7 zz_T7xO z3sX`VZ!B$a5J1qP03xx7nvnBe>v_bWTLRjX4$UoRARJ{2t>dK;j}8f>}u@5ursxO%XzaN7fe*9bd0D&R|$21v~-O-zH&alG3lstaXWXk5UF&H6i z^*Du>p5JDKj{$PTR^TAwgikp;s};M4bDnLfs&M7=F9J4c&AFa3(ZfVM2zmR>1*VgC zOx>kh5z5utD6g2wWvibGAE4`*wptk3|Y@$Zo_2VEF!IzxX_(wR?(W3@o ziGg0xI);pf%~8SkTim)ypr?8)uqi6sqybjEK>EEE_@@I+_0Gb-md}N8=kn9#5 zH%C48Bsj30qgGe1^0bIk#vqA1V}v4sjd8eSW{;ufhx$DNeV{w`=Od-jewl-=QZ zxqWM0?%z8v+mMQC1mC6W(1SeiJ1*U4r~~VyG$LUjGv*Sl>R=vaPhB-l>1o5Ag9SOShyVNa+2qts-SfZ z%yUs=GYD@xvscnH%t4#+nZF)nv<$fx>0jj)^)k+Y7B?wgv;#g?HvzB0r^c8umPR(TcKyU|^yq(R)$^wB5+Csn0h}&lL{3-3sNd z!?jM)++d;m$o*s;LoD>$&)8)N=r&^FvWTDC;lu|)#DNrGzJPG!hcr<$q>R9Q*ytDLDdL^jX{NOYbp{_LMf3ylxls;e3F_I%>~VNEIaL zL{oi6*V4e1pAT@eShFS?+iVtpNQWW>O8;i+u&Sm(s6&c>L;6y;YEm&Big+npr_^&= zJrC^4GUAU2Z|}-PAF#q8pq=5JaWl|QSncREq4)%dW9^Oz!ohnq9|}Y1Vj@i`b+#&V=GLiwl)AJihuMR z1JO}*#n}QTCvjX!zl162xb%TXk!WN%II+k9g+C2hkMtvmG$$UW?Y;NKLl(-EK4Ivn z+)U;-LX+gg4z)!og$fVwOdBh2i@w)5TktNhX>Of;o8BY77NV6#mW;3L;})sNnr?gG z!}TM`@}P8*8gF#A#hkDUp&hm+o*mF%whJ2=; zJB_FQDsvHQVg!8puQllFp%?peFb;+7xZ0cmp*JGs8ztGrF7wi?z2BEK8Gy_yVsqc)+l>f9NJY z(^ts#+h&Jx2Lh~A$k6K-9&b5KHxjqRN@wGm7BKZ&(2Ubp17#5RLFpTp-xDX8$$d7z zr$_m7@x8S%p-2qGeuQ7MXI?=C+=~c%cn>k2_t2hkM!kC8wDU|f@p^_3$iy-_RhGd1 znD)vw&QxqSrZvmxC=HI!i74_JbcVyMUb8%v;B^F+dxs-n50hn#T{!3VD=16_@7WnK zJVu@X@LBt}FIN}O%I)(9Ed`*mN;-#me1B|-yUh^5KTQ7z3H3baBz{8T^;e7x{I0(^nLZ`(Wy6<@}4 zE+2DhLcHoj^;>HxJTv%)2cDA&3Y&=6gwIRc0^WkAkMrBmI^@c~be{+ZQi`o`*6Sc3zCh>(KY)c_T_0iYdUr z0^Tsn%E@%~y?DtB+}hk*yePi9%H|W<=R%Kb^=$(@3ek9gYCxaX5FSL!duf{ZNmkai zt6C>GD0pZjkG8SXrK~obS_pDkiYp1}q~OqI+8BxGDF>BX(0e@%c>MryK##w{^Z+-G z2L+Ac0=2c~5F&~gyznq}XRjh<81y9Z$MMBynZP~@+?OG*kq|yrMoh^RLho{I4(=`* z+-)cHOjG;IU@dpUr^ef=;@{7mBN(*%2CEq=p1nHTZ&i9w`jW ze9(rBX(iiTw2Hqr6cM=4e++L}0Zm zZ#do&WZayI5OB{MXal(?=0*WeSyz7T)urE8O3R#}f$JrLKG9y|K@hZcor#I2Y#lX1 z5PAQ2hR4wtkw|!7Hn{qnBzld-!7cn@wkNq`O6Q6!Y91H4{M2j^xVn5^?woDQ!-sdn z)ghsI*AZlqo_ocL@HoRSX9Vfd+RX|4-TF?nIo0n-5T2_4SuJy8KSpsf%{$I3RuJyW z3j)qH1$-DY$a_=XG|~srF%C*5K|C|Xh2nv*?h_zGI+ZJr!kuItlLYz$!xbU{$C9V>Yj5^V=Vff_B0fpYu1S6xqI^D*;z6*sI{G{tT!b!CR=&iajd42u_&&BJN#LQla8P zU?;K)y%z%@?GstU76X7iO_e|1&^6%3_ws&@@a%XlmLn;#twOZXX7R?wJt`YiluaVL z*Y>wHcmi#1e;`L?#9qTv*&rRDJd=z;WvZT&v{7smGpi`sv<2U&C z(lLzdWup!AW04Mod-Mzfh6Z_B@BoIu~or&ap5Slx*;71*dBU}+_ z+Cx+513?x+T<}?3x2UymMFi}H`#!@{$|wjZIdGg533N$YgySBx8z06j&oSQ8eEocf zLEqAEM6qa`;Rw$-yd?s(?ls}DeLN8BP~u#C3<6Z_0t3$l%amF{_$@MY!~hCYVRTRw z2!b2sG{;?G77JADdF3aL&lI#MaLai7UE=z0$I46EQ7j>hJ4ur#VKCn9H#K0qu9m|$rFKP6UgaWX_=xkWpGv_uLhZp z5MJ>+V`D|&rstbYH2^fzH7OzZ>H>7)ctITpjML68z9&AGSmT7^GH)hh({*V5bJS=P z>?1HdQfeA^&QYHgKRg_O{b|7}thORv{onK@sAdt6!^nXl20VgJ9$&Zv@RAs?>tw}7 z1Ta~mOQt+NEImlVpdcae?}spfS2qQ<%px*PfU||3?Pc(dLv=^A*Cb`%!vaRGQ;NtZ zRbhv2?{G$%1zyu-fdB_15e;8#7Ljl)f}ErXdNN^IQn^?Y_ERVz4_^bJ7$P)c6cAT7 zmKd0i1OGYLfe@F0u)#&H7ADJ$*hTY&LwlxX0V~4bY7py^)#B(g*CWnBtQI^kYRm&B z3iNTlP;rOmSX$bIr$T80%GUbuOh-9qLXtK>qnsQCn`hQum;_)gQzkfu5I*AHC0VV~ zrqQrN{@rC|0{<2ru`*u!+c5vXPHuk&lO)2py63ug4N-wl*2{2dv{wNJRr|HQvlFUVah(9 zJ@R7ZrUh-Uocg=+GGIIf`|I@`5Ga2l3gLQ|8_H+?p7uMZFpD2C{*H#XwD>SUZX_l{ zfH%%y%$Cte#vxu<=B6EskTB4DB*V*7-*%-*UJ}n=J`Tbh%()X{oxp1I(u645kBcNo z?c&%qyOW!Q;>k3Xa1`u?4RLQx32N=)N_o{l*MA*1><8xsE?$^H5OqA5$RD8x{iXsc z$bjAC65cIv3e4{vN=trc8yx~1S{Lxz)^X(p?AX3r%1&-ICBO;{L^4l|&qZRn5KMaB zxB_+%g@}3C)O+|O8ZVDGI3t(a7p`{uw^ib&IX-##5=9!LDDxRXO+qKQN%s-1;#jH& z2^k_EeF!a!P7^h7Q?jjx5&e7MgmY`-)Tr&@o5Qqraiqali>`xdw4~;4UpOm+b<|AK zz|n;!TKA{!fXl(txx;hazUmqYNSj@z`E-j;G}YYB3-HSbU0&yS?Yc^a?bm>kcw=}$ z!k%NFct-p`bL+vNc(Vst#ZA%Tt;&9L!F2aRjn?T{Dk8UFHsT?G^B0(y*8;g)vAo21Gy0;jB~`L3I9ydnMu8h0F;zk* zb}@VC5|{pGHdB>0SRf?x}&rT6{#p117{BYN#`adYHn zG!}O3)(i)1aTOxc&YA5s+7G-h-LV(A$zJg(*AP|=K%K#q6*sf~OO#z{m);wbfOJaR zpb+>;`+oTLRa}KgSFDENGhSB~_#^(v3+!^))WAT>-ZzUEf5QjPEFVZ;_;;qwBNaR=7$a!KHYwOA6DL2U+(wD**OarIf3(UR{;DcS@--0QrP#np2yxVzr?a zHhY#BJUf~l|DN+!8Cj5z6-=iDducD@71I6v31+@Hrp&EfRyVFqHvc7kEV2GCX(OwH zN;Xq!8lED2Z3!ur#G;)n|&mXywYrNd=DmaoJ}tQqNB z;1}ZOcv-`*3Gu0(H?}~}6qHY5=h%C``k-w^oMU@Xd2nD9gr2r>@#dim^5*#?V`}4D zm#P3TOM3lgQ-cOn<_nky%&qHOPZ9(sfq)P=oyIU&WRo$NYMlYm zoc2htI@k^>6pry8m}*}R{PZ~dc=4bgVzg8FMk*u-IF8p2ZkTrv(0b(!jI($weukzn(~f$c19SEzi?ypd(|@ta&O8!tS8wysJbXA{PhJw zTrz$HNpgWt@`X2CMs=DHFV_O_ZY5gyo4~?WLdgRQN(i@BO-Yt9&ub3KL`+p&!wL&z zrlyLn1868sQ3Cr}Vd2MuLHsyYDEb2ExHBkIap-xkK*gx<|9% z=$V5cz7?Ns30I+2(U=(tQYrYeMmA?&rncEUY%a@YvoCk=tjfK+wExthwJ{8M&$@^4 zT$xi4OqD5GdCa$wwkoZkp@rEq#PQhIr%~9?$`mgWg&Q@ST261y|Dv zat92Ts^o_;S5E{U519ZG{#`Wzz)ymaAfpjN%H6pgTyw1g`sjQ}YslMK&|t*JWYH(o z9|Zl%b5(fpy-oUFMc8D4^0TPH6m?V_L>659-8`C?L4LK;!)?zB5W7}`vXan?xGo+i z+TK`&x`JO?e+0l*mqX_|S%>P-^OPp3-cO84a^^&tEAbvGtdq2RI(+JnvH*xROf5Ys z891VC69!F!Y!K9Asab#~D*+ai(My-yeF6-w8}$J3^5GQ*QpHjMnr$H6$Plbc4;?n? zm_pjXI21=jSfGxmSio+8I)G;&v$TyE4Tr;3nXbET^^$ZZ_!I7AA*2Kp&0&QN+?DS3jyi}03oQR^0X|h) z7XiCZU*fIHK!h6OEN48d8^4#{P=-Yupl!0N90rt=wNQaYS`)N165MdDI2M2mhmHno zL$;w6lVD#hvhNR?K#$S!i8VUrfe*2zjw+Weo1T#x6xf zA8pyd6M6yVs4ks-VU^Uv;9onTo*!Zr6E=R-gOoi9V2vsFpt+456bX1b*9#;hwL?wotS7bMWco>zgNSKjE(vKf&D&#sLRvPFPyxlzHXv*tQO?cgYyuxQdz$}%lagPFT%S?&n zn0Etci~>nz!opJX(m+r^Yx@?XL}?x1N8%4mxv8)hK0>YM$d8GzMy2US!C=~5D-iD{ zc)sU(iE<s#Xi%qsDc8FINbhz zcW?r*;d9_MB-kMGNK6OmBlfIqJQk;(<@XxT6349@3g|*1d(-X!%s>l(!8idr<(0 zHq@9abx>4oh7rmU64Rb^Lrfv!31&DP3YmD{XFM2D$aCza`>8;iDARAHzYLl4*DphJ zK4`Mn9ESR$gu*Cl?3zgqGdyN%QU4|e8CSWuN79RI6xs%=7}`aRz#3UjexD%M$`ne0E&vaCN{Lb zAew%hdkemqFk8?{n4VB1H+F2h_0|Lh7Py+8!uyHi+`7J_hL{C+bOoL(PFo9mm~e^^ zB_bL%-)zn$r*_gC!lnUGkv%Pqo63!LK z&>21=1;_Y&O&`5Vyo^~=ofNFIw%zKnMSzE?epHnZ3cN5Y!l8!jgR3<)JB=u%8NbR; z+UNC4Ox|p1fFx*~C`|;N(LZA}jc7LRgc)PuR_sondhFCQ&z5n!S!$|_Hg&l_D~wuq zb{J^vHrd|u2gL7s1pv9!8Y4?%sc$I1x6Y9}kShwpG?MawQUGFvvG`%wDiuSHQd};S>Y)-b|Z`)rnevfoCtbjFclc3Fqq;QkG-? zCRE#h(+}Otb`G!&2Xf!$wTomi5;W%Szt@t)KH}7Peu|crDSDwgrJoaC3EQY_0{B&F zkJ@1jFGiaNRTJ1!W){jY&?AfpPm)dWY6eI#h>HbQ)w>GD*$fDSo!{+2x&J0E@H0z? z1}-lJ;o94C$*Q2;;mK^QP0F=3`EXOcPgvzZe3ik|Ok3g0U~m(8LPQS9_2#l2N%XfS zV3RwVQr-YBiO`Q_@3NtpkgcptHc|zmxwI z5#l%&9*#ygjdRHgovm$cgJTltBupy^$uDvLMl%#Y8_`s>zW49L!GLd)meQ%1AOWtt zf{23BplcUA8xXljJGv2v!t50C)Ehb7(4!?hwmW*?^)S%r%eebunnBcl%6R22jxDvp zt#0G0<&r4jHcJ*^f-6!4b#ICEF80wHF;W1`YxWIp$5>}Fi^-^NtdH7r?|Fd}@K04q z(cL*@5T1A$a1N4bBsa zRPA^3`svRCfZ2^dzSq0%{7ll?2qP4gP4*q)fvos-vElJvlrS#vU%cyRid-Y=j#(21 zfcNLR-N9nmvSQJWcJ;8JpUry0YoVkYT;B`>Q@&k2Q)LIt1+}O5^);4^kWhLqx$J2- zS4}E2)qFOpU@9>rh)G(NHJ@3sw6GF__f5-00As9<@NGV{;T-Xnqevb@vWXa9BRM9- z&!8mNdZO>_uE6_Yy|-QoRq!|LlG>VTN{v+uEJjeM=}65Q)=E_*qwdPKAdfrqdN9wS z<|qS<5DifVV5F0vDgmEh&$DZ;gr%bMD=LIdDZ6K7zk6ElJ-k&O-n~`tJeDixkTp+J zVi{T7TdTcu@&JR$U|U`?v`%Nos(ZubpJ4;kNlXcgFL*h znLx7LkV6R;JO^JRsY6Tl&|L4NN(I_X^1jSZgicOr=0AR zu}Mts65F17h~RY&ZBWkuTk%Ec1`k)QI6D8`dFY?Sy~R({_UiL(46!c)6fytk8U#X$ zP-Z^rv+75-)&vAaU`CoW|GExOqR zp&`^XOD<@!G^H3@rSM)X3cVigurw3Q#iIAXgsbqxr&r|`2=HZEI^R~Srn$EaxJtl#g;6hEa3!cQl zQH_J`LlXK)8CtCyf@R6oPTT;=V&AHR1h1}ljDXuYZ-+#3HA}1nIXE%yL)~8W{4-!1 zE<^f*Y9&7TnhKBi>(1yhUAL)w+V0&qM-@?`)DYr3imjlOgo9=(!(Z2{N#+~!R%la_ zI1N?(z<@&<4Qo)hSyS%7{x$`UPuHbcHrn>0{i#Y#=P7t7haFviIb42J%KmA2?f&iZ z@Xl?859o=zENH6j;t9_LBMt=C}a92(}8-4Hlor2r( zJcH+d<`f~b!b9M7aXc~Bz?6|8&M}*_`{RrlBCTagjWu_+UwVzvB+m}3WtgTj5_6+Ai9gcF5_ zU{50P&|+Cf8W0b!<{?{+U+SHj?=@W~HTK9qyB5$!$k)cICoayR0$We4dQ0ipS6zF_^Gm;PToT zRuu^yXrIv%pn|I{U9U+Wot>U>Q8=lPhKL)49}o(N=)%DkqPm9&;0g;Lp_LRzwikeB z01IrU_k=kpZ2W?m9A-=iMXxsq8RI1c3k5|Jgw+iVn3YN+=?<5V4BO_n7skb6H>gHk zH46P6Q(WivU?u#XdA4@Mr?`?9;_=U10y-)!bAgfdPcP>N+865G|j zYCoc^;-HeET-cBunePy?1PBZjp=^e;oKc2FvxM^k8-Z>tgSsU)1+w#8;a1t@#_ow) zwgb98K>~SW%0+2{LIW~=)f(U6F3Ti=Ng>dlf%A%N3yymd3 zN-NrT?Hj!oBg_h0{i*`MUH_u_ddrXwMFn70)4TxIrCdG#u$&%#UfzEF&GPyy_jPSMH_fpBUsRxs^B%Q>G;FFLM@J^!N9B1G zZm(1D`xkBNWtZ!YaimPZcNrY!1oP3@u#fEdXnd2(4|=1tQ__}ICATWW)sV+{BD6)v zDi@C0*U0{-1LgmuG%aKn!XVn%c9=7MFYLY29p$+U0&zTYpITTW%oOIL&&Qy@0qz#F z#>VIQg^XTFvgp|{x<;RakPrNs$PE#8)OXLFn4H3x9t8Jhq!b#ln#Z@+pxh`l z9(RNnn&%v*?ACq3b5uh>k6&n8tJ&7N*Es;(^-2U}<&e$7ZL~FQN-(E2w5bOhErmU7NAsUz zYOYg;#DH35q`}B;5@4o~LLpECbl}|MdMMWCF&WD%8W^XE6QNk#j9pVr{uiN&JH^a1 zgS{ng>teZX7W!r_1%ady7C|@@d%YKLvMHyhC*{`ZY1wW! z?Y?3Cce1VT*UckfwV|_8qsL2j0HGgpXK*XRY89Y)eXBJ_8DF;Yh~)}cV1>B^la$aF zMA&7|n;S5iE)OnpmR@-5!Q)T=8lJs$=*HAYsIkS+Bj;UaRX z0S-_EZH=`+$`fqc?L`bcW!sMHno`T{z!rDts-2T&apChJMv2CJwr@DiX7f0aDAZg} zynzm@a#gJ_tlh0l>+b4VIon*6U-;%1%G+-~)Ef)&3xCx_n17(SF+rwpEK_8Xf z*w!(;Mr;?ybKQ16&1K5ivUI*nVI0?Rl%9FIy*a6Sj*VgOAV0?9kt2xE#8CilUXbnsFO;|Q0+*PEh@#6EHQ8w8Svn72RXjC7_z!uF7u1%}AfB`^lQ_h5YtzgvFD~#ZG z;ltuRB-MoRE^rz#JRInTBX!_)suD@G%Ln{k1wV|EK7t8aG`xm1_A|%m#1gF>{r3oK z`db)YP5UIdV8Qih1dDFG+=VEqA}IZuv1@HQLI^^p*2XYbo`mcuopS~gAs7L1t5uNi z#)@|V3LuI!^{5Aeq3zLMqS20?4Niv_y^;HtTQ*IlsN?@Ik2rFy$8o8}_FE33mr*{*iwWV0*V zlNvB+SGJo~xqZGVch0uu?)iDSd+%1ccjvs^y?d+Nzk8?LyK}ePy>nh}-8w60XQ$=t z>{hvRe%^lHoUF^qrj(PDQcky}Y%3Yq&@B_ms3ZS2mK8|%qzLf!XLFqeU}akcZgnpy|pXgrB4x(9&wj{O?cJ9UChRVu!N<cy6V~Gh@ zAHZjXR}bOpp7Hv|dZo%)=gL8`}d(8OnNKoNSs*)eijW1iegU{{( zjbo~J8+XL8!Q%IV79v$Zph|FhWg@nregq)Y%cg6;v-?sS5nk>FJ3xgEq30yI>+LwR z=@Rb;rgaj5epGL1K|wE$G$ZI!!gy@cwc`$ZKUNXalvxUJ!}W>8ZbTfH5aOxt)gV`~&55B0foCFK7QrBAE;Tp=Kse$Ez?%~Au3h~m7k`Xen<=Mq7@4lOBW&G1 zrT`Sg%v4uzzN?=i5v3-a{-(N=5|dMf{%ZAKt#)Ozz9?6_XXWDg)Aqdm+h3LKYF}=j zos_$`Ps@XQ=jF9WuawtceN;a8`h)WNYp;|?uihySAC~gqPAPY8mvVlqlM z@&|}3v$p5x+^D~)cb($*QzZCLDKMmr6!};`gJ%@@rr;a-u54^s|MJe|1yBC=_}u~u zjn}i^r&@Qge|vsj@MnKbQ~R043|3kYG&V?xK;0RnkXFa>h#?T>p2-vKCnFZi9s=p9 z8No@a@2Z}zMbZr`YzOmDr9AhLy>E1h(M5}E#FwdrCl@O;eIS`?Bw%9JGf@WP?>N|< zllC}Rv1B?CxTkiJ+dI5c4cX)Lt)Hhp6x7Hjdf`h))FzOabg=$<*4 zLx8+Eh9tI^UQy@Zwi)kEfA=_f6|VH)jxZgRT_aI`mE%WYd$J61er|7zB5ObI`PpCx z(;x+rU4L-!aleUyR<6X=(a3c@lhL=R$wEf5Meh~2iDo6?_>C_AG9N%3U{IOR#^8hp zZG-YRzKL#8s0sdEf-vypRAK3~H4zJXa5Q&lSZq-&s^$i=0H}2`7P+s|f<*O%z6m~> zf0!9ow|>(?m+wo`iFxkG3FZTxng~7~3aS@X&6tcxz?U614JW}amGZ3$ff&&pPlqC_ z{-xD|3`1q1jb0-7n)XBYxF0EbwA?~zSL zC{#Jb(L{HWzcvz4cCFQD={&|Jcfv(&iu1+S61bge#g#MY849|GEuIeQ=EsVN`nRQP zvHbKj3%mbh`OOW<8s&~F)9(pqxPWH@9}DM#^^EW*B60h##VXh*DIqypx~#wc1f(lW zn|8`;+gz7zEhR{s3F7RJ#cgIxsN|+~M}&i_suC3Y;44vxtCS$4_&%GA=Zz5x~xTWbLO8tYnT_utTMMRm>pr)a9uO3Nwx?&uR0FE8CfS@F}SQuDX*6Z zi}C%OpxF(3fv4S)F~#vMQ7~M$%(b~hIS~b)xiMyQitx&m2&g2Og3CzxldbLOo$WrL z!H#b>vWC27VH^|WS=w=n*v-RUaB{=N&XC7+s^ejCQbIGs z9!1xFPDvi`N7G0^PB~zzYw)A0?P>ma?lbVs3M*}fX*0vd@kJ1`XD?R^f_BEd9AwNq z9_A$o*O0^_*9JXkK?s&L^q|*q%TKw!C21Pz6-fhP91$Z@^;jTJY+md|Klo_7lezD*AZHA5^o{ywwR8L%Khe59E7IY`FpAUS+tgVWAm-=~n88gn` z3M#iKWDcdGrIWNoi$`;D< zi^@EcvaGXq=o8^l=LR^H@v>#AQ1>u~Tmpk^9C#-f2@Tc8gF9aF-ZDW%re^MzM-I^l z9cjMJiWL}v2*NbRLE)POYmCz~1(WQvgU^E6xNg2z%mMy1Jx&6lhJf`Nf&{w58I8uF zzpA1!R0%MoHdTRx^MrwA7~zoBRc|B-EHk*PNTHFP5y4iP8)GJ=F-+-v)t64sw=h&1 z(A0e}N?3y#Tq=)vML1aQm)D?ud`)K60`XmxXV0FOtLIPJo&EJ{SI$qj<-y(4^6DE8 z%IlBbEU!LVmDgTbmp2}rmDgXpTOQuMT^_x1zr6P9qw?_Ks@y*%;XavEqbtot{BS5& z957LG%M)Kl`-txHvoc2FTDbJH<{DZ5iAz82anDA}KZud%h^<8?Sid3@oHFk z67K`Pk{@mVVN~Z#Ll&BmAW!NpoCM;qn_r+TZto19)F0_iUC!u!*si|jQ(geW2~e;w z!_mwkP@!yfF{H$CE$R+A$@cfy_4{R%7ZJ9X2*CfPl{r4*rq?pI*Lku{DpigfiwfqV zTTX;?#g-^LhJztIPPaW~hBN)zFsdW(qb-O-PjC=+*z>AJ7h0gv`lxy&0`ERsMA^{j zfyKv}8Zv#y7I2)PGQ$IT0pu;5bW3^)0bu3&pn?F6W|_etq5cwxoz~Z1!4#oU+inIV zBaR{qw$eO2z2&=oCY}J*kdnI;dT>QK!R*Q8A{*EvzI<2a98CVIJLT@ppF;thB(8s#J?5knSxSqb zNt`$cS}(fKCPQ@K5{aa%=LP(1V`XC@t&VZVaU(g6?s%B)8yzMGPZQT;biZ{PQy-fI ztdrB_x`ap=V{XO2L;V|S%Lj)nudm{)(_EI9k zfSc%Vr#83>+1Lkj;>OZ56TC@?=tNld)(v?tTG5UO=pGG%ZeTj(Cu;1~RVaZ`M9ivb zWcR^}lsc~k3C=R1Fw-xT&z@%|dVPt^XY^Iv!`PlEFAT03gRI^ciELndJR>7vuppp$ z>qRnw5GtX!9&+k9ZcRwP2+Xoy33EeBO<=2D4|Od2a@f^-{1@f&@@d)co|V<=s%*=y zoNagI^iCvDOxA?Se%#f zLD$)rUO}I=AM59=kz57FI}IU)l~&CZ04OY@V2lFinAbUgN2H8VJz+=ZCRxwv{XHc~ z_H>t8oBo=7-1pOO$PFJgdPq%Xxuy$_OdJc*zJ2*B7IVB~cF1|{d4WPW}cyE zcmtT!g`Of)qgNNtsk!@L$~%-&?DQf5MWxH3JMeZly{!rdLgQ0l_q;fD7VcY0mB`90 z(F6$c;%hi@rnVp9PQ5O@5h@J|sZnC-DvcvRdVkCAznLJB^xe>q-r;feg!CEA#zZON zEc0sc>*$#G4?XFd`uxflGx$n<05Zcnn6$(64RxG_Ho2C_a%KWPjh@Vr2 zPa1|5%f9TMhN`L-xw^qUEBlM5<*<8N4woO4!~Uak`@EF5UcX)5|MHvV>+gTLeC;b= zDDS=dpuG0ls+`}dE@Yc_AHN0NW9U#8cq;U)YTku#dSxRn2?~LGJ{K}i4pX2^ty-*6 zF&(Zy#I?(C*$5Neym*7fkz$7{@!7Ff=E%g2{*D$$Q&?y1OTfyC6PXbl3`0{xiVGv) zKRu6OUNb+-c%!s#pdwRk0L&Zy z)7~@vcJndoi6h>2{S4`q?7>PeWDWM5Ma#oT+1uH32>2EF1QZzYI;_I2Ym*d=^*(-s z3b@8MdTqe)JhhX)M3^%7ePY>sAZ6^Gu5s|^LPIh3P$S@AF>W#kuVYPjoA495$C1P5 zYq5l{aXxgtl;jsSG_)JB^sZ$Dlc43YHtd~;@hg1VsvL(I%=Cr6!^{ejDN7BI2Ok%X z9DF04V?%^9q#T?=!S)xyb4Pw3Y}l0jZ2J{s9>_jeRe*>x8d8t%>z#1rapD06oT69L zq@Kv*nUbu=^rE@aZPmILNKS1dlPpY}$<6wZIj*Y$fEY9pWNWE|txlQi8X`arjaZT# zaSe!dz;p;VEt@7XW5m#Ldm>!Z3s*;uh6%ZHhuH3E`wb-<#G+`rgW$%j+jLx&&m|hM%b!SqFK=Tduv&-?@hxGiCfrUZLyZyc@N2q5o#=i)U0EZ)uIpNPn$sK-g$l62=> zgytqhBkTY^ZN!WyYfOOp-R4kT%#0{eE_Z+@coyI|)43-5SNDVntD?~3)Qau~pi@S$ z8(mXU@ptY%qK{sT46NV|X)8zY2p8`@sBsE{fUrbK=iUzwkYq8zJ9LAZQF%6c4h#qd zxl~iTDr)HlWDV9=T427izbuy*&&t#1AC~7&KP-pK=gq?Z*5@CUuf6xR^8QyoSHAqt zo$}7-x8?O$&dY{r{!+q&aX_AW@!nY6ej*L{+SMdD_4>V-3A%Bd*R?oD zJdz31*|@G#uG7Xy*qN$3B_P?p>g)Qsj?cmvCd>B1RGAf~Bf;lADR?1Md~`T$07Jx8 z$0!6oslD-Wlo77{B*${h`|K>>UU|{6jM|xk*D-yQoJpxMD~)fo9(fh;s*1-Jm8g_C zKoB|_t>FG~GRMxRW}ran=PP`h&65Hh&sgn~_NNp-w3fgZp<+QZTS0~~<%57DjCc?D zWmBpc?r`2!yf*5kfks0JDDAw7Rmh)EP^tlrzYZRZwzeJ)nu%FF?jVihI9JlM+OJ&q?Dw*; z%DAm_Utur1C@m7@&``eVV<9Nacr9d{HRNSHQ*MFoA2)SQr%qPN@M%W>iLk zZhV(Aw2I7~QN!1PLxaMSpKKH!{A)xUIB)8gHHL{Ih>$2mzgSo@hB{{)?RSF{9^Q;F zEM0>s&BwIRCu48VqM!lML={PQhr5U6s6Wr-g6kFB5x0ZHb#^|>4Ex>qY5@P}(u?ot zcgGvx>Z<_Z-Ji@8r{(+^nxzuS+`?6^P{OFsDi>Kw;lMl-CCqHSH{@bVP^6=hidF$PW z<=wYmE$@8cetGAM56hRn@VWAZw;z?-zOb}hh>0sV_uYKE305vIwID;S43Z2Y@ok2( zRDgY%0`4(_-x6VV)W>zlGxvAwF_8#upr@(KyG_TUX zwld8t@@s>=eJ}qb&%&$$FjBA}BfzU?H}R>(6{){){)NpV?h6wiV@ z1VXvV8a+I`LBl{=g?LRL4J}zcuUwJubPBmxnAbWu*c5sh~99&Di z?kFCe+On*N^=gJMKWN$?+5oq&DjjWCl{y{p_hqYsf_zi2VQOS=i|Q}Tdvx#9PIOdK zkKU+t9))`NEz@dYCIJMb<1GOi^^IuWY;yuY;fjKeT$CArh{f$iM+X~Gg>Gm!)yCmZ zj9@y$Y|L33bXFpGHGIjQ1(IMn8%)G=5z*`3k-P7<)oZg=ZV=%D8&g;I0j3olTF-G=nx?kqJ4v zEcYEfKeV?-L{{ptZkBeOl${?H^x;ZM%a$PsNV<`@8Nupjrz&c~t#8|-<2|Bqg4Ye6 zJTA+2KsZ2%8xq@YHw`TR+|-yVXyyYPpPzJ`M#dC+#>d?4yn={o$%y zUS5{xR~Kd1?({z|=i6O*?X{Eg>cf-rh0ot9UwP+qJHDBf$H+565M<9Q_@XjFrG3am1O0ao zoak=vnsT`ce9t0#noVN1B62zYo3h`NNNZ_k> zNGIES%`ob(7KxQv;}G#!6gHh83GqzenepZ5F=&6WXy&dy;`c#{0lz&B@$3~tDx-li z0QVDQUbFcmYvFiIqYLgi$S9^L@Zxim2X)>|%Q`^_`6ufS$6-N%K~@CWHlGBv$EmtW zIiWze-LCV)RB;4B?fWM0_OyI!>AHgDlCP48(Az$)f;0#g z`de60(`eDaB*HgMbid5yi3frRgM)~747CZG=;FfT9=OfSIURb9RCIa4c`h%RATbnV zl6A@Il8ZD)xNI<@fLHC#4y5R4{RYnrY{LbQlYVOia7{4=p90+b6p*H5ZGtGIjl7OE zV~J&hgyCs7z0rPKVgXU)<^J}UlN2oY>(Z^h%l{O3b*Kv$s`P83GqD~gDaZuc&Du#Q7Q+b0gsZAcUCs`+HhVkbe&?|a-Ho;*`t8+=I(-f$>j(ku21$lmltAYaLCIlZ$JLS_--5g{8aSJ{;k0o%L z^`3F>4~xE^rR5)kpgh;U_Y$#tqU~=(wCR`-fAI%hSps`ptGI4izle9P1E(bx=3~xT zrvM%NJ=MqDc&Feo_dd>HN}1|t&^7qDo7lJ4ZDaa7pi^y=a}<`Q=$0%gmO?LHv(?`@ z?w0T&V;&?L0)2pM6_iKg1|yN)_2>W9zm2C{a1}t^#OoIlbZR0hc2u0PcP2KZDJFlxCK9@d$I4F>C;HsBbR z@$vn4q9DH zDF{rkpkmMvRbe`yQQ)xQWsO53xKqLC%yOcnJD~>F@ey zg}$$CjTu{K&uqetdDDmx#b|zrv&(Q9vb~Xjz*e$>&Z%EWuR*W7R;}mUb#(Pk$Dyn@`*N~Al=Wd(t}Z_+PaglEJpbs&qOOONgi+$BAuc^O$;X6?G_SS-N7#7#dFScyf~6L);c{dnU+_m`eN(pCet2ZEL?t zTgM2$@$ZomcvQ0ew&c6HHl>XWZd1(pNFk7&f%ts%d)7|&_vlQ`;l7up@X}o_#P%r2M1!p}|?BWE{*N;C^FXNrRKgf2F>|JwkW= zNp;?goZW+h;2A6&%j_({Jic{~YLt^e%T8nKG1(jizg2iB-^G)|JMf$Vhx!crNym>M zWh*uZy;F_=c|eB02;+6Z+93Zd*EiaDDGxJobsAS`N5jQ<03t}hIj``oyl7PrU`&Sk zZ8HK%pmQ)HBA*{k`G@Sx!+h<`*h+Lt1i2#0K%;MDF9+{X@u+CLs=!Hwvf^dio?fB> z3xogZ*kKu3Yy`IW%eY1MQ}#E+e3IB;!pqBEp*UW9I>!nT^QyLW-*}`T#c87h)?d~Tk~7O5l`Tz?@ck&M zh&yV|J&^2zn~=xr#_FeJ+800}@Qdvy3!=iiQM3k&xRntDH>zX9C5^8e?=`eo#u%*t zhO|<6-(N%?53`=3m}7?eXXEjXwTbftf6l^+2RGJ6Twz*VY&S3vm`ZEFsKM@c(=b<6 zxH5y=IO50!o2p|@)HBAnVeWh4QNguk9RWEKLI^4_m}vwZU_56b&repudr@9pxXcV8*5ol)SIi|XQkbycn|=v3Fh zfJPk1$}dwT#%u4rKXlPY_m5^~J$E!aa4z3uL)-`FC^DDhfqXJ$B*bLzriAcFH7Kgp_1|pf;4);P?gdP;4%mQDSDXF^@)4+ixh1~mc@#hmr$0><3;w= zbHX8_lFjZtB-NsZ&eE~ur#u;L(CJYIIV1Ud}M4k>O zO091H0iuwDO$ZgYnJrEjsv8#}`M&?|NKLr-U57|u^wR4PKhy48G)ocywF6+D=ht^M zhmqAv+_1AYqJ`wxLi1Thd|MDTao6BzjwpzGhB<2hY0lWHVPN!x$&V3TxsYlG_=Pk% zFkGgOh+HCYY|L~#pdXnBYD1yjndx^03G$)K1)f$O2#Ap8%e@CR72R4=3P|t~uM-?? z&-_mn+5cz|!FzlW5VNgzNM7!7$&5(bTZ!1FrI)GcW_G1qU6jkKkILoqpOp3Ld3oi$ zlvm$8FYmqcpnUh+@0DNumG{fH-ajo5x70?x)Bo&wZG(ttMgHrJcr>crrOSzs1HpnP z+PIGpND^kue;3;5a8S;yO_ffu@);@DvF74;Qg`(I)OyX~Og9F3RzBTjv;(FXFM7!J z7F@SjA`nh_1kA1fb!nlqU>(V0ybPtl9N&}8d2}9*QJ`dfL?JyJ3(~+vyu?dZq$oR^ zZCB^MonN;bwdsFJ{$ARcX5Y&9YbKJn=XwV}j%ql|@*LBl}fJdwHp3&VOVC32%PX@VK?9UgjKfoizn8{XfCFjL0K{m(mH7p>d zxGxYi6R%ZxY2Egt3G&_mI+mTT=rT4kS3 zymkw#J)6D`B9My!jW=si1JX7UyRFNBMc6UKML=nrnwfcLk%Rzat&PC}5unQW$fcDg zTGLuYd6sn`Fi&zFZoi3OEE`rdV>PIl%vy+vtZBPWaX8AIZgfx8{f+MS$$r)7ts>k_ z5HGtIX~7n{Kp`NwjTmum4Ulin==dUs2Q9K*$TT4qg(D*&BV~%sSw=r1{w8o{X>R&C zc!orjBV9l_aTihxKb#-I#JmT+Yx|)bs#|ySCgH=vr$lf?%BQ+J`{bsMZ4#^~u7@B# zLIbks3}=`_!wt3&t^F2vA}9p}#AYRi<&5hhXG6Se+?6A{`cvmm^C68UEMB)Z^0OT| zR9a}jKe#Ig!Fy;|ajsV6D`0Mf;F$qY21D-p*q%U5JmHn`o-=-cPaeB)Qq~p2ob^tB z#iZ33xvBTM_Rq`i;={7P_(?fi{j9w6`8(ww{MvWR@BG%^E8qO;-E!wH!L|zfHDZ4y z1h?vnZTZ@OdUmWkykYYcCdj{6>yjXeg^aZq7SW@lC-j(}$(_vs9*F|flz_#vET6W5 z;~WWlnb1E{B+m&%84X(025cB*7=i8zUG{FBe*B9CqZ^W+gog89-FVWj7wob4eoE9NY8T}VJCODrBLmlro!ZW1IZdjsu>w3NwU79Us zmCTXi+W3Nb<)s}*ticJ%<{3^lbHc1ygElb( zy}^lYUYqrt_}j0}?qh4qRGAkRsI;Tow2#?Z&h(LLgHaF+Y5hczz`w`uhixUhpQ*$+2bFVCy#$p9^5@Gzy8Z# zF8}Bs{FCwv-#RaEy>X{Jx_hVGyG0phE=ws_yItArDMV*@mR)#*A7{a{H79Ju`3O^c4BV$+GNlYS2BsGDb6V;AX)R0W2J$F^ zCr963TiC$5q}4PFla3>wS@qVfeLMVD>1@+;()70%Oot+D47sSzl&B$?;C+eEVaV& zfAA15Aq1VEwVTyv#MFU4kv(F^ck!A9+% zt=0e*xG!N%`9JBFg!V;qD4K4~Mmcp@q+|*nLu86epl-FGk|tQRvvfC2wjl*Ksv6*ZS#PU0 z=dxTp`Dyv!@ej(a^|SKsTMx^3{^2*vcfRp@`Sv&7F5i6rweq>!Lh_f-TqO+yL}8xcnsc{ zGB_NATb7JrZe7DD7Xr(3zzav`zQ^mYIxJ-uP#}>ETmUn~+3kA3G#urmx7NBTf)JE4 z#DXK(BQGk~b3OFX_>tG{pW*1$=m9+bF?e8+(o+J|iLof~l`{V3k>PkS`%W907*hY`}}Us zZuGg)K!j!E`QbenfJWWi@)4aR(%6w{Vt|{Xsc)rXXgm06%AifutaJ5_& z2w+4NYkob>Dkrc^D)O81w2H<>!9>O-JfB;2i{U%ZJ^-LG{I)q^=m6~zX?18$G#>cA zxhAlC(Ll4*(q3_?ZYiQ&%zBZOShI|Wd154mlU)Jx-!(OJNG(_QvXT+9kp;$mC!L_I zHB!FB!N7G5)dYIhZDyRk%hii9FQ{1X2hfez&8e^BUSlf>p)oy%>}$-)>E95Z%!%9R zkqXbCg-wR(*ScwvO~Z89`>5we(7;_^BeKR+d4U)7oVx|=__*U<`* zYN9xIt1@On{ON9g?SW!YT$TORlXCI&aoJx!DYrJ4<;$NxE#LU^qw@EEtEQCrT?%i&o0U8vR$t!Fd&1oruXZ?>aW?TSJeV$*%MyR+}u>@#_|Hf$EQK~Tv8gH zgA|@q!p3m|$@KSd{GrVR_u}?(Ja|tn`V;(VDa%LGGlr{A)gBuQs>eV-JGaQ&m5;65 zGz?$lTx8FddCkPrG*_;3N~ErLXBX<(1OvT_=)Vd#vBOAmhE*+z&U?@3hIh+P=8?tc z8}S?XSr|^Ha5GVRpb$_zhU?RbSd(QjKdZ8W!HH-k@-^VCMU4m9N`QMeH(y|JjNj8{>CvD z25aoz1h^{-ESy^yq(_-6qUopODZLZpqPR)0LCPNi`@(8qRhp%4xZ!KGq8vQ&r0?n9 zx>;fBI$f6a{-W&nPfNM@c{$xbE_d(j%6GrdPgeJ0OOIX@#Rwu>P^>uI5BMgk!(1zmmtz~B#S-ToJ-%=qvifrh;kkFXhGLNj zDt~EV(iKwi!hjZhlA#t;dVi!9c#dw|gn&8n))<|^zm4S>JTSJ}t&XD09ZsI<|3z`t z%PL6CL@tAwF+Qo3PVOMvRkyj~V5D)gjE6Tq1;(R%3$%j*t)#97zV29<`n9iZjf8sk z>Kh9$lXzm8#h+lHv3^+oP&+s99{MK=_N=3jcsI2g#!DOZiG<$q>S9Pp<{>hkqa$EV zMkAnPHPb#@YQa6-n&$M9t-T%brSiA7TZPYd?_Kt!xFBL3@1>yoAvtFXXYev0(8|0a z*yDgAMV_OROG{Mbh3^yVzbUEu>oBo>&p*K^`E22JkxmZHa1W+~^x))m+^~L(`SkY8 z#|^1vyI$8gfMj{4NTER(0+6(TeVoS{j-fK0URyvD6>EaKOOJak)pU6EP}mL@*<0Re z(5ip}(?i_f%dt#@kn5d=p3!lX#jMTjAYg-Y_qc{NT-u$w0~6<`3!HSP?*F=wUV(y} zy3?}80E^*$Mg-FFO%Pna+5Pu;;1Q9^R&(RP*!6=$lWFk?v4p@JRp8f8d$=kB!9HXR z`-D(xL|d4*{FezwbITS&yV{V~i)d(jZIe4owd}>^ynea2yZg^ew^N=8+^v7YXFg_#e%n&h?8~+W_gn2s**`1Kp8QR@ zeDZ_x`PXih-};Sjl>h3tzh1ua)d%I(hj+?@^HNT^0mODfQ-vXr9KR6`Bb>C9@yVFB zxo@YwnHtN>E}sNrKLv+u9LN+LBP3y&w6vw)kK6F=W5yeBM=mc`aJ1KHtE2A=;1&hR z*xq&epIVD0>pmLi@-d;6IIExV7$38YJ2#K1m>5%QHv0Y;JakMQTbB{vhS8OdE&V!D zNG}+pP$)fw97qlLVu|Y`LYlaVnb>23s}lfOShdNb1-_Q`G~=n?Lj0!50MhU|;6Ke{ zuW?T*{~+rc*WVQOsw9|D2Fw-OLu>9E`5@-4Bo=U7-*t1mwjgssw$b@^JdN<6{@%U@ zTb0FT7&cz2x$AqwVe69vO%sa=xQTg?8WX7UZW^}%Bl5fXi;N>1jd<2-$XRd9D6?K| z+njfz1mG(sqq9md5dg9ai%E?guP5U+qmajSa@G`wwZj8}t~H<_DO;2$Z8sT2F_Q27ZL8HHQc8z1 zK0c%>SWMr5mdN;0%V1mwNN&Vz?lU1&_+bpPryI@OO9Z*K)+W-by>L+>4K}$8ENHVb z!B4|!>AcC3Io|M@HfoA_cKs!7==(Y5eWD67EkXno5ZyN>mdz0~6YOzg<2MsT0JU7c zQTWoYhY|;&J*vH?r#)jfV6+CRANPIsDQ?#IVl>sr7qC(Swd9)(Ff`g`9tG(mixAb86`&II z;Yzy!F<#P1_8M*L0YCPz*SnTgn_iV0hqBq!sJn-vU;RhF zRDSIjUn}4J<`>F0zWT7-)1ZF)=E}8M)jN4!N$cjAWbf$5>LwGWoio=jD!AW-(0z<> zH8qA$qRfqPBp}|@m}9@dLr#w8rsla+k@2GCm_8;IBsVxdSM!L+m!N?4N}oi2mpE7Ryqvk0uSSv-{SZNgtDu2LWLRAr_6%4e zpW9i@DhEEBWe<$qlb!V#rC;FY`Kzb}85i7ha~6FYc{VOl*5qBgyY>oK@?dqsdQeOd z>*AR@GbRF@nuKYdY069POt5Ux=p|-T%i=@^C>n|gm1r=X%T~im72an8^|8-q4jeOn zn75{5!ADBh)i`D4R3RB-Bul7|DH!7VcnG@p20WLCTa+h+Ul;yZxl>ly@%au@;~;=s zk^jkW%^jDcKLWq2wf(Xs3(+1`bEL_Ox-S)X_Ua!i@$w-@6 zndYO`QyN^Sox5&9LFwaUng*yn8Q-$@a9{L_jL9Cf66{J)2@d)_!U5I#H+S?Ux{Z#p z1^2eD?i8G~Parl(ure()yUxdk^gF|Hou>_5C$MPrwAV%RC;)+LJqrYY6ikE9>SIx1 z;|k!CKNkiAGfc$2nuAY(7!%hmc#y|^5pT4%WD6$ zy!mKbzW(L6%5VP4SIh7I_SehT-&wcocvpvgd3r^7=5$*<6$WZ-?0hl0I3BND7aw87 z`cFgow2b3rk9GRnDTaEs^-zkI3wXcn}YUtSKlh>OOIE*MTnW9Ev$2Z~`x%+XG<R7)^AJNQ^Ye-a;qOcq9tPenX0uEk;DvxnN3%nY}R@|FPEraM@Lx6m>F) zT*Rda#;5R+6Ehz5a4t3qLpV4ew4A0IS*P&=f)(y0;Gd!~lznK(l!waRaGDD>++igJ zFS$YyqM$KUH~FE}MuPl<0N=i=LEPkh-3OAtG!{{cwaf+necY$}{f@ivhpr>k+^Kc{)N?8Ih$i}28JKr9T?>JeJjbmK*GlN`Ttj2$n%2DqsMBg9$I~+;OZ$u8xTh~*kzL)8dSYow zm9|Ih?WJB0nJ3`Qm%ly2KjI(x8{b`9FudkiZnlrWc+J*5vPw(k=6O&N28oXH2aSg! zw_zoP*h~~EA5-ygV$NW0}?Re{nv1WJ759mSQ-m$<~-?cDJBE0fd34n9UDX(za>$BDu$0Kg< zH5jvagc$#%f#UUAC|qmY1H9xXzZb6wg*n8fFu1N<|ILurWUEacj|{aml&hWjby7a) z40tT$)neDriBC=7zp~WXGnPLy=Ezl;I!>N5l2Z&YZn%t}r~<}dPS5?d+&Vdl7e(&= zHbTi(K=KT~X(>7b%$UEXYyLVq3j)|0VOJm+zS{)i0V7()EC)Ejr$^Rw_)Vyig`g`W z6;W}Z0^EcF+3RL$dpQ`$>(h=~d$dx@`8(B>P%QiOWDClO_K4Q<~D@~(f& zeS6Kv%KMAPxF@Ar(?oi0W514x0*#R%5sGOhUx*^jci&)x{D>&uNReWSt*9)Dnq<$A z<63xzffqy54$d)Gq(tM>;r2#8HyaNViFyaH&0$}*tE$A=mCfO4`RK#HDZA%CEnj;3 zQTb=T_s`1j{MPH`D_=M-kM8gt|B63a9G9vn!3a;5p75putwnri%2v;0M*%Jqf-+&x z&iwjDnCj~=;h&_?f1R?J!CcTruT*GHkNPhA`)@PsM+yx2JKM`s3Z{=o`2TE`Ifd2K z{u?Ug1OAHdVoZQ+t*6#Ldp56l`xv}rkbPsJVAJ~Dlzj-4Cp1;Q8{?WfN8=@kU)U>8 zfrb>N7s)u*mm3f66E+e#T(YQ_Ikz86s)Roa|(^xK3b=3VqAiZ7kROAXuKZr zr`Es76mkW??twetTP?oMU1dBPCyiOy>SnQD_qfesM)>`U*KCPR;~;;k2SB6CuC03; zKUd1YL*rkv2kdGq#alAPLI!u_>zCo&mBJy#aUE^?j&YZb0@Fu@+^G05 zhCXJ#jpOSW*@Phymu~bv5T^j%#%hT}WGd~W_HPmyEgUy)psp=eUUCl6gg03Jxvk!vs3(r71hDx^Yy={_qQw-@V$XK!v-Jlr z9T`1%ors`n_H$Ekw6V$3cfDczVgD$AlW~eRR`C`9p|elHr$RNl}QqGd?Bc+1xV*c<$M#;CZ<@M(Dq+lHqCjJ1V_U*%#L= zzRwHX%?%lPl*V-fbf4dNdCAS^eNK2O%>BJ|pMP>fe}Y#(MP*767-{cPMn1zsso~~E z*W?&DzocCrnrea#vHu!_Y`!H(;^4n!Tzj*n~lYNANeAfJ6hnqovWwg!vEQfa*gu9&H8P^v4R4I?Zf%Wni%{JJL1zU zfS&p$&IqxRrrzVA5A1jUnO*)OUzHtVm+eR)obM%01rIs43$XP0kU-7?U*2 zdtr<5juHx|M>vQyO(n?9D4DBbK@}6sD2PiGOs;EI5VR1xCcxwQ)TqI3FbfMJ(S(5$ zZG%=3_v%RL`at;swo%QpRDJDGO`Xr1FF#n$}QSsALIz{pf z^84iX{D9Veg5_nyBx`@pN;{|QnXhvUoL}CWG^?x%e;hzJtLSC2;TT2mZf&cus#zhpw1HqBnGYhjD$`bO`jnCF}(kp{$f6OK@RgBjbzC!S4ujF1RYXZ+cr_hoB zeDYau_`ta;ZwCAha(L?b1>XAY2`dFi2ht5@vefy%|fVGoj7F(nw*0A$Y;Ut;E z#4Ce6Ua6s;cipy)qk$4ZjljsGW7?7klT+p6wgP1bYGhHNXXKh<_dn!$44fhJXT}IL zcJ3S1?1*bo?+!o3SWgj`jDg0WZ^sfVK`!Jip9ofJQC*&jDu=N(m(8R1Xut;ji=k!H zBxZjwJKlC6Bqz_NEDmw(;BaML0WVOp{o$9zyBfuBkzo7%W>+5Mewe7?UxXpkKHN5% zXwMB92~7L4BVOndCAcbja-K)vUG z`LyhJkITvKr{&EzPRj58*0;<5{`bFIzW$|Z@86fprY~5P+b7#jF%icc$Cpf&q9`m; zr~*OHJY42VhL_}br=VQe#^05(rv+NIBL1HGCce+;V%nGd{wWd`Mv;@Ml094MQSjL*ay_gT@c^uzKyusnFm|a<_Pp~ja>CpMY%6b!SGCnZ zFwK{%cVj}{a=xaQ-kN9WT;F>pKq~j$a?L{wu!~`V{4=rE4CrwaD`&vP0}k z6h7*z&U}rmv5W`Tk;ahm_x7Fk5oL`ugBd7d7Am<$XS7~lP%qVP9|*q_`jlXUWqDa^ zDtVhjEYhcA!`%M!GNi19=!{f$>AbQnMuD`TY2|%KW)PZCUSXef2^}&am>AIBZ(El& zB6U+3P~a``nx%7G8-VTG?&Vs<^eR5%P?T8)>nGlWH#_8lrDX&lFHKbB9N#$@+# z#zflSN>R~c9q(CU?$=r`8H;HMr-ZU;rAYRj^qC!!E^tUVD6@o4f}rAR=v4=w#>Mwx z!gxG*Sm>49@yb^GI6~Yjr34X)3zS*AM?^ycWw-<3#%x5djcYy5Birue$h}&r=GBCL z{4ID0Xv8O!H`&~gu@~fB=e^t2+$>YpSKLDojWtnNsA2%;iL&@=M!5ps3^)K~Dw-P< zH9&DQqEg4sGHo?VnOD#Cz6FONq+gc>Gn*jNZ1dagW|9&;p<P& zd8pIPnqSmnxz-hxVV@Ilj_m>dJAOkp+G?=kJYSi!Za<56~g zrtbB6%FY(WRwCk%ELPN3NO9ei224!bz5Vte@^z43sb$fjAasrQYI*3PgBAh{ za8odt`Mtp3QP`|O=_O=u8OCQhFX!FJMZwXh;r149Y>UPb4Tv~KQ%cB`P*#9@-lC$> zH0$u+0h>&t;>G2qN0B znt8cCSg2`A$Caq@nkK9fAqa!hw=<=kbPN$92Y25e?oPqj@cTHAmtnc+n3O2cynqLW zXD}mtBErlWOxlG0FynXEnzsvT1HY@53@o~Q$U?_s0bS|?;+Z5%xaL7ys&$gUgXy#; z;tk-p8B;IA^fI?ciaK=-q5|hzh1=^DRU#nb&ouKn{-v==JvV+^TTkq`t{lx({ANsC zv>*P1&hfTIaX1Uy&tW^=$obd;dPY+pUEPMei14YFSuATo2gSUvJ~nJ9Lg&n zCV8HIcuRTsxwALTSI7D!{F~rA+I#rk>UbVj_b2n47H?{r*CVwHw>hI3jRwH>H}JGe za9)=7yfY@D_eJ6fAg=Zj5IGu7a345$O^ysdPsW$LH?GShoAQ+RttFjWqg*M zITy$~8-dCqESzhQUhrf9g^UUBI40Q38i>9M{iJNre@X19ZMDYjgb~)r*r;)0q2Oqo z=@F0=Q#Z^PP;!KJed)D#ToVM(F_RP*-U}R~^Lc%-`sJ3FN7@cEJxw2;(a0=*!}2We z@esHXI=bL*2x;}8jkG$Vii-+@s6epCDI&;dSWtqEW-2NB=1L?^td51_K6P_Q8+joG zQCC!5J5z1JCWRBt|7GPCDmaE+O(AE!9mzE-l0=0;R73Q8io7Oxzqa*1l0iW$OFf8YQSlt9 z^`kIPz3EyV-@3FL;c#*#vi#kr_@&HjY_=E6KP!GRF}5jHAYSw0_*sj_FMklNQg3ax z+W0l8yfb~-+x+UYVI&MFH#BbXq<}Tl=ln$IdjlVL+wfcFjbc_S?jzqhnT#X6b889G zf7dr#8YH<#G|zsyEzpIgbi`Xxu{7bdU zeO}Q92WhKwf3XM+t%r~{FDtoqd|q=s@*FTl4a6$oF^|ld$5?-Cd>KJQ?Ylf5Ay7P| zQ`*)z*w`mL>^4kvc_u-ZHhc)GC;LE~^6qWXN}XBnEmG;gatg8RP>`j(otD*LGB4~A z2-NSRUQ_K|n{e$c5~*tkkbXM0*@WwW{}W%sn~E`D524?ikze|}Z|+kgBU~+QDY|y5relW-0Y_%GrexF3PNMQ-6=@%zb~o67i9ap!{tq$G~X> z=PAo|-!81<3>-}iIUe3GbA@igGX({Jj8@C@o9gq^QTqLX4E{~caE^zW@}!XZnUQCy zr^ZydS+4-ZPpDMBiFTzNK_57NQ{y+%&zLr-QQ616YVy4Z;$7CEI3%WxVD>cwC`Dt> z`37#n-BULKmEQNBPT5lDo+2_&>BG)C8d{cl4|)Dqt;)i4fEC@|`|s%!3m2ElKJb~d z`in%wJPpYwI8V+T#3>gw)=LCBUYYBJOPxiLLrs8oVJBz>)8k>g#r7b5}ndih*%!$Cbu`pvBu#Zcf`cW?gNULb}aC z*(Jgz2LV|Q*0KXNE_iU~O4R7#?+7?|AVF~v5kYJ-epB6dRLJ45jS`0-8&?L47llt& zu4BC$5l;_?LGDhtryZ3AbIK4YrqPE3EBB%XP2_MkSDE;?))NGZ-yZmI#`c0H(;*Wj zns7e~2&CrAZLtX0wTI_e|89p-5E_gR?_}YAjf{SL7oaoHREzc#k>>G?k5?unaD(4z zU*z5lbiBR7O3!2ckK{v5`yU}->MLg&L}KSvs{d)R9Rib}1U8Nqhz#eqt#1F@%|+QB zo|cb3{C+vxJTAZco8Kz`$A9td@=NbOD(7dVoVB}M>t@iHvT01ML$0j!-Vm`q!95rL zmy|iCe98LH)&ILP4fiE90?z?jNQZRq@5&?$r}paHS}et>FN5}fmdY`6&y)nqapm;8 zn-%^)9Yq8*q7M|mXtkHDMiMKlw~%J|nyi!JAqRYxGprenp%4OQ@KfQi#<>B-zzF`; zk}PtFy+>htIq#pshIx^Q6PKQUJGY*TJO;mJ!u3?&j(f%HP9mn&0FN=fWy&{I>+Xu~ z`Gi-y;9>G#)==mM!o}Bdc&4_S)ByG<)Z?@1;=&ZtH!ZM&Fwt_TM5r%iWAX2lp(cfj zPq!iOk1dg~Wph9+)g*#Y;q!RQTW>A&TG=Q-dBo{8wo%|VLL-qpjfjlK*y_2V+M$wd zlEHx1#w#IQjkbOhSp=|08MEY8jr%RAvK1+_)?E>ScopENAc&hAg^az$37Od6L5YRW zRhSO32#g^Bcyn}B(_k+vh9e}}Fh#L*5MhB@V4&kufrR%9Xl)y&2%2J5Fg3XB0d5t! zH7rYDYch}Dm%a><3ICL{C<+250&2MsB@Fg!`#2e&!~9YqkOS2k$B#gVJlN+!9r8lu zScNCnxw#V8_HPd}zZ6zc>FpHxp{=-PlGCDBgZAy`}z~G z*Csw0@Ch%W_hUo5oKgj&$w><@JtPd$Eo(yu`OnJ$mbZdR4UN^>`nM z+qVdYOm(PzQ3h0FpJkp=iUrn9i{FFeuis$$Wn%nn4E_2txlqlc08 zo391REg9{$c5IvyM7rO{D&>#95F{W)Z~++uI!vP;C#mu>Y2Sh$@&m0i zE$8KsF~cG$W{gi|+U~q|#E^)xpdUJ3-GCKt|F%Ivp$FXU^;pJh!T5z!GmPZ1$&v&9 z=vG|RPl?uOh_7D=QD{(M+pR`O&G*Ax^7EUS%c63vuAFF^H`@s-@%@Xj27Vp-@yu-> z?A2B<`KmST$2v88IYdLc{lE8m`4_+ci{c{uoiX@AV3yCf)FW!BDhH;TWYCiT3=@V znwfLv%gpI>`i#yr)!k}|>Xw=!TVitu1c4+#f@EO_3bik}MMlJ1?i_bp+}zyU?|m;K zaw(+a6f)kuetmayv!9upEnsgkg3T$a{WBV?fJMJC8f@^|t}JGxb-do}EFFKkIkcHK zgLrb|lV^q2PCiJq+8n=m#{R~y<5oJ3w%yGAy`9#XCxeA^jAuG0nC}^IzdjzOJ& zGa3J+nxzqKkq*nUYMNGTBAw+eerwHSBSIY}S&)RDa!uYB_2Usq-BAx^GG zLn_Ylvf_{Vbmq$rz2-#j)J~`KGQIth4Q37#!3VKnPzI33If;wgHGx44Fj_ z%_%3brCrkRb-P+-AQo|p4iME%7re)jn-goq$Cm4B@bTLrZEm&EYIs`Twh;0%Z)E|= zF6=L_g}^6*snIptuX5hIhKL3LUt$Ose6-96QwVE< z8Ucm%a#uOe2w>4I5){DWl^_WnAw?skGfG+v)2 zeHu~k+{p6|)G6McyXHLHPS-Y&i8_D*?MBmvJA1L4gf&%7m%b_ z3jpvWj7PADS~)!+DOfdE%6CjzFlI)dy+z9Zvv81_rYf|ZM#h^NdHs#I!FiCiz{Gj- zK`U_%Y(IJ%WzUi_z_B>g1tOD_JFVc&q_06FRFei>3Zk)Sn8k9NlSlmYx9umt)BU!6 zws*<(xM>YAhUn96s%<=FE>6E~{*n+7A;cEZ0hE6)Yljyx`!b_b3s;_vDM}=wwy|Q@ zopEMqlR*b6U(C!!&`ZEbY2Dy6)N$+;0mi%k<_nI^8Gqox7YR2XhJ0to9(qD})%?YK zJz-9i!yQeu_5G-D2QX0syuJ|oo6Pp~*rFpzXRoQyfzj+N#-mLm6AnPuDIQ}k;MR*%@^sJi*z7eoYYOB5qAr6L6C`a0c9#likh(`oaA&diQ{^^c?=CeUa zAhm(b9w1enpmD<&0yp*($E5CNI?l%RVN(_AaO1`l&svl4h#Eo%Z<3>l(dDgq^;5C}>_< z&gpl?AV@3J*=pxPkF9>kbbe;>}%yq$=fVO47F z@46)%ed^l}>wzr!+8a{O(Ir*qieC*)HCm@QPmB>Bt>S_W9P<_7zXkd{A|FL~1|u&L zc}BjgPkcf!fQ#p8c!07YGrkFwXP-vo8b?k~XX&G(VCIujt78ibo00$|O#921;XDlD;@zCudUP{SUmbYc=jGW$*O}`_<90)2_C8D$U%h;agbip9U6sj3ZZCN9e87l$Zku^Z{|lkgYkX0Wc`zPvs?~Q z4$n#<2QSok3t*sIMNULi_ELx?(1dBa_6p42UL`LI3pnHf+z0~n5&{m#m`2RMm_xV3 z|K{@<%;qy#hG%rAYB8G=l1V-|xQ+29{ut)n1h!9{h7%{xz<9C&-IBfR(qS3eHKBP< zE(Fqe>H{Qu#?Keg1M7Gk?n=#Jx&Iox`uca_skhtAAAiV9KotS&RSi*SH zx=DR&CSJ?ekBNTsB#)tN{pM#OSw>X@xCPD6n7rG`n}<43JxqIOzbOTR+xw$${SO&e z?{}@tA9cFqav1R-^UaTildb)Usb*GVl!U-lH*eBpYmewfmh@Cx1~^2|>r*~pL*h=ZZrYiE46DJQRD@w)NJmEAOrYC11(S_4aCL74SFg=s5v!WQ zcsz*~80_^Jts!^`rGq~KbO;D0FoOwYuq#-?WW0cGeig1m9v^@{F1<|7!6Yy8n&jW z1kpNF=S?>Wa-cx9w3PjF#YfRH0sHjR{uJ-C8{YCTX(i#`10;xTtd*mE3F#ye(v(?4 zu3W0O*z#Fkp47%9t3+dzCOfqT(yi9hVSvMtW8NPV8+%vsw*`N;P|)B_azLK1Ju+7f z7CvGj%lk|z11c2}ZXjujhVDyp_CZ=RGW*Fiy39PQMk8VoLPm_ERy8(OCe9ZwbCVfQ zTiR6z+&*t5-^u_ri+h234or zBNs%A-`B<2f%_W>VF@aMjH{kTi zO*nIE2Tq>efs;EYU}t+9wl+6lx-liQMu6$YW~_cWp2B4N0$iJ4fIs--XW=Vf{U$7z zn=qLKmH^i*ue{}QPMpg)11s^`4d$X;c5v8lq@TJiUq7@8+0l%8BP|+46Gi!~f^> zC(EN4hTQXU8nwh!ukS_DbnOTx)N1S9Hkm7gtupk#mifCLRx&N| zRX<+^E;{ZsRQq4EcCqhmnSS~1iRz4C?}}`7K61!Q1&OpN!i$Pq&WZ2MYt3(Gcrb38*0d)<6{Rj=&y;s} zzP8IeA@ZL2by6%VXbz|@(>|?vW`H8);WgW~R&Xu4G|=EI9sSJuZC@pc#i(f2*xaAm zZvX+ij`R6f&+T8)s=WMG^UYPk*~lE__{u77_ce=rW#l>Kpt}D3sCZ`QuBA}L<4f5K z+j)=Ie932)(`MN+v`?aAYuX>ITo-Uh&Pug^SiaI|SSDlXy_woDWu}2Q3^LDXz#Hxi zrHk2W7pQ|ZGW@Y~X`#deRfM>7e;6m9Gu6p?H1E+vtHJ-Zvq%m>Ze+qy06@ZJEF2mKUmtp7Row0w5=&64M)A1M<-MnxT zg!>r%5C}>i{Zrt7hzErG{&N^D_uwE1|D((B>7RHP{L^3m1U&WF7MzTEr!bz}cqaR( z(s2qex6^v5kFIgj%zaJxC8~eJ97YyNU4OzonHW%}S%*n|mTx>Zt$Z!ezRzOssMAd{ zYu7bhk8yporJ#@tyizHW2?s*}_oV!myuAn0<9JU!bMTiK<-~t6o1fFC$ZxQ6FkXa!g|hE@wZx5Onj~emlEjE=F8F7Rg{=W zxhO!z5y}aDDdR8sdMi0qjCIFI*u?jfwIa)G>{Bexi=%vuYlcU38+MQ>*F8yAccIZveV)``d zST0bX*yy_RJI;s%dvjyU;El{qT*~}b(2`B2%j7j=oGvC@sgCw#PqIbr07m953)6zq zDI^lXDhwkhNySdhQoM_U`$HIMoiEg*Q1Yz(Ig*mKv#2Y(iolP|T*vXWL^{Gk*_2B= z*+UP0XuupCsZ@s^XB|ZpojC@u`1V)o3cevk7qL9Vg(S$1cEw z4?G4B-G2e@yJs8jy08W3&Ypl%r%uAjoo(3J0odLI*q~s2+!7{G3?=cu;n^Pf{JGWv zeEloC@LRw2r||5zF2dH%>4*@-18;2TlRaQ0cCiAaA|a+jFgWv@j$poj33jhM2j|a> z;PapR0Q}0&zZ)KZcnh`yp7p_ddb zbielxfAvuBU@p3(&-DKdakuh!`>A)bDXQh3VhKzSzv!G+%>7YppBmF{8QdCk)tBl@ ziQ3;szakI2$F6tsXyXutj#m!9FU$1C`H_jL*UN ztu{?&0WW>23cb*hboc_++C*LbJJ1+ys z!k*5a%+e&S^^yHnU6*Uv7Dv*O zOUYzr8)98+kMHy;N)tLs;5%vah3x{ILRey#O{$YYZt_4nLqQA&n zb+pk&0(F>bDrReSU=6?b5U@gkq!f>%fD`cnqmO2FHKRUW>iHo&G~3w=cg4pf45v&u z*&Grjps8Yl!ya)309W54)Gfp%fm5nn%GdR@FS|~pw+THU*hYP&34djc5`}R+t{bBV zCQEpQK8(X63cS;4cr%CD{#CfTdl8niYp^w4!X2kK;faUuf&1>>f(P!I!UOl5f`{(E z8y>p<9=PwG6L9_n3i+IZUC|7J^S=(33xIh95E)s;c|oTqfwlx~Li861i%|!&@dW&5 ze>L};ZrKcnN^Ym4PPK79BnaT98wmo`cx59=WTF=5@g0W7%WO*d;f-Lfh~fWJ^ht!y z@ROnq^e%m$pF~c^5%&0*I78FLC!s1>5@sInxep4QD4g)lx|*5uu-FIjOt;b~CO&=08QK}3!Iq_E zvw?eG3(l3W>#Xr-aXTG|>DwBJmjE+Ua6&uif=hr75I(>!a4e^ch@sG*4+S#JXd$qS zp}ZurmT6xuc%lg}0RW5!m@&;!++2HaO?A*bJYP)qdtGi#__k=HZHrA}nph(UJt?)( zf1lc@7dwL?!^^MzWjA8t0i?X%v{3VHt`eM=xzZ`28vXjv&~& zyuy<SlBb@0>mLZ*Ek#t-O5!Q1}`U^95y2l(@^ z?ZW@`Z@vUy{`0TF*$Z!j$;LUDEuy=BiZ+qYhaO*E%L!fOdsWML-ygaInD1SJ{i`p) zL-%dKFaF%q@aw?8fW=hs%)jm6{GUxUj*s)2}cwysN z*w(ziwmj;Zf=jYG810o-_8LV!un*k?s3rxuAqOS;sZr zs{EUJ4#$}yPsLUS)ZREQ4ad=JG0E*sbHO=M_{KObIy^Ie#O4HRw;BJ%G7|4>!@28x zK5a>Pncs~6@76hTHU3F_UOicF%j0%*EE8Ir&f=?@7CIt;opH2v@R=7am}+E>;+e|ba%)18BPvOT zO0hu`QDM|62nuOq=t1;MPc!UBtk692pqk@`DNf*!6`_05g>_E37&6LBqr^KVq{o z7(GnY@y4g?E4;@<_)i2CV+SvBzjndT{sP8bxFfUx7+-_=>=MlOUWM)PRd~z8=i%cY zc_)10V{eDIJiHA%TO-(-PQ$Q@fEK6^{>VA_hrj$W`26SI26ya?V7};Jdt;J~yWrvGzE)O!*=;=lStj%Irb@%C znGR7tABNG96hA|74zyS2(i}#<=Nxd;jbmyv(%cAZ2^ybU3F%LGZ?>5bvHV%;Gb$D5 zv)`&s;8(wD(sj8fp6;h+T0D=V$DDisyMA`m*8gfi%h9_EE#|8+fj5G_c;j~b;MDQE zWUcM1rK^A^t< zorHB{4Qr!no{_`3ocAJ7m8=J&zEeB=qnt}=P*UuLtDjbYOuUjAH|~e#|4j2dAhzMYWceLR0FQWih=u4w0cylpMZAiB?^ zrt&j^80CbP`(i9gp>)-`wjP7uJGM%&ZZEA(;E;TTWR*@tQv-G@dEMF`}jv<_xLaDI(+WY1UBT(Gc|wEDw@XIs9%P*O;W zg!Z&e*@Yn`LeXb0pXNb_zu<{Pr*Rtfbn9F*X^p$LQMJ~^&Y#NFc;`Q>`D93I)dx#3 zf3o57=DTH~P%pF9_XH~NUP$Yg$A&kt8ZROI3eP5iMJ#QCz#7U{4l%9Oir249GeQG_ zbVwhp#e$~x=fH=hn+XsI0zwYtA!tjE4CBYa1<4YoqYgHw0UVjZ{@z8n_}a@bUhcy~ z_uc_df9(D6!S|knC*HCR58QJO?!9mVwspS(VT{{^1)kE=EL)@C(NE55XduIP2oQ~l z?gaWXgKoS5fBTIN{vZFZ{{{Z^E8mCl*4+TpJD`KD5PKlz6Og82k|+B^1ojZMAQ&Ia zVPo3C?v>YI@5&G0y-(f`|LB)K2%r6lN8!Q_frTS-nbd`gAss=8+9>YLnXF~baV9U! zs<1t`;1K&~9Rsh19^nU=gP0KIh$Ac0mLD1RELzV^g?=c`#KNm{5j3jhMY9vm{lfX<}Df*oEzkJtB*MUx;4=eB5 zqnfKmV*c9--!*>Pt_8o$a_w+kzD$UaNSY77Jgczv+L0?aSKYOv#+2pqO)H_|PD;dQ z9yn_NmIOp#gqrYe7G&kXeg%% ze_>yP8yCZ45^}ao8=Dc%$ij#FZUe`l+UDY!59TD36f+NTYBf`fc>7x~z`LHf0PlI{+u(_}PT>rd6mG=t&qG82 z6x^d}|5$qts*ZqaiJBKe)&n>^hY{>8maw_G0bl*r9{hLz;?Lj@zxXVSH}8UTciacp z4#v>MeT{R1rcM~rM^~dQNYYy4Lvazq5nj3Y1DNl>8pHhk#xH*qe)^LS!yP98_79fP zAz&Dr&?wQBuoi;W%zC?F5KI3flN?dumIqhLv#UMl*-mGK(kA3wg{DWxmlR&ehS_SL zY{Q?go@(^kfB=>*tM8AxMYq$NG2Qgy_%SAbk7)lvXa=sX12C^+`1tsg-?76c;v<;H z(HdJVK#TIFvFowKe5Xh4yOgQ>VU;HObX9#8p@FX#Q+uNYvyw*yVD#D66gm}!&tZy3 zk0-9Dq$kcV7pzC!DwI`8maI@&t^A~zDc%eQ*?P`5;brrQ(As)l3wV_!f4_Qrjz4uI z3#2xhc8Pq!J5#UCte~=RWgwSjrnS#u+VyaeeoAndbH)dNtpy1Y4%v~zG-cAvbh6XC8o9TH~USda^8kpaEvydell)t`nhNAiYil;m9n&`95*l|cq*=}qhra;0%g z0x*TY>lUz>U4z;FE=(3z;mr0mxc{zAc+Zn}!zX|2Y54HdcfsA^Vn1|nuw202G6=;Z zn2g3SnX0j}gRR<=Ml8LE^hGVj@OQY*KMOts!t;$WeD~!&_#glEU&3$y?|%&2ryqgs zQ+L5^K7rAAiu-HHaZKn?7AA-BkY(yAp#^lg36{$}xVHBiEDv6W_dazu{5QYx6Y$K( z?}nX?4)$jqY)!{7j(da;N2Sfwq(&2!Rnq!6+I30S>x`{Hqic45Ex}kqfGn50!7&~r-ox_`ys~adNZK@9?6qkA-CFg z89Jtk&(l29(e$=PYD#EcwFizj^}~e@t+an@e!=1KScBX^<#HayF6%Do4` zut0IDCGkzGrd&QOQ@&Q>69fF@FrR2Dh`v>wZ2ji?z6kI6Te;aKw+k31LwP>4A*1kp}* zZt|VX#>1OF~jB8)4JAb>$)GGxj=PcClNt#@swU z5x2aYq>V@6aNM|F!E-fa6v~wD`};^96R^=h?fzi%9)(&nxD%t#QUn63kTg?FX&6OM zjsQcO!Wx(F!r>V;(1cpb*z2nM`{4paquMy3DFTBnc)mH~7^jlwp8QL&I2?b^VLDns zx7>^O`{AfKz-W@+E z6m^L|#=3^mnst)2AvUTHTv(@q{K|DPZk6!Vk}@DxYqPb0?SGqO7nTX@>xHV4diXuR z)BfJ<_iZ|nLJ1DF3Qj4>N4g)jP04CGoy&ThljXZATEM1-%kL#{T&+d9rpn``=1%?1 z(G)UEUwsvv6ouGBbuEW~kK+{pj>4@4<6I!l7ZW{8t1abZt|a>tV{@nP^=D~8u;Yca z=zQYgnS;n68KJlsY{j(u>!Zq{$(0CN9)7msR}MgUxek*w@k(XqxKaXXlJmNRukK=iK*!{?<$B@LFR$*xW@UW)8>{o&H%ZImMKXpqKKv&kkW^ zX-3U)z9#XI33uSoxfkBCVIsolufh2Qz2-Z5>w7=w{z1mIU)GyAkZqmawxmhKoyp|M6dc75@G2JqwqwZNixg7oZ!R2(BBG z)|0L$AyJ&f?;|)9!V8k%p3|(5cL5vYC0x7wGR&_%4?p$E_rtG!;e+s@r_aHuP;?ld z5rkUOyvdD=c<)2H9gQxG5zXLrYcdY~?q)K7JNl&8@$fpW3$vLS|bXM|*bxsdP6kBz!&ZYbWFv%WEcA(5L#Q+07%B>9O zaufoo?DUg9jc{WmS0k8A&|*lyN@04ctyI)u7$|NTPRj^-0KrYMwvQ*ka-6WxLD-| z!4O{xtn5j>qkd@9bgemNzDXjz=jVprx4G87lrtC{&@@-S&kWp*uv{u^a|eO?yPVzR zKa%1ym0uJ7%K_|E-;zbLFQX)-T(WaXGH`fI*MVdA*~eINFrF0QsU2fE&lR7~<*5Le zJXgqbr#%~vRCLs-_bbU?a!ZC}*72D936R1d@({>POJ}WSTn}m=$xE9teTUYw_PgPz z{wj$V2oAbZjmYAZ9`%+bZ5J-cyeC0uRg|fXp!Kz>ZeG()X(N_%sX+qFi))89oym)4 z8sA||89Gj&!TsI>@Aii-F$&4$_oZ}*44@wbF3dZCtw{&hW^?$HFTVi) z@?U=$o_lEycbtC|7NZjsn2@yp5ils@$;KHZ5GUO`>|#WN;OT!lS-_>&pMz=l20Zie zcf)V~%17YCPoIH}Q3uNfz(x>Om?0`qUFQ%Pxc07Ry0t-qruceOq}KTMYAFoxn3Pgz zwGwF5eBQxmI)bgqSjDWlnMb6Z_F)No!B+^3VH&OuG1HbYm0mpP_1Cip0^HbitIy)F zG}L16Xz0_Mdn|qa+WOa75d>JX{y1OJk|2f*!hghSPg(JJntCjtr-q#G%1RNlcEgvY z1}JTUDaUcReY5P1nsr0vV+X{DFH(6}DE=VlusSMCo{^?7Ql($#`ALO$f$cgo4Rcc;4@XNuuH>>|R zB40}J3P3&Stc4VuP>HPlIU1;uzE)kixuh|RY-o;i)W}nm_az2~8#AmAH8fq9nQvx0PW44-`SI(G&r(ZM7ewS9-~rcRZTA?k3{} zEaz9@+O>-Si%W3#*%7?s@jKzCp7{`b=2H*DgVD2J2iN9H*bH9p#}h!SeIFEAC0Pp) zca6r7i%XbHCh!+ue--}w|KFd%cYk;VrYG)!@y1!$p9Ok`)=IJ^EJ;#;lUSd`H{srY z@P@h%2UlK($>LS`*asem|LZ^gEWGC(6PO0Xb}@oYfkPQ}<%1zNRm}05?z#%&L)Odf zbbRTsvSh=dlw`#R6!b zH;|JieOxDSFXfBRLS#^BJJIuCjYP6Q0NWNZk|w_kemp|ELg>s9oY>if^QU)UXB*27 zVaj5=$nwGU03hek@G-T&`7G)?W4-Thr<+4Cx}DZY+0eCxaaVKi70E!F=5>gV5@&6S z&nZ=Yn!ePpXS~2a;?L2UQxN6cfHc6C676>s#cn|j1y!JsK{8X zj7}C8DNMWgrt>j$+yw*@EV~8r89GA*0Ak!nEC{u-W6|D*7DW>Sx<8+p?@+_@jgF6oqk;ypDW9wiyE}f1lan?LDCxBm5*{bKAn1BW97ghHj~q5J!#JjK{c>DScDScD zUtq|iz^%t88!sL2HXlQuFjB~mpcxE%Gz7*AemQV))27z@F8J(7-f_eDhr@XsjDwd! z^F4>X{nuf+|3i5DBWK{3KK~Q&nNPh1?!9XQ6JqkGAuPy*Mo@$ZE3W80oB9%JN+UdM zUq|Z?mS|}G{oM-yzx^M+2Y>YCZ^L-!LD<^40Q-wE3jd>^JEUtYp>L4@@Zpdm$jh@x zbAs?643ZB3mX~05^DCH?|fnc+Y=OMrc*R#9>vg-lA@rd=v_0*-IYsI(>8R6?xg0X~nmLSStz}kfwJMVCx;zgf$T9Q+}7`m5)7UoI9Gv=X@ zrX=4>S_aTpNTc7LkedjQ+__dt7b#EkO#E^g=pb?IRCeUK_{wLdWMsa@*(6nAlE$YZ z!T0C_#FvOk-(rH-+rpg8c)a%L9k_-nBPi@5&G06CZvD{Q56{3_kFl6R;I9g=M(&AI3`UDLNhtKM@*C zjFX*0nU(EG`420A*z$(#$J<)8<4HA|yvjU8hBPkIfIi{b3eyoRx+OgO-7D~KfA=rp zcYpuu@WYp8aBXh`y77r9jiV1r_DzEKnQ(ofc0P#IlQACl+%{gHd^B6yYx@!JEXI6z z&1QlqCi3LL;z&#cs19<1x{RF&@x&Q04FB%Iv)}q#_~MuT7JlkePrxt!{iop_Z@nY7 zd%?g$04-J+|J4)+<(|}x-|ane{7KWRA$f0f@UNz&w@s zJ4$z*MadKXro8c=%6gFJnPpJ2GDv4H^(7K2hAR_bu#A3Dd|IJphvQ7lH){vtHC`P* z7{+py{H5btNz*;sXX0%c&=H{2wA}~l;{P{2{g=Oa49b4AzSA<{Dr8|OtqEyNbK~{5 zDj(s?Qh7R%&Y@hA-7+cSL}U<=t|v$2}vm6#3XvCII1G*gn%t_@N0i z%ONvM&>qrtAsezz7)WMlp zbPA?oi%Ql~FfH2*)u;q@CY>ixw>>L3E3=<&*hQ(wJ(qJ?883Afydw{KlxVp$xpr=-toXztYJP|1id&+ zCt-~{<84+?0?_RJ{`GFYhq>NcEMaRhg866!zx#*Zg@6Bhe+jR=K8N%7z6JJ|TQDcb zdpu{+#e!O-(UnQ0Gr1pfwCw0$V`Bt+yD!0F?bU@ekewo6+oH9Pj(H z1|#3vCL)A>N5Df%@K5vOr=bGmt(!EXd9)?osB|Pi4txBOXW>9!!eTjsm);n||NOsw z75?SF`7?Oo)dSevz6-W@&ckG5C!9jayO9&hu(l(gOFlXfvJEhQ((;RTLfWqhzIK3> z_W4AaAI6--G)C4sMg&SBT=6KtyZxwP#F8UpG749YuEGB97{2|3=i#^h%@-s6|8M{C zGjPwjV0wt>0s3UQe!eqq?L9Rhjc(4pbM(pbl7~q-*W!RC^^pU#Jo4B;NxG71 zTJF>f`*)eq6AGh3kpPjSu?l2GhjPrUI8Ysrfq%1GG!bNVTPr=y%3}qdtFZNzSN3nq z*RwV{!$K;ug|Ds8TgvO}NWsLBk>RSsKFg{3`y4dzHlJR%S|C#6PUS5rqDQn;7Ds`8 zc*tnMH>#|e@ZUIC0GJPhSp%96=#NOpuh1i%FqDsQ1lhu5`Cf0V+=N33GTCp{CKbLe zBgTm;;5WROl0-{=N_F*n+9b3wnsg_v3AZ5&mZ27;02x}|bTp&wlnc5(qL$~i&O!P$ z|H%Xd7jt4tgZXnZCmNGz3*Z8hhO*%eDnjSU~>$xyB7e05o|^?+yEGmz$^lNIWzefr|~Dz!0E3y z2F|{Yrq3hz=JQwKU;N8IhHrf5BHVH3BQRTT!Lpk|C*cD*tVs%iM&1e2C2BTwi*taW z#&U55u3dQn9)D;De)Cs94xjkY-LSKjd{`G6a^<>Y7GH;2Fs%H}3ltNPxdOw{2yuQ1HKltJ$_;>%u-@ps6cX02+?~Wla zyKWP=cD#m%t8lErRR#b8?Z#{gz>+I$^q*Ya6PrD83?%EH5H@bT&^rYhvzP7YcROCu z3L!Hm5?v+uGKg1}Ha6hYxl?fAu6y9Q?|&8k!|(qsJoV(e;HN)%C){-sO^EfiupuD8 zkhR^?=)CCxfSW8G?|2{8j@L}L$Fr>|F&|+n)^u%HHa9z z4=X2-X4*4GMpBltdM2$;{u4A%Ec~k-rkGh-susSmN(Eg~P?gFr4epexCLMb4F!Rvf zx7~_B3=9A6Gxk%^QsKos21T?cLX6TxBvn~$ln5-Fb$P;^Mdd7^N5-|)uhu;4I)rFt z^Qtz9XZl6vvSF?*IAHU}J}NLkBY)CEgRWr&zG>hnGO!|y%w2| zbojNM^^_q&?fPx)&2?zVkaTn!hTEx?TC~PwrTLYu>sIgnBKTS1N~gUG6Db-Ve0Y1j|LwTlE_D*-0#eoE_s7ZRITH4 zK{JMtc8&um5PSe2I2!+s3`V^98JoA5$KR*VJOmf7z5&1UpZ*j+`0i)m!BeMT zH+nvpDDBelbz3_l`qEHS&D-f{(k)4YhRT80DT%eGHS^WlUs}@at1AZ!INUQUHq^N# z0yUNCYFT}Luds4u++6d^rVn0Owx626tnF2;Nc81`T(itsT;9-Ab2KQ{&9&tWu6tzGKwU;mef9Ei>$MWvd@h5M&wbvH^gf-$nOqUU{-Cm3 zMj0iXxlU8b4+gg*DER_FPyWPMhNb)w0Ehwr?idm>*kK*U=1#yzisPHQkenc-L88Ve z6sKHlYQkBgDdBeP++3FOTkg0-1n!tH8-U0D-v}} zj^MIM)%PR4O@^=t+X-9}T5FOm{(1$r}PM2`?(o1k~#rMFOExbR4;}wDmVjol7V6$7qK@lVBeCX0)$a828_*K(U3+!!h?&eJ% z_0rF4J-D7d8w}(s=9~@@T5ZXmB&@|C0*3$>FTFN{XTR}7IGAt2sWazbxeOsGHlm*Z zq-$uQ#pr*yIiJ`EA?C@Et8O2e@W&=;kT8N7!f;nEIgrAKhMrLl`kqyn6?N!j`d=5HUE&D zkLvQZ+>xqD?O8HNSt{uPU-p2kI-9Z0(cq|&b%~jktxro+Gw=v_`M> zqYftHa1VC|uf6hJ*cx4d&wTt{@DG0Oo$$#Ydlb%X0UXR1@%qCCdHO~|L92!VWCg0^ z0>oh)=9DaOcrqt%#M{#e{2%}2IryJ{`-||}Wq|E7cfn}m6wHG}B&vOy1V!93>kn=` zq9k!lrsFvrTzehn*Pe%;`^?kuh0nhS?mN2$2Mh9+9FR9GEmAX)-x z5B<848v0uW40ux{L}k_4LLehC;vxD(_;Ys&@Y=-%T-{&5XtD*9$qAUx5TJ{+h#gAB zHAC(y*+Fln0jhYK*P#csRxYsTbiTynPW$Yk?=oRj?j5p&-vFT{?Tcs@6la2dWrFAb zO@M9_4i4sUbvMT3$nW)5LIU1SH($DyER6cB3EljLjmQPRyj&~v9aWoan)q5udr6&Q znbTwC9E&$;jTP@X@T2xIpzKzF>MCW7$){FSG;k|z`;(Qa)*xqnXC8%l)~KW*9)|A? z^rkj{+yAZ4&v|pSinWo@S(ZhbpQ(97P2j-x>zZ0Q%IjES!_AhWG*>xzpapRCt?--u zLb=rDT4J>3HwSuFwX7K#%Z9%i5DuvxWo(0S21gp_MeXiC{$1VtD@DHmxG z%1cM1%U~G4{MC})41Rw-?Yn&>x332+);4Uxhn#>^O$|$GcS+<{hev8ca=i_uXHc+RKTeUJ-nFQ*YIRq?}!7SJ24KVR>)` z_I6){lN-D6sgFJZ|MjnaB6_(GqQbTPC7jp{Zn~neE_VP42Kl)_jG;t)YhyiVSVo)l4yRYxVzxnrn319q+Z^5baPr_n!8fNqG4jrDA<&{YzpySa3rjsQcTzLgX zv)ACG?|Bq{{g*xr?|Sq!>>kWvXLB0IAx%y`{vOz7kHP%kTEACI$IVFJ3XJ-XLP|#m zpRq_|_7?zGuZ1|h!SZE_4*!_OvU9!Y4AVfp!YihGfkmA})RCqnt2cZ{ZE3BKf;KDc zP=E&$a*y{UInP1OT=;Jc%h43}XW{BYj0SjUF#UGAvFT<61Ny8(dWACg_08AMTEYu* ziFPPblQee1R}4$K-_hD~1uhutCD2fX>b9obeF`21FtGjJ{A;Ms%NB0{GET`GM2aDq*FMyQ(aa`lBuG z^qOR#T)uX&dD{{e{zH{IdW5u|=@Ph!g7?MzG%Lgig8{`8ZR}ze1x`;-IW9#OM zUbAK`vhFnbCCZ?+4>2~VwkjagdEqtE3)M_zevO3+d8+U=Y0!fgV*ZR7ieRlxcZYej zg1G~mMlivU!EuF+c>f`*t1r%H|03r$%MfJ!z|D)#kZ-H6cmzDdB0;l`IL;Ybl*~^s zY#N4%N{CTfvaWW!DwNYl{K;)r z1T|xt`piYkR3qd=ziXMYu2LT7y;-dQYAw3?TH0@|l+&tok5bcl-fJOp=VBf#0>&{K z0N-{I#+I(;#5$?W?5dhF3AJs=w4R|}vI0tNZuc>;`lv-rbRwQRc%Twbkm^FM9Qor= zbTjU=cx8(Gl`04>xg=aK+4X$0tnYPOaN}FvPE|1WCKz{He@!zx^!p*@9z~yP^t?6J zDwF@-@zs=yP+NNd0RR9=L_t)i)g&s*8(R93mF#FE;}uNPCKe<)Y_o1#vI@}6Ol_9% zat-UD#MkO?>+SUV+o$CpG)Fy&fm5WPEPIhPGUwrPr8+xim@AXp8IV={Z|aj0WJUC< z`z`SJI{eo9gK$T~fI2o)UWWI5>Jzt1x1la4aGTRwSY+1~LSlYBol0Shf^3{3lVLuV zx5BU7uTP?XBW1D2*24~cL<4n6(rOy(JZc24_vm9sS-WEy@sw62ga3v>7eD|G&W$u)4 zYZ)<#zZ7bP=up|#{=P`<08&!Rf7Q@aw<+v+xU_dlVkIAEI~v(LBVq56yn@H^G0b6WJcrj``7S(m|7rNufADem;CpxA>;z!81eiubsrH3lZ&;WT&Mf^| zKUolK2;I>Av*lP2s*gdbm3uR4?rubC(H=Wa!vy|RZuOfY&~C_2;JOK?t3l$Nal>yS z+Kq1$lSY7{O+)6|ZL>Ni)BE6iWJ1i8iVz@SToD97(u^SrrGDZ+0(r!s1Eug&qeUKo z}iDtmOM<~+Ry?q$`K1! zE=hmaL1df1HGfGK@snN;R*uj@cKX})xdbU%a?ejic9QX=SUo!x~z&yKa5JZLE&B zFu&PDc_vJ`vUOo%tIeah9a$Uno~Q`Lg4{(f*r`9*3S~Vbh&6!_^geTb8vj*JZer-L zc`RikTBlrti?4hW?m0JwU;6wf;g^5mNqFQgfcb0z-C`0Q{b4+A6|a{GM+lD>k!5l! zmXB6*{Fx4TL|KoU_xY?_!imWQzW)3*_^p5ar|{h$UV-WMd4O=|dG4$j0uW@pRlHv$ zf*5{f67Rwsz_qI{!P)H@eD;%XfuH}0N8rpf^fQ=kjJoqbO(`y z>VP`3)1O$H2PdDNI41j~_NkR6Jy5{@ghy8=oXI zhtr2IRKBPG-!5iJ?a*Xteq~?tNCzfO$2&9Xu4n123r*+n4 zZO{uV3CXs9TF6eXeg4dbOO)VyByZ&O((=wqiI!Q{u_B9FoVyQG?1c$yDd3OWAB7f_)+o_qZPz{P{;7ffj3!c-Km8q1V}aB zY<3wm&MJgOEkrdrs|u*z;Wp%(0l5YU(#oTxJo5kry;wggs1%a?o2suw%zi`+u;13A+7P;4{xW0l)C+$Kk#+T{Nc-))st4$UnsF zdROD_avQ0AgGS1r>>kj!{+jPkweoK>-{m;;X>4j5hRQ7QN1WTdWm*6x93`vA=}qP= zn;dx&t=5bYf_em(mE0|h{ z<8|_nEH9RU2AR2jnty(l%L(=VYeClqlY9{|&&Pah=7>`9T$zww12Z^ju+ozxSguU{ zvq!DAdJyhXJI7rqQ3=sHpT;OuKxcMs-)c}u`a>*5R0ugT1qo1^Ai!Zi@HBuE=EIYUwn z@f@0R?NAcpy~9=uwmGp)_nG_VZRsV$0`Qv$y&b0|2{$8g&*@X*6n z(({^Gj;MPzxCT-;25D}MX}Z@oyrQuzHO#iJndw;q6X>P-oc2v9bGd*C%%PiIg4w}K zaQ@Uj{KH@T6#S!Kd$ZcQhaTyVzsI8uL-B{Epzi;kF-!wZsD(zfYRIG`A_FR`jApBQ5dkE zSl*~HU_Lx&G?-~v>TgWH^|_HL0Y+oI-o*XWbb@K?n&)us?76LJUM+cGSE1EvX!yN3 zxD7t8pVs3yQPYWlI$ujPnquJ#^H6;2B+bXR-rL`$c9Ywltny@yIdVx-R&uyIzdp>K zM{(-axmDVqkG~4RZT7^fa)CX|Nt98}_UM85Q{ndGyLeYz`-Snq8==MKedfH%DqeIO zQz2gWGSIgHq}wy6mOu5F8|}=6qugwz7Oyrc#<{%uo36Q}Ywz^6Z|x9eWAQ>(@P8Ie z!gE~9Y}Q{xYGHULPDM}}+P4+RVQ7&%;n zF-Jnl(pw^`3?wleRzLq-V1hMe5r9i~s3foJ+$NMo412a5^tBawWR^?3ZWCkrE}&b^ zVPm6%Np}FdmtKH7wl2Yc{cE3tU-;Z(aMu}t2|L%Jd+zb?;BkAoj21aj17~Qy4)qco z3a0gg15^+{4w*+wL!4|{OPs75L0G^t_m&;};KdRAr$782eC^p6;pF+Z!V*rwd`<#I zEF!JUVA!Q87Z+TMh46%op z2$6i6N6^rKni*3v>>SGk?#e#&=!Ncwepl@4*jVIMlFz2(M0r^>SpfvqVbso*eg0Jg zoNXReGmPn8_hHv@F`wCVBv}F9ksl=X?9M*XDpSZI)s>&vY_RmaXni5yJU19oXtylf5~D(xcT$D8(avQL#P2^RLL>ZO^d#cf*oZ_Oj-F1>(8~w z8syM|eMuRHH(V2jRfY9cl7|YflVnVIvojbF8EU>un-C9847(m7jWgi}A}a#%tB|jU zd<<%R(Q8S$rwe~Grys2}!X}=>_GAecU;6=^Ked2g{kfln&;QKZ;F0se!QBGy05d_t zRW9or!65~TD8Pvs1z9iV{K?jvHvh|``{iH)4^oV5FoJovfUWTa_Ln30?ceXFh^^ND?&NCDE+-KegpZv%LIJ*IG zuvoxmh*NyXHGYXe{tU@exL1jxjY~KeYtE z)JCGI4sELO2}hCqVwDs;G&P)k=k?`x&h!43XM--wmSLaO`)K(oHSZd%&^%_dpL{(o zdjUtEy7X5M5K!B5#k;u77`#a5FIq0^%q$|bec(tb$T*jZy?`ocL5Pp&q8nAOlrjPd zWuv^FAS9DVSCTMPuri4!=AXDD85mh0v`F}hWYMNHZs~W?R4rAf|1tsb7}9D&vYt@? z5KzCe@@wDV7^=`|1d7zs&_!L=Q78PXq`?fH5^DW&T%K7{++00VBDNwC-y$>~p=!Ts zW#N+5Nqa4HCz`}6L7czCci~46?iVl}9l+H$z7Kb7@5ASwc`y9KFT5KbxB#$NEMQ|a ziFe#_I|V&Gg&YtI83N>F@1*~@PnbsmZH@k8S*p)!Y#E?T&O|ZH$hAcWU;oA~{NC^X zB|QJ?9-O}80hlc&uv|vhB#pU4ZGVbdfWp!wUUfJCm|p~#y#XJ7`ce4BzxO^kyA!TT zbTA$D3IE=LsJ}ZZjn$1{d~Y+`H!8K(Se|gdGXTKnaM1j-&zrata33_HP)6QC&a-rl zPUlDfK`Gp4zYXxL!2tAAvcjxOYUlhA@a9%dL;5|W zjG_4tJ%$QoFZuG}NwkTTcCE91T747Ew*`=t#Z!NO#)JGH6x!#k9lpSJEWmnE5ra4b z>!ER3txC=3*XIJg53&L=2cz>8pL3Gcx_R<}WCX$MblxQn;@ktU>&%9OW&Hhmk18riZ+mtl^_>R4U zB7hVA#<9yar&-C_^Hy8&oi)+&^0YSA5CUm6?tN%t@tejbn<2jMRYk+;8=@1X=@FNc z1Y$Nn3QV~y8ZyO^t1uRB@Ke4r5k8tz6< zCmq1-8qBV}0PlYCUij=YkHZrWq0q0L{(0+(-3hAE&ufhI2<@ynEL&z3q_i%hHMLz9 zJ+G~APs^{7-j-l=D>C6Vpk-A$a+o@6)<~X~$eW8*m|&zm^n=e+ay}II7VX(|;?O3L zYXiyj5$OoESJC+7OD6~BvUV`&PXK;Aa^3SUS({0?PH!tY47-L9>o_9=m&qKnHm5u{ zw|!h3U8-3&9oCAdwa4D8oaQL5LrBbD8@N=Wn``MZ`DyJay@^ht>eNv5idd!W0~uDiB3a-k51iv=R0 z<1sLjk^`h68AUJ7FyT{0rm*KA11ZUyer*hL{?~#FOye!jpRBC2c_TjF^0>AP&oZM= zUhAaK?sOFWNmtEn*(xt@J0+(wATRwfc@r=%B0Sb9TX+PciHQUdLt^LhU@pw2am-{9 zHP#UT;AiwaLkW$4i0a_5_K>GIb)DQl=%P%EZ)lxC2WQ#(H-t zG+Yz}CuYO>2Z1GYES}g+*doaJ_~Z9p%u~B@`{s7Yn6&cu2~-rt1Wm^IH@`DI@*%sl zfdok5@uP1vqZ#`xtncv+En92cyXwF95e_D?TaKQWcbJ(0L;o#auSX_Gvp842& z;0u5MJ@CYXctED88n&n9A(M}BYGV$f$snmQ@dQnLFL;0nLlWaMicm} zzr6y#`}=f^w>sp*^ zpFRycn?lw=R>EzSV6+mfUBa~;1_04FhPqq7M*lMUJQ_G|7J*hD+q0`ipS?BDP5`BC zR0TfL%!>~K+463uqf5NTy|gZG)&er$>}i$0dS}LvZ(G8w0M`r}7FzHU!mjah(l)D^ ztO&v$oveYW**7eMn6PiU%}J2QvM0uWm@RV^Il<0DAu}9C>Z496Uuff*5XunGYO;?UoE!Wh?G|56fZ9%T>di zdEna>wl3>js3|8anT2SSssgc0HjPdQXV#2nis9|lSGvSS;-O8i5~n;NpVfcIdk$9;^dR6mDIO0gpi@aA)oFD1rKendbCW z+K5g)0)7!;i}HQEJD&=+{gSYmq%F>RsbFi|3ntnEJK!U4_I#|yB83plU~?LT|CeF8 z|02BOt#`sNfBs$Y!MC4*Q3!h%%!P+A7usKEM)}EkOqMx!Xy~PaaAtXlIE?}3T?dN= zz~%O_}%~bSMb^!2Qb>c6UNhRn9sGZ21OF$l1+{SHF3ZtxrEJ4fGe-R0w=~7 z;j^FlAbj#;kHQ_B6Sx-kLJ*>qHBqvK&WQ%^~}Dn3C=f5IvV)2 zr;cOl_hE$}-D^D#@*n>pR00W-1q_oG#vJGh(Tmne42T-W5ZlI|>(Hl)$^jy(A zK0CSX2#Au!0-}nEsj-D75|}9qbS95!5pY!Jyvf%1t(q+D`cV?nZ$zrmsiPY2Bn+{| znkRrs?%uMHf6;tOi_TWOq4(9HfqU_Fk_(VQK@+A4s*3)f$5Bp%P{Bc9Q8U60zJ z+sP^T7)H|*@;t6N6U|)Yt@LW4CUdUBhTJ#o#mPVORRu{wK5}(Q=2jYSqM6t z-gr11BJlAF9{tCMXf&vbfLp2vHT$6xbLi$*;o9XF;Ql+u@Tu4PY?So=S@-)e}8S2%? z@Oq{`CUJG`PY=Uk-XbWU?)XPKM%p0$ZJ>j~vp4Pl8`Ia<4@gpYx%3g40Xd5^wmN9? ziB@umV0_P!2Q2WB7()9<0FVLWbvqqTvcSFfe${lF-reXi(3@WEzjex?e_CD1>7(K9 zhiKtdJL5fbr!tIGCeF-LuX@VINJ{m&XnlWN^VerpAlmy{yL!q;D}tQ2)L{a>`jV7Y z8_Uq1#Xx$HuYuHzRVBF<<$$Ivr2p0y1LGqE-@J#FXZpNlmbj3!Q6bGhibNx;P7{Z_ zbgLuT1D$EJ96ZHa9emG~ouN^sdSH|mbrsai9xn2CZ0NGkJ}1O7E5xBd>r5J9hPHfV z5~0zWQu}uJh0;1~ee({ljQIaqn@Xf=SeUY5+Q)i1eHzLkNh6#s;^_59N3UxFPqs`8 zZYd->05$C7O77bzQ{W)D=LcT3XK8l}sG}MB1Xo~lf)9>4jJpH4die#o^Nun6%%`7( z&pq=9oS6iHdI?(-yf@E?s%O5W5%Tyu-^S^CWhoK+Rt@QdJK2|gM2^Pzz`*W z{mlh@@y}m^mtNn4vv;2Y7;nRD5!$nWNjSw-XcsN$@Vbs`Ah!p@BGdyqlT2PlK)moEp3RUhu5p$Eej-XkF3=W zI)2#vQ(Irzx~;W`%8(dGDzm7@Ia90!mwB1AOBy^^=MF|MNVE{c^Xd>xDKE1WrLT`N zSvq|fE1Mt1Ju^>>p#<4#pmlb8eO@I` zZQhdtvn_9RnS=XWMzs61){j*{q~bd*;G6QTS_`8AkVD|2-VsI-&b}W-8ZcK5GtnS` z0DxuCP{LU5&qjow8W=Tup+rGSFt)fJsMrYAM?2ZFQH{XG+Cp#e?1WA}zezl~*66F-qS^QQAvIN!=NI3*ZI4|3p3+A#O*};|Wzy6X0YH6oI47u%CmV>5} z2?EZ8YR(c7YY922@V9Z)vL&V;1>*ylbh|K{zYfoQ{9W)Hzw~}M9ZlPVcYDlNgs-%t zuRu2SkFw4ohcIg6VvwDX#?AY1JjQYTB}g!?qeTe&w_L(>Jc9jwfPepc{{{ZyZ(e}y z(+@z`ZNUO#`^EMI+LAyhA+D-h8yi z*gngdAkCa70hk5!Ot|NN*}Vuc?Yd2olth}BfI7Xek;s!%O?@7d!$3L-=wUi1mvT9j z1b)?iEGju7ln6h`+Mn7e13=dhy4Y5vap9{;wD<{5hWQ-Eu}f@(RW4+wdISK|v!S5I zYDx1oqgz%Gt%2sA@M7!n1k;v)qMZZ}ZTHPelU8llP@&Ju(?@&y)^qKADc;BLa6blr zI_0;TUe(%8S2366)y(jB5b~DG1xzNBrjT7*d(4L*Ke32{4LTyFg80@G6F@R-W*yc_UIzFroKAK*C1okT~j~on(Yx`fBZVd2J~-lZpY|qs6K9%hoB(1_L!*z9JZ9 z5!4QL9@De-ygKs;0J&opZ!Va@cM;0)Z#)wc4(EJm_^isl~SgUIwxMsRr_;P1Y@3xD#ZXW^yS_Tb#z zZ-M>UL>Q7_O2!9NsuC@b1bB-?AElQ`@cMtS3)ikZ4T>-UIiann<58pux?j zRT`T57(|_hFxt10@PAYq0b7n2!K4K~dhKWdE;`SUJ~Z1cMrf)m%e)dimVwklZ-V1Z z>Pyw@cTXD>146}!HC)k0UZ3g$05eUAec(I2p3qKN_<`a|^f zi<37leZo&|KX`TBO7!M1sU|quvGCTT-A5U~r@r%m7@bPtB-=s?ZsceEj@zn0rxKj? z9!x?#*1$sM(7l=Rkx(zPlQ|1nXo+moI1181Wf^!6wh~~*Pp;S+#T|)siQ;I--xW== z2LRjOEdgF@l9Mn#Y_ANZW!$gaNjRTbEXyRYHqm!~?H(NfxsV7pdHG>H>ep*6n5aQv z*86GDN&so`cVYLMmJ$2gJz_LLj-57A}B}woF{Xe!A(ix4G$vU@1qHceEHCWR@b0Hj8$)>tde+we3Y&*jUx0< z=e9yoPB@Pj0|*4G4`EzyJg}Eclsg&v;Tt06KGdO}iJXJWV8Ic$@463W^I*3W{Qlj#jOP$Ry~R*@W!-AR z|8b?(7_F057c7U1R7QX;7g>TNr2RvVnY#odf?)1Cx8*l)?0Pk|NU_)p5h=N!aQ8EV8Tra|uDP?}gtuqO$N3hy5fkc872 zUI!2P)V{9e0aV3qL}k4}@%jHFw3mnfif^*K&R}Y^N4)kYq$C$;^bkwU*&8e_p>#M{ zTwY>oQaS6SzQvu#k58x*BS?CIC-WM}`k>m&@j|`YGc?Ul9>VEq1=71Aea%xJQZ}dz znIFr(nmaoK%JL9+yUwCnS4@idD(+cU9((KPlryieuO!R{YW>2uo8u0yTzM5vZSTQP zfAR_V$a_w}9h)8OEdm>zJn>e?z(sD&=_zgFi~EW=>-J~#ARiaIb5vKNWl-<|@Qv@h z3cvH8z64kIPQZy%cf!Fed^J_RE3{P+?y+10g=SVTTEKL?fZ5eoVSD@r{P@S-20!+} zd*H%O2eaS|F?CD8y=*S4qt(vPM8R_#M>l_M{Z`kNwQxBCt@4dd-cjZsZ|a*$zgy#4 zSn8N@Y-!-U`n+eJrqj~|dcCu6i@sGpm6I&~U(k5vrm<2^X3C&3hFDhYxht))Nmx{J3}; z@6$FrmI|fv%D)2O{f_3z6s9nkR>$(PYr5&wNKs0{RR$FFWFCZo*_JRLkNu3-h)`m# zUQ_V+P)%<<-q(v(RV1R5_WY=hO~o2SEG+c1DB&9oInN7g|H&H5qde;XP+r?3Ps_h! zCTv%-1i)*=SdChX>LVHJN}G~aK40$~oet%5;*^!uK?y*tqG;)im1_8x*I&9C&CT{` zZEf774z=8oB`(1S+s?Qy%(Yx~xmU&}t`9!1X}^m!8vp|%onG8wJn?RLa-0(9 zLd}ak9cm1KMRi4UO|h```x-%O^|@AGU;aZSCDcktD|6?D>*Rd44MArgzFV*(4h1-Q zZ5LE-6f8YLw2d)3vmt^Q5!<-m4*-@2(9JHwTi6!Nd1;@XLSy{qXh&&%&Zx!bT`hue&u4 zFmLS+dDdE!tuh=^FHDe04`QStb=j>rAxZ z8?{K~Lmvj>XqfsJ0RW^EZ0e&XGBhq|JvF)`$divqCQAV2aE(_2n}-xC02Qx02o-GN zBO6==3~w>mu`CquGAKjGh39X@0f}utnD?Yz?T^14WtiBY#-kXP-@L~@DOT2XPxpPId?vQeXfF+GMJD-c_lreRw)stC=s6OWn z$vE25V#PY1ijnD(xm#h1q|DE#b2(8@NJ~0kGfGTzO>-I}2}BEm;N5-(yO)0m58Sy8 z&wTtn@V3XcVPga^TXwJ!0E1|GfOCo9g+FgrNRd&`vS-JT9inW21W}fHu&mIQ;QS{# z?2R*sYcI6*&;R=S@E`x+uVB1+9>$xeV74S}qY4q4G>r(t<+K9d2Y(0CX$My?y$t71 zP2nd${tkHO+wXv_5x~I$&@Vv4!)q%IIRyFy%>HrD^Vqs=J-QCtE~{y4F)23-lkK(Q zuq_+Xw?3f6=Fw#jVZv+m+3ze*T6?C?DLzvRVVDVt*FN$TjAxZP@QEG?ZL1nrs`bZ= zgxCq`LyyW68c)}C5&<-{!q8R$L`&*i^hvjlEZ_M15_mYOl<4Jp?^mzMeOI9+HD;9m z_VRe&^Z^02^7;URH)Be|Nn+?*f_y6t&F9gX{_`ry`RJ^V5A%33E8Z~Xi03#P>LlT# zeQqH?L+v2pwzWQWyS?|ao2YH^jEmrB>XW1eBOB>%d!i+sbKNo(z-HSl9zs=5Qz-T^pzCx`Fg033%E%R>?ZX%YAL1V_WGR zqqbCzCogf^SYAvrCAL7*a9wu6yNILP1Vkfe- zzx?v_$83r5mfyk)P-GxpyT)3!nA0F9#El*36+4d%?NRbuEQjPmbVpWeXe}A3rkbb! zQC21WCwo^_qbGFGp_A5yGKaDEwwcN4>4Fj*`xaKUIqrfO?!YZ)K8B2cwIzeTY%yc4 z#ORw-ZDrv4Zk`WIWf_eP-kQOl31$(NftsTI6{f+>O%#HOu~*<%ZM14@%wI3G_7x$Quci3~i(dSUSNO=%D}?uZ;o=;= z@)zHMZ+!O!*xI=ZCexF!2n}qg5JFv^55O&+Bc@QMy*0(n&qXM#yAym33LankKIC#h@~Ip``m}1Cv56 zak;RyhB`iC+3NaBw}@+MV>*WA!9E-uybg~%a1MU#Ll3|c4{k)jJG5z{;cyz)8hYv> zki$_)uBWwT@_M-6K_DM(j3NN=$6tC5zV_EIz<7ERM&m7jQ3x(ddl^5<4qw;WBU=9i zH1itFuD${f-**~*{G)GycfaLiBvzq5Mu!iZTH1Y28|RH<-#agFUwdqubUXU;-U?~e z_HzGgmK5IFZjH64<3o8cBD~kkrsB$ls@3ycyH#=T!QxMvLs4A9CIg)zY?jq9N^jGbYbs z!lOm}JS6?jJAXZmt2dW@=LBkw@kC`GUi4C=boLt*HO^Uae1@}TytHia%$PHCd*hFz z+_RcB^3N^ly8r=12jo6AWi&!w;vwz&ru*>BGiy-5_^uF3Ps;*HdE^f)nwe8yjBLc_ z^)-4ml#V6P*V}Jgj^V!=N&9nJ$ErlCt6JB0@3kh7iJ_zN0=z&CQt2c+(iA{GQOy+F5Q>x0Xv!E5NL~=xYLw zCFU}ZPCIma`r4dA7t})bC4v~oMwrLCKLOqU7K6{k22E)+Y7EWadD%3da)}MsYCNFi zZhioj7ONgQ zD{!#;JpA}GpMYmR@f6jHVVN(l4(S08x2=Y7c@N9kCVzP&(8_kTbD(tM&-XXxr zFx0(dNY)j6njnK@G7k)Z#*eH&Eu;{*xAhiL0Q!Jk`V0`Yl_eN7#EYSCe z#M{moyRsi_W!Yt1eS0n}t>ws`^4^RI1H+?+K;?m&UTU3DUcTenJL{G^lpgf0*`c(? zzUv#88#SIcQyMakL;vmrW%Tc2jTYEq zPaIp3E%Y@2Ekk(?%=_W(r*2L8$jZH~@ks5od1zi0Uc+kx`^;CUwI2sHPUav@uki{% zsuL}fQ@_LCDCbYB9gqc!9yC)URgmCT=L>YIu&Caz1}-cu@%*s-QzUe@!^g+doWzu?($sFw%E$rI$Dt!t7bWv7EHL z4UM8LVZb3%2g3ly(95DxMn;gcY?blVgf)AY&XTPBX!<`24jUIRpIrf1UV%sMKL?-q z(0%a8xe3e{3)r0G!R?05-@0iCFq5IwWd0vDgVPaQ-Us-rzqtxu{rZb=`RW4hI(ruO zm*FA4@0BalgVlCa=}t#xr+0G9I*_U|&>dtn1U_JKR$?f2riOv1PvVfXC;uR?-&2?BLjulY!CBviSQWMU9rI+zl-lz|t0g*(YBYMYS#N!m%+;;o zUB0#l`_lF7+bVTguya-5@P$u+dF{3)OYGBAgVr*UkFICKz6l2YOPGw8 zuy^?-*qK~|pZbaS!`mJ`31bNN-iLV*)s_saG8|JRBzMiH-lP=w zrqegYWyj-LWs#7eqGdAl%lt+Lndtzvo&MLC*ebzo+U>M5O~2LZyPf8a?Ubxm%d)lbD)m`5icO+)F+qq%_DMK0Ex-pFq(vIRA6Ulr zm`cS8E*2qL6M+XJ94E)<`M5Zv&v!9Irst~|-YAHh6?ujZ8!e4=_*>m4zAoJZsG`Yt zc@0bW+QUZa;DRELNG5IiZb}ONRBN5eXN3RkWKtlip5uXOi1KB0Wc)$TUh8W&bz0Nu zbd=|7ty*wg&KfXD%GmI4#R5Qk4Wt24pi$mI^-H5E0xIU4C!rcS1<5ug{} zkb}8}(0XNfsBM8Ps^9E=yjGq~d|woand-Af9M#&*%2w?Yhx#fOb*=rYaga7MlNQSq zr&`McHiO9X!!`=|#Ldf7e2xbbu9Xhvuv}b&?%)l0@ZmG?=}$fZcbx^;j}Zabhd{e0 zH4B&ZHP_k#g|48G7BWZPaaKZ)=G_uzOMve^_XhmYpZx{w9!z29)Lk%}`ftp^vuoJkm)`2j2suE5>*Zoy}tc^^D{_crWx3)o^*_?RSymPTWU=6gtfewGpR z0rTeN?Q7G}wjQ-6ausyjjzeu+`m{|JSgBb-=)9IDmxy{^rkCHgVQt2NIN%(cW>a}I zbB&fp>Piu_{{jbSheE2HvQ2DZz`qySzQ?}k+?wrWvs$KSjP2&oTsBVTIu-uM!9MxO zFYo`i&cPb(%jdhL5xFrSP~Vzfbq%%7fFWh|(I8t!AC0^jfwfvX?AQ$bu1}M{>e<5Y zw9u@VLB1rCScsN77-H16RTV6SxI8Ppi`1gxl+@ESrq*ZyJoy*n3riySQL}|bAPu(& z=UM10GWWG6f!uDgDfgj zHU-yF(U|LG8I|fm7#R(|hnT`C*l%o@EqTvQ;WENjX^#dcR9tp8h0+3c20W-T{6&~d zDS7dw{64d4|1Nztm~m=+Yk&70aQ3;5Pj3?fOj%cZ2@O5X`ydP?Gx1J6uIJZM7~t~w zZEY>4HI`EmE!QG#=J{MEG;t^| zm~NZw9=Ei{?jIXV))Peg`gJQX;#SzUbglNAll|6y!;Flrv#;GS}ub(553dz?2H<@gh{0O z@kXJ`A9!F(U&Y>30_U~w_1WAfu-49?bp_>{CDr&E{obQ3 zEr7~<&UC#--}HN%s=SsK0jRn$`Opdf1&7~O_>{j5FNuF7AvF38jCX}iUyQGgT3gkV z1YpMX&G(b_c!v6t@U8i77L?N-VGCQn5T&eNH2084Tqv5KQhUgJc~oNa`?#&x3 z36|eHS%(Gg)czje&bC=8n!N}*HU38@d`Ae2R>H=mzl3f%&(26xG+>>s1who^s$V>i zQki!6rb1YlWtKV_{+A#ouM2|2c>^WIiI#&_5u<3lKzXo;Xz7l|jmgAA6MY^SUWmH8 zBETdcoh;yI4Kt1lQq#3(c!yzR2X>M_Gx~JOTkW822^yYIo{@G_jT{=$fk=LhA|t2{ zgQ!o{Im}!Qku-J!e*X`@3IN+M**F2qWjMTo{W25BkXvaU7+g?7Og!{L*uU`{b}v5$Po z=FzQnXgOXEZKP{{ga!&v8BEh9vJcDiMAO)kl=(}MCrI`P*&^Q*{SvW5K;kQPpA|J= z@i#V!1a)NeQWSxF9?6nd0D&YEWLk9bVWyOy>;r&Vsf^Vn-iyX4WMyHT+a#cX5?t{e z6`_0!2pv(KP4BSMj3yW*tnPCu8>BgtHn0$GX$BoK+^?8LS;bNYUL2}5X#vLhQ~E)v zkH>?RNj)-yv|sj4>d~m^cLI!J3~+N{i)ko0`Z-3+RKYBTD4FP zul~Xy12>WfWcbgjk?|9qY@V=+c#ouYVV&TW2BwFh?7I>;46aY6Pa$mhZ*aII2_RIFh|=l4g#EdvNoIZ zvre%SBXJZnHEh0b9>MfD_NEoSh5%>l?vp-Xt@Zp?NqP*20FSGtK+`=-OkHO|_l4_s zTT-VnEXc7X>|5C`wBeBkBWFNU!p>SyY-zEX9Vr z4HD|lSYilJqS{_5CxHXH4eH-=u=8)l8Y?Nys`(8ss>>+zvJ6oAEf~rRMhj{SlC?N> zd4Xq*M14q&FXzP+xTH0ZtsRc8#_XUc;|aEa)^llJd95Age^<6Qj$LzvD&KU6<`h^D zSDhjrXSK}6X76OZ0DUt~V{?z{>sBv*D*_&a>eW(o#j zY8+a+ZrrHhdV-HoRm-C~wIIw$nns$qf3^(~aT-MYHFCnmB?5wfvJlN*7@>M#T187a z1mPBKe1jGUGR(gzf4;!#^H3n)`i^+PY~-82x(QYgXx*)*VyCd?zxla3muqt-;}bOD zk(e)|_y5JgHJI(c3QxS{et6GQ_rj?yyiYqO!;0G2TMbQ3tDy7SXIh9!dq96{L;tD1 zFfz<$cw>OC{oMh4_3Ia5_h14W(;XO%HWM0S+J}ffwMm9?B;&GN?8EM*SK)*2d<;JJ zp~vCW_7bLXT=e2PTBg2lzj+LyW#0P0f|l0U`*v04eMlRQI}NR~MT7e2M60~My`WRy z+|}wF1ZJ+85(9w18G_XH_S>_rp7c3G+BFqES7;P55I%2g7^LhM`x9WhLr)k{<{K6Lnu4$R6QFU+UTCghv=8pOb_L^^!{kkt~Xoi6NIdWp1<+N$(|RM&e>~T-nYW{ zR@zw3r~13{eL6<9RGODfKdK5HuTMjh&vT-RP_*YFtT<MCY!tq$GWrLtAc zkCif|?qTICyNO&@*PqfF;fMw`K*xKLwCH7DM#OwGm%BP225Tofn>8636`83Wye3MS zEv@xPpOnm*fmq=RKo>U=WefwbSj1qWjIhL_70Gt`E42 z+&2@)-)YgciK>QT+NmY@_Y&@CuEb_pY(k}+Z;YI+s+(r+vPFWXTD-}NYj?Y0@cexnH(Q%q?SZzaWO^xY$`CH{{0Lw?}s>nCKkADy|<7zH{JH2=#E zrW3?W{`5cpHGKVBFTwVyd!XyKAviD?O*p)dK}_jzj_ZLU3dEZN<3L+x0E<1Cj`rY# z?|mFT{JuwEw4nC^9$^C3=-v#QE-rAn=_wZ_U^a;H~Q;ShQ?qtWr6Q&QN#UIii z%a9MPuW!Cvb$bAt{+-@y?xn9im{kI7Bsm#hDlJ~330l*G`_-<4cz-wB)3`6=USgB| zXsM$ZR1U3GxNFYGCjgp!KBu!ecNeI?Lx)MZMFNw?#Fr>PLq=0J6bQOesdlaoJ$r{d zw|lMzdTD279{5|^w?hEPb^36<($F)|CXcpzs4r&W1IwsOcNElLUTjzv0=d z-nlKq>Be@a2YO=VN8(G2JWbmbRC?5?3PVf zbXk}=YEM@mlG8sNaBL%nlE!MoclkM-_GnpWr>;u)#|;VGR3x^)&JXnQWenn2Fy0*p zVp zVuIR2WdgYZO}87y+aUCy=!ag=b`dZ@vU=3Hx@XB$>o6w1h1PjMie?ms3JS@c9s)mR z4^=**KC(%-xsPN&$7b{i-FUyt2Xt`DpjX)1_uMqa;AW0KxGn97)Tti|0X9u<0XJQ6 zkVRfsyX6dEc@55;8pC^^x&t1)X9SDc0!EubqE2^orQN*r2S$fzF+twD-u0kNhXUaV zMFip>900!h#t6Rr7vF>LKYtPKxbPUvyD56=rEx-k58=ynFAvWky5kn9D0=>1%ywb4 zxC(E3^lo_iU3bF0XGd_b-@#}jjmJ^&m-?{N;74uTyu;B01oU?roaxJZm_FP{hTB_1 z9+**EtDfMoidM-JM%v8iaEqAM_p5>weTigob?~T=PGm6?g?KrW)LE<;OQxrZ@e52U z3Hs#sM!utO_*j+si>3!*<63_>zF^zO+-PPBooI!AAbqgQBId7fGDi8s^bCn`){mmSs$E%`4gWzp>X}#%s0wO;m;5FN zfzo6x7&+xwTIH^5IZu*P_Ew7WhtkF~zaM=hY7MwrTY0F*8jVAs$0lztyFecUVjAdK z19+_QM_M*cZ9x7Y`UO(wcgj!xFytDa22K(fjQ_IFJoK9>6$NYC=)8-y>^$dG2_rv< zbgf9Zq61JB+_;ul>WkMstn`@>Liwv=fD3d)%b`Sb%0 z8!{Qe)%_)W^{-!n@BQEnm@OtSo}P%AScXWxJ`~~N8vsn(P#%EEcnPz;*J09Kf*=3b zd*F%3&qXVw4Z0Q~Afb%0KOSCx50ms7zmaK``MuuhxazKr{ZRlPmSM5auV)fQRJTEB z8CuEY9}H_FmJ{fAPOF&GXt|zAOro}}I(*?(|BdgA(5dXma?wO}S7~@E)fRnh&)Lnf zcRk=@)iu28+C1zYxzPaQQKuomc;EM{oCk-YCAOYb%ko6QnB+W0p4b02=leNicKq9X zQgY?K;Ft7mL=&{-Hqkd7(`2dT43nbOV#(+wKta)V&5Kz%fvFB!xu$24KcWvXg2^~q zG(z|(|IjS%joa2#XagTJC4~0EuPpb3@uRmQnt=a12zAf89eC!Dm23@7yn6C zXgaUXUhwU4T7D6ABUu1sDBZB~#aWnu`cQzc!jJ`c89>LL;0NI@C_@B9MK22a|BAqsU_5QlH zXmU2DCVEcmQy#qz1~^JNx|Ab+ZjK&QyQb-?C6wbh!a{w6u<-98Ei|*zwbbX;L$7t77U8MC*LzM)T!-QRwx?sbbY&0z=uiF&ym4_C zc6QE+=YQOTR5lmI{uP30DwU5lEMi>q<#HdE^UHAIPJoYn=rMTUt{s@o7qCTj>NSJw zC}}*`HOU>Sz0qUrja#dZme%Jm>8Q#%s9Cq)D(U%TWj-0P5sg;0C z|7by5ngypMG=%qTp2fp3UtW0|lE&CsUzM_CE_;@<{$4Z8F0dBB2 zDC@AYa~id5Y^q~DPpWmEgisc?*H3JIfF{Pdw*YxShQDLc!deC_{NEDML612bPsXvA z>HbQ3Cj^6~2qoMO)v82vknSH{ujDbO>()O6Ag}_GO`gD1V@kX{xh8#BfAryzp=w&7 zS7cttHpaYpxSCphF%*_F&VuOaTAX>Y<1h{aZ@6v{Ox%|KDnM~{`MGSr5F0j>IEQPyZ@|v>7~b>L{qWX@#&Bu_U~eA}-Vp^1?*fRR z6oe%j3PnFXX4bCpnijYZ6zF5#h6u!c^Eu?3A#FL%bX?5vki&CGnJuBdwr=dZbp*9l zQ;Pzo&{j2}j@wp(y!dyGRdL$DVYez;maPBGWXoM#23bmNQ^u1SEsrg)QgNw)yh(*p zo&)XmeaISLXKK*^qB+zE$?|khBUt_JCR2COfvPo&`hrjlS}P zAEq^A{r=QabkG}3e!~slbl*O+z^n;htmO_>XLs!LbyM_90RUQ7NbOxxI5Ou-i3loG zP%8?Ru0Ml3w7|o1Mbhlc`>YI{<7EglBmgnm9`HCVmkU&$2MYimN3#cVrA9e6ee<8* zCqoZ;hB2*W_Y99A^)8_S-B^`OOH&e}(Qr0(T0mL(_~m8Hl)65Y% zD&wa5iTCf6qndcv2^a9eY!@~+NAU22cfg|$ZosJ#z@CJ-YoWqS9Q8o;-(&1cLjWJD zN%}dNj^OoOfM>sX4W4`P8Z6)}Y;W$sL9_r+dxO20v9FKpfT4&8@m%fT>ZMoV;m1zG zPk!nnaPI7O1Q-IC7n?-1B0m87`&H|cJ&e{BXr|)>#p4On2lSH1<&(w^mqbXgzR^O&Biv`$1;l|!}^W;hP36RVA z+KIOMAOKpn%+6N8a-AI`<)BuLyLV-{1*Guz?sMgsUgx!Akm@I2TH=gXS<&&n^#Hqg z@J8>T(JC*aT<)fbg(TvVCf??&6;P(MXjk7jxDXugaE+oYQxyNUagzJm95w}MoR8A{ zzdXciLh)*2yDIYBN)`=IH^a)hn{7)a4ye^TRQuOVL7+{|x|IIbuChi^xa9}|oRGjR z;o8;L;oO-mcEV@+=Vay4h5>3oeYdczx~ zAz|8n}0ubGfELTlJe&-nYJM2@p3r9Ys5aj_tbVsa+TS`Mow(&WGYLUocF*hN`?< zr73a89wnaUf|u(Q_Kt7Zp$;= z@)1~G4^2{sX?|_(un@XVJ*9}-wx7K44@82C^gb|8QC1JKuW={>xXNh0*jB zOt(%&%_Z(-_U=QJYLwR#9dQyk5^n2^-~je^Uxf$mJqz!7=c91v9UW}MtBWdPNCX1X zxU^bq*V|AgwNG<*)Qqi%%C`2PMel3vyb;L)gGZT$F~+M4RGR*;THkRc6o}D6Ne*Z3 zAGzNR`%A_;TMMZit3At-X#dOS{0)0Q(c|iYy_(^*%%W&~f)&(q8H|5p$RX_rQ2!%x zN8z&|XAp*-Q#WcJYwcSFoNa*wtE}~w21=LHIul&2^BT0s8<)cX(XC`@`Ox{Ofi|sg zv}WG&Jge5}z03cuK!2M4iX=mIVg?mcbO7JxwL^LCW$W99AGQj=YaR4uuN%ksM>#q4!Kq zba)x;N}G^JD@EQU$o=5A9Ba}M$WaiZ_L}=kT&`EAhh;Ibmzc@c`5Y5r=UJ^je`BT) zF8Kk@1&`L=@ENdS`lbK&m;%jE2q71tEI+JjOhtIkaqeZ_s|STDQC!dM@Q%mN!PXR@TcG*Ph}JO2 z=f?h}`**>5AZY-`RpHUjuP4}MhhYKEI0LRoW}pa{I)HC}`*ry4_g{w1(~km7wjx0a zeUIjMz1T?H^rtZ4V4Rj9dAUij%!p+-jefr$sYr?eWSS@?Chx z?e*@})%i*ZLNGShM$HZU-OawKF8dd=J0yJ2ZDyZFj-y)JOI) z5PvfbqBEAkfUqZ{t1P}#sMoo7XII)!j77XF+d;S~6zDPYA57}Kvt-CR(&KR4f`5%) zs6FHLgZD;r(|eD3uks^~kg1>5&Tp=-wJ)uJWb3a9@3pZx4%#y`*|SZzOQ${_#VgZ3 zvpkWl-+pV~wa%D)e&YZ8PJ!9Eu4KnQf|X7L6r&|63oKMmDm1sIk4^z|fsVxr^rtl; zURzhF)=q{0#_>s-Uc4HV_;<^6aQ@5$n|Sz0Mxtpt3IhU?k|4@lDThPTAY*J_s58)5 zr45XN5Z#T&`qlg}4J*-#tc`fp0IwG4Yga9BC)?Y4t!N&I^UJFe1W02xa?Q|feVpHZ zpOs(b&1rbmRV|i>k^fffRSKV9BemL916e#_ruB_|Zv~Xr{MW|M6I@!1+mR-9 z|6d-F9{~JM@!FY>oy363cS7g10u{z(lAAD7bM^!3W7+or)xE>B99^^VIgD1FlsN3lDeqT+D6Xj{;j$Hm|)kb1{KO$fJ_P4QI# zZ~x5V$YP52;Fk8mlD?Gczzjl`}IR`M>h*}1`usyCH{>_$p0WT+hb?djsh^#ViWnPCyW5vZQ&77>fR#wWbzT0cYC>FMlwnl z9O6nAbEn@c$EiyTZH1uL6^%~kak3K0*kgH+TNbdhd33gyoQB7LwckwJ1gRp8Yg${W zepVEu@v74vt=QN7;wNKma*l;+!A{*U;C-P47g;Q|&ZyXi!d%!EX5d0X@obn6wo0(& zXM-*s%wN0h%lg3PQfXn2%;c?-j-G|#HkMkid>+u$vJicFZi}&23)`s=>nz`v06^&+ zr2r^&KeBp?9aT+2q&2{y2&6_k^R>*{C%=yV`L$q2Ka&tx_DRs3FK4j7zYC8(d>_2! zkq6MbHv?2^GvX#D-8U^*9kqf10`_hzBiKNN`F)L9%zhgNARUJI=GuG&Uw`&{@WU5h zgA*suLI)esbQvQnC`UsvBqt;KX};niNDcrG_OC)W--V~&{q_io1mO zN&%V?)MsyjUH6epy|;y*_597`j2oVJi4q`fQqV!h9vI6w^-|Mb;TahGSO#w*%t*2o z09!6-&||%Iaa^faxTgR5_Ff%mE>m{4uduJYvim@E>%j6v`nmVaj%%wA zLumMrZ)|(?dK$XkwKfqdBp~{|=Y5oO#ll0PFoHs+^u374XX3518L_HMEPBGf;m*7R zFlkbi4-1b40{~^;lTt!`m=ye3Nuvs=g=`3xuPp^Id?}4sG>uM?qf)ud|FaJx!;#Px zfN|iXgEBG;NtcGP6j#;%tW09ZKnAI@$K1!cJY&aXosPj}Xfh7<*YX-_O!p3Lg zPV1N!r5q7+{3)5IwhA8@*`M;ol^k_ z=sSn9hg;U>-sI1u4*7|HO!<)K+GJ8lU zT(rAY9-&w`u&U3|e7?L}=k?bfDwe>nlkCFsKmch2{lBC1O66rcIKOjc(I$LW3Xd6c zEqCvG%$te@T8@zjy9HXDkLx<)r^itLo!6N&uR5VjGOaybL& zX7JX>?t@1kx)Z-4vohg%)%uUMcpJO1A3TkcHN~@iw(sm6Rs0tf{QCg#?H>Sq`}@~m zcOT%~`5joyrZ8Hfc0M$EJetJo4qg~f+)Kf{E|?w8VKKV~r?&v!|K7L5gZJM7^KJ>7 zqcKd!lW^NGK|R4_itgwQ708DQ4MXzkwPEwu_Vzk!^j1l$Fv@+u3joTo4ydiyp~8@2 z0f_zF@|TGzRbYTQCF7{n9tg zit#&jKUSFTbT2Za!DI%^%u6kK^PtaOY)deAL|{0CFB}t)$gz~;-^#`;!3=e0TSJq# zmX15Ipfc{UW*f49_=W2bg%}cBP)_a?$ z)u!u_%J@yv$i$9r_0xIm-4wN6_@ScB>Y}n&kjE# zSC`8EXuc})BSCXNLV;bzndJ&<9|e3?z=o!YKHW}ZlEQ=!8S4lRL_P&ItqZevCuE(# z3aBJo$jHZ*Vbjs9TR0~zC|BAp?Jj8YFxjJ4o|i|~f?7lT-jQdWGD^9n#)9G8g;mVj z^_&()-(NkG)Z!Ov`8y>zTYfK>dm86_LMMv0c-Pz#$IE@Ay&zWkYJED^F1XjZLKfsr z|Mis^xnekmX>=wM9EMJNUdp(lJ(VDKxfF4ECf`9gGY&RdaS^Gth{Jpi%-4I1Q zPzdF_S1o3OS-JAAoUPrWqX54ZEuO%mN!EF2RbX1P&qGtbGxHyEPEri8 z;9rM@WD)-Lc~~}3s6={JVJa=%%zQCvo|`#M^g+P<4L(=JMqUV_awPzX3!;DV4!+jn zGc99(1iC-mCcM_q#H>gX&BVw)Oe1r}h_in}-NYb3;K|#Z(^I>Ji@7sJgm-uygx7s$Z-;GG zegfo8wvTv&)7ql)jYu*_RK>+b z*6+Y5HmTZFWxh-8&L`4m?)%PeyD<6$20dY`314L$_PdrN3om8BMSQ@|(>t6NeIJSl zqvS1_hL(_D+ibSm>i{YE{^*3IA?p|KYn4nz)XW*=Jeja}FrV#3?f>0(orQbv-iA}- z;7>P{mng3gRa)2Ck*q@S*gY!Wt-#3D7$yxe;h(q<7g16f!PUJ3`0`(T6W+KCuzlhj zEEWXHskTb2VB$P*T#?!5egvoJ*`n^xWT^F{=zkp!?4CtguknK;6DXtNH z%k0S>=y7(r3W~f+O7Vl=9I0!wbn9v3zIibk28ohB88?%`<6#WP3(4{z?ES&6hIE0IzN@l+kge)db&e z(ArHr$9i|?4?{;_Lyz;R!jk7^y%8&%uHAq8zTTLzhM zor*>@$3bL@dN^!uhT8%nTp7?J<3irisq82iW%MdtcVu29@0}8~)o@taoWhQd)+Xq7 zExE&<(O+F)8GVe$rn#ognCBOwRh7!Bz?BPV{xp56_EXDFPCc0nC@)eb(R$l=Rhpa6 zRBzItfB_RU=&$P>BCD;xXZy>_ehVx=P7FPSQ zECrF4bBXmf(9p7umN8jHh_k48JXnN@HB3DZo(R5tuWlSQCx|K~!sK-{|~#TlE2JH6Oa~!&9nf5fI7|z-w>J;cuUP4tDoOuyx`r zEQ8vTC<`CzcxMY!ym2LW3(49cIQN4E9PC|$yUuOEM?Ua4oH?}t^JvUMU?A1+nsy!I z-Wzf_U=xmpp;S4Ke68PzO*qVW#K8(z3kIf4^Avt6S|`O<=!@jDcO}7?BdWP{Soc+|yw*wW{ka-* zTH_&9fe>lDN>%aLDYFLp*a=5_UN@~dN!dI~$%csQ8U5TwgBkuErujp`Xc zT^2G~l{&K4W@W51cX>MqK+qoi`CUe{lkneGQZij<%|C-gt^TNbE5`yFf3(N-DE8|} zH1MVNU*~b_6494{Etkb@fK0X?`9J!D1$4tfvvNVs+wdRX7zjQ9Fvd0$LjFpjDpH9; zc-Yij!eZ13uZ|JT&x@ln?h_?=v49$5nI>~W-REe&NP|MIjUT zKDLw<x9w9zr%nFUZW@1Kn8#$=1~8e9VX-)X?eQGm^5}hV?(9jJ zi}Mc>n8oiE-Hqd^6el1l<}C`?Y?YCZy_Z&bXSLth=itl_;Bp7>?05FyrB|=OqB{el zjT5k(hx`~r6$N*0w6Y*z=dC2*hb7x}`>-)NfCum2f+yd88cv=-6X5`s;L=s`fwO&$ zV=Z#UigW7q+Z(@ZkD2wLftFUi!w;Ioe7>1dA9Fl}Nw4q8bTpPsVVe$lb9-EX46oBj zuXMlE^_a|ZNL3lmHP(j3HV5<9@JYB*M5n$snUruuMwpQ+Gwh*z#OD~F8D<=GxU7*j zBc*VFB_p-yU*|rE*PiS(~lTxL%wJ~-qBX#w}w&JrCE{NuH)*s!iJW`P>2T5na05~4U@w?a_xM3PoX~pv>*lH291;7w-_s?jtebQ~*G( zDH|2zdf2vjhuL}pIWl3qQFT4qM2s0moz|I)RW<**J#OnQag6O&$adUlOIXgY!HJVg zc>7}y!r3#MuzUfhMR{ndBjU^anq z5dH%@AGgU^Stg7!@B_yK58hC0)bKBsu)lv9&Y#B}nR)R=jXNwH%-w2g(C-3onMWu2~)h6n>KX7;G&=dk%(%=fAS*I`p(2B;jI zYJMc4_vmxS((|x?;vLKAY-*xH1ctDi+Am7qy4RH^M}S@)WNaczEW&>V6tV>!awpXG zOcX%=fvyon`nbgX&ipL$7`XSD2D)sd!|WYJY71w{x#Bu$==!>zg7>=g>PFF~8wHLI zsdos-JhZGMNh0&%J`GNJ*=ZjN&Zx~HZ&}2DBxhqo5-XfqU5d&B?MziU#jCSnthiIW zJWH>n)xv+`>$QN7k}dNr`kpsBEKM}n^3-WhNkP5i#{j4XdHJ32 z^oHNo-xtqByvm~xcy;Ug^q6?hZJtay>VfHWPai$?Cz-?)RJRQoCE1lfV?@Rje3Lg_f)ok6)OBuHdu@!=>4j$ zTXPK}G#`@Ltq#RuHQ54CFq1}YB z45ufo^<<{QwBH(|1|4T})_PYDUp529QVLhU5R*rh_^ zV|44eyL%BHdf-lY*As7rDeZOMtJrUDOL9VJh3}*2_t11$uxZsj&WBd{-|;4o(HQbg z-`-z0)j${_%2A+{H$81&K#_%Jdghgnf5>^$4ZO3g-`l@!`_sN~Oj(qCo_HDdzO6L> zayFTHQ{kWFbr`ORjYE&&_o}1D!a4md+B9X-pUz(sK-AqX+M9K9_-lt$Kzeue_cPe3 zwqF0x#o6P1uY-Qsxje45@1^TiPpjVJY{QWAdFZ>L?HoFP>-PJ4t`9c}L#sf?Vqb8~ zb>hYwJ}z{zeJohykA%LcsA6R!*@axHn`xH5vn;$-PC66kmPZ$mRwQCo?sM&vK=sw; z(S5RVh!rli(CN_&E+=bc`)YpbukvT6FJ>1mS1L5J#W(fw=-HnR@lLJsPF9`Al+K|g zS&lKD>oXZt?!N1H)MJ-7tPLtJF6xMlZ7KBLj*&AaQcqbID#ZqYq@$h%b>@xL z|70yIxh`uY^EkSl<^!%n0S42=te2aK%^R|-iflF_QuII`l_yMD@#Fy>@`+3Q9W4Ta zEV8kq*qedc$TToQ!iou6lySRT4IX>&6gf-1&;GnV0>{dSFnQ!eqGJ#v{x@@+uU*>n zH3|ii=>1J#kB6Wg=3q<6T^&jG36(m`==-BiS&26K$jFc9Eie{c1Bl}mug1(_JYK*Z zXC`ph`6Zkf11#nM8&e){wa+plV)j(g&AJA29f38KnpYRPzZd~L|KcV1_V-?dZhRk1 zrd#Zwm)402F~-+|1VPkHc6fgP-Fy$;^2j~#jwkOI{v?|JQyC?ae)J4f3lXlRK1&c= z_A2F--_#D`c3Tdc*4f|djOC${5{ielCs8w<$SP0P@sT&P7I`DQV+%DpI|aur=m7sa zj?Os4@yFNIq@Loyr+c$}Q;0n?^FGzixPn*Uu>U-!A<{Jt1I7$QyqqAyaITH(nrD7? zDm4e(Cwg>Rv_2eAicaman5Gr?TnEzHquLjqFlP7ZVd>aW?%^Ayv0o(}l~8`u^_3ZX zc@Pfjwu4z@9s75S&Ofx*F~p}58cM;}UZvFk+S=&3;$4NnIY}9s7j@#dEYuP$GeQ{G zQk?Hntu>j~=S*XSyt2jEwZaeASVKa0WrVnEI=1S-)TSfYH!YRLI@Is{uTo~=vimMx z**4|PNOM-6H)#g(m47Wg&maB?esMIf(ATE;|IS$TgC073;@};p3Mds9%D>JsL>CCA zb-_}8lJPhUW~gPBrD>`uHH$xthWCuFWDQF}d+?`%5IpA}@)Aqc<_Rp!*@H+UK}@LP zR%4B$sfO=I#4RDB!l93VN#FvO`>3piM44pO9dSqQ;-DA3SnckXTg`VWrSDF>MeyMLy+r-cOu%G@u?xkgo zGU|d>d@Hof&V@FYbH7(7T{7288tNgbw%r&%x9CrehP7yVrX8!CuYG%H6`FaRXYbH6Y6#74_1TWukTax4 z%U0owZb&LDd^r3VNAO@?(V=~2jIuDMttvCVNeR4}a?0!xbM1!#%XkWp&1wkkKuR9jE2jjjB(_XX`?&A+z3 zRt$;0;4XWK&T>=;2RRR~=a%ijtM2F^6#a`$lSHCBlidkvORaXT{B#{P#7DVRxKA(X)lb}Ld#CzL~!^Ec6fzlG% zyt1vc2V0KdJmNSbr>JopdAx#IdZryS&L%2EOAtINt0wr^K3gIauA8K|tDLt^tn%M! z5?jDaO_-=9mod|~T$bpFD|<+5m(AVdxWxOcVWli#wCrGie-C!HH{jm8&cV($;&Ql- zbY-DF5_;p-$$=f3XEq*ouz-B6$fG z4w-PkX3A*#7Z?R{vl0JY&JH37@W_LA!Q&5~g);zf5CxM!I|$h0Lx?4!Y-!Y`gw|a9 z`z8O@JFr`I^f9D|XZ*Cu&h-ZaV$CLov&UrhjoGStgz-q#KU*1}sc7LvN_T8+h?>w))Zwd56nDf^27OzqYQ^N(q{=}56t>#5R z5%*l+A%hi>Y&)VW)T$)#@Ud$wjdWi`lPUZWNA*Z1&)Q@eA0ZFL)~eDzzPwa;+ zT8t_PxDAS@zM6t!h|WYXk@=Ig|%k-pk}WenuEPijM4<-trihwjqu| zS=qM43-jD1xq|0R%PU?QkETQm!sZD69`f_dj*C9S@^K3Pp}z>*_oz$^>%{o_(qp4b zkuk|aJgT-Nu|V-C5fU$MN*@+hIQ zhQ{?VC`v6{Bz@@OzlShaU-5n&=WiYAdVb?GePfP^jRNE{^H3-B$!s=*o$XDy_wMts zF&!sIGL<1?0xKG}Y|`?OYL>z1>zn>}$XLa;0>IyW>qYp^a~EN{bq4@!pqE{7Bvh+g z?Nhp9H9yz|SX_mt-u?(YeE(hXSs;i(__qniLG5$3=K2Ks)_$q=)63r~vsI^NE{}p9 z+^A%kcWwsyVm+~4^|$w*Coo^%Wx`zA3(M=@U-yNZAv-DAbS$uXunn*)Cm zPfq3dmYHW9D{@w=nxDF1*Qz=r=|6m}%ysB6{>--^UI%Mar zZ!SGRqIFiSPiq>Wuok#8hjms%>YRJSYe~2ES!j2_CafaRE^_>rjjgw~^&RCzGnmiH z{Zl+R32Rc-~njg(c{IrT#~nMDoVuc73NtwQ$xEo%4qsV z1vuX(m`Xbk(SNRz1j$qcWk?w<0-2pN7U%>cjiOJh>i~X){Ch7($39>AV4iIx@fd{>#6E91V z2u%GFsUQ4zDHSekX`EXLTJ3y#2Cn8`Y8>_P8nGmkSF!aXh|9$KJxa&1 zTe>TU)KV;q<-K6FoBaH7P;Vu+`DEn9a=4U2xgx)#_J;|G2_zTFmjfW z+7vpHdLaJ_`5{I;I04+=+JW=u?tlp`#su7HLSZG2gwDxF4S{|r^H(E&sV!-3gugEC z0X+A^i}3ozeK>XgURaKTcCWl2%><5z6!!<2Lybf4W-x&nTsS+0#~<5)^QQn7%ViuB zz4kIBmaYXPUkoY&!-{*)3hb?M^Va@4Ai>e38^_e!!_qrE`S}nb#C~5Z%W4=_-`g=a z{;kI^o?JJ z92d>F1hF~Qh(!>3sQM`=8%KqSzr*>j`^I6LP?3<0@S;&umIxOCUudyQyB!m&E8$4D^uqL%tdEo5y_!A91q)2Q@IH_Pehv z|Ez0!LAUj+WSL~rI^PUSiODY3d$tjl%BseEE$h6^!=-|?^bsyNYEilz=L~=l1~k35 zYgBl0DlsEfopXMxIOpCxr;Z9kl8v8MK!yBKlgsdT#YLyIFYVGw%dq*E`XxtIoAk!i9lnHrs4$(O< z7!v8rmxOw*GYxBgg`mYljKz-&$tKz_S~ey|ermKeyQUb$WD!KkK{&t0E5td_#y~&S z>QtA7V^rLZ2HR2?ZB}6O7Z^n?iDwZ2NI&8|ow&F{#&CBa+>uD{d0J6((v2k`O_C(3vJP z5{K_A*D@MlOFk~E#|<7f7E!#bI@{<=o(6hoyX=~?LPza8eUfU>H)+6`5G|k!5dgXc zoH=s>?mT}-2(_Vc<(PE5*CrJ2Fzt3<^ikN?*M-I0>F!}?7=)nE;tGM zbMhCi4(8(Eld^+vgk?OiX8XIaIhn&F51fPh?%9AX0N7h3l(rn_&LPlR;Bn?g_4hDL z@=-AQw`yt$^X^(P>#YSG4q?36GRmWUc5c@aaF`k4!*T>LTP|V2^uUl(eb8z?*s_Dn zs)b@WLWX}1CJ;dJ1hD9qFb^dKE&pT#U_KG~m^uz**V9T0ma9w5rDQ=y7HFodw5C z6l;vVuHRx8x*mC+m7RDDj({S9wo$Ydqha|NBC12hUAHXpTVoUvG^c#djFs%f@*8?} zOT;vj9eQ|8j~8ZOCjrmt?AK?r23JxU3g}rg+41%Iu?_&cBp#gWz`s2o1S_Ovg%48i zMXpt0bvbWRM(Y=9AG1Y>Zg;+9h}S?6a1#7z#1#>g1A2}S3<$DGM0ZA`;FCKb5=$7x z{}@e3Ucc*uNu7)O0m{)R1hi5bvo5l=OW4`of-|Q#V$6HK9+0({gp&A8F?h`E(=Xgy35#rj z6_wwu6zWF+Ur5$ z``aIav!{aiA430GQHtB39SrIB?4X7FG+Yq$l3oKXX76x}p6%bw%QW`&)!S1VX!7#6 z%4oHrwr7U}i&B^X$ySLI!ruj9Z*z=-UpOKU=wB{{0|aT|Q-?8P7FP@W%So9>v&5u0 z$$*3nm_!GmldV(GjW!{~#z@R4HlD{NIhdkW$x)ypzl43N_D@bd6-|kneewdHqy*F` zMa>THMbg2m`?d@$Yu^Bop2wH!aOGyiHU+9Mg>E{6jqOvgIT^$LWK*)}G2^k~XB^Z? zkLA#n5J48_o1ppFoZ$0=fPgH+Rf~~WYk9(ljH9)v=-J&Kv)bA>9wAH`9O~RG)8TY1Hc?kfOu)EeVnIT-}>y$|o)+D&6=3ybit+PY# z_}D-Hvvr*+&6FVJAb4{#sP3tYKsO=B?o&|V4gdA;6gnJ$<4mZP>7gT$hmJS;S>>vNb0Mlrq z1^+a&{0ozNRHw#`PTidGlD?B>6MuiLpK5{5D;gTE0i?TxUcl))a=}iPs0yz zb)+CtX}c5%+G@6TXRLuJbZ&%SUGzW@Ad@cNYn?Cl3oAg#v* zN2dtFIq!2hxPmaQaBMziIC`gIIMfjo(RNlw#&5>}lW7O@ZUesZwF7|B7ECv{5UUSB zdfY3j0BRAV{}_ElITne3Yno!15%vFqUW{}YQ&a}nJG-RsNl%m`p=D+{kj@?KKVCBk zQG$Y@LnUfQE_<{5A*aLTP00c3qEl2Nmy3uJU@3oTBVnyNoW(QhWcwnI+ zm!$3aY5JmmhJ7tc3Vp<@dPu@(v_yx1Q~x;Am4>B0p>90h#Ap=o#Fa8&c_1cZR zNz~C2anF?!^^`@PSJqKkNa?{z3+3%xF{hAV1OTEHDt2dBZR(u%c*V@&wXRrMdc`?X zQ5j^+0`SW+z&c67;yD08;ju>LZ~-IzZOOmT&Gvdj1|)r{Ap4rN(Ahb>+Ngwc(kc;g zPna{9`JD*bTQG$g6#QozpDo#YJflq%^3S~kOC}Pu2*RHcFsQ`ZOw2`N098yejmmgw zh~~~s1tA(33BcJTHS@ealQu5LE5qxH+eaG~LN;i<%|la7tK4d@dnlVIZrR^XpN;}l zscH3FTE$v9?Qui26KNZU-auhC%sXwc#S*6D37kARhLb1kJyu-@|HsH6=ST!MA%^Mr z8!}o}d(zj(n3v4DclYM-?eDw580d(B~oIiUS zo_OoMaB>rgRRTZE$YyOy<*^H#cK-f8-ii#}&5#Pql>zxzHPP#(l`fg1_(7=tSv%^gMkmA zU#WjugF}&K;-0ixir6WRUO@LDNIemX*xcHJYx_(1t$+2OVPkX^MlgeAH^XpWA#(_? zs?JcRiJ>1cjFQk>B8RaF_#lQ*OoN|W3dz+7np0T9#$*8}PmJKBA9@OY?H@b?Z+&0` zPK?p{plDDIku?43JJ(ylzde7~;u(6{ccW6xilN45g#TLR{9I079?Q#lb=o$zp5O3s z)IY2SS^ZA$EA7=hJXtu#5Z|IbU7?>@%uv49-v7O}uE_*`t7%u($x@~8;FQ5ON%81W zI9L7zR4(MmWNoA?0Cw$U*Pqnb8F4vlzb8-WJVLkR3PkF5eB<1uPxRaAjgd=ge6sgD zLCF|C+d0HYcoO$hG7Fz*8(xJ)-r|$M@E(&iFiz zAt43Z!g0aC!fas{S=)fcf9r!PPok zt?8Iorrxj~;fQ$xvm{I+_ftFEgF~3@$2Z*LtSu!0$r)fojg=`&rsdV+;uGKcJEw(> zajp|wKW|37cpM42l#MI%6&QECL>igqm=Eu@qXiAX)^rLxTT|HFRE)V|Uej%4;$(Yb z!CO$n>#H|DUjMxO9q$tWc>VPS{NTAaVE{iXu~wG82EPv8^i zI|B-)dHN>VA@!U>KFCHa$aU$-2a;g-^ zAad!6pGZEx@J=K%(x{2T83&E2Gn2!tr=>38qKPjIx+2L>qdSafd`R zbcp3lpjO;0l7o_d>FY|YRY^RrK2sgOj~v-W*3I>HnC2$%FaaQlKuQ2^BiNcuyeu!A z?RPFwfi2Acxx%c3^&@bZ22>nTlQ7GDpAgT9&e$1L)-nXnMkZHqSVQB_K%BSNuDUQS z7E1^Kc0h^0-F^lhQhlB*G%R_7F?Y)^gU?$1o4ypwIm_EwJi7!8@HeK_X@ixgQd9@> z1IFjK<&jK&EGvOb>~m=xl?Hf4FZN$}0~-5qFl$+t6c>R{KzT8c4wA_y!2%$QPi_QG z@)>Va4h}JUB9P=+4(1u=zYrd81O z@PFZ;T|^6j?EnD8I2(K*kl-(&NBU??I?QmXuNa%GkqS*nAes|^YfFG1z6|i{#eJAB zPr`Vz0SCcC2z!QyupH!J-={;43ZqTGgoFLdaL3tgc;w+b;p8?Q7D`js&-hWEfu60s z_uAQF-#3hCw1qzCX4dP5U#h(NAOpF_Zs~EpZp!XcySv} z-}wlPHcr8)3xaphcp)Q-CnpK_%s56+YZ(tv%o7Ak5-Js`P{)*tc0+4;JdTzC;q*<0 zdqLoz!e|_Buye zA<-BGfRcHLZn+PWtvleA%g@6fed$^F%qQLjkKBD4CKJ5!5WX1ZI*#Wios*t`zb=?K z6xe*TrlCB znE5@oqHm8SVJiu;iMF9rG)(BJ#qtetA9Kw43h(Z%S52df_Qg7rf~DT}RIOg0sm|mJ zfHlRvEW7xx(ym(!KbNG56$C8%R3Zy!8i)`#@gGr2|QHm&131i_MT63 zH+;2cXEjHyQ4$*eHD?dnVhPIKMtZ9Cfm-&)>reP*fK)lNG8Oihjh1ICHr*ly> zU1|4-Rw=VJ3l;%UGsg!Tm#x=f$?#;_AGyD-?gVO3i^|9_PBTW9G8pkwESHkEff58m z?Td;W5RgT&ARx`5pcL$BTU{Yi;fUF(Av5i<h1cHuAl!F8fD_(|^60BKf__?mZQo9u4o4$y#>iH8$18 zX_^+a?esgl>pz&^^<^Igy+&&T7o5pF#iM_JZ4r~IOLRY4R5`V#6G$P|D2dACw)pDq zP&|3YNmH`vCiYT%)QX9Nz0VR~9x<}}IWPb}S(25KIW!KVX^)JQd{Sz78 z3bw*BgeU-lS_c6DO@$c6W-|jVJm}7$`3O4sVJ%(aRanDMHF|?7+6P5w2=Pf)2}~q7 zK00eGQ}~0d*ZfPrV*yP?vtZtYO$#$Euo05%{4nA+4EbAM!|kQQq=lFrd5$j!2$~Z~Bb8>hspC5jv4~sm-y-wzCuU(qM_kQ>a z%(^WYPq&G1qUJ!37;oPx%N$f%E@3&_h5PP04Uav1SJ}8qQpSM>?XHK3v*V`wr5VOS znjIn>BJWkN`Y?QH#-XqLV*mhZqKTWA*Ze9U4Jl9k9%AW)bBXK}Ua85EeQ(_TG_di+ zoa|lOhs#&4!LpmeWEw7|OklZ)o^551;Ms=1<9Zgfp0q+^ezrg@8=2Vhbtl=4mAmBF z>!1k_{iY{k>Yl6xqUIk7ihOCUl{9l7X_Z`K<2JClFa3XG4{49YY1nc{V)3rM5Ey+| z-*2`UMbBfSD9*RQx+eUWl}m3k-ux`<|hO$ZMbpYycV}6C8&Ig&WM9d@m$g zNZ(SQ#=*onZs9R37h~Any#@z+2QY?dj1m!RWWa&W6d9B3d`oAXJtx;;e4FRdn=B34 z-+esPx|S7QJ=b@v_4(1Rx6g<>3G7PR>-}7n^6X9kg61kjQ>^>~qGnT{>Dt3S zwN2BjY=4vjRAD|X*NW38ViwOludIu_&86eGI!zPWo@uWQPp#Krk40g=R?E2b4131k z>KX--M!r|iPuL7RDP1~G4$$Xk;N`M0&mFgBe0Kg%A?JCq=(Djf{jTu?oQI#aESoaT zxT3)}^sruU{9D%%ujCfIu%5Tht>5;^dp`v1&{ldZm&w_O8wmfSE3s0qtYy9C)IVzO z%Dsw(BReosR<~%?LVkG@0FVy~Eue^Wr8_=-LYbJwsE%voio*%&LDA(#vqDt`h6$sV zp)`@0oovFHh)!Ig5{u0@qYSYU^yO}*S-`xwY@1t)ycmZ=rcy{w9(=>=gE%AEs+BS5o^u3!zVB_2L4HH*7EEwzx`9pl` z(Imu^_5}bo!_{@R+GWQ=Gyh0hP@{!dI2-Hp)r35fgI8Wh%y$UN_1YU(;M?DQ8D`xE zj3--S4B;ho-j%NY;Mh@#-2%p=1Gw+rEqLGoI>2b${IZfyi*=GWMr)O$)C9S}|K>;{ zV6QpO9!;}MNbRn!c|w}v(z%iy_n}OFGew-YgEOa3!rgbCgUM(K%LNAii*f502s&fS z5{+bQmjraFD_6o!;k`?a!_4#xK{a(w2o4^ESd1CCSk5Cen?hrvIcn571p${1@Z8fc zCUj)QOi{Wgn3z1l1qvqA{@n+zWkcBrVOu|!5Cn*f9CD|~q>@SvNjCNw!2%v%azaKl zEqsjQi=febj{aAY!$S^Tm?VFsl?n6;R}kXqznsHzIfLnV38zo*z}C*TxD`Osj(`QO z=X{(p2Vf@kt=A)2&u@aX${4f+u8``CdIRtpxZZDt6!%o@3-eL9ClCZ5!GiaVL-$wd ze{sfYe%S1V+TLK{O!J>LUOA&7mA0^Om4HdVj9PnIb=IEO1lv|(A+~mtQwymYO!U@i z|JvoqO}U~kv9Be7kny*Y*XP4m8MjvQ=&0r;bboD|a|KZuv5e_A{vHsX9`f=6A7A!4 z$WR<^F`dbMvY5P=m*pHJzCO2d7v;4c-&j3`w zx*fzbIzq7m9HWT^W26^i0%=sPD)Q4u2)y?-#;I5o8PlNsEiedD*3}{$Heva-eqo&! z^(u=>8X>JE5kf8hru?>_3?4Aktv7jEHF^%5{-~Js9^%ZF3b?M6Q#N*Z)vV7}g>#$m@|BA)>dwQ~WC!-=!69A1!+C)wt1-c}I9f-rR$b)6c610R$a|NW!c!;2 zd0!@=3mxK~Fy&I=Y;AwlS*B@e8ml1OCdODDl&LL5SL2;wGe`Qjx9>EgCGS;?;+9_@ zX${BfPF|8SW;5%$oO9SIz3vcXQHKfv|1`n^c4){as<-g zv|lx?^5(V$G!NO6Lj+4*Mop`3PqZj|5Mf0SSk-C1$@pR8Xb#`EWfFbHGCA#z5U_0V zxHT}L#&hWJayg*RTQR`l)ia`S<@lAB3BC5#1%C@#=+D@BeUd**6N31?a%yQsoQ#`~ ze2A4-=o{H!X20`?s$Qe2VRJ#OiZJ*7aqi1XgFKa7UT(WwJhMl`-f`^|ux@^E^2r!N1uPXRw!Qa|C)7vBo_6byKT82665wD<>J`6MpDdxY^P=n5YooqS!Wy41!+(ez z?gPLpukORkuU-TgZ^CG@0m}v6RYKyH; zb>A_ENqW3Awek)SZ*2X8X88LXpH`(6LjcAyKkvs?SH}9|7fy@d^yVFJy90jyb03D2 zo7dotm%atl@d0d1!rBhb0Mr4V&Q(h67l0q)Z#FDX!ax3}@LD{Kg;WGV7DL}fS|nCF zbnZk)gjCHk`K8Fm3%&6ZC!pSQla0`CMlBPtS4=}0UN40sA^2h-5nC8leeF*7Rtx_4 zA6Yoj__5UnM<u6lRra_m{ zE^iegR!7i%w5^78)#}v!LPj|~FTc@a+TZpPdGkUo<#i?`4)2umrpVT|>br;T*&&lW zgeWc)n3dsE1@P3bJuTN6;}mUVvu}$AemXi027rq*fR|pK!Ij;E2mpjD0PJq0s`=BT zEt)b1*=82as~^1oF1Y8ebMY0MGG``(1NLIQU%vLH+1G*lL0kQl7C^UV8cLf&(&Ou` z&)QlYGQLCC%aJZ`0)=u44ZHT_AWmUlhHm*#=#@~ zJPPONrC#6vkFAnD$C~y82zYCU|Hv((P)SYuNX49%@l(t(TOriwn;lE6pZphOmO=TV z#@N8CYddQiG}+HeYp(OBXY6el`^F}VJg%$-5s*cE64Ce*aG6)Eez^DC76e--jL_is+0JcisrT_nLul2Hdh&pm zqZk)^_ITRGTNM&OPCHpZ<}^U%)0VZ)n8@FHA3K75F8n9H-0u7AJh42)isR07-AmZc zoQLiMs4ZXP(OTV))}B7fH6)e{>MAp9k^9!k>TSvS$W;K8Au{36eXGwwJ@&Tzv|kPQ zQ;9~`tZ(T>XUKoo=H5Qb+r*A*S&%5#+K}<&HEn&Vtc{t>iF3GOly32?}|!yrJxIOGFl7i+Rv;cyGd zltKoZ^4LjCrWrIEbnnlbta7q#;=7j|)}yp{uw~c-$P~Q-D)w0gQHP62QJu2lt;F!T;@_eg-zCUxMHM-7mvva|5Q+a{%Kl=oSPDax84_ zC!b9b*kjNC=(RqcaTEohY)JsWFrUz&xFHNv$rpL4T#|V!Db0u65p>9x3;~DV)Zk-H zi^0}!!J~K#PsKB1m;ov~G4e?$KxaePZ*=TS`ib~kUtgj^0&*CuT}Z?bcKkP?paEj; zuXPu3Oc_`V#f_tTaq@zagpu(QCa{3%=m5suRXEst4nF&-cf&vX%^!o{qcmRri1U}` z8~^6E20ue)oOm1y1w&iF_rQ^(79Pq<>E9bK3RV7&MZ;`Hapo08&8t~nJ}n#}jGQ#!lGJ$^Mg=1%9ep&Kzu0Wt(JmOb%K zND30blOoyqy^r5zc4Qc0jd@Z8Ys;%U9`EhVzm31{fdJl^l*yM7T7AmCAcyGsJ1xWY z`|??R6>0dH`Co;~4(xZHTD(MUOuc-o)>})l&MwKSa$St1X^b+H_DJ%v)wwdFtR-;; zj8^ZVEaB)FG>%tcFyY=za&O*ObWSyMzV+Jh`ssd&&Hj=!NmajMrAjY|dsQClCqseYsp zQhh+%y_5jH5&ZD^*Wjg>UW3VW6B!7$u89#2N{b*SPUuxTyj;fX0?Wk=Hm3lOK6D@4 zdErDfVMe3hG>+Itsk%M{gn*~s<(3&17&$yMr@y}ixaBocYm9~p{rx~_US^Bl9dF9d zGmd7l0Uf;U!43E)zxKYk*8lbI{25G69Kg=m2jjY&%k>>)0*;cM+&Ra6kEoWuJE)mz z?R?IT=`vo_r`W)BC$_j3yJEtjHDPz-CUwqb%_wL_LXRGUuUM??M`2by#!cK8Bu9!o z{&GiOp%IZM65w7qfAUDg&Bu61F~}m*a;66Xe2I~K5`z?(FO-82aOh?*oi1Ru`wDb> z&%;mu`1|2Ee(Bxt?#DJ@;>1YDJ|zc>Ug~2|`@X4tf9znuEs})#MaU`KJH&%B=7E)xaq!rD8$FW5vDiBc$98l3! z3iF{BK<0E%0|cpc{>^>jIyftfv-SS!kt)r_56!3!Amc{j^WWLv?priV$ibqzoNV1c$0`pHxKUCVCTdX?z?9P z&TONwFm(0S#+m@)Dmbfr z_gi-0H-F^=@XU`r1>M0baOt)0!{#(Ng2Q{}!E{_c3CxLTgm^Dh{KT+UfmQQzUa9t5 zTrK{=)&;eBvCkPW=Uwe_AXKh<+1Ai9=}x)&^}eK|xVnC%E9sZ)DZakSeIEsIdl{}@ zXl++&UtGIcjPP`}%5w&0LLWmgfoQ!D;R2Yz9JV(**t_x~!2V0{vG+a<|L6-JfDb%% zI{E_;O;EKb!>mzm3+}hm@uxcP#joRjVVa|ziQp>DEEDz0E+`o*hcpYPEg88)7Xa`% z6@C}}nl!dnPcOy4R3^l+vZ9jmcGhcPL3H@pxXQWhpTR8P7o42p-InW~*FDWE6ij-i zFk}l{ue1sc)qweWm4Wj;$tE_Vvrt!=i>@YqM0vrV_oy^u%RRA1$*&yRpO$k#>o})D z^mvM&Dx@4 zT@vfK#yF`^PSnnD%QG9t!VEAwF1978qbhPfJo=IOHYFd>GCFMC>PtEa`$h@2xI6xp>`RrOYGp3w7{X%e;n z`}=d42ftzzY*UJN$J_Kt|4G{QTHkqX>pptc8KMDT@n5`zV(Blw@&>%}#ub=MP7|X* zXksKnd=TVy! zuw-}VQKXtipoXZgg0$E3)#ys2o$7sGt*xUu9_LYUyaC;E0q=V26#n@?`3&st9l#%b z`TMYUWdkN#=V3Y8Bon=$Bc|2QXG7FPFYri-cSSe{zKzypy#LrmhL{k73xLKDUKwo} zIo3yZ1*m5d-X}lLvr!S+mcExhi3U9%XKgiR={IX^1Y9%>34`v~j@+{`_DP?W2`DHN z-2)&?MGU=2Wya4_zax-9UX#Y%0w&`bbo+0>Wd1t5|Ec@n|MKfU0Uvnh7EGgK;t7nS zl|UI^JL{9vsG6qP6^L$_1q@dTw?tZHY^()X?S1R{(O8Z3v{U`PN=+@Xx`5QFlF*+J zzARD_q6cVUl!q2`+mSgy&v|sNgpXpp9+$?j5cW+4Ohbg~jCzFP_+C3sRgHJr&Fw&- z(~Ibo+JQY2SBWd|+~q#j)(M5&)99ZnFi~{pT+Mj6aONx*Y)fgZHY$67Cd>-D;oJP0 zL%KU3_Y{Sr4YdbBRKV;3GH=VeLifpgH)LPRJK7G~Ds+`JssP-q!(=zL@~mRboqw<8 z(tNY!g1PCRtZ|)*`-b7YWef8dk-W@jqNx3Kd!kce;z?xFC3$#CQTMWs%FRqd!cqy} zbRK)A81jt>U&+g{EVLq4JAbE`B4T{Pz0CmhFM^PfZFVUDh9z~VOPGv&A?R}T{U5iq z%H0*uEJ&NZ=x;p6!CU-?IjGu)Wc>fN%Ju5ecg4LnYk|JCnS7#}Hlvt$8lu^U%4KFg z1%sTIqX81bS4*3cRSF)sqj;BY3J0@!bf&kr4{&OVS6q4dF~O}FKn$I03yRd{66Ykm zaR9PW0K)+GW&kg~bO|n9z6KlHcflgu(G$J_+nclj-g*rWmN1*`!q&8dhwi@<&Yun8 z1384vu-Nl{zpsZ$ESnmpar6$RTQ$}8!Vlcyyi1G2bDAWBq^tFpxR`C?7?HHgyVHUH%q5j9*G_|IBt2|k0-dDhNo3P%T@E-sC0OMx71$8wG|nCT|-JSa*wmdJ({ffHaSzgRJ5!S;F2w1U!H~WNeo((qsCr;Y#Y<>S94NjgcZ248^PA^ReD^ zIEXI`JUxdo=21Hk9A*LR?g6~|#vWYRox$myV6uRyuWZL~Re<*~F%rpW4gC&}$3gpW z4Nh+@;eq?k!}b;d019NQtrpE-aG%s@^)N{x^UHi)@NW)se^_2e8xa& zK$_NM%p=+PN*#}iX1-8UAoI(8k6G#dya5b^hAQj2y#AbF%H}6rcZ%UbaXhn`N=ll7 z=hi~EoUM^_iuQhrwaFPF1YL+d&{h{2GZ*Gz0oxk@v%O2Od-415;deg_|JAR&A3pK) z2{=i-l)eSnVoDjrvGX%J0>SdA_gyz>b?k&DaX~-MrJ!Vk+u_`a@#rXoS zwV(+x(j@m9p5s_oC%%ru-~bxx5OwHVNKuq9eU-L)DeW=dUD5oRmH7goveQ%c!P3QR zmeB_*3*@R!mtQ7_cA`Y?vCe7p)LIaxay^R%^?md@&x%kp`uL2mfuUt{)Yc1g82}#D zC*>0h&m24hLW+(ZjpOa402`X>6J1v-w*4<~+dMGImc#FIeo*(n)U11ddw$(OMN~-q zb8B!kpIPUfqS3s*mmkk3-b>5q=SE+3%K&zEwn*o`teN;2Wn?_|5|EY8KdrvP0v+Y# zC_|Hj`mj!taWdZzq>4Hg^jQl?=E7_lmyW>x)ufhRK6%8XWks+B54DNSDe0xeUoDT6-2gl(TLbALT(61)5-; zvxLQL7k2L0fJYy`7fx&k@{(ejBkDM;zpD$Thh=T;*c}(Ed_DV=(woJSA*D9G@YrlG zp>ZAl-{yD$KmNfBuy^ngxP0{h{`wm)Kyc%E;?&)65It5i9pK0pd=Mvk!vbq=xs(KB zc75C5G7Sje|KnC;2ADP8+Jx0P`;6mV?c|U9AhfNpCP-wy%Iq-{<#Z{Q%lC$3R1s!& z%vAtkgu|ZazUeU_-^yeyKpd9F84_R`G&Rd5Y;6GSU3~=>yDz~z-f~yG^Z(3;?}3xk zK$}sKz@C?fY0(Idzz(}(aXZ~keyYJQ-5OAhp={<%jc!Wj=yaFa>%mD|z_Hbl737F| z*)34+84h2k^OjUODPlAznpAy~iG^4Wfv2>Z(esHENhZxq8&sQE2uzJm*Csu_w| zXQ|fQ=6w`rDfl!_5L=BltP!MP{Eu;TJ}5C!?0YserTMGzXD$B1YP(mH0i1F*z|=D~ zZrLMck>b5p5q6}WR(TATdFQBVbAJA2@K0eSTS!@AosskN+$I!Ry$EEigvaP!%$1D! zju2y4Tq&dDcn?G&4T@tJat>;r6;Bb^HhQV$C{x%R)-E(Lnf zgTC$@x2Ya)jKgTk*Zn?6Yipak{5y?%nuiRtcC;ei7}m#>=g1P_vi++8Eou`F7_PE> zj<1>a0wc0`XJ-Pt*AC!~OZ(`7*Fu#?VAgJiI&X(*JJwjH(9+=0XfEWD~bUgPZ>sBW+AAS z#FG~q89nUMnPnnU;D5{P(9RdlXf3*pK%)};9W6li(sQ0wgXkTGU(@(vy=dpYZi#sr z{4%l0=`Uml&=M#8SGG5a2&TL)+>Z@m1ZObcdle2YKL?LJxDCJYD?bLG`sjUdYSO`c zF^Y37pg|*vMx}aAtbb15POI}OM`1zuW=TS4%=36vHdreYtyyKnWKSrQ?_7biO8b%x zPo<_Je=UmupQ41xK{zc?X_^uK4MKkz;t-QH8*d5x)(pOEe{Q8D|GAkNnAI`JQe9|@ z6}_TM*>df&sH>#;iEe4ILV?z6CQFlRV`0a;rrob8C7S0=%BBA5&tIkQDL_g9I1NslvJh`De2)JA=+KYk+mI>V1d39BRDw^VRU$eA7Y+L;P?2!& zM(hnjgYaOE_ieHTkRwW>`E^WNV#3Hrat9%rLujU?VrGNkev}!F%7&kph*CaKxu7N? z9>U!rtp#o^2y+L@_PO<}4>7APL|cZfgY$Ux(_iub!x-BQfNi3F6WHSu62+v+Yc|DC zRuW;ciP!8(AG~>~0W12Qe%42TxW73fTSpUbzgr zyK@+gx6$cYyvM{o4MGXHU%1>c3n0;)t%K1tWSYZxJcBbQJGl4GF>H>5bwLQZnGQ0% ze?;r7hfwPJuAiVfJpO$0&3pZThoQCDack`v&q}Ay>gmQOFCvAP{JGIj7|z-lk6?e% z!MPIvKmEzO;L7fY;J^PL{tUkPy&uAv3!6k!FuryY3Mu4YbQG9?v5Y~B76a@nfHY6> zJY{pw9L1-Z!!ne)C^`b-kb|h{${lht=#aiInX6=>Ra+xIfY_<;DBlG$|3Vpp*5N1M7-v}f=x~f@d$OioZf)c&o1BGX%)*aZ@z9m zI#oMUJi3&g4e15Zdf+-9wEbcFBcSODJhdIGEFbeV+$Lr6t;dqbMCx;S9Od9N z4Y4$pt+9)-sU!^u)RG2}J^E{t_8U->Vfyx>f6f@$L^*r0Jnf;=C|%Y_G6?$0U7Z|HG)%|=nSiamtJ`TuI_g*o^H{#nB=!3q%aNfKvmw&*|}i6OWiGDF+YIK zDZquZ8*uJy3^4+WFlP$jlRe`c*v-D)jLhB9PUn%PA`{ksJkiW;t+|T!q}&2 z6cFM6&)$DH>y{k%fna{-x@X%P0EBmhC*euZfS?0G67-;mB?(e9nw2yg8$0`dY;43t zOw7*A?u?`vnUR-B8A<{`g5Cfm0TMtrTzlWoU-y}_QE95Ova;%&@4NRt)7=H!e)pbJ zrz*>3W&ScN3(oJ1;3t3Rb+CWX!9VTbDP26PWBgdj$Q9dX;ZfphWv4dSB`58BE&UbD+8MDm+~%-uK=K0IJ8~@ ztaylW9@lo@g9#gnEnwZA`bcg8P&`>5ooMY#F_;&9O#QcNl0wk^^|!8VYa(uY#=IbO}5yOS;CCanrM6ES%Nu(`Dfy9bBx#52#soKfgS zG-3@r>OqUFcZ~aN*0Mfm!Jq*ZR^bd5=HYx!u1m*G*nK zPrmKdxg<&?(}1^i;F{>*t}|2k_z%4Se(uNL26vp9!S2P!VSaEGHqhI}Sng9rd2A0s z=3~G*eKf)6t5LLccu*?Cz7Zi|(%=aCNJ68pLSQYl*^9(Uzfq_^Z8agLhTelpAI9_g z;dTTg#}Qb-=XmjqVFDy+zhIX}9utiiP*#chtgKHM#eWXl8zY$QUxeMukHO3Cp29DD z{9W*|A9y|7acTmKWx7gu)s%Wl_FDZjRzEML8<}p6z2cZs1jq6=hrj0Y4(9Vke(X?t zs+g~$h%ulKWltEijO5aRMp=EyGvY}s0DDEDC}&!>a+?$Tj*J(53YsUUWq${DiUDEy zPq~^+%XkC8^;|h84_57MjVZF468O^X$n`dAZ!*w%5?w3h`hYws?~^La8Y(|{2H)6k zE}8aWx0Wc;Rb=p55phnThd_Prj^XrHke`NTjbIKQN94fVwl_G^zqCg5^|Vi=+*9q2 zm+saTS2yG4ro;CzIzo4i+V0ZsCM9y7O?I23m<$oV|OLTA=IM^1=&#fia&2iQ8 z*3ZAb)md9mbJVGpd<4+uk@wmP6GKlny+G(5Yq>7NN99UXw|t%xbi7JPiEgVoE|x2U zytTgPr!ujTF@*QqTRU(tdmaIRgW!9*t#x5xF=_Ve5=+du(w5a)p0PG@qYF*KE2LadBJmK_<&S{#q0o1o!W#u&Ywj^Dk%ki@IM!kHC=mCTXh%-E|RR9 zzMDw056X@9W=Jhd%j(H%r`>KF=zNVv=Y1cw$?7QLOp-UItf1~5Ea2sLPT*%g`dYYp zkjb32v`xrx9RY_t%Xs}p?Oh+S#fFN5>T z)n=ieCYT3rCJDhuVGhgLF6>=-67IWW0>AL__rk}2_;qmaIe@*x1?+50Q27^*J2YuC zg;>bae`9N|%aZlDLwCeAa5JRiwBo*(+6YwQYm2%&5`>IF2&f%5EpPc zYqrF@GV{67Vy?9bJru-PCt2V}>ZF(C&KkU8Bv^*+leiI?`Iua0X>M)roPynp08c!1 z8J@e;!OPADR5xv%xv*YIqhb50xcYbnQA*1=?R6PEG3 z6V8Sb2q!tJ%k@wA*Usb-74dv zlgH2Xx)I?LPqgEHIEL-%1P%|E@XC8n!KZ%d{c!c5gMa^@zYM$A9)nY7UxA}NUs6l} zT5I`SXVKOOTuQiclD@8pg4yQ0r{s?k&n6dmrOiXEdU>Q{)nEF^T{h$t*MI~Jr+hPa z!afl|0*V(P))O5wfVn1`=*Jkz+{W>hE4FCwTJVin3xLHTj7JA>_2R>D_iY_~{G;Cq zKmSwjfO~J7z~Ov}V<@h<1i$pp@0ZezNk@^JUR2{Ku|zN>RUte*I9MXj8jmOVgEm5S z9cPpYG?w2PWh|>pj`QTonU>kTrwOwt@PpF%m(yvp@Kb`qr4IaAeJwI zTSF`nb6uLI!_!qXjgclRS1P5}l`~D5`nIunyvfwrN_{eRF2A;|&5<9+>$bIWpRO*{ z3OnstSVLCt5FVQ={D}sY!?dHmr?nL2R{q|^3OS9Z1_zw1w(rrXSRQTbGYF?!>MQFb zQ~vWLV}#$}`2e~OQr_vh(=~wcB^8e@1UT*#L_?RRTc`Raa2=92HP%fxi1b?3o^qd!N8{#*<4prVuVzYfX|#^= zAbSUHim612#Y_r!0>CGeF>HkWU;%Ldom2Q*zxic;1mh<6}AH)-vF~BN$i;2fUXlLL@ z>3(md5xarV0O=oW+qi?pVh)?ru%92m-j&DT{LUUK|G)f;r2L0sLx0G=E)lmy_Zc$3 z?K~?4+Utn?dBu-z5PLhWWY?@#Dm(@3)=l0-(eh{e2uThpcGYZ|{_Vr*Y&sIC&^1D)Xj?bwWPPnNS}g+_R`hzDN1aiGODM zC-r@9;ZN6QYj8ya%^FANUYMw(%45pX>Frk+9$JoF))4J!|^=^ z%BvNL8xdQ^$HfRGdDir^^nbP|q~qr?e`d{3aXLyl{Eh+<<{(2`UsR1P zmWrGq(r|>PzftM{tIF`yztQ>c`{_*zy8P{w(%XkJ`H5DKu2etG5g$MiSRw}Sr8|B){Y%PTicpI)AjNx04T!M?c)K=b-;JPSR+!1!0 z4+=w2_5-Q=bAabA&f(g%8Cw3wlW;01fPSLP*jjWOnVItcmWvsjJ+%Y3-+o)l|3Z=B zPEf5q>D1&eN4$3QMx_4GQq7NxzjZ)Lk;UlWj-tkgGvtR$c-_6H;Fo{yUGU>S^fnmH zFT&o{r(xXf!E_pA4t*+8W<(CMnDxiUmhB%g71_!qIKf_}G6Vssqf(7R$6Yq@`=?`*YkFVbhpb9$Px^BP37=aY>8@(5+tCAN`K{$s$! zo_17e&gPr0zfqRd8H@n|P|9(*vVzL7b(sUTIgDO;nw-LILm^_LW+M$Uo)OXdTkgV4 z%72M()i&FrrgrcScR{QAdhUd@-xk*Io>W)T^E`d-Eq%}YJbfMlNhnG*cnZ7|`onyq z|MuxC@84W?1CgnzrfAlNa%ah-R2_A%kf5pXvwI@}b(9u8!g61N9+g%*Dwbow9{ zO<@MRm!5#F@kRLI@BeoArJsKvyzv$1VRwIlivI?l;$mP{zynq1I*Mhnj$YVH>V_mM zSKa!`|4Ao4!ZQXqSO8o*2*;9w(m*$qcrk>v`tC|-QE_nOcO5cZ$MIatBTIQgW#im( zkM^M*}P*1oJt-?zLSw3^xG47T#w*4{;C> z2(TokV>|Kc8tkLs=1bAVcTR1>nX|O!P=;Rw_u=5S>)exVK-reS(AVZ0k_?t(R{sjr z9u0k1^~+p|Srwu=?lipZp6mZQRh1hq%~#y3^juRebsH0aGm|MC%op&+SD%9a_HTVZ z93EVS-~0TNFgrX2n>+Uaz@~~|pIl7w$c&0(g9*={ru~QbEBmM_9!US@f%l@U8&cru z%F9i>j4&<%Uk_xPN)oW@7N$w_V%cl)_>(#ZOeX<6eo4oDsNd55om~1kU?CnUly4*& ziQGp*F3WVEHoKK3&WfCPG72{}EMV`-Gq3>{;k)1SZSa5n)c3;cU$F^$vjuEzO<=;Z zhK#1(4n%CQS8q{YCm!$ZWwyU~@cid%Cp`o6eZW+=Qu20tPyFrszLwUZZ-|oUjnnl` z-3tBar}2^IK^_v5-?C;OJ&s4g@(-|o5U$=Od7AD97q?$WE=z&}m#Jhil+&ekqe_#M zOr(I#A>f*L_T<+1Qa)ypg~8Zz#-?@Z-%FqU9zBB0^^;LHO6Y>fOLQE9l{|4}V&H=M z-Nez-{1fG+)PG8CPG{z=0*+;-vG3xs+L|%N;l=8>KnikL@;1}i%zpLtf@w_ReNa*N zD(j5x)O!`~X_b#wFkZ@WXWGD1ECTmC>ARw=TIwQ=alhsHRMW5WzV!`@)|07DgPOz2 zK-kR}aqMV#!Z8zxH587v>)Y3sYQAwyA}%}Z>nK~Gfsc5C0A=A+GE+-u>k=Bqrz5r7 z$BLVrRq(PdL?wcLa8kv44aL<&<;F7|HOq9WOIx8mT0N_?1uOKsR=b9_-?|d%pH(~# zY#Cl1Lulwrex2!eVJ@{gyfP%u5SnYiiXJDyuZTG~fRFP#E%KB%{DWssdy;@fsIrGk zGXwbJ?S}z~V1Nr<=({m&Zk>j1yanHSgoYnQL$L%6wryhui-q-553i;7zaGg#X9i{Rn*M{jY)j%a1`f zdmc7MhcJaX-bqg@jP3~#fvN^l%RU({-U~n4aUXe4CQ#)w6~Q>^P{a@r})IwO^FoApVfBcI0tOi->y3y&hgX#DH7JJXaeD`Vip7*^G{`RkZ z1YY}!O$=r<9gT5}ra_Jo0M}}2sy&`1%aaFQO6#S%QDV3}^5RWNiAgeeF54i75$kF< zLihhGyE9k>3uoX53OpfM+XN|XcojuH)ABqr`N^0l_m8*Nk>ww?Jbu3@{uhr4rFBhr zotN-VywOG%?Aw1K1(#ExEF#o31}CBl8+b&5-=n$ zKEK>s+J=h%(!?(d;5ZuegB~*u`=%%u!_ZrO5l5Qr+!(&M(p9o$?z3e?$`TYTSwr03 zq{Ss~m25zZ&RUHtEm7-l$mAUg2-Lpq2ND226LPJSc{=IhP)@4Nc zh4~pqGMG-akyY`pLip0pYhPI}j5N5lewP~~;_AY=r|!m7D0xwGK}JGu360}fy#{3luK=9E)vJ3D z?mhst(n~CKg&>Fkk^uu6U|68H(8k6D&g@L!)Fv^S&?b@NY5nFNJ^iG|+&7oyU(zc3 z`3+1%ENw5glv{1Y#|Gc*jK<_e6aAGm+wm+0l3D2DBM3rc%tWXg|D6Zol}Ea5P1}c~_E)zHD}QLceTI$epZa=Wb#VP?sc)oIu6TOJ ze8chv{W^l(eSj-h4`8vJz($uu`y|&TUP9gk6yQ5qi#?^NzR8I}Nb3-~n{_bdT-kS8 zZHzdy{8NzYEKgD!AQT-zIdrd~l zuC;lSrL*~$pu1x4*-dH~l?8=13J^s#>Ii@t zn01u=Snj|Z0K6>8<-{`DvY*;@_>4MlrxJ6cu4yNzQo4{KrYoD$cm4rW4;jmFg8^OK zCme_(NzrY~-Nd4prRM-K#pHR#K!~PO7i$D^ug;Jbd^`dJPw})|E#sfz z4?OfT_~2Xbq<0vB(^ilK=v?)+8iQ=OLTvU=8*SlNq3*C9%nlFX>XmC00B}5I5JL4? z05_J(H7u4wF8>r!b%9pTo$U=cy)#7%DMj3sb7TqbSS_svbli}1lai&=&2Dj9Uo=0i z6xG#IL5=$g&3`<9J`TsJ!kyc5_|RMLg2^X80Q0@8@Mm9o8V;5t*gks?bh8m!;=+0o zw>$ZqjELY+|I7MKB1)gT*U>DUZU%R^GL-+GV^Kes;PN! zIw8QHr|8R>$Vw*}VA9Pn=;CPh9K8QKUID-MOCNv_eCO>jJD9`vWSWjOvDcKRER{e+ zHUu|xCid~hx+q(Jze=5>HRxNX&Ksxv-*_%F05)-ZdR+O2Zph+wI2ys;?i{XM-G|XQ z+~hMs9wpyoYg(^Qi6Kx>R=U)?El|QrR6>Ne6rYu2P`6u1JN`VQzF<<}KhzIWHJY3x8`G}ROv+(X}iRn?~Zv)EN z2UeG80w5)Gwm^b@S5M0AOMT~AvD+k*k62^(8y;jbTf6#nX~55)_< zF#d%u%amQU#0^b7(@EId{{8`6ynLDL0UHDW#8rVv;@He<+1zEL3}Z2e<>CNNZ*Rca zGvtm-m<7E*0=D*oPe%bBZ8;u45UYT#tB-fQSW*tO?y(DoPYW=9^Nz20ZV(wF z)@YVT?d4amUW3b5_h38;E_l2igAszyOjAM_lVWj*0dGxE#`7N1*O19sdy%u{2<1>Y z-}^iBx>P!V=4Do{PItHulT+~;!oa?>d905&38kT78k)PSHm5+zs6Vp+S);=~Qd3>ss(m3N^Zk|L#@pV+p zH9xd<*7jH3uV_H9y01i*K?*Xkz_-CZJTnPLHAug>l=yV ztC51cFD`0)K#_(*K!Wf;=@>e5L>;lL95{M~))$M8o+V+Qo{ktSY>YD*+8o??q!)=#nL#!=2!Ip*w8D z%WxNUIES|Zo7?B%v8S)X7azC;k6#AZT>{L56|ti`yyXI$fNG2TYEC;x)Fb2|z07%X z60GBMVMHa+B>>9)YzCLF?BQIROeQhNNNgvL-y}oc!&=9`F^I?r#yHM%ID2{@vvQ|8+7%$-$}Z;v_NbQB)6O8I@l)s0MM8ejLiLyF4_*CY3t zv9?({gEv5k2@q!d+upDV|IfesBk=CG-U*kVdjQ7WRoI*^={)+9g868^Oh=EXRE}ms z!2+>%9qh~FK7m_M!~mpiJi(tfA0%F&_f#prCSYafVfpM}kYDi}A;$#KWs+wVW`u6M zL_VS0o$=%mz(V+^_?fA_irO}Z@$vvB%d2p3`5W-=x7-c?xBu#g;5**B38yC1_ZXLf zuQU=@N9@(iZCVF4WSfsd@EJRK>CuyEr8 z3Q8hbP0vVtn(cXgeJfl*#^&;sYw-Mq%Xplx8%@~zNcFEoKzEe3)pt5Es;D&^WCLOj zO>oHagp@DM#>5BAjY}w#*{k>Rvb38x$tUbifB{oEy1J_0T3_jJmU$IzIn5+<=j}`V z;<_Als!U~t_xi<8{y5owmb2f|HjJmj3bo8PsW;@+O00k#Ikcp?X9*Ce@70)~j7Yi~ z)g^UPxp8jewx|1`)ZOH{!p2KJO zh;v@)bQlMKcLqkY^$i08a;3S&j`eXj;T~TS>?llw_=A7{Caq7hwx)%an=G^f zjPL2Ge+@-eb}3lccV0UA4W~a1MI&{7ooo{<2q6gGP&&Aj%EC$lu^u{$Hd;F4?}gQB z6`CsV$8{8r7?AxcMd>6^O=eX}!7S-h@lu$;c(MbtZWA8(#zpx2moLD< za*0Cpf~ye0Q|_>}W2?tUx4~=Os%dwB2A8j1MWJJYk^gzqm`oEB%uQ#i{d}Ybncy7G zAONtX`iYq*#|9zFZyv?-Mx_>5xNd6kk{SSbeT45@C*kg89N6BMy98U4aH9q(v#8+99thz(7NFu@tM<>9w?=VASE;<$ zg^W~(FKAUj?Cf{BCNX~Lav*l3l71Ea$$`E`E88nuspa3SDyPOyyxw&flqzn z1Ms2uoQKoX4sUPSPy&o7RATYSt#q~>$(ymZ|4mj(2@m-_K|6NTtb zb2+SoE7x`z%->=_D+&7ESgllF?VEHD=-53o@A# z@Y$!SpXNlTqkQ%z(XGb&?Q{MxkrkAy4 zh{4pBU29(gl3H`V%fN{Yps0RV=XW|!?31GZ>PFaDUTuExm{9bDVRBpy6=Xc0IZ{Yc z)GTTt1jHuGbw))lih`aH!GxMsovAYcLb;@%%aBH%q|7`3MWoL>8?tb(rxH>doO1Hy zN_TruRq#c=)*&yWHF;}v_GB29f@$AkB}7Wob+n`r-*%p%1*+d=g7=WB7psO?NSO~7 zykOlANZt}H;0qYT&gr}1p~o-5Z~y*R;5~2uAl!Z`+}lex1}NUE#?7=LdwhIzcW>_y zu3X)PC2YeecmUv2xsO|oodYE=jb z7Di=~|BXSc9PTO!RoC$d=6I{f96tP=FN5*qH0&RI8ou=46EL42!p5n4pj#x*0$g7l zlnO5bZF~7`F$WpWEApYFdnGWU=L`IAeieH%wkM-)+*~E* zqWa#<(abQX=VLOq<-&^vI?8K;rBx;R5yy`$7F-ye#Ub%21e(z3k!7^eJ717r5lT5YA(4wi8N0({anyeh@taenq#R414 zz!I`al-xIEa@qH(-j)YOhQRV!r@*8I09vK*T2?5<<|0kW4M!~Ze05)AO^TIX%tbOc z-MmV7%`8U7-855_`QJd+d@+LUQ+L9JD@*vZzxX*=E-% zWi8CyE^58uBgw54w$S~9CF~u{NSYpx$$d~5y8`iIJ$T$fTAN}X1e#Bu-iFPsU<(yD zI{`O%O!Zl$n@q|c)OQvHaejJ>IAXik?K{h3R`EVMY8u=(E95;1xq$At_ZdeM=)^1N z0Jg?cn00gbz&p>wfA@EO4Bqm(9q108g5}{wn2f_Unapd$aTts%5F*?KU_h)}vi3}0 zD04s3f!n07ehWV=1d7x`7C3wlG0$q3_FsBjTlOD39>{x@Dwj?Q&=p5PiLq`eqElqjn5^yH7e1=B=4&mDF0gOk% zdyj4)(Pg`5@CMRXj-SY%bw%0kIo@1I21DaDD7u5(CS-SKZogLSqi(_H^_f8^4`k+@ z9RI8A^Spn0t*S-4b7^3R92@1LsJN9fwY7SC1~)b z0p7ak2>8?61I9Q6qcO%3;6ng{P~>%cTxQ)g0yqGG zYr9K0oCP=K4UA)uwaJ{LDvO|70v3xIEEk7x?#yX8bNUnl3$!Lh>@S17ych*St9bWW z7`(Jj-`Q_ojD25Ax+hRxlugxy0kwRh;O(f;2ba1DY(od%@$FmifB)MbgSWo%F1UK( zTd+0VhspQ=CU_iR0m~3&%B0eglAdS$UGXk&@3X+H1->bNDP(!y)#{N}TUtjwAg=83 zVV|3XTSxe+L%iy59AYLM!p3M9u3UHs-u#+7;qU(XPr`S=-?kE6`9MN4uA48OeJu^p{F=ZrEz^Gp+pDwT!`TJ74*d+sQ(IWwA|;n7qF6+CBXH zk|%rMWUY+W`x+o4f7?ASo!`$DPj4U6ed_Up7VkZ3%IZ;V(*a9sYpGj7=WEri`%Z#g z+CHYZcs}T!(^jq-`aT77j(T!16e37Nbq2!#9z7Piq7gyYlVtKpjp$ffp(GH;bOZ+` z5bhHrMe_M)Z^26i_&-;XQI=D2E0&+w$wM}0jjaiSnx6M9$eM!Qw}^*MmO@cg0blaT z=+`$S59jRpUiVY~cS8G+6qRQlK+PyTdiw0H0lACkaQTO5p)+nVAYh!2T3N1_tC8oT z-3sIrtU!R3%$DS!bdu0QCjmIR2`uI#*xor02ZtN*+0T6u9{lD$9FE5r48#iErmF`n>>qM_?K8xX|>#sJvb z4p$IKAWvzR4r-*wKy64X*d}gRvIy_6;kYT&Np8qC_4SjC{R&h3SlgZIOxM%JXKG^h z@<3i20m0uHb@2YTpMzih#0TMB-~MvA@Z^_av<8h)-+dl#-(cB7ddeY#_`bA81P5+cG==D&HuYt`lbxNZM*Y7wwH`$^Du+-$gdbc_ zzOi1qK0C?KnY32f(Lj+KDzbi8dvy5i+J3kNAb|OEim8!=bVo_dW$e=O>(3NF>U*mV zHrbh~TTm+}{X`zb>zTwA=6$gw4a%}N0JDO$zHI&NHXLQndxo}*tDq&9t+`RbCONF> z!m3(X)|q~iM?sdu{2OikQPy({mHb*c)32T1J-UXhqGFznT0Gf%WH!S%we_AbQvH+f zg_@3>7EOm%rt5lEYPas&d_7tNXqtO@URnpfVG!3!V(0BXw-z@txGg+KVy$KYE}9Kgob7^7iJK)?uea4?k= zwY%raO8#;DXNq|*PY&k*dj|lsaDaInG!q?5B7rIqSTWzrx(>$`CKJFT03iebx*5fZ znB0zU9U<~$QXhK%Qo7NJSCOY++BHL$%)`hGLT5QXA*TddqMmg z_YbT*{3SOFkrzS;k{Fc#`Tj-Nzw$V|`o10b8$b14_^}Va3{Gv#3I7b&Fh-Ip`*h?} zbbV>Q_fsF`UT!rW0$?0ug>U_ zpy+*A)5cZ+@(LGyv+nhe5#(}N$WyTN@9BM?$AQq*RB-q;^|8p3w;%!>a19n=yUW}(Vg0bL04=AcuDq5 zhUXGtQ^^$S*L}qWs{YnxSb9>uZI5ZsOTk;XUYoqKY?+<_RhE%9BYPgRZ{d6IZJ#G3 zIj7TaOMRhaE+;)HANyl+MK-)c+NF^&yDf<=E74Ta(d(Y2^4dFQYh_A(=t`{ml+Nr< zVY+n=y6JiN%W`cjW#h|!4qeHKLh~` zU!<QqXQz zK9}~-K7ioHq?$|;jbE8tc>>_WZ;J)M)6ea~rOQ|G?0-1UN7r}fF$D7RS8u<6z4H3| zNusAF8|O5~bNk9GqLq-J2CppE9d*%KwyX7hO|Eav^FH9TrBkH8MRrQpZTA~JOTDY) zzkTb|r)l+6%8vAJd0e5s7yBT1?G`CLmvo&q+Vc0KihkBFFXg&G3y>nfyFKnTgKIvn z;a3~OLZ(eV{ydF%%_Mz-^i7oMW7o#O4kd4hg%Ms)_m^ux0M9NHUMY%FjzoCL2s!LJ zZof%_1u-+cw^EcVrdgxv?*v?>tRPXg+_d z^y9}~rernJWol3)6MlKq!Cy^(W5B=3HcYnff(IUc2L99Mz7Ajb@;>a(!=2d_5HLmx z$3_RGoWQZx{KNLCU^y+URe*xWPG2KU(pT*39*_53Z7|($*4qZd8)K zYi*3{q*Zx*Qc@NFs|;>oY%)A9{51_8mCF&_y#?@t-*qSa+Asb9yzEYZE6;r$wl?Ol zFX+P5=Iilz;%^mV3Fa`bSpvbG-X8CY_HD8 zM}lb)-wj?s-H7*IIo=RtgKmidPh}e;UWv9Mn7|x1Cv&)V;p=eEZ3pnlpZzZQ@gIBz zy!;~LdR_}DF4@|N>I?ZcutwLsV7PNSZmp(^XD>TPX}-7LIe^+bwq zF4Tu$#NkJdlIF9#ug^{bGHCHO>igi`C`W@LLYK*k!Ki?9W7NUZ&t8BlSN35%-iR@H zq^$ZFmzLnf$MR_5@~%BE`gX#+Cv(Ne0~9E(Sok41ELWUE8$%2w35Xi^H}*=Ffa1ju zm7FPLrGd+DhtO6UNPSSk>wgaj(0$+kJ%QEI644JdxMTGO9T>Kp4-{fCc%_8^wKDJY zUe*;yaFaDV=TN#IEMV- zOj4KFnxb1vMsfAJIjhD_id?DFj4Wqj$Fqs|F+a<^hM-15w^!`Y4cJbk_WLwOO=Ys; z#Zb%R=PwsUy)OjWO^qlvhsO5n0}OUPCg#|is-7XaP@ORg`y=xaU-B^z9PBB;^b~CD z+zFrm;zRH+e&bK!;?*%M$0L}9jV>^Dz9*d4WMWFKIn}sqvyva+U>{(AkFL{U=ONVv zx!9S20~N?b?l)Zq007|B4#3u?+7IwUh2XrDR!TX-yPh&!1Nx4tT%Sa`SwWOq>gzs) z@Ir9UWe0bj2Kb2|c@_M^PreUccIOT}_tb+hhJDxwK>-(sfM&cDGIKCs!M{}Yl^k5h zJW-!80fFrQdH@fpBr99zL4M95O_4_g;Tr=5F7cf4t+T+{cy+$(QnDuZhIzu)A^tfzbq zCnYC)WXV*#z~g43PwHEl$qN6v3aNob%Tsoejf`wDv<5X)4u&S zdoP@ZT{3F<^S|?Qas!z3Rmp$ycKZEY_FElb%KI+O1N^iWLQ4SW;)a>BeE*qMy8C#A z037*5&g6Z2biLvQVcY4~l_$I8^q6^bdYDd<`aze~KZomUEEz813!%9FIp^W9nF?K! zvwB7KifDs?>6A4%Lt>l_6@huSJLoYsi$D)v$=Ky5p}Hr5UZ32?))F+5E4U=OtxZtK za--9efsS$vXOOiqjivXLW9b~S*Jg`W2Xl$PDED1d7I8ihWnaK_vV>FH0GnYc7lKC}{PE5k z-%9CLq5UX=(sfG)4LvH&H=@n9&S1gDoom^_J?A?3*^j*ye)31(3Fo#CVfWI*uv}b$ z=|)&<+TxbHO44%?c#`66DvrEJuIZ#y3O$H1V!S8jWn<$4(AWk@;a4{$Fh67*Fs}+@ z0?=&-iJ|}s%wc1)gyrES*t_%yoZmTskN@a9;1eHvJG|od5FoIFMTntL8M?gf4WUk1 z*?hZtmRZRgX)5+xW`?F!zIkzg4=0s!!;tpsX&(!@p6MvO$x1`BCBTzUKMPlO_h7oY zq2zBPJLN{&Ou?yn0%&?yOWr!ml_vKqqv+NEhZ-1>ewWx<1F0R-KBEjuUy^6Rkp9u* zF%0Oio&zGAm2*664VRtTul0a(?kNQo_m5-{F6Kd|c(#p%Ieo!!RBvaSE@J@9v~uZE z+I&2P-AkpX2CTue`#^;}@nsZFT|@d%Wi7Ucjy?ZW7Tl*PdK&)i+&~aw_DnP6hwsm% zX#J^OwfA-Gb&|Uj+O+> z+uJ{Yy@La~0U!qElGq8{8Nn?XiAobnydlQ?Z|I}#jS*~b)1{(8Ac=cVbVt5PB(F-U ziTOkF9X09sX8F}o$KB&?*IOwbW@EDcHP<)!Zh<-fZdtHu`%HKq;sFGud~eyox82#n z&wT8SaBc4Z{?%{%5nS6H!Or;&m~3pOt20A2VZ#n}hG)3Of=jSi-2FO9p^uWh8jsrc5130+$B%Iy61V8zs z?}eZLi8sM(?;XM6qJwE@JNYbDrQBb8fBV$8Y&RVl1HMR#+n;OBjzpJ_vxzNIPG5v=SWZD)zJ=zsa9=#1E& z7j}jtwuD%Y_e##QtE}!;VdbjS2S)dR@OJ`cd>yMcN7F{&^X6(d~y4hy@d;TL^$jr+PAJWDlN&%DS>`G1z0ym@<=DA zy9>*PN#LVs+2~0lCm4#Zx3D|fdn+q5&qKOe?j%FpKx!zZS4TVPvOSkz&mAY7YqG&2 zbY4sEQ9K+xq%!@amgrH+Xm+l`&|s53!<5#j^bMbDiRG$m>zs|s8!tQ7sdQdYktrr{ zL6=QO^Mcu2JOWJLgrGdj;0_#?;uMx$2ncvP!1Olw`oovt@Bh<3fZzYZ(z5z z>$F4kR?IgJ)_;;SJTOT;!4TtN-7QB;SRg1r4juryu{z*LlndCJTUSO>V2vd35K5_0 zpR^EV@K9Yqp5jdqQPjzX9*_J_bg3FOU#CC>R8^&V^i*5oN+vj229m1b}@o_l)FaHuw?VN@W zzU4Nwt{=>ousx-#4o&Z8y;JGkCYl&t%@5}=n*|Fa&owz9EOfKtAYK)u7f3&*aSx9+ zHm0ySO=osV7T`dgjdat21ZG;dsIn`-rm9kS9ou>{^y^RxPMXq|V9+;KH6Gs*UaUng z=(fSNJ-m3sD^A0&{Ec_R)!kkAFQ0n=_ODD}`}8Yd(QU!ug4SACKcu|oH)&+`hK)SB zE~RU&G_Q~U^72NzKy+DE?ZaP)V6;|Au-#Y=Tf>xPDBvTzkr+Kv^yQu~I@kg9o0-FC4raM;MrVMIxov zp1oQc!sUz1M_5F9jt`mZL-M>((@C^a%gOn3EB8?fV%@9*xO`;eJ|Dw$ya96+ ztT>}IdeMp(B(LG#Jvz}xeRA-fQWs%oqwWl(*RWxsdl_?d8 zs;k=kyaGz9SSwkpE$EQZotl@FKtD)dDa)1$qUHNm+05&+mTHq%_7s=qQug)wD$%AD zTR#w>1<^enA_F$ag(B@U`g=2;Wq*})r<7lV?aB21->K|effr(uyliFin!Z`;a=NCp z567~okOb!AKFa4)l%ZV$hl-ak%Ii6M(U?KGkg7?p)-dWpYM@n|l73OY@igTNYum;p zwO0=NUmg#uz8Ne8`NGynU>&F!z9F|=_Et-F7Np0SP&0A{wI*LxT;qjyU+@~OH81pa zH}qc}jaM^hQ>XJN)xzj&9JevX{pvF1 zv!D!gL)vTG;6K-2&KFB6KLht9A}r?%Li>bH?jpkw1Qr`ZOeSDB)9Dzd3ILGTC%GnH zN-w3GITeCDdjZT5i0|O-uRRC9`U~%Y@Bh&2V0ri)>|cEfM%^BskH@P4#dRNr!}>kL zsq~cGTSKgyKSxwvW{e@N;Y@VlyaW`g40vmS+*}}hGkg)AF&DuYAt6@CJ{(+o8oJrD z@Zk@=27dKtzZ2g6%5%7phZ|5r-;BI{YtTNQ^}H6bBRFA$q*hdd0jZCN_4DT!Te=zK zr&~Iq9G`Bp3bHQ(01JR;o}a>lE-3SVe629pOu0|9&$(fczdZ_uDfPR#k5pZ^ZZus z^)<3+5bkYoxUDU(=Oov^TXIizWjunB@i<9sERUA7+rR#}d2+iGlqb&Fh;~KFQdx8h zgf-hItdD+)9st>dV?-(`@v0UNl`{Q7R@40N%!ROp$T=x2X}sz~1s;mXfs^!vmwIc~ z@s`U*tz660YF+@=dSnrv7NV}bC9EYU)!Ft~@Q}k+^4w1HG6bQ+|Mt4M6z>$EB)3h- zNzHJ6wFNds!82OchMkq}13mot$Uu_d}A-R||TyJsF|pZtq|TAAIM%upEB?c6aCS2Y>n~%$7?yedb=6jy4c< zi`Jd64qfv}I^U<;m3gPdprQ=m(XYmuCiEvT-*805yV4$?4E92wK2u79@SwEIT^!dyHm5ZXsuU6y*bLhYaicuv89vh2iXJV zc*sfCb*rX68I9IziZv9D;sv?*+CIQzk6(iQ{jf)GCU2o?_tuZrv{D!^>q1Vlzkl~o z&C;9Ek((MEIV@@*+4srAn7C4m4;9;1a<6vds7yKLJTyuBV;SA?^sD{d+o!DDU!yy> zs@L_L@_9L`BKNo2QZtT)HVPKtV2bCGQ61q4#bYOm{g~hA z&a@pKlm$&}BwpTgaHHszz?q3gc8a!xC<-46KCJjh`lPH&0rDmg)*N>%PYHB~R=7TKSUas5f`KkkYEkMN0@-XIusl7+F>byScS7 zhWT;{?|bV#(EZx?!rtzu;V-}X49xd8VC&R9u)kOU-3&T`(IkAq>mBP)mM*(bh5c9y zSt*EBP{JZQm(SlQXo#m$ZU8_JAml44$f|s&MfnKoV!*%f?*cX^hcLVL6pUui!aLq_ z5BxWu`d)bNo9~2!ZV4NcAYlj~K`{@s6|+w;^jBdi7bHQ-0RM2@DfL7yvz6<#R`*)7 zYrsdVf*pOlOFu^v9Dq&wSt}wD6u$|1lLz}-l{8cQdb-{k82Stqu2F>+ew;%TPA*vQ z#&B(S29G@U3>+K=YkCMIn(D<_$ALk$$55R2gEiI^ecmdO;r9SWcva^K$u}M!RJ)?l zjj8PPZOY@dO|?(Ue;6c~^YhJcQ5WYMe&R)mtkZ}81xW&dGdzOLSEOhwf&>{Mm!o7A z)I?=ShY_6g`_w5$fmQiy2#!8~I3(2;+7MK)Mn^4A>@U-Hy*L^=;h;1`;G}`gztJ17 zSDyYo|Guv9)>66HQ$OVOuX0QMkUCp^(i1qt%#$*|zoB`;(5ga=Y&_}P;0Z8=uG@g| z0Uj%iR(*o8MgNktlh76ddiya{E%mFAL{tiWsE z4f$T`wkhw&o4oU`bJBgHgN6?6r`A~amF4Yum5k)7Is%wdEG*a<1H9+$cfsHNo8Jd- zf5TmH?egPrxc3}vj^{8P2f!_$05(`J7q=83EeTlC7lm-Bg!gQ%Yp;G$HlpxF8RXhP zDu;xka9xxLWJ#zC!dlq-$nqcBFh6)6_O3h*Z+-op@V9>T`{6xry9+h~@SEZUW-h0$ z5;U}b2dt;qH!GHNt0mi4)-Yl7_NA8cYWGI1ym(5=t;)M1A8?*~eW>?=Au>yrM}&4+ zv+*Z*0MOdGw!aS#KlU`tF{tnkEE!anpXf8-7?0LTO?f@z8|^w;^KdAA+JL2vU_+CZ zlUl%m=q@ertM-kQpMeGg=+d(3u%z{n{O_!tjrG_!N39NL$J+uXt#-xlSw6&XU0T$w z2TI*qiT*_Z0RR9=L_t(46yqZvn@A~_nRTC8U3N%a^?9CyVl^GA_(%a|%CAu-lU!kyua^aTMLuk?!ZF%_C{S$lwhIvfFj#R3)!ovsFFj`(5fF8Ncn2rvRuU@c} zBw(PFPXZuF;J|2k0JFmjuy^@Uc*mRXgJ1c?`{8@ve;-V{4zK&$npi$?RLFd_RNv_m z_k1b6lx}oNOI(iKiB~MZ)oc6k*b~n(0B{NceI4d2@EZ*LrF4a(m}2ajAzia>Xgaxl z%1Vr@*ONJND1J7me+uSd6}@!L-%2|C5yfwDwGZCUDVBm1J~R#2TS`TE#c?QDzHd0m z%GM(438xX>Fy_vBSN|&I|MWaJ;DrCS1lOS)8`F!!zNvSBLWrDE^E{C<>-P$a!n5wSkn5~Iv3_Kp2QovG#X$d8 zD>!s+S|Tv2yOxKO@6cz@h$Z@bxGYhBAPPm zBNTD`milG@KAWTFSn4C+!c*%TTTk7ERIamWdzREt>>S+`FPc=21&+EH7;u4`_{Qd) zaQ4m}c=Wj^;eYvu{{_DEf6fIz3CXo@4Qv zHOD%l z|HJ?9Gw`j)pFj_x>GoZ?c9#KE4l5kj83o)3uJ&<{5Z6t`U;Jc`2<6^t*2Q02_lcVu zK%b)vr|*_9h8cP>Ecc&+H@@l|{OTvZ8-DBuUj^9E$pog#n}GO%zQ(n$8~rQj`n%uf z<7Mg>Xou9_N7Yf^_obSpc4*$Asl|J2xwkrR%6P&6e&nSV@6IbL;rwI(>@arF^B3mu z^fQ-WzB~(C%QU$qICqy%*=@U% zCO5?3;+I9`^p8RQz7&HwR+-|4$%v-vR$^5lTVuKU>T|s&8oWp3D?Ex>?SV#{awAmk zEv8)h@tsFgp5Fs_EgjK;%rkm9^cK8;0j*reE0t{~IlYdz)8xuy+@_AiSx4FLG?sdA zvquTI#)`b=%M;R|GzRHAr6YLi7`n}+BP-cn=p5S?FTPS&AW=j~eASIdTPXSBw~BR~7AP8W(B+xVR|Un5%%RNq!WqaF z(L7JVbSSL`;Y)%V{l{(732nTE5FnFNK%>!cz(#hyL~n4DuLJca>&ryI{{2p8)^WhPAM)+8#E9>KtMqRy_wfxJGuo-FyP-Dmb1&S*nbvY zarYGd_OJg4{LuH_57T7_lj#H|r88K6j~M~$sB^pq^sJMPql}YCeRH#q?mjTln=h^M zZq|NUC0VaO3)T)vef->8wpbt)qnF*$rO)iv^p4R0;jLol8SLH z)#ZV7!^S2b)64+0BIsqm84Ac|<06JN)OSm;;CRz014o7cs@g!~&$mQp;wAW(`aS=K z>Jf^9E)-&Q1-W6Ow# z{q%JMo+2DQ0W70q)Qln*2f?Cbv@UaOOd<)0)VDe5`ICyH`-w%_%oXc=QHfF~9g!nD z(o?OZ-+PLJo-F1|i@u_A79+w?KsRv>BSL#<@o3WRF=yd){men>%4@|?BMKcLrf}6& za21t^6ME8UFo0-?_f})oc;8E-KZi0ntLRHVCbUnZ?{4oXj{*%oMJ6B{E{=(`B`+f! z!O>_a&iO?LT~Mkg;gn7Q6-IF3%0>9SKYI?o`N(JC)4zWQy!#!mhxdHv>);J91K0`{ z{cwyR&>p@;#Xflj5pBU@Pva9>7?h20=XkRBk<|e8im+zr!tjV##sFdH7R5ovLLK8V zOeS=PH}McIYn0kr1Lkh^)TgkoqrmqGmqP^mA@$s9X;r1I*c5xfmv#DW-98RrAn^rM zspA@(%>hntjo`!I^)fg-{4x0N|EK>1-+1gHxa(!FhmDQX5W=)Z>r6aOkapk5bEAn$ zT>N=Y6%PsF(eWUD-5t^HUx7!^mJ+@tgF#3E&_DnH_TkF&55sF-ej5JPuYLr+@4H?G zXSM+5hf5ewwSA3+<;Wve6x5GV2wgR$eM0(XQr4&Qd-T-G9{ByLZS7k(LwS{_ObqGA zTY(>q`kp!aSdzQe_iU^8<0z9wf}t&35gZIn&po$*$DVi|4rc(P?F|@(BSLuRHG^?_qhzp1~hb~l6B80@L26*(MXlz0N|S9?Y;I`XM!t(W8-Z2<5}=?yz4{=z5KB~kU5CgZp=gRZ zS+q4?vtb*K!>CY@NcR9YM%_XkWzweOu@)ryuF{Cs z^F+BpuTE|Q&QxWNG@S{eQP3kAMR`n|G;4_gJoFV8YIDK!Fhd28+F7i!kL!REMb*t* zWF283LjrMOm3L4J5R#5cB##noW!Qi*E;}Ll9~WN21l{>CZorZ}b;7^<%MK1_!F89t ze#FAy0!)cPlhPq`DFxFCmc7t7GVfQLZ8yJQc(bQlLAbsiX1d`oi#F zlajE;XBnHDmaJ;IA%yBfi~cw~T>{Ln!Q~4N!7J}S3!nJu_rS+~_?2*WyMx(bi1<%R zGUI~;8;m^F8P>82-k4P1qi=LtXKt^ue%392UD|HublmNsH7)B|M0VNJ3BY^u$;46vr_rb{s=!u4tJ!L&DNmNjR~@wcrxvgDQV1~7OdmP7gI8M%j1G8mLsXOZk`((;G{c=SFmN)Tn6n~4xKuEiPvnI!S3w@4R_C*c?|UE`6fG)Oyg5t`#Nh{LPz7qqfp&2{|@F0ygPhj>u$K~{<{E{SK-lTo`7%u=AXc)e`f>U z{QCRh9dCUdyy12C!OQO3hP!T?!1m?@Hm2cc3ezBW z3IvJ{76HI0P(cDE7U{Ww8q1O3uCaE-ON;%zC@UTNNmlR>#BdI?{VTBC zdkXHk4dCZL{(ktm0H{D$zmLBewkJy%Ek>|CA^t$ujmkA->+MMEuG5oH(vCsGKT@)D zv@cH|Z}RRW*JZp=dCSnW4!<7ad1U2@qF#}{S&R#_?(wIefrlS?2Bw>*pqp&c@nBRs z&G&Lrg?G@5jZxs@D4;ykBIo5?0?d$>l@`6Dbu?0Un}@RvfRg z-KFAC2UoIhqSpierOx3{Kb2PFJRXEFq)~J$i&3ZXu{yx6#)qQQr#`^n`PXrRVC!y_ z3J57ZBT|ZU*8n=XvX*boHV|7?!4m>AcP4u1Di^_ZA7x5zUvv!%4>$0NpKuM}6x+W8 zlbx5rWaCcQTkgUa9@vFH|H_}j=0*p%o!f@{?mh?i-hDgVf6pCo@7;I8y?331^S5uq z+0y{$Zv)sl4=~z11>@-{SaetLzHxNppOoGTM6oz3%lUt5%QyfElkmf_2V#B|i`eP< zd|jutd_91wTJkr9x{~QBqBY?{e(w`n`UJC(JR$wXAfUGdZ}0D;f(A9RM%A1Ur@QI&%Bb?ek4gc@|&%cE$hfl%gsV#uf4$Kw{W)TDg;C{(5 z1!x5Zm!Aw(r!$1K$+3{1pG!n!&=WQZu^`_!71%V~UI5D(z+xAc2hYO!odfurpZq9% z{G+dg+fFZGvKYez0YwG|V^B~LT2;IkGiJ4MI{7(1RH<+Csy-@@`o7f{HNeXDqvav) zecg`oQUfp7rT11ztAdENXDv`hzfbZq9YvMT79)Tsp1KH+J^4J0NB2TE3UPa+6!sC& zW2-%U@IigvSozlFmF%IA@k5t4Y9&oS_lzd}H!tbDQciEqVt*D-PDD!-onqKfdX+ME zXx&7Y>(%A4kUj%}eirkytZT=>%ACG|%X+=G^dv3gYNa;^ec~7)UFjPgM+TKn?k_xG z%DPM;?`fBRJs-HgW2+1w%J~v~ka&>*1BQQTg)_FNQ~lL54g<#ClV>%6Lu2jBi=J#@ zfx$EetSe~}g7yug05#t z(OXK1RQhdCsHk2@@ui|Y(PRJh7Il_b$*u|dv3jpfW!w!AW~37> z@7awAbk-IFe!&Fhi_qWOFdl8dXyY`%;xrsA_h7!Lwt*1VP-M;e#>mlFwmGfc(19WQfg(1TCkiM(&{iD%n_@pS_ zT{utAXY`i&YoR^~Wbu3~odjf9@DQ#47oUC@?ma((U;f08!H@sQE8%5#0L%kGJ@R6au$>p+?5_+a~Yz?=kQ%>Iy0NXRR%{QdPR!*OX@sMtaJzPc!w7 zr$kl0P<3ejsO8y26De9ysJLEoM=WNp?`*>5#)irQ?CCAj0n$6w_W zPuA08UAD;_G3gChn(G#;@S$$N9P?!SvX8@mOS(CCRY$0eRSPh}{?Gn&u?>~^aTqC(Tzq<`KPvUuS3zAZZibd?F+;up{-dBrUmnO){ zD#;E)66_PzM1~#!VrYn^R?gph3VGi0(cr&_v`Ow=Pc+oqn$uNZO4mF>=rYa9qz&2d=IYd?ZNWGHRu+H=;}X$IR@gIZaxpw z>3QhJr(v>nDq0Yz7T!#W;HdbMK7f9_Nh#pA2DfFIkC?l@YgUq73-;OZr=tk0$Ds(W zQ-4kPyp;v->j_v?!N~#X=>6<$=tl9?Gd~#D!)iKQEa1+aG5pj=Uj@6@-V6WWpMD-5 ze)2&$fA{NPJlVito)kjnhZ8`_pS z=;_THE87kEX0=59K;?)h=Wt$>^HRJ8c`!*9)=R!jTBWoCnh&14K}788 zXY*58`du1hgss9HW_gmgG`}C@@2UZS2tseSCJ5j4HmiTEYX|9DdZCm(6g=V*BSVO9 z`M=7uF8UqE*_Rnq!^3H2d1M;02!koyC88|R)jZreEZ;f}sRn1m$&v0I#(JfMq+=_q zu~0v361R{t?|Et6OXc{Ap3tKIEz$B})=jMp`1F-D=BSd>vI-4-S3=RP3yL(;Qtpqe zG3q+Ikdc*T+-CGdli%WyDz!dyMN<<%5n|gL++&NeKra$O0d*fZU8GCbU{_V~G;Xq{ ze2t7+Aj!5RA9J&j+FKRGO)9q6nU5WLo}f!_V4C>94H!?xcs6hwgLCoKmCG3)!C1m< zHiyII28>6+oj69qou`pu3N{p6jguEj)>1id$L;V^eKV0U%=`IfNb6c7OEkDF zv-ZA4NA20Iu23C^QrPDePGm%jC%H{Qr<1saqbDwR(yR+s3Yqcs;wp2mgmV? zdCGZ0KSpd)EcS^;17Io!s@+l~G}#Xq?HPewC1Ja`7C%V*#d zKm8H-#h-d3y!_6fpiDUC7z+W&eqeF)LOIarrLb-)iFHhKs(_B=V)zYN|zB2VPnkJpaYJnNTfhx6+QV4929I^)uP@ILU=txveLX-HFEb+O@QL@2$*izfn00-NUO}|Lu7=>;Cq1KudR> zC*)VEC!KCl_OpBCs=rQkfL%XNZ9R9*aciyH^j_ShlRQ=VhK~aiYI-9gBvoTFu}eYnH8X}c#+`GSCL4xU%n4s-ZzuJx-^@ZT6ry% z%2H7@#SRRr#L_yT75~l))!~xP}m-LE4E=7}DiyhDL!KErV$b1or%h z`0}8#7;Zw4yEG|tcE%@_Pa8?P9a`?8P7x{N(hvF6HCW30-K3Mg?y;uzB#!|mCa3e| z%r1csi5A`O1@MzTbZAgkIrTcyM1Q2dQS&P*F&Ios#+<0YV2eSp$3ntL&^=w*cTxi@ z{!|vE^TZsaOVgB?ozRpAjFLbwvAitlxz`%s(Hh^ZmxPh_DTJPIsQ+G7ne=##msWlL zLP_hiyEO)SoLk@7F}HD8R!OnE0_2tQ+ux6rP##je$$JU#ZRf`D(|8=<`{4ih7rzUa zo}0s+_r4CU?Jo)M3(5d~F9Ccdpe_di%C1wD_G`_&R6ObN0><48PHh8Rc=k~^Gr0mk z_wnz7PyE#D;q~_u&yiz5dAwq3dlX`dGoj^L6T<}Zl$dvX13`c~FG~DBwRNo;8vLUK zY5HV>RnA10b=dN3*+a{`6_RaF(Fa-?tK{>*8Ly5Zv=sd+`#%31%sP1RYmdQm&+Wq2 z>3d<>1<)_7d0N**hgFc0fS{EtDOdQ+$O-W0^@(ni4;E!P^M*KOwtx{*{_1;h?RmA& zsd1Ss$0w!pXO$Qj^bh~8<@}K&M~~{~)IG($CU6FwuawGiqHyiB8&8Z~UQ zwUa9ahZ>qx?9D`)xf#K$w`i+#O-yv_QA}2p+|`Zwd0#hk_5|-}edi~0bB(IZ@>;R1`#3PL2K`%Xd)+lQ zJoWJ+x(@Mrr;~5@OR1G=Li=$iS*kMtc=o~=9)I#G>>YHlxpgKu@)qkhfp!9@kwJj| zY}04~g4O3<0WVaIcCE7WG6pL5L-JIvAFTrm1L|92*xkL(DBf#skOmSy|2&fhdG zZF*Y!7{7~#rijD%S>4h`7Paz0{rE3?=^zl!pBV$+Dg&siO7(hje7zsmr1P& zbDc45eb-vgLxkAOB3ogfL(4}PZyZkZjPa`8SKSNnsZYEg4i9JWoB#RGVeje`M%#D7 zc)SUVed7{5fAIji$p(zZn4Nfip<9)R{N)KIMa7!-woxz z+EYS36-hY*J9N**kx<_k3U9G3$QY@McC%wTIrx$G7@PV4jv*ctTG6ieS)avUo;7Xa z+Ch$w?x~N_+Mm8jV~U!?sG}GF;c($HSPp{dk8#C<>pn$JOhy6@GKPwU*=)2`Jnq}1 zyttFq>YSp-u!Ka5paRn&4Sar)8(B-M2<9|EbWMt#FzmciEbg+Le3HqPDeVPo%ar$7 zZl`?v&Xym;I!C78&uqCoHY_9U2rf|_V~!##w8*tpc)l#V$1}N*WdWW%w+|*UU(4Lz zQT}T$qMSMV=x5$H-gqQ}ym@2YaOC0mRGLPzpelsUMj-Ik|quM)kleX`ybp>N&Fz}Y~gZROk^aXog00FwNN&&w8 zH2|Odxp%<+{sH{E&wdd$!kr*z?t#TJ%$)!NOkvb<05C2gU42DfMNt4l7r~q`JV4aV zU_73|{NPy_A3g;?`NQvoU-^aafH#Mm3Au~_Oi0SkJIdJhtYi8|TWW+>?P=BT`o3Dy z0P4{K*bQ;BJ!M8@*TEZWAN-{AQUs)$Kk{U=?6r}}GlvC+QuhT3uwi~6ju$2ol z1;U8mHxNEM*uuaxd6u!JE=j17wvu??xagyyBTvMb=^RYi?kuNslR;S6@eF@d`W+C* zi8fkCAM4C5D>x{v;~e?)m|a}aP#ydUuHUgM2G^M}tp zVITPJ(SoEdFjfbh|EI!5p(ml*y_JIlc8Ui;+$dBKAuW*GHAKva0v-yp;g;T#X(&@} z&fhgaidKG)Z@nb&*T=1fqI>;1bR2E|q5XecdRb8~|4q?7I(W~U&%y4`e+OLLox$(_ z>DOVgSisraUk3XJbBxH3u{zW~m(wL{o!f|fL?pBj$7czrw*am@{}_yB&%+OW_?_^{ zpMMv;^R+w3djcpd0;Aja1ThFFRDEN|i)gU|Gg-F{-)VrpFO;=m=j;&6a_jr!?3baI z?iW((Tl+1UbR9t0&TsOp1$h4AHTcqBg*85b?NjG4=7-4FG$y%%r{#8Cp1X!BfzpQ3 zs}k)MFpnP;KI#VBa>-`$0GoZGwB{P_Ru%~J7=;c5*7WPP|0LUJ24AcRm%GG z-xg^~%D#Lyc;kCF&uY;!_jGd}(quGeU+b(F7%+pB$;M zLS!f-2M?lv5PSjn$PdmOK9)fsKzL4p#WZ>wt|pWDKA+F=eqvQyeXXyR)`Jx+<6f8f z9*5%X30^H)y*w|JG!#f{rPlX-W~9DMS< zuy^e;eEy41!Tw|l+o$h=#k_-gxD5nd0YmH$<{#p-YK{cwPKk+Vj=j+bk!J&C5cH+^gfOVI%`E9FvxSix07_FG^NUy_I)X zU1v4WtB;-+Q(ABD2*3G?gicj}A)Nmo0X*^S9KQL;v#?m+0h^mUbn^!S`7HJE=P8;! z$z=%a#V00sv#+fR@sX~+c|^3g@*T%oRtmdg{E4|-rIW8PFa43CA#&{K1HR0VWH)lQ z<$LRU6i+Y0zLaBS{UN}0{ygU)dEQ*MwT4Dhnj=N~UM;DPx-6~tEmd3wlpw$*U8?sX zrpMO-bWqEq?$@iNfzP^0R2VQM07Kd z$*B}MaTm(eX4D!oNPy9aw!ozuZLOW6->l+fr_1mbl$@EfmRDOw)_2*$DDx8LAr|xG zk|7gDFVMUkJ@7gDRw}0St+%iffWauHVs>K1*Zr#drfjoTPIdoqj0hFIGyR@&lALLx zJ;tJQ=8z}t0b=ft9*Dl{D6H8RiWalKrEk};_B%DH*7(nGCNUGitGFUaqy;!48Bu;Y zE}#Wvj_OTM8ZbPBkk-O9|4?`v8|dz`&F|_^}U1mUL3R0^+f9-G$=- zBiK7!!p;=n``&ve>|TB^EN6cNfBuyxVLIM~@y2-=k2c6dD0mWuFoIc>YKjaTMGJHZ zqJV#+U$ z3|G!p;Z4V{@aj3|87;Efooml}_i*)Xt6cl8R)=0sweoJ(v?`$5672i>#FHUBg{wCH zMGA`Pcmx+_0N;H05T3iVfW>$NHYb}fpNBn`P&is|6ywKK#0H@h9!%l@(eG}=X7#;8 zl6ft%On)ln*5S#Uqor(+ePQJLq%TpQhkli@$u0j$8}bu_ErG8p{a1R|mgAOS!TvRQ zOy2i--9x5(ny_5fXmjBy9emsmF%sjTQ)o~@-^kpR1sUg9I-9iK<#c{8$2Y9 zDu$!JG!!)LlN&t{Ap2hbW{OIxE4c(jkcO2v$v%xpOv9av6ghDnP*YqXR?$tIl{Zgd zBBfB3Dc@?vvC_ZteOl}Ok$@H>*7PKVRF!Y?^da(|a3Axl0YJt}_cJNx6F>+h)K%I+ z&r`#X8+n(BLG4L*pt>Ms=8;kM8G#o$GmGyl%)q5b>5=5pQWtPsWq{|ReqRQ%tP5D4 zH6)vO&vI)8IMLJ79G3Y(TD~3^x|%a7))=@?A^NJ}sB`0bN<*n=pa-!pSP&3T z0BRq(^wYWwu0?@{34TmRfl``G#zb4R_H}jC_t;V^fXlFP)z6F4E9<_s84MMKTY_F~ zgXyFDxcR~LN~UCKG-S=Ks$|+^c}xowr~#4oxs4&x zN2ASK3oa^W z9g6RvO?Po^@bN!9`%3}=?V02v9QQbh`QgnQ-KJI_MY+B|P+*d6db_x+hn{3$sFbJW z)ghpmmZvQ*sp%5*cWE?ak&2wA9P9p&J*4lOq2*ZvP7BDhWhM|o%SxpDdwP-XFU#+1 zvaiz^(nndw*SdqX=$FcHiZ3SmsZFiEUI)DFj3>|P-?e8fXtPZ7O0_)d4R)g&dcq(73*h%_?1 z%%g-h6FRRJ0x7D<$f;`6E>ly8rpz>W@8vsDh`oDQ?NuXL8!GE|h_KZXcIt{9)u{tx z(NrYiJu3Owb{>zB9vekH_H`cP0LP8jWOSqAd%n}AsQ%TY#|WXCkwgbU3MLZ;L5d@> z>=sz|B(9SrASAkE>{b`V()ZlpL@d{rkHHWDw6?+aJ@*7$J&t{XW=$Ba34T_f^y)Y+ zf%_x{ciV37Z=Jk;ZVBamLR4+@tkI|y9W4ZU<8<8p)>ld!DQum(6K0`pi~JT4i4_~X{P3*cVg@@~Q`o=yEX=Mx z4&V9h_rR}z^4;)#-+3?ds6=xbyN!A2j;XTSK0(M1jwS_Uh`XHGgV( zYROYNyt&@$w;_s-_uc|3L-Mwg*M^e@TKeem%JcY&{iY_Ew`kP)^KW$goZR)i00ih4 z`a4#l>I;H;*TJ_Qc?!Px?IZrEj-#C^TqWt~bL|Ga~B`;!_@y;bROtsWG2&pVyf zt5B>GkOpHS^Mh<@H)Q*Jz5EpMcsLgs(!Pcw#23HO`p*?fVXP%sVd&Q7sZA@p zx}$F_TJHxA;V7$rxbk<>$)6W8mxQSDyZq`CFCRzpUnb?6&hIOxntMgD((DIC!Dp(H zB*MF`QjCl$(tn44=L-S`Eb*2B*7_>XBlUTAYx{F&C?eb1fQ2Wtc*BtS2+E`Q7mHd$!@)r6*v1a1o}XB}~V`i-!Ytij@$V2)X_5Y>wgJ+B2|scx*_r3S!u)PuDd;|eoqCtD(B>(yXj+bi6eQgZZ85_4RPjKC=!iz%6gyTj( zt=jJ6>OY%2q4tH4yuPU^KHj%^{v4<)_pv;w%eS*9c>5Lr9F9itjfb9xZ$0`nY@NCt zJpeG~&d8C8P+^s$0ZOT`vf6b_T6Soq)Q|Yrkbc%@^`~UZO1|uOr|z=On&KwjXZ)wOw5d;OIvo{}47S1EXQ>+8i#%M%&3`)QsMR|A z#c}R2nOdNZ*3s`e9~%_IwLJJD?ekjp5%7ileQN~k#YDG@DMhhA(VVDsf-Ks`nzM_y zDj36xiLVmGZ}mcIeBz-qCm~4WpohP(+Xdv~R=mr8)heL=u0$1wRI7_=3fRq(bln4k z|Eq1I@sjzA{UEuQh0=(zkWMb z<+FWx(s<~f8<&Qx{aTw=Tu()AscGbPIB!IVs{23nSlt6`6w$4pJRRA{r zOM8!aM9LU+p01(Fkt-8Lo|SKjKH1hB`L{w-=IMPz-qBTV+G^z=GFC%qYU@k6!mnO5 z4JLH{pT{MmHPJIwtucl1a0XXzK@wzK<@~WI28yQSrXUf?`|m~VdzUd;d8P&)1DhE1 zDOZRTQi6A((gBFr9pb`LaakEcXP;oxa`9LtMgE?*E~09ZD9{uAO;@PN3l& z;=6GN%D)izm0PP)U7|+~a6$sXkGD^FG(^b56fv8~9ttMP^l@YSm=tL{0fg z%Co-bRP~n*P$(}&YnRn1*X+eU$>+8`29r=Wp~EnJnd9be@QeKRo|0+TaqV|oj(y&;c6nAjITIH)M;mO^`+g|zu(VxI zWz?gmFJ&8lHh0>6=+#%t+xpupSNiOzfXdK5Shq}XK4(YQgzp9u3jRi}fZ_A)tqHEh zQ_~TA>KES$6PUw4_~(BN&t82RM&k{bY@P)O>lZ@+1vP>^2!fZu{*_1I&9B;lzxj#p zgpYspwJ0D2OXD^x|3Qdc$~gd}b?FG1c|Y5IqxJXtX}B_c9QCaO5ZSqD`B81`YrN{H zG_TwDwXwY!(~z<7{;q)?9`Eq@asEv^d^PR#Mz$J-TXuq1&lu(a@P)s89KQMR(=gfC zf%$Sm%N|c!($$?dv){IgeO9}V;X&F8Z}j+S?LGU$+`kDrJx5nTI4u_qS8 zfFU0T(4~hl!s~SLxNx}fD|q~A06+yC3wH++mCAMJm?wIEyu&|7<^@}GJC@HtdmEER zbXbq6GNag3XW)+80$0}EAB2i-2M}dVzYEGnCDOS}%}^faA*M#mFrF?kfg5#_g=-7N zvNG_bRHn#M+&(w07kZyU)Ev9jeL>bv!{$L6m)dO!Hh%(m_#9WPFU<1^ZGFyIYv!4V zOpMzqQMk@=ha*>^aAp|Uxca`XwDK>A)>A;j*Kb`JjQU->ThvF~{mY#TcAt||i(=^$hB-B1Orm1@G0 z%$Yur?WpyyOJ84}7ARN){aW98`(j`J+kK(6_twh3*?3PMJ$-;mRc5X55AXL?`3Sub zpkL)f4}c|n{)-R7BTrm{v*+&y7;hjapjbco70-pNW@*|VJqCqptfR%NuW!p@DQQu3u5(Uk^89El845EWT*5r}CvTeCo zrfQFX>$(p79rZb-Ov(H=f#`!iBKf)u04M+!b|a7lC5nkde-Z$~GUI#iV>vm&S;t^h zV}17A7seuvB@0qCc_*)3&)J|Flqf33JOTUk$D=TSTu7Hz4P}t&UdKVoqoBcpj;UwS z%R$x8;nmXO(_^ZlMC6P|Zz>!(P6E zmUA3wU8T;_Xca}U~}gVIDPI;{P5C~&jHLX!gsv&KKPYi{2=_u_q-O) zZI9q!zJ!f%(}!{GB#T(|Ij~fnkms8ZuxYo|qm;icE%v$4FoZw#t&Vl9{JrdguXMgvsPl-ylW<_eiXJXgVyWo#6))cTKT z4tl8M8+}WZiDI2TMn?+i-^62LJJfjPa{Z8G$C?zdYDREVNyq3P)C_;wv43} z6`9mTpO1oIzQ-3){xkZ;is_6SF1wb`!hkE9<7zCrS#8R4oNzLRZa#wfLI<^6J^6~l z(bwD%OU!Ys?LJ|C6@{P%DD>5PGYaH3^|fc+F*%B|b(AuWv(N2Hl%&NbeJ@B729m;{ z)5aKJGM>QRY!3IIpTehp{#|ftI)mT%tuMhNPwc}IF5{Qy&M)CjuX!c>>`%T6e)5N3 zkJkzA%@?peokT$p>(;__5HB(2i7>(|w(6>rKw>ugxNBe*!$1ps>>MrJT&>}+%!N= z4LHjI+q$G#e5W33y(54fo=wjk*Jkr8`IQl7y`*J0Yk+J)s#-3r^k;q_Swp{L07XUS zmok&8;gqEKy{fc$FTaa@s%Vu0yUcx8LS9b~dvnFpHI6TJPPyJXIu0IGtO?WaG-Xo1 z;YA;jC{eLxpA5Pcd(z@ykVm140iY@#59mZYVOX(=7DA0vIPMaH!inR@Dk+_PNacIT zu4p74!h0jEJAD({DhoB_y7hhO4M2Co){Y3o-dA1~8i6dlHYyF1a&Ufm5lH0xyRm9` zb3>AVNv$zUw6VuSoC_zrsad*fYo(?9i6S0cvG58&MuNqy99zM2U4M`H8%TW=+T)s} zwU7a7^f70YITjuTMV@Ypz${W`q*?wFp?i!-%-@S%;5H_-N(V z{k^VrxNgO4mrn54G$}>9~>QrT8o;Cqm<>Ply{G8$Xpk&yU@tw%T%ZI?lCm9AJ_+ziVKjJnx&^ ztH}s$&w?TR?O4~qn#t=!`@F9$Ufv;N>^+yV`ub5U|F#_=q36zW30vbaJbPguKKFZH zf(uthuzC6pn1_H|9SQTe;y9+2rduvwcKKJ=&;O2dKj~A%Rt3k4Jwfz{=Jz>3*pi)8 z_UM^e&>^1AM*kerjv)rp-hL0@26N!lj$~{KSHg8i7{6Tk=l!}kcHC2j!wW5+)ASD+ zf4Mm=&&mM>v!enn0|UKp$y6PmDYk; z=vr9G`^pv0`;rwFhi;6Nzy6MXNrB!{XR0&G@lF2*9_#YXjzZc=uj=tZKU9Kxxi`L;2@%&nr}`|G9zzlH!5wq0I5x~!vu88=!8m*goE zUjMfg4=Kk}%4@M94xHN|VSrgrzCWw|UfjW=uo?M#62#Z(%NEEZ@4~o~P@`jl zczjsqN4b|AXF3XRTU7w<+XIiH$m{x65qekK^G+stGFMG5TX*bgdqeGe{*v>hBX>Hd z1O_bjE1t69dDvecdh7uH=nD_RwZkpgI&}xk7b92(c^WrkF{&`HH9VKfWl4sEf`uJ zV%~%2{&7AlU{BRH6}NC=B=q}2ZV=6nresRBX(iL=2rUL_PWU<`+cOPI}KtlX7Ssl?O=txw>sm8;v}l~EH=S^}ocQ&U9s z_bs8+)-&YqlTJrfjE8KdLwIbTvf_i^MY~_+>SA-GkfP{?!$_YMYhX?(EhTF*O09X1n73x)?2wI zhKUHrnLK5^Pk{8=)8a3lB3j>z%ep*%)&kmW`@B8vB$WL=A=%68t>Mf3Wr(roy2ZijncK((7lw{1;wat4H zz|N6*rH*YtM8)T#0opw_jxGL&gQ*P=36bwH2%vA4>fa+yc0aIGW;Ce&DZARVnl#EZ zADc(LMY&8oEgA*!778{LJ2IoDuWv35muqByYtyV6+DlVNLqNW@)_u?WlAkBpUzGdk zDR0Dk(sz^hVD72MdDv43=LZ^2w0>a^4{;eth*e|)>LpS1xrS_kacL2Wl#C22EHk21 z*%<}>=YZTr*rOf`Q^?>6h49tN?Mr&2_k__}8a9t&2QrE>gg&|pnj9{iN(>ky41k8o zFTdIrEd=s7r^0E(?U#~2^;?kxjyu)Pznyf_8<2hOJfwfreVsB_QK60+wM^E0(#L&0 zF7g&(>L*KDbq{_Ma=lne38AM5#N+V~l#jkCtL`R}WK#7y&xAp$Eb*|1gZnkv2=hji` z8?qjcE3Lw_TX|dHp1g1EAxCX<+JBM^EpqZ~N$d2l9()FV?+?EMFggX}=?*N>QV_1+ z%|SsMWUSmjNA;y~otMcfa;BA4y*)cgPFPC*&dck{oen)H0kwi|=ebu)N9Rwail)an z50Y;4Mj*uKK&1jH0)CYW3N*)_z_tD8I1B)*ly{?epqJL;6BQ$uE5J+M6oL&w_;`ev zZ^4L4In%{IA)-ijep(Y9(R{n}$Hl~gRrH2Y@iL?9f@Z2pXc48c)&<&kZN*FDF;**n~(_>#xydpIZPxTl`BzR#2?Q#K#~e`9_vykJV+6a&Fz{ATu}>bOcl$ zD_s`$oko`$C@=}2ONzySr1Cqw(LuSS)FOZ4Of9eZuof@*F43T`Y0JyZg5dF|+M`}S zKWZw+x^u6kvTZ6YmuaDw`NDZ1nG1p#%dHw{ zyASaq!fN70OyeqJG*QJ1ipVhlx)21ggM&kITU`B$Va?F==2#Zwtv&B~t?&DkaGOV$ z;YD-pvjlop3Hy7ie(&#-PD3nmHNN1rsb;}Fiq&nXB~zywUG{3ITKyK#SamF1_C1hZ zA~oIDBET)(Rc+^Tik9qIfWzOD30)IdZ);lPExO3dwj)`A@6EP+c9r>L|E?)tt-se5 zu2->mx`v1WJjMIgTA|lnb7`Ukn3d%XVtH$Ni)zw{L&e??{nkSx$NXikza4?~43`SAeT4|ES1iIbQm%B11v-i-T1p4G}Q zZdr1rIQFYQhpfyaW!7aWKUPBtcGUKJP4{XR|CZioc}kx=IYd_T>((@e|4JbCy1qzt zg@407oWg=q`D}XUu|jMp0yf?)0C>D8ohhhwb5sqSPNn-JlP!S5m1JJXt6eAJpT1ggGO{k5^OcdDkTlt1uNM%9N zwIV8)h7`5pEzCmj0CW{9Hw&Us7Dxa+%s4gW4UF*6-9OwD}CH6vRA1 z0ymk^ACiyzI;_E33#4h?(s88F}{hRuO|3= z^FTJgnlL+5SijM!w&B%;V{aYQl63qKeh*Zzb+vd~AFVB#hJXRBZ))wU zH1a%GCHswY-MpT*!v3jL|#V|HJYAZ#)d}#Uc~l=qUpCgX=_8?1CjZu^a=@A>*PzfMim~?bZp*zb`AqVZ?}q9Gx*zNO%&vhU z{Lu1Y%NsnN*r!v*bN-pXP5x--VLcL+v1g+XS3l;P8U7Xfyz%ER?B%%d)O+GlAN`X)N`osx-8IS(XXrLJ#{ zK_7EVc`P%quGe|fyL>*#G+J?JJw;)al)f9QV26odFWPMOy(udJUh!eR%|uU+oc-&* z(RbnExZ*G7u15{liHD7IegHiH<^TtW0JDHVA3%Y^5{INbhJ6{Kd)`}-nX^!Y2~TWBzf()SP($xKh8cf;(o(X(x=@O(oGp6 zyp}W$tHbZ-6lL1WQ#_CVZ7WGNFlOi+7yhpWyyIRMLlnt%%3Ng~4^>o$)_v46T6}KZ zGS>OFrL2ckqp8NvYsy#+gz;iSm1XwRY-tN?I>hJL2%G1mgFpQIBkU9pk44sxx;D$tv|d;b zkl}J@RUQC>-YW&(M0i93Z3CpzE;Ar!d2zw04>3w53_vU!(;`!N;AT&Kl34mTfgSlW z9$b%PPsh1^_1azdsZQ-~pAlH9f0lxNVbOpaWzz9UZRrh$k=1uR08VXzw-~37W+r4> zC-j8~S9PdOKz+=f8ZsvmSR-Fk3>JR_kUUf^hV_hHE6NBSpHWa9Rl|&0)~;bfm~**c ztY?fgEEXf!I|$bS0&EAaa-EdbBPnMMi~VudWAhH3JGVmeHg(;Ps|Xm^6X0km4L9Q$ zWOG&h>aG7(+GD+1s4f{h|C_eZKSY5ap8Wh8^u77U%BJH`x=(se4lTc}XkH&$j=L}V zERucomVGg_Z|LssaC>f;(Tfr7$yct8;Ez84*YMC|&%vp4FNa0&9u09i_~_)&l#iA5 zHt<11`A#g8dD}SFN5i`6@so8^RmLYHXG(HmnHX0DW@R#4zFn4H(NGkU^+#xKC29iiA*2&NH7LTUR%5&H!IPpug62n)N12bAMw?e-=M4 z>gRe)Yi;PKi2wj``Bm;Oh%(68Bw>)IqA28b29&bz!#N#6P@|GsPD+ig;wx8cOeRr`rB$>1ff(xs1?LZ)cO9 z3eQS3l*c-1X=t1J0HeP0PEzso=<(`np;b^r-b|Z9cC8OzJ)k=kQS(()o=?GXAdQ;gu45Rd_P@N%I@eD`NFB z@V|}z%oXHS_6cu{htQ~HeNPTcv?rQ`)?uWz42Z{v19`kp&wX^rF z<~yiNko=BUeyf;Z5|e@C^Ca(!tRD41q@{x?JB$)c{<{eILIB`d`;fwwd)<=nz~(bo2psU8*kN4g zepgLJ_#;FC&8J?XIR(z707K*vkagII<2A(KL+J(wIa}0WRPizF?jGVXfYGURP+;gX zOAJzhg_XV^T3%}-@_x5<)P$Vcrrie=+|0`TaV8t&C;Xn@-R^@ZwarsfUq815(jhc^ zWv-h%@nnc1JcMQ)WL1P>0nSp~l@J{~tReRNQL#O2eg1wff>^%M*q8zG9@iO1GSz!) z#7nd_|CEksz!@@M>0-qrR=b1aMnBkS%Q6%2I_)Aq+Y^I)hDzbf!3zk9r~R!*zF zmK=9I0I}mpEucj|>uYmOxf#NfyfUlhiKSW{rVBRf*lQBGhX%{~Gdw&kkJaZK` zw@$+x7m5U0tB-39sLJWW|GGR!=93qkO_iYDS;fs9bK*P5Q8@{Q2B$n7uSygfX{Q8J zq*~>gIY;J;7i4MLIM}hiLRrx-zl(gEw+^augX9v~694L5>Q)L$F|V>*s?4l;PVjL0 zAZk&jZ#{ynj4iw{(UEcBE;mGq+!rwx=?_xOB02HOItL)ragS;MYmGm7&xIzhFNY)z zNO)-#db~VCpWF89I%rB5Jp}Iv<#7qWa~H&5z+uUmJrRw2yq8D)5rKmart*M-e2q%? z8D(8aXZe|UnG9W9u`W8>C?vK++^*tpYFpA^!L8>=ex#wN96Lei8#q$JGJB|t?Tm<} zuV%$I$U=>IEdx!bQX^(0pg~;htmw-ol$}|U5RZIw1W!=i7qzkR6s+0?-1kfihlx?G zHy|xKJbJwizx=ySPu$>AWvUJV0#ly29cU(NW<0`WTa^?hTa``U9Pja z+w}yeHKJk*DA9k{`n1Z^SUx0qwmyaha3iu%MLj6x?b?2C`B+JJ-+q&qX=9Gye+L77 zIp0bipyiERDS#sX<#a?tc^aHXNB<-m7EPu`(FKn)d0V=G$n|L~>^Nv*hVhkF8m@P= zQ%%8_XHD6YO33rbe`PQC)xTJGIAWx~!E)99LxH|^;f$y?o2umsCk2Mrx~_#Lyy^%` zIKK|p%*8T+%M3pr$k3u!mkrk|MO0;_G%Q3^{}||OaVUa&w*qx+U4jczba}1gkzJVP zCZ8jhchbx%$S{!56&76!xjU{@6ACS2-j@=sWUb5G*kWaQeHhuFJumQr00dQ3#D5$3 zFqDr=g9Y?~43LT;w483;u-^qn5QG=SjHCAn&MdNIj7Au!C;$Kl2S$h()Jsm6tSRK) z3~5z`BBYa^&(}K*0bgE9MW@AI>ky~qsG8?$@3CN2>*rDZVkBNMO0j~-ZMe?m0w=?I>_x`aRftLNcck6wW}Y{SOpY4i^0 zlrV-ee+@`c%RN|J^$kDbcOV8D`>hA0uiRE6dx+7ZWo0euazv15oX`qkqntW~uv%&v znvPJaGXdnC9P{vPb;p%_(Y4MeWmGdgF=Ek4>2GmbcTSbgzqf1}HI(o?U;kdD_e{E& zTMby$=%rjem`>TjgP!n5<-U=ApC-GnzE3j67(fL^m7DGzR(JX#ld3n$McWj}Aa2Le zI-swX(@5K>!dCTphXIK3Q7uh1(@2@;qya$TNon_9G99fB0e zA2Ew!t#KYoELl_A`^pK2+M{n4%AdQ6VnBD79wS^0$FTdTxzS?G>az#CfEaev!4j>q9a zaok=Q>y$*^z8d+@=ZoBnEj+ueK+o}Ih}d}z6=@TZ}2Nh{xRt{Gcr&D-cGX-Hf8=(?V%*gK*=SMP@q z-*0PU0$={p^YEG9eE??NIoQ~|4VK*$6~b`jFG%rGIn=8}0tIWiOk{@OnZrf_x;`vC z9Iw@uRo;bzjoooBCO3GDioJ z42M^4vz%3UhBlKAj`)=1Jd&*OO7_!wg9aqz8Ox`7KMBXiCCPDCJNAV#tjpCprq{ac z+gwg9Tiu`R9@Uwny+OwJj>Gseoc0vS%lC8zE$?}BMS4`zB5leeH`{l4@n>s@=QQc_ zY0gUa@cVQq+N95SB*I0pTg{SNC`jRab0k>ao2!mOj$jS7ID)s3YAIfKR-WA%x?!~3 zhcYG-V3#!%e@jm-*-4})SFNlJROo0^K&y08-)$`_cpY24CHP#M|Eqe#xf6ZnsNJS@ z(`w8TRvu&Bhvhlg{M&*y6x#hf(Xj3S2%+D?_=xZy<7aT7kF30C8K}?Cw1#u$OdbS0 zK2E^AR$IgW#*+zjiwRu5vIl#62QY>$)pjYi9i%2#f;p~1Lm`%THG#8eUt?{Yq)_b9 z?9tNKuA|a(+-xPC&6UC{f?yu+U!`yQ@((pqcsx(Hx%Sq>W!h8{+{1IKqiHcz^ zLec)K+N$>U><%X-uj_89$?2lF^zED8@3Pi0?u!8&+kH}5b4szaR0t?YS<;@MLBO&N zxxzSPniPubk>=PcVax}VmVu)Rm>>eH-}F6;Wi&un0-jQ=FzprK=_Wb}pN=}Eg-TA? zBeFK8l4>%3Iq!x4h|w*i`n=Gff(Jr)NgoA?d3c=(D4;#E%d7urEXB}{G5+|w=`sfB zp;Aa^i;*?TK!9RJw7~;aBU*xX5bnthDRDD=juVPICt8~GN$qw{>~rn~H(x%Ly}%u5 zQCoqzhW4~lj!?xL8`Nhu4qud!vbN=Ylreu%*(J-^oF7#IRbrQj@{Xq{5*mX2Jkl{5 zBrXIKt(3Uf)k3`V55I`lr^=i{<&^Jfk*~ad$XlNEWpg9aWl21O6XYEpdN)K!iIFX` ztm0jhqIlxwo0XT8dMcOJiOdH z5BByCX)QC4Nd40ulu%C2Q2V1;dw+ZH`o6W_t)d9j0H4hVd?WM)Gp+PfP(cZ9SJF^zBhPP4a-2r-uKwgkUaeM@qHoH%Px`K?N}~8?R-9a@ z%lN;F`dh!}mA_+VJQ^?`Yk*td_(mb0g~lw3Pc%o${v2%*k;-@jO8m&V)++2zaT86~ z#P$JdsVsG?kdf1r0jwyirQBw$F!EP=qj?#XX$8jmIOu!E`#|m5ydMGxtop8&f89E2 zX$X&(ziYs-{jN2iy|Rb$wETG{pvjlf8&pTp60r!`Sl7XqzIqY<{ELsk)x8CrKYIp7 z(@j_|!+e@3cU;x(j4qMk*$^Q7CX;1ZHo$=Tc0MyrQ9!nQir1LPdNP-phbAxGJf;wa zi^eG*3oiOy%eb~**<#yI!f^xLA@bRINa z?}PCh0YkOSCG;x=S=W*As(6(%?@nkrjt$N0Rkh~j`SL-OkR7^hCS zs+*05YMBvUL+fdrI}c5=Mx`FZjRA?BrOvsVXRy zgh6Y8Gas(-S*)Vu&FaPaT6t7#s~L1%s|y_0Bc&cNXJ)lPS|mEhXQ8(CTBFfYt291s z_6^c8e2h8-31!m^^L_%?c6VWSZ(rv!Go)+$gtYqkR^1oY`gpxkjiJAk$`tOZ2t0*S zeXOluc+w!r(YaJ#l09QM1u?6MqHWdX&hmM;=HpHke$pqj*$46J(&B}~AM)c1E7WqN z)T{iviXh2Ei7f~p95};XVkiAwv?9;FK0I2@R~&K~_i};GyCnkUi*5{`{oSv^m%j2S zoW1>Sfbk|Q@%EnZlYp~ACTheXD#L#aToakqzDH(IDY-gFp#Wn8b*_A@e+Hza-8%1< zYFSxMVuG6YR?;L>>0 zI$YjRRyPz}7?LzV6oIzuCXa-=!Wz(k!4d&!w&p8SLMeAm4c^1xpDf}`%t&W095f|a zDC<@-`o};HCX#xIygHUV)BK34sQRkNY$bU}q^2oHXL6;qjxNbJg!09pEb3gh1UjT^ z8FFAm7EpEL5;_=}B*x8!dsbI;W+L;@xEJz~a>oA0^ zX62K=rTzN7otLXF$RW(ZqKm_kLo+u7IWHKvMuyuoVP0_$j_zNwn3>LK@x+N&ZI6Ct z>nQ0Hgn9xnnZoXFI08TbK)EgSkAY`}tF0~Rb8n5b&|ObiZ&`C#yCSKv!X^ zqP$scdm~+X%Pdr`<1^oL%d&E0Z_|B1Bzf9CeNk9Ddias6+%_z(ZeH0pq9=gK!;O{h zN8wcXTHF_PEbL?{QXDJ~FlJzooV)4X?OUtO?y0t!93j>I&hs~|ADLbfKSfhnmfzar zYo3yiQ?9Tzd@yG)H=+C|hk3W4C zZoltUa4?_X)w(2rCyTGlC*2l3t#WTlURmPIE8=Z7Z;OUd7B0t=;ks5|7=A;?7l+B? zRsJ2V>dG3fJRhkK^xjXoYx;zgT}xtNFV|&$jjFSK6m79{XNa6teb`}=cP zaESs{cQ`3%*!_d+Jsl7#JExucfMT0 z#$*IfUYx;y{Pfr1>yI43c;j|}(H8EdSW0wlC%0~zR(#}7dEJtT#p{ZnNnk)x`a2Fh z>>at3J_vP)f|tcCl7C~eyya8 ziS$!;#8<9p75%}ik(vTp%3a|%Bd034O+WXQ-DU3$T77_DiwCZ%&=29OqlS#{m5J}t zl*^78%6Bc`wom4id`YR7IlvQ~70C&mE2@rjm~tX}Oa+n2JpjTP06L@;7eiQ_*=8-u zf)chG)~$4Gpq!Ac4%UCKvx%i|SN>E}mLY$A^j1NgcwJtp0lP?D58*T!)c1SLj<%-q6Hh0G!jnx;D4FCfR8=Ig0ScTb1*;IrPbmzZ6~Yv_6iiY*9@o$^vIZ5@GRg8Pa^qg8>⪻dEC2_ z-#g2!05%Mgz_M~?P47#dvTQ|8Ju)OSsx_hSAXhTJZa1Fw#rH|EPpm{KDg2wr+)?bP z^o>4qEDyt@WSqzhn~5%Us!$XL&*~Y)ZKM6?hqO}U0V+Dcn*!uhA5F#~P+RmFNquL3 zk360uXZMU>pJJ=a)|Mx&*q+3Gc|B80xUb1ItH=x9KF}2K9a(gc0upb`p+9E0*vIh5 z6HEAypZx+{xYEIyv-iP#&YngR&<~A4zC2_eRsm0}*NKrF+a7;!9Y-u>o+6N^>64^5 z!b)Rc=dmq2dDYlppY$#RFdE=rZ1Vuxh_2MOA*nw9v={DbvIEkytbhwyG@eowH7iK z4mj;qqDLlg#6;Ir9!U5-nKWS&T=3t5u%{ecAfs}rynx`z?|vs^S;0zO$q_d$H7&6Y zk^E9lMUmTGG2dzeI@LS`Ij_Hxg>8gjjEGOP73|t7;GD0QbZtWM%o)83iWYV9=OpA% z6#q2&`dFru7$F=o3PU%I8=Y#4yUkqEoRoiq5>0)pBB|;tJK`}9Qw%={cZA|G3|xjP zn4g+{QRwU)gKRRTvBv)-#Xs#pbo7X>CLO~;004I9aJT^2i8*ydVyoTU8tGQDqFt}l z>WjMakALY>oM+BEofN zY?rOFW|#En@A`JYRg%UWQ`Fo+a3>C?O^pPXII&Ij zd{pTpU9P^H#`dl46WtfO+>nA@b1@Ic`D%A;TVqJy*c_ENx{{Sg6};GzSemaVFkm225wH1%zv+AwUN?UAYq;r|gjK(Bf$i z03v;?$*T2x^jc`#u9OkM^jjlF#!0loqG)%U+1iFGG-QUiRh3E(Td>Od%Rxwr%T>^> zm~AY%H_U?Nww3yCg5yOsMgL|3IlC3QNMDuN%on{GEkLKfb2dOaUcPAVI@4qoOc}7c z;3pvHgd!vaH4%j+&AA$rvYM#-G;3&7qBMh%sV{e+TkB3^Rc97%mo|-HY0=9QVh!5U zT>KgVQs2cvQeFkl(4+$ves9@%;9lbAdM5a7$V*l2ib`Ovn8(^Ygxs8i(Pt&wsjd9q zsD<8V-K<%P_4i&s+vcR{lKMaVOeWg-STEJIpzN&>5{rQgq&(~L>sDsbKjVzK!&ikwVD%K}tnYxe^eij_@MDRmv4oCHs zBR}5vS+mheORW!a6P5b8OpGCf*X)LIlX=Zijw3;2|JL3RQWS!KA)uKGWrM*9MOYUB zTz(JViK}Y7Iws+t@#a{G@um7(B8%ezIaInwq}(9=q=?HfQa>f50@g2m8@z{un|27a z&iE#_L&;eZYdAz2M{-z++S&v-wKaxQJDYH7YXi1JG^OD6r2E?&jNX)v>6JIO)Kgkt zBJc3%Ml0v72>=Y?sUCmUd}v6yL-P&I7vV+a(1peYnPr+|}=8s@BJqH`p z+hDc~>yr#>@s96!9h>GExnW2~xJjd|S+&k$zr`Q{JxTI&c;X@ZL4T3$ea4qzm0_eN z6Ug^UQFd2Are~CUQlH3~j<5MLhzBR?SU9VsIA%)TPcpWUz-vG17OlEuqtlJFG*fvg z(!KCg+Yh6)W&4^QRa>LhGfF@`o42Mftg@!Nif561m;N?abGAGuRNSssd!v}Ih9-`j zl4Fp+jLJFCTG~^L78rIw77Svnd_)YXpa~04w5JHN$0`SYlRM3&4k^!!NP~w8;x)uD ze_wu^m}NYzS*=UED_J2w&!@}J+g4KyX@E+1Vk;mwt!74H>rZvJ99h6EmqHZ!#4;@k zJx}fUjWe!M$O_CtmoFQZIWkpuyMybRRsj}j%D)vjyhU9TN{ag9^*X`xBEK52MXSC} z#tI46_1&9`ma%$m*LRF2azn(|4Vce6*xg$|hy!?fBMA5$55fu5SYzNd%fe9QbEsff z%kPyv#BJ+^mTGgfHNW+@o)EVlP(oW>P^`o_7A&q`e;D9*|KQ8;mw){gxOn**?C%GD z9K2xyP{8|>nrk*rO*nfg$J?Sv#zGE<;BZoY9cQ7qD`gjzQ@*=9DDi3MX5lriCsJVb zqCy^u!5;)ocwV496CCzC6nmyYamS)ahCxsO1zyth!O?)F_@KlJgY zb-!IFpX77Wpt~yPgm%L;ZZ*A|@ z9=+i^xiaoJZlf1)q6Hui0g6MSt6ke`g7Qk+^$~;i91dQOq~CHtaW#ImYO3ieHJ!-nPTm+D7q1*O=Cc8{5Nyok_|zv0gd#zia!US2}d(z?Fuc*H7-~BhciSCh(&1G zv8+;%KU~;!(NWjI-u@hR_W-(cWI+r-lAw~F5;;V%Z_#P;F1iw?FYBY5n}41V*!d<{PHyAQxO9)2FK?k?b97OuTX%A*KG z%PeldJn=8yu27K`WnEc*GXTJB+8E^2tYOT7UNEF!M}EeNWw0KHZ5A!~p$v5;z3wCG zCkp&Z&ys#mK=ug6A<%1Z0iDqPOaT6fy@cpKdfG9W*E1p^KzZ1A$Ww?^;>nl*0Rr;X z`xx*ktZ@}|D$s<%T#0T90GQ4;)9(yEMpvZ~EJOdZvOXP6D2SPg9`$`LB??q4nk2!_;A;H)f znC%v@wY3X>@zp&m{nxl*5y+^4|Tc##Ll4^2a40SolIbUJ^BYyZNYxj7xfr+@bW_}m|U9j2Ri z!)SUMU^Ep1U_6>2;Iv#WU=q-%u+NY4IWI;bO_wh#NFKhLPtlC4*66fRkqUgKXK$9W zlCj5=$#l6Q*jNvh7GNOd2+z^$zm!Sx9?$dZdNSpoU6SbL1>KKzr7bVR_6v7vCfm1Y zg#qu{Dbj2}2&9L*-mH@9c;&0vKqkV27>8&}gUZfS2!`gs&Bq6k9kSc1#T$Y!mKB9;zB7h(Ve^gO-{MUkL^ z8(ua?tdQoFF7MfbTl32I*wO+>1E4o&uk1E)!2(3q z2m6Bhpwdh6VSbJ(y&Oh^DEZ~4W&5qm&I7p{VQm)34FWi^(-jj!Chb{-NM+@^%~0B} zlZGtbngt60NU?-!dtaTYzKVpShc zI(XvJ9RA&BzXpHrAO8`2Bss-Af`2~5s}cYV6i7~(dlNC;cKIoYBE_aoURH0zm$$Y$#y>PI(X!{8GQD4zYO1a=vg>_ z*K6Uh+oU5X2sqJL(R$VhVcLcJWF(zPNl$WDc@y}WN$Dzn@bAQPgqIRuNVMxMW2l8$ z+A?(S_Y_Niud;wn;$yXF|2;K3#~hOkWdUHRo8GN4ItnPs%Iqy_nEd1c9jhb(ay7Ve z6j93RGeXlUO8%?zW!Q5hm4;)s@}Di-AEzI+1m{7`0LQC*7w3Z;4S6m;hklZOPmIx6NP zs5v@mzpE`$EtJZJKyr_EU#Fb5ACf}f5;vqAntnFKVL_KJtJ2=%Qux+Y*oIm-TNZ=3 zaGNyyz?9zNJ!VI4!+CvW9$|)geR^KktSoU(H0}*10apa{kY@tB`vCyhg$~X|y&<~_ z(y6Ct`w9xBXZ^VzWBg)G>sr*>-&qFP<(uJX1oLhT|K$%Jf`9bSzW|RswFkG~^+p(N z-vRSrSPquxFqam5^=XVupNq?JJb6t>Epj!j&>5|4qF4q`7KGRrtbnIrw{jhBv|`9f zUj+apE0Z)Ycbyf*d=a99q3$_~OKQSbU!hBRjwI5WQkM9Tf?GeWaXNs%P{4t(@_0oU z=9EK!0pOsWei@Z&j`FESg>VD*zeB}|6*^@-u;Y*{MR{3Klw%U5fY<&s0dGV(*aVAuA;i1RlpQ|SE*`;(~H!0j*Q#q`ZHvn^f8NC z*+c6|l=Fz#dv)U+Pe4qa1}Y$tqVh@}3CtOfMx?WDAx$`1diXn7-N+)zeTgRt!rWP~ zFrb025Y>wXV?46LwCH&%x<6a-_77%ob$1VzaE|Aix;dij?^`Q;w8pIOKIdXQ%-SDz z=J3``>w*`$A6w(l=TWtKz24P=BoiMj03Ln{;M2eJRe0c=&%?R9-v~=M1B=-N7Cc|W ztR}@dcmJ&k3b+okIjA;IUUR6dGQT3;MekUQX23kZubo?y)}(CP&Jh~APdk*o#Cwl=!XebW&Orc$DNLJ7J=U9xj7Yj$;$9Bu#tm zLZ9p4@8^*ZX~Brfq^Jnv==L8+4f~Pm2;GDH6*gdT7`{0JXYY6uJn+y1@SlGB%kZwZ zz82o_@(FBjGT+uq0k=-s+kN3rWi_+Yrkjs{Ss`{6h5o4ZisF2|y}~RV-Z%zeY6cVd z`XjsW8~^E#;i(HtICI-8VbN^{pA-h-D0is@;C~T#BTrcY_4Iuhej>vft!rBO#bU~6 zZ?($`y@@|)rB3*49+Lwcdacau8v)8XMLwso*1cS&WGJC_7s|f^Dm3t-W&A`}$-`xz z5Snz}TrQD)M8^foX|1h?ICc#BY5>X$a|%@7*; z+Mu5u2mLmtfEQn&=tn(g2CSz9#_5<8Mm8OeDV3h}(HKcwsPF(Fp`63}i1L=N>E5K3 zkNCS?CelHMxS>|K77AQP;!31Qo@rq-)d7PP{IsC)FGE9e{i!Oc8DvtY+ai%M6rV&% zmePcw1V8H*BNt{E&R-hEGw)}faXc9WB}MmgEuslHA+lWr4ie286-#pT8RgTlry})Wd+dee?j{-e1U~-W~_tmKU z*x-C5yo>T6(ksqaeN2Jt3v`CFyI|yHCE#s^lz6sQryfcmg$0fy&`iGWsk*RUg7DAhQl;JMY`)xUj~faK zmlRthc3n0u%(vL{fcO}-OLw*Ot?Z>#54G0=-6Gg1?UpFl7?>d(A4vVAZ-Wrvfs}C> zW;I6o6hVx*%XoqUY#Ilm`&E^$i~{UuntrsaiYAyfv9KfexjYa0wLD_F<)<54plo>sNzyhI-QS zr3K2@ne(1pmdeh7qV#)Ro>+A*4DG{pfWeVdw+0)lIt2{WTg|lfbp`)j0w1D1Y1)snL3+2Q%C_94fvr+FpM#$pT3kct1-GL zO2mvJB~3F<8EPPDdBhm?TR`63PWw(a#c{2B=ouo$kQl zZ^jsgk@xICdkES#!gv(d_80KrH@^w9ZjPVJ9M1dE)p?FF^~+N)#MA;HZ&d2o{eL;0 zz~}$!0{pvA{{<|kcfi)^J2C3Nw*0$^n?zGG2Ly_&jv`meeQVB)ggTf$P24U$)_kKe z(Jd=I7J$bSE3MK!sHmcT4Q`a+mZ#*o6s}Znrg)YYX}S5aTZ@ihu%@T+EhC(~Uv*6- zy(!6G>TT7yP^+s2Ufm37#M7ypx`^Nj{;a)|`*8}TO4R)@Sy zJ#49MC5RE})@QIXQWT=($p8^S4CBNCqM=>-LdjCH`;c3!o{j ztF(_Po*q#&T2GSS_5m%WB*n+IgBJPlN4UC>h)F=J)RFHJsT?EF#`@IXaqXt{T=3Ll zJT!=qVjGl$qn>daRYjopVdzZ|y$R*wQC|5DWxu>j|I+n7S8o7SRqAsOx?ajJ6<~#+Q*idSf4_`;`fk zt=WC8;cW`MRqxC77Wojxvc_a;`C{3!`Bs=|A9Hidj5h~RoCSSl4>Fe6cezJ}^s5)u zR=_{Iq0%EQoKU%BeWlnI60mqOp2GgY94=qmP4>kQ`$7dQtR=5MJ)xvFR(;5ItuJ4U zX=oql_1Kz^A=$s}eaq`4nWf=O{Qltr&t8ulb8 z3cRsEPH(hi<$CD#RRnNZ8K=EQuT=%C$2}_-!*zMt9EnHGk`W=5K(UJA4yfFE>8dl* zbTmJd-VtCVDm2BuOnh}NF%7agFWOBSPugzjxKxO1gvTu)fB*r)afm@UR z)%F1WyWKxRN@tK^aG$RW)@T}NUmn9D0Q~F!@F(!uKlp1neeUJ39G!yYd;%S6 zs!srYju{o^Xl;MX=6F?cpi(IhNg*glX5ag5Nq}80{NY!TRS7TP0IaL@oy3$v%Vk|z z#=gw1G|mGV*W1m6Dud>#d!2r7{}y?w4|uB4*j9RL?deaVc*^%_e;}_puiRBYv{q`( z$vjU2OA5ToxY&oWxAC65`mUE;H|nV~%FJW$MmwvVE1PXYht<`z#)4#$R5GrUc$(W9 za`3J$7GWro7ab75jZ|EF^tENlq9ZPrQm9z=NC{;(dL;~G0!O5f&Z46rhjoxEVTaL{ z^(66xcme$NbsPG3M{p2f%k99UOr9Ju^HQR#c+;L-vUgiIe<>0dJ*EEJ#%HI}6SE5|Akg=rKb82k~J;PC_w4;OId z>LDD4qs1F(Y*CSFEU}>*i+!g1HWv~M-7hKrSwF0^;nx7yRfP$9=kaz{>}WzNr4}$k zeh^-;>=;u{_&I~QnmtD0((IlXRFCS?0-ux}X-0m=3N}0I(=5+fWjA$+;svse z88qse6z9w$tY_pkxeUo+ z{?fd(e7Mm!BA4OqB^c8~3`l8J#d7G2w(?=`GE_22Sr{h>nD9f z_8dJoM7Ps4>iVo4(`vIVW1Tb_03gbq5MxqF-S#`tl^q&w*`@B0z|4`kp$3fv41%Xa ziz65*fpI`RszSK8? zj#JUZGWlOo=#ubNrq*DERzo6Kn(@|zo&v{;( zc27ad74#@;@!jEx&X| z$QF|$lOjj){0jqI2c`Un9tbmHgG0vr7ugJ0TxAI(Dmxo%r%ew3Q z+vCT!Ps%<@p4Ig{xuAz_P<$`e?-&|uMyrzU)IUS}B<0mNSW%l&ouvX@GbYsNv$PJK zXMOp)73Zr3D4KhDpH98bde00Bu`+x>x5pVdg5{X0_y;7!DUy*{@U37WfrE&7rH^ql zbQ)wkrbNVv{E|WYi?*&TdkCBc8cH;&hJYSlssI^sE;aU_D0CihqGS~1BDpToC_Fpw zi&3HcQ(5XGO-tlXIq;yGM<|ntH{kWZrdz-FtpIRrX;o(L2@tDVuZLJ*Yu{2oCiFe) zpCYt|_K2ZG#x@m!R6|Px`ZZ1kv@Fog5)lQSZr~MLS9WKxw+FB|t8|tDN>CptuXwT(*!*iYfJ&E-?R4(jRoIut)VaVPrN1|)%zSa*z z!Th+_MJ3P7lW6qoV2VrvL4f4;j~lZ-?naMFwK_h~44Cd?4oTc9gU}{!Sjh<~chl0H zU?)X#7uEIYI;}wFcclJXBYwIr{a$x)Nh9O=ZABF?&AY(AH%`bmWHoSBpX$ujC3 z#ITQHcne7^<3l3E_c4inhDB?F$|}oEch_QRTxOn6+8MH9ze{=QYAm!zvGqG|SAK3- zuLrMvGS0jWF|UviKEylddbJ5gHom&Igv(a}miGW`uxuQGfYc$fmpRN%Kpsb zht%@Fm<8;<4btPGt-o8z=h^rs)u&_EM>a!zG3+lX#+r7YXP=X>7M6;SsCvsyngjC1 zKBDy^Zsg>lq}qu`2$Eu&^Cl{eC)T55n)>nQpwMu@T27%N>Pk z{fv(xi0^jM$>Q27!JT9)mK}_aFXG=JR)fgl(w<_Sc$KW0%D%tRX^6t4lOC^id5bqM z`;>`QfX|fyfNlvJFor+*i$~!9_@|$N{l#h6Iej-AN{cHRh& zv%{D3u(F=k{P5a~2p(@!&fA=80v8ze3p z-`u7=GAJ*7KgA8T>tK?}L}JMg)|UL-ke6zWqPxfaPLhpWnqmbh8ocscj_s5h;^Kh| zecuf!*LybjWBp~KlC8V)*_JmD*`cJ~1;UF~4ejbJOHjcxR^?1N!{x6)C* zeW9dv=Jt?{YaPXZNIg;}@|2iS@jASTgcWoQ_NI855;iF=sSSWf%6wKASAa)ax`m=a z;?UHStRJ!B)dZ0&zj?PRkEqh&l$Y0;3zb%2^UAYr7$ykX{hxx4Qk9y&*XXqKB7xla z-{`?4?-)2orAY+h^t?rPDO04qC4xEGr@CEChpymos`9>1*Q#HSF9@EC0smTJo**=QpW^MNbmI9h6>B<0! zdeVJS%2*=nbUtvG1^ld^_t$cgRrE42GCtRI^v|1?vg(bSZew!|i6K|jqra*1*GhRS zfNkF2mhRTxF?7vY@Wrb~%CkJk15b3){cd%~Oc^&t43%SBfItmEu*uuY{k-k0iN@2Rrczq=mp`ErGxGDuS$S5n2i?gk?er8)lT(bdM`G`kGxLqgPVxY9M4`lJZYnY z?YsJZU*@G3PWkFatny8Iwtx=iBY=Z$0{`xFUxQEo-q&IC^vhwqaTbD40J`2r-M6AK)9vP^vDfK2{;<$$KD--MTGtUksksE%U}0<1pyv@+BGaaEy>mDgfP`EqlX z*A7Gv9kodMEwHygwSyP86hi{b1(eh})p~2t1Mq6^2bd(ne0Oqm}0BssMUwOW#_ljCGdPk%LCz8bCqAqKwYUzd}3YJ${ESawe3BRwA;; z+!2OYtsvJrKv49ktEl}I6+u;=hdLjh;-9{^6U#@p`_MXWSDxL?*G|LEk@xkn_nfJ8 zfP~UQkN<`_lO*C|&!{cHxcRtXkMucHGir}zAIjKD$7#K!cOv-vf_R$$`FC|@D@sLr zCJf%4=32qeDT^6pIZ1x$Kdh;OP$&9iVWx$T0{>_Nqsb;5&PQTl3JMi|?A2HT zhEN_WG^Q1wvzgU}@7@$G@A0|@XBNvX0s+(*sYtj*VL9Jnnnmc9gGs_yByM`N;$(1h zGGNHQllGrdsHHdUHWLoZ<36T&iu1Mlg%;xal&gLjU}!ojFIo5d>j?zVJ|#$aJ&2xO zFZ?9E^AyJXKob8q|2|wDxiKEYE&%-Q=bwj9f9}ih^rbo6eg7-qV7`IgaCqe(6_{#? z(~f0oqu{g@Fk&;M=V#68ixI+=ESt+Ay5-C-dgT)l0Eb2ZC|Y8SeNGPPuqf8pT~l2@ z%DO>bfWJpaxk{lI`bY-V=ktUi`b#bOMniQRBYUpfSuHW<)xfBo<1GNequu^%L8aqf z*A@`=677>o?zKn5Yd}OB1fwqN1_uk*b zCTVSOT8zL7ZMKc}yOUTnLy}#GYq1kv|3pKJ&j$O56P0`Eh>$YY9>&h zYbT|!XraG;W;fh)~&p&))C6K$CYYz%HI-uUqs`r z%_&SK6fiEup^&%XGA*f0Dd!5gZf)?%YOK$Bmm{WyPc1wPkJ9J5rJe4+B5Td;i5i5H zcM?wrTZ%!w!d0t8TP|$>0fyktXbv0oW=)fP;0$BkE+Y&@8mb64+V+%oF0pE zrd1AB)>TkZI~RpUO^*(u=F+Cd31Lq;)+Vu2`1jZk5!_5R5OSB+Ny#QLP$V65m`uj7 zIi2)70aR1oFROg@LQMUD>-s#aTo)DjfRB@SCDVZZ(V_N zcf1M?7aOpEO<2mcr0UD`D|-y#F{F~lp%zvj=uquaN@gyn`sGrK}EB zuq|M)YU)#%hbYs-XdhSKsV|K_(l$2Me8aD-RNt z%J4QPi=ugGmex1D4PCpe=5>hbl+$09UsotR=9meP1I{N=KJC)qhXC65{edp)ZoB&2 znXkkYb6=Y+c|Sqw?R?aEQlSwfKs*2)8&M4A^~zg+_#h(g;YuT#^K=#90-k^VG91o> z?Vk<-l>O>sMs1tH&a!eSBb&}Jbi2+-2+p-y%S&-O2Tm5#P$UW)#$$2ll8o{-TYv>l&I?2)jqF2nl`a>EVhki>aF zuSvP{7(b;pFO^VDw@9e*z-v|csw9ak5POpW3<;{rs6n_tnM9I65A(9+0yf7ZIK90E z6P96oi?a06$tBBkj#}4A&^kmeD*1okzTrVHdd;LGg<0rH?FujGkJPU~Bt;ote+zIp z?_g&-hOa%l2mj!oe+j;Ppzcc*4D#Isf!ph{7f0XO7jTB^u=m%u>ZlNK`@%r~fi(bRJm|PdYC+c^hUt$=g z7+Ser%YlYo}6_heTsODIE&ZJ;@FOD;Yu>Lz}ms#+(id7*xK>{*|k^YW4Mv zO$qq4zduf;DBmb7Q?IwD%$w*OJPvvx=7L1JUoucgFe`J)EaE5vG5dsFe@R*w@ z0&300<-}?;dnd_?C<0zmMNB|B%TQ3{JxzYkQr4!@tEl8%A_LGx;E7fXN^)801AP*o zcrNKJS)Zo*lEun$GE|F{uwp^xD3qvv%77FHFd-#gT2JFuTdz@6i(X@Dj0q_)$_L$C zM8hQC>GG&!X)1^zBk;BWK@ku!?&dJty8>GqW4Q00yJ2G^7)tWCQ{UD3{*lu0vBG0X zL-AAqD3=t5y5)*{a4ApL>+n6q+1@eTm6uv#P6aOZ+@0wzRsZcP6oNf_$>Kl zE-HB?^@2=y;Yi~E^pMqFSCaGt5pq}v!e{ELz(VMfhUDk3G^!^NbVH<55%7|rP?Tgk ziHNqyp^xmO;6OqLy@%_TJmz;&8yc71TA%N3w_V1CC|I^httJJSig`(3Yrd+yqS z{cF#_sJjN^(F{hTIe`Ee>DdB!c;OcBZG06D-d>Rh222|}S(iyR98vIS{!AZb7l1r} zMubLd2kMadz1!42vKf-nNF=M9TixKTaf1(Q!UXz^^<@2Slv@lOXyfka0{F^U>3 zumj@NcS#T0OmU2LB#1YB`co*d}%2D1mC#D2w*mvz<>OsN8w-o+rNMd zS2`GP-VUSj8CV9(KZ4_Vd+1;BQW~%a=E@R@-@ox_qQZt z3gDv^vKk1Y6=7|;wiL9Clt)Ua&p5X`7&_DM)q;BGLCZi8E$7C1PUBJYz{yi)wXP`W zCA6I7Xq2wOV`*yz4Dym*lNvLUq-fSh(6s(k$j?T>A12?+Z?fNND?U>d=@XAM3$7PU z<6nrbsYp3OJcj~6FS?OJNXTa>~C7^EXJ z7HQ4}oK}kMR6~O0;vMSjtE~2c*cY6gu2qw>u#!n4r>nJ~>I|%6G!9me30%8&2>S;t zNV#iGDNx1QE!!gRz30b~hL)6zK}V~nTrJ0+e4bDu>UO=f*4U8sLeC~^DLqnN0EmMd z_||v?Z++8Q_>Q;V3t#!hvv9Ec6pT0Tg30(4EEYi_<$!R!ztG%TB#Ra9Ylasu<;p*8 z@lD8jJdz{1Bwk0fmS_7fuM0*6V$2NNF4+)C0l+r0YhPG9;pBJ{SM*vV_w(dZsDujK zzgxX2Jb5u8L%dR=Ss;kl&juQJ4B~z)ZAjh`vH8Nkuo=M+P*xg+ zZh>6XeuVr>^?d*^;@D?1P3A0nip2apk1<*w#g)KukiHi_mkFTyh=asq2;a>C7P~N? zU4nCG0N(l5`{7-0y9c(zEtTpxqj-5F%GzN96ZP$v@lTWaxOvK|ys9Ph)a58&ZaN8& zGLt&+55?cqSc@_jo*<+Y<|XnaS^~REfWQ7m2mk6fz65{yl_%lOm%klm%Tut#bNv&7 zoESfk3SAe2h z_^X!ld3!sDl*d+3R8-s--Dh^M%4ud@f;+plr{zY)Qh62-huTzcbMMNE2Fu#_^=rfG zfJ1$+m%sD2SQ(jUEY@-8KSe6lFJ)-GLC&I&F4oFig7^ve&qb{uW6&*;nIn*}3gdd+Q^;yTT_R8v#{taOTXdQsL?Mjt8ka`a6qtO`YNb?d=9$3You?-H z=}2c8*uz6F?WW|Rk*g!hLj~pf``U9)5Krx5;gSP}6n!qUI=Wrv!oQSdnOz$MN#)e& z*Wiq}2e-~l*(yAx#G;-2`TFRsP>(p8s`DUBip(BE)d{j^Tez}ANZ{ptE z!GC3|lc>QGsar83aFAZIw~k?Ra~o!}DO|d84K7_>zzj)f&kL!)HAXdX;H9)$%7wXd zEc(XbdW=Dw<0&>aY(fV=_wo0^#VecefBvga!}j@C!kHh|z$Kl6+ z{aBQ*7H^K6$+5tSsi0WnEZj8;Cv#Be#pKzo5RND z6rQ>O@IU`=zXgBt#m8Xh{3~GrJFpyupnt5C@K>=u6`MrMLY6L%*5)%T(C*dtJIdMW zpKjpoBsPvxE!E^j3mSNGcVFT9~y^L(+t`p0<(_gN(fBT7Iun0&#rb^du2am z!7^NRh&LYu03h|4tW^vP<>~Yy01#3^s=au8IUOD!g$@jT7X%BGuX)cCg*vl{lUPD@ zCQF?3BV+#Ad zMg;HBR-82t-9%}L0SAfC;Wbd*A?}HgmFs#-QC_FkDAQ6lbEPwHv;Ez#*8xAY@j-bm+V3na*6`@m z7HM7YeP8*la=f7Dea0oNP|M%i$k$JYZ;;!h{vqTgroG)a{1`(;z3+0NDMMw0m9$IA)kbsocA+sQ} z^m}FWZ6qh7^c^J)wLsUbrm3GR+FUbvlQL&Ms~E`Brbu<`Yp6_4WyNllmC~(hAug4# z+8H6u*zv!OGW@ZQP>`Aq!a(%j^jh4~^!kpP1v8km!O)%Pbn^OezJv=G_u<+;z->E8 zyz1`*y|!y>wr|tw0}xIY;JMk;t+q}AwbRiU7Rx!j>-A^gwqO52xbLnl_|w097@oTb zuy?S8gT)M$w6M)k(DndGF%J<1Qv?E@Vxk0!YKt4F001npkYXu-m;wM$@ZlRWM1bXQ zGBD~}A9Ej^B z{x@j;tS}Y)kCi0^0F-5i+Af}rR9_tTDB0x-nr}&@8wY}bH6C>^oh)HvGKD+O-vRG= z*SEpXeC)g7+h4l{)8LUoEfDD>pU64cFX%K}zB|rTK^a@TUdOzO_lu`FM0@3kg8qfO zvo}ZZ{Ixm!`_DWG|MXw~0URvP!l|?O!Qmnp%s5s@rhLfn>YC6(F-d<3Gu% z`#?j^I=;nj(VU@sw_kq(TYSs2B;9|aU)i;sj%Kv$Ot;F}IVj3_UT2M-LdI49X3NCw zB8R6#x(3!3%qQH^-s~AMwC6!(SPHYk!=hXHX-)M%f5&eC8 z932IyCwb+C+vh^an#B^})%SMrcYghQ;NiyszWm??c<8Yw;Og!nEar4Q9lE=*X9{vF znd`b(6}T>4+e$%d@in6aoe`IJjkJ-He%Yd@)s3fOA%1#9u5cVl*~PjL-!uZ#Pi z1g%qwynJs0Qq_g;x_``2RKvaTQxZW>Z zLwRav0{7i>JG}V~cf#vmy#Z&p0j432L+Aq<9i?=@izW>NqG2W8;~6&e^L6%jU%p|t zWKq!N9B`QP-3Vqux#uX_zxmtWgn#(Y{tPZ$0hpe?9hRf5a0?`iM&yM=d?zUp=~=n| z$6ZyfyX5^}j?UC**NNi$thO_HmVH{IcK^+TDz^Gr-f0=eep~iI*W6S3>nnL%0T{3X ztNBumh9T|q#6pj^9)0ciT{&&(%KOsOUF>+&Wn9s}$~B$7p>p*&97S$ueKSNBk76dr z52AQHA?!nD&|T8)F3&2Yg2i2CaKqP*B&jiJ*>mcQ1n# za03;!3l}fL?(RN};B>NVRPG$kOBQ;>>Y%S4I{uVqYW}Z%f7J2^C0%*W|Bof<&EMYj zyGrWgpDPLD@=f+M4|qrOEdjmfCID~xHh^!t=XThipM~W@#{wb!UX(aICdcR68!)i1 z=x=TKvV?emVp)L55_Nu^k*E}ST6OO zP*<`<^v$STSxJ_D{Z7VCwge;6yNRkF!9w^}7tZhV<;ALBB5o4eYm9*Sjh;JNmSUwo zSVy-urm(XEu*HGiF{WTFC`Gt-i7b)|hE@6wtht8T?~A+xE9~Dt>++rcPJ>_G_s0n` zl(getET5?QS;3bufOJe`414pit#xp?0QloCT!w%CZ@&m%e(*Uscjs$hIX(@uImNjO z_tqy@T~Q_oT+C!L?;f$}yu z0+839auuT)9-ULMWOT54X{TQI`5F@0CFu$gkc>xxN>6Fg=P342@IK;pp=_txBV}gS z?FP?EhCDS2BJCj(G^S889U)39wW(7Qk#hZ#5K?0%IfHHo3$%ahXMI-Gz7*RpLRB09 z>XmwGTWF6m*;C()E9H73X`2ga}H3sCQ+o}!Y-FQMi z0D2YwvK_Q>g>om?B?w?kp?e{vmQcRR+E^!Pfo;|6(4r!~B-iulsDnF#_O%sHvb~gE zO4lugSsXl{77ON0;}!PYN_dr9KQ$qSn=%RC7YS94qJ%fW1U5rA+YaX47{2oLL->3D z_;c`uFFp?2XI}>6joV?qn4m!e0dWp?R_r6%TR6L+$0A!iIb^?N1z=Q>6EfK*E8}QM z>orID-X>4(ugPbn%ri{(>dP|>WD-450E`^a5XDOyAcxewdaBEFL%fTI^aasg9y_g< zol8nq@3XR^D6v{*wZ_x`KYM@vUq?F%08u#$jCkl+R`Acqo%S}292 zkz|c6Pgow?;Vt}wfAqiLpB#2L!ZQvjENL{Y0YH7`@C+X9FVfPyMjk8ISJmax4qgZ-i%~`ldwUeQZ!z^ zf2Sj%c%V+ukcI*UEAkyfy_7dgQvhgxYf6ApRMBJxN&jIYsn8YrY#(!Oi7%J#@pTLO zxgY0WBAc78MFope>aygx?prcGc@rD9HIPvS)pZrtnJNi@!=EO@3d1@FdNr zL*Rrdk${%W-FOhl?3#^GLJ>1O!oB-D*xB2QN4L-tN^NNRyz9Huygx}4Q5v3U1MhR0Ep=L%!Ru<@b+(K73M(*%u?tx zMp%4K_=>%aHNfx8n0y9$VL7*+2acgPV|8f-+|c4cahyuiesA2+Dd3%@lkT!2TNk)) zV2T3Ml_^##`HPINAr*VfywS;zSA%IE-9of|E6tM|qKo>UD2u&PIbQf^J$X&!vU63o z-m`qf-`OcSH2;l-q($a-di=BqFX_hT#>t*T_IjIxQxna9R@WF$2KerqbNu?h z{1QI<$KSyemvQO*b2vCQSpi&X3T~69?BPETlpRJC)7kLMEv9X!Ne)2HcSnNrnXKtz zJXGqX*u^uJ4SVJ9`^-Zc{x};+GV%!TNzY!bo?c|s`m+}J+e=9aqOEJ74Z-uayoP1I zH|>{|Bc;0KGbo=g&e!)Z(E;pzm7+2MY0Xz6Ww@WWCQDi3q478Djl*lh?NGo@GPtMf z7RJlpIY))?TGmefX1u|w087IJOyoHZ==Tw&x1l?RJaL{KXV&Er`y7IaC0FiW&;o@Q zbQgoZ4;~P4{^c++b`=VZlJ+g!sp~4K21-8H5D614DcHw-#oDWOZJSoROxEgd`ydz{h{59t5lf4ByA8Wu!MjsVrg{mR>5_^PtJh$H2e0 zrN$}rsw#$33qSW4-buDJMx5~+2+rkIjncXiA`5+TaBRBnceK|Qp zF4sfAxO>GZvbc}Dmz<%kk}ARmGX<1^@D&=+OS_x@wc0*K{3SR)gSel-BPaW2d6nwGu?G#%64g zR9RmW9#blGwf#-I%3sF2LUlO{O2@3ic-V3yPWPhTFllMy4D?ax-=DtJojBm6xaH*d z-%=n)hlQZd{G8W7ad0V8a~W%y5$@|jg==@``1hauHvY|j{48dJr?9sE434ITO&)q? z+XfJ2x+ZxksVR5-fKf=2!zQQQc5uLaCjXb&@nn9QWw6X9H78uNZf63`dLMYcOcjw> zImI4uuL&O$jVR&C`;?Sd(gkHY$r{fd8%0AMYImTv*KaI~mYh#?t!D3)o_ly=q=q`3 zPm>B~?l)dHUgMPi4D^PY>b}w$)?OMdrJ$^>eV_o*3NTy=jeF%}R6+~!Rqm49q21gG zeZ;}ZoLYt(W=igb-Pu)Y>4g_oX+08hgS3W1HP3u!60F^YgCqV|XP3?DW z?DE@mozu@W;aDn1QtuDSkf`2y>z{o6`2aR*6S@i#>%_!`)OlqB;&ISF4FmWp8>vE9o6n=we&82EBCT0 z)QM<-vMbROhj&|PjQG+78g%Sg|M`iOQ$HwSk4pSXX&?HRaL-#7nKsgR+)(gPf>xsd zIGWcuY6kchzws6P5C8l>V?Ml$$&JV zoKlL@oI2iF%gKKF(yt9U#^I0@A#u#8@;80>)%^xYC~|Egd7^5URbpeLOw}l0gVW}6x?Y?5m^|S)TY!CUzOlh|!x*G; zd=&K9G%~iBNE*nwge`iMxxtHqXZzibSg17G(~v`$O6pG31sL%Hm4&VlxQ`E;{*899 zQv~02sDdW!EQ=Pptq|Vq<720hIo+G?YaeYn8%@(4Pax7M|iSda>B!e0E$*HjzHUj~Swf@14 z$y*~OIHyR=P1^(^G3R+WT*BV&99ugx90FK&?Z@Y)O9>RS?5mKv%(t=EosFzM5 z@C?S*rG(V}KAVz?#OZ7IyhqnvRdVq!Scy~1F4d||KmJ1Lg3$=qE!498S{Yy8(ti~f z=~B)jsB{t~Ot1b?ph^9$W+%lDsye`8>_{6iASL-$& zfU)A6uT4B^%NzLXFS19&GkCwZd|s9ShIi6ZWjMmZ3?$YfCO*x)7m zO%;RE@Kv5Sx0SsT{l>hIX5eWp(i#)>lYg)A{9ISlM`_0}H+TgB(|X$pnaKu{&R~`; z(|HL(a~M~Y?$)=#^gJGD7?V>zOL%Z?uy728FY>&@0t$(2EXuneP=|EfeEzjHjuj=c z1(IF;95}c(55Ox33_c3ay{zVYH^IB9Jr@d>QweZqA&@|V)5^<`ylY#ySQp{f#`PKg z$#?mkp2bT*KB?P$5Qt7+7|0(MNnVslmWAT1CZ~RD@444{Y1{8~Oug48wZ`|U+g4vw zTIlsk?Q8Rj*MjRQtro|v^(h5@Sua;u@eoq%txcqxdGq_vo>S(TxR#@BJJ&J!!Uw~# zjf}kg0N6d!eP_D2RIX`P(3iKnNQ`whXa3=0j)z@3*5T}yNo_bjjVI~sp$#zVVX<;r z`jo=4!0G18dbS8vr@afyxs+=IpIo(cu=to#5X*V=R0gBxslqB> z@0gy(@{Len7}&IK0Pg%+#S8Z>+YSRA>8yD=iExKMot$_5b#B5Xi&F@UkZWAR5ZlHO zH1l#}wYFN@$Rwf{^d69~}t3kNZ-abxc~m zldrNlY3-zA(E9GGBUV$k$Qx0Eso~aX^-bHjUqNP=ro>|Jm=Vx|gL1w_XO%g-ykiGI%ywp7SSDf>NtdoB>oX7vcN&D+F%S&VpL5*`K|At89}B%w zlNS((J)P`Y#C0X1i|iee@VGN0h#Cd-i-~`H26AF&E+0j?MosV}EMe>Z5jHlC@!qE= z%6c0Yf9H8*f-bq#tpN@>MutHc=nG~aVZZf>cC@l5`X z9dFM9awH74w^kDPHD#Clrc|HaYm6D+yXA=1XHkTLof$gO7oS;r65jWL<+P;VEJi2A zI3wjW8zRD*M0BL!a@o}r7E!h;kqY8b6MhZYHNaM1wZWr2;o3gQpKTV>E@et-FU}5! z<(_~akHh5ye#`Xju0^$5e|r!ZQ&h~wIX%o^B0T*T}X{ibsp z;!>5yPV|-eg~&=E7D6*fl`&XV5}u?>c+^gcOJjTzvUKp6!mlL(O9~#odzJ6X=fZr9 z6z)rDyftfbS?~{hmc*H|nlv!P-^nq`clnyKVN8xm&QJcW!*falwD`*nrsO*mO zLWMnI9n(rWwRjCP0bX<>GvEON8?0{XL()>A8S3l0gNO2WS;V3$2gVn!$Zy#$B4Mp*V4+U7lwDY9g{QmH`CLsE|b$`0u}Ge$i3Jk^(+ zn|vrqo~8}Y=Pb3tEEEt!G@7hpd*=YR?`)&_@RK5apyE;Ch);?@-AgfE(a$5a5S?i` zJBhTX)#L3~2%JUXGjo!;#J&J$HJ*~UQvcFr{ptFf)&q}l?d>Sexb2w6q|f?~PvY42 zzS3vi>s+o+3RdxLuMvN5cn5UBuf~U*<+(m-VI>R)<~x|y7>$7OV1VEK-0S#<|HBvX zm9O8y(&}>3J<{jJN(8k$u2Iha8knKnmCQ@?xQc?R!h_l;kuqkn z-0HraOc^PjE1o}XG$*xswpn-O-uDp{wJ~y^K`BMg$b&VuaHr$z(M!Z9b%&=t zDIJ2m=VLWDVnPITUC4ovel9#xn~Nc{hf$!)cibwzMZt z{lSxC>Yo}=8My=)M{AypNAb$|UM`OV-Z-0*;>Xj>s|>e`v~V`%G`R3#6h8TbhtRHu z|IWIfvnbl`K8!Ufm%)NP4juxGpQM~U9E2dJw7zWB{e z{KNn83;5$NU&qqQ6)de@K{Hsg=>XZ2ZXmAOdj3?joBWykV=C(+8TUouz;hq=Gj{qd zmA>s)z3OUSOC=+a*I~Ht+V16--^nqtwK;xY_P%PJN;Ibvm0+hVjQ51irU2z*mvL|D zTJ@o~fv=L8-}-%19H}a#FYIk~rZ}kuzYOHkvUMW!U@Y3L&)CE$u zs43J)d~qi?@>!4zFyMcaN*^m-HyBkmk13swNTA>V0zP6iCAOrm(5#$lkbEpywtAvNYa`fC+SkK}$*VMX0M_?m&qRoY-)nKV30*xfS@k3^5H9IDIO`O6)xfIu2L<)n0B?M zqlLHUoM!xkT&tGvN}d`ra|`o$%r~`pcjT7G1?G^Bw?s$_-WA2BInWrn)waL)0IdR^DvSpb=ToMj~o>6Ok3s2rD|reh>N!C zAl;jTTcF^J-5VCJc>#P(E8-2pl7uUQTFKU(yNnh#|3*7!foG7Oj)BLB_dV%QfeZay z$KUz&75tSZh{fNR;X~qib$$GtqmRNk!$Y-Q@ub*4k5i)=aot$4B0baCTSdxiIX@cT z<=4l=_2V&19+KOVd^(Ri8F556WABZ4-!xe8eMf(4G=#^fW82m(?GOD;Dl zoo8EM{1h34_WKbvjWG#rhq1~2_`A@5eBeTE)~2{70bpdk`0l#3=w=ANotet}%&#R# zLXpUz^xhG(ltI>!ay}1DNS6wqwr$bpL2DuJ<)nln{RRbtf7QYn_=yS`(1 zoJ*V%I9A(r!KJQTaaTY^y_5%(-=wtkOiC9HbmI5CX)tYSOa=q|!B=nMzyBwn!ykU> z2I}DxSYCY+$MZ4j!7z8L_1+EX`K5RE{<_T(VCZ2wB&pa=*Cg;-Cn}DqH~g!)4=jUb zd!G9YOUn18f?pZdXpOq~A&pN--=#61$G?zZzm-v?z`WxV(krB1*#HlK;JraFy^`A1Gf=Ajul1uPLu$!p*j zoZ<(DEXyRU2d$DFC|mEDwO6cOK?qEQN)}`y3vIO2d0XNg-y_!+&gT5&*bH6+#8Dv< zgI-ZU&!1b3vC*yAhPweeKRmIPw~G+#ZSbVR7(xIi2E=$xOH7V7$Fjmgi=N-b^m6bL zLpI@X{tO8YMf=K*nq zebV-X>eAZh3X#&7y^_y%(_~|!p>_$EA&;`LU<}3+98TxBzkP`P17Nm90Y}Y|7&2}U z$j*Vg7*jI+WX4^msxKLdcfP$Ht^ali>0kOV+od{viDtVJ?JSGHBmPNY>?iC&V=&&X z(q~^vzn`>}_OOc;>EdvnXA(@GQshFxIiu4^xp?-O7JxXSi!` zxE9lMM|%_cFZ)lQ`L=q_BZGdyFO(DuN3%J`!+{n4KlP=%_=o?~m+;vyzJ>Yd3MQ*h z0w&$x+&RihiO#sLyMf!#yDn;mDeFRIOXl+rRp@;rSIcDq0|jtK&7>Hm~ ztkGa#q6Wt3z~AXN7CjztYw2@#83@dOk}K1GLiV`?ZXuHk#JYHCivRrCi8f_%WYkU! zPg3$+q-in3Y`cG+YQfx7@h|=MVXz#MYIRk0*DT~G5@6J3xN?f%f+moI!7Nr33fn;( zLvbl|Sf(x#Q$C9U?qtxzc>i3+i~<2E6B;>>ldc0PWx99L0HjF1HXPd+q!0Fvv9(>> zYXDMPnvR+9jzHQc80`ba$7! z6>kJSJ&du_qs9xCK{1mKU5kIh)hyi3=k^RpC4j8Ya6mc07>=tTJF-{2{e=56K>>M) z1LFa}+6n326s%44thR1Nl-pZd9L8!+>FbrfP6)7S520scEl;#oCBfTe7+}O}J*pOu z7Mk|s|91a%z0>$v>rxapd2YG3uFV~0@v%~WtPRpju0`wWJ80~rmw|5KNQK=#hqKGt z+%-0KuhC{0`+$U}dCegF(!9Fd-p{s3ZwFNq?>#nXjQ!R%w5cJz)ZOXCmZ{{T>moZmRhS+&*RYfYNqcPuk=| zux`HH7IRs;yb&J0x57K8be-+sP4|%3D#8V)Q82zU$|AJztPBW`lZVUVCGdY5ZF)QA z;|1~20Ee>%pZ(??{J;OfAK=U1xQD^=b68z{3j0S5Y7-ZWt@IITBKPhP)Y{QO8K7U` zt^5Q3YaAoUw&AS*e5Q!!4WILRaoX%fAuL!UPgl+w?jv54l`MfH&*g?h@Jx9S-RSl9 z6gj58FrV_x;agTp1aIclHNDH=6iS{CKJ>49Xta%0D{@SlT$DcRk{i->q&Qn$<1I5| z(mLN++#FJmlkymyXF%jdA+vdI|ug_@+Lp}B&=OK_6J|QWVZ%ty; zq!?jo=!|)_y+>{t_QWMbZmbNHU;&dcXEag%PFu8~l`?|9ZP&s(xmbB?ZiF1$Hco1@ zDkXn2Yfjv}OsWLC*yOrz4jXA0%|E^dk!M86fmIQlio94X+UAARU�IoI{!u?vnt< zJSSN?cfW}drW|7$yrbQ`Hak-=ENkgQe#&TDpRx`2eskxb|xjE;wS1p;eYV)}meKA!}b7_glkj%q$%r+IAYu=M*@Z zzL8ssPU(fs8A_;&%gIlP%%HC@hF-Q z8(NOqWqy{&C#1Vv@RwufeuC#^%)|0`dK>yWNuFO@Kfanf^fCqW-&|6|U@E95z5936 zuKb1tS-BScx1QoIH!f*o$$8q6hpGHl=C5ag)CY}^WFUEcS?)zXUTvMCQTW3maZ?S(%1Z%Cj){pj2^to9$(+f$$KV(J-E)oVN?W?*tpuCdqDezBz`Q9S4udA|V&E z!1qbAHjPD&p5ocjb$kIQUUq0Oid{_7rSY@39h)lw8j218DSr3(%mft>8jD2ej0UX| z4EG{sd_1v;KMwN=W73N*yja1R5gNDR?s)|SlWT(>MhQUPV(C$|J#_H2d*;zpJvk}& zoj*&3XI3<5@8vjiZDkuliFz#}&ORDeO#qT@r0jp zYUArW2luw6zi{V?pM~~g#e_+lG^-m7M@u+7dVuTKZ{hIpSqxT|yOpj5eDFOW@AWQi zXQ~U|wBe@j1)=%vDkZ#dQbF}`u~a<{rKFTS=^B;jWy);+pag|<77(z*3a8QflES65 zmoi}BSt%!(cjGdzE6f^m=YNR(*#Q6Q-~TE8`M>``H6nB>Y6}d$m^aUb|MY8LaLZ4J5pt)O$5|?2z5Lf%wuMkndT{hx*Hnqo zUMKvWDiz|r&A$(p=D@ARdoQyDq`Y-EUzqb1=I^-8R3>bL7jIl@ksZ>%rLv`qKaz&H z)cDqPD1~GBiR3B+kn*}X>8%0}JaCqFAGSWCIq6uX@=j&~GsZE#F6ER<#z1Bi1j0B* zbu@?yc)?#FV8kZonR@^@d7MDVATo+%>b0}p$3F#>5S$`Jb`@ihnhBCHYZvU}d32Af4`DH-{Vp7#iQ;Tr z)9TR|7=xG^$Bs0>Xf(mm@fX)Iu=4jWXNd#f z`Rjf9eJW_neo%f;P6&r5RZI1SWu`-9H9uizU1M?cuvWl9g9%2sb|3h6|LHsUr~m3t zaP{T^)-Jt-W_SU!dSr!vSc}{|@VQQ?j_8ribmQ)od!fg;x|#XcXzCfJ(>aFK7~}Dh zqlU`5cz%~XWvLIMi$Wrcc%oe3^E`LkzBwT_tjgKriZ)|Yaac+)#FV3F>t@;)e;<3x zI%SLSDrR0w3Rf{NRpP7qMm4D)D&0*5?O|=eAEU zqSiFjvVCn1eM;3)-$}y;mlT4!6MW6Xy&da766ys59k)k6y%E)%`+>2Q8wCP+$EssA z!L=ihkc@dgFIE7QzzBnM6&^B?C4*r6+LJC__C=G`^yS3!IwP;$v2&(~8 zEuIuGI67j$lhT7qmq}CYC_R%1!n;}|t`xDWN$%PmAAIQ=)HaT`Jel!$wUW+L*RaXo z)AWiOvPuscY4)@}q{~pN7leeJ2mvd>gW2&hhNFp2 zP(`$E@-h%pVIjeP7Ox}mmPGIUP^p5qBnE-k2o{o2l&jOdwA^k9|M9p=UYaef<~((> zk)9V%>c<`sDIW~apRpyp|4EDIAQc83>}`g(^f`A!d>FGf#^BW}Wv_VcmF!yCzU1i; zW&hn&4h8UeIC*bqgM%Goy0ffB= z@01*NDOea2NW%yrgirzygu510kAoMaIXb!6=j>_V7Q|~ko!e8oNpTaAtSQpLxCH^KxvTX<~ zbsOZrJuERH3IplP`>VPMCT=?6z=kmeEo3`F(v&yxdgVk)uCrAZG~Gdtv_df_=v?To zNbas6pRYzoR5FTiXlD^*S|;eccWESC&yY*rC4wXdzzJTWP^*jmFE>#Nel+txB+VD{6+2bVid@q%g2$pSbjVBrdGp&!cc)!>@ zHGG}E*J(m`dp|e_ojXPA)S?Vee_vDyrYQ|1@6fv~D5LA z7xD6YUc#%d-^7g@TUehgVXg-A3Z>+A$@Q7{jp78=A!wfXAU3TCLC*FsAD*DJ^G5Nr zuHVa@SP8-jQ>H$7iKK9m8+Jm_G+GwpzZ+mg3f594Xv5+3K6n>sr41KJVfr+YyX?ImHr-J7w+$V zV~WP-|Ke*udK7f;xXIWMGY#BYfm=0gM7O;46twtr4Fu07U12 z&q70204S=d`Ir{gHzJ6EL^jqENz%J}A2ajz;($;bc!9yUCB9{i1Z%i50aPx27@H>0 zNCX;x&(_kA8(jhkYjmO>?FyTyudJcbkzcuV9h$VWRN!`Z&qV&nRGTRkGr1tj#6qr7 zHgp`dqC;~2&f_NJ8Pri~C~=aJ8`t7=@A!WdkA>wam1 zh>oy(aDaQ;z(Ea+hYl^J`z_~2z#%lG>5K}iAW=al^qzg8&`ygbEcGt2J%yM>%iAIJ zbna6}S>&6OC^$|lc=NZ5w$n#}v(Ok=0jj|M<5b!du8SzV+S-1Ud;d-?T>^G|E4^Pk zrMA*{nh;2gDm&Si_9f>rs2&@bxF52<9URZGIvHY$3ZMDHJ^a&u{Uv@X!%(-fRmuYlPf|dN>vpYKm~)Aq zFD?j&euB~GBzUV2&ZGSffA=?JGJkA%Vku|Dd~|6{JgzPUS$NN05T*4j%W9hPBkZ5~ zEosvm;S@u!&sZkMmn*DzO{8!hlzW6v214+cMVE7>@jURyo)>W6%xiO%g)0 zbNBmj=wt>$f4CA!*$=_~BCY#kLQe4W!oPqMVwd$agQb!#NU4;7I0LwJ-x;^rtN^T? zS;WrLDF3uExVe{S(B6vzG~rz;XtwonHq1~q76t@Yyr+UV%$XL?{xA0)A%U}mBzlhL zR7K`cE$^G!Cj(TUF^Rg$3!J8;n&5maJqU~&hPC)-sZ7Hh>7Jxnr!fwXDs0@JWABj8 z6zNR8-ZUG-V=2WfPy&MPE^Wl`>|yvFR2)Zg*7Hx9(!NT>$8jGX_mk4K*4_B1e?MJ< z&G&javw12!#lwVurt9sk>%0^X$^4i#z^tyZJ{e;Bu*Prv{;T*0|MYYC)E|Bq`?Gbd zUwj$OU>&ph5c8U1CRqbKJ=%;uy-4E?8-)AofTEg5^M@Vv(60j zQ4#7b$)5 z_(}2g;@>qbZ6!5D961mBK6QLZyT=MDshmjZUuj>XbFIuvSM~{SBh$819`e4s#uAJCn5Muc(_yg=seQKTg`#aPK5;x^yg8db}oF&03xSf0rEsR;rgV+aJn zlwGJ|g-K2{g4?#ty&6ac)#nrnlybrEXL^8ngLq;tK0q3ww9UGaZ(J#dWx8;3Ua^}> zI{@Wl32T&E*VA=*cubNX2Q%Kvdol~te)z>oFR>2msd_q z(PF7+g45$9*c4c;g?6IEAoTH;XcJBtw&fakDNx%4(ylrWv)BM;zW+zwedn5|c%%*1 zQ#fzin;hpZHm*l;X3DJkL+C5HPp_Swbj?c20&SnPzq^zTU00j@bEyb$L8~em7%uue z7M3j^XzW%dGCzj6y9@k-fBF^t+u!^Ow)d8?bpB=3!!;aC4TC!-;op)O!99AG!`{H< z!MSeD6}GvJ@NdUt;^Q<^pnia(y&HJ`$qD|C|J%QTU;6ncF=~L@w+6U>|G;`8m=EfC zjmBK9wJ{08Aq`hcS%=QgL;rq+?#{2|d#GB7vE-mRq3x1C3=wzx@FUj4-}Ai5e%UrS zUPHJ`EiLc*p6h|LH6e#(5VruC3pUR`=G!=!qI657Yp~o-Hlhf}^gEf6JfsNpY5OI` zLOLhCP;Pkg{*a0(?q4cv`etYdGM1)ji1`n#;cy)xj3sjgjpT|hT#{Y0&5Cv(B4=cplO)5sxL8bxD?{DrOn{ z^;%`?Qd&GB`@V65at%s+YpnkkkvUC<70TU!vy@_7#{rgbJqULtsGj!%=+f|}fWQcb zGs2Nrmjh0Z=6WqLg5BIkpV2EYR9)YmZ zoK-t57KMl@Q3Ug@z3O7Xbp=y*8{dni&)T-FMVnC6)z(S+`+g{;b!ij&xs=wv?eCQC zExO;9cDq1o-%I5rc&4<5a-G_WMwj~V4}Fzx_HW^h>3KN!&N!)nViRbZiINl84m*QW(DV3c(?|7>v>7{cwo6|=lVaGV%Y3s z>+Y*~-@Bi{fBWD31^mht<~z}W1@NYE%JM9%&7v?^`Z#T zy5~yT{@LK2APk1K<=@>reb^_xj)oKXd9F}6d*!9JR_Qu-^)L6U&)PRVf>z3ByoP+O zIg%-D9U~V=1(a3ew0en3MF=ZUxy>>T7jRHJWx73+E@HX7ZZr_0UTx%*IFM0y?*uORSh#pq=ixf-1j5eV0o z??y1;d=M13EK$S#UP5?2)q<$k&gf??M1)b+52+f{vA2&&%%GS~@iZkyprNnipxHm2 zqKD__G`^=pI=VJ8%(EY25nl)5*Jr<+M$~BkQiN9~cBeW zuns`vF!iqph=zj+nraDm?(JY}dk+nsj6N@)%*BN1$FXR{qpO@o!ShaBqemf(em}3v z!zgWx{31;6Y4@efr0Zk)0UY#O`?FZ5lA!7LME=%vrKb(S0!=xdH5iP5)$stg_kqv+ z@mu(fPyQJ`^ZD;$j&oSQ_yXqDDyByGx7P1CyL?2u#P3APWq>-fkAp27e8Z~rv@(qDKE>r2M-b&kEg0dC&h#?g_9>b2y;dnXi}J4-B$*~}GTl(`2@ zIO8}0QlQg>f32iJzQqg014HbKf7J#nsp3ICON5tRf@RF3#pha^C-eTw^pv!f(lRXj zQNHdNcN$4BpHWTQ{$9Lj7zmo&7xaGLPy38O-MCS8&VJz z?|AzBna>4DJCcWH;0qb%Us=n}+MSX{F>Nz`l`0s5+f3m#nUkcA~$WDKq@uz z@|T|AqOXxe^s*5ad`s(E5-9kcJdiC&#O}B7v}qB0Qw3RW0oE2mBU%*KA=MHVI?V`J z^g~&5sQ}}1v~|CqN|$xNwEibij4fLCVSL}GEUHF6%W@WL znbVtmQmNuaKIqp%ed!p&?;RUp!U7cHPi3?5@55a5ngM3IO0K}r z&v>b={`9xIkFzaR)JLNW*U6ryo)CRXDHB-wj+Fo;gSs=>suXkM^%Ay&L5??Il#fY} z`Skkoh`tsP0xbMhXzcx5LbUKGdmOQ(C`oX|+DEmX-fV5StX3(=N+ePjf}XjawkvF5$szp$b~#hpDY=8;?Yn zjRfv9vW|z=7b#({QX-Oi6!4*@bF90_rN4_2o(U`2cCPY07YKts_G?dqeg57Qx)ww4 zcui_^uW~rCR{*xR53sp;g#8(?I&|!njiq5Uhi8B0&#DyrHuHA)v9v{+wdSOnX@4GC z8J6$e(uKoIic;;nKKr1p>-WoApOy9aq_n*6I`ez&oVC6GUMqd!xoy2Q+;W<6^yL-U z%A8tXEoCswvgMga6t&;bjCqaGc!=-5b&P-TPd?yfo z*tR#yr^WGirLxn$>Vs2K!8W}LaS~jW*G=njYrgLm;9$;$+Sib0vg%A2<#xtjY zN!eTljAVQE@Jfj>^F&KY8KV(0O<-?RE|$JAaMpD%_wgwLHWmDsmPMF|MH!9~qoOGZ zN_}|-`w?3yx=J*Hlj<@TD5qhxwY4h=jC~aYrM;C5+@s#7N70+k9Ja50oAO__qxQ#4 zZx4^a(m2w+Fql5)VZtvyINxA^qbV`RlgR+b7~+$k-oXF(uYV6;`_?9QkIrMV_7s}Y zIpZ6E+VEC}-ud=5{vfP}G{9I}n7u$-V>qBxe}nlR9&BI3k9_b+{O|soU&6shavUZgB7I6i90#Nepk5V)%CN|C8FHRD{7v<{lx(@Ylk&N8 zy-vp42U)E-6N8`pTgPXyoEeWJ=dCzcA%7mXLvv^OE*7k{eTnx_@?yLK{tPCug;-Vy z@&L<*d}c`zV9${YvL7ze#{aES`PEO({4*z?6qyXNHn_cwQ^xRX`T}e>07g~eV3fv_1I*^>KLWaZu^2J%$1)8`u&D*3slbq(Li zQhMKUFj`|Fl)jh3UHIDqnGY}#{++eO>U8Z9AZ9|GgY_a35;(>tu<*oa(V`#hRI?Z6 z=xPh15)UdT`r$AoO{9&0+Ga8V3!5MyF4mI2`Ax?N!U8){+BM1Q3A|K z*JXpD46w2B0Jm=MAmut+~djmZ}`vS8mMP; ztd55!7C*lF+BQD*hp*z3zxOJ>{+(MGtvrdfOV6Mgtm4Sr32>QZ=n|@PrIor!MX<24 zs~4J$@?eI+u*RsGVs^NRqX%!|$3F55{#SqZC-LWh{wYk*V0vuA3J$?Bw2tP$=GF{5 zySo?+pR!(WwH1sFw=JS{7Y#m2p&Nr9ZI)Csk{U~4p?492DjSwah;_o0?Lwn;(qQ7A zWSN0tZ-mxiw5E;h%P*C_FDn!!AKj~m%up695_CSZz4+cebLIBJ^Z8S();ewK>41O*P=4>#Mbu$vGzCMlN(9V8iYnD59{KZBswQS zc@X|w9C*^rJvor~pNCMR^hQAOkdklw&XfHH=d--p97?rm=4 z&Yioce&{8yG+<8xEtSh-UlOgQMr<^Jy{l+-`YIIO`GqmW>Cb}Zbs?1i#S!$#zVQ86 z7PbCsf0t-$x>tS9K-a!}ukM>hCl`U|hfzwFJT8Hrvy38y8>(Tw0!)arne!;ChNi+0 zclH~6AdV$Q6S zv7yZ|z#$Iz?x8x~z(?MH5&!G|`s4W3pMMU`d}c#uP1p<2c)|^V?Ol@r;1GvLQw&$f zsD?JdR^V@Xz;W#&Jz;3}2pzy}z+6}pg6i+199$EKd&-817*p!3s)4(Tc-K1_f zG+OWw-4)IYL-dDFb4Y8Frcsf7Y65?M;32`wxpg_e3?6%Qu=l(7QS-+1lBFSA~3}NMflQscQSO=j!&ekWWJtWu>oMo;7Nlb11TmM}Y} zJNBG$hT1a<=OHPeT^egHwecgcET`dkC9lKlJjZBwjQP<$45qj7p_k9$|N4LUtN6Je zJC9*A$8b2pz^3*yZQFcV*2;hL&H=99xQpYdi2yLbh-tfxD-f>#$$iV{vs`!cF=r4^ zc!B8rP^LaHhj`yL?|$;Hpx=V1Azi{bcre38eAP9aW8rtubn%lhK2FnHw<#Q0XlbLp z%&UjB=04)P__1sd$7GVfmju(47N@v~@2h)RCu=X4ZKUkMfAg9}vXn^=XE)qMmzSQi z?wV&~-r2KA0q4RP<15V?9_F^VqsO!|^kK7d zIoZj2%;qPPIgwZUWTG69wgY5`WbX6QsKXezY7?c`ig zLa&8u(YS>??Gk{?Me~?R^O^Q3@gd8LO2qwtN^8UEAzW(4tiN2?rr-0tt)j=`0gyi5N0j5_G$R$-&`BX#_#+Wgz2AHg@WA|_qcQ&>xgSTRNm*9N)IFzh{+j( z@_X&?Qs3J1wmCe`f)K4uiCFh5U5r{+|E2ci`;;k3>z`(y(s~a^5!1hv;IYq~O2T|w zKc&*P4%(UPi)$a}Qkrv0lesRx>uNJ?EA20(T`7HwzG3xl=E~kdqlG{~!ase(h5#mX zM&O^$Ys{NDR>or+EcSOl{U(0%KYayX`Nkb=?F>!==kuxedTI8%= z6wQV$!P$ts@M+!;t>Su$(Wt>>ILGwhE{=9?;AejP1^l1>{x9Gse)v3AO$ID;*V`)Y ziDL0u7_xW$)@@w7c?YA(8b-shySvXNjH9%Va-ZXo3K$Uk6vcwE<3D}r;v1yPcu@S5 z+3S=~igAAY5i1ioE?2nB(9Y9od{1AcSt^`s0)B~K?c07X+w?2kjxp54hFK#E*&3N} z**31WJ=UJ}!Q~m=U66FO(OVUF8N-!O){!h66ab4AXJBA_VFY9?hK2H-Ox?$O6J0-G zF97SZ?}BJLT+t<4&`EL;i>1uRoj53_L@E4C8BZKZyZRDjGok5`S}n; zts6xX=U=76Z#TecT=M}2Y!H+M;$D5Ejgp$m_<*ogkUfG)^Arme{xkl?HNlIgX$!pu zHbE?M!W#3VAF!DCb*mY~D3Tx|tjUW;;L?Q89f1emsGiwc=%Av8X0q0^xuQBsD1gXeUOM`5_Q#e~PwV73=yB&x{EN~xOa zoh)oVPVkY^*T-3D^(c!x*CpYw?VClFBjMX{5Hs4_d8UGgS!BG4j1K(VWt*~0X@!}Q z{s#>vqX7;uz*oL|h~NA4*YK&&zJhPOatFut63$(C8pH89%)PZO+` z#*qeTW?W$d*V&Uj$7EyzaP4A$`!<%ai~sTyFXMmlH$RG>`^Xgx(b(|~O`tB{i&I`y z1FHbIaqA9l-QL7_={#UE7C5WC6xyTpj@VZgcH{TF=FBf;>n*QSTB|R69h7NyXg`M& zHu{C#i%Sd*aeO1q@DX^3+}krr$>5%`D?PhDUH%T1*&N5w+<8pIuQ4a9j{LT zF;#2~KYBOv?m;5wXK>kf0>5>6ijh=&I10dBJ6G?a3{KMTAUM$|A{bsEu|tayid>$M zej_hozNK-*F5!Jf>e0)B2R$^QD1=SbVu#94;AMV!$dA|#`S1| z-NQNVZXMzN4sc-!l!insNvY?DB^G3`dV;lUv$XXQI=hv5i&=^vKOri@&dDCLd#q$z z+s2=-ZD5ZAL#z?;&UHyF39M`MzxSExDc1gR*|$YtP1Z}lZL51y_wGsPOvT1AOC^ZG7@~Uc>Kx>PvWV zFu?l7cj4U1MI6seus!GUUJYZm$qRkySd%&0==IK8X9bEmMuP_R(GHIHZsNk)5q|Nf zU&7!2J0Hi#-gglPvzb+14~LGHu|Q%24AS+6X${=Ey@SoIU5rC^RTeZDo#o9bSRZUYQ zpDC%i#H%n)5!F+wEYFe(zSy)B5Xf}Ot8Ay zzg*oId`o*G)qqlCNo~f+jzPgH0v_Y%NQ8LxEvQ zu;e;xZjWhyTKk%nuf*t|R$+0HauycaG}NSLS``|u;T~-)mgQihgJh%?g{U_Ev@KaU zUJ3txR_pLMmo|?Rt#sk>vr;;weQ15Y)Apof-Q>SzokfKD)EZm*KJ8Ol8l&^n(njAg zQ3){t8g}_NuJy(u)l|58V}^hBZ~hdY{Jk&Z&c+c&E6?KGrHg0=6C6&Bz&{e+X6%JZ z?)-!UVzFOKU1)_-`%8_1xzleh6Ew%z-M@j0D@XXXKmX_O-~PRi;XRj^a5%5AG%{BV zC?`S4utcpIR6lKitzF>u-2?0&&T#3{8tQrklOuq~Xog|3XPI9;kL?I<8%^NCEoJzL z`6)l+#rGytO4wmK;l9A<`EiktvC4~z755&zAwGl{gPT_hv!1g^WCi+LrdF2qn4X8a zZRe--PUCsC`Ik!Hb5m+JwzlUyN0)*$QnQ?ar&`XJ$hC{pB&Pe7o=ds^ngOK9?+Agr z`^>b{D{iM!`l0~e0nUOjuJ1p~i_y8x#uI(fDv!0{eSORn8;<2=c@I2c9H%CNRrY9iZQ$f*0 zed!)4DWOzHFZWlZCy_x!LR%Dw(z+G$SOpk`wWQB&iW66X6@}h5-~$7h|B9Ta7-2A6 z!QOt2>o<1rp_k6%+=$Mrzf*~aTlyhsy|jJTm*MW)epfwt-Za5sk<#b;McWO*mkbf8 zWae*bFSP6w*kn-)ir}D})W#s^&A1`lQ6*P53!jeUqyoNGE(_+u2_B_qT}l!8`=Wan+6sZx`13wOsx~g>@51Ml zsCZU4nASDw0Wcm7aBFLT|MdG;@yXx&0>1U#yVyM%W4QbTs^K}zv1I9nrIXf>B>J_M zWuP&d1oO_Gb@niFLZ=_2Ahx4wh-zHkYD=dXVPzxFHd!MiRm*}5Z> zGusKNVLpx*Gy_??%E1>-fxnXUTOexV0HgO1LZh?sz>Rbi{3jdJ#@e#u)RoDQw2@ zO0kHD|LPK!+lt0N_B~g9+E4lS5;vFDlRk9u^%_BCeY^k}FUsN9NOtLxO~U$187)k$ zj2pa<2;YbCqeuZ&7}eP7?_x*M*+?#|`13Ejq8+>&~h{T@jHi}2m(J0Ak;@PD53rAY7q*$87(to@-K@d`eV;@T(K}bE7V)C1llu|br zZExrR0RR9=L_t(-NMuogq>oncB*hcD9?V(xocAV#eaPzh)HniBRc#Du!J9!FcQ<3A zk15vvDf8-Cqyi%r8ti|=fiJe53+SabTZ@Rzz=XAl+Le7J7873f6yZ4>k?6pJwNxlF z{G5#i#BfWfFc&LUIgt)z`IyZy9b(5;Zec&!=M|Fs`MH6+o@PNX*sD<{w#_reD;DP zt|vYhsiv$jW+M8}YfPI4C$8_P4$)e&7tgKN*=R7u!Om^e$9M5lKl(EM=3o9{{Dq%? z8PA^|VBQ#EzQNeJ{cCGNRL{|LBAXmmoMMFyT$zuF$+q-uB$V!0I@ort?)2#b#1}DwRdlq=U zM9bKSlcsByUJ<=Z7VPt6McTJKAF5i@W0>>8c~}1}ajLYsu2E#(C@E9hQ5Id7Zto3K zN8$tiE!8Sik$<9P%dN5Aok@3v-*)Bnxk25=N+2ra0U*{wY7q_64zGd$o=+@wf8fT# zcw@Jg5P%^}t7S1+olz=DnnAf#`G^rpTa1^uA9iSqBSUCKGcS)53R)2!0V#l-oGyER_Fb|0Vr@)rKXZ~qa#`JG#+hL>>u@{7P|)m{@j zKDN@53-HIDsIm2iY&`5`mPxusNFP0~{P~U~PPWkN(69_aIco*N2nR1&kg#v4~}V*A0=Dz~kIvoe8i2NYSnqzp}z z?=f2*Z-e<^V;+hZlAZ1blXk(H)-uOyi_nCa@0JXE!r&zF545p#J?r!BS<$nHsZcmo z>0&9*KzOfCEATFgM_7}<+Df|65mFi5YeRK z$AmsuiRjQI2Me{aNnJyt8J5lDRZNP(xG~LI|J6qV>n*&eKe0iJ+xV|Gwo7Ju_Bj43V>D^f| zCw;8Ni}b^qZ2Bg5=1TXLy;D4{Px_Sjqz(15UfjF%c_!K3l#?SYGWUHvv>pb7c~)f+ zra7H!j1TjDco^`XDvr~(PAUvPw#<7=;c@o4rq;IZC)q1kV<81VU|<`C7L)C!9#lB4 zfx~HojqMtL@cA3~xBu~r_>-?)#c{KWwF@s}I9|o99-^L^uZPxi)VeyG+|@(p-p{;& zb+zTY2U%|`In*;=NG#FyZ z1gthZO5yIeg;l`^8?S~}uinJ{-5G}CbsG@S4%T`taO|sOc}v$TBws0bXMY_^x)b=h zcbO&h3YoE{a8}|qkY_Tu*GH_LPpjs8Py88`@%1P?&UCzOg8x}5(Mq^Ject6A(AHL0 ziDZ?QBbv%J>G!?*;?FqxevhK#70J(sGpel{8wRCuAo3`cuEcIk=6rdf*9EEP=czH; zbFwTy(O{9!A^$f2T{|c2K}_?ua4(N`AvRqmj|pB_V}*lPP## zi&-n}`&sVC!`j<6Mz9ONm2hz%g=gt``fbXz>iNUF_vW2k(lyBW5IrE-qJNkAi`$RK z(KhBtklhL#dXxp5OW*;M0ZC|c`a?7 z?HO=5WT* zXJr}@jV~2)g)p7=;m216!*zGoj8MWp=rpYRd+Iabuw>lgy^a52u1D8q4V56&-U=`I zc?U~I8{m^EkkQ@B^|lR?6RZM&g)`DH8U*Zu1aMjo0bD*0W3QREyc5by-as}Yid71( z2ay{DF9aihscLbbvBs&Va2viQ;HJe*CMwPv4J&OcAVUAWZKGWvJzEAwN3uan8zyB_ z=|t<26DJJ;#RMqaDoOV)FbJ-yKRhvGnK6iR;ZJaXvsAx}iKoYlWhYofQNiEKb#eGG zQwXSvl)@Oq;3JR~vVZhIbsR%Ms{Il=Ful>pg@n3xWJ$U9^g&Ath=f?2h;tP~KQbn%sZC1Fu zxof=})<#QcY7{6`1dVg-88;P=5tT+CwHqc z!-<98@w)BjvHPsLtq@+kdBEE+#{Q)Z*Gn3^XdC>z6Aw9f$njnLeaw^E-~75U|J*F{ z;4J?w_-(vGEH9->*?ey4nFz9S7APxTiR@h%o9kN`+kLlg{bYusn1(h+_emZHlGkTJ zBk42t0I=&#np{S%UOA8=oQ{K-PP@~kEfG@qnf=NkqNsW`6pQWJ)?3!Q)7;*D{{c<2 z#!6P=sFZTZj4XM$1hDbA7ZqN#!icy<1{A3Zg~lQ)JcE8?i4l{yF2Y(VizLJWR2#{= zlZqD4%z4zX5Pds!S(KRc{jQ`)$l*;^$RD@Dj|9;KiD#}(;+3o@B$#Ivu*VcB@W^MajAjzWxU2p< zrDSvHi4G}1b%09p0yEx!K^fIqBop1Mx-OuFk`vX(MffiX*NYb2+IM!P4aTLC;GHV$ zpR~wzI7?iVmNuR&<-Ck2?oS}!hc`Tc4Xjt$f4dEE_3l1ixpp6a^rd_F^k=_|@4R*c z^x+F$S=AJjc>_=+e~^tK28skVQL#3I{cC^Y#%Q>>4$K z$sAx>wT`$E4UKlqqbjN3;mix61e;O7FGQP@@hy53od0+|m&TmHC+fnbCdi24Wn(ER zuax1mtanSV{@Xshm!>r6W3|_C(IVql+m~`fg4ep{k&p4@_`sxf?;5+kGUq&TsNXP_ zus2RdG7?W3$q*)Tx4qVABgj!j?3|}srYQWj$|>4?(e_xm1Bd0{kDmt6Xr_& zb{L8GOv+m3pNV#&ex3ZJ5-@X3KOiJSRd^i*`OghMca3l`8rg zX#Jd~l#qy@n;&gJ`WZc8plg|Pv}Q>#ME^}odO+D;IFvD5L`N&x+b*H#q*mV4GI^3V zv^LXkl^juu(yY$plu?{g77AZ;D`R% zu{Y-G3{Z{6nAZcmarFi^x1Pca7cO9ytVRjHoWy!Ae{XBIPunF})Y{GQRpJ5C15UMZ zo`oXuG^GoF^*KZ7Igb^7`FXb2#5e-BI44BE;(m2TP4v>j*ro6yi*}|S*HRLebt_Xl zJS~C``!LNKeQq0r9IuA|-YF&KHFDaRS|S%|GcBcc?6c1PZ;b)wfV}ohy0bK_Fa>Zl z2lfu<_||uK@VlS>4*uZt-^8`syQr%RSh?^XV6cLDHOA50n9m&#Vo2A3g$-@q2@Yog zTNtH?DQ2ULQ2@+P%?~g;x{twZ8_z#I!r%C-zkt8_YXEaVjK3ekvll6d^RyXYd1Au& zr5LDX&D?yAyV?)~?CjOJ`qnKRPfbd|6+_raA>!J!$^-T~c=%PPC4n6%( z@e_aSx28Q)kmPSuSfig>%HgtWx*umUH`#uvlxT$HA;LU@%+ZG*NY9xmMp-QLthcq% zrKDdJPZnjK2p7h4)Rizf|9#TJZA6O2gsyV)Mp=+vY4QBMI?wb9m!q3LHmBTIWnR+5 z&vz+A{FKi7yY6y$B-i?}#gq3+49HNy3hkHsa2mcpypUt1b&>OsR(~}|I_21oCKX`Z zcm)=$80a{w~mX0YQ$+$wL>4;F+t6wu&mBq22!9_fn>(JvCDip8H*RlXYiAF@1>0{u4BF;C#7z_MOY_u(asDoS zUSa^+#?;2Nmy`yjHYIT`y=%h}4_h(NSGe!H&eG~e=Q@gUWzoJNZdUnhU3JNygy1n; zP4SFJ7)a=gIt(;I#Kh=g{M+X&fWE*C^IRW=!bYP9r883cyEN}~4>cOorF7`49O{d6 z-!3KCNlKT(uZ;oK_M~fXW!;mklN3@t%?GE+Be(qF(1^moy*=QwpTCDsefF#P`YYFQ zZ)=Xj;|VZ+0i*FbU@*b7HUjq;wR7XA(>*)+EYsBh=RsgSOy?L6Ym5em z*xq;pBkbUpfBr}DxBtdR@v$Fy3g?!MmjY1L<|-P+4a*pPUN3fka1pir)i=I#j|w}x zCY#MoOwAR7(TJ`;WP(LJ1L;T`H~{C->6rs%FFY?65Tn=`U&os6oUj|s%l;8~C+GAK zGw@9FInZ3Z;>s>~w+n(l_B)OS&Wkos=93G#K^PJ|lKb7jnioj9nhMtL+Tw!B!V=HC z$l0-Vg>2(_BD*mzfThoZCGy65&$blc8#Uj2!0(Ci##q-)uw{fh;Jzgx8+hKrI?;td z>m+YcJ#Sf0q)EP#WA@ai<>a6h(OS@;BG|A?L$Z?{kC~sL>1hf_0ZY85DNd7O9mRo{ zXQRpBFH<_hob7?#6B(RbD?W&yZBFyp;J@P-V*HBc$&8IydlufM@GmxXwtR z%O9oUuUG*1uEY}>Ys^m%v`pw&ciFLspH?f7%}a8wGJQ5lBQGadyz4W zl1(Ii`c?`>-up`G`GkO?Z;jbq6!~XESU`c$r?BFN;7g3nF&MJHfj|n(5UKFWL`D$A z_A$g~Od?GBAz;>yk*q8M4N-n}M(WAOS)qO5p*nZSrom`5!JwJo*4<6qz5l>EOPPPe zhs@BYYuL4~nxL*(7qmXOPDz{0e;3bKfyuXuxVOm?eGWGZF|%>_o>UgLjW9M zo3nd30o2^{$J_}1=F4O3?`+^`|2E$D?kDgU|NO`C%fIk0{Md)DU=6_GY>uWLSb7^> zHINp5PnV+$a74QjmTvpO9^Slq6HPP1WV|d4G$9jKfNQ_vfk&Z5cDH$h@LevUt#})A z;j8?${5$qgSd`20^Kc3sE$wPzTvqwlHjtM*B=e459$>*xd~ZEcoy)W_CioE*_!9~9 zr{(j4l7ZsViF;uA-+F-eP{2YKaZyU)}d49G2uVZ$FLth~_0kpC$=h z*UIOp45B&=uN08{Z6y^7+Q7Bq(5B{Bc-fY{c;bDs{W)=yJZam{ zLt$W!PZw8-{4-V-S(8cj>4?+(g+Vz@QbC!Kb{v1{goc8)I_sz@?x0J5Wmh|dF@vTMWvQasiIEnN+h1mkBLbb zO7vlI1Y(?LT+Xh|*rkoFkeT4%*E$y_?#SJJPti-yRE^N5u=4Q z9vXw8^#ZuNc@uZ;9pTVxbHlEmB{S^D(NnvB_R1e!2<{q_*7qW7@;H@jTs@YRd46*} ztpwle|9A}zQS{skCIHnq>zKBntgDsAxH7j}vYjvlb9 zJzw;kem|E*@l7hgl&qL18%vO3hE`}MSN}VEz>Pawc=hT7{NW#8#pl2DIW`fzQ!qnaKH%b5+8^!I2lXxUTiA*cak37FX*Hi7=%2==(RO3005ANe= zcLVFoGko-;PvNir<)6f_{_^|r+y#?apvJ+x!o+wh*bE{une#o%H7m(0LipL-ImFG| zTd3>v7%eRoa2huxd0g3Rkic0Xp!3SIe(ZWL`2cRCvqC{&H9iQ z7F<1jmpj^{cyGu!6>Kz($Yac1X^t%I>4Z;D(|esqxx6gAmd>US)H4>WSp-kC8-pT6 zt2JwfHDUvUY$EE#9>Ut2-WS3!N`pmV+A0gB{8o|{lra|GYIQ2%tt^e#S~f7>$U^v8 z@_o+mC#PVZS=R+&EDEOXyqyy$21sGz)=$ifGI-S(8LcjBB?DlFK?oyr-o6(|oGYfA zXji~Ldfwyov}G(v^Y76}-G3zzX~J^~-5Pey z*I-d%A1`Mdz$H}#q*g+yEa0(vK{8eC*$BKb(?$Y4=avl5Kks^S8YtgVP7JqSWd|iL%hW-;U z0HsGFubZR@OGb2NJuwULWQmP?HW-*Z&r5i)U*pcbIku01i(?KrDkmWO!onpz_kAqq zC5wH2e#(MQ7wlw;oPq_lWF6P>*~2e=l`OJuX$~RRa7=tdJ(Fg%#$+_W-3K%L>wo_x zTzzXBFTVVKeE5gojTfJ*u)b!P`Z30%3S(#0lY+nRSNxYOjmFc>xFZ+vmxP(ZJ8e#F zdm)9hMb@)ay1WtkwBKbx)?hS!Ryq^fTDJAs1~+ZxQNsUOmPK(#y5?=~`R~ra%c(#h z>8<<3z`t>}Ijn)*qbY9Qt?|V_*~F**^VjgF-*^+-`!y!Zm#}vE1E>efsH+hUW)!S% zVDFSWG3Gf)nQYFlkrHau(<4;a$NcynE}uKXCw}HV z_6p4aide#wNy>uLujMm!G-2a4rJGXM!{t$J^^ zW)`qGoedMtB#;DFla^va`vpOV=j1$vshWdR;T_6rMuuLx9wx7V)<%d-Jr%`%YP7d6 z?kuf_Ca6lDm-)TLi=;_$kMvv!tSv+LYs%LojH|!9I>2jUBrMqu(?Rp6;Z1{AM+n%> z*MyZ0Bc)VyF-E{}xC-IKeRJi{DsotHn71tzcWt{xLcUYLNy9)D%S>&wB#gCd_i~=G zOAd4lw8Oug@q`v7$g%l(A@mqBd$6ZO7=Xcc#(Wa4H~4*W?TtKAvtCwYi?_Yo`#|na zxXdkX&Y29Ik_@V}h*@r5?nks^0Za&n8pGt>CZzC^FvKBxcFs%$Mos20Z%25NI0od_ zCcx`RAQdRiro`h(88X>_=vOjnf%v72TNq=$PwCyOlPNTEhGRaT)9>zHP+DJONYj2# zgT&8*p==Wp)4ohe1=Es{p|vfa$vrL!vRz}6ghnFEwmC-qIL3#c^E=D@*~wNI4o&9e zCCr);ZfzXn?gnt-Io4DPA&v>VXmb%kq7PHurxb~TvQM7*aCgeOf-!1)rp+-G0JL-Z zI0!;*j8rr};`ZtH)UxB0VDqZRelx&#UYp@x{<}ZKt5>&h`N`L@wm!jg&#vRW?|up& z{?PmJ;SatWFFs#kZHb^{W{Fu1ljfJ{2wxR2Y69yvEYs*n4ZDN65+3EE!IXA3dB3#W z_9rcEZD=u2i?)yHw{3K$@AK08F2?+Eg87rsfIjP_;rE!oL2DnH5kU4MzwzHz zpmcsF#?gT8_uoGNzW66w_{``31YiB;b=L?^x8&$FI0FdG<;Q|9*{QuD6R`ww3%m<^of?23>`C z%_R7khL1#)d2dkBEVx1m5q@u{SBtEL$N53RR6S``e$@$q+Bf<5cn;w#wT&r*Hzxzg zAox6kl$Ze9HhlxSqQg*uFRAJ6y|C!!K3lwN}s#LIT8Xut6 zy-kBhvg>=ef*L6yDmN$BW-43ch1%)^!?BFj#!Jw;5WG{Yf|w;@18g`4e1@IGUQ{yh zdf5M&tCR+>SeqWrabz<%`h2DI!i9M73t|e<5~u6&2s}UJ?hLxREy%=cH)&I)9O#Aj z2x$qz=qJYuCox>EdDIq#wRJhdqBa>(5Kec&JN$DkZJC06Rbe{3J1z4P06s-*`gqb= zmd5KF;X}=84<#*-7u5XTy92NFtqCjM^(fR)8xV711w?5LQ-*1gauy6_iTRG-mGbVI zIssXhk()ac5nhjlj^cO{kQXYsWIXO%@q&v6Jk0r#`sAhDshtO(G&-YnkJ7pdTICN2V;eyu_D@Z-5x^yuvje+S)nZR zAp-@4RH$4pqRwJH7J;cgMH3RWwJ+g;RH*NZBUOPh8Al(%v{xSrUOP#9kGk;QO5wW; zcXZJ)S;wzGRY>+Oz+g$~5ZBN9oLb@9xcU$A%~z-R($`+a*S~cG-+gTd*KTd&{(~vz zSi*Su5|&pl0M*0>!JFIbT_o_+dEqcJ%!tP{pNAUX7v~S1fFgMsn<&tX&A9!~u)F;h zj`r{1AVUVP+3&*HiBB(BenO=?2&3Noq)&-M%EF`a!7s=^vk^!S*k zG5BNSK5*;qA!f}4!)ok27|7$n3O@b|$uY6;z>KbYDrhTxq=n0&=|Yud-S8CkMGE55RJf@K%1$tx9WgFv2DDOh#nST8m~8VA@GcVnxFD?7`~y z*pZwLVSjN&h!~sS_T;>^$U_lHRCxTPx=h@hw^b?EYnaD22G8tM&X5z2Ifl%5u+~#R zWT*)Iq`*Vbh)Z%nrX_K>ASfC9xl!7X&v?!Jn4=g8P8fFvDJqLAcr0I=YSe_ct1Q$l z?R$1fmKQBjIxxSR@JO5~#33<)>ww3shpzRG63w`Hc3v4muJX}*41Xk$RX|zRg5?&> z(lWkxuSNQlS_mn(w^?bE-x-K#PQ3B_KF&#=t+QknSc5d+sN*Igrsn$FcjHqgN~@FJ z?=pX~*7#8|EAm9Q%uT~GrREYO!Lw{SroKq=y1axSYq4}wZ-GS^)W@Od$|kL}YxP2d zeL7X}tNXC67uJeufzqOeJ<^ZQMz|D20Aky-IK)JdCKtx>(mCAT*uk|Mw^04~d&LQ_ z7Mr6SRnL8Y*cQaIY`4t{`;IP>NlA*q+e?E1Zrt9+=f3<3n(?!^`1A#=pML@?vl`Rc z5q1vtaQpQgeC<0|u{<8)iOXwv@wpp#`K2fD?su)@T`!FB^yO7txp)CjURlTG^`SA= z5d+|q0%Wx_Jvv%v1cpS>8OP~}DOY?t9MZHPU%*3)@{|jflLUxtQ`U4T2p*O|zG$$e z$Elo^Vt>*0Q%9Ob$7T#c2KL{)_W+;$!dv*mFKyrpU%ifNH}2a!_bY3cv3BVK8sqBU z3@{}}8~e{2ikSDJ5efd)Q3Doe60b`yTw5{UoJ@Du-vx6U4b9JEOb>Rkf3%5nD>MA$ zhu?!={`vRfFa64o(Z>)U`d84XW{c|_ng6E{x`-I3K#2T`Ig{h-nty~qN?zpDU*0mXBc$WjYG(H z{k}>6OxOha(*R?n?FiKp`Sqce7TL11>tcn3{wV3iqc#XsMIb!U23`Md=|@rKICjr_ zE7)xe0qiKK2OE+(uza7%=1L410Yn;u+6eQlR`1&$x@1q&iTb-~EfJwLD^=8{hl~%RWTG&ooO5PrF zeYCyGHJG{J*JqEpA9npQ!j#redT`Ud3-GS@>2X6CD!&PB`UA+ZI>^=E#F1WFJ&$`^ zTe$w#UCi;`h$+#mm2IWXN}tZD1Rs5@@LGNOH@Dqq%;^|Q-*B$p#|6G+=`#iikEWC~ z_p;d3e*muC*u*!!brrMf9LB>7*gG7esV1nZC9JNW$J+Wc*2Z7YkFk6F0Dtl6kge3aHTeXg~^b^3U-w9)v!&r|qsQ$jorFyB_R zeeLqRkaL#!Lw>835}uN6rv0~h9T;Vp@w)lLFT8>O`~Tx#;@;jWMyoI2{1fj5hAWuY zBOJ{u)N``@5d%xV2gDtC1m-W8g2Z@>+=ESOtVj&-o`-bTnS{D2n&Sh^=Q|kHd$@dY zhF|*lpTpn!>pzP>_d`Q#;XgQPD9GQ)3EGY?k=FHSU6Kqt!TKMwI2n$2W4(3ft_=V< z9Iv1nj$H~}va+T8Z7g_5x~S}>CNxHS)$ckY|KucOZo2NxoA3QXY_mDSQ(A(`RjWdaa89XX13mCS1~x!|jjT-G61lKW zISCWjG`I`?eV%*CTCcy^R4Gzo9!q`Zg|B!d zu0Dk}bL1o4Kg&qV8%Q{njq`%Yx{Q6FJdDd@8KuJE>MnMN)P~CrVr5=@H_ncgb%G{v zpRCD2iAr#5-24q3@x6an&7?u4)P`nE=HBEAc6aXJ&fPuiA2e89p=$%u%jh%=aQZxj zi!LQYiUZPT={KnWrV^zN#ZO7FUsNG-+OkMLr&UJy@2$rctfxp_Rk*ngeEZc0xVyQF z@wulk9IayB46XHXP*eC?I`c!!3~m_?F0s zKEm_QUc?99`vQLWgYUry-**MiKL?y&0Zdd1dp)ITFmu`mQVej4!9eq<5RPNVID7Az z512b+G_Q;_JAZ6Nlle58Qc#hAcz#Lj^gErhq z?;MHqW+};9KE7^KOK9p5YV%JJ6N3Agme?x*-YbR#0lJ$W z^H3Zk#qf4cP3>I6=PqDZZLR*}feBJ}h@H*r7&klkv5&q7f9tRP41W4!&*0LzA(mWE zqY=gVpm{q_gxKRX+Y4Ub__~IM?_*dqqq})~6SwbfV>DjJyc%08zs>V)=26GWLMgm+ zAVf1hY0V2&(!EW4FBb_@KJcFiz-zDGRb~gB@+C>1%!+0kV}dDua;2pW9?h-3@SGq; zvcH^jo?tET>zuZa;*Rm!yLGn$r3>b*q?!vnBBxMG86twcw8Zn^Ys2vtgzxnd#;Ggo zxoy9tn&7PbbWVg$t2Qlx- z^MYVrSpLP{GrU{g&))K(molg~!6C)Ii1#PICX%gLfoDqbEi3wpWe`rAlndn3`1o1%nny3Uq#pQUWR#!XghJKu>-fFm$ZdN;WjbIV?nY9Hk3c)xr#G9snW$ zPCrIitLyu#PS11)O|>4Z!fU-8qV-xTd)T~0XZ!F>porv23KxN3lWpMh6O;}dy;5p< zW5Kd*ex>!6f46B^B>^ijz(u0bS#oBr#9-%RqVLPrbNgR^aI^QG>}SAl53og?P7$W< zJ>~tBDNfw(dE&r?GmJT&IsZ4nQT*H~W!#_f_aS;OEklR};QKSdnFdQZI&QFW?+|x4 zD_nfu1|?Bb;qY2(inBh70MFPcfh0@kt*u>cOzF>(;-IAb>w{w+w%~t~eo9J?uDPj- z4+krT4u9jjxAE0)zGdBPhofaQhS7GCiiz-S&w@o^1DkeiFkHsKdgGc}Q#8#C)7deO zjt;SVxR1L#$GCoX8{ags1OE6;Jo&^Dp1xAy`KMR$(hE=G-7h?gcRhCnPd!m#ooS1U zAuz`rGeetgj8X$btYCI|p3Tv6=+(lnOR*IAKoP}T;#3B91DCAyH(Gl>2QAwm8IICA zYq(1aVrlVAL|YNKU$&e6E}y0FA1StlHCBwA>U++%eNZP+jP*H(rS&VlE4^=HN;Tz4 zt1?HOjbltj+@eUysea?`hq9Hds&M>M&9A;C~s1d`4o~sW+h|;Pv z))0*fL8SREJ(nPOGru^;U{GUJ)fiTD%no<3wQ~of>IfhHzzg{0pZ!Jr+{Z52yZ#qe zfLUFmo{##4el0^!CI$a?6q@PE1gN@C7Y(F@_(%NOrWiU2>x1GMC z=i;2EQl>6-_9_}}Nyp89mw28M?8$GrUWvz2+jakGt101`O@frhk2i&WdUXH`zb!$I zQ=y!N+k8#(El8CJ{rSXlp)m(n`M&G7P#^vtZeQFN_|upcu$Oo6Zlh!4lt@xBktnM8 z>NRP^g>1lQic>+m_3$!-9eN1Fo(t>T-wD@7h2?(VHX^n`M6Z-K@-rCPkniPBxrStw z55Wuh3cGzRSalUPSzF7T*Nl@3QzTx;HW?2s>iZiQs7O zbSYY#>~xwAjz(yzA+~l7@z%`;c=4HY zI5#xH94lhamQbF?a?P6kACwcVwENk;*34%ZVdQJycmv;l^%_>sUqUk&JIyuSHLUD@ zNQ0RZA*?0B)Ec82Ofa6TVR^|22nHIDaeTawo&6o$d*eR-?A3jYhcjGQ8{@gBFW_Cz zy@eN_e;Us{vx=vm9O3fiRa`v3ZvS04Kf=lgSa#WC$wuk4>CP%*a-Q??VTRShzN3Ic zbqz!)rwqLM+`sLV*427v$>jDarCvhPF!?Z~U!)ZXLhRc`5gujH6ed~89_er*74^yr*u+(Kl@}KwPV(aKoYASwuVVo-HK> z>xo;|=Bn}C+IRA2B792p;Qq9%trP*Y=577pu@>s)?&$Pirv&uMF`+!@glj&J%|qkw zd?^ejZ>wpo-!`LcOfG0>B-;u_ianLuQIZFy(7##lf#p$*XOi_53FEd|0fc75{&Sm3 zvI!GjzS9&2D;I$o9eyU~=QUt*Xl}MruJnMIAxO5Q2(1!pmYgtR-TZ~-g)E_AOd24R zfTJ(KXxjR`4>yyZ3ILt(G-{jb_@(<@7PZ~z2}ua!cK!E?W=}?9Bhr^Gzb&Uwa#ywbD46_xv5kW?$wxlFVi6!A0I$iXEeg?Q>KXp87QX0@Y>DS zf6dxdBL>mB7<8z9vL#AH!d2<>LL(N?W})%gG`| zJCiBAq~kadk$MP4vtXX4NTncMsWQLELPUNp>9w)AoA_Gaer*$X@9pB;Q!ikDX3Xnk zbvM^bh>>8$n}MgfYtOm3!U!)0Pyn1sN zue|XVn&x$k#|sh??;uSpm3~=dEg|+1&CLUIvatkg zG+n_!dWiR4Fs3)g%}z<+EGvmVRbU7Hm(#I`KDL(jeN|zxKzsCYYDMCb_%~_Yu~!Y) z?Nf|F>ocS{E6g~t*5)HQeQ6WQ7d2U%e}Ia4(5?5XOyBo9eiIsA&K9 z4Rg2s-UC#l6?@f&=zCz}rQ9WRV@FpyC1YJN9sOnv; zU=QanP4STrK83&ZU;Ye!;b))2+?5!l`hnBv&OV9+_>f1raKc`*4Xk` z-b?c*UxPJ)53k>0AZoQ>pBNddH&xuQL zS10Rv=*oK^@HWLWptC0NVBy$DXDyOz)ol$clMn$KMKg zB*lB+EW@y5NF<=0y{{`jnJOlF!ol%l`V7Ms@ws*FRN4kTyLKR_WRpw3j`{&@yH| zg9cI9z7-tFZP1v4R^McA4ax_0^~zn6X#F^r1G&x1eKYNbwGC%SDvp@242C1ZIQCr9 zTX)mbTJ?;zc4>JHyL)%>tyivM|LA2@%cKBcqLvfzxL+Q--#2Bg+s;g%vncCof^vz- zXr=9&w^I?&rj+PXQnb%Gr5Sp#P(y=Ec8Jli!od{y(x2SNtJn51ua?nZf`L&S83Jjp zj=227lGz9@YCIMLr=)No=ElLGJsXae*)wF^1J*EJxdbd5``*<4+npWb+gA_poj1OX z3SYz0WR7#|HJ-S%g6E&Tf)}5E7VmlSIlSwIXYkBZLtH!$ERWqNTy%7Qx6hpmI~p4S zorp9$))|$UorSn|P@-GWx)&^;@!IA}*EV=7Da+dgQ+3yw_w}?rFolxglXpPnn6k5X zrlNdYcpiPv^vaXAuXHvD;taIDb?Y8BHuf-@oI?#0 z+-^WArr1)eu;tOcb2%;Um;NA_sAt5G!la-wG{PhtJjQJQKBfm-xOA?VABJ5oBDXU*BRcY-o>`7r+#y*fjak>X>B`8c{4^#KB z^;->oi*YNG`i+7+OLAh`hUdcvC*b9*px#7rz35Ca3!Pl!O2+K}RN^hBmea zrAc-bS)1p8O`JW?)JF{#ChCH9#L++67sD=tzgK2^asLl@M&yJnE)3PY#hGn}^iOI* zQv{!C4du@ip>;F3rg%Zu5~Yyulo~jzdq4Vt^g^bjZ_ZPn$&sxkLZ$lq{$iXN(qu@a z52E{+er|yV(|8hrje~lmnpy5cJBX)RA?<)9Yo_%l!9nUhO6})@T!|2;@D+ZSaWW+I zS;55!&D@V&){xGFgKyFRNwA46Fg!*I+~}1+J}40}5!O4wD0PMfg-H_J(~n&uBnNvG zl1*~{KbYg{&3kyTKgIm~N>CDbkCAk2LDSqvK~_>8X$ZUY zciL84DSfLkC6B6T^C*>);MuiST3->4VlNb>u4TAf%GSeajZc5}Yq)mn04wL7wyww~ zfQ=1m|XXSsj|>sz?I5bDt*tqK}HHV zAG7^0d7_12wDg9VQGYkx_DwUQh3&;P{`M+EP!S6 z>ZzE~#+z9x?fMeuYWBgv<#FBM_T2}#zk7t`b62c|n`jfAo3=if##53!7CZy}qn>J1 z!v@1)g|Ru#vjgn!-okW$1J7Pr$H#x}L-@I$dI2AP|C4y}xpTN|jO#WAhY?U{q!wzN zr7T)I*9i+leq2$?Jw={Om1vqbhM;w`rpBAsujBsq1B|Q!z?TdEPS;=;XYUd5N8fc$`Eg zwJYYYss`@}Lib^fWdP)K#tbk%xVYGph<1AD~q#?zMH14_zGzrnZ2&icXD-;%P zgf(>mmZF)PB;b zi8LCW8mYX&wii0mq4d*%F;)dw8_dV0))V)@QUNOuU=kQ;_mWN0uI~^~FkhE)>9;27 zoLg!t!d~CPfl4~-Mc7m_5v4wpNEgmb;f{E=QU0ohWZcAQ=Us>yVLzO}Fn9r3j@QAa z5s>`8#;HVN<%uN8K{J^aAG{}CsQ^2}z(_F$Ggg(!XbJoE0C%_cac>Jaem3|iwPZJb zEJ`1y{Rf3XQCuu6A*Vrwqq@S?w+`{OKYJ59dkxNCzJkN!fsxRO(Y8h(2a8V1h_4oL z!(Oru&pp^WxF!P<-Q_oyH7l5scS?l`hLbTyOXsm-iRKJ7W|+;VI5;}Q&ej2rZXaSk zyKhn9>e2+~)|PPP;tH-@TEmsg=kd&w>v-xiaOKhf7cZ{ZYX#@enV14=xUe?D`ZBOI zAP)cqx;%4k$YFfs0+V4gkBL-k(P{6I7hd+JRi!|mRlCPQvhrLvF#I7kS{!}LV;tuP zkz2gl#w+_Qs{`Iyg>g!1agFM*fuRHcw8br9+EZKC`Nm$m+1aabZ}SNIhsRjGG(kNd ziX8TmF-?n0325taD1H+_%AHTMyOk0A8w{%{X2<(@u)T$0vybPVT*D82?7jHdpL+%$ z|A`OaN8fkOTBW9_aX2GSHk%I6$k;N&ft!VH$ZsEB!;dy$+NQ7f)~u-+slkOq-6FWFW<>D0o+asa9Vri0LcAHUo0;@aKq@Crb=~6 z&APTo5z%uveB_;1MjOS_Ms9-!TXf-!c$PMXU<~mdDzcSpAnae>tEaFFXdpvx~~ZGF51QacfAko@B)I%1@|jq0{*qeUHMS2VyYxld^C;)6sT3W*@gbbz!B&;>KXn-GdsruOCrSxX7?b4BybpuzW;j^_swL}EdHvQLyB`G3 z8D#;xurz05*)HvA8!lMHgQTs`MJ;;|qoiZ*!=$8jN}d5)U+KAv^iYXXs&cNili>i@ zc4qj@=ibEK`*RFN>p-<^g$cSBnXI?4_M{sBpo!1-imdFU2n|e4P$bY*GG@44c2%P| z9ZXPFOBk=5!_snt^VT2PSn+45>mwW=AL6as`*`Epru7~eR7Y4IHCS66;nKx*JpJTF zJp1euc>cMk@a$7h;OQ%?xO}0)xwQdSR|Z&~4DA{WO*+G|No!WwRD{+!!7Vj=*hmpM zqOwBx=*!1Q+!O6geSVrORQiG?=)Il9D`8cYjm(Q7tc|-=T=4^G?+CNZr`o3b^jRidF=wUGIWVd zFhY^zafuxlU2P#+NFuYb{+p=&*1w=W#{6&}b-jymb%ZC^kMYuT=kSXk{}KG9U;ZH8 z|C}3NUE{bhus^`aIQ%FAVo(s}d(M0*dCa-sT5_NA6$*Gj=I9pd&9H84h`W2hjoUle zKW;EyU$R~k+$i&#WtvgImqJM9c}hOJ1b4v-pYuP_-WM&cH2(-SGd}Do1;uNdpNB45 zsau7+GiK!qpU@sdWxD2UO%F-18Lk~XCqis`MmEDk9T(t{ScNx{hhrV?J%l^lO| z(-49q-#|!*DsjA!(TE*S<%D?7bcUGcO*}f7#}V!!47cgpLrK|fTXuYrl>bJC>9PEc zS3H4wE2#=|V@^jW{o>HYqVEr*sux3%7?9;7bgx zerOqa#K@BBi?O?U<_bX2E6ID(>33l*Z54tik)RCc3{#vcwUX1Q2@neaWNC}~r0oup{%#8=FS$q;K`EPhRc zF@V>v-^K6!=Rd{4bcD&udCbgR|AEm{OF~Fo7%N>R!xIF07E-7O^Uer16qL*{`tG_G zHQS(>yX@JvD;81%5r*R>3LJFdZKi-Zq1ovlklX$TL;s27AI`cv(U##A?x;0UNVEuq`gg95q;-hxE~xS z(Bk3&4yFyRzO{+%2m2TdCKN=IuWtzE~X?vsXq~9tAFi?-z3)BuB)!BF(@fg=J39Nt1SCw0sZq zWMWMm-)RDrHHutGZq3fiWw}wG=7)LA^I)PIEZ5(+8TW=;Kj=&_9I7& zqyj^M9jzF;$iuN~XmVt-ktZ5CwZ&IXa=3{^G!Ab;*~N^^4Ib%5NkbPsqditaB&!- zhTJ+ze8KP;gDs7jz31)O2xq!fd<+2A=f{E1bb*QmP8xjfmXt4yxM$K^%Oa7e9zCAN zrnMwBl0lZ$52o6CBy{G;BiE+If2V{g%p*SRvP}-$)>|mHLYQ7dwjNo5l`9$xmE_}G zMM+Q3HN=**mqo~Im6N-Lj+2k z=?b{JU*W6Y*u{5VyNPD$C7Z(UcfID!B{XW09%&^t;=fXWC=)d+(T-{qyY2lk%-9P^oRvTiV)O);NOv41$n z;9!o8of^YCN0^Kbu{_?u%JK-y%R{V823T8du(k}Wt^g}5L+eR!{@e;KuCL<4xpTO9 z@jT9-TeJVx*T-02t!&+iQxcS%$T@`}#U5raAx9@_p~RHApM~7%{v`dUV17vfKn*dz z3+X&rNlnT>6LZ1FT}WX>6%*pp2bVt%rH??r=(AGkga0xi$SB2XN>6Db?7w;K7IycK zFkV`5@nLu%;(Hd7JZj|q2BX0Y&1@I@4>nLwckuL;b^OF9Oe(*p@uByf z$9tZ?f@ju^%8y#JGKf`rM+?xpCb1zPe;@wtv5taakA!WDYDihQdkoyTd5oQ1LpP1E zZ~jSMJ$S<;D<9F=K1yQESe1R1JnKszwEEh(+6*deq@bXueE-{pl$IV@J=lDSiK$-_ zTsU@%<#U{;1qBU_-A@T`$MOZkCaop?%^_m_-X`nQ*MJlaU$Fh9y_I{&!4uQIr3OgC zpXZhwU6XC~89OUa(s_FewTJUCCV4G2^1yNHOyZodSS7skqI`50?-6OodeVg4Na+76 z^nnw@z#=6m$X&JvcLl(ER*7rBJZmqv3E^HVQU>E=V)+uQprmB4EeZe{ofT0znxnI( z^MN*nQWeNgQbAZ7SO*TSdOQruO7(*X5xXk(Ubi7f=ty{j-1!#G$5bhHG_mvHs14Q$@u!2sv2wS`&~N5Cn))OAcE zV)qrEe^Ac0wBy-?c8ELdE5izZ^y(J=@C(;5!@9MkH`Ulf0RLTH6bw>Rv`8%DoqYv!_1B`Fv$jn zLoB;K?7zkY8$8CmK1Mw|#)G3H?Cc+7I@`Bb2!_=RLlcy6P-8G`urwK9d1->xl_jjN znt!WUUtPwzbE{ZiU&q?&80+T-SY58LvOL7<$_UGo5ylhqbAsiiF_xAl7*EDnnv86F zlQHbS@rb5qR-8Qy6Zc(W<_-WQrY3yWSkCxotuyM~-;X%c+V zM==m0@KYUL=is>;wZW5g*Go!zCj9 z2lvX5Vuk92K}On_u$=L`HsqCzA$Pxs0W=dp81cx)szs1wE_iYu@i^L!T^fu*b0LWz zNEs~Cn#siyuKD~kOoN3icQCRZbJsCBk~Dg~p99~AOXuhmK8c54$uoB22vS3r2B6d!s8!?8Ds7s!QWJ4C)_FOmqRptzs0KxKX!BJOe$WSm0;@Ab=pfAJN3?n2odd>sPh>PG5f=rwW+{d zq~S=w;N3{Xmax9Qf^(}YSYKPl z+S)Q!j3QxWh?Qkvc>=611Ct3U1ty~k!%>CNhy*n2MPag@xfF&hATj@8Js3G4x?3_U zCzu$HZaocCzqUNV%F-BP$CwNyTkSS4(4oc8!=o-I9Z#F}u2rB@$du32RQSZVCytEd z;SP@GxOw{?4v(f7jYpW%2suU6w9te7v;6Dtqr~yif>8dfcr9DDgK8e@TCd zksuDj=oC%wESGIy9bsKIyOQgxd=*boig91R4TB0ay2ln&EX(qu52zA0ljBr6%!K` zp|)5D+upIOz8t|xH21+pNg^>iSUx|paHEQ}Zo&V!IR8DKll-amr{%QjK(0CG);r-Js%{}cd;Gl42KvN()BFdc93wyIdjduXW^M3<`DXr2XtqJ z33IMZJcBXjgNaS8^w!M-Y#jjSSBPj>S3|b$u);#a0ZPEfbg#5C+U70LdIGfY7DHGfpOVxY`c?jjnT+t=csI) z0^=<(9*;2|4KN-Ju{0T5`ZubE7>wvDlBb8s*|#xFEZwg$o|vfe#~9)eAA0$D{Nm4j z81H@I5@sgSyAAr8@sn>`Dd7n&eb0FcM=9Rut57S_JB2A^?-wn4yM{9jEFS~7|DeXL z+xKxiZLqSw>>!mIC-`IBD(>Hl^qN+&W#F(r!0h+|e(cAe$N%mB^7DA{(h!3IvGW7I zpX|Bh)XLhR5+g5n*`qXcDO?vP-p)SYI$mN7|Pgwb4gACVvWiH;cNQRPU!mn}ciQ;88 zyU0dZpnVFC;qH1P8wG1)aN+B`fqsEbw;UHIj;z65-U96V$(su=zWequTGYQ;10>B@ucIaki|1kLb?SaxLI45p1{4UMp!_G8z_At8^b6=EYb&VHU&7&4b^D0jQMuIwhA z@4C}X$oc#p#wj(=uLsVH*NcbY=(B;_QE zz_V)Ww53bvD4jQYCmF?XmBm84pGLqL_P#I%IBshE_Gi9~Z@;>M$?_%4=0^EEa0&ot zLGVE+U7zj`E5vx5X$T!FAV_IuQ|OroE@%-mLZ*EKbDsKHC8|+k#pl=Jse!pGO|Z_) zZkRmZqL=IA;ubKY@2&~)9XuvsL=OWlp`~+ydtBf_3WP~>x53$+62uVj!H9CJ(>bPf zGO5}mLxi$v>XO6n6>ujmDXislo$08s^$Uy^54xN>nBKm5L@@X`|_>+V0Zu>o9mS9x?IrM}*mSNf*!{CbFc(*Am) z#1$dHUF1xXEJ@Db6CX=dv9?}m8=Hr?aq}MP`6?z$lPFG&Z^QQQETk4)xby6I=ZKX0 z1`*D?A8)5$#8bFVW?IY|R_1S_*P(p+qReXOIXP)2hfIVDMgmN$DMHA4#KL zgzJNHA(IayUOyj`rR}ai77h5k*-S<(d%5}}4?UM zoey_ZWA|#gJ`~oOH@-9!nH)uSq3vhfzWA9opAh`6waAq%XIHwksQFm1Wf>AMGqP`Y54Ja!6c8zaOihUg-9hq1a`#WF2RIvMuvh&=k3 zqe=38C!JbliP!@c6e??B8DTVD#*Nz>xc1ftUVhPAd>!^affU~20*4bKHS2y?|u$1zw|7o^&Cqa4ASbpETbt#5EIT|9oEO2k3g)g ze3a5=p`gsKJQl2j4vwt?u>y8yz@58OY;NzP9-Rk z@`7Y)6X7c^ISfcVq8U!)+-09}o2R623{srr0=8O#(+l}=syNwz=Vci- z+&i1qOI+vj%jC#vtngNXos|Gu$Y6fO;v1Oi_Bqaub*Hp_#`bvAFRR39Q~Q} z8tXtH+K!VXyw=iEjWAwX#?3ohxO(F@s_J>$FI!op*0RkiSF+NT@l3oH@w({DqQ>ZJ z?YvV;3YTpPi_$u(u$eGD9&cGe5*QDMxV}^4cRzIvH*U{?;kvyKUo~U8_wNIPIi`w# zC85)@T_NI-IPxn`I`XbAG#8!L95=L{eZnaJ*_E!8z=@8Bsf+`@Eb0`iT$ z07vN=r2?GbGjKarjbP86J$v;Gv!iW1b>-c7&$};K&kn0X@K!0FTl=`uYjJ^J32@%F zvL#%Uepte7w6{*EvR<_nwzeDGy1j?P<2i;VVx~D`wGgZ%Z|c*NrQChEI@tvosbF04 z63OcXwz@q)E3$3hd)8ES5M3>q;_{D5t4=Z0-j$Gh~_h#8|Ak zB@N`b#A}(z$s;!n5Ul&LmX<|Z^{NGdBAcrw1mp<1RtSr1i@&og6pfF&^1#D=xjdK- z)kH{|?@EU`3Z~oLhf4v%yLZ`Kw}w5AHF7NMh669$N?O5-(o2y$Xkd=JOYR~S!&udM zM@m&-6|MuMeW%5X9TJ(js@`(WF1%q&QyeN9!es2qm>aALwp#=lH^5$Lq*6;l>_70aZS-yhfW8P-ET4F^Iz5_1> zcApEF-Q-P87gc|LWCQ38h9h@Bp4#zDj!WN1Ve^73yS0G(vq9dOZ#x>S7|$5GV&Sr!QpJ zLwkKEXj$B>e&F(dI@jc*u~Xr zhj{AZvRf|~DZ%W4;0NBW(@|2WYJaEaTvG%@!bnFzun33IFJ4%R718Ydk=)Zx#+NA< zh^esfYfi}a?jEjQzk|9N+l(wGFe}Ap5-#fw9wK^d&yDkfG1o|%DaL~to_l(N7oL^E zLP$Twfj4C=fmETb1^IUVK=DI)*7$v7DGLIU=cyDSqO=e8EE*-)V1V0qc5waXZAU5d zbj<|wbe;wkdE?pZw1Q`qb4``WqF4HFfsdhY)n(uw;&aK42nFvzzd&-mB7r8*Y#)Hw z{NX(VI7^t@I~IIIuxLMA4&rM&;9z#K3y>FZJnEFfEY-1hsEt<^2`2uGc;%?@O0o(Z z7hKTbB0o2qp4IG^iBZA0&e1E!=U8lJ@2$9W%Od!)>Dp${@O#O8lH;=?1n(%9=d0v0 zXt0;_3n4C(xvmwMF2etg7TPqo5hv-bx8(ls+Ouzr*<=?xs-!?l*Mw!%`26X8lz0;_Th)P%w#yOmT=MS1IY?_Tx%P1o zSaBuK1NS0iT?cuQEX`T?GCqU(AvaX&)4;dcG=qoeJXj;Y@Vprr;oJltvOzJz>Ifnc zBLW|cODu4Xkb(u&Pb8`5;LQVEwo!~o{5`0+eKrr7L#W~J5J_E!jI!XMR#&Zoecow( zBrU5mn>6c)9IsaQq{96ouyp3|_>f8rW4f?XI-A;adCr-L1&szSD&to)R$JELP!nI!D#hCbtT(?$Go&)nkjH&}nM&@q&6uUcH zI6j_YI9bKg@*2j=D;Q0dF@SO3HA*uV=+>PpwuF1dr)A)Yc?y4JtbTXz*Y#XLF9X_zJ3tSL56U=wGjPc|mZr$C*)wk~AC;r@vKJ~C&7sXKZs7r}H zb=5C@-&e7?_;dST^Qw5KGvrY1ePw!Dwj(gVESs%@Hv{ zELnDfmI#t8$0^50S8W!ZZ~DY>DDFxaliUwU8|9iX&rHu8pQiBs5kDv7G@do%eIM^j;i=@A>jPU9YmPnG z@^P2twtNk``qPU2rshWZ8PB@oJ24OSy#xQ~j3}~1I`$y^Gdy$$a+S~Qy1E!{>^;H? z2T~AlfWXGbV;S+bhTAI;+8#~?6I{#r@Z_V27c)HK7tYckl?t4jP(cMWeGVk1G5GS( zNZ}w5g)X>=iHDp(7eKM+0guhASv^9|fhl1UymluIs^SE+RFmg}ag^KaEGqR)gnC90 z+V>3Hg*F0nY5sB=OKGv_SXNp>pK#8>Tzhoe(;xwwQkQ2yfK|UY-s(|S7^RQ({Tqc2tL|DIP!C~ z%n%1o3~S*97T*@-OE-Z4?`}+S>rR6!>lMb%!l{)-_WY#q@%>Wz3OiIe|2AVNSm5XS zo~baF?F!@J0Dt`TH}U(Q`4$G_i@@9bfF_a63k%-we5!n=&&(mE!SRg5PqWcf6iaE!Iz zc|@_r!`_h>0<;vK8BuYTj)4E%`DAY&R?;~F9l(*?=so3S&$~$Bl`@DTppy&ADr==X z$U%8M11xAWop%k#28*+&2#pCDB+s(ISppGIxS-GjXBRSSHyn&GSz5=&)*f!$x`S%) zVt^SX(@6?)k4kk`QXFF&SNQ~^Zzw_T+NPf5w1hg-MrVKlw~49yi6*_w;B;h205@muzibRL^UxDf($fp7AHWV9Cajx5sw zC{6;G>dM&dWBliMU3bQbccgXTJ|mN;753O7pYWn?sOrA?!LYz@nFWjgI7}I#!C*A8 z=+j!MgW%OxBCXD&RF;J9$bS=tu*N zwD=aGpo6#f(sHD@?r+S{&S_8{xASK0vV-tg?c`zP+4o-ySu55EcpjTTPJ*GA`8?&8 zvQGhJ%1^yiTU@^6g(8;n>5CpKfjS*Kp`NXganCc+|Lys7!QeQB9y@^q;3yD0p130X z2Wyb~p4;*oCr&-q50IFV$hDecs8+)y-^X=>f*`C?VDJj7%`2&m$OXa)Tfy~W_sZ-$ zw{CGXUj=EfR?hQS`dUTSrbPXczRyO}C<~D?I4NM+hcOnUy%DKAs%}KcTCR6 zWuwK{kyjUE(}!u7^%k}KeJ_;~QCHWi$C;9l5ExzJA5DPqw{~av&wum^{_MLqvHrvl z;ka4Byf%`fb5&$`;SW_j;@YofsBnP#cmqHD-k0$A|IP>S)MeoQE^zgYeY|<~EnK~R z8*kpYi`yG}xWCij!QKG-M>8BwcX0S%2X!?@RgEz)Kg}KAp%Hc`WI?f4TG;;Ktb#7u zG80!C*MK5XGeaxy#d_IGde`wAGgnTJW-E!6i(4Jqs#vCu&UR+=D7F9mhD3Gr*9&x9bZJOraK?B^~nquqz9-7HH42EOR51M_po;6l- zOS0W0O6z($wF-b|p16d|m(G*on5jde{B51HR;Tc}X6+~18P?C%k;l#RiFEErIo1{# zA2_Ow0$>;SwstXGdy1^eHu#!b1Ht2ZK`YL&D@A(yUy9rzaR9%|*C&;e#=_#hA{2hRFDS3B=d#%x5^AE%jdC7v3vl z3&N`sEkBxang8x%VBvZ}CJgh4`t*a2Akw{KZ;r4Bu>rT(yE+~?M978&4_MlFk*OW!@PU9g_TJ#JdA=l3;z;qpc-Ur3Z4|(UQL{*jQ<(Yt zX1TECtvv-GNf}D|ma-1eyIR$HsR%(Mq7|i?Vd$2?)i#E3@Y;k(t?1qbv9(oVg1oXn z2qIXVujv3wbKP>iM`P{FSWr4HXRGlDu)U2oZM!Boc|xe(k(1iI#68to{^fyi?y!Q` zl(t3-@WE}fBB)eKn)mR?!M(eCODQY|o$HpnvK9JQ_8}MkLy3t_thJ`d+)0}v;Esnm z*5aBrT-q+F%<%i{BZtfNNzO>phrmX_Al%a?;>Spd?%#zdyc93MgcutwoyXRL8NT)1 z>-dGAT*GjAgt?EToUEOiN-}4{&q7JSb-!1Y0$u07>s#rPXW@ra?g?d{aRna_E9}i1 z{QKW}4PW}|2AauvOfkV6M(_wRPW+fe@F^SM#=*}3LwgoYbbI6aKbvmi-Opdd$A0u8 zp1(}Wq)W>UF8|Ofe&hr1$ELX9D+dg!d~E?bVvNzK&XUQ=;_`iKjpGvQ$-Q4*$7ji(gmZmMIX zB`!6E&kKD*DLiG21kVr)=9d(9E?r`R3sWnigaZw~c|I$l^Nhp8`Q{W@EJ&KaIM&Ay zw||=(z6{~`^vFpWZjg(U8KKqJ^SCH0yL`F zg6miSVouJbY{&LKaA)Hf`$to(u1xI7np@n>Ib8kM9*5hxdcKcdl$);^9fzjmWQ37+I$WV~h4b{kB_?{YaJC;{3_ z=uiIL1TS}VL4u{(zED!8%0n_<7vKo@7rR&(bC|SeWqy zTQc+F{5zV_R?Pm*sv5@_;`Qqle*5>ohBt5SW9{<0Fm1*jCcHP5P#{vAOJ*E{U~K*w zWBu{*0j7JK_{1;&B!2FvK4^OzH{_N-GQ+Yd{3@JZs&M5T@Z!@$eB}L4;la;dz|PLQ zv9WQ4H?HsD^*3(d&9`ph#;r}&tN_v!paHi9ZxbnqwGF_= z@5kMZW8A&FWtA^R(M1X_zW**%Q_jdjt#f<_n^(gHmYQ3yopa|_u)4DB4Z^7br;k9P zjkWmd#0pt^5`*yXW<)^^oky(UfoH(&yTHB8+TsFx4aN%jHoT}8KCLp2ulMAGjCd2` zA((&EVMx;Wh~;!`&>s#52*a0sD}r$H>?B8O{;~mf*&*?DfA(%RLR ziUSSSr2>~_2dWe1TH>oxp2shf;57wnoq(3cCx_=u7t;2F?4Y$oSB31g2bqX2zNqF?{ z6Ym3gm560_!mI9EzB1?KMhZY`gJe3Rn!R#q4Sa?ZFd2S$enew!7630~2qA=8WNA?d zlKiSoyz@Vnx;0)rM1SO~NfJ5QGYUTC~n zyQAi2&F?6syHuW9IlpO1D=)QpeVH9uzo_-|%bJ|R1q%n+ky^Z#5sJ>~XKcB0`^5)1 zQuHWu_d!`4OeNLQFVeGQkF{qIT4(9@E?rA;NVC4eS)?x7`XB_;de+r3>3eS(D!!Vd z2+c+TFrKVpcW(>VZfxNGHZXfCxU5>wBu2^>!41!tDLhSir-=KDl?>-EI8BDLqgjpB z(Gaig9N=I5yRYGuH#ULs1ytj6s9og$phM`O6!vh|_C9)5A7Rk!;mU;}e%zz3dN z!E{!eyKNS>>lwMJ8Yb6d#4~4VbzI@x`T)zE&HGb~#%uQ6vk>i-mSRQt zE_&Q|=!dmrybu|;9rq{3;T~&OPWu#1_$Bdx`9XJu%dSm+ z7v6EXfvbqJ(@7>N{4R|}oc51pWR@-D8DQuvaAsj7k&Hrp20p43jG(wOookjqr|%@% zE%DzPubsln!(w@=PCAp%F@o9XS(~gED>)Vc&XQL_|58O*Ef@xQYz|JNw8YWqd-Wm5 ztG-XqzJ=*9_DLcB?NJ^)p2e>OTNng$oRL7)+ToNpmi9E*J#O&%FW$s|`0dZ(V0sCw z=bpgPu@R6(iXv}4j`1sbv#@pC{5{8L)ZlREE>;E)@QI)K2!81O>sT_10g+ylWKRkv zYZ55gmW?vNxGlRhvxXU8om6<=yVmf5cdenpi#P(XvkSa+8@PIH6IZX@#G6-dcbI^>xm6yNJ@YeRK`=lM9&|NFfz(2>rF#030Bw|RhStC zg~+8Il<$5O7ZQF`%TwmrmYf}LvC6(@T3J%KcjE=7(ZtUMrpk0_0xupM9^l&5w{Ud) z1gh~^d{dWsiJoh4l5!fHa?;Y(RZiE_24sS~c7~fRv37M`#)X@A@8I^vmQ`f=t6`Gk z^y_J{yy=ccUrzIsi#bYd&%sZ_m<5Ry< zsq3G|brZX_;97YH0ao}KIlE<=p4V}IbAZkGJn+Ige#@kDw~9H#Gjj$bx;n}6H#~P` za9jXRx<5dzy4H-zL`2{sd_jW_iZT%dkT*gKs!TAX1|lAY_`Bc2#;!!-4rH$lNrm}z zQRUq!auG{iTBuJs7yZz)CMz6XIfp^#y(9Wgrt}jr1_UCJea8LEImdm*9uMV|G^Inu zF29-*K=Z7S^ODb1m%uEaY1+O%*0`VUdQ>$3x3K1%aD$T;2hmEl3NgHPA!)JanIPfT z&0N*t7;h1b2A63JMi`8iaCE$nH?G~r*7kWkdud?rk2CHeoTo5bErsiI`YVItR7aW? zVqWeq2shs=B|WzVotS%1`^<)9`ktcS8_aJ>$Y6-ieq$5=`aisidk@B_me$cU6AKe; zk(BK+v7#;+hMkq!@}|c9c#7%4J-qM?@K^uhPvNC!moSB~L=K(Y@2pH#5z%1i-0aw0 zn)6Vb@fn8SDh3=WGgk*LtpexY4Seujmr*yDF`s`Jdk4V%?FP4QJ;3W%Z{W>q*YMV@ zySQ`j0XDbyuyIA zB8oeZ7WqwJBI4`>=^nG&tj7_KQ*n=D2FUp%+KV|dZ?S8ST={8y=0*Z}O_2+ay((?4 zW=vLbc(iX*0UjJrfinQnxnD=vPKhKMb^Uw1R zTKK3#@}`gBo(p?0P+gfxYwp;dSP4S&G(l2>dBkL0@d(BriJ;oxxdfsh&yVZRWsTyF zWX^S`lL>DVHYx0jn-gD$F2ZHb%VrAJgvXAAf3_qO`SL~|hEJbHFgn9IFB0*f96BOnIdz86^4Q*84;3v0wZUp9FlZV#G zALR-dTB1hx2V|O(XqmJ@i~j85A(dflKnSyZ9f z1vk;(;-0d7E&<4>f5fxeT_S*{) zh?HO&rYXb)h=QJxgRm7GO-i=uyu!C$xrVzx^)z0%bP>n4kvK9$ysq(jXk(VJ(Z+k0 zVEiQK<(*R6_Eajo*aF4-D}_ToZ$|TMh^)D?VT6qR;~Lw01N^5?zk<(x;aeE3J&VEU z0%o;=2f9y7@E4Rj{+_XS0}p#WG_L=c;b{LJ&aVO={qS@6;SWx*Ucp-9jR$^Oj5>{O zw-X2$q9{`%ak@SZWJ^cG3D80ay|e;6d#S>EpF59_{_raHk6yshbc((G8Sd@Ov9Sf* zzI}`vH}B!*o%`6hw~PDRJJ{Jh!2ZDz=FJcoE&&6h6j;Z2`65OmlL3Lxt8{AR^%rA` z6wmoSW%yJ9^stW--;#$8;W5F)Ii*VuBPpXC1dRC1g*?xcLX0>L;{kAZ2wc5!4?BBP z;F9Ffd!__97&FOjoP7rX^hw9-BW`6{bLi|{sFdk z53zE76|;d!Z|88aJr6u~Nsj`$wZh?`#`N$2<7$p)p1g?j>&9*#3xErfVAZWTRlM*x z)1M)ro=z7dg@NdkDFZ2qDdx-+z=Qn;H*ara|6qpmmsf0t1gj_sl96NSNr_MQa0eEI zDU%|P#rzDGcgm8(F*5>Bt-+4IHga#pJRBd%v9s8yV0k_vaN6snoxEHeODR?a3aLh+ zA2LgcojH4|xVh__tw4&ryD!#Lf{7($Nylx!vwC`rS%4$?Ot}9k)5-b@V<_KE&$^3*<&v<^ zZE6aG6uG7rXH6Lp6W+dKY*QelLce@xiE<(+cL})?c)5P~hS!S6rQO?lbR|V@nr5$` z@X6m4Ysg;3GeH>K`Y;0QHv!kK2!Io;?Fr#?U9(2s=NZ+kLY~NlcpCB8!&tqw&pqR~ z1>Ng#y7z$)$M=J*wbcu84pDibE1$(|-e54CSV8Iat2eQ+wFBTHrFNo-KCIsHjBV=( zH6>AR%agv&`7^zo_9XT1>EV@35V2c0Pt{x=_H6(-_wsmFqZ%7K{Q&>&xBm>E`p!i`$OYl7r!z=<|k!_e_xp+T&no=B}?WzF(OPu)Z|H0P9wTVT!pnuxEsZ9boJJ zGuXWU06P!%vAuJEt^0@AH0joM=Gb~L#m3eVwsvRO+}+2~%rG`fqzIAwE`q$#Kpf8J zISJ*6uaa@Ef=TlV57~}J*#iA77EYhWS{rW2GB9QLVdLFp#ycD@VSm5E-TMc)w*#l( z!(&+%ReqMf%}c)tchfO~8W{|d`c8w-k|JzaH5OJkcYuw}28YKL)`m-{Omur@4uln% zVNyn>r<7EtPL28W5KDsw&pvY*D@#j)j`3(1?&Rn+oEq2fGPs2GX%9Xu>&bqYDn~uC zP%r=vYqLHzHn$Hjodd(+66Q09AA+8Yymwq0W4FkDT13}n>f3ZIl%*qPB=da>a}l0~ z;(CpI?`Q4zPq_L^p56SjdW*pO*jlbl$@)uyk$BO-E1CDCFe-{HPH7^7@g@7g!jt$S z`x);Z3tH*<5Mz)GhT!4Z@DZ(P7E37=wB>VFNX7hhC!ZLJK{+f)dgGNCLMCaw7V6M( zs{BwcdOG?ng5PB|*ke?kes4^)0P^sZEcAq~fp<@>Bum zu%S6N0BZO}-=z=;lmBv8VC0_DtLPj5Q}iF7b;&Uh90&Z%YJ>py(vV`tGLk@{XO26bio7C=_0zP=NxjR!0j?KBcq_l2R3fQ&!E@%H0G@n zk?8Va`zONPT2p|;jrV0tT2ilwe)DnY_0L-Qun4c_Q&=*>723JBapj067T_fkPru{Z z_NS8eAYw}V@LJZ`Yd-kwwl6}e*jj9!JxYQQ$*$t3;yp0=nzoVh=f;9-?gQ6j+%oQ| zn}=37$lQayvXFl7!z709`WEdB_dD0`w36<|B8JX>6`oUW2D1DcN6>kL(V)V? zyuqJ*<34`lKYk9^Z|>pZ6Ys;!ME!T11knx_&;wow7CN>d(-n{*r~R96V|}H<$A0wP z`1p@M3v+|KuFU&bNR~gM3uu8F2izX{28y6|d|kx3v>Qu#J#DPj-X1Y)2_=i`@&H&n z54?DOg2B7405JbZz}-25^$^(Dn&R56UHs{{AK;Up`8Ia$?qKc0Qx^6`_kp(9$X!JcC6AOpo_5ItM)e{8Lz2o_H+JpK};0ZNB+z`teHXv(no4<0(Sg zO>%uVUOx@?4;oy*v4aPD$2NVXxzk`H0Qh@o{51>yB!Ll%Yiv~7m@h{^VOxs`bpqB;Av#de%9@j=kU%9K#TiWrDy-hl@DCAiX*0jjo@ zk(Y?D8>vcsszP30n!{)~Mm<=@=KVw5xP6SBDX{9dM?r+yIbRIlJ^SQ~ohkY3WG$7f!BEmaLH^-89U-S3@yr4jb+ zad$4s_HK2J@qp6;l8dTQh;T9XvGYs7(v!eT&y4ZnyD#C+{UHX;0QLOHwlgyyp2H9+}%`*kBmF=5QEVQ4yOmW{?;z;?_9$9 zi=0k(;VBj8DCc?7vbaErR=T0Jvj|hG^b~upiQvhx2Z`}ysWBW3F`L2)x7#~Y42CN< zJ)@~>?qv^51`UC`c$3@lDm>ut8d9sX`UU(AA%O*W0MW42uW4B!2J-Z}6 zQd)|%r?sBL^DHb{*fp;6PI);TV0Zr*uf1^{hlg{FhAS@JCyDD;$g(7s1pvC@#-3^3 z8PE~6oL>xZ&ep~FeR4(<{*~v@q{4~|CTiD93Ih%{T&+T zV`S15NzI)_gEmr^IdF5UrDt6NF$!Fl5QlXIGf|w~S@Bwn!p7;qA(1=hcZ9L7QD=L6*swm{BOdlMFwvk}C{rNl7Hg^o9=9U!&ub>)=H)ZprLDg`?c0{74L zwS2?vhcrb(rSGKH%OG>}zo7!~S^ZNL*+x~KzaYZ?jyf~_*)Rgq@WQQ&C{CV!0wH(V z>UiBbc7`LCk|DH#KMb%tVh|Jr35?U=i3#CgAx=YS38)Al;)&aU1BE5Q3z@kmN*ysY zI{d#_OZYt6n#}~q(+RGj{fcHJ;h>x+ry3uLMqti0} z@i*Fiv$yAd^203YI_8Q(8MupyB%fPDD{2a!Rg;DM*u;igYVgX!L7N-b>iDw=o z4=NTqn71%Shb7eW3EsTAfzA6*;N2I^9qVw<@?n*e2;1FfMDK?Mrn;tkw?toaycH>u zH6FyMUtFK?hbY5dTS#oF4@XLGv_?UfL% z_1bZ8DvOj9ys|_(I~GFy7}F9h|*)p4;ySPYPE_odPpCdTUjWt|xBFx4}7*GAiOQ?k#s zVB9V?k@?=>P>K@~8)t)@D`C+5GdMSvS8Q|=cYSdX9=I$j?cj7K~bDb!k#y<4nU^BRpn8&&bJp40-< zx1?*BhKG_`;nMe|w%Upm68nC$a6KNjy&jhz*uHC9(*7;3JP3kv_%zq-#z=)?8j~`^ zR|wxSF=eGz=R88R{)`Eicenbii)gED%D!!dv6A&9zGd*$89QaWqThq3w% zFl$U?@dop1j@`o{KKbd_@NfU)7cj*dM$4B_S4%b$J_Rh6FdWkmyIqctV@sp?HyJlL zJlMn#yZFVQ{ZahXkH3huiO6{yc*GA3cEg~3V|JgE#dYPBC+mpej*GA_-8)(7 z%f*qEDuIK8qZzJUyM?{O8OD<}N*867%=-LTp~E=93!AfJj0eD#OA|cv)BqF1J{kp} zvk8g&qoUo@?XOCA7KH^F1k}@V#&RUmoA@1XUcZUD8enO8IpGZ=U0qljD{t~y35pHI zFN89s6+IGv+vhE+M0i5FWGmp#f&vQ?VbDQPmwbFYBo>eY{Y^*7ic}uU!{CThxaKkV z_zN;Vh1(~me~ap??TRId_BT;*qYG2Dw_*pnisw!iz1pZhkJ=P3P7 zqRe>Mij=-3ij;M*~jV^wpSxmP$6~ zmc1%ABNbKrJ8N@8^wfYSD-1>xjF->ht=n6;`qmBa%G5^4v!Or4Go6>N&3z{pCLFr* zgh6L+V)EA&j*Vq#RN<%|;&(p1fq(a#e~Pzm?_u@aGZ>E6F>~p|?JY=4D-@#XV1t7R z63S~Zs?5iGm>=K6vsWhg>%aDsc-PbCY|zNDwG5o?`V&oZOnbp19jvb!{YeyHR`{*4 zJRagZZ|>l?fA`NYuhubHK1bKfjAhZyRWhYo(FD{KzeaOO8J)iSZoS`HaKF8d#u|?} z>xZx5*3s^%QF7P=PK=`o1XvAMY^;yX`+JJJ;^SFPLaVH|NWr@`pXu<(k378hMAxbQh~p)e zl=uNR(m(R=ic^)BOTR&p5u?N>=Hpqk1YxdM7btb zoV>7GjQ!o_x(`=4IE7CnpeB)7wJ~UYh`%~!5yOO@-B)^T_97Ovgg#NiAWkI40!Q+<=fCvU$Z>m()J`yiaN z6@t^`Ie2yF!CdMvvFnU*Z-VgcA6EFv*Jt=g|Lk}1jql#Y#VhZ}tX=?QK%2itZSEL5 z92SUcY_*_kAbf|FdN+G*(*BJGGaNj)i6_njpZNIu@zEbz$GI^u&$dz#JMI$H#FCQEG32GyJ*Wv6Yx7-seQGkew%SH7-Dm5&BK4F?u){jwtPw zb!&9~5se8FIYKiS+OLy3fZ47ayU2L~8p zpvv$(fEx$LQ{i>-YsAV8$CC%)-_U;%;5Uk6#A`bs+Tn@3n*!qwM-NoAno2;i^dP&5 zt{6%l#>+90H73UiIzK7bAhj;XqiHXS@YwZ*g9GnP>ZM5ElK&~&^lAIlZX~Z5=EJOS z%x|X~7OtFxMh1oT%QGf;ej=&w_rYbika9}NNSk|O@Za4E!3d{up-8`p&P~dNAsA}p z6&T^Hjy;x3Dm#)2HdoKYY9Rxju@7*BBCpboppHBUiD3JyR>}I9_E=`&GBU;oc2O7( zDvU-$AJ`}WU7*M;Ao1Mny<%n#7ZA?-zVG*4o`W|AocP|e6hwRrJs5z~SgA|QM{enj z(~HPCX(b}C*}FW4Wod5dc(k!lhf?@SNUB;g!b5 zlSu?{`=7)wua7+L=Nf)$aFYvbx$xi1QsT$j|JuX%W?VVTWB4Ohruy7Ta z3MSB2qi&c=$9Wp!WzxBgC(GF0JjC@|J2ray>J#*xiC{f4;Y*dZX=CpDuFE2Y+I%!H zdKRT?4OGP>QSm5To(=ft_&FQ&Z$8C%d5o|B*&hC%|J}dEpS^k?OKZ;p!*iI=O`Foo zOAjLH&yzof=Gh#WPca-E;CTNwKK!FE<8S@-kKx>k$s|Bg|0yyzTiAknbb(b#Eb8T& z5t_)(Ny3O&V1~^WP>pC*zxxNT;nRQkD(1~P1~9JwLmLl4Hf!(bc^W3qczzv;-Ct$o zXHq(l7a!AdR@}2t5~?bDAq1GND@XLLz1`@UP#dhvO^6sw2Q>roaxi}yhNUse)M|u- zqd9Ke+Q;23;F(K--4OVR0)y8N5Yy&}wrkx{?3oKyPm`)FI<#o8>(}R{W)+w= z-k~~I-`AroEC>w;*tlncB<^E6A7fM*1(v&WE{sW%{-@)&EDoO?8$dc1e!7Gi(uRii zd_5MhBZCs%jSq%ygPo;d9rq#IlJBGlLid#&&m-exImJOBdAdic50k(@4LoMDBxgTx zFc-xY$YX(6#Y-_hNLiql0&RGoeBFZdgW*(97959E=O{irKx_O5^_fXwPDepIra`Wl=euEme#6!+;(K zd+8o~TVKq+O3ghVPWQuGrt)Z?8cOu-F!B`pDc$mYJM@8=W6;cN1VR(~yI?pkA)0xQQC~Kd2b)ruJ7R323@Hz%kEB=h8(OS z@*JGKQmOxWIoUovkjf}MwB2OB#j?9B`hJvI`I_G4;aA9=pb8~y|UhcITh(y%uvoyI4KZ03BXc&UA|NJ=XU*p?Wu0F#6+CGD`3oV0EgU3TJH;79W> zfomE3+ScR!W2FKiAgkVUZs^>z{W~3*pvN%`5xwPq{;9kXAnp@0ZuT`3azL?862U7` z9+JX{(hqt#Vh;qPz)bG&%Q=(P(*-Hb?p!ArU0j36&MnK)T{yrkgiKq^A4^tD8iW{k zx5Kf>wjh)WlAlurPr2yHbxjp-rPFqwsCLoTqp|R!Nn33@)r7SJ%UzFK(Y63JNRs)IAj*hjRYb z7U#|x%P?k+9Hf{J8RKV*hIWPwx6bzN3 zi7Jmx28UW)DDG1tgl8Bfk8^S%{-kX$EEFzO1cOnyhZ+LEi5?2Lvg^Rd@2j2&tzG!X z!f!=Tw4@iuf~lkHoTEtL(Y6X2u{g2SDyN@4i|AW6mu7Tu?#-bySyxj$Ifm9+m6)u!G#(Zc|F~EPAI^BweQ|fW-F}+;_XeGgCIh^3 zV;jHzFTaT2`^-16y#72^)}O?@8DVa%72zJer8CYt=7nbNElAQ!HQHmYzi2Y%-d?%+?p zaR-O<399j$Rg8GnI%UwAPI+cou2q6*yg=b#T_`kFWn&lCv$6?uAAOKQ3Mc#{P9YYJ z!@z}wjR8jECEUHciJLcXNovxmvS}UBV-i>9tct4WH+y9N#XYx1Uh-j*+b1Vn&CN=>!MX^E{C zg*Kw>NQ73)&63v4=yyopXU(TsGauAzO^+x`Q1nhBNP$KqNT3LyK%js!uj-k6>Akz= zm{}1!cEpYy5$BwnFJD!O6F}C>y!V_iJ0i9>fMuZForq62gc%9&!IMgu(4|ChP<`4( z$+fU|QW_XHUy75~xHDDL+!wmEvDKW3Cf?qw*kD3@?O3c<1gblmaiVJIiR6^7{}0%RVFwNjn`yP{g0< zhe;z&SlHw`(CWYFl3U%nV#rMWPVQpz{gn5IGa{Mz<48SQerIBH=-Ti-V(LS8EW0NC zkFpZrT85(~I5^&e@4ov4#-&;KT@ZJxvGwHIJECHHE_i1T|*Rs*bkjfyUx0gX4BlT!@1xz~-#M-tr4 z8adw?RVpM`w_h_cXQ->sKgvXcBZQp%Z zH`Dcx>dv;0+YA*VJEYH1`=d$#9-W-PqoOreKv!^ zAcI>s7vc7G%+EsaqqRDIr{>wC4+Hl0ZWu3E_4~&50jzHvLT|VNSw1jfIwql|0V}krGsgL( zMuAs%6&Gd#J-&F?v&hpKu!3YdBRm&6NpMCBrc;)9N{omR(!0mjN*aI8&Cy3=oaYI7 zmULJ_thuv+GeYkum;5niMDwi8$v)fe73T3lT{G>qvnuoR>6R#Y^weiuX~22KG|$Ru zKBsLuk4*!Q$)CGaqfX6)a_u(n=ge?p$6?LaLQVf3lsGrI(HPHdg)o*|#J;aRvq+)k zWRBR`bn|lj3Edg(y^v)ZXJ`+9x|7OylT$hnZK2Ig=0;^>Q!%_1ly#vG4y7RQT@K_S zU_zovs9=Gj*Q^u@b)X#~X2%CMvls`6K^{DhT@df!9LN%a*?4`WgfGO#6c;g}%KOtB zn_m>VWc+YQq1ra<2Ic7i>^uJN&qf&I$kxGKDhy(uVO@E*_E-`>cTODBoMNq)NA}5eMB#0|+%p*D>n0A>~eW*l9 zTCz7;dsSJv68ggtoSs$iaBUZk&q}DSkO*dwW6X|0%n}j(=Tw@A4Hy-CIHtU4uOCX| zN5vLV^Sp#&b_{uW0H6NU3jD8s=QHr>7nfmNmb#v;KY5O$_=5ae!U^_? z?UXz3oWXE+Dt4aPnus>5FqIOm|M@V32U}zK)h|APx8B`_Nqrqg{Z%-h(bSMQqYy&0 z(IocMUppqkUtW;YtW&Va!QZWN3L#I)AaCBTxfir*X&Z*k+$S}Fe->S?X z+6*|o@WU9?@2VuAdaFNNgoBe!*w{USiO#u>HcsL?;yXt0ar=>KoXPZXRRV_m@3y`_ z{6;ocW1FE*Es7@S)K&Wze*5gau;X96{B?i|DJ{s}BxxdC-=K`Tpa zPAnrNIOD#_ZGj77XN@54Xt9v3?27HVv!AhCD9m+Sh0G{6qErUDOfmF5Jx-|-s63@xAZ00ye4tI6=nHMp78&M<(} z+Q`+6mGtVuzVeCk-+c{L1o>DYBz=)RD~)$>%4mO*iSj>-&%LQhjcS)eif>@KAP0}w zB}n%XFoBVI`HZVWSWQe&?C-AQGd$neVtc^8^)=ERZ9-8*#Bg9z+ipBwJmTC@;poN? zl#%~s;$qtxSDLhG9m8khK#zVZiAL1>BU}fM^OM~;tuV!PF~vq?>GDo1#$hm6gjtcp z=FT~6?`B#+zzpO5S^0P|>GQQvY4*`KhZh(llA{nYDNy)d-=DyL_=Pv&=YQ#sVDD%E z%d0Qwq+(Uwhl=7ojmLoPG&&ZQ$)eC2Ra<-t$9s?9wHH_5AN}3G2!HC6S9Ioab;2~e z{T$)N1&`FZLI&0_YK$pD2VE7wpx{*LM0am|a|eFr7k>|mdI?6$H=rm{@nvD6%kDZx z-Bu4V7DvQIdS(`0aV4w!(}{sJU-zE-;S8@?E13pN?g0Z3^ApoP_`iFMo3*Nhj2huc zbw>KV5uA-n*w`7v!6`sN!*tlDp^N#1Vjol&J1(nw1 zvC2$1rhj8o7U#VSAM2lmu1t`XF`W^Gl!t=HmS@>2_fm!q##iul;QvSv5_7g9OY_Z< zxRHMMWf6hLl6W}`3s+rH_&pKe|81}gd;4=2ZK{;X>v=G6I1$$f3(#AFtU z;0d5og#pe~sKMiXq7NQA1DP>u2kVCF=Dw%hbks-G+ zgLw^ufl>e{Co!fmWC_u5Ld=rL1>E2O#)LG-Z19DKjU%%z2R3$CVuF2#t~&PLr72BN z%%#Vo5h*y?GOQtM^WIFrjE=me)=tV?DVwAPFF*`AC_ zzh*SfF2;|(VNB>83|tdo@$Z}at+vyR1T1o`5Bo^Ml=d_^CtU$VoUb4*pK}6f@G0e@ z{$WA}YB&2(X9GAmuHgN(b2u6!GP9akc%H4hqUldwqkS_~UrZKeRrYnX(1Wd`0)F;C zeh2>D&%FUV2Nf)?-haI)}&9_AFzlYAIhB&$6EUw0C_W*#0W;Rh?cW6xO4j&+`Ms3 zKVcL9&AoamkM|KOam^W5_jhx%fZhFbZ6Q;Ze~Yu2vWyxNCBi;!QWL~`;h5;@X7qpZ z0MS>T4QPjP*dh4Dfl|wQve65Xd#w^2@)$; z&d^zGdBy(k>@;UmOyT!(y!7&pU#)G{P1yU|POk>Q?h;=vOXUGVQhRo5Yi8+`t ze&gqg^~i!n`M(ishLO_Vao`-^a1RPgqLP56-?yaIRb_MjA* zhud1f_{{az{BL&ZJ)%VWC_EX`kjtGpcr=a8#Xv@nC&DE12&GY!jEfq6;aA>--~IACaOL`IP-i13m7lTB z0YaJ8dFpL9ADz^TrM_|&FCQ;BA%k-x=<2J%Mfcy!jO{ZDd_SzXV)qKM1XTpWY0;So znQAqLjzeZJvGkf*xAcEi!nizx5_(Y7BiKKx;mOkpe9wyuur$O<3Rr1Lusz%;5#1#> zc5E-(EKtwp2_S`m%el{?h)=W@LpKBA&l-%)T8xtDU>{&(2VguKz#to7t`%d$X9`)A(s1y+^A6wp~^6k`)9(D)F$cWoB7yq zDQQ^YmS>i`EXA{=la`tTAVXU>@ubA6L_!=sUz|gOo%$4<6sM*gVN| zh0}dpcZ!FPe-`tslAa{N=t)@1@%%pNciB=U${qc~eRTYd&lgyZ+Kv%Xa@a~1@i}3r zhxfP}Mer{%UeI~rDLl%nR51EwX)gYd&Cwd@bUr`C6@$Jquwh65-VOb?b5~X|0t=&o z{S72sX$8IV-K+l#2-9w5F`B%?(x=XloQI5 z4A6(cU>PbH!FvxjVE^D)CkYd|NdK#9UHAUOYD6sMT}Flq*@?4R3H=OU?|cS7`BQ%c zKlxL?3y(IYuzdA3sPZK!>j6|opr9B|k3qyhwM6_R#uN|wB}^u}P>y%thko#N_+NhP zlklmRa>z?mo~nE`DlskMtB(j+MzdaeZqsOuQfF3qK;(lAj?WADjo*3*zx(C)Vehzt z{^%yu`3OqIu$xdijC99XZ5IQHOg(uBIGW?)*Zp`&suRp{guj=u@98@lgeMwAb)gc> z9j+m~qUninq~&KP#;74Pmw+L**0upQp|`5J{%v;!xubDlVgw&ss8=ogD0?mcn+hbs~To*j(pDO zu|Op}dB5I5W6e}Xk%|sW-%Tj3=l&neUno&2l!E`Qe{ub5hTnMT(es?Ay-e71UZt%+ z!cSBwK*CchC%Awrc`^JjoJVYKvCrbX88Iq~u7#c|BpbzG5QT|~z1AVq4Mw>Ll)Qdg z*2Cu}|4!ixIveP9QCd0@gR%T9h4-cKADfe0hvau9&&&Hvt-Z_HtHt{(PDad)*Ty7^#dfmIzhV~SV*+mg!&ew!n9T~MC*UXJse`a@obst7G4s1$9!&t zonWp)L+kbFDNKo>CT|L2kodaWFB<=zGR4-Om8Z6cksm&JSz>FJ_FV}Ng14M&Z2o*) ze@(G9@-q>eL*o5boQnvXf0#PY{)o*jgk!v~__Q2z;H(DdvSTwB$b;b@5_Z;O`xnAb zGwU>G^EWXWSi&e#eZZc1zE0+yVr3|QTwFu0lO5~m8Sl`%z{lhb;;3`!H)>dPh zk8Ew~sMxIwRVMzYZM)+!Wzi=n!5&{PCnOOCB>Qi(*Moa9^_)C+vA4N(Re5ht%Mz9c zJ=i#@;HQ7(ZTP}3egmFtS1?++2YG)5W~FiUH*c|&ocLcoAzdTPC4ZuQ*Z!|13#*U{qNwLYFV>!{d!U{QIBz19oQ zF72DMTv(i;@0?Hn$W7m=Adn`Ym5`0&0fYacZT<;}nZ!qohw#^*X|IU>a2Za==kV~+ z227_f04xtJop<_7^PaY7NJV9ApHe#*wiw-f{tAN>Hj=bVCSRt1!#g0{G0Z2}pW5H` zja^vZ+=YC&sBPZ5Y#-YfZ$<$=r+cl0gDDJqGq`(a0j^%fu$MvKcp6w(n)|`aSdy24 zpgWfj>NHmOzt`y!EykLaH9TJ1faBv+7%g0NRVz%0f)lXmzDgWK>v7h72VEwibHOio zm%JVEvna1+vy@YHE|u61^X6E8KfzPjaX6oCo(lvaZ=ob~N=(YV`}hbvVI1S(tQC{t zHcygu8UAC!Bl5z=i_ohoAo@ZlE0^1f5)ZcUR+4X5F7f^jrT9u;ITYoeJo@PPBF+!% z-*nhXY@XbMIF!KZB< zRqs;yOZ~Y^glV$-=~At#xZh|&d1q!&86_k!ficH=BIOPOQu5alt*(h>6n( zlpqmNhWL2{xT1mo$Vg&mDdZn3D`2lbgghU@_U=BcZJfe!;jA6c<37lFU2ePBjJvKC zMKL2)&e6EVkQ|F=>P%%dEcScwbpIT_@N3_KfBy?_!unngD_38J;o=RLRykD4if9;K z><0H7t<|Pqqsg`miT+sqt;)?7(1R%)?mdD#*E9HuzxC(fM}PPgSRM7Dm;tD~v{=4| zNzC&C<`VbR;zTlcn&gP8}@Uy@4CcOF92Gsc~EG*xEnew_LcWbNsAmUC| zB^MGVZk7AZxb|^nCQe1H30)@4ikTWg55wJt4Kt_{Fe)a*c?9}O2D^A?e&ko#!l_85QHr-*Ez&y0>c@Xoq zbHKhc6#!1o05-Oc;cQ&Ma5%DpMKC`SI4m>5F9CnY33o|_jg;LydYNkGd&?J!@LEF) zL_n$UJ)`cHcRt+zytjn1f{8d{o-#v-d*2C!E{{@>QAwjA$}|#bQO1V?*nP;LBx~>_ z%-fn^A5MZSuJJx3v#RI?-wA%3ty*R78T)gKDInx?srNaLPjrLtU%Zd!;kAQwEj%~= z0~aar#3cNziIzNDGhA&FE>R(DUzRP-d`y8i5IJ@Lg!~0Eev(pX4Fey zjh+5@GMQFomREJz>-Vy3d3g~-0O|>rD1sUaeZpN45o_%uH6>q6#KOd_gN?2k!X=*E z+oTn`36Q?F$&X2oY0XI3lQG%+xs;2G>~kLL`+Uunc9Ft(>>_q;Qu{8~qTo)&M?8{oj_=`f;_#lqWjCg7lVgiD#Vp^gy*IctH8mt`CMSWHQv$q%WaMe# zE4JFtCceWg228t2Lcd1E+*-&=j5&=w_w9zK-D6(w{Dl$V6ol?*aCn3nKszxfV) z;TL`rs{SolT)qX98Ip46d`C7Z?sDt!r@Ltli!%3|?w+F0Hkq4_4aPI$d-l-x42PPK z3d&hR-We&}8dD0;TEb0WmQ3N0B%kZ|M{qU;Sl>K=o!ts1FDkDJOiD$`Z`30Ee&QQgcnVYRdm)71yG3&mz~>>n zRobyE?UxFW1kWAIqOKa^J?6Qlm89lbQd&i(pOPnNP5zoWj!E-U&KrsTWtmjHJCQyp zZI<%bxbepMdHUP&=RS>bv?GOIi2v*|XFg_Zu1#z7aD!G*M^+|rleaGanb_Q#){ts# zvS;jb=W!4|$NAmxEOPG+wr@5+A(iPR4?o%)#$QpeUR~*=%)1W%tN%8MV@qv~!XCZ2Y1=Ug2ZXb@gAq`;faYBzDhR>KrH9%wQ zbS^9OcTDJvGiyzIN$xPI?>Q3lFIJP_E}wzqykg2AfBbIlWHAOOh74St)wIy=EyB8O z%5~P!v14b|eWxt5e$8f|fQ9?#F?Pn4&#uYKDS^p|9MWPKIzoKuZ>kTEnSNCmfD#{- zs5pSfPq*Rm#xA^g`xd6ZYL+aTYr%`-`Mg+BpTCKn>t?3D+X=UZTXaA57|Cot4*>1< zU+8eK4|Z$#7eD!j@WtPL3l2_)u&{I=ib}<@4|RrY6~B!o9$mJ7-H)z4OXLXglG92n z*)T_lIyYTZF;#b;$EYs7qB@ht;w+F}^Nt z&oHoz_R)CC1BUj8)@K=C?Fz4g{2U!KuPNP%=M~`22F3T0HJ7Zwq|`UhY2b=v$hzE+ zyH5_>bf%>sZY&e_Tf%WF^|02u>zpde+YtH#eaDYZXYgcm3`dg{SQ#=4C($hyKI9rp zHYo(2rjtLP@X5nk8hcHAAA3Lktigg_pI+iw?>RX-_DS&4-V;h_2Y}-+;TFWKtC_w?(J)^vNY7s>)2AxAL{>vit3aQ7i&$p zuDvl#NxeLWqZz=XwR1Q)QE*erksj3Qj#9ifp9{J7IoB`KBxj!5)5rHmyo@l@8 z!_H4DK2_Ec%`L=t-O33LhkEPfV;f_cg%RWTXU*Ti_NI8W{^pACa&RKm&MbKjFFEhx_;Q-vPIet*qM1U|=5 zHo>*kj(3glqwPFGj5G7s( zJ`5LBbtW?Ll$r+TzxTVp`wI`>fA7tc)8lhhuwyhDLa(nnG?@YoGr*Y-zA%X-g__AdVvAvS#CpC6}fKoL}lNx<02NU+m z-<9{Y>HMlDl`(z=5cZkXBJ&#J;d-Q!P5;E!Yr-1zqxk>^3oG#W$qqbvyn$KHBWK;g zffMgPIW6v_>Donb5y5d*sTf!#RF+!!|MIsF;Q#Ue`W5)q-*_8#kC&mpcu!~hFX{y- zRVqef@z?w2l_SzKvEvd>Ky9?5D+OfL3`Pq8)A0_BkJsSG{`{YYzw_7r8~C1AhLDw5 zaiXv8pJp)3`||vY1p0cc3*y^!(=0Q(<4L*%0OPWPf%+xS;6H!)Dg5*=z6tL>JcPy7 z7a$+3LRk-0fi(R?ut7NWf^pjL1Yai#c#gsG^y%V`aUp{%82C6DS4QgczZgH*1eXA} zi91dGS{9B<^RfYnhN$p}tUrYD4B&%Do3MX4(eu_K0aLh0yz#7J;-9n@rx7ZlBEarG zz~25Cin4~@K;>8sU%Wd8IJutygFfQ0jm^2KrPl7BCsGJSsuy_l)ZG!S94JfZxf%%*$k zOk%uw+MH)#P}1{_ATDJMig*vPr;Cv_FjeZILJ_D%PN@2Nz#{@lF3TF3OCX0FD( z4^QiVdF?V3TpYgf{t}whh)b>P)b6v6*A>FQ`--_Cu{($zur7Ut2LH@jHmy>C)}k1X zJ`6|8u(5pvkJol#rmUl_yK%_}{zGr!d3zqKQ6o%CtouIb<*;+sgJ1pqHTd8D^&h~m zf9V07O-HbFtxV%gj+B5yNni5}?-~=$QY9kJn)D=+smKU{xegH5{3dKhfuN z_!0v|jH` zm~r0DSsQfJZ@hX)@Kkin_`KqLf#nTMj4^qbgt;RU%OIs6_tc{^#gcp2L~pSZWVII! zh{>*_n=+xf&3jJ;pVZO_-?co|Vg6h&l<&&l(xXtwUnI)j%_I;|KYA_SWyx_h%e3G6 zZ0onr3ogi?*^=$Lxl&q`@K0s@M>_1@QxzThCcmG)T{?#@KG3hT{y~=K=S5MfyuYx# zyZ{SB#k64UKtCy$j48D0$HoiThV(qQSYfr`76#{vkjB^4 z?cn*(bVW+xJ5peB^K-8GPC$#mnYKyrN&2Wtq#x0k#o)ZUFFArY$Ll9%wePZy__*!Q(_FYBg!Y68OVb&qy|JG+ zPZVJ(Lj;s%i0&S{Ztl(+?V^PvofCgPfk#4AvrDB%GZ+j;aJWB(C!1%mf1bh3MHRc* z1lyLq$l64S)>j%^h>7NDj+pqU#E$|Ft$m4kq;QzAG^xBVDroBA{sg}CU-sZ%|Mc&` zdmrq=>WxootN*l8!kH5EP3CYnAun;O9ZS1la;32GCeyCx1yr*$7$0xKXFqiV{_)@c z@8O4jU=>FF8p>G?L*-ncgX-1uDq|8JszBdI_{Ab1_SFR-E^?r^_M|c-t1@A4K0Jkg z^B=wrUw!j2)V=GlxOyKZGo>iuuB;|Z!D>mkAkTB_m}f2RWVF$x=I*q@s3!ouuZO^d zetb6MaG_(c=B``_6|=0;D*;vY}J$(#~w4n z+jHE@CQA}u^Ru z$9@fq33WMx#bF;_x_=9n7kX}Qs87KMOFkuL#p9pP53%OfOyivJd2}*?hflU(Qubjm zS~l@T3jgR@e?qyHrq`4&pVPxme6UC7adJH5g~Jcs_#Jacv=ZMXk1Og(z+a5%^KLW- zZK4W)@U#3ok6?EGY*?*;1@j!ioIcD7Zo2dv5;ynwS#tunw~oeo z^?oIT)IPa+b8n5&vhCdH^X4_j))YHCZQMx8 znmv!QNHRtQ6NwB{eK#>$W+ZQo7CM5#2>USKsch_Y-gu0lDN&=n0|>qHzD(FZ3|l*;Ub^ zl3`Kq(tsw7tDi?B!$2(zX63Uy%fSr z-Ut6X{TmCRa4vpy&(LMx#Art>@Nz6tAolw%3%t)brs1gXDO3DehMG!(s=F+nw~9hR zoAErO5=G5JRr{#R5j@@4hOOOGowUwYwXm+UXnkzj<0Ou^;RoitxCK1-GxL!(qlldr zB|Lbz4kxEGSXx@uAt+9W6pDSq;}q6oZ(oJsIduUmD@*X=y(_RZQu!uSKv2&Zr(Ep1 zY^{pQ3nbLNcq86KRWZSHv3D?q_1#0Qcp3~AK{3Xh-g@+_fxhc^SjoEJT{)AMoIP@U z)m;7%1!?86>(hAqx7Ohx?ImSiNbB8uTwvw&J%*b+^mdKTj?-Qe7>*#lj~B7KY>6e{5j%*}_BRK}=go$v0Bd?25FcKri3tFis-K&VBLq_zDD-;{%yHN7%K|H8++XtIcHZ z>6mOv)1w_kq2dWVgVpk~NZt%142M5=J%2-BofTsUS#KG3_NVaRg9G@~%hw?9D>vb` zM1WB}R4}7CUukL5CA00Eg)_qPobDAwAHMZ9I3tmsORlV!HSHm#R;kfLhY^oG}DHNLllh+y7{o!EAB_ z=f_XrlP@pBKm5CY2L9?_dKFfb!dbb~tCEkJ?znhjU5A(i3jMEfI5x=u4M@Dja|XQ) z%0BEI5lsQJER|<&rHxVhXFd4oU;JbExnKP%6up};SiA*wK7z7P%(-%7F!6R;;8yc; z1+J9P!N;U|6Mn?MT{1CSkD1X{{a?dW5oYk1(E!&HJ>c|Bj_Ko3$51fadL6+v5k@g; zX*CKBex?Z$3OaQ*fc>K>Y;BitGOb}`OJ?D|J6B=VT-6ExEG9WHAG3d~gn#ZxPmSY3 z`Xr=H{<9&?P@hbTN-I{*CsP=XMlQHSD|QjbYV@vYgHiOU1X7mnV=2zMn(Bmq*H=ey z{b~%De_(XJgcQ-@T>Es zG|78Sa!_^mPyyfs9K4V2%;FN55?{dF;Um9kKErYU5kANPv&%JY6ET! z?a4iovIg_YwOix7m{ZLrSobGwX?@*#KKwi4@rXw0;}jPB9RU~7bxcOH@G%Nms=gxy zd#TX!=N^BqN#=`y$IQitLsW+$`t)`$3zcq7v?KDN4@a#q6qWKC)RQtGZj1 ztkaenWq4I}sZ#0MGRrpMDtg)wjm6(o$Ylo0OD-gr=%xN!|3_ubuM1cl0W2<{6$U4c zRvb2MFA0^;uzT!`6FN=ef!I47c+Y0TQ%%KkVD`wE5HAm9Ou*_Yh}v4vt&LVbuYl{r zLuxUpYg})|+&5!PghR*vPslWoW>+1qHVrS1+qSL{Mk%n(1Aq3`oO6)B&wu7na1NOn zejXHTg0glIgpgVRq!gl2vbcwts{Nhp1V0!R2H{98qyRt})Y2PO;S2~wymi9v2U z*4Ur8*1d@=!@(@|gmT@#Mq8CG1_z_1Yp{Pfg}2^$1d{?Y&36pn`UqO=Y|euV_-&<6 zn$K%0L7>LuwTfHEyFKb>P-QuM<=uVwmtXic{BQsE4fvfu+<=o}6_&2P2EB!wFfDT^ z>YmQ_Pd=MU5S7)X`CL(bL{$igAuhC6+3b8D&W|?W#d}Ne4?h1R@YnzH_rlGU9Ez#Z za@R0W0tY4BGd=3lWPkD3quo9=4;1`LRk|?GVec%5FZ|*=@C(2C2J9XI zEMI*U>TC&SD#syaFtCXbSa1Y0o`+-kcR6+^%r{MmXYFJ;{$Vu0;I0tYhRR)!XS2Vj zve_qK#x5szLwJq%tCWwGIX45C%re;Ap25z6DNX3Gojw}~){leGewmHd*M(o;@Zc%duAZ=(DSMtLgu#wNT2or{H+Bq!X$LlC;|vUp7iQ8Ue%f^ta|Stqw586(@~5 z_>xDUzNxChj#2$x=^aDN-J(5pOL5 z_+RZ}NdCDE@!n1|=NKh&)oB7~_?>&7`i*UFH_dZ6$JDz`&v*SCztjH}hpEXmPR@n0 zv$F4*@*t)0;_$NHJ1Nuk*1GQnA+A`7GTF11X-26-ePlP z9t=*fV6_^2oTsy%l)7A1PwiZJ0+Z8qc=g^8{@4H0kHFvhE1!WoOBtNcDp=^Nq<<>; zA1ZxNOq4PGzMyYi;4SmYSQ3f}f0icB42qsL^!q*7IRp5QU)qMB{P+JEHuf{Pe*1gj zeAR!?3ZiQ}+@jJ~e zXM}U8FH80{z8L`I3$VU<1REPuc=^`QS`W42()4i|R{Nxf)koqHz=WYoYDh;x*SFu^ zQ&j+_Fe`Fc?G2&S_uJky^a`_HCbYkX5w&Eegz5AQZmurCOZRWXU|@?5GORuyeU#rl zo035HFxR6iA3EL)z~dGLW$|@%;F%!~aZ4AS~tS^&0^ymfn+}3&uMH z-?i{wz9EZQgN=;AVa?~A#$jzOEm1o<+3FD9A*t|-V2VG zuu2dl zNz_8}B_cC!t~6aP6(1g9G8}*yvEg+umE}|YLdA#;Oi(!VUHaRE$rNJ}n^RL?vERG2 zwz1uF-i(rSr18-Ogf6$yA~E5P6f4Mdg^60|P0qk!qu3_FfV!Dl*C#$ViTM2_eSVV0 z7-Jw~&E{*I$>ehsPuZ@0=9T6b-6rOtk}krQK0^{2#)(e++1M)Ew2Y2{m*1fPkw9+0 z(ymk?KQ_y{L6Ve3oRa)0E27Q=g4vL@Uy#wrYle|&PAHy~&>@Bq_({RIX94cN^K4K? zW}P!YyGa}C6DygcN2+q@kCx%&cn6+t9Kz0C1+QGgTo_8vs9aRz014q2`MB-1Ih%hs zTnj^w{A9_P{OS0!>|9&2K>MO_g{mZlMyVg-ho-U0CnC6Fqze@Xsk=>;hobEL!f$l-gMV- z@5$-i;7g{g)PFPAdhcYJ5{(v@8s^{0Dx7h5@Z?sxw5OI{jXz(WU@1x~9rMNb9cTQj zb5qN>5Bdy>>$fnO_x<+HsmB&9LN3&d3r`8r z(a&Nz_c>n3pqFKEG6UGyEa2q4k7P`rRT5nBj44aMJ1;b^9`YAD4i&?5s@WKBT)6=+ zy>M64iPBbF!UTahF@~jDXqo&xPS;{^QP0J^QBp9eg72{!HfXio=I$OmUf+VeKh)*_ zv=^yLc&hM`u@xENK|2G1MOF4C3~CMf-JuN9RUva*QaC36-12-Dx98nuL*rmzwvKD;6BD8RM~= zj6q$EdLE3ugoTkkFnn!jB#Q}l2`|sY9DIXY==nf%bNs9Kt$D^J{5Qsv(kw;ay-Hz!^pK_U%6M)JRZvcw znkT4W*w3}s)^Mo8{Y#zjPrGhe4*+u+%c@WYHCSF8=u&{^%6&kGGIGN0Gh1AMh%Hub zs7(fD-gAeFdSn+(6B4F{Hv2Dyo4AnYUtS6LCSkrSBft-Q8=>na{2N9|FWteyKP(W@ zUiyq%*r%HVXHB{a+HP;$CFHLKikk-EJ2khG560xWH4bM|dxg?1O-@{l! zy!1SbAQwTZsd+W6!JRRO%rOa{&sdXi=aeMjx?^xa1_oWgoic^5$uJ8%rr8KFnmB1` zAIBwTf^ejoW3QL%Z1lSaXYlaJG5o2Q7hrjSNlLp2eb4X2IXFCvAR!qDB(~9k7@_CH z&?x#;xvsLt?5=qYOZ`4PJq zGih{Q$r2k84y_d)pU+i3nZ+E6@je_KuEF=bbOrw5=l?YPjsM|wxS;~O&FpQVEul*9|y&A@KAAaT+zYG8Jr@jp9djS2V`vAi$FfG)0N?2en z>r5eL+dMIc1Ryp)shHsN)>qEP$_j?nFnc)D2{h#s&k%yPzH3%nD-U-QPsWhI`6S#Ku1$gPj+n@}@Izto_G7z2nXQxSk>OzYz zM==v?j*s2iIfTuvedzV?L9LS38sQxUBf@V+P{tV3c#jdf808tv@6okI1W(@N=Nd1N z0Ns$QDK;Ezcv~T>XYRN;N=_)k^P?3ektEc#7At`2Tok@C zCH8CzZYklBco6=T#D6|Lu`7#wm*ybS_|rZS%qfmjx#5I!?3~|^_vh`sMvCL@+Aq*RR)|!}i=o$p?J>YF z{HOQeU;Xq~;ho2)uzK@TQ07-)S}7g7dR)P;ZkPdDUQ%-vB7*aPk$Y@&0dYF!?i`gF zM8@7;989Q4CEe)F0GCrQbjZ5k6(RiVl3iS(PfSxd3e8O`PBd4k?a9y^EW*LjF05}J z!}%CsaS^TEnyFHuBD^$Wr1=6!;+{U&g7vX87UMg*N+Q$Zys7%oS)da3x>%+Z!eOpq>ul^JAcAeKaw?UvQoa4{Z5jd-A z*xZ@I-r)pB*OdFesg4mT=Y>;5k2k(%6sD7|OV5@L61A~zZ8b{}XXnL|rFs+Qdusy7 zxX{Hz3AtcrtIpt<=#__7O?r=p^K2EO#e{B}Z*VUu;VUzo#sz)CU9rTO^4WRMp}@oq zIK&B%ZeH$7-k;B>d3}-IFtpriWGiVMM)s{{6?fu07 zADbhs!55S-!qmqOnEZU6=Jz2#V@VaoGj2?dY`8`U4?Ne%wNKICQ(vPN3Tm8#;1+>r zY3cXdkw&+E!e^2S4oiFe?_!p;w1Ol(M#zYBHd*eu?B9>UZc@_7rtc)B1hQ6qUiE{C z18n}Dmf4CR@q%sEcBwV|%L>Jrn46%?GgufcL0uifI}aYh?$HbI z>b0BNMO$ez>7BHwA6il+{e|V3Up@QC_KdX@zj}Y z)fV=8%Jp>$v+)U(<4yR?C$7Lh{`~(De*AN-vsnd810^)OL`42kjb!r`0v)~= zGHOvJn-qo<4etyCulh`{y$5SYC4BL>ci~_BZbYea>2GFbb?4J}42kW&d4BHkihK9NrVuF?JiM`{mp#f^lg3N!!oKccsN&*rd z=sBHoSf4S4i+cSLjHeZB?~P%9zlJLd7^|pYt&@%_Z-4+^2{=Xt4S0?%y`$kX^Gzg$ z(fs}m!^u85K0SxEwOy#{5%l_tP$^}r4y9ohMRVc9T+HS^*2+V41`GWfZe7pe#x+bN zN5_;b|C+g`Sv17hatmXVr7q2nJtLgSgHq*3ILTmhw}SIo2BU0<$~-!%(&8P#z33i| zcQv5Q5>MfW>3t-G$h|dW5~-1qrGH2ubPq0|t2_0=6s?i`gfH67xPlhSb}h#zy1t`SaGKFqlW6iuK>7RFHj# z&$Dui5hl1f#wv?`=3IATbBJlal>mmN<5Dd(Ki)?hEF|1hjDk~$q)j>VDRtsyL}=V5 z#2ee2*gR-1^0}1PgWTV+{}__4gEE)=?DPITVZ=efex?)s=tLr{?s#ndk##v?k;BLr z6tob@%JQV(L!?kMAXN!0}|98Ipk(zO?1TrNPV zo#!w^c1-CUy$=yw5HRD!u)fb+_HS^p!@}6^CqmluIFyR8doSR=V(DltF z6GO2BWoKO3VR4ZWLi1i<;~kZ&V(;J#9+;qVe?miHckq zn^QAPxFXC{;GjFlz|*#OsWnERrBvalkUAJnBa;-YXc&6F0Z{U9Cv2qO$I`d)%auYRT@E?#BenT42EQxu zvxu7|&PdFF-U#MJpF0bHZvo@u&{*nON)D2qv%mM4(2In<_=RtSX?(2M{z!qj2@&C3 z=`4r)!HKc?jKvp_`U0`bxh-a998OiC5*D1ar-#XBmvAIsDu&eG`7_=l=j6 zJU)k$@e&LdZ$WQ(9ja^yrE+aoc-q)rai0rc(IYhfn$Ri1pTkm5K|No>AXDY>&f)B6 z4f@4C{P_RygYfyk^=II}{VWRqcJ3s^@;j$3k4h=vL&u#x<2uh3MI2WV11gUj5+^Gd z)utLv0B>XEQ*)ZkD(Lky7-SiI?ZG+xyPx?Z_>JHGE*zY%K!5QzK)wuR)z>lqXr(j4 zEn_m!&6b}OiTfNLwNo}Vd~K$C;~I~@lVEF?-7 z{s@mnO7uP-;j)>>2%F1&;rC#8DJeV?-018yB8*VMpw5em-QL|RVE^b8s{9HJ@`284 zp^vY>DM@RSPWCrb$uMSc?b;&TyuJh~oYd%VnTI+lTAZOMrg-*X&|nR}*q${fS*6>D z9!%&h^}*w9*xEUTthWTEV!BOe9NuTVmm2+P37p5mM_MFtYy2@L;6&yrKSfZuy7D%h zNKC|f(-ILjI0gH#^$Xely5zrhQD#rbxkrWPDRM~)DD66)sib4b@9WRBVy;DiVk^?P zk9Y)fgExxhlmgu09>N592PLrg7ZWBG3{|qnW+icqKb3;4`<$)I|Hkl{5#BVg{I@G5 z;#@?VyyAEw#|MQq>-{;q{ykZPJRKq)16|hPf9D&nXaIZO?eqRKTzSsFA)MvWF-$XK z70p=T%H^c+Wh$=B3;Xv6i{s)L@6GRQbF&N=CgD`6HR!xadDW8vnCG>nD(a3Fu(Y%S zOUsLtm!Ld4Iy`^;@V&2p^UXKk$X8cakAC~NfBV74*800AM@OgAX;H4Mtitm0B9vu; zjEvC|rVuh_=S>}V;|SKx<6^Z{n}zjsa~GZeE!Pm=)A(nN`=4EGu3gSu^Lq~IQ#W|-@%*P01oUs4 zVue;kgeav=_1-o0hwZrL4*MU*`Y?=L6ID;oo zr?7Ks@`1EwD)Go5T(sHjtk1or&aMz4RDF6h(re50#?}=6<8QnLzx{jfLEXCrt2bVQ z;i3wY7(k)w)T<=2nxUmLLdn>C985K1b+ZJSl9a073h4Jr81_r3i+woWeF!&}OZYo~ z?Z1Wp>)-!#@E8B|b+|gHbuvQDZt(m8!CggHPS=z$kv@xLed?klCPB*aUWN@|0&}Uf zmhuxlV_FMV}8P-1M9T9zrjc42BEKaB@0^ z2ag`Zw3ulK=!BM@<|3SLO!x|!&C6^b0xmG!#}rpS9`^5$TKCB`gPq+OOr{lNJyiw3 zB(bxMB3_Q*o@t>M6H)2>{#6N8Ifc7-uEVXHSGm5)(ngI(+SbC9iyvjH*uRe+uffj# zDfEY{P^&VOy4nrVTg;WcVUL3PHGV^OWb&@7*{=bKHb>Zc<>89_p`s(zkU05vADQ6>GiU4Sr%1MRIswV1j|bc zbyZH$?@s&XQ7tZx_3`(fE|-FC5&WX^HFF{?wL9EOqFqrhXkquqN^7KW9`m2RF7Gs1 z^f|Je*YcmTp8J-W^qQMtMZeqMI-(G{>=q_Bl^D>;zdQj*@e|@x66GLrAclg+- zt0MS1l}OZ0mnP%bMf8j?-|9<|$cMwSue)vsD+P zG4mhSMt4nxLanXu!O`&y7M5@5Y7@#59W#ig?vsx@oB1^Uj-89NIO?gHU5bEGDhX^K z0tb+#*X3sL!*G(g!72=_K7qaK&PTw;U!<`!o#vTwAPmPar>!IZ9?BZw-q7z&{4;N9 zqe@D*h0l9=b6EdUnLUs2m^xeY$TxB8KUZ$0#&?sJhNu`kC9EaCI8O@=0PJ%MZ#TZ> zFD*|Y1br4dC;3MZzKr4_eIp1-oPf=OMq zu}6g!{ zp(iUL7jI^6E(mkKu*gxzAW_Za_=Urdoy&?^7z06r3yX8jiS^6Z6Z^bNOIb~MY)L4b z@%Qa--n()xG3`|I<cENxC0dg^jHT?UIG* znxc4lEk)yJlwMUK%9t_^vjb^-Y}{`Z%y?YB31>EgW54=&sjV@cV-{Q#2()#D+%RiZ z$5hQ>2)%`?@WJC*+;dR$d0pa$Ju|7`T=EvC+ zB=K(qlSz_<0A%yRj|!brr4JSKVXCtGYhju+#Hbm@WNNg(em!P;&+Vc~I8ZKSShg?E zDj4K5D9`sGo2X{!2%Vv{X?W8Qi;l9d2E}YK23MCrpS9R%L48pJEm^*6_?b)ibT@SwI$irf`$_ z@bDO5bNd9w(^6Len5v|xEDt}1-I&k@-kVB#s?WHw{8RQsDy`PA#$bMy1{%Cz1%K0z zy<-e^b>xm}cYQ}I)VviQG5&&N_U~pD^1n`?YUAJ&JiYGpVW}?@8mcVK7^>61ke=13j2*|w3}cV({wXt*7g~@l)Ip-dpA6gFL-c)HzWbH&0`TTE+8c2_}U~p>c*Y6f)2y9diOOBdviJmS|F8 z0K}6J3SI;hHwmVWQTZ@im$MdYR(OfviYQ*7eY9EDT|Z@^o>j4|n5AAR z08q*5;w@2FGyfR&%0eH`A%idd{yO~puY480 z^34r6J|96ox(#*z3e4&SP$_j#iGpyWI^bHlYZQlWP*SLw=eUK-GV-YfxdgddhBtBl z1WAJ_Y^gsK_UV+P&_~(2o$@4(3-K&DWt7jvJH|WB$T_6}y~DxJZPj+n*4t=!hCGM< zUQ{08YV9~g@ zE1X)f7;K}6)XI86*G%<~QW;ya0!9mcxPR{k+`Mj*&?%l#HGT{X0c}(QurcH_Ej|vH z()6*&GdS1bQZv{;oIqKrN+?5<8-vsj4d>PJ3r4wkfrM?bF1awELobZLnBrBjg?ysR z5bg`^$hKnw#H12}8)CHMuPH-j!b0@(CWlrNPvrCNaXy-l-)1b4-^F=yC!26y%=Pal zIZY{!1Gq%KqWOo3sg z zmx*?fvAPhz)NJtmj*si^Sq<03crirhGsu$Qxg>c~OX>~J`jkmgf~i{TweKZBI!~bxx=4x9zFyk%{%bxAH8A3w6IDSDIVuxwiM7r$Fn^DdQDE%(t7nhp@GK1pUDsD0Af%q+0G} ze&?ZHK9QqL`O5RBgwa9{w{Hw!bpSA(ne#-Mpc~ei=7mCB%;SwTE}yc&oWT z&2vN*JWYj}b6nA4yYOIYNgFdRM(%GcUk3QJi!A@C*2w3Zul$msX@x*sc|}u=g!ou4 zM%+9hlj({~+Gv2unTNwZEH4jWVF*y1&x~Tw^O6?xCyflQ>P4Hy>GX%(kOu8!N+@pE+J+i2 z|1$D1p`m|t^Fd~~dAzi?GbGGX_~-L!8Y9-98`IAi%|DAh-(^puh~Yx53HHR~8zv=U zrR_9=C#1VE@rQ>(#26*_y+1daL#TY=qMk#*G+t?wnfZ;9G`TS}LNWr7+ewxafPY4= z?X*6+PlUQy@)jiC9B<${G{I4MMM!C=v)fbO)L&nPYw8&Do!tpM*(hQ873bcX;z!L* zvvd0JTho}1qSYLHm(2`24OO+?)TCOASw30jtSGI{x)X`TEPSym%8Pvkc_`lWzh`qM70tvyVIXV>zVvhfI=3jFBw>?{E``r<^Z-9>p;FJW`|Z zjK*Chw^zj!VrELMsOb%spsXu+=YuD(dw3OIzPhNxTU2SXXg{t)_ctA>=sR5CZ9Ahe zfv)YHi{Y2pjN(+5oh70J29v6Pm4$nI{~Qia#xPhNLTSUUO!$wo5_vJ*#CT%4U)7_k zh*6g%WOWHwRz`4jHHQUIrAAFHc-ne#u3|z%xJu%C%nAY_iS48J>az)PDuk@3JOIw8 z@cyGGFrJh!7%tnmcFDx!tSFft2`T(;q)Gy$dDm!>D#iwTbV>-%fspIr5%HloM8t#3 zx!K(?6Vr-EvmZ9+37=QMCx>{CTb8A<#PZE%&8~8aS)=uxcga=>=M!2)(DS{*FFeJD z_`S)1<;^Scod6pfTfGx8fO#HB=|hrM7&&6kji$a=LsM%SJLXyJ-s#5Irk^1%1NRtv zmhuTv*;t+%R6c7y^!Z)#P>B-5jtT(P;>0Z`|0UtU$%uZz|GLR2>pdgxwLQD$2yosG z;m5vbhD;scsBn8#!osi*ON%`%z89qm0#n}pCInI`0M5_PH3ZALEQ(@MRMk|A^{dMZ zIuF3k@f50T2K{`b`ojS$hQVyIrUYyvLTFU$VK=wkmFiioz$qky2aB+^dkpWqw*jAc@da4yWtPGFNaXv5CYg{n1tEWj zn$JwIJu}NSp?{W1RB^f53&6mywzZtu9LV(?KQX;y|0-=*ubM(Xo55tV1N~wTKJ&e| z;Q#iIJ_mpChi}1Ru6oL$pDXus_>h}~AB4<-@kFtqDS54v%)R}fg#Y{h^OxbjeB}X* zuDlK_H|{`{EyC$UF}_&lPq}nzg}0`6EZ>bM7~lq=z~qGW)Ll;Px%atW7P@8q4&QW9 z#!8DlXDIO8NJcB1E7Ag-XjCb{1n^GlwE`A>r<8vc3`Z+a7bU#?-c#7zehIQy7Hy2U z>~mh8fN1A4vJxM^rZe{g%m85b7+`yMrY+qIy^;3xiSLPK>P$^}Q}KyHy`X}k7(>5b z!3+0p!__MzR19d`VsgJQ0vQwhqvHiUHwm`gm&zIB?k~AJa6BHvdk@!OTvRX^IR4hn zlUuLRvyMKe@tyU&TWjNc{Okvj?<1avO+2aP5mYi!(RbPagpI;VEp9W4I?i{r8HHl} zqCF!PzNU1sW3re+*W`j>v{PF!Rl-}Pn2HE%e7t%1RB70`c;j#ml>(f9PYZ|sv#EK- zgwwc@Pc@X)n#+gFb<7vml6uzrTz4Cb{Wt3rI6Zy7{dHnKns(TBZ5e|-kJXpo87|o= zvQz6$+z0wQX5n{xPdR&xHNtz(%z_l?O37Kypf0Ddv^;>7WlY4Zs`}MsT~%dO6tki% z%d+aPt*xo|%l)I{vx9?!!@JYTq%6zDm8Au^er*Zzr>9z*ph!Yd62nf&niK(KNsMp4 zL!kOE`?tSP2TJpnx5#I|lxg5=>zIdh(%Qp$g;+i=Z>e_)!OHPd@1cumJfr4CGP}}#Yi(*F-*d|5FJmYbq5Zh&tk)n*)=9_8~2YfiO$W=BnYBdG)i=d>FrdsJY?lD>~6gWx3Bf# zul@KBz~BDs-w)sa`b`~^O#+% zpZvm?;f-(YLD{>jD)<&&+ zm0@mm#!M6U>2{VWYEqh(6ocr-a{|8ko+p3v&M5Xrcb(H1j_*{s0FPfK#@^d8mK2RM z@@{?+G1hp!a%mS4=;v4Hmj`boQ!*WQLFfW zfZcs{--oEsQe0f!!#eS7Onuyl2O_6)JPl3~pRohULWtQ~J4pqM8+_C&$N!2M5R1q?+X~ zzWAcjdyc>R$KQJQgZJP6+QI(b)_8n2U0NE|w{EP~xyk}i&NNSj+u);HuXIc+6MT6! zLt~oeXX-EVS@UIT|K4g(qY41SbcyWxwzfMdS0Xi^!Z9ybpa~mS%v?fmB1t0u?8Dsi z)EI6q=AsJ*gU^F!3JvGR5w{fV!)GsJ?p(u*NJWqCiNJXFTvD?p=P3TUKYyPPdCZ&t zPh_5`&D4x&>~2WH$^;1%V0CIFU9M@gunI>f6L{yr6F3=55#jkXepXWorY`4MzR&+| zvTDd?aWRLv$Aq}}^|;`}tgn_kQ+E9d%IP5#(_Q$X|HJpd|K%V21^7Sz-9H0A@~NA! zGEhlnN^5caa9U*UobXx=yn?+t3zSq3`HQjyRnrC@uAReg|NdKWUar8k+n)gFEkjxN zbRsaFJdtwS1WdF#b0&+k5n{9gRz0tk0`l?jY;qjOdgVDL=Ah1QL9G4Brn@*x}?p27O&7!FlcVp)y2t$k=`^P_K0Bvx*g*3l~f z0RR9=L_t*U08gHtz`;=od4CCgdCa+{vyBlzj(^j1fhmi$*GmRa%+6uhE8+E*@4@QQ zPzR4$y5i(zs|=J!oioQ0{}8_;&!%U9ApF$@1}*oDgm#4ob`DC|-apgTQu>1h%$vYU z-m?{0&ew*x1uda;B1@;2wLOY@7(C+^kxRMS zl2#{SOhO;S!M<`gq^WrBn-zx~m!_Wy1>O`s@5&$ZGk(!C)y9t#FXoh4F)!u#`@y+y zcs{jf&vswho5!m~6b>G28n?v?*ERvCojbnX*!0;+Oqk_wP0B#6Et22Fsv%ze115ZHJiWD+IuyJXDgJy>xiK==$HTq3Y- zEkz`r*TH|DLU?Q~&udJn#cOOryVv@7^x+tlyU3c_nRGJ=GijqSCnRO1X;-ftKT9A` zW^pz78-wfa3EezrQ9^6YwY>Uyzg&PpVr(MX3hRikO=AE#3>TJRGR@%0`WbBOWH8mG zNd+wa1UI4&ic#0RxX?m7T#Z0Oxcm3YSy!y4MLS;3#;1@~XYl=>z7PN8AN&~nlfVCG z;L|T(fpJ-C3+&7N zvqHT=k_-tk5!_?5U^~Izicp=16xLsc$FfGdSxnjdGGIhGYYnl>kpSPhjgnWj0RX*7)2~?%B_qIsB-aEn!vH@c7A7 zI5--^V7Q_JKb;cQk8;-*aZ2aJ_ldFsRI_s!4GMVWbV%&bLN*3q<}S67BI_=cPAh)i0X z5_H1^0V>BRABeOrY)k|1+6>pr)BupD2*=y#3E|@=@>1)j`uQ-fGAhx1JRB3w*^G9Ey>fZE6*Yo{y&4fF5vc!tFXMZs4KY?vsrO;xPSQQ;iEtP z;;;PTTdS*g_i{DCfA-J*nNsSW&1RFMs+vtFxOo zg8_SP`oF+|_e2;SV>Wqz|bRY_3iotZ{ALN+r7knO~ z`{6Q1eExhN+xD`3Zv4!o&yL@h|6`NTH6Y#?vX$r2x5l>-SGwH-MF!eoDLjxh-=CLq z1G2(3l2UZ&X6|2TN%vWtg!zL#W6mS{q5KdSV!+&@{KtYh>hWWi9sPn501P*&gi(`l zN`2bPdRSjxXSr8ASs$w2BJ7{`;O+M(a5Pa29&qEQ31^kro;on&u7fx>TdgBp}Je#gwYF}mk1~@sLX^VeVs&EnP5i2J| zaE8%3A-t5=imI2xgn#o6?wf{pdm3`uF-c7V9(X-dTFWlqee9GG%6OVC- z=A2lrMB-3?46Dy7k3`3qr|G%b3i>3jZu%Wx0YE?hiCRP@AK30O;hR z1{>+)FXLe8jySI~dB;N9>R?ZEMQY$;#+?F*X6b$`{V{kUwu1_H9UKEZU7x~arUZW! z{wZ;&HNGUuVA_?juQVK)!pv733jWU|DdqE}wPQkO^N?WS6pnFthFJ);d#({P)ZI#z z__gE2K68Ay=Y8Sb83!A_Z}K`it@Kju%T48P^+ER`Tz;g`4(7(j-Z% zlX!u`Cs|qIF8nH$U323~p1^0hT%T$D)K%6<(O%j|oLA_j5D4E5>yvkp?=bPNYM=F8 z)K&^7$ce!tpk(y-#YHf5@e}{+z!zC^L^A&CU zZb%wL^d9jrey;deTo3+Wm|@fz+}ta}?-)f|zo+<=3I=_EJ2$Vu;;>)Olx3_2n3hFZ zRK@Yhbb4~@RzBl9Uu0EPRCTFT05BQ?+`7I1iwnxrQf1_t7-?T{?ly_%A>ejH2JUyy`sP_$(sOH5Hh2mIhSV=pNpk5-y|^$gFmD2oEg~otU67wP=M##hK-!Mwnz+(_mux6H7xQTFB zX3j7%N!SxkWii%V*;tn~RAprp4ms47su{iv=aW8s>pPEO_fUB&DS@u5)9ACet^!%t z^DC8ne1Br9Qq^d!+GrXXQxOKWpGrxi>e))XtIvyqsf};1p)Qs8*BA!9DGUZC7E`6i zC!Vt*K~R&D@*+4p*1!49{mv{&D(0V#zZNMBGq0@4XOk(+3M^|?>tvEDhYg-3MTq4c zMi}9_BLy0Vvb;a)8R{cgx2e&~zxNnW5{msd%|E_!C=DB_JnY8sq#NZS==ij`--r`< zXq$tRRG4CtMlNWm{ZsiqR0iV_tZ(kY+WL;I#Kr|KdBobzRV z^Wyib+n$mFT&eK3_a^Z8>4EkF%KD2Y?93?g4uZt$g}U`F^9jx`LyAcCZV&9Zw>eh>**TdVK{zoxU)2Fil30MY~wFeW5j+> zt#jVy`jpB^|CxDY8(-Nw|C}!aPm+=g^9`BviZilGKr|Ssz3clPHxZ*J|2?+XBnZc3 z#TYH_((0BF96YPyZ!wmHWuPF?zq)g(!(t8pVENw$*;x1E8PXIWRoT`V3pyoS>4M4uB`T8Wl3#NWir6K0kx(^XY2KR zewo$LEjZTXArFBcHAY6B;|YeCFfFW){9;HZm*KdoSHX6zBBzH2Xs zfz!bH#6mwKnJeR#h)UYbIHzc{JVRoJiBJi8Sl=OEgDHD9XxWas`0L@QQV|crT*2fGJZba7p+cOF$rE z!ugE&ozlXkDv!8(2#=rc0`!)&hlv`~zogE8fa3C_c$*6@j1IaF9RBf2kJt@O&&xDYP;05K*y6~LxeqT(O4e$)j#3C@pU+VQ@^6&trWci(A4wu2xx6u^M z_kp11!H+r<0uX?k29i@_VoOKe=hgR;`l_G?Q!L$+8d-fb1* zh8D*+S*M@6^S*LnGo**DZ_|Ad3I$S<@D}>f`2DD+3=GP1YjGim>sJRb9IE_BQ^@nW z&K1+HXn`sddw%ZwevFHvoSu)Tv)QD`vZ`KP&f&(jB^dNDrhvwDDLm*xXm-(jXU#(` z3zmy`2H`m29`QWevopDdc~2tS`B?(LpXX8H==lm$ty<{kw#RXWLHgNrVwaFH#@5JW zN04e;ixCN~Y4wt7nn(T znk$68O7|EKa4CPR=VLt3MMUIyI$chHW zvg)3a1Ekp#E|`bS#aO2rdGR#uX$+?m#o|nZ#fw5I$Ip-5zZUNTpBK8^JL;`Pc!lW3 zNO6;4i+exC@e7CB#n*v-_}(bZtzG!Pz%1<8dVf;m5U;4~Z@O?s`FPzlH}Pw1)|X*) zRjtW$)u|i(y>&*g^sS-qe1idD7NXZQuHsp^SwQrq%41fAt^{yxbpfufC}lb-0Lr?k z#?$d^QYf{s5!LlCU(oNCyL)@bJ3H%7PL7ZF%3@qBY0d8qSQz9mn@xR!D`L0#R1^^+ zV(vYY+=wv2Ls#aI5CA5LXozc##OpgihtJRBX4B;zj;NZw1foBERD$LGWMfPLEHp4Kue*GHtAuCPuK9y}}9F^?^`^J7d4 zGS&F3QV7tzI1xr-NWcgu+AXjJ2d)>B1f z^=H&6#%9X%*@ROsyTz0UUcL!aO2;zjETmS=vne^D**rQ99opH&8?Q?;W#>A!@#yRhg;A~vzN&q`M z$aC{Vma*~D^ZfWI1TU>QB(2@sk53AC|KVep6eaWqLoA)DLpEs_@P3dYkcW3UT@CKm zY&wQ3Dl}9X&mixO zbe;*V6y#MB6jY4InK!0Z9ENk2^qa%ckv{Id=4he*j=Acm8YuvruwYgv;oBi|H;Z33+!%C6#TQTy5d*46v^-F-W?gffJFJ&jJhBlf##IX2vES8? z)C9F1hH$*}fwp$MNX%C1GVw-p<8dP?MB^#byg4HC?_Y9b2}`U^5^4UggkkC#{*UC)D{?k{6T)C;St|ju z+{HGV%b_)ihI!HUbYfJf43`d^HlL~MYMFVHUtL*^g<^!(sh=asi?7UvK+xJP_ZnTB zo<|;oHQph;PL&ieAHuZA;KBP(;mO7w`0T68ZZ7<+c#P8Jv=rk@_aSx%V$XBDB9$F9 zW91TUm!HBris5HTawrBKbMRnYYRYJgc_a|f`cw58s}P}wQm*f$P%+8!P_g5*5p7Jy zvo^_)#>lyEI5!mlOmzeWR_z%=xh>2y_F0`g(;rX6-e&!m?w=0VVXb46sD~9+3vmP~ z51a8Dy%WQSDOzRWVg&=2^a_<5xktO*dw$=|bWAb#&YDGcUNTpNi}d#-uz1~KGGYC! zmr&5O+$kGz1BXy$i?F>{!lNfMc=5&nMgyb#)9)$v#Rv|1{2rT6Y&|k|yG!f(+=ti# zp%dYCbb1CKJX+IvE_(fe#oZeJ^Vd}fC)Fj_c-GOQOnHhZW$^SIuC3mImtS}R`lJN3 z1Cyl@l?7@mN-w`rc%IzfCL~UHwZwL-jm~>_0?TN-@9Z;}yjtOaog-BNU;?M-Ggw_7 zVkoP9K`BT{n`rJg>yL*_k-(ehJ+CG_^28=tsm@2jS4K(+?llk!@0hfN(JNi|-tf0f z;h-TeggmU5?r^dMpTpk)Bpn>1JSP{XVte8Xhx86AQm__lfXAbI>t_z8XZpFSK;h`3 zOg)A;PGD(G%P=vHE)7etQpC{e(|tTE@viODqB+L5^0VQ=$E^|R3*lbgkqaSndzC)x zDLEkg+&>Ro3BdOb_Zj&@3wLjRyv68|9PZw^4vWKH4RukEC*#TP=Jwim-um|M|K9I>>D%}3-#`28XFpr& z)tSYV`}_O*U;oCN?;RZ-Y@VN-Ob5MQ{lfj*us9k(F&pblhmPrSi}tR)**N+=cF9R| z<_K|nlUiNgngrz3v)oG|_U^peo!DIY`kOVD4x!95Zt6WEOyTpbJ+{t)5J(pbK>Gd2 z$Zcb`X!)98Ja3cCx7@=tQ)52~%8AWyiVorNENe{7-F|PcEfXyKCtP7QiWe8m5WN$f zA%lbaRXAV^B^gyXXudy+nBrenC#JU+hzt;84H{q?W=L-4z(A?^Y zUz|xH3S;B@iBWe1Jit$p+z_O|(&AE&C7rfIaR%}E!h5df0mPr4JiquaUssHo<+#>k zJ?;B$pr*4C;?G9yYFv7Q6LjURYba1iT~)Ey?K{SvvfEV_H}f829F+ZKvCr|7>-a87Re0n zSZgO7SS7NqzEVM5mT>**GQ4zu8G0nF&{{+iu-=sA-hjSE2qlUN4wyOKX)_#uV&-IXv(Y~nMFHPB@A7uVa2B`|G^ z5>fJW7v*i|*~b{mM)PRGF-_xg9)qJBjsxTz`DdiCq&y4!DKGCzf)1yQK9cIC&OCoV zgkx8@hR?m(FRBoUeS|BTMTQGN)y9mb0qm?KX%w}U9|Nr9s+b|dmFqv~PD^5;M51y<&d~a=S zZR4N*(|wkV2=$LFXtq^yT2D)L&st?X55`OZ$Y}lULFC{GE z0;>Nevtk=gK`N}=nc=STa!h2_N^LFa!Em$+Pu36M(b|qq7FKxj@P~7*o`t!R{e*or z$CByyurvL;DIkLoH-coEFrha9%jCl5q6^>Y6RqOOr~-f()y^^e@z?Ntl?0Mwc8wD| z!RmO{14GIpJ^0NjM$G%Blp1{(ot-KB69~KXrR+bdjHAc7K*CE9#+lY2!C=7fH7wSQ z;nPAfANvzBXi|wG%NnVH%QZi*h7e=dabUK6g-d}_13@Z|$rG$^;)1IbvJWp?x zkE&@L4gh;cQ&`_R)TJ(aeU;!&eX9%Ui5DxH*}@@%>1o$g@3DJ_bX7nwT8k-1!e@c&&=P(_c1PPw#?Vg zNx7f7eRN6|0(N}P82S|QKXoeGTtwK988Tf*O_{UZ`%U<@O_An5+y0#FFDCT+ePz#$ zKX03^f*B3?@z8?y*mBuXFsb4(jfq<<+(1T zTo=W;zGdZXrd$W$#`O_gU0sBp#{QKq%R_@AP>c(LaN}wPG230=0u}>S9PsX)X2v`A z9l4z7O^uXBX|tF%wKn8I+9duvKEvvLN0>qR9{*e()R>Y2|7^M_ZJ%+Eju_$~2CUiR zAsC^}JAw|BrN_Rjds83Xn>>R!sAHc-uKKfnU2(i~C`dN#n*icdbSV>M>!LI4#&Aejgy%gLTH*Rvp%T{Zk{EI! z9LpKutmt(5LWGa|+}_b>cnw^B5FCq*Bi!Y&1X37+6{>vbN~g{m*Vw5!xe|u-Iad}?RZxujQKQlDI{xHMNgo?Xc7aK?A}|U z+0Za^7ZhKuI9K)W!^i8ey?+FQ;Z2>_2vWmY4H#TBhm%UshW+n{Es-V5?9JxO0jkLb6}-T8%nvw z`l0u|ZxXTrpHtgjO1>i;hraVamqr<%@8kW`UOJpC$v0PQ6K%AomFF5U_(Ch{FqTQ* zQ92v$x=VU3p-2^w=z7ja10>v2atwzBg&^`dnFj@bjEKu6RyMPbg*qCArAKQu&xT5X z97^bArOw-O=jIjY)g_e0l$2+6F`iY2hllnc2I}%G(-mXOVmhtzYF1ra0l0o`2n&4` z4>pFXn%VeK)%+TZz96bKuVonprdQiqFu`4#6Pn$j=i|0rHY9){!sK&G%}X*yZF7z> zvywTCF<7#X*k^qG@r&K9kBh)Q_BmO&;+nB=uiCVV{zY$w!9|ocZ1!G%s;g9B47)mJnD@X54c6qZOXy;pyFSw@rJAT+@1Dn!fX&Jde?9!i>o2lqx##}hY1-5k zuADZ@^Lep-6qdcf!tatw(gUQ7@v|(el0!KPMP?6`O}al^hUpAoeRCf+cWY27iM7q* za%B0BZId`ZMmzCrqYLTL8NlXt4QFHZ#88z;(Wg|02NC1G@<20R>R7;%&MURL^SU53ShkJ)wJpH}lS^Uf<;o7~= z8%i&#mfF)U@(LIJ=f!#c8pT-%_$&T{Ytr+t-)i+Eta5Wde0Et9$C} z*|eO^X5K{!xbC9Js^in+^Ru&)^J02l4F>>sZmhtSjR>2*}Is-U~Isb{`|q zixDY)Fug=89a_8}`HVRYL?|NjX@XgomVVv|<&AqRxDkROXWE^F&d248q>Eq@wMh*> z7w$=DvB_}!n!7r|kevfs88Cqx{-9M?xP`I0tgeG6j0&)@ddj!p^m>BBf>GFoVxR^%?bv_Gsn0{$L3@Y7)wOt5g>n6u790tftRIG z@B2TY<^N(*TMEW<{_Y&|i$?cHTCAKU(Oo~Lu#&+gqZiln7B*VX(2xq+>Db)TIvH`n^?IEfp#j zX}-Ola#qaX@MH{YPY>Z_s=m&3_)mLaOqV7ZtJqGY-|_KYw}!Y}ypg1VKE38bvb%vf zZ0{BDbmIhyY6x}RXQELl=E|$t_(i_6p7QFfpqib--CI}S_RZ_YX6kO1&-g=F#*44f z|D**%$_3c_6ox1zKr7&q z7KYv5O)zzI$>)P&{iK`ZN%&`OjChD)jK`7v#^eTB29NVMoKH;6--8PCgrkJia-Mis z87mTjw};8Sn$=A|*xF==P$3X2yUu42!oZGU4x0^gXy6$fzNLmLGMqvUjL!oSYt=O{b;=AXfg<>GydnX0zV$!}s5RXKU-}yCxT$yz5iR|}W-dGjQinBF3$kfG(K%dl z^ZU%^dNziLE-(WRp!4m0TffW=y}r1h-`sp8kd8}_TTz=BMh_VW@O6X-pT*CpMmA<^ zXQi6xEmkw!8`&dO2_-^@CWUUP_~61u_w&;2+{Wb64l{PYqBpaT>1>~jzMB8) z+!HpNGu}GfKgJO$B|v`&lW7ePK6nBL$5ZXKg!0>E;Qx7rfBD{r+1z^Ft->?EwQ~wj zH}@dxFGAKE>IZm5dhG#YrK`+$wKpGW58O({l8)ito$GMt)>SC2;vfZUU%=3xG#Vv* zp-J|WemC{I|6}iqQF`aS93~~e)6E+84r(Y$rBLc4{I{Nk^E?a_nx-aI) zpIKy`(Vvj1ugQ=|-Dir)EinvV1)6GE?91AWryk{!Z@ zYtm(Fx-a~mraTOqg+BA1-E$1h&^b>!Ss@rsC1s1&$aCiB!xeZOJa~vg>r42L74X?t zZYfSlVxQr#*O?{k9H>A2xGAOR?GID9_!d$;ODWnVf9K747|`FcAJTIBVIwhGh`zN`(O|LRsbT_WMs@_uxp! zbYm&CkM3+H=k2ITG2MznDPwMvWKCEvaLOxi6yg#&Xc76C4f&>!%ujUEV z*Ck}t7_#~tUc7e|?%r0F1lS(3b29JQU=WC&ZwVvUcSLDm>YGZsL1&KyEv*E}G94E2 z!IL96K2-oz9uhq)8Oa=E0g$@iu8J>Iu3lcf{}ZFEa}W-6sFE0-tx$B+E+ee6$f z_+uD0l@?(QH*LI`*9QwzzRWuzWu92$XG8LGnm${#I9Eo*`rx=*3j->HA5_H|+`6#> zFWkLpk_uMk`PuQ==GOYV|K<0;{D*J8`PDT5n7}^+KM5eMr!33KlP6Dh&L`)4XXj_r z*|e(e-dTYAw^wVZ$5~w$I`%Qk`p{P?2bdR-o^)lHPW6FGOrTWGk<5lo01g@BaC0TF zIWVnoK^MMbefroTifw9FCbU_gY;Q4Pn)e+L7VDW16FTJq<^Rfg#^3kfmB|481Dzu1 zKGT_2=6Lg=eH5QRFIG>k!_6nosNhTfUbOFh_$>XG3+s-z<>mJn6K&&YeY2xw4t0_v zcUDxaxK6axLmM0270d9LJq_|77=bbr97v&LCQJ;N$c&7FwqbA#1F9@|q`dU0qQ*Nt=ns})Jgs4U{Rq~cR&f7X4t>Sr356tAgb|oEoJ?2&mkFJ0*nW?n z^{%J>=I6;*yu_LxwqPD+iW)M}GKG;9Fwqjj&p9d(3^C3_E0B{X{5#<0&OhrO9wZxX z72zCqKK&!a#$|Ih&*(%sPVJ3~5p@<#Vxd~+xaA2j-I{W3PDJ=qm!ow%qu(fvzvrpcFSy{u-RnA2}a4PY!e%+yhfO`+&Vw#+%2X{MGUH%B^@<e< z#ATQ<_`eR%)0rj(yxn_S34rl2nrAtG)U6HU(2ThErIY z-&M6OrPM5Gy}rk$JHM`KiE2G%K(9)eRi|+Gj`9FlR_^>duR>82<#;kVT-$uQrP81% zYd_5+z^u#5%L<&ctcGbhE6Q>jyI3%GZgW8MB!%; zQPIHex_jPdww+}-j;p%fgjH)1*L0-}{Q378)V(7sDYjTtLi@6;e&E4}21{xcB=DkmWJ%9MU6*+@YNF?#KfnN*0bF@l+qw+OU&PEG+))xvobbBn} zwt$v6DC8@{`NEaw1K}joi0_8%aPh>PbUd)|a zr{J=`v%QmiT$3zAeYw#CoZ`-a$R; z4s7~7#pE3#CCqE*qWpy4n!fAWLhsF(?Bk8fy^qW})`_k?1rx`+p%;wKy{445{R-~f zT7VnZRVx1(U9hUE>!O0G%AH%8ihqr2?|L$s71PQ2q@13Yiwgj^Zw|9-R~7-PnTjjG z7+zgchVL{xz~)b_&EOb}h4RMERy**+n&E^fc?`eD&S^8K8O+QFvqv`9Z0=sRqpf{B zSd(N7SXi(&@f_`Gq+TUGFT%hG)~VL%@|sMa+Ix(hrP!{KrHP~Yd0KbHj`vB2cf>jK z7>uwlbl>q0GI#mc$U;AqPR~w!jk6SB{GpzQ={q<7;~H%(_?g&IjvyM9ccJ`bKevd? zqv&k$5%3`s;D7JVoPZ-Sgtf91W-u5o!(;~V&2PUA`-f**0Z@3kJy>!OCuMxBT9-;D z$!3r*X_Wa!;xb(gU2>6i>t}?=RF5SbudlbA5+-Rwb0XWMIdFPf$twvYoq4;scuVag z3t7Y2Vm=K_P-oVu!cC}qN~Y%q^}7$&6FylkM6v9`~p<4c=zT?@BZCuaQOa2cbxYX zb7-!Yj+NvZT_b=+_;o+t68|>QyuO9Y)9^|p=a@m#oY_(~(`yS#j-* zrQXN%AlL8KC$-E?0)W$~=22Pu_nR0K|u}XSQ-@%h4&bw=}%@(&isl?;2O+Xy=Sb+QSib35>Yw(?lpf zlJ+V{VkYmE+avsn_O*_>9Qso>d9dqDy9D8}B+B^bW`|qqL zK7w!_4?gZ8*zx&yX)$jY`aA~HlmOh+Hz(+X6E!2la2#EQniF{aC@~=pH)C`*g9`SsIbF?s3_~=QT0A2@H_@k_%xtq&pjqHz7Je z=Z@b{0~0lgQ$ynC)3AO% zj{Ge4tUeoL(Ukqr_;goTd@g5nB&=i$;T!Ii%UIjqXl?3#@cOF6OenWxLbynz)%ZP| zkjd+dO5X53EOJ$Go6-hCSe+8XIi`lzk*fKc+JA4%NYnG~@$)6rcZ?|TG5DPEocBCN z)7@Wu#-3>%pH9R$gR-n)Fj&$;!lS1L@cxr2oS0){=a@Q^{xsa0V@W8Xy}u@gCfZ_e40%5AYGJW=EG~@k49tp9D_@@eBJ_t>VeRQY zJXu!>ja`AYk9&*JQrYC*`TUK0h8p3%qO9TJ<8|2IKZV|40hG~Nb9%-?Pc1JS?6p5D5ewW_iA|UmHTjYbvYQ*bkw+xXK8Vsh@Ta<{z{b{HWqTOF zz>}w^aC$a_tlxuPe*ksG?vyocR7MG9JQrEcj^uo$@Fea5(OwFvBH_YSwxNACrGJHT zD2nThf`B}RNYT+v*zoZP=P&v1&(dOa%l=IXN6E@73||>j_Urf9eDpiop_gk_Ovz9! zqsw>_+*8jrz?2vznSpq-=sFlb>EPmc$tE~;y&qlSo}##II3?DPIxmDf?3ojJ8;B;P z=4^#hk_UKsP^~k|p_lhC^v-M(?L9yHv^O$|uH;Yo-H>zcv~JHp9bZ%Q{xWZtraQym zo3~P&v7OjC>h-I9dpc|-5>jGdr(|)Jv{k$NmlJs9r8{uz#ub(PA7;h4*x%nfc<|l_ zU;CXeed(*m)9J1v6=seeC*;lLZ~o1{Io*1)wYk3bUB*^Qwj1|iZ$3xKm!kwa!6patFnq%F+4Z3HDQGuALfl4!DRVl2H+qG({k z1C0A0;bEf~H+$k0UiQuyoeM5(rtlwMzhp>LN*2i&`*%Q=B8n-OP@vXC-C7?Q7jFq{ zsJKFykoDixy5|a7>$WKAMW{fFtsNhc&-28tZXLud$JZIc+WX#4-;^ZNrIZW}KtwLi zy1cWzZWSw=Xzwpt=G5FtK(RO{MyI$!BC!SyQ|%ehhrw_a*0+veeRIdCZQ2{{=ZC2# zh|v;x#-*U-@de^M1$#^uH)ZXC8Xi4ehy9~d=nqCNxm}31>|88=pvO{zZ>>v5)uoCh zt>KlI?!(HmE+%ais1A2Hi{E9zRN_1PxxvSjT?SK5>xE6jr@_1e7qJU8 zPnMLG@I5{!=m?_)zVeQQt!Cp*WapSr?0%AgIUYGBuQ6HihWx?VYhn#}KZw!fUQos} zKx~sETX=E^H|3-(XS|J@D$zoJZI*Ab-V5^l$_g>+dz0UU=ap$`7K+v-T!1pVKOw)u zZi}Vq{BI3OLk|%4MybkjOo107>Z*aDj8z$0VoDOz*<`0c=E|Ub54|;9_?-RJdgK}J z1Su4oxhHdMu%ra`zSLw<<8Wf34-(Fd|8<@?BtwbMq_SM_CJ;4>g|e~#jC?=SGFnfq zTPbbxN-J%zUtO+e(?Y?vJU=@b?;dQged8N%Jh=j(JODh6PE<|txzByBx_b5MY}o5h z>bk6^lS#cY0(kN66<8Xol-e_>D)qydX>C#BedFfhnH86jolnfr>;w+k@;MH?KAaKP zQ-ji6N{cQyP4@AewB6XcPbi#5*EnG+2rMs&5kiTv(;xYQUOY<=5m<4D*kk#e@N9!| zcjb%EmPke(TPnu-(%2cipk%pY^v-|G2``o@VcG+d_jJfc)ADtJ=Y|JN$hQ2D%AC0z z8Dfq`IpirCtgvquWaLKGKeAk8k#Vog2UZd?oUB0tSPXudn7H;v%7>8kuE2NS-GYaY z4>i#u1%P8IKb$tNhW;Y060xSP5DIOMuYA#Q=O#=essOR!5cNZmufxhhuJdE~q~p?}k>`g4S>jB*tUF0D6yYwPh>M<$M5wHmH9mzd(br^}tg`lojs`bXnXEB>Lg!n`zi8AuP;IL4E_ zSsR<-dDz4++-hq;YZ$AA=fem)(MLncNUcB*ls=A{A}^z!D^->&SQ_=<<@+~ab+HG< z^c;G+Vt^{33o{svCZo})>U>WR4-czZH7&-)WLnH7#ljHkJGVw~^TsmtvkJ;$qNDd| z?Mj#`O@Js_GbrxXUfL-3a7mJ+CfqTn4#p&K`hb$$OgC#<)9*10)kRyI#rvWRa9WcX zh8J*4l(a@!+1>tatPZTkyr&gq7Aw^D8LeM1jczcLR=s&)z%yc!=ZF2?UNCM&5lEaZ zPmV9$kKFIUOuT-j>|m{2Vr;Kp=~ci4ZQ28#aLC(7nnDAdoYqvXUrOr^b~g4=oDEu| z)1Djaq5dj73o+Em_ae4870)c~1u~D)E(U!FlR- zw!C!+7bb4CZfkfhP(f^#F<0aJ<}s;?rSA=)*I$Cuvni}^oWb^y5?6iw^@q{g;Lzrg zq1wFnUg8?ln_l+WnaTlh1m}|qh6{^Yz%32`B`!r2AK_O@NSJEAZgph=?%o-~NLO*@ zDi*SEJDh&m%9kd%Sd7Q-ouN6LFQG4J=9|0w@Mvutdi@3HD+Pcb#gD>@K5yJhj_zC& zZ7>#KMi>2=dXE}9Zr^lwD$+H_uh#n61hWY4lK4IKF8=G>;&I*G!(*e9kMd0+t??|m z=0_==tcRzh6)_zLuPULf`}|-E-pm_6zP>KJs56R0@b}vB zjy{hSz*_MB(qfI^a^V?-Hmv1cu93ZKS7!xoTFV^t-6kDF;8^9HwLco%XU$HI4#()U zeWt_EHCsz+y5vPJ*WWg zs9$H*bPRP>RK;vIold7S7>}#ra9Fn{0p#;PI5|8!*x%beK0P{~P0v=Amk0SPFW-Sj z8&6;|JA>iUBFqYd}b-^OP-hXnCU|q3adC4t=}J;T`2D* zms1mC)JRjP+&7hLFuTwR#fuwBb#7|rYC(%L4%m1+uv~LY*&?5jf|eFOJw`yz(_A9b zo^mZJcW<&d4ZTRP{}@y5H#a|@_($Pye$7?pVTPP^xP@`Srw|ol6tvb*!;CB+^yAhf zk&^CD-w}2O`F&tWlitTL5Oi<$JbA2A*ySofS4>vF$+%#mkYzHTo5V>LMx=3Pz(*m0 zrpFPtDrthX+12x!0VN?Wx(k%8wuVY&L(OXF_Z9%M71-Q<1P>n_!to4XsgKqmv?NOA z&Jk;l!kO4YNdveoPHyqa3k= z7@t_Z#U?gbHJy@1Fgwa}W!@4@R~il+Ka-YQuDMA`66?<~*FLN4{jTqZWGs!9L%`WG zb7m=c4qf;RzV7BKncJA6&i2WYTVfylEIGIY0$i$*f{^ec8;>hK_A+Ew$el8pP2*mQx0x(H1dZxp{v-X-pIxqlSRF$p_W z*qEj}xrWci)+wxS9YEfDLB}N{X*YOBJKiyObrVyMN=^#RbMw%T1j#=o4R$othD}+I zS6@Mn``{=0@-43H7q;AhMwmO+#CtZic-DTpdrm3WMW(Zv-96zuft77Wb0*AE!fAFV zbizwPD`H9nA_I=sl!?LB*}zx#t2w@%IrVs!`Y9i#4zJ_G{JUQQ_oLv;r&oi}jul^}I&*X$g501GMkoI=O(;8sO% zOBfg!D=-qdCunhtK6mLLB?nUw5*&%I(o3{n94HGf3^JIVpTXj=g4bVt0j{nNKv9HQ zF|H?*@!8@2-uBVK-hp!KG70|ua}a?5eCu1^QV)*b`{08o-}%lT|H0P!+Iz=``)7-z zLHWJk^D3+?_h2?TQAK7Tsn%lJ4NuZGswb}bu$yEqIpWhu{9GPtN^Ft{OO4|3mR$2f zo5(d(Qe!5CdhduN`j2WWBTX`jDMVm3n#u2YJQ0iK@iNf*F-MY-b{aN%!FdH({2z^J z@w4AL;nHQuPOY0W_<^Rf1wqCbZCZzX-#x@NnLL9axVS-cMN^6+P6*|E;^!ws!nP+m zt7J9z#)v7DP)Or`DhRu&{?I13P9x>)q{L6g7Kt;$7{#%_-SFYy_dRd5U0g;%W2rmu~e@VDD+*`S( z*t_yu7iQ0m?1%RqIU}TLx471nsH1Q^EUN z^u)KA`}bVZC@QbzJ;TAd@_(yzg_!U17 zE;bj(;QQ~-HFa<>Q@B$!>hvg(>r$V)`)Ba(duuQ?)s3*<=Ouu)w@}g3{;d7Ii&Q1v zRsZy|48|qE`ep%#Cp8qc!hcEw2$sG$)v&+LiQ$dpBV;Bv=x^ z=H`&XdC#vA_DPIszM?geyRC9cJsj7tzCDG5;|b*b5#%ZXAbZt1_;_o$p!V zEb~TZo==fJkMUu22ipY982=gj-i;RT!(|&!DWiQ{*tAyuj^v@5=E(7cw>B~gY9Tbu zi}Pm3qL4vvtv)`Je82Y$lUuOAi+Sn#%7t$Hftyo0IkSC6 zE#;f0b@RL|I#(B02uHjS8hFXTMrv?zGAv$uDACza8(6|*d<@H@96t4lmteFosAtn@ zT}&sF{k^@7ciw*ct8cvV#&>VrxN-Kz8*g|O0FnxTfBw(^x$1rP^!@j@zWV!r@a@C> zowehm!^t4at53dm8?LVOp`4wY5CCSOmiwqRp3HRA($JDbaUWvgChmhQcP`;ehZsZd z5>JGJo{wqcTUrxxyG)|kjC9&p%^!7IKKTxLQ;?RFHctIzuteNLEtm;c@T3~A#*k`l zh@STqeM($7tfOg?$g%Pzs7>SZkjQ|;YTkWi$V_|_DFtkw^L~gi%P3JMGXgXv2GnXv z#VK>v&wZ~x@e<-uVFkV2(nZPIIO9qM_MyXF<^wPJF1JL+nkR~e_sVH_nqx8b9arZ< zSx+(EbA59k-hO8js0u3OS0pt>Ckrc1BAj)g9E9iJV)J0Du=S=*=)ZRD)XAa3q)aJT z@(6COG;53PoadIrDsDV;y8!&HH;A-U8GMFJN2qK9DKz`NcE;T)W^Zn$(}hrWZWIC` zsRE5G#TPwSmY~$0J0oy9SCl9TkIyfWY1-=+iM6iuq3qRz(GnaSjp4ly9>KIizJ?if zTiP6VJ~pS0p%BT@J^VV~`In=ryLon|Dgf-m$ru27BPc<|?aMuI-d;K(vND|Ln)Rdr zM`c1WK7-Z80lakY4)lq4vzD?CH|{@dZLp$yYtB=z2Sp9Ay_doE?hK}-!Z!n?50-(B zC!kP0Y2~M77FwDh=o<7i1bd`@*0n{Mu~g4(TpP^2uk#)Ih3U4L*-eCeEa)W2oFAIJgYvwjxWON-XsP2{d0SQKP6E$Au@A2 zj=m^-&XhLDB$%}Wr(~5bJb*~lE9a!~S>jd0)1otEEV(bZF_MiqMe{I;OXNZ9bRTv; z_zN-ViT$>+C{sXbd5hCmMcXJjw>6i!b6=NG&Q9UVat@z(^)?Lh9Ll1s%5qj59Ubny z`|f++{^mEo`RLxgdx|=A&jDZ-F`Lbbli6%?dU|v+%c`P&@$L|AUmrq0FQKed?%6W1 z5~AkW#RSuOYCnCaecojVH!DsTmZyO&1W$+SpT(@EKJQjU}Uq@DgVj_(jx`ifFdC=?0EIJOS077iE1Vb7)UI{49< zuqk1$-91DCR)Y zL9Yr_ls`B3#Y2C7=|Krc&qx^Io7^Bw@#~>-e-EsOji?eK;T?{FN_XG7@8e4*J$my( z&0l0^gtw&r-Bx|^J?H3N@Q?{S$9}v#$piA-aT&|X&CRX7 zy}jLHb~3xV0`)5|U4@mE0gT5dnj7e;z*-)6uHr2`K^-R@7g#SwG^`NAt?>;A3$;Y7 z4m)FxGp{~&v#SDswyDJgLn*AZy>CVopGgGMfr;UltA*(yxKisGr~amKyh|&}hQu1x z_vB;7lp+#t^m{O0u~>N)$cpL3kEv%&y?UvHkZWsdT?9I*tcl$NdXBpn<6W07Ma_aG zopb7o{-&m_KM`R<_GJh2LOoLD-^iLvFGU{V;W|N!huQGE?cZ|_1DBkI_knKyJy=}2 zqFq1Vey|BgXOz9X_G1p&&|KN0YeH*t8sjq62~XLQs8m~E=!{%j@LZA42^J%W9(gC+qo4l zHr#=fl83-jmKpR1i!d!SSl>Q_^{pBvJm&H_w>Fw!X(6YJ(rQWP)JYlmlc!w6ogqb? z#iCR{_{ibu7(RHk3A1Vd{o#^!dq+W6DN7tvOiZr7H|(BN1(d}ZT)j4gmtMRIeG?n6 zbFnn6wG$6=fhO;`o-?zK*{0)y8FQVflCR{o1MvRir?9?#41?hnfUJ*qTr2Dt{Wthc z^E<4}Y>XeYe3)V0@k7C7N(%aHVOn75Z>=BlrkmFStJrf2*dvwVao*>&Naz)=X144o~x0-96W0 zvQ7-Htvmti!zrNE-%hEKT9f%D6ijWoU|tDKvUtr3h1B0PP7|Eunu(Tpr7k7+V6JvrLh*;?P<-#r_;rHLhNh+#oVQ-$&anu{%PRI&;T!z>HFlo_tk9Zah%i^4+xS0zO8nGCX!;Cn2_)7&|JXV7{t z))!Gmcq~PR!ZWu)k-$%&(6zs54TL=HpDuY=gsd|7`C}qSAsFTWQIj_XGJn*KP9Qp1 zfU_yUlZ^>HUeDn6Re%x0diES!Mm^L9%YBtXW=imspEup}SYP}-Z~f++dk`RlwT)MG zYtV`y<5^~PI|liow~&7x2=sWyxFv(EE|ypH3=wU&I<-cb95jY6V=(E4KYb;SP7h&Y z|JmGh@>9BdRG5hH2r0O`mRzNCB|o$ol9G%(dpP*SF%Qyu#TmQct)LI}k&UIaR(m>! zvL9)8HqUE9K)8@x0@ObY-|D*>5*jj6$++^=Ufa*DH-b_$51^<9aBw(-$LkaL^s5VS zeTb#u-1Hd_Vit$!wVMK8&PC3zjrKQv=JlTtO1RM*Hw{0;>zzSq@cjPK7}hrSp{$3{ z?~Sz3k8&L=XJ;>M^kiXffO-Nwn83{|0C#U;AIi&s!Y{h6_41p92|tg<9nsP(XW3TZ zQV@FdWCM2g&tW*a0+p^+>k`FjuGPR)-&xO{+3-2uRGgLCO+h6wGtb+3GLIN8%o@C+ zzc%?dC>IF{`Lq@nPa~9cb!b`TX%S=1(HZ(X&d)Z(KWq8SS1h@s!IU@RJ?G&QRt_Q$ zBQD_cMPOhX@+H2|&-i-wmv?r|uw>jKxdPD^DZB*_L^xQ0*}>6tZTJVrBYM;JJR=Ad zdH6u^i0Vv|mu! zaN|jDLYKKTLE)SVXV1nb@ajt|@Y+lFVVDEVs!4fza(K4AwfXM1-g@&7zWd$pJ^_G< z$?F%iHcD9L`S|!tU;0mPZ*4q%aC~@hT1<=L^_TC$i}!CpIX%}g2s)#tI9RkQc2o_a zVe_yd=KPvf%#x6>5D{T#2_R_a;)smUMC_aHR=KWCKHKJ1@cap>L72<}9_Wju#?x5x z(PG@xGu8fN7v2civIc012@3jbu=tw~-R(2+s9d~_cdD$PZf)$<==%KgV6mgO^3;^l zbBMs1G3E3So|klIR2$U_CiYnutBgGvrcoq@k)o}yc~3kT5d{1-gs;inXpVPvOtsVa zn^-iPe%JjIV`33^x}>0Z%9X^o2>T}hZ$H?Fqf^Du=1{6E(b`p>@J$HwwsLDtgqgmN zYsTa6cWbeo3emU`UF|sGSf-y2X8b5~$f&Un+LYn{8Z zh)rZxXUwv*#>A|o#&uO?4C*hzcs79dKG=byQx*BHEWeGbzO)uoQnc|9ymjF<{MCDL zl=d8{z|QUc8g}T*RN%L$Bz05`Aq;K~Z-5i#i% zo@qVL-iS&IN-bm^I>V(3|1y7%XR18nAsio1w0DH^3@AOna8rSSRjlMfBMEYx6Y#Jt zarY)sDs~bV{JdA#@BG|I!;k%qD?=lc^)mA_gmf)xvq+qG@`#JYk&EhET&ry1&po6t zWH;)!Dn78(+f!E6jVCE}V##n6A!@dh(0YAQ9^O!DtBj9ZqA$`sK{hzo{-^vC8`5H% zZzMxFJHgeE39o;;79?wUJIJceP>u~Q2FDT^+7ROi+~r!`mk!sZTE@bAg7wbZXfB>K zYZ{-k9otexU*0hX*`aDylAVR)WpxF`^c3#hy#cSkdJk&N(-zfaayHrD-+B7RAN}E5 zYin!UDwN;k^$S`n))eZsCHF5~!?(%tM$8Q8+8PPwdz*iA|MOy_9uHTBn{>Xun7w+*;YCzZf#H zi7WI=?lZcqq-|!}5oXaAm(c8mVW+LN!S3}XHm)thBjn=PL#CSI%Q+(%CkQR0GPp`6 z)}NQu#7d&w7@{JiC@j;KnjMibhiDxEVPP(8A30MkChxTKE&COyKx}NLbX#@S4|jx8 z41LRprmUddXCej>j|GNgY^;=m>tJC8&Zaed>#g_T@Mxl$<5`J`V`2h{gHwcoZV{;G zu?kXO^gYKx68~_aPM&4Dd-yyi0rZHFPWUD8fCXVQ{=v+eeRU$A6bU za_#cG&Z~fRG=N}B$cxhlJYP6Ama?@EF4AVOiT5Nf-O)mn^kws52N0mta~A;GOrL!qL&G zo`IJjEE50Trnr%CdX|>*45II1u;G6PTWfFdFXi-dKi(zPaLz9#<7<=0WaYrL+CVbuT! z2LL;}XSy0p-W!@s7hD05;vdA?Xac-+F6UXLu;tx5i6_ip#4CB8J*jiY28qtK9S`7; z;a;{X3u7AI=Fv>Q;rOyIM^j?sa$YpTyAggTq0w=Su^}-5?IxFB50H#f6C=~)=+w$_Vk~AheyE{AEJDVGK?(N*ae(T2K%lB9F zo7Y$1L=~Q`79i{Ope&gN&@8?IRH!vYNZ12O@iqPd_BDytZATB7>#=b>tY^y^<&4*G z#2(F0X!mVm4!XGYd8_lZRO#m=LXIgO;{7v@RSo2hj3ZCayLZb*h(|7}aesMfQIH2mk|XOEAs zU60&t43t*^g7W&5^Wx8h2+7@JHxBlTrPefj?AXM}m3rR@K`}_;JeAdw*1>Zskc+ca z0oz|AZtVQ*kdn(=0(X6LjI<8}T(=8LFxgAzXuQu}udn|u^*uLdOM6JT{WAcw_g2-n zMfmC`peQRCEG)x#GKFt{_Yv$Iegfd75oo^FByMw+rTwPsj?4PY-uDDUZcp&z135D* z&wH>3Ot~mwVeuq$19LbG?=3xDmL|srv&yOGYtEyX$`BkJxg zS0K^@T?8l3bu#jJ440B(#}l9%=1HH@bo6H!ses?;EXpSQOT{XxI_esJ1-j*zhHfJX zMtVbiIgJS7s+=;^JC|EKKO!r_U6f#H?~=0OmId_s3ox7X;r&M&uzT=50Iyy#wXj{z z3chCI3bF>+U8GrDm$=U{C6>3I2BjhIODBXOrG-)YOpg-Bi@cPs zsSu%NsIK#P0Ni|DPM_=dU2m423Y_n7jQ^Q_oZ)-lqX~@((hDFa z1MpBcypL3U%Sy&kZwr4_ZFD0=6Xd%lfu*UFMf2B&+}tJgM%W?zbT=g{AxT|n9>NL0 zwDz9nWoZPu4+f4_L9ap-)!tH~VMS29N#p!_n~%>(8SI0z!ci- zzBht7r={Fefh)o(Cxahf?b8Ugrb1yW%KJih-^pM$2`d@#jNgh9`k|acS)RhJ8_V$W z{Z&|51~}R~sf+3P?D+6tXLDm?^XPb@6abArT&*4e-~RTui<>uZp1kq3KYZ)mx4-?B z-JPeKMR7WP;oi0SwU=+#b#U$B82BzrGb!$BrMPgnDF;v-*F8kB{~v4MK8bGoB6b>Brr70+?y}g z0;ks`w7!9$pH@tvkndX)$pga*IHC`wkVz%5p_A1F5uQPpm`PApC*f&<${=&cbOvOu zf$iRG!a7bc?OAkiBLRUcZHPG3RSx~(3Y2vp9zETLryDak)f}J8TcXd8!B-q2bl*II zDh3xXS)RXF5(lJ|izx-8{jN3YX?aahNGx;95Q zQ+PQ}gY25vnWkI_mJt__Q%Xg&uJYP`&I`a(Sef(&{JeSAP5Rt2N)k4aed1m(CRB&| zQ;F{K{vu>qA2zr5VSRfBQzIl$4R{~64!gzZ{YCad?u%@4ANXhVPE3)?c@q1cQo>lz zCI`UHt$kQq-vY=6%))Kz`PlF#2~+|6OeMOU!DM;{w{P8md$(^{Im#{TSp~~mfaFYgXjU-9=h zb_P-~h>XlisqvCa{8^?5xa2191OHpomKZG~S|Pqlt~{b#Xu5(t4{?mYwu%|{cN6JM zo-J-EmWeqd?@NPFia)0_fkq5J=Dh8UbZIz-JA29SW25-9HWd3Gb{07tjQ3g~d)epx zkO|^9-JF_*aZ(0rgG}Pi%e!?EoD{>kx{+cq*=Ga)%0m5k|ETQoh5xp*W;$g2C!2wO zUiDdOnY$`Z;gy$f!o9oKA+KvFrsu`c{?5UpM~}YoM{j)PkIM7IJ(b5Vqu7#2>k>Fr z{n(HF*yOD@-+c7&;d|dXKHfh#JvuJ#-M(6V`g>l09L}IF$NDfKB2`*ypGf%&$$a-- zrsH$EFqZ=W0pU8d;wi;8>r5{u2LZiqh+LSFnW9n9s^^#~X6@)=l}QQ$5*fu4T6JwH zMv~SNGBxZ+m%t(TR?Ty;TcSh<5go<4v~SDp^b}!~FB`4c-Y^M4cy1mtu`hqznBYJu9ss_ur9rxMazv|bQXB;!0?d}j!W@W2>BRpKYEU@{2+X^|-8^#Sq$ zoSeG~<`sgy*<66F)Dc@nj>w~Nv(J*zfBFk)FnL6Cc&;PTW7-rC!Rwe?NNdws}t z83gJFchHiT$kMq|Pjgnq4DQ~#0e5a)cVl_su!6@Bb9^2`XpUIGd*Ma+!c)rwN4otcm`QeI9klvc>cbbbbN_+ALw0nn@DMA{wJAs?2;!T zxUA;rLD>A&StYXJJ9vn0Y*u*2%?k~AQAj8hFS9st0~@xLvWGUzEOQLZ3r19?vObe| zfy1m}PB9mLI~MnraxnMaF|?e{omKqO^WJfX8t!mwVRh=t1KTIIbx+AA45}k|0BDY#e(%^uh6ugT(_2y+BHX>T3e)invSL=A9UYzRY;8UG(r^66J9)l+{LCHzs$IW+y}okg z%A_c&lkw#I{N&)Iytdkd?|JE0c~Vb{QYnykB&Lv-%2d7PI6 zghz+aQeiDs9+VyUkY_W(zrnN)&}j`kE~ndJOEI`@OagyCrge?KLspSGs!g)YlC(TZ zrCO0X#|dp;qY)NOLAyQC8LQ}5Y=;Mi8u)sZ%94+HNN z#tJyOEQF0!Nin>lT;Z#102K`2@!AeNU00rn7+2WDeg`m0oY!aZ2uO{QvOu}gSHkm= zqa!W!kY^KqwY_%)o7)H4!mY#onCrjehah@(@NQr-DV34FpR4TuSK;Q3q5fOnak9*r zIm8tJX*_(Ht!}#`W=c8~Q6&JJPT=8_r*J--!Em@>L&v%>=kk zz*&>2+8Ez=ts-k~DR%OeM*eZrvKso98*cv1_6|5HNS80QqyqxUQAD zD$HgID+?uj>a|;N<7yu!W0elJDyP%)$#gnBT>v;6jb3d{;o3<7@VU=@t~xq8D)x7F z4tKY=){YPN4~G4!eBtg8?%!F3URJM=I8)c3N!eQE_(VACwZsrj*b*>1;XNbMA=aPjGaDrhGG^-JQk>)E-LN{smcla(Q zfO26gxSuLsSamvp;cyw=e*Y=FzqV;K<8JQF`<*824o3NnH+@x)dQec<(EwJXb^f}M>9`CGCzo9+) zthv=GMF+Q9OWfFGotaHck??bUcM)Vvs^B5j#gp1*mw=d;q<{5`6Gv8y>H3=wb97;9-bdAnBlBYHM5x zH4lA}zen$TprEHc?@^$-{#dR3qyX63K8M5OG4ux`?Eyg9*In%%q)i^4F@}(;Qi%gA zsLL7Dssg~M4|i@a!qruk*MW>GBqTJek1wlr<-Ke^2_CX&o>6E_alS{V1w2~Yg`&t{ zFj`ch%eHySTDtT}B|lyWkG4fV1GT{|*5uiA z{7sdlg$^I!dGmza2o2Z2TOl|VCKcWhy}saz5Z>|U6kj*FuE+1H;%79^n&97v7tg$V z8;4mNKijo6@!)Q(a2z@ZHvE$2-|I#3t4Ehx)JI$C84k< zp6ywbvb;~;()$#O=+S3*8IhO;KOxKDnteIcR;OZN?UrWNHO$6m(9a6EcY77?-5J1W z05F}LSCjLz^WEK@_07$V?Fqod2tw{h?`~2rWuM+`&=R5B_dik}lfBDv}mtTJA zwb!oQyt>r;^e12FJz9SV2jeqXzOqW*__#=>{jdO`5=;y}x^_32ml=UYt!_fttX^Jm>0Btvh-F!nE>FDU^Wp|jdH zgGjZ;$M;ZYEzF z)hK3X%~(eLunM*>774R=6mzb$>0DK>6Wq|HiU`oI_K!%qVg!6`g`#yK(Z{$omo&-s zWjfLdKa;7}oL9vxL*9pcun13{K7of%4&Y4Tg(`zyUTbG1^}NCtF1G^i8KD*nC&9Ei zA&SpEo`>YZ=RNU!(=*CCN>wm$R&>VDJ(j}4^zxJ|wGJK74tp5RrS{Uml8&B^wqj?` zodCzAN%+ubG3JgpAHVtdGloy&_Yzl%JcP`nBCHN3NvT>Z#_IWJ%H2`N(4u~XxK7$L z$~(ovCTwYIo;=mz%-DW87~rkbH-{w=3t{KN*P7@Ir?rSL?c2tq$c*86>#_c{!yLm^ z;Q%(V6+Z`jp8R*;)5gcK?TnpcI;n)6ay3-pJ&)J6;nC9_DByKH=f0`~Z`R~E1v;_a znDVB3HZNl@8SmtJ*`C@MT1!(*f+-cVUn>C@V0W*AvvCCr*Hrw!NovN(n|{~4qv4^m zpBlN+c+u%(j!?jrl?AwcqYtY9a6*X`jba_Uq=cx>%Yx2S=$L--7V-#A@xVhQJb{cA zhf+9Q<%8JXt6*p69Ex%o`n>_vg@UP4q+rQdT{hCh=~_HbIGa^Xu_ee24xxR~*phkH za8Uv4cXL;Dw#7X8Fxg@`Kg;ku@&eT6u4&=)J0&C5W0^yz|H*x&Du*>*7`h{zj`@E#HR2&TORK|OjAxMT&pAF? zyQoNO=&hBXUvC_i(3!6jl``hsGI`7OW2$A4VUE)XqbPFvFWh6?cX#J3?Um=%=HxYJ z#0R8XxPY^_&WPeQi@@6@y97r@~ zb#)pjwhYcB@llu?u+^!G3yMrddh8T~9@XH_(VE_O7a`@5K!n&&&=k&H5>lbZx6GmW zgC%qe=SXmGS~FKZgma0nbxs(XA!L3B)q-8LgoFRs86}4ZnT&LZKyz|HHW4O;G%D;J zmcV9fanrkr7p<^2PfG}?38jfuOvuM|yjRRZdhhvIHi&X`);=%%A zaI;q;pi^>EO%pcXWeKLnFuyc@7t2c1u1S2x|91B=MWfP;SvWW;M3s=H1lS(*28*z@ zcMOl#kKt$rDj-qIxz+~WnB3{v8_iqJzr`pUhX;Q?f*Ku@2(Z0V!_NK;imI!Bjt974_ z0X8>FI5}4WUmtpuA0f)-#rPV3U7DS>#m-ySOALL~_Q1;s&b!LXg?00Ni^O|I=G02- zIOEdVnDRl&2n~24;3v4k(W7XQCeAkNv}N8G+Xo-sDS5`X&Ua?L?c5n(pYW`fJbt&y z6YnQ#JSV{D8E-`ySL#q#y0S_V=S3OfPG4pTWs7GEt%QIlZEn6?fRl3Dn38#k4zd10COHktCpr%fU$59P%^F_n& z+_=$shzpdObIXzfEMPC=+{D$qBTAOVm{w`cbf2TenLp=QL+uZGeUs(>XWRP0rBG*XCr{l$Fzl z*ii{VCFqXeYznZpIfacKRDeYa2t9|?QSlZk%;OEwS(8$Py>G2@h6Vw^lcy)JyFZ3r zZxO3mu#RzmSaLKGFO7ZS_r+8tl$ydTFW!aK)fFi8k-!iDGGND@|0(~=<+c!i$`rWr z1;^T;B{GNo{R*BuJ%&kv31FQ!1zDecobHKbL=U{-9R4ApN+xW~yu^yif*01W*H1Gg zToVlJT)fZy=X_olIydQ&6?$m3OPp>z$0Il0=Weu7?@-9wrTXN*Q~5QfC{v0suP^;) zI?UJN&&d8X8iN{8U`o*<6{c-17KGCce_r5*k|(W)|Am!b;{M>Qy7zlFuAQyNDAnS| zA-}Hx+$~{avDVdKTVH^ZxqMdsoG>icPZ%0V!Mxgy#;B^SJ<(coqA3i%p6Z-?w{I-N z_kQvoEDUNWCTCDrMLC|FpQ${3Dqo+<+t+2<^ZIR-$Hyn9+q>KAdpjFDOlqxH^JjdIEW-+{xkxfnQGY5HQZRHs*n)Lib=x%(?nev2GX>NBvV-BPt_E%nTKW z!7&xnhqZJa^4D=>EOy@$9E4_H#`rfKzz}hV!fNVSY*kR&F!sGp;A4Lh`KH_?BJ;%~ zhh9XA;$zY;n|)qfG}=c#mK&3u@?c%$k{o^?7rOBvaHhrXg}H0mZfWrkYTzh=h+U^n zVC8<0DZ*;O#N@v^U zLJ(~s5HU;Or8aAY!r5RVNPkW$o?m^=%kc2&&@K@^v&un@Zv0NNzF`y##e9hPoRcuI*HAaAWwG%ytqOFD|`MPF&36(^M zLsZg0?fz>Vuq;btykKmmedXdBOD?203{xJPH+-0|`yMhyG9jruk@B+`UqpC<;`VVI z41Lj7QtjI5pC=M{wCgO@OAoRa^Mp(^NB^9qn%;Ax;3EOa3Ut)JsY#6?eJI@O+!Y$< zt4S@v=FSuzd~gb7Nqhz35j{2!(YQcsy7w_=6wfg!g{$Zt@$L|nO<*qLGDj-OlM3`@ zR>PyU4LCR)!@|NcRH~FE5(wN4od-l01l4n}uw@Oah15_KV;J;Gc=hGGu)4COOgZe{ zael~Wa1kdPd=UXo8y-x37Z_$d+!Ml`(>8TZ`&kA%`={{UqYbF)1+4&3AyNE2jz2U# z(L5z_qh_B>sDKR_u(a1-D?b}nz}GIy$X9td(w=oxQu(FCeQ!(RYo$G$j07G|?;u!n zYh~&k`CEVI)q=mJq=A==nuu4%Fmt6O!-ikO`BT*%$_Zxh zyq+d01Y&b0_j;f2Z&HY8N?=_7wOhPLpSvk`i09>d!)c)bLZfb*<6mTz=&l;8I)k-p zJO>ZuIIs{=_=5PMNFzF6YvN{Z-$)^-akrr7wtpgsHdK#{1n%tPT@!oF!(8Q0bgx?W zxpssZM&a}Xjr5`v>(0K^*;4f)gq-t zsbDreforQnc>R@IaQj9N^6DHWle6;t{A7P;b8~HXclSW$>r;9A;1U%8wW%dIolK5* zzV?-`eC5%j2j4h4*gni)T73WaeG*>2e+?!ld%7f`A`1E-7+BcDZUuHH2ziW8(*#Hn zV1*oam}9YFTQU30K7CsYbu$i{ENzmxph=AD4!I61|!cUr^Nvp6;0xcHD<>1^j zUTi+Wzyb!Q^jV_Hg{EBwma+b6l`%M=kRXL+WI%0#lmu)%>iUNQF%y`?M{6gRGfgA$YaA%e@D zU~j6W@HZ?DG}eDil*-Ny;aq!P-Izpp+o$ZGwOFFn7=D$wj|-I-Yf2bY7Gfn7ITe|% zoGug(B(Re3>kHTEbp~@*{i}HN1eWD=FSd67Szn=(#s|buhDtWhBzZVAu{6uQMPsQSnY>rs-NEPzZ10WXt+$`Rtf){(){0eAEr!vN=XGzNMe&z17%-Ut zD^i;0$^ziY+NKU^8ZNF_x~BvXN&xE1os@ftbJeJfD3tgIMJEDr znZ3hx#_ufMmy6Qfd0=FhK}@ufE&4UU?*1V>db|yJZ&`bYlv>Nn6lucv(4>s8yefsZ z>KC8wEbAZR(URg*xMeU@{Kfl>H@YiLFr4>pkZ>8drZ*a*67!BK*8*YKDK9K;W)(DC ze}n^lo?g;*#J^oOGp>}T_hazCOgz)Hzx-a?=eS_26|nw!*I|)7|AV}%8hoMQZ{GPv zc_=#v{G5!i9A{lN?r4QuhU?{YEL6b8lLGTKby5BVe|xl<^=;)|#haCoRTG$=?Zb&hM^A)a_`gYcurguaS4w2YLS^j?W zxwdGPs-%bSD(v-NceSRt?bdo=@6pJ`3VZMcb)k5{qvJHWU3}KKHaO+l8RMj!#^3!! zuCnbjEftbyL=JU@mZJV(5l+qvc=U7+Hn$6ynyhz4i2?&TsC0F`Zo(7KrFq>ltvYLE zStuQ>ap!ks!SH18H<*_V;SrH64_}oGT9Ys=&dmiZfU)Mz1C=p!9wA{rX>6p0C^UUq zyR6aolWon8#~EfE-<43DW8wlNKJysVPYlecB1uJP2eq(Cfs@t|g%iUsCCdeobU)>& zq?Tu1DcNFk^q-6OpTbaP9~eW1vDg&8q3&%4i;Gv`;BW%(Ja`P_8TMk8w+udM7{%P6 z`7D~1<n_}ljo!hf>fVGW%I60j_f4Jn~d~0FV%0Guc`Mq|E zrvgh#jVgHI-UwC}Q6s7q0IbYwK%~4X19M1x91@p+BfaFcW@bfJ!{*KjJl)!dtUrR@ zaOAPNqyV#j$If5koMRbj|Ge<>ydM9^c%)d9=RH+tAq11%=!Ra^PZv6rRw#67!M&j> zJc5XjGTDO4OwqUQ`(@EAEwU((;VVz*@+%MUp3=B4x|$@9Piu)9TDl^M;9)gq;=Ams zo1Ui2%Vtb8(BL*o+hBlfc`th2z)*WDSlGC}Xm6?#jbH9N3jO4L`}`T_55yHSvI;LL z8Y)&{LdwY9Fh3a>O+1#mHhr^+o(Ro$Wr{||< z&na+SdA3y1!fnr?#y{L zAWepNy^h?+@plO+I}3tbpZ~0n7$lrLj}r5k6;4^AI!3IeHp3*?O;M{D zg`11BQatD84T0)QOEUpJYdjp! zcm{V*IV+`HOR-or$Nh9qLWLTKFaO(xlF>cG|1uax#1HRpu0Un+wsvgFfNjdw&9B(z zV~MlC$u0X`(?ICKV7LtD=QTW8+lParS|WZk#YUC&qJH1(V+$EtV^8q_N9x55ucnt}iNTh~J=}CIx09e}I*Rec`pWS;jS; zM}{UB#Vb1OfQJUMY#Dl+!_Xv)yD70H-y`}dNq(S^0!sAk!#>8d`Wu4(Xyc0cz|kQ$ zCsa7HE&@-^i_nqSA>(6!Q<|pkg6YEY6`a40Jx=m%L}_OgSeDnfScvf$Om5MonN?Xm zCF?4q&JzwYMd=C--Hd1qr?<>v!9*c}8{ z13Lih-GZ$f*RRhl-k6)-Twh$vdj0;rcO8HS?z;`zn=8=mY(hidshkFc8_4<(l~XQW zq8(WB8kcnS7ygf}(d&8t)_uWmAVfiv)YA;lY?b8Dq-BnA%O`u$%8jnG4RO zL1?%*VZ?VbjVsQ1-Y5gae(0G^`q_^KM)Wb}90sr6|T%eSn>t|Efg*EXTo?Lwo`2n|_%KHWrTQ8+0*(;N+& zRp^jn>#!s3n4aaa2hb&Wa5M^m$EF+u(s}Yq4g{4xrw7pPbaX_B&XHiRtkS{a42CLB z+_K-e+zA|D1-#zBhjj>_XS-TyhpW7fQ~X23y`61(c9-K?V=p@A&yoZr#$3jKxy*F) zqh+}H)BmdvLpQI%{K5uYy0Q*y9dl+oFpmTo?r|i`Bf5?yyp{3c)VQKPO6Jn6Ma`68 zy#;V}W)+r~RU*>{)ayguu|b^Tg>dLARdc5Y9iD3LZf2>9l}LN!aj{s z#0TinF#X)|GH;8hJ+NzY8_-sfAhjm+a&@dhA(rI1iPlj0W{*UZ^t&o<4Gf4Ms*}3k zNZ7ggA-pO(G+HocfVubH@O{6#%5mzymyNktpQXPUm4>V%j0PZ~=2SPLJHW0jeOI5| z%rHoBFb4Fk*Mo^z(*Dt)9pfqU*Jg%z6z3YR7p@TbSL8(WKZkN8*7vQhsITQzdPmw6 z3+UbPWyC`!@>-NNo=3~ht|Fbq``bveOqzrh%3RYfr!_7s-v4aQ&6V`oz^nk zd*lGzePj;|tDBp*3+H|m1xa-HvFH7D)WQJo%irAOY@sPkLr|gyAxuI zsbevUyE=AfM<=c#{hG7SxJWD`vO7MQNKT{MCKBXA8YhG&3Z$x8tw6z`V=7WqQ_my? z$R!sdNvUiKtdNKcXwl%^=0yqp2odw*f4PvjqO3?lBV2Hn`P-dIo`_JwYt<4kA51it zSgevEK>L>yMj8c8-z85u3gRXwXMwd7!a8e^Gpc&7F1>r1G2q~{`fuGND%1(RbQ&Et znv&}^am>0;n{3Y+zdkXIx-;1%+%bdE20DQ+nqwRb+lFwfQvZ%2JfR|k>)s?uv4)zy zvMfw6r}%;T!z}J@u5?ZX`sEEtGQYjt!yS*_* zy@N@@bUR8Bwd3jaGibFs(C?Y~HjaQ|KF5FO>pmsGQ+(0k*{&CdTWhG8xd;=%s&Mw6 zN!3Tf7&F*x^r1Nh?edRZZ%)EPJExNmb6|e zqKWZEyMEG}H<-Q50_FM(okvDTk(^V;>4RhT#8EAz>UMp?>Y@kS8wYx<<;t7jaBg z(;OoxSb}Oirc0ugF?zzxjnOTG1mQSWQSLBX-;xXE^BSj?rJAJUcq>~?-%{0VC|cTp zyuSfoc;qg)=Z-_rYxh*{mhQ^Z{KA#Xm)?E-wKv{sw^!#>o<5teuacp(6^`9M_y>=+ zPJMjp@|ja7PhOw7dTsH>_02s~wfup555T_Nqxw2Pm032+Y{upQ4WZ(ofzS-yggH7? z6|EMBIO3sqd7ah2{z@yut1$Cooq5s1ogaKA^~DQiwv}Ry5``-zgBlDTPjR9-RMe?A zE*0v6iLRtSgp+q1z{(lw0OODaWp%+RK1Wz+JRHYy!EQTc^z^Ul{5ZjBl>}7Cabde` zw9fhEUi3^xh+^>E_p51C~s;2iz~W@jp}j0zGYjC`o# zp^1OJPN(60hebNVCH%b8;bGP>2Z$`Zy`=&I{CGo|4$XA)Y*@% z7QoW-CbT3}nBg7yEPDR{3RcF^W+pxT{X3PZ}c4(@m*9Ku1uE#2KoHYI`iVLqW7r)?nllvv2 zQ$H687@Y#+WrcS9Iljf-!T&|;gTgR~15B#tY1OKMMCOy@Mb-&0JUR}YTsihG!qUpB zP6n6A;kqM*j*aR8Zr)1NFj3BiF$>-(w7Cz|nAX-e;q=+d(Cz{>6)&?nEzFTBBMa0S zUeOtc4hZ|L)!Kxqu~E3=_CwHY)UCEgcb(}tyj0zW$}>=*a>nC`DE&mE(c3&3!1;?; zVCLFQ7#SINxA@qnA?qk4O=dh(uL-SXJfZ=-Rg4hxUPwP>dJQ@wO?^r23>_Q+i~{Vu z?SiMN(F9SC!4nn@5IQ=-eE}U^q=hfNN{#fKFrX#J9fz&@7~_q-R4JOLlq@XhmHZ*E zLxCeXnmtZX4-4iRs}f`x)rUAsr1^~Wel|zcK^5rz0b+;)nj=kKH!+@QWC+#8iXE?Ts3TZL8WFO6#&R;4JvenNvjtgS@#z{o__;%HU|$nj z>#NY~Y_@LB&n;ZKbn(nfFFbdqR;#T>26su>lFRmyr=RZa-Me>vetzNdm5UdSFWs1( z%{wcdTW=Z5AH4527;1EMxI#mnMdQkgK%n|7<)ewP6^A?ry`fN@(b8TOXs0pg&s;Bv zQp`T}&Pe+&VN~M!;LI#GVFn|(bRUBm5aBLO=tU6-E#+7l5NyL!D8a|iqjv^iifD{! z&`LrtOW{nwvDKL>8b|aD*SiJ8t5E6biPlEoyzsxFC!X%O?Ud;m(>NN8KHGl;U)X@q zs_`{D0Y+MfwnNt8|{3SidViD9Oa-?$l+UI2-kzCAE+2Gdvzu0@1LbG*`ULW?Wk1L|Ai|z;KuwKjE+rO zp6{beLIqT&3!PY5_DhFOPlxlwx=hTmcV5I!q#)e6aE+yCtLUZh8s#w)KJJ^${pH(#B*K7DTK=8cVA z!M8 zjzMZq8Z-5D7vmvp$BkNZw+ccAX*{TdXX&{xHB6m9PxTSxy$EL9;JjQxHn6ERld&_4 zDMyWulrf=G{yJNn6tm!wj&-QI3%f?+-K=vA$2UiJe0Z!ol3=yHK)G_qhcq*QykCQQ zeH`*^5`o1LHkwG=_PX!cplwb6fLp$|6}HlfqY zpxzvg)LnPKyxQ$|^KJN|!Y^Ki=xzFmLzPGF7$9D9*7IC2m~^+HQN9ofLzCQ0A?IMsI>j&GaP!Mhl8N_L`Tz5*q4 zP33`))WHZlx~m@XZvCaE?_^ew>NS-NZwRi=t-<-r9azveVGLd*{f+V#J`Mwh4TVLW zJJ3`7Z<2$CA20NEFx1{2^QZ%?1HkmP4oqKPf^M#oAC4IM$0#e!2XkE)!>qaZHM@-J zN>CNn+l9%gVYubME`8UuPBTz9jvjM{nua+0&r}xLfrxXp6NS>2v@WnK#i4F20$iS1 zgVl{5G>6AD(sJSaymQ9$qm6=N&pF!@dJ|o3+z#MHACvq%edRvSVk&Su8u{?KllwKC%I@RAb`?b7QtJo~0n&Q~4U(2>xZgE|*S$>hlG)E4?U$al#y`hnN)lI7oi)tW5c0aB0D?e$zeo|Cr zgG3$kFgc8HHXIFG+sPguGACDzo<)zCk=YMJ^x5%U4ZD_2Y-7_Mt01xg|A#h(wTJL# zvXFeJ{b6-Y8fnC<+uQ)!RI|=)q%{e@mF=Ze$&Kz1(73~+)lcnl7TkCV~S#Wtbez;mIdH2fHUn^KPq^ciQWnn>XjKojm!; z8~^YR|M1b|3gr^}ZwUTwEG7M7QnIwQ@z|L8-v!0iV|Aj@0O z>8`6&cu|O@_o^_XzaRkzE;`A;z{SW3&ogtsc+sKNW|~Y#h|fBh25axFzHgJpl_uu$#9eseGR&>snIVP{`9*9TM?6y1X~eIkuh8{ zrn32>bnVW{3-_x_{a1xqY=f*Y!_Vw_C3}_(Gpl1CfpUQgDO2K=vQV#Mwq@VG&&T1< z+f(D)v>C23EjScEaOd$&G8ODo8-4mZz;S4f?1qm|UV_u-XRT4A9EV}TouaZ6Yhb%Y z8@TH3>v|0~S^$@>EW?Vj60%{P{aPEwR=7k7G}&hiA69N#6;@nt4ryFnoxKSwYn!?= zk}4s&ms}*&@p%#balYXGZ1^J1dvK(QTxII~KIjb6xefqYki*q$%P=#u1oh?^G#X8# zRB#0-=%0^4UOQz*yMznLm`L&XqEf~yQm|H0qDU+Hzd9?i5Cv0(U!{0YR(2&+>Rn>6 z>1@`SI`cgSo1I}eb#@7^%=FB9XEzI#l_L7(@`HXZI%1b9=K@Tl_Bll;0 z(3wWzaXfX4;yN5t2#G|K(gquaWlKfSUsF12ATI@4^J9v;@p~RNLmHzMNsr{ug0U05 zlsaalKP)tN0y+Y=BWtBH*t=PJ%{rYlF1YToKl487z<#4seeXff<)zbCud19s{SNfI zn~-GgX3 z&9(KF)%BI-jjX%T+rPU858QtQc25mKYhy`!G0^|WI8>l~;*Mv=y{g2B^XK~g-N*sz zU7h%ME}G4bhEX6qAus{&&`CW*QFq%eRTPsVrW+PdsM1r-3SeeIUSsIET6!gkea#%PKLkOuqe3ec?Qd?E%@Z*71(Syp)oQE zU8}fZW@rPfOMOblMCZ#IdP=EoG@;vXz@?c5xUtlNUT}df=CdeYI}&a4=d>i-vxvoz zUlI>P68+&df4Dng#-wnh=J@h-4s(kwsHyo^+0!izdFKI#&vfdQIu2X$j0d|-$QS+7 zLY!^&x1ti`mO2t~o;qpo1i04`l!hT|t^ z0cw+wHAbO_yH+}^$L<>2NEn36v>B6|QnZJLhGBAQ1jfhJMhfQ2!2AwIA*I}c8bKyX zi>$pJ-1Vop2)>j5Ash;3wIROQ>cIOSU4r?g9yEuhpx3tvwbZVi{z!?8U`J5oj1FpP zlg^qbg2Pop4aOuLQN2sxhmO_iKNd=2jq)h8!)kG9y&=}Q=y|E3QCm5As+VzfLG6qRr)Av*O2*w=N<&GR9 z&xCv}+};WL@HrAWr*X2-krUoKOZDiKo`;PHRq%Lg0jY5A=dFnxd@O@| z@7fQC4>q7)>p-v5?sqz!*2>EA>c;BE#;#qv1`hq-DF;Be-R>@5xp3js{LPsQtIIbw z^IoU_#H07X-ADF8Yi-GRGn5Fy5I2|I7YA)8!ehy|&K92b43T6Y(t?YOf7^~HQom@u z$ECb*8jWdIW~$-BPCu8vOGT>VJxP9%1p*tra?<_gTP)SvKvi8TRg7-YlK0-CqMj2@ z0Nv^q4F0V;3Gm%P91Yd#g{z>*U=)SnfDSBFiro83<3_6)eR4s6TtNwXcO!7ZD}s+I z>0HoahnR)czlTY0L*?5z5FF#p>QJkXLY_6@%=ra4es;}+d zC0DD$!v-yUF7Zx?a8t%OHxZ8t#xACOsR5k1(1LRpHlWoVfGXW?&XnrA%<}Ks z+0poP-=S+FytCdnNSA!L{?okAW>ilQ6o#C-H@TtacF5I@7s}8Zf#&dTICtS1oH~0A z)_Xo|mK#U7n>`2ywqX`+;cWveMlh(co;`mJj-R*$&7nOyib;)G0`!rexZUdNn22Tnl(hCZsojzLnLLMQO%x`0dK8zavje|1(ru`%Rg)>Eu-q~Gv6 z+XhvVHB4$JukzdhL6d5OY>?6^l=~!9oB~O09B^ln#WicHBG`#5oFzWMY$ik7n4Z+V zT#EK`raT=Gp?>erOLo{`q@gsMZJQ zZsgteMrV0({@Rs`7f;O2&RkzwT55miJKq^7`QLUO0J*(tpff)|Gxz-Szj*7yg){G6 zpS!xy*<9~DeE(kf+xxesEUdj2u-f^B>uPPP6 zfq2trvaEvOcTUuf0t#(h9N`Y9z7ZsAz}VzIICJqDy#Dq_(7_D(%&WW|7qmBSb`n^PwC3Xf4Zj~RyJksT^`-V}(3S}D#Ay;I)mHsHjm z6}WUQ*T*Z26ESu?l|{6qN{asJbMvofbZW=1?#^+Vp95#7HGH~Vqw4h_gE!wj2Pe@?NZ&WM?fmxax{(c$0i~6DO8lyZ1b?{9KQt-k5;<_v$Lykq~&$$j&(F< zNGLJQa89p`^}vf`s#>^QPvHf>^D$TLBYanq|2U4K_XdL@#ZOT83wR={6I|_W!AsGD zqcIYd;5Oay`Z{|?+b3jX4gtAg(NqW>A#|+%d8l*KJMN|as`F4z3v^von*(~j-oQ*B zOUArj0~Jky=ti-MN5E3@i0X*J)$55d7wHn*e)Ihl`{r`y#I7PIi{x*_s{}at5fxL> z&$r3tp!!f(FRw!_--HM5xfMSD;2qHKwpHf;-rCCI+RWukr{8@0jaT1#>(vYD@~5Yt ze)`wy0B~bkT3XsTb?VgBxoa~QZeG87t-C(IF*yS8x%&>lok#XUZ*vjy{w6erlc=glGSNCrm{yjz(oT32eT(6|WT=VRW=l_y0`9FKEv5c+~};JJC@wv5}P;m=Xv zmJ{YSZ#CH+&}Z>gTlNlMC**B-piBOPN%R{VIrjJCB6fke%5!^s!(^k)=ynog?B%=0_!cs zL`TdW*!qc8f^G6Co%qkvkW-?yKvJLZ$}IDzA_$;13fa(JZ9IQ;{G#4BH`8X#4&jVo z6=7QD3@O4cW;oZBW0U)t?723pzNBqBHmdv-?|;7CsIw_3$4$&ljLE>G&Ofz<6L>Cminthb9k3F248vo zBWSC<1v(le%m-pX<#*c4F!OcK4FUdMT*CXpr6hmcfuL`%(7H_qJ?O*R?_Pxyr>{X? z8_`E|`pQXXV%sf$U{@Mj2cXaWVR^1fMyVnOvpUp=#^Lj0~ptwUvk{Uzom6p3I{cojST8J9XYKhTh~y9dGxTQVMYGt z3?$V*-Y2h*kNB`@T$wsogLN`xWR811liX76jK;TG*#40S^^(#FeVnb}>tK>-uOAol zE${3`-Yen5^dm&4XdKwY=LE}`aF_Cb_dH0r7mP6OpE@9H0>MZRvp1l5eaVl*u!B$+ zmHI4_V~9ifeYq~D6Ze~@QTr!2ju3YyDoE8+x{$Xg&1Q!Ea}HirFS>skXtG4UrqD-( z^Te@QWVg<^g63~yS>_3 zT)eq(b>`}&OXn|M27r}3&wE?tsoQk`sM495np*teqmMp1f9}k&`I|FyYiq0R`|jEg zPdsvO-s`MDx3dN{6~2H5D{FwCbwf`O_15a|R0$yy;(o1gl@QtnDbJL9x1u*|CrXtz zQ(iRg#WIyqz=c#R8JSxdQ<3sRg=K0SMg4_Bg9;j-z)XjCVfNC*ob%rj8%ZKu96x2H ztWKHYEBzk4&j1e}6Q>K?jY+Kox2%%5<2wc+yfVyb_$64w!Qn?Cypk7k=E{7fPCE=u zMvt}0+NzBNQr{1#uFui-vr#yAX$4+BGoE}xGQL2LPgm-PPF4yDM^h{ z7#`jar_W!5x8Az~R~IwrINXHe8bk@ecZ!~+Y1p1kchATzG9(X#a_|h*0an&qaP-yl zaOV6C=x1t&cvMG!aKkqVn@%JdkEwV)q$4^a9!M4(=R=goo1a-C$C7@<{z~4fR4nR{ zmZ)J}DqF?Itc>TpNRlP0eH{r%wN?#|zIFo6T(}P7yAD9V)&zitG4eH^Q_cXd z*ar@G$LGB)RrIggpP1SQGjq%E{7WCe%=IR;m19&p7yaC(;PlZGp*|ovNu=*pOKP)0 z+iiz4QU}Yhy4pG6nsCb_j(Jn0I*rBxjXLvSsVbp|LKV*)?a`5=;;$DKYIV#wdre%H*Rbm z+CS2N?BQEs*SNZAW?hFbs7$SD(scqa3o&~85C?i!%X(abu%5`;x9?~#BH@IEs30k1 z7}J-GuAMja1&B&A-j}~G?_ap<77I$SgEin_i<|&4jC^N1YK<{^Jd5lnJ@m^Eqn9|2 z;*KT23qiI0hfI=Q)3j5Cdq4{XY9!6L5J(v>sW!`yzzrjANR%VCTtOi7P1bmM6c6#3 z7U51euaf@x47AQT(a+7!c(_7==9_q4&&(dVHNH^ngG8FLJ!#sq`zd2(01!dOtj#MwwWovDJC%%>8zDU~Wt zfbtj@Ti3~F8<|JtL85KyoTLS>R>CzJb;QSEe`j3JIeyg6cunsDkHM)6Yw(K~F2h2r z4+5;)-UE@Ic&&IqG!FV`@upq@A0TZZ>Oo`t1#fab`Qj_^Sv-tZVj z&-KWWF862jCB^$1L*vlPM&RVxMfmx1XW_b9Bf|~o^hn}Arr;V`hzJ`@F7A{pHCMJ~ zFx0HW@#%GV>Gex+_4+#GwK2$QBQ7@r9l0}*%gLLRopEABtrqO~(-J$ZyoT)IFLT7vWC8xAm*?shCa)Gp+`O_&(&!Q+n{fg^{;VRK^>`rTG%{^rev3+K;#@{3>m z?89^CW)_r~*p4%9CmaB9*EheZuLNA2zj1l)>Xma#H?Ggu^G@&1BO~zn2M)nVqX(VV zIy7`H7F1$m%G0 z2vfw%clfsI@#WvCS51G$+YH>e)U{W*BgQ?%{H9d>Ym_u-&=PwU)8RrM=X&(c(;JS@ zJo9b(J8(5#br@McxXV>9H@&eCJ2T1BQXx_b^=FhG?5PaRK;j#DoSg$rrnympcO7 z{q^cSE#nhHgxn}%jt1D90$lWnO$?>N!}T>L84OSCgI;|SJ~}xAFTFkkSJ(Rb>KUy< zxJ02Cj$gINN*RaQ;M34IDyVc`%zd&d#7*sAs?c2Xry>*-uGhO6{Peji@b-sG0L^_` z0q)zKLBAtuuMrEbuv47ag#7EiG~Rq7Q5|Ndhg*j()M3}2!*KD+BK*V8UxN!XZF^M0 zoJ}@*i8qR?ma;V!W7L~?<{*d?JN6a|dPlI{?FFa}WiY**!^>|iz{e+UK)W{#O?5kh zasc4&AcI@lX*BrrqSA?_=(@hpah7rv1pH2*_Y?*V{TT(f>aKpda)4_dbL4m#;jelt z>cd9a*mbG@1Y=)^Qd&OdpHn`9#sUpv_q-}7B$1fozm6tU8|q598jS8b49l%i_`834 z8IGTv)6p_rd!8QcLqj|MRw0^0!eK~Kx=GkW5Vhg98LAXKvOte|Sz5-{a)8s9R^Y$? z!!ekdtHIFNEzs>5V;^t0z+`=X-tb!B`1lqblUh0LKEUY2LD=X{z%zgUJiPVpWzAbu z0)1!ZlO5Ka>q+{dm&I5o)hGR2WmlQ&P#SLQh*M>w5Ac&;oPbx}z67IFw?RJ})5-tz zzM#zuLFvaFC*_@lS=XJOnR44y$&-P!l;DY+Clv8dl*fGC#5!h)p^G{#Zm$JbBhrYE z!J@f5F1*b1dXaC_MGM)mdhFkg14n>tj!gi!!O#JqBie05D7wp)y+F2AL;gzi7Ovai zb2@edulGoJ`OL>JIB@Jy1f5im{aFDN;9ujO+Aj3kbbIX2;h9{`Xx)G|c^`4m+HiDq z)<$&8LhWNGaHt#FZQF=`$~QSe8drbl2uwK*sJ@9CwxOMokzQicC_TC32gwcx%x_rtw+PQt`!4z2a2d}DoO z^~Uv?i`TDSJ>P1z=E0s=-A>sN2f$za#b5LQ9$tIv_190o_s&}{&CXsrvoL>sZSSt} z{?~u^QP{s{2)eB$sO254w3!8JhOYnX@a+Y=N;YNgZzflD2+SxTyb7T?o?!jX1O9H# zchc(^$_cv2faijO8jW}qT=xx z(iJ_k%;$!$4@yT;G3}Kdu`x=ko~si26L%jHI|igefUlHsg-Wp7ZE{L6@$PEHxeona z6PlxYpj)4UXa4>rclebsO~Zrj8cV20S&C^t_sDyRbd8YiO?wbLSl0qOoGI z2EAS#>WxY0)yCnYQw#7{fAQ$}hP#nUV>B|Oy~&-NTO zs3Qsho9#X{vKqYc-X-|)-@X8?-WZIG?$LL}gGQ=2&Q^7UVd*D>UG8ca-A3uYIVqKHSKuRZbv4oB1Juz!ileeI^5_Psev&>|?yqpeE3B7vFu3q`b0st9MS+f-8bLxf7@k}` zQYXoy1stn!)47xE1?juft4W`d>?oxE)VyXU&rj%(LB|7;w?yXhwW90myiDdh!iK%2 z?Iy#Ylx>`;%>V0)Ff|77yT9`=+_G;X@3&fc-d@|BpPQLEapJ>QUwGxEcgM%?RJ;FM zzW#4V9RLauKm6g--KC|a8=rjg(W&d#u3Vm*xwJCe>~8vSMtmqhdR%hxd zk3HkgQ?HmFCa&R1a&Qh)g4^N*BedKje@&;~v9No59w{4h1P}u$oH285)+)`) zC~md-P^*o@@YpSI{>n1^?LVG?SC7xbXk8_a0%+NcSe`BiE3uG`eVMou$ah82@2POC z=3f~G>zytP*BWs7dK>=hU%djS&fkRE&~AYGxK4hhjeFwMGD-q5&aCmTlGW%P19c^$ ze#aXS#^IoH4462Mc0YrW$y;ExJqmySvt#hwOVe<3BZGPapxu?vI7?U?o+~XfOypfP-d@NnjRQp`{WG7{ZqSvb8vM<3=iu+3{Qz41ai|aN z(hk0^I^S;Py`M{uYXiPb{0Xrm0385&_e|}U_cN$BCtz&y5WITqJp8x6eiuGCvkvuU zrZeoXtMzR|ZMCzcrfyJCM#uJVMhfM6`MS}&|9KbswG2*A*WtfC^BSBwzW}3?x9Fn` zxk~=0QGp@gs4w!yLm3;V3@4MED5ZQV*!0K~dTJUke*Dr}3}FlT6b?sT!&ILe+%XvA zB&Cl~L*B3B7&Zrw{c~#_+YN4Kk?;_XD}>4G2kEheIEXfrqIbhOk?xmhTk{J$F0Lzi zz1td`HkvXR5IRHx{>SQgp#9Ew(Oi?;e4?(Bq@9)z++GOQH|g8eXS!-Ihx8qcC1pGB zLBF)mDA^(%w=|?IqHRx?UbZ-G)cK|u9S6&tn&wYGk3_Ug4u=gytFboT7@AN;|i>SS2|GvNSGp|#<9b*K=GFHHdC)9zu6!?KX{-GMB1T7b}5XdRjLTDMB7`~B60Z_xIIsx z(WPp1gV{vP6>jfHn6~mRC57*L|GHf~2jwS14`X&k>&l`}{Ct!Tn9q`7x*WthZ z^)Waxv#NK})J~i^6T1@>rwIa89Rd@5Zt;L;^OZ5vt7${KllNg{xB*ud+webrdK`Z7 z!ZGN=IE+o+0&VRNHp#CL=MI0tkr#Rt2%RB#e8U@_2Cs(CwiSPDj6-AO0L(4);KzUa zHvH4emteh9gL*?{DObkJ_KbnS3JF!W*Zip+OP$-Vp26vvb@)I3`WU?a_C*+-xD}u= z0X=By9bd$+9bjc6CR7f&^E#%DWV_68jF%9#Fzwvg_E5*5?Qhoz3relr0T4Mo^i)u5 zT#(9DJtbn{8mU)+{n%02#hrW=xuTS+5f~ob2P>OR_}MQ{!e9RVCvfFP4{FM}r>>9d zs5Qm&@l!oR@%>%`s=@eymm%l?=o^F9e$#7AXMxV(#zqEz{fo2klV?AH`Hdzt$8G_r zk3zR+oO5(zLgxY0^X6#CFzWHx zq@DgI7A_NoZUB|2^}j((3dW#|~1qE}Jr*&W4 zFdd|%XjkKrL}C{0*o!!Kn>%=bJnS=QgGHdp^pT*ee({>p^B3p%)`FjL-5E$cfr8}qfpPf%-@GIY9iF&v^F6 zdZ)I@a8oI(9+k*F+!~c)MMd8(|Wr_S^{{o;VKw z-)G*0(UB?m##eX4RMVWySN}J+LRMSLgO@OBMXdzo_vosyZ^)pL0i2!PfdBKaK7i+6 zIt}ZcA=tI|7TD}HeJHf$?K*MYfJSM&J_dPj>%~l`>~M_Nrl)sWm+!DhJ60%%xgtb& zoPBppu99Cfrc4%%KZeP-A4ST@;1O%eI1shlO79k{cbc$!|6MRWcLx6QZ;rz7P!0a{ z5ATJ;2O8Q*pyhf7(9l;(`s=hb7{r%RBp*}bVbF)tz(wWRoE-M1s@b(1e(};Q{MFyQ z0++9~Vb6j4V6#00U7eIuMfj-PC5l&=c{aH{6m9EdCzjpW!MhwFI5vuBya-%HV5z(! zJ=nYdZdkZ+0e<@IyD&0Tga6ypkHbTEP3lFh>}wr2fVz=-m&qzVcE0Of9ar{U$HxrX z+K|Deg)aQ}zdHec{r4|IHhKugMwRnZ@it>T;v9N?gZ1wcCKdFXfQ`~}Dw>Hu7weJO zgj8RVp;SSCOub8cwl&=5OW;f@Z&{p4ZZPsSAFk^JWNv)e4}~|@uek2z^aJf5H1Lo+ zDad;`{#5w6tb>^Pn6Vx=DAgJW>m>`?Gtwi@TMFtLqtQA9+*-6(DH5Frr9g^K5vH;t z*&-b8P96&hKDBLOuWBzNf=Cx8JMRAVc;1{{p*B9qjZjtibdKwk$unBVRtTK$RaT34 zPhg%4oHz5`9YfcW(ovFdJQ?xX|(Khi8FIU2cnn1}9$99!6`>c`rYrL79BN zkh%Hx$=#_6S5}d$;;~2E81s!_)4?CP2grLiSqk0R3GfxpN7yH4sJ;dI-0dui$%Nv2 zYH9mLf&`sxI42s)1g`vshLF%PQLrsTQr560h%$-pLY+I9)0z$j*HHjEm0Yb3tscPG zo+GfalEF`Y^$E25b@*TZ%@^UZBcrh1>*;glO$=u&gOA`!@1*xt^pkb$c*2T!&NBE%G+Mdz5f z)@l9<--m|B-Ybo~-6)`zNB67A%0V1OsC>D(vyLof|GGQr_3oJ3vr+WdfOfAB<5Ndq zY3&;P*T4J~+?-#5fAg;%htJ*C(D@=1oV7*<4HXrSW7F%U&Tg21;OeRrZuxxp1fo_^ zw(C-%N98L}?KK-Um{|q*yMMX@|Lw=WgxLjvk*V9E-5Y{_*0g-eIxR80ACF+^POWZ) z%n6-UI2tQoH4jn=Jgr>O^;NP|P}%=$FtO_hY_491zyJCBu)NxX|NFoBGJNTgah($- z>j8|YoH*LRJ0urU#P2w^Jr+5@^h1n(jyX&9ZH6Mm*Jm68|^zDR$&B`rP!EYF-^{S&uonEB$Ms%1H{!VNUox@J+ zmzMWpaGLH{ZKkMWTI!~vzRK_q{r(z^kL2+10|(&2`zE2gu?n^BTEE@e=&r4AEZ(?r z^BMrG{P2fA>e@zYmR}@-W>#NHvYb%SZ-S%p?0sG&V}|N6RRh%K2?~)rhfMl*B^nOCr*g z7cFcrJ<-&IYa=iM@1ar7OcQt;f+AEjiVS1L&}Q|ym>gmz95MjcKl;4{FK~Js#klic zziN&zW4NR|jv-9k7{PHF4_#<5A;YHQtwIB|{UYx?b&v#jP8v`tLy3z5+6Rrq@Vg|a z7~tosPOaovg&SxDKAGG-;RYGP8Nne4kwEB?U1MDr(}NHr717n{*Pz)PgQ3You)bD@ z=UzMw%gYP!^!FcyZ+!I*7*^r%c^7(}8Z=dSti8rm;$G-nH0Qtk`9Ckrtbicz>1bRP z#tIpH-gxE;nIx;t=F80o}gI2#!j2=rF?_1#-b3 z?tUxBpH-M5=$(E>=s;gTsGP7PFg!8>jZO|H&dux4q(FE^jRDh|vFy z+AMOclsR3Z`dq!YSHhuV$nX}_)J)C?6*}K&Ov2Cvz~bsG{Qb}0h3hx3!T-f@EP*xiwVCdLMc)GNh7w*5I8}3-EW(egeOG z`7%t;axR@V7tz2wr*X3aoUEbFT}dn*W(d1|zGzQ`$#+8PwYl3uMD2 zj|{$pj-8Z2o?7=Zp5--CrEuqg=Ua9F#PO2av5w(EjLZFCyD2%#TB|S!LT94!YpkNs zh)2Ux(%*f9d>$m{DAgUQuIhDE-v-z9(D;t^50*bg98>iY;-4q+GZwaSrtx)-uv@*t z-UvW(8RI=phUsM;;=f3r^l%yU#K}N;pOP~x=p%A+$pxbtIZsRJ-^FrFUaJ|gUG#Ts zhw2Jw$Wyoiw-LFQ-8SbV_HuR(CcqPue}V9J$MH^`rutKHUzM`wh6sX zySKTqzP_@&xYBC1H&w8sI&S}?AN>eEs}6wP`1r2%)2Gj#JAB9O#}6L9WB=04J!ALW zv9JEc$L@l6Kc0qmcO4qTWA1z_dfWN5(9l#vbNNgF1byfEWO(a3^Z6Vk92v@meL)bLFk z(t7SO9J!z!I}3g%L>KgeOa0PgD#am2gO{B2PaPd)=luo~I<8Ip6nRORlCZ@d$J&bMvw-frj6Y>va&)L~d(xdP9>dKng$x-dK6fiHdGR=D@} zaTsr!C5GqTy@BbP4*b@rfFiF#;o|cC*(KXkISF*)?F@#Sb?7t!W^VT3qZ706)922^ zPk;FVwEJT)vHK8Y^+~;BrxSExv_ph8mMqQfIC!Biu`~@Kh7h9zK?7UYKX0^pFg&(T z?K=ID?gMaWOzoVi@ci8F;8CZGwF}n`cRd_1YT{-wPRIHPj7cn``z|sHWwOwk* zzgB~hA#;3XdI{kDk1xYdo;waNy?!2+)|)W7=T3lZ4BB0D-d^wc64B>3DC{+usF;`X zS?}yb!@;lsuRnFVDpF|#rgk5J)y1pu`rDUbetsS1ZUB7k%Ln0syY|A~G1Eg=B~t9` zv>SSTshfpNQbiwWgBv!cZ*%OxIpOGaZ)$C-$c-$Ari%2mN1jey-GEo$y$t{O+*x@2 z-Sbcz-mlkpt6PV@+J&_{9O@W@S>z=-XDax(xDmsD+qtzOM+g)^R>?uPHJH>mrOaAe zX_&~FQr?657S(@3gS!e37VEh4LR`rkR<{+jEWES0s2Vi4$1E8;r|Fw;qb2rXiym0Q5jg8i#V!5z`Whbo{ z*XE%^PmbQa`QaV^?tl4TzW3C3{^Z}@cI5ttZolWju@6o!!2kCDeknV5wFR}|-DY=2 z-D#UEKSU_FLT`+@zKenzc>XXuV?VW1T|P|iLG&4)$yFV)u3XwKH|V9EA%3L^4>63| zb>26_IMJA(xe{W-t`ynm zbdd0hinyC2mK4X2*(!%F8@5A)Wzu*ryh1}lYHoIMzx!Hzay>Jcw z{-^K2sS8(OXyPC=NA^KKAA)YKLdfj3b{V5by5k?%(iSfijrLeV_`9#5BcNOseB-q? zcd~S$S?j@2tq1EXS0U>xz!x666aMUve+Pc=%TsXco?#dss>7I-f$01&4ghbM$^svQ zqz$29^hV!G!1XS`dbcD??w?+Q z3)4%`9JvLWqx+%TZ$h38L0=zbs6kDwaoc8Qk3s6tep1U9aiA0PdorW`2M5trAPO`zNujt8&Z)_23IB$1M!7|z$X}1eVGjz z|Gj4OKB?bSM1gvujzp;I2bVV6aACRwfBVx<;Mt=ez~Wj4Bjbml-rTL%x5ACSnE>b5 z;@-vhOY4^G&J`J^gG8ki$$K76#OFrZSx&)_f=TYbc->0v4pt<6fc%E@9N<~%-`+Sw zr6!#_+lB~1mAnFqS=bvsB%EO1UMET&b4W)`gwYCQr1}U8kq>z_+&jI?MGSJ;9pc{O zQLkbVZY}fd5h=Yq+%YOU7IXmUqlYRXoxSOU$qWuZ>Seq?X?)TK=uS9Hr1fQVdlDs6 zHLrP2c%#q{g;`o*5^QlK4_>j@heoXf{q{0Ie+lkCG6MgPfA5KKi3$H)dvMFV4-*T;8|; zmfO0m)uBTN_B5XQ`lB%S)7RnV$^uO68i&kYX+sMSN%01ByaR%sW?j$bq@l#H74KoV zpuLemFN9t%T-6;L+_5^DDRrR)|@KU5e#C7RB4pzzp zp>!QrSO*ni{fjgzVuTVr1q|B!=Es3&xapnB#SV&Mf_f&`h&fwn&X+?z46SY#>M#jIlS8o4 zUWA_?{Se;&;3N3TllQ|Pe)9=<^3f@nXegu9UN_TMyVRyly)kcdA6SYB#k0NcM+Xt$ zxmk54I0ra$wFA$;bR3Sp{63sMw+@@#2^gNdQ)lAuQ}y{qVQmvaG&bQ&PqeZ<{4 zo!!>bf1pR(f(|dgCh97<-#9DsKC~4yV}}4b7zmwLe#EYvc$>AFE$7pu4PzPvI>0x}|tQnv1OBzd&fx%^j zSGv=`g?vVqe@IL5@ARk-nFov@365X^bI4krukvazxutg8(Sx9F{pcv?P@@hbQzNk2 zS%km)*_&|ez4zhkUwIh5`;9Nc6Q3W2sX9Q*W@$Ehh3VfcQ==>sEO-+}UD=7_HsohB z?VJ2N8$Ezi7jpRJiyy&@ue}c!r`KUKpM>Vvo%$vcedZsU_DsJ&KaaHQaBc<{=nT}L z!8y|C)AozS@wsZ-(7^)-@OFKPo0G?Jah=Y_4|*(*S~Tv964wc zXsf@jx!J(!+r0HJOkt1#Nt7s>i^xYZ}%8{VnS=>+&5$o{F7vF%_-Z=|1^BMH& zd!RWn1w9ytZm*$KXA8UG4<>=MqX@_UoX&tdawJ-!s3hfKg(EE~{7V}MbUviDRs>Vo z?`0)+yrp%;t+vhaOxHcP`uzXR?n_8rRV5+N|z;$4AhhS{M)=l1$IM%`tbW-{W9Ek%Wmj*HUT=Dd1rln z^TyoV?6ujM3zx2(orM;tBLF+9RD2o^0Qlx#K>z5Ej;ww1(MM-)JAB7$hYlaU^~U7& z$*BXQwJ(41aQ(GoL$J8K0+6?@kDVS~@!4hZDwkYH7RC(|ljjzVU+)MAl_j>A?G;y4 zQT7Xh{4SteW|BzYzK;~s=ZhgFSZF)0KgL|??w^M!_GWS=)$hL9{S{1l!HkFyMk{bF z80j_O)p_3z8tzmOlo^;QMu3W?EQq}V8K3db101@|A}@UGiHMXkRRpKUQ7GI(@VH^Y z8LD(QG6~sc`0xs|Pr4`xbV@!UE%>#8eL0w{Vuj=HY>RcEdvt z9EQ)`dpF#9#}FLY1v-ov4O!kRIl<|8m!x`+tTzGUYB3$`z z3O{qp0Ov2a;N-bWaO(67d~#+1E?ilHg=OVAnS|!}UZ^$3^>vAcuC3vZII_1PSWXo2 zQcf=^C73HdX(wPf2Dwf;QCQrT-|doi{0%G;ypoJc8;3H#*#VR|M8Zp*cJZd3^*n*BWqcdJPtyI}7iB zGza(JGXbLX$a znTtzs{_;HBTx>%>n}Ff*eULS$^mU{giHBZ@^?11?b=qV;OsSk3zuf$%(*LY{?a^Lo?e6L*(F$5uS0EQHw=yJ z1;|FA*E9HW;@u@GrRThv{$_u|C0QPlE^l^JEs`Uex0N;`<^EH@rP?T$o01Xd<%P_T zVuM|N9_pkNX08izeq#(T(w5UT!?BsVWsz2LV%N|CCXI`YFH0DaRA0vHJ-M?K-ygti zqx{Xo9a=nGe+-~=xynKvHps(4oZAs-I0kB0Bn)!((HsMojeY)3N~ThJlWZYreGJk^ z_#Am@791xt|Ds^$CZ6ua7(Y4c$jyLwzDI}CfBN<+$CEO-U$}H6J&(p=!f<{d3k&E9{bej(HKq@ zR610LzPZ?N<2a|;(927?qrfZ4vNB7H+3oPxfXS_A0?cJ`MDeW$yqH}YBY5!cdhE~F zNf;lA5v6F0!t2BADinH7Iygf|m?Ng0s4UzDkbp_B$Son*Du%KZznO-KC;)CK)T6IL za8*cZr>pN2ADg-z^86N9S-k;oAD@R0PA$NZ_ZH#)yXN7}Ba?9W5Ws;w4HzFEf}x=% zj1DznsNT?twN!|!;tT4p)$77$s|717Eo}tM%=X~?>p>#AMAA!v>r zfRXXN(Cu!(mAN^%aAg|a|6~#Fz2hd_clQ;z=gv_$e9I8*8gIhb$PkPSH=#My)W(Hs zvab>!_It42YQe^43s%?KFgM?WnOT5ymzUwxg;}_IbrIHDIgF0)h4DRmAI=4!wroycNzs_P5R?f3IT>OeqbMCsD`0?$_4oE|HTxsXd zM$ZS!iVT;^wj72HD_(83;H@q1ue%I^B++`PMEh`jy9m?)eCz1Xpxf_5y*2@pdnO_8 zwP0!W2F!eP6W%|06Am9-(sX;rkzH{3)(mdlUx(e3LohZv4C5n1Fw``3t0PJ@?Wueh zJ!rMtu)fiTjm%zq=OK{=xO}KV#3D#O&7#f>|@!hvV))>`E3OoA7 z1eH6Z?($X8W#)7vGB;6#mR6IPR_oF23*DqpJAr{hWY>+Vq{f!n8v|fSC)TX*ItUwU z%W!sj9!_1j0&jn?0Cyaohudzw2)Euk0SETiVBfAfOieUlY^(_*Lru;9%%T1qy4^0c zI&D~9@4)M%CB4<`2Q1859Gr=uK=nCK59JzTm6 zd*ch9U-x<<9lDbrTUg3S=NO$wqb@w{rHvb2q?-k{T2g%sQoJ#&p-T0%4LKg_I$}?#CjvQe_<)R>N=&bQDa=cXIY>KijZ{7-1xASd?@95??CUcpB-N; zsVf=UlCht1TJi5y=rvBrxKjmrBRXy@93)woi=fV{+8GRXN=XXEIzfs_{Hh%CrYm*S zv(TqeLnlb=36?y(GDC5@K_oQaT*Kn$HJ*FfkwWL)XBefC zB3W`A99}uq&793{uyV-dQGp{;4FuX=M z#v4`0_f#ppwK1q1D*dT-UNbEN?HV12U%i_5Dp zKfeqM%gWI0L8sr;=hsI@Z-vpxamYbsT14PZ3=ep-vxDOL$|#GADy`g?|pn4hUy*IGc^Kx zr^aBZsgBS1g>+FKMvYN5+tE+3pOoA}rv*WO@UFD` zW8S0R!`(j0E5o+@+)~4YW}&vNN8<>28il#okxd;8VI=`Sb^yqG0w;h_a*88NLTA^B zy57%dVk(JT4lR9C#0ZQ`-lh|5_PZN!V|f{_zI__jKy~z|pTlOm1uLs-u(*VO8?dt0)>l#HjY((@?}p*sx4~$AOee7G^m6ET z6l9nO$t2MuA_y^R#~kVuUS`pGh(CMu@;CtRH1v6h@QJ-nPk&T>*7VH`{4?SXv< z_WM6C*G=ISQkQCw1dfw-4(ZEm+;yfR)t^SYB_z z=4J-{-U!qi6EHls3-;c67;24C9qH6k_~|N`%r%}Sb2dqRNOz1e6S~&Gy|w6eVhdyf z*Nynvh~;uzs2mSzJl1W*IZ7B&9FCN}klvjP`}VpQeCmbjm!4n6Mk?oj`Zp_?d}KoC zWQ_G0StsNDgng!>6x4TeWrX9a0$xd15=zmoDUz|2Zji6>q@EO3Nymxxbi-|x zB3Xz>iBiXwLs=3Z4UpkTKa+64+e8E2M|JW@U@J@TH=JMlpAslqpn7aYS%dE{b59O%)v!{CILHUuQb%9}P}u_DdQ-FQL5vW%h14~M6$>Z6DoMH z5C6VMx9&(wIHq`Qcwxq!K6E@qinyZC*S2qSB=w3F|88F2+MqF@XnO z0X64F8B@jtQWbCKK*b?~GjeX&2qfW}DB~3I=c@C(1(0_j>vti~+jjWlm}Snk+6z>tqHaIu>QBNl-zz3GL`%*v!TF{>7DIBnA%~~XrduKHT14t z#F?s7w;^vBC*bsDJ=gm96d5NP0!~=>)wy17s4`)%{-g5-nNWK?f~2mvF_{lqkmW7N zdz+B=+uH2v_qsOm7&qgLz|?rEsbpyCPZ6=QaQdE(V-^n*0xKG7Pb@5hQoc%7`Q)TVfLT*@3`6jnpOJ`6UL4`ytUJ`=Tx z?;CnBc^0e@R&dsm!V$rbyV%6PAvrtr?-V|(f#dak)M(=@BD_-jI@0^;>L zAJWFYN$zJ2elkB8;S=$B8x>}s##qFOax5IzyH$X_1?+Lk^aVc2-hpCiMJEPyPavzQ zxz083>-XC_X<(Kayg^^pRo7c7zNj*!U_x1|<0&VcLUyfT6PXTce5u5T3TNgzz=l5Z znag#ZxtH7B^V#tfPeLa$KZeZ{v*&?TgW>b3#}X1E?+(V z;k&OLeg1`ic;%HBUt3sMnAI05Z9V+v*Bb#qN`G~Ab@`)@KKi6q8yXsF4v*~GwP#}Y zzFUT$`21Z%r_Zmz3$LEY>e&#~>q9Oq&7J&D+9B3M#ta{B;K~M~|4s?i{OCPJXjHiG z1)kXyjDyst?+jG%9IthV1lLbs1((S_4Bxe~F;Heh0m7LZ$G5qoG;D(^kHw)rRG1;t z!9EIpGbSPqpC~6dU=5AH_3J$dCC4nO| zZJ`Z_$7q%j4JXC$BYTqEo~6%orMM1hPFhpR$COd4jQ@U5({sPBn7s)#Ge)!taaNhU z>scLYjXGrYCS>)7Id0Iy>-MbHu6ORqT;WY0R>9W>O%N}oLd*P)(7Smkh;6lEGkV^}@AFs{*LVp)|Ku8x-p}bCh zUd$U1e>CwYeHJKj2at&PML)5dvWwO?nba3uQ81gcXQM@N<^`Kl^DMyLIli`<|H>v0g zH74b3(R@!iD9s$?Dw@Y849)v^GXRxYp2w&33*$(klFicsug5=g{ev1~DSl9<=g@l6 z`+RIg>$wc(>Lt8IYHOvy0poOwP;Zf(i1d3E9gWwO3`G-hfEzMW`ypRR!Q^BK(^ok> zsrQ55iqK4C5k0H#`zbz-hO~qFc@=t~e49JTQcjJOq0XIFgUG`ohgQ+MRcWP6eo7Io zRdfPUON80zN$AM6;s470TkAuowGQp}JbeAhhvD%@?uL5agLZGTySluvbm82&_g{JS z-IaF zU-{yZ?7jCthNadT^cxd81kWfAsZ=|>U}7?}&<*;l-uGZikrFa!2J~NBaXic_|0%=B z8FuuEF>25YD;bN`0Wf_8j3kDH0-Q7ei~A0p3`YO+S^i~);hh}CBT3D3@!ZG4y11iq zCsK&hq9%>I>?=;_l>E0U`5j?{2Cnub8dNvL<%ksH*+4Y0dy=bx~p|=0(n1jHW za10rDg(~t#@6{&+MRg(4wZfTpoRCcY8f$vP(C!-MDxbaDl~>BTqKT&7<*U~K8rG=7 zoq4Z`)BcTPpxd=`(f7NOCKsyNm2^7*m`$4+hj!<}C0W!VX6F8IEEr2c@#Kartsf1t z+0C_IiGpCd4~!~DAZSeC?AD>L4FF?QsT&09YS*u>5-S2U@zMqB_%#tFed93ECYSA` z=N&Q5;psZYX94(u!ms(9bk2{zNNC)Qvr2-?aygNH-(abzeebjm+bV~P7gX*f7-YUA z9BECq?eIW7MOzV}dMRNjtatKxXfaux#RcLe1sTPYGh~ta1zDsMWz;~~u*T7;dQ`jl zDvUjY`mmyEbjtY^g(1VLudaKD@OH_~tT9(D4Y->UUV`CbAl z_IZ$Tc|A!&htWfK$i}gGUX1gL=S0C0{~qJhj?pn8c{f^)fZ$KUjT!ztz^1w-#~#Tg z+@+G7iA($*->^g4)#^+oSr^h5|D1$`Io8VF9W+8uh8Fo?HQLIkP9Ss}!kU^Bl!IQ! z!_64ANu(k~^X?k#8q49yM~}c=N5-JFwgh>1v$HsVWAWmJv!|Xvdh~;Ozkgkam~LbI zp9Kd%zGu&#?$p%O^4!AB%U7l^pWb!gw!`}m-!gjt-4l&3e&H^7>75y9Z7##;#4vPp z_=&pgiQR$8iOqVhbwW3apAtf(yBURsYmgOwPy^W)?it&$;xb$lqe_3}=Y}}JQU=cn zxZLP1_R7-lUU8<1D|a|h{K(#JtQ$ZQG2Pg}4&g|_k0>bjSb8`(1EbI5Qhp?%sNc}g z!QJ54yB&MBLjfK3i4GM(h#Skvzeha8GF-9s0w1}v%c(+O4bs5Lp_LS4?CWtl$AC#(ru$L5_!f5K96$xys3rO`J3Dr2 zlzPad0h#`lJE6!EuIR&r#G5O`9GYz#7+io+4nZ3vn#e?S zyQyfT=zn#@gO`=cI8rDvi8@W_v%i)H`?ksvQ*gtbYD)Wl3bC$t%5dCMoRsgfl_@7> zyOm|ee+XB4-nU+=Bs%2%hf1?dkCbo6crB7Ols57DN4-NuGg{k8^$q|p_jpbb6B$6G zgjFbdfoJ*V&y;w>-f_M-eW>uWIN@S!P@CDt)#zdNJRmhkTz_@D>DCEQ%qQckUrqD?3dEGLD7KWCx&l2`G)|?@ z>ED7xpi$cvGBO`>zcEZz4ER)ZN0o4U3SaoVKml~~lQ~_&@k5GxrYJ@_sN>JhI3Tjc zTW98IWFPAF95$AhV5HuLFFkr6JaE@;7_RqWd2^+|xxTu3{o3sL+1cqcW6kEx8I>7z z$Gl?yd=3EkPygvZbzlC^FR#Ax>aR}hnw)&`mV<|m?A?E0?=837H~#H!eX()k{LkUy z)kT1@Nq}6P0rN?vXmP?ni0&*-1hmy+h+%6j7loSeQWi2JcYq3k-F0wAp*5uJEdARGvfDyX9?LH(4wv9F3Hm4N5$1&JLZLoG5p=A^$wX&X6EKT zh-OJE7%|-bd)j>%0dl zl+HUIii}R)KMil^d~6U0=XQ$3`>OJr6i=kl2~wm&%s0JJi_UN4j}%Az9V!DT+*Q^n zts=>yqW5*!IN>`~9-FpGaHj2Tb^b(Uxu@n}C_@}B8Niakp|MA!smL?8lcsY7gvKn% zNoOQ(5e*8V#<4;y&q1~IDE}rJ*eGfoPVJo|5g$ei$~(zDzp#3W=Ol5&g6ls(tiAmy zG{X40E|SFvbE*^>gk|rfWKG%kRH5T4;}cTCH4b|bFOc9X=SS2!Lj5B#F6UtIhIeW# z6bAkqHG1i$gV%>*9_o&Mu1V6lD~t?_kI%6A5}iBb?7Po?mijj})|zhG0i=-{l{4F+BVu}2JT z!cy~|QfxX1$y1h){VKVvnM|J__gPrfBx9i)YQVv z%#1qs|EZS2;^ntk6apT3`jK91sde+**|X>8W~ZlbUY}lW!g}w)dw0X*58n>ECUWR@ z7NJo$3ATXznfrc)-7@=}R(FM51BFaL{Zo9En;{mbK(pVmEtAA+aN-P^Soqsuil#Bn z^sa^GX4069VPb@@Y~i31*ix-my{Y8B`T3JM)( zkpsy#Y5LN;OPL=N8t&Surd?^_nPi0%6{c^`sk^qc!-USg`fRSPQrCLvbN^@%2*s~c z|L5nEI_hvI&_)(8UWJBIDPOU)mBgtTluzKsoeF5E2nq`26QL8u{?97+=Fc8qz^_C} zqwCua)$KC!_9=aH9^mWBQ2@{*7yD=FGKVNgg9h+Aw2=>_p28I0k& z5BaoLusP2+Fwor|H0q=^rH{F2nTX>Kags7*!(!yMer~Uxqsp(-0jwj)qr|QQVJ?u? z$SO6@Y%~u2(@_E%C;5^tPO!{Ugo6iK3E$Sl#HVd}tAi4f@ zLbAF&e!%mM2xCCJA<`UAB=qVWJ%WKzrq@Y$O0DUt1{GgVq0S=rm*yRV^Doqk%y$rZ zO$+wgMC zd?jYHl}n-OQHyLz|}^{fk>^?BGgRf8wKa5p?~*De^Yx1rlw z?YB4A*00UZT)T4V+_|e4FV55-eYCX=1L?En08r(}KmKw5;fEjI?60%+BH?_0n3Ik@+ZDOg{bg$!Ee{#knh)aG-xi^1;*nSxhkq}X5jNwpFxNuRl* zhgY@}oXW0Bi?nbGY9|`R?B-RK>FqiA%H{;mQYVx{%A^K>C1zYz-sK4`krA?5P8gDE zXe^Z$sg7SKrv1>-V}z_X0K##_h78_H5b#V_jWJV)*YrGDb&%9AV*V(A(-;Wh<^~Tj z&@4_-i8YQE+L!&)O>sdGD=~4zBp3derKrl`z=C;ybd|uCk7o zMDIi=NGrVY2$?!Z@Jnb_3F?ATq+kl=ap;g6RDTMU!tnP&odu~mHej4%H9jISa#H9iE+^jwgN7`3Ww>MHgEIbkTESon>9o)d9A=y*N8)&Q zdaUW)y5fzDvQp?c8L(90CmcSVVAdX|;P>5EFBnB&@(F~S2W4Z5*TtZ^H#!#m8(Bph z$@R)%4(GdC;R+c>xstgzwjOC4p`^M(iL%G(FM+-ysJBYL!c*o5@tqr;E;jJv%`IQ3 zvqo~l^Y?a2zETt#J(N1Tq(0(EfRN2meKMgJWRi1IB}DB&z1D-xwd-)_ZIkeguRZ`H z^&WILSM%29a%W-T#?`auPQQEc;>C0O_U&7H$LWeg46H^~WE%9ZsK}h4%U))P|do)rPefO{Lp0EyUqEC1$FVU^XDb zy;rpm+h$Ae2W?f@y{ulWcZr{=7DBR+*u`DYlCk)mI1l3><1epUE+BRquX>@{ut9fD z8AVS)=y^d82yLc`C3s@{Qk(8(z69mZH1A(?X~~86kXS&}5LIq01lIv5@dpx)aQmhN|rc9(ICf zUm;AbShPOOoO$EL)n{HP-iAzjX?l)n%g(aR+V97KR|t9lQ}j@kUly%r87|(B{QF@1 zRKB$&U0>LCm1>pDi~O7CS7zSg`hMr1j-T?6F#K4e2l6d~Imv4*zZi_~mvIcg)PmbS z5)M=3V?}L+=MpHMNIynX4&S5i3hS;=0WJed2nk<&ivL zazZCiqV@uZQo+%r@W=)+EbMc>BT1tGf*8+|BU92m@n;l{(D|I!zqliTMgj2m%jY-! zoazv1$A@1_@$NVjwqLc-wL<%Ke5XLyrt?#di&*AMb6c(hlh4|YkT={Yy_vqSPkd@x z@NJo*cKubsoHs>s)B#k1?^i9Uccpnx8_qFJahfixzY`9C=zXorgvyxbc|HnN;w{wi z?erT~SLB5OA61|FI_rPG*Md%K3HD4i;IW5pgU{Ww8}iK!=(RWc>ubyF(^oHFc;}tB z-+cS+x6eQMP^^Ta~LoV8=>0hN2}y7QGD>wEn>4 zyYxPEIv0{45*2(RjKYLWVN?cHO7PvV&G<}cj9Zf%0KL=LZxu$Yey3hqH%6LH(tbC~ zE@pym?F1{pUnPhMX6U=x%|Wgw#4}eqZUgVTH;wz9Jf({j9G1%OaZb%62^O z7~+iYM+&E17gC=AoYWxE*QVK95FE`FCs{R*{M?&lf4;aRfMkuQ&W=}6xWl{`X}J8j zXgSxd;+Wxl1^-olJmbHrOLG7WY5=0lG;=BOM(kVZ zJ@n|rK)ndESwl>8b3BJ{+Bf=weU`Y&PUbb`rjmr;a9sZAZ|Ys0)RP>&3Jr6*+w4Xf z;l$}RHo2{?r>_{ba5=pEW&w~&w_q$US_@2qq#Y22oj zzM?kLcnggntgG*ux6Ine7NgkN!#W)JDx2Lw{a{4FRdd!jU>UMg#t9l#bj-5C9MSpXBs z*WiR_Nil+zm^Zcu23;HaaG=Syk84&r`}+Edr6fZR&23^>nwx}7Xs=e%t+JSMo+4bh zF0}oLhB@9a!Dx#BAKa`G>X22H@@g`J7j8^b7}HFC)h3xPYm<+&XsjF;IIq%rlFD}I%a31wBf88Wif8Bu)%l!o9~kGOLRW;TvE5JPc>6(Ak)W zX5G48lxdOqg&Z3DiDIN0QCj>=dfFzlD>bpD^Pa_Rmi3kDFIEn{A{8;EQjlf*(f<9v zKoZ4;-a!9e_&H9d!*Rl#G&@*i15ZOno)bH#psjE|3iDf% z_t1G!g--DlY;bTL+rs}Mtx(G10wUELd!SF(5+hW#=c0VDar0x)gxGZ8(85~&WL{L1 z&_d?V6l{5pET6Uw>K;t~D`v2m|Db^@V#8)5seWq~ccg;Bw@-F4INW1D2 z01b9${yWO5l>pVK!I#`Tu~1!a>%84*Vg!ad65l$6Uk7P z2|vxpD)r3dT_Q;-q;ato2d;O-$*Ua|G#W-5I~Qnu;jFnkavL$)Ac3EAC)xM$#Ijvx z=8r1jR%PSzl#kUZz&Jv+OKLOKI~y~2UyvD;mGJ~};#-5$<{*xEU4;q{YlOS$63@EE zNlc9MrdUz-h9&Ec@)V)t@|6&WW^*u{k(m?#zFyhqqTh-NZ!c|p$A*^ITNrL4daK4e z%JVhxHo~hf)9q$V@Ahy?U?pL&*FRP(bmho0_SfM*b?Z(bG3SJ_+(t#B`uQaDjZBI- zGq(%6TVo0Qhcbe|On79lsl{|b{JqRcUq{R}SX*3F7nu)Kp?R@$ zXQW9F8jT!UYYWhXHTb=+d>-z<=OEPcR-Sj(@_w(?nV-M8bmh{eGq1jS^yKvP^kU@6 z{4I0P>}Zi0tRG`q0Q>ZsUfBy6yj_|mG_-`_QbU+UUWn&AT}Y}oOoFj6+AN!M+{Lgf zIb1u$nDmYgIU93~D=!+*c&C|y4W5W2L%LZYFq&=lcPhvt9v3PG!LJNAUZKFg>~(*b z$jqL*cbOdMf_08OYCL-d(BTjfn9Dm7F%O6nx1z~!GKI4Y&pNr7V_F1hxNC$N^C`}X z_;uoD2%;5m#Vl^a|5i+Ubau)TXVG`66-pN}uk~xViZh9je?)h5hecN8B*z>67UGom z8SP-X_b?0`Z;y~*w){wE-uBl;2BEHmm0`P~+%U(4FsjE4+pk?(s6wpwmaPLI#!EtG zmhnpDKkhH)(dGOu5sn^e5pfnF!e9Aq>i9gBtvncE;AG~;K#WlpGOPI`%`WPnTF&JU zp*h*+WG^ytHV&>Qp#y;FOxtm$6unRRP!%I*TRZL1by(pV3HdU@gpLz|Rw!=GFaCzE z6bOv|)59rtB>0<|s+5$oL7F#9OU0*rT^l=FER6QpU}|`&W##0%^iJX?ioo$}jnkqM zIAoCna6J}*WPS5!=^{sJmEX(*+kQaWvW-PIx2Q8QCRfzfa^DJvmCG3cJUvGU7vVQ% zvs7jM??K*Qhb&)%+Ye5_H^24}?AtvIYpbh}_1c}~#rcJ+(^pPiy*hKc(a7cjplwjM z({%UQIsyPkj~?wk{P4r8FaPqFpVYhgvm-;zk$%0=xNmCm@R3_5hrjW=4`mC>AHvN1 z4H%s|WQnQa&dqq^R}N<~j81qQ%!d4pxdhmnlb(8y`8Y zQoVR3J8qMnmy_lpC2V8($S6vLwEUhMyS@(3_RVCI*=?y_0%MyTVex(2&)zaH*JWWS zF74ORW4um^prZZww&E+KB6=lr?F1wdhgwkZD@=LOGDaB^CbSui^q`*z)(~!^Ta&}c zB+-ozr_7mTjB$*87CAflIu`4eggBe|@CH@XM_}z6JnLH{^;K-dP(x>pqZwJjkoc)w z(&3@o;vYJSt;)_@yi2;(e(8=jj;V-u(SNJ(E-y3mn+5%oYcs8~?woSOk)*%l+(t$d zmC&w-f{@cNw~5D3j4z*W#IM{kIpx$yJOkjGkW_a%CXY9fuL|_);N&n6`7F&_YL0mw z?_N$<7xV+-5z zXPhacmEfytpey{NQR#QFynvE z47x^4G)z`hqsj5a-u)*AJKeFPYl0gNI@uiY?1f{YN{x3)1&SB@REwCqdFJq<0n=Gv zpq8n`f=oF@8ne8GDoBxGBHeFH`_EN<*g~h!(898Vs_a0+AmrcI3HY5 zmK-A~gMu0n{UZ9q^VR&;7aMhA*r8A0L;J!uy~8YQKN^>%8C0Ajcvuukygo`M&fd_V zl`7Ps82|RL;TrM=krrFp;G{V6j&MJA3P-}wb0B$_m|DALUS#n7w36g*>PM4y#^KDL zf%kV|d*@T^D0U!WJ`p>&QBo-OoPvs!tjQpN-^b*f@iUUIBdFO(zOsNUjuvBs%<6AuN;=mLJthHX+^&WsifXNm#CV?+GOIPmS` zGe1`908G;g$4#!TZqqOo8<=L@>k$)hVp$f#9P*-AA0Uw`R41wlW7oNN72oqWGr8oL zb~#1Pu>$8l*NtnElY_5aYnLIaDF094E&e?fX=xlzS~f+p3xNqYOgP?YeVR80Xw-tB z?jVh$O!4je>oX0r4%bsH>q7%NP|G(U>#f4W_um8G`uYRe*v& zz4^-*fBEdo*REZ;^wd*NZ5};(bW57wZ{iUERTNdV=H}+EzyA7*AJ0r*K68Ec@=|+k zv9oV-2)^;vhv1P1ZiDsZS;)H^P^&2+(6zfLL~vV$AS+?0ffA0|3M!FKk`6ckl5tXg zKKSlx5!|W3Ah)O~D|GL0RfaBbO1$#e1}U-!&>n~uP!uph+Hq;Y&^1oJKBO(>johh% z?Wetr#7F29Lo{IH5PnxpD3Wm`!BSSZGO%47ksvX@w)$IZvv~Cp!QPh@0(>5*8^XHb zkVVd!uuK0%a3s+0ey-*ABGZ8UAejwCbHk09&=Hsz4{rnSTgcPveJ9pXq&!IHs4KKV z01rNDdNW}GZXAP@0GAa3;tDzc%wgwr=qNPVAD;-K2qp%I3UzFJR4;kb@f{iq0gNtG z+-ZdoEd|D;SZv5UH!BkO33p$-gCw38swXfa=f`a5Ux`y#1WQ;uAuRE;(oRTyQHi$l z8yz=gS5%dDDP66s*H+kWs%I(Xh%QG@WjR?9c$4VH+hKU z<63E*o^m<)SYvS^vP3y?@Rk4_s3+?#q(je+DIcvQll*($Vb17=I$${;lK4h}9$Q6b zrUxniS|C-*S6|I+WVyB|%|&g~qh%Jq)+u8)r&SW#9yF9groRbmOS5p#?fc+&zw{8? zdSC?lt(CmfTJNo|F0D;pxp?KH_uu*W;?;|nfB3^6u7C5J-~6>D{`)LM0GMJfE^jv) z6F09+Up~42(7}^?_wO5nY_$34LkF9)Hy(lum#1N)y#)PQ6SDfKo-yUoRe$xm-E9<_ zrbe+SLIU|OD@{cnVE>*T$UwuU?Ue~66r9{(#MeT3leQ9T(dWNg?@9MfL zUI3tQ+3HaY**kCg@W033{f?6Uuh4FF<=a=XuwFovlBR=yr&%f@eLu^I(PnUe=f_% z9XLixjF154)O`9E+%LE@E;%70XEJ%+D8I3SAM``t6%BSepB&z_@hE8tt}eg5z><44 zKMGOwoX(Wq(NEzyg14gnhVp1o8IPM8Jp{NUd?| z+&~p}`)R%8bIuzQ{K&voY#Wt1Mnf7c*hnp-pVE?hJ)y+0<>ij0F`fIx^H~+~q>TS8 zZ$YQM3`3bp{PzSr{)O9MbA1!?&T4OCZE+SQAfE?zv|>36OkI&^4VakL-(=ttWb z#BZnrz?62cH+J*ruYUeUo^{7YhsT?DKQQ{lkv&uU9({0M?Q37YKYQ`b%dobw45L#+ z=G?Kp-lNwuh6XYNa~98@`%@uEk#cD|)b;)57fCErtsrqmiUl*!!|)?tib9ZhJ^6XU zQ)k0uv;h`*fzhD1+);&CvoP&UhjgpRh}dH)_U9DrxUP2^n&So@{BV&QJefs~p}>;S zWpG}%I5mkj@LgXILsMnErkG9~dK8C^$%-N}Cr&>h?#-C!`;zm39$P3AQWQ2k=NcyW zp$-D-C6~OsgA}R&a2(@rg9|*Wh*Mm~Mh!PYqP3^bz?+>4@3iu5(!3%5U#>_nde*xh zVZT_H3S;xoCQ2d+#ln%2kU<5j7Al0^?0vJYU7hIGn76&4!)F03aNDQ4>xr6mvEV{$@-n>p?RS|H*2E)#^rbI>S>oK*r| z=}xt~WH@XMdAq`ea*QiJsJ@%?%mOY6y}Iu@nlYpeZXi>9J1089tv@0`?vxL%@so3C z7~J{LQH(0!yT}e+hj&c4Wa}wiz#2~+Q6?}4EhP0%TEXWsBj)cO^SYIUQ#EWW?M#dv zNy52escm;G&s|y$THnyOoELD8)VRXBS)IJY5`iXn@lx_4VD^SS^PXL2K{v7d z33N276A14~u%vV}37;Z8lkt{0;zW6mwC`*aStp=lcE^gWp~(A7@#s`3>N7nail6X$ zYT01d{}p6Fxc0m(r^bAW9%+_gln?k$THp4+``kJFnV})e513rx`Y6H@af;ye=h zF`l;%Y+jZpKN?FR!euZ2ss+Kl*3c{r{{u z0P?xH1DgQHFTV1^3onffj}K2w?cFspHaT|WmODnj|LsTXr!UOG+38it@(F-!RG-6j z7_&kUi%Syd7^yLg9YNZ&#nJh~f+7pxV#BhC$)*+=Us&AJDlz1!A9v1$_dyf;8Dm*i z&i&aKSrJ#CIK84FA1XZ9CRGB`hG?7!DD2z6A3Gc5-Hs~1(SPH4k>{8TUz$gO&q*kF z{ri$qVQ4fjrOi+Yrb05t2iBL8WChAYLP4nFIFQyyN+I5A3D<^Xux3$y0B-!y@ub=| zc+%gJW1;WKN@UqsP&iQqG2W?k_D}^S-d}rWX_1Rmo3UJymnnLcek`ABF&xSTl9|X zh+yLJ;dfNPol&nM@(3-vYdZtn=>Mj1i8L$aDPX)zl*jhZx&@?x7zcB~dXfsq9W|~T z$_faF%L@LxUn6KN#cRAsN5NQ%1iBAkDwBuLwMspzbdywZUiGK(Boh3N9 zuL*zjo!@~w4)4u3SC+E8v)Nv{dHvd{kB`6d!Y`hG?)a(WC)d~4mjz?$UrY`FQjYf3 zIf#oFFJAuWlMjzyo4q)_c=PI7)?M%4bKBnhJ5PNPZrNLh^`#kT)_QtZnG16DNmM-S ze~o@%&TqJDY^bAfOXpp^0hVH}MN9{Gv5FWlRiar9r{uZ!wHG)Hydt_0gFL*p!@Q5X zk;Mv8F`7byT6$ilum{iWy|Y|F3U}GF3NRM|&ELlegK!Qi!JCGH{H5B&90vH=j}3iU z;jVts7^)WPL?~BW@wXICwq}e`+?1_B!QdkJFka*8{TI=5j1&5fyk?DD!=0P-c>EcB zFK7nmKd!N0r%@v^AvVf%`%XD2 zUi0=XUyrb&!PY>m3>7QoGF*H;cvu<#r$z-{W5mW*taLKoL#~83S8Sp&F13-uKzzLv z?^|;Ec^*lZ8+8&}8cE4KtmW2i1p^NIa_tL=UK#9Co1s!&h4=aQtMZCM=RqiuM9zWc z6di}tNo>+lD?tQ4z7vXiSO!^F5#9@SZPe-JyQ$`QNgByE=^o$d_4Q>v zYb$+iwNz~naTwyVj8-J)Y!RJR;r;2plIs{FGF&|lk9`tF&km@Y>4g;^am@>HP5K~u zW5}zD-Y2{ zU1NRt`d1!-hwk4G&8!8jwWYk?^|EL7oPn55g3Mb=x!*dNe5~*c84wXvO?BN;Aymn66N_d6t5KW#*!_u42A)JfzZ z4;1iJ8&!?j5O?)LoKaP*G4rwl(j8+rc(l3geRaUrLw6r>O~5tT@M8) zDjmD^*_qICs|}&W|6%t0G)$opt3t@pxt?u7M5-tP8>bSWvUpdO zc)hgz<9yrK)36cv0{RiAR-$`!n#lLA$0bdl{<(x>Kd;q{2WgF^oVsaP*?03+G#1|n zx>PKE%aE1yIf#r1fh%*Yq(CW>%SFYE+ZqCuc$w5kaio#hCf?kXawaEHS4=xaW1w>) z(NUR97>w7`0cxAj37|Ydl*H+mxP7l#LfvxU!*g+gazdrjbku*7@&J$kjID*G&P4;xw|610C zyte`U_7XgF?|%69?>!7dwJvm8OZ{$VZR5uEnVAb0FMNFc`nB_ulanjM!^7$pyzLmE zzcohyRLN};gw55})l1zj{HoDt4%g~K&AUfN@1NR#`{Xyi`nl}-^(A=c<7+TH(S%yF z23@^d-PA_{+>Da*e_poxb8>2NNcW#sA;6Ttki0p8JW2H=UWUJ? z=q5!w^s23*K2mF#x4Tux0$=mh>f@Y|_cSj?;~=c-stgc*UCz5go`o`n{wBd7IXxs^ zgWtI^nVJ*#yCr7PKzA_3aQJ@18-92nDg59VXo$bh2a~2Hy4=d>Q5ALv&=SgoVqR3#_g2=0g@80H^m+yt!Zykd6`eNSNT<**-%+4JD zA02+;kz0o6<{rq;Uzp7{I*X9i>(Ho=L(g8(o%igbtD~_WZU#`#omb>7!@}fErM$s= z1*I!aQbZpL9dt}kCqxmk<8xczyyT*c&DiLUu6HtMra+WKTFhBt_su1ED&mja;lRgS z=sB~`C8ayUpS$O}ih3R@B{35ScLies&@WW3q(qKsL03!WDF_`1lnyXi9DPT%96OIbKt3RZ*Bz zhD1>8lF%>&JGCX8g(U?tePRNg5o5=qSY5st7`X~P;`^nGc3 ze7$;E8#_ZO+K}$CEzb}6`Y`QDD36^nbnHdWPZCWMBzNa?h7K;iIl&Dm^P3~rq|>7a zhiP72q!SePVaFLH;-s@5>(S_6q|QzTQF1&Urn34{|6cZna#kh1^Erd)`V0B%_MKe3 zJs(M6bfB1yss6!#scxL}O(FXJAo?Gr1?fFWe#HG!JbD|?ZGHrHi63>O50M0p8Fxgx z8=QpoX%lzjQ=^~fP|N#J&pVLySE1S1fTzCpIDF-c_dvU~3f<01cXe@o`Qo{A@4xcW zi@$jP{deBk+}yl={P@S6!mzP_fkyyn>3rb}_beYfcI?c>i|0<R)?E)b!b#>SvHR*^qA!tg##oJc4;_~T z2mhYpFZ_GiJN$PEm;86>H~Lq$euJ?SN5CM;3x)(bBbK0Dr@o_kA4n-%lk5R|R=&pR zI^p~w4rTSvO;IWT(~hu|gSX1OQ20WNF6QH@;+>x<8Iulkr_Tc(SkNEJ8thV1SVdlB z57QYZpMg8XLzQ)5ZUW)!!hDW-A1|r3Q83y_nb!1OfSZW^ybkStNb5K0HeQBAQ5*q1Jksiyc8Lw;lELO;TWKUB3P8CL>2oA$6Lk%rnYs{gLY?H!A z7qEZdEOhB=p<-AEEmU!(y4cS6VdQz>N{X!9#!8rZR*ZwH%9!uIeExmE#<`HLlQ4i7 zd{s-CvR(AvU?rgXCAAZMO9%p)8#`V#WGpIltv_6+w!X3(VE>Vc{R_Nkk@5qW{ zsKgH9;Hf;a3d-1^_@&B8Wrx&G9JjMK571Wm+AM{mXy=XnTU^pK92$+OcSEHy1!viq z%APwz&GEYmqbsRWHs>N8+wWX?rEr$h2s0%0SKQ6it?Lle%Ji&t73x69w#=)l_G$Eu z#Dkzc{Fyl-ga7$dO50jp1G3AA&sBMc@XI1TS4LZd@G3=WoZO1v$N5GXX0II6JLN@@ zWP%fn99N)yr|3Ubc3K`-NW`%i_~PG+^{u$A?aHy(>BVzK;Ah++FW~80HirGUsExq! zfu@G}UfdV*rk$MAl!Md#Zii9DsaKVE6+0V?`MAn`rt_Z#wR8K0(UKRF#x+OmDHScy z$okOhtU<560Jq&T27ma?$Kkevqp-d*5B=_HcX45EVS4(~Cs(I0eNrDEx(NWSEg4Av zf{p;_a_rc#?tS;&xBAvkfAw*#pG^#pOblmPb7*9I>b8ATdx!q~d%u&duD%Q(pP7Tv zkuj*(#`Jr6UlF&x&6auXXfXt6R*w5WIt)^tQ_}{$;wdI{ z`n%fEM~4S##ot*eBo{MXa>b4<9%o}9{IRnkHEvo*!o9@Ey%B;t=H?~?$)FAKTdnx( z?|gruvQE5zQ9snv?8jlw{Yi!h4Xx*}#x&^WGO^=??;&$f)!_yf-Ce;F(`N`14f&PI zR*f|N9orAX%Z%Xn^Hjtmy}`wII&n7u>rrC}g+~Y$^(fqbW zbky}!NU#+;Jd?Be&F%u?n$@3(Uz*UMyXi#2k{yn7j^LfZgdZZ^^6TUVagNbKaUk=- zu-(+}Ro6M6n<5@e@4GkX!7#pJMcO$dO$VV;t)r>zQ6C+)jTRME9=yDeWe6J^-k)k3o7A0E@j*cm<3pamAcr3zY z8UNC4xdE|t0|wuxZA5FL zppHa`RrtD08wP%PW5epu(UAdM=dupOVW8s)#}KZ3|D4c+1=uCK)c;6Hw2SFvYlW>J zDV#nt`o4)0kt3hb7LYaqitL#pxnByoCSHUfyk41>SRNof$?YOf#%XZyXx8M9O1l+L zrTu6zJDmu^6Fs*_`)D- zTPmFQh%~1LsD_Eml7UgA)cW5&FIMwGcRx*&-pN|UXh`MMknopMs--ccp7XktZ}XfF z>N7sW{`tC=U?e>VN;Mip=6Ootl)g(iO^r(`T+#2->+1^I_&|uS>#Q(yvb%7#glJzw!K;(g9tQ^vY^mAqg8A)6VJ1=(8IA7mt_EQ(5~`eOjnP zBod$W=-YtugVRf>r^qmd-z`sbxn%U)uv4XMUGqB5*i~}gMIWWt1ipv1LK*GGI1(JD z1xbE=MIUZtc!+5a6KAIA!9SDvrGL+y*;jJet&xJf90p6?4$1?^0Er5~dDhL792)kx zd0j=D=WU(we|)$FUwZU@_}14SgrTert@Xuzx3#=+H3@RzIk%y%Ej|b^D|4`&Bb=sUCW>P-Fx8ozj8O!`ilVF zHOO*x9fMMALqZ9OlPnTk*F->2MUIx3squL{h6k6&CVWim~tvC*6oB=Xp$f(E(q0{gk(Z@c@dE1fGZF8(!X&NzI2Zop;=B@1VIWR(+5;}nwVJLGZI#iNeArful)q%;Q6s+0Ak(MH5 zF~r;U*X-cM;??3a>>Kf|5}C|)RL#~ z7)B$aEMIZ#vI;&t<5x}_zFS-PCb^N%^Gl>Xb3LF5w&(4ocbd$&ylgjZF~_lR-?%g{ zp<&4&D9Gc&pGgKPSIB8UyxH)!N}o5yMLD>!+FdV6B-)qaxnahW?Zd1b+_><^84X_} z*D^xYVqnz{osyTf#%n^^F8!4jM;B>FYH1VH$fEkC_s@juj!u<;RHsQ+FaihRKfKUu z7P*n=)@5`I+Uo$}W(IMzRp3>{`UuKdX}sRx{W3MQ{ z!zdlyrmz7~aFb+VsY)yHi*y}qulNf`2^~55mf;b3C+CL{Cj)fPEFYx)Hob3B>jU&x zVRQ8=Jn`@m`1bET0=p;b&}*;e{mw>jV|{IP_UhH?Pd+|=;_B6_m!JB7{%~Dq+x`re z&uRpKDjMw%Km2fet=GG8`SSVWw;a0l-ickiM<+Vj(80sEH=p|I{cz>#JiPPa9CY&r zjE?VvPS=JMN z@xT_*0Z`!BG0x0TDU_fnrPhM67AXXhbMx0#B1b6sC>vPhxr8U@_|moA9rdYstuoZ= zG_*b3NjpK3!5GgS zPxwsewPe1l&<>qn+iD8va04WWMkjKa^HTd5ovy_j0m|uO0%m<3)V0*RxSG6SRpzt~ zoWYf3uK#G=5GC(aB{)gvi|go!ti=XXzP@FN>Fn)K!Fe6)tnr!(__USr7}3HSOADd_)RL;30wp!X z-$DmZ#r9B#BRiiV-H|RUPEkfs#URnJ=|t-2EV5VqHW~n(%@ycx-h?}En}l!w-sj=L zd-uTl>O5qGPM)U-)o&b8Y(2p+g(D96!GEMDs7e0ietA7dB{hGA%kJap$PzWdnV7! zwAthF_o$k+wkqY(0(Wk=4zqpfgxy6 z4Jt5-6eIrJIJ`;N4tj*COssH@sYtl+aY#Efrld2E^WDW%q1U$1HU<$aRq9GRMI7%% zJA}dR1H&ynGJy4}Bo~qtnxe7b&J_FA&VymdwiSl^(4a5skB+tSZe!$ZO7#~iZYaD` z^v~f$yc&KL=66WZc?#CFlg2*7=!3*~IX$I9*=do^>F-pjYACziO{Or=_i}=RqT=vS zm`7myrD(2FJdMBS>){;8*VYydne+A(KPYn+mC>m99)_z5>!O_I^?&Iv0q+jq@s4~6 zc2mNmTfR*LsqZ(2GlqGvtmL$9PV?M>Q@s00!0r=Xr2eNu)zxu)ccq!+bd3v_ccOz8 z4V8di^nbUdJB3}yvR~rqWkv_x9gcN9KCk7lRpIqz;|ju^*``lbL#>Ek4&v;kzo+;+ z*9EG|)=lCu?MPJy3h%&Rr9G@4suR`Mqy{G5hg*=xMOS;ZfwLk1bk;feSiNl?&203Djby9IpF(A z6}*#qP(!{*c`r6<(q|><`_%ZWBv=ZRC&{4@dSR<8B3n@i$giHNgU1wBQ;!SxB8NxO z_f#q833%tTO@I~|qA~91+#wGL6c+pw6w+c?SRWK$C3CkGhgF$^I*0)m63zxxP{ZAfvNO*ie8nZ4Uj+-Ng&5>mzEES18!otpi(rzb zC!8~`K(SGjI2+yE8DU{)OK_6P?fE%(_dDyto#E=jCY1LkSr(p)Gjp%n!0Xqr4g4I= z1N9Rj{!oALAj^h=l(Y=##wV+lqm*K~6gyueM;+!0iO!E(H0d$nF`2+1@(Jn8Z}z#_ z5(^?bXwH!UM)pasTYA>k_F1|TNV`gJ3)U{%?UvrD3kh!JHBINc{1SxL?@Sw zdt7U()NA!X4=ds!yq}#de%xve7=C3ocAUe9qL%1T94_tNOY}X~WmP`~dv!m+ydG6TN(S{swGrEUjF+c=pVDZ@ux$7hX8}?CJMDJh29_ zoCsn4%#_b;4ggkqPe1+RwJTSyTsZptb1xrz^R;KMO`kt8e{FhgxVF*%gWtaw9)IKz zG_!T+w3eWz(*gGEg7?e;L(Y6b##_Bm53&8lGE~WMOfPInsSX)&3>g<<*ne1G9t~v_ zx}DNv4plO;hsD9K&;4Lle`m22z*KxbE;tKXkr7F|SE+d@GN!6Hex&w``jdVO{2bf# zEOS~aE8JmF1Vfp@Z}3jx*bZ#z^&>Sw4d+3|KWP0y+I5AWTdZ{bXIyBGlcTj77#4mG4!YOj6sSql_7->{(G;VPA!hlelup zMZFRb)eGt}SoO1#^_$u~EtC5x{3ZJ-xYfnuwHhr;Yk;qhke3u+ndsZ{iQ{OyeoYH& zssfL#QY1rkD{?#lX+W7Hede%9&p(YKIUOQ@KB1WaFScG8zRET^GE&q3h7P12WYB`V zy#oFA0z7!{KKQ|RABDYB&Ah$7n0GgqTJv)=S3dsmgQG7!|J*O%d++VzYXFM?(1p)< z`Au;E6Cb#y`Oz?U3bzRhi{ z2^^B{GFHq6EoiKMcGUqgH;V4JbVs=~KV|nnOTtgWFXee61Ovlcq(dlNgx3#-Jr(s< zb)Gftx&!xSr&&~vi}H;UFE8pX+%cJWF_N>|j!&J;QzGC-Z6 zy1JZ3tyQegRYSx_8E6$Z7^)oSOBJqFYPbuednwtq;dStLNlDO|b4f;7kwLM0Qi}>+g%k+?C_;i< zClhr?L$>6x(5pFuzQbn7`J`etX6C0znNB-b=yUE#q>3`1``F21j5Hn{k@l*m&ur7W z+hNG1&LeSGvfAzyX(CPtl@y@tMY8jN>wu5hH^Ik|&eF}xpg5G^U^U2Rd-r>Amb!e` z$%K*PIMjOcH;|~z{)QLv9@B|(!d=a3yEW4DqMc7^2SDOo+u8j{@xLm?2=Qu;*y7zq z(+(9w5`VsWZn*^e5xcfA{rb`4Jl{ zR4&H)0rDL>E*jZl+CxK3XS*jn)afgNOo?D3a>)Ec@JHwj+tlx4ej(kxJuXxf8cdUw z3j8W46dWu2^MLMRor%k1Iz|Zxx{kfYK>t=s!-M?J@F|v%R?OUn_z!C1@r#J^LmI^~ z>E>OcSl=Jx3ehLJ1~|SVm_&LKMw-xTa2I`0CmCLysE?yMoRrJCv}4T|t|J)-aIyUU zG)fh@S%z=YTBY{}E!A{8U$=1gUAI+mWLS5Uc-irlzUD`iS5Or|a$-_G?dp;#&)ILd zlr%@ON5s^Xe|cvW^42`;-<`qtzxg=)?icTb&DCYdI?MfTYh`2p#@x)z%;hsn%L~){ z_U&6v?z+2v|K{k}t}lN6w))z} zQ`vv{|2+$fYd2tQ_b@bSim7DKw^y>b4F|jvS>FqcloCF}&-h(phE#A9P{jdAi$oG` zaesaBJm(-@Z4P@?qf^R=?iH`_ij1&t^H;XZCY9|N2kG{#avw1xgf~`@Q>6-AsLZ4l z$@sTHm@cg+?JUI(f%tqf;)2hSL>r0@@XVbtWOU8Qpr>Qt_xf^LlAIR2-4t9qK^xT# zSV}w9-Vcl@^Mn7c?~;kHr18&jUBz^<722o@Gp#@9d(s%_yF00vRB5YRDdEbWrDM#k zf;){?GjQ`(LVKw2hswJ*1j>qrIm&b5pYb&$$thg#gU~>cQ((~IoL>XvMG1_z3f&gT zF?!E*ik@{p`S#>a%GmYtTYpQwOV_j3MfBYIC;%)9kNt{?u*zfzO{nXx@}pO!_O#Hp z24)_-*?_JNr*TH|f^A>~)YgjR zSmCg8d0q+TZSeencTunk9482?)PGSQshk!5x3n{e>xtXtkvpO5`n8wfa|6P-mHI{c zbk!pAE@k^9VZsg1!EJ3P&vUXK)c^H4R;y?AS~KhBwa*>8DcLuh{I z0R}m= zMHv>~X8>WKjL|kI8UojuTS#$h;g~4$z2_SR9G;2yjs^)n4`UI-LgP2YRctKFnQ~>v zPg>~s`m&(l@KzOI#`y5(PGhBsxHGlB7G@3RV@KMw-#ooWxU+MumkiQ#Tn7yfYPiOA z=nNVL?CXaP3aSv`ZXrISv>3u1;yrwx7D&`spqx825QrgxYg$^1L{U*YJI>)m)M+Ku z%(^k$B^*KAu5MFD43LN&dUajGkw9@k6*_KsU_JWXA;3EFQc61SCti=TLKP@dBoQAv zOLod(VEPhxaPZNN!5KT4w9z`e_`bBIS(7}CwS$g7ZG=*1n{0^d-{{hH$=G7PlHwgj z1`?gSko8tmJX8F&h(DqcXvSvmj3>?zHy1(9S#qpHh-hM%BMw#>KFpdfIyMqRmU&l* z3)2?zW0{}3H73HIa)1)Ux{lFCK8c@6lBH_-s5-)V_5b?ns%eE#t=C!}LkW;_Yq}or zT0Z2&m~0n!&>2sSu2Zy=$mhtnZ~InB2OSSL?--|t-8jg4bd*EsBO4SPL>I@yh^FnyqWph^BDr&q{NeOqR%YJ!E^2%OF;Q?XYq%Wpg> zavXdqt_7U?im7;g~q>YGgCrdVf-}>DLVDDrG z>&x?bx4XVEd-d|w;~&2F%4;tl{rO8Tz4XrJ=H^YEFkn00xnFbnO>_XL()-@`zPJ3d zpZ)CPyk5_m_2K5w@aXX9*!TkzyAO^0@pm50<`$OW#W&8u`sy6iNA^G+>d;fdMhi7h zAle9tnzzE!79~v8Re@NX)4*4VN+?nWDU6#3pUb^@)L@sw_jkhM81#p|Q5_i-h<>qX zFf0}o6J*S0j<6;bBLnbyp+^ewr@cOz!9aW8vd5Tur&A6_+qS;VAq|78t#5-sp_lC0 zG>Js7PvH>Cwqc@P7vp|ts{*G_iv|l zGkTR4#gkE=w_i}l*Y)<05-rHZZ916^4E^0O|q?}q0v<*8+ zT;aoaZB}ktp@PmmFzKe0yAYzZBpP&=PU@dJm!#hFK9ijk42Ne_WOr^&o4FfwY}M-* z%_rw$YV>7WLK;I^rVS2-vkaASb$*?l%f{P`JTLIKDEM*o-KGbAb25RFgl`mmSM~-U zsgi9S4OcfP@6bt4m3@dF27E_3cE$H2y5aQI!=_H(z}I z?LB+F6W~`w0v6Qk$I`S~s4Da7Umjtry{)7qjDI$3gp` zyE*DhW#0fgSmZmEgEbyRM&PzxvG&1vM9OHyvzOdVHq#k~mizY5A&|IwC=q?(ov#7I zbv>IaS_d?q%SvRhrxaRmr$nKmj%Qi@JQI{}WxNSS2jZRYyhwPX?^W5wq2EPAyy9;% zKGHlBjU=fp>T(F&ImjP_wXL4_bRt09X$#s+lD8c8Y7}ggor6bX^4-Z4ZKvd~n+KYh zjns+dwZV&WvgWKmsgIyZOOIy#`tbXJ&g^egkKi)Ok5?Uw)W4ANnm&-yT|{AU%*54n zJ8KE-x(FNn4ILYK$~d*}u=y!6JcD@>cn|$olBY%Og}6h$5MG%VAFm^G?_{T!_u-X$ z_L-Ul6){l@=`oDzq`SXl#W6vc;vGdgNtr&v>+|2r^d|Qi=`+GPaljJAdb$6k5k#aG|`#&^Ga{U<;9Nvo0}@);|?sSW`6 z(T{$VXIa+C^L**j%$3X2S1w;Tc9u zZI@jOQ_a{hu$zpSDloJoKygs^}qystTQnVk#=?kW5hAo ztI|xL3QENnsex6jL}EjdbBE}F?k;Qxg14NEGt(@5acxUVsv8$ERE(3+^xY?k;Ecg! zm50Fiu*$o&_H`7Dbym8_7lL<%^SWkOAsigmRFQF)9w%K7aoh26FI@Kl??QU9a;l1A zEw5XlDA?*A9?k#k{oPbHQe(g_0ODW@oz8yz{>VU#E2(~!f;`Wfxxv}m7zeVmi_A*` zKe)!Vm=p4%1hPcQ3eA`NZkLk7XgDI;pr#OQLRak>fS_;PZr!wn^d6!Mc_4AbSstwV zK}U8AO8;3s{4<9#1>1FCxA@#e$TNj%39Qy4I z=(gtIwgV0L<3IR3{O%LCL3?clpu5(G-gI zzj5U^)&XGVS5IQAo#)p+{_veQrgly38yXrOI&f=tq~2_ff9dnLWgDAMWdH5QufyEZ zJk;wAXk_DBu;B@5=wmo15|prDsH-aY$uMrJNQSk1DH25Z+zyHlGI(B8D3cG*)yGgt zN^?=cu)lH`d~g-_*g1nG*va&EQLsp@Kt^F0h4DH5O>Y_)MA<7CYl(7E=7lGRD8_Pbec7dp_i_R2R&k%STl9F}m92c~nvt0>KQi^<;LRP4d zqi&K)ZkdKN>0EJ9_#st!{zQyHrUXk)1t;He4Mn#OkX<%nXwbDn@!{Jv##3I#KQR)z zB1uWgU6In3GCJ{j>NnGN7?$FUw+e+i(WJi9#VcxMj=O+-alVLn#uXAOi91>RdC@`n z3N1xzNj=k2+UXo2EyePl@eKkg3=aJxRyDaLq(am3J{ESy9JXy=V`{soR1 z@31VwOT6B2OksUW3pme%;8*Ims4jU+fO8u~qdUw8#9ZjX=>7R*;#d(3YdS8}llbp4 z5BFoF?QeCxOW&*Dx~k5}bpc7`Fh(lk7ysyMX*dEJA%2*<8@gwCH39^?zhicD5;tl9`9biiTcwf2Q+M+1@P zn0tW0kSg49=+_n4BTqeOWL>D`Eog7tfL$YP__ObQ4ZixtyP@9Og!blg4*j+E{Eh23 z&z(8*!G|Bb`||Ac^m%v~)<1scnNLL;{W{8TvI781Z@AZ6I(qcy?`8e0ndMN=vf9_W z-Tcmjx7|JR)yMD2uFb8(Pk!+}%rDQv#O^!njR1AB;}a{6s&KDkWK%P)K?8gG0~*+} z*LHAZa9CqMS!IaynLfEjG+$Ma#cKYT?EW8awNl8 zYpy~j?W%<9&qaf-XQIrh{9^=>GPGn{%fvZ$NAY!&I1zcaQ z$rATpu^&jhW4v%KwDu=maVtSleNIzF+F2@cx}@4jIntcsYAo9TYWJ>^yW|R8X`a34 zbQ(w8pRQLk*JtUF@-m~(t_!!^{4pbR;JFP~=jDo0WEQkv?BI%9k?FR4^TP9M!w&{G z>XT!tDmtkACXI!`i^BM#=kx)t0hSQWu95N)RWF0+u3J4$H%KYgr$ggk)3J5H*j*Hh z%7jeP{6+L&B^+BRD0WWAq#H4*A{ypfC|hpBSlwPf;QEb@kdP%MCRgXTAtm<_kne%N}xnt}H-~N1UX<-?jd-Wu2uHS&h&_2j&BSvIeZxuSnxu7=k4++~VR6)2XWj+FY zMc&f1*EHN^E8AhiI&^mwJ#Crrz7#s-1*P33rk7{(97EL4fZ=m&=foHvnCOFRI>P7R zNC4^{J{kZ8Uw|o09ukbZNKkCgS-_c!{~qs(^4)6sP7JHLk`nB0JKde59%cs~HGUkf z?Pqcp%Nx;ttb_`%gAgAlop`o6V`&$uQ{%XSN#m^!BYw?)J zyI{Bu%!?%aOxl%l-~BfwFiFo|5eVQ30Sb1mSt38@#I!JM#VLvTIVg`zzl2OQUf@Aa zJ+ve;?b8oljhe&}A#b2bgAo5ZEZN^W@8(FophII*JQ#NwWjgaFj!#(TZ*VYuA?zO0 zTT_0EjU$4C#BY3;#r%v;J8x_RJfF&#gt3L^(={K~;hHfYaB@I*hQ}b(&dMOh1WPJN z&ODdlAkYv8P{b+j@Q=%9Sw_k`%^^tSH}Z~S-E23?;Th)wZ{5)c01RDWw2ZgGQ~HBf zrtyeZfU2NkxN+e4kv^M*P70iKujr%Wy9ytcaTVtM3HTt5UShJ7|1N!}3VsM5<&|#u zqHaVW_WYA7K@?Z`E8R@i?7-_#hK1r&!>>#;B#fNN@VM~#W=1L%)Z|AgY9`)M_U~?W z^J(D78G@5gK9D-{+ZLZhN43A3_wfcBiqvq9u}^f{(xVx!rGS5hctX7|z$26WL3S$%nopjuJ3CALrksubmK`sz{gG?ao|zxLEkvTg z=(p2{gic~NPOy4q?#-|RC{i`2*x!&pm{OngBLbKk~#(Xbt>PP@ZIsKjya4AF03l*Q30*PE&&qdxj zsSm853Z)7KWgKo~-mBY?Kg^!W&v*G9T9RPhp$h0Y!|j zzCV-6+jQ?RG?}I&OvtC z?3qDj^wes`F+&w(a-}Hdv@m&9!Xr+>T$0_(q7tqf`kP=VI7ei7j6i3%xA&ljyZ%gB z8bI;d?wU$D2mJ4Y8_4u6{aL`Vqcf6$H8u6IYk;>!}=hc!P!rpLvL`NHuE64TwI+qFUn;GcIwpCk7_ptBl z>&~_-}}px0XHw>KBt z3k!2M&VKUod#}9u;y=Co;w!JLuPb8^2}0qCJ3L_<=A1Vb#+<46_rnq?V$7(-_E94y`xxdY z)V*xJF85y|#E{X_?DO`dA*oO5GUtl%n1>#3d54KB;gX=^b<*t>DR+_r>+929d^7k^ z`6amFjv5TPNZcymUPY#=k})Re2N|p}@~Oh^L)MKEYm+?b`Lr|^;D;$o)C|i5Yh{2gCpX65|SVyf0FTRX_$45G)3uKIydOEjwA1ghG6S^dJ>fu zHn%t~Q*shjQBZlLP(b^k95F0G z!A!@@WQvs?1OlXD87DSLEEZ#!5yRQS60G6CQSRUKxQb;Xg*SA*Q8@kYfuWdmW_p8| z$~LzHZ*w0~ z=UUVS7$ur(PCZZJxZ}EK+(J3;D$|SnT8bSEQW0-tHHxT>W>FFyMo__l2^=F=W z<~QE>|7~*ssFMHihd*rpoy!bTtW#c(X-w|lf_LcEc=($?{)e4=oq+JtN(Kj|O=*&2Ku6%|y@%8E&7 zA1b4v5vOn(^Tuk~6u9wUg%+zXjL_g8e9o2P$;BZWDChuiD@;|?5i#<}wX=k8NbnM{ z4mpOVPYjTMVaHUY zIdM^$czX&5fZ!5AD-z(NtcdE~Vq*&I!B1u+sm?4V_S}@t>qLB81 zN(qTo*=;W?RNqhGny!bk-Fw<@;0PkW1?pyUjN$ro&NE_1#8L-;tFH5V#{$Al2W}lc zDB{BXMB_XPKt){kpxMZw(^`b?=1sW!)(QBN?>r7)c<>hJw^pIMxzt}@n_r#2bpE4v z-hB1h7hiZ;8UGib{_)f6&;09W20uso87;qU4ghsMppFE1>ZzyZUVZ+#clYf(u=my@ zNA4XRo!mDzGFpG&?p@jc{HMPM>(9IZAD^9ty1E9UxeM}qNC$&>(kFx_t)HqPOT=@@ zy>){qsbRO_vXXbfaSTZC9}P5#e2G+`0Bx_^$pZ%LL#h(km1nXH+)QY0*Xqs6T_16R1E>-v`%+p z{i_m9%D=~BEguVw7%DGp+^IH$brP;M{#o9sOgmpzI@p~pGMcvA9K z;z4EnD)tEo%vxN}Hk)OKayRdZ-peSM7fwV-Nx4RQ|I+qBVS`38u8|Ko)hrO$(ITI6~;G+ zK3NvYA=wpN#--jJTm$p`DRAVH2v(oC+RF!@qe_OyZ#cw-^0R;-Fo8B3t8;3Q4GeWv zYF29lbl0K1HVa1%jKB~6@JsOcqlclHZNlcpGGzT$XW_=Ro2O5nc=yF$zVLc|@5JS& zzxMQ+HU57+%IdG7{MI=DZ0UUyzPWj{ee~w++|`RSSFT*#xBuXg_2nCl(aHYMBM|CZwH{}J@ok1z<#6L%6OW=vR3JpUoTBCl9 zUQVWr25J1#O#`$(oo_xD@$r#R#;11W)6Ry7_RTL$fz6<2ck#4LwMPYN6J3UO7%~dj|oR6OOJB zC-z!Q3Jb?XnS-myh&Qxgjz{@-WS-C4=WT~C1Sy`Z9%v@askD|?n23JLD`MHKVYIa9 zWFk2#sIJ*FC?{~Dvw+$TDCRWtBZh|333LKlrPq>8G^ZEE_|7*Tf^Yr)eJ}(Yu(5VCuhm-JwbkY2x!G%%XJ%*4pTBZ`_Tj0A z*M3{V{{JO70055uMIYctYZuO*J@dhyV=sNi}FF5|TgS2NjE@v5JY2{{iY7f_~>^{j^3l||Ul(GWyUScYF=7mt3Ycq@9( zL2A!_O6Qu(-cQYAYQEgNa416pi3o%?$qv&g!iJ|qm;5rX(1jn`JE^-h)EPwxmExXE}I$K@(p|R z)5C&kEYO*w6n)pev;*V?BYrkXc1RMO9dMc`g|qm`0S+X*Q{EfN$TzARwT87=I$XqI@U#M zr_Qe9_~f9E=d)LtcC745bg zOBHEY|BF{i2aX>Wr2|6rfODGLOgq}}xB9J>D|#-KQLpthcC!^m-}tY#4Fr9#WQHlH zq0B4&cxfFT`k$g_lxvl24!X(UJZhv4zxlww?3|lMUv)_LI*_eL-*tMCf7?2AJWSr$ zm*thnBS;<-bF{Sw&3YgD-F4X9n1iX2E`0m8VDh~TSHt}p0;v$A(jeqA#B(Txmebj`%Q`iZ0 zqLAZvZX8D=s&Gcm}+i7HulxK$P=Eee9EG+UxEo zD^}L6bHO?VT<#7Rk%KOI6qK>?CEc|y6?qr7(wl=heO%SldQrb&;sd#gHP0Q4K^4O= z+*fb!_{PlIqOTx-!^Vh%%PDv`N8~~{Y3dJsu*kb763hNcgcoNzUTN5 zg^ij@E_VXuZS(~~yAnEa_nH{1#!w1JTeg%Xog@B{)#CZ3MyqrB8z4MFmGjtE-cBx(l&a{`wj=uShYhk z2PjmCwqK{%rCAOxOvU`j{MFuAB@vA_dd@riiJs(id~ARax6Kntv?#acP#idLwul31 zvjPp@(B#+9Cw1t-9m#%3Mb7j>e?IPFuqbH*s)to+Kz_~Sdc#A13nE;q6(_?7aD2JT zft77n2dMQnptUv!W5b*9?Qc8+-}%PpVee!EHdbyz*5BxEtSv8}KY#Ajhwr`ftCwDV z{#PHq^WmBQ@Z^8k_|NnI`M2iW|Gx+a09iX5YinzlUVQ%Oi|R{1?`QWu0FQTj`7L`7 z9%(-H_4~8c^>ujm=*KX(d<}-`HK^4mAXi}{_Ba3)p2(Qp+MxH<2L=U$#w`|q?N9Ky z@LYH-$h{LGe5ook@C=wJUzX#z9ZwZCqg%}$|T6u3P1=Y?wxf>TBas{Di=U==EzQoZ|rjSd!{rDV>1|vL;QOA4p#-l+3 zHNpb#IE~ULVfUe8=)rba^vLqKLF2(a^P%aw2Ihlc@xiEEgz)<&xRGKEr@<8hN_RTv zm<{ud-{(e=B)H@Gr8_6wu<$Ub-4@GtNEJRphfmjre~5~hdE)y-JbGiFDauhl?3N4* zx7lq~ifQOrD0d*H=VEZBjYOQ4DQ=1Wq}`>Uhr}*D{gw78?YcjnU zTt4(Chk9@fek;pwvjadCMHRh;g@x5Ud-hy>>4oQxc6;4kp4IaE@5>%vZ8i=}>^d;? zCx7@vt=G@s*`puA&6Qagoje3tHV)marZd^A>v}>(o-A5LllDvs7c_if;zEoBO<@ui zt~jN4>72-~v^6bxo%4bx)vBeZOTWa+%|AcMWhlg_c zOB_VHZ5!dj69!gQf{Tk6(tLU-Zc^cHMb4GDputR|4ZNZnE9zG0&~xbpNr_w!^nPQ6 zlRC{XnOcy1)6;`?5W2a0X>d61f4I;N0k z;xp!ya%;oWWojP03<;f>R2Fa;G}Eym)FR%=`Cfz}aMS3`y{e8DA+e!=GwH|(zAwpZ zKaVBdNAyyz7f8`lj&{{CDg2IS%BgWea=xT!0PFH~K<{)9=8x2mV7L4zH5FxsA%{(T zza%-R)L)gtqhyTEXX$}oH|dI%|Ma|=G!D0>{4p@~+089+98!J9IC*O>7|qFXCKqLV zrJ{3%QCRsw+Y0EEz?7z?)HRv|6k!uD&~?e&JLh;1{_o%6N79mVEzq&3>@P2R{zy|| z`^Oic97{T@GVLcmOBdsr8zSCo%!}EESJ5J>;8|1*+YXf^ zZ{QkT4e7;?UmN$3s}z*p!GcNk$aIQlq=EXINccLwyo>gLV@=^?HbYd{)-7KYMm!A#brTe0ZqqXulS zb5BKDtT>@^t^+o$@)8JA^okQ@AXLs%*h2V>BI;V>hO;{kV#61C5~;`_4fzAFLk&s} zUu2{RGeJyl3y(QNOB3p8+}esdG!&I6JPzUE?C2?K)=dhkelD@o2H|*g^1)pqT1FRAJoCaS_NI z3VBYBM_Gf#D&i)g7ImVVa97Mb(wB~%r7~5zXe9cRmn+x?O)RUwGb1F#ow=r%_&^DI zyfcc+X4;OCsVM)#IiwCPkLyqia}I3w9>Sb-ZZZ9W(yn$Osn@i;z+Fj$FD1hzdNw8^X8nHN=2FCX2r z1H{n);sE6V-S`RcZX%NnE1@%sx|jM{o%vU$TMIfHH(@wifv3LqF#O4PAB6+EGU&H% z=Dqf6XKi_YAlo?>_YieE-{z!Y#YhnUHJHYcIi2 zQ@!0YSuE9IUgZd&YdsK{{=abv6_WH)qOGNr7pd*IPRx|$9m1kkQ90494#Rd(Hn3*s ziDnPIhegB<0X=jEU`xRd)!-hiy6Zc9uWH{^am0V~@;NPOO?jfJ1A$^M#*-a1=h>9% z$bG2Q=AY3CHns)aRw;h0Me7F@-fBQd^iQ9;R*B4Z5Qw|A_Cw$Ao@;z6y^dzA<${(C zLnmYu^i|rIanPi5gKT9Q(7-FKV~M0_=Z>{V-izUs7b8>B>AN-DX(MM(RWo&hGePe% zkYLI*Iv%zonxJE<-zxG_N|972=R0ro;it4VwpWVQRF&6_lY{b+qOP`r0?wx@0L9*x zTJ*cEvh1V3S5SkhqL4;#RT+yi5-sg;*^J9ahdon6Qr|*i9PZ*yXjM`qYe7zUCm315 zF+SKaJ{Bogo8O@oQ3KfO3KksWCocI+9luV7mMRref>Ya zMrr;Y?`(;WwK;kr?2XQRN=ghYJqnHgvSLl=lE@45+1`R=U!z84(3-oEB780x%OM>8 zS)`99i8+s!5qq?_o}xoIrF17nEm42Qc}YehiG#vs3=~{=OCjuAl%}9 z3P1{5Qwy(W68bQ(t=!e(>GL;r2rl(Al`2ciT(d_2rwZm(QO)_1?R0 z{p!V+U-;FBAHIA1`%iy=>0g5J|1T*5K$ZNNfBmofPe1+i`kQaQdFjQMUV2fn8|6v8 z_rC1$ZZ|);|KRP-Km6vyS-%JHvtPZha{`RkGpJ|d(9_|6_Bx$}v8@U+Fa1wqwT524 z;!@36vsqGipt$}L0xtd$-}4nvfEPy`r0-nDmVEeD1c3NXQQOHdy1>x)mY`EY1dnd8 z%S6ta#RAAP;%J8flhfoe4rzVj1CR^hp>!vidhpE^PPn@hMh@s-Y-poDbBFL$7ig(n zmg>chAh}aYq9^qAJp(rH=7H_#<6P(uv2lQqnNZJS7oY1RP{QaK%ove&_)ZjtA(rBO zfU(DG$ita_r=)xFU9W5eMwcf+PoMa}{_FT5HKK)x7v@srK#>7RV+!9-E60g32kp2o zu5Wa%R9Q1sckv|$(BSK;8Z3x=2{xyYvk>#-SaGMCjU$PlAR0>MxgorHMSN1@qReTq zgT*qdNPxyYk0~@p@ge*JFw3ldN}-RY26v?(uh0*w{h61I6igNU#-6hn`?70 z-rR(*J$VoO;19n9cN}WM+R}B%daJ#SmBpn?7tWr3|AS+{dj5syo;!c~^oggRetP+t zXPz-v!Tk#;pRy$U%$E9{ciuUq|;uqUXNKgj(!0poXgC z<=e_NQ!(6HF+t^Bymrj@q0er)Yf{2whj{*~*X!AHsV2E%Wr zXv~WOlO&Jg&pe|{++(c`X$<+7uWU2Q4BdG^#g`;QQOs2*oFPgd4b2pC3DG89O)HC} zFtVskp-3z_euBS**QzD!1@t=@{gu(I+3lb!FDx#k(7oUdcK;d)`w#A$51mA2tbQU; z;p-(7U{~njWWq9B!wy#_jMv zq_*k5hA$*`Xze_aXi)bq(xc;5xvz)g9HN zjdI9;tcQL%(C2Qw=%Jr%>86JAl34Dm`<^?$P?ANE6!Sb2Js z`AHGIA{sS+>c^qaVSXJ>pYeE*@5$F-`nBvFaP;DLedVizx&%Y9ybt+^^p3plP)AbF z-EmJvkM_7pEHgqm;i3eHBVV7}CzFFDiklw%h+T^B8oSr7TX9g*d=s3M=v#bq$2p0Z z{$DN!Bxm6uvV+Pd%xy@nfL4Yy_T$zQ8K-}0*_Tny-3FE*Z@Erf&DkA5?8i)WLA#9f z0ZWXOQpSHh--P!1EQ~hR;P-#$0r;Q)?CY>^DuYhzMh@N8-s;Ny!j*GpPQCN?oB#jz z{_9zfp&YT-@&<`^Y^K|Erm^cxXCgwkw zw|=`1H{!oFyE$9JSc)I~?zxU^>>PDKCxzg2F-v%gA;?8ag->%9^ zpDWk;Et4;wdgIlX=C57*^46_e3*6lMdm{XQ-z)%VN`HLm(%Opv7vAi?%GpKc&UN@G zJXWhl+s8&{>wovFV{v^rfq#1GW4N(!jRyv-)h40WONDu8oKSaQNnpcxua7bEF)}_- z0H6DU7s--5_4$E^zSvd)2r>0&WUt?9K5784Zo#$wZD=uM_3}Pu0Xn$}K zrIEl3f+K3xp}%p*3H_DvKtcvDEJmAkD(*4Qiinw5sIC0 z<=qs)P#9=o`tOr$sDddN%cA~a-L4hHV5#4?3hnna4-W;UMNnfa*N&l0LK9soEa9AL zX3PjqB^uypGwn8WzuXe&xv$?gGjD2>@X!;cb!dv~6SB+fZ6EN3sm$HN;qt6E1e>~mGC`c13>+_CY~_`aZ5NpJw$ z$o#Hl&E2UEb!yR55 znN)P17q1iXPF(3p&OLhfcA&j_eYwH)v=E7crVdVL0_zfjK+79ZfVYnh{o_DB1($Si zSgW(8HB0^0_n=@B(sR>oqR)NvCMoo^r`#Sw{>K1gY{AJmyT!GyM%#`0{hDgpK6739 z_&^J^!!QIT4k&$A(!UAdY6w zxolE(%Ru0R@;|=uD_gJqn|^MejrO>TJuL$+qS{1)cew8{5VyB(jOif1G59L$ET?1b z>qEb5i>csmBx$K2ETB{FdQhuIkoTI+thuj>EtHo5x@~^Z9Sx$+FH$+E`y% zy>j8}uTQ`K&P#8+aq8vsUw!q(#>U3d_r>g=rtd2N051Y$Cr|#@#)~ih{lzy=y&6SH zH5N={_W0BsY@eCkS^vdPAL7gWf4uw&T)%xChQ?B;4bMQk!w_|OeB*(mKs01dC9@=j z369v?2dX7p@<)O82A|t%F)UFrGg`PcOQUsTU>{S{hjdghWBmk;;>hS&l?vQ}Hx3y7 zhbECy0v|uyOp_%%n949>#f+-`Odlpn`$5hf{?^k`e;tGf697dp(s=mc+#s-E{!827 z>!SiLVwcwsI#KiQJA^_^n#J8H zrb``kGLtcURKONK&l=7vK9uRs3Z372Jqay=IpdxJNy!wPQM5!d;rAA&)@#OKikyb( z`86Oxr8)8KGY!gEt3sD$nXl4S6d-Z#QVZUYQp}L5T$F*bOEA?Dgl1a|eqn7sI!wzI zLJNYOcL%6>1OzJd&;eC6POmcsl+yifOal5JTN-;S50s|N+35SJPw_k0d!Ej%TZ7TC&Tx7jBE71igQQ-t@hP8Ru--V05hVI!S2 z$>N-74X_w%D~61!0)dP$@aFPBe%?f%8KJqM`FwnbMFYL(f~(ljIc$DH1fO$Q6q4wf zAgqzBeL&tDD~~MXfnpvIr%RGS4eUZj!$^x7-XUZ01_kskcjGY`Yx z{o+yBH9HK=m0Nkrh5x0sD_1Ul`QhnzUw-4&Q_Sc8^OGk}u1K^0?_K)d0sw3Yz4+qa zXU{+XeDlhcE0^AQ^AD%^!xZ3Xl0266dOK!z?ydgn`D0O%#PHjfKY^>aZVUFTHo^08 zLq1N)Q9CUOIucn$NG#6MA)cDjh{(R4t9m`YydmM=eXli~^cl7X&6rTA5^v=*a`(0& z7-JpyZHWIed#QwZ_l0$)QpN@ux1s~7WJ2UxYnUk0V)n^tq&%y%Hj%c$B!y<@urE{~ zwS;Y3TW2g8DKsjEKxRShHP-3T0dPZe<1O z!0>6UiEe_vodefZxDKt6bt}=DUt*$bwY!`ZhAb_ZmF{w++w?D;Piz%(y%TY-5Fwt( zm5gR*3}Iil-Cnn0dV%1%Xdf9Pm9I#ME1(vX`6dFs&l-jT0NT9(m2egdV7fKBl*H4Zzh53Bk1VzybMtwmB|wp zf@~1ax`(Gv&4#q)RO#c5)G#=0F=?BFVNm{y%2HN;ybbA>)NNFSnaE*Jo>IO~t_{s{ z(CZ?twjnc1-53oe1=1I@1sp)Y#q97~Bw4(%;)morU$QmSv@L{D^?hmnOZek*)^cIm z71EU3d2D$C!K1virGfm=nk^jaIAU(jy1r0Z>W#Y6QCkrhvw(Ze%fGtErdO13SSnPG z2-E)xTPWRiXsyq~^jHQzd+H(hH-Ga4?3{^VZE+rwY&~tPudZIXbn(kiK6>w!*G|3k z(uMOEz97Q?;KIaTK-vtq_?MWH!-o%#bvm&B>7PFH(Li^38)XLwaY>QU08ku2wTZy_fj7ObRMkO2vT#w^Af)g+E%k3*^4CZKIXAiwPQMcQ+56{b962HcOqTNRBM04CiOW2Qki z^SZ|Jqc}L-3iiUOsZ{-VON9}<*SHVW@bNcq%JKA>0808gLr(@nd^K8B(6{1*Jf%C9 z{ypRJd#+ocyWd@FltH;cn~rdrOe|E&eA933ME%@54KRVkn6N<_!te0Qyd8kUTxIx9 z#XO?*V=ORchRThfaFz5Rh7MG-Hncb9VQM^wzk22v{M}za4%^0Z=r(TWd3P<{SX)`T za{1iXAAk7n%dfop@=LdG-1vNcejd&Kzn8-Q_uT@3ru6*z^XmX`@ei+e_*u+At%F(m zc#?jmB#z+!{{3k?n0iugLjug2g9{Dh4P@KmFyG^DCc+5}&JM;KUDpj(Hr=_Au(tcb8U*9Ha% zCMOoMzlK?^B0_|Dv_KR+-Zsxd1d#%NORcpszcjB1(mo0VRP(Jz;V34ge z1U7kwcxkXHup<335Gj-~aa~(iNa6VLI&tdwS|^);gWcvB3b;U685!Cq)n+_jq$waFGA~!RbgDU=s$p<9ZqUOQ%2w-1SAByITjRUdD;@=nuiSX*z@vudjbEeg5sV1pw&8uLykc#TPHWb?S|%T1{fkCPeVq^!D!T*!0f&(?2>8Rq6@+ z&sRQyGhg3=UYfzs=r(9~bAY5Oge)Fm7Y}WD=XWjyGPclJ?0ZaE0*$Rt7_`wrbruwSXZOh`VCru?1=7REIG|0w z82{B;GtF!VTB6H$tMjp}D&jnE3o6KvFgnaCVP6&FXcBPRb}Wqdp-^i;8F%YV(7&4I zG0XHZ#o@Y(QxU@>n1r%eKW&RpGi?!@)J8W;_!uctFYI83S^@ieQxGHQnkwL;%-0t3_M`yI(edqz6d$ zOPNt47=U!znt!aQQ zgZb3Fqu`HZTHl6+0WXau?W0o!*jDR>D3*+G_;V>-+h?2)j5WX`x{uxZj82kHBhY7@ zRjBzgPQ3nny4&wQ!De0YAdsvzugdi2Guk2Bi?=KbI*uSAQYJ>9jmG20Y9Ami)4Y>= zmN|XnG>61OGh_=+jpRFic{>;WYcW7;V-dQoc{sdx9DemzkHB+J-Vf7bIkeUm^0c?n zYpgAyJNp|K&Gdd*%0^e){QIdDUOqZzR7DX$t_*DSz?B7dZ%U`t<2br%t{4 zI$kkxUjmP%S+-+*+wR&kC-%ee&@kli4t#Nb0b1)_NNQ6MMHPuoA(}3Zaf*k_r z+blVBK&j`O<2${=q5X<$jjbSn{SFD*2XA{fnfyVg`W@g_y8=le@)ogC#W<&McnpMl zgc~X)l_vQP(1H1huQF&YWix{|%tHHOGGn@L*ur}?_O5V(SA*Gghc}{! z_G(nqXuAWbYI(DecB=Jhjf?tA$-rW4gm5JLB$-BItTh7QG=|C@^wprGL(ng4RMhoh zT3B&YKS$clYhTM~`P3RW=0?(M&u5fI3Fe#nnUQrxEfy>@3n3t&ASM1s!g0>7v;}%f z^UCynv#E%#7&M_oH9o*hJ;{AmFvOZG)YSqDprUis1dL2KQSn`|)OR<4`k<+N75XY< z4WR35TFpXD;Ff}HR*5EPra(y*QN}4(m1kR2$UWusPuE1%AWoUOP5OFXS6PJ%ru?lU zWmEBPQ#Obyr#iJP5X&gj;%^X*!spyF%?RjN&n&9HtD2+W~N`z)+z^z++(@G$bHA=3OLPnUj**DH; z@-_$qPfN)M%&phAJMMePV@oC^IkK8)Sbxh)9UW25YXg%ukVuA;1l&5r2-|kBuk}c22DTh z7y_zrVPzH8D3NiYz=3B!^aEPF8hqY4(KdF~W|_HA^KGC$fi_#;+15QsA9$CHJHJIP z<+5U67i2$#d{znV!fUSh9+9paMKNOdRdL8bI`?>+v0`-lv{p_x!v#^T5wZ4qk#LOx zqu3vtB8CGb-`xA>8Iy4PV!woYg(!wxKT6`#(BjpZLEKSrzlb8txkfO|;05H+;d)k< zZZd9+m~CM_Vq1{ueMwycwGPw;KKhMKF%9$b3rYwp=fhuQmEZ*k`dC<*^v%~#)1=x3 z1+*)JI`_$qQNDUN12Eb7i+Dzxuj1Dw8;=NRq|D`sre5xGO0!L#SC5mT@0J^kQr6(P zg7JqWP)g4f(QZ1Tf}yotMDg|oz6NoaqHHt#qYb%zn!)$0Q@Pvbm`I>j|tH2=20YA`up#P$Kn{aSL>bngNL@o|Mvg+ zEKE&&0B229?0%@=k;4q(&V9i#r^GZeDafy#-g5Hhng6MjHR zm^pL_s7_d(aqlMQ?Zn?HK`beANZXBdg)|{F7*a@6QiMj9Nt93u-Z2UYfILU=d;4HF z%aw$O25PeMvD+ay`A01`$Y6PKA_$p``5+`X5%^5Dv~QcZ&lF?3EI&4?Z7@KE&{*+4 zpkLVL4kE$G%fnm-@==UuLGY`x2cYj8Y|9{rsb*aC0VGS+ppFHoa1tQ{a^xtvahT>8BoqQ21Wh${k@s-FPm%z(iiz%(Hj*E zPHVYTY!lS@aLXxHjx-%bwTf|Hw_o3A&r66l;TlFz)z_y`Dg-K38~xGY-Lm8ec(j8y zO|t1J7NCHX0F9UOkjW_9On4B;L9=8XJWoAGS2W^Mfiy~;8N^T5RIlQ{WS<&0H`q4> z3ee6xlz6q6w68z+`L-2RMcpM(OZyO}h z24tP3EY4f$`r69M)ywC;{NRIkUV7uysh7`x_0<;}8yhJ6ZzYnp0Dy2}?f@GsCcqo7 zyb>jl@NIE8Pam6{PPf-b;-UNYPe=deSC7L`HG$XP`4ZMvHeh&s7gUom0Rkx044EF& zT!|x*auZMzU?QcOdBc(@I%;TX5rtG069&6TP#|^r-uoB{Y=20Y_Z?DY7%3Yd!F>46 z7V^xb2{_@Mw17np6QzM>y1ZH+04P^W8&=ExO)SMd13a$s*{WjZVAIzm)xX5 zdLw>I#zM;?wi^Y`pKMnYFb77aLZ~xwnngAoZtt8E1{(J&TJR}BS*>XQir+LdNcO7n zy;_99FL7MmwooRF2su81O9s%#@{GNSOaqP!`hi+?;SUj3ftZ*&T&3<>U=;iI+5H5C z@jwR)6Q!l@n!qfE(C2Bd!>0>QS55+bq%8tM3?a(BNEr|S5D%@2)Ou!f>|9u@7OgQS zv@Thhg=<_OL~T%`$v;n`;jup|2kiI0RKS&dP8ug zmUFV9G-im%BNY$)V=LYb8CPXBq!=KRi&eaj%rEwc4iHP}l21P1zvWFKbk1xrQx>4x zj6uaQU^Zk>tK<-8Em&K=4nxTXJoDrO@V9^U7~Fqo3Lsl!n*Th?n!Sy+<@GD)FMR#M zNAJD-#;KQI{`A97KRayrtyf-xUIZ}%9`Ab~erzJkcR<#w z9p1AY{?~u?6BruG;q`aV!@}|{sMLFq)F&WHD$q+sv`Q8u01pC2+|dliW~LQ!kY=Ug z51r3MGwoy%LYr?3q5eczweyBG1%Bd154bYgu)9qTQmk8|o`=7oLNU$jerxm>WqC(% zGEFSSV`0G|6abP)+SlYrpE=rg9o5-nfssIpzYQ;GhjmiDpjtKiYK6jNGHW#W+8;y9 zOqvj6?o2?9LO|A$j8Z&(XGi$8eOd_vqJ$m;(RSM-mXnMQp$E>*#|2jekTeTK9kJQ9aT4OMBI=2RV7!5<0 z772i>gGheEG@JBu`!~-kv~RML{)QX*18)p4Pmhale-s^6K7o;IAT6UR7u?2Z+!o-2 zKp|g?NWI;*(>00#_b{{euh!k8`$hcDO9CB)2cgylcHTbcxv&t^@`OK?2V9&l9qs(x zmZ-l&VG2#AmEt8hVirF@_Lz4r5ty;wy7SXNed}kgH}&VEs9+bI3u?up#zgjs?A?b7-4U!DED!mk{*qz>^y2-`{p{IipM2`szd3sUvB$>8x6MFpyf!pCm!wH8{vWS=0sr*U zhj3@P2T64sM70S>vnoIqL(a^?`EbiC#sa=&MM-C|HRR$cb2U(;Qqe+7F!X5E?fOmR z+Sd*j?Zf9qCU=7p#!z{bq3TzpzaQ4$T#KaN8;B_T{RDl_Q^ z@!{8+6nXU_mrFCRzr8aqmT*%zZd6l;e!1ZhA!c#K_gnkZ;7pBA5TQVY{%OJ-wpp3? z>TL2E)hw&nR~9&+En~>MT6GKFgSyjDa0l!6FcGAWwgpaTTx^ErZj;H7+NGA8JM}eL z$7)~5I2b-{hkAywPC|PGqpC}@ZF*IZm}|M7<=oj;6>RLO#?}->%{^jT3w=9@S~dBs zrl>|W=b*84F$oF?_#FZSwh6IW2e&r!#B?$8DaMYR1#)>CeytV04jv~Z$@z2?s-G51QmS7X3pULDY(AHQFjM!tY<}=4qCty>_QNyL;dL)7y7V$9XJ5Ta@@vaa=p5R6Fx zNnHsMqVrOq4L#^^J(WE)ix>{$5LAumb9nMtLvkOm*b9mQ)qT)l4S#~Xf&5LzPceJM z>{i)fN=?0SAG;_Yw=h2d@xbF7G|*6);>JWY=^vnn||5jYlwdbwWdcF_EkWjW;Z#f{x!2q&aWMfM1JG=)nU7lYC% zqb>p3i1kffnzYtm&_bKunq$dxXVR11d+nYtnbEHmb6Sun%~tKEX7fe?WE^7>=OD1> z#QOIzxN^ZNVI1Q~@}EMZ$-WTlT>_OVNFbgWEWf;CoCr25)`6!@O30V|hB%8f5eV}K zR_lGw(fYt+UD2;RyKFD`P9AaHpcODrork2HerF7A6YekZ3^QxNo?o%33;({;z!m$-l zM*M~?+;ey~dzA!~42X4(`^{aCKAtx;K1JWqJ=i~mcw{?RIL1g3LbL=}6^+&OUX&+p zUQo6QmQ|1v_%TL^1Tc|SB2OYfTA7RSI5OCwTBj6q;6eN3nl*JHl1`c9#ra{{2NJu4 zEdbGd7VE47wF*GDwFIJA zXFvP!)Ej?zr3_F@F@ip@oN!n>KK~~Try*o``Pqj}12^l;?vtNQy-poF*lVcCy8-3a2cgdBlnL7u793^A zZy@NOO{aY0OW)J64$+B0Kmwi5A4JpFw$OXyS?tmZalwZr-1|J}yqJi2HV>N0jEOz= z{qhf*3h94|w)%oIy6eWIPjY6>{7CkU^SG$trV5>w+as( znSsCk*~9Ro$B)9qNEce`3wfur+F4$>y?E{Fg)`^A{`|w6H*TK){IgF!{`A8S&mB8< zZ1wEfvs(fGN~A3SV1OiJ0yN)v+# zb9;t<{Mf#Dcz6Qpl>|OGa|N2K*C44)LQ)w6h-y4)yFlAAOFQJN75#XGcAw@GRsi@8 zH>lP;@S6iH2T+ID1tPJAh!NLBsEa=Q2i&)D7;PqPx*ZM!OBho6&f-u*wTNp1>02b8 z+6G++FsSA0OYV!`;#ts-`A~HY$Y$T80DyO!Y$00JLw-x}ntp-jPq0*V&=C!pDA+yJ zaIDoHwi^&gngOR}g(5n*riFu!t-bF<*~?B*X(2N3oI(zE8+{*|d)YsMecLpk09-zq zG}d_)NTyK8{)hO!i>JDPB1itdZNqPiiIr0WaZhqSD+q$<*(Lg2q1zS;iUTY}N9ebE z;qI|AmN&)k?Ar>8Xriw?{jD?Rq<(S#Hby+xx5$Xzn%ZP#=@e`|MK=W$M@#rN&+4*e zmpxNNd8l#5^=%in`F7AEh~;v)J)zAMTo-w{c9F+rh43<|d|vECInv_=Tnj$dysG4p zaKQ5d5@sK;_V&k&0pLL=jKxv3CTPX|)7{L0ZQ-H8TFfuo9I)__xx77ao+;E*{KIEK zVF40?Q6T`dVnf|nroaN(#zLUBfGQ#2!$DR>W!J1nUxbKPBc%SKD{OU zmrQ?J3GL4}#c=d!^;oS|y|!>|_K8QI{NZ!Y{qkQvc60ZY_1; zcc(sqmrtF6jZPh+cnW}l07(rpNJM0KzNh7NMMU$OrZj4(sMJQ-*>z*=?=(fty)eth zy!3jeP%^Bn@y=~&enf>1UM@GYj=7n2R#avm1U}>faJSli{i(lxpV^mBYh--m(|R~L z(63)ISCWCHxs?f)4CrLmjlU&9m8Nvzv&k2T&Yb5W1a@;eiOquoMVgATAdQ|{osauU ztLMJB2fB{X+M=2(G<8$uqe&jwLuFZfGp`H&1QT5vQiEj2VHm_(AiVdB+tgQZ_r^LP zf+F3E@}5e(Zc(>OU%RF>Jy;acKHDaQf^pNr5NU{~O}br%Ws5Z7F4|+osT>1lye+(v zNz);7eglFk%HMs-C7uc5I#9P(J$EXImz*boHw#xaWcmakz!)|OR*^eM-H?RhsoB5q zZ7=A zZdbmYNa?p4Cqf5YdMo-Yta>Bwe$Zp>v#j&c7BW7nAK`P7wqKR%SP|0sC@Ylv^Jq&7 z|5@kT8}_(`EE)Rw@CSJqZ+3H3%J4bp*2HliDB0$_266&G2F9!klD8ths-QOKHXPw9 znU@r%DL*H&YhbSUdm4vBDA6cSrT2)r&x^;n*kZ=_osSo?^Ke%nMpr~ehad2_#N5}m zMxOE|{CRG>(1{>?g0^EGecdKrGb#$BXS=T@xr|LFDrUznbzKm7Qi$Rd;;08vZv&va z2=#a!e*D-W_?ut+5birP16g|&^3HmecGi1$?#$o%`kON!zWvslzkUC$H(&2|hp$dd zz`Bg|PXn%Or9NrP0$_6~gKxfRp9Sc!yCvU$=bh7eo=17wOCe96*|{g)oy6JL?8J2Z zzx<0wqaz3Q!Tk4L3a{7MkHe zvv8B(q>KsbXMQB>D-zD|HwwdOiSVaNWrRmxUqS?0GdnKbaK?aWfkc^^zJHkkB(Vr| z#lPZ&+dcew#8qN`>9k3iABGqT%HR$rNaNvpw;CVUoG#4dn2fe72-x|3?@Rxl+N zpbePOcAA2M$@n3Y&Jy=oE>TaYe`S(y4Cu8!w2idwc7N#KKIX7&5@U?$yd`X4|D1`V710X|SrS6Y-MwgMzpxR_ggDLvVFu%7!6i+e&W9c^Vh|nb7qSCI} zS1-bVbjZm^0inA~CQYZY3B+G^9F2a!Wxu-Y{jd7w`5Z0wSUzzLmmQ{;oK*xc0FQq$ z3W?}D9a*Nlnqk*%lfS&t%7dVxM*Y;eX9!Gmyev9Eg%z||w6(u>8;a(`pwq|`Q32cn zYJGdMXkNX1gC*>Hc?i6p-V;l~2L8$l?Aof#KQBQ(t;8l8nM-TjKKl3t zjE#h6oCvL?0Yj7K77N$DXW?_%H02bptoJIW2>vauJQe-+0l5KStOQ8!`#ZO2GCj@u z_1kQmj8{a;Rbwe*C*^jKKoYaXu7iI|yxufl;OPhDMJzCdmBIUz^|;_)OH$}{R-v_a z19on&z~BAyr||5L4#Kv{garW1qi!SXrOo!j;?2eL-+cMu+i$)8Pp_SN>CIbLZ(Ra_ z4G}ePD-D{q0D!wod7kI(D2i^Le)rw?6G$+~|1;Zn?Abp&mJdyh&O}fAU`I4M^yBEY zH@}4UKDh`hOKUJXxf>F8O<<302=-BhXj!B{Nfbq*ae50q)wj3GTS zwZMV`mp1dFZFTY6GJ-P|q|AO62}pK5`g%jBUfzCbv0!}W*66n0tlK^0$di6Dj1Ciz z1z5UG9sEueOEh$(A+FMy1`ISSbvh;FH(W;~Zbsi^313n)DAM)}l7h^=90qp{kw8@P zhb>5WfeWQM6J?0cWq>fgOsEiH^D3C%YNr*Qj$;l=5D=p!=GBb%P=r$20jcCuqyJbJ z_SGlonY<2Jn1u%b@kQikvmGSB#)GJdiX)_Sn|i1pz4 zW9p97bC;3zwcj0E`+FORMSzHc;aWR~f8+W!%k>MFR*RgyU<(_xk6~~lyf)nR%mrT_ z1Q6}OJnf|BxJHzISGZxp02NT9<2&j$vVSC#uLGyi^F;TZu63k8#^A~LII0L|q%FD- z(8PN8zB34NHt4xY=S+3!cPcLmyvy?u_yjeIfKtHk6)SJeVvBJHcBh zJODLDcUOu`|Lq<{^n5dbeZRAf?*=>&)cNV&)}i(ZS`0+R^(mJ}!mHxE>+du@z~7Yq z^Q%RjV4>mu`G5=az5lt7KhmI^j)*Tetn*#bI0Wk_=PupXl%5FMtn1>2)) zfP}b)6MeIHLt<7g;4jUA#EUp(|###c5A^p|ICXsq0XYPf)Us4A-3O{#YWSSG zq5MJ{fd|vwBr0^3D2WGfiSN2LJ1KsT|0{H63N*3v^1IU|GbW@&WL*e=V1f!Nhz%8r zSQ#nCeIWPY1{cz~wM4zj#F`uLkUXEY8SkPnI(Skgb!L+|)jTDv+e$k;^O|~`-nQHu- zWhk53CmPlNSfo<@Y&;QeQ4YZUvi91 zO{R6GNQA=_I{gA$$x}<$8)}EA+3s%gS?Y-^f)zkuzwHBlXylb?or}-a&4R*ZlUj?G zVCwGzS!^^jeMf|6BrTL;=k$Lijn|d{>^Ipr#@TK*t`7{*hc*T1w*|xvUT)b$&RYXh zFzeT@xH(_==I6Wj?tO5_uKl~FW_IkU zkIamZPR}LHP7U6C?=t-3KfMXpZZ#pPZ-clp0a;YzSGBR&06AkMz4tnsz<{llP-q|n z64VU4(P*jJ6-CdfX=KrXV%B-@Kmg3kTo?E?SQr?Fymz#Xeaag2U=#={YSJVVr5HAU z8^l3IqSZ#yN}`>Y2L{ASvZR&+?p-|hpZZnZ|pi`540u+`w{R5b@sc`gfJg+)UaunB+QGx zhq%Xd8AJ*t!>qnFgjA|M#!RkKKnv8x=K1z>{VkTG>k;!Lt|!D8EGQbgaZ>bEe$-qz zl(dN~UyxqSw2Jc*p!v4;QGvyx07#Tp*e^(F%T3p+z+8`XT>a}w&x0I`Xb@q>J_p@C zVM6ovaJ%}QS+t#YA87q_O}J-*zl{iVnDfx@I$XSNR=2g-hu%J;6&zDgj|~9$vT7fG zN9yXE=pM%!!rE9J>%%_}RQu?urvRLC&Th|nTc$6x9nN`~OBW9wa542-s1))@BwmVh zO>u!+!`*;cF2ZUhbu%3~bLD4_vPD`3>Z8NuU$Gi-LoZvSnTH4Q(R6KH$3~g`?<4aWZChHJ4pQjMzT}Yq>S#KSBttFV9tibb6Jp{je?qS%yqXw;wCCEA} zS*NwuT3Nkw`}WQ2m*=luzj)@8kKTCgjo03;R4SL{wd`AF|96?T0DyZxp0(lO;cbsU z{`iscsj0okA9?)oV-G$0+`a?%9T}b4KAF^~E1hg4I)8Zu{_o$t1@C`y33@OM!=rNm zaUD9{2+}-(xKdH3$VzzOf{Zw!8L{+guVwNvm%e9q02`Y)`2;Qc_qUPkI(#67CY}P} z6vVkWjzLkf1xfnMZkr;wlJVxxkx)9{m`taaSwKcjW=G+`Zd-98?T)F$B)?T0Al@g7 zv{MISBcmaO9P^;lD7-tS;>HPaFslRI7Oq1rC&IfHpzwV1je~V?8@wp#vl<6->i0EL zaOck!9E~9%N5T2ZQyS_ z&#(=wpZdL`G4c`D>QEq$biv#^%;#Hvqx{Gwg`G{2E0!AbA(eS z?v+;+=(^;eDj1xxUv%(JZyO6}s9%7W?*!E|B5Y98cfE=HmYceb1~)=})0*xk`S?v= zpG`hY(HiRd7!~tX_>6n_V{8kGb`tte1Bi!!loCCYR!F$sn6G~Zm8b*V=56RS=Ha0u zJK_KFtEb?Rhjzf&NCsJZCC|EztleB)zj^cWjc>mE;+>B^c<0RG4I38iid{Zu&SnJ8N-h_GQQ$SpI3riGfiX^oH2GWrAx zv)LqA7asQbJaFLJtqZr`U4TOC;g(Wrsi4sBxw(Kdd89ewIA`F6wyF?Yf@tOBhqSq9 zD#&73h}T6-nmLxP5O3{^fi?slsQoTEx18}v`vwKyd<>2Nu!z-zl6n2itS#VRv*;bm zW!s_JLs&Cv@nCAWe1aEQe=4eQc+c8@Q$|bl$2KMQt$kC_4U-ptor5R5t$?j{JL;5- zeP9Sf`dmQGTrmJ#6l{(3!z0Yvzcmn2eq9y|FVq^!$CQW1v}hgLYuQbNu6u+FIxeAl z%I*VY7Rw(PFD<|{blAJ+vH*Ym}m1-@?6K(pg>ia_Lx4%EHOGONQ}cla!^7 zKo06^xiYw>3PCVC$L8f!vrf&E7(szaTp8LY?5r39GJgi}YX^R%vuB;f)_4o>S-2~r zRe<6F71=*Z=3KfBxqW+W@x#palTkE#d#(r7Zy9+X)Pq{{7$o{l?CnJKO)| zzx}U5dQH@7ghT3H0zKw*Zx{r%1 z^SL&kvy;%exP;h~(`<_>+vmth>na*UJRqEp3cfQLJboSs6r-RXtHuKDFCPvi>=>te zpiRiQSd26`78y)fH~vx#lM4tq*@M;K2I`Yd75HtfUs{dn-zS2QX5T^^=m3Rcd}xL% zq;=&qh&FHF_7(N141HmF(0z(LRexxc{r)LLJTtC&=A~IpHRB}E=Tf`lYq3%M;Pbgz z;AwLJNb#Brm1}EOL*MqRn+gWvoBpv)%J-9o<;QLk4`^3LDwRZ=IiVCcTymEbt6n?F zn`FWgCl&4cHo&NZ{|Z@iD1oI!**Fi9p5yp9rFt}=;T?`v1G)`{qSyI8R1(fxzwlWTW?{ZhQ<3K;Dp_wAnDx#vKAXnL9j2#l)}(U<2};Q##Rx8cLju0S^* zfuuGKQDq$RxCSZn>B(HwlU}332_+J0iM(s15DBODLB$`Yd7acsTgWCRn+@Vfuqa#t z$mG5#5?S15ibqN@01CTK-F8i2>EU7fY2E8o-1c(c`zXo>c~{#G2i5fL`R z?@)l$raNYS4T@MGyQp+Tc5@48qWwVrLw%IPtFn}E~UAwt!dD`)3#E$_sQMkxaHij4(|udZ`1Go=e^&$AWR?4 zeM{S5^T(9#s9%KcAnl@?(V&+c43Z!au1UFxa|IbxmK2TGxq`jWr(5sUR>>B9*X?~I&DT%RVLkQM#wHx9Lj<) zr;KpMB8qS^?;sdHad1(F&-c+Fg0Cy^#Bt&YK*@fYLL#ln7U1ps?8^WEeHnLxMT>8= z*B@W{gvp^yiG2u{N&Wgj`(b~l>kL2ZSGQe$i0LTP9$OGl??^lc1^@`Y)Dw`DY(WhG zP?=>ACJwa`q}|>wg~};Ahq_IuT{p|6f`A*vUehC*S6jbm=1s4W5ZGr6sQ9exT;e)3 znP$q2x@)vQZ7k1h7q4H>%>~AHuD?7jvtPXi5XJaa)MTqXq(^yq5KOn*ymFV)JUmbp zz$s~@*Ybj#Q@OQo1W-v#=M7MS2%)M4HnVR6UG2V94YVS}1^`Gw@`+YrU>Wkj;D4hPCQe?_I`xBz(P%6(m+C*+V)-7VEf;`4PGWv5%b$GmKJ#I@eE$5`R~yZZ7Nlu<=t%n5 z^tODaHk8-4k55KFfA&Z;H#;1idglu`{mDgGzP$`%(|e#&8|P3a=5r< z_z&T4OZay*1O-e#jE;z{x)1@^QN4>!XipF5aVpLGl#krBOb>NoedTFlN5*4|M1(J_fnWTmlIir}w?F zFNqe@&>YJxX)t&uOy_xKwx7~z(H^Sdw`n&%);{%AXk=E8i3g1-%t z=|1s!=Nite;QCtxUBntO&Or*sAU(r#+NJ>p?qJTH*><~sg02>=$<3aPMQ2~}dF-wy zV_6h|gGi2)iG=vgO_MRUKok~o6`vvjo#2|`bAVUAiv6N#p{LQR9Pz>)(!L}>x#zhw znF42KnW1w!T$vw$+l0_>6zcgY`$9np1X$g34c$`ybn=|NUd^!#?GGEIqGh>j&=AH4 zNG88vt}WV5(*jD+9o-bcb0hsR_88@Nj6H1eKr~V&{Z{fUj6W6i3*`@&BKWz`gE-E( zwlhjPu(5Ij5?F_aj?BSNo;V6WeE1OT+&&C(wwCu=D_P!ar;Wz)`jv|pzWMlr_g*^n z=4&s1eERfP0I&)GO{w+Y68^u%v;_eC@ltm3L%z~R>w^hs2T_&;i zpSX;UYmB>*)WaR4Q-=dqRJ@mJ1r(vHV@}-#9!P;aaH>MDyw3 zfOdY90UdnBaqYN@r0#!TMl)YjaVap#5c2MAA|iwQSMPCS&I*^8PcRGTRCSuSVSX!# z2GJTMX{J9a)uYYUQzi-UOJDD1C$An>wgo{oAHZ6oW+H5r_*T)VZ)Y3|w&EbAxFbdc za=xdPFBYX+A_6+jG1r3izh*>j4NhxGB>Hm6PwRtnwDH`|6s8`73NPQv{K^1l6gXs8 z>rpGOyK0i0H(|UUUZZ`Fzk-uoBzz~&zEBX4d%RDyVxTO5S|SCSr}jWFlLgRxYpEZI zd6%Vg3&H{D-@xS;pXf?yryfXv)iA1%3zqxw%khv(z0wnaGzyP?d@kJrL|c^Fh3}!H z0+6R|Xl<+jWNWZ(B8Ox59fW6o^dS832M1xK)`5-Hn~-(Z({88HYBkn3u3x`${?m^> zdiC`;U;F*Xr%#{x_y7LiuQeKt?tlHS|26xz&d#l*)7A+83DWb=KVP|U;lg;DB>R5) z)N@Zibo|&;JLdKr*tv86!I6pS+3M)bP@&4!^mGzoD$ z3=z~J&#S=VYYN%QLd2mOwu*}xJv-)D?vrSIRBwLURq4A;o-u4m1Cii|ruQo)~SDS@}`e}?6_XE*d_|R4texvky zFrAk&UL`I$2(-y8QzQ`~n%|SG{K)n9+Kkelgxn&1{2fhrU`-(AV7wmu0C&vgER8(^ z1awY|G&Vj9fPQWU@@zJA?=#s07$MzW58@xw#mJw`b!Yjjg?BWKP*PS~r$qwx|4h^tH#N zFO)w}b+GG>xlSPR&<)y$0*fm`uf!Y{tS?Cm1@@3a4qfi+ALm`jx~mYUYcM-qgXey7 z9De%rahRK~0`yj)*Je@vH@a&pi_3Rz&0m@kvFJNU%}I8k?4#lQKQnuY$xqQISsAd zZ+krz32pt}+X+qlirx>>W?lyMx*-1grBk1IKw6{j{pG+P9kZ}7j&0(l_u-5B@2&Dc zN53F|Hlu|?hM4osg9v39_p+&!rHB=5ihdIYZTht>e0R1eTa;ll!a9GyaWjD)9D7ak zTrGP)p(@;76TqO)9pG46zA0LYL31-R7_L~yMS>Z&$sKVND(v|&z=D$N$2Sjd9uq*o zu@HO06g2dj4+C<8fX0e`Vt}!nIa#>D=z@GkUx1Z9cjvkPIZpSuyFPS5nFrt+Y<~~R zH{3NH@zQjcCiADhDs06ONAz)zAdgAMJ@;B2ZH9&p0`Bzxu7CYy0h_xASiO}Sd^|7T zTM`?8Y5t#?!4~|k)I56;!A*_hX z^~Od4Ogxv~+eBEFgn?UWOXioDm7&W3j{{%?A=33=qMFUJXtqgk=^^5K?HGvG3IJLtm{G<+ z134I2%lwA6#|+?L_5CiHJT3eb=c8JtBF%+xopPJz6O{3}Ip;##V$aWJK!Fe)p=Hv1 z=Eq_o6y-7chiht}7P{?4CO#zK)A=fI)nLBEHX$5rP}8A5;$*TZEcd1DX8XQ6%cf#qccJ_-`haksUvb~*U7=-RbVz4)F@1Fs(g z=9frDnF} zwYUWj9^L^@Kk)!O^3ZPBH9G{=Xf5xxSF%=Xy|b~pw7$B$xP0}-mCrwX|J~oc{_;z2 zT)%$(G61l+Xj@VK|3qmE0Qi%p-{dd6@Iv?a@#DS!{Gb1G?~Oma{7xmRw3e3^uI=2l z@9^IJ2OsIR*AI+M&yH;$-;vCn*q86vHXZHUHVU78eibg?ScLVJHK-0vL$x{q%n64D zUs2)t@ZcvJS>XpQBeyGNT?UHth(nTuXyJhne1lw+IDfoCZYgeoBGiMjuiD{mGYoq0 zU{D0OC~Z>k>GPS%R8y{|PlHM|heW`Z0cPks{V!#d!wfIg+M%#6Twl$*hJy`efn=?_ z(A6grcv89LoD}wsm?P5R+N?&msGdRYCimrM&z+b9+)~G!%7L_ko9YZQ5TpQ$cc+jb zYpyMLVoq-pT`cOZTW>OdIMd~ zj{DQ&a^qSKV6=rM_4OuPyUHZJ56v+&f~u;=3VN4|Kh%~2APdQ^vT$(A@Cgi|aStif=K&H@8stkyo2-+`K?Rld@L~+o(ssZ+v6t z=Y{T`PSExkr-p}CShs2PE7mT~sZ;!Cf;mMcZ*u(v8`X~)Dm$hKD){H8{M^{*QQs;D zNW!0#1@30NlC6kyij*!#;tY}VBd+-(ypgyX908#y&mc)y-jqe~hmFP})S?y~-aQKU zAKnj7Jbpj?;DOyRK9oXZ?RMVitmIj@*ae=g*&?=x%Imzwh|*gU>wk%by*8 z?D6Mz?%sQ-HZ(C7SI283le2La4@GCcybZ7Z;UoC$>v>pdR3OVoAx?%Nt_<;82UEth z$4t|e2u%fZ65v_~ZcJ%9MRV+h?MJy+(0itw+)a4(kP|KY6 zqMxXZ^|@-e<4o7OUke-36qipSjn5!!PkiFL{*#u2eRqA^>6)^~gyu7!>F2tB_AV=& z4yo$%t-ZQFX#ZHj#OYRM%C~(ywGv?gn(O zXoT~ihQCj_r3G~=2p6wWd@kl%>}R?j?e*nv6S<<1kF(3``Oclq+=S$}GNF0<(YRt> z&7ZgUz3qZZ+pYJc^`&*TX{!P{MmRTa9F6c=&@N=Y>y!0d`uDw$I^#J;*OSk>!mxg^ zt;X;Q48CERpikp$uqy=_UXXHs|0r!k)?0@PY`{pp14s8w!LvU;29G^*7$!#}Xm2b) zuf3Y(-HmRy+iWe|xqah{uReSC-Pce3?)~@QJzE(YTSzxX7Jl}#<4q~}-wm?0mF_Za z0RZ2<`Cw9eb^FN3)PaW{dhjRDJpc3i?tAbjvpaV0+P-b~j{4ZtL}h5ak|&dKGmYS* z&u+r+U;h-oJa-Lx`49|^Yy*f#q09V$q6)i@Lo*aeY&h|9gEQHJxp+pKho`(aR;Vu# zWf1JU*_}?7G=D1ly`9W*2RT$+X0xBb?gId5-9BNtpH{dZ0ALC)fii-JwDi*k7E}<+ zFDH!q004ZZwbUNLkp3+h0iXZ9A?SzZwhsVM#)q_QKh3`S^A#~hzIuJ&)*yhFS{u>= z#}-_@?ZoTXgqt#%hjOV5XeIJNseR{`r`L)3#Q(jgX6L@wYB1_J>4G2FV%rXXp4uNh#>uiJ{?5CvL%Ld9l*I)51y z)G$E_6k3qME(R2|pdpy>f-^$_xbB+J?XZ2QH@CLvIpnT!)7r=uhz6lm`CR}2*iBx( z?;~}NFrEg-1qEXNdPbVatse0`xk3-)54#ABw>fyzbR*tJ!W%qv#$Cm+PnTn)mAGJ`-Bc{=I3_4Y7yx-$nFEpS^lt zvsgK9AI-VNc7*@{ozLZ;^f<;QuRsbxr2<u`Ag z3_SnL58y|S9e}CP2%>ZYvfgT*XU$%FeZ8@~IDh-jo%vf=E?@fWt+(I&-RXDV{a|Hf z<(BmGXa8+!{l5cg3jp{|CVptM>og}%Jo)62L;DUquzT;pBlkb}@Y8$t9XdWevtw## zbh;YVM&m}e65YJD9)0rpb@;=3U%>gR3y?+QFg!L3QFRP@SqweypBF=%vtWV3Ux**3 zws0W@EL(h6ghw5o`k;5pK%Zk3-Pnp)T8J7K`$rcs@OILKcrXBfe(!Iu`Ci$kb1=o$ z#JI5#!py5LXbyQxd>c8#qL?Pi(0~fgg8fu?!s?dmcb1?zh@h+w8TVMiLnuwzb(PE{ z4K;gA|Bu=&dVrU>HqYvT18b;tM+H&Ow*jF%gq-^hQ{VSRshDvt=kKZNLV=0Te_6&& z=2t=t`gY<#4PwvkXG4rOT8z2-9vL&L#Wv@ZnKEKfHS;?yM2hcCkWC8!X-Tb9pqJ{i z!36lbNxpUBTW?y3rr@3U&4aZ{nnVRtSsIo=$~Wn=?Sevu)etS~2U?hQoArx2an5Yo zxA|z`{ZbjBzy!2tyF6v6E9;8S9$F@4+O5_F+ij1%*gwAh(dQ<8vjG@w31$;#z6o5h?MUA(-dJ*%8^&T8< z(ztSIko9Vx0l5D49>m3ht|kP`u=cH6rrmD#+th}K)-`Pt{TpxH;b!K{HBIKxxAB-3 zfx0feF7#Zf7F)kjDNJsa3V^XD|KZk4>AyQCCjSviX5BV`<^q9s8^g&iQ@0;2XoXdZ z?BgbnGSx=1xA?rF3$HOxnb>bEwo;rz66KIYDdbrL8f&*8&eq`Io+)_p(WCJ2L;K*s zo@tmE$sy~lWu4|qp7vU4tFgL%M`Op6PZtaxw~mjEFHcp6 zriRC-rYpye&cKe@$!Ko-D13PK5`1}n0dC&91)XdSsw0z7sSS%DJ!wxw=jH*^a+`P5 zXRm?O5<=2DqXlmYbMdfPE z-~gD`0I3{6Q6^b*MFqqqWQdbCypiXwnjLI|UjL{C$LC>T#@BD{v#*8aL4;R5_nxvt zf>r1U_l%VwF}CBrAB1rWF$?6HPs1{%f5Nqk<4uJ$-#Ga++kVRn-9E}MnDx;9@+dgu z?{YkaNvkD2wLl@e-F?S|=C^QT$LPT7cR2806i|c|fr)sInE*hkJ{Y_Lf<$3Zr3ehb z^4vMoc?>PSqc}0YQ3e941aS+OE{+91E^$q;-EQs(BEd50_s;<~dFm^iIAVVO84vQ8 zwl|>FT!C7p0|$20;l6{r;L+oI;jv@;Vf$nidaV^`uC3%*ubH)58_o6gwZ^SmH!hs{ z?8Dbiz5L4WKl~s)lI(x}*}r=FzGDymXxGj?2X@ZwJ3Kx$Ggld&s8{P#adm7G7FKe2|Dy}=*1KQ8 z#jDHE>{cL4h5_PXfM^KvyaqY*SL7RBL@(Cncc@7vD7`$GMAUUb?HF<&iWwlAt-j^e zkedkXWNRs0gqY?n4**c4+&+kG&CX^30Bk3UPb#EBK+{YAF0V26mqk4KbQa;ZC8D${ zCPmM!uWhLF)nln-Ks)HyJk#Sm_GF>s3%F zUA|kUsm;W(mz0fL4P*{;YOZ&)IcDAFJlPCx2z0c^q2Hdd%klvT<|ChwZjLi$KFe(d zn%8HcK$&K@FRl=kJNf81*nq;l0L2Ce0Q~2S-b1+q0AP$0vBX?+`Z8b&eP2X>DF{UO zxLsyQ)9*er_kjPLb;nQxn?-_}sf}jtNQGCw(mjl4s*x|+#C#WzlNZ3S_=gZZqjk}^ zImG~g{+qt1bWP6@t z2UtW=Q~(YG0DeK+UiYSp6m6$FEM?sFTwuiy0QeIh7wgJro}WEp0r{krmtA)_F>8%P z!bm*Oh6ef+0FZJkte7bUvo_?tCP3PNIBmdaJ%t1Nrs1g*_rnh#I}CHvG34EK=r)!B zvR0n;I=%JvmBslR*DqYZe(mbDtCv4};}54^{p#%5FHfF4x%}B@pQWcypH8<-{=b`P z3jp}@Ny)ZtFfuuLc<02##O}lQ-FNiS$DjE5gAe`SiMhGGJF2y@p{zPwh3ZHYSH_~H z|fe{lbIPD?`tv8~&$zZEz$Ov&B z$RzeGaG>D*LP9+Yvc#0T zf{bRwXszL7f&{iiO$4R^jHBItx|_q zXqx)1R}u`CfC}mh@;L@A_LuMOdu*!!LZ~mg5R$~#=D6FSZWz>Z>(`(d^gTz4Y5L$i zi|-qgrkH1&FTVo8&~-;>dz@f}v`n{6bRmQ_@S!mY(Q?1A?t;Sh_}H|?zbA^vsZ4U| zxM19PoyIa#T0cm#y;%pTT z?Vg0EpL`I0_~?DGeX0s^-h`;P0nlq?S=#EQy-sg+d2#9D#jid){r>wefBM-cpZ41A z>*vm$ySlcvwj!=N-!l3CE~hOQfIpvI|xSi~tnT$rBJQ5u_G8dis`VPGJ!B_Crg=^4F>o7bv1C`ncWD&bP zfDs*LX2b&QXrCiRCeaj^-x4AYMs~PSW;v8XT5+9_`Lpwdzyi(u*u*(>*o6*1`i;@% zK6fsc)kyi#=OT@%5J{B+OiH>%7u#VCNbK<;)huX+O#Bvylx`#YoBQ(#{zk_XkoQ%a z46=2nve&x6?pr|cBORyWC>xIj@E(8m_0i`JXn&hqOh z{CAme^qMU;6UMcp03ZpOxRw<3-~Oh~x_-~T<8HZ9I6;k4NsW{%{1uO@7J>-VWxR8R zO@Dnp#$NAtx`+JZ;I8w2X^^!Z0y@I&5q77VHrab2?5}R`pQ80u9=OFaTz85P({2Nl zn@{?-2XXaP@fqi9dDyK=x7{hzGIclTl*QyD)31eWQ;2oGvFi7=rwBBmV{5Npdp^wf z{{1dmOwKH`Ht3gld=LfZx=9G8;dnxNy`mMBbzK_0b%hTsr-H(blHHqb1W7jgjpg@S zGhqPBPgi`js9!yFF8Zwn-!lqSg#azVf6z5VT~xwtvgrm|3HkO28^e+5!Onyi%U$dFR)^hVDQ7!|vYeZ@$^9=5cdz;r7KH zyZ0U5yYIlGlateXhQ}sG#wTX$<0CVbV@J2=JLk4VduGSr%okVT%X2s3>ijL(SdO7m zpM-jSn!5+|vK&$-+$*!L#8=D>}0;F9Y<{NZeeD}l~b;}@~gCvt#@C#L1z@X2?e^wk%Cys*-OySpp zh^Z*B1d`F;L+uWYA2Og=i_oMIx@32V2f-=en}5DlZ4Vz(_gw|@ti~VC}JDtDM&P* z`$Y!><>Fs>TM~Jq=$$Db+WdqY|HUuR<11y=pvn!q#0|R6gY=Z#j3B%-YzwbG2~mJe zC8RF};{t>C-v{KHS#_O7--^Hc*GCfql6pUsV@uS@t`>BNHhL@7n3fS|fYBmhO)Az_ z3Q3$pg;{W>E$BAapxs@Eky;NP*gpdIA2|e%9NP~M-M0s}O+cQt*Q3_@LY}6rEbVkU zt&NrD%JSl!>o=}_cJ1n=Z*E?{{^hCHUVZoa)$5mEc;STxTk^m8&2RpE4$$v;x_gd& zEBz@_^uh}-M8Ey*Z|mpJpPyJ>UYB_6J|V*OwMyX)S|pk68kYLLOHkuGBdZO8EhsXb=FeU9&k0 z>uMPlP7DuV$5c4bnL?sUefEk`@XavpMF2nuB@dzTcD{0LG64XCF_Z_gYvw51N3|AI zqo~XnbFaUc9yc+E0(_=EhM14ui|)}7kOK+>%#<W-CaOGsmJylA-1oTll-TA20I&_g zfK_fkb^H1=d5(77V^Up|eCxYhvW4NII_?cfMiYV^qU*ldcUQbEgq!7+8>`~{E(2Y( z$HY4fph*3vMf-)uRhVR#u`tmBw!h6r+dQ-sugydNAdf}d8@CVPJ*3Bl2I@naps%MB ze}{sEnsdk9xVT_}&&~F5OD=AmC+NRl8;QHr1XRia0M6)@%TGMT5+220oGqIs7rPI(uR9gXLI6NndQI!4W%zIJF!R&;ixLHzoNwf|;d$hO zcL5PknZ7>sZ;7`Lx=rrYeMQM_qX{&I&QP*vCf*(JAKm6dK128oX z&~2_lv$2xrX(P`&t#-THXe=!)-MD@I`o-(luU`1{gZKaN##?WE8OQNLrBYcucI;T| zwbx$TGWq{AOIrZIpa1-^6SX=vHa2$Pz=7TMk%^s;KK$sz4<0}E%+>g++Mtz0cv(vsYkwHHEk`4wd>CKvIKl%5MH-001)(iS?nx z{lpn?h*}c&`xTLae+Ju%z(hCigz%e!_K;>Db*e;C=zMIECt^8b@2BfQUSc z1t7+LFaW@<%VanOKp_1Zql91CM-N`gRO{b10HEha#~?6|Irs1_2LSjPSDiCtYA1Zx zT~l%c0I=c?nBx>?2Fo(6CL>qOOqD5rkToor0?jb^+N5);x9S<4cP&^X^0(Oc;u8%3 zFb0|TRTf1B5?-DZN@N3^zLy!-AW+B2i`%AR06>OXrXWTj_+fuWdoTciCOh!p=IE1I zKMJCzCf&~Kd*-$)1U~hju24ktBIX|j9vYkx1tB-68f~AxeL+~Ju=PsYg7j50@(2vS?H} zAldY#rlf-*Mkc_W4@{PJKQdur?j$G0z5#(097wyc_9>fvT`gZ}+7WBGn zkf-Y~Gn&Bh2lm2Ge)JF=zkfT74Q0@4Z$O@IWO=ud_Ik};tGT|ux_Ia2t@)cbFI+hH z;Ro-ZerI9f*0rlwuU=bRTwDf#4gmDFg8cn?rY!*AFDEfdR0DvKy?giWdgPHu?%%Ov z&w(QkJoKYod-fimnchA#IlXIYbaHAau8t%pb#OYqs5OYq6(m*D!Xb;y%3 z7#f|0xH1aej0uK#hWHXw@M4u7mxD)}u z8v(5!brWV)!T9m2;EWY-n@UNDsuox*~ zF3W--x*g^o@oUwrNbySXfpkH}ERfn#=dLQ%KGR|)Bs6Ka8MFOm`Vh_2Lf%w2I%iX`UP2oCh!Phqr;x-R4r{*5?l|eO#?mjIZRs;YL zjwDxO$;HLTlMIo%KCjQ%7M)}6`f&w5mk!|?x3t|sS|Q5CHBvU=7^9$Jl^W=qOE>yQ z+?VU~LP%TuJ5^_A`)ato5%l0J=9{SgVVqYY^)VC^# zF%m$u_+B@!JW!(B;NCc;z$yYN3V_C@-P|0GyG+?@vWR|%fH`XEp#W`(M1~?F{sr?pi&v)Zg(tL zpf(Yc=6Jkv(FS%vAQL4{5kVpp$&=_OJu6BoRj~m14HD(@-)~kcVt;3&!ljZJwlIfm z|LM`BY>vv>{muAc&)ETsN#?;~B>ukfCJeaTr=*!#0=@5(pAyGrT;Hp@~7pOnmDT z+GtZ0yVZA1*szUltx-1WdH9V{zx7N5gV_LEyIF z(|#av(HLQ!l45z|1sJovaACe8|#qwHejUEfxUA>aP+`~aQyx`c;LQ0uxIB43?*G?Z!G4` zW&@(An{_*l_TugN`OB9se0=%xg)ir?UH|5l-@bJE`km`H0ASl^}rPzNqhmHaNuPwJ=*I20Dz3tERlKCda3f!0)XGst^FMPYw65>npy&>@t0<~ zY_eE%YB6PW{Bc~cuYQfR-A~F;Xu!+7rc;l6AFCM}N70DbEE2u?ked^t###pKA}p-9 zlbR1M#*85MR0jY6pSF^&FWag?Fqp2krbw%&$HylCntP|n+QPRc#ck#Y zrE-}r4?slRw2Z4=1NC4XsPQ!{0MI0xXuMsmnO$~20Kg|qnscNDB~u76tw73IVuahG z>k@wd@^2h6Zh<9lyaB3xl>45#oD7)U{h<3Uo{9eJw)(VkAZLfY0$&B zXX*L~^$F|O`NA$KD14)kqg=Sq6j};ip}7tN0JvWL?KS!(GwL`-+5$j)E5}i}D1_&} z-`UyUa-#rDQDvC@)WB^h4uiX1RU7CyE0BYzMLSdc?@CkXZDMpRYl1S3hCA@j7HJDP4a>&ue5fQJSAJPOzY1rHu97Q_Dj1> zi1H4^Q45l&3)2%-IJjpL9y@**9)I{S?Aeh(+HFC*u?mnjA?vj=$UEI`x7A))xIO>X z7hk;l&YQ3Q?$oJQK557C!e|^X{ru-YZ{NCgD|_v=*93FFrTPDhNLv8FUv`S6Yd~dY zW@hH_;rkzY>Zzap;>i8?{cv{ouANiUv%5w|#zv!fsG29kNn9I=qskaGdI?;(d?p3GebHpdxSad2%s(H_}5|&kF z>Pr~8g0Cl)C+t*^CkKyYe)z$ve2Gcg>^9#jsJ%$r693Y&4V4?^>Md@dMw z+oV4tCVhf?L1jF56<{cKs)JLBc@hU47x^#{ZXQijb-89~n~nA6yZhT;CMFS=K!TG2#-Ap0?6tsT z?2&t@`S)p%F_r?hIn+k2P1NSyD6pA-WBH083x9e}l;wDmD$4NmbT1?DNZah@4GTX- zW8>0C-}g4%2-h#@pA>Oq%m9m8>0h36NNc9`m=%qePtZ{BoEr60A&5$#&Dsy9Fe-pS zEqu8B@b7a!fE0d@trBY|^sU)Xe;xSFp~>nqTmNp3l)ZLv4}|(`lw^Zel9KQ^B_wW% z4`kMR1mjF__?Q15KVu7Ad^AvFkCCU%(!GS<1y6-by7zo@>jTG)x)c*2&LQvHhGcY|K6%ehw?#o-P4PC|zny5g3)V9OvW4Hg8Oz2_=6TCaAH{0m->1Um)wsz6 zyCQt@>Av(PZh|jbEJSx}9V=R7(Fy#ifLQT>DQ0M1z2+GbkwF}#QuE&fNH-wsu0aA# z*gjo@hmP)nCmy>G?mN5_#)l(_(sh8W1zBf3hpfX)Lc8r=v$?*ya{JbeYqzglz5K;H zZ@>Aw58r?Pbe3iF3kwU()PKvz|1UIc0RZ2hR0V*kAN}Y@M|bYrb8!E`L-!qd;K8SN z%>kCV8=JQMN_4%8yxYB~SG6ut= zQ&6c6L!MP2<^E8N93?`yAtqwKM1hLStNbvvw5S$ZYDeS^rE(yEkFlWy z+hi_606>4H);y?$@TU(d%oFmRG_`Xs!{egL@@tE^*Fuy;nTc>C7+cB6NR7Rp*&^+t zb&+5-rtqd(pao=Oey}9-{k=@oY+VI#3b<96Ob*@wP5s?nHpU3Rr~oe}(CR!000_p8 zYVLHITBAw;14|%Mj3K@e6XW*SnA`F~wV%8vG#?1Gf&FGc~a&AQw+;MJL=t^xo6HQRh6%U2GlA0+K`ZOArDAX*%wqW!_MH-I}K03dJ{ai03e zTJS3jY^P&{*M}A>3P{`e&&&V-1U;56QUL(KS?>z`kY^X!V}k!R6=Lj<6!|jwo<+jo zt)aZL{2#Ft8NEv(W|NjRq1{@AZf6Z9Mk2WX;4XOh!F_Pwp*h$!I|P$smAsa8AxfKh z)@|fj-p=xFD{VCz&6U-q<;8`C8y7F0fA8xrzWnsgof}u)dh4w(TCLVC>E~beAm2)V zhG{DX!1pKhPMkQg{N8)-eFpH}h5fsBefjJ!esOJX=bj_`4jg=7$FAMSM@Pn{^SD;6 z)<$dN({r^Q=Yc`Hx-?~yc^D6oQI277hwL*4Om@^Ax=i2Iy3>*>IhWg zM8*n0%od3yInXUo7PU|YqiJj7@xEUv>(~^@5k8RNvuM5%EL_%PC&~{6J?{(dZ5HyF zsU^k$E{33P#X=}bt}ndVcik3SK-c3z3R5SpD@(YIF_Cmjn54C0JcwW?FuKyD zW}_VROZrg8#)<=03z>GGk?CZ4e0QVkUOSpXszp}UeaU{RAY+C;ub{s!OCyutb&#Ief-Wl@0{1z z=XtjujoV6p{%H#U`2M8)^y$;-^UpuuoSU0#zx?vc8~@|K|Nm~c^LXaD=l;dR4<9>r zY5UyH*-E80IyJd%cc-;}pjI23s1A+QMn@)+NA8<}<43o_jobU->{nO#f0wSU!R_S^ zG&?KM>a-wEYLHaw5G7TJm!k|gkHE@*L zEpW?F=U0D|Rad|a2c4-Cp;Pg zeQ>Po;BoS)y06ykf>cCrDuqoIb$k04t)Pm)dpb+xiM|}b{nTFj#DvvrzNxG>e8cK8 zSfWf*W2CA@&9lrC9vjP?oNA2%47Jf_Uq=J^HB)7oF!Qcy4H%At66P%-iuRj=O8%Bm zVV~wA47hG(-+mPJPyDN`M@((Hr*)Rl7qY$x)=7F}6e^idF1i>J9|}FH)tw)tA6DyBED*B;eJw5eEN>b~-X-dtH(y0Lg`{!+8mUS3;SS-X7co6lc;`L*{hUp{wpa&mHs z$p%bO__Lq=EQ{3Lx?AZlIc-5a-`^BV0I0TW*RGkVsi|$%k&)4Ar9ScKqmTdK{s-@W za@*|AecQM1*fl&lF&S4zYnAF~1uA24R2_q6FM-R~SK*`2F2I>DuE6~KDm2;|M9B!m z)e(TW0(oA6j8zdO!e5U2LfLBm)IX&v~XNg1BP)vB3y76sJ_>N7y1f#QsybljYb z70bdZu;;?WjtX5I(UmvF__ZaL2H)E!!Vr26es%buNk6~FhX(ud_1R<``e~62b96&s za|O&Y2?b9DayZd<%~m4-5Ym!4-+O{PqHku=9q0a*s#;vIqky5*40E`hHZ!Z+8D_|R z-`mgBb95_Fo;ET-B$m}jXfP8+Gemm_yH-xO-v@B?8%sN%y%s}dxzCW96n#Q~LqBu1 z)x~C`gCw87dHK|TtSlf3ElmpeH?vHC04`+8(H+QBlTp8`QMSik{2OvtqVMV7Za+~# z!e?$j(Q1WEvtXb(MNd3sx`|r%P`Xtn8K&jZlB{TN3mTAHt{R9A>pp34oQe;klcuGX ztIappb6A+PS;C^AYTmIog1DOJo%n5#kwYD1eO`qoD1ym#7-?>+T8d6dfo)8NZ1mkr>O zF^s~634scsx?+w2!nZ%pI*_F;fV2hGqzf~XL-62zd*FwU-UmkxY=@~a7Ry5T|3^Hi zUpq~^?Ov4*^_y2NU;gBy_uqTx_VU8btle%k8jY33#l>4ID=RGk=qiSG zD}8U$767o7A`BEL{~J2|zyrGu9Xxn==dS$+A9&!wr*`b#^U$_!bJOD!+o$To6ZI$= zO7dhl>OwWzXyvfF+KH~+ScWgoU4bvYz6Lku*Pzv{KwKS%+K7l106B}I96?X|_=?1s zoC@N#I$#V5yvHJuQ>Irzq5rLT8O>C)m)qV+%iC(wbk^zMqGoN@I4xpv>6}ku+ z@}60m?PqHXri$^B+Psiy&>(=1+m15(!Y^p?Cwb9r4dy(A+fcS0x=vI3X9fn;p3Wi( z;YZM6UbADa%q*Mqn%054kUodN5b>Vn6(nD3@Z~r#x`uHPTmV3nkAfwh5pHZ3QI8T* zrH0N0$-E=wDGN#glHoLfzdX5cghpaV4WqUu()GLLnn~RLfj5n~)8wE7UWE#DV0y9+M-I-x@rU-q!2`1}J2eWEqt(1t=|Pk>cr^d4*T~Ye-D#|^tgkHI zS)RXr>(bX>e*T9m7tVjVxOn^WTW`H}5dc=j1>O9=tpI=D%tep8fld?AdeR#PsyGox>yJqm`ktdUa?d zsSk}uNm7T6CcvGQR&?pcGF-X33>UAiz~$@9aA&0r%~rC#9bSH;n%30SYrI%&oK)C zkoVk|0RSky5p!?T8ndNXW6o)fjNmT;0M;f1J6T!hyZpVgH^9*t2sI_UxK~@sTKx zvo2&E<`S?DX|I)aJFRZJxwf&oy0mcP#?3QVE?+o1KY#PWTc=+6=(6Z+}64aVqgrN5Z86$4-^<&or`CBe;3p8WgH^z?M^?YG}qic3)6e8-gf10?fa>N3EE&8+qNJqVyt z-jZSvt75v|(88m59hiS;1`u5Io*AxmvDo4F4&-6|Iq z!tfJEpbJ~?-1}6nOwnExc8i3oQl;rKiKUcyLxZYFF^pSXNS50gb8e9ph{jDCFLHbL zq6rx2o=Ff&22eGy5YIJdKH*-2UDk6;c+ew4TXAobPbdoIw7&!2w{j^cu+s{hR;)D- z)a=;@<~uWSb8vK3Ai}Q=h!2{)ig@GY-LC&)kkxpHeJadBL67pu2yW~mDC(zcHGx_D zfeZEL7iX%Tot7i5)>?wU-|nRxM_#J*DV*KG%@%u#UI)0p554h?HP!C ztIYn71W;o@GJ2f&dSL@au2$Btf~Hkb1PPM!G=)56X8m30Wo^iNO^BckwMqu#V=+vQ z)nLc$3>@4y2lpS@1Bds|!L}*p$&^C3y#kGuB}hBXH1GC$0G(d9(`m1+F3#V)dF|_) zH*Z}0^6c67fB!%K$ER7AEgn8RzI5{B$quXa*s)`b-#4aVfKl2?e_`p*mhIn4f0PtU z_kik-9XrM*Cnt9f50CHs;ge7P@W_$-PfSnGY_HXah9@VtZJU^$-kwy3hT~+U5?6=g zN^LxXcnCH+8O+~agL4;dz?bK)!R4!qaA&y*?OpsFJuZ zUBkVo-7lflCyabqGi-6Nxs1QxOc09EbwfL;%cPb9q;{*ELCi^uwNl~t8ZFm-ym#k- zUx4bbk#fqRXu4Ox6qX_gw9q;oYl6sMj{V(Wrk(Eh{<$;0P;Iw0DYP6j>9H#oyy$YI z8c2ObnptKZY_HGvm-aC<-g+EqK7Zgax<{x6AHNUzgku}&SZM2yBH`0Frn;Rz#`)U? z1GH6uD^Os)aq0C;&7W;kSUT51;lo-VqC6?E3y4^ZE7N2u&70jHSG(%;nUGAiPOR^3 zQ{X|Zkz|L6CerXGHnZ7rI=r+Z?@LQU$+j%QIs+0f`Ns3sD91#4Ecy#`q=3Clw_kF*Z7lS6zX3OW^O6*EKHV$aLXtxUk8xB}AEkTTvFzu4T z?>xW-Imi0#Hw{`4_X&EeWc}hjVaxO|6K^4PD(*Bgzs^=nrzeewQ#@BZQ1jjNZSyL#*V`5Q|B(2@TA_m;`qN`Db) z3jo+kW!DM&uMPmi_uqg2-n|D7?3tLD8n4xA(}xZ}@W{b~2Opo=KDT3ha%N_1Y+@*` z4JQD#IFIX)=9Q?^OQMZ7z`{y5x_oUBzB+dUE?&L`H*T}wf$Y#7f@*z4xCkW713|b6 zFm*rsm!H$@irP34S|Z1!&op6l2z1bY&J=>fCfVfy0Q_57j(LL7nM11&)DW}l3phlz zFg6258OSmRzT1~D;?Djn?vwXRtB(H3jHd0Hr|N)GmR8XgRHg7@`!w6*+>fF03BdMy zoAK83UhI@dR2ELZi^jp56j7>jK!(L~;HERpD?iw{g z4L!I1bt3X0cp}_={B?#Ctp|gy(f;`QNI|2-#i2LNb0eK9M-+WWBCx-G1S004JwN5S>2Kn095AOn)C_9(%)k5on4=zvai z-$kLmQ-61ioQ?r_-9EYd)}=9_WX2TIF()|PMEZtSDBg3=JS*vXRBNYSusN(-mgmyb zy8{4x`$L~YF0VwvC7ZV*C3x#``er1Ls|CFQfCe1Zs&sWlo}wFkNq9g!g%qg&G4?$T zP^rE%-eXzvZ!3s&6gn3rfWfU(nd_3gaV3sY$fFdJgn@o z*ROo}<>#Njv%I!)Bki;rH*Vg%_2GN(T>^j=Dflx}|1F_^D+SXQ0I-$HB;g^J8!-ad ze^me&d-mC9kKT9R1IKplJ$QKU!Tpan;9A&8LL%?Mx(eo8uhXY ztTs|uSZ>0tJ1cNwekHmwzX~^RufXkvRajbWL$k|>>@ZYnqma}_Ag(anArTA-uwa7X zq(+UEU?9mItDN`>#=$s9CG%krbweX&2H-2Bb@FLY^>dxa9!_d@Cm1DDp*qS_l|IKmsX?MwMEyNj_$kjq@ zEHY|t>G6?NQznE=dkoAq@6$MmSk==g-eB_A+gbk1y?QrCzoweaE>o^^Rl!1aMO zzCQXGTP;k7kI*8)wCEdJ2hlyLHc)ZF0C>DX*QDi?0l<*Cp~Fb(QGJ$?w2^X(FbY14 z4*cGI<`Y~wGcK>Y6W!EnT3f7y0T-WOY=D!J3D=rD&s-^5V0fws&mMGzdp`|!>k_nH09<-bD2Twvi1{ijG>F7cFvefE z(>y;^W%{{?E~vbU4$50Jqz`%s)CixoSdL!v*iJ&h)weF_EdJz8CFif8u4oMr2LS*c z*iM0EcBmeetJ|08ZC~xkl*uTMUG{;%-&jR|@lME&&hG6^jFzlF{ggrZFV9(AenA+9?map_KDi@Gs)zc83X^O!Hp>h-=&mAc-rGu-E|@FMuDK z$gHq~T5AkcCp`SA$w*26YWcHVDi#2E4ohIO1zDPhekYP(W~pH49@HAPuu4_=O-4V| z56UD8pSEDXSb>8Y0q7EBIsLV^s&$@>jL~Of>C-?v0s_&*loHDDHU=V~Q%zBc0t!dl zs>-^z*(XSqOf=vm{~v2?FzUONY$3)Fwfl@$XiO+0RXpxg$aUwD?oYjDh(Lz{>in%B zKn>a7eNquq{KrZH@WX2axi}%7_Z@d_)@(4zjCobvkOGnUrMr(vZUZ0~ghcwZBx1+O2ocYJ+>G_+qm;1dzxbrvEN2Z6Tmd7+>AK?o|V*kx1UP<`** ztS0B3EFbOLTs#j>JNda$Vh8eNPfs-WbaOul9Y{W)zz2{7+Ke9R7%h)Hrvdy#xz@Ut zUrYEo*bf7$ch=n|&H<8qV5J7z&3wAPqVe!I&!0_&!q;U{(A(0=JM*E|903OcXP9?I zl6B9(7}`!73{_$KDZpSTYeZC2u5OCioJv?UOCir#5WgODq-lSY^`OH1`D+=BOe8Qd zHUV=pqp)xHH0;|o1ABMP!0h%37#?C^d@Jg-*Pzo_heo@Z_uB1lp7(lL*6lSm)|T(w zy8X@S>hgT6-Du3;ymsxQ_dj^=t+!tPnrZrX?K-jcZ~yIy?k|7&%k0dVGlF&12jo`T zN`>i<&(&|eeB0SdTRHcy+?Sv4pqn_7N&ri=p~Rt1!8F>fLaX>3WOSOY1NemsU(w0nQYUP65s1` z(5yB|5?+VNgb~Jp3+&8-fwf!QUmdf)1q4tOY}EHwz(H}4xr~Xq{XOP)L?APVLIjhO z!5T;^I&*BzgBbgA-}<#0)V$OMTg>sK?+i`h0Lca#==!4CW$cgkYZOe67&4zLh7?02 z^5io8J`IrnnQuLz;H(&A9(9-sBd*5P7k|MwwphQ`Fx&HL_t~%E^0m8Y&h7U2_NuPK z98YaI5?&*AKYc=hS@z(`SH7*yHg5|c*EL4|GF;0VyX@Qu>P6?qZiA>=x>Si5@;yEm z<6sIGt|f?%u25|xDO&Z-ojdxzTucD(6|WxQUyerM_cpB=)Vf2R1B_%c>l24Z?wFIn;K$T{d_X`cC8#7pIB3O|oZTB2Dr^T{?dro4(A?kVTf{iqYnfQU@oP(@l~YV+ovE1x5nu`m!u6_3Lr*D7y`6pjxdA`wF zTia;2+jnZU+UnJ-SDB`tEv`+gVz$!vJ8b~~Tj^e=SX!0fzY|Y9@x;Mx+jeY^hbqI{ zr?&5X;MlRB%+BpRGCVXoJUl!)G(I&qH8ear99L^`lnh5%p2T@nhi(=}txgIX&0e&+ z)`B~WYjFMg0$jd!8|H7X!_ry{nr$Xx)p-!XI2jhV3dD6tDpjsI%X$J=PuT$;#gH(d zK$^;CKYhKZRrnNibJ+{Y@et04h>08=pIL6+oj{Zb(@AC0N#Y9VXH*cf`zZW1ao`Y; zGTTthRBQ8MI(Kxzriw}9Y0hej*yDw=f?jau2KwihCuATJ&5OS{d+7aV#2N27R zGlT3IGA3ee;Uy2+nhI$V(lVs4tW7Eo3|=RP>xs% zveB{z0ZQz1Owa=D+CyV^lq${ZDuH82gng+bz;R+e|H_rf08-=-8>C2E4I=HL*QK(n z-^8KFC=9b?6l+4zXfgNb+pbR7tQg3`I7mVmHG?IJ_kypn&l@~*M4NQ^E&y8$yr^#o zh-M4hYB#7o>H^GqoJ9Y*%LFPwtUjCP7_A5CZ?0oCQ2t59v=D7F_yXk)BF{TH2Eye- z&;`cVC47=H$kG<1-L^FAZvrr1{u+ziUxV41aUQsD-|lU&YsWNfn;C=gu{zW%Szbv} zNLUy1cAlr5JkL9M+UsP!POH7Lys*+}tT(!yc6({z_Kox3eDm(*OBcWD#rgW$!ou?B zpMQSk_U+rZrI|lFgqYwj7u8nUN}Eqx0Kitdr%7wOGj^>YJB5ZM7*HJ>8=L+4&;R=P zj$ONV*XtvrljGyN_8d6!_|)|DzFKvtp45kGqhsU4L&Ia$YJE70Dzyl577Q?nTAe&! zU2ntEavPS`I?=*P3vMrNz^#RKxV_kbrIjYEZFHd1VWgZ1M0Kb{RY)o|h>{8<3H!~i z9ApBwIFy)nEn|m*6n^>btdgU`gDF!2p}w1%Y2z^|A%iepxV1vjF7bE(04DNDL_t&n zooRX~007G!l9;PWM#LFoYBp+XyeaB0m|e;s3jl!q(gK64@zwp{ZIBET6_znCy7rmh zo2f{{8e$MR^TPAQ;tDDUJkeuJ845Zs$Ut+ScPTK5xu)>}%#+j!xF{J!EK|G_jDv7P z&=v(=_YP!I$p4Dz@drP1wZTN|Asb6vaV2;q!2va&Vvb|U@bhQH{1mMnS(37|90(Tq z8QCG7mq#_`u>(Z}c+Q~VxHycTV#{Pd9PZG$nE)AejJTajmW=gRfelPMBa3DCWlJ7S z1_X_DJSjF8VjvI#Q5F~q#6Um{!3N^m$*VxuV+jH9aVi1;SSu_{L#W;}Bgt&)2W*AWWaYVPQ|#5u*%RXIqr<@#V? zKDFAiUHl3xYSeQXQ;?U9{gAFPVhPFfUMnxl)S=F^)X$1k&0B_pDqKYTQKs zjA8bG)QPMpBmJgp1h2*8dH5P<^bzBc=(UUI6W=%F@J2A!2JGd|m2HuGU;Y-hcH9GB zxm2iYPBDmJ6!Ue90cAPv!2cG0`@Fq*k6+KnEJb=f7J4~9yYNF1g_g53fzjPqyu>jbA-K^VbrOn1hv(svJ(q6l> zzP5Vj+U3h1&)>OqzT53>EZ(|#=Yvl_I{Wq6vsVD1C58RY3opFT{ZIetKgqB@K4;dg zw3P-=TQLB((mhQ`oY*1u!V52CXV0E(o;-OH&YU?D{lh=}!^VI6Z~u5l-X>6g=%I&p zKmF6^FYem0_t5aj=*Y;($n5N{Jx9mJCg$R5wU$(BNxe2ytJX)7dUYt;H8To(c1%GY z$I$KqtgL5n>&_a?-&%(GJ1cN!X$_WFHehY74UJY0TJ0uuIvddG<?pPy{pW~q;z=6FFqw&P zWOb2W2&Y#29J~Ml5zWLZph5*4(;8jsTB_UR0ymEKk(fSeq04NCA@nFyL()zqczFhj zN=>?3=G-cuULDkrGpFjdHsnHOATFtmq7jnSUF+mdZw08Jb&QpGSyG$HzRO}Eoa2~i zjSEK1CgXr}jo_eKS0tbvm2DLxDaX#ZpGnri)+g8eGa=9rR~%s)cZYwS6J3@3AF(ZU zgVdU}nNiOiQeaP8kVtlv^T867P~$@a;TbKWPs|(|bkyV2XZz`rQOLB{nrBSZoDjK! z3C5^plLhkmG&I4uCXKaA1xutG8bm=7$9I(l_Bmrrf2;TpNp)XL_N2>gLP zspzu`yvVez7Vt>c45d2;aAVA!o(B#>qi|-^X9>jMZ*~QrVQTKXPL}7l02BhGs3Aa5 zfle|hM*UD4TQP$4q*AAfL!$^KrNq&S$wO9)>Z3_a2}mm~95{^`Sme?0Id3xoe-z+F z=#K82wuH;MU}(*uLFcu~-)Np%l6oAKWs(Gr)IMP6u!WpUg|*~Adh9r*HYei|d0loGLw7Hc) zJ577-UN7zT(zMrWZ8TPH-?{b8(&C-#-F9o^_MQ3pGar9;`juB+`UU_tWc2>^lP6EM zPo6xPo;-On|Mjnb4Zr!#Z$eDoR@zFNP7W)*mA2BinBo&BPVkfG&Ye5S($dn%*x1PU68l2?WfAHMIvBPV|J^sb$I4-btFkBp3tOl;e>V>kO3;v|Xk3gl5Wj^bJpS88#! zJ`^Q!oeS@2UWHB%U~RnxOH1o;`_3u{1#T^@!s7ALCek&4+@-GPjxe@`+BXEg z^jf38RXZgcNP(A-e=S-2^ql`RVJ2?NePug`t&7*yhbpW{VSv839$NuPVsjGq3_-Y}V zM~hc<#dVdi`Bwx1#Z>2zSbp}ld9&Gkz3;U<65hLQ11S&;FlNsi3Wf?dBd#+X0Fg8s z1!}z>r54^Btsdt|EdqX&aB|m&rFUIuNZA~mW7p2cVn5)GGO7b?U1%QzzNQSI1w7-7 zG+%-xa!dpOE@?6|jTfCZ)}sd6#Gc^e#VtEBX^mjIk(hHzX{pbB&NGkUQIq+^Uo`HH zNu$i`>4ZX_(qa=VLHXU78=Ii;qmzsip~sZI3HmAlda}nI_d7!*U>Tr?IrSaC3Eab)nsAwN~!jxpDUMGw*!#!8@OK0oEHUD~)=+zSwHD z*0yci)*T)m&QG5{jRb5<(BDemYT5z-w$h(6VXOdlG9<&p!&AqPAKyPSJ3Es_(a7$( zef#e}cI>ISx!Hrm^`Tmx=SihDRGXNdnPA94C8;EFREd}%oJW;7imMSs)rbl9y)1!V z9z(YmL9?AjYa1ynuXW(g(grLnu5xRErPXy&c2<~Uvj4IiQhoqwK?wyZ#hjubVJOQmY_s|d;za0(wAR)X zxbUpw0uvKVB{RYO1EscFRl=X4R>Ne5Id-muF?|Nbk{J{zKl+DD;TBC9l_ErHpH+}0 zGZq46WK_2mqbL|6o+FV=HhYE)zKp^v%8@3y(oc_fEsIUC!U8~;=7TZAj7bmzJbTLe z!|v~8KauIR&8dkHZZTf6%W}x*^^{ucL0f=U4aoGP(11)g>d1tdsGeh`$zXp=7D1Ud zTkX}Ryg9_k`&;r5XU3(Fsq`vnAwcas7(*6m`&j{`n1a4Avqu0$Cm%qB))A)OjeaES zB7%gngGG&z)Lb#`zcThjCSC$Ldi>>;b9B%6+DGr9HiUBd3>GvEp~aDsP#m?E*cWs?i5M=nnS)_Pz=bF& zB=}-tsr4i~jKGju5>hC{Dlkx=heOi)R$h&VG!<#HWz@vhp<0i;+oDf`)*^{OOEWwd zr0;^yHC+(y43Rr`eDuUQY+IF)85Q)8SRRS2!gO4? z1Jd9N*m3Q;V_y-c>xA~kE*C9&bjI1B$Dxt9fytgP+G-Sa4H^Y{E?vLM+! zI{<(=j#^O=OWGyoN+>4K&4E|~k?lpgEc+;FyzEZuSa_HgE2=y~7h-mc6W0oO@G$oF=HysqBD-5 zT8W@ujbU`O4wI8ZFg-a2+osrm<1jNl3RB}FFg9L;k)a6cwJfhCIaCq`OtSKrz|YIe zvb3A$d79^}KImnwcB{FzytLeGG+Id%G5`MF;?m-+i|5b1d+zJ=Uu02tb!BmJ<>JK~ z*REYV&wTpZvbS44{afizlC}VVt@NFZ88AIPJ@@oae|Bug+|HdtBO{d<@@lPCpV@!# z&?DRCX78)l>mx~&#BoxMhepQgL&FopwQ9YRRBI5iYXXxRM3tc^&6tHi0^Kx*W~&SB zb`Kiuj<{y9(Tmm_4QMvI&}{W!eWMAh>rMV|v(bX}MjKk~9<)0tcO~eh>^~uVGO&Oj zg#1PVZYu{dYdX`+bB2{!7f4e|#^5mkAz`itcrv1PMh%8!um!@68VjLCmQ242{3Ok; z=}iYpMnFGt^fP4nnZ*M&A(f0A!O#&VFich@7mzR}1cUuapFVVy&e_3;K!hQ4Yazoo z@7(thv!j5hw23)n3G2ULq?FGwXYU0A%RmX`1Fd`t#now|-O^{9Fxn9t2V_F{_XKD+ zv^)~DP}UI0cxrP{#b6Nulr3Q%TSAFY(vMx;e#Lw*B&Tfw0LtH;ifBsk5rkB5H+r17}=PhxheJcmwx?}`Im(xaUwJ^vOFFbnP>;Kwk%S9xh!sgVD|K! z%Gp=*O@AxF1GREgXyP9VsZh*0@3HSx zh{QF|!58%N(b_>BF(22HPDX$?VlvG|Cc>xEEuf}=nvzRk2^nvM0CuR7nZymPLm`g|zg{ufZ1PHfqh$HGq~c zj?0arAq4M~c_B ztS3{B8Co|;fsrM?>Y^e5K#ViqD#yrsnlhnU(n?0}82CxRBLyBy%Q7){i40b&t;v+2 zssfeDv0wry^<$TUv;qMoK&6FG4cIBGc?rg1kknq<{myN71v)k= zP5_>N2rd&i4Hq3vkY<_CDAtoj1Hq1-6Jm5+!Yy zzyfbh+LL3AZd2%&FK$stdtF?F!YzYo@3St%5j%faGkQ?3RiIX>K&_s@=x_~&hpPO) zvC$!z92b1N+#7z0CP^%`~B7n)|{NJpTGYvnB1CaID z?{401vrG9ln$Yd`81T^Ubvmo7%U3U6JpbY9(#q9Jwc71An!Tl^h2=A6KKb&~Pd~j3 z08JUluWR}ATeG*7w$dLbZ2HJj2Te7apT4q0Mulb%FdlT zxBu+tfBpD@1BdP(9-A1c#BnvLRfeW#X7_K~Hg{xrczB$#R9Pxe{;Pboqacb{CrM6q-#2 z2xQRebfMX0!D1rlc2h`ujH!#E%g-%#7z)OYE9LpYDYU~VtfOW}@W4`QfPyeL+heA5 znYhl0X<^yH%7XVO6G8O-CXwA`(1FCsfnOWwuoLV zgD0ZePikh+3|rJqr5%%V7Oai@Uk(7^3(2e!4LAFYi=Z;VmE>P}{Q>~czWoY3klGL- zfNQG&!--jHgHZvYHKN398yQH&3~K-YK@=l!9d9EBx)RzNd9o{J5%C^od4ZyxA)DDu zrKMrPwsFe^sns#8M`T+it0;jP92aR-Ap_?1-H=vvXJLX${BM<&FadZ3XQx=3#-aBS%Lz>cR>OGBKQ{GcfbW9;ua%cQmOmjsU!7u65|fJTJZqed(M5ERj4j3AvN z-$+X3AL!O#%m;1*5+}td&ohT2m>kozW)QQ`=IAP7YxboHx-bdXRtLIjtdnTdV+JNu z%OC7B0zzgWKLL!&JxW13DU71IzY%{%0Wsv96N^~Nml7P8b0+qkh{`ASh>El#$4CMI z%0daTF)701VUMl{(h`FM0Gy05WrBu%6{S#a8{~Ww;T!4HdG`Q6FA=;UbBf9Vyah?P zv`EVt(#EXU6TcOJA~o^kY>^a1fkPOJMuQcyACeYwdlDIJ5d+H#nuiuE@~S-sLNk|u z3WHIY+epfR9#(jznm{FHH#+4|tHn^O0@Ujj7#ga=P&MKL{OCxX3-(OtA04T}$Z!qD zN9!;?Is`*?Cg8_Vt%{jsa767o7zRM|o{`u$Q+qZA?Q>fGFu=QGBTU(o{R;%NAUWw~* zT#ZJC$AA3fj~;pOfd@~FPtI(wRH_wr;>1ZMt`7~3PEXJ58Xq0sR;gAhc@#%nh+=F^ zT#KVBb0nz5am)Y#abp1g9ap&~KjZ%V%%uRJlL9c8uV$MC7)+tnVO9h!ZdK51cA(v2 zw-EGzU0>MgFiV3jw;o{pL@#B}deG^1q1Ws2gBb;Uk&pwCLDbL;Udus50eujH@2-}b z4Haxkn#dcPI(?=H1rV|oD43dC-|Jt=)fY%5w27=KQkYDmf%`kxc`2PBg8Zfru%%&D zW|884BvPJkf$3Lm1{tK;$dD7pUcB;=eKQcB;lHV^kyV=%NFe=1={1lT@XolIL4Jd6MXjCY z6J0fy^0}5^7h7an>0BuJqEIytez z>PnVLOwB3yCfu>mqQM}S&i=9cNyl5q_CN)@0NzBEcDxglCiaVgKmi_nBPHI}7p08|A_$;STUc?+Gzm(p`a}z~)d{sWVFG@FmSEzXuS85RuRv0X zxE6n8bch2?l^CF2t3jm_!%)2@{;M&;zRrdF;Sr|IufkBR0+j@~a9^*mIT!8$IScTY zbs@@o+=?K}y21sLS)Zl7Jk8QH%YRn zeEPT2cP?!K09)zLEpgyh{)d0p4jeeJbMM~0JBNqIN8)OgMfqcP0M+ryiJcD~d-%!S zJ9j@gGCDSt%Tp?jlX!G=Vsvt5W-6&BLs1^bLYu%$tC@*r%)o%0S1i2- zZdCL-xi&p?L-$v^+0Z?t=T5dlttU))uQn4vO#r~xX04RP>$;-A+IPWA?l{J*t|ag& z_8W`yA=WvwF7a8_6eT4b;@@g5nzSe<{_>*zXbP_dbvHhTya_|ji4dGM{WsU97NlH& zOQ~DAtAtI{gzvbZV8X~Ob7=>uNv|y#$AnuA$$Ig*ys{28w^ZO%k>63PjsOIjZBrmh zjWb>+ibtReQW$ehX*aoDLj>eyO%v{D>NXhuOn@#73_u}Nv{TSnK6gk*qov6IIA(3Z2Ev>WA7Q<_xv|sH_ARr zo?pV$UVNi(uhC;JEf*0-qyPXHwngw`5o3W+FniC*n+51~imd+(sA2!HDPmTS%oHDE z871;RPG#78ew8BomyKVS`~M5eMPY6kb1RM>pLK4kl6M8A$%F-7l(0~J%%s29U0+>W z-B@2;>GZm3mS<@k#ZkB2=`1YXx%$QDU%Y+w+WB+!N~P85q@KH0n9xA*MI%su3d-r4l&3$ z$zpc#UzX+dojZ3N+IQgKiLuG?9Z6iNqSdZ)dW_?^Iy97wj*YX}0@a8G9F%wXa&uI6 zSaEYmR-%q>%!N39E=s|W3qLFS4RAgk?P9cC3nSwBQ zctsap-K7K95fwZN%Q83;$IhA5rxXxEsN~me6Sb~jC}0@1{u^&G&{ui!yV#X!xEu{~_qP%_ z$=DE`5fLT?QzyU}VaCa|my(&&!W<2tXflUfW|21@Fu+9v0H}OMpoNCzLqSmAwM;ct zvg1}htqJ1u#u<4Gj>oh&if>oiAl*odAw@e}Z3L>UG}OQesYd>mb;`(vxbBsk1s@W5 zO&G2p-WFjttPO4@zi9|rWDYSWUh$^sgC2LwLO_W&MB}T3EYx1vYt{TzX@qq+P&sGZ z4i^PR_LvAK1_{%nt=9}0e*#G9{X*6z{a6hQKG5Tf8b>uBydbUGMj=nr929~i(@vOw z?II(CivhclM9?7tjG&=1Nzx+4jJu$#)McBl7=|X6L9iGoQ?^@1HIOt=^ohn`U;$K7 z6RPJQ+e2;}kd07lfp&n<8niH=um%rA%O9}4Bx5niN(`$U`6OfcaBcA|#XwyapG0V_ zQ8TP7VS7%FDW&0ZAaLxB1}j$&9Ct0u8z$d$iU`PP3gE;Xow!OVHxRV);SbS0iHxO) zK4?VKH{ew{`4Njzfs>=GWQ3_a&MgN1Lvw!t_-J8YuN$;jlRkLzCLR>fG4Lyjz}kXD zoM(6riQ5wJEVW!@)Y*r$my9vl*&-$oTFLn1;^0w71%C01UJ|M4xSjC45Y0f^jKLno zxro6k1y3SN$Kyd=6DY=y~g_b z%FXN7&Rn~8(?(`Cno*aE#}MLi6Rz=fXsn+ zVz<&(`fjEz0AMTqMXXy%c%v6ze9?IKAOGWjtbFs$HzP8RfOZ%JsQ>uKKR)p26Hh$0 zWBc4(rB<(`d7ejk6h(O+C5*D?d39`RV(!49BPV9J&F!mJYc<9Va6w+{350(?ntM{0 zP{p(grUe7MafU)lTtW!NgI63a>WUkMx@Rf~o*n@nj$PVnVvr<_(reQ_be`8e7xidn z6#X>CAua#_VU8ae_XcxK9@jRZV9gMJ5tJ|CR}y0AJ0Y=CpKTFgoXi(*Dn{YQ0D7A7 zql}AU&IDVc?tSMbrb;7+3xl{Ra3PFy9NIKd29Coh&78^M*p1YVX_-k23+QTLFGA&- zDmV%XX7wg=pswpN<@q-#yPnpQbna^DM^Xf0$A##ncT zd~DnYiO=vuWM$3IeA;qc1AG=#KsE{-C~4Brm?{BRM=14N&4yZCCX`pi8c_bwa{P_k z0mz0nJEzenxn3}%xW$Cv8WCQffTsPZ)ix78i-|+DIripn(RTs>kO@K|5yycBIu#fR z-EVsR;3B{%?$ii|gRMyJcvUh8p`=~hKU@Y16#@~)5w z008;c_)CJ20_-HNQ6z4GL_cLa^gVS*3vell^+`ot3U+DBB@JBSI>&e)5=2tMwq7qH zFP^7ZhrITX?^m&BMSK}z9iydhiCfY((g>9@GQA2ED(Isa4sqQaS|sW7K%XTz4+^N2 z!C%d(6WoP%t0H%KkabJvN03zcH-dK5LQmb5BClgqJ}r9uZL1JrMIygr0DwHt#fJ#^ zBaJ|Q0TmlsDIowZQ74{joMNMeAzcXqd6GkC?ok2S<66_3FrqG05_nD1w70UdeCO(= ziyz&(HGiQ3QHz=Sb6$yAaztswLO-o6Ew7&Y`peH>dg-^HcRHOl(h(k=f7h;EjsNf; z{zHfP?jvt`^5n^!`SG)4`SM$fc`I$D?{?Y(0JhR!`g)E|oH&uJtjxxbKR%wXt*u4P zW;0q^T1u`jFHh8yWVTwV4CfuZ|4p2mLqkc_>-B~ne*DCPfAe?$@_#*g`2G`P(V2)Wm{lzqIfzucT6Dp7K8(#$U~; z!5GVEil@ck%+o218Narz+?uAxhId#ufY$-tcttB6|^G84CfB}uGGD( z8m2ChOt}OAIMba-5P**pMjh9t?^GzJZmnwgtxYS|1NX!vR zLhwU^A_N4$S!2p=CLY_e2t)j*pi@H}s}rmRU5^0bkRk zzZhFY`}kv!P%4-UD>YdF882Oixb1IStg?)5=kycCc z8Cuzhy(1{AZm$HF_&PJkmfcLF`XuSAws2rphDdM_pc3;$_c^DbXC>dFmg3_s{?Rtx6QFHX1Ca zd+X~94?p}c)9SA!EMEkS=P!Jm8j{{u50dmtr5AD#dJ002ov JPDHLkV1mReIf(!O literal 0 HcmV?d00001 diff --git a/site/gate-report.md b/site/gate-report.md new file mode 100644 index 0000000..95b149b --- /dev/null +++ b/site/gate-report.md @@ -0,0 +1,43 @@ +# 게이트 리포트 — 2026-09-11 06:13 + +**전 항목 통과 — 배포 가능** + +``` +PASS L0 정적 — SKIP — checks.static=false +PASS 죽은 선택자 — SKIP — checks.deadCss=false +PASS index 토큰 위생 — 색 39건(24종)·radius 1종·토큰 0파일/55개 +PASS guide 토큰 위생 — 색 39건(24종)·radius 1종·토큰 0파일/55개 +PASS releases 토큰 위생 — 색 39건(24종)·radius 1종·토큰 0파일/55개 +PASS index SEO/meta — title 25자·desc 94자·OG✓·alt 0결 +PASS index/main 오버플로 — 320/375/390/768/1024/1440 +PASS index/main h1 최대 2줄 +PASS index/main 수축 없음 +PASS index/main 리듬·트랙 +PASS index/main 대비 AA +PASS index 스케일×폭 h1 — 최대 2줄 · scales 1/1.3 +PASS index 브랜드 1줄 +PASS index/main 터치타깃 — 컨트롤 ≥44px·인라인 ≥24px +PASS index/main 왼쪽 인셋 — 최소 텍스트 시작 24px +PASS guide SEO/meta — title 12자·desc 97자·OG✓·alt 0결 +PASS guide/main 오버플로 — 320/375/390/768/1024/1440 +PASS guide/main h1 최대 2줄 +PASS guide/main 수축 없음 +PASS guide/main 리듬·트랙 +PASS guide/main 대비 AA +PASS guide 스케일×폭 h1 — 최대 2줄 · scales 1/1.3 +PASS guide 브랜드 1줄 +PASS guide/main 터치타깃 — 컨트롤 ≥44px·인라인 ≥24px +PASS guide/main 왼쪽 인셋 — 최소 텍스트 시작 24px +PASS releases SEO/meta — title 17자·desc 100자·OG✓·alt 0결 +PASS releases/main 오버플로 — 320/375/390/768/1024/1440 +PASS releases/main h1 최대 2줄 +PASS releases/main 수축 없음 +PASS releases/main 리듬·트랙 +PASS releases/main 대비 AA +PASS releases 스케일×폭 h1 — 최대 2줄 · scales 1/1.3 +PASS releases 브랜드 1줄 +PASS releases/main 터치타깃 — 컨트롤 ≥44px·인라인 ≥24px +PASS releases/main 왼쪽 인셋 — 최소 텍스트 시작 24px +PASS L3 시각 회귀 — SKIP — checks.visual=false +PASS L4 WebKit — SKIP — checks.webkit=false +``` diff --git a/site/gate.config.json b/site/gate.config.json new file mode 100644 index 0000000..124a238 --- /dev/null +++ b/site/gate.config.json @@ -0,0 +1,78 @@ +{ + "pages": [ + { + "name": "index", + "path": "index.html", + "viewAttribute": null, + "views": [ + "main" + ], + "h1": "h1", + "h1MaxLines": 2, + "brand": ".nav__brand" + }, + { + "name": "guide", + "path": "guide.html", + "viewAttribute": null, + "views": [ + "main" + ], + "h1": "h1", + "h1MaxLines": 2, + "brand": ".nav__brand" + }, + { + "name": "releases", + "path": "releases.html", + "viewAttribute": null, + "views": [ + "main" + ], + "h1": "h1", + "h1MaxLines": 2, + "brand": ".nav__brand" + } + ], + "widths": [ + 320, + 375, + 390, + 768, + 1024, + 1440 + ], + "fontScales": [ + 1, + 1.3 + ], + "thresholds": { + "contrastNormal": 4.5, + "contrastLarge": 3, + "visualDiffPct": 0.1, + "stackLines": 3, + "radiusLiterals": 3, + "tapTargetMin": 44, + "inlineTargetMin": 24, + "leftInsetMin": 12 + }, + "checks": { + "meta": true, + "contrast": true, + "stack": true, + "wrap": true, + "rhythm": true, + "scaleMatrix": true, + "tapTargets": true, + "leftInset": true, + "static": false, + "visual": false, + "webkit": false, + "deadCss": false, + "cssHygiene": true + }, + "deadCssIgnore": [ + "is-" + ], + "chromePath": null +} \ No newline at end of file diff --git a/site/googleeaed2376f70d466e.html b/site/googleeaed2376f70d466e.html new file mode 100644 index 0000000..b4e9d4a --- /dev/null +++ b/site/googleeaed2376f70d466e.html @@ -0,0 +1 @@ +google-site-verification: googleeaed2376f70d466e.html \ No newline at end of file diff --git a/site/guide.html b/site/guide.html index b73fdf7..2ebe5a9 100644 --- a/site/guide.html +++ b/site/guide.html @@ -3,31 +3,61 @@ -사용 안내 - MEDIABROWSER - +Paca - 사용 안내 + - - + + - + + + + + + + + + +

- -
+
-
-

사용 안내

-

설치부터 첫 영상 다운로드, 라이브러리 정리, 휴대폰 무선 연결까지 단계별로 안내합니다.

-
+ 사용 안내서 +

Paca 시작하기

+

설치부터 영상 다운로드, 스마트폰 연결까지 핵심 사용법을 한눈에 확인하세요.

-
- -
+

-8NYJ%o==84)VmY(U#M9 z#ygN>?YZQ~0Agy*xQ-E+JOOy#%(~ebht2AZ(@}D;{vehC(Ym@WNXdg+z+E@?G7PCM zs1g<7!hf88x}u|!H>8dI?v@C|nB-t9)!4F23AGE-_aVjHGL?cbvxm}vBx~pZIU(CC zp;%xk%s2U>kK+2O*RRxGnP&Qx`SQ)Bp}YLPyrVrz-_&1gl@%=gK@0ZK_N2SL2YnX5 z3j6ap5dOUjO=yd?%ck5jrF#(Wk4ZtiH7GX#VbSX=yBwCpkcc(#&i1b?&s0SZ;sYwM zWs+V)aKfqsy2BnUt&gZ_QNq3SFZU-;zbZu?*V-|zqWZ~Vr8{HC!4OntLx{z>@%o7ev8YhLiOm%r>Y zH!iGt&Ah&8oF0%HjeTt_t272|Dw@W~^t`HZKdwY;LSJ8}VYVxTj$RCIGB0 zFnFyeK>;tFmZFa<;kkXL@`3^953F4m8vRFva*nRUB=@d4?W8dmz$`1jGsUZ!#w+N2W6VK2DSA<)GXw3e5F$4;N@>2jS z!3$=ZT^8juD!?-RIaOs#Su8%L0K3==4rUyUlu^pwdm2tx$V^_ua(yZqR_-1G2Z5%f z4VppK3vdPD89f;v4@GwJCV^2t$3*1dHmeYafLlU7I{lODS9p2kn4$V*)E}F7OC4iA zqVJ-8XD{!%Q+no>Nt{g<+|SBd=OgM6PW5+fR!5)!yGgvH2Kbtzu#%I3pBmqBlQ{R& z$PwwXUQ-`q^SPn2)Yv0r4vT%k{GqGx;1dNTbx)X%0_Zak1RrTEf;9rF(@(X~`Sa8V zjkm$v!2)7cKJzusR+y$4%EIDEX6H|k1BZw5^RIu096o$i`<$yU*gj~#_otVZ+V%}^ z_)ow0%>V+XzA4Q9Gc!B?^=p6iH81?`SG@e=Up_ehv%mCLa%6ByGqYy1ERHy^MxRsD zd^v5{n0|wem2j=2|ll zJd=G|hNeOK?1%Pe5V!_`>6PI~17et72~V^hH3urlMM9~&J%b5EpbS|uj>72GOlL=V zqS}fru+NAGK0ynLylout1Pu(PP)7QN20~0xQxlFJURtVxE_C!mkayuH2Kx+)f zY39_-;L=>!ajh5yWSLeq%$+fk58>c^#@1H*V2g-=SC2oaa_w#ZtX#un-=;B6^pDmN z0IF`bLm7Qb?w^sM_4F-nizkXSMI6+__j>F{>wrfsbO0hJPzUY2eyNrBT)`wLe9=(xp%0K1MEfp~@)3+n^(ThLJXZYXccq7k5}=Zau|xz!+U zq!FO^I5t{~RK-#32r95Y2PsaVk;TQaOwDYT#lNr`#@x3_WwuttI z0Hh!?Cv7D(MS1kjx=e1piLu%1kO9zpoWi3-k~Gk&WUvzjy%U7X3(;H2{#Suc1Dq+uM*1g${5+!Imt zj(wl;?m|-{KI0<4D6dye7wHM{e=e|8XnMgLJYN_s`8zFO$_mXyyP%nRE+e2bX%CsS ze4GSY7!0vVpG*<#ZebxXnPMjK9d4(zGL=HIoUagUpaI?ojKT7@5Z21_8k#yZzee(!DL-g(iXaHMn{}#OBxFB+RB!h%@LI8;U!&!3ql{P=%FR2j}u>wfQp2tz{e*&M2ORY@L ztd~)9s{HC3J}8HeEVSSE!t+o0uE8sRdORABf9p4Y!2 zNy5~Zz8+OC#t!oQbNH~ZDdLp2FwFvSVuR5eQGU||e4mvaFV@dXEva*tbHm_r%_y~^F&qFthBH0 zQ7$zK&Q(mE0gt}@W$&&0>#p%LaM+LoNE=P$; znBdoZ<0zx%%SR4wHKq4ZMx|*web`#0ie^ zuMiv9XK|hZEHA3Z_N4cf%BatO0U;fwMd71d_$5{NEc&f|hNXptt&g9z%B-G7x9I?!=gWMCyi{E=$h&^V*lMSJ-c3gD&mTDLkP(9s1`WPAXm zK(h@n7_$w40L+qO*{v=`+YF=nF#w;_EzuS!zWSj>a@aP^>!0S)fdwJA7V~e}EXIfO znn%b?@Ii~U@;M{+?uwP3bcX8D{=Sk=mchR@F*Xi_w4cs1t!#BzK|=22Y>S*tqV$wL z%QZ}Lp&@;0m@H7EC26MCimcu#|Ngf>(Hve_YG3uz3%9>~@cloV0=9nZA22&$>L1YO zzvCBP`zx<`;Y(lfvJZWJ|EiyV{oC8o^!8?IW}}RjO!ya!99)UCVV|mgjnYjzw7_8& ztLECcziZB>_9|_fW@9GdLZ9hGkRqU^)5)r@m9Nlm>m`ui z$Uj;DfFeKZ*RS9C^Z)i&{?&`V`xP(y$QKUI|Lb3QtF$xQo9XFIvXoIAm@kN->uc7< zRB8+++q0=C0Lg6%B8zgH0{S#jX5*EZ!F^w=07$q1(F7B}yjjTzh ztdp#LGN2+KE^LuSdRfrCYj=f~50_AAyXdC}S!QNbpJrIo9W!IlY^pC1R<{5^IEs;< zXXZ(a-fPl#-_;f7wHu1y7pgeIWzxHCsLU;Tg0x6&gse}XE`~1DF9SIRjr-h`bIhN4 zOH}_pEEztrhphi*K$0N(Rhv4ps@Tc$tn`7k*n2!J| z6w||UzKMRt#DdRdoj&s)%t)?MiZ!#sEc#AeHCLeEe#0SB>965xnOlFlyy3rps+pgg zk?(ua1>2?lzMmTm+Tnlx&;R+qH%*fc5t^WOeQN`NJPT)>amLOcdex7==7q0##Y;bX z)582Oy#DPnp4~3fGn-^7o#tox+n6#K&ugZVH(4|4_|zv|;q&k9mfghKo0&pue|IJX zY#lms7ZIVh@Ihl$4oyeE8=*UM?-|Dm4mc@VbycU*WWtCNzGF9AY5)@4B>{%gSQ32E zI{E-nrFy~=l0VjnUT0@8%`P_%w3}Q&!!TdtXEs+_BOWkk?+)dvWZM&CKl_53Mj)MmsiOwyW-A;ziSMGh(CC-p>qv>?>BC1j@1!U^ zrGd>{wNr2Je+S3K@(C2D70x`Ua|^WurH_CIiPnS zU#32HuPRs>Y&88|s|zY>Fsq3vXF0`s zFeh{CPM81u-##Ym*3Pvre8yu>8Moi}Q-i6g@qhXc|Ka!Bw%u=s2mGCbfR$Bnc{E-$ z7$o(7>N(GU@k^fboiBX(t@p|5fA#O)+8%08kg1tXxqw0@KedM%F(4|l7V_{|&T{f&CBIiyFvo={ zj|s@KV21?L6zPUz)&?A7GF&{NkFznEV(*K45z>-D=rc?QP>%OLU zd%+BjN)O#5xTFsE^FcEWM6sDpU8+(wvya**u+jwpofW2bJLrUYSW(d>3===XAJ+R`$Ex+l9Vv z9iS4<)`8&h%=1 zPP`%uTB>S^B2|_is&kEbuzL2e7+}m*Fdn*|#+kX6zbXRh^st+(qUwC)G}I`E%`~R- zs@ic-vQJ>}vNX1&{X$TJ^08Ubs+;hsvslMYu7AuRv&hU^hX?|+kBxQ$hy`C$zS4AX zYz9F9CYhNSAhBwj8Qfq@6er;pAd9lpzXz5UXnn!iCZnOWQ){K2+b+NIh7UIH{^-5q ziynXB_G_Q@{2#mKnrkjgR`S=r_O(aX`o2{FfTe*AF1h6LE1vzl7d-#Kc z&a@mx#X>n@@aq~@fDgSb`ox-l+Sn-9J83@ocSigv=qtk_Qc{8RbE*%S?p@<|Q(UC` zz=V;Q0h>3WJ$NvrGvZ)~q>5PbfgaVH0Res8hwWT2k{0HsLYw=-WRLmCpvMB)jtZXj zEee2Gdu0aHceNA#G{#C`QT?ox_n+!lSl<=kMKZchrJW#0bZrWey$Vt4taB~jM+F0_ zx#gfVj_6MP)oLa&{jl^SNXvzSy1LZJ5#v%I#08py9ster5R$xIk!!Q2BM3i$e7uN( zvjG{X_TIP9A5_aN%N4u7*T#W^!SRs)u1KIbI4n<9^>=`R*!X-3Y=#}Qr=gMRFAPZW zd4-xN7!Y*ka-IPfeOJzF%ou~EY>mo-j>_-)^7?Ksiejm@uA4i%XecZJ(Quhg%opx` z^>LMej#sp%YJRu#4Z`C<4$#eb+;F?9GN;N;{@d4~jR0b{V!853ObGxX_dhA9<(#Db zqI*O4daNN*2y`xUN#$lBqfsk^sSUCqC(1AVhj%ug{_?}^`4?Su>h&-9&R48ozkbK- zUiV95a|L{B0|46?!^*czo#^}00l}%6*>963E6_f_9wd5G#Oic9yI*IVfd7ZtN^n zJS(OEV&HF4;=2F~X8lNeQ59OE4Ktg&b;Oha9FH7pYo7z?gQ(pKm0}9Q1)~;80~ydG z01_;Fq5$w<-p(gcGl7&1d#DaHh4}=kOExUQ6yBxOiP@AYUB= z1g4A(h7g;D1J+sxkV_+x=~c(e{RcNRKmYo_Y3@BRn7QWJ&;8C{eBHnQ*X!4>+nFo@ z{WSM20ss<%dC`krG`#M*>#z9npZnLZee7jdJmEKf_apN08;;2Q`fakflnB*VpER@3 zHr)(H3;^zx{;R^d&S*=<6vRV<#+Za|F0I9$3jYKI=#dGe&MM=fzx`g)yQnUTistO|73xH#0Densk*SH0N=BRjaFo5WA2-*B5XaKoaaLJTb zi$W(Ne3vX4h9!K1qH-6hNiKcWoQuio2Z%JA#b3(2EA?X1MJ|Dkp@C(3#Srv}(Mady z8idFwbuET^@8)-Z1%9__s_&ZiHZ(#!X!GriIJ=mtmg}UO;@SQ__XQl+Spg_1+Z!b3 z-Q`pk{*E$a3adtCbxCB91&s#vI@^OjU4cZ`I#V z)o9=T$^eIXK`L8r{(>_02I-G_Z~A>{X)LSOo+LNjH7l?C^>?&WYc{QV=5wF-(qI1N zU;DWfFGqs$TMGc>bid)S{j)#&vn?-p$;=nq0n{mMpuhu-$N`?~z?{(b~| zLEzVY%r3}LGV?1shUGx}Wm`89QOS+tS54maUdE*bXaZ%2N}6=f5iAhHVUc4VeM^ix z?J%vJ7Qut1?@{lKeue9V4XF`vr4jRL0*}K)RKBEn*YgxY0H@|g=J&+B*cMoljQXGs{KqNE0`MXi{ zrQT~ir={T3by5vgwP+2d)AUsMO&y$2?FZG!uqTa4W9t^40A@3z6 zKw@Dn@O5yB>Yysmx-yTV)OPTlIK2;J(CG3Ilq$a{-Ugz-3MBS5^NbV90zyBchYkW% zla4qM#1FWY!s?u$2wR>yH)%5;wl>(6m=$n6QW|-dd7XW~aLTCe1uaFAeB>CD(qM~9 zL%I-Ns{;M@xTai$CyiL^R;2rK`QH3l;tG^xXjZx=(@`jXaEq$)!b*Y8kGg)iE{Jb3 z2a>2GlX*+-KY)9pQ7d(9@ez$o$>KsQtJiOn4}bPh^Q&+8kZd^VgwO25Sre?eDS4Xu3QHXo{hvvvsRL7$-AVnp2E07Sa9 zA!IRCZQ-xUqB7QrOx{rn8M*U8L%R6k@2js~tIGtfKR$)MupDy&OL+|t&*d%_?Pu;q z)wHHQBJKhj21QU;^XFQ_gsa{I%9NGyyCCrAVVbQP=?mUNmM#B{J_4}1OQh*$&QJzH z*A{?Y2kgM-u0{JlMxCf_Pc6B5+jmjnmddR|AF%)U90u=BsEjoK<+~;W8Hy=@8^nN1 zC&iJh1bL2NPES5ztV7zbb__%T{uqxkp>W_G2nrNb9jrr?&`C&&v$Y8D62MfGHqDi# z=c!T?eayHA!Hcep=}IQ$NaGH8UQ5>(wESS%Oh>drm77$%X7MLlP=S$_9VzR;esYsdUk zp7M<6UwP$~PidNF@OR}3_`3iAjph5#{?HHq`1ky?fBvICec!&B6aL+QdT%SMPHEcV z8p|uL!kOUXA|F{TBH5f$3o4G3?qxPckildr{mUECI_`yh_CsC5OkA7Y(EtY)vI*Ax z>rmNj??j|CsV=U)hIXf)lIF?v0P-Z3j#GLnnGRW}v5AyN4 z26rc|dQm+MfrTmvZ48CtWOc`_AF6>U*a8N~%mV%%Gnqm3^HQtD#VkqizxU8cU*7{J z5+HFzLX5}PK5CJ3d$p6q0gF*w3W5X;LW4%eU;x(WBSxgJiO3B$GZ!OrD-2mm=tAnG ze?h z8s2$EP0xtAuv8H|t|u=R#98*8_F}eJWzCi|b;{>Ft&q_lty>XLYrk{df+FbA*2I^| z1qioY$w-Qym?SvTZFwBUXXUA#tW*T;T0c>rftEX!zy+n|Ip!*<;NJjkM2r5u!WBdG z+7k;GpOCr+7XbKUwjKx1MeKl6a%<;?z(SJ`;|Okz>QL!0VVF`Mn09 za(N45RS#Ltx8!`yt++6GE$iYNNj`xL2^lq^doL)Lo1p!4HJl)pvO^Bh~W zfBu96C<)y!cl9CgNs<4-kjjP&!A=aq1HEEc9;6u_mjI-^K0Yr!vwxH!6}Aq4zIv!m z8}tWVu$MGgtS4yH1_8QO?lveQ;yrE5g1@xQJ~&_WE=JRY`=mTIlm~ul)C{Oky)CfCvNl$eSJNt zO5^PCBN1J`E}8qYkQ#%ZhWXzMj&U_TGx=vDsnLW7u#$zh-b;wbqQ@$(S}{)aw_rFR zTvcAkp5Sgr-=D|`Nf&AEv5)f?=86JH3B@eC#?0+h&vk7R)|R@TF!)noG>~>QkY>16 z7N@t!ul?5h<+cY$&Bd2J@d;Nx^_my8ZM*K5fBBck-_!sAo9OuCk3aoC{>L}`#Mu{J za^ZjYo%gk$yJ<;Qt=lR~i<%4XT3w;N5)Yb>&=?Fz zEiJs)=E_me&?zcnte8#7#NtFd?{`OtYoB=}u?v%#KuxZwuWel>5LHIas;eCOW0c0# z1Ag@1FlBfb0wE?ORo*JJ6t9tQ^NIsN+_VV6fxy9%fkOyF<4vYcn5mfyM^-}w$a&^M z-n5ZlugG3w3Sgl?-gYpbn3KMFE;XrY6H`97t{2jIB9a*5UrQ;NA0O@_1c2cj^rQ@B zlaJL=N6dhAA%_$tjj~Dy&D3N}@%;7#IT+eqijpa_J%4(Qg1$Zb-g+j{UY z6pGpsSE+WBg8TZk{Yktitv(7T`Q5g*h~&V z<#;?^XZKDPlK+4J!0519`=kHzXI}m6?|jiq-}ZsK=l|jzH#h4xp4Oy@|Ii{W&7@b` zELEeG`aX(~IPf8BTBEErPg~`er7nTKJnboZf}7xs!63h48V<-nqAn(g@d z?I%o{+FcXk_CPQ+5&|@r2=dbR;mmZ#)5KJfsnQXG^gDN(Hn5H_Oux0p!EkJ??zLc*ip@=2aVQ!>Dh$k_dbYHi}IKBogfK6XcdnV_|F)q1$G+4 z>C+LwkP7XHFp^ul`z@j|j>3-GROrk43Gil(M??#PC=q;St+<+K&Qf_t@l3XJfS(sXH)4YANCE?@yD>7fQn%L()PiTYYDM$041i|n7M zZX5HRm=mXsR69~{qUieAqzwIv2>k)76Lw~!=pk#PK4v@MC+nujYn(j>1+&(DTF)9J_&nf+m8o`n1a!D~~O2EmS?E^DG+Q3IrtF5Cd+RELxOG z>ij7dD0o0A!}@l-gEneT`#F>&i(^^6VVk`FlMgh%^TvcC_y6EC zm$g9sLjnNn*wmFzyXMJHyYAV~y!C!r^&9{7gYER{Q)Nk}Rm(2S{dkUvkNonMmN)5e zgxVKs9}**A2?oI#L5B&s!qlUWx;kMdObZn9v=B-|bmP*bxri|;n(i^lW`d0T*dl<= z7^M!!4(x$%3a0Nm=d`eV5K=bZFDwHZ=rYb(2pVNg;pfTHkj!{~-~}J_5-C=}xHZ}~ zH-ntzY$^dVuYS^6_Eumw?<^sMi}IS@3)6gdvlGqq!oB<7(I5H;ZK z>x%;M0HmGCpU8|gR>1D@eSqg7kholuQI>n+*avP_Oag11x(6OwSUG(yYT?8EwY^2P zN!(p&`z_adFg}DrTwcHmLeSb$Y)>^wY~L#F(MXBMBc-k;Y#&F>=!$V5UM$tDq_WCw4_D2?DLm)(41sqao=ZZ+6~#lo3P z%oa2*%y%(A6|-glh&2nXIK~E$(~-Uqx|Z*og&PGbdVAK66;Gqb(R1{^bj@ge2D1;C zrsZjdt_4<8!-Ar%G)E_A%!ig%Muo~8Oi2KW_&CLI1dszzEhn}7vzjUb3p#J*c3>hi z25%N7=j)*%6m%aQwYfneNH%3h5S{<8BezKr;68Z&Y>nz1@H+1rsMtW^5P-%RDp;K!X`x8qYY^!Zw1Po@hely zxG-(BoJOj3t1~mrzQ&Yn-pDZLVwM%FVl$ecvf>+cbzT-IwSa*jcXLw}K%_hX#crze z1DNQ>I1IxWVEWIJq@77qbh!ea_zuDd0%*t^J!?&>wHNucz67>ez_b$@cGn5}k#$6Q ztSBw&OxMx~&F7iNh00p+owI`MbAaP#<3NyH@hpvPXp!3_@ItkSF@(RouB=$!tCokz z6(;}+O&MvTbR{35&cD|1MfEo=ZUwD`NV72Ob~VtNEr6N0%eoSl202_PXN@h>HcoY8 z;Da@{DCPY5k|}oz%y4*@xos`YF6&$37ASzOf0}Hd-%rL9ybq&{ES{{y`%~GU<+R z=$SHpkGJs(!FC1)R@}}DFg-n@-s?VfD7F+#0lF0}!RVjoI|T^3!a!Cm%zZU&p+Fd) zGq$a9Ih0D>XY z+;6JfsLfDT4u0lmx|YVcw4Q<1G%(TDv}FB|-Ug#$mEi{|TbxLnFHFJx4p%kQP!wLYsvSF7ZT zd;Ry6bqE5r>Klm}nh6a0xmxEU^+{!NnZ@8;$K0jZvvE4$!&-M{gkSjdoKO?9Hkc;_ z@LkJ&W?P5>5zMn|vbI4uxhU3!Yr`3W&R?nP#Y?tg@ST_fWd@piZ_I-FOd)t(FgDR? z9(~J2eNYsK%&7$!sMH2%UNu-i%N~Gf-|;%>O%=FxY!=#Fn0L9_{iHPg0EpXTeBi20AG3{rwLjES)n5Nbk?qq5(aU-kLVMu6s-BW4+a3o zOTCgs5$mQALH!Zi6{w%|JqKfwf!OG}dX8gtc)qdStj`nxPbGi*v|OA#TJny1jhKe( ztI#}oEX4n`U!CyLiq0*7m3AWBdO6^bju2K*-{(AK{zLh91z^B^01DEBtjtP5^f5^r z2M|n`3t>9A0OhdNJxQk*DwK@{tb(bzC{)Md>ru>Bpbm$%6^14Ndv!@HEe&PuhEwFt z@4dbG>-XH!p7Yqpp83-6`re;9{q)n%Omg=dJul!J0sx3e+`4t^na_I8i(a()gwsy> zt>62Q92#ws;nXSmtDY$VQm4jy(XaPe4)Y9`#S|X}`(+(3l%ztc7VC zZ{ag7WQEtVzR2+37C6LXXk1+N$0D&tkD22xXP+`kE?0ci`v%&x2MMHhc~;D-?;Nta z0zCT@0CtvzR9f3`4+SMNXo9JR(_kH3cKIfSM2dj|lz?oG4$M}FkTfB5pJKJ~gcz5Pq_i7!4RYc_0=ksTQe zVdZq$fs@r`hg0AU1>N^N-0Ocs8cQd{hNsG&=b{nmBjQzk8p3i{;kP3o;3vaP@Y@pY z#h8Mc>JfYS*&22{qHlACY%2m46zh<83<8Ez}vs0a;dui%iyzOEl5Cl ztOS{ZOV$-ylA3u*=;aPTI@p^?L+OHn5UMdF0V|Xtm(Tg!)3QK2cPD2t!Q3uus-^Ed z1V_ey4fVl*e;P;_+-W(dLe4nOEr|L>Lit2-)T?PKF`va%Q0QYDH< zI%_#z-?>hNC=YG#N~&?@$8n$)_9X)Dn9l*+`diucRLxVtAE}?^fjasb@Un`YW!u_L2?|RS%CydPA|Q3=m@_=HNoVpkCC4TkZlQjU~%0vV)vs8H+%?Mm zRCdSPI}g3Rq7$pav`41^x_~hgnFUH9y_Sq80POi+j zpe+V}8bk#^O6!?5H0({wR?*WeWZaG{HB{L&*T%?j6F{bjCkpWs1;S`KJf*D!sNApq z3*QZ@F-2BJ7Z^mPNp}%-coa;|5WqyDW|Gb!HPpAXw|s5Q6`kkMgCS#XlTW-BYH;ht zr%{p@dyxUU^8res?wg-Jt7+f-2X$$1YRqZUfSqxyjkQm;`g0AEdL`{>^Ww^JTzWjRSOHGcc z`|Ee#EFb&aeR9@$XP#Dc=3+$L378?Rs8Cy6cef4T8iG4`f=mlW%R-vfG_=V%-e4Tc z9E<2yN~?*sjNw#5p=V+WGoxB0E4)toj0zJQ>bB}yJ(?5DeX)Ge(RZ5XA`}1O!r0op3dro6^r1chcww2S_8H-f7-pinvU@&D$wOW z>t(k(8t6y*mouNrY`74j5c0Gw*&en%j!lPd`T<(B>XQ_rJ_Sl?uHI{vl{EoA~1;;&;x}Y(UzGB;cC{uyD>!=KhZZbo(lN@dadZCr*IKk%B$G$^TYfz z0TCI_%i*OB@?YQh2^o#&+RL7J`L+M-RX>ul0@fDI{9OZpB>Y8W_WI|4*L9aX@rf6I z=+k#J@A=@JvU=UNY_3pqCJ}@YQ@_~!qbLG;L zAmGDkNFZ0}-F>Y^Td{^Z{|2sdT#5M~{VZ^bMlUdIxvp`hc?gAaKa|W8mY~99+UqMT z=Lz!w-i&qZ1m*eK8p9=eLo7?b&G*p23Y@XB4kV2|7h;D{Owcp*=<&hBw zL-Sa)PU%Cc74I)K>HXe_JNZIO?CZg2DF|NBd__0&`5A9u-jT=&dp zKJ(&7>cTp90ALinYuB#RuX^fL*N=q3J?3z)oSJu3B@&l>h=h_rEL4RLDXCVHB}m3WHKZ z3azC4F4nf3ljx)sOEHFyfH{xoCR$e+p@LDz!RfpeHB=fLZ8%z|0+A4NHwN4Tk{RR# zYqULY{ADnN8^Dvt9JDz&_6Ng_hW0yFNtkE>me^GXfzUS^qaThtQ!*yrV(sS?Z}qL)U3}#s6*X9jy9$tmu_}7s8!tdsIBK%S+4o zuK8m@TRnKIm@T7Mr};Wa)aNGF5ULOMdu!uylVZmrQ3Kmj@#DXlF9wj0ESRu1B)3L! zn<-AF>2q7&z7p5ccqmh=kC!+8`DdG3?_OxnJnO8}pYqhFUoRr-RyJ$jAOJ97KJ(n? zf7f;ATzJvr{^IRlkuTmllDW0VWrR|oB|}9nR8tP55m&LBVh&0|s!ZX*7`3LnsrE(0 zZ}tO0n`_5e!_2%3HSBws5fGfxdr34kf~^I8tw}gxLGV_aLf;pgQftSPX|prgfwIdM z?A?9r0`@2pH0g&%^44uxKus#wnd1;hTdfK*6&nt26BJf*jz_?YqAdzxPU*z3EaSkA zWP(m-6=)OP8VcbzjmEO?jSH5rK+X)UMC|oy6eh>iR`yq<6joIB!x6Z~1g+qqPql5( zpifQ>Gy&zbq!Hr*8XQy8^3`h{Oaal+)~#a6%W(wY<7c8OwAGw_wMecg59L zKW;D>9CJY6F#&*-bC_PTWy_Y+uYShUp7ZdLnKgg%SD$HT=TB_L?X>HsN~t{)naj{n z3~R^N-N#VM&wVk5m})bfxVBMGZQyw;}_H6!b{emkNmXlL$k* z&@yVqSjQZ=#mvEC?eb_>&XkC;4`9rB@g zidSV>S06!yUB4TS`-GkXNX{>rzk9&57d{hqzvcTVEZFGFa ziGRIq>THxi0btNQB&Zk}84m8IB(cPNw*rRw6zx&4K3txL!9&^swJFk7lbd^!~oS#&gh-Yi3^(uAewann_qR7@t_N9NuWOzx^LH zbTA#dw@Q@`z>}iLYwerIP!8E8` zG%&PRFqu3?i?)sJ%*9?hoT&5ezRMvK7wstfh_nLhw}MU)G9I|86Y2P1Vt~UUU-t-sxoaqpL9@!_>4gjo%q zE5-qR1%QPB1i(Q#E3~KSZ`(ed7*3}XqW5yXyT3#DWABDr2m%feJu&a(mp&o~cHb(a zeP5LA$K506owiT5A9uHm_J2|KJ$$P)gF`Z9hXt|*p8vME78q~wt;Y^|Y|Lc--QlNR zW}7UNWKM_BE9L{BtEUV*1Z@Gf(OTwdR@={9Ag#w2RjG#*vaMUXp8sm4sm~>iq3wQv z;0L3jtP`JH>8?QAw-BrL%W$|_b|09RKX}t;+tnL4&0O;M%ddIvb6;@Pu~rD2TIr22 zzkb)tzvtQ)zT`V!b?3u_b#Hm+S7p_@Q<_oMCa{TY(NfK}Mw`zYJRjGI>4n*G7{ND{ z|Ia7XCb{lQ{|Zm?bhpZ>X*jM~JK<0| z7X?(YErS?LSb@wB-Qz#Z>3r@cz`g(l^wD~EALP#vSm!Pe1IMYG@JTsf=0lOVFa5sH zuC`zLdJAS)UGc6EVA*Us5Sf}9$^Hj#my3X7qa!||9&V-$VEMP-(^nu#k8Gsnm^sadTq5(qJxLmHOANme?%r=c@LI&MH=H#qx8|BJNPLf}I!w2Ng-*daHT7Q}>EKzL+v{!(A zn7zyuVj3~Vn{lJ<1GvK+SfX+#$qUdT?kmRcz#Rgg+%b5vh|>t+qFA|H`_j_19Qdo- zwLT)kJb}s4ev!jpmtXj?OXQU=x1~04WFp$5#Z^rYIGJKbnQl>B5wW9LP74gL`k4fAM`6$*W&EWV`$M%+NJ`c-LEz}$!RrKBG&gfVK+?_{b zb}WjFA`9k5wswyTAf2L@Es{l?5>l8eN4>j5n;i24Ya{}HgBO-2e&6Rr@8vz+9RF}J z5IN*QkYCm<4H~+mmT^~q{KQ)Aqt4&r;z;IJpCBLl^gYcdZn(caY5S>bFM0eEufO1e z3(mCnHjf4X$lAY%taNrWwxb>1Po1DC}N59g|RB%tUHJ z>2v~Co8>y%F_8h56SFd{SV4#vx_1V`!n_XwVyp#_>6>QvNk&w&5+<48>j7!q)^Z9V zyzrfA;d;_snA%eWt%g`qmt2U{)vVAr#w9_ddcY7tX9(P4oaJUxR?7^Y1W^UuNw4>( zTqtogKR^KjX7V4CBJg75;7efidG!mB7ty{&fhKOPVAhm7mg5!xk^qG2ISGO9W@7K*!<2&dK|@~4BS3x3Wht;q<)@mb9z~*{ zi|R8?r*+DJ0m9P}riP6i+IOEk>5}8*hhK70239kJflMa>lTQZKGts7+R%Vkx8I5Jz zraAe~KYy(}^^#dR@X#$XGnOjldtd?_W;QN~YQ^g8f-$-Zl zdCqQBJ@_2<317zAdNoOvY@HG5I65+k8D`o4awz5A<$^$couF5C)3QDCTKj-n1K{h; zU{($;td=*u^)u2=Ps^#hPQU2s*Ie_&m1zGf0sv@e=gytmckVi4*B$qb2Jd+PZ8E!R zvzBSJji#I5a}fn6e~gwZiyH8ZV#4}jMJEM*DTZWe(Gk_iEf1;Q&4 zorw+_ukoJBkLHZpgdlE=K&24ot>yog!v#}GA5aO>LdeCO6dI!mXeBh<(nZl=a6lb; z)UVxJnO5tq81D!(HcYu)22qypj5N0%L1}YUWt!R)a>3iGPJShbIUFd=o7U?>o9np> zEga94tOxHyEKKoW@ppI66ocaR(}s)ovsHx5&pK_`{*6@}E7PE0Cdcn=cGjQqURbS4 zOdIzn`avn^^!M~|N%lW*qx|4^oi9KBJr~N-ViMvhE_Q6Q{`@q2M@QsIERs$FdjLpS>D$)fZO)e&FgzpJf>V zn@y!`Rg$6?WW!QM?pqAFpJ&yrQd1Qmb?iyJ+iM7zEI|sag2e=i2Qo9iK|c7&`EZUoEho-z*>cJ`sV=}uG6GiW0+@c@3toE7si!~Y!Z*L`D{|)pv(3!x+H9uF$fmX0 z)QIXv01N~GX<{o$^(ZF>h%Sg=rG%p>vBG*;Bf#13M5*?j3-cIz**E$#_skBa>Asv? z05tlZ(FSu*KgW?Rq1pu2-IJg zaAZFP6{o&w?ey+dnQ{Q8Kv};LvTOobGm{{|EE?ZvN6&NLPBFXas4X!KmYa9WXrn!vT*1j8K%MkmBNBEMzB9XKb(+JyHzI%{(kDV z{o&`6lxtAWEdy=km+&){;F|eIJ7GVU|1kfVKzuEVl_^+K>^*%Y6^p3eD3#j&U@^|&$#l+D=$hefTPLE!Ai{kr<`)inNPmz z>gVns&#!swyKZRbRv#zhEb%SHFA~P1(^NRa1D*N~n(0MMWfWx)4>P36#Ki5OFPwkO zgVy%i%YYUy(iq4DB(Dv#>EdyVW?U!U&c)a7LI zS2V09P)!lh2kRg$ea?LLK9*{pY?9Ty4Tc7@yhWyyiC7C~1QTV3r!ERKVwJC0)Api{ zCZOG=k^)NkG%yQ{aU^UT%C!-v7%HYj;{>xU+62=ogDqmlkQTCn@+2+EpgkbZxbk#aopSr&-?nG`m~@rWI#OHH;jqcd-MQN~$j`p| z$ud54Tdp0DwO$iuxzw#G3#71i>L(O*XJp_UgaL2uqwjmxUsGBLaVn%+s4VUY2OY4Y z;y{<0Z2I;H{oV|qktxsMxsUzVP4@-`Wm?E*w`e|kTLX0GX5jDC7d~i82N!)z?;GoB zfiv@)mGGOsiS2pE(GUu2MYV>s98<>kZpQ5szP^D1R|dMo#;r!+ zxtl=k7zi<`p0S43Teb&n3{BwquHm5cuVyBKyQxHSIWNpWSV*yH7==lSVVAG=z|(%_ z3{AQCIyZt->S*U-EgeP_dX-s7mtR)^L@z;V;G#?^jd$UFrLgx3J-z!?|Xcr!RrKpiNI7 zwZ7ZvUDIjC2W4h-kNm_BK1sH2oXgcir>E2xeROlAGV~;zRt*}t{F0Mpc6=xovT;o3 zpdWy_Yicc-HI3D)fI`~>i1KNp`6TcVvaNum)ryope#YD;kQ}^C8a;qYkA+P4pgx_p z!Qzp9a@tALa@j?v=x2FtLzTrYqT{M(*yqbcLrONfOqTzP(4{?3v5t+ z=n7eJlTj1s3{CsNR?+{2`=)1B%LDsoir=D}EldOji~ zl9{&8M~R30_YxTC*rD651O#AyNiT`DDKc7MmLyv6yky)1Ygt*s*Q4CY5}=ZR&kL~P zUs#`1g>Kl&!M*p&bx%1#uKkX!S&5iQG-^@U%ZfkMDDtZk&`Zvqb04!+PC9-@4j;W=TTTOH_y`BKfdyM_UPY}|#Au)xFo5STT8-%WL6s~gh{_GxxQRPM+6Uvdv{ ze1PtGOJg)kSsKs6!T~w=^jX<){7h!kMHSH0&xE*GQzc&Jl-D#eJ!s^|zV8XL^MsKc zKKP){qgz6V*F{4e-p1oqsj!D$O}Lf?-D&VodD4}aJ?5+nF8t)@?vO9v_>j!4TCeGGhK{X{n=Jy; z=4kSIF5Y~_yi?6o`FGAWYBViy$F_MnW5={CE*z3UsuP?a4`%J) zy^h_$-&ClnqLhlUql_`vvKX411nwqn6Geu&jS^IVPck^;SmAzCc;O~scnCpfg|M{A zq^Td2i!azNslsopk?qG`mH)uE0ML_ta;d z(s{PCFedUP2EP?6qx8F2r?4TSj!Lb3c2bHbytfG!^Xuf+JNL_nK5>g2zvaZKv(G)}sx!_w<1~xw zX^sT|G=p@^mdN^DyB>4y%<2vEZ-3uya%8lo8BFPkfBBFd%W2mbG4s9o5sB1T7v^~G zXR$W6QZdoG`ph8um~7t_6U?U!>dRHDsY|hPJJBn3d4}fXB_vZ{QdCt-<}HhJKtElZ zN(xy5pR zLvP;?>VWaE^1>M$8A%qa^Ly z^b}5W%Qt9>Qelp_MNWSDL;LQMXFPeEJod~@=0aqx8I+8_<6sqEEf4I{d)E#{E;wtm z48}(+LK=tmxJWPn*`1rn9AFT{^U?Gk^yILSqOtSeSt+78BA?ITJ3h}i@iRJA;Ge;A zbmARAJ%a$UIi4U@V;LQi)w3hH_?(mVb^e~Nt1$Q!j!ou%r4&Kc%bs=h*|PPxp)97< z%Y3L?@Q$G$vChzI(%w5ze=r!8Krd0dVGJ!C}B*m49itm}z`f*gHA z@K?nOYu@3LSqRmLkj`ki1G++6o3tK2|5nq!Z+v}#U^(+LOso7i|GpgZ@B0kvz-Hu0 z?}hP(?}*b$NibUOJp=^kpbvZ%3<~C967p^?CBL-JK`IKCs^`8mY?c<`kK zswpDQpDisNlC`r7a{bl2WCn*w_R^t`f*2rZUiVvi%T$Vf7LiLYJVR!umr@RFXkC>c z;xUI6L;H!+*ya70M;2n%s-b|C4TIAZQAjCeF-%XVvr$B5rW%=^N(UPa@@MH(!yMde zn!2XzmZPipeKG$vPxU^la*_E_lHpU0EG-<6?I*34Q%+pvv{ODjdDaVs%zj@SkL0v1 z^YXOIPmzQB?$%UIFP95CPOgc_Xej8W=LOJw6);BdvI;njF9SeSqXO+ok_+s6FVcB? zOz6w+*LLFH+RuTs-OF$jBP-=^g^@=1522?Swa^50mswC&h`-s;7rv>U9M>?8n zoF;5?m_`5`#SOaH#j!^j2#n>(p*?c$85`u13%1E(jx?WaT|tMD>S{WZ&rr@5ut(22 zZJli1I4$F)1+875GkC&c*rCgeiIVn&y!tA7J6XK)uXPpCSmWHjrJD{1W0}e(@q==B z-`%q3{;$fu`@bZI9=<^i?Eah_c<2V%_t016;QqU$9UaK&c`2_xJ?jzlF2I~2g~EZ@ zBUdY>%R?;%Go|k(ZG7p_ZaL?S&2rrOS>j1ul-@7os_$(oW<=!aPuVW(=UZ7^IHKSw zTL-Z!K_|hd%C=ZI=**YE)GeL{pzG;JEs~DF_WBDkH=2c{1kguiyk{Gu;kwU>_SxF7 ztksXKPxjhq+Zk^3C#<)mFM5e;K61HKU81DB0X`}omw5Zs^t|jlG$Zf&@R!?F8`d>v zpL4Ivv30kq`2MX-b7m0v5dpf<_$-BY7B7J}$;()N|vgrHHH3q0wj zE~-{n1iobLplf!rw-%;)o|9f?Xno6tO8g@wNVMmgb@^CqkYd9#fas`smgb{#AF@&N zs%nT(xxP%w(HzVtDNtWD?J*t$@>$*8Lg@belEv{%qCx4iUdiNzW0h^ydYB^+A= zL0^rx9z*<&ondi5*0?e=_GTmHl=e(Bl6G;oT=}F+azUC=Qe(2vT0XtfR;TDgNCTaN z<2S65Gk0v3yFa^M=4aPuZB@(p#*8Xm4C25T-vc<7H`4yRBBB-jQlB*hvn@yx{HYA_ z_>dgl|A5Hi0okx|C_B&DAUjXlA}5_NB^%c2K00)ymEC(9x%H0y@}-;ZlY1UGETd+X z%+0OOr>HKbvb<&$)Zv-XH{q);MI0S$CSMXLE`Qr}_*$}wBo**lojp9es~q7P&#-bE?Y|wroq7Kq^h}=xZ!sH@&25-mldGm@y&9h-;XMt3Yio2$(71 zfE{CxIko_VXX9gZR}mkC1Y#13wZNMo0Kfn!|5V#dzIsF-Qspv3rCsbhzG8fj4o^0NR-oUM+%==yUn zIOepYpw0STu+&UbR?vwHTxwa;aXjla%#jt8G}A@dxaN>N>Eh#jWm617-KRbVjK20= ziI1$F9>{rTZIX9?>`T(D*_zH5wYdrZX)X>#YoMvikv3Nt)ANb|4i$jsDO z4()qTWbr<^_{}$(QYrla5~_Yv$9@MP-lEY9Ck>x&Off^06E4k^lX^FUSWz zd6zu2cTQGs+#)iV%`}lgKuf{U7Idfr&k7a!?la4rdVj5eyvWkxAz3@u$k{tK#l2Qz z#NlrR_&V~4e)9uftR+)(y6e?0-}*{JS9WY1 z&X-8N!k_8AX6Dg;stnP!M8B=F>@x9AuBg%>M13y4#u;t@Y&d-zeV}RQWjJoG0B8iT zl46_sfPhMmM?wnp7u%S zA3t;E+2=m(F^_r7pAH6tuhuAO(rJJ*yG}p-%=H_#Z2n*GzESoa8aC_J&gUZ{SwN%r zzI?X2leBRsU?;pNiDyDG~FiobzIzXt<&Wbt0m`QX`sI#rXRyctyjvvk6c>rM~n8bUCQFG=3rPf4R znhI#FX$CrIp?>FtQnK;J{<(~`?J|6iZE#SA*0k+>03}Ry4xC7r;3i#imVNWDxkyru zLQ0!+s$f!?abVA~VD7p68>E)gH@SJ6d(b<;Tc}c%_Ur3pjS^iH*2cOY6M)WgR|wIV zy4)W%bGfD%4}f86wawvF3jRAN7d_@A*|Bwloz#~Ehnd%U`Z&2C3=1`mAT@E$jv1Ms zUXpg44(mej6oGl#k3oCk%EJGhPO?xa)5o%}dN7b-vmpB)x=GGEZ6H7R(kI9@Pu?Nx zXDl=;r|2!oQZBPgY0*t9Yo`XXcFStnxn)<5gZRV^56Bz;{4?@5AGlG*GbhXR>;_p{ z0(rv~hjT3goH<2jLf4=_*jkcMSU7T6PCkCMoUwCTzLO7?!BVZ11Y(QXiJ`5?lP=vV z|LspdZGa_}ZPI=w>x0&v=*fFA{_V2E_Z+zh%}S8lwYgVC5vPsfb^scp69O_cLxsFK zn!7_-(V7H?36!%Nl%Fk>Bm19kUB9E+zjpXq)G>)h^_`?hS!3=lcODoo91iDY@8O|* z^pm&A6_-91ME(~Y4ZQ?*sK%YVCJRSSwkt{>`;R+f#M_P2KkXkox6D^%TR3LHAq$dm6Kl z4ja*NY7TD=HDEH;XAljJ-^ZR(qyIu62g52fHq>Iq$#HSkt3MX;6YNK%MJ7h%>UtJ` zsnTHxy1eO8CDVPN7IQ(tQv7Z->{S>G8VMRNXr#v{+jXM^t>c+6f7?Bl1CGAIRp-$< zR*)_QETs<;sVp4YFXx}VRgPOdBkfYE_7@DRFcH(LcA+3M99u_w=B(4U%JJ)GWpVM4 zTlE~IRap!Opi~B`u?zYoMq)v8EUauC!*;(Me&{RmvS*$ofB5UqmhZee3IA4>k|s7v zT3U(;7-Wp>!--p)%WLf4Q6KS zR7f+in8T@<5A2HwoI_u=)bG-f19JNIwQ}ORDVy6;;c$?-0@sV)r;$4e{G?Z(e)7DW zvSn5ljvP{#Y!2Sm+5{~8+0s;79{TvTeWAZwg;Aw9C{z{@XBkO;&?y66OQEexnIBE~ zHx|prJFU2%i$0-G#wQer;v~)B&sakaOASs#@jc#$j`|ch4?vJEJ^npTVP^~ZQmPC% zw^2U)sau+R9y}~tPu_mg)| zKrJf3S?;*^J(+!}2_SA)h$qaypSaj7{dp6B(dj1{0Os9RO%9I_L`Ka-O@nv`TZI6u z3aTm|uyZ4-iE<=u=)JV;@Ob?RX9|TV%Zx0vVPm(ILx8VXBp+r}@s0OVv6$Kw=Hs3q z1mb=IRxrL~pn-`0vL71or~A=i{&-1NuWIG&)7NLgPe!KRzD~Nz60@KU{rj|&H^{aV z=VjsWL8D1M-q!gEt+W2aNt&)d#hTy5=sU0Y@0 z@cs;T{Jf3f*j-{rzc3E1NEu==+#Uexol1_OX}NZdxHMPJx-7zJz~_?3+OBLy>UQ|2 z@>#zjgg(9?rKpJcA!P;@%=o)+zcPcSbizFMaU$dFs?~Da-ACjLU)|HL-@Iw&q?1lQ zb8c?#IA4H10AT1~)zw#DbM2Osww?6;kKNK99<6N#!#S&2jk2F*!HC|uDx?^+6Gnih zCE%Q6LU3VrM!KA7f;kT~CJZ(3ea@?i3XKZi0aQfl3BK2ftTzm&TG%I+@!&(XA}7do z&!#eT$U3EGl&2saCG$KML`xe}HI>Bki^ED3j`hrZCrmkf;Q4njHcMCZp>?p23HHK# zZy{)71`f%@XCw_1BGfDj=wqOv8Z8807g^&I_G||6;9h-&8h`ZjaeqNPJKU+9w@5>q zFl$FSy3}sz4YbUCG4+v8TBIJ)uW7OE1huhNI#i)rrcW?4N6=4cwvGZ#(K)O$gmu*x z&-qcbK6}zl&pA~y)4a|kfD?C* z!m=;n(>{9Ef&11^0Rk{O_lyRuZ6;K=IAB>k50fPUu8yE z`#`mt9Ghh0-a24JiB(GhX}3a?4Iv8@tG|(%&JkaH0yJM(>G*c`u>zzR;q&&7lm2Rb zCSF#YG2vh73p}dZ|8?{HoxrgIK3`=%f5C2;1Xu`J<3}z3TF;%2jwcMgqBI}}n$=+? z6Rx9bpA(pf0t`+Ui$3-|P%;U+%{5iz*8|jcn(4Ni?L1bdnZZFecP~>WyI=5@pT+UP z^frJ#>=B2I*azXtYnmw;EiK5V^&>fD+iIoI@KzloFzJxAeq?Q&clIeVHQpyOPJzw< zw266IeSk*tiFPSRf3&z?_V2x4_V2z^_C9!r?0qQxyHob=zFQ9Me^ADwBYHl;ppog} zNcKH=i@fp$XUMBxa<&&RO40HCeP?<#S6Y!`io=(5D9Iv_ED5I{KPUhGHCM~ljr-)# z!3Sl~jFi_{P>Z@HRAY9x6%>Lrw!u)wi%W9+hJozdI)fFIM|u@t-VO>%F?s3J?I*30 z*(ohblaG;BZ6;LmLir>3N*LYwfGK5+A@CH6t|e=ZyNrl8A`lgEVgPyt$#4L7f22xt}n!<**K%TNjX+n;y8)Q6(Vk~tLy|AD1`yzeLRzG2$qJAKwI1lg?OAoLuc2^ zXTN-JbN|C**?htY$DOqOl(R%+mRs{6K$tY2_re!`#~EjzbMcK|zfW$z^MK5*IzF5K zoe)jXcuCBT0Tsfb=W~mW=lRCMK-(txP&^MLnl?od_)srZW&THS7=Nde)YCtjL!RI0UoyMf2rb8QZ4C8=~n5#KY$HC~WebAvr+<8DqDodD-%l>#_Nt zX39;777^@4J#&lv&sL5&0g&sI<-R0NkhNda^pFf%xG`c55ge)kJxDiHv=n_U5jdOc zVy;;`;nh-YBD7^nKZ5qx;}=|+8N4hl%1B+!;ilCj%_XDnWPTw*auq;TR5V>duFW%N(h!fMT4iZD2^0iypBS6=2N`(5h#E)JQv8kj)#% zvT=<;Vy35K001?-@_;jI}5r*2!_}*UJ2=>FlpRc<_ikv}Zx?y8n>ecF%pX``%X8ZQ3da_C6?AUb0qx_WLi9 z29f$l=`MERO0;bS0fU?lc;Sw<@^e3Wx%}ko-XqO);?wgQ-Cy{pwJ=U@9d0qB#Y6k| z%dXRpmlHOxHQ-Ut+%aB6CmBE)o;c~mjk0FdK$b?y+5)g)7AvGIg5UU3>*qP!$#_>@ z$IOz9Uqb1l%FvOL3_3Lal*g<^sC-YReP?Gvbd)#O*n8HXt%qG&b{xQXiX#UilN>M^ ziN~U_DbgzSZ)DL?58SdEGKGU|Blg2LW1gddTB#6g0EBIOd3tuO+;#5*a>Li|XrFxk z)|qq8x!~z%pMCb93>SV3?>B(} z^DFA&cQ}*@RFkb5u$9bPaS%rJK(Bt6H%lLoFHCHtuDejN)Fn(Sf=OVGO4_ldLS^Hj z6K~4TRr6FXcmi0j)dvGJQ-B9UT5WIEy7DW%Bw!EQ;?LcR7DA_v_N_nb`a><9 zv>mEzBV#-R+xcEoZE{B=Z<%>sFe>D-r{J(f*}QR;svT9mixq4B)V`0!{-35O1wEa7 z{3N~02!% zL_Cu6@8NJ-_8$`Y!dD)ar(Sw$bNmU%Z{NA|j8nh#r7zuRC;hqwApdpN`RDI=+$EP@ zGnigA^U2TO-!?Prn_ToIEx=HT*?A7?qQt6_1{f0te{^Oa4g$>dW4_Q-D_^xj9!^(7 zVS(=($qt556AC6XN)va$KngB22CYQd)vRm!K=)H(QZUL)4aH40am$Wo+PTVgM#Az{(eQkP{qDuJoP(HmHA=3D|@gFC@fhN z^@-~Sa?1JJKbU>zOR>^qrkQ_O@Summ5Q=^0DzM(x{%L2#<3W+e~B`VYephG;E zo|D6XCWxZ0ei-{(uZRoC?jIKy!GDz!VQDSHE`cs7XAvW z-AX{i(f)&J(Cp>;(d2c{(H&P0<__uR^{$b2s-3PuT{Pgb*))Y}C^j!K=UOf^7-@Yi zrvvGR?6+)nvq`!dRsIc&37%%dOYWFWU?bN|d>B!_n2C@;S5RQdTIyiB%iOvQFIk{x_P&$Q4%Os73)dt}iL ztlED3s{AikCj}`|r8}5xC$X)5nj--W0b?JhuB3YI=bpA+uDfE3{I@^)q@1{As~o>} zNw%J_TGp?f&+j{YctIZAb4c!esL92InyC#kHC&PtkDHP+c3Q9{3pSs>$-O$3YgIby zU^?7VD&WCqLu-Yg3aqVQHy1bJzSMdBK2_zX*bW8#qb-H3zkl}LR}(MqrgsER1n_C%DwmZMgB)hvlKYOER@~Hl?>ZN-fQO z!~{L}k&#i16lDWYxe5Mba@!&NM52%8aS_DQ8C^%DrsM!5Uwf05^7~dgi{%mHU__buU2W%v4vKLl~BLAyGp9S86FGf(X9eSK^=;{@JTmq z1lcEWyVP8uFo!RPK1)$l_$6_Ny@#1!R3;!B76$|sF&w4U2nAM@xkOp#7{;WcJ^>u{ zeQcpZA81Z}o^h~u0xc=y#=2-)m7Vyb@3q2Pz8O5zB&tGs6^V8%Gf7%hIzTW-{CPAE z&9NAd$F+$v88ZY*ETFov^r(A6e%T zOuDbO{7OQTBQ-eaD5A<$nQdg)wlXsidBt#JKuk+eDX72mW?N@mlHP+a|VGb$p*r!Am=VcOzd&bJhd{F4mlbw zMLbw8?c9{5w?PLG8deF^qjV4xWnjy>r1M)7kIvu%Nb|nKNtx`@0w~wlDs2J~b=`SQ z{AzuN0WZ6`tozDCqu;T2I2K3S(o*T#x8zRc_^v!sat{+{APrwBO1B%iV4Tu$Rs!-Q z!qvd)Zd#U^={ec6SL91KJ|H`ue2T2uxZ%`GFMZ;!kAM6_pMeVi`*78zPk7=L$Dg$2 z#6N%Er`si&Zl(uQxp0Se-fpuZ49=fOW;;W&&sb{!4D`v$!7Rv&RuwfLF>J`^nEiu6 z9kj6h)#+T&!RCsovki)1CoDvP08|26ffyWVN?+!&s!2aD7;I3*{-AGX#(#!jtK}*O^T&cf07vTcVJfCF%%UCFEb|Pag&uyuHP!KiN3ojbTxS5eJ zeB~Co{>szjl#@?=?B!2+!bJ%H)TMxD*Q{Q@`p9TjzVOutMFy*sFs;O-ny7~^cyhr_ zm|iUMGVL)Ga>(XSk51Rcb&V|@q|s^{5uB!k($A1th;!7lBBdzr${KJv;YK9c z=LCU*zNsnEi@w=7T%$KstI9K(PBWof5DVa=5f4~{-VuReK$g}Sa}zLvwZ1vACZQiF z5{Dw`u;V$6;$=;Hd4=Nj$kLJkLYZ?yC=H8>ms74XqYT*zC8E}2aR|} zh(3o*5Um7CCRH#be2#fG0j&W^Ls>{Q#6goQS%;Fvhbzi8MEw?3{n8;`OXF5f-87IB zSKlRT&zX{c`_G>wvz9ZY=WImod~OXP6~?P?FJxpYy?-&{D^7kM4|NruK+X zNih|JoOPD!_(lt3eV|U>whW_VX^@vGdf&KJf5JZoOkkrl!`B zhBa1Xl>{W8f|sBU>K7B4VL(~?W&cZ|q1n&6ik~s{ZVq&pl%sYs!!%5l-Rsuh5MvSX zPA%K*8Mr9L6-uA``UuE`1{}m6%|fV$X_o=}zze?rGLVLr)7LzLZ6LVaTY;22 znB#K5S;}+`?aW|<=h5q$(+OS0TK5qbuOn-C9BEr7^8u*1rcVJ!8afl2FQS6`Cn82& z5au#6rc6`p2h0(e$m;?0!kP)a410s$?aUB|I+ZaPdOxX1_R~%(m4k;4SMx@Iv+wd) zgwph^g;?O)uukSf#Eb>DBF}sJ`EtgYr^|-`ndhea=K(}81_B`(jDYQIe%G5kh9+3HY0^9wT%)AeUIrG%15?_{v9~TvF{eS_ z`gc0tAn~7MLjtHWMa39jC}{+4@KLcRl4~vIA>!f?IZ#TktS2C7(9HqVHe`VnfKrzQ zGDT>vlSrAKm)q}qxViJ*gYC&1*Uz4H*11=0+qUg527|#JzCCuGarTZAw`@J_wmTn? z`yXDCso8nkhgu3%i(=`5>EeN}>S$DpCEj7^M|lHSdZ3)tmU=G6>N6=tXTR144YKb$ zV)8w_sGL7{Y1D5efJ1>s-bkk~5Nlj|Q?h7yhyhTq3%I_z=kVv?Y;79=Ok&Kq+%E-k z2iVg2g?|%?FfeAg+a;kvds5GIS5uP5A|L`C(X>@6We)zcvaL{9pij8=4DB&*;;tl7 z*AG-1SO^NkNdeFhCqe=9x&jzIdvsh_pXw(Vr>f(p9vu4vn)-hmW6F@ zE}yN-8aY!~JN*HT2y?T10#WUEoRrF#+ohs4`JWvS<7@{42Efp)1t?>z!!9bN$J$e< z3Kv~MHNC{3_U=8ex@C#2>tYqm%iX>^7!*l%R&*tpM@s`RITCH z^TzYc^WAsPBfUacwN)xvMQ@YNOK`JyBU6JZ2SP54FkYCLt20!N>2g-k$i4$ha_F!Y zAA(Y+|Mv;^-*J$rp1^2%`WQbXVX*|Nz+_(P@c})tP2^6_Rsou;Vofc3Ale9zXX8QR zx+lW&2fh}m>HxtQt=9jqG6YEAut0a&0(TF`^1wAtN{=QBS%539qL3T8PZ$gX^k81I z{Agu*W?mlLyCgT=dY`OYf85}tZQIV-an_DaYN4=eaq;lD9n7^~zx{w5Je1P@X0%jq zn+)c5EQQmgr8|WKE1Xr?lyuxtoxitA;l#;j z$V$kkg{+*}F}QP(1HW3K3EJ9|A14c7(kkJK$xkJ)3n2`kJh5B-qH=kmLxO<;DUIDR zB**FyfGOM$ApPQ%RJ_O;Bfk?dEqZ1MO5rwxX}N#*VL42c4+qD@(G;fcGHwVw)4rwN zjb&)AJU5{d09D@JbCA{w%Ek5ptNQo8dyjs_zV?0K?Xqf8f&zz!biRS#hqd5hIC;Os z;XaQD0MKmT|KJ|ke{dv&!HfqJqW}=!2VqVLVX^W|KRxE&Og~^QJyROoC2lBh!)K<* z^eCCFZ}4Igi#9xN+8;!qU|o2NBuouzTrR?e)*X``02bxNU42V&Tzw_rjlNTP`~Y^r zv$@?=N8-rhP;RDNM?v2K5BBNUy9+b3_kaS}3*(G4%c_fy`=B|B#uR zZCRNqgaC??pxVwL(NP*RG%!Ex#ei}<8MH9a^$6=igSAsDsRChcIlnK(@9?29Xw=uFuzpVG_QB&Q)JErWQUk)^GT1u8p=kgZIlRndZ5S%X>#W@d3ib)n&B)-MHr86psvuSZ& ztFr0qlczOg2xLaCbpYU$1D=i7+d@K#Q2D6syAp^c$Q?GGlj7_KvvSkd@0CLft*l?a zY4fFzyY#{o0x(D&x!|-*ww`s?c~6#^x#^p3zgvbgb9rG^T}0YmFlcC#Kr^~rRV2CB z^w(!|?QD~MZf?vnzC4H__uaKh9rV#qIwO83BAZxV1P%fUYILep4Z%PF6R_KNGGQ<& zL<6juAcg>oQUt8@XbG;}(7`%kGO`pcE2e|{@jC);oT0*cL0UZFF1%2MW&&kB!9Ydt zav)%s4BSEk^i*igSntTRU~>ofwhHy|t!MFV6PSAK$x(!)OU0$61*}LvFbr?j@w!^G#KyL|R|MohJHX56s{W)B%`mpZGm&MC z0R>PRNdZ(ttQk#x={;~JpeejDgpvnN_JTu<$NCA=vyYQX7P|>LglgWy@bkfkVefF^ z=vpqVE71Xbg|rIvUkIaMF!fwGqKkL(TF?_7)ysjDEWZ#u+1uB8{!2mc5!1G&90Q>K z)yPpsc#)EFX%^S}wenxyMp3F$u`X)c5#jonQSgLn8WgmhqpkHFNtt+P-$-t`{T`Yl z(w=&*knO=d3o|EaIu8CAq|uvnp9YYKz-9s?Wbrv#OhBivH2-}I$u5keSs03Su3Qa$ zZb8sBANw2QS+3K|(_B3^2&tsK9v+L_c*|}z|9c~eKa2v-`@W3$jnKrsLE|M<_rxq~ z2w+w%nSdvylWGwsZ^g23dIkk0%r$Hjtiyz1oUq8HOAl;f9+aCWr6l(j`ziCM@Zn;- z{sNa#bUZx1#<>P=(PcL%cN4)2mBkl|V&e5E+GX(p2^gr=t&!o>j6Cr0qTKh;lFZD^ z$W%H21L9)iiCebLt(skZ-~CIn_rR2zcG80K8L(suac#pR<87)C%#iW{sdh620sJQ# zxWhz13#Y4F`h{vBN(36{n3z8ZqROpg+?NB-u$~Am%n_dC$ufE284g^ir{194J=3gU zJ%E5&4udOUsENeQex32M!fk|Th?&i2;rFNh6;_Ry&*G>}7ACbH5}S>(09+{8W&qKq z%~_sx{o2q{YCfKgC#kZ*y}u>pJ0>SsGt-qF0_YTIqX~J^}QcM#m z*57lIVzyFRQvUz+tQ=Y#WTAoQj|O^tm9UpBK}o0a&*HQy!E;O_=p1}y@3HR^0C;fEe);MxcgpPCY8mH4;))hZOEA%e zZ%_R6uZ-u|XAn6qR|s@3w_c@7iL`adXC4oOzb3}$?Ukh5vEGJLI8xWKw*#{l8nai8 zb)JzF8e-BZ3j+HUF;T^O_Ykj-3o@*@k?BioM;tgjCHFjVL}q4(sX)+iC!DbTghVy- zS3UjeYqxCMdh#9j>}!uKrmE`6ZzwX#W=cJ*$HO;?`S_rrIp@005djKq?t;EE7uIr7?15IW8sPl9$lo9PN26~Xo zhSC`7m=Mrr1ct$T4D?p+UkG{3XHLIyGE@_sN0ajuuwMut&CVl$HVh1E|-d#>D(R^8*~sxW-<-hQp0&U)>=^myF*`@R^0TDw0w z5J3BS)h2NL*LN&6pC8esfc}f>gm9ni$E|lClH2Y&C{r_YR*e;I(Xhn0c+5ddCBJh$ zo9dn9-dQ~c-TPJVC?J>LQ+Hd*7fM{2x1uzQ{ZP7W#lN$vfzZe)jW_*2!|GH3$&cGn z&W)QiD7y#Hd*_h`Vet*F+(3Xwwnm3{^WtR%8EnZECsRUIks^i6cvm{-mun zgCyab=k*2g#74-^7(y3jtFSKLi*&8xMP#gjYQ`Gao0c_zBXQoFtfW!xj_K!Sv?h3hRgoe*jTHuD?HPLD$K(72SEo+Sh)2 z99BfFyVZBRCT%XpQMcnU@B4nyYHrXm1V(tW4f?rUC$5htUGqrTAXr4`K08 z@T1F<3iLEGJGWlGaN|94$Gv+^uqzAA?gu((sHdkLp~-Fx9Sgt_@tMkG4ra=8ee72c zV=siH9^3nfTJ8Y^XuI#dwPgU`M_=muyGGWo-W3*5q=DjI{a&w6-LP8@EzHYsYTEd_ z9)qoJ;gAi*%aURUcbIk0P1VLrYJTcwdknyYGLNbM3Rk3B9wBcMj|?{eXr|%)>U`J= ziMbvdG^l66m@G0WTdzYgV;zMqKF{3IJ&9Pi$mI{$5wAqhK(Ve=0y(r(ay<`Ip`aj=2S$o3fjccv!aoaA8MDD$BZ>k#L#SWPNxp+taNdvMH;02+mZ$r(11u;xO z-ME3x9_40trK+5S;-wQzShFsR)?$aE)#X#CuXy)49Q5eoW5M{TF0C$IW$QjtgT|>aAsES-!qhtera#?*)e4V zS9UHmTUa^pMJX8jeC!Y;vCifF$97F%UOo3L7tqI_uLJ~yWvBb@k{0Sr1)d+!E83#P zEVK~3CJK$gbe+f|)pPvlCvTQ^uqGFgEx=)z-wN$WZKgB?@E^*g?VSrc-84U%_czD< zOa^mBen~fWuOrV|7QPMkOk~SgH2})bOV#L-7JQzKM*g(+w~mg_6;M*bOJQ&x>}h~BuL17C zJA-9;p0<4vu#!r28}mwIUm9+dcf9|rvXFIyRG*wOUbx~AuS-$v1wgU?A3sz7?E81L z;J%e!M~&0y=~o{>SpNRW_Z_8oJ-^og0N+}0E-YeZT}`iB8l@TwjeO;feR9K%56f_N zos9I9I2Tr`oY;Qx{i>G4Tu%mE7rf3vepv{sZ!MiZsqYL*V_vGc0nan5sr^YWLn$MWC&5Ev-9NPcI!zp4NL5CcP0TCv{Z@-4e`ZRd z6%;~Ip{ALZ2X`;Xfy1fJ&y?)ne^3UGd)(vBJ>jHnXB}A(dFbK8IbYBUWQR!&e`anH zryGGa1H|iqtrA;)MkS}3z!9`&ZBo=NN3l9taMUEor$hW^s!6ZSmPcC=e-F^B*3ZwS zGLc#c;Q_&u{>NHmHZ2Yc^A#s70F7}ZxtgNQijz&k#Qx!gKK7#={@VOm3)-3yJHRU|#mM*2Usj}bKBEysa)_huSVX(Ldt_6UD zh}0;B;DqSYnS z5xgQZGi&8DUwlYDd&|SQ=_SYy&}Utyl`=e(Uc2ad?>sx=0_4fxrX@C{(D zNZsQR^a*jN0y#hdEUi2~{N&W*k4?ivG- zOdMotRvzAWq}d^Q z5-ofYl|`fQrPHh^p9_|tg3=I|MIp!DW%CO!Wgx0zGuS(dZb8FyW(w+4qUXd0UR3uR zx{!(hH*imY9TW}XzUh5|iWy`V0f97WNa+H=h^aN0>TOv;B8r{RZfpF5`d#&iWDrp< zh6mRG&m{Gu&;^XDiaAE`A<#0!2ee~fh*B8DQpVBG9zVcV5%$5`!Z;lf0HGHVNB~&t z!0^Hf1Cwl*o&XL*6Ad~FEs^3cp|5y=sgo8o7z$`aOhrkzWpNse3Hyq*dbpk7?kQ*u zefPBk=!xnIVGY0xmFH`?S0Gn_Byi^gwtgCrk99E+(TO)Hg#hc8iIk_O=jGnrOY*<} z_9o@S=6dS8YAqhXZ8-ruF^*t@fPFNtNmhtS*K(j>Qu{0Ke<@U!?+9-lqRYypmNLfn z92v{o-+#Bra0BsE^Z9!bE^;w3ASeg#KVtvJyNb1CAwx731;5ZF_7++8EFQ(AiSc^M z%5lZ3(LQ^IPJosCYf=C$N__JC_wb;?5PRW7&hveZsdt`oo^~}YWKK?m_+1c4O--AL z5RKC$SH#gVgFB0~)U?82L-!PbzzT~jGkGyN3_>VaB?o7a5u6f~A=rSMTvPMthgiF8 zYP9z%vNaofWwHUG`sZ#=CBn5Dl8~Q;`B?Fx-kBr%qy2pSvHVqQ%zxKfe*Nxrb-~>~)OED?yI8FF8b7U!Ycx`;<;OpFk9_)u2V~XS z~V$ulpN3Tlt(GLWl44S$zlIUuZD+js z1>k_P1U%r{cLD{|)rBwU_1)hUBw;)*7m7BSmqT~xsSCl48!y+OMsoccTXT1ao1-;Y zJI&>xBTMq|zC$vYnrUX|W(R{&vd;|%vUmRxSvZ1YWWt>4+Eh=y=HDP zmT(b-f2^{ikhTV)9P45v1e)ZWegw@?l7zGPO3)R8iCir?eFUZ&h@57Ttwx~iR+g5=GP`P{ zeC_4~^3D(3BGbc2_XJ3(g?Ih?H^X%-nm%8BprjAv^wG+(jlEABopABCA%#O}EN(m8 ziu~zYKQ9ZT)%j>y-%kLQ9LsUlwes zxT=3%zdHmpdg_5)K6tv%5mg9SOt9A$fIr^`rOITP_81#ORqN897gE6);V6!<)i%r? zleK)0>x^!bC8sct8?!}8-T=<_d#=T8hyRdvoU=3Xu85*UN|W7`A$5_#-)Hs`8!PG+ zu=Id+zmEst6sk)mOT1l!Ga{5N)x*8E}v)h^;Lz2 z3OcHO1-Q276GK}5h?Pl9Ikbs%K0*LI#&-eq^dzxp2L}#010#9~Q>&(t#*v~H*+)z; z#5Bq|li87`y0l8@7g{mXDLmd^Ss?VAp$w+i%b&jGb8^ptRt8g4z^dX6kLGpk!E=+Z z$8O|O&W*hPGxy26KJuWJW$QEewYo3C#^5p)ib*q3;=n>n09&7k zb8rxF97kS_lZ(mWGxd*Digf=Z6%_`{RdH=2KshV|HWpfzsOyay2I+|GDS7bW^q0z# z!GQw@o2Hp=ckgXwX`IZlQ&sSkt8vxhMWK~`#7ZzKyRefW(Udku^*CS%DMw{HjL@oS z%L2%bjI0r-uNaV9N{yh!uo*)6MWkG0pAj)TeVL`Jmp)L086a!uwB%K(KkAij&XlrkOP41T0d<$orE^vs5? zNX{!yQS14_c{3DE?tWyL_$Z1!Hf6bHky8+$smm)1^|k&|KQ$k|-(tQ)n736CNb^^v znPybg1t#6AqejO(S8fUHhj3qV6g{z+Hbr8WT4NUKws#yHIzupqljq;!HgLjXRhHP5 zd!oHivJ6D!SRK%x?r-1AT#?WNl3)Y?9X8pVJilh6eC8_$~=T}9hrAtls)`7*b{O%urRQ4a4mv(w}Hvg-o5qwJvs%df+ zyYgxgSgCY9%aN6w!O(a@&>85?Ek^7LwjjG4@T`GP1%E(^Tn(49K9TTmokyblJc3Q5 zPv~^g#<{KxzKCjtk>VJ~3&-d=769B09$k-Ppt%R{30Io&ipUAl_~N9vTQM`8|B*At z^t;Lm%c5(B^3a||4f#y`_lhg8e&+1l-0Z`9)8jM2Z*V3tEl$Tb=$#Fwq;djGL!<9A zgUSJsmBcWs3ClMu|?4*lprrX$&E!EyGZ^puY~|c?p6WPMDYyrZ`)Re<^y&! zz6%XHa=Egua1}qLd0mS<7X?yXF1?8*Qypp_6|)Lc9i_l|8`UJDKX}H!!MHjg5cE+6 zI1xzZBYn!5sMm@#4L-H719Yh#x^-IbMm+#M5}F#%KU71pIW+<7^H|MOyqC&hS6V(a zv#dZAmK6ON>xPlTHGutGS3H}M;i@h2Ki>2ixo!7hnV!;4_#UYlZ{PeK^{O^a?{~*8 zbdMHnSjTzb^GVOv!GM4NSI@p65TCN9-uA(-%lkidzpUAKqE-GIL_H6T!3BO*Ag&m1 zWFPd&k&=$oXITeGGP&p7k^H`(Es{Nmpm%@`?rMw|849f{cI94}WEzUu_ml5mHGq5yGT~^hO_TDg50kVhq5$Tn@YdWIUd}psx;UrfQAxFpV4VhO7aK zs_QkURk9;Cy&YatWMAY=3IYj$>L~N<8c^|?pq~ks2LsuBxX^H1MnR68X|jxo8~_yN zQJq%`igBEblpQNqjE6m_h+B<)*pu>j_F3SJ= zN1v7P^j2vHvn5~4fqz^iB`5|~TVKoKl+*t4bC)8?}rDer@xVz7TOOBYzAL=SF!3`T#Z;P(#RcXsBrVX z>HMRg>9%Rvci>14%FQf%W_G$6wIkVg;IK5g3SjCmbV>X(9}l<%K^nf#=L3rdp>LC) zv61DAI72D?++aA9eQheBG>_7K>QIcZmQL5m)r`tg@q$2vxr>Ew9jHk`iFQBAz=pJl z06ea;=cRwS_=podqVE%X$|Dl1VBP zU+!BX>PXAulyQwIsI?f@o_WJYlzTy+J}*@uHKX}y3VH{e6HiqUnOf;(+)|?CeUs3o73<;1_weC;|*rx;G_mp3^WN8vAfA- z0F9WJKuw5jK?qJ2?k!Gp#6GYClUO*|ILGZkR;@c#{^ZSHlTY3FP_87H(*h@H*wqvt z9Rx%<)n&n0&$q>A?XkNPmWu`Givj4qyuVi~f&s^j6>Oadpe15YfGoL`{_rn8FQ5DB zUYTFJMV1ypPEo*$4+SGFDg5?SY%1sGRF(619`rLkJyqoor}@@kyNV~m9GSZ*l&vb@ z+4oj8ZEdt)@)W$TR)EXr)OcoD2jH_7i(sO}flY?xP>MXRmg3YLh?fT|k-@SY2-A$U z+vIAkb}mKkgJxPK3-F+sl7k5VEUB`P&kk5x9LvFj3o;m@zB8sBNGbVv$`l4LAk{u% zL7<8Fq!N-N$D%PE_FWWKkE2{5BnVr}t8~rE7`_ow{wx<{A*RTT&r3m;z=07RelHKc zus2cNe2h7Wvm>Iz(qx0JgGqWB2&jN$8yCqaHUlc@!D(i`F?Ol2OUGRX`Ma^#2k|08 zc92IA^qJ?qJhXyKA@e$6J$iT1(Z=1$vBse*@i*q7ey(c0cP%g$j|*@_ZGgq=TrAu5 z&a2ejNT7=Q<|cX@o0fAdtd#?!dHFxy@HTm9@1ZJ?v!;bO zWM?J*{G-Xh$vd<9>{!+CZS5(n4|vL@^z7YD&t$A^v1VHJ&L~kPw?2f@Z z`0bk%FtpxDOIK8o&3{pua?S)RWLy0^%6+r-qn=~%lMJ@P^;X^DDhuhF`l-e%lPKr8`LT13 z$xN+c1_jNRmE3*gG^Qd3g34{GhL1MOwRL>tT0GnWaYwYw!kJsBJA3r8^QKvTKFW0o z?X#STl?Hy1ViDF6#4tQUA>i|Az_II+i2FvWo`+y13JZ4GmvUiRa|T{&@&{li-VyJ^ zo<#0!m}@%HAmSgWfn2-?e@ASBTTuMG3Dj#C>Pez$FTtFe@{xxkqlJCajP}Y28|P%n zswRdD2W7d@nWB{1-`jO83UwE#b^``$w_RcRD&E!w(0>#s48(BK?fJ~3>lb`;fOXYi>cec#J(!$CimW=k+qjx2?pe^)RF>x|{U{;J2yX}eC9U-~Z}kiY%-S7i03U9tok%@OzJBOgY5OqlIi(?!Q2 z#Y(};dpGCscRmL(MA|Mc4N6oB15fUb3AAeQG2T7M1*-1?Mba_>T(0%BiGKQL6g!vQ z#lY6|zQWa#KP!sY1mMXs$pQm0Z(1xR#2ojFWRuFVu;k^DrROZoIo)?;LCbRwX7X{y z16f!SIdWvtQ;FPa0v)dk)(XZ@UR)#zb6F-7)4>)^(tFC>>lFw17M#)wH5S8)S$It_SIqISUxjvs)3!W(V-EGpCJ`ac`~RH z;1q|2fPSNG^2bH&;Odv*UacSu)x3QQZa<4g8E3AC@(8ul)LJ zu96>o{@F6+K#i?v22vsS{_xISQrgJe+ zc8xZbFd4UU?)DAx+rRQGdFgXbmHiLhEW^PP9cvTML-N5b1VL6S63kC(9#;s{dTt79 z6wxzjzpRZr)fa(%C|?d<7pcF+d(#QFw8v_*Kd*5DAntxd>0u72uEyfv!z`=W!tU}C zg~w7G7UoFfE~*??eP)f{WpAY*X_{mDd?+a^KBeU5J(+GBjT>3YMSzk|hpNpnZE>&{ z2?3uJ^XK!4cQqqcpNgTAgh-4*P?8;KAAMU7ebSu9JZ{hDFU|AC=5Yp}xv1qshfoId zqbV-QoS5{;oV6KCf-tIxc4dy`+@U`xisNQ?2V7;^hvu6Sv_SC-&Q!=hkXlKV^)QX& zv5dwV#HA6wx;}c!;n?E|)I}5~{Zy33&d~7Vg3GInCx}||2$-83(8a_%N$~gmt@oF- z;M#c(E?b6i9Q7S!mh*WHpn5ZJgp4+%uRvMTQIi1G6E98sFf|I%*3B?k z%-|32&J#z|NAU$JSxL--@277K^y2hPa2~6(o*n#Pe(Lkp@C5_oV9wvqvyBEYwgxqz-RQH78QhpEc8s{JWpJLcaUC+vUJRx5)IA1w|*#KX;gqOHbh? zu`hGn5Gj%Nix~ozuZ`gI0i}%3M(NCiDSQYoLws4@JjSb(^?RH6+4w(vr!!kB8TyW8 z-8u;RbBkG7KnUIT?t39Mnm-PH&w=ip@PNMABCByys`UUOwe}eh$Ta}e!jfc9N^2kG zIk8G3xlX+aZ)l48G-)3d7*H*~1Oi9fr-%b^|3`ImpT^YFipf)39QU2{y${VrX`9|| z`c5hn7r3GPWLZJS&{pJRvTw;q5NJ*y+; zW+gnmmCE6 z0kC@Ll-`SzD1*Ui@hG(*>bp=g0*40;2dy00_jUQ9m!2&zyz*38SW3d*;&}2S%LwYp zcl7Y`M;IjZHltsZ-@Bkl?uAXj51^JS^Pgg3{ zV`tK9HL_F-z%>Dz3uuN##Gw^jaIjDa!DX&`k@+Bz31;1@f$}F+9-~$}69#Lfw@b|4 zoCDN1c1RMDnTd-LufB@wO`G=Sgu{g~&@Y7*#O{#tqbBhD;AztCTkAr>*6KS_=lq+aJ1Q0q_W?18CyQB3s9M zO>=?UeuY9Mmxz&x$ESIzw5#b7^ia0b`&21`FD$HO_;$) z{aOwbJbI#jC08s|kDfc>&PVtrt_wn~I)BS+H_GsC!`wh#^Xezc<~0XpabaJ!+%VHn z-b!p0+p)eJ?1li;=X-!!Vd5s`i(Xv|XJYG>a#Qn)F3*Y2N+oS2?i254{-svDA~+C& zH>deJD2QXl(LGOJ>`{&;_XUW%n;`*RQk6DMyUidEf=w#}@jxOV#N`iCd0IXnJT%Sl zIbt!`4CD6kH)(Lw& z^2Meebvv0UKy&p2d-Hvh2~ejsB5-SVkTD^pk}(4J!S+SZ!mZ)^2y^X|XY`QLN+xll zm9ZxDsX2-Zz`HdupITdS-?MkB4=hyuvtvPf`=6UA8PqXre|+RHOoYY|T$p>;O2&%+ zl9|1@2RX)-0^$>8_qjX5EeZ84=8mfNZaEW4ZAf(sQ0kQEG|x@q9m)Kd_A?@tR3p(= z7i3oMlOK5LV`cs9kQ`gB=Pc__FMM6l>9LyCR{|9ZIq?sCl@PbIKu!WBkH!_dK7!$( zTWhw6S_V=Eb#m8Sa{2~&>2oiTh5dJHT43hi$!DIdMOs-d?-Zk@8eHUe5Y4KBLq*B* zKB$6Wy^jRKb3hyR2}R$TRvoezbtp)67jbW)J9_7=R51FI zFRiQP*1y_nSA&h7m)d@;RWZ0Qlk#AeL~?QDpnPZY*u2K1JX6Rg0Za#h50NgRrp6HX zm^kZwsg?RiB}`<*=Yb6!Z7oaJ0(Ewmlo(*4_1JGkDdG4&2oh%&aBDU{(Da?7n-H!R zO5b56EmP$=ua1^JPY1NnyS+MGnnR0i@KdZbE+fYURNAnTO3JLr=K&XU%&58aRgte1 z`^kd8Fb6!_eu6b4TKip(<*ZV7@LZ48p;*Ui?sZ<{fExz;$0i7(AJCo)-#&fbd9v{D z!NQ?}toXvN)K{(z&ViK0KM#naFkS>-=J*AThe;4H#cY6Ee3K%JBp0!QiyJU(- z%@!yq8ZF0LK>zOOO|gH#&zoAd6y^*1ta1VNx%&7g^}^&;R0J%tz;d-wD5qAx!|Tu> zMhxSF@a9co5{0a2(dP&dFN$#`OCecP?AUt?wD5yOe57QKNDYCZLWnaHC&A9<6*>sE z3|L8i)?8q`WW3%M88bVK-whW>1z(ebD2%+KulU^qv5xGLGao|g*L@w*t!f?=?j zMxZ1%cb_T0|GhDez>s~cwEnw3-I2_L7E}bQ72;nymI!)Hze^^#tpa2XHXSXcuw1yQ zU{b-nP?{{Ff>5-`EEn|>fQc7nuItOqfiXr6ZRH&3DAOCmsNV(`9D^;b2$L;f?V^kq z_sA9Bahj~1naY7>+A`MLt1mgw3caE4tO5S_4}W!e)13C|-BO z_$0_hQ-#dhqW=(+rIlb!22{B%p%{bTTbu;Rlx%$ViOAXrl~6SQK63bjS)>P{?Q`&1 zY*b7PBFUM7yUWr8me>NIH-jH(a9PD<@qc$0;@uEg#q{e$6@tM|(Q|DL9R&G=wANQg za1?7oIEgUdk!uPtp#_6grHf575Uf}(&JPVH8qAMfE50}#VTFEW`mkv9nxLymoT$Bc ziXYxzl*28jIJ_)fG~K7MvneY_w|9;=hV=xR1sPik7r-R_NI%zo$I<&o2M~Sz?OHct z>=;iywyyQV`jqz+#cKelQ!s6@u9Br^ID)`}{vG=;_E+E7h~9mjgWeOP$3E3q zAN^jV{l^7e=y&N{alOMKznK>o5AT=FYg&2SdE0Uuo@#6-%05J`F;LzddxEuwwc5%nDi2(}9M@P6u0ncf%z+N%J4~@J;*0_d*Rwds%}&*Oh&R z@})sOF*lwK05^nJ>oY4c<{0mZIsys>C_Bq#Y1A0cCjVT5+^hf&n(`uo5UlpMPYzy| zm~t?j?w~OYs_2D9L0ix!tuxvDlS@fbJGPoy2YC`3urt_m`dRs19e?30V}eOq0ZmV$ zTOnZiXMcolnAppm+n?6dGonJ6cKZ;&b~UhW>_z1MFLzBcspr5w>Vf1AdEH7bS)@N^7ZFty=4PCM=61S=;*biGF3Hlu z0Xg{ukzJ>*x1+m5vFR!i)qGa&sHoLk5$2(xZf@))cT1p`;NK}0fzK;4K9qYq*3)G(*eFItpur0pf$vX-!|8@$ zcB`=Pge<29F=q&wNblE^c#(@7!Ef0&gPy1Q03!?dK)P3fl0vH=r+ce>c=fr|phA0* zOhG_A5r{;c?JQ256U~I$wLMEspZR_`E&=VZm7;u4ybl}S6|;0Wh?%QnWB2>JXwrT2*TP=~ zw9S20JVj|v(S99rPz&)=KQcyusM?%c?wGjOcio-m?!4mfj%%PWF_tsnIrN1#p=*c1 zAkM@;BlK4U8&>^QrJ0;+WFmz{A&f-rL|26O$M(FRGHJ0Os+HR*mxMx%eXb<=vJBf^GE-xK^(40 zNnJ;8uNcoGXoZEFyAb;{UHUwO+#=&dc~b{J%{(@TpqA(Z=-1$LY$>@*`Fsj6)6B3v;;o~3U3r~@5S)Q^ax4XP*Lrf@6j5FpS#uQa*B7e0Bxdd)g@ ze|iKzBiHh?uCVU*VKUO3{8sm_3d~p$^LO{jO{(Wt6A-Mt=idmIzw4zHs@AkYMB^LkD zG1~?NkEXenT1yEc{AD>Pu{s?y|E0V^&lv}Rt(h-kRg5`}S~>o>^>#KOK#)Abs|IY7 zgl#$gNA#vg_?$hx!q5JGuC5iTn{VWb5%-k0jah<{_BtaXTTfUc-*t_gMgp3a}K9c9{(;u>Bn< zU3h(zWBC?gX@&wkP8l_1IY5O_+I#-2NUp@`03lK)>?lvuq|kk@{sh2~A5PVT&F4qn zBlth^-$m}HA{Ll#(nm@}#>Oke#D13`Onryfg6{ak(PyMKBFAz(fhpqI$YNma73LoO ztXwHR##DdzfjeLkFb>l(@nr!_{sZ<{4z zBcug2{k8fhnhWg!D^G?2Xrgr(r$cXYfUEYzH)Nh(vJ6P+)}o>B})+Vrr4xm83mo_`>fchpBkyAe4}%m+($ggf3cKx?DEpm8nOv{ znb!>bsc#+IqwM=h_j3BY=3E65uZ0S<4S9wDEOFV zW7zMx<^T$IWzQq>5pC0Y@IeoHLPr2Rn2?-@dzCQw`B`{dcX?!f>R^TDKtnXgK?D}i zVCIy1G2_pERM<85^qUQrzsmkn*2#{ZsFfizM4J#u#H`8)Go0mm##9 zObCHAk_=&P92ml6LP7``CIxOF2}2T+5C|<3z*OUgaRF>&+-*sgZOM|=>sQY?Z@Ir` zt@U5)|2%u|_nc1>+`Dak=bZQ5``J%j>%V$rkxKv?YNl$SB>4G$%{dA#${%bVQh^GlGLL|Dg+eW%&BjQS(1l4Z)x8 zwTd?2d(%eMJClXI-ge_Yk+tcXn+PEA)%iU1H!nl(1z4yYZzD*-w4}eo%o|^%a*D#z znX&43VdBWYpN#2e)XUtPc^LAeU|JF(^VEL`Eya$4KnPAB-n@gsPixNT?7v_so{s_L zys1a_e4T4!$|-V_9M?<(mohoe;8j$Q>c&ti%jtt)O8Gr18e!n@zE=su1m}L7oB>ie)l)xp@LTmx4KL&jhLW9yW zk>%Jzym=$gA_o5^6q#e@bxRe3jftx`D%&9xiuDHrv^oI{)GE*hJD)#QvRIY8-}ufo z#QU38qPm}A+YWGxq&~}$h36z#YN0Kk zZKxrOkBoIN1po(!MvE=E55kN_rT&B`9~n)ia_;Q;npkVt5&*`*>MZPcV^gWZLwH+6f>rW9lU_)FG0BM;9(WGFU`?tqHake+p)W690ZzK>PAo+=X&?M3V zeUIGy9_ga{Ctt?TAa=ddsJ3Gvt?GpWzvaN$zmRs4zPhlX;5SnyTMuDAg9Z#*l6;?O zUo)()@KEG{F~Ol^?KP$e$QD}EVxm(`jqkT8vPA%2^NlPlCr2R~CDW4?kXdB8-kgGJ zfD8lmZ+8mTIw9eNQ#EBi+(C9T8#@nG+(q&JC zg)h3sq*fs)!*iLR=l-b862pYjw@lwRlvt|W75$RB?X~^=8dADwOc~+8Sxd%fJT*Oi zXUgNP;S5xXG&t5cvRHP2tghUw-!gz4yP>cj`zZx{SK-L9B%XJjRJTwaAE)bJfIEgoxyH@ z%72eOaZ1fSR?&`w|C)AUzwr9iSt-FODw(yDMRjP5EG*RH!F{V~kPI^X)>&}%yf*Kr zvt}Omc5d}=a$JmmIlP(ZSVzvO(NFcO&LM2#*GbJWmg z$JXA=1DXSYtgarW(`!rg{0kj3NK;56)%QG~86A-M832q?0OE$NVmpD*NDJ4ky>HpZRoD{rfSF zDzjDUfBL~nuA4bnnp6!&s{jfTw2zJL{>eBqvlm~aj6J{wpAZmd2ZFA7s1mAZf5yS+ z?M$OYJZv02mp^pLd3HvXK)nJcs zD_+XCT~C&{t4SIdQ?=GB%md3t%^r+=B|T_Ok#=q(vM$VdrU3^l%5v>Y-3XX_E}Yt( z(vu*yYi@b_(6X+Yn(#Luc|zDm5?Qv)+W|-SJofDC zhCvSf9J*RRo(_O&)sZHGlgTm5saxo;6Xa-<*->#R;Yq z%jp}Iv^ctoeddq=aMqtP&-QDRZ7$|_K#KB0vT;A^AVkJRB1#3_dU<<*Lu9Lra2Oq4 z7d#jZ;@k{1FzuW7P|dGMR%4P3W~->(JY8>dsk4;(#i&<;JIY2S%<_ol(17YZXSvf& z_aVp`_Q@F-$KV)!znY3L$qBLxS^=PRWC}9{UL1Kp>aa@W0xb6ba(pIhTk_}`k@vjs zPQS%NhM#gAJ~nTin$_CehuKy(Mea+#M0k+g19`Cy<;j@(khi)Art!g2``o};^&_|5C-*))lC{k(^8-WTwq}H&G2kaytB`v~RJ&eN zm#}k>t*0F)6AbOQI*uRoyIEmAueK@Qh&2_zC`qLSA)V3Ljyl?^UKdAwi5l zgwZ4$SMFa=6^sm_ID6`=Z~jX`7o1K^0338K%U7;l2pO?Z*wTp-?r;8ON!|5X$^j77 zlT7NfgdnVbjDKjz?&voJB_So?*>LX2(5X(Fl_=Yyd|8qDFDIvU1j*lrst4M})Py$; zQ{rpcdahQcEDMt}&+0k@)_#Pbm%+5%qi^b48{$Qt;ig@|wD`u=)Wtxg?ywmMoN@?x zwmM_LB&$a(X)VK7@8^SoVn;Sb@e>N?v@hF0anRZ;MybERF4C9_1I+b2y^m&Lh-t<; zTICFSkN@pNEktt?gpjq;l67Uct7W>3r0G#uNe2UPS-oel*9^C-{3N#z114RdHrlv0O$Yr06Wx9S`-uwr5%0p*%Wr8rl0gchYuLQl>Z3gRh zPixuE#AEmyo@ls(!2<)vKijJ{J$6AwER;(}p1iH+mXxpCjPWab(EZ!z`rYsQj6896 zDQj!nVHz?TQkYCTj%=zb{a*Ev0BwL9${9g^Cqvg$1C!FU@2T5^uaMNo-=p+y;2Ym> zV0Tq=J^LU`v;>$|YCK&M%9ww4%mEFTq(9Km;ogoWy5_hg=bx#|<51)v&GRy;gRK>* zH>f3hX&ysF`ojmHWD!*PoF1uaHsu)KdX zwCY(u3*BO7$cgWtgI#FAp5J^E{ON zBenFMSwADaSF8695i2$n7242qpELX3gvA3WWRJ5FoGoArJyQR+hIrpK%#2Wz$4*NGS}px z>g(X>0_Q#Lk04|WBolC=aqRE>*3^R9RZpgcT>ibZx1E!HwnHCL9UKGw?EYsjvm`9s z#sFaRf2--xkIaN%=7CZYcq*f{!}6bg_APSi+}u(GqxATbzMPhXld7A#e19n>n3ojU zBBcPKRYNX>*c?+$iww1DR$a?__D_>!d61FxYAX46XYLjK$mBgp{aV2De7TU>av^)= zzr{jk1ysXSK+z)?4r%PYZ+QDX@`<~5WNq`P%++jJz}CcJpl$Mc=QNQY4WKP*@_5dr z*|d-{BU?RhEQkzhy69g1Y#CZGI=2Br01A-hFhd>FRAw2a;l|9Bb-BAyhWePSzW>Rz;n$(f7WEL7F0 zQogl0U(VCH0R#8@LKzjrHNjE6kgGRAAhyQ2BIh%ohr|ZrYPJ^N#JuQ|#9B?P_f{8xh<$AIqPDe)ZatTY&e*88cr7oWoB0 zp#tspi={#SjQ0tDhP)h3pZvQ*FdWe78ll&q4W?!4oL7v^GrXBRQ5eEP{R2v#f%WM^ z&OUmt9NTz8zTk7OO|TzXT@HS=QeE^`Wql`DNvt8?1K8+zl1Ba*pYZs9pl@&R10C2u{ z0zTnK-I!xzG`>5-JX_Zt>C=9-e+R!GfgXXJ6AcTQFwYF6?lhgd&9wMI1qkq>L7tZb zybXI+{TfCinUgbn1^j3^Op9K|RL&>j{Be6FSsIbwq}q@DL=TIEmw^{|udaAy3jrr6 z&V^2Dn0O@97RTov^X{{(Kh0T%RMefmqCMD7u#p=dgMox3olVRKMs0AeWzbJD!BTlP z$`(6gHHT00PO-fI?xf}n!b`Q$d($4>hq_~iDw@S=#%>an0Ggf;)HZ3Z0~R!tir_Uw zP_QD6Ha!4oNb3Yz*qM?K`Ow?|e?Wl0SL@JvJn;LJsaOfzNOTgw3j3ud?p|plSPqlA zn2PE}1N~a*^U}S*=*`@a>RD}zoMt0ZN3qBJWqo}j zS6y~eUU17r^89BWlZ&?3j9e;M$x&l8l_cBralgIN+uQy2SC5&E`()%7=xrpkxyV#g zxsBx051)|_-F`+s{Lu&G!ABpL*?b`z>r=V>k`wa$=a%svmCKHlusxF+LxTrq*xRq9 zujSrD>l69vFL{pq^#Ayz>?}8AvVP12jbJtgD2%y!NpF~ZiOy&38F>9W)5bn_v6eN^ z^&GC6?61B~ z$5dDXHBIRYRe%fS#o^dA5~futW}Bj^QBYF+dS{p>d(YIIeI3Q{WJOjcTL{Me<~Y{v z90)2VLGdUYnj8)BV~U!^Eo>La${1zYAEv(fHRqAINp&z81ZR7 z18jtfQadqsgOD-V3c58!Ib9y%-v9|Wf5#YVX4q9_vrw4eNAL6OZU9$xiek5u29m`F zc84u*G{!|&mS=WU8CoP??H)#|(my;~lN+XV8B0wBLNobMxD9g6E)fWv35$H`>Yf4=f2|k^5?$nCONTDnCVj1lz)MF)bra1%Ae}RQfu3GEz$aD-RY~C zXm-nZrz833eP`tte(i(uhPQr1KK+?J*_mz2V!Z9>e>PQrGev?+$( zG*U%U=C+EN(Aq^YBWu6_DzYZ#v-!?kOYX0=;R!0xZfyEy|3Fa`h|wbu^yMWQ0|h_2 z;D=`{jwMN=2JHOX2Gpj1KuT4eHEtYGt5@qbK?=_rpyFTs)X-1PyCQ$m6gdM#^E%p4 zzk98V>YUKv+wIUJ`S&pvOhIk~?=h%%(cTBR^fJN4Y%#IC1fyl~4+5CBK_WECpnXv> zmM724`A0u4f9Eg1NdE4(zfiUFyYq!iRZZF@)E9ce_N@|-s=*hsJ{ik@f9oCc!$0v> z`P98@vT^uQS>HY+hsJ9j3grp6ijs7`C-1xCae2?bc&GfA^-BH-Y$3CJ(8`%m&wNAZOzdy;|VxH zm^nXm*D3kHkG@yl{Px@B2maSDmYc3Tq*7wXEZGpC7{4=^vX0;KCD+UGV_z!Y{ey3o zGv`I78yCquY{ce(sR9It=g?NR40O(W<4mT%632(NKx}AUd-pnhUITl&XNh-v61oN; zThxmuS_^^Jo`6GZr~;bIpoD;YT0K0V2l#aW7}1n$r4hDuPxG?T`3fHZ+Xq&7%-06= z8V2;T2E}_2$zm*=IYSRDY>c}KGz!}7Hcnb(^Rh(DJJOz-i2!AVEg4zXnCG%|u`wzs zA@liHQW<5@YgH)=%}Z{n5rgsD$Q@}Se=)o=eXnDedfS@iO5@!#6iOdcbvlL7xs7FD zt5%x?n=HqJzxxp_v<@NSdft5;IGab|KtTjZS|n9E;z?d#-^KKhWXm2tRPBx0+d9^OBA z4VgdqZ`BIw85zl58TVu)|K=CoFaPU5{$2UZV<+XrWzUwitrIdEt;_C0WN%)a|H^nL zGMi6izFb#8bo8>DXagb~QZ&D)eW7(q%ouhNR3;EI)UnBqG zAAFH)%004}pOVQ0mFAp=7U9D)#6h^TEpKPm_KT+xc0Q1YAe4>DXLS7f_u|0Jf5nVf zJ84t6I<6Ukdz*(ofA^xTQFegIpWk&0uC5wWB z&l~u!Yt~iRqp&~!fsv|tW;FHG%}JxjSy8XtG}X;-i-T^mQqnv&0TkM-UM9g%$XFyT zX|m+U{MQ6CJf{1j%P|c-Hj_LoeMm84+r5p*T&SvU4;+FOB)jEmY41;YA8b>t%7eLS zQ<}E#f<4GyQ9T@EjCpFcF9?MT)g+HO9dZmE=4|H8&AbN~!8n^_RSqg@pqmAr!hB@8 zU|rkStN|x0iUH`Hg zueM}HP!-adj5W>ws^gG;P5#-zIS}4w+oRvJxWi~@9gNQVApr4KrftQc#!5sC%)!ws z1OO3PUz^C;$M2S}`@&1*d%pceN)OgX#UT&jgf=kM7Zf#R>k+4zfs@%73<)DD%AgvBUD(fAYI>`@QGYOi;`T z88PDE^=ZEP&6LA)QGP2xW;!0rfBVgk$v^+Me;}JDo-ON#E|J}t0UVQ23o12LPS6Pz zx*Z4qZp&+b==Ji62hMmMm`2cuL^a%3oVA5)Oh$5kZy{gtl56F=zT;&w zJN;<|04Tnu+W~R!MAfVDb*Q}OBmtlfbEAD{Q_*#CT;)H~zn4J20q$8)C%yuZsm|*~ zg9LSb)~kVOn@1I9;%Eiu$ju*6-LL9*-}v;*)Zw#6dfg$hB+)A%fXoMWlcyXXWoD@2 zr-V%4>KUNw$H*4d^dy)@N+2-j0`1XI!?`Y;>pgTL*07Tn7)W$zRNEbUA zh8+nEhaL8?nSAp!)-GdOi9>U|X|BPc0xAtA#7LWu6sSv@235!QYe%k^$(o1a0nm=eGM!FjeKJvCG@VRjI-Tlwb8lm3XCa4=Un?KGOXNp> z^6heN#)3pL`xHKquqvJO%2(^-k?hVE@*Q7yvwZPOE|=4f-YXkxJX0J@k1T!=G#L2f z6@Fek`)ZPz1j&8!RHbd~TZ3jB#k)J9Vugc&I>6=?fkoLWn)TU?B@jc|DYxZ(Ff#I1NELOmpO%?b){>I9}SA~!a`rG0I zCn}@mG_qW_ft-()Wf&R>4$HX#~-|1&OULUj7M`bd-|T= z*z@FjYzlV=1)s5JCdX8WBJ?P{`qoz^OVeXOMxI}10+NQEav~! z)UuuDG$Eqr`-3HBk|BWSEcQGjQ5Y+F+*4EnMKxfzp>ko+a9xG0*UsLG?FeF# zbS+wGtXXE~44nfpu+Hs)3L=IWaQXs+ERHTb2?1`LaIqaUY#$_jAt#D~INpx^{R*io zygErsLUF6;C=aRf)~}-7li?a2HI0WdQmCCXVM8gF0-R1z4p14RRGEsX7 zvP?A_nmzZutVgwI9=mJaut2Mrn?)Vp3u&;&Z2}HAsl|ZlBTr;hhV%|9!QfQ0WEx0Q zQ8zZ;zCy8#1Sz?uC4td6>z8BB+{9AFF#`;`4-0I9T1N+d3RvMVM}Ya)Bn}b@Br`iM zz85M6k)cWnc+efzqPX*1fFBUKj2uyGPD#`g>VF@x+xx9XKx|n3bvj+jxib&QD?jHF z`RXrxhOSG|2;{z|%|nDd&M$$L`tlRdY>p!J7RmnoAAeNd^v(xm>(Di_x99U%q?*Z6 zW@jFj(cXjdnwMN6pMCQca%g)h_dmQV?|kpW^5Ku)E{Bd?C!@(BYqa#mM(lSMPTZz=C>fPsZ{`AG%-O{EoZi@bQ~vcMmmMie^J( zvGcf$W)I7&KKF!t?(?pYV@EdSu~X;e9q)Tg-t~byW&QA#BBL!$6r_%wqcz!;qw)*C z`ab#M&%0VS#$zcFVnLzENw#(3wa=ES1=yP}<)t?rlmF>8*T{eQwfp4gCC@Nt;-XpB zl;{OOk{Q99fhLjtjYd5tU86&s?LGO+h$4&u<|@Gtc-QYUnwUGQc5cQwb)Nt@qLUyK z-KPkzaEDdm;7m9?^X!L(R+o(Y$TFB~T=6ZximKl`lsq`tCE8w8G(Y&LXQDAd8oueK z&r+HUD&f8{svk1PBQHv$j&6ODDkUc&o)8CA7aQ^QNeEe5^w~&hJ2_+hrWN*)Zm%#( znu|b>#F(9M$GX6QDc+wBA2CU;@j-zTCeIh*b=v815b}0>#IVE56m#Lsn;CHd0UCk@ zZ{-10iCqhxi^NQ^qw`&m)WI0`y_N$bu>8_Kk42~I=u~sZ^8+3-L;Tvh>lw~?452E- zP2k9dQ8gfmb4^rRESZ0*JTW(>X6O#vomL@9`+hS)Q|fY}EtD3fEPfpJM(+q%5be~I{VjiRr#$fZM2=o`M0SfRdu&qa z{M<^JNx4jihD!lcL^hi0L21WDxYk-~GmS-Xo{ZZ_A;>o0{dYTm=Zt&p#wr z9eqN+?>k>6uYUQpatQf-MC7q=5&2KQ@&WnR|M|nR*tkwcqfMR9+3rF%w@=8sKX`|H z;EuEMlADg`x`h&1&q1ce1#wiSLiDy6kc;2JH+{t|@;`q2cVw}5PGq@7=b+r>g=%_p z*eB4SSqs6bjNih(Te&#*zXBA+{V;F(onEMoWtiOKc&BSWJ#bxVp$jOW`Pyw%^$U{# zp@C{B32)(BLAQCUHD79n#9vnZZ8r$;Mo9KbL?Utgkbu*cozUqVW%Y9xCU^0vDt|Z987!41l52wj)aRb!b(1t-7vX zLd)^gKk+6a5{>OM+aYZLiu9<;COzpg)8a_fJRLkIgX2@E#%x$e;yv&JZV6O{SJ3CK z#1>?`vTwnwJP$*)34pXwd@3Yf3MqsGOc2o2mM;egF7E+cC1fnuj}Nr_F<2E|8gwi^W;l8a*uk^zVJK{JB?Ms~G@xXLC6}TgZGqm&=Y$N7GKTdKqoJyF61pE$QI?|9cIy-KCi0svwjcO{|cdKU9TnWyJH^CJ2D&%I2} zoVrh@#RsE+3AS@9%1o`Kj#IN^`o8PTN!}OdoP{f{Y2g}R%T(JW6eHSWz&Cl*C=N9G zu`rFVKd)`MbF*!Obc@$pT$nMsSy7=1umd=R*7JfdoV~^Y-Pb5G@H#&+x|IHF(FE~E z{6sF&>@usM;BW-S5))pv8U0grFpy$jSXO6YGn}m&E}`Vk#%O#AdTHtaIPf~!u#)Eea9`Y4{CSaOPXa$@w&JYjN3%jIT&dtU8bc6)@=Cum1)%;X) zv;LrUZ+g9I>oP#Hza6!EpThPO-~g*pmzhobHJNQ-svsx1>VOZWU*`8!w*NYely?j3 zc`D)$^&#zN007UW2P$QZijsB2!Gseg@UkA7gx9$qy)#VXVZa^~%SXeKQUVkOC$2$( zToVKWY36-?^PHgnS-~=Lw?{U{x$K;OTweHDSIDJDH$B~~uX%L_7!(;dNI#x-Kh{LP zUQ3&|dmlO{w}0{>8Lw?>f+5p*Eam*E2j#22@Cy0L&o9vcmUw7mI+4w3$r4yRrOnLs z9pCf+HWkYnNy)0{=$b%2h<^G3evYc*O zI`86rGZxu9_n>_Jm)|5`aLc8#H#4nI8E474ur`?(SXh?v-Xb?#Ig#_{9@h7Nh!}VR^$q5KS~<_df|boL z_7`3PK>6>8iZ}RfsSVAPi(4 zs89mU@zc3*fBOM)c%k?-H-_Hxbhw z;szse?NI37V`EZ9Va5Y0-GM>IhDRH)|0Kg;0A@C{f*P|ta6O;7)B9$j¨sb%ci{ zX*3Wvno$?Fk6b$tp+r_hhxdxc2Yd5Tv!H`p`m?Onz8E$)Ima2-YuWKY6tn0}CB=k4 z1J=bdtW|10m?IQ{Q4uAxlGHOw+>m{3tY!t?+dVSryhYR-jGr=&1qgA6p8&QXYGn_2 z!J?246wDU_gD^U?E0+10&-Y|~GLz>#>!j_hVd0j08|qz#KdloW`UapC;Jm2vA79AX zb2jITVxmxM#-41i&*W7vy)Ilu)S`(+P+u9d7a!Z0$je`JmCRN?W2)y)Nb8flx{iJQ-w$1@tQpJ@UEQRwfYGrv3qR_M0*j9XS$Zcll}5pH(e`7x7TE6 z=X~;!ps98CSlZ1F^69)WQ>H6D?rT^QFcPtC^~^d+g_NA(1@VuejGDaz(*Od-shD; zjZj-chLWe8oymd#h2u*=C0oE&Grxk$?dRp2B|FW=#>@w(I@N7;U$AH}Yk*A`3C5)C zM6KZ(hqRi|5QO+x$2ME27@XUZNn73rADdj*mFji!Ghq`x%NH=SR1Sf@!M$=@Zfx72 z>_xtROnDbj)&1=GJfeBhf1-nFkSBp8+G=J&AaD_QOS>I~_w>wTWXarzQJ7f^n!I|! zmQ8UIm6^j~6@ZM|?grM>eiZuULgusca%6KZH(YzA4X+0P4oNutuFx>D38xw__O0#F z?Tzy9ISuifj!JxdK~v}C`1YRMa^qD-xU0p=tW7u@&w19RvNb-d(E=J9Jt>ZBGuc=d z*;q3h?$g8m+j$%S$vqdwaOB9kjO3h*r!yV%+S)`G^Rsfaio*`qerBL5eS$Z{s*$*ycnOeC5p!y zbdFO@P&O=q&&*%|KY{ zZPcojmu$tr>VsA7rRaO;C_Ea1+VZ^;*}EK1p@>No}`J$IxF6SP)RpvVn%iiw8a_*7a4^qe3jgE{iZy6|LrnfoR!_v56a%@Ps*!b{tVeF_{eKighZ{EC4w@IYO_Z4dvTaN ze0U_skFU#OwxgR$&j=)5&nAn{;KbM!0FA%=n!-U-*hN-7<8tUBF`K*uNz!vK9ySiQ6L)cY+P_4%< zZlrj6oIlCEsjqf#{edWsumq8_D#P?#2fHV}D-WjCB?v2Q{Orh>E7zDzXzS*&%RN{A zH($)<$RUx#+a-3sSe0o3yR+T@c^uK~Q#&}kAEuB)8*B29{@z!~i4*UTcfbEWSw5zDnSN4G@&>Gyq^{KS9!Bl*Cs56IfO$T$4uSIRfP=4K0r zrBKG9tMv;y=mp8JPxV{1%2D$2ta;6r_?8po767)ZoGn4F;G88q%T<5c8qVKJbVJ zL-ic&U{Tvu1mXqzS@jh=^(MKFqASl559*pH+VDf=mHT5R~N>*#IjGk3K{xm4FKtb z0x?vMo{@$r%}yTX=PFniJ91x!q5*rvi5L2-*?zq^3P<>8Get@%<~5u?niaDsLirGC1(Fc&ps|c^RK>1?!E84Y;RBH@{?0p%oa+W zZMj;|<0^D-wd3pLFDum|OK(cPg5nse(l1UULgcXnkZ@+nel|6zZ|9&7bU@ra4Sdp=;GBJ6Ql_Hb%RrIp5qmV%JwBx}Q*!j@u5D=_43 z`+U?RZW(VA#?nratFAH|3GA@kw$CN(bnd1N>5x{7_RT(o+Q(|k;UGn|RkiJs@6Gd1 zapJK*upp{eC1Q*+*43b^g--y9`O1UanxSeC?J>;w%hQ!6u>jEZedw<>?GA40s;`Sxs(;+SPi)B zEY{z51V@*IGA9kUopfnA6iz-mIN-B+@7n9y?H3xn%9qRf(S0B1ynrpA=8OQh{vBu4 z`4nmE;Fh4RIxj>ap_mh#-;~y|IF_jgLNT1cVv$tPwc(K6=dmxm!1yxTz&Sw{rn5+cjPmy zW&(UtJXyix1YRsvP$~`wZ~#O^cq`j>+s7P7YDBtoFlgVUIm9tD0xTO>+ZJmdTD4)g6vg^<=t=B{ zhWUpBYWfSnv=MjcoI|@Xi4@tUDI?HOreQLbQ>VxB=ws%fmtz^a>a(+I&s#ro?{G%p zkX0?8S86;~s+jV<0XDFo)MsgbfFAvIZ5l2EAPpm7ag?(TEf)F@E^z(mey4Iv4VE}|pLS{0|?loXr+CAun(lsH&Iu*NF(83vct7Y_mq z-as@&V0cufbffcDp+2*XbXyD*(fj5M4`BdMV7u8C~55zK72P4tW9y_P=TS(}j zj($;&N=4yVEd}8eg+w8 zmvyximy309X|IP4ge~8);LY3@r4Zn`nyj3LVxzX+|BabW-DgyDS#t4b;jRN=*8}#S zBRMkk+MKj=D!L#$`rNh|d&;F-brKZ0>+VP7;YZKO+S(RHjX6CS&%GqAYXepckO5lC zleN&8{j@$sr9mb1tc}!%yvr9TkTSmO+bAs z3`jYXZM?12+3zR8VpFw9n88ni1Usmqbznb&zN^Zc@9nzkEPPI=_zoXd zz2@MY?pom?!trk;GvV??!kW=`$FyG?i z;zOCT8Pj&A{yhy@s7T|(Y`lLDbha{XaX8=h411x>3{W!$}psQefq!( zN&?w(dKjVC5Ez$Iw8gHxwk?11;RodO?o1A?mE7=&wyP!^tx!Aeq5a>PCvR(i$*XEb zp6V5vq47xm^?!Z0{OC`=S2m76Ll*O0dD9=hLH@$m+$jIs-*|-_ULVWe?oz8H8V{l~ zR6_C=OIaI_9dxEKJQzDq04T! zsD-$1L4F7fU??JK*@t`w=HnoYpPe2niMEnw2&jjI+BhF|8_s8le}eG`xAtt87^%^E zA_xAjasn{#c5tkYP{}Zy3^Fz{?uD8M^dty-N}=XV}IaGEwyK7pSqVZ>eGgc(7+vqRsmo+ic8%kAx~y z+5Jr%wM!}Wlw%!N99r~;7%mefmKq2?*EMmX9dhJ}zVYAa6VFNgJDv$M088}k{k?!D z|3>ZtNHkvx2APhR)tPs*W-Z;|!GSINea>tyZN^W~@ipF8Dm|G;m{ zJ&*3n+WJU#W?s(M?fT{C-prW)osaCwcmAW_mjCjrpON(w&zJQhSIcDUGC6$7bL91J zyG!nVaK{{WIRV>&<_QFte`luw&_nZOY8fx?>AVB!Z~YmZLHm6yAHVx?`NKbXP_~a; zrrHe)LCcyjdU+udUbj{Y);<5L0YTptre0@~=1K26kkX!)tB!hUXnk|_ss8%_y(OOO zT8|=eSg$q;MT_ds(6^)uaa=?2iNZ!9<$HYqHxXF+U-GjiHtX3QJY}pd8cjkbIf{;$ zv^WyYrrUV?W;Ha4MBg_!W`LaEul_Z(!-WZm?c!9cy zjYTV{d}|NhgAlSI4MAtTJ*aeWgIdG6UdDq{l4k$}dmzq<5*i+}tH=oVnEJL^^Y|Nx zzc~#0XI=lGW%Mv7Fj2|k9%+h5`zsC5cQg{*q{Q8K$arF?{YuBxGOt>uGOLNFb1sLB z9MW0<=Ut|j(tNbv9%%`3t@-KN#5=nrk~(<}0s=RoGt|hp(r2ulpMSL(BNkvn|CPsz zgRnXeMJ9yFbX^`fvn9Xr)_Z7niOBoE1`xaBJ}7Y?QWyVOU*_;vO0bS(He1MSRub)O z$nndbD{uUxC*-ev?{CNlKlOxcuTNxWub2cxc9%s;9?8bqSpN8q$K|hl-*3yC-nA!3 zE_#m4<`a$4FX5Cbz?HUh)E8zZ2`XJKbJwn6DP^)FUlP!-p>3IK>2L5dy}13?-*lVY z_gFCr9rnBy!;P@^HvW!24NLz0XQp*JW(gELg4-LS>v@IX+atj3XWF$7WS^@~P{FzE z_7zu_RUo<-eL_AD02|NJ%b9NZEIQvZCqU00hs|L86O)Oqpt=#5x_^%x@8p%M7p2^@2=-6CDr17tt!-Pm`dcD zki3eiV^8C-H4=VBFqTE4OOUY~%{y&{1E;4<<*`(PoZf?-+^^#RSm(LPTHu~V4f{9< zMM*8Ho*<}N;efd?{(4Q!%UEPS7nyEeDzAIv$L03>&zM6T0Z+_|r6U{O&ylIzbp0_o``A6QHZ4Vw_Ov4B`PoR0U3#N@@Ka0qw%7ie z{KA_*F3XLHY_3mab8Rdo)!xs);dc3s@A(b+&?m=o_~do6yI0Ps$!P17g`9o-9{Ic% zUMg2#yy0`4d!N0}hZvX#GsZ~!M$va>p_OaTDQo-U8Q+KSW4Qf+^YTl-b(^ejUn~oC zCadXV>;ux|w&O?|);~rFkbQd~fu%9hj2y7D@0l#i zYV%5fxVm?EkK4KI3TQEp{!gUs<~~-q%N`CNfMq$wn#2bTnIw+#Ya|xI3saq-*@RTx zXqm!-#c*+(Wvx2wBm%^Qv1-{2IQ4|66PrI!e_Y9N(S89fOoIu#@XPJBaD?g}3aF{; zgW(cUCDn9QTD(A=MLm$(vu8K;-9_qtn|IDuRk9;`lBQZTs~kF!HaO%2FKyfINuXpq zFmQZp4+Ouci>7Nvkk7CxKKe&(;PAB0exZGi-@EUv`$UC2@D1}vKTQdCS|>s_4Y|}C zrYUnM>f=|jmpp7S_h0r8_Q{^7d*(U!JZ}|fCprVG`r?j)qlrlc6n%gsN7gpLGqQV{ zZ%xUoU&z|p<`KE)k^AJ||I+*AhrjD(CLy}hMAz2b-3*(Xe+n;%t-1*?T9J%PIISY?VA%%=(4+A4*0IUQ(?nV2zzm|o> znjSdKreuO4Av-7!`bNGmwOLi__i7ltIldxI8qZ0ZK)TPSz}bJ(WM^7)SF6HJ=COag>?x(aKsYb@L6a%RUe>h?{WhBG%|mFPwC!lxsVq=^SJ!v zk9>pty?^ps^1)BsF2^o?rp)IBWRK0xzkP|!*N@7tzx4t6owvP9W{bJZmlHX5@>w#T zY&l>UX+-7vcqXSFxz%j_Q=*BrK=-18_&v96T zv%R9>)EvS^x-XCb1P9N$&XI{VelLw7CwQtQ5Vs5!3bM!L1V$(tFD8|(wEq&x)b<^g zxZHt><~r`8P1u?oTaCYM0@F5_dcQ75iT;4W*DC7_8SC8)5mP>lcKbI|y?7la#_Aru zZxVVZU1SeWW5pL30T@-yG;BTKw^41S&bh6DTWyM|I@w$8FoBY{Pxk&+rG|CLXDS3r zYm!;nQY%sSrTcr<`%cj01$5wV*yOC}UJi^a(}{~mOY??@N;9gWHOWih_t0JA_9N_x zX2Z9)M8A_E8eL;BnR|PrS>UOHSvb%7d4O37PjU#SPP&^CG_l;K%%>O25C5CD%KPtn zT$z6X0e~dAUp+W@AMIGZUU+WR)ql^b*7=@Q_r-X%g4$eWv$;I~`or>5Kl0V`>X#gr z$M5}!tS!%JU4(Lvs=`NWa{SV(W$VP1a`@y`a`Mt^NwWUWKk+u1 zY+oZXUQ3~j92ZsEWH1d$y-M3n8W!wf8k0WL8CWnWUmG*S;Y`Px`FZ9%DfMhEO#o&( z11a5w4t^t>GPv(CHa8Ks7seOw4kuQpr_hpvCPaQRT2&`cmFXML``$NNTKl8fInUar zMwg6dkFDe-N^LY*s5CB|ovYA6RQxyC*wIQ_ z2>T;fv{N~EP^#{i;<6W{ms+vc6e+-J*UJ7ur*#hL-~l!XaEeF7Xr_i0ElAKYGNo-rOLZmH=(W~(fC z#p>bV_w`-0F6P&ntw-e5}YsBWU-ve-fqzXSbLjmOW8YnzsQ+e<+Xq5M)}e2|5CZ^$a>h- zyHv35-$BHN{jUA&+yVA|v(1+a*(p&U>ud7f+aH$i{zq?=hfklB$>s@}FT8YkbL`?B z0id$jDE5J#$Vf(p^26kWK3ct6oiR}Ul5$zTleUG776V$2vyw8T{T-Szhtri1l;BX$ zDg4mtiL5z;|BbPaD&95ff+S@5W7R;fMiO+CHL1;SP4~u#QOyiddD^uDMF?=o&_Yt2 zVdA!Gg(#l0{Npvpq54CjmBBnMWD8~+vseA-K0s>!R>~eyxp$d3UPxgS(T{Xq>-LqI zXfoMV@9G^u{A}+bV z%YIj?)BE1nw$TT6`k7DH4%%f{G5>TAL!USqyih2f!1_6w6q7i*qtZg`GnT3k zk*ubzEs$U;b`P0xJ5d>#=YE$7fJKs@%I0(`Z+_qX z^4Gurx8$w|wq^6^Wm-zu?lZf2p9;LnE?dRV@>)TP%_qQKYI0PsZUuPlgZkY=w0P;y zKyGdOi{*2WkS8_O@72|WY^K)81l2rQBosQ_P@r90Cn#bo08m3?z#D?bbTpKs0j;4^ z63R5HdlcFFQhkyfUjKCO|AM4c-gklFRH3=+M81) zqsWOTyXGJVV8$-3$GtT%O)qxqc4_&Kz0Rd2&4l^Td_hb6*#`~YCB83xbtJl1)*Ylhkn3Wmw* zDsxS{m-=$2Cyinsk@`8{yUc6vX+GQcD$Q)UriSiB8sCGPmkxL_9e^@v!MQxrR0yI~ zv`!l9zPFU^V>ieL?-h0#cn|b&5?<21fpO^acC&TPJ&*V^h?}@&~ zhgROX6xUHAx>(BBzT!Ih*&qD|`SV|KxlGP~N)|hhxgQSBU|}|=WOI41{Lf!~o&4h{91L%0cebBDg%z$$y2JO__j4J`Lr=`*Cw}?;@}1xJ+wz&mFOkh7 zSIW+wQTdGUiYoP?0pnFO?N~B=V;kvctcA>&mV^I}i#8cr-&_}Dv2N$3THj7Ij;+ap zX{VRS9#HCEMdL zZ>FW)T~zY<;5_TAT0+bzA|ts#>i-C-x%&|1W5%YccaZ<^9L6Au?qA=i!CQMdfJl!X zh~@(sZGo8DQ?ZJ8^F4!OsP5_itg}GWNoD|;&f0gN|F{P|SkWH^a2~FQws5d(69vo) z+(O%D*uC=mwz$Q9(q;er_Blba)Se)sR%Le?SwGlF0$Yy`d%A%E`{W{Tul>}d7s_ZW zDAaqvod|^&wUMK~{`6-8%r<$h`sdLBM%%%Z7t+#5XT)s1fg0_HM>Z@*V|5Zcdg2=S z@EvF5ZSVQGtv7`@UO3lI=L|ZjgJ!hV@b0Nzyn(VRVbOkEfAN<5tH1jN@{eEp`LZ#3 zTo!w~)|Z7xTJ1d~Kk(h3FaP{|zCf0$ODC5pjSui}H zIkOXG=xYz(*BXsPy7fcVC%UQa!0GOE)5B1|d7PMoAv04e&DQf$Gh*AL=5#rlm^2*f z#;WJQyZ`~}U6xnb^9!5>vd0gMr|r9UMpL$??~gf?Mnnh|rh#e0Bvm@+#fL~$pH^PW z=6ETS=|oPSepqgP)@AZ7U;8qB9VFaH!qqs*KG~~X`Gd69*)2VYAx}p`JZ#WTzb*PG8&aAg^7jxxm1@-oOwl`&}3i$l6z=9Fux?_2Tu(!9|>3N z5jRgOG$yIK--Omq4m;k3Q&Oc)*HtFKq5aZ2c=dTzWn5G;O+PgK%mYppqfBB&=aLBbNvrvNG9K8W>J6NWP^;)$ zNxI9}hTff!cu3W+a(LIg5GgLHJ@{9s+e8AhZXau{i+x`bnz${`)0Q@tl>>~W>35G- z1pBF0n-4v2_h({|`tx>{_Ptm$(&u@9z^ffQd-xxyFJz)YdjSvz-qyVG45$oi9Fn_`Obdn`0=HMbEl4^inMOb5UE z*6!fz*()U;@M)W(T<6rRkrrw+lHHv>bp$Nb+>WBrv9+m7c%_6cqA$rrz&oh@??U?d zw3vac6&X*)I)+!j^jY%a=U*k~&OI*EHMHvq*Wkqu6?se+(b>9ll`;vx&%>cPBgORm zhtO+6D6|6QzmSmI+%g9qp=94R&OA3L3fFg+glYGiRi9m70l4qU#XZVPaHk z7-~R)=j(Z34MhD;+8QxryNd~WW_inD zXw_cLaHzf^^_c+BSCf1)ffsljGy&DKq|w8rnFEypxMR{}DSJDo7h->kjv*xCBGy*nLW|UqpN+j@DrEriUc^Gj$}Hu7%HQa zUAtvwYkc~ygKAk?Z5B}zDG7?d?#rGnYx1CsMl<8#&|EZ8M*x@=&?m+MyEu~9n0?<( zJl>Ad^~O8DK0okF@jb|>S9sj#kU-n>#v;1&Q3}BY~O-m z50>Gk3lb{Z)$tB1UPIAXV0z($V*ivqR)u@310HPiJ^epGYTu>*3!bG;w;fOb8~)g! zt}<7XtHZR(tAldk>?7dfur>o87!AY#FJ8>6%EpPfO^&$Rcb~2IaEaA<6hOwv4SGDrZ#~KJxn>cuuIe8C{g57P~wke zDRVcs0EiYuSnNqF>xF^Hk%Y_nlUZu3>RAs;y{!$uC;qf5z|qIp+Rv-(@;$lwQo^=9 z>lF|iNvaFB_&t5ZGsiGw0;qvX&W)+XGlY!oo9tu2_nzNErMTlREST~5p57P;AyteF%zkqL_Zz;8*_ z#!ehv^3^pc{sdZB$NS(F{GQC!`m|iov;JS%6PKSnA}@H(b#ng9snD8Q%Jw>+h&uCD zzDM8zoD&9#dwl(|KQ!*$=f=mc|3Sm)6<(DG+u(YWzTq0w+)3PEKODG0GhNo#gxOk+ zZ>oHr9UH%@{!6JE@O(tR#G2X~7|a=~X(e^`25J`WZwCPy&W2(3D1Fr&%)WoTwg|Me zMmx)YnD;gTnJ3V5u<9N^U1>`PPe=niEm0{=Ayn}|I{0buCl7TKBN~T5iK*uktcn=W z0>OF9)7C=rwLUe4h|mY(YrSkD4zCk2NA|kel*siEc%F>hHt{Qx9QBi&Y8!SKvGpGr z8R^bg10GJsnu+*!X^F!CtES`!eu7 zIoYSH?ZMdia!De2ATcILelR)N9M^MTZP+jxf>WYuGPPIrT%@(0gV4dbj=NaC>j^dF zcQktg=PtAey$sXBQe)k$)~|h|OfNGEw(zlIzVNY?$LI5zY;T;C=ihX=p7(vvL|-3Q z-PKlldpfR!*z?gy-tpmwb(5ANp z)j65e6bYqKcU*Qtri`Z~^cs)k4?pst{I}n_RsQ6*N9=sGpv?Pl(An)?wCSrWjT&WN z7Vt40iQM$86S7$DP-KejTV4v=6O@LU-lTI@7}wnUtjXxokuL1*9u~_wqtpu6`uB-S zX|d^{T}(?yz5qDOFln>>KFrz8Y_mCtGmkpcwc$hL*XSCO#*dyzdGDIvYVN#~K+?oFQkkSqdzr83;U) z0@ft|y~R>~=->UG{L*iHL?)A?vL3CObZvsY}V`4-Lcy2ql@!J@jsred0I4$X(b^KIFZ`7QdvOj?JBb3{D z8R`l|zW+$U-__>ed~!4bFpkm#rwuxvp02n!p<3cXl=&o;U$LPZfglfT6TyiH!lTz2 z&OD%3g_=+T)g+SqoL0z&pz4m&c1fcN>BPS8NFtP=AuNGm4@dF^a|}t-KuRn?nSFv_ z7Iwk3QW#J*8FmjdS2L09f6!`TjDF?ZuuUfsEuJRHi?c5x6}M%o@a1wZdSs3|poq|_ zXIEcPhhwg~Z9zqq0Hu}0b58qJ>#ImzY7F{Ro&7`T$h2t+Y3>ix1Jr-bds4lYYI9cA z>Nm+jbMIkKMj{ZZD?poF-%q7@SF^i1Y9@RF8pp&g!^57Lrx%v0V5^N6_k+4b)QQ{P z%Ad2nnVdXwNDd#`&hV`UgjAZqry&&ZX}Nq&3xWOc9rwvk|Kj^(wt16`k33hF+s~69 z|F0jEpLyMfG_&EJCw~E%PzN?mgd{RqF6D{SXXNqIyE2`whm<&(uFI)23wh$qp3^56 zoJM8#OPb(?%$7?zKVRxQe)5<8ME>J{zgdOG_!OA*daKmuBYAUCGNrJ^)Nt1p8-dGE2+n-q2O4QKs=rozz>Rg zZ{h{z3AdT>Drekwza0|4XC#8XKZPzkEEr-qDRHm?;1sY&QDJ)Cfj&l$iHnJ5n{zSj zkr^TgcJ#Sk$V!r;&DE;PTQ#~dSu6&aBW?Xy?3DQHxl0WKUq#he$+Jz$)*(iD(2K`1 z#F(MBO2!CV6l*#_coGpOKRW=qDsM1~FMNjmLm~Fc7o5OUsk$d^3>?X$tFt zf>=arF$z$>=$?LrY$D!v0ndwF+1y-{_4PHCo{BlG)EPh+V6NFQIWVlHG;KPH}lCIeyB>CWUs5E>~HC^yI>;c9x?tamj-yuEp;&l3dU#8=Hzu-J6aZj6 z0E`cI`{Dx@JR^8*4LX5z?O)Gp0ZW@RJ$o?17cpcd&Lz}#) zfdEf|^SFtd@Io`@w7r~L*yclkP4@&DD?ljYN*F_(A#DXXt$mrA8`5;RX}sf14~>H% z1oC&X{%Fyk#ln>Pr9WZnHjft7!-N|^f}gHCfS=Z zl~7~YcQj=t2zz_8gM|9L`n@1i%EfEG-+%yC#q-tgOU!nc{H#@tqYtJ|-LG;P4~RS1 zl}z`OXuHg^%RKwQNB^^Ve|t}>TF=kAGsY4_OMG}Apy1MeSmdB!rLT|sv|RsADiYR$ z3<1}{)?8cAVoyj4kp2TU)XBXDa;h^>qEDMX!Zuhpn!o@=C29ch@j$Yqr~$&u%LmB+ z)(2gk3%`>h?H2ta*(4)etVdG4Fb4Ifae)XY0KfY3qjG3#EIa4V=$@GG7192%oF82w z-}}$rB0u>*J}i%&U&z{YEL;BHWHOeA&&=eX|IGX3zx?+*WaG$HGIz)3((rt~l#N4I z$S?ioC*)uJ{DyH&5;AKhO4+oz?aAkrq5^CE8G}2S4n#1MMW2IU`EZ$)`^nv;Bac zvOUFhct|uOdwE*L0HfZ{t;)G%X^@|&46=7&u-MD}a*7@LhK zF|_#L zfyuYi0f?H}yu0fBbk-QMmnK+%;~ebcV6cS=tYTINwWVK(?LYgLAfO$?K{OEUJ6dU` zWytOQnAd*lh&4BBUZm`FdteKe_Ul{co&d7x&D=jo-z~Hi^;g2lw(sj~kS$>90u`Dc zpMy$+1aJZ3gkoKq#K%07?VYZk3{#YYHQ1_=fs@aaKEEdCcXwoOUL?e#0@uQ$-dFUe z1-t*hxmeo5RT%XPZn{Fg?#pkH|N9qjmE#vbS9XhpJ`hBbkr3WV~^W{Mb)_NPhb*x5=ws z@(j7*x+6Ltci+1sZ+`p7<$WJ{Sk@0+Bjf3|`T`WQ%w)2ZGmm~+zUAw0mYZ+5)XsWS zILLUwXwd%O59C`7S^t{kenU|>tRF;ChnAE>resG99{{(58-sI(2WuO$+v;)gy0m20 z48~17!QGpj6V>U1V=@YJ_Zw9 z^c)7ir~M-8dh`%|NdBxg=I?l}=qY04eNwbBD4xUUV|r5__&NylUMbyH-zA}`8Rjta z?w6wLL_@2X>p{&HY+9)So_%IgfdSa6zwXS_M>JQBrTq*{8-%OsThCYmAY&^OLI|_D z7n@NUu#W>r*Brx##^3JwF_f{F;#_JvV@O1M&VMyCq3^wN?#aAEEARg^0&V2bLB&~-YtLdfltWMi*Ase-BRsv zBID^H**Jcqy!Ycz$RB?2BeFIvD*loJcr06+$7K7&wXz(oX%s=BY3gZ>(8^*m9dF6j z@n_4&?tWbU_EuVAKy8JKS_IY}L z;cJ}r4eIH>Deco#(v0LhbiT3uQa?75o%0LX-6{JLMd2NEQmAU0qWWn8k^q?_WjZt( zGl#c)W>(aD7p9Uoke(8@9b)^gq+#a%SAs_)oi8=gf{qnuVszePCCDkKe}HDD0nM3% zpu|(`dkmlefF@|4@?YnJZZ;TEVIWLZtEu3z7$|U|+UFIe&+$wpo|hUAu$idhuCinD zu*`NcE{A_?mXu6VLMdY%VYF)Dbco^(*WQ|CV&Sl-->Vc`dHN-ANQdkgFg$K?kURGG zP^TmqNqWhEfs&t4UVj}^39$}aeTG>WLM!j|$jUYhtd}8joP1r#Ci_1my<#pQ?bYw; zV^V#eKUKAB-}C)V=2&H5hp}y+`#A&%hWb7X5J23!Ho}@{#W#aYzSTlheR2X3;e8PvdfNkGiYC#>U^;tP&>t8w9v-wgk zJG?Ic?EAk`{`&X)irjwpopR*lb+S9N-1y7IL=GLjSdJXK#MZY6Oyf0K%*(ST85Ygl zbh?mpPdut~cj(APGE)usSZ2$0SwDQSY#lx+GT&2rSM&wNcD|U;WIig6&?3{xQcgX5 zmptprrTp{1|J8EUvCSwOj5*AS&9NWs+#p^YVWwc{c*wOj`k*`WjYjh5W2fZo&Qd08 zYw=~+psTX2Sx6`59Q%>`;%5RJHnc=w&aPchnVW<{%Ri7bZ&AVuL(Sbr)sVzo&B4gj z;}yLJn@#4gvlUTQ&hx@CG0oSeZnw`=OXIN$#sbp>U~Okb9CgxmKBn(-fMF4d$xjg` z9Q33CviQs14Q)yh@;!$@o@)JN9QFsY7pOhV6SF|tjECUb*dg|q_ErM!LEM1YROA3$ zSHBJ4lbRrhn*`aHf<8Y{oQJtE517zIOr?p(|un}e88LzHc`xETO!t~IV*x+!wWxr zG>59eD)Y*D{Nd5utt`0e>fY-t9{ZSG3*hZf6}cipqXEtwF0}u2u}=!Abt9E`b}hoy zFdyE>IC(lG{GL3u;2=w_cT}`|8uoRekK-Z#@C< zfn-r!7#6doJp1y)@~?mJYvtyvcjfW>Z<&`g5m)E@Xu$+4EqcWPGk?C62_1G(bp*$-i4IP{<=bB1+O*?R2o_O$f z`Rr$i{Oce3YI*K;NAw<(g2{hG|FyXC8fXvCQLQabbo4{)gq%`Gri^HyGJk z?E?q0k%I(ZM^GyM#=kvr_W?k=0Nd2*xsz~imX$*vp_Vo?Y4yE$B!_7)0Q%z?BFeA4 zpS{rA0|AYiZg%dgwG%F~?zCtlMKn1wL1H_$wR1H3|*k9nPctFEz)o zV5u4aOkS0i6}I$5L@M*M+OJZl1pkikXO?<2DHP>7=F+sWUlnR#8XZw_DSm#{E49MoFUs>V=BUb(5c?XGmz zug&3c4EC?tJ4Prhj{?AO|u&LJb+xDxnPge6$i5uYooy0B^?t%%Yl;UyIEgk2zxIvKk?;PF&y~q^EdTe_ z6ZyH^$*+Y_FY?zxqwjm%sg&Um{l? zpKA5MjVb(ks8+rIgJJMq;JN4nL-}h0f_~7HDE8J*J|X9KN3t<48UTuhDgP7=v8K=k z=u1HmT4T-9TC(8z8H#%plY7t~iUGOy$QT&)#Uo~5!cq{8p!$#>nP6u>3uD98BcxyE-+8qh`4yx}Z6p-2rMm@iED zZqD#=BeZcE#3MmO*a?|A+h1;{h&5021HfSYVAO&XuDKCvWLM+DunXy51vxmX3ok~u zZIr{}nG^w(auHKKmOdW5@IF~_Qi8I@_aN8yhMdHR(?+I29#;KJ=SupMW)lV(xyfo` zl!(wboD(felgUUvNOn)kVBC>w3j)rb265kkMBtiHuDT%c+VIE((=e~0wtLMeNJ=w6 z>?}t&I*>NBY@XDWVYjbiaeGHiYC>MiV7!nLP_{G7T?~9I5r_R%))MJLGZ%oG1y-0k z7-%uD3>9i90e!%v1Pd_Vs%Wbfuzp3?k?#Xb6TsbmRawgCZ*BXSyz6~;%V!?mlj}~b zRnA=17|={|vJ1MHxv$!@eISy)tUd=|QV=j6$?j|^*Iv9SKl1%wB47T+&z7J2)ep-D zKXR`;c4{f-7Nv-douf4w%XB)DBZov@`uUg0U;2j6l`r_LtNe^D;n()pe5EoDvjlkEwb zxpYKh(`L^#JU>kJ`oAvUmgGlIoZpl8e&`;VtRGf?kW9*kczDk)qdp1g)ModYkW_M| zq+@F(4F&zm_kzjdjug}ws~fL~Pl?CSXI=Tju1K=QfW(vjD5ETlhWZtL2o9J%WU!R? z&PHnHjlIqz%#rj1*!<3UF6aZlCb@qKuaU*8<^n;3NGhI!2$=1{Ll2T<1nZj=)l^6= z+3DyB#S+KjvJ?`MMaB{v(F4FhXrCh`Ri%`qB)P5@7Lf-udP*LbAfXr|%u@Op>^3F4 z9x?q~S7VQ6D}jxF;TjB*oZK;lr7}#Z_pWonlv3w-E#pzg0-qnS;(CV$&81C%g+v|) zL$lb(g(xu>O9H7TAC&!d&s>#U&?FIwKB<@gPIS%8q|6Q4p>RJM5)g8vy{D#Y^G9lY zg4i{ZOpp>Rr{8af6SiiPOd#HW^OPON>2`7ix1 z>-H5dy-vRHCD+NFcb}J!-g>8e`rZfR^w~YN$)7l~DVJSxQf_|M)pGN7hg5G@63IXv zK3gp0b8fs$|NG)o=w_MCi^@OEuw%`4 zke7v?5vZzQu>Fn9tx$(6ACE57jO3UAuHtK)X3{uec7_B`>Tx}%0Sv59 z*gi(1ZG=;v6jd8L=S-w;hqBniE#s1}P`Cs5hGYpC3}MnAj+Lo>9SuP>QaS}h0Afyn zBOOA#9m|WDd&PYNg835=(1nZD_D~K+W~Amp*an!jvo^LzALN`rlj-_8htklbh96$&b zG2uksBq898XS9Aoe(~3Dldt^3XUk7XUI2}J+(Hma=456LN;U~&%I_-Zn@?r5xHsbeabYc-fHn1un;Vf z8!p|H8!j!SlC4~Fd(CzivL_2!GvDI?&a7n$K@C~zdO-ZjISFGF?9I;9=-gu!O0l&v zl-IrK6Y|8lLvna?UFOBvF?kMUHgutYzaGs!w51SA8WX@Qf_krHy!U!0JF(1NHjFK{qWRpg^8W3h1j zJ4>_B7=X#Ugs)Ca{K_bhVEt)35gVx5%Gh9uLoJ>YlA_-g$x6~e!@!L#F;EoBGGYjj zfO8#cg2MLy{G1lZ7c_wab`S^m(kTl6UKxN zxV9reTyUH)FT@z|9H%4outm^^;vlzm1X!&{m$uFgRHd9hNk`I3RwEWhaJ|WZ1 zi)B7HMyCHQwZ>t9k2vC`nR!W>oK*mApOCQSZ`Ta6P2ZbE31Cof2(!_bG|E_~KJjJc zwZJ=2aSkOOoIb#LZn01RXxVS=Miljd83yOt)y~HJHCtgKrJ!TsJ5{Ilji{U)VvdEt zxz2NyRL#z5Z8uRAgEZC{sm99JuIv%}tX8)gp3YD}ocHKU zwCn3m-AMbX=fY4yU?j8oM7EDzCI9t*d{|!p?z?3=9(!(ejEBcZ;JEWi{rPI3JuL0F z|5fAZ4G|nQrl0}=V8SUX@v&y_E4Fd{Z&IqTAq%6K!nm)k08pN>=L@s9pVo%hSw;|$ zt9mO_Befml2~*%f_kGt~8CpCyDU@KDz2#C$N~izyOCONCA6&}%)-hB6D`Q7KeA9LW z&5!eEn&navF*Q9jAAWwY&osR}pL;R~;jFL*QSmm@GSsAqSaISfIeVS+H42_a%sMxC zT&9ij`BCjyr7UuR)f@w&c~8CrXTs<^g{)UV)=Ib3^sUzLyM~E37|jg|;gSQgwXe0j ztMv|DNvH^+UUG@wW;P2Rv=d^?*f&i`%q&SJp)a=P$Tz??9PNb_?qO7*v5-D;i`B#i zLXrbg8ERiF-~vI5+M>fDtEHUg3SMGg_v)8&kdg7sq;B^Q2u71*$;E4l6hh2slf|Au zZf6h~c-`klC+rccW%$T9F;qj?BmOQc2b}M;jC9?^D>~AmLJI;&03p)6jdBi>`EydWnQDBJc>qgYcDXm>^li5WG6NNnHsFo z0N`QJ5~}=W>_bw5~VQC25eA_Qui36eb|3N@nch>}AzbIbOe`mUrL zxQr@HRdYkk2rGzWEU^(PwTK@Z-+1*Q?7LDt1jqp+?dG8GYp0doy5HB@fb4$@K>{4b zIKbf82ZekHz=I-y!yaTO!`k}5qEfd9-HW_+!H8+RoR!kRVU7X&tYR>bN`iTMfBlRA zlmdq5(vl~&18uvdwr|#`oF^yu9L#c|`SN`Yc5SpE&q)vp{Oexc=I`Qda&Gb%lL4BL zI%F*K`I@Y6T`KpTIxesM;Wx>a$28Cq+P?dS zGzpakj{1kCiWLMUrheu7^FF(r;ju)#;@s{FSO&fx1WwI=A;h_!qX_wvsmPs=%;ZOY z{14^);<(6kOO|uXlW)T|Q>sIj%EMiSLxknI#2jY8h@L4Xgr-wiZx3@r|MG}~DLdeH zz|NY~&@}YTNt~}y+y@($?h$P_2|NpoMe0^Q1dRje8iX^|bdV!%fU(p{0O;vX=>v)J zOJUnEzvqf&lmg&3u`_@qY*3wl2vt^?%O=Lt#q(AUrcav{|LYz$ILv{dq{N!}qtKWT z)q!+WJDZ@QQZQKexk9>9maf@^5L+ZVo#+s=0-_u?_1NyjVB$0r(n7+G$mo<#JOReM z-%$dx=b+XEF3kqK+9`2nMX7c}G(w(#V*mzeL9uQ?-q}MsxwS02*8htN>TJObTHTQ1zgb>;xx{0aV-X`gc=JvJV9V zJtt~gZ>c_4 z%n*;CU&{aSBX5?E-8q*-M=n*{zwV9L-xO*~VAR_4J=RvT4jQ^Jb4q}Lbm+F66y1JT zLL&h)7930}NB^45r93)yxg!#KLl~|ATLR}Gkzppbd>!Zx1TUDfz(d`LvHbly4J9< zq(s2pPkpSh{e+1MOX>*m)}= zY30==wlV5R$J>Otu=+jIK^os~iKjnkmY|$}^sHu#)gV{*x>wbl<5fxAK}41QGgP?^ zagMOV2A~9xr85MA;QuYHhG)!Uec|Nu4A#Uk_GCni5P{PzO<53CTA&PtVG2a)vm^#a z!_#*q!9|7_84>q+l9BA~iL4#ELLNMOg}nBky;c7ApLo06e$OfO6)Lvl83Dv5)+sBkn-q2jufIMf)Nma?x>ieiT*x|br%xYwq zYH*@NFhjE{A@+WbHhm}(B#Wa|1L{s4;W)>HlK4s-h2oC}py8$ra{a|y9oQ7cZ-O3C ziR6<+uWA#DWoXQEg)_)zUaYs91OtR(uS2uj6;P)YYIBE2EJJyv0XWZztXdPBcI?|w zXSk`*en;J8wCs$WvN}aJG)K5*xyXV$hGu{~w+c%!*cciVew(+`b>#-?g_s0=Ih zCilM@P2T@eAz3nlyCU*=g145aUw<$iiz0F*1y&aRL#VyOn>{-muTDR`@7xY zDT(3gOOL*)Z&ouz@ubtJRb%M1868Tor8QX`WW4pg7QHc@jO4*nbNSwX@h180-@9Lq zUv#tVEGE9@g#fxEF{>nLh9FEBV+8YL4&*aP&bImtXo8y3y^TJ zfaamAXjdm8-N+ehXw&N`rPP436pVOBH#<3hQ4_@Xc!bLr{5u9k+n7VZ!rNO9KdV;ygdm}g(X zw1FCevCRT@%ao`%50&4MR@b~I%?_W4%{pz4MoJ8^_MFWukwTzw^3L)%rfLY=RZ(rk z=+mKK6Gv&^L>d}(E_l-TVPYJ=QMg}Z^rIP#h>M5_16;xf-t&nA884cldoxmL`WzM$ ziYGOR@}a)z%}(d)vS7r_)cs7beWd0h&D9>djN6Yy6!2`W2)Wyv$pl~yp-__-Vt^1- z#16Z|B-DPPq2gKt%bsK>J~j$X46 z{psfpdxQ~PJI~A@n?1&R2|z?ok?(=Bzs8|>Da@52|0&UVcSDfQBQ@J_nnJ5^rc@U`)j>R^EThWQZO2IA$f@D; zFk_P@y`i+e@6)!AISXxb)avnMYf-V+)7!gQGH9#H%jt-SWKqe7^(!YpE=fn%d}G&y z8V*6E<{;-lI1C2jGnSOkIXfN=5?7wtG#CR*_iXRk;s6{QPtR_GX z)YF~)-`l6I+I%$);fC9nWUp=6!3k(s#Jg|^Gro-W6pcNIOZA>y)3m{M2|zWr2!}~v zXn&^T9i9PD#O1N@>lZaWRf&)5SjUBUSW?`)SL!LuFP zu&X)PO{YI(@r&6B5C3NIIbS+nL8{<9e>F(XenBc+Xpa5K`UyF5(T#FyafSTO@7*pB zKm0@xw4Cym+xM&dt$VG?y)Qq)!I)xu)gDU_ILL>i@$TVn^iP{r3;cU-{pDN8Wp@$dQY0lG$QImX^`YZP*z*nr2XHvr{~Z z={~fm`J4f&6bvz@2pbGvJz|IetHgxEKa0lC^OF21eaeJsTw5#7U&izV`B#wg+TGcz zbLhv7AO`Qpx=%@^YKm?1$N-wp6Z*_^2)f06M`v)B5>>}pFV!Zqb9H9}{l{5U5g-Vg zDjx`EpEt(dACNdCcF(-Rbu zAlr3eVyJ*ePgm;8w?k7@LKm3Qy?fE+AbiHqbM|9L5Eh8lp)fRzE5=hkh(b5nqgX9U zx7Bf+qp7V4Tpz-2)+Iiw%|u{ft!kS0y8RA^(e&-W0Uq`2AH1~ITI4wE&UuzZ1|ZJ- z6DYD>E5Z(9uSRA&a=5g$$odi4dY1nTmA*r8`TC(|Oiq_pb z00B6Mp~~-o0@LQy`=IS-ia4?MU;{);wQVhUgq|^fv%j$xpqXV&ObN^P8+a+5wqiio zMv;XmRXZSr!E;>ASL`rI76GCd{bdM9lql#*ON>Z;i)2GE0rayYj5~%(Yi#nfbt9$a zP^ZQs6c5x)xB%4&4v(czZNl%AA2d=B6M;S_Bifk3;4x<)#JH&mmBa?h5v5JS<|!qU z{2Pm(VT+~mAt5KfrF6{W|f9uu9L|qF^eK6=qu)}0S6Ux z@2){DL55>WLkQ~(iS}%t!(-(0v`<_Oj=3%WZygk^e<*zXDvTjipyx z;0MjlJ3uEk45B~G52|c9v`}gil*B_1pPR|A{_aQQ*WYrFyzir@WIjG2TPLoS`C_73 z34_;!nSyA9(jd@TqESv~)5j_&Q13w2Hh|aAl9?tV_a}f<&KGh~pk%H(!T})^8B@)j z%rOY8klK-j1)(ETt`H1CclGz;b71dRXLZk$0GbRSW`CO5HE2G-F?<&2zC1#dV*($7 zUPL=iGb>=?efE3o`{aEQ9vS_h9q3b|0DuoxsG;G2^9+?#(0^_&Ik4=QmAzm4dP1=r!UudY4R_UPS4g0M+UGuJp$+0_a4( zl88%~;EtR;enhr5HzJ=rYn;ekBlg*TcKub?lhFj!J?;u6S?9wYH^BfKnh|3{dp(l< z(C6tpRKpPaYf;lb2uARc@f}n={7W*Xci;Ai{No>ctGxfVb23`LNH&fgc65vG~kO97l(q8}1>vm4V(r#34@CwR}( z7*o+iLu{e|0`!8x=a&IOQh#R~K&1d0a}C}r+^9BCnB@Y|dw~=VZDi@pr4oQf^pzDT z)^(3|QMzAmf)=Rsf0Jh#=L(%HKjyO?x%i@!vN1JNNY{Lm1hr2xUZwWu`~EbpWa`Kd z>4jp@;kf*J+D8FK2Ly|{?=^kOh4Rdlbc+d~DNvPPOL>8khIwN$me;@Q0r~#_>-F;B zsgrW(#0@f&sqATGKc_xA&xKjwU2xD&0RXfSTNQvGk}3pVV~n{M0!Vtk35>UxBMMW> zxuA36V>OUqXB?UBketfi>pA+{vkJekknXe4-xB95rZmfD)>`up7mUJqtR)73ujZoV z5zND4;p+L-H7JYbT4!yEO)Rk+Xl}#*i=*OPg?b;*^4Wt^3Eh&w)Pc;{+c5E*|TCmK=rlE*4L>dS@m(Ze}TO6M3H_|D`e4<9T zXT%D|%Y=qNM63zcePrcagZWf8cg&;DD01nC&6MzRvIk6vYlP}?S+h+UWFTkt3!tor zxP#JS*JHt%&fCVBV0!Fxm>$;aUvb&!h;^=HW#brsC;V4Hrk1|gOvTr&uHdj>1%KM z0EA={X8|kyGB9)LylQn7YONId5>pViwsynR&OW9-&zjzAXspztAC;Yg4BV@q&r?X=tst=M+N5i3F=;h;|AZD9x_J)U#Vsue zZyY*-K*1Ef(k#MGc`iA4Mt}FPJxhf`X?(>gpqnDGZc*yjwZf^P_C6qSk$+b?iTikS zed{ZI-JGs9TL*lvm_Li~qNRhO{Y#>nxpfrCr+<)+!37ITuIIW`ReBc_0rhG$k|`#l zsEq(>K$XArr9OKTwf|KxB8gxSo0Luvs*xMqnJ9}Zo(v)F6DeV{15*%uC$yM=*o07L zdpxM^3oot`sFdws{#)v$8X&+b7T;vZnirJPk<<#CT^|9e01a;vLd#nG0ofBBh=pXT z;fP4u6A$Hfw*Xcm3gkEw`2!f3)n_XEj^>@YH2tly5H^<$q^Rz~2G$UIF#SaZaCizb znUZQ@+*v5J2q87l;jjA7;IL=_a?6gWG;i*oCb}X_MeupB^qy&j&v~twG6=jL9+Psy zVb)c`P?{JGawhNNRAyf!jF?Z$M^Tw-V&8z^)}WdBW9+ly2<4$A;jBbjp#&c|w@Ioo zUsXlMq^{L|4wWqL>ArnVdj|v;s$WyqEM#qcAs3(A$TbCEk2f;Vs)=&@^H1+Gds;9D z?<@c&RQ#qjY{5^i8&i*%b2^880@(m%SAK3q$O*!KXGjzp&tuRnI!-b=2 zlqB|H4Qg7SjY_z7o>RUqXWya)IHQ}NZHlzf`EnDm(M!(32Y;u~TZ{BJUoOr;p-B!nvvQvwFA#*Iy)w3jzt zzZ{t_V5z^(rd9QmB&zWGW^D~Oy^n7|J1>0c#y~ZO>f94Zzzpezh8o8{uL0)@;sMlo z08@rda@ozWusIdbvMvbUVN3Vc#Y)vQ_N9fUWT!>I4$FoWSa?vDd${TgOR*36Mwo)V%} zvyE(nXjlEU<|^zJr&Kr&^L$p*28|;Dj1Z_QEkn~M&o~OF>2%!nwo#UZG--)ty3{GS zN@zuseuQA=?AG%75w8QIH#XKSPFeY)63`FW7 zNM<2@*6vW14Z@sJ5CWDWWUcz)XO>m5hK`ZC8e2&%Y##G)3&|LBAUjU~$S&>~O^}OC z5dZ+Sn6Jp>R7*One#B?p@4ZhQ@&Kx}K=!ZJ;gy)5Ru2N-8yte|T#+y7(#vn*y z+nz-tP;LQ|dZSy4!jaXkT^riyn8V12PiVOO%pq`NZ6f!dp36`D+`HsI z{^AE^N3M{=7hfd1b2B%Ek5D+TrhtH*g%q>Mhk}9WHXlz?Lj}_zkC(tuO$YS^kPlXq zvjd@m{vtb%8FR1IC6^1WQ-B0*mN2N;>XUw?FEh_uGR=T+OOFbG?+yt%_&A0hd(vkp z%mY3y26Szbp2ok!BItZARik7kjS4_R7;@!A0vYlL@-<+84}D#`w?gaS;|oCUsesk# zAWAQS`H#BxnXnmRN^6Yn)9Uz)h#0R!vw5rSth4Uvak$YBi<`p=lR~0e;+;WkQ0sfNw3N}wH1Y@qeZUUJs90UzOZ2m??t0Zu zNO5`5oWKGx)7a}lK2l9ysp0%^VU1K%N*brwPo97zEL{!@u)a{8Rt%(J!1ckaZiCbT zd!P=@Q?>TZ835SG3U<_U z5E>|hSwFzt?|>cb%69v{bL~`wF;@exeouR_|4rJ?pgGm}syC&xSEm!WzuQ3#?OIxF z|4c+)|L#xAkNx|1$h$sxRt}$drfg0Rt2sbxX0Q)Xb;jMB9fF{Hw^yefX0;wVj`5pZ zRnt(L*BYRkuNm{0Zk+_|7u|J8Fa<`aPI?pTiWcQb8o_0zQ#b%O=}Y-%7iu!FPXpG7 z!EqyoIAE#;r~q0Fy5RxsCI|H!D*qKC;Ay!n4Gx7HR_oo^A^iQy(3|B5v%20g>iw?F zhUEc3h9Q@7$BSY+v_`W8qD%h4FB4|yGmiW?QGu4x^(<#$zgTu9xMCNzemJR$Pzc!7 zxoueNA)$d_vE34c+VGJrUY!Ui=0rDQ%NPl6klvp+alHLNCV&<9REuM3A1g6Q?^VQ$ zoYSK?Ai-eRGo4~-)8Bx1bz@8Q{$VXrol{hV_MM?&4|xejkxqRfCGgf%k8)GzM~-dG zMpU3P>7kv5)~Sm@nC&O*0amOf+Q{cut;Y~*@_oWN{aYZ2X+{)G6#A&g5M_9EO*0j0 zbuRTbPt7}_tY(e-O!#^_B}Tba{S(rUf=73^LZ4j9(cJ&6p#ov0A~v=s(k>AD1P0h} zH`y=r&gVW75Sd6&-X9@cdiPuwi(R?sgvjxu(3&Jbz*H3VFXw8jrE2&T(Yy~{0CH6K z!OsthR+SIt9%~Kc8DQS&PMr`e6UTJl2H-?v3ey^ac(PTqB;1gO&aN$CeehN<=kqTH3UC zSsV=|d@~_N0ETLB#Hz-)Vr1ov#Q8`X5ZUZT{D{5F;-NC?A>7vVTzZa+NY({9=iFfl zrvjJ2eQnev$^J5arfiOC{B7U_K}Jb$ZTnk?wF_bEGxK<8Ldu;bi4kZEN-`@=$mqKe zKiFp-f51<{7A-|XZ_f%S<-CV4)KURJeX;7mHer7NTcz$MX(v9Z4r%>)rRMOTK>Y@A zKqw6Ph4dSHg`7{qro-YUsbl>yB%tbCjWkuO>@m|R2Sy?Z0zs{W$;`F$+Il*ACN}FN zvMRJ@uL*jhAriOy9HaUiQDQm+Rr9Rpt)r zA4_;PG?!xIoPbN(+q?5${~Zp_fuO^wq~Wv#gvc)1s?VVf>z&WQq5do}^kl@u0HRHD z)N7?Disi>TfuTqAZtynJj`%s~Fvc+PvGZcRKl^<|`tAJf{W#abI6`{D+W23KnOt^q zDu+B_T@%ISYg?~DpUJI0#?7IwdmHbMy*C=kLudCi3C@Y5YqI5gbGMknmLr*HNL%*V zRH)cPcz>$FlV+v%lqGHEfM5|L(rmPwpCc?t1I&yaYpt5- zRJ4&_eRttcnEk#3P z_aa0lsBEwo2!H^`z*$YP>?Fyl>~*;|;2XIp{vo@J6%|&oJ?nrtY$XQVUTtQ#cwJgu zdkSxGd$|FUaG6c8=3JGes)vKrKyb-ut*VvuKLiWLxU|X5}lfz5HKUtPY zf`(cYXy?EHM5@|+=u|0>0a!AOMEIafs=;cVnb?E{sVc&z(sl=+kp$MyOE~}4jD$li z;dfBk1?k*`Rwy_?%rF64cpmqyOP8s)*Q$FG=p#9fy$_qVNUXZP^If^((vy0o=TvGI z?b^KdCE4Qfv=?#M>MxwpoVR-(-IbsEd-_JHTfj}MfFm_!%a<8et!I+9%xdH+Wq zlwWz{$K^ME?+&^D@x!ul=mt4_@nKElyC}?G%Vhhma1)M7h^m?O_XI$Js2ZJg29_a@ zAT|Mzox$WpgE>_w*v}a`x%sUTC1wOYBd&abtqN$F7DmIG3|J!s)N`KRYY{dWFX!tZ z+DKhnG8pu}b%ojT{&b4R5W-{%clzi@?%SX(L02#ZVBk0xm>)tUs)#eN5M~S)STsqK z7xb$4R|8@yxLe<$G}!=v>y~j+;@7eu>Gl|E(e|(tbY#ze*i+D2O4JRb#Kc#s4gW@o zpH-sL-~_h|*&b=*{jml;6F~j~JXKKN2TH4GNz-P8o`AqI(Cc|WA+(CPLYvCYSA@D?+2ZARYXa%B-L@SNzzqwkqdc21h~RXG*HrxgdB}>YEat&_1Z}K!Bpub|l720vU)LCKJue zp0T|K_Pp;@);XkyM&(!SF8~N9B1i^;4=t}bYhpSx&_!S|-8~_#4KPcOM+ zTHf%7?~!L-{Q>!smt7&RdDU~}mS>%mqiZI36l26}o|WKCrHdZaGaMsnd`fk0B0SB& zsM)xanH44tt?}BVXd&#``%cZ|?eF@O{O;R6DQ|o4WAfsWt4ND?5DcsZ#P$5cUo4#Nluo)dTlVtAa_Fm)K1JRDKK4kJ^0YGl#r?t1 z{jIJBRNtD&;F`JIp%EzWRgH%W2VlyWgQYJ9kH>Hs^0781IZtI=0Y6NyFMlgwRa%TV z6*vNJYNz?o&q;Lr1Y#W-8#&vbdX%smxJh zIJbB$p;4#HQ|dc_5D=dg44iWG#Nwi6GSqR707Gp?2^(O`%*|H*DV`I>?Pb)FqOFO{ zfTkNp36^gNKzfhGX8+I@5rCht8N!BF5USbAnYq?ilg-NKm9P=L6Urd|DhW&GPw2b) ziKTSbtStuA*xB1lb4O=pKjSk14W5B(T=t6}epaO+_Mg@;Gzpa&cepfa)h9yG?D!dT zN{(p5QfUHAfI@{(uE{W8htQ~{j|F!lv{as8gFz9bL07qUBz98=q~CxaKE)sez|sdM z4xS%;yJw+>!?8P4wM5+G(UBFdv$jN3do(V6>rib8YOhxdKzo2eU}hU|z_ggjbhMPq zFT2R^Na>$78upH`^7?n46$u2s-Xit7`;1|qAy)pUe&LVh_y6RSoV?=svb$s8Z{x@@ z5xGP@@xY_wv&tvkAKmLr|^_d;noo~wekt=2U z#9>*?MfPTe99fzd)3_Dcu9yHod)@N_w90Ma=@d!=jm2x)$ULUpQUfn~v@`y9p{<23 zMB%I|`9n00aKbhs2%hdNP$FG>tRjH6@9_eX;1>lU3Omdq4Xl0#&Jw))p#m6%ODpIb zurtvt>~U;q3M+(0*6v@VuT=CQ+l0WTeVw~M0rKKd^0f5H$c%*8XVh4nbDJNlhk%b6 zYazKCgvRjK@_DIz00=n7z=_8vAq?7;UX__NAs5;PL+;?f0-lyOCbT-OK5Q)=%F<|` z6z4JP9y*w8mhLysBs@@M-5{IR}RE?;PZDe;MpcwbrMC9*54>;3X z+rOSKLd6aVVl=>z24}68p#>o#&tZoIwZkg<-#7uKEuF?qw&k`{Dfzfl7NvmhKu0?yFi~ARZStBK)Rr_g(;e%*&_wujKms>N33!itr-16)ba^*#1Ikd5^YWbeoZGL7|Zo6HJ+xi`2 zDb;t+&KC066T5QTT|4r@58f#s`S?Tf(c2%9d+vKec9utEefu(*9yu)AGLgN-Qug*- zfGf;0%yqdVizzNFunUhi52>{LflM|y>oHUQd(H3@q+$%DiFH+ewGZIig6eb>QmpNS z4`oFh)4wGmph$9NP{DS7*!A7H5f7MB z&>Fmjc*Mvo1|sbfSc7Al*c#A4a>s&U;L#@{2s|MfhhEf@4e=rd)lq3G@mvf}L*q z-rGvg?xkxWv0IJC4o3bQS$&H0`j*`CPBBOU_EOrEfM1>W`7E&$l?ssq|Y zo_ON4oH~78Mx!;E%}Nb5b+2=~bI}HvnPxm%m#rh0%lP=^va@?${^-^-@`oRJNH$-0 zw;VsbE7x2)ksGhQT%P@`%jKHOH{_zDTe7vaAxDlJlCAA^DHV>38rL(|%5G89?}?l{ zKa(?ON*~V3BTt-{dmq}BPv8BR+;P|4a@ReN$$bxv<;>2yEM!~OH;>8Ik*j5UvLTDb zSoVrrKLL1XAY#ot+hmbO$IF?VIrXqiCQDgcKj!N5q8KNFT&PkS;rR^ zDs42X%prUtV&IKgcFLIAh>@vM0RiIKP@}+=q&`^O51aH_HCN475E5r(n0W69GfW)_ z)M|BrW+kb12`$wS2%Zt>r2-V*c(j8=NMKZPFgV_mVp4O_(O4GVv2}5!6hg}y!2s>} z^f!~%ok5^t)-V`wYE%}bUZyFuDC1rIeDAy*KRlH~+w0M% z;9=PrYhoWMKaTOr-sT5JvohLPSG8<8N5zyCpv)byP(F1$*_Q32haGIq z9>vCvoDw`W)nYdH+Y_XKx-I?s{EadF@ zJvn=BS5BXs%eiwS*_##h`AF8**JXYEN||hI$&u|f8I7khUyMriau551!(mF80fAtS zo0NCXW%tYjvU~bLdCeC;TldzR-uAF;9J+|eVWCqgTp5EhCIr1CJJUwGcW0BT#RDj3 zrtdEZ;i=M+ap~>aOpuJ3_AS-}+70ctX}4f91{;VIRi%P){uD{FD5O^WpT@FkypI*v zB(ycV%+5F^(V{#Bea^oIqI_;h9SBV;B0NkBVxXbGQ}|j`ypjle>{*}p;t-kihxm*7 zvpUZ$VSvFSJuD#B1VtkJrIggv-vjByHwzIi*ickC6%G|O$uUNY=|J0#nE)OLBrwiL z%r4W`A*qGmmrOc0LNXKY1v2b0J7^?4ygSzqp2ZoGh-5=Rlr=Z9OnZ7CiUE0F5R2Q- z5EET8Gp>sGIQnnrrv@u2396ka&H;t{@riICVej;B{gjy9FXtfU)=S|b@4hl4NA1ky zcz#=TbbSwYNvem#i&($!CV;9WS2}F5y1mRT5qPYY+IPL8A_0#Y3~`aBPS1ZC-PgDT+r{|djMWU+nD=$4JFZ;Y3hc0&iWx!HWi(os^{qoP+P+9e%b6mdz2!{y=6mwkBXe2I z_gtf}2!~@6+{?Uf$ar!{rqgvfbZkwQlcEL5tdT{cEM^Jokg24zw63XqOSqWvCff&- zX;JwuWN+s&Id}R#dHyp;@)y7EbLE@A>L&TopZNoM{hLq8=J*nI4X|~E$uu3}blD~Z z_~CTxI5R<}3rhZ+(wvDUT#J3zRIt;bXcUoYlsPF+iM3b%h!VT6`6hh6+=2;)RkGLV zISL;e66i>>GBWQDx}*(&vs;!C9#QpD`!|dgu+7Il4kv?nhiQymW5PZNjsi-5=bl&z zz4TD5p&>z%iLZ`BvC(op+4*TG#qmfLYiDp9Ppdq5nmSdS#xLP}E z9Z8?P<{+c3m~`JAPJ}~k4h{)M0~cDlZ!|Iwf5cP=>hiD^44LgK&2i38D%~y(iTYc! zh(xl<@KVLahLeo(<#d^~t*vF6NjOP`oSdiA)qo0pG*-hnF#b@IG%A7p)ax;DUPtdiIyiMl)Mbv5J~GG11UvB$0pb0x%D;ka`h8dJhtW8{ zhFTz8v}Cq>RxUnqQr6dDo*2jtF^mK*UwI zY0cr34X~fitysGdl=PKjnX0$_T+W|;R2Dn;%QLQ=%eVZ6=gK#J*>mN}<5p#HzH?5d zlcj10=4F6}Y^umD<5*|J9E9Zg>^TX2L+h8qB^2qBe%L8iBBn93HdMu4R&e~U|^ zZaE{x1ZR${H-Ww1)+tQWJz()c-7=GtpH8x)`YXBMp8uC6L$_zaqtYX z>%$aarF82)_u74F&G z2tAA;Rnm38(=S1NLtLF44xkLH$PRAW2_IkBwHfqaFM6%-Z$3AtREY>cTts|FM_|<5l%+AczR$WnBQRbcRsX{rG;glyV4qr_R z3IQYi^Qj zPi$%Xd$Wa1%YfCSQHX~*hViVhvv5exjkK%bbU_gO46~+6rS@c$>>M0p(x?LW6`*fT zyWw=K5;p90b)rp*q9Fp6(QE+G4yrYR8w{}~Y)kmzpz>=JFXHsvNX_iN5k6w}?}~A# zf0favJkG&5x;vJ5O{N`ZZ!OF&BO2m8VFI!}RB06wO@t;x!6^1%*`dW0hl!5K@ghD2 zB~74WF29paUAH0_mv^#OF~+{hzQ>poiA85ag`7rk#tN&Xj{0JxmINz^D;Pkuo6lK- zoA$!dM>vY-Zzjf2y?tev9x95m$2v0VwM4ph@Jn<`NEIJ&!V#{5AK(9>y?5F>ai-fLztid?C*Jj7Ikp=AI1 z&1DQ!&<2I#HBwQo4=N)zo>$~Fsx(C%l;(2rNt0yvC<`F8fB}7D;|~LX?$Wj(pjInP z$Hnu1DI2nsZ~K}X<<&30R^IrIPs*>p;S=(~TR$P^cGqRHc~mwJos`LBLuPvkbIC0^ z$5ei*smNom)wbrLUR4qrSLXvb!zoN1BnSjcDY%n`+SInM0J^N*p6s4|ROY)+$l;A$ zdGU=W@@zg{jsX^ek1pDWld5f3;DHk)ANrUkHE5t(LLDF$d!oWGix#J=%m z;kgK9I@XX18^9D+`LHzkHt=uw24 zMj%>gY+P&#<(Xpt;zdjE>na0lb->6G!e%K3kn^7esg}-aySKhEQ`)ac>XrlM1xcdS z1sw@Q+Gbjqkuj;3$fB{|HYp;F0K;*LQx#Klet&p`@{$G7V_?x|5}>SFMBf8|d8~oIF*L=zI8vBMOYCPGA`$blhl?7+eJ!AM2rfWAMa&ygd&yPtGSLs{ ze1`s^FJ4`b6CFuLBth`1v<0<^cR#HZdOgvdk9F)B z!QeYKB)9Zw8AF2++5t~BjWL>Zuj^aZN;Lq`2<3d+lbQY{ow%E06|^@dzmk@G;!+P^ zbr`D4+TKC}#^A-rn;+;ScJ}=$t#1IFSbc0qQngp1CPsMGYT)*(M6%hpj?EM?vE=f& z|JeEoG}_9zRQe8wL%U<&XSkS2CYDPZr89lJ4O+K@+?Azbd_cf)z`WObv&Yg#!5JTS zB*bwqVjLsv8&a>?={5>l_k&%ZG5sv5dRD|pw;3=$%_M~Wdsm^6g01D&8prob$44ZV zv)%VDt*7RIob7tq7k+m4Mqfg$Sb}CewXX$0SC3TTpTRM)Qa#1B@0UOLlTXU0@0-ix=Qd?;v>}t}wydph$#k-A)kaPDkIZgH*C3Fj zX3+liedM-ZIB=}-x-b)348Xm=KV_7n}AVhmlx896RD}5F;lH!X%%d0#Z6iJ}zqF@6CB6YD5@!N3h zh?n|;hJf$x#OY*#jY5bHcFtDE0#C}K4&-_P^?LWEbLZX!Lmrk_aWA~*yPGOE6bLc9 zxez#LD6HArebM8#44*>MoeH6m!lpW0y)(d)miG*+>yMR#V)N(3*gap(q-vX052&jc z;pd9xgW0Rd)k8`_t(KhE6vVZeL*5r4h9EeNZQ8$f?TGD6CXfausD3%73NiQrP%_Rq zqAHU5)Y=jDoL>Pl`_OgzWAv%yJaG^}2*g_H-)B($dRo%SFeI0;i_75`AXVUDN%6KjM=H zA4Y^mXU}@aRT7$d+Hp@LbH%ZVT=A0Yvg%=jA=`|FnGMjtAu9pE@P? z+;_J;_UKIZ7V9#aY|D7OC8OzvjHksBuxL@I#&pM;(A*uJjmer_yGZtXvYhS8Z1ob*Wf6(V~8 zG9nzZJsXQ&P=R$)c@+fEI#PzU!_^_K9yu3Fp)IiCqnNuY{s2a;%g_+bBzV^N>(7={Eik8 zby1;3)ucdA{ zz*A0`^Xg$H*dDNyNb0oD)t+K5T#3WYT6P#SPL`h~T^DnnN?Uy6(-4nhJZQ5u9S!XH zo^f(e%3j=InQWCx9H}`P@ zNM?I92)xofqzv|>dSYu$UV78Iy!58$iOBQh-Y53tu6yp6Pk!dK+;P`TK7QvT@|k-d zmxmrbEoaUz9-o=04E(O%^g4Pi1X7l8p_KBNvV3lB1h)`K4FMwO1dJ z>#iEhb(bBI%P+rNE@B~PLr`SSE)A$#sDw>E{THi-#LwzL?wt|6V9K%&Wx;2(h5 zZU7g&^NVRXAgiM^c%KL0C85dolfB0xyX?NmD+BerJKXp2`qe9+xl zyta#@y-K-jbFyGf7Du6EST^Wr-71nE6_X`|92D$v?GM^jlW;M2W*|NIUJ6TI+0)B< z^F6(1jz`a?5eVX4`*v#F!&qgXPm%P;a{ikd#bulhLkbVeM#Ub;v2qM_;*7y|lIXPl z8sydG57fAXCgvVi58?wg z?yQsOq$Z$V*y<@rpc*GiACo zj}Er13RyaZ)=b4`7`Cbao0ihq6&V$iR~4ZG0jmxcwr|yHKw|VYqB({MAP5>AY8Al> zQ0bEjc|IFcK*ukj*(WK1b=7uI(Rx8sQi-Y@K&Fw7&5dd(w0oxQb5Hl^9*m{$bN;>8 z-^GW@Yy;{DU`CLvM+mw^X*TZ&dHsoBBWZf5jRUnbuq52QW zG(mXto-k3lqnRCf_r4j4Tyb`KCvUGPMwo; z=g-OB?w%|bGno{d>vSS(>uYjkds~hi+1BwNJv^4pjj1LQvTOi$m3>kw`<>VNQN?bL z%BmiQsG!;FCxmk>#X3glp^epS`A+93)}FybfX6D=2uZ>E0~J91ag^%SB1S<(ypxGFuFd=x0xH;=PkpF9tc?DM{!cz-4l;RMK<2$SqW zd6|cxTE9MtzU|{MpiH3GH?CFf)&4Ag5ZsPzy+YiwC$-V_F=-QT#^G5k_vF%xH|6lA zg#ec2rU73tSV0rbfp*mG0K`m)@CONbQc&F9(w$L?1P2}@-R)#`Re2zjtRexTt z=wo>M*K@&r17nGIN6qXU3siAYDie+~9(tEG7nimAFz^vh08Y8@34et#PjbrZ+5B0B zjP_G7Ivg7Jq}EeOi7mV>o-Ni|w5Ft}fEd}#{E#&cdwj4`a;U%0dGCIgAixQ_qN2PX zehAp-QN0lR)tR$?=0p$9QSo^NW_cgf`;_-n3$}yUR}$ii3#vu;@=h$AnJ+DWgY7-j zxXSV%X-u@OG1~haDb?Fd0Xe|^9YY;8-E`V8*Z+eGZIKx>&WTO zZG>f9bJYlhrp>+byG~=>_bQ8tXaT7+Tt--lpH6b9lQv9^oA-NQXRhWDKEaXL$0CfF zA@c3!_?M=&aIlU2u;_vbm;O~k^#~e0yX9;!-EBNxw9m!40nrgWwu=5GP1ExfWENr3 zHOSBR<$j2L>g$TLpPFC)-XGDO4S5-+q%g5m(rfL%=Ka$CXi_5s1~^B0GW=bZIH}h3 z@|Y`Ms`|@jo?543bH)WIp9Y=qG^aLzNQFg&l#^Zbbc!5M3`pcku_Q>J($n?ghE09| z)%1N_f7Ty9my>|M(-eW{+sW-XTF`ds_QQyq&VnWfVrEUMxz6~rKlPR4sLUm#D$CFO ze!4lw$PlIyJ4ptiLIiGW0ZHNs@A|0ovup2fmZ%2|7+?ak%&LhwSYie&dV0TO zC1a2|=Lcfg6$q%M3nScJsiN@c#}Tq5Zo%IWQ3cd;E?C5;ls}nSW)wUulk(SJcCMe`*Ah; zl5?)Pag>}Q^>3bS11S0j1|2D;ZO@yqW^y9RD(9YQCI0Af&u2_BOzugv7qr+Pn`(9| zC;AqfN=)9>Ps5IU^~-^WtITz=0h0N1i)^#V1Y*Mn9q6(qYSwa}lN4unO1ldt4?Rkx z-4dHF^S8e_5fTnkH4Dg%-y|{6IYjMi&Hv#g3OQeFQ)jz$iWOP}Wv(bWeMe z?Q9GH!@)6}b)h=se&(DdNc33z0obLe7?7hb948>qPeG3E6s$wa?gfKY<&dmU0!v7xSw=W^v0$LVdP zf^8r`CG2v420r3i8Q348N+mj!_HvbgYPypizERE18^=`mpFG#D1<^bzl^V1|S89FF zAT9~!W176Az*Sk{AbYNUjwNVl0|2m}`J{iem%IdffL6^*VCy|8$%z!>QOHKK2uzm( zD3m<^N_S`uLS0M#U`jgx`W-f6%L09XS^9DzOS73DT|6fg z21`JXHP<>%7G&Q@6n;}=Tuc*2WXFx%a+X@!=vyY5(_}|0&T@761h$bbt`Nx!@&8l< zVywx3oVdn;paWMvQ>DRx_nyQ7!r-IH)Y2&WRJDIf z1g53~{Z23F?)aVHM}nh73y?%K1t*0S8f2&e5hg2~dq^XL5Go*9+++PKMAqZGBl$&2 zkTC0L@*g{C{va5Q%SVv1gFtY%K&WczFg~aI`g{Z|@k%8U(LCUHmQdEYV|zY^L9 zqkZ1b42Qpi47l?0J;9nLbv;wy;6O%`*Z8;Y)ouSX;-a4b0K30{7A_f0RYS6|R!jgE zAu>VXozVDDA6-)GQ=qRHKzFYW#u6(!?fIBd2k%w<=yM1y&y=x%i2AwjS%(W55uUSj z#Ku>^##obPegS4SYcJc~b82tVQ19$(Fmi<177(Bn5$BPeFxBGNw{!m!j&A;5rz5Q( z2ua@PldS>HciC8JA|yf0aT=yJfsdb;L}i@>QlaT~N67uIr9aXeL;qLwnH<19OGCw@J7LrIg6AxX~ZB8H0nnRIF04B7Cp^fG7^n?sGeZZ0@n8 z@szZ2IYNbB0O!(=G1=dy0;_9%w{y;ig)1LgPlyv8TBS854FyUfbdnFB%#tRomS!8oP^TzXCg~qlcPCp3Dt?dind+_mS z=z^^wOFito=!~`mUo7TwWNR*$xQ`r6PCTv{=K;ASQ;H!lg!9&#ctA(0XDY2jL&PfV z+7dXMrwb8bR$p~HnL4YXy-BVUOjGG-qYGu<7KvU*SY?$A@SB7<=QK1yncOG&MnkvI z27Y$}ViLHmKXk-VJjiLADGupb4w?3LVPmhhEQgN!maKfLd?O|8;`Ld^Y$l&06LgOR zZkmSFUh7$PU|{cn=RQDuYJCIC5Y4yqm2(%GQ`UeC_$6_lf@xIe5?qLcWY^&6iHvX^ zNPuL+wWbnLGV`i81lu$TwUGn`Axv*k586J$!>f3Z1H^cWiQj5QZ})V+-&fVLqMdqS z;K_^jVB5-#*w;p_NoXX7xQCu=`ohQ&haCR`G*v2G#bVxW9EC0u4Dj6aJIe(V)y z*y}6jGR%hrTKmiZ?KxNTP%!_VJ?AtBYzZdaDdKK9UOIV4I>GVJY}0XzOZ8#j4nGp0 zHS+*Pa#+J?CP;9`Jrsp(D$(=Hqsvo$G=%Ff)Y_#dMx3-)D{ln&W*KN&h|^{yRe)N9t`I zx#&IQw@$+2;3cGq4AF#_w}DA3^25hQt()ZST*kb&Gn11?w`F^?!~j70Pal9<^U-q# zduF5$46iol<-E1`_s!Xp5e}ZN>mYO~wKXso!Ne7<*trgnT!*-}^HtfO;au2a3OKp4 z^jAUraxE;sgZt}*To^PZ%g&pZka5&3r;_2a`ax{Hbold8#B1{-oUfF4@sL@wmSkE> zAed(fzB=jD2|)x}Q#;&nVoe^Gj?*xQC5TbKg}B3=nBjkkwR5miNB`8kw_1PlYqAF@ zDk0VY`=IR>yZ=e!FzF5L3k4APlDwl{w)80TjO-&R} z0w$uDC_Dv0p`F-4HA~NZ?crppr#=iwdyH|^2#?3m2Vjy=wN8Uo2V-q)j_nkgX(zu^ zN!&~B8v2I4A#h(k)&`_7Vr?0x&O>8pHl|{UOM<1j+8T^8_zTq1B}SOl3N8(lFN+(C zA?w-;8ED&TuREHK@WXTgYUdP(JAGh=Hq!tT@GgR}1LN_C5TwpEjffhnn{l$#!6$%-7rs zbFU3zD`1j#HsJr{=NPl8krfecGXkxa>{1k7Ay?ypq#;o$5vg}o^%SDh*c4EuLEFz9r?o1Y`rYM(ucri^?U zu!%9LtjKzLM0BZtjoE<$pLqg`VO?i#7&xPFyY+x<(M^+^>3`Yg8;&d?G1I@HwrC}_ z*cv$jP`5ZkV%60u=H90z=pO2>B+z$H{dapn>lC^j^_rs0TIz=k$a5Ya^DB@*M1Rjj z9;r1jjtsL)%&Md4qB*ES0~+KS^A5)y0tz}Nc)?;FeGTBWfdg z4fb~AvP(|L<}@Y9ewJD9iJ_|xJhTjQ6|m>C%xAMJ_#E^)`2F0kRsCD_*>VU7wfm(o zUX%qUVWDngn6dZufs|5gH>q zYp4%HdoUzIkJC%%LXu7cY&-J@XuvrMu80ToV3zDl6cKeulC8b3AS8gwXPkI)6c!jQ2BIFc8;W*>1qG}iN z7I@@{73_ z6%S7JUm#reH}XkIiKVob(^I7dL|y^-OVEMJb?UB3wRTOmu$8-kq9kn94Z;=>mB~OL zg|W2bnv~e`tAQ!^wQrBMDq|jBB}+tr3ha})2h4{74n3J^4ePA)Qhi20Em1~j8Dc-r zXEGVjXl1I?xF;p{s{js#g~(iC5a#NK!2(Z-(z^B>aaJlQt%?>se?+DSw8h{q%; zg>#|Z+ZD1__($LfdH_*CuD^rnb7Q+-kDcnEJuaFnc!ny`ewdRm=vfKbak}Y6&Fs8D zo#&Z6BW#$3D`(oe1^pa&ti6pW1%+~Csh}gI3iV-svbfGs0eGSrK5~6pz29b;X5@C%`Qtv@kh(>(@7)ST7Bs8drM6B z`)r6ntkM$ndK)Wp_Ru_KlxV*-dAJ&1y*Ht4+?jetSfFoIR=L5wtC-S3uc0%*NuC3A zy5p{?R+lcg8xdcO=b17(Li)Xmo4yFX3+XUclHuAj=IE(rK%dveVpldc7IN{)?E{a2 z=eRT9{ki&XHigvCB{y0SsNyIdAlbvJHQ{T9=$FgAF>+Jrfn`Ue;2&K%Aa5I#w<_+yKF5t+q&fGgU9Evcs{Hf42a%4_{@hg&cFhgkzXoyl zmKsjPvRabplQ4ZQF@L1>2z5@V{1{QXXFmW{2yeFHMYWZLMryS=<>d}WNNV}MA%NH7 zutOTdhXyFzh~rtY@UOO~YJ9>G)wH_Aseq)(HBe7JWv|SiI{eC~&&NYjb}$SFQjk{B zjuMByFryV$_z|cy#G#M1bPoyJq-D}7uJJ$BIKHGoaHR&A(nJ7co%s{;9SEp_A>A~7GPQ}JUNqU38 zi9}LJ>;p|D1PXPscPHkMY+0&h;izXG@ryc^=UIl}V2;8g12qjovHA6~$?(zPgl5>1 zp*Ash${_hAr7!LeI_f;Hs#us(O0KJ!%V5Gb->}qB%<wj1~1U|ZL#~kI=9V1c$j!kW` zC!o6^IxW$oeL4VIv-eHkot^-^Dm#e7%#Ka5h^c&Y;m9HyFlN|6T|KMy;AdoZSjc>~ zD~Gp4PM$mz{aTH$Rx|4TBxh!reE)t-y-y?Xr*WZAE%V+FgbXqJ+dV&B+oTHnMgLg%|g&99|u1$j)lD!^q0AXE%u);ZAef*fI3=4& zk)kCkM|cd^%`ZI1w1(4CXWiBy7bH3p;M*%6m8ac{6fuiTTHD;i*dU=g3_{gzTx$oZ zle=MOeko&Fr7m0afYZLobbA%4(5?STNo_%Ma>HiDy>841_3y;wTNNS^>{jI*S`qzj z(qUM%h6BGwdD<(v`vNUSRaKwQKR#tuIMc(XcTpU;ch%GK_ndWdanG2i}o zM8d4#5Px0^GFH=$DNkZQ?7-D zmK)B6sr)cp8=9aO)xc1D8_R-P6kh4eiL6#~jB13r*7^*z7g+W_rsSUo?2SDBzDJ|- zVeQ?^Tg85{jbbtRNY0Wu3X<@F;6hL6`^HmQLu!J3H0+PzXlkF&oBa=PIomxaCyveK z*s+n!ToOu9(&z0==eIjME7kXMfcu9`fd>T&7jpHP68idkkazY8B&^x=Ut&uYFbZMH z7=b$XMA~PValE0JZK~-=T7ih$#;G@ESk5+>ZkX*tlBhDh8sPLQgt#9Z3VBR$cJ*tE zyC>Z0w80o*0$J=>qcuUVAaFX}%Cj;GdI&led)hl@LNX$?GB--}mH4EZ6{6^s)lwLP z-@wPf2LLB#_za|94Fm(MvpMQ$29=VI+54_p{n^Jtk16pA3k2nUSqwUnuTpuIvx zCP?Q11pX@ z@JX!sflK4jY{3=2~hq!{$Jg z(P}VhXAJ6ihj=d7fnD7TAXL7Zl(4PRr&4u?3(CR9h7g~!QC-E&_auEGu;EB{tZ7Nz z!=DmR#W<@pWJXMC%~UI=_(AtikPsx%Hxc>DiKzBfQSFAFvXmI~8jm%lEowa=iyz)x zQlHvVd*Kqzk!^9%);#v9B|zb)0h)|wqhc818T&v2fLkFH?jHh5qMfiPiBR`DUUJKj ztL&*zl1p`oNgx;)RkkHrN)d?4I!_raqw6T&?Am z*0jmLydqsTM1DTO2)GA9x652-=ZiD@O1)=d?iAn!QlkIsgHxAeSZPebHlWFFpo ztSGx*ygC+?9IGG=G>t@VGQ8gxCBxf#G8DFlo}{(7h*kpY8EEpNGO&MF5?Vj%?sE>@ zAIT5RSfbKcOjWZnnE@iTqg1vfZ2amQqmFmw|7lvl7z>j?*HpFThuQ4%%r<>40oVeT z6VZx2QjY^(v6c2BbpK8ca6pyP<$VJ4jB z&^LXhIkw^ys%8)TQA+?fYwGXQcNWbXW#8;u_XI>qVlfYTRy0DuXgB;COvtnLWBy@! zr1i&d_FqskD+UBxf=yh+fu%DQ+04zs!_|rL7IP3v1fLr*fKtSgBNQzqOGZ82%hgNt zJ7XA{@iedyGGlEn9>m52iH!~7Odcec4@MHd#eq;gs}z~J>4tZ)M>ibixf9FneiPWV zn8T7G4|5FXHQXM>S`1@*XDmG{Bw&Q%XrExeg6f{!(SwOXU5zl6MDu16%0w@`W;P60 z2QEr>$+STkxbo0YQ&yPY2{G6_x9N?a+LNh=EG{)^M{ah~=2ToZQGKB9&|*1J>-YfJ zLE-`&6P>$-Eatm1-#IUfy>qg=cUG439T_ioWo=z#W3nb|(~+#LPh{iJnyjslRq|ac zgk>r+olevdQAbhoWBBiIG{WwSz3<=CKa@6CPiHmv(5!^LGSYCn%;n%owM1Hp4}QSD zuNS4{tD8iSCDd(>08k0qM=~$YeF3h^{AR){RnK}TX;~(vH0O`WD?aC$`gQn8fiS6g z!W{^EuKgVQ`aWyHLZv0_0RqF|;=%yHP=AIPecwC#82x_jCw+6eiE)n-Z%_(*SY2Rw)ZsiF-VV zwVLwav(9W(ZRCtT8ADBAIw4r3f&vo_Z+t&o0pvpSmG;9>@8dpw9b_A~{d;*oV;(fm zp$g4@=rbT($#DYNL+x2q_oY6!C1aY)?(SJx%ywikJ1erB$#guILz^Qxd2&rIzvzfu zddUg7{F0GeesUrwPHf7FBZuVhp+mB@xhaRXH)VZ&BJ1lTS(_|1NuDMT@%h%{0*85@ z8V=LrR0_O(miw?EqTAJ)*6ZVI<3A6QL8IJL2pyu0xDS;CM(;qo1pt))3NFz$JSruf z91k99*WTBjwIS2M5P*0p_a3y5ef{L0eSqbleXQHcq+itq-0Msh=dP-aVI7DEa$U)m zPtApXK4c}BUQ>e>cbE0ncNdTcsP7u>?(7l2d_WMXzL2q#JxA(#dk zbpR3dQlw(WPh#DhGllsLTm?Z* zTFnO{F5EQWPD}ccd;M3>D2+*UXNiC`Q(p}UdKsxZMOgaNu6 zqETHF1fQ5(R#Sb0VWq1{`PZD^JOZOh*h1UF%jwWOVN^)!!W#++Xu$kcc|#jmrOwo{ zl)1L}RCi8sJGJ>E!lBc9>>YL`FB*(-mUpG;EB!KjZ^zWA-QWEqplO1(Cq|=dg;8Ok z=_E-}I<{U;7fkieY!ebh$w&wLyvSry-aC`U-b~J(J}a}m)3UX`luM3{<*I8Ia>JEd za@{po$c@juQm(mdLrxssl%s{&Z)rBI{yh;t1A0{#LEsK!e^OTp5mh_!cMqpl&7Fv> zwS=2hn3!b;D4G{)KXk$S5D^CM1d6>@B_HN+H&)pWFw<2gw^fq!K}`k+1tS-7^_eDH ziJ!k)<>N4H4(RW<`s6rhHtOM?C!VtdntCfz*0Lhj@>v2I*_X-)O{KwO#bRMPo?UNcNr{)r7ygO*NZd*-)|PAq5I;y39zrT1Y<-K7R&K zU`I)l4Uf+jyd2V!+R_gWoMW6B2d1UD!MX>UuZS`A!PkU8?+{HNMs2yqR|#HXty}eL zM~l%ACV;Xy*FgJ;aP7Wgqt8vR>pxz~bbTy~`Al}tpOSOuPswQcxSTjLm(RZWVtK)H zu94?I=cL?p!Se829(ye=@f93vFjrdk4Mx z%n$ANeeW1DZw!y2zkfJSb}Q34@0T+~LSrq!0uFI z91VDbDKzPAc&FFqCK^dN1ajjb+j00j0xSfjM(^ST1t!~I09AkQzz>fik z6k$8;hmz|Dhf@zr{r zw^X57&6(vkhZtAgChbk~eF!PDLJJ6C?2e=F9sYiIq&g}!!%{S}7Wb%+2^?TjG#UY+E;T&y zS5*Mc9p{jQ#~G9I1Z1GC$#=2?OE23qxEN%`5OvE1t;%=BJd4v6RlP#fZ9oX1Li+&i zRoKyMn97VF!k`ssQ#-EGA9dt&`iis40v70&W*t-z7LGz;e?}^Ul(<5Tg3p2I8wmz0!wDTJ9ZY6mBQI}EcJL9F%H4R? z$AY`kXKvj1n^M%K_>v3@OrA+9=EazmvCyHz);YMO32A#h>U`cRgIS1lMw48Q8sYE@ zXd5tg-Tqkdd{j-#b4msX63>*U+W($m+Cv*#X@@$#Hpch$DM{58*%&wIfMdEqVB z%QLUsQgs-%-0p1dQ56PU#>EEG+Eu+L26ekt(VXMOT!xcn9Lzph_n;SxX#9J34iCnx zFxTBW@eC~D?-<|ew%ZYgXL5ut@^-GnKlfvjoo5;X++KZv>LByOZSLoY*!PZAZLWHL zRsRq2dG)@$*%IskL&p*#*Gpqow6D^s*PYLTCdRybTHpY>6gEhjp6Cfkqtc;bV)QUN zdUZxKu+2R~_b?ui0Qc3)ev#jo{h0zpoA7Gn?OM|?1sga5=RzL+2;-|)LI3j-7?ENa zVYlXNNM>fRHrA|Rj$=7#LP&EBp$!SqurA?rAG9A~h^Xn|3E3h6k~#rG61IobW{Q%G zo+Jj6x;kdC1BNC!z{0s&B5WV1{m#TL2W-q7VHk-{Ev&(qk;PT|yYzzuBg+9IP^sBM z8cezdCllUO1{$+SbS$hRLTCq4y`1k32RGW3-Oa(o6u;+T(7&}H1w8q&?yfrW)R>+9 zhPfa=kgVJXg#g07T-y?S2eIA6NPYcaqf>_#wY?LeR3u=M8V+8m?uLqg;fdR*jNwxN zrEnCPK~3@;u6-W|2pWmT{}%~yFz;E@*XD7&lr`N<3psc85!pNQh+KMNF0X#kQTehj z`fPdWXI(8qb1>)0RFLB}sR zPc;$mNb(1i@Y=n`-*xvO9HH`z+Ol~*bWlVF;rlVThU2%rw);KiySKgsn(@k#1FG?Z zjJQ1P{Z#ht-$VDdw5#vCRsGr**14t%PIHm84fCKi;7~!&iHZA%fSHCD zxwj0bH=Mz=hDVDQr4xI~BX=mQJb&rb@1@EUjK%H_3bssJ)T zKP;RUwJnwjdf+$U&9)|E_JYXdTS@Cd8VebMe}Fw+o4S?Hl(1oF9RPGWw3Z7Vf%joC zo#}hg zE%7%F9kc*(pnj+=T1E$liB_9 zoa;B_E5GP@^2(P#L!S4{qf*Myl>7E(d$Lm;0LNYe6sMLM1AW#Z!oD|B9oj5j2q~Cb zj<=~6^=Y}7iBw})5oZpVQtvzrq05Y(iV8g2z`MxzM6)KQIvSrbpSUL?e6nIGw5uuZSTD>&-$e>If+Mcq@2Ysx2>b!jQxGDsHpFk# zSw4N-qOccef7}{w6yjEIbgpbQ27bK{0+K{3R8Cv%sQJ5hE^^y?NUx7XJBOJ->p30$94`UK( zm6n}BR>@-!$4kr;4WwNPo8G*8&8FVnSFu(RQ=Hi-H5x)4SWAfANE!cPeqPQ#cE4Apb*Rs-vH9&y(Tz1{oEcdeS?a*iqI1)Bv-2Xa&qz$Rg{Q~%&J|@3P7-$K3UPRoV z!dk5A&xNY=hX6%?J2g}5|1SSRdTeMb83Katgc{kgdC+vwC3c3DTApXiATL&vG~DQsgh$z;+PYt z_A|!O<~YIObXs=Wj+}Yy0a+hCCSUN`m&pJ8b+3?DzwB9ZR0CZ__GYHhSPwVnOf?FE z*j_;>$?SDtCh+v|_5)un0~}(G{8_mmdDxD%NPp~8_>lM$eioj5AD@hLzTds=IUK%! zh#B+wsythtwmu%@zSX9cAx1y6FEI#mj1Ff@3js_=zlPq7Mv>>i*1K_eCjmVCzOt#x zm#3@E@JgFVEHz*P=^IU$C15THpFGf4-^cN|({2Qu(Yb`VSt63pGr&$9?{*6pgp@J(M(=2K=Bk(%$U<8q*0)QmlNbSH7aH7o%tYU{! z3&fHw7zr}SI~U)$%|9}QXVC zd#4lAlA!-~M!X#HK6|K-a37rU3^Ts{B*ax$YtJ51A@@m?)w9(;bmkvgI$O_RBP(#w zDp~YGu7k{JtHtQMzdN_1o?bHddWs#V_o6R-{W-{*clQZ@w%<&H@I%>4Ojc>E--ELd zYHawtuuulE*CULmkPKWn00yY3=repvs^W6tl$QH1RQQc%fWetk7k!5({edqaZV!n* znKXO_jCs43qGU)X#pK-6VyoZNd?BNfM_pCZMx=^g(4+tZ&zTSk2Htv}!P2^w6##in ztOcw;W#n@PSyMZ<%H*LlIo2hA2Q}JOr8)2jC70_thpBQ` z+NN46pC>c+m2ZeC!T{+IdHX<}H~?UfsZz*^!J`&qYi10P1K5!w!h+YvfdtmIipao5 zYUW|#b~Se6s!G*F#lVp5gOQjT3n4Bj3xW-rZN?r6LSc86F%)(G?zzWh=j`3`{2RCB zuYL2&<;%X{dO4~^W|p!yU#MLlS-JRMpV^M8unPj}XZXJVf4vR@DC&Dq*v7AFYzF#S z7#Lza6~KE6edB8tv%GNi`qRYW_qp~1f=>qUb)QKfJFEeyFB3>uz)Dcpp6&pJVQ2R< z!PZF4uT>JlrKH*Ici#sNnp{X&+s%F@3zL+?}2ULeckmfi5f?*C(l#qUWazZtUpg2X2e!g0 zlgW_+@rRRJo;=unS`uym&SUf!GY3qGuLCIgJeegH# zzxqbG?9iHiUvk`QUQ0#t>5NmW`XPnX5;EJ&^IUZ8=6pZzrJ-v-N%qNHt8BzW(q_M7 zntqe>5*s}lwjcES(|uL`I?b4#ik9Tb!ITTTE_4s9(pupA?%rZb%S``Z%wOBpe~NTC zF{zg$KbXFtiOTkh^B5Go&R7>hV@)q}EZLM%5f_LW!4E!S;}X;E8cd~CT0-2znNi*x z{HD>4Sb?1KJmLaSv&IG%)C~k-0kt>)Mn(ykCfAvEjC39#A{cbMz{9y zR@JV3&bjy9*An0NmDKN^bN1e~t5#L59Hw&+_Ge1lE}`^$4bT@v6q~z#@itGAZ*#KS zS&I_p?yuz{3_;u8ir4B=KVJ#I%`ZXh{f6+lcz;8f!nsva2_mCHAA}6Kto0mcfHP`( z%~YVFw)h;+rq3HbI+EtQ$og*hhjFK&63j2e%SRN0pd*Z@;~~3N0Z?&uPSb)TJ21Fv z&BZw!iG5I2(B~xK&YnA=bO85OWdAdDYV<7t9~12@@}6W!Mg6a7*&8Y@rV{2*Gwa1Z z+l4~eM7I}6tSA;Xe)c0&db8)LCgbqotl>lmieD^x@>o;J3mK`DtDIf{((_^04^|{? z&c%iulZ{_hFyT8qJd1tom9I6^A;RixVT_Jr_rlpS6`}|nYvD+rO-$ccBF4yh%fZ(* zwcq6hi8oEfU*Z2?unMLK(KrR>M^7^6$X4#svs23+LJ3*P^5|7ap>>eqgDZtf4jUD= ze)lEm^;1O1IXd&qU{2-q}Z^=tQcE>J?A1qyQ`5Geyv)(a}tl4jMYC{%0#;Y0%>;U|Mc=5nm2CY^PMf zNxB2!PU@C6LETnIIVKl?tsx82yyj*KOhzH2{vD?ON6C-5;dJ~xD0X`@fG`@%*PHVV671)>Ha~VX!G3Dv@(5+zVR!cM}Pn8 zUq)B%A6Wg0B=JwTMF{fw?u3XhMvN|=lzAZy$W|m5-%sT@Gv>5t+nLcK@LdF+yU%Rl zfJRZ~LV^KlVdgM5!7R#1*4L?iU!8Fawz(*&*k?Xb9^NIm1^5U!t7@_+`pk%9b9|AZ zv(&$H)~CD$7^4)vtd5Og6n~zR-K&YPlVzNpnx?uy_r>0>9)28CByY{KkMwxx=FSJ*nF_)!x<+Zoo}{gCqGJ>U*=q9^0#DvR;WF%(75o-vgw z0hs2)j-GPKK6w4Vub;ecT0vs4vm=jztMHOkpGxSSId(tYcHNY|@0(vwZ+PW({FF%j zR-((9UWu&Y zT;e=p*4T)Dxz}t=Ge&I0y`(DkyW%IVCW?LTtL z2&;|ClBY%1#ht~m!JK|XIoNK|s5hY%aX{*19(spxn90*ocs4mm>IHDlA94OlQ2@Dg z=aOX{mE|?GaJF`Pd=pHSrQ`b~^Or!2v;T#<^n%pgLln=J!a|#R(6tM$nwdYQ;#c*$ z%n@eJe3b8w3xj{02xD-8L$;VsIHH8u`2b^ZddAa6247Y>*Q{tR03*>>BOnl`8HdkJ z#P0Bdgh&EZDQC$U8(BRkoG$oYUODxkl_X0x3$MRmJV6RE^!VgH-*SddAAX45{F=+? z2mj%#==#gnX{6P?Y+k-m3I`5IK;>SXtup=p#x`HNuGcpx0ym4RyUP+>9O-^u%Nesz z7kjgP^TymBtFsZuW8k5*=9P6vgqNlP$*iG;5NPk>vp89JULKyjo%KPaN={ah$HZ{0 zB?bjG)Y>f`gl9O}9I`t(F%=Y2Bww@QUnS$?A=)uSG7~$s)EAS4r1P+lT-5_kuP#~n=aiHH^iWbx zu-#X)P9g0t28w5;Z?UJu>Uc4IXx09v>3hrZkx8c)VF9goeCCaueO+NJe<2dF<-m0T8yQQ-aL z&`HQ9YB>7+DUG*I5S@R7{=wJZPT%pjK8IF&BK7xUM!4)#$j9G6>Mc@O_1DUMg|sZc z0YcJK%l*k(5rJEr^XeVx|uk`Xj9BSa2ki>vR{v{pE&qIWXLmD3XO>S12|EI9i>sBGf}+a z{m?>&?0txzhoA67>5Lad1Af-RK+$PC&sS?l40S>Tc z3tSz)BTA(uFoJVealNkA4|b*^&b8f?(3EsCwn@j#aERfKjU4vzO5TfK0O#zR&&>bk zN1?=0j8tZ;66qe#doKJ;7|u3c@i}BWghT+IFA^;{A99}jgcHU?+B$!RhFhnIM(3&D z-K4d_i1x2f=)k@{?c2Xjd)HQ|-y28>Ubjd6J=f9)K75Q0A3INj{;D2uIywh^3JKE?4y`{o$yi*Moc^?)PWawzr-h8UX6Efwbq&Eg@j{opw%l_=7)O@RrZ+hR)OYSsE0$GTqnlgC@s zG|!)pnhFOdpj|Q=Zu>^rNY#>*Hg}$%aK2{e59xE|K4k4nTy}s_RQCizj^CmB_R@v{ zLdwx{H9+L9hI0$|fTYm@vFIP}H-IOl#7rS|G~T39Dxte^nD#7f(Jhy)(T&&ap<8dd zfo^;5b#(o8`{}a%9a>-Q(ej|rgg+6dB&{c6{-6Kg1ikx@9-?k{g%O3s@}@DQ1R`Ti zs3F+}d+Z^)?y~drj_>_adc#Yul$ibw>I7W8HsAg#01j+t{(Ny~?ONW`g*0Fz zjS!h3LF3%TRH)&Ih0&BF3w@QE4Luj;#L80MVnk||k4~IJ-MqGYklfAfR2%Uz~36jWExAz_@SM?`jY;8;7!T!>SJ{b>pVwD@wJb;^OvH!1PZS^)Y62ZZSn zLuiGys7A!X6$_E`r>{ir6IqiL`slC0%pHy4#J2Xr%eQ)95(^ z-=s^cgD(BoKYEOQHJ$Mmirc?-S#=1aI} zPhtu_eG*%2&DG8Xj}S5hccF_nZiF-CuVMMu_(p5agy;N1Jx9;nb$#H&Q@zL*? zFfJxxwLP)h>oL!9uX!m-^O0bd9ixMm>x+*t--RI>s>Dtbks}4XL=e$!qr^p+&5(c} zZwL`T7`jQRDxG_gQzX;zJtJBH^~tx~`@XBQ93|yOtLM{cZ-uQtg0^Fo3WFvC!#4gU zq%Ur)ZJAU|=pO{$CX-mk5)|uU=I6=`OVX%=mW-z%$x@tm2)~A_z3^6?2@o;j+JUT! z+fYCp z6u!VRPM5|pG~B1sf3}!~JlGuF_yKz53s>l8e&oyO z)+^WP{AfZelA_A@PEGBt+hH+sFu%E!v5jZ4&$74OVX3~uF06S1c25KD$&@n%qe*Sf z==oTIsu!0ub0G-8Z%b6sY;Dmu^StGoZ8l*nneDQd-P$j+$65ZiATiHr+_qau=3VRP z34LVD>0hKNg@7QDLCH5rjyNiOC|he%x$Zy3FHt&Tsks6g^DSnW zw5aNvATZ7MIcSvRP(l8Nd_kt&F-<#?4!{hgP(sue)|1&paOOn40=Vh~LQ3Dv z5ea=mOq_cdDr*o%ieH1 zebK9KrrWODV=zni^Vv^Md{Cp|tDRZlm(;w@${K z1jnR{FsvxmN2Xb?hNQ_kH^Y!`3EL^7h~9dQmpw)6fyKy!#D>acRk05o|)pH4wdNZ1o8vbfrU_+!1|{pn1h_iEyb>QiYqc zE=4$YksnyJM!Gzv7 zk7yu#oc=m6Lu#+WH0%)h_KA`=+v|8zQyTOqG}<~%r=EG7ZoP4t{`!}_h`#cRZlx>t z4rC~(nZR*=9p+I5mi}&eZ->U?MEtvS-{CX#-9PplbZU5r)(>1wTSG__o{3LtFR0r8 z$UXEWueqAu@qKTgtM>M3GM>^h*9S=skm64e7o@oxKzMhj?c7}3jbPP-|DQmuuh)9y~+89t?zOJ*KM97-SpE8ZkHEv=M@w%=w$vPA4{*LSlu{TT43 zov|J{N!{LacreohGcNZeW_%t^;4|34FYc3(k7z5!BH&g{H`m&zzxEpX<9L8nwvbMjfh{jVmG)yq8CkwV+DWma0&=9rpHhe@5uM!_(+~gj zf2RkYSfM?KuB5F|+yIi!QyfZ@+J8(ZpT3vg`~^4APyN8_=)kIk`7JT8!doI- zMPX9NBxKZ`(xr#?(rT|m!_kxzHD%uAY7T6p>kVh99s2`ppQv8wvXo<;=L6txUF^-B z-5jgg|4Sw?qkfs71!CfAV+|t%A!BDhr1J)o;{uOTyIv5$~B=;_?{bs;XB)-b4I&76lLhlft!FGFC3qkU=1N zGewf9`T>CQFc{$ugF{0&jHTzZGY`2WAAJ_0t;a(_N}Ikfveg7#i^ zJ8g}Ucd^Ec+Z@tbPH4G1rqjnBpf7&a<@A%^_j)?GnwY6En-R?H5ptG@6yY|>`Ks4K zBG?wfuC;i8+rqN)-`XU%?YzAVZ_T6&Ri!445#!}vhdy-QQTq9R`ysmH6US)UT@lrP zf}MtO_LHrrtJT1Smo#LN&N^onPx0Ekuag54_BhdKC>wrC8+7}P`{-N$_RHxN&%1(# z(9PGs_W=y3CT-nN&!pd8muq1Wmu52xcKNve?32wTP) zrr7hKwRD-yJ?E1E1SS$%KJi0RQv&LbK&m&qk?2Ge1WW3VIv~3D^-@gUBf>{8L7|(l z2TikTMtf+qU6LouL0}M2E-2Chb&N0Sz|^D2qPXIM^}HyxxOVI?&4QIDO>+mt;+>|! z*Gh?oiqct@L`WWGreJ{foP7YGMz$nB(W%IZeB7QwXk87Dfq1b73`A?tXF!V}2?Y{Z z^&2f7x;W5I_{FtN~xj#zZ&V7Lykk6)E$zTPTG~XE+0;qc=X$FVH z#c;}CPh)09Ic{;X1J=qnwh@Ogp-!@&2ZlgGMUuUJLg!9AMwhOiqHp`oSJ79$Vqp%Wh!ea*NKDf97jD|W;clp?TSPf?`UHNcGAoN zR6Ay*)Fry-iB0!x+DU7vygzGv)NzoVOO+v4-EGS8A?FNInkJkA z;${s%O5T+a{+NF6y${m^5B(?Sgv-j3T-sD6BV$KYm z*Fw$1+5(Y{_`^7C-_qqsUBjf;S+avr;LM|Iivxq|Tz?o-fJ#Py%irSf9!*w;mgg^P z14O`q>ca$@s%i*=syvEsQoKzCr%aHIrft=C6!WaJ{dqe1nN9nL*o^U)w?s{hYmY@+ zm&TSze`3ONku+j3IsfcyEr{Rk-;5?QS_b6~zq(LO1kO%<_?ieXiyP4WsD%~4Y*_tw z-CS0Z0Oco32E)qNu!-O%22glR$3eOTbL%DIxdAvI`=#1#(k$dQ6x3AFKzxylb<MLSWqnnEW0RR9=L_t)^ZoDE?gJ{&G`|W#_Z>P0L zR^jSSq|0ibtprm2b*Mv|G^Lepm;RsM`WW5yFwvFQe>QDxIY#ev`f77^=?#b_NbLJg5!j;0nkU4h77|jnlEnR-g z9qF7LFJvZ)%w52d@G*cU*5+*?(9<|1(J&Z+hYDS@80wgFn|{4;9C&G=s}7%Xmr4$W zVs3%VLBQnEs>T@t0LBE>j9c-;`waFzPpRpkiRUB{P}~5}mm>=xoVQ}J14!a39RyCY z>En?5P@?QjQa2*J#P@}IX~qmsfypR34u9i;^6?3)B4&wRRU!wIp@#x63U-0IO{%jH z!j=d>^pP_zIRhJ3J5CLyC;?#O;0taL`#_ntl&TeainK?1-Ay`i&O zs}3yD=6Fnl6#ADSqtd<)B3Ew2v*7)i)N0P-l%>cUHpHik|IG!%jI{o%8dV>L?oJQ?Pl#AvX_1Jfwjc(BHX4qRmg=7UN&x zU1@~0S`lVmLi+=NukI>q|+i7boej`jQ5SNn7LMbIMou|$7kJ9&l`)lcq zFS~|@1Z-@0W^P`(f#kW_qr=lGM35Yd1 zd`?1pb0;@99ZR}!qy!c}gM4l!Y}_?ke9>%1&?d4Jug@z3EKzNp48@?P0Z$RRSSrrA zaV|W6Hswb63NBWkXM-0gR5HqOA}@6^mp(c5YUms5rpbL!XpNnDo%R|V$NdXc<~0DF zF^!FzuVvgq|N6r5pgIf6^+ss{qOud#^cq3-PWV0LtPEN*=4zTrr3qj(;5-sl7TMM; z>^FdArISivz)JOFj4HHXbLKcz2+Sa6o#CMAjwY3&uXIEOB3p7_zMFtZQ_$G7AQlAnJ z`%+I`b+m$4wkhKRZ*5LpVb8IaCOL|#TLDsz`u47$kH4rbGc6X5nV)G|sM^>v!eorS z5S%KL!`cB&8*b0VIU*==V2MW#lxVjai@DvgD}9mYNb6`9(1$ zV@y-UIf!G&aevc8*BlPBk)d`$P`6hk&{o8d-ls8j;Kra<>hu!vj>Ikp3Nku1 zOAiUaEvz35H}{ny05<9T@q6f7|JFvQ1s$PE3zzBikm(6P~U=CN^ z$LEI~`q_W|0ebS}8m;Z$Cn0~TZsyyVdmq#CphM?QJVKxQ!gcz`-}t%IV`fth8(2y8 zN6yw5Ss2^eqRhZN1pS$SyxTMxv+vb?t&n4X>x8qD1E?NshOzC}iKzM^D_Qo>z!XKR zaC&y^PJmI(E8Djxj)nHUJgc+k`I*?NCYL$CJzH~X+sAF1u8w*DOtU1*ET6RiKp+TiG`?NEuhY+o;o{G5iU_^PfeJI{&Sdra zy&-L#yq~`5YhFbE_;0<8x|0bL{(euBJh6&P7Q@ngXxO00;yfMtFTZ~` z{lN#0(w_a-(=cfkG(m_Q2ANTM&v@fFU9smZz3p3HO9$7N+#a3HI%;ZEjUA-P^6*EK zO9}t-b1C6mY=j+7&jqz|j!vj?W&}p;na|oMtx$m|6CMbBViZ+#(JvjRZXh5Py9e)v z?y?BHap@vfU(Qw6HIvw9dc&A&dn>hh1n4uN%{mi#b8}FgnQ791TFcCADxDhY5Bmn8 zd&S^f8EchJeau3`02B!pB4tL6`AB1M2rJV$zaS$8eKS zCJXQA&Z0FnMl%;U{Ws8A?F&cM2&|e|lHl!}SpfsdF~hgP`6OfXYTr4;z#Ua2UyJ-r zopEd-my*^6%}Tg|D{@sOYX+3+m>_h%lEHBj0md=MW1lQ=CefD*x=>T>OX z6P}W*E;mE`UfmdM7mME4GA9t)q!OQub&QDRS1r05ck%+QP-&rGAqo>(TAI@N6OYhW zy#8AH?r(fKbyee#d?6$UcVxGr(hWS3N$|3k{0{aQozi$bHY;+|eDYZBeC;ORhJWk*Gw_i#xxn(~m`ibl2{>W%@=-mw@zuJ1}Dr*#Qb8o{K$wVda20@;4Z4mFg&K;GFs)wCa(_A$1XAXP! zUuZBkMixSZfT7CB!~|i6_i{*+Zn$O|v>;JBuLB^bEqQK#Gk=)itndL$y%&}0>w76P zl^BA~p@^xNQ!sPn8Y!obh&wf=A$k9O9I9PWRH5V}CkAe(K|+GO<{<=A%o+bFj%fl9 z>4u?hF{IOkb(G%oi#4F-s!T^jD(%{sv8hVN0viB;NzzpN!J5^oD#J`%2P1@KP!$qx z)^I_YBgZg^onD72+L(zD=Oq1s!<=?FobT-Mhv}6sSfaQ6gICcC=Qr>W7UO!uq4$2_ zc^?lXMkuUx((;cx9r`!_`OoNqN4IFOoQnJmjZ?&Z$&aPq>(H5FkJA^w>U#RxFMd92 z4#bS0{Z-dicSmQQG+al%ZIat=x7qrli`|fTCD&uIzgEvvGxHyI@)3rB%}m(;f%#Ot z5u^yzJ{Qe`gkZ{Bvb8ZJ>3BSj-hR{vj&09v<<;zW3N^Gj3@xhvG$ZW1y4rL-Rx3u0kh)W(dM5^^zK9!?}^?~*+wiDAZj68HI*|P+m#GV z-CCLg!bUE&9kAn|a+b@=nhCM%%s~3o?-PwSPta8d&eGez^R;x@p1!1q4fC=0hINh1 zQUt7V-|X>CY~xQ!d_Hu~Df+L!_W&*Ly@FH0`T^Iq=ysX-4>yj}4VRs#@A$i~q~(-= zF3l$6p7n3GtTkC7z_D6Yt9ig`s=7AS?!{{J-nZy@;(fNiU3Y5mLiI?|1caRIa$}J8 zRC)fCp-gZG86&352fGYc)^ zf6=A|e70JfA3)tK>DSSu4hPn<=v)7nlE>5t6tt7}zL>Nuo?H;$0#Ap_kUFYu9>b6Q zD%z+TE^u2vZ&Qs-kk1H2N1Q)prnPbmrBIpd?1oc-!y$=BK`*EQ*uajnR%AnT*p#$Y zopfsqP|&{E&@x{h5P1##g9Z>|(Ydp^BQg4@D$eR?9W2FDq{T*@;- zrnRTTBN1#>slNt<+F{NQbo89Ipr@c;Z}e;sEp3^uj;TBq4h9ZKuzKhw!M)&g+{|L` z9cqJ;H@W7*p_c+k;HiR;j`Z&aP0v3{|J(oidGx|-571~b<|=;;SYpo>!gpN5a?`Wt zX|GFXCsX>xU;ZE+KD|u6r9Fb=O%hc5bJ|e7A<^cO^!NY9OX;?&)-%<=qlWfYUY&(( zORm2p_@8MK=%PfbecqL`5CSO0`6py$%k2CSVX!FS$PzglI6bQ}7aB^G;Q@U|=uP{| z8Qkr+905MtI+j@s*=M4pUsa74M6=vFxxG7=Y@+}IW)6%bROGnD1;cPH_Nhos?CC++ z34%t9U@3*Cnu)cXmn9|-AjqDJOmjqM7Jgo)lkZfS!UDhrr3%>0!n#XwOOb7nSD<7z z!b^e>t6JHD32VX#8~`;<+O>0}wP$z+DK)riiZ$_vcETDCRp~~6L~f^80PQ=tm|!!+ zdbdu2)DPJRn}ZF?;1Vfht6@Ysb{#eC*>y&WWATQzr*j)~15R-hTAxkh#ynf6qefNV zVvI8w8@I=341PwGWnH?{9`kC0KGFG;Ptuot;Z^kIpMM>z+k1r>!^bJlYtKQi;9-T? z95mPea-ZnEA9O>yAmO&D#cJ?tGX?AhGoVMs*u+`mC>fG@A&T+Y_V2-A*CYX5I51gJ5<%5X<|F+# zUgw0MQCvNFC@0}xOE61DPnHgXQxo>A7QYIL9H?Angf^55(7en#``f*XT8T-yubwS4 z(r&hy8jS2b;eqsF9Pm%n@cNCV)~JM+5Ld}@BAHr6SV8D0M>wS-6fADq266!~W($>G zn`5obH4s^Tz98Vah9Q`{H1@w)@wL+mTRe**Y$DC~l*x9+H&GRiWwLxY(jX)WV-6?D zh(#)MmnW-Q5X)r{&y{JnWxg^UHRGC)X?i~X%tBPQ^7L4=o!+unh~&d9F|B;oN9X9^+Ijl>U;jC@ zIzUp2Og^Z>I!f!?mEOze7G)N8(q@qo$suC1X zu|AeIQ$VAy@SU}D-8?eHvbdN?7$kosXl-ZBa?!IkR|#7}@Fu(QX98<9%tba$>IQ!r+e?5!pp7^~+uBD? z&q_ap$dK9h$fRLBLHNxC0u}bg(dP%;0?6Ve2P5@K%XG`0BFIH2)BG55 zR&^qrG78O3R8Pm=9#_lY3K`;pXYb=xg8ne0te)56M{OCC(_|-6qX!hnOI2=rcie zTboy#dUK{mpt2vc&+LWFIX(F|CgfQvYnN7lBEZlyB32DTW*Y`k2=DRny2M|c02^J@ zbl4~wXSacLTE5S3HQ2VR@MV$X$?n> z!Mlb2mQ6Y~bOu-yTWwKf~1RQ`0r>Hz=3Cw)du4`^=vrdCR zHr8K6e`Ageu1d>XPjK3T%~7M;wjmN$N^y+DU-CD9Fad+63^|o zCL++(wvC(uwaivNE|lY~yuqL7w5gti)0WKu^q!KmjH%b1(#F}R>3KIT)7QQEg`%=` z!8BiD+xLdV-_{4;&^#mJ*d@|f&|2nFJO3^xJBtMm zxfkM+0nJOvSY2`3Uo*zovV3lWy6`qnI$wnF`94)z#dPCk$w9E45VWmBeO&dmYI|~PHud0pOHeXbM7y}@gm>4z_t0!jD za1VJ^S(F@8;8cy%$>5<0h19FD38-x}%X{uzT+Y0>7N8O06lx@Rngv&dq)dx3@?FLa zu=~b9ytS`IJ{OFM(>HcIbnfg4y5)vF^rf%6l|~%B72>?Zn$}wL_W;{8?@outoi1%n ziGKOlKSXEFFH^U_W|gFDk4z`j>vd@3>@j-o^<8@Fm)y=ygEGA)v7SYkXCc5yMC?$u zgadAuIP9d&dRN=`Hm$_0&n1(l9C}l6ln$s#T=D#PSySJ;+LI>w@$4KyvQUGn_y%aE zM;iswh}!MNex22JPpY1^XBN@m%-b)|7L!ohBa7_W>b&tg1gNkotdX;RJsK-E)7Z+F z$~b^)L44J(M1?e~DWf@9z$7MZ0MejrNS+sK-0#o_?>j|*^nt^)ynY39wGsY!qSqPI==?GI>NmfXuG`=DvCKjCAmX)ksgJQ; zdVjWTw{1jW9^$U6`HB*t3lW+M6T#Y=#IR|lu+b#+*KwyM5Ozbea?T+QdWV4-utSY6 z%H-xASGHfxF83^`&tqFuTT||@+V`3*{bDw}ueLYJ`(mq}8MzSd!LNb2i)wqrL-~4& zsy;B?WuzANm+vfpzkY{iL2fl_Yxq-$t|vb;(J*R^;{3B&I#%Q`WfK|;N5Wd_cCD@A z+j<&I8A8aDb^zngXiYq)tjUHCm7bY!RALHufro_IAXGOlRkg@a#jIhb=s2BlmVG)t z7Qo0tFWIE0W8_GmObwwE!&-!1OpTF+GQ^Q^{@<*M9Gt}BWK5xM93e=Z16tNF9?ll7 zC@>)keY)C%#dtKT(dz5a! zX`SBug|{-T(Kv(#$Y$AKaXnLK&OnIULD2KeKo{C(5u5Ve4b|cdW~TW(2y>Gq#*Tt{ z%#onie=te0zF!j5P56Y9o#T zBS8zr1jpz{j0R(_L*EB~76_&)R0i9&%~|Kl>itNdD-4AE?sYT_-jp*g^{0$@30&-b zabGD-V=G4pvW!GNg}*aB5pzPeb_LBUYrxDB5(Fy;?TM&hpf=9dgBcKJFm$Umw8KUwKnEv$I_=BRwE!V&xLu&&NW+} zJO8;T6*|LLFtmYimg@2J-(tZY6;^#4Q{09|C_a-D!FKpAO7QFEnb~dLKB@J!$ljWD z5Ado@>{N%^54-cEUUZ9g1Oq4d=tictn2zo3PWxxJEFy+5ZY@ z-nBJgHkx#-fltG*%5YuS|AkEBMm5Wa(CkzlUh6l5K&8SVa36AqJ+sxv5i`Bhfg&s{ zT#rDEK)3CQ&=W0Fh%%)@ML+~|sn%^NLEWKaK#Xe%toXe~JkUocsJ{gNHCPvJob*AF zroYD*U$|;Vq|xD~n{xTHvLvNg)r2hB;=9D>Z&$lbLgC|0>UTHkRj;^?_VkH1hLNLn zwO(zmHQ1D9kaVrzCHlY}N9ch^hqSV9zvl8!a}ovz|6M+akmWt@e4=T&nK|_dkX7(WMmRn{2W1^vOFEf$|nZ zO=vaG!F$^fVM-Q)l)su+!Zd^;yo`{y0(;%It?q#;EIQkUcMV>(vpkDYEbni7ZWbeU zq0C;fp^hDplfRV!u4#A)P9WnD$r80-MGM31*y;FpU%No)RO| zSf<4aYX z;_GOrDm6(V994*TZIcNqrJ~{ne*K7u-u=gS(XexXy4}8c4%>9c6SngY&mW=Jzxug! z)77gq8cjJ9V24Z2<%F!1aB8aXok&Tu5aez!0`nM@no7BLy>@?_x_4XSo~Hbk#C{j- zXvGYxMB;eHz_`bQl!7k6j4Q+L47Ki0S0ixJr}IopQvwm*jjTB*Lreu?mF z`y9v9c5iuK+xPg}b~He<_QxW7s%>ud_h)jy-J_|`T+}yl*KdzZqD5foZ|36^9F2h& z8~E0qhZHaSheHgp7F+=}l#UZl)&(WY+iz2u1zBNHT=fiA;Yc0@OESPbis z-mvjn+fRY}(*0oZAn|q=Vl%*6Honk%G+WuW%77iev~kIv;VS-~9Tp3z15wV2r2H#B z4CyzqdE-Q2`r-Xm~wnYIQGBOp?e-VPJjOKBecAFkj5MfE>-0cOwz_llKyzS zL3@_Z)0~7ek#482YbW<~ zdmTD^`WSuo^RA*7-Fms14MY;mlFix}B5`gbsR?=$y)TwSAs9hT4C#_G47~q$c6gu2@%< zVpwDNrNM5j53;{n8S1SKj->b+oXyPV2`G>SoS-viO4L;)fvdtfdquP;8DoOztT0bY zU=?thCTqhOIvG>cgm-FYlLyg`reys$D=iFDND<2qBZ&B};b>KGAy1U4VwK>V8m7>$ zu&KksC{=$izJ(c`F*2fOJI+@kf3U!80!*DI#Huf0J1;mzeYtU)W+h^x!!}>@gh%OG zR|)1qxo%i>D&awS4&iWro#UU^G6IV~`luyI377fxoIoXnM+MJJKcGn5fX!pG44iAR zgss&E9Tv6mCpB)Sx@GU}o^rTT8VxsS|9Y2R`uxi{ep7H_Nb;c1Sv`e$60->tGVwBT3A zEkO0De7P~7it8=Juv6^gTxV`lt3<3I(h5=z4m^&<%hY9nkN8GSa$;ikv!5Eu{Q?GwVNU-8 z%jNu>=L2O1pd?{XhtwNh00%(b7^G45ux2*b@XFWUn9*vcpJye?kjn z`zK0$MV3i;gxh|F_ZIqHlqrk%MMNmcF(M5E_Q2^@N4&649!EWS-lhxup$Xm zl&19wSJ<;KfXCtJY4Wkm1N9_=Lm<@2!V7!op$9Al8lT_y!3XH%*)9$C zEzx8oMLLpJD5;mz*pimu{Kjc|#phi~H(j~J>4DQY7?hqg%O%5>wVJnMMByB0L{!kOH$3Y3{6jhi!;5{QHha@7D4}*b zBlmE6afJa=joX-uvu)Zi9eXF3F)Y6g6a}D-I(TCZI?$9jzJ)dnX@Wb6P+RD10pLbt zfxw7;$O@)Pe04lqqC(A?4F`68IRo$`{xI`J#@{GT!CFa;?`(`LyL+UaI1+)tn*^Up z?pO>s0eM(nlw4DKN9ImYzu3YFyZHfEmrdDhYIfM+elJyWoPIckM5*H%?h%6NIhw)Y zif41X$9kP>kAn>yzvxsK8mHW^&tPwuqlc8&gsrPfTXgGolk2dIauew#ok=9c;vF)$zJ1<4}&U&ux-k>|N zYl|Y!Mec1==a#>@kBP_eLaNCb$LL9n@y~ca-UHpAl!P!D9nxB2-O~#3uR%iN1TLYB zuQ(Bw>4P=w%kl^qD;K1)kSt7~7p?`YJ0I#E-IDd?sZ1MMsySzq&-|SI)qv|Z1&l@8 z+%q?C4;760g*J$6_MPzw>P1xWQSn+)9eYo*%|V^>uv5mjU`8_?Yl%x!n)I-jg3ngI zzY0Pc2_FbyaIl5x4Jm)KEsnENn2RZ%L=M%4xmrG3pN-@}fiK4U)ua-~Z<-B%iC%85 zZ?08{<3hq8KVn96nTWY?E)jQH2Y_oT6!{-S-H}YmdTUJwq9c`O$Td`_&v zK(bzUX2Jl#jj@)1oj=ld#K5Brqfd~p>!idkQMU(|HrWzMG*no)KQSdqs^**rAx;$1 z)U@JBUU(trQcE01xrhsAM#&F*3Za|8;nL@lR%SdJ)6x>rP1hYXc*$Srp+;H@J`_`` z)S|9Q8Vs6lQvYwzo%fHZHxTcC5ff0bBW3>U)7Hjuy6M`z^zz%URO^JMmz+baYjd83 z=xWGzwnW709lDTK_CHSxRmLS-KNgD=nK0Phy+E`PQ}fIX*d&a>=&nj#uzzxKCf+LQ z_yi`5&yPs?jx2%v^t`GH*TbGBDh*9S+`kfJz3!;j_q-$#(+q@sneUPB*dR!G11<=5&_9k*25n-8JAkr(W7j9zoZoP;pqm2iX~HDY5}3Zxj5MIZ&U~sOLL)W zS({wY31I_<%XqeY9}bVySuc6ON}GYB8sp3)s%XCjmng($&+-yob@`<-o|x)VwHg-D zP;S_nOj3Gd+6_Ir^PVT^@gqZ8-oJ;2qp+~d3<`g-b^a8+?D>c2x+~XsOubYKSe;=U zX5E>#*fz67yjCan^N@9b*#)+?an71gcCAzHZpj0l6Mt2Cs`94|pL4ihU?fuBe@0d* zb0s4*z;NRBLy)jatl-PGmlAhOU`y;kl#C#Tm3!J=NO@xm_ z7RQ4}gh-o&ZH!~S5lu)k?Tna(@-_9GEg~#xVzo3oxeQu8hZ@zopIp}AtykB#@PtEP>^0Hah0_Mz2b-rGShnTxV%tY z-h1kzr%^oYP>BL|>ZI5RE00SX9b|XhyY!rWm1ENA=+L-+R4yDImDTV%> zjW5$0HSPfsl(mYQ$Hc@X$ED;EgWozeLW!{K&=}Oc9xbKM%PTa|$P-y7(af4EGGus=#6LrS}TG-lnRbTV?Y)oHNw(z_9uR&|)Oqes=;>xBai>)G~ zS8o;bjGXf{j=oI1r^P|^VW?FC&1>rL01!M?8M;Y^&ipaKfSJ@7jnoi&q2R0$sySh0 z)d6G!$EJ#N0Ii+QJe2A1_$~%pgHVvhNN1`5@^|Hj!lYP8X-X)PjYSfC21uX*@hfhxYa9<)8H&g?&W!A{}@Z zEJ&d3ZRXn5M;>5w@!LGj$s){^H{aikBf1^>vrj!mzxul$rgK|;)(?!?`BuD{nPej~ zno3C6u!;FgB~%k*(CshNC+?om`ksA;e9{F*ZlYpPiA%6OCR{iVfwb8{6pFrZKaVjZIH6A`oF|rC?Z5DQbIp;qViu{Yq^UJLV@B6!#JGB-x*Zk4e|C-VrEq& zg>X2NAN#MJ(gLq30WiTjJYnU7EBI8l>5Q`lEow+l#ikM8<7!+2PTavv%o z>)bkV$=SsIMsP=XH=QZ_a#H|c6-jx5At6wg$_-Ewf!B3TTua(#Gb z%`-pe=Gr(Nw@t-zMX+5p2yod$rX9%VkTY9}n^n(iWOw7lOdaZur*vR_iB^{ZHXT>C zVUwet)`oAsu9bO8aDVd1CO!D@Y3eUsp`N(zq?Tsh?@noJ;|$$$%O1Mv>NQiTc3AiBa+liAiD3#)AX%B^1F2ZQ_D11*-zt1 zQp2nB5g(}Je~}PYO1h&uI>h>NGNy#oQkv#XT3tOrE34}?NrXT7k+3Sf<1xvcl}%i} zTq+S&AomFyJaRd7CkT!S<}QgONKE_E(kk8e*of}D?*w%_WA+)aXo3`NkowVl@4AI$ zr6loy_$N$LRm=Q*HMa+NZbr1=pZ5!<;C=R$!6a5S6R!jnwvtj0|6dvvyI^x;bRPW32cTqET-qSXl1oe1ASi+W}b}~ z>Yc_FSQVl=O~G~7!y9z+{1Wx{4J5ZbQVc7Tlm3pkPSZBFpvLblIDYx;%wIdQZg63|5Fh&J6ZGieE*-k|MKm0B^*kVl zCs$2T-++;+Fnz$vJfTiQLVnCd3Zb`7EG#vIrotp(s@-~O(T;`lrbv^(tSZ7;PE5!8 zK|_{_wP9voogA52NPpESOPBzh2|@7tde_q9Pk)r|xbrDx0Mx-T+*ezmPp5>x8?EYx zvm+mcIul%jPO=^6vbo;{{FTulLt7!f%-PAz;E3`(4eVM&0XQimeb5(0FAHi*>kK+RSE<(U%= zLkQxnHlw+!ArwulQru9;&fWs$i)sg5eN2=vhyhb;mr>MZJ8K(MGoM77*EhAb2jQ%m(KoNMr%&C(BM!siysyG!E%} zk0Y+&Z9H;(FiPhhWwHSq>3=fXqLsmvuDE=U!UpFH2pWjAxkf%mN49Ni_H49Sd#1dv z#97-Ja~nfz#3%b64xfsR;3Yd1;U$)3kF=cegb_Czxsse9d9y%=#6e#3%rH|Vo&t;p z%t}0h-?Gnp=b}zK+BrWGcgG{#F=ZZl24`BuZ)XP zbyc*fa+dPYO(B_b?qWmrUX)j6>X#SG6L`k5xO@Wi_*=@wA0B2G2=|4K_&| zA;}K_pYuWTga#I>9R>i<k#Ss2wrGag4Tj2w~cGFBy9qiL2zJ_c8i`E*HC& ztqiJ6&n0aQ2{4L&VvT1>*kM;%M=ys21!4kYV4mU967e5SC$vFCcisOCji<{@bS6pt z98gM1{xjU#q{|QX={Z*m1F{8PfBY(V-kF4zUnQ{ zr_cGUtHdEmv%)puKOZOTOoD#)+ja^5>{d^|T!Vx-@_Nd48xM%JQWx8P$N>eR&i<&` zQKUsz>E@dxD6HfuiA2c-IUDbsl;w@zL7%dpUGf!Wf%u_h&sch6#~q!FG1a^=bMQ(m zI2Fg|c-?>3fSJmwG~WTUtG-1AjFOH-6H7$z9ghyPqvp=xoF!4;8}s*YU+gUz9Cn0z zmz0h^LE{QoYDFmneh(*!iB2ZCQ4ce#Ujiyli#>*RARh1>=|-EiNJH|Ta>JBB^8Dvw zSFHgYo8Bc&JpibJX10AK64DK#tdDP+$}(CKn0VdUDd*}EGX)=Nt?Hnar9920vs0ra z@!2HfT!I&_ZOq8xmKzi?;1lZhd-UY-AwBxUS?Ui~-2!}n4d;v;zV{nHm%i>xZ=};l?xLmsh&qXoXZh46p@%s5qo=N>>r8yRdOve9C@$C#2&ldf zl|DmyQ#S2zMN;HphcqXuQj8mC5-LQoUWqf)ScyO9^f1Dm@ItBZOBW#PEiPFUhgnj73C{wA*R<r88ci2qobfD~ zYG2!S_~f&TW&?3j6i*v|U+vjgu*h1Vrd=1r+SaEj3^b#Fd@eb&oi#4C;f}s~XjskW z;egV__XjZ5YPHy3(IGteZYh@XgwIJ>Nc#Zq34!;L!ZFwd>wuC`3zv~s+K~!)P@f3f zqe>NJCL*vEL1c3*GpCh@Dyj_THBZC3_!%o%s`y*+dsbr^i(7EPW$!_X$?$;{zwoD> z>}%nUv?9GeZETJyh3C6UH2rHvtT0lo{1wzo&V2dY(k2>EhaP?WFdaU6iU$3Z{x|Id z_frr7ARXRKdhSj8X?-AG+;tnKTAN$K|7NvjZLH1?*KC2O7AErAdkbPONqZbs%@q>s z${|@(qSgL{-u`W`qBp(fDmr=iJ{t7LG?@;C0Ym?aaTTpG;$|~`kly8na{qx!2YK71A-z4P$NRCCylpq&79|?6xMFOMgl$QHbI(z&<`l8Q0 zL~sB0*U;VpLbxDI=452n8kFnw{|jvvmT}VPjFjD*)WKTACBiKRpn-IV?ALrtu29te z!m{Mdgz=Rb&X;lOC^H7SZ7s_)R%j0(jR(9ccK;HW;GN~Ul_nwY;+U41PPW-HyrJi2 zp`J|362@B7ifGDpe0JZQkpDoL0z0=>8rX|=!OT+4fbVD((u4xU?A?}7F*pBN~K_4)%z zr|JNbqc9oL%3w&h-f~F>1M`2#CSHq+oCVhsKJoW5Eokkz__?##8)tC#i%4g==BRBv zdImzh@yPk5gO{Y}Jxf!1$3K28ec>zi(}}0=qrp=0_mIp0qImM8DiU=el7NKuxG4!q zw&Xv3!t$zzWL_+dc?L`&x^NNns%)Zx@G{{1Co#Ut6eMCU{tDus!oDJwIW%c0Fa!zt zOZO#H$GM{q(Cc5mkACXAzmN{BCe^eTnTc=&j+nm&v)2?YJLTIKygx%!{v~@k8+S## zG#V#oQb^W1Htq^p?NnN1r_CZwG3HVd&Qho|zy{_MeoND4y5`zAYZ5iiQ)F;tUj>{N zlt|DTxT!m<`bN#O_t$8S{1<489I%uyex>b$515U7X@k!xNA6UFgz6zEGVj$kwc~b;d5`|9|-LF%3tlE)-(6bnFa@E=|Upw0~_x zx7~6TMmB?6Upx)6H}}e2yp;sF?YC!NYRo0E7ClA6jVZEX(xHQ^Q~Js8{Q`RV3)ku7 zkq2q1A5vGd>efUjb$U{jzs<+1x_KT3AeEdUXJXBtLcLcxw9=Q_iS4w)hzVvP?Vl76 zt!yg1r$zlLf`Ei~g*`W&(o%0qr;k2JuYBGT{q*;IK3%p)vbJ$FaYO4SJ}8T<((V%1 z?X^#b_QBa=9zh|$ooKsY zCgN<3#(;S8=o+2}4n=slaK!qV{bk(D9H(N$-gM(RWL#rgZ-VQa)j1>Htof>#zeMF+ z)msqyfo0nEx?|C(Rqaai*+My#9aOgwGnwqX* zHtLi`7z`FUx9X<%nEt1o$d`c6fL?r$z5~s^jBhHQi`-bSp++@&k+Zyte8jjKB>nsy z*+^7Fz<>C$7%+**40W9B_UY8wEqeOMiTH5n96Q5RVnEt#mknA0Wd!-R;gsl+C(cv1 zyDEgD+u;&JTn9j{@}uz%x18Sb3#kK37t9i z5WV=;F8%Bey^gNhzeHoLKT)m={8?n()40nVh&yZXO`X5cOh9C^&0-85Gm4M_Ad|JW>~F+@8s zlo{nli9aqDP`94BFm}*oc7TM?A%ph$A|(KuAGNd-C!y8k9Fl(q3nf5KImay=txe79 z6+S{$ zBwD1|!~v0k1xFc?wt9m;o!c7IBTpXA-VX@qaA)c_!TG}3JgJnoHYfD>)5oZj8~`ol zGc-0ys+-VwbAztFbdC0{iEn@~w%A}ngK;r&p{df^M3|ko8aF?GFwwcRMe8(gggU2w zZ%V_-l%8|N8ol#vZ=~xlJxga!J}sI6pjDnbq%vrBu=jI~157`%Cp;06&5;ufNS*;; zzJwIU%JikAUUo$FJcpyKngB?3;7;Jc6f_ewrR70~&K!S?o_ozE{p{Pmh;F)Um9|*& zZ^GK#mpF^0c^NFYCQVqED>MC!SMTq3b8Y6ijbs9dYV;z?C`j`@uN-1AOi&tX+~a2@ zI8cGBGz!O2#KengJXdGuDs%{;i6~0=D$JG*Tx)__U?|nsAu<<%N(I&a)aRCUixgCO zn=gaeAAJ+ue$6_aA5B>8Z%L?XpvkJy+&9f&af*9X1D(E|IXmL@Ndli~aDYZk`^vuv{z2u|YX4XhcP`CwoY?-wFodWn zRsS0U0Ae+%m~fpbHDnevviv6AZ>0$#&mkcGXl_b~aBE+$Y0yrCF`2O%*+t}9fFS1t zH^Rr5@K8&}6+52GK$0Bce5!__z)Mo=Lkj}A4WSWn;RBYUVW11FGf{B6T7<(8K+NN2 z3#xIRJV?05eTwiblQW?$02j*u;s*|NR-0|VpM@Zr2Skv&bE4igc4TeA5!&a-vTjV9 z-5OkG=`0cyZpy3bGU>Q`>-33x&(ZO%6lxW;8x?&+&Td3vg)=UP@#$x_=;Wyp^-=@? z@?>i~DJ0$GnSSLJmo`dPWQ1}NrN<7Mb$gNe-&xX$`GW~K%bv(C2Ide*ZK+4JHJZ{Z zZ@ZM<^|sg3{-q5hqO)K#{w!9{A%9upA%w%?PE=Oz)IIxBeHyu(d~2vCWPW4N!ai3TWVg|o+yJWcGI z;WeNuo+n1`&z%$n`*^wR)I6Vn66&BhcE+N4KAkq^J7OBH>kzCTOOssmGrQp|78>oE z3|KrS^svZ^8?R^2$paXxgxtE>*l)2Mz`}&VbZ7cClit*shw~>Zfy6sa6A%Z4>Te*X zGI&V`8h4R;R;C0qkZLhL@j`48ubMrmVo#5DrMiUQ+z4`Sv;`sVKi-wL-8kG20IGH* zJmC;FRqbGYuM&(j5E{R1odr$^pjj$tPtJ(&Fkqn~Y^2xw9IyKf*9r4T(%B z(l^0V-{c_K=w`yr;1%(6o(!#17lW`dji{-3)bs0n%a*2C3smlG9o=AaNr}0JR_OnlG6!FA1obkB_yae1awLL zAgNF_Z#*WC{KV>%W_zvGfv=s=&uVU0YCF2MhIhp=`TM=jVsotNa+xQ}eE}-8M02#4 zo5$@>TC9Z`1y7gYNhna4K@MfVzfOmb4e5iQc*@_+h&-BIeCSNj?GR zB9n5w3dPV-^0Sl4kX5;t9Ta9D&bi57>3Y*=Zrg2D?RIuv*0A@2*@i3Vb<#R_XgHqI z8(wxT{ml1%KCO)(rs>uR_7wmEjJeTmAlxs4Zjt;472UKTOeHOA7?O0QCLr!b)u*s5 z0Qtt;0=)m#VQVnx(`fS)ElnP!pZtN>(d%AzEo}^^Gzhqk->XSFt=6PMl7Tz=L8O(8lUsY)H=T zlxe}|A&)=|?ymb_c{yH~YEd8xge+rtELVkwl0wQ2nq$Ftji7Rf&jBuSt?Az*sm*0> zq=YYqRpxjtnu;AJNZuBhA)C7bsn{w^fEAA$?zEdcA}8j-$mdvdT+F{qB!>>3yAhQ@ zq7P=q(@QwZ79D`9b5R=Q8#E~d5J6mYi5pfGpy`5i(JYU#AIqBebuL9Oj+|Y69v3Dr z)L_#L<7zS(_=gP&%?D1Pg<-jLW~f|!D4132?W5oR z<9q1Lm}s2B$iVD56zVD{U9s}FXO5lV3}KYAIdW*4a3NBhXUh57_pEg2;QC6aT@a+h zssrS+OibtX+v-1ZG2XWQCiqn~GotXJf>?-A=;MXwLr9h$4of!y!Z|)iN}XefN3Fu)Lqwn6#59LzN0@((YzRs{gN>a z(_)U1DS??9!m->Jh<-3lluSo+s{}1VwC(FJ{%q9$lz*cmpI6j1EsD}%_(r7PP+|=> zddoPV|8z^I42QfYSb+M#wd!rD4>6#Cq-wRJcd4Zf)Z;+noD<8qq9Da6vsZ2Ic`E8y z0JvdV5MHU#8jJuh2$%@|p>U>*3!|Gp?oCt6ikTp#j2w?Aw6eON{`}5U^!_`Ka%I3I zDGG9q#hH|ofQm1JPCob}$4~M$;B?MO3t)#(;snRzG3{L&(E9qSz%ZoBtU%$SBVwDy zHkielbQ1fykanRnPS1kLlke_C+V6E~G?~(yUv)kG#P__02BXJlx^89P%ub@DWwJiWz< zzD&Yh^bN^hgNHpUDNZgBn2yx!%`RE936Yr)7v4N96^@Poniheukj&$Unt#%W#gJ++^uLuRh?C#CSZS_4Q?1TU#?5pg5lS{4cc4 z>Y;g*cdzZlW?LK2g^V#hmt6dMAs*YVB_^ONnt->y=4N`wcfX2y!$*jwXQ-<-QikT@*a{uARkmXN;Aeupyl(7446qD3wqrc?4!z1*WtNbME8gj%Lh7EYZ6P37xt#vsJrC3SK6Zrd#f;;%DjcU|Ej&qmb~?7;9ena^lIm45 z;NKHD@@TU0c#HP!S*Eo;JudrdrDCJ=Ez(ad3A19?De0X=jn?Rb%_?LZW=SQ&g7dnrH9 z?X!j8@4S^v&HTN$ea5oLhN{DU^2m_3hJLn9VU*$PmN^DtD3_w!AX*4p5c(_ zZS~Brv(9BhO<$x4ZUW4SH3)Vt#giz)kuwHDVT=ZAFbrk%Souo$$JC_v+*Dq|u+(Cd zTDoZRHouBEl0ul5C_xSDWQR=*LDqvc0FuU2osblWc#lXB4jdo={!eWYjfFI466gB! z{}#8gWs}LOEJht=U-~mTdQN!x5r>4ecn4?M`9NfdHikr}&UC5U>*t(h zQvKtw(wO$|@6*b1>PD&qf*`~Lej%+1?R=-~wv2V*YTQPLS>KDix6K!&%>fBa!2j~a z&!O-9JFlRP6ZcZTvq7D)R&K1EtY~vJ$3QqRDO2g3oL6Zm{VWw#?eOkevACJL4XP;8w1w(2i`Cxe6t6(F1=s z;hf=lv-g)!$<_9VWXso1#?*Qyr#^0x+SN4X{`yAeVj`nbGIzpUV>fk9T5VU~rp$RX zfniQ9!wi4(vE=968HXU9X*N+|z+79z{zF!7w84>dn|yhvhOA)AE)Gd{n6WuxY2C$J z&14||A^&)@<+gVrUdd;mUTCP9``Ldl7PCN3neB)-qG(7ELn;h3B&h63hfmN?8GBVQ z)i}_}uOO**SNB~(@B7FR`j`LlBdR7Ab`Rkl**sb-_8aGj&YnwV2sSF~SjBE+9PxNe z``4$moWi%+6F6ffcD2>|>wLP2`<%8tS#^88l=~$y0g1qV%U9n{-~9D2qSMdZLj&5R zPGSn-lN`>MINV9NUGA79WkH2m72CX}D>fp65GgoHYg(7IKT;|0&V+h&p3WV;hyLEz zK9By<*S&x_ZgcDk0kY)JLp&c@LpQ$Cke6TR2Luzw|s76NE<1sP^Ygswv*-| z)M@6J(J}4c+hIF3X8{Zhmmu}sA%C$?lNxu@*8(crHYsnBR>Pf(`a~@9&T?<%&uVS; z>6E_n8(vC(^Q|}0iQ{)ue=w4|0f`~DEM&pq4mLn;;xH=AWYErM0y>`6%4xd)*vyca zjZVs3xJjpv-bH`&E3c=2{I_2Qbz3&({G2&{f&3$8Enn>%H1imMrbKA?ss{T7_fu_s zcGJ!e(`DPZwzKbD8|sojf9HRagx8_d=SKAK6Gy2#NM{^Em}qc7r0`!v{U!71{!}tb z;M1H~xqv0YRuB}^JsF|OX$%-mn}GSA*2I^ng>amnpBIcfj=4x>)={EpA&Z(}Fz5ix zaka=E+oT(%X+Y&TQ6ZQnEjOc->q!}7<5~s(&6pNjCueFRy>`NsawUMaXcj=N!j~|C z`shT}LyqJ@*d+HmUH}57szQ@+#Sb6}iZDgw99dKP#-!rCGr7@DyLu!_JM00;G&E60xbSk2;;?vwdPBn1SAAX@oNRQ5SRWrsfX7B#cRxVf>W<8+|b ziI%RWA9~mO=yyN(C@m+iaZav*-s;i}e%>06XlqNvkGHKA^ z?`yUz=+WSuvtG}hEWcQ*A?WQgE3+iZHe!Rl$mu|dXh2i?!GHK_`tsLbL8p)2O-p?# z$!jG|b+3C)aA$(~=%>AkoL@4m9^VYV6swb&wg=<@%7qE$PNm#pkmNZO@GcD=gxTn-)lNe8hmt-B>a|j;XL|+aJOk#XYApwbUjujAWHOXfYS>Z=AXkp0uUX_O;-Zw<07I(F>Fhbc8#{xG zKGRKUJ;z;ITE2|VjjyKf{3m}%zxtjBICLz{C8>&|I=HaL@xPnHF>Q|2aR@vw`@^`# zAsvd8j~+}VlF3|X@|KIyYUUb?7xOA zbO1pzM#vld{fx6St|d;iW#eV^Gnx!U>H$%0eLON<))yAuiKj1%11=|ywFYjuvWi98 zNe{iL8rDl)a#|t zzAh64RCg0KmsEU9zif>sY&I}k79$CS@5sBlsh0bo7bF4KOu!_uE6tdq{5bBk_s?YF zU;BL?LN28zR^3gebYQhlKm7w=M6Z46UOIW?0a{5KoXJ=md@N&Gl;S+3ALc5_KaLWs z;uFM3EFEYK2T9*o`V%^N^j>=POV;TpzUPZ+&q|-hlQb4(?p5Tg&&M&k;FZz`ZQdDd zlaBH`W?g90^exib1(n@tZKH7kZ1&hprJ_V0rGM{v;0f9o4LH&V_!CTDEC<{e2^fX& z+1@2L=y&`cevbHeM!grKXC^2Y#Er+RY^o9Q99mA$=j|QoHxHJX^1os>7WFv#jQ@Em zcsGZO=F_trLSV9ejC%?{f(%w!^9UG(?$)+g)J))hA8UjUGDCWSFJ=O5ID+Fj^LL61 zmP&GJ=M55qC9BDZS3WY!5#nZtu#oLiPv-4umymi=!lGdFlzQZ~e7m^{1X8cx7NlSR z5AOi5cz&gQDiUe6F=d*KaA%OtjhAcq3e=qs{UG_~%vDu6g8`K)=h9{hog4tC)E(@n z>FRUoXMgEl`a9qE8}!?M_6UvG7AJ+BQbL)n@svj6F%4Ne(4osnh<@1*5 zoj>v>erMWK$pKXyrs^SGv*y!660+xKF@&9#-*$7KZD*Y>M$7Qa%=);9XuXPX(`EYfJ<(-4p;NN7;QhdDGz zQhXQ}u)mv9^R&=tiyT%)?Bp*oL7Dxh^Lgf(E>r`|XRc&oo4eW1Q4Ck~amrtm9nKx< zq2y;1bQDAj=h}!D<%BDTU^bhO_)`eF0)mACHy22b03CP$riV8~07hUJ2OW}#{x@la ze@LwXj#jp?!m{P>%ef?7+_YMj$G+`QM+87rJ z=aY=L$v0XCKlzd0lM=D8eJv&ONzQw;Myva8p+CK|L;vuH-$Q@v``=B!_P&Sd$rBrF z{#feusoz^>hoIDDQvZ*Vjn^VMV6I4NWQiz9hjNMY&no|=SmxPAg!5Xvx^j1&xOQ`l z?Tp?+y-{~Mp`|3Dk0*5X!BzU_Z+|nr=($rmb>b0P8YHK^loLYoPjEI*-jkZ_$Le>W zUSQ57GqI2gLbNjI(wS!-rWfASr+2;mEp+w46&jCH8E?%&G2Nbt!_L;iMSd{j{Nztt zew)>1`B>D(*!JA6GrldKx3xC{p-SiW>C+>6;E_|*AFR=YnR|s+!cXJMf?b za*DqvoJ9{iEoTNK372y%##ESTjiH&rD)$cqT<|xZi}*YGs*g9`#4FfkD3LHT!o-`B>42#CVu$Yo59%zsHEK zIv^#5uL>Oz->9d+64i_S0wGemUKG(*e5fs>|r|OZU;$R}zi-E7VPn zgh(4~-N}0ObuI&C07T1^nz>PvW&j%msSYnDw;(`n{B~ zaZ1-8TA`o+CvT>2{=VO#Pd)Y+tsS_IwuTz}kC=Y0<-jCD5K$7RICK=bE7D**v)a;9 zm(HDdjBdNGL+|?0FQuC=U!hSd?$d)EU&mP40&U}OpI0eW0(mapX038<-_+VH!vAcy zg{1$Cs!0x!l!)o!N1vico;Xe`E4N4rUP!HAJOe(ry$RunHAngxo2^k09IXs-#<+^R zTI4P_VW8rmntgQ-@(@Z(X!$}@Zk3WV<`B)q`8k{h$=@^qM!Z#79?qLR6CKLS^BYoT zmvGA{Nzi&U;fS@t=X_t*VD4{H*&a#!l;>b4b)jj^frVe264lr};?l@Xpy>A6>|)4zPjo9LT=@VDvC zM;@ouz1Is9kWTn?BDs^ zRBrR!Nt@3UG*3?6Ok-ETGhUa=oyPZE!Yv)h+RaNB+c#v9_qZU%BQweMlMkMyhezZ(s3clsoKn{eJD zNZ7A2S#Mwf@Isha+ynqp4%N1$5OuXoLLM*-L^$GclX@Gfi+XclVN$pf$~A_2VGfAX zt=;4Isoo+0Ex)dWHvq}k+@-7rWD%jDm^gCLwv53MCvKc*Ym#3*OPkNhQF57gTACOB zF$WKYJ^KZyiYZBI<6)21)-Is~m)=0D`>v@TA9P944MUiy;Tq8P*w6Jq!uY}MdNeDHin=fCb zcfRe7bp559bpG^{H0UJ;QOyBLAlM!%USKN8o13pl{sW?oGf&X92hY+!{n0O?&$@Ay zwnh^g^cfMDZ;+$=e14xUpNpz|I)l)c_k1R_48s+S$XvK;$o7zkKJ&+ju*Fy{k4tXO`;}JE`(DW%$k`8VzgBx{`s@ga$+1! z6Zjj`CPx*#L5+utG}!@{W=@RW>#XCR`65{7xnSL@Nx}WdHvFzGZnVfvPO2L(CyZqrX!e${aFGE3 zU#c9QURh3-uD1F_J7Qu$7_L_`cc(uGv4~_~DyBFFq0b3oJ&%t2BA+r>t-( zeXlSAqRmYe1Gk0~8cma)XN5ZbeKc6TlvdX-p>AhcRc^{*hfM@l4~bo)R;M{PsA^}& zYS&;?Na+fLE&T(NPTRcd5SLIbCUkq55Iw4_S}8!?Vl?9nPg!Oxe+mm z$DyE!3n8xg*_kHI#SCIlKU4K}DZkG%5nW8iu{Iw4F&k6celPohFq57;er`e^{lpX0 zU%G^*$>tx!0F%bIm=cP7#rJZ*#iv-}y~d>Ddc@V$Jawap#(rVQqa*MU$M$?o5z^gm zIYuOdbNFX4YOH}`Z$0PG7e zgji>Xs&`fp_9EBX?r9!`i!0T&F(|dxHqP2Tt$ikseZD0ozHRQUo-zS1f9_uTneTfY ztBJ~oGr#1b3H{fs0ayfeZOB$1vSr4ob-Ff{&q-6?3htxb9>)qZWv<+G^;XnWTz zZAB@)v@sNsNtGMg#{$Hcn1B@S`MQ@~NM`^lwic*9i?*~@zsv4L(9#OA1 zq4CBM+S7TAe&+jMN3Z^@LoE5HzO33H_K(X%HYj1*%dyPc2yFx=!gIDGU>m_|!#j)g z@#!*Q#IdxEukBuu^5paTKX?zF+w4(ykV*gtlb)7s-v(WmOI9moF(%uSzSVI&uDI41 zroU+0ceOrV4S}r5RFvb143cZJT{96&DdYZb$RZoZ93#S%<}e&Xm^vrVa{Qd(;lQ-C zK)3PT>6lz|&3v6XY%l>KBW@aJkMkTzb|4Rf*K*yG=0)W}Bna0OiRsOv8q!dV6pn`t zXPgb3h{NHj>@rcGH1>r`7XBRG7ZD9}hPHZfkt2Xh`-#j+gyraXQ5+_iFSt7;VAz}p zCoDPTX`XFK;Gh7G@WFfZnM|dn>sM1@)iy|GX9akW?FlnYDP3*zN+_3TCor}MJ@G%_ zn+1mENti2zJ zUO8^y8Aj;c4jtbl`twhmpwK{059UjKz=|hlrNawtL*-K#aog-NrVxMg^C21| z5LbjBrj|$!a?zNe;&$pP0gPIM+01!cE*c6AD)ulxCZe8|7W43EK4?nuoTjbD$A*8z z_63wuSg1a0%!)80kw6=xgRphI)`xdvm$SdACnKI?EunIZ95N(C)FekZoSO6>k~svg z@(kekhqE%dXJh2zWQ308j6>6h<$J!-Z~%PW)Gou>>;wRu3q{rS>=n(`%{0G2ND0Z` zl7yt8QBoEcQI#+gWWtb+v)oLcYunNq2S}9C(!6Giu459$DfuBNx5o>SxO~m{BuhYC z-^W-uXmj|+OpDAOw25Iz6$dG0lat>;Xc1G|u;*onYO2H_M^ZK0>?~Dyd3~0Npd7<| zhRW~T?jfv=wKjJ2U4vC^ev1*zW{bUh#0hkGQyTOqv^nh1-+1%$={57O^IDoFz2h(WWFmg8-QMP5jzKHtS> zS-IK*&o=nS=i0`wUBbUxdv4bHLvtwbg!Tp)xx?Xq-Cl?8zW*rQdEXgY-Fuywe3U?O zs%L$5!uJz4-2{zkMM5v}t2cPQJ5#}0L*?ffbs)8LEDonvLHtXi$k-!3SB#}?T|7BZ z9Iwi<>c_-6|AS!IF<684gjxrHQ-SPJ@5S=eC_OMHh9em?sS?h*MF@CZjI2O=t8*mo z0X=kFTvhJJxlko_AZs^X5RwWq)4JYa5exi7xPj3MU<$0o&BYdf-@UR7*I_D zG%i#RLZk9+=^!z$MXo4H)fsfu9+N+5ECxboOiC}}^P>}FoL|-<7?(m?%C$DtwmojJ z%*GG}Lr5)=Df7`Oe`qA6i} zTLhjLY9g4$pltV@elA z#%E}9=3e@dZ+|8IwJ*AzhNGkr(0mpFdB-8uh<)ul?5Y>5En+&Ujp;(yt9IXZ_FT!Z zmivG9IHD<3`_MX%>F;|#@(7(c*P-rU&6qsxB_p}fPiv=*$B+a)7WRTPp*cjX1dV6) zG2$!!2&Hrk|0IN2*R#I@ZZ?wwzYA=F5E(QblJ+;&qEJnQ%eBsg;D3;uRFf>>^BqZ^ znya0io@m!#nyvRn0j61WuDPe1<$uFh(4l?L^vcldx-jZFes&GM2Wv#COcxXUU!&unQP{ z)?{`&baFJMKX~u`w7hl+ueaSC@EQAnV819nZeNecV#F~8m?&+qh^e3wx7dCyLoC`s z)jVc7=n~D*bnn5~31*-j`q748!V0uN@i!A4IO;i$2OZ-(8G&Y;gn@wXQ5wf%(z#)a zi)~$V0oZWj`0}~U6JUH@^82b#h?=b=xWQinqvfS>+dpf>lL-Lphe>4odi21Ip6&rS zU@DARGxZH79RLYCd{H1O?{d+D=Ildmv#AtO(1k{wG`zn+nYqLq5))avBOt?~|9s5N z<;_(63(iiSYpR5D=0kA+7P=_x0TYO=lg&oFK4jvl;EMu9CgbqzBsF1&hF}2dqYNe- zKZLU+-9^67G9BQ1sm|Rkd+j0!za-|15{Wi7Io?~|vk()6djrcSasA@Yle$RS{DiL( z^8fa)e>q)u3xgr zhuwbvPWq@ZiRE)8GwIF97HjH~*5(5rIYRe7IHskwbu~Z3c8v%og!=}Q(Kdvyay~w; z%tOg{qHi7}OnFCff5@D0KaU;hfh*t>e>K%+YC3j@QOsCV(!`??b#}$~7JiHl&2O$TkE^B4n#)oGAd$_KF#{+_<>@Js=fRTVUG4m4S;A zRgApDwwv(;d4zy-w`wbgs@w`n1m4v$K*jNecZT)eZWY~{WRSrn*>%{tLFOQZC&Zgo z_M0Safs|mjJAGc9|B@C!(n6Upgxdbo5}(^p1|UcaaUAkFXPn#aE9cQB36(^35#qQT zhklZ**^RgO+qwJ;=fHbKgVHpqtxf^ob88>rt+6O9o5^lpuW?1cZ)zbS4X zp8YThi|<&#J5e&u=s<)M?CoBqActvlui)I2`=EAj*(AhUoGT??4Im`AUbK3mg>mO; z#Cn0i4@pt5>On#nOTn4p{4kTC z@xi*m1+jFg+wIet^GIz`i$4ZqWxrO(jOMm#PS^4Tx6z66GPben&uYoXj|O=EJ_psApHVMf{udnJp3R zw9mHrEXpj@_GWCeo-JWLbN#b>^{?)Nl;%G%Zy&w)Fumu`9;KB%DSR{cClI0<)}XVU zwZr==I4EQCd@h!HR~r4$f zj1Wu9szVfr0cW1V1|oCTr8DQHv}ipAlyAU{m#(N|YZ6bqHxm95A=MCZ8{)nY=AibD z+WxF*DQeHh`L^9(8*?l3FelfdaQEV1B~dKg8+x_zbbIOO%X`KDqFe*XY2nOWAp!a1 zs&k4`YnT;nr$wf*h9u*fv}v4XX`yO;FWO4ty2!pO_j$==l)pC_lx9KM)Dj9zNA|b= z=y5uFsz?2$Rhn4nZg?+nbhpG=5k58MRpaMX9dE=2gakA~yAUE1l0_-1l8?cuj#c+i z^Si@Z9EW4i9Wam@;u@ymAJX2QU@z-`dOb?WQHup(B<{O}iS!XZ3Yv-4{CbnSyxtsR>An z8nicNc>w&r1Po^aEM&tDBJyK<*ju!!W}`4$OLS+9V~oJ?Qo>o8%Sx*uuky3olwg`E zY{e?dFpIpal=v5U=7Q%?*j(D+>d_eOCKD$mZ>rbj1FPibQ_oYuBgnlqnOr5VkaEN5PPtW7xa^PC~iBdR<+E|Wn_xJvg~i7BNIxz<4{ z0HRot%oAP6-f7~>Tp;tA#+$Sg)zIb})QMq71wJI1OTv(lH|ftz;rdhzzeCb12WvbC z0u*7ovG3a$^g13~lp%=I;x}pPcX_SSK&kVocthu??iu|^oMk<7)s32yg#!!{CbzVB z${6sluwZ(xvv=a~;k=NMUfNDWLXr9BHZTXpD?GCqxY58NKrPPSRr3+D1S&5)n+nEJ z=%zw{i>QEReaFnA6Axgbe3{^Q)e0EB&Jr@YH>ki-4j`LI)C7=mjNLw+Iya{C8&m2m zcW6AFQm-*CjA6U$*^b2L5zX2&yVcr=^mgvQ7_Id!y53kdTRlbwaj$v^88cy77ZG`( z>D@I6Jd>=-%oHH}wGi3Ga{?@~2WF}LXFXeELTjyL!sjs|7q#JiitJN~-$aw1JUyac z{k{8%`un-ECyy|WGiW-QD0AvkF;QYp(F9Ryh9LCu-!NsHf0Oq4ZHzAG;Y{7X!30n) zP3FxH0LVmL_=7?=4kUcjyPb*X_`r?ig^+JNh|wcuF<@4jK*|})97^V7dpN8O9{D{5 zbC^E(p#2@Xeo+H0k(-*o-UqBR*YAkkFS6^%M$-G_V8r~&&;k_h;VrfhrN0C>BZ_S|N%HoivrzNt%B zQSz^;XWOKq8eEcqoD%08`_@gMlSWamqz3@w7GLPs`t4Y z`=(7YnNKtIzk)bo*K*%yU{aI^6QS>4 z7l!l zpAQ7yO5NL;9XkvV31`p1`Q0h7(T3925g8NvTXIG7nbKNIrWo-_XbM>kJQzrH%5tkq z>&!U{0tJ)5_y7c7%ZQu!dq5U$ZwSCN_jY}8BnAjSDF~pbr%T(4r#pm13uXeGTBezZ zTxM94*u<7iZsShp2BsYYic3Q5U>EvhTNv)Ncg#cF1!4&Gskf{5teF59rg1|BW(Le! zZIrT1DU>l{1U!qwl08Aw@sxVq0i8K_oX(y(N0dql=WO=E#aib57NwB3O@6TneT@sR zz8~RCjd>%!I{PIiqX8XT=+@4IUgg-Oggj#23M4X#dkfF!xz6p( zWw6jxsD@;eStty(@!wc~19Qb3swSf_F%TtxUd>ezS45nvYm@a?5ZDXVQf=q?+WB3C zF=;-lE6*rX@^%2H9XUIp|M07KP=DzstxcE@?yUH?>l?2nET=;O6Zqy}B)vJ0O!G1~l?Kwf&~J zVIkTwX*R7Vl~PgVOPG9344!Rdw{^&XYm;&h%Q%7f-K0{>q7+_^{glF7;P`-z&6~}; zg8JR)FVrIZS8E=`82&hB?W?2S(vq(r`2&cSplQQzS95K514OAV+VA`@0s$sJZ)DZV z4{+=+`2-}}kijbzfrdoLhfU$8p+f@X3C}YX6FI*zrc>uPJ#P>WT6{iRzx;DeVvhvB z4Nh!AL6k|28QP^*d+)saq@-?%mYfsDzAaNodj~PMUJTF*OmGD?f;~{JZuU&}JpbuY zuf+#1N4Mc`F;w*Fj(=J~48Mmv3qw=ojrk1g2MA#!peJ$ErSi?sM^WVJrbPQ;pEI33E#j}C(`M`q#f`*W4oW%Xw>36;bWBh zn&U@9q`|zsXfRd{w(a{l(L>g&1pG6M2j3Tu-)jUiQ92`=4G zq1KwWn8NIc=8}KjkcbC_CA=@Y3(RDQS++4*;Cp~be9$>x<8F&}H+2-pPMUc&8)F9G zd}J5gW)aKgyd+@XGm?$ImFLMtt$1z)0HEq&(X$~GF;&{J{^eMX^~#--XLKClRGhk z=0L8q5e^BcG!v`!t?SQY3)wpj;j;I)A_tS09GM}dXr|B0K8oy>b`SUtV;poWaLHml zQdbg`kfj=j1F=LSEe|?$=)gK>F&s}O?0X_iO64qs!ZA7C0niX0iMQk0#oJelAouM& z6NS2@`hVp3dHVPN^&`|>x{PR&P`MKe;I2~BV)!#;5Usta31=tHi)rX0{&$Wex0eTe z9S(sL-P(DR^%PUoELa54v|!T{STgsTR|OI3KTMF_Y`*Ecd#J467DJZM9tal1*De5EJvrej;ktNMqt`VVYhw z-RCDzC6v;TdO#Hja2$?=xw#wvaI%ZB}Wr^se zFT9Ta*ROji-E!4F8m4T8a6H!VH%FL?wHibys?jfAo2Blr?eUt%udSchfQu3{^dElx zQ*_ru=V;HN>uGDK=BFO2ow`?qd#r0FKrP(E7*C4@<>p=8>-t%SlH+8@kNF&gPUQFK zoti5@oO>R!M43cpEY}L!E5j0&f@Fa=ald{sqK}HOE%>U_3iGDG6JfH5#;_D>YD@#( z)n+nnXc-`I2h~6OCFoFn#}~nvm8B=GIFC_@CkF=la(tD~&cY|(Lb zdz2#2Y_FLx;CqY{Qcn}(kQe~fI5Ip^@u_r8l4tRI`VzK8XUBBMuRlm1zw2@OxgYyV zy6K7)jza0%d;&pj^+Un=2EuiMcrn_=G*vNzPdWd)9lG<;lk^||+nuzs=Q^6CJrNNy z^Y@WK%tok$UUf9UrH1f|7usiKNXaEpQN^UZlT5m3*hG{ zL*A;Lnkgkh;o0qdHtNQ1H8jXl;zZ01S%ZGI-(F?9iLZ;hw)bN}vx^z^9}THk+=wnm6j za-up7;g}W$#eIwYr!(tJ1a-5N>{SgF<9GKza-Xl5bVxg}J)BeANHpaVs(_Z~vQrUV zBfgKCiEJV!xZ#{-aGfr`2Avk>2FyX!I_30iexb5iT7%jiirT@5@^gVqvwNyDyB2lT z^!<)!Vyp!F0LWd6H0*HMe7Ujof=v`sCA#e`N<&UqWnhp#M52i*{|F2RYy_GBS&EWC zY!4fQJ4r}SH=}N(^c4~ieuwk0AWMmh^oW3b9zZm3Vgau1BrL8-S*)EoCu-_l*x)5cI7iLgJtLZ(+aGpP#X z((s*SdROg?lwV+ds1%h9&mOzzj!bo7R@NrJbQh>Ygj<6Zbqy zXEwKJ-_nvH!R_S{v2>wyG21LgHzM~oRqw3E75};&`knVbLcjH%Cu#k_b7(X!oM};! z6*y0S1cB9;htjqMv4fpo5twOri@tDgp)QS(DBu8ms1h*}14Wz_U!8mWJagEhm+*qW{`hYs5bOz7xc^+ijk< z0-xKM0B?Z-)cusa);C9@HDQ9PrWxCd3~ShOU2_FSLTZzXMo!dr%FG(WjPs{siQ_dN z7p)h8*X#d;_=52e?HiAxcvzBb#>TA3G6re8y_|G;}Sqh}Nr;@NA&tJmI-jB()U{0U(+Aw&f2W2X(S6-jowC_EybGfpGB zzceq{ZUP<*5fFX`6`mR0Xts7-B`LFUkDO08iSQj2X@5IwU8gJ4R_%E#^b<`dVAF*^ zlk+|vseW5;Qd#_AWfQGHOhi-= zH#`o6m4$72)B}FOb@>e7dl;+q4e4KjT-hLT{Ul^&GIxWOs-L#DDCuNXK5h=WSAS1r zxD<9pC?RVL(>QwrI(}-4&TS^?(VY()?_6LmpKjt`Yb9}SQ{(1L4-g10>fFbvx?W;T z)vqRF8bfg&gSCWQazDIRMl|iHx__F!L(0H8)n{}MXH1ql?oET=j?6)?#&wA~!j1BV zeVK@_49cZRbsdKjBHQl)BlhJAhsMycKcARVq@QN^73Wm8B^=m0900PXv!jkZU8Skiz+O#;~>X_Y%zmMIyVL6_LIs?HO@Q&yX08Y@RMAi;cq~wQSD_aPsh2!4OQ~9 zgR`-PaKrDPrNbC25qz3B0)QeQORSOFt* zBy(*J{3nzeDH7>Wuh*yJXNgXnA-Z}Us-!agYu)x$oAYOa`hS+KuU++*{Zf1m(vTEU zG;e%y{)3b~EhOx;Fp{HR@>IwH)DxxmMTF~Sw8k9Rd?&V9 zkscGcl$%!vxpc72zL?Z->QxwRL2;p@s)!q$bV73`Cf6xGcI3e}e~X1U zbNelpJYwPIS4%7UW;46!KjuZ+j$uI4I9kRqzd9MM8^ zfM*ezoL5P(?NDEkoNf)c#w)#zY z&D$f@US{m+`7LTI;yG@PnMIpmGD@bAM392|zyJS*h^mchzIYO1D|(uV%V_U>&=xi$sdn50Sc z_t^$TP$aULKr0fwO=~Y}lP>3}$K8|>H$}NYT+@Ov#yL6MIO^M;b4g7PMPV}%-pUh7 z3geVCGJV<{_2}^7Q#RA`FkO&pe<6iHV1Bki=v#Yhm_+JGK7Nn;p)nRkv?;=3dC--; zlAJ1GM!{Aw1~xEDsNM(!987HpX|??17;o|y(28r2>cn;{>)7p;j2Pxvc!0YXVa8tB zWBd;64ODppY_Nw?o)Bc`3(lx4ap-*bRWAKY*MZq&9OUC?y#gcu33Yo@TIu&V#M0qj z?t+{_j=$}uzG)u8ub%@?t!#KwI&+PRF@_kogJd}E&`=8{W$?p) z96}jXunsK!;KezBv=aj`8g=OD!zUW!uFYk;%)nw2mlBske!>;MV;k>nQNgyamlxQm zO(Hq2tt}1cmg^7EXyX_yEeXMtOpSpUl?Y3d<)lzJQUAMLSEBPYz8}7ZkSXDO&s{{h z&81Bsd$*;AXoHa1kN33>6DB>FDY7}L4N(fYxJ?!L2Xq%I?3{vFc6JU|)52BSzc2!U z@#eo1noP$u=n)Oi9HSerIY{fv0}WSnLb8+A+2Qr=pW}EfMm0s`pBJ%lRxefiOBw&V z^b5cC3Hs&Vd4l#FyqUH*3oSHB3SK?eZF8yFx?||F^&{UJLP)!sS(woHJ>n$6A!%(P z?H2Sy%{w-TKu1yoPq3JVRR1>U2?WWgg{Twm4u`!5?G=1gg89Li^I}|1gmWf7UMsax zX;`3XU;t&vlHs-1n%WTmD>M#H!cimSG{EMfLSR1;K~{Yvq%XArGr|GsLhM8c&k*-w zIktXq0ZiNn{<+jA1XZp%sd0`p zhTr9C`F0!6JZ(W+x?~-3IIQLGaf3KB;GU}hy~PFuhelxu)%M3~SDe7a94^t3XU;Xo zUA0ATv$e51ZP)O-lewL>+CFQl>2=ru~EPYZ+ zzda&a>38YfcO0ev{a<~E`s=sQWIB+gOYg9hu84$c#=U#$=2<7lv!mu`IZBZA^MGl{ z?*h3DS0@Qyonhr(eWwvr+!}u}Al5uHQOCkKqH4cj-i9)tpU_Lo>m3N6goGFR#Fv$$DxS=~q+5%1zzxRoH zOZ4Q?O-dC3I2FRS*9i*V@uZzvTao_fM#qFzi5r6Kutl^aT;+qc9KYQDk&^vzq z59y&NPSNIgnIYEVF6PR1spd&HgSCBiI0tznliy4qF%Qoj;Z{M&rXb+tJVA-{Rc{+&4x9N z-%Ha+wgdEcXNrYcDH%MNTU?W3Ic0D_Ob88UF9;E-7?YRmmG$G~b8-J!GCYS3#xH(+ z;1k>_Hwx)!8U>&enojxPrEptF8mS0}EwH8aL@Lv`_>uTiCNdq_ z9fG*HOo3M1GL6rBb~Tl`SC+X7Sr_I8$Z;*JWs4FMtc6rV4O)P`8JLRN+d% z`KX_f!wFJ~&)M?Vg$#9R*!%XZ(2JgTh_2p?Tm;!tgsx|EeQkSdCUa2O_i7rhHfg`5 z$M9ARUf>HjCdogA_Kmw8I(lY8-~HpiPxn9Gqdk`%qR}uANnI$=DEK5nu_OF_JP@J* zG;Ej+5zL_2k0FhhV~^d{O&^fZOTi9iFAyb9fo)7<=HcItBkG5|WIh~c`*r+=ycCg6 zbOMeqwb6)308^xAD$^{Nv?+&`kIuM%V+t(wb~f7Rpo?LvSrD3df0Kv78xtiV$k}*o z1oAsq*3_}}O`-t@q>BP11$7s^BRP{&WbBG!9L=eFJTlZfRh3wyzqqLN)`qzA4H*DY zj9c#Y_Xs!Yng24>uHV6o2(fF*3Z?mB5qo&fskW#L+n+Yof4-q31C}#6c!y04_yZ|r z)y|7~rA^oGuh7wBN9n|gQ*_zdfxHieorIUAXN-*qt^IpEqU|VL?wm`ex4}i!kos)R zO&n343OkN7G0_Q$9$X>%f)^hmqV(VYzwM+YtTUQS*cM(u-?cI3gRt20Z-?2;SycaJ zry9t-FCdnr{ppJIpHlr!I`l(7`$zQN51*!em)=U7n-f}M?SGKsG-nG00LxVZb+F+y zX8_xqOSkPO5xUc4JGN_Jie5Gv~&qb|3z5uyO2R00OJ|;17)kTxg*825phI?D{;2ck`q$n$ACA&+o{^kh(IjEU`w#k>_#>O`jTpg0)HNxDSQ zp}}B4Cr+KGqbE+&bFV(oviW;6%pdjd3$RBOj=s{iiI2BuoZ?9g>C9U>{YXNB z1ajSQ4&OIB&c6n~c{^&hc5b`GKRy#--({4W5HfrFbD51Uz4KrEDgDZC-$(l|dmarZ zsKgpKoE%a+r_jh`9BOc0PHB}hv9dO{^t*(Km4qeQwQ+xx_Cfp|zqSc*CC+2G~ZyHSi!Gk!VFiqIys!9W@+$EQA1a%nTj1-^| zO~l2OzgWQBrs&Qe{?5F`l2?ngawGd8h?i)K|II^hmZW$}dCUU>Yd3`AJ%hn#6RI@?X=aDnYE#$5Jo(521U52NA z&MYs|oH6$hsJ3j9HiUvnD1DCvlJQ$hKXY01w&$=~wW}o#+J2%TcFqbZp0>tBYyB?$ zpTBYk{roR|i1uIh0ve^t8$9?}{7KKbCYtgwX((vO-|zE~zvAEHz5{jzQaAjsGQwLI z;v%GSO`2;Sk@mgKYyz{P!_cddwn_YW+`Q*A8Y0g&M=8E69)g&o!cLfdXQEWe_`r#mCM~Z4wTf!vlUAHSI6rf-oCn>Q%cFVdituF(Z1tmm-WL?q6I4 zVwGDE42$nqZ&Zshl~~HC`gh=F%9UcL)EBYFjbh*pHByV@xLx&b=~3$M3XDzQ5X(8Z zoho1K=3L#^Aa@XKR(V3^sS-|++r+!`K7zA~g}KCc6=sfr)Uf$^Q$=Q_V1oQvc{+`0 zI9Z~H9^*J9g`w(?vUNk6*u~5ri?uom-wtBmjj=%D%m$EM$G^>Yw!AA*;6v6WO0@NyX7 zzwK?Uyr1;!a7?t?@6vzx?|0LW{~zzCnGYNj1Cn%d&aaSxb!S6RKyI`03}lj z1V-(TZOpS`89Gpx3s3Dr2Y*t zOI|oX&N0c@G6pBy)2^CoqV)zBw@}8v*yKRAU&}wchQf(D62-VmKTi*9c0zLwlUc<1 zfgzMsqAT>sV<&x7*>nOzY(110*0OzHc}3e>caITSWL_Gg)5Hf^o4*s9S-onbsW%|I z*>_cY%m9qOng#^>9FSif&dOvLqpQMX#`%~n@7L$JUCDp`b9KD6eT9;rl~mv;N&dh7 zKkuU-c*h@6cjXr9_V-XK&?qzZIC|3;HH~ev zIm+?5`4(MO(eKD;B7rSHv3w!4aY%?g+ zn&rp`x9l4&jxm2P7LR85BVdz7q$4>}^ZDx5(>3V^b+Pzz#u@|uuIMb|P!`qMc$A!R zR_Kw(pP}=UDXnU~2C*%Lg7!OFD-`A}Wcyz5ovx~HdoJhuB4X{#A*I~~i9L{8XQ467^8r|-)%IX%f{^?N zmF!3}plkc1viV2j3CH^X_MbdR-}{sAp~>KS8m#W8trYH;GC4x|tCw`Cj(-eaRVQEKDDiD- znpx))|JkP?AE)3#JQe()tS8);{zcA~e9m}d{%o9A4yPs)9#2|itTn$%<31Os>ogN# z+7J-clV3k`!YySAc>Y%Z1N#KI7f{3g=(KCh=xyw9X#xOx~@v>Ec*mN2ZqT zYXdOLSy!LkHjhZQGC$jR$8OJQQNliNeQE@J=j_(p(NxE@==&^sYAU%^Qgy%o^85GF zKmLjL&_?$LT3Wx1wi0gQYEsE7Trsjrn#oy9Jie2m)l(~pFjlJf#W5!%Ce?wK!c6!a zw6~e%(1>0!zsz&J*{h7Z%+cb6GLH<1o!11&l9jD7{JGF5j>!?P&u48Tu61p3KIZse zeat?#vPfKQ*MgZ#k$9Z^C!e{^U#YDraF#CP_Pt*jTm!tyJ?f<5Gy~^V0@iIcO)A?g7h1cg{OrI3*EGx4 z1O>NqeNk;L=~*#7nTLC}M()wg5H*cJD87<8EBa=17`CZiF^71t;=AMPa#X6yf^5;G zhWCKZoEy=@4?RhrbL#;KTj|SfUc5DT;F{MQ&CI`NUTgQ!Xjjo~xB1g0>8aei!*?yJ z!I;}JCNK0KZ>fB4LuG9(lY}oQ$|AgX7y6j{4iGbaUuN@d9T#p;r>X__Rnns}v(D8T zyYzGaXE%JbB1Sionb-Je3)$t)EbpvlV zab`0TA<~^3ALb?iv>G19y&(2cK+X4j)b{1?XquzryGy1-BJk0d$>)+fn_=CfE{Am@ zL0=LA<(^)zr}eZZR*OdzG7 zW$l6zFrR3yZeeG5R!yYM>|tpQb$hn)+M2&BI(9T|{WrcWy9;tz;3im zo3sGo-Yw$Z&h~DjkD$Wm5H0=P30R%L^FEH=+imaH3rJ>kcG#hx{MUa<|JSeFODhMS zL!Hh#4aW)bi^^a2mK0~7PKVU*PU-yFlXTS;m(rOt6WZJwQ@1~mzN4KtjYTuYWw<7o zfbfu9Y7#vA78&UfURJpi6h`TRQ#TjlAo0|*z&bJY$wUDUbqaDE=|njCbLkRRB<;xj zW>yzSzQYy|&v7j!tIR2!6ZC>QpTOoQJvUY5Il`2IBdw|T zE7j_9gqkm8F0ICmVZ$xUY6b$=iXKs~WVx#~X< zu5$gbscC0zR{Teaq^pw6wxcjA??GQJ*WJFhV1F$>0=vz?SeCe5YUQ{~2`K&^|IX^; z*>2_gvjUBCh<_f!8xm*9H$C%0%+t5wWXi<r&Xd`Wob|xnEOrI+gwn z;;-UZ7ie6Hu4z+C{E|!g&E!L|Wloh^i$iPgYKiQ$j-9{|Nv#hz`R2~GFx`tb0M9AC z(EfO4DV@E28H-ezRQskTuw*eR`5M>Z45Z`i#G!0vgTz5j{L_5zBUK7cieU+tm z<2!0-I&)mH`?lX0m`Oc1amPn1Z>@wNa%jFVk%NpXOsNWgef7V!P(psiz!9Fg=T~qTK(pT7q;}RrVP3=3G(4gC)k3D>xzVUm1gMR0I z$7s)?+h{mirtwgHhj8|ShI7#G(8(hY&`X}%r=NM-t7-H66LjX(2^#d1&8@kvokG}R z+$56#4bdiPx*H6Enj1?&Kd<(hL9j{CvT!wwiY291qF-0V`-~m-QKV z@AF3R+{v&tE-kImlSj_bGe=KRud3>ASv4yjGrJjQUJ{W8l6&^;$8(8)6nWxjVqInWi5$vlzS{hQA6>O{E1DQt*oAP~AC$72H!}`|WnD#*8H0Gv8j9n;n z!d^0725{@oDnlBv%QX%Wzc%+_>5*T;BUZD;{F(w;uJ-q_U6Bq9S4J+xFpk$w; z(A}ub&9!VEY2ojdXaN;a!Jwh^Hv1f4fz^Req}x>aYoZk!VdLpGGaNODT$o@617#!{ zgfXNm(Q1TNkxb$3s<}j%kZWE0DAL%rsU798PXMRAb!c0Z2>WA za;>C>h&fMA$I{|_Vh5enMRwt)WBLE(dY$8Ct04^Pg$rPMX2#$lgN;o?J-;0(+xmI4L z4uq_oa8AM1jar}ynCaLNiZ7+jT^^Cnj#RWv!1??Z+#Bz8a8+#xG8VvybMT@) zV3zVtn&6V+^yQGEG-R5m9MWrjU%en;3Da>WA-5>PzuRH6bUBYtmr{q>arf z-S_ZmdgIG{=$-&6U-Rv@2F$~L!9i6W(J-EUwx^SQaSg75iLv!vZcB;ht&^db%G z=U=w*Y(el!yLjz-Io>uc$ByQ)%{FU~l=tN30QGBWxz9}i_*b-Lqa-*{hgSQ2y5pf^ z^b$EkDOs(KqKD%sc?b2W{rPI$mK%f8eb$aLbe+eDhKj1C* z%rj@`$TO#DuyQR;Qd)b)ze$UbcgJ>XMwwpZiv^Q_CoL7MZB~a(fSh7m5oFjw5tV96 zVZ=Joa?;haSK6w5p9tO1Of&qmOSyszdmdh{&&nDgC2$ZqipqXai95p*8Hi@(*2s9| znxQ&ADK%O04D9rQ$w7jqECK-c`g8c*9OywKm4G`l;eH7C%zFs1PS-5&iy(L|3$6*J zgi(-j_a{MT!VIZ$aY;46>Kj>A^DLLmFoJ2tsY#WF*5+J6>RPyJ-hH8Hwup%0$dDpi8D5zay|5-iIt~g zGWaIk!amQm0c8^@TEf>9l7-amxGwgQYYQSl&zZJ(+T@okToV0fn%Pbhr)Je>y&r~< z3ObSAfL>+rPzJaE-FT4!Iv(iF-*JS7i&Vs-0q!%x=Pg!KnxJq&*y? zow($P+L1Q{7d9tLex+P(RZUownJUH?Kl=vAImP&Ru07EuR&c-*KdgJU2^@L(eP;UM zWmPURaf<1V$n5K`68J?hMJ#Bam%KJbQDCMB3Kp_FK-7 zx-eAQ@bn%#r?cM~Re#tvaSj)()mUK4vosNH>htp18u8E0^s~SKU_7;PHoq5$+r{A~ zKZe6-s&GliGvsiq4tx23tq+Sr5=Go@#hihfg1fkypa zdUk`(9(#bk?6rsJr@rfrba1Ul@ zR%jx|k;nw;S$GOvJ7q8=G*DOr=|yeK?zA3+v50SSp+|?`Q2FPKWI5jQ89j%Ln~|3x zcT_i`Z-O)W85d_dk5Gu`FqhJ;lLL%_LYm)v4$;9`oT#NDHc2pA$ zG`JtbrOLkHACw)|t(?*`V7eyRvL=Ad!ASk8OD6GF6dFX1XIx)esOZ~wzJ^JKvI(%Y6H(#Qv$k26X zmnHsr=9pSvCDGYU;v@SR=75w|OT$^ScO;l<9*n^BHW(3xU6EU(0>g_6b)N|7P*Yq?M%!a2~5M6so7ec|@f)nvVrfhWF598>bp6cB7-3M4mRB-HXg zS$O6ULrfySgK?(jHMZ5r535VR1)-Che8w#;G6FeQ2Q|oI8!X28+UtY5KiS1n6-8M@ z6zPa+pUS=}-i7yogEOhTV64h#3}0$l1X+RU zV|LzD5z=Qe3-x--bmDZ69(d$5-F(RbMut-Ne(^R-B45O2JdYsFRJSiUj%JHUO^Lp8 z_?DGTB|<0g8ZIgJHA&WjIPQr{8B#wZCQ_MhYy9)(a6x_q3-r54AB&E4Cv6_HH%q(W z(o|%Z(J$@;F6jt?9?1It_YXc!KmUs#r4QWk6fN($lGY9$pslg`+$SQ;o`ETB%UC=< zOG&yPZyclEVhKb_#C$7Bb0WA8 z#tlQMk;YJ_$Ah{z6CC5Y!Tcomf`Lw=5!B6$2|6TlrE}I_C~(I$+|*AoErt15w9UDc zlS@r*rnU0b%~SD2jgM7+}|e@GkI(&J2183c?&Un0}CQ?gb0y_cS*{wm+Eo z6q2QtSZucT!(VO|n_;0!$^jMs1_*_*>T%RflSw-*W2}wYH&{eM7-xh{VRJPJK8((Y zMqTR+Q+`w@$wtS92Dgii8i9{_cBtDM(5cfsy7z%6==Co?pprpgGM?pDQ}@UHFpEgl zuD46P@wei7IEbb~F4rpy(^N(kTzz?eHm>K=H%mnR7-r_9uM(`? zfL0*Y0w(c3Xmq6yM1v`;BHb+Zt$}T>FVy_C$wt0lUsz6vKk-@H&yAOo;nXZ!UJxov zMZRI`EE$^f@yr~g8U(gZu2T^WxbG2XntTN_rUqX8g&RYr!3uK|4X`ktBFy=QfmVVu zxy#Kdoo`}EqT0)iz=Dhd&{%~a8#ceDneejoli-LnRV7qRr9_bFNP;6>;4~dDkak-EW0x&MA0~L}vbK*eiI#HHddKx?ZK=>E@~JOM*SG z#rb1>w)^Z(uZKJR6S%CH`7zuXbuTVG$s*Va6??dxOPz7u+1T3%dJTSy{#G(sweepp zGYrO5s{Gr=Q2QSL@_Bc3tiS6$oQk!_DDt5roAjT4`{VQT=0P%Bi0?kMUbH6>w*|L1&LXM6Y?-CG?};@m6}?b^AHw8caet{=4o!LZ{9X9o)A< zouLzWh+-Hg^0!QYW3#mGkz#;3b(Md<7a}o-mdmxcHa_hAsBwkVi!YX%wmtl{W+s}a zDJu6yx)X}ekMe*I#cu7oYsnTco)GNPo60=Bm~NCtHx!f#9)Aa)_H0Ms3<(F2d2pp)mv zbYNAzn-|3I^VP9UZA@%6CaQ)^c1my-k#_k$-PUmI!f&b6Yx>k>r%H9qLceyP>vM0; zHxQIvXp6w4M9A~BDDw#H#cpj3$fD0WOkACw)cmQpM6^?T?D!`A+PgnR|M_?Br@J5A zqNVj~Y5ygX$A6rBK)8#r8Sjo0_0zW{6UKr@3`S&1Rma*MD`? zY-0pR#bWr>gaF4I zOnWM!fe{`)r=&@UsgSY9G*ScmEmVXxyu>%aEbL|if(9UcVJ^Ym86;fIA{5mJhRFDu zdWGsFg_D(M#(Ef_-H`k>(K*iJZBx~&7(<#qjiWssswz=XJ{%0u_sBo=)uZ5J@Vwk^wi9Q^={d;rWaRJ&GYt7SW;;b*Xlpa0%z9s& z)IIOH-D;(Vp|*Cjhz#(Yd=UvQfjimZQ@j81ll0&I$3yh1zjrS^^yHAbgG01_=pc>8 z9gYB)_JH68cR0hGvI0)nH>N|IbmH)1^qgxa^u7P!b@ZlJ-^A}qbpV#qUI|oz&zFXN zA3kx89(d$1EiGTlQl`{-k3?JclPUd7-UPz+-^A@l;3IfTa|Y;nX8dMCl0nC7)WiEf zIKoxWiP8&}o&(CZQ3nk~TdPX_AbaRvJ>$*BVg6Z8_)Wk=Z8d& z{RVBWvj9m0pg>3$wfLaDKq3OdZ<&PR90hl!31#F!B_a}IOQS9$9==%i2h#u{09PHC ze=(wx|JFv7f*QrZtVAX-snLTwv%f^s2l`>=p~`a4m7-?NrOxE!(~IkpJ!j8Uq_Q}E z+n@O!0O1!OL4EglN`t`)9X&au2M?d4+ix)F1qr3S)zrczlCBYtS@4U@!9|xm1Hp(p zC0*DYP3YZ!d>0+O>@s@ctp{oEN}p2gHVzp}z7|NeowO;i=bG6JCa?T_*&2mB7K;$q zMG0`t98)q~vzQ{e9%0e!_hPm-lf}Yk4mnqndB4}C5fR<_;3@j`ci%<7^T!X-Lr;yV zzkWHb?%z-2X^(~}7(YG0-rlk>>_?+8NW?n*I_P(4>--5Coq3GD{B_sTcYVv})2&yo ziqzlfP;w^_VKz`|#>Y&q>B*y~>9HqI)AG`_%uIOo&rF04`_b_z9J)Yz938sWmEWsU zV=aLX<2+RHHNd)LGYu^9Wq_8RJA&EdE`}50`^<1YPu%?I|2* z3%*p%jWcG75=5Hl4e0D}g+BG*27SpZ6pnFo&5-mLX*Hr${$A^UH(DD(EU(EKQLk%7 zsvo)g6n)zd{TlUF57NyyAD~x$_AT^^&$^s$ea_W%!<9?4suG@Tcf?h?}jp^nEinU1+GdvCHyXP$YKZn%=@?|sW_ z>1*C{D=nq6z=?TIDu0&T-2X;L|y)7%{dTS&K=bEGnE zDG_N@hgPKii15v)!|aubxTkPXT|ezBF^8Tzyi$W z_~RJLdCgNDKU)&zqK#*u9KSOE^xJ=UH=UZ^NC(%irH?;wj{f|U57Wx8+)vkDu|&^% z&Jw-s1=rGFdf6@XoNL!<-)fJw1F4_H2%yflko%a&+(R;R5Oij8$0fs6Q>^nL&PAJF?hxVd;x&Y zsLT1g^X_M8)Lo-aFJ%&hcrEWuXHm{&p>b5LDl?NMtoR>wbW7gp0XWia8l#q>bx2kY zbUij6%v6LB`ftzsvW-@fi`q54q4YH{!pjsL4BRvTKaR`^oCUe_V}6INd{B9czkohh zV{X{l59UKzs~Az2Lq^Iy^RHT1s+=#=UZihVMnb|uV?|mJGp6t+aATx>+1K)g%{D6W zs%x03Q`FT!VFeCF7Z+DxCknVLY9UI(6KCTGvkA8h38BLh9wuQHDleO|sL+H1f+QPq z81P)c5vqoOL$zHpmYcj1qP{q@Avu8#VIiTltEn;eG9FYG(cc+}IS)`a0i;oPHgQ<< zoKpB6Dwd^gI0w0cGNevUSpic_Iuj-JB*wWFdtmYx5lLvUv`!B^e1cA#o6@Cgb;qE2 z5@AXBTi3n#UQ<=Kz2ib!{_Z?G7yyI12~V8dqW6C2aq2B!N@Lnf%d4xjw)Zj`jyCC$ zqi5*;Cr;AuzV|NLyYfl8@w$EV%9mVAFMi$%-G1X0bkp^h(B9zOI7;;xQV2P0o*bi@>#ZkQ(VB%l#d@cz&ORqR$8*4I)Ih-|zFhDOw zZ4N!2J{M!+Ka(+adVPBTM^DhZ-}^Kjy7r~irxh9viMF;TG*NTr#MGMUj7&0O-RmZ% zctoSkvvlUnQ*_&Pefs-<<2CeUZ@iV3J4D0Ll=^+CubPA|m^#y5exA~IB_amb7>;e30fSkQ?aS)_ z0-vy?Ay&Hz%)cB_z|m9Cn)sRG*CEWVQ79;9ShKYaaC94g+>=W5)Xwid0^+njHQ0!w zCU`H0hkDHO7(#?wx)F6|(sO3c%Ldlm*nknAsoS7@!*v3zaGnQ+Lh;!{$Vd`0=>(_%@#Bg3iZeFmtfr|FHX&`hY57X#qhzQf-T_i|N&?y%Y~_{p zw%>CcCw>5SK#9Lzt`lx-zlfVlZH`Y$gt8_F)cV~t6;tmFT3_K?^1K|FE`&pO{0nPo zubREXLHtXTbS@-^ekzBCX|?)hIL#OQ45lGV{syy45&}7MDUv~@C;&YvfpN0GsB{PH zkP*M=D94*NAbkC3g$I>$afi!Xk}akG8txaaG^8Vrlgt3DW1mD6C|olZJ*s$0m8tJ{ z)d_(E4uFaDra^qlXn}>Ko4COv!VWRE_Wq1b$et9LQWrT_WS!_@n=hiPqfldis^PtUpGYP$WFE9mCy*Xf!oFQF?h-%pqA@6bv> z-n<+vI3=%hDN$<*0-*U|{wlR>hUD~Y$H3c$8Wl*MnQ7010XT{8aX0e^0-~(oy4G{j zX6vt+vdZiBIWX%D{s1pmyUmcMbk_q<(umfm&oIOqL#UB+f~VQWpYrFA&(h|}C+M0> zCiE3=eGdJ#H@|?MbCqQ58*Ysx?q4xIYiW!_f*6f1!@1DE_dR@=jvU*h{?cVGecDpy z^NzJe#h)aHjrlob&U`t!MPJB3DCaD~KZKMOYbbEnonz~s;~(Cc8nI+kQ14>PFdOKL zN%SSo3k+s9{yZP8U5a*j%-hD*(eGK<94768ZLZn%zMusc^Jp~5wl(Zc(Msenl7HPS z>lOWMEOFoKf{StsYn*TqH2u;uYq`sWcj>>B)GGM^m<>W>mi4I|5E)mN$GMvnlnzPw zT_i<+BNix&>@PXS7Rdvuad(nxuhi%L_zm*a%>xW&P0Q*xAd^OTZ|WnZ@C*}iM9@aG zVu{CcTurZP0iKUDr}u>qgb!9Z8A$7D#?fqIQ2$9N4ont0cO?c0Z!r)5g!q)<%6rD+sg`!_Qg3;U1}m#Hr4dahL)sV) z>F&oj>EjQar19?`rquz_C3|~x#ih%1!<8Mn{+j*toSUzu=iYEBU46-b_U&1s_0>Kt zCC~EOT$xG7{wj$&7|k;Cpi4V8Yvi9-Db<+(DYGrwBRG`FQ%;z6F8$Y9+rEg-Y2_Um z0~%5_9X>s#N1r&yA$}q_fEYo;nGn1L+4lQH!_AYlb^a(_wr@ml{fe9D>)w1T-G0MC zzJEBDq(1!t3XlcDkhH4M%Yu_upF%L`w00`r=~e$J)VW8Q`V%KeowPq>CH? zwkRSJgc&>Jau9}s)&J?CaUyCXE$=@0tlBIs1mU^qS zvT}g;{A4nuQ(NchnMXG06ZdTqO`oQI?@2Bkb8uguuDooOuDkjYy7tO7y7E$@1N(b) zXx|DQIwci(@Ww#GeLN*dd7 za_;TL_?!%ox#OiWVFECd&|B@TjK5=|o2FUFFuLX&3Hkt)S}kPCIfQP>Jfdcb3aD1n zAP5)v@;Piw4yj_6@PzC+L4|p2zJI~^m97L%(Fm#%Z#m+j0FqPw$|%6>xJc~2ClPzA z-++$G%v3d@F)(+9h{^sR2{vNlm!bkP?3Ba;@+=s1otS2jHM6}i00>)9Vo*96=;CA? zbvWS8?S*B~1<2?)v;=VjH(E~S{BKU^4dhVWSk@^>C4ra(?-1~HBB=@z#_p6UVN-;I z7PJ?pUGb&VPdM~3Wn_hzR|%97>9EXZqtbtMX?^p-*Ut_P?7yx;lCeWw4v!Ug2C*Xy zB*Ms0xKT-Dr>usaR8j4#^rHS0%I!q^S5D0Y#hhg%IG2 z*~;~4{Kb7hfl2!BcIm_S9;e@b-(j}>Po`Wi((1jlIVEHSlVmP9C(ybj4{}xcG4m$x z99c@T0d)p_T3Oylopm^YC24U=htHj-r|;jQ58wSXO~>b{*B!D$+RAdD)>j6!Z+(UK z?^~t)d%JXC?|}C2U8Vi|*65N0dujjvH9D|=K>OA@v}c8AWsow~b=hGpoe?(cMYFFV zRHCJRkCq30o*Oe3)lzHqb8s975jo9WG;{~UVW4g2}NB(bNJMdF~W1%XDG@`4b+VNw|?W=MKHI(}|KcRg@M z?EgkQdfB9+9EB{i1pFULRu1=2)$!a)d zZ^Ug;2%NEg<=8Fi!H9qKg@~Z{`#K@=(ZcC$y6XN1#s&B@=76zf4hO}4jB8MLaF=mN z-3DXCfpf4N>agvMf+j0sP8}MrA_C3dto$dKHxc5nrtAYSNhg5?Jh9qO#%ddejgtW- zKt{DQ={l;ooJffTtu`P0nhsLfCG%`}ag$;*Sh`{(lnRV6PE|y@RBM`r0B?RKdHAa4 zf|&{sB_nti(=sfNsQZgbM-HDm;HLBb@SuW2(xQ({Ov zX?qeu*CZv59D^1Igg&fbninIagm$3nV)L$h^(sqG{iPK;c5I98e)tr|e4Toc`dErcAiVcS*h7~U6 zX^aCY_d&?u*j`=`Ey%6=Iu(qGNm#nwK6RJZsk^+7mb*Pw7s|d!S?Zn{j_AmdEgCWidbh_8qR#9l&2^f` zh%VhXrXT#ax6mzDU&3m0~`{H4r<6Qu&{2blWz0E#nUk%;yhU%xA_as@N(28b0adXKAX`iNmRw@ zfRQgk*PuV;kPVG9h0{#3Pt`O=DkUoUv5gJx22Mw^5uD34lp>pI_Ysv26i%J?M_ege)p;08xVC@w3wAxaHLpC za!5?E?P(rE8Y;su-Wby8?AX%SvQr_e7d4HnI{S9JW7;@%H@)dgPSA4`1Auw%+KSYP ze_J|jdnSLP^$M;g!7e5Lx&PrU>U5Va*Sf9Wgs9i=&~Wn{U47}4UizZz7?Gy6Pj-5o zQS+#ef)Py)h){s8Yqp~ zEMhXfxTjoThO@U%P(Dd2U@k-HKXSaW5ozg!L;oz+w@5&tw@LiCIMb=3vN|xDNKtT|dd*5wYLi%*6Xv?yAr+>M%i{##WT=3JFP9!bj-3q>Zd4Py z6Io!ME2pbTaPZxu4rIS}rAC6Pn*no1RD2*TV^g;25cMF4T#{d;^<@nOd+J9$iXs&N z!qhe$_H=dtNd-uxE@Os~=hCI#V3j_3?~`C8U{QN~o1}L!Oag7hCU^b} zT()|_rwVYt_$znN@iTjA?Z66aTH;!ybxNqZJKdtm_!MoOJ4;)`5t~ht=A_eGX1jAD z)=AQnV6zA-ML9{`58o5s+i*q&W2U=TF-tnXEUAsN6yp3kDsEYrFGSWa&mkn0OO>Sr{VBC-FP+8b(bfLX=3~m6QU6hK^qDN9HW9W zB)sxXipBX>eCpDseE-B%rWoR^(t1>WVowYFf>%Kn_+Mxb zSi6xDnk9{un?%^$z>na3PHj)ymLV&gU@)^Pw$Nhg6&9+pl8oTh3w7ennvp_c2{_#BSOK{Hq+%G^Md-hkCirXBR~eg;*psG@%~+iNipgXuv9- z6ENd;Og$YX`(~n;oGXnQ0lY(rT|j(U3uXqheHG)eZ*Zmyh}@SmZmeQ~aEpd;8K365Oq6JFsRpGp+}xLMh`zRq!(Ym!KAVKTeJpbr5#(%# zS37(Dcjym4{3yNqy^qrB{#!U>oO_5QZd>+3uTOOD*rW8ne8qF<)vx?4`jbC;VQKT#YZEyy_hp9VQR#rXX6xrOn-3 z8Z@N(cE>j=H1)8LK5Pib{Sn%}x0jaw^%Gk+vH|2(U`biqJr4B5b?E{vWrH0mm7a zVo6__NwP0i;shRg4&nf=kpO z{*Y)(jY6KRA^IcmPt3Iim0rPs!A~}=A-0EUZIVTOAN`#3pKfgGUV276XsuN&1%o=HKn<@dQ z-&>|5C;Ie>Pd-jBx&9_rNt<(xNu33cTPCe(we2>Ux!q(98e@a=O}LIPTs18n(k{`l z%_;rdFWo_BC;MrsyTbN)RAYonzu)Q6aN{`LaM^_Z_E+6Tw_Ul9-uOA!(z)S;o;p6J zPu+W*?)dma^zpl%rUxH;l%6`aL1#xP_3J)bUS6Z#V41qCAxKG=2Ihps`N%E#i%Mg< zedHVjTj%=$V~0+^sh_4)FZ(j^6Hn^emk@KcPMA{gldIv>%c_)1 z9cM`^5DHiiYXSGh&gz!ZzLRl5HlIq%obn1uq=t}eF38thFIBJoa-41r`8Ar~$sU5wTkgY8+A^7P+F6Di^PZ~n`l)1Q9)B&}b1 zD{T#vl$IYj(Tq%JbK`0HD}VJiy7kI^bbdHyr^>Z%k8ZiVOSfNsIeo?FT~0?gi5_|4 z2tD}tN&47b=jr30e4HMB^ave0IihoCCNxUQ;G`v3+DrZARb~b{-K380a++B?qsrBR zRWna^V^YQATBfHdyw$WMS{_GgVHeriWM?roJq>!Rbn^6w9)9E~-FWayHyvf_(*WZO z^1)bCBUB>e(yZurrKu))|E~KUqiKiHpfYYrBPI@0%-@bjv^*fX<)%YL4=v*oU>JP-ED}I4gT|PlEayoAl-1!5COHSDtew(=2Dv3G*>X zCmWfv4l!4P-H@O4w(V)!gj!}s1&*g=cV}Z8i`8ie&wx2~b<_Xb-h04nc3t(M>wM+b z>C&jTktNxZC0TOs-Pi_f48#UP36KOx2;_wlc<)j3OCSVZfRF?*4lZC*+;EY*EnD4| ztTxt2qv^euduML_%6Y%N*ZQxu_CDv_dnMaogO5GB-*>)Kc3tbgI^{jYJt~B;6wgMG z=#<2Li-~|3l?|f}EU3kJtqG=saLOa1-l+B(8+@QeKb&T(LN5#vd#N~83(K`qh(09{ zF0qZ;K(Y4BFrm7K()!~i1=!u1Cazf`wTVl!m!$~eh* z#y-c6ij$sLNH}I+RI-rfq6#p4Vs&EtGz^L7jG+7G_VTLziOmK&)Bq)Zr-$!-tc0g z`N0j$T=!4Yww=3a*TE^;b8tZW4lU5}Q)g)U>>|ze+C=Tu)ScYGo?}9M6_*M1_u~sS zu(1%CTXpyhMZLn@Dc6X0U~|ATHB_rJO0%;q+Pd=qz3dqmm}aUj9PSCugVzM+^J9b$ z05g|rY)^APd^oa;&2E)3d*jxf``I5uc^5Qm3~2iOIl5p&m#(;Af*%^~wd^O6ugyA{ zBv=3XKDliaaeXKZwROiqI(>FXYc`C=?@GETiM5(AVknt)5_xe`>on$B! zS^~AVDHc+p&fAqC>9cuBG-Gm)HW{=ZZ^i(jdMsusvHP2oV#;8}920~n$qB>YHK)@x z-t<8s_iTsOAt55Urw)IQpt{ylcI$ z6A&K<({PQcjQJtgv|!;rx(&ytb*LDmm&R;WY?ELCPr_nUI!FiGUQvx_$8UaqtbHB~ z_yL0$;Ww1RV7cB1X?ky+Cvv$A!S~OuN*wk63O<`*I_Y*Ue<$8m9Xqa>;9Y2QNk~>` zbjbDu2dh#DSG-RA6cW1@5<=LRD)v`LGtcOan5K)@!ea3BXn+_Fs5?4A+xPB@YT@&) zJTGq4Jp9s+cs*0cJTy5sJ~8?4t2#6WpP$+v7Ext-@Jx?>>yK`wGYe~JV$B*_jGq5I z=B(i4L2grz=4TJn5B=Cpbg6iAM{q5@gYXiGP8sS02(qV=#)^VQ*LLWlbsOl#*9Qhq zG($uuPxR>c$tgN~e3o_}>e0j7X6V!RoTSBabwu?%pHk7yCAi`yfx^0dgt-L{kl|(m z6aEu`g*T(w0Jl1!hh5sbf6kecp4`Y+2zCt-^ZiH(epb~jYXcJd^8PY$uv-+g?^H>9 z4~6W0<1B$ozY(bv0MFvWG+lDlT3WMa+>#&F>=7TwT_^43^g%vo{fq!Q7Xtv;Jx%># zCu(>?2pjJ?i3AV;2m0sfWmR)&QY+{35Jrq79pd^9l|Emp0rAR+Osi$IhTl}N@+*Cj zuBizC;~Dn{gcf;F`h1%;|4t8Dlc^TaD^!SAgDdFfmk8*q&*x8Gi;6dRX&w6_dbL;0 zy7lWZJ(sQlzMuJrncuLQ60YQg+1kV9BT!SV<}Ppm#!ZONLxJ?g9sUrAo0W%S)r#XI zSWA`8q>{U;=97+C_q;hk8{*W@)qM}!o zd1aNsYCmD?x5P%#0~Edmpx;VAg5fJ|na=##L-d?$N9oP4y;ig>u2=Xh6edJlSe`dtOJNO# zQ1j?d(IOgex9HMyx^(F|=Mr7b*S+`lqjbyX_fumxLmaDX23tN!xcX(#hGOR)bt>dY5y!^y{ro{ck2jZxc7|n%8WAEnpwuy6`uE zv5>KE*Pbald8$S2&ZuP4WKAKMVMy^jSeT}#TyY_-8gIumzg-ELHCwrx&>E7RONiA@ z^M67n#p7oe>9K7GsWTGNLc=V>`!-$|(=s9=NY`Xk&~sX1hvr*QwY>A8fJVrh0>mtY=c-Rw928&E02O#e z%9p*WeULmNu_r?Bc|N70Bu|bklw!!Xr|>PNXc8}Toq!Yp@%P*-))+UOy}UG-4ve34 zCcZcjx|Tk-ini>tIPK-Lm|dU0zv-xBfd2j@pFm{+mCL->9f5zqhAOH###IOt^6xOv zq37fxby})mbDr$r1�$!D1f4K$fWh0gsNgTqlsBh!q8OX;7@C`yMd zDZL_>u&QJE^*X@(J<1wThvtVN^sPmI{=P@)Z$7e(Cf8p<3w>X2-FyXN%?g^MvDQiY zcR%tx+AztXTnMT2z2Uj!XbS#|s(!&kJyekknfXEuc}@rvGzG!gus;~m(K9`I`(NEd zgR;#DfpjVnmgS2l2|&THY9rDxG|UPJe*}#oNWuBiFrlWH^PoGjmiFwQqC-bcD|lG$ zNL1hr`>N@hboBD?)`#SM!d#+I1Fee;!}gsA>Fiudo$iQMx@5_U!zM#iK!mHyiGI!rmFX{L$r0t!eYXZO6?~3!#1BXdS+&js_;8( z(rKX`+~en$@gyC_X6qi##B~8W~F=v!?7C8#wFb>+M4s6oUSUy=QQ}THc zAi3fg)1_cG1D-I+A_H?eQk8YV4^GE4g69BsxB*F-^qjXCA1dsLzWSk$Jcxs6CARn) zS!W3tFlY59zLl>DCahx4kuvT29x)5qDMa@GHNf#)f0Z>LJOX?>SbHSNAND+_eCG$Z z0t)D~f@gCp+D}mY2GR*Ld@viHNb8(s0<;ZSH*tbEAnE4QnVd=!et7Am?f`M*F#Kw% zQ}2jTHwk9KsMiz##Mm=U3SXXqVLV)+rHUwKc^I(ypgB>Nt?%>1&ZKDL_swJERc_js z@I3+mj~e+GC?pi*prs)TnT)jpzyRom6g`*sADX2dyHCcO{kUQ9*yH)DXXq;dhbwzf zDi^Rr9k1oZKG9gGpgSKrNWcEOpQJ(ed@4GtVeZll2o)Prw?i~{<}h7%#VGyE z4?jPu*Sw_RSAbhlRRRUOtp+gh9_xp^G_8UjJG4M=`|Hiro!CgdKK7(MS@T5jcg!J@ zoKj57La#+zwjPmlfxU7j!D5BXzfSW1Y7TpsXgx#~ z&c88{4r6$7Zb&=#9E;A3%$wMYmWP2EUcbLc=bbxAS6miqJOrNrn{w%e?tv$B_}jvx zw>);776;=oGi%+-W}q(K+>xM*rdG!hOo$mE_O-EgL<$MR5GQMeA|aQAe$J(2tL?#d zeUS<>(=X3IkG;|E08&H%G_^xEXOgBhp=DJb;>Vq*%7L&Nnw-#k=i*?`X(fWFnwGqP zCIH=>rJ=^Rr!7y5QXZ019gm{8Rq)Tqg-@9=@PuqwygAJH2Lu%cU?GEP&@hH*mq@vT z8MEEyw4kx}wMRr)R5Ip35lP;}tdn4182t1f22mu;#71Un|Ek@ry3uT7qXcs1<-ClV zQGFk%+TL*9{#koCjVs`5HpdkypDXDFJ93J0-Q=kBZpd5oXPa~ghw7c7$<|@| z)t`9@UAke6CCRwH>RCU|rQN_>I^rU0d|_D9d`a}b-gP(aIuz(L?H)mm_j)ife8rDUX;OkzxH%#5oQ3m$1H_Bc0cyU6^*Jdddg zXc2OXQi1!0*e?&N83-kJCn|Dsv@-<(=%43F34N4D)$zGzb2Ip#`yF)M3%f`^>?W4? zoa%e)N5-#1b;V%+K4>h01~DWuW9QNk`V&fpcEhK>Vj@KmoPOEn!9882VLe~3%C@%o zw7DMbc@$~Sb-jxJRol4SsAM$~GDm1lBzEtvTR@JnVUaH*jdgG= zdm;4}S>lFPMQyB#Bdzjd++VV>u|0InhaZEVfrRX-ep+a($c*)GDw3Zvjb!O9XRF*ukBHSt2LPKUGU8mAN#@b++BV21NdeT)V_m6odv(Z=z1CpvMoMrl0<`kJ01%M`?21#nc;G@{F?G zP8;n21-+d!3#C#g&HIcFS?5wC^6VxkfH`-D|6+q72vG>Fr{lTBy zNoD)|;BX+S)~EKX1>re1cEpwgECb;>!q z<|@trXu^h7`9u2FC9{7mb4c((G)EjgF-IdKL31QKPu2jB3rFl|EeeFEiTTZAa@+t$ z&f_u&th*Z0$KYASDy5AZa_^=J`UM=`m&Qse@oTp4JazlL35d ze&n>T5c))T)*3u|l{xX6=1X|A27d*99ul{S6ZmjIBi(j1`$y;GPSGv`v6>hU0Knj6 z1 zJkfel8H($X5D%7!*l~q(-v{O}I=-3?9Gs^8hosTW9NVE#qh9#wjG$JpZSeX(Ux5;n%r<1El5fN-VRbTLk2LI&St0f(+yX5 z>Hq!Nm(y5KtHpU0TX+WW%NiX(bsS_KWUU9qL#WvJ-~aR;+PY^zV{0}>e*hN4*?kCT z-56Nr z>6mKaT&Be3k8}<4cys%A>^?+i&-Q4fJIZS9_%qifFg*^NV#Jk8Ih6NQM<3L55D7nD zBjrGB4xOJ#43u-sT_t7-ZRP7+k}w+B^CT;v(n_ecQF=a_sTizEd_r}#t7*y8C7+Be z{injHh{2Y<*2Vm1s(w#-%*;l%uQkzm>OjcjX-Vnow7>eE*kQXLbT&1u%G`V0;k3{O zYP>I88Uk+9=ua?V;;}GoMyMwd|3>HCK8=rcV;+xauseD3#8l|ks>#tRkHBJdRvZ7G*Dgj z$UQt)NE2{*7OJzdd+J}{AdR#i_P09VkfK+AcoRU}7@DQfJYFFY!Y0>hk48U$FK;=P z&XQhJ?Oz7>mhHD^qV@OW%r%>g8r$v}DmM%SKBE-j02PJ*8b>GzMWH}0HV1Es^4Trn}fA-!7=zX8u zNvqGjB048>H?qws%-j570x<{@kN^Y^Jmd3O6NJPp%v?Yav6mzcUGDdpLAj)HmlpdS zdUV@q3PTmoLz|!r&b75}Br1%*Zp{4sIV|LL=>Zl8%;lhq-!(HN+P>!~wMQp(tkmgN z)<(bAqjNWm&_(BtRGQ_1u@?lIW;&m9BSFkK!{;qK7pPZ`#*j`(jqwg=NB5crr)V`h zdtk6G2Atc8%Ar2-3^Tf@EyViNjF-HRc^yC{Z~ZqK(aN&=c{%_+BY{06|^o*$LI8;T^>30JcRZT_RE=?C|Rn>#{Cj~KG$cHyGxB-dp zG3OS4)bVXr=c4T^2LWhv)+1?Ux*!uYskTKwv958>{>aWo>=22|!%w+sgx6q5vpPxl zKfEJmHuGxjnq~8Z54SShS=+3h9Q#pm?r+KYkQ62~EI7t|`1W1&lmGX}X#1hHG&*@P zEe?{!-8kFO_uA-xrm80d`FdrJiA=Vz`h(N*^9t{R{L8|0OK%c`H z$D(VXU4U(zW90dVP(Uv_0`59a$IkYs)fKjzFarUNPhytS(aMQ(zPCX5ltt_H*r(x_ z!zX%l=;$0L+(8I*@P(4J$Km_@;w)W$$+@&)-D;_A;aZjPwv``MTF`12G&MJ%N48H< zYjka_3unYTT!D;~24rlGE&Ch)vT$DwV@KUD%$|Jc%x9QC`nuN!#eg9tRg8?h=o=Vy#d`Y)z4s4oL|M7Ed zo`AK?`OpIgGhd5|Ez2%j9fx|(nhuq%ua=hl70-|uRvOybr^(5Yn9@A@@a);Y_mN(| zKUlvu*q(Y4>*5-$Ypq`LWem$U7T;(uaRR{Bc}e=e`9RgH?ZxiZkkH4s0gmph8k2sR zMvJ@VnUWH1o2b;M!P}g2ds*F4R#AIWT)|xl`@G=ud^6{L!}lf6Rh%^K8biOyFV6NR zCJ$i**kYQ{Ci8y9&I#*3qy>I-=d?J6;dyx5%2>aLE_GzT{@{oU9k1Fej4_6UI)UiV zESB_N-*F%P!f)L{rxz}yk;(IDA%xcc(*4z)&r27=+i8&uU*SToBg}LQa8pi|*Naihlk7`vTGE71Zvmm83I)RbyST=QZX4 zasFDhQLT8Uo>dnic=e<9LA3dz2#l%5J<;YpW6os(q>PPD(7uBw=-`o)3?UNRu=mSJ z=OO;9HOtkTz?S;Gx?ZemrTVm}z5NiKo?4`Cdn8uMWPJexp>_xp4CbuGdAj=Y^Jwj8 zo65fV#Z;s#FRZL^b?bE^U>rShmUir$qOpl}Mq^NS!3#<1pX2tp_o`!qZWN_exEMtu75*7J(O>a~t3MIw?^f*>twMy{<_VmwbKF>pzL`Pp!4abYUMyX5m zOBQ6+g}@7!RWj>^I;_i5%ozEz7+c9c@q8_t6Z~G)W_#Xd|Fr)~S99@LG-!3g>k5uI z>yp4Pge%9Ayf{k~vZ7nYW z*UK}ec3#R3zm)S&wTo%3V*fU4M|6bCn5U}Jd{~?-A`(m))^6Dl2|(cI8$(;kw$Bzq zq6)45Y~fnzqN?--NIwTw4Xv`p3wtmYATnPep$5kox12{fq$rLNvxnQlXH|0mF(V@r zbnsX~kL@_gl4d@)4O3kYja>UR!ACf9O%MoHy+fAw0*=unp%6y9MGx;fML+dxpP>Kw zmyZ)oUP&~vo)*Qv?w{U@A#&~LP*n_PY4OZ1`sJT~HvNk?UQ2`CfJVZ2VLT9;<#p*x z^i5o`^n$?rLzvFv2WRP*e(N)IVtxa4$AjHJc7d~Wd@Nkkr;%2luDof| zP<9`hqp35)n3I6VTw>EBHx|h?OpAnQCIV8!s)}bJM+k=tv<|!3a!qj0IDd{W7{&W7 zsNxfo1em`H07xbTLeFcn&a9g=Z7*D5T)mc3uhaCzsW@PAhtM=f8?7H+5EZ``VTL4h z5Ic#DNwr1DKP|_$4Ea@M+Wb2IscuoF3$fN_pAA4d{?+$j5qbuo zQz?={MDorqs46Z+0rDhKFSoj5bY`JT4?oI|VU6=nPxQzEQ~n&U@+d0#7D6OMf5=k* zY+2A-Kkx|s$S>SNpTB>RCN?~k7R!lP^oMU9XsA?+t7db)jB=g^GrQc|#0tREt?DhCyniK#)#FLx3FPZ|%;HWr3UwQOY3dJ23sjOz7Xlg}A-9Gc@Dsb1e zU8EiHMBl!rN5is9MX1gg-ro+)L!1;_EgJL}Xw9lNZMyV4xvv@Hr*z1-MYvOqaFPSU zhaTBWLkj7Lxr!!!)3$@|dZ3o~TK2AQW)iHb<^s9jB{T~sgWF_a3aAOg%p&c$s@ikS zt#i7oQ;Vnbl?yb^q*1#bTuuV{=OY8WnTb{1&W|Ax(s;dEU)oRY z6l+#>W8QJI7orW0sSD@i-)kn*>)Fs8*MBd;rjy@%gll6u)g=f85MWHrD$nH-xWde( z2Y$e<OR4#B~xWBi9z^Bwj*jLugfNlr}$hEPBv~%4;Ae-1vG% zm=Ld8vq$wa<`&pSFrSG)vcaQt7s8#2g6`aMjQ+>l@21fQc6EIyz53 z`y02=!@IgPzUDGoSPWy$Dr!!&VhLOLUbj$WaG8kMUSti8*&Aam`J@fGH#@jZxKFfc z+6U~D&<@!bomKS6*8Ma;dB0>yy6iGe0UR8rxB!r8++vF=Wq$MIM#h{f;~LFN zoRWCUj)O!+H-UuIEStS&8?$}e2NHqGa~FN;bMQ7i9|h#J2_eDmii9R%WkB{ri zwrNmap5vH!4UWzTo*Sm*D_R96>^-!2&O@#B(68X6_NVXu620f|w$t?D8k$`56e?R| z)b9t=kEmL~xI>Dpm@{EWqay|N=1$NE9idkYcHjRUY0=*U{Icytc6-(gXe}TKnnP%B+&s#0~-5sm>)kIwUi3T8!nk@!2K&@Gt>J~PsbV7NJdZOYT zJ?aOr*(OqdmI+`&XxJ(EFoQ%#vWp;eaUIVnFTy0KsWVL_t(H10j^83}pu~{3PQhC_kEwq6U>c zu**R~Bcl^^@Mxd5?Vq*hC9;{>Lu-dHr@7g84@&sECBQMKr(n|JPp4;x^s~SELHdI~ zf0!0p7t#3Yi)g+V+RmBuP~w%tqZrhL*%%uc((Ke;I)Cyg{m)-{l`#Jyr#g*s`WB}h zLzjT~r3sceM#fEpy!lM@M~IStL7)EOUi#O+^ikTfr%e;TGj>$ATH~P?v*uxJ;a4%@@Wx=UpNO#4I+C3r|7NJ0#PsqN!8BjC~0bT zqpwWXkdVl-E}Dsr`4iT&rFM3FNNU(H?XrH9=}5|HP4tn9gNgY8*H?4|W?Erefc6Iz zvQn|rg8^w5r|-2yKo~PCu2&h^I0r$Xi}^zo*n}qr2hEat{RJAI=+L@#Yw7g#)ZC{& z`H8o;jvbpma&~(9*!XCN)~p(#!EiAeJ3&Z;`U~YsL3Cihz$B>c2#e1RL_WBFl2dz8 zb&=!?$N#O{bY9ETv?smOMf%U%ZLAuey(@jc5znPIzaN9VKYsDJ>SpoBx`mauKUIsF zi2;3w^GJg)g}%)eT~ha2BmmT`hDm}KD~iKdcp!VrTLO}z=+MG&72UV_r1svEF$>jd zI+`7vY&>nF=LnuZustl;?hhZIrH8kirZwkWMMZm(dcB}(l{BtUg@S1Y=H4!8q}!*N zlUwOU*O&Cp-+d#!_IVcz^B0Fl2fTQEP&?O~OPu0E=amWMLZ5-eLaRl8{I?I$&-|y) z(xI6RG`jW@TIji6N!GVqQh?2q8zG=PI`1-|6Y6ejLUhEsuASdP`p?(tNY{Tp13K8P z4$aON^w{>JO3<|JO6jT5fph73Za!S1V%_v^RVU}ev32KZTI}=u0UWTvBUu6?b6ljS zU46McizT^8d{euffQD)-SB7o)svWzJ)6`6Gq#PAIEj~Axy9hKb$|^Sls;~xE_MDEQ zDj(JgG(pZEfOFSKZU6xtsCD7ZL{&OsZNPO{E0LZy&}i#NRjcCZJRG^xi+EPFqsWKk zq~to9YkRbsaH^<@P^%O0oZ>q3tEx_|j=g4bMBWAKQ!Xy+Gn1F40&&i_l5;U~B&_SS zlB*DOD$5?NT|Hi|nVg{cx!K{-V}~E_#A}9SF)=!%bJvd&?U-XpMhdwAts}jlQZ%R^ zq2d4?%7`%tN~)%|&ZVEc=D^gOij*qZ!cwz>F;zEsQAg`1Cr<+7x3E=)vUkc<>0j?l z!1q9!Pw9h)-c`_&+K#e&)Hd1hyL+ygSW;31dys#hCYXuO2@Yr{I}6j3$KZ;JR%0Ug8e+|C;M^22**vAjMe*-4M3rKV~|$^7stUOdjSU%}KFZKN^3 ze?gs*N$M>WF=$ijxl<4$0E&^MB_32Y_?`4 zG%e)|>Ap|T)t$Eyu3aI?7Qx6P2}(g0Oz;yaFHd@kCFJB+mPlSfp z@1iAwU0PK<-ag`6>Q4Ew$GC)_AK!I`2C=+!Tj;JVF4=pWgehpI#M3(=X7<3qY*?_8 z-(kbYnFwy}zOZIEdmq0iGOOq{j@%Ct{#rx75|faQHJ^y4CeB90W)&Avl0G99=9Uup zAjtUhx=y3t6Z01}cgWbOg+l0f=7~i1TrZkbHPHABjfO?hnE#KP^<>OECc{`m`q%!+ z9ZmHLV#@8B@OgjecoYKY1Q^Mz2x#fkx$DPiVvOiiT<6_Z1OS6Uzv#9Gbl$nEiH2uH z^~cFEqBDxVC1c*6sq4A4^Xb4e9AbN|cBqOv)6RS5-=rDvwzsnJ8GK&ySLPt4g2wzr z+q9`|X+?*Beh9U3%OF{}X**K2zHuV&tmqlGy$jA^kVv8C3QHgykT9L!JT|i22!_J# zV%4xox}0nT4rbv$-H}P!bMP?jIy_5Hy>J31M`@7@6MIreW)pVmJY56P=?$rk191=M zk^7btW3Ypp0KX6#SPW=k`WQ`iPtY&_+h@_g{N9@=R zrEpUK0G)1&K7G$#`qlsTDLQz1Elr+t4fTgz8unmX!R6vOm)H_5*SC#@5Rx*0IWaSU zM&cg7ZU9aK5Yj|nm|OmAYYb(oQ%0x%4bHd4kVePX(qp?$(UIeGbmhiz^+C}?Y_3|u zF45v7lZhL0j^4N$Y9Nbzha*)%(*vTN2d1ghStIIMUKi01CRRi(Y1p5mbJmU0h3Aa& zDhcZ+rWLGPsn{E=V#OP6lnlV-Z4J`#)Z8L%-Fc9@qmwc>ey@xD*9i*VcZ&V697Y#& zMIGW$3M~#R%5S8Q zpwzV0Zakf~NfxSGS8hz>{xI-dBtlX>(D6fH3>+bYLU&YkkG4AitN8?6do%NH0+BM1 zrPhdsK3m5P?Lmu^2oQnZ4tunI{VE!1MeT0U3kt|kXl&<>9gm-$IyrOk1?!78EeN=Y zaua(^BomXWo~zwRnPuIPs4ontC-$M*j%Lpcn}oGQrrxR8&XX*Lb?p)2UE3#rpMP(| zWi{w=x$C?-j3p4sOp#Tb^6yS7%$q9R%o1r|!9c?PZ>xF_s%meKLn08Zv6(t>p@O59 z`SlE(BS@fH3|Dr#6Lj>{B0c=*Zn<4*g|lq4B=h%cp>AC?jj2j#GG?4j-_e7FpKwaw zg8Grjw2LA2W)9J{m(J7M{`0rdPyMr-qJ=-aR+)eOn_Y$}%l_!(L-Hy;yjVP?EkY`@264~Ry_R@2^tXKB~|Q)yf6%1VC5`n(OxnTOINl`(CaeSClT zy!UXQ4jpS#yEA5Kk3);1^B)(@>Gx*n%1h3nbJne5M^ym{_9mg47X3s;&hF z`n(#Q3j(>TT!En2UM&D6reb+d(6E8Z+y1T6_sYI@w8w*NwnBRFX#7Yu3Jvtvl&jW; zp^u*R{d0+ml5vpn#2+0Lc6dmBOU&EoM`AK)<~K?E9f^m41<<8ewL*w9`}i>PPWP~e z1`p@xqVv`gm3=yS;`qMZJ9qC1kDmY3CqDF<6UUD3zwF`-G|~?7fk7g*#3Z>FWE~=T zB1dJ?mq361`YLk;^Y(V_{2Bh8D{7qs1W%w3D|~MCet+H(_saOXDNj&qos`rdL4iR= zW^4tHbi+mGPBEoq>9L}!SSnUAaSpIe{mC3@ z%3WrQ%91gzngqnwNbnPwojy(1U%iIj`g`9?FS+UBm?_X_v|RaNnf)}TTHc9TIXe%` z(xDUW=#01!G7pJoezgBaVlEDqj`{1;9p%<_wT*0eEY ze?G{X<~+w<_FbA=Y|)k-r+s5xE0zMs6>ju3JHViJ?LI^&r-JrnEPD5YI7iGa*)Io+ zGj#Q)30gZ5oLME5QH5F$xNVQI>N!n84iN5pr0_>h?mRT0)6)Tvbj`U-UTA&|`CRDf z5_ibYT300$tRu1iSk9FFadVlWfdRKEywg=fMobO>8=A%A5;PeghHTUr%4&a*B>lEkwV8m13q`Lz3IT8rO|aO`Ir2{dW*asgx#_4||JqbkW8UI&WQ@ z=KGv5D22c2(L^*LSsI{&c7hYVgnwt}2h<<7s5c0qW-R#&{EGHoUdtBQkOIaqhc>4m z$R;hOnFVE7R%oKi_lNy89~<*%hd%=PSG2}x%htUyzFlOk)bm<_hJAM<>i$}kK~5^` zpmFV?gqZKxvHKLw%!g)nw3Y#P2{|o>G}7tOQ?D4&-2YK)hFE;vuQf?t++1k*7xsn+ zOm00rvh`$ilx2@^7Z0wW4w@iH?UHUce3z&j4fl#cAQm&u89dRn42D#`=iSIgTtXJ( zM>vW?o8;0+^U!#@CB4>lS0|ZQog39zRRO(ci0SO7%Q@8)Ry7U&y%o8$@=Vqe;EUsf zip@Bx#^iAxe^f^F{liPE@3edC%{`*Ab)ni7CAZQwSsN10s!xlip8-vdm2}~G6Eqm~ zf^&bU-L(*Nyd6G#V)68e6DQY9mURBP<1rMF>5o%sR)k4UXnki^2JDxUpqB#%Iyi|` zY3J+ie_};;me&9@^`*`dkq@9({a5`R^1u2f$6A&niyk;QwXb@i!Z{9=>%c(7VJg^l z6?ux2klVwiX0(N`p@c$Iqpf>%746)2ns)4;miy?dK9+KZvCjK&Pf=S+-!+R~bgtp- zZ;&Us&|(< zRtf?l6K@sK>2lldX`he` z%Ym0^*gvi~m_`#lQF2-%vHR0HZ19Qjn&2wkZ$A8cn&|6N2O@h?o>xTGKOAZGQiFS< z8LhUgDujju{j;+4T(iUP!=xt(AVA?L-kaD@VJ`cF9&K3LrH$*mboR_t|Mclo!A>`9 z1q8Qy_wL;fJox2LP;YL2(`Dxuiwm&fy(!X5nQK+;?j;^WU6x5IW$>vzJ_P}KtxSSP|4n`I#NFHCt4l_l zVPY{ll;A|u(KmZeorxtb3CSfNo)>IM!>Gnb8clvkyg!M+aR@VN`9cyP)Qqt4fIo)6 zuiY7;*~Kn>>A}5epK0Ys-8h2?RDY9s5cN6Q6Xl^0=kLr#(Uyj>3)crnzYqc&Yxx*C zeKOSi;kv6Our%jigFCYkOh~bz@Rc>rF0>d@euTi5i zR<|LXKXhh5JNC`Q1VHS9;O8XG;lN>tur<3rGcjPTQ7k_oS|d#;1i{U>+XJmSp`;$~ zrr^_rzhwVOEdh3tv;BthA*|GtRN|6tGw~Z1erQde-7gS%G`BCX}t^JGc4r2^1I;%MiAxF|Ar26Dd`rM^ARXFU)jE@tX?PDDdLH zKas;lDO4=UKHlE0hnWJK-_suuL-PTs1EV;Tj)`a#S0JvHX~G?G22(=m;+;W&x}7mP zJ=3BsTU{LpRi9iejAPcT0_t=ekA5JLLK z&_$St=o|%?7E8`_C=p8&HFK^8_iATo%S;>xgAqX><&qVUi2V<3s5!(6mlV?s=ix|4 zGNGS3#|9K~Q`Snfimc9ufS7}baMaNmT6)bYz;nsJki19suBK4;aLZ{UmlqC=u<}P2 z5*a~PaM^PvaH=}(hSI?0U^dpa80!|aI6psk^5n_G;dXu6{QS(YKYwO$`9+g7)(!T> zUc5P|ae2+8_7$G&AT{L!12mN)%gpenJxF8Imm}`(d3A%7G2?Kg$t3(HFtsK>L#cv$ zhwpQ}$)fK4rY1`J)&y$&@404!f2eL^Lxr*mRFi-l-j>+~C8{H{)5H`aKuAj71abrv ziu--$H&2A1@As9!R6<~M&rK_%TKKWOecFDA*Hk)+fFy>O>(^TKNF*(JGCx(4`K&!1ylGxz9 z+dI(mKr`aAy-7`tn46!79@~C`PE9XTyWNfU*#JZgd(<&alSV*GZP=DO2Rwuyz~Bjd$&Dw(FN&7x-M&DXrfsNCig*^=E$(&zv zrs~O8!&@tJ$2NN{#j5L7XHhAKmlk6B-6&~?4KG;>EB(Gle-g=6QETT9(S0h(!tC=7R&^F~13K~EKIH}}Qb zr|py>Ph^w0bb~JeQNK4&=d9_{<(F)vsZ&RKJGMW5+n$H_?2o<%a9DZt(TBGmI&@_B z#tkEM$ps@c-ySg!;-zA50~?Ck6Bky*Y#%F4`WXrVp;?jP$2YoW2D|!bBzE^bc$5~! zCL2*|RJ}?@fXv+B$GAF1Rf3e5V4UsD<8RhPxlIxs9l77kf2F8V>F<#`0rnjo5@^pbU8g=dw55?`HSp3lXMljY3X! zYLrAgO^ly8C4r5jWL^U(2&Y3)qtWqIv}^xq+H?36E0Jn)!l#GNpWu%w1+Cjh{C-PT zq^5yr0&T^JgvWOrB5IFETR%(4s7x3%LZRV(n(WTf)2`^+b0G!0QNus286iqk@X_d3 zAZOxrQTxy8=V0p(l`>DC?a?ETAEWlj8vZ>bZyIvO02ZJnsz%Fj!--cQqHIV5_gL#u zOp9i>@E|N5S!&AcQP!cVB^8DmZSdk#pc(<^HxPiHfYS(okdHq$1>a?6naL=lXqCYS z2?@9?oY-q5bbp8Yk;+(Y_33OFXz}x8l5ka}o|@16!OYatE*_{bjuEyb!VbVWd@s0m zNLrT37`ulC3>wRd4?`UYt`i26N}EcsV4evf#39wG?dM@{jxIXCQ(k!fWHEi_Z2!Q~ zLz|~)>hy3JJizQ2o;Z5!SbKP;_tdAXr(zfq0);{;&PhWEpGuw33TYQj5;41QSo{OF zzd%Zndy~A#Pg(=unfl7Wf+edEgpOut$cOXZl(r(4I8=f2wxlYv4)U+B*6!cBbo+8u zl~=7>AKm-l>?8Ma;SN^wt69U%m70l^d+>$?!)(PEelZhd+CQxzhi5qO1X2X&YCk05 z=Rv=uk@0nO|08?p(229u2?P$SS{+T@Vs`4>y76f`mltpXgXMocTwyG>JPi5}e*WZh=j{>dCmYTa^zAG7=s9h)A~ zfg|(O?TkwJA0%_TcD^@9=bt-97oIaNXAPhbNh=9aQHL8DkNuih}xs zdAjnFRkV6^K(o_lPfwpdIfduA98?BD?a0OiGOkX9F{^|b ziNqa$iy_jUcpF0W<5R0qNYsj{nn(Gt%I7ATaetAPk55KMA%qAEo4vHLA%&sIO6KSQ z>7RQv!f|vgm6n2GIG>LIh=xPzj*Qcu19SB7_A@#oZW`6u%}k9sIyWZcKl{I_#vof2 z+IW}5Lu09-!gQC5>#~m|$h8bhAAUFc2lEM*dMwuh51(^T)O8_V)7sBeI#-_&tcgq_ zg2aRC8L-&Bsx9JHneU4u<^mloEjR|(gcxx{0by)Y*?ndw}>Qk2%>H2FfqyEAI?cTNXOCS2c2kzo&6si|g0pb4X6K9W} zojSGfl*`xC+KGaCy?G|~q26aaTu`ITe4QEvgAC^EnVJB`3ISM|O}9!+>X>MH)OcG) zHI-n?SjteIBGr_z0Hc3`XeY7wmH5{%oxCq#yV#UKw<;B?_~{$(h=_kU9ANrOZkIXPpWpZ zkYva*ib1m?^BEax8hekmS2sqfYQG`lWtJ(E0iH$q_;snwN5O%zJT}>6B8obEDa8x< z0M^o@+mF(jzNqEtYjf1iz0!^hoZ{HA_b5%z4ye@*MR%f3J25>*e}KU}U3JBJ8V`k_ zf{zM2H>|kbiFQU)Y9pf~D)8~sHgDNU{XvKKrRs={Yv{bh$GQ3m8uDq^n|FyZ4LlC` zU(H9{(8P>e6}T#tIsKGNAfA3D`N=E?0R*0e@k;7xRMxb2g#J470HArY^p~0yBW{VG zlwYsV^tSwiL7&}r6&f4oLsBoJf(bt#vOa?v-WV{*qwau2(RsjZuS~mS!{|aIons%& zf9_V}vsL=X%WHwwuWr-To6e>F!YnQJW~Wb`I(16dzQ6J4sr@JS?%ny7$?@Ufs;8Vs z{rPE4-x_TRP#3x)1@IPE+p|0iDP~cPHu7ufSHt0I-0EiPLi*vn#hz<53s zgh_CYOjMGUT)l>e%cQEtY(WKUDSE?P#he39nl$Vd>uZZ+PrXJg5`z%llM^?Y3!jsL z=fuVmz+5#Daa>q+iqPK}zT_OrxSHG`GjYf~>l}%bSJ|e{$OP>_v_L!dOfe>qeEVqC z(l9?A=hQS-b0;EOvU|m&gSPKppv8VC0$X;TPAT!Qzd)Tw5?XvD( zN8RU!!2$3n6+!wBdmu2CB1mpwi=c><+?kYzGuwJxFA<~58W9V;dZ2q(7ic?WKj(CX ztzj|_;;Z0#;r>vA1B}?+*dwWs4 zKh#vI?Pl7B=!tkJ-YDb0;M^K$0S5rXhfDe+W>MCh$}KU8mTNCobleWZ;9kO-m*79t zmQX;@*ckm|ks;w7s&&;4OB;0VY<x#DY|CUx#juijuj`4 z9iG~|YtQD8^b`Z2X-R?>;NZc7`!+vt|83>s+~UnoKff6E&Y091_qK$G`3({sJA_+0 z6^p6BOir|=!CNyY1Wis~OC6pb*eyQMg}l?_1NBx9^}MA2VQOE z!a(wCvy`%IU-0AX=K<-R({oMz^6GrOGRaNgwOUZETN-6eOr${H&sZhe**-5b5iXX- zZm+1~Q!2&R6z(C_ghXChq9zJATspV<#Q=sk(IqrN!g>v#*O`)_-IcLX5CA}Lw2TF9 zGwEuXFDH}po(*X%KfnPK7(dWX@tvvtAw}i3-KN9aL@{BQnp~>JCh$d4m@&Hr z6vKlQ!m5J=-)--zvq$^${<|_4->!(%AU!#IjuM27!K%bvvp{2~Of9H(|0F#qDuwat ztz)b}v(N~b6mK>qk34Zdg9Vd>S)nctJdwz?$Y9* zOPjaPptz;Et0~tiR;1pqv-u|`Ll>a~0g%CMK}S!Vr5*cDQFm+&4f+g#)43|C7fS#S z>GBXKT}dy#@xniR`j(wb=PgQ<-j zR#jS&*#hGOh-*4hlUkiey{=ZN58{a@8~IJ6lrce%6W5HF7&CX z0Y+RN7j?Qe?#$a?zAHV{mf63;|0MJzCIu5{tQ{0nYiwEyl5@m@b?)h``JOmQDrj6P z8eh?{=VlqDQ-03SJdUJ5Ef-$nEgJS0Y3&%%_1BzR%$+?s*tdW0Lnlt`Kj7ED(KtEz z`Okdf!5!Nk`^ps;t*0w4T0;x-GiobVl`<%$NQW^|W^h0-U61R43sB4^4CD8NC8sBN zB>SVX@S)yhg5i>c>Eei56`0u@NJAZSN<2ela*#bOs{a5>%G_j;>?pTEm7chJTxZ^j6s)KWZAs#{;go~z{2dGd6jIcYa=-$m!bZVX*df2X| z;)Q|@00@3}%HaLqd=8TLCbI?R<89}0K-J;=uN$t)(CuwS?j46Pl_doJY#BFI~3%H16E|69bng+ni zu1tQ9=YSEr+>fgtz&fedGg>T!C$O?XC&pF5wRfGbI~7f&c;pVXOx_mwyNr0Od-17 zpw7=+gLulVZ78#>LW{bMT1xi-2o@J+=#mRo(bbzSpwlOhE^gnp`Sxww_8)-HANRoy z^!e=8Ef3$<8l0TE`RNxG5*il=g-xfjV8Wx=hQe(|v6WVg#r0+xB*)Ns zf0D^wsvh&MGjV1`y$|Lkg){WM2x|l*l|{geliL^VIf6Jb=#1Ky&OjI?q{vVu-K-FT zToG$X)sG`(8ybC*53w|_<=zKc4fY?{)YN`8yxos%J-*EL+G#fAc>bw5J|YE;+Ad4XrafcyhAv0SYt8tECMc` z=*8X~U3tZY)Qx}?!{t*{t?Wot-P)FrO_dXB&6h;mwue&5Bh)H7y39h>Hkkl1%g7#< z#Tm9m9Cu0D1>3RP)yfPMaDy%@N~mvZexw43Xa+T(uTPN(hbVJ+Q|CunhrF+_mf@Xb zrLy%cE_Z`Q1gKfg(W(l-4~&-mcw(w{51ie9`5of)4gVmyzkntIb71N!3(W)#kExdt zxgfpJ{!1!m6@<9m$kAvhPn9%`r7dLv*RmkQ-d~%U*D%; zf0}N%_WW|qM4t{F+P`D_mcwD6nOQ76 zAwiCS*5|=GzC$Xi^YaS$@Kq8DWJ8>C^z{lW>Vh}i$()2=y`ZKXu@73j} zlnyg5YAgj(?Ci!epRVTkTemwwr>2MW;FhEDEJr1q7kq}L_4%fOSZX{R;j)qC_lTsc zW+w?=g7?3Uq0Afn000nT54^W>X8MV0IN`d?ocvn!gq~+*}8+uqASjbQB8K1 zRBKq?S3%q4ljewzMQlx{py}B~dVJS@8W|lEO@rTazAr*6ok|`(_9B8Z55*hi$qu0B zygb~vrteJ88>r=FkPlKHbAriq`=TM0aNJPFeU`@D^2S-IlT?M;F_pa>KEW=7+{Luz@<}M zbe9Z>?0y|T)Eq$gW2omd-abpue#Yh0o13MBdv`tZ(T{%gfm~2cRtA2YI)41%?rq!d zzx4dpaMLBLir&I3wOVcMB;pW3l(;X9K+qMHLY25-Xt;q)VAHB*O-C+GH4mtNhTmK! z#i9^{2Ox>E2DVDrW)K13maa*rO*UHd&}8roHknPbxus!CIdCO=2>yH}hf-9JZxE&3&As^L->&u>w2&Syn@eh|R}X5#W= zSQ}hdHL^t_fy#n<e30f!+l~J%)`=0V(!!Ih%7lmbU1oyj`kcl9V;fXBr1ZE z0$UwGqhIj7P|RIJ<3KY&BQ>Wz%uCBQUxv;liqhu;qKm%)qJabyNwPq}?>+>Q)!?BW zNan-iB>pa-b@~?0%E@WQ-GWkoozywj)~pvYjM@7&0iOaDUfdX#7&qPD<`<-ZRVG&J zm5ACsCgBpl7v3%cZn3?h({+~732QkW`2?(3 zxqNkT?8w2XJ$rWDOGI1%zztaLH58)(4jedeVDrOYzH5x;7oUIgCR&)E;`EduFA)Cc zH=|@$!}tQ_^FX;g*COE|#6cV3J@b5Hmhla!{_ay&%3{hA0%7q$RjP>;JQGHEUb6M` zg;r-1c30zaAm)Tg`+sr{`(JIf_zervg)pjy!+Fz4Szq>N02$M@tF)zlAZ-ES5^Z{{ z7RU?SOZ=){bim8o!kE$8^-P?&xKw*&j5cqZru`>})QxFRt&t$0=I~$=%o0nX@xajc zgBn#5BC+HzU^Uu!vUGsi7*yhrEAQ~BJ?*{5v_M$=LnH~4dl%<<@Z2=Taw4KjM2cpF zv9VclJ<5EDR*rvl$)n;4tKOzfaN%D1c;)(Kqk0w$vDF@<2e%%hqw`h?aw&GYlvbc_ zzx(m#Az=pCX%QVd+NT3Yi8`GTCd}=i%|L4BK)~D7@6FK#=Z?_@!2uvtfn>CrfPj?% zfSQhI8>1;Ml57W#BlRQf$PVd$0 zKwEm4#BXHDwK=J?!I}w}@VsIKW5rFc@gmMOh`;) z3sZFSjhC0_t{J7{M-LwT+!t=W-FyEp?KVtQKDOo2&Bu@I*zvq)UP2ot%d)>XV;=I- zRtu+MbqVq)2PD^Ob%X(n-A))GH`b)Xh@P?t18?J7$`PpIFyaapc~oT1i#B2=SqO3! zo0)k>n!1Rk?G$;VJg`6K7nTpv@mL_J%!0`w=9rJf$R?gA7O8oCdyu!?w_o!61O^%< zL!|f&v8EappjL2YWR7T{y_(uJdcTT>BrHDJIDW$!k{30ci%n%BrPhBV^=<=%u^As- zMF$S|>EX@$sUx5;hLUOwzq8Uc5v%168CN*$41)bvQ$2Hgd4mZ6h;=nx9J42O@vn(d zsU(vAgBmqPI4Eg?uY)#BOcLVM2QfB&X%c20a}x6aft`>r#2J2(b!wp3CuCt@ z&TEGyGWbLAn1%S|n2TQWc2F%7mOYfeTD1p5>Wqxip2I|2w@*bIJI}$=6PiLP5L#%` zyu>4*DoSD&j~?D1Mts-4BXnwNK;7<`luVU;u3#9gg68L^Y13sJXze)@)E|VfKvOM; z1VPb^l{nch)o#o-#>LDcp*;^jdWaSV6Ov@egG7;tWxmya1AEHtUyZ054z-|>qo!(p z^2wa?{loG8HT`jd5XN17QXB*3Xdp|L7TcBq2j$`lDB+LbByrFPMZsp;()7Vl$=7Hx zOe#)6XfSzdNS}@cyjK8LWPNJ{NibOn?L~vc3MAPwbWmcbFjB8$Od>r7Pl4}~sOuA( zi{!=;6CBnJ_M;|ki>7JWw@&*J&5UBn#wz1nHQdT}Cun@;Xzj#+p8w3ti-p-^gZ+DV z-+yF(>iypc0C3T*w|@M=ZI5q#7%0(e$)Vj?gYp>$#sO&5Ls954+Quspto2Z-(VEBH35rF8X>SungmzI)E zz#UVj)oP8>>|%?)^uRt^5C9T*V93DcN26FllAXrGt*>zOdwq#q3eV$0Jz%IZjL{iO z*PM)f#jN#z3)b5PY>FI(tKYBplnCt~VhS>i#Z!!jiUr-GW z`&oJv)3)-lZP!UUJ6BRW)Bwk1eQKpL7A?f;X{R}gP+6>*(! z*>;4=)&zS`%gBMZF|9%Gg|4bP-NxDQU&>f207Y%@w(qN8x@kXwewt>9(}$}(WC|bv zZK%g{3ggU1%p+X#EcY%3aJJ5pypba=m=WQjq|0+oml1CX|=)2GkSDMADK7idQaxL%x_qH8W4 zE3doqTsm?5=;HRrx8A*ff9n0elm-A7%s&3uqxa5FA3pQS7d@>g1~Vlxfu)yuwG{Xu zieC&X3>{-1hYPCz;LV?@5y>=iSWNV+#vBdTy$AFzzr80c1dU>VU-|D!s zF+Uwpr%3>UGcSAF$za&Yz-Mhw?LjGHGEZS!80eh!h1;mc43)&w_qL+;AY(3ZZDqOE z9Wz1cZvc3pU}GU}k;=3AmlpMdGvL@-`r-q7>Bz}hYIoWy?N{caGB!`-Kq^+EnX_{- z4%|#aHuqW|fkOIg0bmsdycE#%V-B0A%^S>0P6nab`975)^CZkoUUMa&F+WVBVqLK1 z3@287ZH>BAZ0BxD8Jws5P9v&@*?vvz!`7;d2Pf?f-tI#hrH39pMl%DJlJco!dwv~d z@$YA%Yii(Z?>MFvhVJZu=&@}lsA!E^dT-6QAQ{*OeH!Z&^ps0incs&xD8mKZNvca6 zUOk+zjo>tP;KU;B+JA;xBjfD3E+9zfz=3WLJ{6eN?FmV|6D87`9R6vWjaEh>QsX_B z0s%ghnE@>eJyKslF5~fnmouIx#fyqi3&exV>@9xHI|iDVEwU!6=niaaNAEMpA5_(c03lc|J5F~CV-NSk@J7|{&#+S>mv_7 zbo0~CFE83SMvDv6&c@Gw*g=dHQ^>8Z4;Oo57>t2aM`?N9Obz1R?-p6rFFd`jiv9o? zShdfiswy90%!zt8QMbEk@*t!U-Q^ByMRSN4o&=DfM7qk{(tG7Ts5>EL#(bb=EBC4* z>!1)nx1qcpD?VQWaks3aDTJ zSQkdy5XqARRaURtdP@L7*5*uZ!dY$}uog=+5_ezKq!lW#aUVIVMDPV@38Z{Q%gE8d zX8{6|IjZ#2C$qv<_1Y%6&S~HfJ*T@foR2k%olrIm^s7z%!3>?Zp6CV7xw1HU^x)zn zn;-b}M?UhAdz&<o~77j({0JasO zaxP}eeGEGsG;1*qR&AMFB!U+icM!y}Nh(}YJsgv5NE9>HH|i<7TXg(0LTLQoy)xPEjURX5>O@XJBDK0zJ7rm` z5@IasecvYrurk-)*)87JqIP?P=KE{ub9e7{{WhSL0J3H3L)0D^uU0{ep&tC+IT{qB zu~aSW`@HGJ1Yd^qwPSSr@acOmMb^gIzgwtb(ef)h;w z-1p+VD@AOwo(-^KPMqR9!ogT!1d_MSSG=#GW1IdfGp>LYN5hd3OEhj z9vPja{YQrM;I@zt0M5Y~aCht3K1+Ya$ylR`>U@L1n8XYG@qIJ2_wXEzj8BS2Rg!u{ zZ5RJ<&|9E$H%!o_7p;$TqE1w0o62FxvtUf}iE5y{^d0VeaO)YGS!hRxL<`kJZ&Pgz z_9W&Lt?+A)0h?*xRKSR1#F|?FoU~nuRXfw{hy$Ul8MWLAtyjA{fRSU&3RFVw7tnjm zXEIMtC2v)_EcXFC>|OGqbZ~tn2ON?)Or4p%VLU)$)mSx_pYte#}6ET`SUl?+R0(rmkNR08RXF~ ztDD%{t}^wvjysB9*lv*P-N3A1-z_ac>k>@tu==}7_)9;Vr8?Z5_clB4;&Am>z1(kB zi>+R|PxY;Pfqvf;VmbqJH8=yr&Y9F;SyfQ;e3eC-gEdY z?LR(eK&MXfs@u#?djz#9vU1^EKRRv|bmVMF4?H?Uo$jR7U2v^V0Z_&$HPK3S?&|kJ z`rX>B>?1K3X=_v}aW?Y?$&GUvIKpIi$jLVKXgz)Ijy6NRZtb56ja+`mmtXSwkOKq6lg<{yI4YkiKW z_+geb;iPm<*!XLHYb@Y5&|ZYxL5mBnjY4JM8OeC2JVS+K1xI;^ue>K~0zejq3@IfB zy;+*n$} z_tp>6fCzBfOe7MMDz|BTVhwHIKTDtg;x683$OP6n*gSC12sMKmxlS_E-M{59?c6s@ z>g7-j2>lcrTO|5EsU23gCQ^9!`EQ$nU7;K^8x7+XCN0089 zr_r%BG}Kbtcvw}^W+}qhQgxc0)&z6z+NKP$w*8(-q^A=G?f9U-U)PW!wlo4qGE|O@ zuctfjJ4BD{osM&jOo-~c;6NPJw7nh>+j@ZMBpmyv=IQfy@22+1dMWkH8nEao9YCps z+Kr5k((e6Jw0-Y%44jD>`;em55n|icRV`$Gc*#AkzoMWoJ$#5BdHf`eO>SVRS_2q1!(9i4UGSvirz)yyDuTOQ(Y@!>VXe=~xLyVY<>&Po^t44t6Uy@s@6N z=}lJK*aq8+E}SaQU?v|7gf*j+GGbHTGy3x5nKEMj8AT-QydQ%Kwsv0b-gjUn#0Eem zA)J-i-+IDt>i_UJErO!j8)ue>>c4Vi!5si`k+_GpMKcUk?v}E%Xmx1VSx0~U;m7Fo zf|CZES=aYMB}=uF`w%A(s{p)0x>vq-en|9JA9{!e#ab$gQ6@xcqrx~NZn{I=@$>2Z zw``%^$LFcj=1sX$^MfbOEN8haXki1lT6A*0q<6pn0U8vO)M||+wtsF*8jGC+JxR%8 z*Ct@h+?sunsibX7`ptOq=<7hZwq?)bIZbDZH6IAu<2fA}ouDHphxG2hdqg5W&~`H$ zc!HWdu>u7A6~<74-8c~84}Rit+OdCu#wOQCY2OP8p{-FU2yGghq{AnB^cU}YfD;vA z?8Mt!8CuPHY}%Iw68QUEzob9^n=jMcU{xrNAYjQ-n48Im)wsrDy=uOO(dToJtds0o z$H={u>$O1jfZCnQR0b@uOLUb2YIAJ#v;~^PP!ih9!BrJF?r}^w2RlN5FviB>MNo+i z$hb}6?$eUWKGS3E;8s9a4hpn?QTt-oavF7f_xWUe$fj?WzXA?_)n?^OPJv_GKRxOW zr|7jWyOu^;^R#p4)-QkNlec`lD2m=v)N4r-fOL5HiBH^e`@{F&d)qZvOqS2S{(M@T zIYr$NZ>TB@8C3HNF=CF|=6=f}*4Wje26=}>wo;;-)~`<5E$?z^Iio|MUS;pC0S0x4 z<}X(wWFUaely2snRHRP>aS;EBTGdY7dwqK<*QDPy7eEa}&lx6%QbCGJof*|(6CKxC zc92eNt6VPGfi7WS$hyX$NlZIX)3sVr8eg^cLb~tKGxY9{Y>tGvpG0P)h?p}XX3Qq` ziSHT4JnwA(To8x9_kVUTeg59FG&->{I$s4z-w=LK4+nDqujR0o#wOO$-or$H_^x{* z%++EbD_oD51162}3GsVxP*S(uqIZAvG5XR&Q#85uTeKFcP zQH)9_jN|%yJ8u%kkjs=*VxF zUnCmqcIf_{r|AFt(>sVpE}*g)QJW(>F9l6NH#&TAsZ&;UEcAvnw*F%J+gtX~|M}n} zu|2_7oNT&fG&9=8(6;c*!H`BrTJ+fm56~a|pF63$`XU+*LwH=1s@F6JwXbm?&fH}} z`=x+S?b`9c%6G;&=Q<6G-Vp)oAZb?|XJvjVLDF?EwL;?kEwLZBMyWSEhkpI{@1*;7 zosA58whz@i)|}I3c@32cW@0LmH6G@2G2|O)7qs=z9R1Soeu0jkT}8#n+Bk19nnBkd zN~TKWQdk46acYfSNWcF3x6!8`I6~v2ZCZ?D5<*kGZ$UN%HChpjStvan0M6~3PthN| z?SAS`hA4wh1Z5Fwx+Gz#IkJhxV~W$_XFi3ANvU31rc_$a(&k!CiM$_PB2Q%wZyL}f zRdS)FH}IgHpU2u4|1$)S^x5g&@;OJ`0IQO~B|3_HR5Y~!AhA%8qirhexIPd4gA<6C zd{1aJz_zP`=|_#tPB#9y)@XBfxL5Iha}ihg0q2a3NhQ_reL$V^G`;ra*V3xd`Euvh z%@5r2;rD%_D2jy`(YM60901S>_`rMLbNlwKn;&}C4d>CdS5DBv+*Blv24;jn@J%ti z$!svt0)dcP*0-p_Mpijn7E5N{sw2LseJ&@Q;>Id`F~LLPIjYxbpYw4@7pSUswRim8 zuCt9$w}EhdB6T~W>YtTvfI7yWX#uhjHYd0>N`PJ^X#~UPx~JE3wLX9H_eb24$@f3c7g4XHmYXrbStk&!Mv zxOa;F!*70yj!dtnZU_YnYb-7SNq!GW5V-=PWWeVJ zdjl{+*YC>cpufTCucXBx(P+0#w{JO4zxba&OJ{o|K%4)XP`Fulwf-kd&9+Ku%G0aV7e-y<3s-#~khkI~Qm+DGZ` zt*2;YG}H?iMiqQs+ocg>#UDaKmLV++1~k%c)1wDx>1TiQQ?%po7>%qxp9WFgj5#ed zT`R(tgQg{X4o?ccAv3-6=|BADC+L=Y579`6okDw2_~#rIRz_Lk+a+FHsZ~r6!*nb# z|IoKz{4bxPvxAM)>a32p#bQ!%t(mRaPcsV+&E^^~k^Jz!L_EjP#^ypzdY4@bhwjQi z*PN-YO*I|rC>CEzs-W43t6^{*_Bfx)ua?PqGWW~TlU%0CT*t^ ze5z_3x zzV)-)x9{D)l(wV)Zr*L5dx#4{ot z&IJjkriTf7Rk0p2W5Y^+oA$2Cs zrDJpF(@+1#r|2&}{wOVqb|Y4!l?;=?aVx~mqn3C8j{RYe`ojVB%8+BALq)eux7>M< z{^fu85Iw$cj7BCej)Xk65dbh_gx)tJj(teb(_T%(u`B4;|NHIqU;g}FIyoCu_`zHd z{4^YKPE?|j!gLsv|D0D~*lN>Xed=-g>Hqs9bolf-8lAk5`u)HS>T@3Cb5<+4J0A#} zN7${GCYH4?ZA3Cy?>TYI31!10L0n@bC6544k#L6rrHekhK(H{l%=6VNI4rOlZ{`3?tYG z=VOkGRzdIi#N+gD|DR9Np)>2LJ9%DQf6*Bh=BJoQH~f$1%>X*S*Uw)nd8P?^`La$CUsrLa`;jJjueCqqsZ?|mjf$M_l-`ntpcMjUfs_$KRj zgSh-n+FUe?n*My{{j%uUC#PoAT*N~P9&&JF(tUlu-28xcLA$2Tfjue)r|6BZy1qPT z^^i^;J#uv4!2^#G#pvf{k7Y@a3_uZH{QMWc_@%$}OTYQYmtFhPYk&TCK3zV(zbHn= zE{KUXxHCMV(C5XD3*+V7Ld!LVi3F=ws=wyRMzL>u zsedUGgxS^ncc?j2q8$@v>2tZRvnTj<8NOVPEA4lKQPFI83BfC@^jTQJS<#H@!Qo5h z1Cq9)B4|{~zlJ`dZnfA5hr@_whl42^&K;sxK6f4c_?vI0=U#t4jmlj<59QEh*dNMj z|H`h@^q%)WL?8J0K3ZsPps~q~)C+dkw%A==A``7vpn2xgu?y6q<^-@P@eMqhQ(AHD*S08$iKJvMcQuQd<~>zJLO>A83F5qj6(Jxrgx^8~d=FQWG7 zI_k$PM0`~M9?YzQ-;C6JsF|~zjwLgb&?mbeYsrJestU#L&ir%j+tPU#NmWIt_c zB0~KzUvlwMdpTZ<_N2?~bO&?7s-d0~*r0tADXOy!YI$;(ALVpX1qs|l*NvGbBVh_i2p*^U{GE5q}- z6)FSlpC6L87e&eF55 z-$*Ze{!{4st43)3no*h<9iwiC?dOY&i*(}jEN$7jK%c*R2i^P7VLEoIO%rP_q@puQ z{efjcjJ3c6n1YE&#s*ME22?k*&T%W`k{{6gnWNMyr|5=j*3zqAbR|9i#&vZ5x>1^# z7?154384f`zBgy+ZZYMJHgfjRXi zl$9I?GMN!BA>Jpmm9OO#EP6nJJ-`tw_)TYB7!NWEu&zed9QH#XxWT;B2?>LGG<*6G zt({n;XI+0Tz4*CLp&PCqp$pcJ(dx+wo9kYW&d$uy(Nhcb;MO_1=gYh4fk%$hvFRaA zti708t;r~rL&X}iy1BI*v_@Fc;5l)NI3N&h^a1p>`ZPCvggP`s*Iu=nUU2g!y6(Ew zbm_(}t(zR9?no!70O;)8934C{pv_y(&=xMa?4-`CN$rG%ckd;I)(b7M-&{J`*UeB|lIJg#tbDbfJTj;EPk6AdZam}?%w zQBBVcY1oODe zz0a|tZ8F+u9TiQwd}m*}=>0;2Gu!AF{`K?9?|kXy#ny-KKJu=2{^`H}oAGqVd+x9N_b;>_-qE7*fV_iNGxC2pTDj&sCdSWl z3&9JW@}(BMx@>3Cp2}p@5mR$YlXSC69Az+-D&+mGLw`06_CDVpEQ*v_8}c=H8Lt!d zxJgO2Xw&}WsNH+-YELQ>1;*0)*Y?Q`2-FVU5d;kCoG&R$rL9vELN7qqj zbTWEiv;TlJE&|Mm0+e_Kdu(J17-wg%3j_yq%OHTLGZGkgD6}z6!^Pt?F)~9N*N)QU z#0Ygqx>2n^GdoMCrWWbU+$as(>uGd+9kn_W)bEGr1j#S%LZsrhcFQrJ9}s3}km?TB z7GC@5$g>aU+ZJ_#>U=OC{fdHVabj$a z&Rx@`wX2xfhV?PKut-y9=4fiFM>C6KM4k09opfhpEJj$wP*VYW+D}g}V%xY4oZi*Z z6E)`uy(r2U0$L7xv@myu1`DUCO=oHKWI?MZN2oK>pD+K<2?f^&L55(O+xU4$e2R2%YRCwfl0C zaP=Kku$i_;gc*<=(QMZFCZ($Obo_EHR&rk<84BH+Pw8a}rl6Vi4t-5pnPhG&^ioPD z2=l9sn_Z~eFm}GAcB`b`>=C-@%A)*FzwoMJ@zl<_+i(5&dw%D)|MRb%JbCiqN~C}P zh9?37THpSLH@)Q-e)YHi`_7Z=F8KA|`&`*wbyYDSuDR{a8nNDjY=G)Q#&yV+W)fws z(}lIcJ!6UHCu@kAV_*W!sI7j3)JtHtfU9WRU!TuGhGJcxYHdTc8_}Cne47z!$HW!! zr=jqON5i@1LYV>P4zagE6p!bs(!M|&D~qA#4Blk1Xq3Wh?nnLnyYY$FOHqsH94FFc zRKo{5Yma*UP(UXbWLZnn>2#?(GD59xHxk_7^TK`;E`u1>R`?tMKzyn=-+8_T)hzBo zK8H9aNbnpZfhpv9=VkoM>lcgxc+H^aKuh@VypD37HIl{-U9V)eLR9 z+O!IMQz_i$)`;NJ2NQ6+Zi%%Ao2oPCX(`sI&5@iS@{C9z;SlK3z(N}5l+10-+0MX- zb8`&)y$ApY!#=m571HQ-X{0+!MLUFVwrJ3YBNmV@YaO|cfvz-JQ_O%tmyiK2YAYRR z5$NUSowYT=jjZ4A(;$Gku)c#6VVLiBD0|M4Bte^LQe@76`MDLlaYagB+5}K{)G?pB zYpSM9Xe#|0!ZVyMTxQrnaSA%Cv@w0J^~Y->ecJ(2?LAfPDF~MAQx!I{Ryr*e-s{19 z+QuUJV@}&1eCPDtG+()Sb|o4CpA1POr^FA!Cx=Q884J;1271_OEz;oZcKVf{d3pKL zo7WY0eg2j&{OZsD?9c2!dUP{{^<^8w0kSJUA`xu02KU@~+iefrcjs*{d)@cH`329s zfNs10C{3=tSmInkOj*SVL|tWi=vqDcU8)T$J|J;~U}>4q3i?xGR%KFXXH|l?h1m>L z@(m>m!~p}ShH84LeN8ulv{U@YjETE=*OsM-^s4L>apN6W=nNYC-ZZ$JdzD5xmQxRZ7=~jB^Au4rizU6L!-B-IH-GjgZ@P`+%g@$t=aH(hsVGOXeHA0=ym>5AB zS#VHQWnMHhA?v6yAEh7gn^;1?X`17uuJ??tP6BP#EHyb9*D&7rDcI+|x;~ev{e3oP zmd=OA(NYoTj>*QT6^Lb;f@-D&*K*kQRZHqYvu~%pv#0@2xhX6k+lncnVv_b_l#XKx zso+;(8Vy#AX{}e&OaMSp2r(s^KXZ&;a?^$73va%tII{1N=?5RU@5B3#9^GnyXJy9| zi2{gi9t;M>$&)7!+@{})fw?kE} z)ZCF3by7UgnJ|0CWZ^gA5e(uC7}TlGs_ivtr7}P+6PD|EvSApIiYl@uxM(Zm~bA9PMZw1FH3hZvz^bz25oNsevQQibFJBoV3vX#f{HZ! z3;&BhBc@kUxH2&gPJ%_Wr3W>CkoGl{Nai?^mc{8Tf@g8O%f~kXV8b*~jIVAQu0>K5 zPHh|{{LqF$Y)f?ZVgz6%XOqlze%Ugr3z%QH;h16m_lSs;$s4UrV%=LKQl#p zu8o^NuS-sy6yFbER!M=)*vcZjxIqic;7W{H;*gNbM&-F6cGp_q<$=J z0a@G}WXZJg1V+Wytgr*2wZUY?0*o;0=t>ge_}g&}Mg^2sYePC36g_jPW))btBrdh{ zmR|3*IZM>9c;(eYW;|5~<1^sI?^P6*K5_i5NgK37Z9tTvd*>N z@k7d}DAY+rOgKO2ouzf7XXq{8c@uR8XKBZ_M<2Z9!+#s%{ufuO`hT(jKnLXm?|tv* zAH4UjJFdBSZ1~z2Z=%`hLsSISXr#!}xuA|qvM^aDxa_I&yV=aEzpo6{c(lvqfDr;z zy*7WBZJufxRofU(|JRf(OlhGC@7$$)nvUE=qYL12@neer5PANwuoTa}@@ z$D-himLrz6AjzGq4xPNmspudHs1&TfSs@W-1l|sZeprnF)t;byt>2t3A(@@9cINBO zh%_`ahzr1ZFi>BhBdz#|>EJ>qmLEdZxaeb2j@J{hyskkL(Mhjqysol5%|R4xwt27{ z(sS7(bq&?klu+cT1YHkE!no4W_eAoJ|6Dx)H|`P0g0YKch8epnVXd{>-PmMF%ecCp1zr)Z(`= zhj{{@d`&F{)Kqv#_CZE5Q9aR(pA{@K9x>7$(BjMydd-VBmDfLIJssS)9 zx9{DylDPk`8UV!g$}c*6_idm3z`@;*9{YjsdUkQyc~maWonna^c4*J|VlOy3L%KlR zA~Aa300L}4^MzY~txK_}>FS;@UZ5?E`eia0!%7W zQZ+Amy(YlTR3_Q;9M=KmrRFysE8L&YS5rH*a89--7^`u-K40Kcs!B5wwXDmLnrKAA z8jWGZV7?e4mpWNWhbLPo7r^|OVqeRDQ3D=*jMBd*K!Vl)c5esPRZ_K5$~B36)A7$4 zvAnx3)OUFrS3UHagr>Ni>r>UbaW=+mkwEoDKMc5mAI9WHUhZ(hgdfKo1Y3KtCetKT zTG=n!y=4!2ga+m>pObxCHzsaeQ`1aQ1wJ5534gYG>Ht}K&TdZnq@>DDs+d%RtBnNm zp6a%Pz?!NQ4R@9u36-12vS_X!F)|DS;B|EmE27>wbqci(;6J$HQe zBNOd2vp@Vj&!lqUXc3IUKfQloUR{_J%J94&2{fHPsXGuJCTBWu``X095GH9wy zfn*Dl6vEPQ03#hgr=`$LZFoMGl_Zrxi`hp*)3NCS_u45>ko|o7wUB?dd(#Sf)w!*X zw>LXvo6)T~-n0Bzp9dZN^(;;@?724~@fXHS8LNzumH-B5gj6KpB_WHtHd--yE?2Eu zR&h(n!b!x^%tTctirI7XAir4#4o{12bmOq? zHLRmya1L|yzY6@)?=dPQ1QkdzmO8>3`y&66KDrU*5I+ZmV&=kO>{E0;7tNfPdK2vp zXAgHLBu_yymFb!Y;|3>2jBNxjahxoRp10Nd_9raRIduX!aT|mEHLQ7qJGM_5IBCuZ zSu>Cb*-yd~WJiQ!nPw@9yrW2W#LVIzEnJ#cMgj1dNWsd!7^BRJfUZ2~i~}o0}7c zIu)#ccG*Y}yi=c3*H?2>O;VWA|=vkFTlCV5wKZpzCed zdMe624SNP9Ykg0%HCuVE{+5HnOk3nDa^?+8oQ7>3<{$!2lNlbxC;d%LJzC$ze)keI zzJtc5nuiqd)R`k~Vvx$&Kg0d5Ahs%ynHJADULq3|wzrj*RQ9{g8=p%x)mAGa?L!Lm zb5AJ`E-?qZMljdmYr8`^48DX^1ky{%?Tb^H(3rDEk>S+W3(76{y;`~TH^r}6RY8QOf z&Yh#phOiFj4Q{p^*gW|PJWjz$W%HWKuNI{{^{#;jj+X_|@M<)_5j zLfV9!IN@1UDNxmsO^!wgvl7*K<8_HzIc0v@M~1rU3p-DY5lq zrss27=v9SojWyZOa&65@ZEZHjwl-=(MGY(fR)A!eKUdY2{+u`tMRlWs$-EEp9iUBz z)rTnBJVu#DivNHhWxY(+a5`?H-Eh7b)@U=W_&W0X%*3%TlXUg7*Je~>?6HxxXl&E` zCeodaS0V#szuPN98eyM%QWS1rBR}eLG}PPoQdMWNd1OJe z->7dxt`YIXA(Q0eckBqKvQ(mB-BGZhZ4NnGszp1N(=62j$p-C!Rot`dP?9;Zor<|D ze^1KD&^A!UI{z8Z7^?8Wt2OOkgKvs11#d=j_e1UK(MEPy%yMNErI?1zFZzIyfR+Ji zx;4Ep1ct1C$#^D=C6zjL6unn<4Y$qL0^49E*$af1TpG>5pgEDc=VqiUZG-s@dHMxO z(u5Fur`})FPe0s9USz^i<$_9^@VR1Aki*)VBWWFFcfzw+|1ZrWfooFjg3w?!C8W>d zYYm(xU`2tgP^5glV^Wsb_N8->Ox6p4S`uNG@4FmYxOUcPTovfJuvKda#$rI-_K;@J z9HwVox2F8|S6o9!4m>{d&;$2;_;dH%b$d}1gB8jmUz(b^C|P!)K1gVnLxkc9iy`o!1d#$uL)OnNd|f+k{e8OZ+6~(v+=ox2!kL z@)dK{$#=ekui-HDd_(7HSM8bXA7G1_({AD_U-tkE8STthT>ks8#&5tFyJw2-s`%fK zx4bT6mu&-VZ0lpHIS9`-yBn_Y8$q9{#Hc<^amq03fSY;PGmR~4`cx&brf$Pu4*T&k zB`0n%;>a2&%ty))*qb=-gY~N)!H?|&VQw5E#tAARtFKm3E={U0Zf969hrGX8ztGyt))JP^YN z?z``{d+)mS@5Woxvp@ACFQrcZcuB)qYPYyFa4tlok}72qmD$fZ4in5SJ?fA>3+E0J z%5yBrz*_EAqr5@bvBa+Nh)-LX^dA~`6C#g7^=tfG3w1qb2 zi?J@UBJW@Gc-n6%qo_NY)a1U8)>nSNeXftRFl`EN^t8@72%nUA_1V@il1SQ;tNNC* znb!2Ds*AeJ{G^f-=ZGqBCuTQ|0r696Vc^d+Zz zl~KS5C4W^* zSc!u(zlTj$L7-_DeHzXmq91(I&E?gXj?<3EAKZWMUAMpI$dM!4^Y;CN0)Wu!V2jwl zfB%6${vW^nM-Scm*#}K|ch^WObBYT!DcpGnj59YCM&3dhlnE>!C^nsm?ycCTgj=u`Q zgS{Cbz)eG9TTGG|IpPNCr;Z?cRVdW{b%3Z|4!YmwYtmEC)`U7DDfEsku26)rP7TIO91k*-WH#E(9>2r={AB zYxATu7$-JkdVecPIOc#LF0Om7_PwTU-pr+I()GImKkKuqne#HOts8p_BVL}tdHRyH z5Bx;{wdUPN-z51`ne{V2m+bSr|H=5FAFe;)I;r@|=_>8GGPP3`h~(qee0a5_ zeP8N&C*kQ@P3@rmxt_4qKO6UC?bYN#Y5OXNFx33kY9HM#UP^5!$GY5+5=dbPj#H+y z4#H9Eg_`ue($7@)reru?9#}}n(xvN(S^Qs_35bn$| z%k?GSV@=G>JO0{o3CzIt$zpsfQh2gkP#~(o$0u9~P@1$=-kVF>Dd_Pgz;q0&V+_WL z=fn2|<;7iqC*mYCEkx6ix6#^GPY*mpuUm6=E&m3sCASy8CRGNzTpLr+Y8o7#UURfF z`@r)3#ZeJ9wV<4hM@7&Q0A?By8;Uv#oIk(aDQJG?C_VMkHvRZpo=@}B2Wab-hwl0O zt+#$4_}hIoUjJWnAAme6pe)OUqA1=qD2tIF`d8=v@=yK9i_YKuUp`nKpBpbaqw8Z{ zZzRnS`L33Dr4{e&$cb?EvzK~=C?I~dY-hz^^39mmPxpw7PjIGsjcO3Wgh!b=QM^&B zy{b45HiHoKHzf>B1hT5i_bOZ?DE{^)4N?_E)JTuD4ADP-IjMlJG0C9X9wX}ZY>w5| zRD6yqyF8Cc20(jOg=uDUSa+QtbN?HnBAWY``)8Qc1Zg<-IUPNd7{j+%bSS%DKTGfY z7^qD#typIJB9~nBlk~5)CyAdxEwhug#f5ntuR2@q#9*u&}Ebi&l#Xd5ynUuQp|y1zBidz>=gOHrK6@#-V)BC5ip!;<6y7m< zb7ICb*_R66Su9L@yi_}FZ~8Tn?``K36b^|L2*(oz^yvXWA*sM?m^=#lu>XQ-C#&?6 z$FJQb>Mx$A)twXcZ+`T(<@(9F;=a4?{nFdt_Q$_|#~pXvC1B&LY4q1e1Av2pR_p9L z-}ctOec+zY-+966x$-A}@P*Xs9VRO0G#N&ip^##>UAOEr)hQrb{3QMWwivy-(HMI| z+;X)s9+nXpgN6-EHk8(N*dfIy1_7FOmn}M|E1M*6kEE-r1$Y3X%Z^BeLYdjr<&7Nc;IV&Y$S><3u4+9LAwcqHm0ua zO^TdUvom_|n6z z@4Bg+JH0oCHLwCoFk=?W8ygjnEV!#8s~F%aufVGyA*T|qX9G%bkd3W&iTa_)e)UO0 zWJ+Bv3o6Q1jQKTFtQX0e7G^3jBzEZ}wJ#GA_zK`}qFPGY>`}2-O^KwG0R?zoXr6WM zK;|4bbQuLDQAol~JdyK+$=<_&r=B<<$%<(=^R|M$JEtqTj&08#3uSTtMYF`?l`!Fk_x6KKUs%e5kVR+v-@{OYOSvLLnjN0Vx? z_r-(VAGz62=~Mh7=fEl*9b)?GsJX6-bX}$(#o7(6M^hh)ni9WB%Nyj8I-tq|2SUv4 zq!mR|24VRQpsAGgGSV5+{OR5FrdM5Ee&@@dS{~Z7{?f-QmL3qSjD=iF5SVs6Tf-7*tiCol1_pD6t{x8BD%eE4HZY zc~up9zG@-qXp2n(&78sFFojT;SOyh{m4At224)`zaVe0~JigX1X@B;+f*{PTW|o%l znN~@y;Pj*#SoZ|%H8iuK75X+ccFXs`Od?}xSW8|Cb?;aSHb-}uHwwVTBVBhr@e%Uo zVWZA>+V*NsQ^4aHeZ5b^l0>FrZ#B7%)#`Z15`Fhtk$j69jjTO{zq{pX#8piI2scyZ zyyPL!{qOXA9vOJyKvlKS%((G|f5tGNk8mUjtZL>^RpVWzN0znX06JSReYJ=nbQCnwE@|e}UV6bZ*3*x@`B~-c z)ZW%t9=Pw*|Lr$^<#(nR7IsNHpX@aLJ!$~tfUV-T+itz{fiHdGqbCnMI{R;b`1!>R zPZ=p^rVi3bm%SfjaTiqyg*&0r#6l^ljg2S>K1bK}+5kSFcF|BhSzxIO-oS&RQV=6? znt`VRs@8FF6KOAqgI{adG>KY_-<4{b>pf7D_A8p_`*RO;3;%N-@J@=xhC_bupd`g| z3ggd?sAz98i&^pxOIOUl8Da4D+SD;8JrYUW%~x!PC+se<5j=U7*SQTDH3wJ|>eVmT zN&n)#%G|l{b<9s5rjlzt;ggcdm~2@GMvRwIWx^v_7Aze36VbWUeEupO#buPQ)fB*{ zd!cG_NkOv9caT0(pXGf=3}kSdHOG041FWn#d1z|jOSKL)qf?WA!uLTwC4J&BD|-zy zf38NV5->D5>cAy~n!KFBq=FC#`Qf`%9MtO&+ieuX^{;8|=l&65?FKM+5iDt+B{W%+ z67hY}-@>K3<~NAo;tM%NzrQ3{vX&t>nSN|OYUa%)C$fXv%k2r5IA>+&{}fJf{RQNf zP-P&mp0KB*;?}Bo8gOJSO`bv4uX|g&&4ON;XO7KMDIh@)%xr!PJ&28YDo_t#NEChC zBQBI`g$Z3iYI;pbKqFnEg|mn0sTULd?2o><9HXh$z8zck-gVdQ@10&)*b(CWzt*b% zuR8$1jw#D>`Y+z~zyH@~Klyj>8J^ug_w)bi)x||?XKC*232L=vf@3cIF#34~GTFq* zBdY^p#40(P5=%YT+}c>6lb%gLxn#A0A4 z{h8|!a63ULLi;7l8p^yTLb3o6^byg*;W=^h)h&$_$Ov`Je#`%6qu|x*o^t1J!c+s3 zXmfh7h(IYj_%)mt|dsMTqp#Tt2xaIjXfZDvq(=}c1f8wqN$l))#=2e1r zl^Jsnea1j_xkRLuqT-7J2pE52Q}hF8D(3Vz?suJyIko*~&d*N5mC85SCXl}ZOdyOz zwxmOyfeZ4kJrUe8)9n*!VLh0n zWkED0njZ*(DIbZWuOI=paZ9<1u~Q8SEzso@FB?*)-J<^7DLQ9jivF*E^=dkQZCPx8 z?BRVMyXC{b_t)=!*DYVoocu!rfH;_~R;%2%@7Rt%{O`Z>Tc7&K-~8pe?#Z*i@RP4B zC)-EL{`@IwwOce06c68kc({ZM!-%A0VW7Ng_8$2pe~ma9dNn&6R52FYn)rc>2@phB zmY=K!hqYz$1;7Xsvi74%hKSQ+8IG0qP_E-ugxGs)uai1mY_29g(nrVwmx_83eREnd z5jYVZBp}Br1Q@C33@dMY13<~IQi0M*nMod{)czaIM9%Ml{SdsJj~@zYFsv6oC7?3) z5swPbs*fZ|Hd~VR(~{7rDFovL)v}xR`VDLEKvv^)OiCv;;V_V8;VUzaCf>o=b0dLi`Q#lCk?9lv7@s2M`` zW9TR98^lYU7LCZ(8~p5FC`zyI6+ z?e05n`ONiKjuk)muU=NR`vGvLzPvms_>vPPV~;$ymid6#t{x0h00>C_J^NeLujxe(KaL{!sge) z64@fh+7hQrRcj}&_0oRM0BX2L9Z^`~w}jCr0#U~Jl6osv29y~O&kHAKNu?n7z-10F zvGlo)?bwxBk&lX26{=iS`c#>p0)|?~ZXnp+{RFnEdzG2Gv}qOQx)fmJwNwvQQzte^ zMNJLz{r5l}gxaqSgwgqaWDG*Ci|M|7@+aTXL<=Fy$^Fj+1#4F9Z>u`TCNv08OKNf0 z`tWT)BCDiHZVa*n=n5pP{sZVt;1seaAZ!RrVt$%BKl?qEF3p;C=zeQr{^@t?TQb}Z z*CbM|vQJ@=E@dwy=!{(17-)Y|__>@!?2|&}CRW?m>8M!SlZ~vv4Ig7_d5|XOzXoij zeZ}YKLr_L$j|=1MMZPjigW0|G<8OIZ`Qm3@K!^8knY;b7pM2}v-u5T&Y_(cv1K*^t z^YL{D09r3#I4q{8r+0kut~=lN_~yI!z4TcdTR-sw&nbs9dx*-JnAaX#g3E>41}rrQ)x7vvacJ%QW1YEuqu@44lc4}G{OinG7^tG}8TdHK2=UzaF=x&!K^q9{JHYI1Z# zt7!e=8(#6!OQ+Aw(L3M&5RI&V3Q=pE0!`3KvA~JQ=o7yyX>%f^*q3Tsxxai?)&^c1ZA+YRgx4*Q zE<9|(VG(xbL&s2D$B8*L#6i2*00J=X`UwBK>BzK)7!xogCB7IlJQ)N*)V^^(#6%O( zIG9xcY*K(F(VD4xwyNT+*oXD42HcWoMGz|a2QW_Y(m==*M%d!fXZ&V~w<=noIH$Q9 zJs$+S9GVU`?*IT>bdFczXpyCw2oi5fQ{gWuoa5hz@vS;pCK7$xWE(5x9qBbGxie70 zCM_u?3!z2U8H-P>x`2mzbPYn9@&;B?-48xT3BPwqr%W9PW`-!+gt4^#u^Li6;~_ok z>qV5pev*l6%*>Lj`4j4yIrmjY*UtiZQkqVH{J`=E1XL;UE)g3{Vi6qxa)&jMJSGC$ zFcqCvpXN^Opzry%Yv}vmcoUsDxu^Wf!}s6ym+yYZf7!Zq>!VWSry*bAHz@#M02(K4 z`p@6?*0(PXhQse}xBuh!f9DG?>-C4_Uw?EzO5$ATKd+u}xhKbE+FtKM%?!Y)~pWZ7ggH>OC|c%sT$s z(hs-`Xhzj?y5VE$RpuDVHswLUJ1niENgxn;Kdjj*@w=oY)=oS_TAxr7c=}^FY6vJ= z89|FXle8@)29foo^w#FLiHLKet!kgJUi~_>F||(TV3~P66KwPqvGxiMVn0mvYRu1* zW&>k*oz9>KT6H-&JUDT{$N+!2% zavfE1i%bPD(Ov*#>N`~)aQzeT!2J)Bf1l=0@1i%n@(TK~H$T6eJH4y?$^&1#kU-?!VkacC6{&E?ebk8++2*V zy@H1AF=0%`h$9Qr)#RCtpXj;e0i_a6Pjp4P@W7}ck3o}!V*sIXhMYFa!fRunV##jC!*L%} z2odJa`fUKz0B1Vhp7~3EByuL@IMoLG*Vk(B0MJlR1;T+mo2v*5Xx1@tV!ib$A>=B( zfq}ZiO47QybTQqU>D2YfYXHsNSfq5XLB!kuAc=ITbTA_!oRG-%0V54Cq+8H(5G3!f z9FFMu7iAzHR9P837^*YFVEyxw_5y`}rcidx00c5{X%>N$*0E96Kl>-9^c<0;R`t}e4@P@MZkKg}>7hM*tdGGnqSBlQ6 zE2&kCQ$J1yR9x*;D$%T6l?*tzLeyFCn#Z|Zf-*@J(t||+*rH9rG1QE~o0z3^Fq*K@ zTCmeQ`ybw)0s%<`!^s9T5lG^3?CKL#90h&cvPd71`Lxp_C()J;Uxu(4y-ifYRXl-B zwR`#4)^nB$m{Jup7>r4{Ow+(bIOK;zuq3HW@VAfxQLLB=Qh{fd=0KIGUZX#wfkOp1 zuFd|dmx$9!c#z;A1qowT#$V7NIQ%Bd%79~@3x7auBpMx+m5yuwyhkdgc(LU+fAZimOf&umw^Gw6WnxzJnPd$B2C_`=Mgk(RyA${LFjP&y}cCAh_e(!N3M|Glqy z3jO%^J-1w#-bIf*aQ7YWc*k3R^X}Vk|H9w5_diU<WF~NE=Oug%l>|9QlSbH;5H0mLUg$K!Zux6J&V^@G{0xA-ai%NSc)7Ma?rMA}@p$ z%;Mnz@vJ*|ZA4;@P(h5TwS>ntHWB77541QDluz@le?inebJe-n zR@RDuV6L2&I*~d7NaXcZe-*jZg^J~?QQ-yNA3VyTvGAiQZAfug@kIThBuk;npJoR0 zj8VZ+st)1^UI*NrY|*^_b=OtLwbD>LLP~Lmr0PyU0uc0Jqll!6YXl*$&`Qa~R7467 z1RNdoXYwO8BQO1`+IOZ~93yKgi91pt^`MwUl$9@nJMx3c_MjM6I?fYoyW)HM6CN+LJvS zgPb8QF^T?5oyyo>o7lG@#|SDHDK6!@Hq;Of^Xh97m}9_7`oiPilo2m!qM3c9N2(zf zsVpTj2m@jUriE>E%+j0^24G-6l>ew5)qy6djHb?q$QV{T>e<-B8A$=A+3a&)1_isG zit65x7&rjxWV{?8iTebUQf1O~92^ix#~wu9RfE&>e%9?>{)kSDNxnO|63EdZ02K%v zl~xlUG+$hgJT(cSc8Ho6eE&UQ%fXJlFQp|l3`o)gtF}U)Et%zHb8BFLz$GL|GnG%zmWhy0s{W>9e?(YqEi&#MddGi_qV<1vWdx2 z`s2U+A}tQjqwd%S>h~<`5t2*Xqv+;Y=I^(lS#Dw3i~q&C{POV%S8 zif7ynHrdJ{8(9ckYGxHLY>^B&^wYwD_*z%lO|u+Aw8oq}J6U zpm(Q?4X%jL_As#}X7AygeDe#=JHQ&CJ2c()CG`bhM}0Zj{D zG3O=)T97!ssUWI`%mGcMRwJ=dL7gc8TqC6=!cZ*XkAqBzudV=(Y!2N-StJC;!KtJ* z!o?4utS9gSmBJHAAQwh;?3>LmZU_55C4LfBQ(ppJo%qR3FilNT@9ybI`R=BZp~_cz!+6xF_sP`F08%Am}S2R5RHz?8lli&^>zKg zVQ=Db=F(AVjet^#tIS}G-7gZ;V{EGnzOq<<&kHzoC5&3TO*B}TqSnGe`j_ATOnTF6 zo=P((cb1zUxCfH|KZwo$8w~)Ynt->x^&P>K_lAOg>DylT!b>M6UQ+(Ax8G4rogL8F zs&lB<>qo*7)R-~B5A1SM|2iDl^ttZH7LH{?gAL2a%;!hy2;!fYZg4ME$8!k1(LI?? zwA$mdq$KK00*Ouwj>Lz?j_{^2MxvnBNsP+;J>v$^$)p|D3S$F^)R(QxiWwqbxS8Wo zdYwfns5b@FbIOQi+e=*lrXxOQJ#SiV9~d*F^mGIrK}rEkK7YBI7@(5Zk%gnOoe;^Q zm>?-5Px>s+0+AFS3(I#d?TL2Zq($|PeKkZqjXsfiRS#rgo<0s+{>sQ;VubK|ifWRQ zYVu?InZQLEP~)g&t%xk7Kp+|CqQ>(d4AA!%iJc6r`f;&)P5O&|2IwF1Mu;Ck%;A9q zOja&0WwcqK1g|kEBovEHVfc9;$LGSa*3YwUasW-7%U$K&sCZ!_&Y5ZWU{cgM(aMQA z9m0MvDRwEq*aTYgvy7JkyOFzsziIA%XGqukgHH_TkLFl_`2?U?$|s9f#hN56)!mUh5TB~Po|3E$H59V-RmjC`7Ak2N64OO!(D0N_EunRmYJt?z6TwO(JAzwok~UU=Dt zfB$Xt`+xRXI&ge}#@1X&i@lJ@Lzs3ZIl!UEJDSL^{9mWG)4@;D4Ac=|mk_84`6oal zP5B7IU>^VQQU}-K*!CjvBn1P66k{+s5GGu26h_o@x*@^rEqX#XS8S4O?}`mpHb>-d zW~Z$4EUz6aRSn7)CEh|*(I=+@1bxAXd37r@dq*&xH#Hih#7KM$gbXi3CT!v?y>Uu% zOkOpq1nWUpk%CN_i;!2>DzO@2@vlrCoP4NhUNcdzvI9{Bv09>XsXj)>+YquWLvYh* zJ_$*qQX9EE2p~+x1W?SYP^(1R##r}9L#QIoK>eN6fRMioVjaQ~kiw5+hd6DsCjky9 zdY=ppsZ%GuR6`WAgGSntYrrb4w)x1`anpg6zS0r}n`pD*hbB7YUh8Hl9nWR$0r?HK zES(ez^)N~mpD&qs!_!FK zW`aiQm0@^w1?;UP$R1P~Cw!0Mm)iJ$(Fm%i$?|Ng3LpL_YK#Z@DJ@U~m& z;cW{vx%P7E4}%7vrQt-Ts?x`3>?%(vPgat*PZOnBI9bB%grp=6JDvdOo0^XNij+X; zIS_eO!8@tRX#>Do6DdxfZwyj0pC!6|Cq>G$p;(WSgEN8P5@<-$WJ@bJ3`sdDx@kll zMFz1K=daW~f_oiv){9*)J_~5vG32JmkfqHPXh2G6@MiqiA_iFUH>N3ioY;J~Hk=uT z&$;l#L>jNYx4wO~gJ>ESsk0J+TN34lKDbzMU$Z3ji^VhnKGv2fXl|vtlw`HZW*|l0fg;ooG#W^H*akQVGx!z%6+|HLNmp z!bQvypK;{ z`9w5(p$Tdf&-Y^U{!s0p&?*#LGB5oh`{=k*y~(2rp}RrVZz4$2NB-5Ey|HdA z(nPKeVSb%H&7RsvPrZafVV`o-g)KUEaNF$TTQ`64uip8N-@4z@0nSH9+lUi#`czNNkTvWY)>$6e(YzI3=4Uws)-JA?@`A&Qzlt@(}OHX;8q zs!GAGrMOk!6WO5Op-Kg{j+qqoh01q~jh5tOc1*=k=*!Yt^=kkig&O`GM`o^^vMD;FCf*!0W zselhggVS6y05Hbnz1tHZBD)^>zfsr0uJQ2_Vmrq?$=wK1)PzM@ym)>4Oj35i$cSiL6U~^27O4y+4=^&?3G)W)yBGnL>C%(Kh0oGNf zjlTN5WWEb7d5#V?{4Chl!0wkzV(2L|hiFaA+U>PpbwWVhXKt_M5V0(YO(o0)JmLAG zya>MrU#7YPX2ZJGnF|LA&{z>Dkg?ZuX3}7QYo<=W*L+k|q^E%vhy3@-Lgg9aFz4H= zV^*1MzM|6qZ0ztI!b$>OeZ0SW224g}oPHO1qQW5}#iY&Ar^I%nYfJ%>Nq}0Py^V638Wu zt{vU<%Rl!U|Mx3i^TvNZx$&CG4}9{`^1UD3Qq0o^8l60cqFaE(UzwDaZ&D{IW)ooE z<*B@4av6=f z_m29}p(d9z)6~2w2?;YuY>OD%Oi_hP z5Mo*ji(>|36Cjnfts3@TF3CLeD>0^MGcPI2e_(Ofq5+GS27us7OJ_j960oqe9~o$+ z9ZiI~PFgole?9`C9%KN(NrT!=fX{(3N|83z&qQsoHPW)YKF&p~>jB}wC*A=Ac6$@f zgW{bJ)w|x|XiC)#KsAih{3+D`qX|5q2{siTA6J4w^O?}~=fWeKd|>L@jAxj)yO+{c zim1O+ZTi_7){dYpX=H@Lgm^AE8%Fq(jZHnZs`kw%1{1RmqQl%mOP*SSfEciBg*_sw z{Yc9sCy4=Z(Tui2THliTz0=fMI6&X^>Z{9;+IOOTCYJR5=!gF1zrExC{MkE*C>Hh! zJdM7=j&D=|5RW)$tyZ~q&6+EJ?iYXgm!JQ_SN-4xm)|gP-y?AQ4`-_-Bkn4rPJb15RpZa%u z;93I!5W?p0MTncnoHRP;%i!d|z9O}&1a7`U<_8n5U~UBf;8o;H0|3vEc{n)4P4(SS zxfn>t-qLeb6A3cSkr+oSIt|;cG_S3%ITlaqaV;}mx zKY!~Vzdbm&4+ev8Nap_y4*=pJqkaBmmu>oI-}Sw3dFFFo^gTB|=cUg+F}u3;C-1tg zy!+u3#rUdAVDFwQCHg7>^l!W;u zVyoA_=q<-X;?E#!VW=7d$4p)8WtV7w(NOUn)V`ZUE6hKKYi_^kS&pIP z=SUQSmXLJ@DqTO#bns);DG4QJ7Tw@KL7RJpVc>owc_=Nz5 zj~Obd-72V4EYR%KE_%jQYv?C_@WtiRt{5#2?Ada5^Mm(&`b&4+{@%a->vw;wD2gd5 z>H7`I{J%K>fE==zJ1=M}L%A)KkAcFRKe_yk)+a$Rl}-z2vj=FS{65S| zRlFJ1OjE{R9cR1Ih8FfZLw~#;7yy(5F~MlIPI$^g^)+amPY)o~ZvgH4U3%{$r^>gz=Wg0@Xi!Y74cdUwhy=X@T|DCCa?ul3r z><1OpoifuWGsMfQ?EH0LWUyN&Lni;s=Ih(4TM*Ake#bW}@L6Te4oKCrZndeh6Tg>C z>(t6md<>e7l`M5Pe2;d3e<&?#X3PoKIT=;_N|!2N>0M zSZuT>ysV-giX$iH!uEnWOXbhCv9D^D%&fNDx=!r85HcI40vZ5Ffn0Ej+nPo+xVE}; za6WYIX4!aK+j)Ohqg&F%OqCW^e#mxE^X_nCo+?wE#zQq00)XOYiN44?8;_hzB@)N7 zJ};h8R=O9ZfA9Qez_F-xgne>{K<9=%P;GPdXzrhBAky*Cagm6k0%<mF(M|X<7 zzp0VmP{%hD0LT~jnjiny|K`VD`?@#%{HAMey7bh-s`4-Y?mqg=UHgl2Tg5CI45A9N(#%ybr-!yCsv9x}SJTnoS zXi)7*`&i15HcKsUwwHOW1=1~xbCG26h_=~W(yjqVVEC|`#rJCDquAdxjdPW8KUomq z%^&rRbV-K%_&P0uuR9b#vs9MFsPR~e@!LByPz7B)giC~7|LhPtpjECz|n!d zWSp`?nijPPgFGjLpD))ot=MJJ@u@FG*`N_J=2^d9nh)DsOC;9u@%#D$2sup}tEGzlv|=n~#zeqD87IDHRaiv1rJQ4sB!;cG6GBz(Gbbl;m*`Ti*N&rj2E?hw7;=8g12 z-}Aik^7Goo$)h`m+aKF}_dDP5)?dH-jyt{}Uj9#XVE#dmZ#n=FjxfmWb~|VT*1qKj ze(3ejefA6A{EX+kBv>axw}a zQfEgNwH|f?t5StuCNcZ5RoUO-t00OsOh0#21kcf!a!CdhJh!P{9p>`9^7r5q6P*$v zIhj1O^oErNh-%-$(p;mQ1jLfDW4sk2z5E!&_e#9hiq&g%lySN64b5W4S|Vfqinh{l zHy!`HJBe78ooikrUQ@pmVfRj?^<%Nr`1rg4zMVM$Nb~sv0I;)Kz4ihcC-uEq_9&~` zvsh9P89uq_mxjlxw!@@Sej}Vp>wH_%_xZM^d$A5=Nt=@W=NL5d{wG-$&1n<%XFrZs z$jLM?ngvsV3Eoo$GRdBH`=sJDn0>Ek)l@ikKsS%!m+O$T)Pty%0otYLVRe4$`cm&x zvc&qvdtd*I^3^YX3XK(0#m;RH z?SJV0FTMZvTW@{;ZMS{yE?3a!n}+#+(*l4zRB-j`)mQ)2&;0yP-EiY`zT>IaKl|!a zi>q6I^U(*&&)vDJSSU8o#Kd_q3so$N7n4!gW(ASQ1_moc7@%aJmTTjGc?*Qnslk*0 zq^N{D{k~H5cD`|OaQfNwzNI!Dd$D@WK`NZ8x2t}a59;B{S`vN-q`yoW2LOtu6dy8W zU_>Q*NqM_m2vgIMOJqx#2K=>+8U&X>&YtTNJ~<7LcQQ+!V;RHJ82hH)W$JTvJVEXO zzLxVZgz~G)uc4+R9Um77li2<((!oKsjCNW3ZETvJ?`_ICslc0Ly}0aG!ch1p}&9h{)&-*hp(W*!s_Sjk)mhH%tcs-+t4sx6`NMPP4Y9R@oQyWp%SXD75qOCvO*@*-zaO6`=ObZ`TJWaE zyWptjB`V)mzn<&YSt_-s_oqOZLCx|2z&n6e*HqORvaY}RGxEbrtX{KW@2gY)t3QRB z7;2uZnj(NlPH$_P5VX-!&PMuz1dH+v8{3r}>D+h|ll84;MXFXu<5yjt1`k%iP;KMp z&Uxv)*6q0JT;yvyI`h`iq2SOeCH5LMT+wqE{eYzJ=s?yC11{_+PS|5HX%X+?R(n8; z3ukCBcbu-H2IdW=8tJRwSMh@}& zrvLydQ36+8cilCwebu*r_e);(nxDMlnrB?nYp)2MvkU>0Dg7E_h8h>7^hL5RdZtx8)IWH7O1*h*!d+J7X5<=JP}o<_k({0WcPh z50uN;(}lZKB>?`}a3+If4ZsY!-shFC?XP2`Ha5!xfaM(da=(b|M;*t!KN!Q7Ir)@L#;pjeAlU{RXTJIqKw7TF-w_s>kqlVG4Xj(tB5Y!qKdNr4a?_;_j((%JRZ1eV>^|+Qvm+!v^hWRl0dMeDc zQ8dhJ&1}x|T!_Lp5luX)im<=XN2;`ou>gYA!R{^DnD`N$vL@`+n+o12?E_{}W!|Dyx| zaZmDuhgn(o&))I_uY2zEU-af@KKsS5JNJ^OPV7D2FF*F_E%f;>?JQ2uP14BNdDQNV zP+zOpsk;@V?C+h_ZA@QA%geR$_n-W6LG@2M|9eAoTGC$_^ zlA$j;J1?3bji0A!NRV~G^QPQ_G_Ht{~M(PAdcYuA9)SMRrdjSf|X~ z#>~@&9GK()Ahqk8mdVe(IUn1)D-&iP&$)0+t@?;~eZ~G(G16;*6!23K%l4MTMOvIa zMr%jT(955{sr>d=UPqUo-=f~kv10G8tp~pRnfrwOR5tw4E|0`>Z|yF0-Du z?dfCW76t=(JDe1Tbhs7OUM|P_`-5*lRwXRyLpWu*>b)eI_CEy%kUqR0#B#m?RavUx zti*t)J{PWRY<8`7L(qa|=gU)_)=JP-2PdyBs1iS_5d7s#05+ECIHHZo`x8}a)f`b> zqxpLGMgWle2CRP3 z%U<=&m%a4mZ@l*Un_hqEQ?7f;>NOX2AKZGPyyXjz)BRsLSu6}DX=GweEHD)L5Ku4F zgOt*l%FAlh@yh{#%8`Vh!d7uz7bd+R0hDQpF`SKuenOUo8(>1&={|Cd{O`xzc zlF4uR>_rn%RDiN-(~&7%M&Xt1ST%5g7G{srcCD0;jgGISPG=%6rVuX3s8VvimxHJ}44WS#2iss? zIggR%@=jd!_FG(2wa*2I6@(YVE~<-NLs^UgM`qiWng)^pL+&<0f~^D{k-0@;}OPGyv?H~jn|gKFhq17-cl0-n2y`_sCz$2d%mmP5#4N$)S;g1yg`LKS@(|18wksXG9 zh%gkfWTZ1;JQrzxZki^FDZ1h6HT3#dKE1s8+Vg1D=t6Py;Lf@2TQ}dk`Jo3s{E3f! z8;%dKwvB72`*l=w?E257JgBSBPq4uy#1>;Zrj<3RdfsockHPMv~G zeJI2-CLogW4$N2ba;82B4mj}3txaycZGc?oU`q^{BNI-H;_rBz#9x zP0ym-H4FI4)a+PO-ej;m;mM@48dY#w9|4(av`Kb92)dkSAmrDfjih^3(g!BmETvb~ z?(RvFQZ~^N0qjK$K}b-+_xQwHIWtK2K^>S%9o{@Bv2phdI*+hHXsg>RvhItPfI|ii*3 zfb2ccMSy0V`6OYgn=@DTSv4DxS*NRvO)FBxQ6>N>xy`S}BC}FWillXJwW5|GIQsT` zb1{AIs?j;R{;B7duYTcE>DkwxSB$r3=*+1j!(+z|9DC&92XFbGfB1X9f8@xK$BAfB zRQ>QN`$v2HQvd*Zgh>tQgv+w*UUk(~SHI@<-|@N|ZhZC|FS%mV&Fjy-c(OfyLHqIj z^Yn$gx0m-mw6{2NYCx^dIvO2YOGSHxRgXi?4hTZVHb*`m%fdP-MBZskCK3)SeOqPa zzMeg5u*W5Bgvs+K^L!|@G?6 zjGQ7dg*wxrSnw>7`t3amqGK2}?{iP1svE$CFKaS01^}^=q5=R!>`0CgnaFVMK)?V? z`y%nvkQU~rXt;QiHm)Ul&W)GQE1q{%`P3^{7oFiWO`SN{JALBN@jbhD-geJDcYol$ zfBo(|hzQ>OH4Xj8dHjOi){&*;2S+sN5Kwe=qbFYNFd0+qhC9cmLgG}A$0e~?Q)r#ar z(|kiA{Wu^2IRYV8D*cGqYdks!GXl9H@ezr>HY-^cdIhwVg?{Dz##<6wcw$GbnilHE zF%9pkxgwiaml#T_JaQYI7Qn@@BbkB*^TuM9YHx@;U8d$RO_b!*PIz8$#= zAA84LRr`KF=kA%AjWLdGaD;Usm`KQ!Z*g<@19LVlSeoC^fh0{0VtyY+Yy2F^oCzRj zZ2*cdq3hfxPSrk)_Wkg$-Ikix7{uIQ z_2U7Q;#I;FVY?0yAJUdYf)av{ifF1^73(iRjL>BUVA>LGXIKmT9C?A*jGNWFXak;( zagw&@c3ds7oL=vrQL)QMP9N@N=3@2hz1cuCKmsf^tj?>w<7}ZIIO~$ zbwX?QfCK6LJa|kZPTt84PBYqn_KcZ`l7-W#0z?tl292R`zdPoy^fAv1nIdH-aNf64%$$wy$#OJDiQXT9jfFMs1x zu727pH=J|9`R84D#rd7_jkM=*j~>{vuYB;4{j_t>sp9l(hsxG!>W;3WZg-T5q7xYy zm+KXTD$;4ILcHYVs=nm!=FwZPGEP;Q#-RBBDFD#vRqcWU{qlnJya;wx2eOhlMrT16rSl2!;ik!gs-HhC+~dbln4Ot# zEQHigS<>&EK_&pev_}TWt9}c3CdN^XUb=wmvU-|EK(zrL04Rbt={z-))Bykq7j!mq z)9Tr};%&UB0Fm zY0cA#V|x})9zJ;Z=RkZuiZ29G{>@PPzcBt5Y=uB~X zW=LggRWuW{iVg*UgBwRQWIgK9h5?UUc3_zeFTS7c=jWH^7kV{pZ*npfA zDBs9Rh*VgrQcN#(m~)W}|AE7qHqVF)(>?b7kAO(kl2vfwRrmJY5!MPpO;v~52RHUA zZNeubNb|8Wq8rboXi=&mHOVEFVnF;;=}J{E8mg5)TZE%VEzHWbEz%B^?5)9G)oOGu z_2^Gpjo}qFeRM+eA)x+UKFLaLM!JT%bv9oQ7IYk0rZYQuGB%ksEg(B5W4sh>F1*v4 z*T|%8M8-<^?C>>ly-F55j`%U3A297~Ds&&D(Lvs_?#D&FeBzkHYn_=PzgrfM0Ja2@ z)tE5Qx24QP*zck>5YPl5>*GF1cV;dBamLq?@09VN~(2ohWJM%(3Cr>0^sW4j0lt~mGn3ol%E?nT}Cg%R3)c!nO`d7^w|+i}{t?^JPWsz;0cHWjUL>U1Zl)g6tX z02v0s+~6s1YRtMBF)1^Z7Ciw2`DAp=;cM|%zEUj|2$^93pez9DY|-ags$Zq1?p=6} zC8*&Pq1E^0pZzoPuu0RH8fd@|#wVmuH{X~^B56jkT%)3$NizQV^IWuu$0w5v9bx1? zdHX#Wt}w++P3j44GM^BRGBUIh{|k4qGEuwFMO*k#&t&eHAt4(b^A#DJP~ge*!C9K; z6sV@-QUw6g0yDeVQ0t|N>)hWYlbch`E65W52B%t{Vlc6y78Lop^y+XMpLA#)6pqstQoJ3sORogG}#~YFD|v z<)4E^3ZXz#A&a?eX|;;9Ss1-!UrcF(*?(BDVAXy(=+Uq@Prcr3jN2b=Ez-JGZQ69{ z+Va|~Hqz6tI+w1vXmv3$HlY5(6dgZ&VCv-YBgYOM+W+OZ583Yvk5H5*3; z#TcD9Jx}`&P7fd3ex%rW;0*0MGDjz-21Nt}#Td0(Bh(ogrFN$yj3`K1!mxw+K(;=Z ztEVI&T#m#keWGR#Nl@D;I zj%lzZI*B{vgOB=_IDmnv78J@)=om=)Qq}h$?X5Zziu4yslR=B2na?BzaSTUyX>1V@ zfHJw!%>ad5t=(8VDC&eMk)n5U-c-OAo6Y&;k@vtrPb>PMB{o{uHZ2nhAgb zfPl!j{v861PO~Moqq<$%B>tW{@8W!Es$*d$W%NFf&wM`{nMF;ldGVb&h9@$M#c}%( zk*}HLpZMm)0SxQdI4nOOc|ip9i$+1sFmdk1Y$&TN&O=c5$2P-pU-n0cO3-l>JG#CT znvwVt?vIou_KaRLgi5LhNcN}-8sD#5Sk}JO&)_@(Hf|hq??PeKuR%af{EdNBoNtU( zd{>_agYa*W2E7HM;T(0_eOfo!rb{-Cm76YIO;3HwdGwUaHk9YCA8k#Hl{9aYKtzL6(x9F^<`QZp1J26lD4xTFa9ym$+4^7d* zqi5*E>BZvgd_jxDHVw)VqSgo%tuD3O;a|`kgbmVGl|3dZY|t2jm`KS!3IH+kkR;NI zUkGo~EM`#OI@Kn37OGI^G+48PlovS(O7ob9zmbp&aT1j(6Z+H>BC1)n1ThSOAr3lS zqDT=CT*R_$A-Ie%;!0Cs(h(;^NCLy=iiMb!T$zIiuqf z>syP1HqFep=-BCAdHC2_I(Te~4j-AOQ&Y2a`pg1NotdNA*|)53=ML2}4LUG?c_Caz0QBHD5&H45liCI9}(}!m*z$RhWz>#54e= zXwMfW8bQJ!G9KYwB2;o#A%s9fQU<8f{;D$=Bp3^fQYlx7KL}k4grc8=IJ_y=a;}Ne z8W{tr-WG)-0eu31IBl#XgrR`}8zsVSLc&nEghXr-GE60WhA(vw@)`oqKY4vv3T(w= z$~BFNu|mluCW2!Z!Vm#!&}h6Q;zSA2^v-|MpSbpegPLQq$XUSsNQqb;nGl&$)UpZF zRH0NfBQA{4#sN9wWzL8G-6ECy@9|TZFAvC}DQU~Pay0;C-6Wx(Nm&DEsst8=wScuD z8Vs0V*ke9i8v4lV1356bDxur7K(`9ay0v3;!NxUo(Rpj>f{m+b{km?k zc9LkUJD_s7K+{tvdNWf~gXx*6)BE=A{UY`H(|h;q+0#3$O3A+Wl2)*Ppxb z{0q(-86BriXOyTtLj6ITX6FZVW@a%0fzxLe>Gat?O-(P->6tm2nOUUSxdF}3_i27% zNQ;X@TI~0!-yhH*N_@;fBI$rcfXr+{WSLM&vK%RJ1aDhrfRJv4;Xn&3p>mw<&g-k0 z`dTKg7_8$YCi7J0Tg+?P1~1D_3|qdtpCxv_!#s#tL!i;h;T_I*5>gkWOI3G6y{nn% z++;>&h4Ubfz{Ru#{1m4UcEUWS-mC@iz&8zrnm(MK!u;zXWqFS7bwBva(wb&$gWCvv z7gYN6jL@V$TM&8LLA=sH4jLHSE#S(U;@YUl!b~uxk?|h?nf}O+pI$2huxc6bp@W?qj0qkPZ6qn)UT8{UEtLAO9%a8h)FxM=fC^Ph}MKFw-&i25A$`d95s_$~V8NaaxP3#4gz zC0Unf7=nc=obI*@8XND@=tzr3I|Yr8jnd?Jm)5Qsp|xv9Y2E5BZCEo-YgTt@?PQlG zMqAYB1W$$mE%p{@FzC_T+3CTNLkIWudUJD&i;Ml;ySIP-_>rSunVLR5^`5_Y$6Z8p zDunI@NuM>B-;(sd+T&XQ;Onayh{yQ&_$4>qc;kk-xxw)IXIy*p)1Q9ROWWOUYqUFZ z&gGk~eD3J@_^MXfDT{Wu7+<|=WPE(>Xc zj?%)SqVA10?jQw9-vqQ+`cS^39kmV&fN-cCGHJhC^dZf2jGqo!(5&c_xu82$F3+%2 zfd_)m>U#7K<6yNSB(%xFBEL3_|En_G=0r3BYGTl7M9I^%Gr81iLNXGtU}kt6`Mg0Z zaLA-M3vBFhoFJL%M7w+k&Q&l|(W~U|QqDqgWGhpViq4Zc;js#zR9R4L3DmJ zZDIUxT;`lNpwntmw_8xV(~h8^6HH+3(E6a=>vKMc{^D@v?DYKN!c3or0T2yar;i`s zci_J+sCJ;&mLM>SSTKT_`UJ@ck#zp*ni8c2$U*B~s0llla+ z00OVF+ zfRBMZvn7@B;ETX&VmudibJ#_#D394;jrB9*)3|J87_^B{DVsk^w1C*`*`#1G$ngqE z%nnsQ+s0#OQuVmhL{Pne3sc0HMgRkkb*D**`O2eu6%iX?W*B&303z+H1Ei{johbyl z+r@04(!PuF)~u1i#1q@3Iuc{5T7U-YHvHPBBFtfUQsiS&9WuOA875-C!*$GjO00961NklBzCur{bz3b_qC}BeDToyJ6$D7^`&xTtX2d)0X6A10;U1Y;0JV_i-6AR@JbZU^ zv!9upC9s^9(-%J_p=ZxL^Gx#Id+${?Z{D2D&CMmvW;2%=E?>T!Uc7j5XklStb-i96 z%_@~NR>44HC|z8fZ9e(<jNFad} zQb>{nl0;Rlo~wMRey_jK?-Ke=&C4pLxGc}0qspRuDX4ODNT^Eul|s_VAWyIaRh9lb z!*-~0DoF}ynnRZ7kaYmC$?6@Jjb#C({I~ipPa)6L-yO)498xtpNk#upwJQbnKY$EC zw^8*yRlUws|1um7EL2sf%T(W~cIi>Tra`KQU5!D8{RI9#(fM^V^>Z~Is>k$OHwYlh zI{LX9>kf2uJGmdae$^lKJ5L~!W0GQ@ap)^hso((WPpC}&H}_r7Xq8r*Y9E&6%w>*q zru&zqn3q?bDn3^uq&uR=Ems969X&)UgK8g^rB;bZdP40oQ-5Z6p zRR8U$K4xmYq>$>lq_&A>>9JC6<#|`@)HGR@s9OptRB#-5v2fE&|5NDbcBpls)+@G2 zt^GXJs}^g{RLj->)JN(!?O+;vHEviZ*3WB{>&f#3^0b2eQsb26(8<*LS8GDmP=O>* zprhYsdTjMP*%srR(iriWs>j?{wf32)=siX25C6k$N+Iv4x~b#}?u$gPMcPLxwoxZN zIJP?7C)EnQPIAaIMLB4yWky=ZT(z#7a->OBuis4dQ_Yp$w@53@S`vLwKU6+kySjl? zQexHu?_K-`_n$5*Pmpf#Iz&pO>53XTTv}M0ZU-l|#`Tz}ZI(iscWABJvdkLO`;^uq z(M#PXF&1`hsQpIm)@{K2d9LWE?G@7uG5bzZw3O+D9CKAmh6QL^#bjQsKU|NQURSDp zYHHJpT6Z}>Cxfh_XlKW^BTI0e_4i2UXa;fbCn_(FhoPl%%~G4Vj7+U}Gsd)@>5Rxa zs_Yz+N>2Tvan|+d0rCcb)&}*Bh8H@DV9+Oq7U{mLGa!Skqh3@XN!8r*oX`SRU!-cD z?Q-EW5i??&kT%h5>UE}QEq|c)GmbN_BVd4d@daBPiY!A{I z{$967(-mIVxHoV^5WQ0LMz3+4TSe<|+%+cvd4{8B%R!oq!+>*zdyJl`K4*45dF;&j ztft6}2hx0fhSDRm-|3g87OFgTVykSruf=gx$Df*0RaZrw*L1$BHLd1X(K~E!2Au>? zA6!!SO`2Aa24SzAR_L+QW!V0t$P=jDuK2UX_bH(zivqFpR`Y^+ak~GWPwUrYS>v!F-=dRVOS8b@(YcTuUW5b<~ckXUGz!~k$3qRb+9fRD+4j?1b0+SM z7UI?XQ;X#k=($VG9AW*)fD?v<&-Hp118t;v573}7)MfG-*Eo*aqnr=HAO4oxg%U0< zI2LqVxsvyb6`-+wxc)6Yu;1{|vh0Ry%upprHP}XVtI6dy;zHzq%=$6wMDMX2zZdIH z?<*bxv&IDYpy`e6l@aI+t)gCNdVtThaBRjS*Mf$6ucw%R7S$(HCIJ9)Jvx9>N@JzB zGrgmQt?5v1X%x1GH;gyc<~`C-TR-J9)uJG6g;xS#iAE{l3D=(jKjr#DP?m*TQ!&$Y zJBSF9nRSQfPOAGMz7hHDfOA`^C)7@+Nw!}+_euyeAK50Eu8H|{pdmSCMxsYyR}a7X z+k%0Xkjm!TakKSXI>fY7jA(5R2Mj_nDn3U89{AOCxoY zi5Bo+$i?m_rbBv7Q(?5G6FM&usP340%$(}E;}Zi9RXi`%(++exZB$|~z(YV*6%uG? zozCS;S1ukp{K?zLj~)9Yt-xHTleLi*V~`IZ?__zBB+26ZV&}}6)8}4){lMEl{_&3w z1HgP>WoQgfz1#E5GxN_q^Nd2-Oj3NJ;v1iT{`nXPunZ0?r$6ho3;-;rFGi9KlSp}< zE8$)V`bzD?oTJLx*s_Ta{~Z0yVmwyf!j2zJB|SyY{Y` zoZQlEG#g6NKy;ln%<8~W3~Z7o)p`X6ngg}bk+J5$K%-izptQ=`VHDIWkSXb#8;c4w zSBxTgSMnH+Y%2sq&d0)~7M|3ZYy>2H&T^Af&{`pm1!6gFHm}yAvZjX4dyu9MLORj>{gMm1oe-f?+i?96ybj6jYV6|dVw0;uNSG8`v|Poq4x zLl!Wx0*{?2-9A}2<>huWGii$FdE@-D|2$44n5t)*@#J<9)2S6Xo|4WAGPdu$ zRIs~yg~~KT%X80icUBw|W^(=Vb>A82pn2u*a~Df6K$H}0<(x^Q7rh>pVv$WsGUFL5brr944dam~!g9?P5TWo;=OI*{@=p zH7ybKqmV3QT+w%D?igTH|LYJ~Kx1NP2<>e)x=;m>t&u6u;E!VL_uEcjf$20f|qGh&IZx&~4@VC9#w3S7(P$uVlLd0D(Vubi5lH#AlVx zD@>!DWi4?Fv7WhJd7di3i}#yD>%_ViM}n!yoMU2~WVu1`gC7gJZQ3jLgPAX9W7zNI zqUCRStQdII&EmC>Mm(lW%_@2GqMxb1d5>t*LuFlnz*D9yWjY;WvA8hb>dZ_{&reU! zEVdTgc}C`HxX0KGDbtWhyWMVIzH;&Gp~HuNfAZ9k!?iq_YpGdGm9cL_Nrl0%0~ft5yK zp@oN)I`7moRhIrYvy7c@(x`!UkC{O5-Eyo2;YspXM$&Pm7YPU`Ee&fSknzY>S1q$5 zm{H9T3Pq;RP@)%@L zcVAW`w|`n{Tg3a9(B=v~X*N+iFHN<3vKN7U;+# znayz}W2vzs!Mx(!D$S>Ds1dmIeDHM;Iq!BQ@K_2%3CrB`7!d=@<)&VK!vGrYRLrZH zY@c892NtzIW;}^eH0#A6FR4-y`xn?r;Yb6MfcFQoh0^A|1bWyGxCcAE} zRRL-+k;k-xy)WErW|YAbsvAw}SuEnEp4Tmz(3^1~D;wOO z!US54UsePQSg6&rqBQ7Y9dOHJJ9U3(au`rTQ+1kC-8QUCXETyBYvrv)MsbbMTBUtz zgfG36g8q^H$)}Rs=VJe;KG{9yjI^<|(Rng1}>7 z*AiZ3<1Fe*6wSQ{0GM$XK#}fICTX9fb#`!hDHuh8x&lOdRA1DicB(v;3K=0Oix9F3 zsMc_Qs;!}aR};-|sH=8rPpQ24FRg_PGBWPT1gX*!sIDO@LZHrlm%a<-+K6LQln{U1K=9{fn`*NCQ?JUcZ#l^+;)YR0} zn{U2({PN|?7YPgyvw$}n16c8LT26m9X&C@mPJd2GpI7_#?MtVpr<1wu+mppNrjn_t zH>&k|eJn|m@ia|q)oK-$97(6PdGq#l4?Xh8eOtC{yJ=*2w3(#(O1={Et7Bv1;Ur1Xx%Em|XyvQ~#R- zn3~C9dS)JGrsrXHW*+7i7hrC_1@j9nSeRFTFFI?OQ1uncpNqz)~>tW$m zg9U8XXiVJIn0CxK$-De^Tp0k!ivR#$^x*GHcm-Q_MfaDV`E@dzNuo_)o?SqKAtBeN zgpdkk-8@dh2)$sU!0)Kfdd(SCsGJLVryl283Ou@1EG!Bi7TjkP+>k?6IvrYCy6?CL z(fWo3x=hWJ0TRfxooaTjOYl<`zypAfWOD7?JJzA1U+$OYZv(*awHGo2W)&ViM{{mF zW;{o7UT~bbWH!-eSScl8z|M=_d14&R6(KErWT?gEyY(dXN{~y}L26>Hl+#i!`g%Z6 zfbKNY9_7xX(1wCvL5(Q-BiFY(lD7WhGhX*}$6ODil}6^H$ z<8=jPrmwDYX`v1Qai2aLIGN}W{gNjd({STILLgTB4#8$R8})s6&d=j$pNHr&mnG?( zJJtj_5pok63kM?etR9{7lCBq6Xp8;l`1>wA_PB*D&6Z~?`=~HJ34$O*3Y98dpHp`! zHA|L2wNimZqXLa)4H}IaH0yO38f-#ipavsDO&A{?hUNgk zp!#1EU~mwiUI%E@0qP1|Ai#y$j&@u9ubp+;?M`d4m9^W-c|lwICBiEen#amJ3!R1Y z7cZVUfARd8yuGlP>w_doT66P@Cr+L?_S;u~^XlubANZtJgZa63k|*tUrpj$qDpMo1 z+C_k!3-$U)4)7i*9|Nzy{;dwc^TKP*a#~J*x@j2zSWbVkYx3D=pA~oapV80$m;dFF z+AFWTGNkvSy7jPHqR zhJdwbib+AnPaol`ZTc{_&(vYB(Q^`rvoxS;3lFPde9>VPGb5zV*DiNh9I!Ukt|r;s zcy!9Qd8|`I`AzW)ZmVU=kzHnC1GU7Ax@f+hwanU~Ac7V~i$+d}kcFnfRD3bv^mtdB z&SuiCYJS0(ccOzv2>@v394E!mf}^I~3aLE8sC^KkiJl(EpwpH?W6x|HGWz66fHcOM zAK{hB{svf!!KG%_iURM^5)i{$R_A_lU`+@u9BR|uvDadx6eg4~L!HoTgiIauU1!~4 z%OtX20+QWL^~SjsB_&ki(9zvcva3d>+hKFDPm1YJ>3+DpE5HpkL#6-#WMuWMXy<<9 z1HipH?r4V1`V^)VeAgBQA8!oh43pC|YpH>Ani80XQ>gJqWTL4E)h-nN=zG3uByP^) zoncX*zT?k~xNQ$R4kN#nTJz5fSO00W#dOcvTpMwPVw7WXzt|bWeP-_uSl}ft=Mt4PBz*8Snpr$7lHjRu(L7(1S6cfqd_HGXN28Y zyUjwM5IE^W@;RtYe9(CvI&f4IV(A{y7bCTEOES_DOIMscN+i(fwM6TIEFD-ait}SV zeCTzE#K~C1=r4^475;XGe%p7ZeK=p1-spPem|b3FY?YAie)Fw_7649?*?6EM4WnpXgac~6Kn zgzxMK@H%lS<1s7j9Y^f<=EVX}xbE2zr=?>2tv#v=qQ1d!ot7Bj)e7|z6lVa;%o(jK zJ~!B+Ls{(4%DGu%b`(Epi$3Z zU?7K~!3qoy)?sL%2F+#zMu(a(Ix+-fBO}VWAB+q)V0Z)p0}T|U=*3>Ib= z^ZD7<;_UoFtKDwpc}G){q|@%SuUxr!;mpYsA5TqPI+H`zQV>E4S?BVlOLLzbI`r`m z{_T5j96x^ioUjg9T(@rB^k4kNbFC+ySdmFT0?$47obpY;!@CR&ET=z-v*&~u6=|w& z-=}%4T2JcDf$Hdr@#e_TXrop~C?u1wD+GgqgzHh+3n3I21iu-Jx$#SSdA+FG#hbd;kScH>otB&|ZCOa`<@ zSNQ@&)LTCz{{bk#;6*t7js!pUEnvLG69Ayi`iR-qPN0;3VLE)3ZJcB*jrm^CRTB%j ze88*!A(P}Y8%C%QS~J5e(#1k#tl7i7^7NYuA&^=jcr(l38P5cUnIVx*0|4x}h>ZF5 zMOq{5X)oBU5huo8T=+#TFkLe2@Ox&xh@mka&W$l6qYK2Kk&tUSHY+ouR3+}rlJHKp z$LPV|>S=9~LIW{Q1^$k_%zKvYjU(11&5R(1q(Cwf}-SGy^6_0zoeP3%9lvr2uCZB0Du**eMOeF?4Xvj0AvIY&umPy`93!h=533KnWbzu1AIT|d+( zZn*mcDSj}-RNaVOGRbd^Y2WJBLV z&cKPLk_kKduCT(oJ(?&l3AN6MX>D;~fsjK&25hWA$X@5=^0Gi4($|E>k%%N&fzjO^ z_5X%uAvkAfI^CHz5j$vY8tWl)iirX|pC>rBOmS_`7;Gf%wuJ}886!2~b}wKg3h7bL zzf!|aR4pB~;2VjKMgYdEbOtySYgjp?GnQl8YrpM>af-Fx`VT__-c@|#_c&|?zow?&UDR;vIDFc@YMApfS-$_hJ|wm+N{+MC&hDk z<(jKEGzS`NcO9}?(1(sO-kh3X(^V*a-BF!u43endZOHRBp8U#sLEW9~v=O|~(K6Kk zT6*!S9bQQ?eTAS=uR^VoLcLajp}_%dH83(XsDXgdkwF+5YUINsRTvws!02ENhKK4f zGBg0g!%Y|*9Du<(D9eJp(Ev~`n>D->DpPQSV zJ#+HJp+kp1d24QV_CiG&49v~7kDoez=9QOTdH?wF<7cq3x`Vpm&p!KXOMw9FOCV;2 zv7DCEA2KZi0L$r5DWxRrD~Y7qY&OUC?%lg(#yOS)o+R4m92d>U^;L=nM z7cb>-{@iSG=Im8Cci}RezjPTcUYUidtBWu_x2T2ttdl~f9Qo1zlmMS9;l5UbN~H=F zg;6L0T?zR*44T?hd{+QX;OOS45mcq9VwoDjAPciSHV4(^2)_Uf5@?;F4*5h33!UuD z$YXgV=ol|dB=#6{P^r1Ghq8qTP?|N&AeE?*e9~H4owv$I0;>iUsEN3A4#t(9+l4mr$--{A13uc<>22U_G zegn8%d(k}XOxbW%)NwcDla&of$FGGp6u?n14y=w)m zVYEV(xh6q<(Dng&ah+*T^d6JrKu{v=g_g@bWWoRd`Xe4w(vIs;fu0_VLoTv(Z92#n zEoACU-Yc~yc_UficTQ+9va~TQISZ@mUaIOf-w0qnpZ>N2Psog2hM&U@I0ide4i$1_ zk!x4@2!q)QOyfu@ArQ-WM=LHk3|WTr=Y)V1+B)e6z=oM*jj08c%#b?X9Mx~qJTlFa z`wa_oXrIO@$e#y?01N>DdL22!k)=(>N{NeRLCdUPaaBm0ZeVCh16eW9W#)|MM(GA^ z2s0iS)>gCN>9&ahQq~KTl+A4=Un=ORO!U(UuSYaRYeK0WL&xkG;Ea*qnOubjMd4NT zMGLn2E<6dTdRkb!Dz1eYCAB09^xnv=(pQY_uDpVU{vU9KqSc2guS#=^*GMcFW5=@i zTkJ&xYIrnK*3XI5)>iPO#h@>W3pyyyT)lUF&AW~UL%@NG@go5M{T{=HVz~s48t~jL z3w>)~xInXf$Q*>N_oPJ_>A%HzkX4AW&f{}6HwpzjCoNq^oi#&qd_J?)mfbg~PoX`b zLNhXOBi5F=dZ5k}K6+`t>HWjYm#sgvj}GErH0bIBJ@))op#$w&m;O9Z*`Z})CS}?( zMy(5h`pRS3vV3$nIy@z>GTl`5Km_V-6t1=XsuAgIA`vkoJ}O<1{N z7$#SZ!Q|>un4B1ciIr7YIS%>QND8CF6=*i9P){pRO{+ROZAE!?%38V&Y8KnAc4z9! z)tQUuFI|~mSXfk>V0Lb1@$A_%pS|_wTdy8F_UUJhfq{jE#l_Cmix+1P9XfRE@ZrPC zQecs+1=x4MG77Mq{-|jg09a0c%#`lkySFkoHoQfq|hsuMFIB z%bqRwKJdVU>({T}HZ(X~Ptt0oJ}}T+Jvq5%Y<$&3wce@6ChT|vBz^QW=;q3XVaQW&2%+3KUwyMzXR6*Si%T+Mhqz-9X z$8dd$F-U8WRO-k+o3L}rbRU^X6oUD{7Q&xlB9O5%rkk8dm{i|nIa`p?x5SL01{{S6 zrBz2>5`~b^T}sx5n0V5Tk+rMM;b+X~NWj4D0|^5KX;y>*beIeRKBVSC3Q)|FI1Zs~ z9_w+5`9e3u77i<$_Pd}3n;skCEg%rN8WABxi1D+zWaz2T{Z;yHQIf7C)whChwV)!O z&|q=VRv<2|!Rf23jiSCtAwKfGG;enA68juH3a(~+I1ahexI1gY$gEyD)^Q;^uA=zQ z1xIMC`J<~cVz1e@#rUaWo87z6nCztr?v@2y{JYym>lFccER#!?9Oj-kFJF9*X3Hd2 zTFYVKFw(6+n){o5X)IwPy{9tV`^~nka-97B=osFf%*9%3`MuHgntM#{8h3t6p+Y;q z3rmLrsxu)H{XWTZBfU5M@So{#g%F4f)Y3t-oV@-N%j80c_BjQxiGQ(vIj+XZs_1`o zISX1|ph?oNMu@HiX=2ECg|~Mj^U3Fw1<&kylnzp3Ye9~O?7M!iV$+kWc)1S^$W8RZ zSS^U}Lwz=R3FI;n7z7{|q9GhMlFuVaQ+;0s&N*e?b38nM4j4$bN&v*Fgk^{5lVkQT zXrWyX{LDRvcpbG zJiYbjTr1R>ls^-BMyg(+=SqFWN%2)mozKb$WnrK~4MH0#NlV26fNI)?W<7`Dp%li( z>acF@IINpo1sm2*!p60euzu|jtXP592(%jmb)B=-$rl&eS!XfpsL4{mL%Y40&CX6= zIdl5Nsp*-kSJgBwEX=pgojrT@-M8NP?Qehc>icu;`RVzosTlycw6L&nbz)+og?dpADvwa4z+ zv}x;>=HT$q$mrOr_3PK)I5IN6x>|2kmG{1Zfq}F+GFTfN9@M^M_`d#yD*&g?0h~T_ z0ZyJg2WQV+fpeGU;KGGjn3`I^yZQ@@u-NLrqH+?`Q3nKC2`C{yPu1Ubs8s3zO2e(XlD8Wdy8ADw*)BdxEUtB6C6KphSIuHQ86fmW*wsK?5?MH}~t9dti^z zbgzz&3=t>Xo|%Ff^_doFlSo3Y1ud9KAT6WjO1KSGR`jBV7`4ilxj=zYoxhgx<-3o5lFX-xc+UbI3nM~zFBx$J0EEs@+*?LR zbynwM=FeaGa+r;k2KR*p9Tpad8Dnt38K)SgQ8{f zLeMkj-|Z*usuXN_QChzQuHfr*!}AVrtx@b67u+=E@l1(X`>3120+-MX7UH^jG0u5U zkfxh=Ef1WzAM0GV!1iDcbmVDG-Kia>F8offZ`vcyIPjh0E+@1j+!%9r3!KUMQ`$|V z5haTuV~$T6ZX*C1kj|ZRq-hklTw52A?~1$#0FZk$qA7MREs>!4^DRYaePq5MA_PDd zf*fGc|y-w|$3GtvwaNg>djE%pqy1}RCGId+p2NV$rR4@c-Vj@B*gb%8&?vw-~wNDxT$T?*rN zfVhLU9fmL9{}w?JOLOcV!SSKku0~-%_lpd@VLk;9Vf`&znV3Q1y-!vFqD{Q^q~(I_ zp0PZX1L;_=us<3Bkh!24i~=P#aEXf4c~Iep^H z>%af~@4x?p9~^{MONAX=T)A@P%;S$gKL5-!&vcf31}vvPWMZEf%V{}X_oU*a@|~x^ zo&K8A_Ww`+>Hl@h=1m*dH=E7D(Xo~5x9zy$&WY7)HV!ri8-v3Gwec0BgG0kZwMwm$ zsB2;KEl93T1DyEmDxAM~B|mdv2F_ochtub?5*G#>&e-WVSxCc=CNjh)W~q|dynt(=82w}10VmZ73#*E+D(#O zmLj~&N?!}2~)gVA=%BCtFiti>}53Td#7 zM$~^702ksZkk5}@YMNN=uccZ1+iA4O?Y7Ybp=AvB2XQn0iR#=uoxu>WQ z(JNSq!FZ4MZ{rM>N00eNBk?cpa3V-Vw<@R)Hnguimw2x2c_^+P=I#ubq1Izy0Rx;B zyaL6Bj5^$@2DmVWpf*sbZ1 zXfR;K_$gRDF$C*YkHDJMHCVH%lCNDg0Fx6VFtK6!Tjt( zb8LL|==Ajb&GQR$t?idDoZql<%hvnuzW4BayFGpC^vUyYz4qD%`}glZwtxTrIl3aC zt_rjg3c*CYvs|dlX*pe&6sCvEX*pe=q>hOiturO`k3ah8qnpQ9ty)#9RtMK_*s$^D zTWhzW5 z$k9{q>Csbg^6VwJbY&Li7Sz4%1|;bKRO&-eZwy1VGNA9~CrZdCt&kG*wSdp(X-4RV0Qzp@HgcQk+Jn(72yf>OBj-x_ zR^v&pMK`QjB|4juX2<;An0*sU;b>4<6HQ*W(dm)x2x?^T9x;UK7YrKzW^KDMJ4JhT zyq~SxgJ$C9CMSE@mNQjg)@47#=Ba*iOtzh?1s-}Jp1Imat4(Kf{DPUU*MF%=lqH)z zAorLMzU-JlkWQ?!BNcsf}v zh`^!8#5fuYoXlHWk?SIIoEQMWp^+WN;m;gT_?iHc7S-PEMoS4y+UXrfE6}m%-K$K} z*FlIzhAhry7tECpG43*?8t3uHK$<+W$+XO0wg#6Ohm90xh7qfo#&CHA@}M(S`@OXYvELQ@Db3|+ZL)JwM>|i^638Jd z0~UOanX^%}-&*&`bCBP=b1ki07z8(#cAh0gq5W)s;azE>p|?FC=ezECBIu4N5zj|u zvffQDvtehQarP~s%v4wjpSPs}8)=X0t25$k=JB+B7vK+nFF_=6gUVQ)g}!In>R39G z^H3A2(6t7{bBrw{2t1+h9X`n;4n}(~`YF#0H@~-bq*a6&b1}|dJ9HnccER`o(g3qs zOA0qo7KZBDKzl)h1MT)KwC1M(I@3_Cv|(hh0&6CQVg1^buw~N**tT^oY*;&(Pp+)O z=x`kx0}U0TFt3=U-tH{S&9p9_KX+y3%H`Slg}M2&=g*)1_=EQj9Q@?tkCH5#K6B>G z)ek@X@CZd0XpvD0`wdu5%jvqNWdL9~UC)%lzJ2MQbLUcZr~mTh%guG`)~$wGZKRTB z12=Bpz3Kk@AGm+xmW?}`LnA{&!^0!1)~sGPG&DY1tq)eJ^;$*w^vf&NWUd9tnR5UK z4_|_h4xNNUpPhmer%>3RUuZ)oQyP5bZNIJq0jj?tsVP@TTHsH~m!J+;Lyonq2{@mM zHUylxuNjGJY&>6!kU9DZquKJC4!Q2)`-|$Jq8naD3(NveCN)@e9g>`K@U8adkDvc{EQIr!~aSk36~&(c-mi& zxUT1)DN@+B?Q`2?X+-h-EW6vTpV8fTeU&XR?*7#s^9%>h9VrQhbOCxpbB<9LtkcGj z!odJF8keN2Tz)&m2--6_*bF-k-f<)WdQ>imJ~@0@p#MSM!}2`*nGIbi%BK3Yb5sgX zXn+mJf|6aZl0!i?8l45mvw29BOr9v80*laT%>#56p;iYN9U6f3ljE>s>sq++hD~te zjy14;Ex^bSKttcu=wz+AR@QE{GUzO}=jUf;&z(Da`pV^tmlx+|=T4nEd-AQfUjOZD zzkU5fsKU(j<;ycyuU@@StyZtDSh1qL>@#3FUC*=(04%3#S~u#z`1Uj3PWSBDlYIBP z-)$Uv`|Y6_yc*TGM<>>;+q7eB#rT?LbD%ab+^CF<4b>Wr zdZm>?a{4U5N1vR9k3T&MpB+07$4}3|xr-_!Uk8u=!^4K^ zVE&P;0?-?-a%^w4s`_4=aqtxoA|vV=^u%tpH2VIcax=j1iGhg;;oTTbxeWZn6~CA7 zv>M{63dDWP*^G4$7SsTNGEer7O z7`tP`_il}eW9ka#%(zO;O-!?mfR0?D*0RFZDeho9oSRoBjg#YS&~vyKceLk^slDUR z&i9>q$d?8;9R1y=CPbMN#mYFhv}VD~$U7^@FnbyXq)?RDX$kB}hFLO<+PgNlnT4pp zH;y(-T1XqK1=UV=xaZCtTM2NJwW%s{`iNJkVAJZEx(T8kgxWE(1-aL99CO}+kYxo> zqlFatO+KP&hQ3kTO?(N*QMql5v5?}qqDkX6X?kWFiesC#(R+PT5z!?CAm*+yIsRO( z8{$k0GYqgY@(7v-o1_g|jjpGnMwl8d8Q#pOOc1h&Z8gnHq z|5E9X?8$E5hRmKndqw_`7#Va`9YMWoQr?RT8EwYe6Nh zItakSU|T(&%U$Qv1A~0!g0v{n&0)VDFB1)~$Fu!ZW{fZl)YMd-BWbuS zb4V@gNK9^3WF`?*u)Elvz}!zZ+m%cd{u5>tdSM1#?M381x&QzygIp|&H7%j)BvWe? z;W7-OGbSRekmJ$W*MhRIoivQBr}ZOd)7(E5<#Kg`TLw>QUNG_3!jEyjWdBPeLi@>fP%+;6 z7nSK-&d9A}+RKcwW1?ynh55iRt;nf5f}sWgIP@J0=>Y%$_q6bp!Hg|~egrVYG;Jm- z2zNq&QepP52lv6wnA( z766c-h@nGTZuU_m3E#Qizj;Wcbu=#Z1TtkImB?r+tm!3fx46GgAOPKSLh zn#c2)ae2N#k6+PP31L;XAyn42003bt1?$H_KuCgMskYPnIoCg^?d-&m!&XWhgQK{3 z^|7#R&OPHtk{ryk1IdbKF~GD~&p5PwXas7&9&8ijo+KD=h z4j~DcpIK;Mxp--QW@>tIc5Zs{>ZQx)j(&FNt#jwk9BH){W=@?vefHH~z5MQb?|pm} z08~VQ`8>}%>}yN;-C70#mQ$~3830&L{U!vm@lL<`w|UE*cdp;Iam%)?JGX4R<&Jyr zU%zJEjiaMu&E`;ZU}E*e=+N-!V3H1`iycU&=NFPI)APxx3$5hf;W>E!!xPCzhfcxC zGgn}GrUhAEgXZ7}G>3*DtquSv5B=IPpE56`QfpxiacpCK=iAdBBBLiGw%9sRbD*FJHs>T0#H<5(o3wW1kVYRi-Xr2hjB0|{67Q*Td_xxz9MLv zc-JJ%K2?OBExSy}N%k8+&Lsu-#N(vzvu6~)+_A9YF&A3k!brrQhUkIcN4q!t(F@ZO z8#+#mn?Ab;fN*cG_f3vDF(2YDxo2>XI0&i*0JLeo z3vlQx=A5zX5wC%%b&A&si0l zb0*Y=Q0UaM_TfCbbrr5O_|`-Wx*9A%P~+g3$aO$jcEN6aYX#D~GLRg^=U{ z-LJ`Avlwr-k)T|3sn z?i(iatsCpGdZG?vLj!rUQO~Oy3!Bg8XXh3!oI8JY=IYhCx%v6|^Jh+qkaL$7;1&HLX?BYNL{7Nj1GX4aujUO~X6yeFkrR zcnA(1IR_Umw_vf;fV46KNo5FktISHS|%%*&eJ>%X-OQ!xi8-wpN;Z45z1sIqq; zgU{UOeCOI~SfqA{0Ra5P4zUzrx8CcyP}XKu5(EJBL9bd|si2jD1{$OVDhreyZ2--{ zzYM+QJGIlvGi(1mn1pTu6t`cru4~?M4TW^(Rd&!zmYbZW>Hm2@T^!+6y7n8Npa*r%;xx?cn{w zZSlHCvLlwjVI7Q3e@L(|GVM~>mwhgdUK{|Bf*pQi&1TuDqYhh!g-0w??3ha7M1l*Z z{=(Oy4bgq2#m+DTEWi@(6P81ep0m$Id&wD`wxIC#2YcEsv{P85X!(kSAbY>p=C$t5 z+&}*jw-}HnVY55Qw6Y0dRyRgaOM{RV8fFn53CVu7*pjiuITqICx+9SrBeI00_ zU!6Jn3YircQCKMUvl{>qGU4}=W0_JAz~q?s2H+|SIX&Ncf7n)`6?|Aj>faN;76H>Q zm$juCeq;HDtWrLdaXf<^5^4GJ-M zB);_=*0~lLVoi&oN1+o6a@+L~@~=lS>(Xts`z~~y#2W|1X9Nuw7H?Rl<)thUlxroF zgn*v(wuel=)Y>wI(ps~Zo-hiOJR8j#REIC|mooAUTTtl5+o3(r)>ukerM~V!C!2$; zJqvkf7An~s3^v-ZYUKdz+`0yCzj+7Tdh-t0w4nw=1Nyo_)|zW)S*w$^JMGT=?A4hI z=T4qFbN0mPPY-?i{()cp`qzgKe|9p<7UpMWX0Bemc=6noD_1z0fOT%LoR(7{Edv0{ zDVCCFpM5rY|NZyX8mYYW(%X%hnIq$kMmq70zxbQmZolo0J65e;Gf}NKhF46i*|cWu zy3M02Rt}G^7;6lSR4Yo`f8rFtdmmkZ_dYxfhmM|wGiPSt($z(nS;$~vQIW$sq}3)= zDow5JPbzh-?Pt?X_uL~4Li599hNVK)=vP7;qc0IBMTVSg@X(Z%7;-ZG)Xb?g|C7v+ zIYjL7?F7kUfyV?AWV2y5u}#TiE?-l%nq>W*G5fR@00k35od+EmVO(m`La-nuOxSc( zTwk;4YnOx&Vv@ekKnJw&h8|fOfoJlt=X#3c6c(VZwhnzE6a@_12PwVK{1by_G}A_t z$3Tu^uv8h66_oXN(J(oJBih@eX|tLOGIOMBC{88AeG?uU%Ft?0@^1-x##S06>{K%Pi;Z;2*@W(6wocg)!K50`>3mj>OzxL^& z+l*j+ZX=yY4s5mL*CRkiEECI-5e`(+dIG)*Ck|y?s}bjjJm-QRC<>9{ER~@VBWu}S z^^icH*dwN_KF;fFOrdi|{&xE8_X#^~fg}r1@ml(ab3Ls5 zly=Vyq#FX9mZysVOcRIJA$>qaffygnv$>XRI4&9T`j?yYds&S6-!5}=X;%uO$3 zGgoF7rlu~>U%q($^trQV4$V(ZUA{7PW%}@;j}HFyhd(^<{>LAm7#$tGvS-hpxu>6g zT167bgr9(AKwvqUv0O@4_|y#J`Lc}#HT|I*b?ryePb@Guw$ zqqJ5?gD>e2YO<|`lJ2>l4gvvaUtwJcJj%!b4geq=P_iffOqlSe9G9E_(6qqyU*Py$ z5r7|$m!GubL?iSw7{EZ6aKNa|d+ptNhX(pq0uu0$d4wf`og2(0L6K0Rz%rPRe8F)4 zcr5I(Ab}LCEtLR3@%ykhiS>J55c@4iP+aKwQ_(nW(P1v?s3 z0N6k$zZ1q#P67#)>ah~%ItfLuP=wkcnRK@J4bYB*(L`Tg5r}A!O|ODy7Vk&&`=R%s z2t6yy!N1CZ5*dMjSKhT+2P_o;;K#0S4>69K4-lb32^kCl0LHS5%4K7x>jD6pFzoOM`elBGfsM9yfb|5zri9nEWXppt^VDv)O#Xt(EK zVPOUq=4N!Hfq_N^CRPlf)tyR~Key z7Fr7nGqV@Zojh{r&_{2cICkXIciwsDouB;VC(3c)Rpl$-nP;BqeCIpg$*6zJAi#3c zX&C@mPN6lSY}l1!zp*Eud}Q1B#M;d_-mq)eO}E_s;D$|`H?LW@ZhUNPVz^pw)D|;H zre+tCa~J2*PmeCZ8*hD@yz|~+`1HhixH{W{v^oX@Bdeg%7==8oVW_@LIfAmngB32c z!MxKLg{U$B;K&uy!?;2Cw{$UG|dImeJGfX$lDSLD_8Va`!RyZ)+2nm*16aWycpD?M;dlnRn<&`t>?%4b5 zC(ar&Q;D8-&DSo5`xoku6}XJ1-x!(rYb#Wa0Js7U)(k!H&1RPf0ARgK z2LSp{MXQz&03hp^;Gk@eS=&0)hr1@w5m!Lak$Z;00Rt^5DI^&9^OHHB3>aC=A$leL6w;5( zQF1=?a)vnl3hu*hRwjL{e}BF9{God-3!P#TXeE3F@Fgea4NN=v+5lZDP)Tz!Xfam8TTK5uC5I7Qj@!$D<5<7?ZwBp$u z0|3nT&i-3E0N_{yiPvtl1q)Qg=xYc7FfAcR(1y-P%M{@wN`l+^FZz$VMymdW=@4k%57=TefZ6{J_3_4{YAH^VW6iHm+H{cKy16k@2BgqgG3+ z)pTkuO%Hyy0KfU&A^6=J@55)uF2M9m25D^&>H{NCsSW~E8jykV+Fzk~JS@nQnOKml zqswsg`fC|6)HJ%BRFP?8@9)M3Hu?|9{QTr6Kr;{)q0IvaEDA8zYdmY1_$2Y~>7(#l z>=V*{bU5W%NxBSjKv?meR0SC|1~R01HrFYC2a@blC_G-7;D_zR(zUMx<8?ipSC&~A zB{MFz&D22CN4#r?%(c;`D~23n$kEzz>%qg_1(yskK;HFn?ATHud`5;CFXve|truTc z5RTv?(Hu>gVatf_On&%1X|)_7uE;p)VP&lqnKjxy=&q5jp$Wwml>%76OdbodazAj$ zMeV3lgy@ruXy_`8cej73!n;4$F~CNStr*o{UT%+Pwt)1Cte@P8u;p1GM(#VQwF<3S z0dVrz%6>TH)W&M}weqqrOA`=1Hr}Ym(^6r$eC}-cF6}~_81XVt!QZR=3^kh4At{;p zQ#dkHo)8|KI#>X3r)NombWGqWuE%1VWnSqU#A?RFYd1`b%iqV6U2m3V8-Z)7fP!t6 zQ&X^hqgCefS`wD9gSZeqDF?ZV&kAh_Iu8wBXX|OKjnND911^Z$txZb?0Qzvu*lq6r z@JWJ^bhaDIMAza*0x+@lR5q-ZM#$1+NK#AxIkJQDHKMN|aMTukT|j-_h9qx63T?f_x4*cTHH(x(EJ3D*k^y$-Q$wxru{ckya3DYtF@Fl+Auc*??FTY&<{qKK2 zG&MCf1oisB*y!lUUw-|Yd+xaF&U@CZ-@0|p`mH-BR;^mIa`jMibbPeYhBQ5Nq^$-1 z*WUUR4j#S?=PuW00B>0e-5_ZOk-jW%RGT*alxDRNV zc34nE_f0!(6jxrHIYs~g9~42qkO0%Kz~9S!%J(6`#m!SLoUm32Z>Hci02I>b-mHn> z6q{GRW)l;n!eFWaz|7p!H+tVoZ}^zscq{R&qOL840RVQP=6gc#%|d`f{;B^GE$v}X z7(WR7TXz(JX=%-b7E%O66Mf+Ij^je+z6x;EpSf#)sao35Y=*}{u0yYnL~AUt7j9Fp zAiz>I&3ZL^)(n2Vq4MJZfnP?rjV`z-odUbj26|2YI2HhYX%F8+AKY^>3@nzlMdvM< z4%V)hrSg3h`Nji%%hr$yuk5jG@?0yUEwb#TwAI!nuF=p{HODGJh`!S5E!Y-YaPYmY z*wS#clpu%Ed{F9ZE=2vXaeR21?+_GMYqkT>X=}c@leHjURL%nzpk7&o(V;eMT;G6O zcCCeb@46Lky?FvAS1Q*6ooxE@Y-{?;^y2iDs~1k4{PfVNQ%8>;K6vQeAO7%%zdLm3 zqqE84;=;nv(A?geZkpP=cW-Omx^RsA3Uj6U?xLpR)c z_q}`8tX;dZQmc=yUA=L~=51T|tXjKfVshQ&U~Q;gJ9h!n4?aExAAEc!`QYGr`1sRP zaO&JNOiyP}Ym7p3cr{dOBakZ-|6F;!r71Xv490K z?xNErA)NY$VZi*(l<5m6f`OMvw`9i1HBnI`C(PqaTRiXAApigwCE-Y`Fh|aEL_kPu z*%(Zb)|xi{uYRW%5rYG|t=x8;FXJwZ=0ZlqMP^jiWkCFP7Vd2@5~jS6?92OqcI$&R47jL`DuL*7&YHDWclaD_<{ICD|op%=(;R5*ySX6!js4q(= z6wB$)CM^R1U#_G`obtTaXfzrVPd@qN4Xf6#-@JSGp4)b8yK(P|iPftHn*)upi4}w6 z6KjSR+tvET=_~26GqcIt@6W+6fBj+d{=pM4HQR!Ea}r$6Nvcp}Xt-Xyv*w-SQjh_Rtk1xNSU7u!Q6aa#llTwQgpv zw8^8vaa?V*VW8yP6HdZejL(bknAmUR{dk+#j7KoKMmVW=DtxCNqYmv^KSm}LK_8$z&`Z#Snye?`6FwE zDCtHS0KgackQYrzmhY0|Xx6Ln#o$=<>F<;|zodgM9b%s< z3{LP>0NWpoZsk5vAp|*ERR_{E(+&hHX%6kq0xZm3hMDOLP)QeI%lcJt&+R+lp1UUD zhONW-uufV1hQCm5-} zb@(STC8wUqD*zGz!1|R37I_GfcXHPBviZMp;%Au@zu$atRR}Q9tt>J5_77bDP!4 zt;R#fnhyX_>iUTF^N>K^aUJMcW+U9T7}z7<^^%ae!n=mP_QkyCGE11u_}B%;iRDoW zIcGG}bgjn;PiH*I>&WZg{8}FZn73D9+qQ{?U-T&Mjtlpz+qz&20Mk7aR?-D4*ixmN zQ0MM57XV;7Xf)v*;!Mt2u=`@1%#-+TxBd6Pn}}el8Cp#iEdbza+I=tC=md+rf%j>0 z9XkU;f~I>u*uT}4Go-nZeu)MJrQrIKc?@@6;@M;JNJHn82Ofa!0;)GuJN^1dxcf`3P==?l`p{J z+(m$e%P=yO!!0*$f=3>>1@66j6HKnG+owe`rDXu%3x3c4<(FShCnqP<-~8q` z!;Qx9)~CPq^g}n@bkiLhH*eXrcFpFU!{ZYxhek#k!(&6WY6H@f=K&79eg=N^+jl{k z`ky^N2Metf^0Wy_br{n6Af#zsYyI)wrHr}C_c{A(XiSR`M3UKLJ(xcT`p0TDC6dG{ z8g5a3L|vJ2u^w*aH`q@6pJp78^FY*=JP%cq^*-4+U;oY zx8d{FwpriV7Rl90FToSHVL}k0*37hSCx$-cam98O`x|2Pi*?vL&&9QX!ZafCVJk(8 z*7LWi>kvxhvx1Ohoa|j-ek^@4AhTI$b&**nhBTJC3;3=;=jS(pG)OknUDWD-3Juw( zuu|3r-(xlO)Zz$W<-PCT1QDCNz*iBFfvASLuF zMH_D4NtBP)HZip*OqD@@#Woj(Z`<~snR~OJVxS$C$F!mEBz>^3b%?B+{H@5j^9tbH z{ns5TZ3zIKpM2{V@kU&O!r!vazLNw9K!Mk`%0jVbLD+I1at;jcZ9x9ooW1`m=GbLrDj@_)%HZisCuNj+Bi-1q;J` zorte4k>y@r)|@5d)z3Ienq8!0_%B)(q8}zpmjvS91tcp4iM>abeYATFd1A{~Du;hW zEezP9ITX^LX~0@oCHQ=sRi7!agne77GSygQ&}z>DEKF-fel2am$Y2UvHV(tRx8DE{ z-M0&Fx}gGtHGrAvRz7=mzSCZqT9})@I(6avna_?MIdb&S;lm&O{3kEH{Q6t3fAGz3 ze)IC4J$rQ20P+v83 z5l%VR5fJEY?T{d7nHF=_+Bvj&qir+?WEaPR#y?4s9vI+7^tqc-!2#?{Sr+6f17Gnw zzobC41?L&_Q1q|<$6>O%BztXvTG;a*S5~5OUaVq-9S~zPu%&oy07E@n{s(a?bq$g& zSSb>Z@=awHaTRK{DpczukmoH}SeSy-m#@OPOIP5;$@k&?4^QY2f_L4r5pKF+EljSj zRg(5lbLz@yy*a#Mcx>gmZL23YY--Md$>T|b`GYD(}=4}Nqx{rHnh z@Y@8ZhNLnI&5^Y*F**jhy4&ALpw;0}Nom0B)fH?VLAcKpGBtGiR$A)y zV*0#8!&GU*%bDgnLX0dqdc-jn42o?UC1ob(-ih@(70?^Ov;)5ud)>Aj|fx9AxTsPvbTe0#@MtH33TIj%}d3J+-k{roWFST_?byIDPDV zjNf06c6W375kO{oNJW822%?OTFO4aP&RM^-vzryqQq$+D`489OMMj~2O@G)=6499G zS?}+|l5WWTrX3av%c&)Fh8t`umexky6IyQ=4#e;tHsTU1K!h&FExRw8PHT_`p@%P> zKk?j=&pn=*Z&n!xk!;R~@AY*`Z4v2ScQAYyg+a|b2`r|{S|f$}zyJ)5Oh9LG2F_nS z3nzc`3B2)61>So19Nc^Nj^y?|D`CsJF&G;ju1pLMH^(Mc)Q3mL>eYdIb$D=e;HEt{ zY(979+>sYvc;VwDNtC0&1-cfn>>uC@l0JW`wVeJ?DJ4Lsv3~vf@wIE$ZdkW&a zHV4sjErEHV2lY3~JI2x~^jGp6R&;hn*-$UIuFCxPylYAqsKiLP29&l<+Jkny$e zp?b^4rQiKfX7(NFxv2Mgmq>wT`97vO4SmzCjxw4b*9;cV4O~yf`pVXO zFMv>N-*@X@NQ-aqiV}fXge}Ke2Dh`rY#w2zG;yb9sJBm_hm$QALJ)94sx7#gOMq zA-;x1B&PrmB58KnJjLd++c(VDEv285UhDexFuPHA43DO-ZsL_nwBQmUPYJk50|$)D zLo0t-i%?BEP=yw>+cVIbzXU1F!}iUq;E@ORz*isG4%;?Wp_&487P9u@^wrsmXHT9z zb?W%p&yF4a`1N1E`t$eS{^0QR{N+=pKK$_96@Xa+0wf}_oc;{cG63-Boswssc}CIb z%1_^TV<4ZI8P8^CC!YG|*LL51_XGED+PH1&s&$*UPp(cL!r`M+aCy20Z5VFYvG2yD_PJAfqSh-!Wz8{yedcu2-_OS#bb>s=8iOL(fw1DbHj|%N3XT65#M%Rs`Q*JxUgv=N{=r{R& z@%=}1qg!Qd=mrq<@=a{Lgg^^E)BJPNFW(UojYW-X=C0q#HhH`r^Ghl%*%E+iVOmz! zcezH)l_o~>Mc!V3iC)g980~VLSeKmrei;$~(BG+d?GD}JS7oaGB8isjoroGl*HkfN zv5oS=VJPjsv(Z0v$Z8ciK;_RnkYz2%vpLAyvygOVV7Rden>P%=SMJ^kk3M`0+_bX+ zX*TqPMkb`?86VX*6m_PG;$WHx4GRy?G4Y|M(o7I(rq``2f_L6HsrCLz2{? zlc{iiq~RtHXGuy3WF*$DO-PK8i7--w5z72;6 z7{|1eRx43taEyR%d>ix!0O)Z`Ii#O8t+xHM>!@2Y-(sPnX15>QOalN=PM%d3#Q5q$ zHvqt|-&T)f<}+$eo7mAKGu`wYqq506hU}@DtZ2{;wsXBA)UL$4rXZQar2_zB?PN;> z0Q@$W<dzIBZ6>OC^~&rW0Ro_dIck3wOPwenSTctp!MR%=S*HK2UjQIh zb~liLN+Zp1c+WazNLr%z3*RI005hI+{wB6@=(%m42et}~c%PSSM<0SyL zJqL?*_GFpBZNiMUl)%|(%f^2>q^+*Y7HH3JWcj;n_=EfQ?by0y%g*gvw(Z<~%Uxetvwr>dwd>c6O{`us z+)nHD^Oxq5_dhw8{^s@b$*&H4498Difl7T8hQ?Mwr8)%dEQL;n8ttr&1Puw2jrpvS zbQ;IW2=3}fiSRBDsBQp2H$?SwON4o#W*Z-1Q(T8MvJYBV?}8*7p;HLchVkbxZ6utk z`c>2zKg?4InN|tSH8J_DVwn(U#yX%GaKFd@*}LLm&Pypr=w;Y!Hv|Cm%DCG;q4#%l z_?mN6b`Z;!ypwvOQFPXTn0{F%DYlN?@lyK)W3QX5Bi$lW5CFiT$`}9;qh-My#W)zj z(iOP;6cRbECjih-S=|5t{yUV9F-Yz3-B~xGSnd2x*gA#3b=RM}_Vm93M3Z6Hv?u07 zfpl3RQir2yGn}CqJNY;7JN-j2)%en^1%8cf5}vn(!d8yQwWJVjDWf|+osIzjvH6Y7 zeK)%A3R~uBPXhZN8UXNtP;P6#06^$Gj0v6HgjSoUwEGV2#r{zw6$1dswOOREem_vC zFOG(OZwJzxkD3nB9?{qDMCsRK4jFuQ`y3bGLt|NHdEr0n6#$5R@3e!?Gs3(q-79sB z%w)y_0J;qV+)+|t_cPt?Pq%)@zIADb1oB)OFj_`!z?uKqHUoSpyfmRsq8VXyO@rNDAlMd7>0M$wk zd1nUZrZ2(#%mr9E-hi*%u>&5uZv)(X(?q^@)fkKoLZ>}H-@bI=^4$4zXRe+(`yqG6DxM_-o5+L zC!c=wrrkH+yJ7v7b*t8GT-zKO8LAIdtBYAuIeaWnfBe!r@UvgN0jJL|Kw6)GMsqbl z+SF$LZ7nF_9el6a0Hv?rec%fB@J@no2F=Ys*H_B)j!BjFr<@=x) zhIy$%e7`BS9%JiM(g-PRoA~lkIwSyqlDh4c7P(JFTf}uGzCvK+ZY`XM^6hIAqg-A| zG5v}Rb7=3ORgIr71^@^X&=PtX177^P<+ri&dMP6&7{vB~l6b5VLT)B6wL+xUagaxMHRWu5>tN91EdeHRIf@0lfyk8zc zj%9hsNVoi09o+=iQXa~oP5oRS=??&q)J2h3LvNL}m7s;OcJ`Cx*%?1K;{b5zU8t;X zdm>uC1OWJ*Y*%CtT7CoH>5$K+Y$`32)}e~2R?qEK1vU7XSMV3)yC{}qTgvCUNN>4! z3V^`1qAYuP5h#nk4k(vY6P3T zs~&D=L}+UP;rYIw1G<~` z=lVIGDb`^aaS_|L)9L8nsO=~1q8=mkqOabmJet4;qBx;a(i1#6CM}!Nvo~FJKRlpa z(0@z*DBY=h;7^}kH60j;^=AHE@^1EO~F>mO1w>D~aNYD_Q zx46lq;4jOzbW1S71nTu7Q0aGEQ*53%1K*nR`$KDreSug8lm5;~$cg$kaIdXkxpMsC zpoc#mp}%9}Ci9gE>Hb;@3ysCLl?g=MQm@~{g=)Ko$^f&N_^v6cuZHui5&ZG?mzWe7 z<+HN!mRAC-HKG>C7>730&8Bjsz?3r>E&yN=-p++1%2O}v zAvV5cG3=QS2nqK7nd{Im0rH3183WaVLNC`>cyHH5@jKa8Ga0rH0xj`({Ca1K8j+&DQ@8K_l0`E)+{&1)a$zj^I= z^1;C?aQ4z7B(+g!4y}ZwIsjQ#!T8`>AXInV$-$Pc36}zExfqXh4<}+~Bh0j;KbV#IHd4!Bb48Jp!x<^@#xh93$!z^X8hC5|gjK6%NMK|EV%E z@&$klg}pk#000(2??a3k+K4;m$+0BoD^D?IY?`I^ssZ0sHY|YZAB}}Rtfb)23>urV z2_)OB2_ptN>%#>ALIJi_XdwKcSF)zhyW_|t5|--48EUn4$W1s-}~C8UI2j5H~l1Zm_;ct0Y0-|tb_f9 zh&2(aNBk{%V&<@THN~%w`|Q%4*k154h1eeQzm1)Rq2yNS*KhA<>v-dSRy;uLS*by< z++I;4FxKQp;y}Q7(eDRGVPTra!WG|h@9qJiztjs2it!x%u2pk&(gRXL^^^f+MF2p* zEiJ=-#qYX1=nL^wk_TG~-7Zh$$)B#x$+Hv38P}nt*`e|82BegYkv==+`(9fv`9$91 z0*uk1zG{mS#Iv^Ur&`U5=ho+dm_MliKoWubg|7rw_)Oyl>T{%H=O(e^$T*GxpXdsz z&MSP}I0_!kr(+qIH-nmH`4(Vq_7b$_uENkj2AkK9z@0ZwzytT~fV*$mkgps8n4ek9 zFP@)TIDhW=siTJvy?x}fk3aeB=w~0k^lvX7IDGu@k!PQMRz(ZQmVE>K>851>;7>X| zn*uzq?)ndmjEqb^{q)m&@BiwfPu{TW=Dq9IZCJf_!-mnyKy%>2G^8IKJdyn3)g#F- zfBP|X;x+ z-Es0ndM!FtoI5kuLWt)t*+W zARuP`*8eqh4}TR+`%3|U!kBlv3bnL3>Q!i!efEX7egFWQFHj!?0JINT(<#q;N1JQ} znlOFBD>H;AaQmfjb-iWI9#R=lDu2uTp|R?fcZq%H(R9=9jtYW z-geL04O`YW2S*3mNme;=E>C~<>(j{#Klv3LIe8Uo%@xoXn1D{!0D!s{{4s95+RZ|c z=z-z)6PjehlCSr4(=^4HNf(6Z?G9>)5wciE@t~t$Mi@^jR(tOQ0E&dSiP~1Yd;d&q zeG@<>ASq3yI>fc3KOX>)NqBelg-XA_em`_RrM(d@#q~QsWFG!iC?_@#q4DkSeGz@{ zjj0Hy5M$yqEII@Z{&Mo(+#zI0t;1`FxExh3h8;#(-w7-2k>-trU_#ANm7aJ`b=UR#$J|7X>b7YNV4@Bd8SX z@&$Z9pJ|W2CYTrZk?i|*n)>Sjib;UQ*Y0-(POekpvco3-ByeV~zYynrpCE?J8#}9= zGCg3fNDo}D(?3VLfr+ki!Ip8Y{fzZ7zV8LCRF~&{+9y7V(org|8-Ns|Ri+JUx9}A* z1~FsvB>Nk9U*tE{H)=PwAjub@p61YL&%o@|X=qdy;jY_uz&D?|74E%b6^sm2vZTG( zX}1|Y-(!i3V{HB1Xyo5#nLhW@TZlM zef#!RCMPG;-+uVvP&zfg`RiYQ;=w()-*Ml%_1iX2ZrHYc&AQdAM^}zDE=)oC;!7XF zi?6&3hmOs_Y^x4X8G^Jn3Q5uc$g0}WpQA+!0RSaoPXf&oe=mI>U$X{iX|>LorE|Nk?PSHbHnR>pD(qLA)Nj(?`+f1&bKW6fj)i(} zz3Oq!)V?LZ8XY$_Hs_c3_9b9o#za4$=Uw)Q94EvZ0wABz7-`K7 z8fSNX2G&UkNGWSW093u6NeTyM{0#l;4oG$bh_y63-b0n zWbG-abf#d%$O7DR=T`WOryqd5w+$;5V}AL#r*yVA)CFpFmo60{ADAo_+S&^wg6iP?|Jx%tvBqtd1B3~6)V@QYhIm&>Q8@lCi(eqK7=>kIR&TA&qF5}fX3hi zRO`dg$!pN*Xxk**)V%q9f=Ot;%WAs_Z86#F0dbNQW`=raL_W{NcgkE;*JwRh6vPt& z-$x76ljhDUct8nrL>9Ul0?gw5$CnLM*r zKm+nj)X7v+I=~|5b%oI?2oPLi0unUv zftMJF#(9^b!EzYdz{+!k;b_m@yu3d{!arwVb4u%zLeMZN)O1Ts1`tVfgdHRc zNvMsc9;~bYek0IhjcVn0u7D=|K^U#Sdp5{#B6Ty%Mm!B5|_edM9AjbY&1ejt% z`!Qfz1bAbBQz(@Rsa!@0-DU8c&#`cQ<@NiP6@gqLf4B@6Oe@mXP?NgtLThZ#mJVTl z#*CSFW^j0EtY1a95%i`n%L_5a^q+))7WTd2uSrw7T!XUnY|xW;3^3q_7347C3NWbD zYfx!4pfy{8lNT?*Pkwa-j-8x=`|sWiUw!b_(QAxpU|AfBH}VskQ7I;E$g^{}X6AbxlMp>i{tN;DZnD+_`htO`EoC z-?8WRyS}n(&#s%-ZQ43M*G}u79KVpf`r7g27r#D|y#L`z=p-XBJiZ31^&x0=QfMoc z62~Ifn^;^{@&yskQIUNHQE*NYj&R&kCLHAez#k`th1u?)N4ZHEKR2OObU4K#0Dx#K zYoz&3J)x3D0scZ8R>2SKrBfBAoNW)CN$WVhy?)uE)yE;^&TqI6HP3$*V~mC z3+~{$(sRcd$?G=LTvv#cwVEDA`_4?Z{$5=532U(Az7`f=>;>Gj42lUoK4V!%6Qxko zyO0~p7uY|>>4VxkrUcgNMUD+8?2Aule z%lA?fi$g^U9Rd%HrG;?J7y_|+1ptb5d+)_6@i|1l{C?MeF91L{AgBlcl+n{Z+D7A? zs_V2wsPPeHaR>#GBUH6*53VaI{oMG{|XMg@gcOcVHh0Q1Ziai zT6qOB?L?&t9euA(X{WXK4kMT;T6T<{b^1^nx3|YaZ%XLE94YE6@i3 z&|P3D*6+3}|Dyl^{+OXtO1w{q|8q6lu{rk3D%1SP@4AJU(ru!4>*x^y4Zrof7#g-3_V^jbPf!Rg6(OzdQPRgEEX@v?cJnjKL{OW%*+SHv}@MXC~}lDH>g5)X}#qIb_j5 zi-;^hj1M24-5ebmZM~7>*fN8ddo9eXxv>>!O_;f^P}J-ZI^ne0=|{*%fb4M(h<^FJ zxy)9GY5H6esz(eLTIRUQGT?h0BXck95`v9dDh%9l^b)km zDVax+w2s8@mk7}qjPB8c398=@>4**Ik{H1f0DygA_+t?QVti(`7e=4U=x)YaE||K{ zeXTf|;7j$J2bT4cI8>$HQCw748dRM7GFlJ=594*QMM`|Xm967mfEw9+bQC9mEpa4d z#_vt)jI$4bsxt$}u{aO0y7P`YBU8HW7KlF|+zsWziyVVcT=;$g%3juRto+zI^3Mc+ zkM#ng85Y2p{d@FF0xh!cF8%F)2gScH0N-R8i4K*;@z=u{5PK){!~|=9>fG@Zt1JlK zm{-&<_SuACjjg^MK;5?0X9OMKXcQ!TtdxMqvE+w^MJKgrLE2F?LbM-gA&1fkjawE5 zK)q{XKF?02YfEDN+yV5k4cg)$$)J*UAnVLS)|rOR!WC#%7hv}dlknGn`2ak8|7xh^ z?W}cWwlz0BwQ%v$iIeZX_2z+}z4((CfBoxUeo(L1FHBEQUwG`X$7c8M-@hCw;18UZ z0f0Z!egE%%_q)xHKKf|&*T4R)+i$<~j=k$PZQj0V^X^+VZQrMXsZl2#-@H~sesTyT1g84Kqu+wycKQd9T)>OFQ)Z;gb9m~E&xDp$qGqD z2K4$n4+|w*Cx_pmeo6o!U_Qsp3$AknzN~dfIg=vuNB}?zGU6-SMygvL_{RSP-xK6A z=y^ur_Bet7ZQ;_S_c}GhfP8XIBH~2*9_P?6vYS?|mwnTV;1^soz*3^{7U0LwA(`(T{WB1enY4u~m7;K!wf92$_7OWHvo%K?fH^5)*22zD$TK#Bj> zdz1E)bVN+D0iKI$T+}|!A+2Y~BZm(kKJ@8(FTMDq1D7scI{L&DPfYLMzn`eYa{5E0Wha1t*pv|A zs*jD0O+NLlZ{73o!;e0>YtJqBOsrYAX8oouBT2Qj~>$}e6$mcQ`R-zNu;UVv(I z6^yOg1PL_tJ%6qB*W1zOUaVPp*ijM-jN$-|u}*q(D?*CXaPQakJXlEyuG02M=zD$ z``KN<>jyO9M*bo2N8u<*a!0HMlWj0O67~510(OV;Z5y*U_uLE5Iy;hWg1`WJ%`zx+Jj`iq|uiT3EmDWGXsBEaWJ0 z(C9xaO$Yk*LB_**PIG#QuC{S$QI^3Q0RWwh<2c3zD42Mg7;W;Nwq^ z!TIxV!?_D>_}Zg8;EtO&Bopga4UCKotREU_j;vj`anFXen|36SG++GD4}P(K|Ng`K z_U)T{<>i-IbF-X2=d=s}{Na+?%C#g(YD)Nj?6D{JKK#`uzJA9&cYkH$mhI~r&C%v! zo>$&_=XCnLfBztP`B(2kI~jo$t8aunZNg#)rwYxGkN{-_t()yi_x;HxFQDDAEWfoT zWw=pN5`n~{icl~M^1!0ZL3BI9w6XT_8XN+;pM{toYclT>L}n)K`#7>K`x8gPBmJOu z6op3X`Be%FX4Le(Z9=aJ#pOCoo9LZ6{R#51xOP#?VNhKm_XlwTYI{sGSR5yApF8GZ z(>FG)=XKhB9z;#Dg-*X>`T74?M`aI4oD*|b&S-h92EmU9ZUF#0!YpLDO^=RhSlB8s z@3OZ7-S;xc_0pC7Bh9}V7gSd`>(6h!Y!z!e3cV^ZeGO?B{cq&&ZsnKNYn<+x7>2zI z(2i-NC-9Up_(7|OIGReYalax-6;V7wZ87xOt+!jBaCr;IhQ^YDB1(9)H@1gDTGY_* z;COHdNe^s}rTE&2?U`%j4Ot_pDqEiHMVxo2SfIG^nwb%Ol6gw*`j@R$|9RP&;g6f4{T@8Z z<0Z?Dm0#Mno_P#!Knkyme2&Xcu#0Boqnl4}CuA--G9>aTs zzqM}sWgA`I)s|)WDzi^a$>e{5!7Sk?gDp2rb6uWKv{q0EL+st(rXONl*xJqCFQRRh z=RwN=R^mDPI6z-f0pij|HxGhrcAOCiP!S2*ZDoyGfl758R;?R_xtVkDZ$Ewu4jwuU zfBmh!$s-SLOjeBy*H^7e$5*UaH8?gt-mFwAmAsSXKl#ZE@X9N%9D^j81%O4tW-X`B zDJ=s4f0$IA*tM&<3Si>OmDyDfKK$TKk38|zlQ-|V`@VJSH*9Q8*Shv&IOO z!(OcYa{EnXG*>d>+N-qy=j6AsRCcBq+Ut#h+lKznq>{Gjhj7 z2}r^A7)z;mdwWfoUyCBNirp(#u`{t7t(Qsq04SehTSn;LLLPCx`qviZcrWE_m2D0^ zTgo_>wWF8);{X6%%<)6zE``rvH+cF?q89pygDo_yV>52*hB;2NF)(Z~YlN zQdX7#)^Cmi0kTd8m4VeTSQ&uBC(gtF=l}Nty#L{D_@Dpg(RBCD!8EOQsw15ZwcWQ? zZii|msSgg+fBw?Tzn`AIeEQO*OJ{cO+&T05>#w($L4eOMT|0NVoJz-c-@bj7x8Hty zXvNUb<|n@Ot^2m_*m28-O*^)2-m>eKtvffZ9T*-Nc=uqI{_78a1wViFAe_C}f@)(W z3=B>}mJC2f=KlJ2xw_-8OI4dKprK+Xf9ejDfFeV**b*Vh7{<)eBtb1_Vi*yW<(s@J zl$j{f66UZ8zkdL*m@UpFZwYf>3{3mr=Oi9W^u-?$&xuRnQTvnF0Y;qXnyZiAzB z2rvHZ$=}#|GUp-YtWS+-fkCwLR)Im`))ky@*_4K#d3XiKglh&$J&IV&VC9hTB;? zVxaY0yUeC92*^I^_NMMyV*$696ayJUz>j=ia4zeWX=#@yK+^biTP@BSWP>T*H~k1h zrdqtm9%`?xliM%);&hDtx>&kwNuRD-v2|_gw2&=ns8cS{Bt?_PyK`W(;}Fi*ENKlpER=0J&nIM;S=v z$neK$C(KYXm?f^;2JW9KZyXQUH}o0@ZX8S__w9e&!qu z)>?4e?sf3ZCvS(x9@+#G!vGi0Of6nGcjm&$V~0LIarBdepB*`I@Mk~$*{@!I{ndkC z``Xv8yzs((Er91E1G}8AB`sS3d`>CP^W@w6_ow^6{q5$~ty{M~`HgQpeBXUveR9*b z?R(a3TsO9Aa^uLwnT7f!6gqBI0xrRWn+RHlDC z0hwMQ-e>Q|N-)5I&6c21yxx0B3I-w5@^BIYJU`KW?$gB+dD$kfC-z|<-#e%?Kk^2t zFI>T~HW6T97XUlhHj~-Azg|2jBL#HN7;i@()P$>vR44WKWi4Vs#EK7Pvnhn2;#P_Z zvZ69AU@@qUYqzKn2??AM#A1@qWIF`XEJa|~<)*3j>~5YBO)V>Psr5N!^fK!nNP=et z3EVxVUUUw}2wZdwxQSO6B%OCFVBpUBFR~5-QDLD11Y$osy4V`jnya8O zFapz;Prt!Wtm_Z!|f)t~<2v-Dqo@Fsln*(GR>ZG`dqIJEN`v=*6DLT~*Jp(BpUnB|nDkoKnR zckEf{y?%R~5651{B9_9;g8O%&JYhj)zBkgBrS4W> z$9GcLk>wVxF^b}%ZHt7ALj4qMScz%8Z`BcBg1wEUxmk)ZcCavCW8fbGF^!r3UTPqu z#!c314rjq2NfW@rojjU9W{!N#rPlt_9aeYzWYzZmCbr8#7u>OOsuz9eBbhx(-?Q*5 z-=lWXWBx*BC6TgCUhgh?w|!c+Z~b*|K^3n~`+=boIG0MBFRw-wtp}9mmVHLxmNAG; zv|YWnUt}^n-og*M5@Asx{B(4oGllW#siomEx@ix~G<`ApsrQ@t8(WCNcM0$os53US z{n2}}{&CvT^;7Y^XQC{SOI(jwZcG#FmW6rE@4|5*JcpOAzxaIhD=11$d8qx?wJ_6d z>sto*mD|VQInrg!gN6t~+h}Qvq|Xp-FM~8%NHJ$-z;ei`PFf?G!lS@kh>itms{Foe zuLgm~{!`i9$297(Hd~)WJZ2WG3iE))@hRh*iDn6W zWa$J)?qk4$Bl93w#WbeJVngRJwcn*OE^o*5kblSPwJQ~iwI?e7PPEw%mrHbltvPh= z6k06>3DjU{bOQ_xuY^NKkHX*m(-}B^;tKrDU)+`4uywdPzGltv=-A5U_{xc9tyZfj zC8{d(oe$pmD9`iDMnw9~8>zk6jd-qm9`Q($~$;rvJgZ05R4?OnBUH3oq z)yH?;~&sb|(PJ#IJFcz;`sCKJ!P}2?XeNfOW0C#bpKZSFVl@By%rYs68 zDn$%?#7eiTTrSR}dY36vVFF;R1m#j)^Nh^@?fH!+&G@+uYa3njbS1}ks9CnQWk^1o zPo4px^%`n_d1BzgStDYcX`6X!_WLtJBfZ zYIUGBQQfj**A01^CIbV_`oQq;@F$;qcyw`b@ob~fxN`jX@rC73f!8PXC;2R=vXnma z%rn*f`}dFCci(-x9)0}r2RCfmcH_oPH|*HFeeKRfH|@CgWgpYb zgbqCaz%FBALyR0BROTQw0;M~)w)}8=MGkr-Y+Q65zN`2s z`{X(C^UCd|y|F%6a4Yh?IN0%!&uo}LRwt_MMkv0DB_9J%^g*j*HWPl%OpCW~w0{o= zjBpvbLit?)0Ar%Z0Gs}s065KCx?qCK%(x4R85gI`!eJhdX*W~x7&BU)C zL;zTNXvV#Ji`;V}Mpyk*Hh0dm2>8oY>-DT9G0_~J6XzQ@%85_I%fOzlK#)UUR9VE- z2c7aRo!;SxcJU|$gQ~{@lpYAf0=R|A%!0*pi1P7(X(`MdGkRg$%zlbgIfh5EAU{T1 zL%}ZyXmwdzW-gpP;sY}Th?Wka?1$x}yyax_+IcA})2kr_P?MpatJzlLqT;Tz6KLB$ zeqSt0@*Mq#RoCYfi-f{oQ=t#Gg@JP?R4{=<9-ta3m;q}!(GI^G0d;#xjB%>vXvfaU z;q_30b(U8_s?B8-6VWbZAt@NkF^k2{_V?{{&hUu8fo99qb=W5!9Bwv8Vxk~`;%dlax3Qv4> z7yRYZx4{it8Zdonu6^;`#p!crP8>P<>A??<9{ud_@85X+w?F#958l4zmRrt#>s#NN zfByOB`(N10$w|u=0M{w)*|SFr|6lpaSN1&e*i%pJz4!h{)~w&OZR5s`!^0C}%}-Cx z)_(Eo$MD0Sz60-nauU+UBn*wM0e}W9wiQ9Z4aWCt2*fkV9I{%Y;v()cj|~SGA|^$_ zB*tqo+F2B4iuroyed#{D;TOV8pA{^{@!}l>l1XF6j0so4gc15rQZNh=W`Asaf?3AI z_Qt$1P~tz6|HcywLB%{@#1R7AoR3wt)*P+Mc!(5K1coEizHJJRno3N#YdA3*(&mDm^ z0(e|&3Ij?-;lJ!#7ery8OEy_7V!=;J_PN*O*pHBdh0xAR0&7uPH}yeK`$`gk4R?;T zem!;ETf=@uw!)}4?S7IJyqIc9P|H-g1Y*QsW?8aR)8D=%Riil2Nw5-;FWlU;@(OY< z?%Q4gl4!yW+xOz;UOWGqX0R!9xKO#(8r{x1^GyCxDc#oiy;xz%G#?a}_{X^g0dfB}ppm zePf!Jc>I=dl-#L6wK@ocV@+tyH{sKhN8n%n{av_pX#u|V^e(vdrqz|To7W9D2OBqx zjg7C}uyNz=vGMU$08oGBrI%iR{`u!m<$1o4*v-70mXMYKfa{a0M~)m>@s)?Za?>M^ zeC>&^-2c$yJ9h25aeQKOIH}ev?;X0Be(!}(k{`YFHe8;~VQlp-Xm^y!e-$$A37t10 z3A0AiU~1pnFKH`HZ{n z2(j+Jh0nbcL=yU*wA?*tcKX$3mbHPARc^Y2bQ=@x^7dQ)yU3vXpo?<;!t-a4YFkni z0KhUl7Oqc0Udq2c9ccmCC~R%9wD$!jfP(}$9(;u*g8bGuSLKcsuDLKOF1yyP_by0d z1RwL3U8R%YDFlgv&?WoNjsPWy;aRH4F_I&PrjOKiZPj2+qI(gM`eEdJ>yH?Hk|wah zb#EGG%{`@;0Axz7gCs+0Bkl6*FXW^8%nl04%Aw!gm{GxZI&2tikl>d(1JPw(8y?VS z{2$O5#gkom1@N|HUL!2A?0H}-1bWIEG-nS9Yot)yL*pqtTZcc13soWTSN@ikU%IKz zVoIXlS`zbUm{_HOaYq0oAQ@}zD}EPJx)k||V%h#U z$y)sFgd~vnTf8@ZEnUSi-j2}@IH089 zl_J~B4kGyswHAlYY*SeXcvPU10c5QXKy?&Wtlb0CmrlZefAIr2adsO1AAh|!x$D-6 z%E-!y@#dYQD@MnwgZ0XTCYP?JJg95S9w>?VQB!bTQ*?<}RY4l|-4}`mwp= z0E3Mm;kF?(7yM1JZkw0G>V@-!{+44V$2yeCz?yFJ8p|KDJSmjL_Yj3ufCXo?w=u(@)#vl)2^ zn?m2mgvTI=%Zcft}v=qb#5QEeo5-f0tbYv$R#> zLm^(P=&V!nQTU#tJH%;nYz}{FdaE{;3h77i0L6;eOsl%QWMD;(A8%8y43|rs?6c$aWpZXJ2x zob3f{GI_}9uymrz{&BG1wvP^nC)T;cr$hkS7&yUg@xc|F;V4DS!z3r~X!ZL^q$jifPe8jE}zlA?h{JY2=zg!5^EY zoF6O4kxKX{9~;sAU@eLaEz-V7ROr9~Nb4)0lLH((cM1OPJ3ogLXZFDV@U6YDb7QSi zt&R+??rhzB*IkJcT(dmS(;vO`(rf$n?K}6#Bah6hlAeG5d2@0vr|xMP0O&KR&=iTb zpMgOD7{2%3dv`th-OOI2GUJGhA|U$!Y?o?uPm;;H^ZSJGGNMYeLtRIgc_z#bYz-#h6>d2dDY6R|ihr za>!@{?6{0Pqxa-k>iQ&K!%&tl^qorVUzLS2gSI-!CzXCUK#QK@$L@Vn``-R-)>n_( zu<*RaM%rUG%MPcKHHnOAQLD+{mND)9q_BVzTL0>QI%2L}*FGb4O)U|H7$-;EAg6T> zgRa}4y_RdQfz&=58NE2p!t_7DKsq%!DwzHlURg$O`@XmN?0deck4_ty`IDZA1MTqz z0Y9^5hQuC9#1#nNabGX2Tyg6c8AQ1+WTV{(>fB7hTvItrw?kgREdy=Gplh2;=A#H2 z6v+X(Ly(Pj+ON;A0HYk;Y`S~Clbo<%Z#3|ccK5p0%F1%{NFl|xEfLWxLTw4t%5u8s z^us>T0E!eMIkAIKYLYmMTtQCe5fzDg$dErY7=^Qt#3A#&yn53;`D@)75zF+Lg=hH% zuHOOy?-;Ikcbv(3aP})N`|xo-;V9=&EEz{P!Zdg?=2;&inJJ zE01?c0>T!E(nNYm{S0<43LVie0q!v`%EG?5#}fQD^em+G@ZZPY$?rAnuM~yES0K3( zj=ZUT49Y2pKmi#FG%y-_n#|1bCUgxT)Fa|8v`-Wc$w}?WLOh);K+^=pzlixym1Tbi zDro}-MkXO|HR0sN6Y#wsy$e%Q3-H%pzY*@(y((R^eqx|nsch`rmOs!|b_!{l{NVro zw>MsS<(2aQF#GJY&$b8zSWZ2pWdNYRq=f%^v)Nqr;DZnDT(N4+rdw~l?m!2MZsjWX-Q*5LY+YsZAHes z4uukbO~-{l{=SU4D) zspBT&ZX1ea^ZdA4;%lRGJ_FGUg736jv?8Wq=%E2Ujl2KbZ&OrLAr9CO+HQnEu@Bgk z&33SyU5&LRoLMprBCj!_4QMd=#(~xEhZ(4t)D+@toY%!Q5Sou*zgUpO3}VR2X-`*h zsHZU%v?tU-51?{|Wg%^IIcyOSb)rh&7!9H?>GnsQ{1A=2kD`E$T{Qj>i1x>RTj3R% zv-tVo&w01GDmGI15wOc!tU%CkSYsChbj1a3baHfUE zS!!YJ@^$xOsTSG;E+r@^YVWaEMexiDKw-_VQ;Qe_(^`3y2ej1AZ?DeKJEu*2NS2ft zN)l`@JEKG8h33MXDSfn|n7oY%l_UIw{?Vs^iMCMG6M9Y6l*haY};NI3@t zfVt%>0llT`Bu;%PQo3&4x`8aqChxxczB~6l`sfpzwr;y=?S}1Z*KgRkerV;2;orV} zq56OQ%WLqvHxENzSqasFRRGBVWLXUq)`rJ|(BSFO7qNVKXXwr6PtCP4DOMwlWp&eR zhmIdt;B!NO>GI1$!4bjWL&Q3p@&tS@h1%)X;T*NWJTc+0AA~%{ti%o)+fQZ)ths&^ zRSw+qx;Ez21r^E!{P;V(XRE`&=*IH@)D;wai1ae1A>rHz+A6%BX8zp>7qN1?9qv9r z#ed7_2;JJ-ZJc;aS#XS&rPl)G6DB>{{87KNu>nG%KAk?vGE3Hsl%cwsjqCA8gTN#p zjQDMkCY;Wl*9bGVlr`OrfpeHi5!0CyTi)=#)ALR9psBF-jbQC_WLsr_nGRze#Or8F zOVp+)bH&gVtYEv@rw5HUUNb0$HRHK6ed76KYX%x?Dpj`LX?t|;dK~B2m=r7)3PPrp z`V~VOq~9i_X{aCNZE^QuHw&lu*;1C|6_}-#*=@c1jQ%y9OF|F`<`WLTOzO@0*e0L; z$yWhdV|W;8UR=_Lpdj5N-G~WL-0HqmAqMv3UdYqon*%`{= z;E$dOZVViC$05*WH-~tyuB|Zt;MT#sBA@#vyfyL9`n(N<>f}0k@2D}?XFK`-30a8A zb54ac#vxE)jq&eHI2{k2_ijXIIZyg)NJZogcEIb5ow`n-VF$E2fV`zI1*Ay}vc*e~ zEu4j$wy%P3|J6P4#J)|CwzJO6)hqK?E}lJq`t*^L$B!QS^tA&AUU~V4FTR>pv!h3j z9GO}M0lKGU3xFQ){D1e?ziu8maA5Vm#~!=;(Z`4QYuB&aux6lBY1F>| z)AuX?@`HEb!^2aMRVSg=Q1|@@wU>VtI*dasNg}V}?Rvm)Sk}f{>r0!av8m zwHbq23%`u(Blt_^DJ%^8?F}K%?By9{RJtqAah`3r945RUCdLPT3@8+EYAM_0w>$RR z|C<>Q+l-X+;a*z9GX}5lvI$~wBhA!`}$qqgDGI6COBn5;Y`Mo4v;hRQo zAG(2#{j{}2K}Y}wciL0l;HJ02737% z)nG(7$F8(@<+%IfWY?q5`<2scHCB9*o3-eEP*_j09A|vJvpTe-t$!howo-CcDBuWD zm&)IoxR&f|DZ)z|)PRweEB{2mw$f~4t{nOYD1GSIJ^!PTPb86 zwUCwBKWa9mw!|k^OJOwl&W?+I>n9~;A*y&ilCI06xr|y`f)PM*B||90zaDDjN*pss zZi^ITuT_A)F6nb@LQJ^27N*CYJC_;ZXYA7}CV2H*w-pHZzI9j->DI3ppyKx*0v&)p9+&KtTwQFfweB%b{&(e)C!GL zcO`;pU&j65&%HG%0Xy4*;P$n=qWe;>CV4#5D^xDTK_unGADx~nx{0~fytX?XNTCjm zq19UXbnxhD_|Es1fFADrkByD3edOUs?t1vEPdNs#&=y`i6s$RMq&fU0eXks8gaxrM2oPfLUFNFzSC_Xz zhQ%+Jo_GuhmlYId0_7Fs1KV=txGqH-z0?%dRGU_Z+tj;o%Z#vK+#^hb-!6R4tthX< zWeQke7K}C1d4n2r9@$Hp3l^xlw9zS?mc6UpC{MjIb5h&EzY7{?J{bFE5M#`%Bi`75 zg%@nO4}`C867U2VqV4k7#L|v2b*2ac5J-S~OCHqW#QVz0VR!;-O_0RuGfZoF3a!!5 z{wWs-BoYz=Ziw-702j*?o3WFEuvd2x9Ku0jt-QVe8c(JSzImWP13PI2u*UzE_mBk0 z+>COa#Yf(>dFe2X11y)96QYBjCwXO7N@Ezk-|K84yROjj9BWivniB^mB(;jQ5(lcc zbEvl*+^(LJAid@*M>A?^2WvjN_9<9Rkjw9x?D2Ub;Q(2jLj{NqF-H>{jnH|WcuouX zee}Ft(pm4H(xG=tI1*&31*gTJ|>7ji7EU{EB-rR9D$d>T`)5&?!E}0~ELf?OV$^U){3x6(u9!^F#F(weBeA zx?rs>!(F#Lx2TOTuC3Tu79aZ$h-WnCtX&is65QV>ZW$>2+w~aWPKi$YQa*!tE{ZEH zOtiyM1Gd;>*|>G(`p98me0!?;k+yUDu|{Pn0x;idL%lfxm0AN%oIef!@PEGsGqXwZ zAHJ~@Hm@Db2P&2N>a`nJ=1Fo#0yXG#vg}7c`a!;b|NbKYFtdCeAe@!~fG&6bXJ=<8 zA9`rt-p9Z8wQt;f+dW^|xMkbM=GfTa`6;OU{deAk@BQ#~nCpx|V|W#0=`gewE082r zyeO(qYM)3z^tU82A>pY&AjLsq^YPbqb6X|k^)ZPnOOiP=V1|wvoEF3SEmb%-hnF-x z*Z&puUY`^+qw?Mtgvl-%jaZrej79t~DL*zTm-oB)tzV7_TNPn8%b9S9_R}A`(6iW> z`f<{IO~0%|GDd~AE^$wkk2PQMDGJ8j5c@3a7>gF4Y41f7Y3>SYF042fzE&*QFAt!~ z+4H^Q_>=AdQa^p6q+62n5_?~0S22@iG(1fw-hD*6Bl~WIPx4sIW&8OIQ|OO%LHjR5 zNcvehR<+$ZlIai9bkXl|7GpbemeZCbUmapvvn!FgxA5f^GJqXVkL#TLg%D^ zwiB*OZaZqfSO!I9>$${V%U5E4fZyt%OFfyA{W(hy$ zjHv)n{os|@CVMs43atD^=0;Kxe6(Mm8*wF^%pTQOSgpVvd6LZAlfa0Du}U;=q3f!1ON(#kM2 zhS$Tw!bRBs-+uv@FJFQG=YM=S*}Ab(sWt}(R;=1Ix##BU9lG2!Pk#23SCTASSoR4J zNy`90Fg=?-`Q)#g2M!#V+_!Jv-Y1^;#@BDUpCcHH&h;E%cU&L1NrR6z#NaGA_;`pu23c`1Br0ovS$7i-Hg`=&Mv3leSmuR*c- z5{AQGrRDGPWSvvF?JRSm83G+VhO+Qo1bC38lJ5@dg1YyRurgoDbLTnE^7|O?UzfUg z4fDCjbL0!teC`wTZLMznM9xv^ZE(a3=cXu$Ug>rfw3d{`G9R)~hbOV$yXS~QA9P(F zEujCp;UMk#A@{uo<@ipw*z-w`PJu&0r~keWRg+a- z4bvK5>xkGX!=pWApr5(RP4wK>73U`$IvoI??EUa?-B_KaAq=GWV~ZT4;92xtdFGQO z0OGZc>rsNP;|oTNF$<-l4h~`IwAB}^3)c}`;am&UZP^iub3rvarojx1aSFxd>UTd@Se(MZh*u<3iybmFYiPWuR36 zHYbISq75BYOcRpE3Rq}&;K#rG7_Q9B!~gq#+6TAns;2`9G}`USH8<_P`@< z=KBX{lYjh|-@%Vx`4DD1gD|>sBXp7h=wvFqAN$cJ;a|#qJtP;cw9h0#avK{c!vPZT zi6pXFK*M+a5{B`>znDn42&=1*2n>+N9QuMmG39?y0iW|=Q@a2GC6g}?;qIV9f9vS; zOIBzsC>LZ3yo}FZ_vEAc-8}e*G#M6U4*AW9TQ>N~tVa?8C34a_qIxBq(*w5Pbjmjji4Z2bEgu1pvGX~f zb}%TARMdNFrIGOi02O;JHhi7+g28>1LK1)H4g%)!ufz9}{4#CXF4Gtjj6!pH?djTR zt_HnKN#%4h1XvXP0+fFfde3!VFS;59FExIp+QVvB@jlSz=-DFTtIN9j1}d(hzYIdN zAY@Izy)(OyYD2Wp7odIdr~r(A4yl(jzL!+G79+r@ZA1@cbo&@f5K4#uoi5`)xQ$9E z>v1TYc`M;v3UIQa@q%b_7^U%w{h1s3wn)j$1T=IM)duxw&UGUlo{S6jG|a%JFet;95i;t8q2t5onS z2H30U>i}6Ng-W#vgQM$V>hekW#eqXw@$w)4=5Dy>_LVR`F;uHoH>|#KcX|h8DYUZ= zy!4YFtLp&EJ^{S63;=}h{IA*f#J;@`J@oifx7~HmgIjm(+|V2w8+h;Fbovkbe-AIb zbO0*N4KO;k9@=>g+HFJ=F_eW}>lT6S^AO<;6(Jb0(u#+KWu8&^PSA{({$6Tw>XFo$ z)Qh(Dtho~cl6O^0X_XoA#irVO%dxs$#;HsDmYCvmJetyZr^vf(M(=O-m>JfP9_AK_kwEO@l7PMG!)O2=k@zZi)#wm+8LIM8@ zkGI)3UKe_)&9RgSl)?K@O@|Ec6dcn<$y0vLB|S6TJF7v_D( z^KuPK%cnbbo-7~Z_g${TKZVrmy74voJ(XQj7Atj75Q|y)McPo(=9my)ut?x3k^(z> z>yH&)#JIfjnO4S($Ym>O&6HN?_C?nb>YF^7Bp}gCDnSl#o|d*wxgCY|?>mVMT2#dR z4S9Rl0|xK`nI1BDDR@X6I&q~^^j313&RMFICKM5Xc_x)I5WZbh=xKfSrzR>OwokpU zYF!Z{Pullb=0T#zXk}$VrM76Q_4?tb*?uYKc|TkrnL=AAn>RELL$-ap)_{BM8% zYxw!AA3}3{CqQKs+F2FanPMGL_$SvjwCK|!!7-cI->6AJJLxmD^df#p@_X~Aeb3LZ zg~SL$c?zO^jw8A}=nb51`I!?TQ)aWm>Wg?H^w6z5eRj}GmN7%3FkF1tE9BHLJprcK zaa7kM3sZ*fchi1`7!F@^!-R~ZyYoFW+dRp*_t@6ZJ4yG=)R6hJmQZkV)ZZxJuvo=8 z>5Qcl*4*i~m74>C$2qkAv{hJIu9*)DllEZZ80p>2HDj7i$4@~IOjxKNMaH^Vw`<~# z16XJ?N|Yi|D70L~wIwTt5(Y#LjRwg09vp?yL~prPxW+I@G`A6u$7<4rxuRg2)H8*y zD^qnj9tF(`?L&u;k!#cu46LAKtSoqZDGs!p3#(;!EiI54E&tL*vnR4oJ zO4$zs_XnU-O^ZG)Si34U)8^U)*1(Jw&lzrKq;(PiljCNz)y|Aq4z;k}IJ6-FsXl-a z)-ub#1I%BE3AEJ;x-IOU@EdH84995u6rzXbYX--;N(K>K1WD+f+%bzfqvT~oYelxJ zTi^V*lFk5P%mu6J%dp9>f%Y>s*JsvvcR1 zAKKJ8%mg?Jhd>Bv?U>F0O$@{fzR{a#`;MBsJVS*OIJXa)R6(KC}S6Omk1ZPag@b^uCp_kNQMQJGQr7c$`!%Tdm~IFVuzT>;oS4- zh61y&;2sL(*pEzOP1o4vwKyc%`Hx}#jpLxeJv63~V%%INI6O}BeVKq5Vp5hihD9KN z-xryB`t!MmgSyiyR*Bg!-FnxJ{>JD_KgnOeSeBp#2Gb}%tBRni z1$CuB9O@4<=_D_*Y9gx7bOhxd|1PYtkmaMGWuY}4>UXStWoJ+*pLAHspoPv80ewPk zDkd2fBi>ft!|WuL1vPV4k`q#P+A7Dy;X(9uDQc4{%Q;uN3yut8$!|nMh1OR13~-~( z1!=HM9Ddcrknb{=!Fen+t+-YT>yOJS08eyw1;2OcsL5~qnplU`KCKR|4e7A3+xq4D z%ZQXuJCWR>CcXe@8T#q+CALor;33{lfDLR{A!UKk81rs%c{<)#3^QEod;mr?DL+kH<4D$<*z#|W= zNk=D!8(Fq~&8}PE_Pmnhkk-AW@4` z-}ygqVD)29@4M&zeUCqN)6MsMW$O)FH;qiJ7GZ$;(=Xt+Zyp1vu7ttiNtka} z$&;t>%tanUE%O%>CS8v7+|rNKnJ9y3ZU0nmJ|8 z&+<&*{#BrtmhcL1v#ga9*zl6g%VE4$$MOR=m3=33?52Tl{?d14huw*p$QE;zYjgPKcMeqnH6gm9%OFJIV;v!fcf;n z9(SzGsF~k(-*suAjAg6<8S-!|ohkXHn<^E<#{hxDvik$Zf^-s(zZ`XBh$ePYgyQ+s zV``WyStORv7z6@*-39~;u`~$F(WQIJ3SPQqU3>jDSA$5HK?YH{W+Gv{K%-12(7~8t zWK7#^0kk{Bw@5c7^TG9mW{??w)&Lgg!94?f=Ez@Qy$dC_9g@XMx_;Z=CX`H|sKKe< zp&J~sP6#cA202(3_mjSNn18zqXcxJK)A!+PH37j`N;gc|0_Sr#q0|;(g*r#TlOrSd zJb{2_EQF@BTPn*|m}hS+oY~O;iqpbk4fLlxpA9A^`segi5@=J5dv=@l1i;+h!KuP7 zFMdml#R7Q{IuXO8sLQ%3}DP_pJL5p^a{JpEdUfabNKuuN3s667U#O; zY+^9RC5o0-d5Nu|xc%Ly#72YBzxb?UWs^HF4$oj`BNxs&IjTwzbk7V8`==0f8HASR zSnhc<2j04MK9^^M7wv#c(ty34FQ5Dv2cJyASSf}d)9f=~ZTDEPQ4xo%{;?lC?~RG5 z3;|K(nR&0U15jG4h{ip4LU_L4w&3tPBAVtHu6ree@ z3i7NC?;Sh~fB)Zp39Z&W@Yq9}lhM_qwX~Y9zF}8>rz%|88~phDKm7SCue|cONTA)UK+z zFF7834GNv1l8sLFo0t2ch%JtQ0k5&!7dqS8>`%QzBgRm(+mkxyj` zYnZSg!$=z61tH-=RPOT@0+5h0JLl5tSeW+;*`_phpjnG{u*ub`zRVNT>E7mviR%_|O24Ki;yB_6yY)c28#Vu?JY%8D5L#-xewNvo-I>e=GD{nR6D; z4Qd4eTehtzxVUt}U&YohOoS%LGoj0d*CiFab=yLE87D_@?V4B0Zwx%~x^deZ0_>uN zc4@08syG0OJOQIgX!E_t&P+HhDDinzroHb;DUpX=X$Gwd)FZOW40X}0zo-uzA*eYh zihrP}gR)X6-8~0v>~?u3a{mkTrXbPLGc)KV=T0b*)o3>s#Nog6RS!Y?yPPZT4RA|u z{YE-6xWmi1|FSp#ZpjPmXa8Xb`M%Ka@7ajp%+6xFFH4szDvpvUfD20tjBzn9zoDon zK_GFT{#}kYYu+Yk&IkFZOs||Sf8o|NJ{>bvp3m!<&`_Zl3^OW&pss^Z(eBPk(*)ZTH>3{e~SIYeUV!-@iMT z{?~u}B^-F;6Brra23a}^3$2O{^_Qkq&Hf=V4}(XNUuV7%la7mr_kz7m9X|vE_n{;4 zRAY##FZlPGqHW|u%7iB}EhXYl?0w|m5Ok?a+iiUDg0{c`C;Ah70zDP&@Y@=npE9OK zzVFJEdW^cOF)dmlNUgW=icQRh9xn=|q8*^n9e#;wv-Y%j25`tJZ@qZul@VCzdv|T3 zv&nu}o7F7#rVa8n|9XuJWIq=2O4e8QJZ2gv?}LZ-S;0Dl?&+z}b>_}$5@Yr#RFCwD zKnHLa93a^KkfjQbbD0NrA0#ZSPcqX>S-|$MqX8%DzE5;ZSzEc&459xsEPkc&UQei+Rji5app3z@_^RJ+|Y>@9lXb z%Hj7u?PD!>;h7klv=}DQDc^A-D8fF;uU3j{2j) z-#&mjuHR|5P=L!dQsA+K5RbKo#yC(Nol!wKK%6yPhCKhUOC3X#d_K=F)r^7QiDmnI zKEHT=_(})&jEP>ObUz$46p^tFWE1^Kvkfi|gd7NQ9^ z!-vQ{=zf?-GDfJw)IgEh(|?QmoGgsccvy2G79zOH&;jS2MA#DVi9Z(hUL_w+MMjS6 zhz@CS&;qrF1h5cO?+ElILZ$Oe)T$9{bI29%i=hb>x6>Ysh9YMG6~){zup+dncxW)g zBp9#2*z}{(@%vNu+dL1}BbX&4xY@gs^02hXxDsG_t|c?6kY)VHQ7)SORsxEdwsAR@ zAuG`IG#6`C^v)3haL=_x!}WD z^iF7e?6_NZ&We6gcs(JgD~D8?j8r%zkQ{5j!~Pnv&W3c1XZl|I#ZZ0#)cf zUU%aDu}WH~BrPwSW#W6h3z}se0&e&ot(+|>EV7xewcwKAlr@hf<}W;?0wi<6!w?AT zw8UX(?Q^D&_In#b&FPD#*=X6N@2wImC50zBroL9(tUdEs)~W8o_6CTE201)PS^y!* zk)u<>nBC4%F2FUYX)h6=L{VZ{34A5*UUzuRGAqINt-OsA$dW2&QnIiNBZE1 z!#9a@Bm_$Hcg#~8A2`k&1kQaS{D)S*b`vZ1IFd@@eW@&T70u@i(oy|?xTwt;8Uq*t zPa`0k9kSv$=SALtu5#dhN(-Py!H|K+$nctJaa8EM>S%uv>YT-gI%0|eZUlYgF=|`q z%Dl(e0jUE{){;xzo-cYX_EnBu6z4zXGr}ppva$N_gei`rluV24@;J|^mCm(z4vAZAm>QhhMeA_)= z*}7}nrh(Cw&ELLxA^AW4>DTc4_f9}spM=KH8dz9V&RUe?BQ;!f=f`6hdQ0(jC5c~8 zB{4c^gg#fvP+;1iG5K@H@+(IEOhcX>|T3oHiOa0oGX^eTLxtL-W9$R?RNn<>ysFn+W0v1lKA_cZ*aKVgFEDC2`In~DNL1cYAbWPB+6q( z${jD)p{Lu3e){YR|2_55^Gfadm=+tJ`$^w1wba73U@pxXW3ydPI3=l&Fisvn^aP9o zCtEd05W@af_KgJy+eD%55>&nC@%S8)0TbdG#1A*5QfU&MbG1Q|X2?*90>qKkb53Wk zN{baMELg_fz4z`Dd{+<@m5XZ@1t8p^hq1ZtHA#W92U=!8YH@B}^IiOR)?f?Y5 zKe+w=)fA(EwtJGJ64^ex3HPWx9o)Y3%2W7>=Sn&yv&w{+6IR!pxomz|FzcmlRx#s! z??kG|U5lx(|4X-Ac2-70w8JS{rYF$&;`6WqKo$@==e1HmXxnLA^i`)WbPbC)o6lKi zd5MPC{>fmI1e(Nq1K2qdxM6d+kLKJo!ggp(d`igzwGVd4^Qfp@XHXg=UHILK@O%cn zi2%QX$Xc+{X{r!<#o6kQyVIUH@AQXC(k~ItZ>HCk1|E$fvLs}wIjqHLO@M$sh3UDe zk9|s5g^ji3;s+HB9smHffz?pYQ#gA1Bz)&ze+QjT3%>Q_P089dqqSNsS$)Gz*&S_N zPYr(Z{eS=Y{{8zu{mys3GyCmtfBQ=V0(_|e0NQ|cyz{?r@BI%w{?zSv-SfbX8*bcC z8yRW-_Ki!)|M|}clHa~@2nL2XLw#@!%rD@gN|TzQP*zwC5d?b}`*oM6*lAME1onUY zhU)VVc2m41#_|gbwYqdK@$O!kP3dlChbZd1Kdk+xa5N^jN1_9V^^$t-6V(!}T<;9w zwY4iIK=V0owWNNEjfwlrE!$naMuUi0tXb!UUTZU3S8%wN6-zCGUO2F2sb9Xg z?!vfqW2ysyRy=b|7%I{M^^5`_bWN^>LSZJYhLf%VA%jOX>PQo4uBxBJm{VgN>bKQS zTxv~FR|nWNVfOsR0_A-vtRXQrUL-3VB2PNj*H;A33GzE;IK|l@&kiYUOYlH~i85-1 z-X9EH@^rC-J}jgN7t88=!08g@q2(n=7GON#NM&qp<&bZ|Hab;cGW0qhllWRh7-FcI9w~ z`l^#HWUU|mF#q_IvN& zvUBH#v^hBR+S^m<-~H3C;lP`RVPwU2fXW!O+G`x zflDS|JFb#E^nC^(r1`)McEg2CNI9<+T$p(iL|zCr()5OjD>A4UzA;-m;F4@Ff}bz-YTMdSea&i^8%atd#oq~Ia^B#^5)8j&sB)^XdL4>@sJ$mn?V#tyd@u`H6yg$ zbZri|$zyDV3cK(7&;kdN9uHj@FAg=fU?Cx?0irhf<0(_n1kr#4vAf3+hh5Bk8gp3| z3{jKC@+mdfW6wyCR3LlAi>_;L`Z$_A?~oI#k4OZ8*;Yb4=e#YK`ZMWjOuu z;4-b1hT0>{B!_85DD|!-D>9wod5KMU5e$)Z+=lVLuWc;SOW7t55F&uqJm7O% z?2)Kd35_k&HuYaJwkfo?%(|i%%Zu>bxIRMMvh0{Rb0f8fqMQ&wCCe&X6AoZvHm(nZ z3o8LtpcnGl_5AK?-su2wg&79c#ToC9m*G2^zy;4PuOHf2p%^tq$BuV=afm2OMlhC9 zevlq%8Y#{&N2AaAJYZaolQHAhZ!>+==xFh@9L{dF;I>^Gv~kQGdcUQ?v4b_wLG|-Yi@@D zxyaF_F3;S#Nujmafof$0MpkTtlV^{>{_p)>bB%xV%{}Sp@Ni?*nhmRyv~!1Ys7Avoiao;8=?}Kb`|?es`^w z6?)8AdmEh#u|Bnz1uc<@RK?)VGfJo>**-?0z4-|#ik zbaXsO&X@wAV7Q;y2_w)Ww{7c7;^i2JkUj&;mhX-*g1_;;Iqt)Z`dno4if0qHvRqiU zV}!Xw?}{3*qE&^nuY)y;R(dqwU+*S#S^&Ip`W6-5!>Jb`w%hj(SX&Y$hP&BYx%$6_ zzAdGl27rpB;CdD7Bs7m<;Hr3rh1wYcf6LB{uF8){pOGwtNnA6~CpDx9r?hWIqOY>ael_B@9Q&uxVDLV$n-Jl4$mdw^)Y&aXS} zhFJ{tKSc8hpD=>B?K5lZg^#D;bh}raWYXudm)qy3T^ddf`~<+~(|AcAeJ6WMnfG4u zI|9BIj$Qt>*h|Y^nDUX?6aqibSGcc2nm2qZ;$uQsCq;;<-wU_sKs07dmFy)f(RgmP zLYA$Y)N{7n$7=}a=Sewk&mpT+VQ73a96xgezWZ;l!9cABfA#bY>FC5rqt)KDX7`@j zok^Z2X`WPGeDS4UY}vBq$d|z~XZ5(BViq`L`Ti zL|_@OrH4)fgh?=KFJc<0K9U?aM~zqhmG|$`k{JgF9Cu^w>Sy2+XqPFGG~bc8EE$!x zdc9yRD?h{yV4V+n5SVdVWX%Sh0)>M#!z=|E5Xq>Njgm!t`75I#Hs@C{%7HA>_~;9~ zw+E4YL7E$0bB?EEMz8%5ck47vH`gO9cM5=-g<3>@_o_&*LWMbC1Nl+&?+>=s2w)s* z+b>sk_Zb+!-`I-~^JI2b$kg45jn06M$54jGKtxM0!hr6BD~xlPC!9L#fw@c&;4#2; zC$#&t&kR#zupU7RJ)y=Ke}@~TeDc0_D6b%GF2>*sOZF@YSuNO_kw(iqn7ExqnAJR> z{S>qY%S+0mrul7j)?P?p<+9y17NQMhU{t?AdV#SO@0`3AV#GBT?1Nhd_W{epvly-H zT+Ts)0rocympPZ*@*V19v|*xFvtET{WteYQgBwg@o(ngxdjKT*rCsvu4J%4wyb?Mo z?im<&>hng{jJsXuF^fCLQ#q9+wUwHd7MtqKtrgzfPM3jJ#UlN?|3csrw2Ysbe+1n% zwI~okvj7NMLy2Qqy$^_X86ZTPJ{180NkT<4Ox^MfMoTZLaraJWz7j}us;H!MpSWbl zI>HsKxBwVlHy3>=OeK64)}*m;o}GXX|7gy?z_DVQ3Do zg%fAaz(4=@-@$OR4o^O^H5s2Asil>4^{zeH?Mad;7$EuSi!Z#Qd;-vQfG;cv@I?mz zRH~~`fBW_+hkuVhb;lj|Jg{lUjtwIdD+k_q?`rxF|NI*K_RUYBKC}*+LzA%3QlC_9 zXbGYej*wt9caljI;*!z;NA^9UQYv>xoLv2{t?=Plb|Cgigo<*E*|CVeb{9nOz(dlY zMocMloaZsZ#$++DnwB{!ge6bF%Zrf``QWN>VA z^qdyxnIOrz{2e~57#QNvYjGiksj|$&G?MPY$nWTMkUUe!f~KFO_mD!ig%pn^@ZA$` z$F(IT%3VS)1b0PcuDFQ!2 z0YVb?zydSng-vWj!nu4F4P_NA!?e`4u_S3G+q;q!0vp|LmNG~78Ak=M(qefV^^quL zJj!lJyEM!rN54JMU`akaTGg9CUreO}j?<*>^t@LEO4lTn)4i6Z9iV$Y0OTH)K!Q#- z+^fldosuPE;$Az|p{i557?}(mV+Xq8xmxRrPb(AhSYRt?X-R1iw5)O#Ww%7ur=deh zw80&NVoN2f7&4HNTMPg6uhzMHPidIlgS?#17uUEN>81Dyk&O=2OLePxv%p)CZiWXx zw%|j9E??o|(pGAkKH}IRd}M|5?n+V`EB@CwZ?f{`EDeH&S@w;myg&*ifxeTR)LQen%%${6W_F=}%wG_V3@Xd;-jUQGEh@ zVF7?V&yyrcDl1p6Ty_8b_uskiu}8mt%kB5vzjfD*>jy^02S5I_UHQNM`FHTMU%drG zV>=+Jj>BRng)FH+0yVnJYqfe7{Iv%R3yQ{hT_4`|bxFJ_B~9#ssqUp7sYUk7?q+&t zI_UFufjFa~XU^Y(L1XmW%4~u#N=pjQl-ChHL#B`=#Ka$`Lf-|_>7$}dyp6?#FW8pM zS3hWdsI88JJE>(RLT3o69D6^Mn}_mSZI!^o1#@oOVFfHh-#v3Wp9!~`>;Th_5{m%? zLWg0uH5oJyq%kRegng0 z->xzGNdJuim(Yhx3aP%XKIjF#ZY@IIZ9h08pW*1GkZZfmKuJIxGftzxO07LD@+wXoiIvMl|Z z>9VK!?S-ECXC_;}709Ou`-s2YHc~G4dpYi6PShugH#h4wz_-L`Zb85bdZ%~CDO9c; zBY%u#{$7BXcph12`B^OKXJO9Dcr#%Q<2;k=oUHbw2{zVeL-qP#p;I+YwiU32X1yd8 zc%H(@i1GL5fXuJCzgn2{Xm@BX!|R83zEZBUe;o2z#Ou`=UvqsAW92Y>KpDzAZ5vZK z@6CAd`5jo3?wJuz@;otsTu)63(*t{Mhu#VPuLLkI(kAyTHM6YVdEt6pT5ZRzyOUPI zi^>AMHu-(!xz&~v^4$0MO@AD;XMY7!>;55VV%B4DJ4jxH;I1Trg?0z3)iD?vPvHGS z2jM&4`#lUcN8sUmR;2aj(7^br4XbzGoZg|fXQ$K3W@kH{U;gr!M*v{1=gIyvN?%w2 z;JN3XtE^bDV(8wx?%lcX@yDOobKBngH*Vd!d0=R~dFB$N|Mee#0WbgNW2g^qfV?sc z9jHN`RUu8P8n04uDs>_`Og|?E5*HV0@>P->lMiNjR~la+_NcW`T7yuD9*A+FQf~6B zr^B#};lcOrJyh(A+MI?X6NjUJb)b0I;{!otX@jcr%$OQlERD?74!0UL(F2b~Egk#;387$15 zJ`ucnDoE@lW90x8qVd-1Li7ba-WBTCj(0ROhYkmI-i}@GwonG9#ibQFURpy$ZK;Sg zCxl)+SP?MO+egl$-`}19CVSAjbRz7>BbMUysTi+ZvYZA;F&uzJ^)0i9?=l`EH8wt9 zr1?K@V0S>Wc=flZs=9B;iU#0Jj zVXq*e59;YUQ+wx8vqc?>r>q?W3P8uJ6T5HkOCxVcW1<(KxYr!hs!~11y2ZRNiW?T# z3an={Z+xz})fi^cV{HAp%FfT2KreDQb7^TF(}y^5!}DAMGhxBk7mOUxF0c=+PYc$j z(Rr!pz2~TlofPx84z)Lm3Ob8Bbe?E_M6Pk~3WD27tULAF?9pK3lsGKVgaD8j;9$RV zno$`0*f&f*f)U!~@u2Altx)N7j`~ATEUpE!N9ZUk96-!BT5w&nev$?n9s&!B?tkGZ zg&i?F`(G#nd_IJ%?oGSdl?LZ=z!`F&hKejwb{RpDEOs)r#%T*PD8c-%=YZPn4+`;G zGptw}Gq9HDK_VptQ^Oar(`h+b?oW@qGhm0H3bsCRMc3uK7}WP^Q_@AiW*-h>K5Q>+ zt3262)DWI-uGjE-%!d`fV&$ZJ?j(h)zC5n#kB+ipba)(cP|02Loi{psy3a%K9_Gbh zfn*C1aM^qo6hVKc|N0$YCl!LdUI#kVAnjLm$KO9E%mTH1H1ii|dWrj7dC`Gn5SpV~ z;f?oCLAw7JFgEry+`O}q4v!2rQdqZU*Piwrt+`gKl_gjI`M>?+l|6g*wBLXK{YChK zCC`ZK3zL%1KKrbC>C&ZM*bPfdiNm^?uQ1joRBe3gzL@#$J#hD7Tel*2i5N)#1|N7Z=Lu8ius=swuLF0J%sHcW7l7CT%^M^ zZ@64jS296khLy+B2bG-m8^A=Es7V1$)<=Ss#Ioc(iNSK1EJ+jGzS;N1wcrQ7S$gu< zkfbBMre5fipP#LxEEB``?zs_8D;+S5ErwWz)>+l~v-x#FxaGN&Yh2DP-C?!01%L|& z>I&Y&cfOBN9$|vmZQRP}PH0_7;1C6ME2PT(6))e$TzBcT@3q=mZBap@-$hFwhqj0i zV&VPa)`xy3xEze^VE|WY5mwmC&d5ZbyJOeOb4ho7uqFiJ(o1JOy5nwFR)|K1=9uep z^3ea{0v9sl+Mh$@Ts4t=nAZ_=;hxWYCP;8AaT)H&RP+LBh53&zV;nm-{c`wB3#w8%im?i?H0 zhQMm>xS2B^2=81{)&QM6g?83}+Q4e4G*-jgADo82`=^)T;Ae}_7_2AFp@G`?*yP0e z&6{uBuzuZ+w4JV0SIM7!_F4CS>lYw>Q2~JJ-~HX+jqbho-WzVd_0HSZZQQzU-NtnT zXD_yr|Ng=|@WY?}9v1Q@jI7)MiyfueSK3Q-`p4QTMIhyQ$58+@6Iohyj99S1D>wd9 zm~8dFC=B^`5_?IZc3R|@7e~P3CwmQ+Oo4M?d8C-K7=bfbf3f}kNQ9WqAkg6n!rh1! z*VbM5&!U28w-h@>oCDn22=Yt)UZMX=zvp#}T5YmA!fc`azJ-FAJM)H5f65>M0qnOo z$et6Q(2SWkwi2;kV&m;HXVLi!Yz0mHIi#Jw*NnOyy}EqFIIx$s)q`BG^bzV;y*ka9 z2U;)2(K&?ZppWfi#A#3~W7^R#;~7l~o$oCiSu9KcAV9J0S=qWY*INqwIc4Awtl}FV zY~*8_7&X@(~*v|WUOmFSLe7+h>~8R){B4gaUsRT(eRO?bavNv#9q*#c*-{KNcEd!>i7 z-E_6AA4wrBGLv)t*5EixkSEGEfShg5g1gvOIu#M2gj`t;@v%h0W28%_4+YJycQ(U^w;^UXfaq!*FrxezvDW-#pXy($-Vwz zORyW4Y*T|Z`K#5eck$LyAJ7MEMt@B^urT0(b?KYs8)T`6;^mm}{Cib8<0)yK0W|rU z1d*8ERbyX)#a04CBWnRFrT1w)?3kzVY~-ci;cjwVSrCZ^JJsD|+z zt%%*q=2`=phG~;O5pvHIDwronyN9TVV_i^alKs#!>P~1qUz zp0+Hz-^|)EQj7(O?f!5De6w#k92+xYLK|c6MWZ>f#UDjDC&SH2bLZlih#o9yOhdE? zfB*m4`>$xrj_W`W+~@k|UAkw|8vvOJ4-g;>34#DgiBy%kOH}pDl<8T$W@*j*&a5^4 zGbPsNe9o%=((m+|ZZ*0~s**&Jlt_`HrwBt>f&k%xgvm@G?Q_@63bP~j-m&AHb6+MX zLe)V&m7N0VY(0n#ETvjin9uuY2W#Bd-KM2tk>a%23n{ZpI?;b9c?6t9uy6Pg_Q zCy@<_eCkz1Prs>0T<1A>e1gb3{*1e*7>;Bih_K#B@cPK-GdVP9L&De)V1r=BSBUY} z(l6%hNogmOp~6i$G-4w3j?EIz@2~j_xgIF&qC(E(C&`m!E|}yxU9|i}7-$AeN2|>d z8n5c&?K-2vMgna10ouJKfPMqM{+%bF*K5MR`NLab*X(p_3HB`U0-N!FnxbQ9jY+ZZi#@~+ePssq#IC=79>+IRH3x^LMzv)ZA`@3Jb`S$xBK6d=( zV-vG8(|`H5&o%!18&APUR|@FNEJ1%X0fRvknhlfjzv<6J<`u-`F3`*%@cqGn-~ah> z7s(u@!e16|9pRvcUwLL2l>}@Ul`dN|?qX%5C!te3WXiSE zY&KKI6dKMOld#0hu&zaCR7(ZobT0g%HN^R-2(^gl31rFv=0s?yV~C?nUB1JaZaUuF zRZ%Le{3+CU-kB(|Y~PHpL?*a3Mx8qEik6}%5R^bNUvX|0*9h}5_!mQ4Le@!3l)jik zWWEnagK&LN?p0I@Y%T#WoT{oDUgZ@Oe4js%cvIMNEA*HCOXnZjFEb2^u^@ajLnl=n z>D$W|NOMY~j}Cj8c&=E3=>RSCRO zm}n)Zd{)(u%67zCd|uUNG)(79q>pJui3`q%ruD;((9xNpkI6g>MjE8)l9mw#+S|F^ zccJW4M@dyFOfXn)s)K0p3?HaxZwi47ZE82U$856liPwal!pT`Nc7kGv~4$ zY0&rfgk-TQalqcFleu2jH_GIhAZBve5C?(yjId{NlaJz%u+`wLJsSxgn5?rGe8bsy zKPXhT^G4vje&QN#*u8D`B;{4Xs8Qmq!f~T)7msIUoHoP(6%x4?T67c1wSv6V(-FjX zZGKvbxTxqh_7P#!^no3liTZBBaMXuJV-gzeCTwnP!Z*J26ioC6@NfR*r;6U>OmFY% z!PVPGqx)dkG%zl{_nq%N{;5xW>ixg@o4?txsp3B2<)4ZHp!n)nzuJ22vB&1_yyu>q z9{Jrbec|TY@A=&6+fSaDoSmKd@snp;fA&|;!mr=B1k(!#Vc47k7&M_Uq5nnGg@i<{ zz#~X%U804_ddhjF816(BzxYNSK|U{hJE~#ZbjO|DXJ*mo%5mi7I37O^{2qikw`ovd zp?k-$Oy`*ML_c`xoRtkh7sXR#GzbUp>A@*DZWurk^->9YlHA374l5wN@g$pX2`m}2 z_XFbVhwUIyb*>SYaLZFreZ?}rm()h%G_>7H<;(6!+>8S~IL?y-TO&ont&aGe-ujtBw5XC%47ewdstKSZk zuDZ3sMMVR-FH>bi z@N9}-B1tg4_BKF~3mHj&9+Sj0HLC!fcfuKocNcjCl?4!;kn3{SEjNOo=){#cHk2&A zQDhTk?HFyc$%;v$SevlV8xj$gOsV31s^`W%e~Q~EM%CaNaH9%mMyhCFjgi5p5v!Ag zis>x@3}t+sST`mDj`B#>;7my=kprCPpS*AWhjdMnJpn_bSkeTNc-+EEeB992Ajj?O z$vl_16&(_Zk%jDdcW1qS(bCspwc<^cTjJQlwWCK#X;fHHy2A$ad@MZoX?>hrQ>Q9v{QLCZeia!e}Ik^eWPw*tlDFZC!#fD2%t^B!~i_H?t4U ze)t-E<2%2C#f1gc>{_Y;#!&N(o*& zORg!UN4!Ft3ch8O^MD^2`eX0v_E)WoX40af>NVo;SS7**qZib|;NqjkyyeYZJ8V9> z?BdZVH3mMh1&LqSk|g*k_89$HR&5B63hTI>mZfh9iHk4;Z>Ng`$r^eiJ{d5YCTJeW zB}KjEc73e>qSU8M?#T&hOuFoRJ{}7lODn z?iK4`WKxP~g6;W0c#-r0@fqP3hWwkU+&UGjI!?Qz5sSKHnk1h3#I(i-{J*!=%^igjM8DLO=NM40x92nL$rpy*rIq`&014FsO zod~BT&$Hv8!kYajO0Lw1&&G`P0^{|2NE~5ch7!5=RWB@2G?6jO0R%cxr36IJ2ntLX zHL+6xn+t9@m+Sz-GYvXU}F&NrDrycZn9>R}6i!@Xjf!ZfECZe}2D3E@g ztkOmJ9v>^ecb;w0ApCm~RnUO4J?|ZLWR4ll5Ch568k2ucY`4v$hWpFKv4#=%ZjH)5L49Pv7w57zn#&9r%_k8D4@}s#qvWk>A zUO^4UbWa!~%OITRFONiG5qSzerh`E2rm#pkJ+4VqJh_b~^qZMyVt&w+N30)o?kSsNQj@S4Fb}Mcm2%dW6zXIP`TYm2a@>h24 zrJO4ogUC@%IzNe%NwgxB3kh$Ca4UQ-&VaMsA40c13+>)Eyz$Pv@TY(N6iiNZiu>-` zS9GRkCs+3$UW3u_{?VXO3lt#jwjy+0a_1_ejNPfYnF8vqIe^aBSDbUU5t zeGfkJ$OCuWdGF^ApE!PEW?^pr(q^;y&F{VpU;p+K(CqAmR&N(<4QwouGXM-CV!1me zL$jsfRJ4RmM$c&zgbnA0t)fwGsqzzI?Q-iDDs>de{hj2#7c%;+2%0DWGQ%<>T#;j> zVVUlE$W%(;hspk|Kpw)x>3OF(0KCr_g$YT3=}e?TmV=>uZrk->hst8*o zt%u_e92Pjzk`nGlrPp1>#42H)f^chSh`5QN$_O*_UmN!2+j05s{O`PlaOS*B;BhGH z64Fus0lV5f{OHH+vxSdrLLh0Nf+Qz^6yOopxzU0!*TBSu-5GzUmVU%3%*N~)5V^9} zhYv@Xvn1jqnLFaVJ@l0@?l=f8!-R#dGzCv+hm6rUzR?RkmO~L!R(PJDGg+M^41i|UN z^@vl!m@2N`V-?PE+Wl(WUk0{Z8L77KLc zNmU;A$Ry1D-{!m3`4P?}n>N|IF4|SYBXewk3%`*K#Ql$%v1tOWnApqBOowMIl8)z$ z9}bSxFeUdE?*ny6q}gHWSXFUEvz~3TVGa`uXAHq5N0dSjAt@Oie~WyKzT@6&B+*Q` zUM{qo;4jXZe7Cop_@rGrJn5uK8$ns9C;#gFHLg|g*vg|JexK1~wq~pr7s;H_%b$29 zN%GLJhQT1}*T%1}i)!Q?DJUcMip60(FCIw=fm!62VFd_2mebfWC60`Wv=jI&F@hoO zvok3GnjY8fd2sW*>CXIH$Bqpcb+VU%pSDIUM+@c`v0(tXcYRVwi>M@&9cw_gu zX@lPRuH4E)@zHYMpmb8ONoqr6MIsNx-zaPq8bF*{4j(z~LUBCqH`>2X>WAM-@I8*o z{f2?{K?b*gM+`DY3Vg&1CNB>7B*uq)A;XJMZe(L2yg107o`<86FYHqyGpQbU+P2?Q z>?neK18E<5kJ5W87h6^o>ieiA)I`G4ARqKJkrHacuSdR)>&wvACT#Zy(CExT3r6td zGjGA%+>0om8Dsi{4y2lwAP8hmmn`oh*7gX^*%AaXQJMBD*E0N0J*FCL35tZ4y;UH{mSgNI&GSQ_ z$uSzi4|AYIUc!w6xqYVX&#JLu2Z6r(`R3lt@)^pZa7zoN701N(Wo90A3c^M5>fD$) z>oPI{3WF7}tI1mJdmSB%3$lko{Jwu9*r=gasd80 zrJeI&s@QQ^Bb5)s`SwH(Ha@mS$S)$Fqals=LGUDy0-C2G8gtXrH1e9$6xPVwrQuxC zA}-g;^~ij&j36e#E-Sh9q+>37hef*(gIBt4&Ty`=bM-eN9#S|^^HX^4JUw|mA;))p z{s%EZwT*O)(QrqN?SX9K|H%54$#Dg}Nx;(91`LMAFxG=sZxNakd*S;(djgxXc9=P|8eJe+f?pr%J1MPP6hd+B4{_{7Vg16qg46}>-VE|p&9vFNuiT@fdaR*a2 z2obfqYMx1lV)r}Es_H$i{NNh9` zQfh+mPX!}#KgP?rb;c?@XtpSK&R?tIL)UmmFOzRc8<;3X5;lDZw4k>kyh02`nq`}h zCvDOD(b%sR4~0-v4hGkEArjhD78EK}IE!)mgo+$wIOm}~4VdBq{e{9nG(kRF&zAXE zmJLiPuTSt)q1Si^ zHP$T$Zko2aMqG zw^`IKbT3rFNqQ^8B+3o5F2P>8A&%}br!*pXow1o^fuDJRfEr> zp~L4#u(Hh1Lj;W`w$aqNQ%Y}=-^t{J5kEL}5+3f4dIdZ}Jw)s+G+45IkTZf1T}G?I z#Rak;4V5j*NFE&!qtLjGziPCsA)r5O!sP5;*ci0n`#=39{HJfc2p6t4p*J|Z^wa@!qu+3 z$kAiRZkV2%pM3V^^UeS9fBqr7d1eEq7uR3_lQ1-jzo$ela>k)W2!W;!`;ZkmCw#;# zo_5cLY|4amN{bycA|MviER|T7dnb74m(;DJV&Upz=2c|+>1MWxgo5?e_krPs{<@kt zFB}iq#0ED0+CDoUA2Jw8ZanW3hyxikjg)Z9AS9Y#1rF7`kwq>+glSblYiN{^5*3BP z7NLsg#a&37QlCf&jtKJX_te9P4YO?6VZOc}hBv4jdr!0txAQRbw;)IYPw_R#C*=P1 zfNzy>B*F$;i|mdF0AcE*#W57dX{bNWPm*SzAA<=I5f=2v_%;uh5Aep})1w~9%v5F4 zpINj=62jCuZsPjUW1=CPjGRp;?}Sh_`y?i=qQZ&2S%Z#+?w2G=qWZcqHsG+f^17~M zYQ+2K!saCHk)_}RjU#p${77hGE(sC6q7Lz$RUkA7vtpAFNyK=WH-qi@_&rPz z86)$!r_lL08{)ANI7r8V%3Cme#9Spopf2HcOni-mKMW&!%Eg+>cH-GQ^||biOd`T0 z@c_n1webxA=wbAbpix0VZsE5VV3gdrCFTqv&IrbB8)g22X_G%9#~zGix*y}z|2 z0`A%qjZ2Ta=^*cxiSlZY4H^H4$5lKPCA`Wuf*7g*0RR9=L_t)w8F)Y0zwR-;DmjK| zv$YRoCrXx1eu+0NAWaLGw%Y$Yqd?3LBgf8fS1N-Q?H@%)J`YkzHsDBWm3Cd@ey`bk z42jIn`;H<7r7tnrAL6Tooukk3s4L3pY`B76@jZmFmGsgdKMJy>KZ=0wHE4uzq|-^n z6Y5;D&}d1K?UhD_1UXBQxgeay}A#JP@ zml2jVB@C0D*tZZ)R$0^pqqNX)yO{JR!Y!;GOFEf>4>HG!P(#`W8in|L%aduTLNZG- z6!%kEXjjr6UT3DPb3q~+7;J-3k>;$>#;V~BWyGY(q<#RC=v!E1*uKYPUwAzZR&r-E zN458LU89$)TmD>Yeobg}>4> z^hAshULbJ^AIWhGHIz60jeKUM0&YeJw+Xsv;hKZ>Rrm;iJ@ zi@$eJ%Ju+V6Ll<7$qRE*)NOLLqCQ-C&6WQ(L>y9~IE549V}u*0>uN&1G2nwnSrqcK z`;+1=5n`&~tp0{FL?HfNc3`}cj{#>)&#ucgOxD!Mf>bP$xKF;bHiR;v8HF4ziu)09 zmt>R(A@k;}yUUH_-}50jRXi+L0=*+`pbUh^F0?jisCHhS;^FpDp;zFHc%SQNdVT%bix)3m@I>j_gsR_AX?@a?{@rxbP3_B<`@0_g(j)iYedmLZ-gxTvTlO8; zyZeKWTAgox`z83!_n(JhYZtU9mSB6(gn_xz!b(i27?8V4Q9$*Z#wG0VNEEw`d^UJS z$eoI* zmHrUB#(oX>;=SzJ+ZNV%e=_k9P@$RT0i?!~#43$uYvO{55d_qW5QojCKxJ^X5-Kas z(;v@6QoWaC)x{dA3=?P#%`1>Alp)7`8SyTCo(er$VL~p>KNyJ|%?U;$rh6i-q{$8G zJW?f`3KAHFgCWgfokMMYr?l-V+;1#A4kRju(K1X*MU@xVfS;#Sx(PhJz!i)N$y%gv z4!;ZdqVN{!u@LaszLAK+g-1SC(yxtp5jZ|{!ZixfEIYlwo;8dIkI4}_8tNiIL$|3A zAI1=YuWtCTMVO-GcZ|5!3)ed}97bwcRk%{eR)$3I#JngJrj*yA?1xk0U@*cpZQs|h zNmC=(FdQTB19HE8(24orJwG7Ir%b$g5}(S9iyUW(Tp)0>N>Gp8 zM?)SaK||$Kbq3TmpeneFUQ?@VhD`PZp9B5D&b;@T@Ro$n1e}VrhAAI*?Mbd4y!O;1 zS}~@=qtOis>Ga|_FHi6vBA*aO$Dn+Ygmgd>vj#aNta$-LObG3(ha4G!9mn@w@I99c z-Eauq59>zgWljgJ`&y?=uNx< zhrbi&%%&DVg1pT9fQkH^Tp9DU#0cMj6;w8%hM{0^B$(sz#vOmcd3Zyy*O}Oyarx~AE)>CEz zjauit5+Uo_OI{I<0whQDsMOLiq)qrt&N3Mg{zqyaM1PDVC_b>nNMMgMcKCBScw8V; zw4gS9-q?FaDG3e5GkTE-`>>9LWt z&;yKlP})qcY&PPHqM(-*^$cQQBK1j+#cy}DL3w|<$Ie{uKWooR+O!@R!i%WDpd~`H zd^BdCbwAO>MZPo&w>NBkY*+{?I6Nf*DOSs#iT+0{(F7C!)s@!#u8vrOQm0HHS(IZB zvFEU(rHNcb)+LWX9)E}t;5Sr^V3n%$AJZ886jR|dDv-f2ib|4)SvVUj6uGcoY|w;} zu+GUG8x6ZZFkc5N=z(IM-Ap2z>yaLVjZtXGtP};vz%A}ODL3-J|jli{842}m=NVq;R;cpK1#?|#rEmZ zbeC)e!u53j(V z|Mj!*!AC=r6tKClYxmUh^1&m=Z@BT6*@fw~GiT0Be)!>sB-zk!cWHc*vi=uE(Vgqg z?Y`%pyKY!rIdW)q|Jq#9>9v3U)Rp3|{`M(&>-{URu=@z~M_uR-O?XjTY#j~LyyaDF zvq<3dU8;o+$>-8ybuC3}0^5#OORE1UW0EHo>v$4TVPv5_k@zytkl+8|wM_f?YaO_R z_Cx|jx<1rMua&Yj;4rLTwD)4D7>Ah@vgv!#n3@TvjK5%`sW>Wy!E3=cl7!3di!l?! z+ffFEtbAd#5H<@NAKpvhN8w6^=G0=3l~RQnJ*hBbcvX2} zpyT{LXAM^vekn7|(s4V9`XTN03%$X{?_Qc$25VLIO9fwsfBJ1i(c2$(KFj-(^p=T0 z!k_q>#y;pD|7~ZqL!-m;Sq=|#^w_mT_sw|xEzYmrehE<$>4W6dmwx0WrH2>+g}-wd zAO{PY%PF-$=in&UR4WdzeEp1U>E?$)4)J(TA}1rCSLhV;(&GOZu6g4hCLu)SlSXDz z^S9hbxDQFrg)9#Vzw^3OZp+DGIT&7Rsoe&!K&h-=|a|*+ZE31l{md{>U`T zjlI5AD*M~-ss2k1k8I8vIwNsR_FZ?4Gp(178n1ryV|;L1i5zW_FMgSAOW^)_(v16VC zXXGUJKnFg93W)E|TlU|YxVC?|;XRcR!rc5vypKJ?f~Thn zc<5(kji5g4KjIoWF;0$9xT*U#gRaPFi{#ag2BzUMah+1WOO;y=Gp<-@0(%1AOv$~A z#U7=yky<(Bm*-@VV-EY?!^g@D1kP+3!{QOG-{dF3_V6egAAxU&DEQ%s8RncK_)n6> zx_4s|)-aTsss!iTZY+&P(|;H1hWpC@7x^ykaeOB+Mh7-HO2hSyB9C&9At?i&bH(pV z%C}4(gMo{Z4m88eJskN8S*nS(h2W%ZGv?zlBABHSp7l9-2xZ!MWn>yFMk z*wOqEB~TZ@$^GV_oR%QL5#&r4oEwYKSQ~MZdd%?{3zaovBx$6d0R~=<47!Ftjzsh4 zaNgke0Le3gw@Ek}L}aLBi~4y6-HhBo5%vJ)?#LPUM`O??MW+z;3u=&}-_4bPn2>YS zg6;kgW)}{?*$Z#OfBgCn;o$z=#XYyqz|{QQ#ICKi!*_k^zK7SZtZ#nnTi+foG!|Za z<&{@1n-pX4TUHu{FR`mF!t>?~_gvp9()Xo2A>h?OuE@;z%=swq&$7bp`?6|x** zN}f}OXNUowVGKgl&IMMjZ@!sxR(&bh~k!9(rn_*y1=4`PdBvKrcziIPk-UKJXG2xI}Zj&}J+|CO;IbuoeT~7YiLryig z;9EM)rb?^K8{wI`PkdyV6eh$JeaX!&RvP6ZlOjs{l z%fP^5-jRS5?EO66BOi~tV3{(gdp|Vgr9Lf^$-*dS*MxO^&c`XoE$N*)rmO-(=A|Bq z;@7ic-Q2zkZ+c}r%%UXu8~sfRm^t`rbIz?z9PjvaS*`~ayqS>;_f2xv)>s3CXH?w1 zUYh7h)X_XHZW~ZoxL>I-MwMjEqvVA9Gpf+iT_MJhd#?#j?#k6fMnx|xDW7DY19FjlW9D&t06 zqUV(nx`7w6F^D~le1}AKSVc!f2+=(d;7E8A!!e=pF-*iOg2t(0wLdpDf6Ejqp>$|*9imesu~k&i?+6PwT3Ijm zPHJc&z}Z1T{4C$I8f}U)PtkH~hqz*oJD^RW(43Q)XCk8{OWgAR6)H+F0t7mb`B}Up zDH;Y?>%47|G}1luxoF0KNq!&jQaRUAm@T{EVK{0-vo#AvdmY|7^Bz3*=ii6<*?Wpx zPcIdl>$?_C+;sZpfypS|Xu;on^IN8oR{-FOAKSGnSpS6@02)`X!u%tj{oUK|d+^~$ z@3`x(dshzbU)vh>df)rWOU1Xo`y31#^U&?>f_~rJ;pn`x(W{Uu@d`f|34WwNnU*N$ zlrf?4Gi}FYU()(W?$Q*5kk;a7Txr6TVH7f?U`aE=1SW`g2P*-|(TqN3NtKtV1g8R0 zcq(4{DAQ%T76}P(RDg|L|Kdl*+ z&=8B`>2ws9*=wbUMARsfb0m29#@%eJtCCG+iht(7CWQ*}(+>7K_8;g~mT8St(Hs9| zyg{Y0F*&9D9R+p7`?BJ;1m$zO;*P(dfS)8T6@V+icrY~$oP0$5txemt5v3*cnpr=p zat9dZg^Os-Q+keLCj_*PL7dVO+dsl${6dX2b%btwCw99t`ov|a)Ob*LET!W__|oL< zLX3&x5$R8M%}7EyUTVDFdbraj$#QeqC|`tjS5~i1sR83)bo2B&?mMkNl2eN&R21!D za!oX3F-AxYCJ8Xn@P)ENZVDudfEg+gw-QNXOgt8M)+vSdNo+@2O_kpwoeA)vc;aP> zBqt6!e46PxX$r7gi}<>O0`dSlmgofWK^V?}BXpH0$!W9nSKE?EHLe@PBz*PCxNBBj zh5=^e8eS-1s}Iob&BL(h!_S`lHLR}A!@}b2u(E5m)$JBb$8Q|o>VkepTR;4MbG;~v z*S`i|Gui0=cLTr>F=ZFioy>Ga*JhYl}K%+2+_{iFAbzy8}-;loP}n3`XJ zqB#MBfeCab=VJs>a7Y)~wk!H^O|8=^;a~*BE+=8dxb>=zTpT=nO(A^e9Q`=zg(6 zu8@nO0!t$T$+b;vEpV@-Fb*U3NT{dl)JmM0ojUeO0%z!X{zOP%cNu#j0}ThbhQZ4j zjVE!nNm#F(6P}x-CFS4+^<&n(`7V6Y zg;LTHljL}a_I{wT=X$lD05LXfsX{7cdHclf~ypVE$OvCg2uJ; zl#OsZ97^VPU`FtwxnuDLAL=2a>tu=vB@Wle3PWM!i774OMZ=FY;wa9O+^?O`P8MSp z;pT``*y3V4pieJce-&s)*`5`Gd;FP;-_p>To3oTts^|reXeq6lec!#8zga-Mk>cS~+D!3ZM4Yk6O!5&x0wUe5#!o;br+kgpUi(2ZvdScaoP@`@dbmWZ;`I5E`@kE-| z#mHP0J~Dyjju$sfQovc*-d=~l{oc#4FgFGN>JM%%THVR^?!BuE!~XW^3l}~*|J?J> zz4YTBeE0q5AAA0CUYq*IEx)yi3jX+y|JaPJGchr-aQfuQ0|yQqI<#+fb$6pTJMrfG z(D?e_JOR)A@(q}rTZJJ^!uG&eYD{>uP6Vr!Z+`Y)h5}K~2E99#GeG@&-S9+OHygg< zX^w7vCG~t#CrZra2;^Bbtj9xow1Jvk&z1i=CBR{%hwbF%Tn6WOZ#98+rhmu(%kh93 zA=r34F=XdwRiz{qnoLBBA)>*<5Cji=o=e2U+p)7`%8bSy;#_b*2qR;KPw+6K9AyQ+ zDqM~Ofa>DT{=0ek`krYa^A5O}84iUL#Vz}to#9VCJ0UYa>C1>A)&OCIlBPMj;RGa` zMS&<8W%HA3hXQ2?E%W2F{%^A;WL+fwxw`cQ^14N%OVKM*9%ifJoy-hflBg#z-_Za@ z_O8sdb?sf9j^-0y;e0fF)o6-V>e6oBCmBBqNaDWj@;UieF#%sj3B<@L_ebE6(QktS z&DN<=(r$h&H5$eDS3U_@^!`iZf#X?pFARo*$|SD%Z{!8_N)Y-==wH4)XB8l~wg6+}w3@#8Ydo*|UGCoD}-V z^oCgeDVJEH%Rj+Du(Ia(u)E^G`o{9M-yqzp~lb4JsF zyK*-OT`|-Q5H7c4D(^K8a>G{Rg{c8t~96Ne=wmZA~ zmH+n-y71Mn{#NSRzpY0Aiog8JzcjIbvnOx9`G!XydGw)`{l{+JwR~{y@+P$Ymp}gz zJpRm^P;};@XidX#(Dn+vOHR=!BEfNmY#de5Oz*#?IK`DZwBW}OeSDrHfXU>@hQ<5e z9RbY)L=w56h|oGjxbRM)i0Js)pUZJ)bBLMNe@^E>LTUY7+*E0E+dK-p$++nkjAB<9 zV;RgCq4#IU9N36(91N#Ck%uH|>DhMAn8KMVmy9YQDn4AT(C)+~|3TrFpG8k&Xr&w& znGdc>ykFQRBEkF(#-i)Jtic!&?r{~Cg)AIR6oVl83c1@^&qbZ{!ev~6E%9shs z2p%}HO~+8VOYno zw!U4TK-5lOCKT}<?w2+5hI4BKf<7fZAf1yzKF0O zYCY|ptfOy(g~9OsSx0e-dz-?X(g&X07ZoXLcyR4#xohfWo==REQeh^vl8%eN;^`|D zTc~kd)OBkUamvlx3;h8PDDTtYCvY{9Vd&oAFm_{5kb^ad_rCLSCe;EyBu|oY(lLg$ zVog&VCdvKSI9+nDDC?n&BU{nO;rLV>PcWQ%al-QDC=?J+EhFr)FClkHTsN|zGj1Vk z_K|C(sVY3>wmI(5qCAqqRnFgm3HO_e_M&?P`8OK3sq*Jiv?_dv@UoZ7$UMXHNuttOW}=uYP?v=C{#W*_s@slFqZ{w+x!p7 zafo^EJjF4;7zCo9Y`B_+}(ArD}v?)~HK6 z3b3VTcQ_8`=m)3il&;hFi$Dk5gOsLu$hkz?7A|JuZHuv!bNk@6x6ieneD$keZG8LN z-=4Vtv-cl+@cz#~eEODqA3S=)kwb$m8U~T!F1Y6JX?${)Kg> z^gh#vX4Nh$G%1Dl9_mcFk|VO?Si0i*8-mQ%Vd@Yalcv#(uC6xCQckjX2Z1ecDZKLq zsVsKP#+-6WA=D^>4~|1)bdnGx)_76ezIDILtkV*jy7Ck2#^F~VbWIW_hWTNdSQD8u00vh9}66m*I z99}@ga$z}6DJQJe<1Z-GYen-k$R3Dj>tV-*V&6~}_L!eV&VdR^PO#Ms=TR-suPn`& zt|<6?1{qj*lV8SbYeWCZHEmK6m3^`CV{%Y&2qo==&}MAU_G_%5gRx`y0__iYhWr3; zkTD^?WZYgzqFLp`9K~?i)XUa>48l=|KcX70^yu7>PXw;-mnVbJF` zVH(1s;Uc{ZAW4Ec-WGn2$y+7eWJVEGV*RyvIxUbr?X(zWZv4cTd?fjI!}cxN8ZKcZ zPd*n=Ex^kewFaYszlo?&*2HEBbm8V!=}uUwuguG0GNCLzcuBz(g5(}lTWtJpFcly?9j0rPoBQ@-nB!=j_g|A zJN472&o=(-ubzSrFSel5TY^!e2g89497?Qkar37eTZVazOO|znEhng2|60^Q>81$h zlj#de_u|Y`fQ`Qb${GF0nY*BTV8V+?KCCr1L=%Xy2(KN51RWY1Yf)E`(P0v-?-dEY zDv7NS7OBCctRP-dRZV(aLp>B0NDi;4_(md6M&aJY|Ar$I?oE0|j>F3dGN|^%sijJ4 z0u#+3Q!;-yrSe=0XlRlRF+op}`huq^%!$p=Pi2&P`A8_N9G2Zo zJk6yvN^3tDGUIPvCy0DJ@#c~<=~~I)U+L5p+$=NT)+vbCa)oszk)Wa{M$>GB1ls=NZ()OwLdT4~)G=J~+iG~84xL_$y~sx&>d|*9 z(cXWLQ37-xP1xEVL1$tS23te;>%aXu96c~m?ETyk=*`S@_cRVHAG>ntu5)M4zw`Hh z|939~z=i+a08m|;8=cP7;kC8Zy{m_h?p-~wJiRnO^Va*&`p)-X9Xo75M5E|VD z*xEK0FqiQ^s${0%#)$&CQ%ZDUArP!=@r$krO1?k(H78JD8^IDy2&jFBgiIN0sk@rR zEABQF*L%f+;kv=^jJELX9^4r{WO z{#Wm&$KM1Kr4pYk*M-k(R~xQssauVtx%>19_D!$Q-dPyi*?eLMeSEf>2b5V)!n7 z&n7xTHwPw+3Q-QRO__8J;fzWvhJ)5A8t=tp5x5XlbF|0j$Zr_pinrbbe2lI7e#*St zdBx1~gy3L^^d*c5_dJn{&3LQ_k*+jNx1!)~5v*(j^PQI4-|m z+0hDI1C}^38WW?u=K6JdMC{s%f}Vf`$oV}MS&wIup67?;_lG(|ltDgNga2J$v>aJaFjr>01xJ@WQj_&YnHnAB{%+-De z49F*2+uQrU@caMu{ikof>)t)fhxc}-W;=iO=TE`ke)ktetG5e^_8dT?YvPK0=3wnE zbuLoLO{jT|*g!;k_?xumX(iVe`@LfM<@hvDChNmh48N&N#3MTFZ@vuR&=bMBtMFX0Jxehb3VJf_b_caip1%bep;)H_(VfsNVN(rtt zOgZVn@o1&PAOK+RRO!;jN7}Gwuv5E$>_?h%2ewPL_F5JcaC);FDBGz;{-uPT=L(np>NZBMsBs(xSSe2h~jn7d5 zaSBT??m5Xn5!4irdVCZ4OsvqFxn?vdHoR>-P9@PtDliE59IfKth4N66+%oh<6lA37 zHfy#wT2fk|DOA{TAX!2{&Gw7+sWDN}y;z@K(M3UVq$n_Xqe$jA@fZa*-#dH9X44P} z3^lsy*j<$D(><2%ONnxU76v0pGK~OtW~f93b0<7XfCCMTEK!>s%h2Kpo>{d9b0f{- z9`%ZE6|a@wCB3VXp`_fCtA_<085EzX(pm}=FL&f*q(HAN&x(d^Yvc}=b62dgYHf(9 z?Z+`>_c>9ZDU5OoygJSh1yUV7MCDMLIFpVI4X5#$l%qVKwu)ssH&lA@U6+T5D(vzd z`Ww=!hRfN6M+8)PE-y2y@HVtBHpZP?URjL>taz1b9hl0J(t#+aAbwK0Q`RrrGotrk zw4hOmR3_5I47yKjP8vdsD4oY-vNoTTZ#c+h=(s~#CU`vJS1{(qArT%M=jrS~a3oLSS-y|Lx0~eUO2O?NSdsq}Ma$d^2GE>^iK#vCP%#|!e z)_(R0Qi$WmZg~k3=X2$Xwe*e5Xc%zy&|6;_TAQGO5@ zfF3MzMIN^0l2LhFr$!HvVuB`fqiwJy34rv3T_$>C_aRe(jkM>lN~C~`^Q4goVu9#% z{eRrfD?@HnuHzmnQCY>S^tV(Ar(Ot54n>pQ)G@flHhnKtku9Ni$ujH8gtP2pCiKso_72VZjL+|n->ndP}7p1@Ap zl!dLhww??QI{cC-2c)0mT3y`AvHekcZ7F?%Kof=oJ~mWL^?`*ICx#=DKFj@A5yUm+ zKWmV_j)mic#2!y;nXwmzeVs1Iwwd=%7)(NoUfyy>xd^F*C*c0AF`qhxu-zT215{zB za$+1$RpYpW5dFxe52$9`{(k>?!->64&hvLJAc@FRmIKH2C;d%y>?jj4Zl6TV`EN|o z=LIn-$E!7*=Wj;%jDzx0d5yoPifB3p8EzJNCmU6uzj6aaydEV~QqDs8Hau5eX&>pn7OYqw5SdVn4*SPhnX$ z&+Ju%xTQrT3bq|1H0TwIx`18tuk&xmUur@@T4Wi&qMYuL87-&1(R z@uWLOm!A|~8=^uzZjxN*MUYW4g%RJhFAGI`45SI$gBHv#9)dF;Y{OrC<7e>d+m`@Z z?Z*7luIaS{hYp`QdCNVA4js7R+_`fz&pr2?_tyR6mey}e*8e~Gla=nw%*>u6$4?&F zw{md*-nG5+m$#aopFZ(k<0ntN1eeyEFt@Y|Hv7#G&SuVQu6gpr`Nf_B3LWhLI5=6widBHHU;=N-tJ2?u=xUwb%FQp=w79=Y>mdO`T%y|g)Ii~^MGSBBHkHmFyf&R)VbEBFd&l7>&=^PpsU0$GQ5 zVc3^TCKksWNN0v9=h~*%(Utb=&*xfv6Pc95ng3uMQH0{mA|^Wp!Q=Y~z6yF>9erPT z+~S<{JI`rV4L7pyB*l%3Uzavs!K;T*@CkEfUVctj#_b0gdJJ8};}S8Sfxh=s?*u0& zLI6fMP%DUsZK{vs`AK)bG*>d*fu(c~J1y>h}OA_sWO{4R;BOP?SCf)6)fJB`GVKp z=?0Z_P|;BA2NrlURr-T6YIvm`Gv0IV@Sa}pjPs+4jl_v$7~^_9*t>2blEzoRhjs0L zRa|f_>zx+L@jlE?V%=-#Ww))nya0_RJzn7X2r8NQ8L5cOu|f;GeFtx+@-U!BI+aA4 z(y&QZEy(Fww2g#|GN_iHG&xZC`et@Xh z$D3bxp*MDDh9;fI)aM~}O4%A}^Hlpqwk+EQULUJcUS|0(bq1T8ctVs!0fSK!I_()4 z6c^y7*U!T@{_X{s{k@xu{d;Cwn;TbW_N}ZeA3S{c$lBq3`ybl3eE7)R?tPO_KKp*-&;II%aB-sn-N_{w49#%S3y93k z3p_p?DIg;`zJ>RubLE#<+U!Ci_dp3aTGnD*OjJVSrmV*l-MF;r(>i2$Y`m!8H&T6y zWDG??-U-<8JRP=2z0HxS`Cyij2(!a*b`~bi)GU<{X!Fkz$Q+}Su+)qrHUu+RXPqF3 zN$Xr_xbS+>;YL|a4<)j~5=KdI+|dYGqVUUkmJqKI!$*?r4ABwMk6PhrvOM3x5WU6b z9mk`yo-0huhDoV{5si#k8UccWMm{^e&SjF|LPnv4o}vdtGibTbX8qjV>Mns7+duyP zT7tsyh(XT#Gn9$r(v=A~=#6oh*oq##2tgnEF=zo>L@c9VJ7yYknu)y;g-r(NkVLG( zjyCZ3bER4!i5aA0z0`~3!to^oC%7M!L?V#+CJ+;nkX`=~k42!sTB0#4tyyETUkBNw&&V zM_N$9a&y5opfuZx_I_`$d??Hg!4=mO{v3C5@UAK}yq^mCJZb073(n2bA#xrx$CsjT z=zp{FhnGcyH;z;$NmjkBg(p)qM1mf<^Tq{o7)|9pfrp1gnhf(J?vOL^b!;ZlAeV>l zPK=MD1!C+o=f$1eC6x@e|1c?}V_XsElG9uM2pU}@|GOKvHzNnW#+@`H1uw#=!akO= zVt$@(9=uKb95^JAC28Wym^7Fa*5#;j?Ml}QjT}VYvdXt-wn!J84Cy=e`6OIj%){h< zM~9Rw)Ik;G9HJ+NF?t%ya#$(*QO=!x3dRVI6&hWpFp7Ny3=l_d38S+geFA9PrXKag ze=FZFR>?#ou5_xP>%%+19Ly1TsUCr}4B=q#$mX^o(_ktQCW{QTg5-;lbim82R#r}) z={(%_DUv(qiUvo`kf9lFnW31#1ZgtLs|9VJ4c@`ip+9EDjCIIbC zEWp;rCVcbTPrwaFR*Jp5*Pz*(?e5*Tf8VXQ+iB(Bimyk}h&NLN>-1v>7V(CszDtWCz}DDfX^!Y15O-`# z_7yz=i4dh_^JWa7VoLsYgD6BPH8U^gtg}3<9`kvyN)adNdlmpR3$-#_Vj!s%(GXx) z2;%@3QtIt*+?&drsTG4U>>#zX^~2D)sEduSOmPoZCL!J!MYH%zMvOBcDvTTz`84oe z{`6|Gos3JLpHz<1$SkI8h=T`Jq>UQ4G^N)jrYs$MdHb;D!#;fgt(w;JktcojEK=pJUf69)L-~OOxDJNrKetl*{ zqkBCj{8f{O>aB;J#za{~Ft2QB9Jt1goESmR;f`6xnyUXdW<#$(W+wk#Cs`#9%`qu= zJ!t0YkkX;zx#IXeImQ=imCreEERqHSx(BE*fOzTU5Hco|9cZ2;^Cxc%aebkj90g@; z&aw9NCYp~kK{}3A8g_DZ$v1!9C$JlEVzOb3oXYVaVxb}i1YM5eoJXUSRS>c*5IKWV z>$ruYrwFS`yi!rPBq@3JEh4kmE@a{woHV+QIGs8p>+SVIs1H%k#6*(rI~pxR20HUX zvkAk&5L)eNfYAcHclIOryC1v+2iB(G)Umn7`eyf}Rj~O(xe0p1&67`k0q;jNMAuEFMmi%Px?ajDx~M z9=%B9JO95bIUE^PIAdLJCV_vc)^qyJ?F|VtO(4NPn?+vf0|f=?;c?FqPc!3BfRNi* z_(v7(Ag1hqEW7tqoK??b6KtY#LPf+)cvbXq?Imr)8Qn_uR$0;TT~^tVEMC#5C=nlZ zVIuWfqy}1Amw9=G5S`+Fep5Obxq5wrcaF{+m47C(WRy^@9`bs`px~QLg&``~hCM?x zG7RCZQE0TmbwZ)>i!R;P+wU~Q7~>PddsKM$|0C_jwc|9M?R&D$_+r_fLnB1uIirf- zn9!@--<66$b%{8Tk4&I@lX3mp_@m1g5!drVmj+KRE9!fe8lUNKN2MN3zn{es9+?NE z3g9_oyE;(WKa*usywUg<`>tE!<2*$Fx}!K6D6W@7NgIE)CpnJWfkboAq0u^%`y+86 zmE)}2`*AS{bq%Yb8<(p~xHUvuqO!Ft)1TBiDD9V^ZK}lkb`%*Z?JNJB^X}4Sc%gL* z3_nd9FvkK%qrUss-;x1E69&U3G@4U3XWh@9`Zaw2$G?Wbr~%Dhx4pP;-~7QN$4=dJ z^7P$Pv%S^lpMQShYhU}?^+obef&su}{Wr@0($dnxt#{vjXnFtP!+Y1(c6BFbdvClw zYJBg9FTu;NeE^d)E6`|6!f;?hV~mx}gd8=kkCe(Gmiq=H6NZR+17=8$p((q0Wri`H zB%zvFaxi@Cr~^rX zIV(S1zXU;=LN7zO60c)UfFqOV?Med-IWE9FP4P#PkBY!8!V#GTp1bsKae;#g{?0;4 zqq(B8=miI6uX1&*(k$VP(HkTOLime7^7AwkaQD?m@DK)%b8zwZZi{JWAQ8pvF$5nn zB}zDN?laChJ6mC+C+VH*&U50AAkc^tgc)PjX79QEr!sEE#zzIKFgKr|#vXeNYwNGc z92&wt4D;uTopP3);s!~)OFe~rEZ$&)G{h}zAZJ#zu!@;eF@ zG4x-fixHc1dyvxFpwNV5hJ-GOG1&x`E(SPVN0pw?q(^Ztr-~(2#!@BN)sHlnuM-iw zSh6ii7x-9XJ+k|)V4wc6ceUT`7LB3qNZ&#(cQ4O@c@PtdQD?yKcZ&p zIt~gXh9sjW&uw3hKQ8!J8jm$xBC2hMUzqvWJH!>yv5LPiy5+;;<#RJk(?0f*6W-mr z5x#)$+apv)0E|b(T*R)2fu*bFNRyWl8u9pu-5FL`bXWAzbJ*CQ8?Ndq?%0BtUF`3kx7gdS zd>@|XxE#FYbU)qm^_1W;h2K|*4u~Yug0^A4I~^qAR{V|5N%rab^Y4cDL-#5#^W2!@ z9l4#xCaDfOL+bbphDjk~I5@ktsAFJJ_r2$Z?qUszmz04m2F?pO|)PZ(y5zbxQf}cI{20Zob zRcLhDjmgPwXL@#NZsp*?{WqLAab#wuv*%C#tdv_|V~#x9wRzFuye%wM+)Z=U#jlI+MF#SoB~pYQfL|AIyEzNRX(3Dqc|`lO^S? za(G`buS=C1iu}^s6UIOUYCxiJ13^9B!QLM%)o*6hIkH!o^Y{@*W(vk~eByeDc62HEI_zD9@s7sXM zWSIWWV~6Twzj%S&5b^MvFskHa4IBf#=UC!r95b$?lWwJeQ^#<|@Td$olyS;2X$BTL z4_Y(@vyK2k+m>r3=amDpM%(CjRoIHZ@Xy}p73mC6ZkEZUxjxFqANQW-Z1Qx4<|h&SIrNL)k+k?6 z4Rp=1eMhMxItIE*kAac#N!@`CGe`3EbwC$30aHPh*La$-G@xN?PG04hW_Q*q8EeK_CUQvj^wwb4sh$CE#67A=uo#4@? z@RP7)uY}_nRKQN(rvx?6wnqz1(&zPf`I_<)de7VoF~dBi53yI=-AR%|-eiE2ou|zm=e?s5*-8fG$Lo#>^+^Q8R?~r5^#x}6UV-+6;;gK(-Dl0ku$?K0)Aj3SO-kr7D+`@R+x~C z3Xza$>L}1sF$mE}tffq$M+<1hbSQEMC~d`Bb@p6NzR`y%lhtw_#*zgFoG58808J_? zQahEJ2wMuG3=v$=@EZ1as2FJpH41Ao zW7+zYts&C|7=;WK2rSAA9a8|3KyAN{_N9uhHf|c_qshJwzK+z8M09e@G{RLztFR3t z61$d_B)1LGbx0@WdI6{D)JV?^0A`lKLBsh9?IZFU^O-v*RQf`4aFy%Xg{Qm77vfD4 z%F5cSXG89yFmDr~K7y^mHcU(|!Ns#5!Ows3I{f^pv+&S8yNj8biPm6a*PfeBpS*ix z>*{7PY;S!3`+xTnpA@hU{{=(=)effwSVU9e}g1_QA+MSR<>|~&=&8R<6M#uWcI$dX5tkn$;Kz=z18mP zkeAq2PWdI0jQSob@uesA4DJ%)Hii!o{WI$!W1|vdQ)-l0-xFq{B;*G&NMj>%Zi3sVAcK2AF+>s3- zd^fFER?-kk|85Z0-1qojr43xOOpPL@3l@TvNY@dVrDPRgv+k#Yu2E)ONTX!1Au~2# zfcTtvcLc=<^%HBispUaV_o`DOBHXB~&d}ReQFmG7z6=)EQmTaBh+kr!HTss8f2H+W zcv$5zihWU`kvyc=F@UT`#fH2Pr#~-G-m0}1mF*1OVXepYcHzZUIa>G_nZktdvBz45 zHDIsoFokupH>!*pB43LJgG$`;ds4!&c9F`dZKOo%5A-+wrTwAsh;o5H-xU7RW{1SE zpsfS5_9MA5$r(1rW!9wmE<7EdfIXK1$Hm!xbU}ja$g_V_R{J z>r1IT@<-4q$@J(Sxqb&_3yjiGy|V0d8D+A`fYPs;JZHy2`vIFAO;(a#VK)>#&sCYB zweG&h`KRM0$7IXs@b%aWb=p8$LyhV9-7D_uVx;6qe8p?)#>?9w>oUhsiHftM;^l1T zNpFN>X1GMuv1DN5qAGPYwhmuUaf8drK}ImwUW((^|#hxV#*v3nC|XfUfp->_zid5aKrIi*4Nh;&5?Nc4VQlm13>ZQlTY>z z95}GNdhqDc-7EX|&CD%M4WQM0`uTT?zx%=Cu+^V{?!+Q&^$oJSunJ6eq*+2WZ$JH` z8($*;v5sjB&oPqlM0ueZ3!|bD1k#vL0SFO-Rp#lAVdb(Fe%P0djX;aPSD$F+Jn~wo zJPjX|&nfIRqK(hO`NM=!rNSXqTFTlTx0p6;I3~#w?!x)Af$MDTq~gJdP;q_2I-OD~ z1jbCxgg73ucN8lv9aFML2oB}P?TrCUu=gyd^wPmEKjjF}s275$Q9l6*{)5%3v0UQ(XH`F%RJ zsAmMZh|ze(s7j+Ne0aZgypXHIgW_6Yh(=zTgDLG_<5lTe4i#RQ%23oW9KuzkY{p9u-MqsvJFl<13ViAVL4E+2TFTqcqI0I)djEafr$ws#~ z)7!Oc->%g|2M^tL=WPe3r>CbKidh$gR>|S2mH@ADb z``pXti|_sLrQ)MY18B8ppw*hRClrj=&LYrg2o3MGkcqY2=Xy@{Qen;9iZR4Q9nlix zo;j;jP^he%F(y4qh?L1$FvM^c?&Xym4n+r5NXAk4dggBM5VlSb)F}Wl;*7BDO5s0t zX3jyIkav&3Bq5MmT~T_>#->8ICbVi}q41D!z%kJG69a$>wGu@&xLBhU!`t)k`UEv0 z>5Tw|#H1LyADN{K9KaM=L~!y6fn-u3ZiV!16_|CTU`7gT&&?__S!;E-3G5sxqKYbx zCkKB_Cd6UvJm_>CxpEWFyW-rCpjxY_zjHiit@ViuU^E!P(3np{u8+J>9Fs6cVr`un zcCD!3V-y^htre5pxp~H%0emQ2K(m zs=~ftN!twF8rnN(!RMMo7>742*DCVfWR-YlJI;SF8i4tql@N&XG7%j7EGhevae(uJyk{($5XiRP|_YMr)h;gFE^T{!5KE8FgrG- zP!wyN#Ds~|3FX(GQV9cgA5Tenv8UQ>Tr|PBYbW9sjSva+B`o)7thLY_c)7Z{f(9#^ z6f?kv*zs9zB1~$H6)D}dNi7K-@;t9dBCfdZWOD$}TZ0Ho#+$47xIJAm@?)b311pcV zpwXU%%|Q?T?g!7p&wud-v?m(?&58E>;?n%#Lq~4=%!7~If8&ieuC1-Db^qPJ`*$)7 z;gfFw@Caf4(`mN{3o8c>99>>rIWjf3Fuh$g8{hlMtMHS@UxMD$ZhM8o(0Kk)u%qpS z50Ufa5iDAY65+On!GJ62TuCf*OQynIgn_QCiaAQJ7-bUD+7}po+4z$l^1_&E2`(2H zau!;({ZdaERV>TfO8c!xSX}-5`fL44fk3UVBtt1G=Pdis#~bFEn!AIp^z9Z*P z=cFr7VRWQ@)*4~*snSTjFTu!_2%sq}dHbp1GGBx-l&PB(-m+7#95H=@7@05&w=n;e z8rewh6Z*R!rTVVUZ|m`pdWG{~_HMY#x|$HtwagnS(y?iRKL5@IaMy}90DpC&S6u7w zOLFcu>~#TeCU59U3jK}ZW}=`YJ@g7msG&qxBJtjl_g@Iv_&H#k1|o6BK5f$Rq`LBj zYJeSY5~Qs>U)OLxyAS-)MH`i9jN`fbXgKj1_vsB1bX`%6l<((s@2Ffep(gypagXDd z?1Qd_23j7a<$jTdk{s@8$~eVMZQZ%DPWlxJY+b%tr_lLCv0jUiV{eHu@_SktoE6c8 z%7T+t@E1++TtVsd(_v#_|ddhpP}8+yIo-nZU* zYx29_{chu*Y6L)YWo2dIbD#hGO{=SikFTt*&UGd_?I)hO2tR%DE%@-t5Zb+YYcUxZ z$XhR5L{w{4A;3ohs~2mdVG0T>(fwCCV5Z=a@AmvZy_!iW6n`0#6Tu}8Ul%|UW-R-N z0}YNuM#ogEb#Bh+rHn)d3AGj?oX)$NNa*iX|IVLz;_0o*&RSjCrEIZGomNX$NFLiz zS6x5LNHSInY963Cni$BK*Fd~a_d?Kb(cBt^YP^ytgYnv+L!a(j$=qB;@1d;Mx?V{L zR`zBK9tN8NAdXgE1tW!Mu`Jd6|+i+n1^o^g0S+wMU8y6M4F)T}za2FS~4VC=HF@ ziT3c1UGM0wkir_}7saJ~BO0T1519N+=ce}Hh2i`SEc6K6D0_oJxQ4J+J|Md3>I?6( z4VB`#jT&o}5)11i8mm`3(qyk|g9yXC23{L_jQGQC5Z7E1QH*@Hml5W!_^~hN3|Ew> zQ{{)$EFwe9TLj5s1A(3e!pEGpb z?l9JkyXMfm!!M-u#a>J3*e=@dD2hu_A!p%h4H`2zL%`zp6+$?Br%GInLO26`b)dcIuqIy3C$ew0r(k{>?Y2Aa zKDD-XWckqJ8ZZ^QNJ7_C7f4Ba$c%CoHw+3YvvoS4fK7ll7=fg}V8lW&B1 z$NA@!d)ijG=1d`sbv;0IT)Fq156jtsJrLZB!MSa7NEDXcs=^LL{A@=@j^AjEc;TU4`cmDp)_Ue}@@995(4c z#g8~nG@6Z+oSQydO7KfW@*1HS1vu3Z6O=^Vvk->h?7KHGj&msjU0O7O(|zTzWtMq^NdZnRXqcp| zxOU`{6gNMYe<9+#X&-OW(3C=H!AF=<9M{Ac8EFvlC&Gq@?s9xgVabde0ZtKj%Zwxx zW@_lRP%_KcNzw_7_TtBpXgDyARpP&<3kPZxV6TNZ%im)o?!NCB9Uy6TnYW12LY!y0 zVng{5{^FDCQTj+?&BJ}Zv1GI((!f8z!QI$nG))@S=A90B2SgY=A2$fir;_ddSs z$0$A5!B}Ye#N@9cQ5~(H(jw{cB(j5=g8hz8sms1K2_fK#Gd4eZ=;W&XX zF7i1e)Bp(mKHWt|i#mG)UfZp!dYn%9{b{^-YY*7(RC1Fps?6gB{Ma8U@KO z8ZraTl1BwX+BXWcwEwDt!h&^Bh%=>S#EFiH3&~`2BaabHIN?3@K$J0?C_Kb*#Z8*N zpKB`z6G_N(b1!{22-Z&6i?62yr;K3nIY+`+HW!OKgsD5m=@e@(HhZPWtT$Dl>3BGP zRT)TR(HSA0{U!J%JrDLjnE4xj^W(*9wU7j(!a=-CC?rtfE($cmtmn==8w`dvYbv&h zj5K`%$H|3AdTk#*cc&lGpvL!W_WCX~_6S9Yq5&UpZa5aA z&<8;*OrG`;g+GJ~?W>Belzk6|AHRmksIfE3Fw6FEd?xYU{Z?m>%HK5lY4Hn%vqnm1 zWLwmb>kO{Z5KHMGHv**Z;(k?~N%t@}qE*pDP3{V^UII4f=(6Y48EHVK?hFGX z>jkFc@}B~jP`+_j)w;-x*p$rk5{?Jiy`j)4lu5nvrJE!VD`U zSziuLIUUSx#T<=~ql)jxT_EM(RBi`iTjU8{js9qk+_)VP6?t^B<#-0l0g;~i>z+pg zd#t_Nor9}aF2IYgorfR({B`)kg9l-5da}8Gd3ttbZEgSlgKGymozCLp?>v6RUkO;B zi2t@m06g~CV~tl|eRbl22OcH`$`EK zG7hKoQeql6di<)-OIMNHlQ>qi07y7+fmjNARV62s<=UXck$twAOr6D8FZ!9F^cQ4w z2$j?mDf`HbZ_tO>cl)EKoIPr?T*ItV3uTijJYp zu$DrtG>!_N7}!M@(%8P#^Nf)S!Fa1BrL;pxxK{RD zx%OFuo%m7oiF7J$J9s2Bd)Lur?r>mHPlUBbxriE_MZ!cmcd}PQ`~G@NOn57iJLI?z z=i;gHvOMGYIQUql1WNuO6&9^N!XO&BGi`fwc*JM)oFct7G;?V2w%sfo?zReOHBI!3 zSsa@IJHnMksukf1-9#qz|7GNu3^Pmi?4rqa^6fErrb_X+w6xT?h}+zMp-C;rrr4UH zk=ID(E611^Ov8Kn=p(lC$WkJ1>Bev6Rwgu}V}xxSF-jx(JXe*>m*@|g-VlxJihU?Y zYnWp)_8lW4dEI2-1)&XLhH+N$s%$T(2IC2zPcR&K0}slIQD*deyl6px)P&CDJY2fk zgm3-b)A0J+my6Csqv%Y`cK7UC*?a2rEqDF?@BfR_Z~XL)S#x9_{wYKNJoeaQ&GYBa zPc5$+tXjTJx$Oc&tt_d6;s=}!QAZ=dPOSao z3&Q+eWOh;+)JSjbuEOz>F%22sctD9FJ7<2KOH`nI_sMW0yNEtx?(q-RB+$ZsA^XB- ztPMXIbF5ABD-%VEFw{tj*UQZ?Zn8x5gE)n4oCtnS;n1C?fDDCZu}G@QgRAA zEx|ZL=Ox*g!q!m0x(2dcN%QOB178pSrg&FtBe$VR4HNDwo?E=aHycLjH{b2W&M+Kq z!=S$ngW&)Mh9(pRw2LM*S}ka_I`)W+6R>@xp%pYu1eAk+fCiH!bBR?dDVrLdmh4F% z#lz~0V-LYY$$>+DOA$nRRLMmr>3od$J(sLUlY3ADVDWq0$qzio*HMuxphZ4GQ9rO-Uc6AmXr-vo&u=H=mG=?W-6an#VV~4zj4q zwBkjMw>Fs*kbFMjSZzg--u&b_exT3&5gyrr=2><_l7dk^F`f*P8CG&bq zXN?>h2NOA4hm0wlK_*2D0V*TPKd)i!-8GO`sUBAJK ziSx(^@OUI9U$|f#7@OifFyT#_@)nhL5(?_!SNWHOf1k7Vj zJxQcf^nYk=a_f3*Gt?)-q{JV}Fj@QlyP;QjEP#8ZQAnd_^Ss5`gqdQ<`Zz_owkA%2 zM=odrswUW$??dto*Pha3Vw7Ul{a&znORyzosjogypG@5=_B4}k6+MyO<*I$mpYguw zT-|&1g#IewFjv2(GW)zA?8OaZ`?sq!~(`w;UcCZ%aa4#s06geu6$zS%TtL*3+%w9?EaR zD;L`&q{G+A$uR7lpkT&!F;^0!tTKO8LWg$F`*XjQ)yaCJ32sOJO^ljKd*)xCVMHi0 zhQAxU-GzgBW+ZHvDTPl4@JfW(`fG312Ae}&cBZ$%VYH6S78R?>bD=N%FPe3e11A`b{te(o{k{INE zuT$#qf2|bZckTd)v_;gVw43M-7QV^+Bh7Ra$?QqPQQ82lN$B^d;rl;*6^L=Wb6l@JDqV^oy(^nLWqaX};+kZ>IN zv%1$(s@lW*klpRXIG>a*PzBx{$?z+J?|UPgBO7T1OCGNA7{@qslKePETcif^6b9oY zPXv)uz<$$475YMDf5?oSUimME&~6N2G`tEM>mR`8)w9rTY{8zzN!Yh{0T$+Gq1)}+ zHZESe0%zX)5Z-zBJ-EEygsItOXiqG{pyYmIR*KLwi<|1p5|jaxkBgS`lCv- zYX{de?TckOVDC{wiJVh_=@@bj;+K|$x~%ZEju{gZ!v`uCAz5GFpV2o754NG*9Kvwx z0$jfIE39)PoLTYcipN|Mf^wUj08ua#_b)!9^N9HY%KEkzKe-8Uk28Y=hKmXnw8WdEjg@&ivWd7- zqEOaPBFNM@3Kh9clb;gd5OJbkMPhq*Ba`h(Wl*qB;k zGg_FLf2b&iPT5B$!jk~zN;ugW&fsT~63PL~YhI|(pfFvR&xtCOX)XZ9aG3Wk3N%Pq zSjJhgCor#qYb##)qAA_%yZ=wNKCvQ6buK52N-UA#YB^d{R{$NSa1g0PW@o2HRKQ!}IR} z3@*c=wFS8K{yX91@fp~^+=2P|Ntoz$q1kjI)cX1sT)J`v-hOuzo_P8y{N!gZ!n^PO z3MS|G!Q|{-*xKsDwz=`oGNBf`oqiUb{nI!#G zl_(dxbNuC5?hBLu2V!seQL5wf` zj*J11AV&FE9cDVPbj-hR}6c|3j8hA^ZoVF)&4B!%dCs&iJFa2ROSa ziMt9jOw#(AF!`G-(hwnki^Y6LE3B;*d>uK|*TpEV=!f%Z4eq?m?I-O#o5m=wM+t2q z!E*5&=;tnH`gjz+rYu>eh^N9%&9NKrL*RYR+8RQdk$`gbHW3P_5)!Hec*L6k^l>Q@ zryx!08MCm{vKiQFOgI6vJM#Gmz$e`N)Q;Saz)(GQe?7FqIf387ey0Sg6UA$ z3LH701|Eb(OiGmq*A(6rf@+;&(<~^=srp6#A88;Me+VC6VS|c-aqtwfBGXXki+a8} z{F{a@hC0~{=O!9WkCKRM3%`+)7$eDl%Suoj+%^3>i}@qtpFzuH{mMulr@x%3fFV)26%CBl&dybw;5@A|P;vC-fGqwQ6#q>VDjPPeki)4R3a z@y?_&yv$t@Sw-_vS!CK`jiS*r(j${&tlVqs4s66q0o%}DKL?wa&%lAb({S&dN8q#f z-3a&GxdJP54o8QAC7a(i0pOjB0Czrf7JmG*9z6Bz`|#RZ@599pFG6>65475|&^J!{ zk-O=_&d<6%(fh0AB0)nCRh;}B{I6&viqFO?RrKUqcyYedYkR#;f=OmTE$x!iNaxUq z^hNGDGzJ8x0~N0VKMa+5R~bHv56fkJpM;a#x)$XtI&b+NN^9Odmgs5eJC$qgZ(;+Z zHwpknM`|KOx__(-aEezGmFcx(RY`WM?ye67v^qJQ@mvdnWD7_*}6Ww$8xxcJ$Xco z=O5iQfpNU_sw?vunL^GZy^~VMYD}N&LaUpHv)199gzW&W?#h#a79Bbn}5cyqQrec!{Aex@H6&!7R`PnOoO|liKRGzNfKe1$SxJZq5xpv z>+%l}Rot(yiE_fbroHhC;gKZd@k%6`3=tPSYS>>Di&&)HXwel3_Yx(CGZ>ziK-ML& z3*Y0}$H2^`5l6y`Fb>4sD(Oh3u?#fSA`h=y51;uip$ykPm6Cm(LiVl2cX9|+8VzGM zdV|yX@IU$vf2z|aT0e%dQcrL^O(WNydQhWvdS|>r_hM3n9i<9|iUX3G#rCMjDn3p7 zb@PhKGKU$-dQ1o?)^T(#4Vf&1dyX&Qm^H5*_YRFC&=WeIOh3|5>$M#9VX%1xhT9)O z3qFG5M<(F+zjOzD<%_3b@2q*%Wrtr!;Z7vC+Vtm%PakT)&4+G-TTktW|L_0&WBBPW z-hjbo2O1N*pw;TSEc1c(`6Eo>YE=DZ1>_&dncTki>8LEdOKGw@{((2v=$=NZn7Ory zKyp)z1~ii-txgbXuy6SP+I6j~j8WD@3!)BvEE$W4 zI+X2KIiBQR#69R_UOxvb{+dLUec0N#2*ZsJ;Lvgd{?%9Shu{C5V=zB$Y+FOPx(U#- zb)(VR9vbj0eraL^U%7u5eE$B2;3q%72>a^eTbAQCZg!6Mg zO5cfliYw4OQb6`2c}UVfiJHYbGYWF#k6s%b=rSr<7!4H?4Er20v2hX^N7jMjoZTDd zW)9@XE=g=}Vg@dJ@Gd;}tM}oTFKxn|H+75dWV_kjnwr|Tyt41mk;BIh960de(@#Hb zt_9q_cJtG3zyR>IuYIjKH#awR&;6e{ao0WferDgk1IKqS@18t+so(tjpS%ulp4ot5 zF$vI^a0y08j%lk5q1UFuyPQ)*B~#D{g=B{EEPL4**=sF1Vnh}79Am44=(IiBmb@bv zk>4GKh-Wjc0Yvn{j0gm#y0V!H8uIrXEOLgAos`6bLKWEXJqpRViL17lgsY|iCvfwO zwn&JZUw4yWdSnE{kx3_&Fdl9-9#(`o#C!l$@Jfsb7|KS%H2FM3Gg&x<&lZjR-thv3 z4VkCwU=rea4V=#3jlyI{_Tnv5dYo}DwnK1>GAV6*G*w6ql&acutgZ))Mq7g7Pxq+b zQ}k>k_Q^uh)WnS1UN>smWyh0@D_Ur~;QBzM?{01Ij8hAC`FF?n%?ifbqQu>AA-d{dk+5MZ=ZsVOMRG}U4`|bfq}~%KR48&`<>(m7;j;WqyCp!%3}v*do>9X=&KS)N9cwkVU^KV{+Z*q} zf#ojz-~X>)f(P%}1KpMr@~!;WLi*+ne%7GnkJ!ctZI}RnyKkL^8&7-z{`xy_!vF8F zpTQev-hl4ZGIS=FV8fhc88u)qY+L@^6h|F$Yd~dAvxo4C*|N1ND|Kjb6+P723_%vk zv0$km(DlQ$m-r;dQ-zbV9vTvKdccjP7Jn<+cefxZ``FV7G#XHtq0vawO>+F1?*TVX zm#fR&gpn(;UoN=ic!u^YnX{rJj!>SYM<+zWXeXjXC!=#53!KA1AAiKjIgmLnp#EjA zEA>X_(Xe5U)-<}a@WDq{;JZKi1sqyARUBTKgsWGldb{`STRwgB>HEI);qSil*kgbC zfe+L%IRSpV4FKQ$?sr=kE?k)1yLUK)gg5)vaO!gJ-W;gGmS5opHR=4AA(b4%b5z2ezmrCU(xWZ>Y!=Y#T zuHOe#$2pF1oU3Pd>CZiF`giSY_189z}z(;3agO#NY{L6p-MflRghvDR* z39I;T!w?2Tm&M)**GU>Ib_93S@ z!-+yUwqa;#hzB8f&LeLSj$8(aFeK}2jjvu9ru;l4^mGxBA@ z>qdFE1}l$;cx%mcy8-j<9{jvx?h2?7!VBoJSKVMvo}>yWg=tJ(|c54&P++j@@wDMyZT80}9J<0}D~$sS$(A&@%C^GRQcx z(o$wr3u7lrI|$=~G!#U6Fp6;ujzMG~$c|B0lmhy-42EZWo&5*~LxAo62)YxCu(>gS zA3y#gJoM>fuzzI=THUE)V$h%7ySj2{d3E*3aI>{&lK}#3Rnehw%C%+4&`a~lC!d^r z=z#~0-Eh;XoA<4(?U|mR?R|84SiJD!2k`Q1@4}#%fL3Q3`o;htl^RbwoG)~cGWs#C zgyVSg9lg0efZb`?dH+<%F2-z|Z$PwMX|?4B*4uO|IQHQ;QVdfrPv9cvSpzM?Mh^28 zhZHkS?__7G zx`ZdPJqKng(lY31l7W~9AEpfmHv*&m%O&@wOe@}Q zavn9oA~O2Ar&j5FXlp79rOI(h^FiR)0c{N4{OHr80dFr(F!F`xx+pdWm z5eO|u#X`Pse{pA~jpu*ZzXTW0zXtpF_Tc~cFYbna{ne9j>!Ar44f=3(YY0t$J#ieW zQJT#EBDJMG8WPoMHek>nLSs09TaHb`zxnE&aAd6mS1-H+E!cv_$n;;K40uC844{@% zbUhj!L6dQCR583)_u%1-%(ZZd$StlV+%eu;z%=UNvS-WjfS7+}4Ej`W@9RZX43)Md zy`k?K`IQ`2+8n@uw9y#A)l2Wg;!F#^__@>Yl}Gl&RA&Smn*-=Hn$T_( zHn&A19Ca~=`G?k+jk>9!q(=5Ibvp)j{SjQ<>cj4-0)GElmaM`J)rRg&phcoF$0fhnu31Fa?=;@Z^4*=r!_Nk2jsDqqu7-VHQY zMDFHGl%48KgHg|%2=D(W#;H=J3g4Un{qfwOQ>R3FMkZCrp>iVt6S+&4fysJA^`UJ< zhnSbo3xI*S5ujzF;iuuf53a%!&zymG-rt1oLY^%+U7|6CbIp^6Hi8>1u6&fBEUB@70QR+V?%4wV)xWqO z{_P*$3UiYK*xEMAdkcCkr|2gpRZ3sc(e4;bkQKYF25gTC=!{12(5LpoXYV@%i!)8Q zdgTKsMqAbZfcqdUo}7Q0!Xt$Q^Ezj|e!1g?gx0wuSOiCN$8$<>U($T^Y}-Bw@XFRW zTt}>U;8{O4ZXc=Ir#abC(vjRg&i1Wp_pE~e$CTH3HCkkE7Y+C|>q9ZR3Rf?`3lH9V z0)GDsw?nTvgbozYYc`;5oeHS~Z0yeGj0g8dkA6G-%ad0Hz^WLf$;mMQON#4zJ@RZ0gW&LX~ zuQ%?zZoqJk#q!`%n|&S)MrHVed(iyZ$P58m-e)Rf$FXE!R58!eA|fct^$4yvxMwbp zO4T~)&&oGdCErNo-x1*@DIH*S2`=Is<7aoC-&PB)X5ivJ*v}>plFbM7 ze){+?;n^48g-)*l(CoFQW)@~vR#s2la>wm=?%K6$7XWmIL+eE;ep`?J&!dqjUntc zgxQ4zI!_xFwkaIwc{w&V)G~bNHqA~RHUd5;O0ZNs)eW5_0koHx3dZl?BJ}0hL;y}n z@oN|AD@(|tW_^Mkn)%j-S6T{Ai5K@yIN^v2N|S%qs>c%Hk&<(j-SsPv(t}; z&byIkE|H-)p~ery9tq1U%M`~^S)#;{FE_2j$$vOMvB1kQdSfN#wb9HZsck5iTeoVsbDk+`8ZK8cu%eNmv&vUU-Ax5YJ^tI#!q*{=*Fz zte=I2i7oh}fBO~q{V%M+bY}#Op~=Dm&@|pvwgNn_fE#m@EK|DXEyEvu(9%~Py$jxX zw}Aic>rcYO{45mBmes{vX7#A(;6Are)y6Yu)^@;iQZNh=I7OM2@&1O%I(Z9ftx!%!<`t8lzHBX7^lL3bR~uPR4$0MEl$&UpuA7& z(S4fB;GTS!hHp7$pKHV|71_H;!)UuUc^dKtGnSE$6dVC;Ux7yd66{}|g$M6jfm@EW zVQc7)kF=Ud2MB#LauV)!zc7|phnq2Q4>znJUzkW1KbD7XUxLBl7U-{EfhS%(V^fEs$ zBY!qwd)utB@%S&mi?6%_Pe1n#+;i7KXg0e=r#sP}nVnnMvv=?AiHVshv#reyd!?3; ze~btKKS}eS_O4xXGtE|SW^!`6+iJHPue~*dr(gI0&YoL`R(l$XM%QHxRWe>mVjU32 z{|A|4ZuSzfG^?@pS!*MXL-&aK+SxvlQC_R^U$5kmJ_<$%LuY&mWH`BdJt}iipr}Vg z(@{lhXcz)fNc<1g%6O)@SGA1n<5_tnu|naR&O|B@32t%8#tVv+kVxDS1X3!9L!OLG zCyabNniaI{nFa&dM_o8N1|RQ{Wow-2PkKUJ;=pu|hCaNGNtIqXPM5GoS3u>ToUeRV z7FwE)k1+U>WPXhHDBk@9M&WY`yQmZj+R1*yJ}^KN_hUR$swt**@l7wOf}4Z2_C0U7 zp$a`8Pn>;WT~pp)uNqUTXv&oqYwSI#=LdfAtIS zI}aa#J#!6!zDvMoyr$%cItNk)Clb0rE+QEYhH!GV1^3;x5B4tgV7Pq&2K~!WGz@)r z0xkCt`t0dw=qNb{E#WA~qVaZ3c|suiQ{C<>nKrg*XrK}LIlU$LK|q5_5Tm;uHeqan zu3ax_iLZx@TB%q^d*p*ZbH{_+pHyrTSx*{0G9??a!3UJU&xG8!nm|!CGIt_r&-M$L{?Z3Vk4y{eY zaO)fl`X527*$3;Uv&R5DK5KIg25ynhCI=gWHxyn}8DwM5wNtexM7`Yix+U;gu^%)Z zQ#OVi&D9Q8A|6Ftif!cj#J#-Jd6w}o+;h(0gGbB8;jJVWg4PdF{@pVsO4b^CQL3C* z7foiDeYlyR%?ju2X?Pg7`JoMs)+B87TkzaV=i%8GEJYxMDFUW3Cf&Tan04Y)B19BdD?oBZ+LRG>c ztzz(Fe*BK^OlLk--iy`_k{Kcbj z9q@lbui?v)J3mi`sFpx(YA~4k$_>t>?72JR$)rE;K`QA(4%NEpqGw)?Io1pR32jg^ zQD<5?#gf6K;OFzIl(jIP3ep;kZ;7xJ6;qq#I~0*qqb6~S!T|1jr&J^_hXiNWT66_n zj%g=%BZs1%r^E=3@_u$+t}B7LrV@k(_L~sE6!dTrb58Kk&y~CDkWethC@^eaDm#|; ztL?;WC&&YFE$SJ>eLuloC56khuJ+Z!3D1*z#kSQLT7~7(hi}3B`J3Sne(xCU zTLReLGRf3T!Za5gl+wI95i;pG%o{D6Y;6EH-M9ev-*XyZ`$O1T{|MSGj2QAYZKrrm zssn<{Ed)R93SW%lx3Kc!SZv9##Zf33_Xw_h^cFNmn^2f5 ze98DyBR$sx9;L>V9RQm^WWPK1s?L-oySOw1MV(m|*~%H1l1~Y~v#L2mfx(le zm3M7S+OUAh={@ku>mR}QfBX_`_07#4-9~3(y0f^rXZiL!?z;KJi4)7_7y!5^fZrMe zK;h3NbZ2L0_uX{rw!8NqI&^AkVb{$0%h3Gs&!2~P-d~5QxfOfuf#oxJf4jc}-F|1; zzl9<}J~C@4QEC~H_Tk3YVozqCx-g~^4nzoOFaVIS)NzXRhNQ$!3O+f35S9PP2<0=% zz@xn-m@ShCfr!u4sE`3kP=@oxolUEI201FysUkong}UY+G$gox8GaED{zx<#*En7w z7_9jyv^qq0XH)I`d>>+Th_8sVG%_G(K$4z1wg>zX56O&E2FQ(R8fL3rqC6P+wzc<0 zlWT@VwwM$F$s-q}QR$Ln7y%;1kJ$TP1L1;i6pQTIO-3`z6I< z+MaGu%y|OnZ#iR`Bt={pLY}ehlCe^FU`BoR+`d1wiO`y`4TJtgXbdmF7e9Lo{M$dg5B4n% zq0x8OuNvi_qOrUCIYPu8c9w9`=0J}_x#X@_M*s)*&BEs%xB+G+wqUSz31DchcDC0c z5lSZ84H>1v+SXBiI3A-nk{ef3+>asJypE?=VF5yCwfcn4>Y6%Y{{uV+!qIH#o>hK|xoj5Mr%j z186lzuyN%hnC^|>-rJAD;r&CHGzKo8dEG{F*pP2RcUY7Lzop1U0ni*D0a^$_=(QWL zIT*qOjNlKxd;-4m$O+grZHxf#0t`2y)ev~eytMu^!qTiI9)-j|GU>qiLVYqC<=VD7 zdxF+eX|bym_TqRNmb*R^Z)lM+KpkgGuFoi6d)`lE>Hxoz(K7ibX}7*!QppRn85ur+ zj>OvXKy>U;T|?KuC_ZZr6#|58f8e(Qp$&mxXtajVRWE;p@AO>>4WeVY@7~gEk7byf zV;az#T!eEMHsOhet)LYuKdho^@PThOcO{b3lz|_~SlkR?98u6RT z|NQnxYcjApLzal@$zdQ!p2q;nyqPoM%$AU9~e@yFm!>al{PRc zA*j*!ZQY9N0W|@bewPSaC9KiHg~xh=kM_Pczp^pr-ibshZ;gzKFX^Ksq&x?=vLbnJ zm2n_>|6{OVmK8HT%NmRN;Y8#~_AIny5K;oDqZnYlI`7c>(HkedCBi5%29v-bLKIN# zZ#L|f?*TfNszQY;nmjBBpv1}?+O|#=F2d%RZ}jS87GnVm5{}Cf7iH!U=~F%B%H`zX z$=c-EIr@wXS5Z(I-k zgnRAQ5Vkiyg#Oht@YzqFf zoH$az;X@11YHY*C#zosF-shfNi|Nnqj&q|9!ae3(;72ja#%+^y8CvMia0lbg$Uw-f zzx|c*FxOv7!_#5d3m$O$~l*{Sb z8b|{UuA8A*+Pm61;?Gf@+S1ACYuveGt(<8%d5+4tB0nir+59yU;brhY#Y_bWdL~WvBw&Vi;EKv zJ@nAwyYIdKzI|(lk1g$8nL2mja`U@CcpA=M*oMx;jJ-?Oh4taMO+upRwL*`U6}Hhj zDFm^cJ3wv{8}erjrg=mv6GG~joHZ=9>dL;x71UVkp0VR+_aScubN!$ok=guc(JzSS z7XQbTD9;$Epd`|n#yR7WUZ4~*JK`Ojjd4^&pUefIH3>EK$5?}yQmT- zt*g<~$mSrjS5gW*n}C&vG?1&6h;# zM5lwFn>iOOA_Jrn;zmc#4*ND-z7Rilzc>N*0si=$43T;EI37zlIs+KpGtsNc(G!28 z^l7B-%W{T@%*mVT@xe8blga@GIiH zmS-R@)H1_?H=3f8gYrr5`-?)a^i-lZ(r-*F8}J$NQHOQp^T7U$(%Wj9bNCxD+`b5F zy8!<1_m07RH_h14Wup?f>(nq7Dni8tXGY^66|%EMpp$FI@g>vJ{A?HQzV!x}pJ~I! z)r;VC5|^COO*!IeFxGkHk5XwDXrU!5kcx@>8xEa7n$TAf4dqrR6%Et%CXpU$z5##5 ztv5hK8XEH*#6A)4>X)z%L=bVFWx7si(DAg{qllDQ==^eWplI}39&a%;qw z3<9yfoul0bBGQ1&$>>=jPs|8lYcPWDnb^C$x^nBS zx83vQFMs*w{tGY6UXLXH*T(?x+;h$I=g&{>-o5+afg?vwFYejB58AEvtM9DClh3>i z!(kgHr{)@HEKLH{P8r;3(n$j6yV-uSpp3wvdRsB!^#4x*SEoFjE4tKBB0E%tU z_K^OS(~(q2$_XLzdUbugnxIlm*LOPi`bEHAU8BrdOB2pZ&w_hCA+Hy#5_*GT9Z)q& zV<_wf#SGiP>wR{-lZf_gbqIH7`Q-~A*em}2t1sUR_uRG%CfY;T?z^yZqqN{S&4{rhK1=N^fx|&(QpGAg^B9u$D|A9-wgOD#@FdyD^h`#YY`%oyg^F7Q_^r{ zf7h+lZ4)n7sCgAFWN1V}>CSSrFcF27qXgEnqMxpwpR#0d(QjH_yVa-@FW0HUWB56U~{q`MK4# z{Wl#ra^(02SFg^S)Ew|zU;t=*=YRMgx<_ufVeQbd8&52+?BBDvYi{D*v;D>|p1%O+ zFAkt+O+mBObILynKQ{>wq#&QOypnGj<(C&{8LlSG*Fy*^>!WO(n)O+ZPkzq5&lP#S zt~RE$4NfI!LKE}=#rNxN;_N($P;$M5VJBb4|J5#)YejYcbghCh*8ULwL%u5w3Xd+0 zcJV#c#uY}u1uEpc40M3u_mZ<}v7PvvwD)S`(~4^4F7d2|F{wjCYqB2^LF2^gO#i1? z%jwLd@SDdE2k`N6xLUoaUOR>*)jd)>7L6v++AYZikgG!(UtOasu6vayoPN$5734d* z;?HSVn*SjgOG&t*?7!4GtauO0U{nQ{a+rzlK>(q3qG3HY>WzpcFwfDWNP`geD82Je z_uA`|&Y)P>mwL3H{CU&>mfeTTkwTfBxlLU}3Tg>mz_}+uaUe6@KeX z_a0USkaR7^6=2OFFy&5v3|zGY#hcpJmmCBltmt&j6$^eYo>G>)7Ssw%I92$mfwHxY(Z=Hc{G zp{MAA4-rlVKl`wL^&G4%&%@0p58B%ROzW*G^L-$|A0jt`q+P99rREbbX8yv3sH%a@-oMmIWUh=AmA zSR>SjTL47|pxJ{fn=SaobMM33@AhG0ssYVTr?a?w@8W@jhmU^dbDul1ckkY5fA8c! zssW&V<=nZ2haP(9_8U*#a^KRPeJfM5^Szf}Jy$&bi&qM0Ex@Qb0sX#NhIqaeLt4yT zq6{EN>o5W_cms4MTxKkw1U9}G1r9wdBQ3ge9+Rx-@5GR8t<+=0d>-OghRhCmjf7#& z6)T9QoQ+C0rdf-j&)|##s`(4%=NJaA39vEpJd$rMUtex4{F&=Lu2Bqa6Ohab@%cjD zQTSpoAS%B)*_J5lHbITjLhx$nN|Ey}y7Q0jJDzQ%XWeu75rqkrs3_+z-9NhW;f!U* zTJI7&1)-X)9fe4QT?m)+;d6A3ArA)|7i7mk$1H_}05kJvj|{m7cxVE{N*NKyBL<{@ zDqoxLF1#%&DMCMrYh!bq%D)ue@^^P9x?fl0$+L-)ob@=}Lw+5?I+Yt?%$9V=YT}>` zJ+(A7tFZe0<&!0v6?ZV>?TcQMIZNR{qft5I9^LoSqfBAK*8tyfYo*;9fX^I_;xKgU z!}kG&hc-()KJ$VNW5y6|0UsX*9minK#XCM%wl^gVtBfBO26$A?dexB!@jb_tFcR(^ zT(UkSnh8Xbzd2krIFIeQ(D5`EhWw24aG|~~63MhL_sEo{WlF53dqib1KKUe%gnJ8C(ldy&cifwYBl0}OVmg`2_lApD8 z&ed`9pUGd6=Z$4;s&#zWC?22CuHMw5)dPR^FveISP082BkjmwH-Uuh(L^_WA)?NQf zb0eijlaz-6m$ef(`9FW84P_XFlTCu`?ymGYT9Lu(QTQ8Yt>gSXKlFWY9_=BGd<&0M zOQT=2;r=WP&HLskPXUeg6cp`wc=DOo;FmAI0Y$3;jn+haZeiE_!GlNcc<_PG+_$u} zv|_FW9JvJi#c$XE5c=zM=XNbE?^`>(Z)N2`Z)#y`dkDn~zj_~DeEBVC^%m^?hJ8=X ztUzGT{y60ze~)E-50XZ3<#X+ORr^vPMPkaY=hBHlwC2`J-Xq5$+bkQWCREBflnJ9$ zSjF=`8i9-o4u`k4QNlW!_EQ1JjMWjyWpT{aZ6}x5gXRRN zHhTCOsQo8QGZ3Kk8C}ad`y%{qLpkH`Ik?nvBLpJ}{~n2Zgd-iZHqHb_mq<*fWqD;?W8SV*okf=Q5w5gtS4W?|)`onyR`K2|YY3=KPV#(3qs3KxNT&xp zIavxTv5!$98KFX-9FtZj-OD;3LOO;x7~UaTfm3XB#V)s&Mqz3iAsn`$ z7;QicF2TLGFT$7ZUxrS@!OyUzkZIoFzJ?d`HQv+Z=zlQHLh_o7>Yp~MRlGP#gT$0#GgL3avd<)NoqQS?;VWrYj^1j`B zM0t>Kr^zR2n^c~l^>ukob3&v%SU%U1mErG{#>qV?`4Sq~*s~xq`8F&+GVN}{L}vtt z);h3%Z(&aB_-MCeTFT-ge^VYSYsJ=hq{+AdT>v<;)`Z`A^iy#B&>pz*(HVC|;cz>d zljN0EvKBgTHJ&8tkH%xd*sTvs9(~-Id{|w$3^0zKQAS(cvp9$FJJRbKHx1-?ttO9F z&QhtL^5=A|=yA>*PYK4IOcZQxUUF>o^G5wNO6#;O|v#%pJc`gt(9aRkdF zf5%H2v}Wi(*xv=u8LCOCXv01ch^2&@O^hqf)pM(Vh=2;G!P1wp{iuC=AaO=O>qg=; zUbtl45Uv~1msaGLv`jMjTQWDR~MjJ=>rJ-BaD0fL_Yik1w0Oz9{> z`}8=cC-ClbG=SQ5M#ZdV$fIwu)IfmXmx|aRC8_;{mwuQ^#P>bORdxnlZVgxmM|L#w(@+V0R7jj#M&|(PttYr4kpt_M&oz2h#_- zP#)(N-x}|T6>m2(GEG^hN{4+zZVlueW01~LrLOX2E_v8&5VpN03%w%?)e}A`9r%)+B@?Y+__E0Ypw(!&Hg37W_N}bmG(W$4y47wspLpt3`1Nb=LU(c&MkAA`(1(}#u*4ux zP-f-@8b^S+7eZUOogx-}Ke2GK3QEHKkR+57cFj78o}+q6)#{CRCxlDRGq-uAMY?uL zn2H#){R_XuXY3tS$_Pw1+zF32Mrh;neFZ%waB^+Hk|@Pgu{`2uDI8)6UF5$=(uT8&i@JiAQTw zrv(u%`r6c0^mAoguL%8}jxiGIvO=IzV*Jy@-w-l7o+&VUCGptwl@*WK6gCRs(s>%L zBN1RcEiL1v(z{dYtlPoduub|J-Op8uN}#WS*ZA8uj6yxyhW^$iXbdjGBcC}1x81l3 z>w^)r@CXFUPEC&j@t*3)=4@}UI(%_#zXNxE=iq7=4y;Z?v)F*qaElxb(u|XY{s;aU zk40%7F9~P*FRjbu7g9gc`Z`5~*yH%9jAws#$4fAIVA4upJsvm78q_g1mCmgWZt{GT zaV|Dogu}RuMzKFD*z@CXYJD_0<5Gt)ySI!}bTHVmMy-SUcf-oQ1;!`X9xBE&az=wJ zYFvu^TIgW0V;eT$;I0vT>egLwX#YHHZ(oGraLXFu%=MO--$KfwY>kNHhfc&D9mYP% zaknJ0gnxEAMl=%RT4?WNppy9`ZIpqPcz(w+Ua=b(h+OU_#k+8>Xh%CxUMp)mL*J!5 zT1OYi!n`Dsv#fn;Xm;{V`J93nn&Gp!Tu4P?e^eeA@qMWY0d%eY98Kv=PW$_^e^pkn?}3S=uJ*{mv-$sc*DsX?mXlS0Nt;B z?Q4yHj2r+aFTv#E{H~>$nZ@~5ce;JyG8B(L{W6?+|1wNXEy8frwCCO&0&|5ch}C2z zIkAe@#ZaNU%4=9glx{MPhD|gs)+OMjC8yLO&-0`#ySq2h{uO zCdWnooQLW4m}jt0;}H?zbuhmqEgUxY@{x0!lO9t;^#qV78)13KD54BaS$D@Px- z_5v^VdkBG4N2V#G&1!a4D}MT@Prq(CdaUioaS~SJ+)&QZj-kjsBKsU?&Sh=OdSyHa z`9!Xd1TN%?NUg7HEhA!BLHZ)+QTMh5(kROxBKxAaQMe>dBr?Vvmu^9`VK1hIQPF^j znK?Ln?g~8p+?(*hhel0kf^o8Ud%dZpT}!*>78hqs1i+ayXU5$9*I)qfz%uVn%r4B% zw|bM)GqY2zjXo4FzP1jpym1BAx0=xEOal}qtD(z?=EOCp=mZ0eXC95FOTdH01^pOi ziNZV~5E7`0pdu6A1f|T%2mCy_-Au9_dv%Gw0!+J`T!aftS&NDXZ!WYf}Eb*3U$F`kJLMscRh5VM6B? z&8Q|3k%t5BMw6V%Ca7|AuzSwqLYmYk-mw}i_#}(F%iEjPl+9xOx_5d)x5vgLlII)kWL0 zp-B}1>x3!s<<%CS>)EjVQdcomUmCU@}3zOjkav|7(>6pxzI+Mu*@w(yxL0R z8Tfm^5p(pQX@p8o%1v@Mi@T^)>4nkwSAx0Q#?KkM+dDZ_hT79E|YsG52Ct}Myt|y z{dz6xT{@_oDdVO8o$0Z1e2)6 zlur76Xp=@y!p5KtZ=AUbFT8XfHa1Pty=Kv9wp+c<#AL7AT>yaTr=Nb>gxde+jsO5G zcTb)?xq8=~_uam@uy<{KaiM!(ir zo@=Mm>G7^8GxOU^@}8CP#(XV&CMZtfPZx-^aS$^Bu?LoWl#>4aA1Xcc2_+d$u8juN zIA6j;n8ZZa!L)5Wr9)_pwqdw^+1`=)Nxtp7NX`b${5-QThN37%uaV; zb>9Tc8u8i~wy#a}(T7@P+)}<9<*C~MIJAEbZaH-ny3K9axbl&WdNGDOvp35I8y;EZ z8ZW%RR-Qu6#-q_tqovt(=6EOd04pB`qj1<U)_4N zZqDE@OPPLD?{{i6s6W1{QYNPrY+dTe#H8JPkLuHgmwkEvzP>k6VAT@bIzcpa03kSHJpIZ{_`%4FG@iM}O1= zI5TpH(ZeaAx}8CzL|f*5EZaI_|R(!y^TWn}5O+jDMg zF|sQdT2Md?(E!d9)>la{dss$&H?}LMDO_*$Y7?fPyd)-U42;tPi*QU8~7e=sm z&m0^-a=;oa2HTs^^ft`c0BH_ktz0i$wkOTMAtEI)>F#i9EHismT|&$JwYkpg%Ii7a z;-hNNd*(tmeJVVEbA!KM-mSe)0-7@tNcn;#TowJ7?7=!Ttgay}z{I`i-xC??%|!jR zb!Y_XZ(W5}qYwM`%)-)Q0p_MX8>sqm;B%!8MCAeZzh<+r=ahFXPQqs%xEW?A25|NA z`!;eRM4%DetKuU}?ovG3StD23n6))7|G04op%5CeabR5h&Q+ z?T1W~YSe?hGu%~efKj1)6Z1Br{>f)vhIc=>YEo|&tw!({Ov_XPv{zxa#C+l$lFyVnjLKD2LTb#->vuIZ~=(0JvwEAYze@55lQ z2%Yv6Z1oMJBiFbv+m|PBcIIRQ1R)`{lDV%j?2s;=L@p^PCdeaJAQ%}!hJSMQPFZ-_ zXZ-$gEBujo(*8I@_MxhZF(8d(NH?WMn6=+ckw+)oxE$8oP*(yo6LD&;1wG{1J9))pQFld<& zWzlFEKaNrkhmw{{5?{);bMMoV?j$lOHufs96spZWsbHTM?gO;G}uK50@^UgJU<$!>8{$2@@vk zAK6Rg0)JH@IKh5J*hND$#bX-=9TWirR}*$RfIW*nIDT{$Ivs$Gz6qD6*lgqv5C4Sh zxbxAGwsAuxJx5J(+bZ6cL<$e1#BcN6-dG^Hm=NG6fS{{o= z9#^N~k1jadGg0nG?!I}ODL?e*@sJ)@@ZM!K*hyM5%Fv54dZ@{w+(?g3C!N;#G~l6s zyNB$2jviWuxtXqQ-kiTzi?;3Aa+lL|#tVro#9-z367F>qs^1?C zVSc&+ciyrWmiM&b%-KuO7;Qme?}&F}u`@&80TY?IEJ(U8g?p|f^=)1p=O_s5vW5&V zc`sXUPy4*9(~%`HooFQS?<-@qBZ@Z_db$dP2;jgrOHirZ(a9NGp{-N8ue$TWaWWAnNTcv;jQ z5F>>@CgW#U!mr(!k!}r#4d}EcV13kvx8FSnzkcN+96z`S-HGX9Fx>9#+P!zr%Ieyo zlP7Okef#a#KLUWwag@-pBLMEa^Ul_pGryd9^vnP3^v$>3{^>pY)>dX07kY2Md!_Nr z3$GPhgBCP8lTb9;EaX3IFw3RU{Xn7V4`F15VGo{+2S}c6FDrq#6AyiwNCPwMrU^Fm zHeHL?voK4eAX0J@*0r+L6~eV~Q2$eqk=k*uxpHig9s5Q{M`IT}lN^T(BWr@J=18*c-MgY@*ut_!C@ zT*-{TX*dvYIsOpU(~P&z<_Rdw-*`s_%J`Twl!VL>{>X+=>ia%h`~VuoHnfXv=(dM2 z(H=stwG9)kO_*qJLZ^8J+RZEW-%j%qbel#g-h_$HHuTzk=$OCG5L(RvG+-MV<|;aK zC8YWD(E>6fy*4lEv85P;-^=zWT^DLdaDOShoFdKPhI_#pc}7OjAK9dO6P+QPII$FGf~92f!S4@ZS_HeAx~YK-eQE;35Dy3Xrtoa znq#KOrOgLRy*jde`kPJ|ux)KzZaT;i+u1noSh)AG?ks>;R7jb|%*y4L3 z$3YphqHl3Sj$5BHBdKFLD(rbD|QT|8?h8OM1ed|ScZTiIo=*0*CLBg`GCPJxP%LF9-K)F{I0 z>P@x?+>+NY$t0%*5e6JC(&9gU(f4CnTgV_PTc%!Sq5#I|GM$ddwWruzmmz22fg~Vo z8GeS3E0U^xP#r@(p&{0-hF_%c{8vSw;~XjCry>77z)406WP2UQ>qdT~J%_}6nGKWB zl5`YooK-?B{jMEp(*(uLOg4G~3YhiOXDZo@|x9g%XcQFpsx*#U&8*_)k2~>2#uO#*`DNr^noc&Av6 zFlQR^LzGDhqq0(F6e(*b!amN6%e|hC)XrHzu7k8&W(1>n_AbahQcQQi^?DgOBCr#a zZ{Zt_vT0mj#Fv~?$VM*NjxizxVM(ZQPN&E5%NgL)EKmqOc1Qaj@&%g8ry!z$} zoVsxlilWLZf#8pxK6jg%I^}5oOv$2nU^y2u@-_;{r$KN)s&6Qr8+t!;R#fqCtow z#DKm;GcKdx9c6DJQVJqcTZk?xnkP`(=&_IF7d9XHUIaJKPOr_$5kCDr#9^m6ig}0b z$(_UD8D}|Y85doTRruZR<;p`XBB>aU=s43Z$^?FipjBNaqt@_HBm!MGY!N9)y~KMPr0%J<9C3 zK)~^j_p{T2%74%cQFuiX7mR92&+*(uc$d?XcvWHfn6qA!AlwtWo)sXd;94!*$6Iqt6Y@}K6!)Al7`y8lM}uwX zZ*IYGxM{DrD_TS7w1zMg=@n{aTg3zJP_Kyo(}I5MtZ(_B^(B~3bz z$P`nVgkQhvPL;UimIkZL%}uwRJ^)7!{u-Wo;RCnM=9q@rci}FN;Xrh5R*mL<$w$Z!)kgx7{V zP@vgNrX(kTt#7OZJ|m)FU^&Ya7HJ7&^=XD?B3#LL`N9%~!|FKhJS1M#iW@Hh)(({X z9Ma{y@>Ef0S5IZza>ys^FaqEnBz>E8%P9i1UTC|<)VZ*U$_AVwq&0sN6C!$1C{3;+urv*Do6W(BHF)Zy0{) z7CPy1vV=~Cc1nyKx$$XC5EJ0w*mA-EeGmJsTB|a+%l%UA;o>yMwV!FTgubKUFX@Xa z%C0*V4sp)qbBp-w!{Z69k@QV#1L>1F&Q?~+;7`{`(jiID%wu`qItn=sUyVv@*uBdY zLKD=*v6$+fhFK*ZRUOio>mZEBgm@48S7ESu9!}nL3miMVY?Z{0^_sB`b6SMiYQ zqDuSOf}Y@sZU;^rU4tJ#@fKV-cNrSfCNjdzw-uF*ite@b*XCm*FO3)7$_w;eU2zD? zY7lU}(rm>xaYeJO<}&iD1GZ5dLnwykn8r2~#TGPR3x_wHGkpKHMEBtW|h(DrFw`XhirA7H~M{Z|1#ywHcY-~A9?f8$+v>6N$P zwYNTi3zybmd%Fp(#uPLg(=ZsB0QIgFeO(NJi9U&;=Ycj5xijz@DsvHoE8;ZfBq*ml z@g{=w<|88mc#+&k#}Irl92dQ_gMg0352>y;c$ z@wy7*#YTiN#}-;pz`>OQ4zA6>WTy$E!Mc^1O`Z>?zY$*Uj&!@oka!JgZ)@+kd`EGAlquH{cidP4ZqesL?v#D9Tp!AD#kxwq_Pk2J z!a8yPK&kv(zX&*y$jHe1bbZI66_3i1LUFo7aFGNhBL=`5SzvdCeJLm0nxo4fhh zlRqd}(ZpK#nJCXTOR%>>BO!K)yW;#DZ1c#P>@5q*K#d&1v*$sh@QjQm-0w^7V-HHb z6;AMZ$bjN%Sx+DCNq0uq{!9%&1VnDzaX~mRN1GJJ{niwBtV@{Fc!4TBia% zg{$1cXef+^m217{z_o+kKl~-oGLxhW^QQQRT)2_@PPs(a7n#V7jUrL-gb)($yLERi zyJSe^f|VnWh^HmS2{Ml|At?QhG?)t`VZKHX4T>Quo3Z_Le~LZ`&%t-xEqTU6?Gjxw zPhrxSudA#xW|htvG3ad?H0(2sL%<}q;T1j7XU=#?Kj+o~0Zl~oXv7pW(F*uJCkK)u zcZYey9|v#-3TJFVnj4d~g?Uh8iie}S`ptP58^tC}^tR!KqqDHO51`*4Lbqjn?U;Ir z@&l^6D9cn~JktwTh)Zi)<#Gs}UIUICT7{XZ0{ZV>c4PHMBx@u=#f8#-&kvDrp+L&U zP6g)BCwiH^wuW`tlA?SQ`3mxS%s6k?l!l)RL%zjdi<{;bvo3D0nPUg7R$;HSyL#yi zT)y%?%=AWZ>gWpGb^9%F^5iP4t#n{^rVW$5F7&!B=(Yjc=FiKID741h@+N}-z*fHn zTU)!~%K98!zIqToIJXVIdgU@a^~_7~^m8x6TkpOJTZ1W>oLz?A^b$0O1#H>`lxDC- zF{Q~<{c$!a=b>CG*V3HxwYcjAs&>T0;;X(L-Km+m$@UM-7lMhCVGxGokN%eKcCF@#kcXYAE4ht~MDbA`dq* zYequ%FTW)r7$ZVdFr|xSTC%6q=sh9Po23p;DnnvY`39$jqY_*niX^C>tR}Qvho6(f zqv;0UK|U7q^q_2wIk7C=w428rowYpB(2~$n)8fHk)VIdUc4rRWeCHCp`0|@@^2h;b zx7&@$>6yvpwUuL^zW2U+FMjyp8-M@ze}D0@#~xdE_ikR_2!Q7F^z_W?+WwTyFo3w zbWmAqcBUQdi_#yhf8D~Aj(0q(882C)$TIHgXU7@gV<9zZAKEy>+hce^qu{|>*ijir zc&kz-WQmw8l8ywbv9qx|Ja(*|G?-X{qt}Zjp(>A%&?iErK15V~WJt^%)=-7QDOrW4 zoC}zy(6Hr6ExtcZQB-c!KMr1Z6@K!XSc1loB4Iy;{Fx zl_TOrM7yIz@CgD1jX09sXB7hdc*i(J;@mZHW~-~N_#}0{5C4FN~9KvvXgT$ zVv@TPdt`4L8VpR*w>~WIo`wS}U6^f-VBI*ItB_v7ukn=r@e3+VX6JMo0Q*;3urO2D zjOkz!8G=co?2{(iZ1yBW1yMTU_v&>;BYD`zQP&Ly26f&vc_1|!qVmE-x_EXOm05!y zCOV_t8o_XT9WI=I7e?C`U~TU-+(SgBWXm2U95e`1DKnep-b3NefsJ!tcC?%n~qNw??YLS$P=pjtqNBY>j z7Q+FoU%d>64@|+K{mVSYw?@vGM1HuAg&P;$f1CDrg;81n4joQ{ zZBKi^d1JI!`tA4zm_&`_2vYmXkAus&+*lTgQO<}E=i$C*A}bN$gR(2SWNHttI>nJl zCxao4jKwI27#%XsMR!y&9#^JKZ!51{0k zhzQUMztxO$=+sdrWiFo>$oiF$=lB+U1PZ=kK3TSjH>FYencSX(!!)z@ImOcdPS$(YtPKg?%lV%dSchEUAyMy=GxCa_uK~5C}SG{hQncRYHE6F zYI?Q{MXxw}egLn%{ytp1yafw;XJB(^CS+}s-tysI)MVOm%Bb?8zlO`omHwO{y-d)1 zgJ{vNVxV>hE_evTh0Z5~AQQcSW6W^}1UgzQ_2-EflrU&Cc$ZmtnbmkliY*VbtXGWJ z0~rG<#bIF4DoCYEGVW-7)!->#N{N3oUgSJ*?r%upM4Qux7T;F^Lhr@V=Ow!EQb;5m zk{KguDqpww4)Y#{Ui|!wGK~b$8w*hI=K!Eh^KRu-)oK>7vAF?V7{c)*`(f9@Bs5LpzhFy6QLesn|C=xZ z7!qm>0J|4QuzRruJ#%HDNqT2z!XsFsN1qDKI-kkWQ~OI0G|}TN4YGuZQ5ge0o;HGj zoIQ7y_{6+H+GOBwwajG#8?b)qJQUj(V9yM|i9>tf({~?%hwi%>ZafSy;qR~NZx7(g zmJ2VpYv<`cD*Fu*^%gyYPFpY|FhTuhyZ~}QjlV|uG{4ME7I4Q6OK{f>OK|S90RQmR zCHUTto`xr$ejVON--FE4d z-FZ?)_DwXNn8*p|UESKa47+z9fWwDZf_nfldR)2edf>IB)NU;97rSgeN5lTrDL8R- zH+<_mmtnX)ALJIN8wHN$8}&+;IVy6EwhBfqF}Wa<31#xX_*)_&;@X(39cV=J4W|bG z$k%Xot`D+G>4$XuB@tk>R67~8wyWCB@V%0L<+D^-j_{}~!AQfE#>4Gg@(1Bns6#l66}Q1@J+UH$nW^fDV&7C1enpx*EqmNB9TN!$H`Qp6q56b zOu+Mk25x@)T!hccIl1shMcB=53jUp2!*r%X+Y9g`;jYTMG1w(AQ zEsm4mx>q1#OY!U-$^q19glm=n1sF?U`d;%;nq}^4cXY%Rq+WeRyHe;Aj zjkbw^%8N?p$1n!PYa{h&GpF05(2Pfz+}<=^4Gez`ceeYN!ioldj!A_{P7+TyOnZif zZ*6SA%wz#4Z#oVOb2HHQ#({u;o>tn>Vg;sk=FMP``CY-B3=EwW*$7tCy#iMD&cfXE zSyqBF-34`tP(CEJpYkL5G@6mhVD_=Yf2bN8o!^mD8w`I?{8XnQKYiSR{`ALPg zd~vZK)6e8sHQk*}J`V%~f8c8nl?MmmA4&R*?jy@3tJN6lAU({NR$z1_k* zAHcpn3$T9`m1yr#^w;U(9#oCHIF9QW0f2jt(#*hFmHsvq zmR=ZGn?sMt*PN#r2WzFbkP$ua1E=z47?lWDN8KXFo82u|L{9O=@dQfGys-t(XJaLj zCj*b;`Dyt5hDRwQk6|&COdfS}X*78*396SMP9dEP<7GT2Embs)>jqSYPidoObjax^ z5uWs@ScUPL$U6b9M0kp88WlZ<21HgB)_+S+?29qFr@-q#ZC$DZ%Byw#3=~-posD5_ zy)oO+43lHT^+AqTQj@uT%^j@`&PEG+)PuOQ#~uf;M$R_8`@t1>?!|Xt_tF8F=yi&A zyVsnao|)OZcV*2S)BpO{zkb;VP?c`_ssqxtJoeaQrryMZ4?cMC?tAY2^vd$uvBjlb zlNUGEn@>LT5`1)d6S}<_d#1hRuHf*# z{S(Ekhp>oe$F(-_w?NQ?)SvG&Cm>S+!sSLt=N*Jk&G13IBKkb@xLam~(B7f=l3gcu z6^>g7GcQ!usnLy%*U})A_^@rR{L^t!9H#rn39QDO<1FV5)}9IZbC!NQ8=NavBsGpP zB=Q-Wpy8=BI@G;opsZ;7(6*hqR~pYf=jNy>P_#X&98y|@-!a;$e6JFND#3%$kD_Qw z9Op@o%y;eTA2|k{<_B1j_Hlgqk_x!FccP&|Bs>-SivC7b(rWi;P}z~FgIgvA{yAE0rp%nF^%PLJh!huu3|+)uTYrt?T7d8gFTBgu(f{4 zdfBaVXH-IwjF^s{Vgy}pvo86BXb3=eq-&7mDv?Hmn6S{o(X<;BRA1f8ZElRFlPzeB z)}hzhgexDu3b1ho9=`7e_<#LBeh>cJKez#oECWpYbbOtr3E_945S^!Mg#BhJE|5F)|qVb{ZplykNcoaO;UF_`m(1?}9)6e|{D2y=@H!m)?P` zOK(A^xe2Z2w#g{qk75`I`M;X7kj59yM_dz>QE*S#-|SjNI%U3FC1TLG2>>U$ZCKem z347+E{f6>@TnWlh4OwxV68n^qgYLf;1qOwU>{wkkW1qFR7;J5C1X>YgW`o;?C-t3C z)coH&d!V-RPsZh8D}SeS$o*lWxN7Ct$}q;kL2ewzaiD^#$>z?#6=g}OH)yiGq_r9^ zma=IXe~{0|U4N+`mC3jAHwt$-hunAe4p~R4kGX`R&PYjNR3-!aj$+-RcREO2B%{Ca zW{HtW$~5dZjsEg>fA4Iq7+2cTh(*moyp;Nq2Sc;cCt;KJq0MZ4Q-bbHg? zJ$rWVyZQ9#d%p06-#Pi#TW`(YdFP$2>knc!~jh9Ulgn((xStQkt`Y# zilNHETR<{zlXI7Jk-~JurdCHtGLpJ#6zO%3j4Wxtx^b5gX0iFxO`N=~8jtuKsYTUW ztn4!>gmM9&3I5~`?Kn0Zt1~6zwxHuz;ex;*-nHQIWaC!g>yaXCL~rq>>w)dF4NZ?D zAjHBAV?3fogL_$Vd&2e16XM0San{HDVFzpn2@M)BA}nNW8ov={lrO|Ooj!`n51lm{ z_fe6>eNd(Ph3ryvUREGY4LZC|$tEeE9JZ3Q$t}TgzEtrGHy;wuNF_X#LRVL(4;Y%N zk2i+fr(R}?n{{Xp)}#GcF9%s0q_J##q(3$nx^Zf4jr2a@Fn(fT@gw2KvP9H`t%vr- zvV4t%PDe4pXXUS9`c(zeoeKW}caioK^>_sHq~Kah z!CeYh%i)A52jkyCJ+*fu|%50z#qkx@+4^)u|+A8 zj%D^_cp3v!53a7ko?UOkbFaPyEqg_uORVX)DBWW_gK990?vqq7iY$W9 zgKrSEP~x<4zR>}6ngb{Xm*Jy#UxVeP4*c#Tcfvn=^aR{~eAX)CTcZJN4;#+wZw&}8 z!q4JpwB838F$jmph*uoWbj-%6Ffy6+?S6Hz7z{=**#?-K@4=qCdoVwBCmdXzf^UES z6?p6HOE9&tA9~$+*xWP%txFb)v*y=VEAohlSmom;P7QI)2%`!@B&Sid8b$#!S0i49 zrG;tOyL%FPMp5?3A0yav#4}36*Ctn!>G?gQ9X$wJ-CPG~*VWaSpXtHjgUj&xnGayy z80k7Q_Nq_UR`kC+*bUtk;x6rb=#|2-#vmDqpvoQJ*DjT_t&UU$_~T+0J^ zcL|20Ip}t}uxSjZ!7Ar6^J1V>DBRHEe!_|BT5Nsdr7o8Kb`T`Yw)RBUt#G<;r8U=MoliW!{rc?I9Y8DFhFvs}kq3S-jSXgKi2sQK*IRO?pKHa&dyoV1{Ww~U# zvG(%Q3?f!&jP7#HP^gbF&(JU(gk0x3?cg=OScrIQ!J+keaYWe5DhnZ zdM;HN=4Fm!Tj7L{HJgI65jmaUFeR6(CI9|*0%9X8!?$A2CP66 zgnc+#>em1rANIJD{mFRw1CtC?c{m){1B~WIz~N{MM*Su${P3C9U8$L6Gk34Q6N0>GnrS_ z95V8`Ta%dW-+s;+QQ7CnH|fJ_ZbuED4u8X5PTGqtX`gmdG*5QD_19-sCI92QWyVx& zN2T+b@7nm7Y|QFYS|?Xd=ki6SyWCW55@UMwTpf4W96TmS=bexzoE%eFnq_Zo8vt}W zJy>6F!+Rfm2yec<3C9lsv^q^_Y_yw`lhYHOUT?|-JZ)@jR2l&4904f);xGQ9y|A#b zXV1Rn{ZrF3Gc)rO&9fgu@ynOa!TM$spfDGHxI1g5S223|#>+xVLt^TecpqgHM0v={ z|DV18eD*E54nwi^ODEraCr8W>Lu3pA5P={GQi3RvViHNwlBK6-`_)sG%jFOLpwIe0 z{KcwzRnJwXt#X-qdM?$I^cX~uB55WJ2_X(Jm~dzA%+2?tUvPD=yt;eu{X6H}8Kefz z+;jHs-C=e2%DvXe3AiX+mYPgX`Bx08*V@zN4ns{Cjhdfl*PNr9$xwzSy53mVm9D~Y zjKsCx9#`PBKc#DZ)&?^{H13IZPGUJVc}1fTB>O427RQqsVcE6+*iFm9I9RRn+&k9S zx&H9@DjMO_72TAgXc<5t>>O%)Azu{QCOpnA1?);*=fM zjqC)aHcxw|O3R_i)X*W2^(hbSPjwv!s!8oR6QxZh=JR z^Lv}{)Dw@u&KBR!E>+2PPj&70vr`6i7lZ}E?~$tjk3YPPdG41-*?nE$mR+jVC3f&S z2K*eK=lCGxxu=#b9vgWvIsB8RX z9=kM$d2;a|k6~*zM%RAFs2c^6^`J61G)&A*#o`9Hc81>*wk|0F#wjb^7&b-|xIbUQ zQ&%?Nzx~Zm!2kXq|13Otbqoi$zXPlJt$Y<=l*HJan_jQ5@HN3=RK`ka@hsCp%X>w> zG@~gaS*GhNNg1@5--D;0xC)P4y(k_SIXl3bJoRac;9&9SuLI(YB

+ diff --git a/site/how-to-download-m3u8.html b/site/how-to-download-m3u8.html new file mode 100644 index 0000000..5142bf5 --- /dev/null +++ b/site/how-to-download-m3u8.html @@ -0,0 +1,239 @@ + + + + + +m3u8 다운로드 및 고화질 MP4 변환 방법 (HLS 스트리밍 완벽 가이드) - Paca + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ HLS 스트리밍 기술 가이드 +

m3u8 스트리밍 동영상 고화질 MP4 변환 및 다운로드 완벽 가이드

+

복잡한 F12 개발자 도구 검색이나 주소 복사 없이, 브라우저에서 재생하는 순간 HLS 스트림을 감지해 100% 무손실 원본 MP4로 저장하는 실전 튜토리얼.

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

왜 m3u8 동영상은 다운로드가 어려울까요?

+

+ 현대 웹 스트리밍(유튜브, 트위치, 치지직, 네이버TV, 아프리카, OTT 및 인터넷 강의 등)은 대부분 HLS(HTTP Live Streaming) 규격을 사용합니다. HLS는 2~10초 단위의 잘게 쪼개진 .ts 또는 .m4s 조각들로 전송되며, 이 조각들의 재생 순서와 암호화 정보를 담은 것이 바로 .m3u8 플레이리스트 파일입니다. +

+
    +
  • 주소 찾기 번거로움: 개발자 도구(F12) 네트워크 필터에서 m3u8을 일일이 찾아야 함.
  • +
  • 세션 쿠키 및 권한 만료: 로그인 멤버십 영상이나 토큰이 붙은 m3u8은 외부 다운로더로 넘기면 403 Forbidden 발생.
  • +
  • AES-128 암호화: 영상 조각이 암호화되어 있어 단순 병합 시 재생 불가능한 깨진 파일 생성.
  • +
+
+ + +
+
+ 1 +

Paca 내장 브라우저에서 동영상 웹페이지 접속

+
+

+ Paca는 Microsoft Chromium WebView2 엔진을 탑재한 독립 미디어 브라우저입니다. 상단 주소창에 영상을 시청하려는 웹사이트 URL을 입력하여 평소 웹서핑하듯 접속합니다. 로그인이 필요한 회원제 사이트나 인터넷 강의라면 브라우저 안에서 로그인해 두세요. +

+
+ +
+
+ 2 +

동영상 재생 즉시 실시간 m3u8 스트림 자동 감지

+
+

+ 영상의 재생(Play) 버튼을 누르는 순간, Paca의 내장 패킷 스니퍼가 백그라운드에서 흐르는 .m3u8, .mpd, .mp4 스트림을 가로챕니다. 동시에 브라우저의 로그인 세션 쿠키, Referer, Authorization 헤더를 자동으로 확보하므로 접근 제한 영상도 완벽히 감지됩니다. +

+
+ +
+
+ 3 +

세그먼트 병렬 다운로드 & 무손실 MP4 자동 리먹싱

+
+

+ '다운로드' 버튼을 누르면 1~16개 멀티스레드로 수백 개의 영상 조각을 동시 수신합니다. AES-128 암호화가 걸려있다면 자동으로 키를 조회해 메모리에서 실시간 해제합니다. 다운로드가 완료되면 내장된 ffmpeg가 재인코딩(화질 손실) 없이 1초 만에 깔끔한 단일 MP4 컨테이너로 조립하여 PC에 저장합니다. +

+
+ + +
+

자주 묻는 질문 (FAQ)

+
+
+ Q. 다운로드 중 네트워크가 끊기면 어떻게 되나요? +

Paca는 세그먼트 단위 이어받기를 지원합니다. 일시적인 인터넷 지연이나 끊김이 발생해도 이미 다운로드된 세그먼트 이후부터 자동으로 이어서 다운로드합니다.

+
+
+ Q. Paca는 무료인가요? 바이러스나 악성코드는 없나요? +

Paca는 100% 무료 소프트웨어입니다. 애드웨어나 채굴기 등 불필요한 번들이 전혀 포함되어 있지 않으며, 공식 Google 광고 네트워크를 통해 투명하게 운영됩니다.

+
+
+
+ + +
+

지금 Paca로 m3u8 동영상을 다운로드하세요

+

Windows 10, 11 및 Android 컴패니언 앱을 지원합니다.

+ +
+
+
+
+ + + + + + diff --git a/site/index.html b/site/index.html index 544224d..5befcb7 100644 --- a/site/index.html +++ b/site/index.html @@ -3,13 +3,85 @@ -MEDIABROWSER - 보던 영상을 내 PC와 휴대폰으로 - +Paca - 무료 동영상 다운로더 & 미디어 브라우저 (HLS m3u8 자동 감지) + + - + - + + + + + + + + + + + + + + @@ -18,22 +90,25 @@ + +